mediawiki/extensions/VisualData: main (log #1419866)

sourcepatches

This run took 65 seconds.

From a2c2907929f919d4db79c4f4a987bdbd9a5bcc79 Mon Sep 17 00:00:00 2001
From: libraryupgrader <tools.libraryupgrader@tools.wmflabs.org>
Date: Wed, 24 Jul 2024 04:28:02 +0000
Subject: [PATCH] build: Updating dependencies
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

composer:
* mediawiki/minus-x: 1.1.1 → 1.1.3
* php-parallel-lint/php-parallel-lint: 1.3.2 → 1.4.0

npm:
* eslint-config-wikimedia: 0.26.0 → 0.28.2
* grunt-banana-checker: 0.11.1 → 0.13.0
* grunt-stylelint: 0.19.0 → 0.20.1
* stylelint-config-wikimedia: 0.16.1 → 0.17.2

Change-Id: Iaef420a5dc5d163dc24adc2629516f52e519bf9a
---
 composer.json                                 |    4 +-
 package-lock.json                             | 3689 ++++++++---------
 package.json                                  |    8 +-
 resources/VersionCheck.js                     |    6 +-
 resources/VisualData.js                       |   14 +-
 resources/VisualDataContentBlock.js           |   10 +-
 resources/VisualDataDatatables.js             |    2 +-
 resources/VisualDataFormField.js              |   45 +-
 resources/VisualDataForms.js                  |  116 +-
 resources/VisualDataFunctions.js              |   14 +-
 resources/VisualDataGeolocation.js            |   14 +-
 resources/VisualDataInputConfig.js            |   30 +-
 resources/VisualDataProcessModel.js           |    5 +-
 resources/VisualDataSchemas.js                |   58 +-
 resources/VisualDataUpload.js                 |   30 +-
 resources/VisualDataWindowManager.js          |    1 -
 .../VisualDataButtonMultiselectWidget.js      |    2 +-
 resources/Widgets/VisualDataDropdownWidget.js |    2 +-
 resources/Widgets/VisualDataMaptiler.js       |   10 +-
 .../VisualDataMenuTagSearchMultiselect.js     |   10 +-
 resources/Widgets/VisualDataTinyMCE.js        |    1 -
 resources/Widgets/VisualDataVisualEditor.js   |    8 +-
 resources/Widgets/VisualDataintlTelInput.js   |   12 +-
 23 files changed, 1855 insertions(+), 2236 deletions(-)

diff --git a/composer.json b/composer.json
index 65986e5..8a49490 100644
--- a/composer.json
+++ b/composer.json
@@ -1,9 +1,9 @@
 {
 	"require-dev": {
 		"mediawiki/mediawiki-codesniffer": "43.0.0",
-		"mediawiki/minus-x": "1.1.1",
+		"mediawiki/minus-x": "1.1.3",
 		"php-parallel-lint/php-console-highlighter": "1.0.0",
-		"php-parallel-lint/php-parallel-lint": "1.3.2"
+		"php-parallel-lint/php-parallel-lint": "1.4.0"
 	},
 	"scripts": {
 		"test": [
diff --git a/package-lock.json b/package-lock.json
index 7fffced..cfbd8cb 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -6,12 +6,12 @@
 		"": {
 			"name": "VisualData",
 			"devDependencies": {
-				"eslint-config-wikimedia": "0.26.0",
+				"eslint-config-wikimedia": "0.28.2",
 				"grunt": "1.6.1",
-				"grunt-banana-checker": "0.11.1",
+				"grunt-banana-checker": "0.13.0",
 				"grunt-eslint": "24.3.0",
-				"grunt-stylelint": "0.19.0",
-				"stylelint-config-wikimedia": "0.16.1"
+				"grunt-stylelint": "0.20.1",
+				"stylelint-config-wikimedia": "0.17.2"
 			}
 		},
 		"node_modules/@aashutoshrathi/word-wrap": {
@@ -24,107 +24,37 @@
 			}
 		},
 		"node_modules/@babel/code-frame": {
-			"version": "7.23.5",
-			"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz",
-			"integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==",
+			"version": "7.24.7",
+			"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz",
+			"integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==",
 			"dev": true,
 			"dependencies": {
-				"@babel/highlight": "^7.23.4",
-				"chalk": "^2.4.2"
+				"@babel/highlight": "^7.24.7",
+				"picocolors": "^1.0.0"
 			},
 			"engines": {
 				"node": ">=6.9.0"
 			}
 		},
-		"node_modules/@babel/code-frame/node_modules/ansi-styles": {
-			"version": "3.2.1",
-			"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
-			"integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
-			"dev": true,
-			"dependencies": {
-				"color-convert": "^1.9.0"
-			},
-			"engines": {
-				"node": ">=4"
-			}
-		},
-		"node_modules/@babel/code-frame/node_modules/chalk": {
-			"version": "2.4.2",
-			"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
-			"integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
-			"dev": true,
-			"dependencies": {
-				"ansi-styles": "^3.2.1",
-				"escape-string-regexp": "^1.0.5",
-				"supports-color": "^5.3.0"
-			},
-			"engines": {
-				"node": ">=4"
-			}
-		},
-		"node_modules/@babel/code-frame/node_modules/color-convert": {
-			"version": "1.9.3",
-			"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
-			"integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
-			"dev": true,
-			"dependencies": {
-				"color-name": "1.1.3"
-			}
-		},
-		"node_modules/@babel/code-frame/node_modules/color-name": {
-			"version": "1.1.3",
-			"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
-			"integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
-			"dev": true
-		},
-		"node_modules/@babel/code-frame/node_modules/escape-string-regexp": {
-			"version": "1.0.5",
-			"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
-			"integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
-			"dev": true,
-			"engines": {
-				"node": ">=0.8.0"
-			}
-		},
-		"node_modules/@babel/code-frame/node_modules/has-flag": {
-			"version": "3.0.0",
-			"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-			"integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
-			"dev": true,
-			"engines": {
-				"node": ">=4"
-			}
-		},
-		"node_modules/@babel/code-frame/node_modules/supports-color": {
-			"version": "5.5.0",
-			"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
-			"integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
-			"dev": true,
-			"dependencies": {
-				"has-flag": "^3.0.0"
-			},
-			"engines": {
-				"node": ">=4"
-			}
-		},
 		"node_modules/@babel/helper-validator-identifier": {
-			"version": "7.22.20",
-			"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz",
-			"integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==",
+			"version": "7.24.7",
+			"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz",
+			"integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==",
 			"dev": true,
 			"engines": {
 				"node": ">=6.9.0"
 			}
 		},
 		"node_modules/@babel/highlight": {
-			"version": "7.23.4",
-			"resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz",
-			"integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==",
+			"version": "7.24.7",
+			"resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz",
+			"integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==",
 			"dev": true,
 			"dependencies": {
-				"@babel/helper-validator-identifier": "^7.22.20",
+				"@babel/helper-validator-identifier": "^7.24.7",
 				"chalk": "^2.4.2",
-				"js-tokens": "^4.0.0"
+				"js-tokens": "^4.0.0",
+				"picocolors": "^1.0.0"
 			},
 			"engines": {
 				"node": ">=6.9.0"
@@ -202,9 +132,9 @@
 			}
 		},
 		"node_modules/@csstools/css-parser-algorithms": {
-			"version": "2.4.0",
-			"resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.4.0.tgz",
-			"integrity": "sha512-/PPLr2g5PAUCKAPEbfyk6/baZA+WJHQtUhPkoCQMpyRE8I0lXrG1QFRN8e5s3ZYxM8d/g5BZc6lH3s8Op7/VEg==",
+			"version": "2.7.1",
+			"resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.7.1.tgz",
+			"integrity": "sha512-2SJS42gxmACHgikc1WGesXLIT8d/q2l0UFM7TaEeIzdFCE/FPMtTiizcPGGJtlPo2xuQzY09OhrLTzRxqJqwGw==",
 			"dev": true,
 			"funding": [
 				{
@@ -220,13 +150,13 @@
 				"node": "^14 || ^16 || >=18"
 			},
 			"peerDependencies": {
-				"@csstools/css-tokenizer": "^2.2.2"
+				"@csstools/css-tokenizer": "^2.4.1"
 			}
 		},
 		"node_modules/@csstools/css-tokenizer": {
-			"version": "2.2.2",
-			"resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-2.2.2.tgz",
-			"integrity": "sha512-wCDUe/MAw7npAHFLyW3QjSyLA66S5QFaV1jIXlNQvdJ8RzXDSgALa49eWcUO6P55ARQaz0TsDdAgdRgkXFYY8g==",
+			"version": "2.4.1",
+			"resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-2.4.1.tgz",
+			"integrity": "sha512-eQ9DIktFJBhGjioABJRtUucoWR2mwllurfnM8LuNGAqX3ViZXaUchqk+1s7jjtkFiT9ySdACsFEA3etErkALUg==",
 			"dev": true,
 			"funding": [
 				{
@@ -243,9 +173,9 @@
 			}
 		},
 		"node_modules/@csstools/media-query-list-parser": {
-			"version": "2.1.6",
-			"resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.6.tgz",
-			"integrity": "sha512-R6AKl9vaU0It7D7TR2lQn0pre5aQfdeqHRePlaRCY8rHL3l9eVlNRpsEVDKFi/zAjzv68CxH2M5kqbhPFPKjvw==",
+			"version": "2.1.13",
+			"resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.13.tgz",
+			"integrity": "sha512-XaHr+16KRU9Gf8XLi3q8kDlI18d5vzKSKCY510Vrtc9iNR0NJzbY9hhTmwhzYZj/ZwGL4VmB3TA9hJW0Um2qFA==",
 			"dev": true,
 			"funding": [
 				{
@@ -261,14 +191,14 @@
 				"node": "^14 || ^16 || >=18"
 			},
 			"peerDependencies": {
-				"@csstools/css-parser-algorithms": "^2.4.0",
-				"@csstools/css-tokenizer": "^2.2.2"
+				"@csstools/css-parser-algorithms": "^2.7.1",
+				"@csstools/css-tokenizer": "^2.4.1"
 			}
 		},
 		"node_modules/@csstools/selector-specificity": {
-			"version": "3.0.1",
-			"resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-3.0.1.tgz",
-			"integrity": "sha512-NPljRHkq4a14YzZ3YD406uaxh7s0g6eAq3L9aLOWywoqe8PkYamAvtsh7KNX6c++ihDrJ0RiU+/z7rGnhlZ5ww==",
+			"version": "3.1.1",
+			"resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-3.1.1.tgz",
+			"integrity": "sha512-a7cxGcJ2wIlMFLlh8z2ONm+715QkPHiyJcxwQlKOz/03GPw1COpfhcmC9wm4xlZfp//jWHNNMwzjtqHXVWU9KA==",
 			"dev": true,
 			"funding": [
 				{
@@ -287,18 +217,31 @@
 				"postcss-selector-parser": "^6.0.13"
 			}
 		},
+		"node_modules/@dual-bundle/import-meta-resolve": {
+			"version": "4.1.0",
+			"resolved": "https://registry.npmjs.org/@dual-bundle/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz",
+			"integrity": "sha512-+nxncfwHM5SgAtrVzgpzJOI1ol0PkumhVo469KCf9lUi21IGcY90G98VuHm9VRrUypmAzawAHO9bs6hqeADaVg==",
+			"dev": true,
+			"funding": {
+				"type": "github",
+				"url": "https://github.com/sponsors/wooorm"
+			}
+		},
 		"node_modules/@es-joy/jsdoccomment": {
-			"version": "0.37.1",
-			"resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.37.1.tgz",
-			"integrity": "sha512-5vxWJ1gEkEF0yRd0O+uK6dHJf7adrxwQSX8PuRiPfFSAbNLnY0ZJfXaZucoz14Jj2N11xn2DnlEPwWRpYpvRjg==",
+			"version": "0.43.1",
+			"resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.43.1.tgz",
+			"integrity": "sha512-I238eDtOolvCuvtxrnqtlBaw0BwdQuYqK7eA6XIonicMdOOOb75mqdIzkGDUbS04+1Di007rgm9snFRNeVrOog==",
 			"dev": true,
 			"dependencies": {
-				"comment-parser": "1.3.1",
+				"@types/eslint": "^8.56.5",
+				"@types/estree": "^1.0.5",
+				"@typescript-eslint/types": "^7.2.0",
+				"comment-parser": "1.4.1",
 				"esquery": "^1.5.0",
 				"jsdoc-type-pratt-parser": "~4.0.0"
 			},
 			"engines": {
-				"node": "^14 || ^16 || ^17 || ^18 || ^19 || ^20"
+				"node": ">=16"
 			}
 		},
 		"node_modules/@eslint-community/eslint-utils": {
@@ -317,9 +260,9 @@
 			}
 		},
 		"node_modules/@eslint-community/regexpp": {
-			"version": "4.10.0",
-			"resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz",
-			"integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==",
+			"version": "4.11.0",
+			"resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz",
+			"integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==",
 			"dev": true,
 			"engines": {
 				"node": "^12.0.0 || ^14.0.0 || >=16.0.0"
@@ -349,22 +292,23 @@
 			}
 		},
 		"node_modules/@eslint/js": {
-			"version": "8.56.0",
-			"resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz",
-			"integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==",
+			"version": "8.57.0",
+			"resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz",
+			"integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==",
 			"dev": true,
 			"engines": {
 				"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
 			}
 		},
 		"node_modules/@humanwhocodes/config-array": {
-			"version": "0.11.13",
-			"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz",
-			"integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==",
+			"version": "0.11.14",
+			"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz",
+			"integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==",
+			"deprecated": "Use @eslint/config-array instead",
 			"dev": true,
 			"dependencies": {
-				"@humanwhocodes/object-schema": "^2.0.1",
-				"debug": "^4.1.1",
+				"@humanwhocodes/object-schema": "^2.0.2",
+				"debug": "^4.3.1",
 				"minimatch": "^3.0.5"
 			},
 			"engines": {
@@ -385,9 +329,10 @@
 			}
 		},
 		"node_modules/@humanwhocodes/object-schema": {
-			"version": "2.0.1",
-			"resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz",
-			"integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==",
+			"version": "2.0.3",
+			"resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz",
+			"integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==",
+			"deprecated": "Use @eslint/object-schema instead",
 			"dev": true
 		},
 		"node_modules/@mdn/browser-compat-data": {
@@ -431,6 +376,68 @@
 				"node": ">= 8"
 			}
 		},
+		"node_modules/@stylistic/stylelint-config": {
+			"version": "1.0.1",
+			"resolved": "https://registry.npmjs.org/@stylistic/stylelint-config/-/stylelint-config-1.0.1.tgz",
+			"integrity": "sha512-JgFP88HZEyo34k9RpWVdcQJtLPrMxYE58IO3qypXhmvE/NmZohj+xjDtQ8UfaarnYsLecnldw57/GHum07Ctdw==",
+			"dev": true,
+			"dependencies": {
+				"@stylistic/stylelint-plugin": "^2.0.0"
+			},
+			"engines": {
+				"node": "^18.12 || >=20.9"
+			},
+			"peerDependencies": {
+				"stylelint": "^16.0.2"
+			}
+		},
+		"node_modules/@stylistic/stylelint-plugin": {
+			"version": "2.0.0",
+			"resolved": "https://registry.npmjs.org/@stylistic/stylelint-plugin/-/stylelint-plugin-2.0.0.tgz",
+			"integrity": "sha512-dHKuT6PGd1WGZLOTuozAM7GdQzdmlmnFXYzvV1jYJXXpcCpV/OJ3+n8TXpMkoOeKHpJydY43EOoZTO1W/FOA4Q==",
+			"dev": true,
+			"dependencies": {
+				"@csstools/css-parser-algorithms": "^2.3.2",
+				"@csstools/css-tokenizer": "^2.2.1",
+				"@csstools/media-query-list-parser": "^2.1.5",
+				"is-plain-object": "^5.0.0",
+				"postcss-selector-parser": "^6.0.13",
+				"postcss-value-parser": "^4.2.0",
+				"style-search": "^0.1.0",
+				"stylelint": "^16.0.2"
+			},
+			"engines": {
+				"node": "^18.12 || >=20.9"
+			},
+			"peerDependencies": {
+				"stylelint": "^16.0.2"
+			}
+		},
+		"node_modules/@stylistic/stylelint-plugin/node_modules/is-plain-object": {
+			"version": "5.0.0",
+			"resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
+			"integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==",
+			"dev": true,
+			"engines": {
+				"node": ">=0.10.0"
+			}
+		},
+		"node_modules/@types/eslint": {
+			"version": "8.56.11",
+			"resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.11.tgz",
+			"integrity": "sha512-sVBpJMf7UPo/wGecYOpk2aQya2VUGeHhe38WG7/mN5FufNSubf5VT9Uh9Uyp8/eLJpu1/tuhJ/qTo4mhSB4V4Q==",
+			"dev": true,
+			"dependencies": {
+				"@types/estree": "*",
+				"@types/json-schema": "*"
+			}
+		},
+		"node_modules/@types/estree": {
+			"version": "1.0.5",
+			"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz",
+			"integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==",
+			"dev": true
+		},
 		"node_modules/@types/json-schema": {
 			"version": "7.0.15",
 			"resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
@@ -443,35 +450,23 @@
 			"integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==",
 			"dev": true
 		},
-		"node_modules/@types/minimist": {
-			"version": "1.2.5",
-			"resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz",
-			"integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==",
-			"dev": true
-		},
 		"node_modules/@types/normalize-package-data": {
 			"version": "2.4.4",
 			"resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz",
 			"integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==",
 			"dev": true
 		},
-		"node_modules/@types/semver": {
-			"version": "7.5.6",
-			"resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz",
-			"integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==",
-			"dev": true
-		},
 		"node_modules/@typescript-eslint/scope-manager": {
-			"version": "5.62.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz",
-			"integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==",
+			"version": "7.17.0",
+			"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.17.0.tgz",
+			"integrity": "sha512-0P2jTTqyxWp9HiKLu/Vemr2Rg1Xb5B7uHItdVZ6iAenXmPo4SZ86yOPCJwMqpCyaMiEHTNqizHfsbmCFT1x9SA==",
 			"dev": true,
 			"dependencies": {
-				"@typescript-eslint/types": "5.62.0",
-				"@typescript-eslint/visitor-keys": "5.62.0"
+				"@typescript-eslint/types": "7.17.0",
+				"@typescript-eslint/visitor-keys": "7.17.0"
 			},
 			"engines": {
-				"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+				"node": "^18.18.0 || >=20.0.0"
 			},
 			"funding": {
 				"type": "opencollective",
@@ -479,12 +474,12 @@
 			}
 		},
 		"node_modules/@typescript-eslint/types": {
-			"version": "5.62.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz",
-			"integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==",
+			"version": "7.17.0",
+			"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.17.0.tgz",
+			"integrity": "sha512-a29Ir0EbyKTKHnZWbNsrc/gqfIBqYPwj3F2M+jWE/9bqfEHg0AMtXzkbUkOG6QgEScxh2+Pz9OXe11jHDnHR7A==",
 			"dev": true,
 			"engines": {
-				"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+				"node": "^18.18.0 || >=20.0.0"
 			},
 			"funding": {
 				"type": "opencollective",
@@ -492,21 +487,22 @@
 			}
 		},
 		"node_modules/@typescript-eslint/typescript-estree": {
-			"version": "5.62.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz",
-			"integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==",
+			"version": "7.17.0",
+			"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.17.0.tgz",
+			"integrity": "sha512-72I3TGq93t2GoSBWI093wmKo0n6/b7O4j9o8U+f65TVD0FS6bI2180X5eGEr8MA8PhKMvYe9myZJquUT2JkCZw==",
 			"dev": true,
 			"dependencies": {
-				"@typescript-eslint/types": "5.62.0",
-				"@typescript-eslint/visitor-keys": "5.62.0",
+				"@typescript-eslint/types": "7.17.0",
+				"@typescript-eslint/visitor-keys": "7.17.0",
 				"debug": "^4.3.4",
 				"globby": "^11.1.0",
 				"is-glob": "^4.0.3",
-				"semver": "^7.3.7",
-				"tsutils": "^3.21.0"
+				"minimatch": "^9.0.4",
+				"semver": "^7.6.0",
+				"ts-api-utils": "^1.3.0"
 			},
 			"engines": {
-				"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+				"node": "^18.18.0 || >=20.0.0"
 			},
 			"funding": {
 				"type": "opencollective",
@@ -518,65 +514,63 @@
 				}
 			}
 		},
-		"node_modules/@typescript-eslint/utils": {
-			"version": "5.62.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz",
-			"integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==",
+		"node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": {
+			"version": "2.0.1",
+			"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+			"integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
 			"dev": true,
 			"dependencies": {
-				"@eslint-community/eslint-utils": "^4.2.0",
-				"@types/json-schema": "^7.0.9",
-				"@types/semver": "^7.3.12",
-				"@typescript-eslint/scope-manager": "5.62.0",
-				"@typescript-eslint/types": "5.62.0",
-				"@typescript-eslint/typescript-estree": "5.62.0",
-				"eslint-scope": "^5.1.1",
-				"semver": "^7.3.7"
-			},
-			"engines": {
-				"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
-			},
-			"funding": {
-				"type": "opencollective",
-				"url": "https://opencollective.com/typescript-eslint"
-			},
-			"peerDependencies": {
-				"eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
+				"balanced-match": "^1.0.0"
 			}
 		},
-		"node_modules/@typescript-eslint/utils/node_modules/eslint-scope": {
-			"version": "5.1.1",
-			"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
-			"integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
+		"node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": {
+			"version": "9.0.5",
+			"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
+			"integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
 			"dev": true,
 			"dependencies": {
-				"esrecurse": "^4.3.0",
-				"estraverse": "^4.1.1"
+				"brace-expansion": "^2.0.1"
 			},
 			"engines": {
-				"node": ">=8.0.0"
+				"node": ">=16 || 14 >=14.17"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/isaacs"
 			}
 		},
-		"node_modules/@typescript-eslint/utils/node_modules/estraverse": {
-			"version": "4.3.0",
-			"resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
-			"integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+		"node_modules/@typescript-eslint/utils": {
+			"version": "7.17.0",
+			"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.17.0.tgz",
+			"integrity": "sha512-r+JFlm5NdB+JXc7aWWZ3fKSm1gn0pkswEwIYsrGPdsT2GjsRATAKXiNtp3vgAAO1xZhX8alIOEQnNMl3kbTgJw==",
 			"dev": true,
+			"dependencies": {
+				"@eslint-community/eslint-utils": "^4.4.0",
+				"@typescript-eslint/scope-manager": "7.17.0",
+				"@typescript-eslint/types": "7.17.0",
+				"@typescript-eslint/typescript-estree": "7.17.0"
+			},
 			"engines": {
-				"node": ">=4.0"
+				"node": "^18.18.0 || >=20.0.0"
+			},
+			"funding": {
+				"type": "opencollective",
+				"url": "https://opencollective.com/typescript-eslint"
+			},
+			"peerDependencies": {
+				"eslint": "^8.56.0"
 			}
 		},
 		"node_modules/@typescript-eslint/visitor-keys": {
-			"version": "5.62.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz",
-			"integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==",
+			"version": "7.17.0",
+			"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.17.0.tgz",
+			"integrity": "sha512-RVGC9UhPOCsfCdI9pU++K4nD7to+jTcMIbXTSOcrLqUEW6gF2pU1UUbYJKc9cvcRSK1UDeMJ7pdMxf4bhMpV/A==",
 			"dev": true,
 			"dependencies": {
-				"@typescript-eslint/types": "5.62.0",
-				"eslint-visitor-keys": "^3.3.0"
+				"@typescript-eslint/types": "7.17.0",
+				"eslint-visitor-keys": "^3.4.3"
 			},
 			"engines": {
-				"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+				"node": "^18.18.0 || >=20.0.0"
 			},
 			"funding": {
 				"type": "opencollective",
@@ -596,9 +590,9 @@
 			"dev": true
 		},
 		"node_modules/acorn": {
-			"version": "8.11.2",
-			"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz",
-			"integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==",
+			"version": "8.12.1",
+			"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz",
+			"integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==",
 			"dev": true,
 			"bin": {
 				"acorn": "bin/acorn"
@@ -708,12 +702,12 @@
 			}
 		},
 		"node_modules/arrify": {
-			"version": "1.0.1",
-			"resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
-			"integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==",
+			"version": "2.0.1",
+			"resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz",
+			"integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==",
 			"dev": true,
 			"engines": {
-				"node": ">=0.10.0"
+				"node": ">=8"
 			}
 		},
 		"node_modules/ast-metadata-inferer": {
@@ -763,21 +757,21 @@
 			}
 		},
 		"node_modules/braces": {
-			"version": "3.0.2",
-			"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
-			"integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+			"version": "3.0.3",
+			"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
+			"integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
 			"dev": true,
 			"dependencies": {
-				"fill-range": "^7.0.1"
+				"fill-range": "^7.1.1"
 			},
 			"engines": {
 				"node": ">=8"
 			}
 		},
 		"node_modules/browserslist": {
-			"version": "4.22.2",
-			"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz",
-			"integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==",
+			"version": "4.23.2",
+			"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.2.tgz",
+			"integrity": "sha512-qkqSyistMYdxAcw+CzbZwlBy8AGmS/eEWs+sEV5TnLRGDOL+C5M2EnH6tlZyg0YoAxGJAFKh61En9BR941GnHA==",
 			"dev": true,
 			"funding": [
 				{
@@ -794,10 +788,10 @@
 				}
 			],
 			"dependencies": {
-				"caniuse-lite": "^1.0.30001565",
-				"electron-to-chromium": "^1.4.601",
+				"caniuse-lite": "^1.0.30001640",
+				"electron-to-chromium": "^1.4.820",
 				"node-releases": "^2.0.14",
-				"update-browserslist-db": "^1.0.13"
+				"update-browserslist-db": "^1.1.0"
 			},
 			"bin": {
 				"browserslist": "cli.js"
@@ -807,9 +801,9 @@
 			}
 		},
 		"node_modules/browserslist-config-wikimedia": {
-			"version": "0.5.1",
-			"resolved": "https://registry.npmjs.org/browserslist-config-wikimedia/-/browserslist-config-wikimedia-0.5.1.tgz",
-			"integrity": "sha512-jf532fUf/gaxiKdHgGCQUT552P5up3RpG+CzLixOQBJ5FwDmYQSRLYHCFUA9s3KMOHh4P3xVp+NUaGNxvtoT9g==",
+			"version": "0.7.0",
+			"resolved": "https://registry.npmjs.org/browserslist-config-wikimedia/-/browserslist-config-wikimedia-0.7.0.tgz",
+			"integrity": "sha512-CTa0lv78dXKEgrYsOLCkqO+9UUS3CV9MWEOYHcymgEvx4mYxB80sCoKRCR7wW2SOMNxjaP9hohrZripjnKuRTA==",
 			"dev": true
 		},
 		"node_modules/builtin-modules": {
@@ -824,15 +818,6 @@
 				"url": "https://github.com/sponsors/sindresorhus"
 			}
 		},
-		"node_modules/builtins": {
-			"version": "5.0.1",
-			"resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz",
-			"integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==",
-			"dev": true,
-			"dependencies": {
-				"semver": "^7.0.0"
-			}
-		},
 		"node_modules/callsites": {
 			"version": "3.1.0",
 			"resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
@@ -842,52 +827,10 @@
 				"node": ">=6"
 			}
 		},
-		"node_modules/camelcase": {
-			"version": "6.3.0",
-			"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
-			"integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
-			"dev": true,
-			"engines": {
-				"node": ">=10"
-			},
-			"funding": {
-				"url": "https://github.com/sponsors/sindresorhus"
-			}
-		},
-		"node_modules/camelcase-keys": {
-			"version": "7.0.2",
-			"resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-7.0.2.tgz",
-			"integrity": "sha512-Rjs1H+A9R+Ig+4E/9oyB66UC5Mj9Xq3N//vcLf2WzgdTi/3gUu3Z9KoqmlrEG4VuuLK8wJHofxzdQXz/knhiYg==",
-			"dev": true,
-			"dependencies": {
-				"camelcase": "^6.3.0",
-				"map-obj": "^4.1.0",
-				"quick-lru": "^5.1.1",
-				"type-fest": "^1.2.1"
-			},
-			"engines": {
-				"node": ">=12"
-			},
-			"funding": {
-				"url": "https://github.com/sponsors/sindresorhus"
-			}
-		},
-		"node_modules/camelcase-keys/node_modules/type-fest": {
-			"version": "1.4.0",
-			"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz",
-			"integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==",
-			"dev": true,
-			"engines": {
-				"node": ">=10"
-			},
-			"funding": {
-				"url": "https://github.com/sponsors/sindresorhus"
-			}
-		},
 		"node_modules/caniuse-lite": {
-			"version": "1.0.30001570",
-			"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001570.tgz",
-			"integrity": "sha512-+3e0ASu4sw1SWaoCtvPeyXp+5PsjigkSt8OXZbF9StH5pQWbxEjLAZE3n8Aup5udop1uRiKA7a4utUk/uoSpUw==",
+			"version": "1.0.30001643",
+			"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001643.tgz",
+			"integrity": "sha512-ERgWGNleEilSrHM6iUz/zJNSQTP8Mr21wDWpdgvRwcTXGAq6jMtOUPP4dqFPTdKqZ2wKTdtB+uucZ3MRpAUSmg==",
 			"dev": true,
 			"funding": [
 				{
@@ -921,9 +864,9 @@
 			}
 		},
 		"node_modules/ci-info": {
-			"version": "3.9.0",
-			"resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
-			"integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
+			"version": "4.0.0",
+			"resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.0.0.tgz",
+			"integrity": "sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==",
 			"dev": true,
 			"funding": [
 				{
@@ -957,14 +900,17 @@
 			}
 		},
 		"node_modules/cliui": {
-			"version": "7.0.4",
-			"resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
-			"integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
+			"version": "8.0.1",
+			"resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
+			"integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
 			"dev": true,
 			"dependencies": {
 				"string-width": "^4.2.0",
-				"strip-ansi": "^6.0.0",
+				"strip-ansi": "^6.0.1",
 				"wrap-ansi": "^7.0.0"
+			},
+			"engines": {
+				"node": ">=12"
 			}
 		},
 		"node_modules/color-convert": {
@@ -1001,9 +947,9 @@
 			}
 		},
 		"node_modules/comment-parser": {
-			"version": "1.3.1",
-			"resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.3.1.tgz",
-			"integrity": "sha512-B52sN2VNghyq5ofvUsqZjmk6YkihBX5vMSChmSK9v4ShjKf3Vk5Xcmgpw4o+iIgtrnM/u5FiMpz9VKb8lpBveA==",
+			"version": "1.4.1",
+			"resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.1.tgz",
+			"integrity": "sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==",
 			"dev": true,
 			"engines": {
 				"node": ">= 12.0.0"
@@ -1015,6 +961,19 @@
 			"integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
 			"dev": true
 		},
+		"node_modules/core-js-compat": {
+			"version": "3.37.1",
+			"resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.37.1.tgz",
+			"integrity": "sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg==",
+			"dev": true,
+			"dependencies": {
+				"browserslist": "^4.23.0"
+			},
+			"funding": {
+				"type": "opencollective",
+				"url": "https://opencollective.com/core-js"
+			}
+		},
 		"node_modules/core-util-is": {
 			"version": "1.0.3",
 			"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
@@ -1022,15 +981,15 @@
 			"dev": true
 		},
 		"node_modules/cosmiconfig": {
-			"version": "8.3.6",
-			"resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz",
-			"integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==",
+			"version": "9.0.0",
+			"resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz",
+			"integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==",
 			"dev": true,
 			"dependencies": {
+				"env-paths": "^2.2.1",
 				"import-fresh": "^3.3.0",
 				"js-yaml": "^4.1.0",
-				"parse-json": "^5.2.0",
-				"path-type": "^4.0.0"
+				"parse-json": "^5.2.0"
 			},
 			"engines": {
 				"node": ">=14"
@@ -1062,51 +1021,14 @@
 			}
 		},
 		"node_modules/css-functions-list": {
-			"version": "3.2.1",
-			"resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.1.tgz",
-			"integrity": "sha512-Nj5YcaGgBtuUmn1D7oHqPW0c9iui7xsTsj5lIX8ZgevdfhmjFfKB3r8moHJtNJnctnYXJyYX5I1pp90HM4TPgQ==",
+			"version": "3.2.2",
+			"resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.2.tgz",
+			"integrity": "sha512-c+N0v6wbKVxTu5gOBBFkr9BEdBWaqqjQeiJ8QvSRIJOf+UxlJh930m8e6/WNeODIK0mYLFkoONrnj16i2EcvfQ==",
 			"dev": true,
 			"engines": {
 				"node": ">=12 || >=16"
 			}
 		},
-		"node_modules/css-rule-stream": {
-			"version": "1.1.0",
-			"resolved": "https://registry.npmjs.org/css-rule-stream/-/css-rule-stream-1.1.0.tgz",
-			"integrity": "sha512-qiio/Zkr8I19jh/XuzEkK8OKDQRTrEYaRyIHy4Bwh/tPUe0w8GcQs7r6x24Yc9lT+FbnZFYULxEIXCmaymguUQ==",
-			"dev": true,
-			"dependencies": {
-				"css-tokenize": "^1.0.1",
-				"duplexer2": "0.0.2",
-				"ldjson-stream": "^1.2.1",
-				"through2": "^0.6.3"
-			},
-			"bin": {
-				"css-rule-stream": "index.js"
-			}
-		},
-		"node_modules/css-rule-stream/node_modules/readable-stream": {
-			"version": "1.0.34",
-			"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
-			"integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==",
-			"dev": true,
-			"dependencies": {
-				"core-util-is": "~1.0.0",
-				"inherits": "~2.0.1",
-				"isarray": "0.0.1",
-				"string_decoder": "~0.10.x"
-			}
-		},
-		"node_modules/css-rule-stream/node_modules/through2": {
-			"version": "0.6.5",
-			"resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz",
-			"integrity": "sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg==",
-			"dev": true,
-			"dependencies": {
-				"readable-stream": ">=1.0.33-1 <1.1.0-0",
-				"xtend": ">=4.0.0 <4.1.0-0"
-			}
-		},
 		"node_modules/css-tokenize": {
 			"version": "1.0.1",
 			"resolved": "https://registry.npmjs.org/css-tokenize/-/css-tokenize-1.0.1.tgz",
@@ -1152,9 +1074,9 @@
 			}
 		},
 		"node_modules/debug": {
-			"version": "4.3.4",
-			"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
-			"integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+			"version": "4.3.5",
+			"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz",
+			"integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==",
 			"dev": true,
 			"dependencies": {
 				"ms": "2.1.2"
@@ -1168,65 +1090,19 @@
 				}
 			}
 		},
-		"node_modules/decamelize": {
-			"version": "5.0.1",
-			"resolved": "https://registry.npmjs.org/decamelize/-/decamelize-5.0.1.tgz",
-			"integrity": "sha512-VfxadyCECXgQlkoEAjeghAr5gY3Hf+IKjKb+X8tGVDtveCjN+USwprd2q3QXBR9T1+x2DG0XZF5/w+7HAtSaXA==",
+		"node_modules/deep-is": {
+			"version": "0.1.4",
+			"resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+			"integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+			"dev": true
+		},
+		"node_modules/detect-file": {
+			"version": "1.0.0",
+			"resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz",
+			"integrity": "sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==",
 			"dev": true,
 			"engines": {
-				"node": ">=10"
-			},
-			"funding": {
-				"url": "https://github.com/sponsors/sindresorhus"
-			}
-		},
-		"node_modules/decamelize-keys": {
-			"version": "1.1.1",
-			"resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz",
-			"integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==",
-			"dev": true,
-			"dependencies": {
-				"decamelize": "^1.1.0",
-				"map-obj": "^1.0.0"
-			},
-			"engines": {
-				"node": ">=0.10.0"
-			},
-			"funding": {
-				"url": "https://github.com/sponsors/sindresorhus"
-			}
-		},
-		"node_modules/decamelize-keys/node_modules/decamelize": {
-			"version": "1.2.0",
-			"resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
-			"integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==",
-			"dev": true,
-			"engines": {
-				"node": ">=0.10.0"
-			}
-		},
-		"node_modules/decamelize-keys/node_modules/map-obj": {
-			"version": "1.0.1",
-			"resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
-			"integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==",
-			"dev": true,
-			"engines": {
-				"node": ">=0.10.0"
-			}
-		},
-		"node_modules/deep-is": {
-			"version": "0.1.4",
-			"resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
-			"integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
-			"dev": true
-		},
-		"node_modules/detect-file": {
-			"version": "1.0.0",
-			"resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz",
-			"integrity": "sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==",
-			"dev": true,
-			"engines": {
-				"node": ">=0.10.0"
+				"node": ">=0.10.0"
 			}
 		},
 		"node_modules/dir-glob": {
@@ -1254,27 +1130,26 @@
 			}
 		},
 		"node_modules/doiuse": {
-			"version": "4.4.1",
-			"resolved": "https://registry.npmjs.org/doiuse/-/doiuse-4.4.1.tgz",
-			"integrity": "sha512-TUpr1/YNg20IB09tZmwGCTsTQoxj8jUld/hUZprZMj8vj0VpAJySXEWCr8WMvqvgzk0/kG/FxeSMGKode4UjPg==",
+			"version": "6.0.2",
+			"resolved": "https://registry.npmjs.org/doiuse/-/doiuse-6.0.2.tgz",
+			"integrity": "sha512-eBTs23NOX+EAYPr4RbCR6J4DRW/TML3uMo37y0X1whlkersDYFCk9HmCl09KX98cis22VKsV1QaxfVNauJ3NBw==",
 			"dev": true,
 			"dependencies": {
-				"browserslist": "^4.16.1",
-				"caniuse-lite": "^1.0.30001179",
-				"css-rule-stream": "^1.1.0",
-				"duplexer2": "0.0.2",
+				"browserslist": "^4.21.5",
+				"caniuse-lite": "^1.0.30001487",
+				"css-tokenize": "^1.0.1",
+				"duplexify": "^4.1.2",
 				"ldjson-stream": "^1.2.1",
 				"multimatch": "^5.0.0",
-				"postcss": "^8.2.4",
-				"source-map": "^0.7.3",
-				"through2": "^4.0.2",
-				"yargs": "^16.2.0"
+				"postcss": "^8.4.21",
+				"source-map": "^0.7.4",
+				"yargs": "^17.7.1"
 			},
 			"bin": {
-				"doiuse": "cli.js"
+				"doiuse": "bin/cli.js"
 			},
 			"engines": {
-				"node": ">=10"
+				"node": ">=16"
 			}
 		},
 		"node_modules/dom-serializer": {
@@ -1332,19 +1207,45 @@
 				"url": "https://github.com/fb55/domutils?sponsor=1"
 			}
 		},
-		"node_modules/duplexer2": {
-			"version": "0.0.2",
-			"resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz",
-			"integrity": "sha512-+AWBwjGadtksxjOQSFDhPNQbed7icNXApT4+2BNpsXzcCBiInq2H9XW0O8sfHFaPmnQRs7cg/P0fAr2IWQSW0g==",
+		"node_modules/duplexify": {
+			"version": "4.1.3",
+			"resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.3.tgz",
+			"integrity": "sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==",
+			"dev": true,
+			"dependencies": {
+				"end-of-stream": "^1.4.1",
+				"inherits": "^2.0.3",
+				"readable-stream": "^3.1.1",
+				"stream-shift": "^1.0.2"
+			}
+		},
+		"node_modules/duplexify/node_modules/readable-stream": {
+			"version": "3.6.2",
+			"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
+			"integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
+			"dev": true,
+			"dependencies": {
+				"inherits": "^2.0.3",
+				"string_decoder": "^1.1.1",
+				"util-deprecate": "^1.0.1"
+			},
+			"engines": {
+				"node": ">= 6"
+			}
+		},
+		"node_modules/duplexify/node_modules/string_decoder": {
+			"version": "1.3.0",
+			"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+			"integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
 			"dev": true,
 			"dependencies": {
-				"readable-stream": "~1.1.9"
+				"safe-buffer": "~5.2.0"
 			}
 		},
 		"node_modules/electron-to-chromium": {
-			"version": "1.4.615",
-			"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.615.tgz",
-			"integrity": "sha512-/bKPPcgZVUziECqDc+0HkT87+0zhaWSZHNXqF8FLd2lQcptpmUFwoCSWjCdOng9Gdq+afKArPdEg/0ZW461Eng==",
+			"version": "1.5.0",
+			"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.0.tgz",
+			"integrity": "sha512-Vb3xHHYnLseK8vlMJQKJYXJ++t4u1/qJ3vykuVrVjvdiOEhYyT1AuP4x03G8EnPmYvYOhe9T+dADTmthjRQMkA==",
 			"dev": true
 		},
 		"node_modules/emoji-regex": {
@@ -1353,6 +1254,28 @@
 			"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
 			"dev": true
 		},
+		"node_modules/end-of-stream": {
+			"version": "1.4.4",
+			"resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
+			"integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
+			"dev": true,
+			"dependencies": {
+				"once": "^1.4.0"
+			}
+		},
+		"node_modules/enhanced-resolve": {
+			"version": "5.17.1",
+			"resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz",
+			"integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==",
+			"dev": true,
+			"dependencies": {
+				"graceful-fs": "^4.2.4",
+				"tapable": "^2.2.0"
+			},
+			"engines": {
+				"node": ">=10.13.0"
+			}
+		},
 		"node_modules/entities": {
 			"version": "4.5.0",
 			"resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
@@ -1365,6 +1288,15 @@
 				"url": "https://github.com/fb55/entities?sponsor=1"
 			}
 		},
+		"node_modules/env-paths": {
+			"version": "2.2.1",
+			"resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz",
+			"integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==",
+			"dev": true,
+			"engines": {
+				"node": ">=6"
+			}
+		},
 		"node_modules/error-ex": {
 			"version": "1.3.2",
 			"resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
@@ -1375,9 +1307,9 @@
 			}
 		},
 		"node_modules/escalade": {
-			"version": "3.1.1",
-			"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
-			"integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+			"version": "3.1.2",
+			"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz",
+			"integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==",
 			"dev": true,
 			"engines": {
 				"node": ">=6"
@@ -1396,16 +1328,16 @@
 			}
 		},
 		"node_modules/eslint": {
-			"version": "8.56.0",
-			"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz",
-			"integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==",
+			"version": "8.57.0",
+			"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz",
+			"integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==",
 			"dev": true,
 			"dependencies": {
 				"@eslint-community/eslint-utils": "^4.2.0",
 				"@eslint-community/regexpp": "^4.6.1",
 				"@eslint/eslintrc": "^2.1.4",
-				"@eslint/js": "8.56.0",
-				"@humanwhocodes/config-array": "^0.11.13",
+				"@eslint/js": "8.57.0",
+				"@humanwhocodes/config-array": "^0.11.14",
 				"@humanwhocodes/module-importer": "^1.0.1",
 				"@nodelib/fs.walk": "^1.2.8",
 				"@ungap/structured-clone": "^1.2.0",
@@ -1451,10 +1383,13 @@
 			}
 		},
 		"node_modules/eslint-compat-utils": {
-			"version": "0.1.2",
-			"resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.1.2.tgz",
-			"integrity": "sha512-Jia4JDldWnFNIru1Ehx1H5s9/yxiRHY/TimCuUc0jNexew3cF1gI6CYZil1ociakfWO3rRqFjl1mskBblB3RYg==",
+			"version": "0.5.1",
+			"resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.5.1.tgz",
+			"integrity": "sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==",
 			"dev": true,
+			"dependencies": {
+				"semver": "^7.5.4"
+			},
 			"engines": {
 				"node": ">=12"
 			},
@@ -1463,28 +1398,28 @@
 			}
 		},
 		"node_modules/eslint-config-wikimedia": {
-			"version": "0.26.0",
-			"resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.26.0.tgz",
-			"integrity": "sha512-TAXTySls9k3oWs754rIjlcd9PBLvYeMvjqjiuU8u4gweu0UDgBJGslf+zcvVNXEooAtyLZdENjrzDDjG8ssS7Q==",
+			"version": "0.28.2",
+			"resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.28.2.tgz",
+			"integrity": "sha512-5+rdnT7wH1gpKAO6tHYThg78eMhZMruJzvqku3Y5iaEY/A7kSKLFpA/vOj/snys9fKjDHC9BXmArQh+agkOoJQ==",
 			"dev": true,
 			"dependencies": {
-				"browserslist-config-wikimedia": "^0.5.1",
-				"eslint": "^8.53.0",
+				"browserslist-config-wikimedia": "^0.7.0",
+				"eslint": "^8.57.0",
 				"eslint-plugin-compat": "^4.2.0",
-				"eslint-plugin-es-x": "^7.3.0",
-				"eslint-plugin-jest": "^27.6.0",
-				"eslint-plugin-jsdoc": "^42.0.0",
-				"eslint-plugin-json-es": "^1.5.7",
-				"eslint-plugin-mediawiki": "^0.5.0",
-				"eslint-plugin-mocha": "^10.2.0",
-				"eslint-plugin-n": "^16.0.1",
-				"eslint-plugin-no-jquery": "^2.7.0",
-				"eslint-plugin-qunit": "^7.3.4",
+				"eslint-plugin-es-x": "^7.6.0",
+				"eslint-plugin-jest": "^28.5.0",
+				"eslint-plugin-jsdoc": "48.2.5",
+				"eslint-plugin-json-es": "^1.6.0",
+				"eslint-plugin-mediawiki": "^0.7.0",
+				"eslint-plugin-mocha": "^10.4.3",
+				"eslint-plugin-n": "^17.7.0",
+				"eslint-plugin-no-jquery": "^3.0.1",
+				"eslint-plugin-qunit": "^8.1.1",
 				"eslint-plugin-security": "^1.7.1",
-				"eslint-plugin-unicorn": "^47.0.0",
-				"eslint-plugin-vue": "^9.18.1",
-				"eslint-plugin-wdio": "^7.19.4",
-				"eslint-plugin-yml": "^1.10.0"
+				"eslint-plugin-unicorn": "^53.0.0",
+				"eslint-plugin-vue": "^9.26.0",
+				"eslint-plugin-wdio": "^8.24.12",
+				"eslint-plugin-yml": "^1.14.0"
 			}
 		},
 		"node_modules/eslint-plugin-compat": {
@@ -1509,39 +1444,40 @@
 			}
 		},
 		"node_modules/eslint-plugin-es-x": {
-			"version": "7.5.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.5.0.tgz",
-			"integrity": "sha512-ODswlDSO0HJDzXU0XvgZ3lF3lS3XAZEossh15Q2UHjwrJggWeBoKqqEsLTZLXl+dh5eOAozG0zRcYtuE35oTuQ==",
+			"version": "7.8.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.8.0.tgz",
+			"integrity": "sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==",
 			"dev": true,
+			"funding": [
+				"https://github.com/sponsors/ota-meshi",
+				"https://opencollective.com/eslint"
+			],
 			"dependencies": {
 				"@eslint-community/eslint-utils": "^4.1.2",
-				"@eslint-community/regexpp": "^4.6.0",
-				"eslint-compat-utils": "^0.1.2"
+				"@eslint-community/regexpp": "^4.11.0",
+				"eslint-compat-utils": "^0.5.1"
 			},
 			"engines": {
 				"node": "^14.18.0 || >=16.0.0"
 			},
-			"funding": {
-				"url": "https://github.com/sponsors/ota-meshi"
-			},
 			"peerDependencies": {
 				"eslint": ">=8"
 			}
 		},
 		"node_modules/eslint-plugin-jest": {
-			"version": "27.6.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.6.0.tgz",
-			"integrity": "sha512-MTlusnnDMChbElsszJvrwD1dN3x6nZl//s4JD23BxB6MgR66TZlL064su24xEIS3VACfAoHV1vgyMgPw8nkdng==",
+			"version": "28.6.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-28.6.0.tgz",
+			"integrity": "sha512-YG28E1/MIKwnz+e2H7VwYPzHUYU4aMa19w0yGcwXnnmJH6EfgHahTJ2un3IyraUxNfnz/KUhJAFXNNwWPo12tg==",
 			"dev": true,
 			"dependencies": {
-				"@typescript-eslint/utils": "^5.10.0"
+				"@typescript-eslint/utils": "^6.0.0 || ^7.0.0"
 			},
 			"engines": {
-				"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+				"node": "^16.10.0 || ^18.12.0 || >=20.0.0"
 			},
 			"peerDependencies": {
-				"@typescript-eslint/eslint-plugin": "^5.0.0 || ^6.0.0",
-				"eslint": "^7.0.0 || ^8.0.0",
+				"@typescript-eslint/eslint-plugin": "^6.0.0 || ^7.0.0",
+				"eslint": "^7.0.0 || ^8.0.0 || ^9.0.0",
 				"jest": "*"
 			},
 			"peerDependenciesMeta": {
@@ -1554,31 +1490,32 @@
 			}
 		},
 		"node_modules/eslint-plugin-jsdoc": {
-			"version": "42.0.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-42.0.0.tgz",
-			"integrity": "sha512-qXYr45G8atPKowZbIOdmABukMzu9IMjAlj6j5Fe0iuUItznWSXUDiBj57ejXcbt8bkPrg83333nuz+cqGKFgcQ==",
+			"version": "48.2.5",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-48.2.5.tgz",
+			"integrity": "sha512-ZeTfKV474W1N9niWfawpwsXGu+ZoMXu4417eBROX31d7ZuOk8zyG66SO77DpJ2+A9Wa2scw/jRqBPnnQo7VbcQ==",
 			"dev": true,
 			"dependencies": {
-				"@es-joy/jsdoccomment": "~0.37.0",
+				"@es-joy/jsdoccomment": "~0.43.0",
 				"are-docs-informative": "^0.0.2",
-				"comment-parser": "1.3.1",
+				"comment-parser": "1.4.1",
 				"debug": "^4.3.4",
 				"escape-string-regexp": "^4.0.0",
 				"esquery": "^1.5.0",
-				"semver": "^7.3.8",
-				"spdx-expression-parse": "^3.0.1"
+				"is-builtin-module": "^3.2.1",
+				"semver": "^7.6.1",
+				"spdx-expression-parse": "^4.0.0"
 			},
 			"engines": {
-				"node": "^14 || ^16 || ^17 || ^18 || ^19"
+				"node": ">=18"
 			},
 			"peerDependencies": {
-				"eslint": "^7.0.0 || ^8.0.0"
+				"eslint": "^7.0.0 || ^8.0.0 || ^9.0.0"
 			}
 		},
 		"node_modules/eslint-plugin-json-es": {
-			"version": "1.5.7",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-json-es/-/eslint-plugin-json-es-1.5.7.tgz",
-			"integrity": "sha512-ehBHcCcJo4iViYx6vp3T+SmwzLIlVDzZNoVxN/txZIiPwDQ26mnYaN5iJ3imqN4l1b8z6rbxEH2kB9XDGxeU/w==",
+			"version": "1.6.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-json-es/-/eslint-plugin-json-es-1.6.0.tgz",
+			"integrity": "sha512-xVn6hufGQH1Aa+yqOhQ43Cq28GuitTcMpQh+uaUh27U2qnVLBrvkN+2xQSnv6zpdLEPS35JCNhq4kvhR+PQCgw==",
 			"dev": true,
 			"dependencies": {
 				"eslint-visitor-keys": "^3.3.0",
@@ -1589,125 +1526,116 @@
 			}
 		},
 		"node_modules/eslint-plugin-mediawiki": {
-			"version": "0.5.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-mediawiki/-/eslint-plugin-mediawiki-0.5.0.tgz",
-			"integrity": "sha512-rjkHFyv3VDan/dmu7YpD1Rl9h64NOlz4mqqesRN316R+571+ymmb6lXVOdNMbT8H1iPhmtHc+nijVLVkn7pYDw==",
+			"version": "0.7.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-mediawiki/-/eslint-plugin-mediawiki-0.7.0.tgz",
+			"integrity": "sha512-1Y2nsFDPp96xOZCB5ivZAgqYe9i6w2u64VoCIaAzPyZnd/2h8VQR3CtD+u4Yk/KrpbKq9AAJjrs5LS8VAz6KOA==",
 			"dev": true,
 			"dependencies": {
-				"eslint-plugin-vue": "^8.7.1",
+				"eslint-plugin-vue": "^9.23.0",
 				"upath": "^2.0.1"
 			},
 			"peerDependencies": {
 				"eslint": ">=5.0.0"
 			}
 		},
-		"node_modules/eslint-plugin-mediawiki/node_modules/eslint-plugin-vue": {
-			"version": "8.7.1",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-8.7.1.tgz",
-			"integrity": "sha512-28sbtm4l4cOzoO1LtzQPxfxhQABararUb1JtqusQqObJpWX2e/gmVyeYVfepizPFne0Q5cILkYGiBoV36L12Wg==",
+		"node_modules/eslint-plugin-mocha": {
+			"version": "10.4.3",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-10.4.3.tgz",
+			"integrity": "sha512-emc4TVjq5Ht0/upR+psftuz6IBG5q279p+1dSRDeHf+NS9aaerBi3lXKo1SEzwC29hFIW21gO89CEWSvRsi8IQ==",
 			"dev": true,
 			"dependencies": {
 				"eslint-utils": "^3.0.0",
-				"natural-compare": "^1.4.0",
-				"nth-check": "^2.0.1",
-				"postcss-selector-parser": "^6.0.9",
-				"semver": "^7.3.5",
-				"vue-eslint-parser": "^8.0.1"
+				"globals": "^13.24.0",
+				"rambda": "^7.4.0"
 			},
 			"engines": {
-				"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+				"node": ">=14.0.0"
 			},
 			"peerDependencies": {
-				"eslint": "^6.2.0 || ^7.0.0 || ^8.0.0"
+				"eslint": ">=7.0.0"
 			}
 		},
-		"node_modules/eslint-plugin-mediawiki/node_modules/vue-eslint-parser": {
-			"version": "8.3.0",
-			"resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-8.3.0.tgz",
-			"integrity": "sha512-dzHGG3+sYwSf6zFBa0Gi9ZDshD7+ad14DGOdTLjruRVgZXe2J+DcZ9iUhyR48z5g1PqRa20yt3Njna/veLJL/g==",
+		"node_modules/eslint-plugin-n": {
+			"version": "17.9.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-17.9.0.tgz",
+			"integrity": "sha512-CPSaXDXdrT4nsrOrO4mT4VB6FMUkoySRkHWuuJJHVqsIEjIeZgMY1H7AzSwPbDScikBmLN82KeM1u7ixV7PzGg==",
 			"dev": true,
 			"dependencies": {
-				"debug": "^4.3.2",
-				"eslint-scope": "^7.0.0",
-				"eslint-visitor-keys": "^3.1.0",
-				"espree": "^9.0.0",
-				"esquery": "^1.4.0",
-				"lodash": "^4.17.21",
-				"semver": "^7.3.5"
+				"@eslint-community/eslint-utils": "^4.4.0",
+				"enhanced-resolve": "^5.17.0",
+				"eslint-plugin-es-x": "^7.5.0",
+				"get-tsconfig": "^4.7.0",
+				"globals": "^15.0.0",
+				"ignore": "^5.2.4",
+				"minimatch": "^9.0.0",
+				"semver": "^7.5.3"
 			},
 			"engines": {
-				"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+				"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
 			},
 			"funding": {
-				"url": "https://github.com/sponsors/mysticatea"
+				"url": "https://opencollective.com/eslint"
 			},
 			"peerDependencies": {
-				"eslint": ">=6.0.0"
+				"eslint": ">=8.23.0"
 			}
 		},
-		"node_modules/eslint-plugin-mocha": {
-			"version": "10.2.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-10.2.0.tgz",
-			"integrity": "sha512-ZhdxzSZnd1P9LqDPF0DBcFLpRIGdh1zkF2JHnQklKQOvrQtT73kdP5K9V2mzvbLR+cCAO9OI48NXK/Ax9/ciCQ==",
+		"node_modules/eslint-plugin-n/node_modules/brace-expansion": {
+			"version": "2.0.1",
+			"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+			"integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
 			"dev": true,
 			"dependencies": {
-				"eslint-utils": "^3.0.0",
-				"rambda": "^7.4.0"
-			},
+				"balanced-match": "^1.0.0"
+			}
+		},
+		"node_modules/eslint-plugin-n/node_modules/globals": {
+			"version": "15.8.0",
+			"resolved": "https://registry.npmjs.org/globals/-/globals-15.8.0.tgz",
+			"integrity": "sha512-VZAJ4cewHTExBWDHR6yptdIBlx9YSSZuwojj9Nt5mBRXQzrKakDsVKQ1J63sklLvzAJm0X5+RpO4i3Y2hcOnFw==",
+			"dev": true,
 			"engines": {
-				"node": ">=14.0.0"
+				"node": ">=18"
 			},
-			"peerDependencies": {
-				"eslint": ">=7.0.0"
+			"funding": {
+				"url": "https://github.com/sponsors/sindresorhus"
 			}
 		},
-		"node_modules/eslint-plugin-n": {
-			"version": "16.5.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-16.5.0.tgz",
-			"integrity": "sha512-Hw02Bj1QrZIlKyj471Tb1jSReTl4ghIMHGuBGiMVmw+s0jOPbI4CBuYpGbZr+tdQ+VAvSK6FDSta3J4ib/SKHQ==",
+		"node_modules/eslint-plugin-n/node_modules/minimatch": {
+			"version": "9.0.5",
+			"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
+			"integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
 			"dev": true,
 			"dependencies": {
-				"@eslint-community/eslint-utils": "^4.4.0",
-				"builtins": "^5.0.1",
-				"eslint-plugin-es-x": "^7.5.0",
-				"get-tsconfig": "^4.7.0",
-				"ignore": "^5.2.4",
-				"is-builtin-module": "^3.2.1",
-				"is-core-module": "^2.12.1",
-				"minimatch": "^3.1.2",
-				"resolve": "^1.22.2",
-				"semver": "^7.5.3"
+				"brace-expansion": "^2.0.1"
 			},
 			"engines": {
-				"node": ">=16.0.0"
+				"node": ">=16 || 14 >=14.17"
 			},
 			"funding": {
-				"url": "https://github.com/sponsors/mysticatea"
-			},
-			"peerDependencies": {
-				"eslint": ">=7.0.0"
+				"url": "https://github.com/sponsors/isaacs"
 			}
 		},
 		"node_modules/eslint-plugin-no-jquery": {
-			"version": "2.7.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-no-jquery/-/eslint-plugin-no-jquery-2.7.0.tgz",
-			"integrity": "sha512-Aeg7dA6GTH1AcWLlBtWNzOU9efK5KpNi7b0EhBO0o0M+awyzguUUo8gF6hXGjQ9n5h8/uRtYv9zOqQkeC5CG0w==",
+			"version": "3.0.2",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-no-jquery/-/eslint-plugin-no-jquery-3.0.2.tgz",
+			"integrity": "sha512-n/+6p6PFhWDNPVLJj1463hw4OTIRBbROGcbhmtOHTgw7yihSKzkwZiQ00EJTneyeR3jRiw5lpWSMCCBhtb8t2g==",
 			"dev": true,
 			"peerDependencies": {
-				"eslint": ">=2.3.0"
+				"eslint": ">=8.0.0"
 			}
 		},
 		"node_modules/eslint-plugin-qunit": {
-			"version": "7.3.4",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-qunit/-/eslint-plugin-qunit-7.3.4.tgz",
-			"integrity": "sha512-EbDM0zJerH9zVdUswMJpcFF7wrrpvsGuYfNexUpa5hZkkdFhaFcX+yD+RSK4Nrauw4psMGlcqeWUMhaVo+Manw==",
+			"version": "8.1.1",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-qunit/-/eslint-plugin-qunit-8.1.1.tgz",
+			"integrity": "sha512-j3xhiAf2Wvr8Dfwl5T6tlJ+F55vqYE9ZdAHUOTzq1lGerYrXzOS46RvK4SSWug2D8sl3ZYr2lA4/hgVXgLloxw==",
 			"dev": true,
 			"dependencies": {
 				"eslint-utils": "^3.0.0",
 				"requireindex": "^1.2.0"
 			},
 			"engines": {
-				"node": "12.x || 14.x || >=16.0.0"
+				"node": "^16.0.0 || ^18.0.0 || >=20.0.0"
 			}
 		},
 		"node_modules/eslint-plugin-security": {
@@ -1720,76 +1648,141 @@
 			}
 		},
 		"node_modules/eslint-plugin-unicorn": {
-			"version": "47.0.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-47.0.0.tgz",
-			"integrity": "sha512-ivB3bKk7fDIeWOUmmMm9o3Ax9zbMz1Bsza/R2qm46ufw4T6VBFBaJIR1uN3pCKSmSXm8/9Nri8V+iUut1NhQGA==",
+			"version": "53.0.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-53.0.0.tgz",
+			"integrity": "sha512-kuTcNo9IwwUCfyHGwQFOK/HjJAYzbODHN3wP0PgqbW+jbXqpNWxNVpVhj2tO9SixBwuAdmal8rVcWKBxwFnGuw==",
 			"dev": true,
 			"dependencies": {
-				"@babel/helper-validator-identifier": "^7.19.1",
+				"@babel/helper-validator-identifier": "^7.24.5",
 				"@eslint-community/eslint-utils": "^4.4.0",
-				"ci-info": "^3.8.0",
+				"@eslint/eslintrc": "^3.0.2",
+				"ci-info": "^4.0.0",
 				"clean-regexp": "^1.0.0",
+				"core-js-compat": "^3.37.0",
 				"esquery": "^1.5.0",
 				"indent-string": "^4.0.0",
 				"is-builtin-module": "^3.2.1",
 				"jsesc": "^3.0.2",
-				"lodash": "^4.17.21",
 				"pluralize": "^8.0.0",
 				"read-pkg-up": "^7.0.1",
-				"regexp-tree": "^0.1.24",
+				"regexp-tree": "^0.1.27",
 				"regjsparser": "^0.10.0",
-				"safe-regex": "^2.1.1",
-				"semver": "^7.3.8",
+				"semver": "^7.6.1",
 				"strip-indent": "^3.0.0"
 			},
 			"engines": {
-				"node": ">=16"
+				"node": ">=18.18"
 			},
 			"funding": {
 				"url": "https://github.com/sindresorhus/eslint-plugin-unicorn?sponsor=1"
 			},
 			"peerDependencies": {
-				"eslint": ">=8.38.0"
+				"eslint": ">=8.56.0"
+			}
+		},
+		"node_modules/eslint-plugin-unicorn/node_modules/@eslint/eslintrc": {
+			"version": "3.1.0",
+			"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz",
+			"integrity": "sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==",
+			"dev": true,
+			"dependencies": {
+				"ajv": "^6.12.4",
+				"debug": "^4.3.2",
+				"espree": "^10.0.1",
+				"globals": "^14.0.0",
+				"ignore": "^5.2.0",
+				"import-fresh": "^3.2.1",
+				"js-yaml": "^4.1.0",
+				"minimatch": "^3.1.2",
+				"strip-json-comments": "^3.1.1"
+			},
+			"engines": {
+				"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+			},
+			"funding": {
+				"url": "https://opencollective.com/eslint"
+			}
+		},
+		"node_modules/eslint-plugin-unicorn/node_modules/eslint-visitor-keys": {
+			"version": "4.0.0",
+			"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz",
+			"integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==",
+			"dev": true,
+			"engines": {
+				"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+			},
+			"funding": {
+				"url": "https://opencollective.com/eslint"
+			}
+		},
+		"node_modules/eslint-plugin-unicorn/node_modules/espree": {
+			"version": "10.1.0",
+			"resolved": "https://registry.npmjs.org/espree/-/espree-10.1.0.tgz",
+			"integrity": "sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA==",
+			"dev": true,
+			"dependencies": {
+				"acorn": "^8.12.0",
+				"acorn-jsx": "^5.3.2",
+				"eslint-visitor-keys": "^4.0.0"
+			},
+			"engines": {
+				"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+			},
+			"funding": {
+				"url": "https://opencollective.com/eslint"
+			}
+		},
+		"node_modules/eslint-plugin-unicorn/node_modules/globals": {
+			"version": "14.0.0",
+			"resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz",
+			"integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==",
+			"dev": true,
+			"engines": {
+				"node": ">=18"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/sindresorhus"
 			}
 		},
 		"node_modules/eslint-plugin-vue": {
-			"version": "9.19.2",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.19.2.tgz",
-			"integrity": "sha512-CPDqTOG2K4Ni2o4J5wixkLVNwgctKXFu6oBpVJlpNq7f38lh9I80pRTouZSJ2MAebPJlINU/KTFSXyQfBUlymA==",
+			"version": "9.27.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.27.0.tgz",
+			"integrity": "sha512-5Dw3yxEyuBSXTzT5/Ge1X5kIkRTQ3nvBn/VwPwInNiZBSJOO/timWMUaflONnFBzU6NhB68lxnCda7ULV5N7LA==",
 			"dev": true,
 			"dependencies": {
 				"@eslint-community/eslint-utils": "^4.4.0",
+				"globals": "^13.24.0",
 				"natural-compare": "^1.4.0",
 				"nth-check": "^2.1.1",
-				"postcss-selector-parser": "^6.0.13",
-				"semver": "^7.5.4",
-				"vue-eslint-parser": "^9.3.1",
+				"postcss-selector-parser": "^6.0.15",
+				"semver": "^7.6.0",
+				"vue-eslint-parser": "^9.4.3",
 				"xml-name-validator": "^4.0.0"
 			},
 			"engines": {
 				"node": "^14.17.0 || >=16.0.0"
 			},
 			"peerDependencies": {
-				"eslint": "^6.2.0 || ^7.0.0 || ^8.0.0"
+				"eslint": "^6.2.0 || ^7.0.0 || ^8.0.0 || ^9.0.0"
 			}
 		},
 		"node_modules/eslint-plugin-wdio": {
-			"version": "7.25.3",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-wdio/-/eslint-plugin-wdio-7.25.3.tgz",
-			"integrity": "sha512-2zbYwV14Md9FNlyhaIILVGPB6w4bu2eJdOTywDUs2Qy4ebcQNwrxB0qCaf7Rm4O+T0Ir+tdYHYBBfbDocSLKng==",
+			"version": "8.37.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-wdio/-/eslint-plugin-wdio-8.37.0.tgz",
+			"integrity": "sha512-X217zXxSqj1IPWu3bxN7D/xEUmNk7Jg5lBf2JwYH3mCogaqL2tnHZnwt0EQ5D9oEejfEl2+4zqHSzhXq1X7F2A==",
 			"dev": true,
 			"engines": {
-				"node": ">=12.0.0"
+				"node": "^16.13 || >=18"
 			}
 		},
 		"node_modules/eslint-plugin-yml": {
-			"version": "1.11.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-yml/-/eslint-plugin-yml-1.11.0.tgz",
-			"integrity": "sha512-NBZP1NDGy0u38pY5ieix75jxS9GNOJy9xd4gQa0rU4gWbfEsVhKDwuFaQ6RJpDbv6Lq5TtcAZS/YnAc0oeRw0w==",
+			"version": "1.14.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-yml/-/eslint-plugin-yml-1.14.0.tgz",
+			"integrity": "sha512-ESUpgYPOcAYQO9czugcX5OqRvn/ydDVwGCPXY4YjPqc09rHaUVUA6IE6HLQys4rXk/S+qx3EwTd1wHCwam/OWQ==",
 			"dev": true,
 			"dependencies": {
 				"debug": "^4.3.2",
-				"eslint-compat-utils": "^0.1.1",
+				"eslint-compat-utils": "^0.5.0",
 				"lodash": "^4.17.21",
 				"natural-compare": "^1.4.0",
 				"yaml-eslint-parser": "^1.2.1"
@@ -2010,6 +2003,12 @@
 			"integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
 			"dev": true
 		},
+		"node_modules/fast-uri": {
+			"version": "3.0.1",
+			"resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.1.tgz",
+			"integrity": "sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==",
+			"dev": true
+		},
 		"node_modules/fastest-levenshtein": {
 			"version": "1.0.16",
 			"resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz",
@@ -2041,9 +2040,9 @@
 			}
 		},
 		"node_modules/fill-range": {
-			"version": "7.0.1",
-			"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
-			"integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+			"version": "7.1.1",
+			"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+			"integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
 			"dev": true,
 			"dependencies": {
 				"to-regex-range": "^5.0.1"
@@ -2123,9 +2122,9 @@
 			}
 		},
 		"node_modules/flatted": {
-			"version": "3.2.9",
-			"resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz",
-			"integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==",
+			"version": "3.3.1",
+			"resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz",
+			"integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==",
 			"dev": true
 		},
 		"node_modules/for-in": {
@@ -2174,9 +2173,9 @@
 			}
 		},
 		"node_modules/get-tsconfig": {
-			"version": "4.7.2",
-			"resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.2.tgz",
-			"integrity": "sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==",
+			"version": "4.7.6",
+			"resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.6.tgz",
+			"integrity": "sha512-ZAqrLlu18NbDdRaHq+AKXzAmqIUPswPWKUchfytdAjiRFnCe5ojG2bstg6mRiZabkKfCoL/e98pbBELIV/YCeA==",
 			"dev": true,
 			"dependencies": {
 				"resolve-pkg-maps": "^1.0.0"
@@ -2309,6 +2308,12 @@
 			"integrity": "sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==",
 			"dev": true
 		},
+		"node_modules/graceful-fs": {
+			"version": "4.2.11",
+			"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+			"integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
+			"dev": true
+		},
 		"node_modules/graphemer": {
 			"version": "1.4.0",
 			"resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
@@ -2343,15 +2348,18 @@
 			}
 		},
 		"node_modules/grunt-banana-checker": {
-			"version": "0.11.1",
-			"resolved": "https://registry.npmjs.org/grunt-banana-checker/-/grunt-banana-checker-0.11.1.tgz",
-			"integrity": "sha512-CF0h/TXaX9sbF2yIz+fUfJc4Zvms7XGYQ7ZYMD5+vv0LMZzSFf7JSHXDaBEs72nQWw4r4ap5fOW3baAliW+0bQ==",
+			"version": "0.13.0",
+			"resolved": "https://registry.npmjs.org/grunt-banana-checker/-/grunt-banana-checker-0.13.0.tgz",
+			"integrity": "sha512-uAUKILcP69Q4OJHHV2wzxqVaoXB8G3Uh/XuSJLn0Bk/9+WiUY/Q4+OX7dUhrPPeDZPtoGh37qqJLVvZlDTUecg==",
 			"dev": true,
+			"dependencies": {
+				"chalk": "4.1.2"
+			},
 			"bin": {
 				"banana-checker": "src/cli.js"
 			},
 			"engines": {
-				"node": ">=8"
+				"node": ">=16"
 			}
 		},
 		"node_modules/grunt-cli": {
@@ -2461,18 +2469,18 @@
 			}
 		},
 		"node_modules/grunt-stylelint": {
-			"version": "0.19.0",
-			"resolved": "https://registry.npmjs.org/grunt-stylelint/-/grunt-stylelint-0.19.0.tgz",
-			"integrity": "sha512-td+OvkfQ/2bYXNTBAlnpXmfa6sddLSloXRp1zoUONcMScbvEq5S3GSkOZKpCjK90WSjTYR0L7WYFcMVd1TXd+w==",
+			"version": "0.20.1",
+			"resolved": "https://registry.npmjs.org/grunt-stylelint/-/grunt-stylelint-0.20.1.tgz",
+			"integrity": "sha512-tDep9ceEerB+fK6CkzPBXu5qPM7RuwCRgfrtwugEyYYnxINreMZktqQU5eoTW+MhhFj81uWQQnxf+c4geyAmQg==",
 			"dev": true,
 			"dependencies": {
 				"chalk": "^4.1.2"
 			},
 			"engines": {
-				"node": ">=16"
+				"node": ">=18.12.0"
 			},
 			"peerDependencies": {
-				"stylelint": "15.x"
+				"stylelint": "16.x"
 			}
 		},
 		"node_modules/grunt/node_modules/argparse": {
@@ -2515,15 +2523,6 @@
 			"integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
 			"dev": true
 		},
-		"node_modules/hard-rejection": {
-			"version": "2.1.0",
-			"resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz",
-			"integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==",
-			"dev": true,
-			"engines": {
-				"node": ">=6"
-			}
-		},
 		"node_modules/has-flag": {
 			"version": "4.0.0",
 			"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
@@ -2616,9 +2615,9 @@
 			}
 		},
 		"node_modules/ignore": {
-			"version": "5.3.0",
-			"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz",
-			"integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==",
+			"version": "5.3.1",
+			"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz",
+			"integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==",
 			"dev": true,
 			"engines": {
 				"node": ">= 4"
@@ -2640,15 +2639,6 @@
 				"url": "https://github.com/sponsors/sindresorhus"
 			}
 		},
-		"node_modules/import-lazy": {
-			"version": "4.0.0",
-			"resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz",
-			"integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==",
-			"dev": true,
-			"engines": {
-				"node": ">=8"
-			}
-		},
 		"node_modules/imurmurhash": {
 			"version": "0.1.4",
 			"resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
@@ -2789,15 +2779,6 @@
 				"node": ">=8"
 			}
 		},
-		"node_modules/is-plain-obj": {
-			"version": "1.1.0",
-			"resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
-			"integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==",
-			"dev": true,
-			"engines": {
-				"node": ">=0.10.0"
-			}
-		},
 		"node_modules/is-plain-object": {
 			"version": "2.0.4",
 			"resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
@@ -2946,11 +2927,10 @@
 			}
 		},
 		"node_modules/known-css-properties": {
-			"version": "0.29.0",
-			"resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.29.0.tgz",
-			"integrity": "sha512-Ne7wqW7/9Cz54PDt4I3tcV+hAyat8ypyOGzYRJQfdxnnjeWsTxt1cy8pjvvKeI5kfXuyvULyeeAvwvvtAX3ayQ==",
-			"dev": true,
-			"peer": true
+			"version": "0.34.0",
+			"resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.34.0.tgz",
+			"integrity": "sha512-tBECoUqNFbyAY4RrbqsBQqDFpGXAEbdD5QKr8kACx3+rnArmuuR22nKQWKazvp07N9yjTyDZaw/20UIH8tL9DQ==",
+			"dev": true
 		},
 		"node_modules/ldjson-stream": {
 			"version": "1.2.1",
@@ -2962,28 +2942,6 @@
 				"through2": "^0.6.1"
 			}
 		},
-		"node_modules/ldjson-stream/node_modules/readable-stream": {
-			"version": "1.0.34",
-			"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
-			"integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==",
-			"dev": true,
-			"dependencies": {
-				"core-util-is": "~1.0.0",
-				"inherits": "~2.0.1",
-				"isarray": "0.0.1",
-				"string_decoder": "~0.10.x"
-			}
-		},
-		"node_modules/ldjson-stream/node_modules/through2": {
-			"version": "0.6.5",
-			"resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz",
-			"integrity": "sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg==",
-			"dev": true,
-			"dependencies": {
-				"readable-stream": ">=1.0.33-1 <1.1.0-0",
-				"xtend": ">=4.0.0 <4.1.0-0"
-			}
-		},
 		"node_modules/levn": {
 			"version": "0.4.1",
 			"resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
@@ -3076,18 +3034,6 @@
 			"integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==",
 			"dev": true
 		},
-		"node_modules/lru-cache": {
-			"version": "6.0.0",
-			"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
-			"integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
-			"dev": true,
-			"dependencies": {
-				"yallist": "^4.0.0"
-			},
-			"engines": {
-				"node": ">=10"
-			}
-		},
 		"node_modules/make-iterator": {
 			"version": "1.0.1",
 			"resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz",
@@ -3109,18 +3055,6 @@
 				"node": ">=0.10.0"
 			}
 		},
-		"node_modules/map-obj": {
-			"version": "4.3.0",
-			"resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz",
-			"integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==",
-			"dev": true,
-			"engines": {
-				"node": ">=8"
-			},
-			"funding": {
-				"url": "https://github.com/sponsors/sindresorhus"
-			}
-		},
 		"node_modules/mathml-tag-names": {
 			"version": "2.1.3",
 			"resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz",
@@ -3138,100 +3072,12 @@
 			"dev": true
 		},
 		"node_modules/meow": {
-			"version": "10.1.5",
-			"resolved": "https://registry.npmjs.org/meow/-/meow-10.1.5.tgz",
-			"integrity": "sha512-/d+PQ4GKmGvM9Bee/DPa8z3mXs/pkvJE2KEThngVNOqtmljC6K7NMPxtc2JeZYTmpWb9k/TmxjeL18ez3h7vCw==",
-			"dev": true,
-			"dependencies": {
-				"@types/minimist": "^1.2.2",
-				"camelcase-keys": "^7.0.0",
-				"decamelize": "^5.0.0",
-				"decamelize-keys": "^1.1.0",
-				"hard-rejection": "^2.1.0",
-				"minimist-options": "4.1.0",
-				"normalize-package-data": "^3.0.2",
-				"read-pkg-up": "^8.0.0",
-				"redent": "^4.0.0",
-				"trim-newlines": "^4.0.2",
-				"type-fest": "^1.2.2",
-				"yargs-parser": "^20.2.9"
-			},
-			"engines": {
-				"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
-			},
-			"funding": {
-				"url": "https://github.com/sponsors/sindresorhus"
-			}
-		},
-		"node_modules/meow/node_modules/hosted-git-info": {
-			"version": "4.1.0",
-			"resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz",
-			"integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==",
-			"dev": true,
-			"dependencies": {
-				"lru-cache": "^6.0.0"
-			},
-			"engines": {
-				"node": ">=10"
-			}
-		},
-		"node_modules/meow/node_modules/normalize-package-data": {
-			"version": "3.0.3",
-			"resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz",
-			"integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==",
-			"dev": true,
-			"dependencies": {
-				"hosted-git-info": "^4.0.1",
-				"is-core-module": "^2.5.0",
-				"semver": "^7.3.4",
-				"validate-npm-package-license": "^3.0.1"
-			},
-			"engines": {
-				"node": ">=10"
-			}
-		},
-		"node_modules/meow/node_modules/read-pkg": {
-			"version": "6.0.0",
-			"resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-6.0.0.tgz",
-			"integrity": "sha512-X1Fu3dPuk/8ZLsMhEj5f4wFAF0DWoK7qhGJvgaijocXxBmSToKfbFtqbxMO7bVjNA1dmE5huAzjXj/ey86iw9Q==",
-			"dev": true,
-			"dependencies": {
-				"@types/normalize-package-data": "^2.4.0",
-				"normalize-package-data": "^3.0.2",
-				"parse-json": "^5.2.0",
-				"type-fest": "^1.0.1"
-			},
-			"engines": {
-				"node": ">=12"
-			},
-			"funding": {
-				"url": "https://github.com/sponsors/sindresorhus"
-			}
-		},
-		"node_modules/meow/node_modules/read-pkg-up": {
-			"version": "8.0.0",
-			"resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-8.0.0.tgz",
-			"integrity": "sha512-snVCqPczksT0HS2EC+SxUndvSzn6LRCwpfSvLrIfR5BKDQQZMaI6jPRC9dYvYFDRAuFEAnkwww8kBBNE/3VvzQ==",
-			"dev": true,
-			"dependencies": {
-				"find-up": "^5.0.0",
-				"read-pkg": "^6.0.0",
-				"type-fest": "^1.0.1"
-			},
-			"engines": {
-				"node": ">=12"
-			},
-			"funding": {
-				"url": "https://github.com/sponsors/sindresorhus"
-			}
-		},
-		"node_modules/meow/node_modules/type-fest": {
-			"version": "1.4.0",
-			"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz",
-			"integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==",
+			"version": "13.2.0",
+			"resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz",
+			"integrity": "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==",
 			"dev": true,
 			"engines": {
-				"node": ">=10"
+				"node": ">=18"
 			},
 			"funding": {
 				"url": "https://github.com/sponsors/sindresorhus"
@@ -3247,12 +3093,12 @@
 			}
 		},
 		"node_modules/micromatch": {
-			"version": "4.0.5",
-			"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
-			"integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
+			"version": "4.0.7",
+			"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz",
+			"integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==",
 			"dev": true,
 			"dependencies": {
-				"braces": "^3.0.2",
+				"braces": "^3.0.3",
 				"picomatch": "^2.3.1"
 			},
 			"engines": {
@@ -3280,20 +3126,6 @@
 				"node": "*"
 			}
 		},
-		"node_modules/minimist-options": {
-			"version": "4.1.0",
-			"resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz",
-			"integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==",
-			"dev": true,
-			"dependencies": {
-				"arrify": "^1.0.1",
-				"is-plain-obj": "^1.1.0",
-				"kind-of": "^6.0.3"
-			},
-			"engines": {
-				"node": ">= 6"
-			}
-		},
 		"node_modules/ms": {
 			"version": "2.1.2",
 			"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
@@ -3319,15 +3151,6 @@
 				"url": "https://github.com/sponsors/sindresorhus"
 			}
 		},
-		"node_modules/multimatch/node_modules/arrify": {
-			"version": "2.0.1",
-			"resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz",
-			"integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==",
-			"dev": true,
-			"engines": {
-				"node": ">=8"
-			}
-		},
 		"node_modules/nanoid": {
 			"version": "3.3.7",
 			"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",
@@ -3662,9 +3485,9 @@
 			}
 		},
 		"node_modules/picocolors": {
-			"version": "1.0.0",
-			"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
-			"integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
+			"version": "1.0.1",
+			"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz",
+			"integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==",
 			"dev": true
 		},
 		"node_modules/picomatch": {
@@ -3689,9 +3512,9 @@
 			}
 		},
 		"node_modules/postcss": {
-			"version": "8.4.32",
-			"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.32.tgz",
-			"integrity": "sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==",
+			"version": "8.4.39",
+			"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.39.tgz",
+			"integrity": "sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==",
 			"dev": true,
 			"funding": [
 				{
@@ -3709,17 +3532,17 @@
 			],
 			"dependencies": {
 				"nanoid": "^3.3.7",
-				"picocolors": "^1.0.0",
-				"source-map-js": "^1.0.2"
+				"picocolors": "^1.0.1",
+				"source-map-js": "^1.2.0"
 			},
 			"engines": {
 				"node": "^10 || ^12 || >=14"
 			}
 		},
 		"node_modules/postcss-html": {
-			"version": "1.5.0",
-			"resolved": "https://registry.npmjs.org/postcss-html/-/postcss-html-1.5.0.tgz",
-			"integrity": "sha512-kCMRWJRHKicpA166kc2lAVUGxDZL324bkj/pVOb6RhjB0Z5Krl7mN0AsVkBhVIRZZirY0lyQXG38HCVaoKVNoA==",
+			"version": "1.6.0",
+			"resolved": "https://registry.npmjs.org/postcss-html/-/postcss-html-1.6.0.tgz",
+			"integrity": "sha512-OWgQ9/Pe23MnNJC0PL4uZp8k0EDaUvqpJFSiwFxOLClAhmD7UEisyhO3x5hVsD4xFrjReVTXydlrMes45dJ71w==",
 			"dev": true,
 			"dependencies": {
 				"htmlparser2": "^8.0.0",
@@ -3732,11 +3555,27 @@
 			}
 		},
 		"node_modules/postcss-html/node_modules/js-tokens": {
-			"version": "8.0.2",
-			"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-8.0.2.tgz",
-			"integrity": "sha512-Olnt+V7xYdvGze9YTbGFZIfQXuGV4R3nQwwl8BrtgaPE/wq8UFpUHWuTNc05saowhSr1ZO6tx+V6RjE9D5YQog==",
+			"version": "8.0.3",
+			"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-8.0.3.tgz",
+			"integrity": "sha512-UfJMcSJc+SEXEl9lH/VLHSZbThQyLpw1vLO1Lb+j4RWDvG3N2f7yj3PVQA3cmkTBNldJ9eFnM+xEXxHIXrYiJw==",
 			"dev": true
 		},
+		"node_modules/postcss-html/node_modules/postcss-safe-parser": {
+			"version": "6.0.0",
+			"resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz",
+			"integrity": "sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==",
+			"dev": true,
+			"engines": {
+				"node": ">=12.0"
+			},
+			"funding": {
+				"type": "opencollective",
+				"url": "https://opencollective.com/postcss/"
+			},
+			"peerDependencies": {
+				"postcss": "^8.3.3"
+			}
+		},
 		"node_modules/postcss-less": {
 			"version": "6.0.0",
 			"resolved": "https://registry.npmjs.org/postcss-less/-/postcss-less-6.0.0.tgz",
@@ -3749,12 +3588,6 @@
 				"postcss": "^8.3.5"
 			}
 		},
-		"node_modules/postcss-media-query-parser": {
-			"version": "0.2.3",
-			"resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz",
-			"integrity": "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==",
-			"dev": true
-		},
 		"node_modules/postcss-resolve-nested-selector": {
 			"version": "0.1.1",
 			"resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz",
@@ -3762,25 +3595,35 @@
 			"dev": true
 		},
 		"node_modules/postcss-safe-parser": {
-			"version": "6.0.0",
-			"resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz",
-			"integrity": "sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==",
+			"version": "7.0.0",
+			"resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-7.0.0.tgz",
+			"integrity": "sha512-ovehqRNVCpuFzbXoTb4qLtyzK3xn3t/CUBxOs8LsnQjQrShaB4lKiHoVqY8ANaC0hBMHq5QVWk77rwGklFUDrg==",
 			"dev": true,
+			"funding": [
+				{
+					"type": "opencollective",
+					"url": "https://opencollective.com/postcss/"
+				},
+				{
+					"type": "tidelift",
+					"url": "https://tidelift.com/funding/github/npm/postcss-safe-parser"
+				},
+				{
+					"type": "github",
+					"url": "https://github.com/sponsors/ai"
+				}
+			],
 			"engines": {
-				"node": ">=12.0"
-			},
-			"funding": {
-				"type": "opencollective",
-				"url": "https://opencollective.com/postcss/"
+				"node": ">=18.0"
 			},
 			"peerDependencies": {
-				"postcss": "^8.3.3"
+				"postcss": "^8.4.31"
 			}
 		},
 		"node_modules/postcss-selector-parser": {
-			"version": "6.0.13",
-			"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz",
-			"integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==",
+			"version": "6.1.1",
+			"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.1.tgz",
+			"integrity": "sha512-b4dlw/9V8A71rLIDsSwVmak9z2DuBUB7CA1/wSdelNEzqsjoSPeADTWNO09lpH49Diy3/JIZ2bSPB1dI3LJCHg==",
 			"dev": true,
 			"dependencies": {
 				"cssesc": "^3.0.0",
@@ -3834,18 +3677,6 @@
 				}
 			]
 		},
-		"node_modules/quick-lru": {
-			"version": "5.1.1",
-			"resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz",
-			"integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==",
-			"dev": true,
-			"engines": {
-				"node": ">=10"
-			},
-			"funding": {
-				"url": "https://github.com/sponsors/sindresorhus"
-			}
-		},
 		"node_modules/rambda": {
 			"version": "7.5.0",
 			"resolved": "https://registry.npmjs.org/rambda/-/rambda-7.5.0.tgz",
@@ -3978,49 +3809,6 @@
 				"node": ">= 0.10"
 			}
 		},
-		"node_modules/redent": {
-			"version": "4.0.0",
-			"resolved": "https://registry.npmjs.org/redent/-/redent-4.0.0.tgz",
-			"integrity": "sha512-tYkDkVVtYkSVhuQ4zBgfvciymHaeuel+zFKXShfDnFP5SyVEP7qo70Rf1jTOTCx3vGNAbnEi/xFkcfQVMIBWag==",
-			"dev": true,
-			"dependencies": {
-				"indent-string": "^5.0.0",
-				"strip-indent": "^4.0.0"
-			},
-			"engines": {
-				"node": ">=12"
-			},
-			"funding": {
-				"url": "https://github.com/sponsors/sindresorhus"
-			}
-		},
-		"node_modules/redent/node_modules/indent-string": {
-			"version": "5.0.0",
-			"resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz",
-			"integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==",
-			"dev": true,
-			"engines": {
-				"node": ">=12"
-			},
-			"funding": {
-				"url": "https://github.com/sponsors/sindresorhus"
-			}
-		},
-		"node_modules/redent/node_modules/strip-indent": {
-			"version": "4.0.0",
-			"resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.0.0.tgz",
-			"integrity": "sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==",
-			"dev": true,
-			"dependencies": {
-				"min-indent": "^1.0.1"
-			},
-			"engines": {
-				"node": ">=12"
-			},
-			"funding": {
-				"url": "https://github.com/sponsors/sindresorhus"
-			}
-		},
 		"node_modules/regexp-tree": {
 			"version": "0.1.27",
 			"resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.27.tgz",
@@ -4210,13 +3998,10 @@
 			"dev": true
 		},
 		"node_modules/semver": {
-			"version": "7.5.4",
-			"resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
-			"integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
+			"version": "7.6.3",
+			"resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
+			"integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
 			"dev": true,
-			"dependencies": {
-				"lru-cache": "^6.0.0"
-			},
 			"bin": {
 				"semver": "bin/semver.js"
 			},
@@ -4293,9 +4078,9 @@
 			}
 		},
 		"node_modules/source-map-js": {
-			"version": "1.0.2",
-			"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
-			"integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
+			"version": "1.2.0",
+			"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz",
+			"integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==",
 			"dev": true,
 			"engines": {
 				"node": ">=0.10.0"
@@ -4311,16 +4096,26 @@
 				"spdx-license-ids": "^3.0.0"
 			}
 		},
+		"node_modules/spdx-correct/node_modules/spdx-expression-parse": {
+			"version": "3.0.1",
+			"resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
+			"integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
+			"dev": true,
+			"dependencies": {
+				"spdx-exceptions": "^2.1.0",
+				"spdx-license-ids": "^3.0.0"
+			}
+		},
 		"node_modules/spdx-exceptions": {
-			"version": "2.3.0",
-			"resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz",
-			"integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==",
+			"version": "2.5.0",
+			"resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz",
+			"integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==",
 			"dev": true
 		},
 		"node_modules/spdx-expression-parse": {
-			"version": "3.0.1",
-			"resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
-			"integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
+			"version": "4.0.0",
+			"resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-4.0.0.tgz",
+			"integrity": "sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==",
 			"dev": true,
 			"dependencies": {
 				"spdx-exceptions": "^2.1.0",
@@ -4328,9 +4123,9 @@
 			}
 		},
 		"node_modules/spdx-license-ids": {
-			"version": "3.0.16",
-			"resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz",
-			"integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==",
+			"version": "3.0.18",
+			"resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.18.tgz",
+			"integrity": "sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ==",
 			"dev": true
 		},
 		"node_modules/split2": {
@@ -4342,34 +4137,18 @@
 				"through2": "~0.6.1"
 			}
 		},
-		"node_modules/split2/node_modules/readable-stream": {
-			"version": "1.0.34",
-			"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
-			"integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==",
-			"dev": true,
-			"dependencies": {
-				"core-util-is": "~1.0.0",
-				"inherits": "~2.0.1",
-				"isarray": "0.0.1",
-				"string_decoder": "~0.10.x"
-			}
-		},
-		"node_modules/split2/node_modules/through2": {
-			"version": "0.6.5",
-			"resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz",
-			"integrity": "sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg==",
-			"dev": true,
-			"dependencies": {
-				"readable-stream": ">=1.0.33-1 <1.1.0-0",
-				"xtend": ">=4.0.0 <4.1.0-0"
-			}
-		},
 		"node_modules/sprintf-js": {
 			"version": "1.1.3",
 			"resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz",
 			"integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==",
 			"dev": true
 		},
+		"node_modules/stream-shift": {
+			"version": "1.0.3",
+			"resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz",
+			"integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==",
+			"dev": true
+		},
 		"node_modules/string_decoder": {
 			"version": "0.10.31",
 			"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
@@ -4433,105 +4212,141 @@
 			"dev": true
 		},
 		"node_modules/stylelint": {
-			"version": "15.11.0",
-			"resolved": "https://registry.npmjs.org/stylelint/-/stylelint-15.11.0.tgz",
-			"integrity": "sha512-78O4c6IswZ9TzpcIiQJIN49K3qNoXTM8zEJzhaTE/xRTCZswaovSEVIa/uwbOltZrk16X4jAxjaOhzz/hTm1Kw==",
+			"version": "16.7.0",
+			"resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.7.0.tgz",
+			"integrity": "sha512-Q1ATiXlz+wYr37a7TGsfvqYn2nSR3T/isw3IWlZQzFzCNoACHuGBb6xBplZXz56/uDRJHIygxjh7jbV/8isewA==",
 			"dev": true,
-			"peer": true,
+			"funding": [
+				{
+					"type": "opencollective",
+					"url": "https://opencollective.com/stylelint"
+				},
+				{
+					"type": "github",
+					"url": "https://github.com/sponsors/stylelint"
+				}
+			],
 			"dependencies": {
-				"@csstools/css-parser-algorithms": "^2.3.1",
-				"@csstools/css-tokenizer": "^2.2.0",
-				"@csstools/media-query-list-parser": "^2.1.4",
-				"@csstools/selector-specificity": "^3.0.0",
+				"@csstools/css-parser-algorithms": "^2.7.1",
+				"@csstools/css-tokenizer": "^2.4.1",
+				"@csstools/media-query-list-parser": "^2.1.13",
+				"@csstools/selector-specificity": "^3.1.1",
+				"@dual-bundle/import-meta-resolve": "^4.1.0",
 				"balanced-match": "^2.0.0",
 				"colord": "^2.9.3",
-				"cosmiconfig": "^8.2.0",
-				"css-functions-list": "^3.2.1",
+				"cosmiconfig": "^9.0.0",
+				"css-functions-list": "^3.2.2",
 				"css-tree": "^2.3.1",
-				"debug": "^4.3.4",
-				"fast-glob": "^3.3.1",
+				"debug": "^4.3.5",
+				"fast-glob": "^3.3.2",
 				"fastest-levenshtein": "^1.0.16",
-				"file-entry-cache": "^7.0.0",
+				"file-entry-cache": "^9.0.0",
 				"global-modules": "^2.0.0",
 				"globby": "^11.1.0",
 				"globjoin": "^0.1.4",
 				"html-tags": "^3.3.1",
-				"ignore": "^5.2.4",
-				"import-lazy": "^4.0.0",
+				"ignore": "^5.3.1",
 				"imurmurhash": "^0.1.4",
 				"is-plain-object": "^5.0.0",
-				"known-css-properties": "^0.29.0",
+				"known-css-properties": "^0.34.0",
 				"mathml-tag-names": "^2.1.3",
-				"meow": "^10.1.5",
-				"micromatch": "^4.0.5",
+				"meow": "^13.2.0",
+				"micromatch": "^4.0.7",
 				"normalize-path": "^3.0.0",
-				"picocolors": "^1.0.0",
-				"postcss": "^8.4.28",
+				"picocolors": "^1.0.1",
+				"postcss": "^8.4.39",
 				"postcss-resolve-nested-selector": "^0.1.1",
-				"postcss-safe-parser": "^6.0.0",
-				"postcss-selector-parser": "^6.0.13",
+				"postcss-safe-parser": "^7.0.0",
+				"postcss-selector-parser": "^6.1.0",
 				"postcss-value-parser": "^4.2.0",
 				"resolve-from": "^5.0.0",
 				"string-width": "^4.2.3",
-				"strip-ansi": "^6.0.1",
-				"style-search": "^0.1.0",
+				"strip-ansi": "^7.1.0",
 				"supports-hyperlinks": "^3.0.0",
 				"svg-tags": "^1.0.0",
-				"table": "^6.8.1",
+				"table": "^6.8.2",
 				"write-file-atomic": "^5.0.1"
 			},
 			"bin": {
 				"stylelint": "bin/stylelint.mjs"
 			},
 			"engines": {
-				"node": "^14.13.1 || >=16.0.0"
-			},
-			"funding": {
-				"type": "opencollective",
-				"url": "https://opencollective.com/stylelint"
+				"node": ">=18.12.0"
 			}
 		},
 		"node_modules/stylelint-config-recommended": {
-			"version": "13.0.0",
-			"resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-13.0.0.tgz",
-			"integrity": "sha512-EH+yRj6h3GAe/fRiyaoO2F9l9Tgg50AOFhaszyfov9v6ayXJ1IkSHwTxd7lB48FmOeSGDPLjatjO11fJpmarkQ==",
+			"version": "14.0.0",
+			"resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-14.0.0.tgz",
+			"integrity": "sha512-jSkx290CglS8StmrLp2TxAppIajzIBZKYm3IxT89Kg6fGlxbPiTiyH9PS5YUuVAFwaJLl1ikiXX0QWjI0jmgZQ==",
 			"dev": true,
 			"engines": {
-				"node": "^14.13.1 || >=16.0.0"
+				"node": ">=18.12.0"
 			},
 			"peerDependencies": {
-				"stylelint": "^15.10.0"
+				"stylelint": "^16.0.0"
 			}
 		},
 		"node_modules/stylelint-config-wikimedia": {
-			"version": "0.16.1",
-			"resolved": "https://registry.npmjs.org/stylelint-config-wikimedia/-/stylelint-config-wikimedia-0.16.1.tgz",
-			"integrity": "sha512-FDVUyDyCBap2o2HAeJqIobdVdSTur5HFX5FymoKrzfMIYWxIV/55lTpyL1PR71TfVMaroDXJrIftLFW9mXKFhQ==",
+			"version": "0.17.2",
+			"resolved": "https://registry.npmjs.org/stylelint-config-wikimedia/-/stylelint-config-wikimedia-0.17.2.tgz",
+			"integrity": "sha512-cc3PYhe1O/GTgsMOp+Ri3ru579YBbZ3Me0oU7xNb06n4iwyXYPz8qO5G4iQ13UH19UW2NIS8Tk0goPRrJ1RAfw==",
 			"dev": true,
 			"dependencies": {
-				"browserslist-config-wikimedia": "0.5.0",
-				"postcss-html": "1.5.0",
+				"@stylistic/stylelint-config": "1.0.1",
+				"@stylistic/stylelint-plugin": "2.0.0",
+				"browserslist-config-wikimedia": "0.7.0",
+				"postcss-html": "1.6.0",
 				"postcss-less": "6.0.0",
-				"stylelint": "15.10.1",
-				"stylelint-config-recommended": "13.0.0",
-				"stylelint-no-unsupported-browser-features": "6.1.0",
-				"stylelint-stylistic": "0.4.3"
+				"stylelint": "16.2.0",
+				"stylelint-config-recommended": "14.0.0",
+				"stylelint-no-unsupported-browser-features": "8.0.1"
 			},
 			"peerDependencies": {
 				"postcss-less": "^6.0.0"
 			}
 		},
+		"node_modules/stylelint-config-wikimedia/node_modules/ansi-regex": {
+			"version": "6.0.1",
+			"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
+			"integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
+			"dev": true,
+			"engines": {
+				"node": ">=12"
+			},
+			"funding": {
+				"url": "https://github.com/chalk/ansi-regex?sponsor=1"
+			}
+		},
 		"node_modules/stylelint-config-wikimedia/node_modules/balanced-match": {
 			"version": "2.0.0",
 			"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz",
 			"integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==",
 			"dev": true
 		},
-		"node_modules/stylelint-config-wikimedia/node_modules/browserslist-config-wikimedia": {
-			"version": "0.5.0",
-			"resolved": "https://registry.npmjs.org/browserslist-config-wikimedia/-/browserslist-config-wikimedia-0.5.0.tgz",
-			"integrity": "sha512-t+tvSnTeVhVF2lNRxoAlE51/ZCfUs5SNNZUnWu2N8xXOGMPTMyKk5l4mayvDdm+5L8oqmnALU+TjnN2Z+ZTCTw==",
-			"dev": true
+		"node_modules/stylelint-config-wikimedia/node_modules/file-entry-cache": {
+			"version": "8.0.0",
+			"resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz",
+			"integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==",
+			"dev": true,
+			"dependencies": {
+				"flat-cache": "^4.0.0"
+			},
+			"engines": {
+				"node": ">=16.0.0"
+			}
+		},
+		"node_modules/stylelint-config-wikimedia/node_modules/flat-cache": {
+			"version": "4.0.1",
+			"resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz",
+			"integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==",
+			"dev": true,
+			"dependencies": {
+				"flatted": "^3.2.9",
+				"keyv": "^4.5.4"
+			},
+			"engines": {
+				"node": ">=16"
+			}
 		},
 		"node_modules/stylelint-config-wikimedia/node_modules/global-modules": {
 			"version": "2.0.0",
@@ -4569,9 +4384,9 @@
 			}
 		},
 		"node_modules/stylelint-config-wikimedia/node_modules/known-css-properties": {
-			"version": "0.27.0",
-			"resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.27.0.tgz",
-			"integrity": "sha512-uMCj6+hZYDoffuvAJjFAPz56E9uoowFHmTkqRtRq5WyC5Q6Cu/fTZKNQpX/RbzChBYLLl3lo8CjFZBAZXq9qFg==",
+			"version": "0.29.0",
+			"resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.29.0.tgz",
+			"integrity": "sha512-Ne7wqW7/9Cz54PDt4I3tcV+hAyat8ypyOGzYRJQfdxnnjeWsTxt1cy8pjvvKeI5kfXuyvULyeeAvwvvtAX3ayQ==",
 			"dev": true
 		},
 		"node_modules/stylelint-config-wikimedia/node_modules/resolve-from": {
@@ -4583,48 +4398,61 @@
 				"node": ">=8"
 			}
 		},
+		"node_modules/stylelint-config-wikimedia/node_modules/strip-ansi": {
+			"version": "7.1.0",
+			"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+			"integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+			"dev": true,
+			"dependencies": {
+				"ansi-regex": "^6.0.1"
+			},
+			"engines": {
+				"node": ">=12"
+			},
+			"funding": {
+				"url": "https://github.com/chalk/strip-ansi?sponsor=1"
+			}
+		},
 		"node_modules/stylelint-config-wikimedia/node_modules/stylelint": {
-			"version": "15.10.1",
-			"resolved": "https://registry.npmjs.org/stylelint/-/stylelint-15.10.1.tgz",
-			"integrity": "sha512-CYkzYrCFfA/gnOR+u9kJ1PpzwG10WLVnoxHDuBA/JiwGqdM9+yx9+ou6SE/y9YHtfv1mcLo06fdadHTOx4gBZQ==",
+			"version": "16.2.0",
+			"resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.2.0.tgz",
+			"integrity": "sha512-gwqU5AkIb52wrAzzn+359S3NIJDMl02TXLUaV2tzA/L6jUdpTwNt+MCxHlc8+Hb2bUHlYVo92YeSIryF2gJthA==",
 			"dev": true,
 			"dependencies": {
-				"@csstools/css-parser-algorithms": "^2.3.0",
-				"@csstools/css-tokenizer": "^2.1.1",
-				"@csstools/media-query-list-parser": "^2.1.2",
-				"@csstools/selector-specificity": "^3.0.0",
+				"@csstools/css-parser-algorithms": "^2.5.0",
+				"@csstools/css-tokenizer": "^2.2.3",
+				"@csstools/media-query-list-parser": "^2.1.7",
+				"@csstools/selector-specificity": "^3.0.1",
 				"balanced-match": "^2.0.0",
 				"colord": "^2.9.3",
-				"cosmiconfig": "^8.2.0",
-				"css-functions-list": "^3.1.0",
+				"cosmiconfig": "^9.0.0",
+				"css-functions-list": "^3.2.1",
 				"css-tree": "^2.3.1",
 				"debug": "^4.3.4",
-				"fast-glob": "^3.3.0",
+				"fast-glob": "^3.3.2",
 				"fastest-levenshtein": "^1.0.16",
-				"file-entry-cache": "^6.0.1",
+				"file-entry-cache": "^8.0.0",
 				"global-modules": "^2.0.0",
 				"globby": "^11.1.0",
 				"globjoin": "^0.1.4",
 				"html-tags": "^3.3.1",
-				"ignore": "^5.2.4",
-				"import-lazy": "^4.0.0",
+				"ignore": "^5.3.0",
 				"imurmurhash": "^0.1.4",
 				"is-plain-object": "^5.0.0",
-				"known-css-properties": "^0.27.0",
+				"known-css-properties": "^0.29.0",
 				"mathml-tag-names": "^2.1.3",
-				"meow": "^10.1.5",
+				"meow": "^13.1.0",
 				"micromatch": "^4.0.5",
 				"normalize-path": "^3.0.0",
 				"picocolors": "^1.0.0",
-				"postcss": "^8.4.24",
+				"postcss": "^8.4.33",
 				"postcss-resolve-nested-selector": "^0.1.1",
-				"postcss-safe-parser": "^6.0.0",
-				"postcss-selector-parser": "^6.0.13",
+				"postcss-safe-parser": "^7.0.0",
+				"postcss-selector-parser": "^6.0.15",
 				"postcss-value-parser": "^4.2.0",
 				"resolve-from": "^5.0.0",
 				"string-width": "^4.2.3",
-				"strip-ansi": "^6.0.1",
-				"style-search": "^0.1.0",
+				"strip-ansi": "^7.1.0",
 				"supports-hyperlinks": "^3.0.0",
 				"svg-tags": "^1.0.0",
 				"table": "^6.8.1",
@@ -4634,7 +4462,7 @@
 				"stylelint": "bin/stylelint.mjs"
 			},
 			"engines": {
-				"node": "^14.13.1 || >=16.0.0"
+				"node": ">=18.12.0"
 			},
 			"funding": {
 				"type": "opencollective",
@@ -4654,66 +4482,62 @@
 			}
 		},
 		"node_modules/stylelint-no-unsupported-browser-features": {
-			"version": "6.1.0",
-			"resolved": "https://registry.npmjs.org/stylelint-no-unsupported-browser-features/-/stylelint-no-unsupported-browser-features-6.1.0.tgz",
-			"integrity": "sha512-3Taj+z9PjIiY6cz4hg3eN8Khue3kMm9lPXYuEvdjAFXDK20uQo2NocJaWN6anIKclYlwrpkBAS9W/KV3qPTWsw==",
+			"version": "8.0.1",
+			"resolved": "https://registry.npmjs.org/stylelint-no-unsupported-browser-features/-/stylelint-no-unsupported-browser-features-8.0.1.tgz",
+			"integrity": "sha512-tc8Xn5DaqJhxTmbA4H8gZbYdAz027NfuSZv5+cVieQb7BtBrF/1/iKYdpcGwXPl3GtqkQrisiXuGqKkKnzWcLw==",
 			"dev": true,
 			"dependencies": {
-				"doiuse": "^4.4.1",
-				"lodash": "^4.17.15",
-				"postcss": "^8.4.16"
+				"doiuse": "^6.0.2",
+				"postcss": "^8.4.32"
 			},
 			"engines": {
-				"node": ">=14"
+				"node": ">=18.12.0"
 			},
 			"peerDependencies": {
-				"stylelint": "^14.0.0||^15.0.0"
+				"stylelint": "^16.0.2"
 			}
 		},
-		"node_modules/stylelint-stylistic": {
-			"version": "0.4.3",
-			"resolved": "https://registry.npmjs.org/stylelint-stylistic/-/stylelint-stylistic-0.4.3.tgz",
-			"integrity": "sha512-WphmneK3MRrm5ixvRPWy7+c9+EQUh0FPvNMXW/N9VD85vyqtpxUejpD+mxubVVht0fRgidcqBxtW3s3tU2Ujhw==",
-			"deprecated": "This package has been deprecated in favor of @stylistic/stylelint-plugin",
-			"dev": true,
-			"dependencies": {
-				"is-plain-object": "^5.0.0",
-				"postcss": "^8.4.21",
-				"postcss-media-query-parser": "^0.2.3",
-				"postcss-value-parser": "^4.2.0",
-				"style-search": "^0.1.0"
-			},
-			"peerDependencies": {
-				"stylelint": "^15.0.0"
-			}
-		},
-		"node_modules/stylelint-stylistic/node_modules/is-plain-object": {
-			"version": "5.0.0",
-			"resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
-			"integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==",
+		"node_modules/stylelint/node_modules/ansi-regex": {
+			"version": "6.0.1",
+			"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
+			"integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
 			"dev": true,
 			"engines": {
-				"node": ">=0.10.0"
+				"node": ">=12"
+			},
+			"funding": {
+				"url": "https://github.com/chalk/ansi-regex?sponsor=1"
 			}
 		},
 		"node_modules/stylelint/node_modules/balanced-match": {
 			"version": "2.0.0",
 			"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz",
 			"integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==",
-			"dev": true,
-			"peer": true
+			"dev": true
 		},
 		"node_modules/stylelint/node_modules/file-entry-cache": {
-			"version": "7.0.2",
-			"resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-7.0.2.tgz",
-			"integrity": "sha512-TfW7/1iI4Cy7Y8L6iqNdZQVvdXn0f8B4QcIXmkIbtTIe/Okm/nSlHb4IwGzRVOd3WfSieCgvf5cMzEfySAIl0g==",
+			"version": "9.0.0",
+			"resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-9.0.0.tgz",
+			"integrity": "sha512-6MgEugi8p2tiUhqO7GnPsmbCCzj0YRCwwaTbpGRyKZesjRSzkqkAE9fPp7V2yMs5hwfgbQLgdvSSkGNg1s5Uvw==",
 			"dev": true,
-			"peer": true,
 			"dependencies": {
-				"flat-cache": "^3.2.0"
+				"flat-cache": "^5.0.0"
 			},
 			"engines": {
-				"node": ">=12.0.0"
+				"node": ">=18"
+			}
+		},
+		"node_modules/stylelint/node_modules/flat-cache": {
+			"version": "5.0.0",
+			"resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-5.0.0.tgz",
+			"integrity": "sha512-JrqFmyUl2PnPi1OvLyTVHnQvwQ0S+e6lGSwu8OkAZlSaNIZciTY2H/cOOROxsBA1m/LZNHDsqAgDZt6akWcjsQ==",
+			"dev": true,
+			"dependencies": {
+				"flatted": "^3.3.1",
+				"keyv": "^4.5.4"
+			},
+			"engines": {
+				"node": ">=18"
 			}
 		},
 		"node_modules/stylelint/node_modules/global-modules": {
@@ -4721,7 +4545,6 @@
 			"resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz",
 			"integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==",
 			"dev": true,
-			"peer": true,
 			"dependencies": {
 				"global-prefix": "^3.0.0"
 			},
@@ -4734,7 +4557,6 @@
 			"resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz",
 			"integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==",
 			"dev": true,
-			"peer": true,
 			"dependencies": {
 				"ini": "^1.3.5",
 				"kind-of": "^6.0.2",
@@ -4749,7 +4571,6 @@
 			"resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
 			"integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==",
 			"dev": true,
-			"peer": true,
 			"engines": {
 				"node": ">=0.10.0"
 			}
@@ -4759,17 +4580,30 @@
 			"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
 			"integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
 			"dev": true,
-			"peer": true,
 			"engines": {
 				"node": ">=8"
 			}
 		},
+		"node_modules/stylelint/node_modules/strip-ansi": {
+			"version": "7.1.0",
+			"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+			"integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+			"dev": true,
+			"dependencies": {
+				"ansi-regex": "^6.0.1"
+			},
+			"engines": {
+				"node": ">=12"
+			},
+			"funding": {
+				"url": "https://github.com/chalk/strip-ansi?sponsor=1"
+			}
+		},
 		"node_modules/stylelint/node_modules/which": {
 			"version": "1.3.1",
 			"resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
 			"integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
 			"dev": true,
-			"peer": true,
 			"dependencies": {
 				"isexe": "^2.0.0"
 			},
@@ -4821,9 +4655,9 @@
 			"dev": true
 		},
 		"node_modules/table": {
-			"version": "6.8.1",
-			"resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz",
-			"integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==",
+			"version": "6.8.2",
+			"resolved": "https://registry.npmjs.org/table/-/table-6.8.2.tgz",
+			"integrity": "sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==",
 			"dev": true,
 			"dependencies": {
 				"ajv": "^8.0.1",
@@ -4837,15 +4671,15 @@
 			}
 		},
 		"node_modules/table/node_modules/ajv": {
-			"version": "8.12.0",
-			"resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz",
-			"integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==",
+			"version": "8.17.1",
+			"resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
+			"integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
 			"dev": true,
 			"dependencies": {
-				"fast-deep-equal": "^3.1.1",
+				"fast-deep-equal": "^3.1.3",
+				"fast-uri": "^3.0.1",
 				"json-schema-traverse": "^1.0.0",
-				"require-from-string": "^2.0.2",
-				"uri-js": "^4.2.2"
+				"require-from-string": "^2.0.2"
 			},
 			"funding": {
 				"type": "github",
@@ -4858,6 +4692,15 @@
 			"integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
 			"dev": true
 		},
+		"node_modules/tapable": {
+			"version": "2.2.1",
+			"resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
+			"integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==",
+			"dev": true,
+			"engines": {
+				"node": ">=6"
+			}
+		},
 		"node_modules/text-table": {
 			"version": "0.2.0",
 			"resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
@@ -4865,35 +4708,25 @@
 			"dev": true
 		},
 		"node_modules/through2": {
-			"version": "4.0.2",
-			"resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz",
-			"integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==",
+			"version": "0.6.5",
+			"resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz",
+			"integrity": "sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg==",
 			"dev": true,
 			"dependencies": {
-				"readable-stream": "3"
+				"readable-stream": ">=1.0.33-1 <1.1.0-0",
+				"xtend": ">=4.0.0 <4.1.0-0"
 			}
 		},
 		"node_modules/through2/node_modules/readable-stream": {
-			"version": "3.6.2",
-			"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
-			"integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
-			"dev": true,
-			"dependencies": {
-				"inherits": "^2.0.3",
-				"string_decoder": "^1.1.1",
-				"util-deprecate": "^1.0.1"
-			},
-			"engines": {
-				"node": ">= 6"
-			}
-		},
-		"node_modules/through2/node_modules/string_decoder": {
-			"version": "1.3.0",
-			"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
-			"integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+			"version": "1.0.34",
+			"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
+			"integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==",
 			"dev": true,
 			"dependencies": {
-				"safe-buffer": "~5.2.0"
+				"core-util-is": "~1.0.0",
+				"inherits": "~2.0.1",
+				"isarray": "0.0.1",
+				"string_decoder": "~0.10.x"
 			}
 		},
 		"node_modules/to-regex-range": {
@@ -4908,37 +4741,16 @@
 				"node": ">=8.0"
 			}
 		},
-		"node_modules/trim-newlines": {
-			"version": "4.1.1",
-			"resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-4.1.1.tgz",
-			"integrity": "sha512-jRKj0n0jXWo6kh62nA5TEh3+4igKDXLvzBJcPpiizP7oOolUrYIxmVBG9TOtHYFHoddUk6YvAkGeGoSVTXfQXQ==",
-			"dev": true,
-			"engines": {
-				"node": ">=12"
-			},
-			"funding": {
-				"url": "https://github.com/sponsors/sindresorhus"
-			}
-		},
-		"node_modules/tslib": {
-			"version": "1.14.1",
-			"resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
-			"integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
-			"dev": true
-		},
-		"node_modules/tsutils": {
-			"version": "3.21.0",
-			"resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz",
-			"integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==",
+		"node_modules/ts-api-utils": {
+			"version": "1.3.0",
+			"resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz",
+			"integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==",
 			"dev": true,
-			"dependencies": {
-				"tslib": "^1.8.1"
-			},
 			"engines": {
-				"node": ">= 6"
+				"node": ">=16"
 			},
 			"peerDependencies": {
-				"typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta"
+				"typescript": ">=4.2.0"
 			}
 		},
 		"node_modules/type-check": {
@@ -4966,9 +4778,9 @@
 			}
 		},
 		"node_modules/typescript": {
-			"version": "5.3.3",
-			"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz",
-			"integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==",
+			"version": "5.5.4",
+			"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz",
+			"integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==",
 			"dev": true,
 			"peer": true,
 			"bin": {
@@ -5012,9 +4824,9 @@
 			}
 		},
 		"node_modules/update-browserslist-db": {
-			"version": "1.0.13",
-			"resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz",
-			"integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==",
+			"version": "1.1.0",
+			"resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz",
+			"integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==",
 			"dev": true,
 			"funding": [
 				{
@@ -5031,8 +4843,8 @@
 				}
 			],
 			"dependencies": {
-				"escalade": "^3.1.1",
-				"picocolors": "^1.0.0"
+				"escalade": "^3.1.2",
+				"picocolors": "^1.0.1"
 			},
 			"bin": {
 				"update-browserslist-db": "cli.js"
@@ -5078,10 +4890,20 @@
 				"spdx-expression-parse": "^3.0.0"
 			}
 		},
+		"node_modules/validate-npm-package-license/node_modules/spdx-expression-parse": {
+			"version": "3.0.1",
+			"resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
+			"integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
+			"dev": true,
+			"dependencies": {
+				"spdx-exceptions": "^2.1.0",
+				"spdx-license-ids": "^3.0.0"
+			}
+		},
 		"node_modules/vue-eslint-parser": {
-			"version": "9.3.2",
-			"resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.3.2.tgz",
-			"integrity": "sha512-q7tWyCVaV9f8iQyIA5Mkj/S6AoJ9KBN8IeUSf3XEmBrOtxOZnfTg5s4KClbZBCK3GtnT/+RyCLZyDHuZwTuBjg==",
+			"version": "9.4.3",
+			"resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.4.3.tgz",
+			"integrity": "sha512-2rYRLWlIpaiN8xbPiDyXZXRgLGOtWxERV7ND5fFAv5qo1D2N9Fu9MNajBNc6o13lZ+24DAWCkQCvj4klgmcITg==",
 			"dev": true,
 			"dependencies": {
 				"debug": "^4.3.4",
@@ -5180,25 +5002,22 @@
 				"node": ">=10"
 			}
 		},
-		"node_modules/yallist": {
-			"version": "4.0.0",
-			"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
-			"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
-			"dev": true
-		},
 		"node_modules/yaml": {
-			"version": "2.3.4",
-			"resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz",
-			"integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==",
+			"version": "2.4.5",
+			"resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.5.tgz",
+			"integrity": "sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg==",
 			"dev": true,
+			"bin": {
+				"yaml": "bin.mjs"
+			},
 			"engines": {
 				"node": ">= 14"
 			}
 		},
 		"node_modules/yaml-eslint-parser": {
-			"version": "1.2.2",
-			"resolved": "https://registry.npmjs.org/yaml-eslint-parser/-/yaml-eslint-parser-1.2.2.tgz",
-			"integrity": "sha512-pEwzfsKbTrB8G3xc/sN7aw1v6A6c/pKxLAkjclnAyo5g5qOh6eL9WGu0o3cSDQZKrTNk4KL4lQSwZW+nBkANEg==",
+			"version": "1.2.3",
+			"resolved": "https://registry.npmjs.org/yaml-eslint-parser/-/yaml-eslint-parser-1.2.3.tgz",
+			"integrity": "sha512-4wZWvE398hCP7O8n3nXKu/vdq1HcH01ixYlCREaJL5NUMwQ0g3MaGFUBNSlmBtKmhbtVG/Cm6lyYmSVTEVil8A==",
 			"dev": true,
 			"dependencies": {
 				"eslint-visitor-keys": "^3.0.0",
@@ -5213,30 +5032,30 @@
 			}
 		},
 		"node_modules/yargs": {
-			"version": "16.2.0",
-			"resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
-			"integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
+			"version": "17.7.2",
+			"resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
+			"integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
 			"dev": true,
 			"dependencies": {
-				"cliui": "^7.0.2",
+				"cliui": "^8.0.1",
 				"escalade": "^3.1.1",
 				"get-caller-file": "^2.0.5",
 				"require-directory": "^2.1.1",
-				"string-width": "^4.2.0",
+				"string-width": "^4.2.3",
 				"y18n": "^5.0.5",
-				"yargs-parser": "^20.2.2"
+				"yargs-parser": "^21.1.1"
 			},
 			"engines": {
-				"node": ">=10"
+				"node": ">=12"
 			}
 		},
 		"node_modules/yargs-parser": {
-			"version": "20.2.9",
-			"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
-			"integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
+			"version": "21.1.1",
+			"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
+			"integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
 			"dev": true,
 			"engines": {
-				"node": ">=10"
+				"node": ">=12"
 			}
 		},
 		"node_modules/yocto-queue": {
@@ -5253,95 +5072,38 @@
 		}
 	},
 	"dependencies": {
-		"@aashutoshrathi/word-wrap": {
-			"version": "1.2.6",
-			"resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz",
-			"integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==",
-			"dev": true
-		},
-		"@babel/code-frame": {
-			"version": "7.23.5",
-			"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz",
-			"integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==",
-			"dev": true,
-			"requires": {
-				"@babel/highlight": "^7.23.4",
-				"chalk": "^2.4.2"
-			},
-			"dependencies": {
-				"ansi-styles": {
-					"version": "3.2.1",
-					"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
-					"integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
-					"dev": true,
-					"requires": {
-						"color-convert": "^1.9.0"
-					}
-				},
-				"chalk": {
-					"version": "2.4.2",
-					"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
-					"integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
-					"dev": true,
-					"requires": {
-						"ansi-styles": "^3.2.1",
-						"escape-string-regexp": "^1.0.5",
-						"supports-color": "^5.3.0"
-					}
-				},
-				"color-convert": {
-					"version": "1.9.3",
-					"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
-					"integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
-					"dev": true,
-					"requires": {
-						"color-name": "1.1.3"
-					}
-				},
-				"color-name": {
-					"version": "1.1.3",
-					"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
-					"integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
-					"dev": true
-				},
-				"escape-string-regexp": {
-					"version": "1.0.5",
-					"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
-					"integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
-					"dev": true
-				},
-				"has-flag": {
-					"version": "3.0.0",
-					"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-					"integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
-					"dev": true
-				},
-				"supports-color": {
-					"version": "5.5.0",
-					"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
-					"integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
-					"dev": true,
-					"requires": {
-						"has-flag": "^3.0.0"
-					}
-				}
+		"@aashutoshrathi/word-wrap": {
+			"version": "1.2.6",
+			"resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz",
+			"integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==",
+			"dev": true
+		},
+		"@babel/code-frame": {
+			"version": "7.24.7",
+			"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz",
+			"integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==",
+			"dev": true,
+			"requires": {
+				"@babel/highlight": "^7.24.7",
+				"picocolors": "^1.0.0"
 			}
 		},
 		"@babel/helper-validator-identifier": {
-			"version": "7.22.20",
-			"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz",
-			"integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==",
+			"version": "7.24.7",
+			"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz",
+			"integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==",
 			"dev": true
 		},
 		"@babel/highlight": {
-			"version": "7.23.4",
-			"resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz",
-			"integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==",
+			"version": "7.24.7",
+			"resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz",
+			"integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==",
 			"dev": true,
 			"requires": {
-				"@babel/helper-validator-identifier": "^7.22.20",
+				"@babel/helper-validator-identifier": "^7.24.7",
 				"chalk": "^2.4.2",
-				"js-tokens": "^4.0.0"
+				"js-tokens": "^4.0.0",
+				"picocolors": "^1.0.0"
 			},
 			"dependencies": {
 				"ansi-styles": {
@@ -5403,39 +5165,48 @@
 			}
 		},
 		"@csstools/css-parser-algorithms": {
-			"version": "2.4.0",
-			"resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.4.0.tgz",
-			"integrity": "sha512-/PPLr2g5PAUCKAPEbfyk6/baZA+WJHQtUhPkoCQMpyRE8I0lXrG1QFRN8e5s3ZYxM8d/g5BZc6lH3s8Op7/VEg==",
+			"version": "2.7.1",
+			"resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.7.1.tgz",
+			"integrity": "sha512-2SJS42gxmACHgikc1WGesXLIT8d/q2l0UFM7TaEeIzdFCE/FPMtTiizcPGGJtlPo2xuQzY09OhrLTzRxqJqwGw==",
 			"dev": true,
 			"requires": {}
 		},
 		"@csstools/css-tokenizer": {
-			"version": "2.2.2",
-			"resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-2.2.2.tgz",
-			"integrity": "sha512-wCDUe/MAw7npAHFLyW3QjSyLA66S5QFaV1jIXlNQvdJ8RzXDSgALa49eWcUO6P55ARQaz0TsDdAgdRgkXFYY8g==",
+			"version": "2.4.1",
+			"resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-2.4.1.tgz",
+			"integrity": "sha512-eQ9DIktFJBhGjioABJRtUucoWR2mwllurfnM8LuNGAqX3ViZXaUchqk+1s7jjtkFiT9ySdACsFEA3etErkALUg==",
 			"dev": true
 		},
 		"@csstools/media-query-list-parser": {
-			"version": "2.1.6",
-			"resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.6.tgz",
-			"integrity": "sha512-R6AKl9vaU0It7D7TR2lQn0pre5aQfdeqHRePlaRCY8rHL3l9eVlNRpsEVDKFi/zAjzv68CxH2M5kqbhPFPKjvw==",
+			"version": "2.1.13",
+			"resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.13.tgz",
+			"integrity": "sha512-XaHr+16KRU9Gf8XLi3q8kDlI18d5vzKSKCY510Vrtc9iNR0NJzbY9hhTmwhzYZj/ZwGL4VmB3TA9hJW0Um2qFA==",
 			"dev": true,
 			"requires": {}
 		},
 		"@csstools/selector-specificity": {
-			"version": "3.0.1",
-			"resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-3.0.1.tgz",
-			"integrity": "sha512-NPljRHkq4a14YzZ3YD406uaxh7s0g6eAq3L9aLOWywoqe8PkYamAvtsh7KNX6c++ihDrJ0RiU+/z7rGnhlZ5ww==",
+			"version": "3.1.1",
+			"resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-3.1.1.tgz",
+			"integrity": "sha512-a7cxGcJ2wIlMFLlh8z2ONm+715QkPHiyJcxwQlKOz/03GPw1COpfhcmC9wm4xlZfp//jWHNNMwzjtqHXVWU9KA==",
 			"dev": true,
 			"requires": {}
 		},
+		"@dual-bundle/import-meta-resolve": {
+			"version": "4.1.0",
+			"resolved": "https://registry.npmjs.org/@dual-bundle/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz",
+			"integrity": "sha512-+nxncfwHM5SgAtrVzgpzJOI1ol0PkumhVo469KCf9lUi21IGcY90G98VuHm9VRrUypmAzawAHO9bs6hqeADaVg==",
+			"dev": true
+		},
 		"@es-joy/jsdoccomment": {
-			"version": "0.37.1",
-			"resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.37.1.tgz",
-			"integrity": "sha512-5vxWJ1gEkEF0yRd0O+uK6dHJf7adrxwQSX8PuRiPfFSAbNLnY0ZJfXaZucoz14Jj2N11xn2DnlEPwWRpYpvRjg==",
+			"version": "0.43.1",
+			"resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.43.1.tgz",
+			"integrity": "sha512-I238eDtOolvCuvtxrnqtlBaw0BwdQuYqK7eA6XIonicMdOOOb75mqdIzkGDUbS04+1Di007rgm9snFRNeVrOog==",
 			"dev": true,
 			"requires": {
-				"comment-parser": "1.3.1",
+				"@types/eslint": "^8.56.5",
+				"@types/estree": "^1.0.5",
+				"@typescript-eslint/types": "^7.2.0",
+				"comment-parser": "1.4.1",
 				"esquery": "^1.5.0",
 				"jsdoc-type-pratt-parser": "~4.0.0"
 			}
@@ -5450,9 +5221,9 @@
 			}
 		},
 		"@eslint-community/regexpp": {
-			"version": "4.10.0",
-			"resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz",
-			"integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==",
+			"version": "4.11.0",
+			"resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz",
+			"integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==",
 			"dev": true
 		},
 		"@eslint/eslintrc": {
@@ -5473,19 +5244,19 @@
 			}
 		},
 		"@eslint/js": {
-			"version": "8.56.0",
-			"resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz",
-			"integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==",
+			"version": "8.57.0",
+			"resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz",
+			"integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==",
 			"dev": true
 		},
 		"@humanwhocodes/config-array": {
-			"version": "0.11.13",
-			"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz",
-			"integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==",
+			"version": "0.11.14",
+			"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz",
+			"integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==",
 			"dev": true,
 			"requires": {
-				"@humanwhocodes/object-schema": "^2.0.1",
-				"debug": "^4.1.1",
+				"@humanwhocodes/object-schema": "^2.0.2",
+				"debug": "^4.3.1",
 				"minimatch": "^3.0.5"
 			}
 		},
@@ -5496,9 +5267,9 @@
 			"dev": true
 		},
 		"@humanwhocodes/object-schema": {
-			"version": "2.0.1",
-			"resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz",
-			"integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==",
+			"version": "2.0.3",
+			"resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz",
+			"integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==",
 			"dev": true
 		},
 		"@mdn/browser-compat-data": {
@@ -5533,6 +5304,55 @@
 				"fastq": "^1.6.0"
 			}
 		},
+		"@stylistic/stylelint-config": {
+			"version": "1.0.1",
+			"resolved": "https://registry.npmjs.org/@stylistic/stylelint-config/-/stylelint-config-1.0.1.tgz",
+			"integrity": "sha512-JgFP88HZEyo34k9RpWVdcQJtLPrMxYE58IO3qypXhmvE/NmZohj+xjDtQ8UfaarnYsLecnldw57/GHum07Ctdw==",
+			"dev": true,
+			"requires": {
+				"@stylistic/stylelint-plugin": "^2.0.0"
+			}
+		},
+		"@stylistic/stylelint-plugin": {
+			"version": "2.0.0",
+			"resolved": "https://registry.npmjs.org/@stylistic/stylelint-plugin/-/stylelint-plugin-2.0.0.tgz",
+			"integrity": "sha512-dHKuT6PGd1WGZLOTuozAM7GdQzdmlmnFXYzvV1jYJXXpcCpV/OJ3+n8TXpMkoOeKHpJydY43EOoZTO1W/FOA4Q==",
+			"dev": true,
+			"requires": {
+				"@csstools/css-parser-algorithms": "^2.3.2",
+				"@csstools/css-tokenizer": "^2.2.1",
+				"@csstools/media-query-list-parser": "^2.1.5",
+				"is-plain-object": "^5.0.0",
+				"postcss-selector-parser": "^6.0.13",
+				"postcss-value-parser": "^4.2.0",
+				"style-search": "^0.1.0",
+				"stylelint": "^16.0.2"
+			},
+			"dependencies": {
+				"is-plain-object": {
+					"version": "5.0.0",
+					"resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
+					"integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==",
+					"dev": true
+				}
+			}
+		},
+		"@types/eslint": {
+			"version": "8.56.11",
+			"resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.11.tgz",
+			"integrity": "sha512-sVBpJMf7UPo/wGecYOpk2aQya2VUGeHhe38WG7/mN5FufNSubf5VT9Uh9Uyp8/eLJpu1/tuhJ/qTo4mhSB4V4Q==",
+			"dev": true,
+			"requires": {
+				"@types/estree": "*",
+				"@types/json-schema": "*"
+			}
+		},
+		"@types/estree": {
+			"version": "1.0.5",
+			"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz",
+			"integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==",
+			"dev": true
+		},
 		"@types/json-schema": {
 			"version": "7.0.15",
 			"resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
@@ -5545,97 +5365,84 @@
 			"integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==",
 			"dev": true
 		},
-		"@types/minimist": {
-			"version": "1.2.5",
-			"resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz",
-			"integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==",
-			"dev": true
-		},
 		"@types/normalize-package-data": {
 			"version": "2.4.4",
 			"resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz",
 			"integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==",
 			"dev": true
 		},
-		"@types/semver": {
-			"version": "7.5.6",
-			"resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz",
-			"integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==",
-			"dev": true
-		},
 		"@typescript-eslint/scope-manager": {
-			"version": "5.62.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz",
-			"integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==",
+			"version": "7.17.0",
+			"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.17.0.tgz",
+			"integrity": "sha512-0P2jTTqyxWp9HiKLu/Vemr2Rg1Xb5B7uHItdVZ6iAenXmPo4SZ86yOPCJwMqpCyaMiEHTNqizHfsbmCFT1x9SA==",
 			"dev": true,
 			"requires": {
-				"@typescript-eslint/types": "5.62.0",
-				"@typescript-eslint/visitor-keys": "5.62.0"
+				"@typescript-eslint/types": "7.17.0",
+				"@typescript-eslint/visitor-keys": "7.17.0"
 			}
 		},
 		"@typescript-eslint/types": {
-			"version": "5.62.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz",
-			"integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==",
+			"version": "7.17.0",
+			"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.17.0.tgz",
+			"integrity": "sha512-a29Ir0EbyKTKHnZWbNsrc/gqfIBqYPwj3F2M+jWE/9bqfEHg0AMtXzkbUkOG6QgEScxh2+Pz9OXe11jHDnHR7A==",
 			"dev": true
 		},
 		"@typescript-eslint/typescript-estree": {
-			"version": "5.62.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz",
-			"integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==",
+			"version": "7.17.0",
+			"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.17.0.tgz",
+			"integrity": "sha512-72I3TGq93t2GoSBWI093wmKo0n6/b7O4j9o8U+f65TVD0FS6bI2180X5eGEr8MA8PhKMvYe9myZJquUT2JkCZw==",
 			"dev": true,
 			"requires": {
-				"@typescript-eslint/types": "5.62.0",
-				"@typescript-eslint/visitor-keys": "5.62.0",
+				"@typescript-eslint/types": "7.17.0",
+				"@typescript-eslint/visitor-keys": "7.17.0",
 				"debug": "^4.3.4",
 				"globby": "^11.1.0",
 				"is-glob": "^4.0.3",
-				"semver": "^7.3.7",
-				"tsutils": "^3.21.0"
-			}
-		},
-		"@typescript-eslint/utils": {
-			"version": "5.62.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz",
-			"integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==",
-			"dev": true,
-			"requires": {
-				"@eslint-community/eslint-utils": "^4.2.0",
-				"@types/json-schema": "^7.0.9",
-				"@types/semver": "^7.3.12",
-				"@typescript-eslint/scope-manager": "5.62.0",
-				"@typescript-eslint/types": "5.62.0",
-				"@typescript-eslint/typescript-estree": "5.62.0",
-				"eslint-scope": "^5.1.1",
-				"semver": "^7.3.7"
-			},
-			"dependencies": {
-				"eslint-scope": {
-					"version": "5.1.1",
-					"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
-					"integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
+				"minimatch": "^9.0.4",
+				"semver": "^7.6.0",
+				"ts-api-utils": "^1.3.0"
+			},
+			"dependencies": {
+				"brace-expansion": {
+					"version": "2.0.1",
+					"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+					"integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
 					"dev": true,
 					"requires": {
-						"esrecurse": "^4.3.0",
-						"estraverse": "^4.1.1"
+						"balanced-match": "^1.0.0"
 					}
 				},
-				"estraverse": {
-					"version": "4.3.0",
-					"resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
-					"integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
-					"dev": true
+				"minimatch": {
+					"version": "9.0.5",
+					"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
+					"integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
+					"dev": true,
+					"requires": {
+						"brace-expansion": "^2.0.1"
+					}
 				}
 			}
 		},
+		"@typescript-eslint/utils": {
+			"version": "7.17.0",
+			"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.17.0.tgz",
+			"integrity": "sha512-r+JFlm5NdB+JXc7aWWZ3fKSm1gn0pkswEwIYsrGPdsT2GjsRATAKXiNtp3vgAAO1xZhX8alIOEQnNMl3kbTgJw==",
+			"dev": true,
+			"requires": {
+				"@eslint-community/eslint-utils": "^4.4.0",
+				"@typescript-eslint/scope-manager": "7.17.0",
+				"@typescript-eslint/types": "7.17.0",
+				"@typescript-eslint/typescript-estree": "7.17.0"
+			}
+		},
 		"@typescript-eslint/visitor-keys": {
-			"version": "5.62.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz",
-			"integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==",
+			"version": "7.17.0",
+			"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.17.0.tgz",
+			"integrity": "sha512-RVGC9UhPOCsfCdI9pU++K4nD7to+jTcMIbXTSOcrLqUEW6gF2pU1UUbYJKc9cvcRSK1UDeMJ7pdMxf4bhMpV/A==",
 			"dev": true,
 			"requires": {
-				"@typescript-eslint/types": "5.62.0",
-				"eslint-visitor-keys": "^3.3.0"
+				"@typescript-eslint/types": "7.17.0",
+				"eslint-visitor-keys": "^3.4.3"
 			}
 		},
 		"@ungap/structured-clone": {
@@ -5651,9 +5458,9 @@
 			"dev": true
 		},
 		"acorn": {
-			"version": "8.11.2",
-			"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz",
-			"integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==",
+			"version": "8.12.1",
+			"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz",
+			"integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==",
 			"dev": true
 		},
 		"acorn-jsx": {
@@ -5727,9 +5534,9 @@
 			"dev": true
 		},
 		"arrify": {
-			"version": "1.0.1",
-			"resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
-			"integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==",
+			"version": "2.0.1",
+			"resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz",
+			"integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==",
 			"dev": true
 		},
 		"ast-metadata-inferer": {
@@ -5776,30 +5583,30 @@
 			}
 		},
 		"braces": {
-			"version": "3.0.2",
-			"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
-			"integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+			"version": "3.0.3",
+			"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
+			"integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
 			"dev": true,
 			"requires": {
-				"fill-range": "^7.0.1"
+				"fill-range": "^7.1.1"
 			}
 		},
 		"browserslist": {
-			"version": "4.22.2",
-			"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz",
-			"integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==",
+			"version": "4.23.2",
+			"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.2.tgz",
+			"integrity": "sha512-qkqSyistMYdxAcw+CzbZwlBy8AGmS/eEWs+sEV5TnLRGDOL+C5M2EnH6tlZyg0YoAxGJAFKh61En9BR941GnHA==",
 			"dev": true,
 			"requires": {
-				"caniuse-lite": "^1.0.30001565",
-				"electron-to-chromium": "^1.4.601",
+				"caniuse-lite": "^1.0.30001640",
+				"electron-to-chromium": "^1.4.820",
 				"node-releases": "^2.0.14",
-				"update-browserslist-db": "^1.0.13"
+				"update-browserslist-db": "^1.1.0"
 			}
 		},
 		"browserslist-config-wikimedia": {
-			"version": "0.5.1",
-			"resolved": "https://registry.npmjs.org/browserslist-config-wikimedia/-/browserslist-config-wikimedia-0.5.1.tgz",
-			"integrity": "sha512-jf532fUf/gaxiKdHgGCQUT552P5up3RpG+CzLixOQBJ5FwDmYQSRLYHCFUA9s3KMOHh4P3xVp+NUaGNxvtoT9g==",
+			"version": "0.7.0",
+			"resolved": "https://registry.npmjs.org/browserslist-config-wikimedia/-/browserslist-config-wikimedia-0.7.0.tgz",
+			"integrity": "sha512-CTa0lv78dXKEgrYsOLCkqO+9UUS3CV9MWEOYHcymgEvx4mYxB80sCoKRCR7wW2SOMNxjaP9hohrZripjnKuRTA==",
 			"dev": true
 		},
 		"builtin-modules": {
@@ -5808,51 +5615,16 @@
 			"integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==",
 			"dev": true
 		},
-		"builtins": {
-			"version": "5.0.1",
-			"resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz",
-			"integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==",
-			"dev": true,
-			"requires": {
-				"semver": "^7.0.0"
-			}
-		},
 		"callsites": {
 			"version": "3.1.0",
 			"resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
 			"integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
 			"dev": true
 		},
-		"camelcase": {
-			"version": "6.3.0",
-			"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
-			"integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
-			"dev": true
-		},
-		"camelcase-keys": {
-			"version": "7.0.2",
-			"resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-7.0.2.tgz",
-			"integrity": "sha512-Rjs1H+A9R+Ig+4E/9oyB66UC5Mj9Xq3N//vcLf2WzgdTi/3gUu3Z9KoqmlrEG4VuuLK8wJHofxzdQXz/knhiYg==",
-			"dev": true,
-			"requires": {
-				"camelcase": "^6.3.0",
-				"map-obj": "^4.1.0",
-				"quick-lru": "^5.1.1",
-				"type-fest": "^1.2.1"
-			},
-			"dependencies": {
-				"type-fest": {
-					"version": "1.4.0",
-					"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz",
-					"integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==",
-					"dev": true
-				}
-			}
-		},
 		"caniuse-lite": {
-			"version": "1.0.30001570",
-			"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001570.tgz",
-			"integrity": "sha512-+3e0ASu4sw1SWaoCtvPeyXp+5PsjigkSt8OXZbF9StH5pQWbxEjLAZE3n8Aup5udop1uRiKA7a4utUk/uoSpUw==",
+			"version": "1.0.30001643",
+			"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001643.tgz",
+			"integrity": "sha512-ERgWGNleEilSrHM6iUz/zJNSQTP8Mr21wDWpdgvRwcTXGAq6jMtOUPP4dqFPTdKqZ2wKTdtB+uucZ3MRpAUSmg==",
 			"dev": true
 		},
 		"chalk": {
@@ -5866,9 +5638,9 @@
 			}
 		},
 		"ci-info": {
-			"version": "3.9.0",
-			"resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
-			"integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
+			"version": "4.0.0",
+			"resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.0.0.tgz",
+			"integrity": "sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==",
 			"dev": true
 		},
 		"clean-regexp": {
@@ -5889,13 +5661,13 @@
 			}
 		},
 		"cliui": {
-			"version": "7.0.4",
-			"resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
-			"integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
+			"version": "8.0.1",
+			"resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
+			"integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
 			"dev": true,
 			"requires": {
 				"string-width": "^4.2.0",
-				"strip-ansi": "^6.0.0",
+				"strip-ansi": "^6.0.1",
 				"wrap-ansi": "^7.0.0"
 			}
 		},
@@ -5927,9 +5699,9 @@
 			"dev": true
 		},
 		"comment-parser": {
-			"version": "1.3.1",
-			"resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.3.1.tgz",
-			"integrity": "sha512-B52sN2VNghyq5ofvUsqZjmk6YkihBX5vMSChmSK9v4ShjKf3Vk5Xcmgpw4o+iIgtrnM/u5FiMpz9VKb8lpBveA==",
+			"version": "1.4.1",
+			"resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.1.tgz",
+			"integrity": "sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==",
 			"dev": true
 		},
 		"concat-map": {
@@ -5938,6 +5710,15 @@
 			"integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
 			"dev": true
 		},
+		"core-js-compat": {
+			"version": "3.37.1",
+			"resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.37.1.tgz",
+			"integrity": "sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg==",
+			"dev": true,
+			"requires": {
+				"browserslist": "^4.23.0"
+			}
+		},
 		"core-util-is": {
 			"version": "1.0.3",
 			"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
@@ -5945,15 +5726,15 @@
 			"dev": true
 		},
 		"cosmiconfig": {
-			"version": "8.3.6",
-			"resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz",
-			"integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==",
+			"version": "9.0.0",
+			"resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz",
+			"integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==",
 			"dev": true,
 			"requires": {
+				"env-paths": "^2.2.1",
 				"import-fresh": "^3.3.0",
 				"js-yaml": "^4.1.0",
-				"parse-json": "^5.2.0",
-				"path-type": "^4.0.0"
+				"parse-json": "^5.2.0"
 			}
 		},
 		"cross-spawn": {
@@ -5968,47 +5749,11 @@
 			}
 		},
 		"css-functions-list": {
-			"version": "3.2.1",
-			"resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.1.tgz",
-			"integrity": "sha512-Nj5YcaGgBtuUmn1D7oHqPW0c9iui7xsTsj5lIX8ZgevdfhmjFfKB3r8moHJtNJnctnYXJyYX5I1pp90HM4TPgQ==",
+			"version": "3.2.2",
+			"resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.2.tgz",
+			"integrity": "sha512-c+N0v6wbKVxTu5gOBBFkr9BEdBWaqqjQeiJ8QvSRIJOf+UxlJh930m8e6/WNeODIK0mYLFkoONrnj16i2EcvfQ==",
 			"dev": true
 		},
-		"css-rule-stream": {
-			"version": "1.1.0",
-			"resolved": "https://registry.npmjs.org/css-rule-stream/-/css-rule-stream-1.1.0.tgz",
-			"integrity": "sha512-qiio/Zkr8I19jh/XuzEkK8OKDQRTrEYaRyIHy4Bwh/tPUe0w8GcQs7r6x24Yc9lT+FbnZFYULxEIXCmaymguUQ==",
-			"dev": true,
-			"requires": {
-				"css-tokenize": "^1.0.1",
-				"duplexer2": "0.0.2",
-				"ldjson-stream": "^1.2.1",
-				"through2": "^0.6.3"
-			},
-			"dependencies": {
-				"readable-stream": {
-					"version": "1.0.34",
-					"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
-					"integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==",
-					"dev": true,
-					"requires": {
-						"core-util-is": "~1.0.0",
-						"inherits": "~2.0.1",
-						"isarray": "0.0.1",
-						"string_decoder": "~0.10.x"
-					}
-				},
-				"through2": {
-					"version": "0.6.5",
-					"resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz",
-					"integrity": "sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg==",
-					"dev": true,
-					"requires": {
-						"readable-stream": ">=1.0.33-1 <1.1.0-0",
-						"xtend": ">=4.0.0 <4.1.0-0"
-					}
-				}
-			}
-		},
 		"css-tokenize": {
 			"version": "1.0.1",
 			"resolved": "https://registry.npmjs.org/css-tokenize/-/css-tokenize-1.0.1.tgz",
@@ -6042,44 +5787,14 @@
 			"dev": true
 		},
 		"debug": {
-			"version": "4.3.4",
-			"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
-			"integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+			"version": "4.3.5",
+			"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz",
+			"integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==",
 			"dev": true,
 			"requires": {
 				"ms": "2.1.2"
 			}
 		},
-		"decamelize": {
-			"version": "5.0.1",
-			"resolved": "https://registry.npmjs.org/decamelize/-/decamelize-5.0.1.tgz",
-			"integrity": "sha512-VfxadyCECXgQlkoEAjeghAr5gY3Hf+IKjKb+X8tGVDtveCjN+USwprd2q3QXBR9T1+x2DG0XZF5/w+7HAtSaXA==",
-			"dev": true
-		},
-		"decamelize-keys": {
-			"version": "1.1.1",
-			"resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz",
-			"integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==",
-			"dev": true,
-			"requires": {
-				"decamelize": "^1.1.0",
-				"map-obj": "^1.0.0"
-			},
-			"dependencies": {
-				"decamelize": {
-					"version": "1.2.0",
-					"resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
-					"integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==",
-					"dev": true
-				},
-				"map-obj": {
-					"version": "1.0.1",
-					"resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
-					"integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==",
-					"dev": true
-				}
-			}
-		},
 		"deep-is": {
 			"version": "0.1.4",
 			"resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
@@ -6111,21 +5826,20 @@
 			}
 		},
 		"doiuse": {
-			"version": "4.4.1",
-			"resolved": "https://registry.npmjs.org/doiuse/-/doiuse-4.4.1.tgz",
-			"integrity": "sha512-TUpr1/YNg20IB09tZmwGCTsTQoxj8jUld/hUZprZMj8vj0VpAJySXEWCr8WMvqvgzk0/kG/FxeSMGKode4UjPg==",
+			"version": "6.0.2",
+			"resolved": "https://registry.npmjs.org/doiuse/-/doiuse-6.0.2.tgz",
+			"integrity": "sha512-eBTs23NOX+EAYPr4RbCR6J4DRW/TML3uMo37y0X1whlkersDYFCk9HmCl09KX98cis22VKsV1QaxfVNauJ3NBw==",
 			"dev": true,
 			"requires": {
-				"browserslist": "^4.16.1",
-				"caniuse-lite": "^1.0.30001179",
-				"css-rule-stream": "^1.1.0",
-				"duplexer2": "0.0.2",
+				"browserslist": "^4.21.5",
+				"caniuse-lite": "^1.0.30001487",
+				"css-tokenize": "^1.0.1",
+				"duplexify": "^4.1.2",
 				"ldjson-stream": "^1.2.1",
 				"multimatch": "^5.0.0",
-				"postcss": "^8.2.4",
-				"source-map": "^0.7.3",
-				"through2": "^4.0.2",
-				"yargs": "^16.2.0"
+				"postcss": "^8.4.21",
+				"source-map": "^0.7.4",
+				"yargs": "^17.7.1"
 			}
 		},
 		"dom-serializer": {
@@ -6165,19 +5879,44 @@
 				"domhandler": "^5.0.3"
 			}
 		},
-		"duplexer2": {
-			"version": "0.0.2",
-			"resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz",
-			"integrity": "sha512-+AWBwjGadtksxjOQSFDhPNQbed7icNXApT4+2BNpsXzcCBiInq2H9XW0O8sfHFaPmnQRs7cg/P0fAr2IWQSW0g==",
+		"duplexify": {
+			"version": "4.1.3",
+			"resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.3.tgz",
+			"integrity": "sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==",
 			"dev": true,
 			"requires": {
-				"readable-stream": "~1.1.9"
+				"end-of-stream": "^1.4.1",
+				"inherits": "^2.0.3",
+				"readable-stream": "^3.1.1",
+				"stream-shift": "^1.0.2"
+			},
+			"dependencies": {
+				"readable-stream": {
+					"version": "3.6.2",
+					"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
+					"integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
+					"dev": true,
+					"requires": {
+						"inherits": "^2.0.3",
+						"string_decoder": "^1.1.1",
+						"util-deprecate": "^1.0.1"
+					}
+				},
+				"string_decoder": {
+					"version": "1.3.0",
+					"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+					"integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+					"dev": true,
+					"requires": {
+						"safe-buffer": "~5.2.0"
+					}
+				}
 			}
 		},
 		"electron-to-chromium": {
-			"version": "1.4.615",
-			"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.615.tgz",
-			"integrity": "sha512-/bKPPcgZVUziECqDc+0HkT87+0zhaWSZHNXqF8FLd2lQcptpmUFwoCSWjCdOng9Gdq+afKArPdEg/0ZW461Eng==",
+			"version": "1.5.0",
+			"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.0.tgz",
+			"integrity": "sha512-Vb3xHHYnLseK8vlMJQKJYXJ++t4u1/qJ3vykuVrVjvdiOEhYyT1AuP4x03G8EnPmYvYOhe9T+dADTmthjRQMkA==",
 			"dev": true
 		},
 		"emoji-regex": {
@@ -6186,12 +5925,37 @@
 			"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
 			"dev": true
 		},
+		"end-of-stream": {
+			"version": "1.4.4",
+			"resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
+			"integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
+			"dev": true,
+			"requires": {
+				"once": "^1.4.0"
+			}
+		},
+		"enhanced-resolve": {
+			"version": "5.17.1",
+			"resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz",
+			"integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==",
+			"dev": true,
+			"requires": {
+				"graceful-fs": "^4.2.4",
+				"tapable": "^2.2.0"
+			}
+		},
 		"entities": {
 			"version": "4.5.0",
 			"resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
 			"integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
 			"dev": true
 		},
+		"env-paths": {
+			"version": "2.2.1",
+			"resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz",
+			"integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==",
+			"dev": true
+		},
 		"error-ex": {
 			"version": "1.3.2",
 			"resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
@@ -6202,9 +5966,9 @@
 			}
 		},
 		"escalade": {
-			"version": "3.1.1",
-			"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
-			"integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+			"version": "3.1.2",
+			"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz",
+			"integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==",
 			"dev": true
 		},
 		"escape-string-regexp": {
@@ -6214,16 +5978,16 @@
 			"dev": true
 		},
 		"eslint": {
-			"version": "8.56.0",
-			"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz",
-			"integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==",
+			"version": "8.57.0",
+			"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz",
+			"integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==",
 			"dev": true,
 			"requires": {
 				"@eslint-community/eslint-utils": "^4.2.0",
 				"@eslint-community/regexpp": "^4.6.1",
 				"@eslint/eslintrc": "^2.1.4",
-				"@eslint/js": "8.56.0",
-				"@humanwhocodes/config-array": "^0.11.13",
+				"@eslint/js": "8.57.0",
+				"@humanwhocodes/config-array": "^0.11.14",
 				"@humanwhocodes/module-importer": "^1.0.1",
 				"@nodelib/fs.walk": "^1.2.8",
 				"@ungap/structured-clone": "^1.2.0",
@@ -6260,35 +6024,37 @@
 			}
 		},
 		"eslint-compat-utils": {
-			"version": "0.1.2",
-			"resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.1.2.tgz",
-			"integrity": "sha512-Jia4JDldWnFNIru1Ehx1H5s9/yxiRHY/TimCuUc0jNexew3cF1gI6CYZil1ociakfWO3rRqFjl1mskBblB3RYg==",
+			"version": "0.5.1",
+			"resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.5.1.tgz",
+			"integrity": "sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==",
 			"dev": true,
-			"requires": {}
+			"requires": {
+				"semver": "^7.5.4"
+			}
 		},
 		"eslint-config-wikimedia": {
-			"version": "0.26.0",
-			"resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.26.0.tgz",
-			"integrity": "sha512-TAXTySls9k3oWs754rIjlcd9PBLvYeMvjqjiuU8u4gweu0UDgBJGslf+zcvVNXEooAtyLZdENjrzDDjG8ssS7Q==",
+			"version": "0.28.2",
+			"resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.28.2.tgz",
+			"integrity": "sha512-5+rdnT7wH1gpKAO6tHYThg78eMhZMruJzvqku3Y5iaEY/A7kSKLFpA/vOj/snys9fKjDHC9BXmArQh+agkOoJQ==",
 			"dev": true,
 			"requires": {
-				"browserslist-config-wikimedia": "^0.5.1",
-				"eslint": "^8.53.0",
+				"browserslist-config-wikimedia": "^0.7.0",
+				"eslint": "^8.57.0",
 				"eslint-plugin-compat": "^4.2.0",
-				"eslint-plugin-es-x": "^7.3.0",
-				"eslint-plugin-jest": "^27.6.0",
-				"eslint-plugin-jsdoc": "^42.0.0",
-				"eslint-plugin-json-es": "^1.5.7",
-				"eslint-plugin-mediawiki": "^0.5.0",
-				"eslint-plugin-mocha": "^10.2.0",
-				"eslint-plugin-n": "^16.0.1",
-				"eslint-plugin-no-jquery": "^2.7.0",
-				"eslint-plugin-qunit": "^7.3.4",
+				"eslint-plugin-es-x": "^7.6.0",
+				"eslint-plugin-jest": "^28.5.0",
+				"eslint-plugin-jsdoc": "48.2.5",
+				"eslint-plugin-json-es": "^1.6.0",
+				"eslint-plugin-mediawiki": "^0.7.0",
+				"eslint-plugin-mocha": "^10.4.3",
+				"eslint-plugin-n": "^17.7.0",
+				"eslint-plugin-no-jquery": "^3.0.1",
+				"eslint-plugin-qunit": "^8.1.1",
 				"eslint-plugin-security": "^1.7.1",
-				"eslint-plugin-unicorn": "^47.0.0",
-				"eslint-plugin-vue": "^9.18.1",
-				"eslint-plugin-wdio": "^7.19.4",
-				"eslint-plugin-yml": "^1.10.0"
+				"eslint-plugin-unicorn": "^53.0.0",
+				"eslint-plugin-vue": "^9.26.0",
+				"eslint-plugin-wdio": "^8.24.12",
+				"eslint-plugin-yml": "^1.14.0"
 			}
 		},
 		"eslint-plugin-compat": {
@@ -6307,45 +6073,46 @@
 			}
 		},
 		"eslint-plugin-es-x": {
-			"version": "7.5.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.5.0.tgz",
-			"integrity": "sha512-ODswlDSO0HJDzXU0XvgZ3lF3lS3XAZEossh15Q2UHjwrJggWeBoKqqEsLTZLXl+dh5eOAozG0zRcYtuE35oTuQ==",
+			"version": "7.8.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.8.0.tgz",
+			"integrity": "sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==",
 			"dev": true,
 			"requires": {
 				"@eslint-community/eslint-utils": "^4.1.2",
-				"@eslint-community/regexpp": "^4.6.0",
-				"eslint-compat-utils": "^0.1.2"
+				"@eslint-community/regexpp": "^4.11.0",
+				"eslint-compat-utils": "^0.5.1"
 			}
 		},
 		"eslint-plugin-jest": {
-			"version": "27.6.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.6.0.tgz",
-			"integrity": "sha512-MTlusnnDMChbElsszJvrwD1dN3x6nZl//s4JD23BxB6MgR66TZlL064su24xEIS3VACfAoHV1vgyMgPw8nkdng==",
+			"version": "28.6.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-28.6.0.tgz",
+			"integrity": "sha512-YG28E1/MIKwnz+e2H7VwYPzHUYU4aMa19w0yGcwXnnmJH6EfgHahTJ2un3IyraUxNfnz/KUhJAFXNNwWPo12tg==",
 			"dev": true,
 			"requires": {
-				"@typescript-eslint/utils": "^5.10.0"
+				"@typescript-eslint/utils": "^6.0.0 || ^7.0.0"
 			}
 		},
 		"eslint-plugin-jsdoc": {
-			"version": "42.0.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-42.0.0.tgz",
-			"integrity": "sha512-qXYr45G8atPKowZbIOdmABukMzu9IMjAlj6j5Fe0iuUItznWSXUDiBj57ejXcbt8bkPrg83333nuz+cqGKFgcQ==",
+			"version": "48.2.5",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-48.2.5.tgz",
+			"integrity": "sha512-ZeTfKV474W1N9niWfawpwsXGu+ZoMXu4417eBROX31d7ZuOk8zyG66SO77DpJ2+A9Wa2scw/jRqBPnnQo7VbcQ==",
 			"dev": true,
 			"requires": {
-				"@es-joy/jsdoccomment": "~0.37.0",
+				"@es-joy/jsdoccomment": "~0.43.0",
 				"are-docs-informative": "^0.0.2",
-				"comment-parser": "1.3.1",
+				"comment-parser": "1.4.1",
 				"debug": "^4.3.4",
 				"escape-string-regexp": "^4.0.0",
 				"esquery": "^1.5.0",
-				"semver": "^7.3.8",
-				"spdx-expression-parse": "^3.0.1"
+				"is-builtin-module": "^3.2.1",
+				"semver": "^7.6.1",
+				"spdx-expression-parse": "^4.0.0"
 			}
 		},
 		"eslint-plugin-json-es": {
-			"version": "1.5.7",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-json-es/-/eslint-plugin-json-es-1.5.7.tgz",
-			"integrity": "sha512-ehBHcCcJo4iViYx6vp3T+SmwzLIlVDzZNoVxN/txZIiPwDQ26mnYaN5iJ3imqN4l1b8z6rbxEH2kB9XDGxeU/w==",
+			"version": "1.6.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-json-es/-/eslint-plugin-json-es-1.6.0.tgz",
+			"integrity": "sha512-xVn6hufGQH1Aa+yqOhQ43Cq28GuitTcMpQh+uaUh27U2qnVLBrvkN+2xQSnv6zpdLEPS35JCNhq4kvhR+PQCgw==",
 			"dev": true,
 			"requires": {
 				"eslint-visitor-keys": "^3.3.0",
@@ -6353,85 +6120,79 @@
 			}
 		},
 		"eslint-plugin-mediawiki": {
-			"version": "0.5.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-mediawiki/-/eslint-plugin-mediawiki-0.5.0.tgz",
-			"integrity": "sha512-rjkHFyv3VDan/dmu7YpD1Rl9h64NOlz4mqqesRN316R+571+ymmb6lXVOdNMbT8H1iPhmtHc+nijVLVkn7pYDw==",
+			"version": "0.7.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-mediawiki/-/eslint-plugin-mediawiki-0.7.0.tgz",
+			"integrity": "sha512-1Y2nsFDPp96xOZCB5ivZAgqYe9i6w2u64VoCIaAzPyZnd/2h8VQR3CtD+u4Yk/KrpbKq9AAJjrs5LS8VAz6KOA==",
 			"dev": true,
 			"requires": {
-				"eslint-plugin-vue": "^8.7.1",
+				"eslint-plugin-vue": "^9.23.0",
 				"upath": "^2.0.1"
-			},
-			"dependencies": {
-				"eslint-plugin-vue": {
-					"version": "8.7.1",
-					"resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-8.7.1.tgz",
-					"integrity": "sha512-28sbtm4l4cOzoO1LtzQPxfxhQABararUb1JtqusQqObJpWX2e/gmVyeYVfepizPFne0Q5cILkYGiBoV36L12Wg==",
-					"dev": true,
-					"requires": {
-						"eslint-utils": "^3.0.0",
-						"natural-compare": "^1.4.0",
-						"nth-check": "^2.0.1",
-						"postcss-selector-parser": "^6.0.9",
-						"semver": "^7.3.5",
-						"vue-eslint-parser": "^8.0.1"
-					}
-				},
-				"vue-eslint-parser": {
-					"version": "8.3.0",
-					"resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-8.3.0.tgz",
-					"integrity": "sha512-dzHGG3+sYwSf6zFBa0Gi9ZDshD7+ad14DGOdTLjruRVgZXe2J+DcZ9iUhyR48z5g1PqRa20yt3Njna/veLJL/g==",
-					"dev": true,
-					"requires": {
-						"debug": "^4.3.2",
-						"eslint-scope": "^7.0.0",
-						"eslint-visitor-keys": "^3.1.0",
-						"espree": "^9.0.0",
-						"esquery": "^1.4.0",
-						"lodash": "^4.17.21",
-						"semver": "^7.3.5"
-					}
-				}
 			}
 		},
 		"eslint-plugin-mocha": {
-			"version": "10.2.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-10.2.0.tgz",
-			"integrity": "sha512-ZhdxzSZnd1P9LqDPF0DBcFLpRIGdh1zkF2JHnQklKQOvrQtT73kdP5K9V2mzvbLR+cCAO9OI48NXK/Ax9/ciCQ==",
+			"version": "10.4.3",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-10.4.3.tgz",
+			"integrity": "sha512-emc4TVjq5Ht0/upR+psftuz6IBG5q279p+1dSRDeHf+NS9aaerBi3lXKo1SEzwC29hFIW21gO89CEWSvRsi8IQ==",
 			"dev": true,
 			"requires": {
 				"eslint-utils": "^3.0.0",
+				"globals": "^13.24.0",
 				"rambda": "^7.4.0"
 			}
 		},
 		"eslint-plugin-n": {
-			"version": "16.5.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-16.5.0.tgz",
-			"integrity": "sha512-Hw02Bj1QrZIlKyj471Tb1jSReTl4ghIMHGuBGiMVmw+s0jOPbI4CBuYpGbZr+tdQ+VAvSK6FDSta3J4ib/SKHQ==",
+			"version": "17.9.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-17.9.0.tgz",
+			"integrity": "sha512-CPSaXDXdrT4nsrOrO4mT4VB6FMUkoySRkHWuuJJHVqsIEjIeZgMY1H7AzSwPbDScikBmLN82KeM1u7ixV7PzGg==",
 			"dev": true,
 			"requires": {
 				"@eslint-community/eslint-utils": "^4.4.0",
-				"builtins": "^5.0.1",
+				"enhanced-resolve": "^5.17.0",
 				"eslint-plugin-es-x": "^7.5.0",
 				"get-tsconfig": "^4.7.0",
+				"globals": "^15.0.0",
 				"ignore": "^5.2.4",
-				"is-builtin-module": "^3.2.1",
-				"is-core-module": "^2.12.1",
-				"minimatch": "^3.1.2",
-				"resolve": "^1.22.2",
+				"minimatch": "^9.0.0",
 				"semver": "^7.5.3"
+			},
+			"dependencies": {
+				"brace-expansion": {
+					"version": "2.0.1",
+					"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+					"integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+					"dev": true,
+					"requires": {
+						"balanced-match": "^1.0.0"
+					}
+				},
+				"globals": {
+					"version": "15.8.0",
+					"resolved": "https://registry.npmjs.org/globals/-/globals-15.8.0.tgz",
+					"integrity": "sha512-VZAJ4cewHTExBWDHR6yptdIBlx9YSSZuwojj9Nt5mBRXQzrKakDsVKQ1J63sklLvzAJm0X5+RpO4i3Y2hcOnFw==",
+					"dev": true
+				},
+				"minimatch": {
+					"version": "9.0.5",
+					"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
+					"integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
+					"dev": true,
+					"requires": {
+						"brace-expansion": "^2.0.1"
+					}
+				}
 			}
 		},
 		"eslint-plugin-no-jquery": {
-			"version": "2.7.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-no-jquery/-/eslint-plugin-no-jquery-2.7.0.tgz",
-			"integrity": "sha512-Aeg7dA6GTH1AcWLlBtWNzOU9efK5KpNi7b0EhBO0o0M+awyzguUUo8gF6hXGjQ9n5h8/uRtYv9zOqQkeC5CG0w==",
+			"version": "3.0.2",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-no-jquery/-/eslint-plugin-no-jquery-3.0.2.tgz",
+			"integrity": "sha512-n/+6p6PFhWDNPVLJj1463hw4OTIRBbROGcbhmtOHTgw7yihSKzkwZiQ00EJTneyeR3jRiw5lpWSMCCBhtb8t2g==",
 			"dev": true,
 			"requires": {}
 		},
 		"eslint-plugin-qunit": {
-			"version": "7.3.4",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-qunit/-/eslint-plugin-qunit-7.3.4.tgz",
-			"integrity": "sha512-EbDM0zJerH9zVdUswMJpcFF7wrrpvsGuYfNexUpa5hZkkdFhaFcX+yD+RSK4Nrauw4psMGlcqeWUMhaVo+Manw==",
+			"version": "8.1.1",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-qunit/-/eslint-plugin-qunit-8.1.1.tgz",
+			"integrity": "sha512-j3xhiAf2Wvr8Dfwl5T6tlJ+F55vqYE9ZdAHUOTzq1lGerYrXzOS46RvK4SSWug2D8sl3ZYr2lA4/hgVXgLloxw==",
 			"dev": true,
 			"requires": {
 				"eslint-utils": "^3.0.0",
@@ -6448,58 +6209,101 @@
 			}
 		},
 		"eslint-plugin-unicorn": {
-			"version": "47.0.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-47.0.0.tgz",
-			"integrity": "sha512-ivB3bKk7fDIeWOUmmMm9o3Ax9zbMz1Bsza/R2qm46ufw4T6VBFBaJIR1uN3pCKSmSXm8/9Nri8V+iUut1NhQGA==",
+			"version": "53.0.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-53.0.0.tgz",
+			"integrity": "sha512-kuTcNo9IwwUCfyHGwQFOK/HjJAYzbODHN3wP0PgqbW+jbXqpNWxNVpVhj2tO9SixBwuAdmal8rVcWKBxwFnGuw==",
 			"dev": true,
 			"requires": {
-				"@babel/helper-validator-identifier": "^7.19.1",
+				"@babel/helper-validator-identifier": "^7.24.5",
 				"@eslint-community/eslint-utils": "^4.4.0",
-				"ci-info": "^3.8.0",
+				"@eslint/eslintrc": "^3.0.2",
+				"ci-info": "^4.0.0",
 				"clean-regexp": "^1.0.0",
+				"core-js-compat": "^3.37.0",
 				"esquery": "^1.5.0",
 				"indent-string": "^4.0.0",
 				"is-builtin-module": "^3.2.1",
 				"jsesc": "^3.0.2",
-				"lodash": "^4.17.21",
 				"pluralize": "^8.0.0",
 				"read-pkg-up": "^7.0.1",
-				"regexp-tree": "^0.1.24",
+				"regexp-tree": "^0.1.27",
 				"regjsparser": "^0.10.0",
-				"safe-regex": "^2.1.1",
-				"semver": "^7.3.8",
+				"semver": "^7.6.1",
 				"strip-indent": "^3.0.0"
+			},
+			"dependencies": {
+				"@eslint/eslintrc": {
+					"version": "3.1.0",
+					"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz",
+					"integrity": "sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==",
+					"dev": true,
+					"requires": {
+						"ajv": "^6.12.4",
+						"debug": "^4.3.2",
+						"espree": "^10.0.1",
+						"globals": "^14.0.0",
+						"ignore": "^5.2.0",
+						"import-fresh": "^3.2.1",
+						"js-yaml": "^4.1.0",
+						"minimatch": "^3.1.2",
+						"strip-json-comments": "^3.1.1"
+					}
+				},
+				"eslint-visitor-keys": {
+					"version": "4.0.0",
+					"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz",
+					"integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==",
+					"dev": true
+				},
+				"espree": {
+					"version": "10.1.0",
+					"resolved": "https://registry.npmjs.org/espree/-/espree-10.1.0.tgz",
+					"integrity": "sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA==",
+					"dev": true,
+					"requires": {
+						"acorn": "^8.12.0",
+						"acorn-jsx": "^5.3.2",
+						"eslint-visitor-keys": "^4.0.0"
+					}
+				},
+				"globals": {
+					"version": "14.0.0",
+					"resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz",
+					"integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==",
+					"dev": true
+				}
 			}
 		},
 		"eslint-plugin-vue": {
-			"version": "9.19.2",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.19.2.tgz",
-			"integrity": "sha512-CPDqTOG2K4Ni2o4J5wixkLVNwgctKXFu6oBpVJlpNq7f38lh9I80pRTouZSJ2MAebPJlINU/KTFSXyQfBUlymA==",
+			"version": "9.27.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.27.0.tgz",
+			"integrity": "sha512-5Dw3yxEyuBSXTzT5/Ge1X5kIkRTQ3nvBn/VwPwInNiZBSJOO/timWMUaflONnFBzU6NhB68lxnCda7ULV5N7LA==",
 			"dev": true,
 			"requires": {
 				"@eslint-community/eslint-utils": "^4.4.0",
+				"globals": "^13.24.0",
 				"natural-compare": "^1.4.0",
 				"nth-check": "^2.1.1",
-				"postcss-selector-parser": "^6.0.13",
-				"semver": "^7.5.4",
-				"vue-eslint-parser": "^9.3.1",
+				"postcss-selector-parser": "^6.0.15",
+				"semver": "^7.6.0",
+				"vue-eslint-parser": "^9.4.3",
 				"xml-name-validator": "^4.0.0"
 			}
 		},
 		"eslint-plugin-wdio": {
-			"version": "7.25.3",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-wdio/-/eslint-plugin-wdio-7.25.3.tgz",
-			"integrity": "sha512-2zbYwV14Md9FNlyhaIILVGPB6w4bu2eJdOTywDUs2Qy4ebcQNwrxB0qCaf7Rm4O+T0Ir+tdYHYBBfbDocSLKng==",
+			"version": "8.37.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-wdio/-/eslint-plugin-wdio-8.37.0.tgz",
+			"integrity": "sha512-X217zXxSqj1IPWu3bxN7D/xEUmNk7Jg5lBf2JwYH3mCogaqL2tnHZnwt0EQ5D9oEejfEl2+4zqHSzhXq1X7F2A==",
 			"dev": true
 		},
 		"eslint-plugin-yml": {
-			"version": "1.11.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-yml/-/eslint-plugin-yml-1.11.0.tgz",
-			"integrity": "sha512-NBZP1NDGy0u38pY5ieix75jxS9GNOJy9xd4gQa0rU4gWbfEsVhKDwuFaQ6RJpDbv6Lq5TtcAZS/YnAc0oeRw0w==",
+			"version": "1.14.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-yml/-/eslint-plugin-yml-1.14.0.tgz",
+			"integrity": "sha512-ESUpgYPOcAYQO9czugcX5OqRvn/ydDVwGCPXY4YjPqc09rHaUVUA6IE6HLQys4rXk/S+qx3EwTd1wHCwam/OWQ==",
 			"dev": true,
 			"requires": {
 				"debug": "^4.3.2",
-				"eslint-compat-utils": "^0.1.1",
+				"eslint-compat-utils": "^0.5.0",
 				"lodash": "^4.17.21",
 				"natural-compare": "^1.4.0",
 				"yaml-eslint-parser": "^1.2.1"
@@ -6654,6 +6458,12 @@
 			"integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
 			"dev": true
 		},
+		"fast-uri": {
+			"version": "3.0.1",
+			"resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.1.tgz",
+			"integrity": "sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==",
+			"dev": true
+		},
 		"fastest-levenshtein": {
 			"version": "1.0.16",
 			"resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz",
@@ -6679,9 +6489,9 @@
 			}
 		},
 		"fill-range": {
-			"version": "7.0.1",
-			"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
-			"integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+			"version": "7.1.1",
+			"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+			"integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
 			"dev": true,
 			"requires": {
 				"to-regex-range": "^5.0.1"
@@ -6740,9 +6550,9 @@
 			}
 		},
 		"flatted": {
-			"version": "3.2.9",
-			"resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz",
-			"integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==",
+			"version": "3.3.1",
+			"resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz",
+			"integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==",
 			"dev": true
 		},
 		"for-in": {
@@ -6779,9 +6589,9 @@
 			"dev": true
 		},
 		"get-tsconfig": {
-			"version": "4.7.2",
-			"resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.2.tgz",
-			"integrity": "sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==",
+			"version": "4.7.6",
+			"resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.6.tgz",
+			"integrity": "sha512-ZAqrLlu18NbDdRaHq+AKXzAmqIUPswPWKUchfytdAjiRFnCe5ojG2bstg6mRiZabkKfCoL/e98pbBELIV/YCeA==",
 			"dev": true,
 			"requires": {
 				"resolve-pkg-maps": "^1.0.0"
@@ -6880,6 +6690,12 @@
 			"integrity": "sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==",
 			"dev": true
 		},
+		"graceful-fs": {
+			"version": "4.2.11",
+			"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+			"integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
+			"dev": true
+		},
 		"graphemer": {
 			"version": "1.4.0",
 			"resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
@@ -6944,10 +6760,13 @@
 			}
 		},
 		"grunt-banana-checker": {
-			"version": "0.11.1",
-			"resolved": "https://registry.npmjs.org/grunt-banana-checker/-/grunt-banana-checker-0.11.1.tgz",
-			"integrity": "sha512-CF0h/TXaX9sbF2yIz+fUfJc4Zvms7XGYQ7ZYMD5+vv0LMZzSFf7JSHXDaBEs72nQWw4r4ap5fOW3baAliW+0bQ==",
-			"dev": true
+			"version": "0.13.0",
+			"resolved": "https://registry.npmjs.org/grunt-banana-checker/-/grunt-banana-checker-0.13.0.tgz",
+			"integrity": "sha512-uAUKILcP69Q4OJHHV2wzxqVaoXB8G3Uh/XuSJLn0Bk/9+WiUY/Q4+OX7dUhrPPeDZPtoGh37qqJLVvZlDTUecg==",
+			"dev": true,
+			"requires": {
+				"chalk": "4.1.2"
+			}
 		},
 		"grunt-cli": {
 			"version": "1.4.3",
@@ -7028,19 +6847,13 @@
 			}
 		},
 		"grunt-stylelint": {
-			"version": "0.19.0",
-			"resolved": "https://registry.npmjs.org/grunt-stylelint/-/grunt-stylelint-0.19.0.tgz",
-			"integrity": "sha512-td+OvkfQ/2bYXNTBAlnpXmfa6sddLSloXRp1zoUONcMScbvEq5S3GSkOZKpCjK90WSjTYR0L7WYFcMVd1TXd+w==",
+			"version": "0.20.1",
+			"resolved": "https://registry.npmjs.org/grunt-stylelint/-/grunt-stylelint-0.20.1.tgz",
+			"integrity": "sha512-tDep9ceEerB+fK6CkzPBXu5qPM7RuwCRgfrtwugEyYYnxINreMZktqQU5eoTW+MhhFj81uWQQnxf+c4geyAmQg==",
 			"dev": true,
 			"requires": {
 				"chalk": "^4.1.2"
-			}
-		},
-		"hard-rejection": {
-			"version": "2.1.0",
-			"resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz",
-			"integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==",
-			"dev": true
+			}
 		},
 		"has-flag": {
 			"version": "4.0.0",
@@ -7106,9 +6919,9 @@
 			}
 		},
 		"ignore": {
-			"version": "5.3.0",
-			"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz",
-			"integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==",
+			"version": "5.3.1",
+			"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz",
+			"integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==",
 			"dev": true
 		},
 		"import-fresh": {
@@ -7121,12 +6934,6 @@
 				"resolve-from": "^4.0.0"
 			}
 		},
-		"import-lazy": {
-			"version": "4.0.0",
-			"resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz",
-			"integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==",
-			"dev": true
-		},
 		"imurmurhash": {
 			"version": "0.1.4",
 			"resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
@@ -7234,12 +7041,6 @@
 			"integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
 			"dev": true
 		},
-		"is-plain-obj": {
-			"version": "1.1.0",
-			"resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
-			"integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==",
-			"dev": true
-		},
 		"is-plain-object": {
 			"version": "2.0.4",
 			"resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
@@ -7358,11 +7159,10 @@
 			"dev": true
 		},
 		"known-css-properties": {
-			"version": "0.29.0",
-			"resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.29.0.tgz",
-			"integrity": "sha512-Ne7wqW7/9Cz54PDt4I3tcV+hAyat8ypyOGzYRJQfdxnnjeWsTxt1cy8pjvvKeI5kfXuyvULyeeAvwvvtAX3ayQ==",
-			"dev": true,
-			"peer": true
+			"version": "0.34.0",
+			"resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.34.0.tgz",
+			"integrity": "sha512-tBECoUqNFbyAY4RrbqsBQqDFpGXAEbdD5QKr8kACx3+rnArmuuR22nKQWKazvp07N9yjTyDZaw/20UIH8tL9DQ==",
+			"dev": true
 		},
 		"ldjson-stream": {
 			"version": "1.2.1",
@@ -7372,30 +7172,6 @@
 			"requires": {
 				"split2": "^0.2.1",
 				"through2": "^0.6.1"
-			},
-			"dependencies": {
-				"readable-stream": {
-					"version": "1.0.34",
-					"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
-					"integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==",
-					"dev": true,
-					"requires": {
-						"core-util-is": "~1.0.0",
-						"inherits": "~2.0.1",
-						"isarray": "0.0.1",
-						"string_decoder": "~0.10.x"
-					}
-				},
-				"through2": {
-					"version": "0.6.5",
-					"resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz",
-					"integrity": "sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg==",
-					"dev": true,
-					"requires": {
-						"readable-stream": ">=1.0.33-1 <1.1.0-0",
-						"xtend": ">=4.0.0 <4.1.0-0"
-					}
-				}
 			}
 		},
 		"levn": {
@@ -7477,15 +7253,6 @@
 			"integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==",
 			"dev": true
 		},
-		"lru-cache": {
-			"version": "6.0.0",
-			"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
-			"integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
-			"dev": true,
-			"requires": {
-				"yallist": "^4.0.0"
-			}
-		},
 		"make-iterator": {
 			"version": "1.0.1",
 			"resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz",
@@ -7501,12 +7268,6 @@
 			"integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==",
 			"dev": true
 		},
-		"map-obj": {
-			"version": "4.3.0",
-			"resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz",
-			"integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==",
-			"dev": true
-		},
 		"mathml-tag-names": {
 			"version": "2.1.3",
 			"resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz",
@@ -7520,76 +7281,10 @@
 			"dev": true
 		},
 		"meow": {
-			"version": "10.1.5",
-			"resolved": "https://registry.npmjs.org/meow/-/meow-10.1.5.tgz",
-			"integrity": "sha512-/d+PQ4GKmGvM9Bee/DPa8z3mXs/pkvJE2KEThngVNOqtmljC6K7NMPxtc2JeZYTmpWb9k/TmxjeL18ez3h7vCw==",
-			"dev": true,
-			"requires": {
-				"@types/minimist": "^1.2.2",
-				"camelcase-keys": "^7.0.0",
-				"decamelize": "^5.0.0",
-				"decamelize-keys": "^1.1.0",
-				"hard-rejection": "^2.1.0",
-				"minimist-options": "4.1.0",
-				"normalize-package-data": "^3.0.2",
-				"read-pkg-up": "^8.0.0",
-				"redent": "^4.0.0",
-				"trim-newlines": "^4.0.2",
-				"type-fest": "^1.2.2",
-				"yargs-parser": "^20.2.9"
-			},
-			"dependencies": {
-				"hosted-git-info": {
-					"version": "4.1.0",
-					"resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz",
-					"integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==",
-					"dev": true,
-					"requires": {
-						"lru-cache": "^6.0.0"
-					}
-				},
-				"normalize-package-data": {
-					"version": "3.0.3",
-					"resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz",
-					"integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==",
-					"dev": true,
-					"requires": {
-						"hosted-git-info": "^4.0.1",
-						"is-core-module": "^2.5.0",
-						"semver": "^7.3.4",
-						"validate-npm-package-license": "^3.0.1"
-					}
-				},
-				"read-pkg": {
-					"version": "6.0.0",
-					"resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-6.0.0.tgz",
-					"integrity": "sha512-X1Fu3dPuk/8ZLsMhEj5f4wFAF0DWoK7qhGJvgaijocXxBmSToKfbFtqbxMO7bVjNA1dmE5huAzjXj/ey86iw9Q==",
-					"dev": true,
-					"requires": {
-						"@types/normalize-package-data": "^2.4.0",
-						"normalize-package-data": "^3.0.2",
-						"parse-json": "^5.2.0",
-						"type-fest": "^1.0.1"
-					}
-				},
-				"read-pkg-up": {
-					"version": "8.0.0",
-					"resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-8.0.0.tgz",
-					"integrity": "sha512-snVCqPczksT0HS2EC+SxUndvSzn6LRCwpfSvLrIfR5BKDQQZMaI6jPRC9dYvYFDRAuFEAnkwww8kBBNE/3VvzQ==",
-					"dev": true,
-					"requires": {
-						"find-up": "^5.0.0",
-						"read-pkg": "^6.0.0",
-						"type-fest": "^1.0.1"
-					}
-				},
-				"type-fest": {
-					"version": "1.4.0",
-					"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz",
-					"integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==",
-					"dev": true
-				}
-			}
+			"version": "13.2.0",
+			"resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz",
+			"integrity": "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==",
+			"dev": true
 		},
 		"merge2": {
 			"version": "1.4.1",
@@ -7598,12 +7293,12 @@
 			"dev": true
 		},
 		"micromatch": {
-			"version": "4.0.5",
-			"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
-			"integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
+			"version": "4.0.7",
+			"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz",
+			"integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==",
 			"dev": true,
 			"requires": {
-				"braces": "^3.0.2",
+				"braces": "^3.0.3",
 				"picomatch": "^2.3.1"
 			}
 		},
@@ -7622,17 +7317,6 @@
 				"brace-expansion": "^1.1.7"
 			}
 		},
-		"minimist-options": {
-			"version": "4.1.0",
-			"resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz",
-			"integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==",
-			"dev": true,
-			"requires": {
-				"arrify": "^1.0.1",
-				"is-plain-obj": "^1.1.0",
-				"kind-of": "^6.0.3"
-			}
-		},
 		"ms": {
 			"version": "2.1.2",
 			"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
@@ -7650,14 +7334,6 @@
 				"array-union": "^2.1.0",
 				"arrify": "^2.0.1",
 				"minimatch": "^3.0.4"
-			},
-			"dependencies": {
-				"arrify": {
-					"version": "2.0.1",
-					"resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz",
-					"integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==",
-					"dev": true
-				}
 			}
 		},
 		"nanoid": {
@@ -7906,9 +7582,9 @@
 			"dev": true
 		},
 		"picocolors": {
-			"version": "1.0.0",
-			"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
-			"integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
+			"version": "1.0.1",
+			"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz",
+			"integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==",
 			"dev": true
 		},
 		"picomatch": {
@@ -7924,20 +7600,20 @@
 			"dev": true
 		},
 		"postcss": {
-			"version": "8.4.32",
-			"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.32.tgz",
-			"integrity": "sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==",
+			"version": "8.4.39",
+			"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.39.tgz",
+			"integrity": "sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==",
 			"dev": true,
 			"requires": {
 				"nanoid": "^3.3.7",
-				"picocolors": "^1.0.0",
-				"source-map-js": "^1.0.2"
+				"picocolors": "^1.0.1",
+				"source-map-js": "^1.2.0"
 			}
 		},
 		"postcss-html": {
-			"version": "1.5.0",
-			"resolved": "https://registry.npmjs.org/postcss-html/-/postcss-html-1.5.0.tgz",
-			"integrity": "sha512-kCMRWJRHKicpA166kc2lAVUGxDZL324bkj/pVOb6RhjB0Z5Krl7mN0AsVkBhVIRZZirY0lyQXG38HCVaoKVNoA==",
+			"version": "1.6.0",
+			"resolved": "https://registry.npmjs.org/postcss-html/-/postcss-html-1.6.0.tgz",
+			"integrity": "sha512-OWgQ9/Pe23MnNJC0PL4uZp8k0EDaUvqpJFSiwFxOLClAhmD7UEisyhO3x5hVsD4xFrjReVTXydlrMes45dJ71w==",
 			"dev": true,
 			"requires": {
 				"htmlparser2": "^8.0.0",
@@ -7947,10 +7623,17 @@
 			},
 			"dependencies": {
 				"js-tokens": {
-					"version": "8.0.2",
-					"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-8.0.2.tgz",
-					"integrity": "sha512-Olnt+V7xYdvGze9YTbGFZIfQXuGV4R3nQwwl8BrtgaPE/wq8UFpUHWuTNc05saowhSr1ZO6tx+V6RjE9D5YQog==",
+					"version": "8.0.3",
+					"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-8.0.3.tgz",
+					"integrity": "sha512-UfJMcSJc+SEXEl9lH/VLHSZbThQyLpw1vLO1Lb+j4RWDvG3N2f7yj3PVQA3cmkTBNldJ9eFnM+xEXxHIXrYiJw==",
 					"dev": true
+				},
+				"postcss-safe-parser": {
+					"version": "6.0.0",
+					"resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz",
+					"integrity": "sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==",
+					"dev": true,
+					"requires": {}
 				}
 			}
 		},
@@ -7961,12 +7644,6 @@
 			"dev": true,
 			"requires": {}
 		},
-		"postcss-media-query-parser": {
-			"version": "0.2.3",
-			"resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz",
-			"integrity": "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==",
-			"dev": true
-		},
 		"postcss-resolve-nested-selector": {
 			"version": "0.1.1",
 			"resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz",
@@ -7974,16 +7651,16 @@
 			"dev": true
 		},
 		"postcss-safe-parser": {
-			"version": "6.0.0",
-			"resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz",
-			"integrity": "sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==",
+			"version": "7.0.0",
+			"resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-7.0.0.tgz",
+			"integrity": "sha512-ovehqRNVCpuFzbXoTb4qLtyzK3xn3t/CUBxOs8LsnQjQrShaB4lKiHoVqY8ANaC0hBMHq5QVWk77rwGklFUDrg==",
 			"dev": true,
 			"requires": {}
 		},
 		"postcss-selector-parser": {
-			"version": "6.0.13",
-			"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz",
-			"integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==",
+			"version": "6.1.1",
+			"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.1.tgz",
+			"integrity": "sha512-b4dlw/9V8A71rLIDsSwVmak9z2DuBUB7CA1/wSdelNEzqsjoSPeADTWNO09lpH49Diy3/JIZ2bSPB1dI3LJCHg==",
 			"dev": true,
 			"requires": {
 				"cssesc": "^3.0.0",
@@ -8014,12 +7691,6 @@
 			"integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
 			"dev": true
 		},
-		"quick-lru": {
-			"version": "5.1.1",
-			"resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz",
-			"integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==",
-			"dev": true
-		},
 		"rambda": {
 			"version": "7.5.0",
 			"resolved": "https://registry.npmjs.org/rambda/-/rambda-7.5.0.tgz",
@@ -8123,33 +7794,6 @@
 				"resolve": "^1.9.0"
 			}
 		},
-		"redent": {
-			"version": "4.0.0",
-			"resolved": "https://registry.npmjs.org/redent/-/redent-4.0.0.tgz",
-			"integrity": "sha512-tYkDkVVtYkSVhuQ4zBgfvciymHaeuel+zFKXShfDnFP5SyVEP7qo70Rf1jTOTCx3vGNAbnEi/xFkcfQVMIBWag==",
-			"dev": true,
-			"requires": {
-				"indent-string": "^5.0.0",
-				"strip-indent": "^4.0.0"
-			},
-			"dependencies": {
-				"indent-string": {
-					"version": "5.0.0",
-					"resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz",
-					"integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==",
-					"dev": true
-				},
-				"strip-indent": {
-					"version": "4.0.0",
-					"resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.0.0.tgz",
-					"integrity": "sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==",
-					"dev": true,
-					"requires": {
-						"min-indent": "^1.0.1"
-					}
-				}
-			}
-		},
 		"regexp-tree": {
 			"version": "0.1.27",
 			"resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.27.tgz",
@@ -8270,13 +7914,10 @@
 			"dev": true
 		},
 		"semver": {
-			"version": "7.5.4",
-			"resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
-			"integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
-			"dev": true,
-			"requires": {
-				"lru-cache": "^6.0.0"
-			}
+			"version": "7.6.3",
+			"resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
+			"integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
+			"dev": true
 		},
 		"shebang-command": {
 			"version": "2.0.0",
@@ -8323,9 +7964,9 @@
 			"dev": true
 		},
 		"source-map-js": {
-			"version": "1.0.2",
-			"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
-			"integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
+			"version": "1.2.0",
+			"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz",
+			"integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==",
 			"dev": true
 		},
 		"spdx-correct": {
@@ -8336,18 +7977,30 @@
 			"requires": {
 				"spdx-expression-parse": "^3.0.0",
 				"spdx-license-ids": "^3.0.0"
+			},
+			"dependencies": {
+				"spdx-expression-parse": {
+					"version": "3.0.1",
+					"resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
+					"integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
+					"dev": true,
+					"requires": {
+						"spdx-exceptions": "^2.1.0",
+						"spdx-license-ids": "^3.0.0"
+					}
+				}
 			}
 		},
 		"spdx-exceptions": {
-			"version": "2.3.0",
-			"resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz",
-			"integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==",
+			"version": "2.5.0",
+			"resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz",
+			"integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==",
 			"dev": true
 		},
 		"spdx-expression-parse": {
-			"version": "3.0.1",
-			"resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
-			"integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
+			"version": "4.0.0",
+			"resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-4.0.0.tgz",
+			"integrity": "sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==",
 			"dev": true,
 			"requires": {
 				"spdx-exceptions": "^2.1.0",
@@ -8355,9 +8008,9 @@
 			}
 		},
 		"spdx-license-ids": {
-			"version": "3.0.16",
-			"resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz",
-			"integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==",
+			"version": "3.0.18",
+			"resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.18.tgz",
+			"integrity": "sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ==",
 			"dev": true
 		},
 		"split2": {
@@ -8367,30 +8020,6 @@
 			"dev": true,
 			"requires": {
 				"through2": "~0.6.1"
-			},
-			"dependencies": {
-				"readable-stream": {
-					"version": "1.0.34",
-					"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
-					"integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==",
-					"dev": true,
-					"requires": {
-						"core-util-is": "~1.0.0",
-						"inherits": "~2.0.1",
-						"isarray": "0.0.1",
-						"string_decoder": "~0.10.x"
-					}
-				},
-				"through2": {
-					"version": "0.6.5",
-					"resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz",
-					"integrity": "sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg==",
-					"dev": true,
-					"requires": {
-						"readable-stream": ">=1.0.33-1 <1.1.0-0",
-						"xtend": ">=4.0.0 <4.1.0-0"
-					}
-				}
 			}
 		},
 		"sprintf-js": {
@@ -8399,6 +8028,12 @@
 			"integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==",
 			"dev": true
 		},
+		"stream-shift": {
+			"version": "1.0.3",
+			"resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz",
+			"integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==",
+			"dev": true
+		},
 		"string_decoder": {
 			"version": "0.10.31",
 			"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
@@ -8447,69 +8082,81 @@
 			"dev": true
 		},
 		"stylelint": {
-			"version": "15.11.0",
-			"resolved": "https://registry.npmjs.org/stylelint/-/stylelint-15.11.0.tgz",
-			"integrity": "sha512-78O4c6IswZ9TzpcIiQJIN49K3qNoXTM8zEJzhaTE/xRTCZswaovSEVIa/uwbOltZrk16X4jAxjaOhzz/hTm1Kw==",
+			"version": "16.7.0",
+			"resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.7.0.tgz",
+			"integrity": "sha512-Q1ATiXlz+wYr37a7TGsfvqYn2nSR3T/isw3IWlZQzFzCNoACHuGBb6xBplZXz56/uDRJHIygxjh7jbV/8isewA==",
 			"dev": true,
-			"peer": true,
 			"requires": {
-				"@csstools/css-parser-algorithms": "^2.3.1",
-				"@csstools/css-tokenizer": "^2.2.0",
-				"@csstools/media-query-list-parser": "^2.1.4",
-				"@csstools/selector-specificity": "^3.0.0",
+				"@csstools/css-parser-algorithms": "^2.7.1",
+				"@csstools/css-tokenizer": "^2.4.1",
+				"@csstools/media-query-list-parser": "^2.1.13",
+				"@csstools/selector-specificity": "^3.1.1",
+				"@dual-bundle/import-meta-resolve": "^4.1.0",
 				"balanced-match": "^2.0.0",
 				"colord": "^2.9.3",
-				"cosmiconfig": "^8.2.0",
-				"css-functions-list": "^3.2.1",
+				"cosmiconfig": "^9.0.0",
+				"css-functions-list": "^3.2.2",
 				"css-tree": "^2.3.1",
-				"debug": "^4.3.4",
-				"fast-glob": "^3.3.1",
+				"debug": "^4.3.5",
+				"fast-glob": "^3.3.2",
 				"fastest-levenshtein": "^1.0.16",
-				"file-entry-cache": "^7.0.0",
+				"file-entry-cache": "^9.0.0",
 				"global-modules": "^2.0.0",
 				"globby": "^11.1.0",
 				"globjoin": "^0.1.4",
 				"html-tags": "^3.3.1",
-				"ignore": "^5.2.4",
-				"import-lazy": "^4.0.0",
+				"ignore": "^5.3.1",
 				"imurmurhash": "^0.1.4",
 				"is-plain-object": "^5.0.0",
-				"known-css-properties": "^0.29.0",
+				"known-css-properties": "^0.34.0",
 				"mathml-tag-names": "^2.1.3",
-				"meow": "^10.1.5",
-				"micromatch": "^4.0.5",
+				"meow": "^13.2.0",
+				"micromatch": "^4.0.7",
 				"normalize-path": "^3.0.0",
-				"picocolors": "^1.0.0",
-				"postcss": "^8.4.28",
+				"picocolors": "^1.0.1",
+				"postcss": "^8.4.39",
 				"postcss-resolve-nested-selector": "^0.1.1",
-				"postcss-safe-parser": "^6.0.0",
-				"postcss-selector-parser": "^6.0.13",
+				"postcss-safe-parser": "^7.0.0",
+				"postcss-selector-parser": "^6.1.0",
 				"postcss-value-parser": "^4.2.0",
 				"resolve-from": "^5.0.0",
 				"string-width": "^4.2.3",
-				"strip-ansi": "^6.0.1",
-				"style-search": "^0.1.0",
+				"strip-ansi": "^7.1.0",
 				"supports-hyperlinks": "^3.0.0",
 				"svg-tags": "^1.0.0",
-				"table": "^6.8.1",
+				"table": "^6.8.2",
 				"write-file-atomic": "^5.0.1"
 			},
 			"dependencies": {
+				"ansi-regex": {
+					"version": "6.0.1",
+					"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
+					"integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
+					"dev": true
+				},
 				"balanced-match": {
 					"version": "2.0.0",
 					"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz",
 					"integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==",
-					"dev": true,
-					"peer": true
+					"dev": true
 				},
 				"file-entry-cache": {
-					"version": "7.0.2",
-					"resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-7.0.2.tgz",
-					"integrity": "sha512-TfW7/1iI4Cy7Y8L6iqNdZQVvdXn0f8B4QcIXmkIbtTIe/Okm/nSlHb4IwGzRVOd3WfSieCgvf5cMzEfySAIl0g==",
+					"version": "9.0.0",
+					"resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-9.0.0.tgz",
+					"integrity": "sha512-6MgEugi8p2tiUhqO7GnPsmbCCzj0YRCwwaTbpGRyKZesjRSzkqkAE9fPp7V2yMs5hwfgbQLgdvSSkGNg1s5Uvw==",
+					"dev": true,
+					"requires": {
+						"flat-cache": "^5.0.0"
+					}
+				},
+				"flat-cache": {
+					"version": "5.0.0",
+					"resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-5.0.0.tgz",
+					"integrity": "sha512-JrqFmyUl2PnPi1OvLyTVHnQvwQ0S+e6lGSwu8OkAZlSaNIZciTY2H/cOOROxsBA1m/LZNHDsqAgDZt6akWcjsQ==",
 					"dev": true,
-					"peer": true,
 					"requires": {
-						"flat-cache": "^3.2.0"
+						"flatted": "^3.3.1",
+						"keyv": "^4.5.4"
 					}
 				},
 				"global-modules": {
@@ -8517,7 +8164,6 @@
 					"resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz",
 					"integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==",
 					"dev": true,
-					"peer": true,
 					"requires": {
 						"global-prefix": "^3.0.0"
 					}
@@ -8527,7 +8173,6 @@
 					"resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz",
 					"integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==",
 					"dev": true,
-					"peer": true,
 					"requires": {
 						"ini": "^1.3.5",
 						"kind-of": "^6.0.2",
@@ -8538,22 +8183,28 @@
 					"version": "5.0.0",
 					"resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
 					"integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==",
-					"dev": true,
-					"peer": true
+					"dev": true
 				},
 				"resolve-from": {
 					"version": "5.0.0",
 					"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
 					"integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+					"dev": true
+				},
+				"strip-ansi": {
+					"version": "7.1.0",
+					"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+					"integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
 					"dev": true,
-					"peer": true
+					"requires": {
+						"ansi-regex": "^6.0.1"
+					}
 				},
 				"which": {
 					"version": "1.3.1",
 					"resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
 					"integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
 					"dev": true,
-					"peer": true,
 					"requires": {
 						"isexe": "^2.0.0"
 					}
@@ -8561,38 +8212,58 @@
 			}
 		},
 		"stylelint-config-recommended": {
-			"version": "13.0.0",
-			"resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-13.0.0.tgz",
-			"integrity": "sha512-EH+yRj6h3GAe/fRiyaoO2F9l9Tgg50AOFhaszyfov9v6ayXJ1IkSHwTxd7lB48FmOeSGDPLjatjO11fJpmarkQ==",
+			"version": "14.0.0",
+			"resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-14.0.0.tgz",
+			"integrity": "sha512-jSkx290CglS8StmrLp2TxAppIajzIBZKYm3IxT89Kg6fGlxbPiTiyH9PS5YUuVAFwaJLl1ikiXX0QWjI0jmgZQ==",
 			"dev": true,
 			"requires": {}
 		},
 		"stylelint-config-wikimedia": {
-			"version": "0.16.1",
-			"resolved": "https://registry.npmjs.org/stylelint-config-wikimedia/-/stylelint-config-wikimedia-0.16.1.tgz",
-			"integrity": "sha512-FDVUyDyCBap2o2HAeJqIobdVdSTur5HFX5FymoKrzfMIYWxIV/55lTpyL1PR71TfVMaroDXJrIftLFW9mXKFhQ==",
+			"version": "0.17.2",
+			"resolved": "https://registry.npmjs.org/stylelint-config-wikimedia/-/stylelint-config-wikimedia-0.17.2.tgz",
+			"integrity": "sha512-cc3PYhe1O/GTgsMOp+Ri3ru579YBbZ3Me0oU7xNb06n4iwyXYPz8qO5G4iQ13UH19UW2NIS8Tk0goPRrJ1RAfw==",
 			"dev": true,
 			"requires": {
-				"browserslist-config-wikimedia": "0.5.0",
-				"postcss-html": "1.5.0",
+				"@stylistic/stylelint-config": "1.0.1",
+				"@stylistic/stylelint-plugin": "2.0.0",
+				"browserslist-config-wikimedia": "0.7.0",
+				"postcss-html": "1.6.0",
 				"postcss-less": "6.0.0",
-				"stylelint": "15.10.1",
-				"stylelint-config-recommended": "13.0.0",
-				"stylelint-no-unsupported-browser-features": "6.1.0",
-				"stylelint-stylistic": "0.4.3"
+				"stylelint": "16.2.0",
+				"stylelint-config-recommended": "14.0.0",
+				"stylelint-no-unsupported-browser-features": "8.0.1"
 			},
 			"dependencies": {
+				"ansi-regex": {
+					"version": "6.0.1",
+					"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
+					"integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
+					"dev": true
+				},
 				"balanced-match": {
 					"version": "2.0.0",
 					"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz",
 					"integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==",
 					"dev": true
 				},
-				"browserslist-config-wikimedia": {
-					"version": "0.5.0",
-					"resolved": "https://registry.npmjs.org/browserslist-config-wikimedia/-/browserslist-config-wikimedia-0.5.0.tgz",
-					"integrity": "sha512-t+tvSnTeVhVF2lNRxoAlE51/ZCfUs5SNNZUnWu2N8xXOGMPTMyKk5l4mayvDdm+5L8oqmnALU+TjnN2Z+ZTCTw==",
-					"dev": true
+				"file-entry-cache": {
+					"version": "8.0.0",
+					"resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz",
+					"integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==",
+					"dev": true,
+					"requires": {
+						"flat-cache": "^4.0.0"
+					}
+				},
+				"flat-cache": {
+					"version": "4.0.1",
+					"resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz",
+					"integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==",
+					"dev": true,
+					"requires": {
+						"flatted": "^3.2.9",
+						"keyv": "^4.5.4"
+					}
 				},
 				"global-modules": {
 					"version": "2.0.0",
@@ -8621,9 +8292,9 @@
 					"dev": true
 				},
 				"known-css-properties": {
-					"version": "0.27.0",
-					"resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.27.0.tgz",
-					"integrity": "sha512-uMCj6+hZYDoffuvAJjFAPz56E9uoowFHmTkqRtRq5WyC5Q6Cu/fTZKNQpX/RbzChBYLLl3lo8CjFZBAZXq9qFg==",
+					"version": "0.29.0",
+					"resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.29.0.tgz",
+					"integrity": "sha512-Ne7wqW7/9Cz54PDt4I3tcV+hAyat8ypyOGzYRJQfdxnnjeWsTxt1cy8pjvvKeI5kfXuyvULyeeAvwvvtAX3ayQ==",
 					"dev": true
 				},
 				"resolve-from": {
@@ -8632,48 +8303,55 @@
 					"integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
 					"dev": true
 				},
+				"strip-ansi": {
+					"version": "7.1.0",
+					"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+					"integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+					"dev": true,
+					"requires": {
+						"ansi-regex": "^6.0.1"
+					}
+				},
 				"stylelint": {
-					"version": "15.10.1",
-					"resolved": "https://registry.npmjs.org/stylelint/-/stylelint-15.10.1.tgz",
-					"integrity": "sha512-CYkzYrCFfA/gnOR+u9kJ1PpzwG10WLVnoxHDuBA/JiwGqdM9+yx9+ou6SE/y9YHtfv1mcLo06fdadHTOx4gBZQ==",
+					"version": "16.2.0",
+					"resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.2.0.tgz",
+					"integrity": "sha512-gwqU5AkIb52wrAzzn+359S3NIJDMl02TXLUaV2tzA/L6jUdpTwNt+MCxHlc8+Hb2bUHlYVo92YeSIryF2gJthA==",
 					"dev": true,
 					"requires": {
-						"@csstools/css-parser-algorithms": "^2.3.0",
-						"@csstools/css-tokenizer": "^2.1.1",
-						"@csstools/media-query-list-parser": "^2.1.2",
-						"@csstools/selector-specificity": "^3.0.0",
+						"@csstools/css-parser-algorithms": "^2.5.0",
+						"@csstools/css-tokenizer": "^2.2.3",
+						"@csstools/media-query-list-parser": "^2.1.7",
+						"@csstools/selector-specificity": "^3.0.1",
 						"balanced-match": "^2.0.0",
 						"colord": "^2.9.3",
-						"cosmiconfig": "^8.2.0",
-						"css-functions-list": "^3.1.0",
+						"cosmiconfig": "^9.0.0",
+						"css-functions-list": "^3.2.1",
 						"css-tree": "^2.3.1",
 						"debug": "^4.3.4",
-						"fast-glob": "^3.3.0",
+						"fast-glob": "^3.3.2",
 						"fastest-levenshtein": "^1.0.16",
-						"file-entry-cache": "^6.0.1",
+						"file-entry-cache": "^8.0.0",
 						"global-modules": "^2.0.0",
 						"globby": "^11.1.0",
 						"globjoin": "^0.1.4",
 						"html-tags": "^3.3.1",
-						"ignore": "^5.2.4",
-						"import-lazy": "^4.0.0",
+						"ignore": "^5.3.0",
 						"imurmurhash": "^0.1.4",
 						"is-plain-object": "^5.0.0",
-						"known-css-properties": "^0.27.0",
+						"known-css-properties": "^0.29.0",
 						"mathml-tag-names": "^2.1.3",
-						"meow": "^10.1.5",
+						"meow": "^13.1.0",
 						"micromatch": "^4.0.5",
 						"normalize-path": "^3.0.0",
 						"picocolors": "^1.0.0",
-						"postcss": "^8.4.24",
+						"postcss": "^8.4.33",
 						"postcss-resolve-nested-selector": "^0.1.1",
-						"postcss-safe-parser": "^6.0.0",
-						"postcss-selector-parser": "^6.0.13",
+						"postcss-safe-parser": "^7.0.0",
+						"postcss-selector-parser": "^6.0.15",
 						"postcss-value-parser": "^4.2.0",
 						"resolve-from": "^5.0.0",
 						"string-width": "^4.2.3",
-						"strip-ansi": "^6.0.1",
-						"style-search": "^0.1.0",
+						"strip-ansi": "^7.1.0",
 						"supports-hyperlinks": "^3.0.0",
 						"svg-tags": "^1.0.0",
 						"table": "^6.8.1",
@@ -8692,35 +8370,13 @@
 			}
 		},
 		"stylelint-no-unsupported-browser-features": {
-			"version": "6.1.0",
-			"resolved": "https://registry.npmjs.org/stylelint-no-unsupported-browser-features/-/stylelint-no-unsupported-browser-features-6.1.0.tgz",
-			"integrity": "sha512-3Taj+z9PjIiY6cz4hg3eN8Khue3kMm9lPXYuEvdjAFXDK20uQo2NocJaWN6anIKclYlwrpkBAS9W/KV3qPTWsw==",
-			"dev": true,
-			"requires": {
-				"doiuse": "^4.4.1",
-				"lodash": "^4.17.15",
-				"postcss": "^8.4.16"
-			}
-		},
-		"stylelint-stylistic": {
-			"version": "0.4.3",
-			"resolved": "https://registry.npmjs.org/stylelint-stylistic/-/stylelint-stylistic-0.4.3.tgz",
-			"integrity": "sha512-WphmneK3MRrm5ixvRPWy7+c9+EQUh0FPvNMXW/N9VD85vyqtpxUejpD+mxubVVht0fRgidcqBxtW3s3tU2Ujhw==",
+			"version": "8.0.1",
+			"resolved": "https://registry.npmjs.org/stylelint-no-unsupported-browser-features/-/stylelint-no-unsupported-browser-features-8.0.1.tgz",
+			"integrity": "sha512-tc8Xn5DaqJhxTmbA4H8gZbYdAz027NfuSZv5+cVieQb7BtBrF/1/iKYdpcGwXPl3GtqkQrisiXuGqKkKnzWcLw==",
 			"dev": true,
 			"requires": {
-				"is-plain-object": "^5.0.0",
-				"postcss": "^8.4.21",
-				"postcss-media-query-parser": "^0.2.3",
-				"postcss-value-parser": "^4.2.0",
-				"style-search": "^0.1.0"
-			},
-			"dependencies": {
-				"is-plain-object": {
-					"version": "5.0.0",
-					"resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
-					"integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==",
-					"dev": true
-				}
+				"doiuse": "^6.0.2",
+				"postcss": "^8.4.32"
 			}
 		},
 		"supports-color": {
@@ -8755,9 +8411,9 @@
 			"dev": true
 		},
 		"table": {
-			"version": "6.8.1",
-			"resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz",
-			"integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==",
+			"version": "6.8.2",
+			"resolved": "https://registry.npmjs.org/table/-/table-6.8.2.tgz",
+			"integrity": "sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==",
 			"dev": true,
 			"requires": {
 				"ajv": "^8.0.1",
@@ -8768,15 +8424,15 @@
 			},
 			"dependencies": {
 				"ajv": {
-					"version": "8.12.0",
-					"resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz",
-					"integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==",
+					"version": "8.17.1",
+					"resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
+					"integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
 					"dev": true,
 					"requires": {
-						"fast-deep-equal": "^3.1.1",
+						"fast-deep-equal": "^3.1.3",
+						"fast-uri": "^3.0.1",
 						"json-schema-traverse": "^1.0.0",
-						"require-from-string": "^2.0.2",
-						"uri-js": "^4.2.2"
+						"require-from-string": "^2.0.2"
 					}
 				},
 				"json-schema-traverse": {
@@ -8787,6 +8443,12 @@
 				}
 			}
 		},
+		"tapable": {
+			"version": "2.2.1",
+			"resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
+			"integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==",
+			"dev": true
+		},
 		"text-table": {
 			"version": "0.2.0",
 			"resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
@@ -8794,32 +8456,25 @@
 			"dev": true
 		},
 		"through2": {
-			"version": "4.0.2",
-			"resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz",
-			"integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==",
+			"version": "0.6.5",
+			"resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz",
+			"integrity": "sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg==",
 			"dev": true,
 			"requires": {
-				"readable-stream": "3"
+				"readable-stream": ">=1.0.33-1 <1.1.0-0",
+				"xtend": ">=4.0.0 <4.1.0-0"
 			},
 			"dependencies": {
 				"readable-stream": {
-					"version": "3.6.2",
-					"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
-					"integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
-					"dev": true,
-					"requires": {
-						"inherits": "^2.0.3",
-						"string_decoder": "^1.1.1",
-						"util-deprecate": "^1.0.1"
-					}
-				},
-				"string_decoder": {
-					"version": "1.3.0",
-					"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
-					"integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+					"version": "1.0.34",
+					"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
+					"integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==",
 					"dev": true,
 					"requires": {
-						"safe-buffer": "~5.2.0"
+						"core-util-is": "~1.0.0",
+						"inherits": "~2.0.1",
+						"isarray": "0.0.1",
+						"string_decoder": "~0.10.x"
 					}
 				}
 			}
@@ -8833,26 +8488,12 @@
 				"is-number": "^7.0.0"
 			}
 		},
-		"trim-newlines": {
-			"version": "4.1.1",
-			"resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-4.1.1.tgz",
-			"integrity": "sha512-jRKj0n0jXWo6kh62nA5TEh3+4igKDXLvzBJcPpiizP7oOolUrYIxmVBG9TOtHYFHoddUk6YvAkGeGoSVTXfQXQ==",
-			"dev": true
-		},
-		"tslib": {
-			"version": "1.14.1",
-			"resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
-			"integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
-			"dev": true
-		},
-		"tsutils": {
-			"version": "3.21.0",
-			"resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz",
-			"integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==",
+		"ts-api-utils": {
+			"version": "1.3.0",
+			"resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz",
+			"integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==",
 			"dev": true,
-			"requires": {
-				"tslib": "^1.8.1"
-			}
+			"requires": {}
 		},
 		"type-check": {
 			"version": "0.4.0",
@@ -8870,9 +8511,9 @@
 			"dev": true
 		},
 		"typescript": {
-			"version": "5.3.3",
-			"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz",
-			"integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==",
+			"version": "5.5.4",
+			"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz",
+			"integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==",
 			"dev": true,
 			"peer": true
 		},
@@ -8899,13 +8540,13 @@
 			"dev": true
 		},
 		"update-browserslist-db": {
-			"version": "1.0.13",
-			"resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz",
-			"integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==",
+			"version": "1.1.0",
+			"resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz",
+			"integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==",
 			"dev": true,
 			"requires": {
-				"escalade": "^3.1.1",
-				"picocolors": "^1.0.0"
+				"escalade": "^3.1.2",
+				"picocolors": "^1.0.1"
 			}
 		},
 		"uri-js": {
@@ -8940,12 +8581,24 @@
 			"requires": {
 				"spdx-correct": "^3.0.0",
 				"spdx-expression-parse": "^3.0.0"
+			},
+			"dependencies": {
+				"spdx-expression-parse": {
+					"version": "3.0.1",
+					"resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
+					"integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
+					"dev": true,
+					"requires": {
+						"spdx-exceptions": "^2.1.0",
+						"spdx-license-ids": "^3.0.0"
+					}
+				}
 			}
 		},
 		"vue-eslint-parser": {
-			"version": "9.3.2",
-			"resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.3.2.tgz",
-			"integrity": "sha512-q7tWyCVaV9f8iQyIA5Mkj/S6AoJ9KBN8IeUSf3XEmBrOtxOZnfTg5s4KClbZBCK3GtnT/+RyCLZyDHuZwTuBjg==",
+			"version": "9.4.3",
+			"resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.4.3.tgz",
+			"integrity": "sha512-2rYRLWlIpaiN8xbPiDyXZXRgLGOtWxERV7ND5fFAv5qo1D2N9Fu9MNajBNc6o13lZ+24DAWCkQCvj4klgmcITg==",
 			"dev": true,
 			"requires": {
 				"debug": "^4.3.4",
@@ -9011,22 +8664,16 @@
 			"integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
 			"dev": true
 		},
-		"yallist": {
-			"version": "4.0.0",
-			"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
-			"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
-			"dev": true
-		},
 		"yaml": {
-			"version": "2.3.4",
-			"resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz",
-			"integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==",
+			"version": "2.4.5",
+			"resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.5.tgz",
+			"integrity": "sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg==",
 			"dev": true
 		},
 		"yaml-eslint-parser": {
-			"version": "1.2.2",
-			"resolved": "https://registry.npmjs.org/yaml-eslint-parser/-/yaml-eslint-parser-1.2.2.tgz",
-			"integrity": "sha512-pEwzfsKbTrB8G3xc/sN7aw1v6A6c/pKxLAkjclnAyo5g5qOh6eL9WGu0o3cSDQZKrTNk4KL4lQSwZW+nBkANEg==",
+			"version": "1.2.3",
+			"resolved": "https://registry.npmjs.org/yaml-eslint-parser/-/yaml-eslint-parser-1.2.3.tgz",
+			"integrity": "sha512-4wZWvE398hCP7O8n3nXKu/vdq1HcH01ixYlCREaJL5NUMwQ0g3MaGFUBNSlmBtKmhbtVG/Cm6lyYmSVTEVil8A==",
 			"dev": true,
 			"requires": {
 				"eslint-visitor-keys": "^3.0.0",
@@ -9035,24 +8682,24 @@
 			}
 		},
 		"yargs": {
-			"version": "16.2.0",
-			"resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
-			"integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
+			"version": "17.7.2",
+			"resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
+			"integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
 			"dev": true,
 			"requires": {
-				"cliui": "^7.0.2",
+				"cliui": "^8.0.1",
 				"escalade": "^3.1.1",
 				"get-caller-file": "^2.0.5",
 				"require-directory": "^2.1.1",
-				"string-width": "^4.2.0",
+				"string-width": "^4.2.3",
 				"y18n": "^5.0.5",
-				"yargs-parser": "^20.2.2"
+				"yargs-parser": "^21.1.1"
 			}
 		},
 		"yargs-parser": {
-			"version": "20.2.9",
-			"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
-			"integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
+			"version": "21.1.1",
+			"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
+			"integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
 			"dev": true
 		},
 		"yocto-queue": {
diff --git a/package.json b/package.json
index 8815f3b..38d3bd4 100644
--- a/package.json
+++ b/package.json
@@ -5,11 +5,11 @@
 		"test": "grunt test"
 	},
 	"devDependencies": {
-		"eslint-config-wikimedia": "0.26.0",
+		"eslint-config-wikimedia": "0.28.2",
 		"grunt": "1.6.1",
-		"grunt-banana-checker": "0.11.1",
+		"grunt-banana-checker": "0.13.0",
 		"grunt-eslint": "24.3.0",
-		"grunt-stylelint": "0.19.0",
-		"stylelint-config-wikimedia": "0.16.1"
+		"grunt-stylelint": "0.20.1",
+		"stylelint-config-wikimedia": "0.17.2"
 	}
 }
diff --git a/resources/VersionCheck.js b/resources/VersionCheck.js
index 06d625f..a337266 100644
--- a/resources/VersionCheck.js
+++ b/resources/VersionCheck.js
@@ -18,7 +18,7 @@
  * @author thomas-topway-it <support@topway.it>
  * @copyright Copyright © 2021-2023, https://wikisphere.org
  */
-$( function () {
+$( () => {
 	if (
 		!mw.config.get( 'visualdata-show-notice-outdated-version' ) ||
 		mw.cookie.get( 'visualdata-check-latest-version' )
@@ -27,12 +27,12 @@ $( function () {
 	}
 
 	// display every 3 days
-	mw.loader.using( 'mediawiki.api', function () {
+	mw.loader.using( 'mediawiki.api', () => {
 		new mw.Api()
 			.postWithToken( 'csrf', {
 				action: 'visualdata-check-latest-version'
 			} )
-			.done( function ( res ) {
+			.done( ( res ) => {
 				if ( 'visualdata-check-latest-version' in res ) {
 					if ( res[ 'visualdata-check-latest-version' ].result === 2 ) {
 						var messageWidget = new OO.ui.MessageWidget( {
diff --git a/resources/VisualData.js b/resources/VisualData.js
index 196c94d..b81c428 100644
--- a/resources/VisualData.js
+++ b/resources/VisualData.js
@@ -41,7 +41,7 @@ VisualData = ( function () {
 			};
 			new mw.Api()
 				.postWithToken( 'csrf', payload )
-				.done( function ( res ) {
+				.done( ( res ) => {
 					if ( payload.action in res ) {
 						var data = res[ payload.action ];
 						for ( var i in data ) {
@@ -53,7 +53,7 @@ VisualData = ( function () {
 						reject();
 					}
 				} )
-				.fail( function ( res ) {
+				.fail( ( res ) => {
 					// eslint-disable-next-line no-console
 					console.error( 'visualdata-load-data error', res );
 					reject( res );
@@ -74,7 +74,7 @@ VisualData = ( function () {
 		return new Promise( ( resolve, reject ) => {
 			new mw.Api()
 				.postWithToken( 'csrf', payload )
-				.done( function ( res ) {
+				.done( ( res ) => {
 					if ( payload.action in res ) {
 						var thisSchemas = JSON.parse( res[ payload.action ].schemas );
 						for ( var i in thisSchemas ) {
@@ -86,7 +86,7 @@ VisualData = ( function () {
 						}
 					}
 				} )
-				.fail( function ( res ) {
+				.fail( ( res ) => {
 					// eslint-disable-next-line no-console
 					console.error( 'visualdata-get-schemas', res );
 					reject( res );
@@ -107,7 +107,7 @@ VisualData = ( function () {
 
 		switch ( action ) {
 			case 'update':
-				Schemas = jQuery.extend( Schemas, data.schemas );
+				Schemas = Object.assign( Schemas, data.schemas );
 				break;
 
 			case 'delete':
@@ -117,13 +117,13 @@ VisualData = ( function () {
 				break;
 
 			case 'create':
-				Schemas = jQuery.extend( Schemas, data.schemas );
+				Schemas = Object.assign( Schemas, data.schemas );
 				Schemas = VisualDataFunctions.sortObjectByKeys( Schemas );
 				break;
 
 			case 'rename':
 				delete Schemas[ data[ 'previous-label' ] ];
-				Schemas = jQuery.extend( Schemas, data.schemas );
+				Schemas = Object.assign( Schemas, data.schemas );
 				Schemas = VisualDataFunctions.sortObjectByKeys( Schemas );
 				break;
 		}
diff --git a/resources/VisualDataContentBlock.js b/resources/VisualDataContentBlock.js
index 09c4f26..16ebe19 100644
--- a/resources/VisualDataContentBlock.js
+++ b/resources/VisualDataContentBlock.js
@@ -97,9 +97,7 @@ const VisualDataContentBlock = function ( phpConfig, windowManager ) {
 			} )
 		);
 
-		items = items.filter( function ( x ) {
-			return !( 'items' in x ) || x.items.length;
-		} );
+		items = items.filter( ( x ) => !( 'items' in x ) || x.items.length );
 
 		this.isEmpty = !items.length;
 
@@ -185,11 +183,11 @@ const VisualDataContentBlock = function ( phpConfig, windowManager ) {
 
 				VisualDataFunctions.renameObjectKey( ParentObj, CurrentKey, objName );
 
-				ParentObj[ objName ] = $.extend( ParentObj[ objName ], { wiki: obj } );
+				ParentObj[ objName ] = Object.assign( ParentObj[ objName ], { wiki: obj } );
 
 				Callback();
 
-				return new OO.ui.Process( function () {
+				return new OO.ui.Process( () => {
 					dialog.close( { action: action } );
 				} );
 		}
@@ -200,7 +198,7 @@ const VisualDataContentBlock = function ( phpConfig, windowManager ) {
 	ProcessDialog.prototype.getTeardownProcess = function ( data ) {
 		return ProcessDialog.super.prototype.getTeardownProcess
 			.call( this, data )
-			.first( function () {
+			.first( () => {
 				WindowManager.removeActiveWindow();
 			}, this );
 	};
diff --git a/resources/VisualDataDatatables.js b/resources/VisualDataDatatables.js
index 302b635..5e30678 100644
--- a/resources/VisualDataDatatables.js
+++ b/resources/VisualDataDatatables.js
@@ -39,7 +39,7 @@ const VisualDataDatatables = function () {
 	};
 };
 
-$( function () {
+$( () => {
 	var visualdataDatatables = new VisualDataDatatables();
 
 	$( '.visualdata.datatable' ).each( function () {
diff --git a/resources/VisualDataFormField.js b/resources/VisualDataFormField.js
index 85fc035..d98989c 100644
--- a/resources/VisualDataFormField.js
+++ b/resources/VisualDataFormField.js
@@ -91,8 +91,7 @@ const VisualDataFormField = function ( phpConfig, windowManager, schemas ) {
 		// remove options inputs and lookup widgets
 		// except multiselect
 		return ret.filter(
-			( x ) =>
-				( VisualDataFunctions.lookupInputs.indexOf( x ) === -1 &&
+			( x ) => ( VisualDataFunctions.lookupInputs.indexOf( x ) === -1 &&
 					VisualDataFunctions.optionsInputs.indexOf( x ) === -1 ) ||
 				VisualDataFunctions.isMultiselect( x )
 		);
@@ -248,7 +247,7 @@ const VisualDataFormField = function ( phpConfig, windowManager, schemas ) {
 			return false;
 		}
 
-		selectOptionsFrom.on( 'change', function ( value ) {
+		selectOptionsFrom.on( 'change', ( value ) => {
 			fieldOptionsValues.toggle( value === 'options-values' );
 			fieldWikilist.toggle( value === 'options-wikilist' );
 			fieldOptionsLabelFormula.toggle( value !== 'options-askquery' );
@@ -308,7 +307,7 @@ const VisualDataFormField = function ( phpConfig, windowManager, schemas ) {
 		layout.toggle( visibleItems );
 
 		// eslint-disable-next-line no-unused-vars
-		availableInputsInput.on( 'change', function ( value ) {
+		availableInputsInput.on( 'change', ( value ) => {
 			onSelectAvailableInputs();
 		} );
 
@@ -480,12 +479,12 @@ const VisualDataFormField = function ( phpConfig, windowManager, schemas ) {
 		layout.toggle( visibleItems );
 
 		// eslint-disable-next-line no-unused-vars
-		availableInputsInput.on( 'change', function ( value ) {
+		availableInputsInput.on( 'change', ( value ) => {
 			onSelectAvailableInputs();
 		} );
 
 		// eslint-disable-next-line no-unused-vars
-		selectOptionsFrom.on( 'change', function ( value ) {
+		selectOptionsFrom.on( 'change', ( value ) => {
 			onSelectAvailableInputs();
 		} );
 
@@ -567,10 +566,8 @@ const VisualDataFormField = function ( phpConfig, windowManager, schemas ) {
 
 		// ------------------ show-if -----------------
 
-		var otherFields = Object.keys( ParentObj ).filter( ( x ) => {
-			return ( x !== CurrentKey && ParentObj[ x ].wiki.type === 'property' &&
-				ParentObj[ x ].wiki[ 'multiple-items' ] === false );
-		} );
+		var otherFields = Object.keys( ParentObj ).filter( ( x ) => ( x !== CurrentKey && ParentObj[ x ].wiki.type === 'property' &&
+				ParentObj[ x ].wiki[ 'multiple-items' ] === false ) );
 
 		var showifFieldInput = new OO.ui.DropdownInputWidget( {
 			options: VisualDataFunctions.createDropDownOptions( otherFields, { key: 'value' } ),
@@ -598,7 +595,7 @@ const VisualDataFormField = function ( phpConfig, windowManager, schemas ) {
 			value: getPropertyValue( 'showif-value' )
 		} );
 
-		showifConditionInput.on( 'change', function ( value ) {
+		showifConditionInput.on( 'change', ( value ) => {
 			showifValueInput.toggle( value !== '!null' );
 			updateModelShowif( getPropertyValue( 'visibility' ) === 'condition' );
 		} );
@@ -730,7 +727,7 @@ const VisualDataFormField = function ( phpConfig, windowManager, schemas ) {
 			} );
 
 			// eslint-disable-next-line no-unused-vars
-			SMWpropertiesInput.on( 'change', function ( value ) {
+			SMWpropertiesInput.on( 'change', ( value ) => {
 				redrawAvailableInputs();
 			} );
 
@@ -805,7 +802,7 @@ const VisualDataFormField = function ( phpConfig, windowManager, schemas ) {
 		} );
 
 		// eslint-disable-next-line no-unused-vars
-		jsonSchemaFormatInput.on( 'change', function ( value ) {
+		jsonSchemaFormatInput.on( 'change', ( value ) => {
 			redrawAvailableInputs();
 		} );
 
@@ -822,7 +819,7 @@ const VisualDataFormField = function ( phpConfig, windowManager, schemas ) {
 
 		items.push( fieldjsonSchemaFormatInput );
 
-		jsonSchemaInput.on( 'change', function ( value ) {
+		jsonSchemaInput.on( 'change', ( value ) => {
 			switch ( value ) {
 				case 'string':
 					fieldjsonSchemaFormatInput.toggle( true );
@@ -845,7 +842,7 @@ const VisualDataFormField = function ( phpConfig, windowManager, schemas ) {
 		);
 
 		if ( Config.SMW ) {
-			propertyModelInput.on( 'change', function ( value ) {
+			propertyModelInput.on( 'change', ( value ) => {
 				switch ( value ) {
 					case 'smw-property':
 						fieldSMWpropertiesInput.toggle( true );
@@ -916,7 +913,7 @@ const VisualDataFormField = function ( phpConfig, windowManager, schemas ) {
 			value: availableInputsValue
 		} );
 
-		availableInputsInput.on( 'change', function ( value ) {
+		availableInputsInput.on( 'change', ( value ) => {
 			var thisDefaultValueInput = getDefaultValueInput();
 
 			// eslint-disable-next-line no-use-before-define
@@ -943,7 +940,7 @@ const VisualDataFormField = function ( phpConfig, windowManager, schemas ) {
 			defaultInputConfig
 		);
 
-		inputConfigButton.on( 'click', function () {
+		inputConfigButton.on( 'click', () => {
 			var dataType = null;
 			if ( Config.SMW ) {
 				var SMWproperty = getPropertyValue( 'SMW-property' );
@@ -987,7 +984,7 @@ const VisualDataFormField = function ( phpConfig, windowManager, schemas ) {
 			align: 'top'
 		} );
 
-		multipleItemsInput.on( 'change', function ( value ) {
+		multipleItemsInput.on( 'change', ( value ) => {
 			redrawAvailableInputs();
 			layoutParentSchema.toggle( value );
 			fieldRequiredInput.toggle( !value );
@@ -1125,7 +1122,7 @@ const VisualDataFormField = function ( phpConfig, windowManager, schemas ) {
 			updateModelShowif( value === 'condition' );
 		}
 
-		visibilityInput.on( 'change', function ( value ) {
+		visibilityInput.on( 'change', ( value ) => {
 			onVisibilityInputChange( value );
 		} );
 
@@ -1164,15 +1161,13 @@ const VisualDataFormField = function ( phpConfig, windowManager, schemas ) {
 			Model.default = thisDefaultValueInput;
 		}
 
-		items = items.filter( function ( x ) {
-			return !( 'items' in x ) || x.items.length;
-		} );
+		items = items.filter( ( x ) => !( 'items' in x ) || x.items.length );
 
 		this.isEmpty = !items.length;
 
 		this.fieldset.addItems( items );
 
-		setTimeout( function () {
+		setTimeout( () => {
 			VisualDataFunctions.removeNbspFromLayoutHeader(
 				'#visualdata-processDialogEditField'
 			);
@@ -1302,7 +1297,7 @@ const VisualDataFormField = function ( phpConfig, windowManager, schemas ) {
 
 				Callback();
 
-				return new OO.ui.Process( function () {
+				return new OO.ui.Process( () => {
 					dialog.close( { action: action } );
 				} );
 		}
@@ -1313,7 +1308,7 @@ const VisualDataFormField = function ( phpConfig, windowManager, schemas ) {
 	ProcessDialog.prototype.getTeardownProcess = function ( data ) {
 		return ProcessDialog.super.prototype.getTeardownProcess
 			.call( this, data )
-			.first( function () {
+			.first( () => {
 				WindowManager.removeActiveWindow();
 			}, this );
 	};
diff --git a/resources/VisualDataForms.js b/resources/VisualDataForms.js
index 7456234..102e297 100644
--- a/resources/VisualDataForms.js
+++ b/resources/VisualDataForms.js
@@ -22,8 +22,6 @@
 /* eslint-disable no-tabs */
 /* eslint-disable no-unused-vars */
 /* eslint-disable no-underscore-dangle */
-/* eslint-disable es-x/no-async-functions */
-/* eslint-disable compat/compat */
 
 const VisualDataForms = function ( Config, Form, FormID, Schemas, WindowManager ) {
 	var Model = {};
@@ -67,7 +65,7 @@ const VisualDataForms = function ( Config, Form, FormID, Schemas, WindowManager
 	// @FIXME destroy/reinitialize on tab change
 	function showVisualEditor() {
 		function timeOut( i ) {
-			setTimeout( function () {
+			setTimeout( () => {
 				if (
 					InputWidgets[ i ] &&
 					InputWidgets[ i ].$element.parent().is( ':visible' )
@@ -121,7 +119,7 @@ const VisualDataForms = function ( Config, Form, FormID, Schemas, WindowManager
 					}
 				}
 
-				mw.loader.using( 'ext.VisualData.Maptiler', function () {
+				mw.loader.using( 'ext.VisualData.Maptiler', () => {
 					var visualDataMaptiler = new VisualDataMaptiler();
 					visualDataMaptiler.initialize( obj.element, obj.data );
 				} );
@@ -250,7 +248,7 @@ const VisualDataForms = function ( Config, Form, FormID, Schemas, WindowManager
 			SchemasLayout.setTabPanel( schemaName );
 
 			if ( init ) {
-				SchemasLayout.on( 'set', function () {
+				SchemasLayout.on( 'set', () => {
 					onTabSelect( SchemasLayout.getCurrentTabPanelName() );
 				} );
 			}
@@ -260,7 +258,7 @@ const VisualDataForms = function ( Config, Form, FormID, Schemas, WindowManager
 			SchemasLayout.setPage( schemaName );
 
 			if ( init ) {
-				SchemasLayout.on( 'set', function () {
+				SchemasLayout.on( 'set', () => {
 					onTabSelect( SchemasLayout.getCurrentPageName() );
 				} );
 			}
@@ -277,7 +275,7 @@ const VisualDataForms = function ( Config, Form, FormID, Schemas, WindowManager
 
 		// create deep copy, otherwise changes are
 		// copied to Forms[ form ].properties[ property ][ 'input-config' ]
-		var inputConfig = $.extend(
+		var inputConfig = Object.assign(
 			{}, // *** important !! cast to object
 			VisualDataFunctions.deepCopy( field[ 'input-config' ] ),
 			{ value: config.data, required: required }
@@ -493,7 +491,7 @@ const VisualDataForms = function ( Config, Form, FormID, Schemas, WindowManager
 			var askQuery = field[ 'options-askquery' ];
 			var regExp = new RegExp( '<' + sourceModel.pathNoIndex + '>' );
 			if ( regExp.test( askQuery ) ) {
-				ProcessModel.getModel( 'schema', sourceModel.schemaName ).then( function ( res ) {
+				ProcessModel.getModel( 'schema', sourceModel.schemaName ).then( ( res ) => {
 					for ( var i in res.flatten ) {
 
 						if ( res.flatten[ i ].pathNoIndex === sourceModel.pathNoIndex ) {
@@ -567,14 +565,14 @@ const VisualDataForms = function ( Config, Form, FormID, Schemas, WindowManager
 			return new Promise( ( resolve, reject ) => {
 				new mw.Api()
 					.postWithToken( 'csrf', payload )
-					.done( function ( thisRes ) {
+					.done( ( thisRes ) => {
 						if ( payload.action in thisRes ) {
 							var thisData = thisRes[ payload.action ];
 							thisData = JSON.parse( thisData.result );
 							resolve( thisData );
 						}
 					} )
-					.fail( function ( thisRes ) {
+					.fail( ( thisRes ) => {
 						// eslint-disable-next-line no-console
 						console.error( 'visualdata-askquery', thisRes );
 						reject( thisRes );
@@ -633,7 +631,7 @@ const VisualDataForms = function ( Config, Form, FormID, Schemas, WindowManager
 
 		OO.ui.mixin.GroupWidget.call(
 			this,
-			$.extend(
+			Object.assign(
 				{
 					$group: this.$element
 				},
@@ -736,7 +734,7 @@ const VisualDataForms = function ( Config, Form, FormID, Schemas, WindowManager
 		// Mixin constructors
 		OO.ui.mixin.GroupElement.call(
 			this,
-			$.extend(
+			Object.assign(
 				{
 					$group: this.$element
 				},
@@ -760,12 +758,12 @@ const VisualDataForms = function ( Config, Form, FormID, Schemas, WindowManager
 
 		var inputWidget = getInputWidget( config );
 
-		inputWidget.on( 'change', function () {
+		inputWidget.on( 'change', () => {
 			updateFieldsVisibility( config.model );
 			clearDependentFields( config.model.pathNoIndex );
 		} );
 
-		inputWidget.$element.find( 'input' ).on( 'blur', function () {
+		inputWidget.$element.find( 'input' ).on( 'blur', () => {
 			updateFieldsVisibility( config.model );
 			updateDependentFields( config.model );
 		} );
@@ -847,7 +845,7 @@ const VisualDataForms = function ( Config, Form, FormID, Schemas, WindowManager
 				fileUploadGroupWidget.removeItems( [ item ] );
 			};
 
-			restoreButton.on( 'click', function () {
+			restoreButton.on( 'click', () => {
 				inputWidget.toggle( false );
 				restoreButton.toggle( false );
 				fileUploadGroupWidget.removeItems( [ fileItemWidget ] );
@@ -861,12 +859,12 @@ const VisualDataForms = function ( Config, Form, FormID, Schemas, WindowManager
 
 			// @FIXME move to FileItemWidget
 
-			this.on( 'fileUploaded', function ( file ) {
+			this.on( 'fileUploaded', ( file ) => {
 				// eslint-disable-next-line no-console
 				console.log( 'event fileUploaded', file );
 			} );
 
-			this.on( 'fileUploadInit', function ( file ) {
+			this.on( 'fileUploadInit', ( file ) => {
 				// eslint-disable-next-line no-console
 				console.log( 'event fileUploadInit', file );
 				restoreButton.toggle( false );
@@ -875,20 +873,20 @@ const VisualDataForms = function ( Config, Form, FormID, Schemas, WindowManager
 
 			this.on(
 				'fileUploadProgress',
-				function ( file, progress, estimatedRemainingTime ) {
+				( file, progress, estimatedRemainingTime ) => {
 					loadedFiles[ file.name ].progress( progress, estimatedRemainingTime );
 				}
 			);
 
-			this.on( 'fileUploadComplete', function ( file, res ) {
+			this.on( 'fileUploadComplete', ( file, res ) => {
 				loadedFiles[ file.name ].uploadComplete( file, res );
 			} );
 
-			this.on( 'fileUploadErrorMessage', function ( file, errorMessage ) {
+			this.on( 'fileUploadErrorMessage', ( file, errorMessage ) => {
 				loadedFiles[ file.name ].errorMessage( errorMessage );
 			} );
 
-			this.on( 'fileUploadFail', function ( file, res ) {
+			this.on( 'fileUploadFail', ( file, res ) => {
 				loadedFiles[ file.name ].fail( res );
 			} );
 
@@ -967,7 +965,7 @@ const VisualDataForms = function ( Config, Form, FormID, Schemas, WindowManager
 		var searchWidgetResults = searchWidget.getResults();
 		searchWidgetResults.multiselect = true;
 
-		searchWidgetResults.on( 'press', function ( value ) {
+		searchWidgetResults.on( 'press', ( value ) => {
 			if ( value === null ) {
 				return;
 			}
@@ -1046,7 +1044,7 @@ const VisualDataForms = function ( Config, Form, FormID, Schemas, WindowManager
 			// });
 		}
 
-		return new OO.ui.Process( function () {
+		return new OO.ui.Process( () => {
 			dialog.close( { action: action } );
 		} );
 
@@ -1055,7 +1053,7 @@ const VisualDataForms = function ( Config, Form, FormID, Schemas, WindowManager
 	ProcessDialogSearch.prototype.getTeardownProcess = function ( data ) {
 		return ProcessDialogSearch.super.prototype.getTeardownProcess
 			.call( this, data )
-			.first( function () {
+			.first( () => {
 				WindowManager.removeActiveWindow();
 			}, this );
 	};
@@ -1318,7 +1316,7 @@ const VisualDataForms = function ( Config, Form, FormID, Schemas, WindowManager
 
 		OO.ui.mixin.GroupWidget.call(
 			this,
-			$.extend( { $group: this.$element }, config )
+			Object.assign( { $group: this.$element }, config )
 		);
 		// OO.EventEmitter.call( this );
 
@@ -1373,7 +1371,7 @@ const VisualDataForms = function ( Config, Form, FormID, Schemas, WindowManager
 					flags: [ 'destructive' ]
 				} );
 
-				deleteButton.on( 'click', function () {
+				deleteButton.on( 'click', () => {
 					Form.schemas.splice( Form.schemas.indexOf( data.schema.wiki.name ), 1 );
 					// delete Form.jsonData.schemas[ data.schema.wiki.name ];
 					delete ModelSchemas[ data.schema.wiki.name ];
@@ -1394,7 +1392,7 @@ const VisualDataForms = function ( Config, Form, FormID, Schemas, WindowManager
 					// classes: ["VisualDataOptionsListDeleteButton"],
 				} );
 
-				editButton.on( 'click', function () {
+				editButton.on( 'click', () => {
 					VisualDataSchemas.openSchemaDialog(
 						[ data.schema.wiki.name ],
 						'properties'
@@ -1531,11 +1529,11 @@ const VisualDataForms = function ( Config, Form, FormID, Schemas, WindowManager
 
 	GroupWidget.prototype.formLoaded = function () {
 	//	if ( this.data.root === true ) {
-		setTimeout( function () {
+		setTimeout( () => {
 			VisualDataFunctions.removeNbspFromLayoutHeader( 'form' );
 		}, 30 );
 
-		setTimeout( function () {
+		setTimeout( () => {
 			VisualDataFunctions.removeNbspFromLayoutHeader(
 				'#visualdataform-wrapper-dialog-' + FormID
 			);
@@ -1656,7 +1654,7 @@ const VisualDataForms = function ( Config, Form, FormID, Schemas, WindowManager
 		function getFreeTextInput( wikitext, thisConfig ) {
 			var thisInputWidget;
 
-			thisConfig = $.extend(
+			thisConfig = Object.assign(
 				{
 					name: `${ FormID }-model-freetext`,
 					id: `${ FormID }-model-freetext`
@@ -1666,7 +1664,7 @@ const VisualDataForms = function ( Config, Form, FormID, Schemas, WindowManager
 
 			if ( !wikitext || !Config.VEForAll ) {
 				thisInputWidget = new OO.ui.MultilineTextInputWidget(
-					$.extend(
+					Object.assign(
 						{
 							autosize: true,
 							rows: 6
@@ -1861,7 +1859,7 @@ const VisualDataForms = function ( Config, Form, FormID, Schemas, WindowManager
 
 					Model[ 'target-slot' ] = targetSlotInput;
 
-					targetSlotInput.on( 'change', function ( value ) {
+					targetSlotInput.on( 'change', ( value ) => {
 						if ( freeTextField ) {
 							freeTextField.toggle( value !== 'main' );
 						}
@@ -1931,7 +1929,7 @@ const VisualDataForms = function ( Config, Form, FormID, Schemas, WindowManager
 						value: Config.contentModel
 					} );
 
-					contentModelInput.on( 'change', async function ( value ) {
+					contentModelInput.on( 'change', async ( value ) => {
 						if ( !( 'freetext' in Model ) ) {
 							return;
 						}
@@ -1998,7 +1996,7 @@ const VisualDataForms = function ( Config, Form, FormID, Schemas, WindowManager
 
 		OO.ui.mixin.GroupWidget.call(
 			this,
-			$.extend(
+			Object.assign(
 				{
 					$group: this.$element
 				},
@@ -2066,7 +2064,7 @@ const VisualDataForms = function ( Config, Form, FormID, Schemas, WindowManager
 			// flags: ["destructive"],
 			// classes: ["VisualDataOptionsListDeleteButton"],
 		} );
-		deleteButton.on( 'click', function () {
+		deleteButton.on( 'click', () => {
 			if (
 				!( 'minItems' in self.schema ) ||
 				self.items.length > self.schema.minItems
@@ -2239,7 +2237,7 @@ const VisualDataForms = function ( Config, Form, FormID, Schemas, WindowManager
 			icon: 'add'
 		} );
 
-		addOption.on( 'click', function () {
+		addOption.on( 'click', () => {
 			if (
 				!( 'maxItems' in schema ) ||
 				self.optionsList.items.length < schema.maxItems
@@ -2612,9 +2610,7 @@ const VisualDataForms = function ( Config, Form, FormID, Schemas, WindowManager
 
 		// for some reason appending the method
 		// halts the execution combined with mw.loader
-		categories = categories.filter( function onlyUnique( value, index, self ) {
-			return self.indexOf( value ) === index;
-		} );
+		categories = categories.filter( ( value, index, self ) => self.indexOf( value ) === index );
 
 		// create title and free text input
 		if ( !userDefined && !editFreeText && !editCategories && !editContentModel ) {
@@ -2651,8 +2647,8 @@ const VisualDataForms = function ( Config, Form, FormID, Schemas, WindowManager
 	}
 
 	function updatePanels() {
-		ProcessModel.getModel( 'fetch' ).then( function ( res ) {
-			Form.jsonData.schemas = $.extend( Form.jsonData.schemas, res );
+		ProcessModel.getModel( 'fetch' ).then( ( res ) => {
+			Form.jsonData.schemas = Object.assign( Form.jsonData.schemas, res );
 
 			removeSchemasPanel();
 
@@ -2753,7 +2749,7 @@ const VisualDataForms = function ( Config, Form, FormID, Schemas, WindowManager
 			action = !hasMultiplePanels() ? 'validate&submit' : 'submit';
 		}
 
-		ProcessModel.getModel( action ).then( async function ( res ) {
+		ProcessModel.getModel( action ).then( async ( res ) => {
 			if ( typeof res === 'boolean' && res === false ) {
 				return;
 			}
@@ -2871,7 +2867,7 @@ const VisualDataForms = function ( Config, Form, FormID, Schemas, WindowManager
 		var self = this;
 		return ProcessDialog.super.prototype.getActionProcess
 			.call( this, action )
-			.next( function () {
+			.next( () => {
 				switch ( action ) {
 					case 'back':
 						var panels = PropertiesStack.getItems();
@@ -2887,7 +2883,7 @@ const VisualDataForms = function ( Config, Form, FormID, Schemas, WindowManager
 						);
 						break;
 					case 'validate':
-						ProcessModel.getModel( 'validate' ).then( function ( res ) {
+						ProcessModel.getModel( 'validate' ).then( ( res ) => {
 							if ( typeof res === 'boolean' ) {
 								return;
 							}
@@ -2903,7 +2899,7 @@ const VisualDataForms = function ( Config, Form, FormID, Schemas, WindowManager
 					case 'validate&submit':
 					case 'submit':
 					case 'delete':
-						return ProcessModel.getModel( action ).then( function ( res ) {
+						return ProcessModel.getModel( action ).then( ( res ) => {
 							if ( action.indexOf( 'submit' ) !== 1 && typeof res === 'boolean' ) {
 								return;
 							}
@@ -2916,7 +2912,7 @@ const VisualDataForms = function ( Config, Form, FormID, Schemas, WindowManager
 							return new Promise( ( resolve, reject ) => {
 								new mw.Api()
 									.postWithToken( 'csrf', payload )
-									.done( function ( thisRes ) {
+									.done( ( thisRes ) => {
 										resolve();
 										if ( payload.action in thisRes ) {
 											var data = JSON.parse( thisRes[ payload.action ].result );
@@ -2939,7 +2935,7 @@ const VisualDataForms = function ( Config, Form, FormID, Schemas, WindowManager
 											}
 										}
 									} )
-									.fail( function ( thisRes ) {
+									.fail( ( thisRes ) => {
 										// eslint-disable-next-line no-console
 										console.error( 'visualdata-submit-form', res );
 										reject( thisRes );
@@ -2962,7 +2958,7 @@ const VisualDataForms = function ( Config, Form, FormID, Schemas, WindowManager
 	ProcessDialog.prototype.getTeardownProcess = function ( data ) {
 		return ProcessDialog.super.prototype.getTeardownProcess
 			.call( this, data )
-			.first( function () {
+			.first( () => {
 				WindowManager.removeActiveWindow();
 			}, this );
 	};
@@ -2979,7 +2975,7 @@ const VisualDataForms = function ( Config, Form, FormID, Schemas, WindowManager
 	};
 
 	function getFormAttributes( jsondata ) {
-		return $.extend(
+		return Object.assign(
 			{
 				formID: FormID,
 				config: Config
@@ -3084,7 +3080,7 @@ const VisualDataForms = function ( Config, Form, FormID, Schemas, WindowManager
 					flags: [ 'primary', 'progressive' ]
 				} );
 
-				editButton.on( 'click', function () {
+				editButton.on( 'click', () => {
 					initializePropertiesStack();
 
 					var thisClasses = [];
@@ -3118,7 +3114,7 @@ const VisualDataForms = function ( Config, Form, FormID, Schemas, WindowManager
 				widget = button;
 			}
 
-			button.on( 'click', function () {
+			button.on( 'click', () => {
 				var args = [ Form.options.value ];
 
 				if ( Form.options.schema !== '' && schemaHasData( Form.options.schema ) ) {
@@ -3147,7 +3143,7 @@ const VisualDataForms = function ( Config, Form, FormID, Schemas, WindowManager
 				label: Form.options.title
 			} );
 
-			popupButton.on( 'click', function () {
+			popupButton.on( 'click', () => {
 				initializePropertiesStack();
 
 				var thisClasses = [];
@@ -3215,8 +3211,8 @@ const VisualDataForms = function ( Config, Form, FormID, Schemas, WindowManager
 			// type: "submit",
 		} );
 
-		ValidateButton.on( 'click', function () {
-			ProcessModel.getModel( 'validate' ).then( function ( res ) {
+		ValidateButton.on( 'click', () => {
+			ProcessModel.getModel( 'validate' ).then( ( res ) => {
 				if ( typeof res === 'boolean' && res === false ) {
 					return;
 				}
@@ -3254,7 +3250,7 @@ const VisualDataForms = function ( Config, Form, FormID, Schemas, WindowManager
 			icon: 'arrowPrevious'
 		} );
 
-		GoBackButton.on( 'click', function () {
+		GoBackButton.on( 'click', () => {
 			var thisPanels = PropertiesStack.getItems();
 			PropertiesStack.setItem( thisPanels[ 0 ] );
 
@@ -3436,7 +3432,7 @@ const VisualDataForms = function ( Config, Form, FormID, Schemas, WindowManager
 	};
 };
 
-$( function () {
+$( () => {
 	var schemas = JSON.parse( mw.config.get( 'visualdata-schemas' ) );
 	// console.log("schemas", schemas);
 
@@ -3464,7 +3460,7 @@ $( function () {
 
 			var form = pageForms[ formID ];
 
-			form = $.extend(
+			form = Object.assign(
 				{
 					freetext: '',
 					jsonData: {},
@@ -3483,7 +3479,7 @@ $( function () {
 			}
 
 			if ( formID in submissionData ) {
-				form = $.extend(
+				form = Object.assign(
 					form,
 					submissionData[ formID ]
 				);
@@ -3514,7 +3510,7 @@ $( function () {
 		var MutationObserver = window.MutationObserver || window.WebKitMutationObserver;
 
 		if ( MutationObserver ) {
-			var observer = new MutationObserver( function ( mutations, thisObserver ) {
+			var observer = new MutationObserver( ( mutations, thisObserver ) => {
 				for ( var instance of instances ) {
 					instance.mutationChange();
 				}
@@ -3533,7 +3529,7 @@ $( function () {
 		VisualData.setVars( config, schemas, init() );
 
 	} else {
-		mw.loader.using( 'ext.VisualData.ManageSchemas', function () {
+		mw.loader.using( 'ext.VisualData.ManageSchemas', () => {
 			var instances = init();
 			VisualData.setVars( config, schemas, instances );
 			VisualDataSchemas.setVars(
diff --git a/resources/VisualDataFunctions.js b/resources/VisualDataFunctions.js
index 1129b81..57ecea6 100644
--- a/resources/VisualDataFunctions.js
+++ b/resources/VisualDataFunctions.js
@@ -437,7 +437,7 @@ VisualDataFunctions = ( function () {
 		var Input = function ( configInput ) {
 			Input.super.call(
 				this,
-				jQuery.extend( configInput, { indicator: 'required' } )
+				Object.assign( configInput, { indicator: 'required' } )
 			);
 			this.constructorName = constructor.name;
 		};
@@ -483,7 +483,7 @@ VisualDataFunctions = ( function () {
 		var ret = {};
 		Object.keys( object )
 			.sort()
-			.forEach( function ( key ) {
+			.forEach( ( key ) => {
 				ret[ key ] = object[ key ];
 			} );
 		return ret;
@@ -575,8 +575,8 @@ VisualDataFunctions = ( function () {
 	}
 
 	function createToolGroup( toolFactory, groupName, tools ) {
-		tools.forEach( function ( tool ) {
-			var obj = jQuery.extend( {}, tool );
+		tools.forEach( ( tool ) => {
+			var obj = Object.assign( {}, tool );
 			obj.group = groupName;
 			var config = tool.config ? tool.config : {};
 			delete obj.config;
@@ -666,7 +666,7 @@ VisualDataFunctions = ( function () {
 
 		// @TODO or return promise
 		return windowManager
-			.openWindow( 'message', $.extend( obj, options ) )
+			.openWindow( 'message', Object.assign( obj, options ) )
 			.closed.then( function ( action ) {
 				return action.action === 'accept' && callback ?
 					callback.apply( this, args ) :
@@ -722,7 +722,7 @@ VisualDataFunctions = ( function () {
 	}
 
 	function createDropDownOptions( obj, config ) {
-		var config = jQuery.extend( { key: 'key', value: 'value' }, config || {} );
+		var config = Object.assign( { key: 'key', value: 'value' }, config || {} );
 		var ret = [];
 		for ( var i in obj ) {
 			var label = config.value === 'value' ? obj[ i ] : i;
@@ -746,7 +746,7 @@ VisualDataFunctions = ( function () {
 					callback( resolve, reject );
 				} else {
 					if ( n <= maxAttempts ) {
-						setTimeout( function () {
+						setTimeout( () => {
 							init( ++n );
 						}, 50 );
 					} else if ( callbackMaxAttempts ) {
diff --git a/resources/VisualDataGeolocation.js b/resources/VisualDataGeolocation.js
index 280b8a1..a2051f5 100644
--- a/resources/VisualDataGeolocation.js
+++ b/resources/VisualDataGeolocation.js
@@ -275,7 +275,7 @@ const VisualDataGeolocation = function ( phpConfig, windowManager ) {
 				defaultMaptilerMapConfig
 			);
 
-			maptilerMapConfigButton.on( 'click', function () {
+			maptilerMapConfigButton.on( 'click', () => {
 				VisualDataInputConfigInst.openDialog(
 					Model[ 'maptiler-map-config' ],
 					'maptiler-map',
@@ -305,7 +305,7 @@ const VisualDataGeolocation = function ( phpConfig, windowManager ) {
 				defaultMaptilerGeocodingConfig
 			);
 
-			maptilerGeocodingConfigButton.on( 'click', function () {
+			maptilerGeocodingConfigButton.on( 'click', () => {
 				VisualDataInputConfigInst.openDialog(
 					Model[ 'maptiler-geocoding-config' ],
 					'maptiler-geocoding',
@@ -411,9 +411,7 @@ const VisualDataGeolocation = function ( phpConfig, windowManager ) {
 
 		items.push( longitudeInputHelpField );
 
-		items = items.filter( function ( x ) {
-			return !( 'items' in x ) || x.items.length;
-		} );
+		items = items.filter( ( x ) => !( 'items' in x ) || x.items.length );
 
 		this.isEmpty = !items.length;
 
@@ -537,11 +535,11 @@ const VisualDataGeolocation = function ( phpConfig, windowManager ) {
 
 				VisualDataFunctions.renameObjectKey( ParentObj, CurrentKey, objName );
 
-				ParentObj[ objName ] = $.extend( ParentObj[ objName ], { wiki: obj } );
+				ParentObj[ objName ] = Object.assign( ParentObj[ objName ], { wiki: obj } );
 
 				Callback();
 
-				return new OO.ui.Process( function () {
+				return new OO.ui.Process( () => {
 					dialog.close( { action: action } );
 				} );
 		}
@@ -552,7 +550,7 @@ const VisualDataGeolocation = function ( phpConfig, windowManager ) {
 	ProcessDialog.prototype.getTeardownProcess = function ( data ) {
 		return ProcessDialog.super.prototype.getTeardownProcess
 			.call( this, data )
-			.first( function () {
+			.first( () => {
 				WindowManager.removeActiveWindow();
 			}, this );
 	};
diff --git a/resources/VisualDataInputConfig.js b/resources/VisualDataInputConfig.js
index bd8bbce..a90316b 100644
--- a/resources/VisualDataInputConfig.js
+++ b/resources/VisualDataInputConfig.js
@@ -125,7 +125,7 @@ const VisualDataInputConfig = function ( phpConfig, windowManager ) {
 
 				switch ( inputName ) {
 					case 'mw.widgets.DateInputWidget':
-						return jQuery.extend( ret, {
+						return Object.assign( ret, {
 							precision: [ 'day/month', " Date precision to use, 'day' or 'month'" ],
 							inputFormat: [
 								'string',
@@ -152,7 +152,7 @@ const VisualDataInputConfig = function ( phpConfig, windowManager ) {
 						} );
 
 					case 'mw.widgets.TitleInputWidget':
-						return jQuery.extend( ret, {
+						return Object.assign( ret, {
 							limit: [ 'integer', 'Number of results to show' ],
 							namespace: [ 'integer', 'Namespace to prepend to queries' ],
 							maxLength: [ 'integer', 'Maximum query length' ],
@@ -191,7 +191,7 @@ const VisualDataInputConfig = function ( phpConfig, windowManager ) {
 						} );
 
 					case 'mw.widgets.UserInputWidget':
-						return jQuery.extend( ret, {
+						return Object.assign( ret, {
 							limit: [ 'integer', 'Number of results to show' ]
 						} );
 
@@ -401,25 +401,25 @@ const VisualDataInputConfig = function ( phpConfig, windowManager ) {
 				};
 				switch ( inputName ) {
 					case 'OO.ui.MenuTagMultiselectWidget':
-						return jQuery.extend( ret, {
+						return Object.assign( ret, {
 							clearInputOnChoose: [
 								'boolean',
 								'Clear the text input value when a menu option is chosen'
 							]
 						} );
 					case 'mw.widgets.CategoryMultiselectWidget':
-						return jQuery.extend( ret, {
+						return Object.assign( ret, {
 							limit: [ 'integer', 'Maximum number of results to load' ]
 						} );
 					case 'mw.widgets.TitlesMultiselectWidget':
-						return jQuery.extend( ret, {
+						return Object.assign( ret, {
 							clearInputOnChoose: [ 'boolean', 'clear input on choose' ],
 							inputPosition: [ 'string', 'input position' ],
 
 							allowEditTags: [ 'boolean', 'clear input on choose' ]
 						} );
 					case 'mw.widgets.UsersMultiselectWidget':
-						return jQuery.extend( ret, {
+						return Object.assign( ret, {
 							limit: [ 'integer', 'Number of results to show' ],
 							// name: [
 							// 	'string',
@@ -707,7 +707,7 @@ const VisualDataInputConfig = function ( phpConfig, windowManager ) {
 
 				switch ( inputName ) {
 					case 'mw.widgets.datetime.DateTimeInputWidget':
-						return jQuery.extend( ret, {
+						return Object.assign( ret, {
 							type: [ 'string', "Whether to act like a 'date'" ],
 							required: [ 'boolean', 'Whether a value is required' ],
 							clearable: [ 'boolean', 'Whether to provide for blanking the value.' ],
@@ -973,7 +973,7 @@ const VisualDataInputConfig = function ( phpConfig, windowManager ) {
 
 		// we don't rely anymore on searchWidgetResults.findSelectedItems()
 		// to handle non-visible highlighted items
-		searchWidgetResults.on( 'press', function ( value ) {
+		searchWidgetResults.on( 'press', ( value ) => {
 			if ( value === null ) {
 				return;
 			}
@@ -1034,7 +1034,7 @@ const VisualDataInputConfig = function ( phpConfig, windowManager ) {
 			panelLayout.populateFieldset();
 		}
 
-		return new OO.ui.Process( function () {
+		return new OO.ui.Process( () => {
 			dialog.close( { action: action } );
 		} );
 
@@ -1043,7 +1043,7 @@ const VisualDataInputConfig = function ( phpConfig, windowManager ) {
 	ProcessDialogSearch.prototype.getTeardownProcess = function ( data ) {
 		return ProcessDialogSearch.super.prototype.getTeardownProcess
 			.call( this, data )
-			.first( function () {
+			.first( () => {
 				WindowManager.removeActiveWindow();
 			}, this );
 	};
@@ -1143,9 +1143,7 @@ const VisualDataInputConfig = function ( phpConfig, windowManager ) {
 			);
 		}
 
-		items = items.filter( function ( x ) {
-			return !( 'items' in x ) || x.items.length;
-		} );
+		items = items.filter( ( x ) => !( 'items' in x ) || x.items.length );
 
 		this.isEmpty = !items.length;
 
@@ -1261,7 +1259,7 @@ const VisualDataInputConfig = function ( phpConfig, windowManager ) {
 				}
 
 				Callback.setValue( obj );
-				return new OO.ui.Process( function () {
+				return new OO.ui.Process( () => {
 					dialog.close( { action: action } );
 				} );
 		}
@@ -1272,7 +1270,7 @@ const VisualDataInputConfig = function ( phpConfig, windowManager ) {
 	ProcessDialog.prototype.getTeardownProcess = function ( data ) {
 		return ProcessDialog.super.prototype.getTeardownProcess
 			.call( this, data )
-			.first( function () {
+			.first( () => {
 				WindowManager.removeActiveWindow();
 			}, this );
 	};
diff --git a/resources/VisualDataProcessModel.js b/resources/VisualDataProcessModel.js
index 0b1b920..80e8aa5 100644
--- a/resources/VisualDataProcessModel.js
+++ b/resources/VisualDataProcessModel.js
@@ -19,7 +19,6 @@
  * @copyright Copyright © 2023, https://wikisphere.org
  */
 
-/* eslint-disable no-tabs */
 /* eslint-disable no-unused-vars */
 /* eslint-disable no-underscore-dangle */
 
@@ -128,10 +127,10 @@ const VisualDataProcessModel = function (
 				switch ( error.keyword ) {
 					case 'uniqueItems':
 						if ( Removed.indexOf( `${ VisualDataFunctions.escapeJsonPtr( schemaName ) }${ error.instancePath }/${ error.params.j }` ) === -1 ) {
-							AjvErrors.push( $.extend( VisualDataFunctions.deepCopy( error ), { instancePath: `${ error.instancePath }/${ error.params.i }` } ) );
+							AjvErrors.push( Object.assign( VisualDataFunctions.deepCopy( error ), { instancePath: `${ error.instancePath }/${ error.params.i }` } ) );
 						}
 						if ( Removed.indexOf( `${ VisualDataFunctions.escapeJsonPtr( schemaName ) }${ error.instancePath }/${ error.params.i }` ) === -1 ) {
-							AjvErrors.push( $.extend( VisualDataFunctions.deepCopy( error ), { instancePath: `${ error.instancePath }/${ error.params.j }` } ) );
+							AjvErrors.push( Object.assign( VisualDataFunctions.deepCopy( error ), { instancePath: `${ error.instancePath }/${ error.params.j }` } ) );
 						}
 						break;
 					default:
diff --git a/resources/VisualDataSchemas.js b/resources/VisualDataSchemas.js
index 39a0115..102bb6b 100644
--- a/resources/VisualDataSchemas.js
+++ b/resources/VisualDataSchemas.js
@@ -54,9 +54,7 @@ VisualDataSchemas = ( function () {
 			return ret;
 		}
 		return Object.keys( obj )
-			.map( ( i ) => {
-				return obj[ i ];
-			} )
+			.map( ( i ) => obj[ i ] )
 			.map( ( x ) => x.getValue() );
 	}
 
@@ -128,7 +126,7 @@ VisualDataSchemas = ( function () {
 		var datatable = $( '#' + getDatatableId( panel ) ).DataTable();
 		var ret = {};
 		// eslint-disable-next-line no-unused-vars, array-callback-return
-		datatable.rows().every( function ( rowIdx, tableLoop, rowLoop ) {
+		datatable.rows().every( ( rowIdx, tableLoop, rowLoop ) => {
 			var key = Object.keys( fields )[ rowIdx ];
 			if ( key in fields ) {
 				ret[ key ] = fields[ key ];
@@ -308,9 +306,7 @@ VisualDataSchemas = ( function () {
 			columns: [ '' ].concat(
 				mw.msg( 'visualdata-jsmodule-schemas-properties-columns' )
 					.split( /\s*,\s*/ )
-					.map( function ( x ) {
-						return { title: x };
-					} )
+					.map( ( x ) => ( { title: x } ) )
 			)
 		} );
 
@@ -343,7 +339,7 @@ VisualDataSchemas = ( function () {
 				initializeNestedDataTable( panel );
 			};
 
-			buttonWidgetEdit.on( 'click', function () {
+			buttonWidgetEdit.on( 'click', () => {
 				// switch by subschema type (if array)
 				switch ( thisItem.wiki.type ) {
 					case 'property':
@@ -380,13 +376,13 @@ VisualDataSchemas = ( function () {
 				flags: [ 'destructive' ]
 			} );
 
-			buttonWidgetDelete.on( 'click', function () {
+			buttonWidgetDelete.on( 'click', () => {
 				VisualDataFunctions.OOUIAlert(
 					new OO.ui.HtmlSnippet(
 						mw.msg( 'visualdata-jsmodule-schemas-delete-confirm' )
 					),
 					{ size: 'medium' },
-					function () {
+					() => {
 						delete currentItem[ propName ][ key ];
 						// *** or delete the row manually
 						initializeNestedDataTable( panel );
@@ -534,11 +530,11 @@ VisualDataSchemas = ( function () {
 				this.$body.append( booklet.$element );
 				booklet.setPage( data.initialTab );
 
-				booklet.on( 'set', function ( value ) {
+				booklet.on( 'set', ( value ) => {
 					initPropertiesTab( value.name );
 				} );
 
-				setTimeout( function () {
+				setTimeout( () => {
 					initPropertiesTab( data.initialTab );
 					VisualDataFunctions.removeNbspFromLayoutHeader(
 						'#visualdata-ProcessDialogEditData'
@@ -645,7 +641,7 @@ VisualDataSchemas = ( function () {
 						var callApi = function ( postData, resolve, reject ) {
 							new mw.Api()
 								.postWithToken( 'csrf', postData )
-								.done( function ( res ) {
+								.done( ( res ) => {
 									resolve();
 									if ( payload.action in res ) {
 										var data = res[ payload.action ];
@@ -669,7 +665,7 @@ VisualDataSchemas = ( function () {
 													{ size: 'medium' },
 													callApi,
 													[
-														$.extend( postData, {
+														Object.assign( postData, {
 															'confirm-job-execution': true
 														} ),
 														resolve,
@@ -701,7 +697,7 @@ VisualDataSchemas = ( function () {
 										} );
 									}
 								} )
-								.fail( function ( res ) {
+								.fail( ( res ) => {
 									// eslint-disable-next-line no-console
 									console.error( 'visualdata-save-schema', res );
 									reject( res );
@@ -709,7 +705,7 @@ VisualDataSchemas = ( function () {
 						};
 
 						return new Promise( ( resolve, reject ) => {
-							mw.loader.using( 'mediawiki.api', function () {
+							mw.loader.using( 'mediawiki.api', () => {
 								callApi( payload, resolve, reject );
 							} );
 						} ).catch( ( err ) => {
@@ -725,7 +721,7 @@ VisualDataSchemas = ( function () {
 	ProcessDialog.prototype.getTeardownProcess = function ( data ) {
 		return ProcessDialog.super.prototype.getTeardownProcess
 			.call( this, data )
-			.first( function () {
+			.first( () => {
 				Models.pop();
 				SelectedItems.pop();
 				WindowManager.removeActiveWindow();
@@ -814,7 +810,7 @@ VisualDataSchemas = ( function () {
 		] );
 		booklet.setPage( 'page1' );
 
-		booklet.on( 'set', function ( value ) {
+		booklet.on( 'set', ( value ) => {
 			if (
 				value.name !== 'page1' &&
 				!$.fn.DataTable.isDataTable( '#' + getDatatableId( value.name ) )
@@ -826,7 +822,7 @@ VisualDataSchemas = ( function () {
 
 		this.$body.append( booklet.$element );
 
-		setTimeout( function () {
+		setTimeout( () => {
 			VisualDataFunctions.removeNbspFromLayoutHeader(
 				'#visualdata-ProcessDialogEditProperties'
 			);
@@ -849,7 +845,7 @@ VisualDataSchemas = ( function () {
 		) {
 			if ( obj[ 'multiple-items' ] ) {
 				currentItem.wiki = parentSchema;
-				currentItem.items = $.extend( currentItem.items, { wiki: obj } );
+				currentItem.items = Object.assign( currentItem.items, { wiki: obj } );
 				return currentItem;
 			}
 
@@ -860,7 +856,7 @@ VisualDataSchemas = ( function () {
 		// move child to parent
 		if ( !obj[ 'multiple-items' ] ) {
 			// currentItem.type should be always array
-			return $.extend(
+			return Object.assign(
 				currentItem.type === 'array' ? currentItem.items : currentItem,
 				{ wiki: obj }
 			);
@@ -870,7 +866,7 @@ VisualDataSchemas = ( function () {
 		return {
 			type: 'array',
 			wiki: parentSchema,
-			items: $.extend( currentItem, { wiki: obj } )
+			items: Object.assign( currentItem, { wiki: obj } )
 		};
 	}
 
@@ -989,7 +985,7 @@ VisualDataSchemas = ( function () {
 				break;
 		}
 
-		return new OO.ui.Process( function () {
+		return new OO.ui.Process( () => {
 			dialog.close( { action: action } );
 		} );
 
@@ -1000,7 +996,7 @@ VisualDataSchemas = ( function () {
 		var self = this;
 		return ProcessDialogNested.super.prototype.getTeardownProcess
 			.call( this, data )
-			.first( function () {
+			.first( () => {
 				Models.pop();
 				SelectedItems.pop();
 				initializeNestedDataTable( self.data.propName );
@@ -1307,7 +1303,7 @@ VisualDataSchemas = ( function () {
 		layoutParentSchema.toggle( multipleItemsInputValue );
 		nameInput.setDisabled( multipleItemsInputValue );
 
-		multipleItemsInput.on( 'change', function ( enabled ) {
+		multipleItemsInput.on( 'change', ( enabled ) => {
 			layoutParentSchema.toggle( enabled );
 			nameInput.setDisabled( enabled );
 		} );
@@ -1398,7 +1394,7 @@ VisualDataSchemas = ( function () {
 			} );
 		} else {
 			SelectedItems.push(
-				jQuery.extend(
+				Object.assign(
 					{
 						properties: {},
 
@@ -1461,7 +1457,7 @@ VisualDataSchemas = ( function () {
 			VisualDataFunctions.OOUIAlert( new OO.ui.HtmlSnippet( mw.msg( 'visualdata-jsmodule-missing-json-diff-library' ) ), {
 				size: 'medium',
 				actions: [ OO.ui.MessageDialog.static.actions[ 0 ] ]
-			}, function () {
+			}, () => {
 				// 15 days
 				var timeLapse = 15 * 86400;
 				mw.cookie.set( 'visualdata-check-json-diff-library', true, {
@@ -1510,9 +1506,7 @@ VisualDataSchemas = ( function () {
 			columns: mw
 				.msg( 'visualdata-jsmodule-schemas-columns' )
 				.split( /\s*,\s*/ )
-				.map( function ( x ) {
-					return { title: x };
-				} )
+				.map( ( x ) => ( { title: x } ) )
 		} );
 
 		DataTable.on( 'click', 'tr', function () {
@@ -1526,7 +1520,7 @@ VisualDataSchemas = ( function () {
 
 	function openSchemaDialog( label, initialTab ) {
 		if ( !Object.keys( Schemas[ label ] ).length ) {
-			VisualData.loadSchemas( [ label ] ).then( function ( schemas ) {
+			VisualData.loadSchemas( [ label ] ).then( ( schemas ) => {
 				for ( var i in schemas ) {
 					Schemas[ i ] = schemas[ i ];
 				}
@@ -1738,7 +1732,7 @@ VisualDataSchemas = ( function () {
 	};
 }() );
 
-$( function () {
+$( () => {
 	var config = JSON.parse( mw.config.get( 'visualdata-config' ) );
 	// console.log("config", config);
 
diff --git a/resources/VisualDataUpload.js b/resources/VisualDataUpload.js
index a131aa0..b571f73 100644
--- a/resources/VisualDataUpload.js
+++ b/resources/VisualDataUpload.js
@@ -94,20 +94,20 @@
 		// this.upload.setFilename(  this.selectFileWidget.getValue().name );
 
 		this.upload.upload().then(
-			function ( res ) {
+			( res ) => {
 				deferred.resolve();
 				layout.parentWidget.emit( 'fileUploadComplete', file, res );
 			},
-			function () {
+			() => {
 				// These errors will be thrown while the user is on the info page.
-				layout.getErrorMessageForStateDetails().then( function ( errorMessage ) {
+				layout.getErrorMessageForStateDetails().then( ( errorMessage ) => {
 					// eslint-disable-next-line no-console
 					console.error( 'errorMessage', errorMessage );
 					deferred.reject( errorMessage );
 					layout.parentWidget.emit( 'fileUploadErrorMessage', file, errorMessage );
 				} );
 			},
-			function ( progress ) {
+			( progress ) => {
 				var elapsedTime = mw.now() - startTime,
 					estimatedTotalTime = ( 1 / progress ) * elapsedTime,
 					estimatedRemainingTime = moment.duration(
@@ -125,7 +125,7 @@
 		);
 
 		// cancel uploading
-		deferred.fail( function ( res ) {
+		deferred.fail( ( res ) => {
 			// layout.setPage( 'upload' );
 			layout.parentWidget.emit( 'fileUploadFail', file, res );
 		} );
@@ -174,7 +174,7 @@
 					)
 				);
 			} else if ( Array.isArray( warnings.duplicate ) ) {
-				warnings.duplicate.forEach( function ( filename ) {
+				warnings.duplicate.forEach( ( filename ) => {
 					var $a = $( '<a>' ).text( filename ),
 						href = mw.Title.makeTitle(
 							mw.config.get( 'wgNamespaceIds' ).file,
@@ -257,7 +257,7 @@
 		// Validation (if the SFW is for a stashed file, this never fires)
 		this.selectFileWidget.on( 'change', this.onUploadFormChange.bind( this ) );
 
-		this.selectFileWidget.on( 'change', function () {
+		this.selectFileWidget.on( 'change', () => {
 			layout.updateFilePreview();
 		} );
 
@@ -280,16 +280,16 @@
 		this.selectFileWidget
 			.loadAndGetImageUrl()
 			.done(
-				function ( url ) {
+				( url ) => {
 					this.filePreview.$element.find( 'p' ).remove();
 					this.filePreview.$element.css( 'background-image', 'url(' + url + ')' );
 					this.infoForm.$element.addClass(
 						'mw-upload-bookletLayout-hasThumbnail'
 					);
-				}.bind( this )
+				}
 			)
 			.fail(
-				function () {
+				() => {
 					this.filePreview.$element.find( 'p' ).remove();
 					if ( this.selectFileWidget.getValue() ) {
 						this.filePreview.$element.append(
@@ -300,7 +300,7 @@
 					this.infoForm.$element.removeClass(
 						'mw-upload-bookletLayout-hasThumbnail'
 					);
-				}.bind( this )
+				}
 			);
 	};
 
@@ -353,9 +353,9 @@
 
 		this.on(
 			'fileUploadProgress',
-			function ( progress ) {
+			( progress ) => {
 				this.progressBarWidget.setProgress( progress * 100 );
-			}.bind( this )
+			}
 		);
 
 		this.filenameWidget.on( 'change', this.onInfoFormChange.bind( this ) );
@@ -370,10 +370,10 @@
 			this.filenameWidget.getValidity(),
 			this.descriptionWidget.getValidity()
 		)
-			.done( function () {
+			.done( () => {
 				layout.emit( 'infoValid', true );
 			} )
-			.fail( function () {
+			.fail( () => {
 				layout.emit( 'infoValid', false );
 			} );
 	};
diff --git a/resources/VisualDataWindowManager.js b/resources/VisualDataWindowManager.js
index 9f4b647..aca33ee 100644
--- a/resources/VisualDataWindowManager.js
+++ b/resources/VisualDataWindowManager.js
@@ -20,7 +20,6 @@
  */
 
 // @see https://doc.wikimedia.org/oojs-ui/master/js/
-// eslint-disable-next-line no-unused-vars
 
 // eslint-disable-next-line no-implicit-globals
 VisualDataWindowManager = function () {
diff --git a/resources/Widgets/VisualDataButtonMultiselectWidget.js b/resources/Widgets/VisualDataButtonMultiselectWidget.js
index fe04060..72f557f 100644
--- a/resources/Widgets/VisualDataButtonMultiselectWidget.js
+++ b/resources/Widgets/VisualDataButtonMultiselectWidget.js
@@ -48,7 +48,7 @@
 				value: $.inArray( this.options[ i ], config.selected ) !== -1
 			} );
 
-			this.items[ i ].on( 'change', function () {
+			this.items[ i ].on( 'change', () => {
 				self.emit( 'change', self.getValue().join().trim() );
 			} );
 		}
diff --git a/resources/Widgets/VisualDataDropdownWidget.js b/resources/Widgets/VisualDataDropdownWidget.js
index 50f9133..962a738 100644
--- a/resources/Widgets/VisualDataDropdownWidget.js
+++ b/resources/Widgets/VisualDataDropdownWidget.js
@@ -46,7 +46,7 @@
 
 		this.select = select;
 
-		select.on( 'change', function () {
+		select.on( 'change', () => {
 			self.emit( 'change', self.getValue() );
 		} );
 
diff --git a/resources/Widgets/VisualDataMaptiler.js b/resources/Widgets/VisualDataMaptiler.js
index b2f043a..cc32c0f 100644
--- a/resources/Widgets/VisualDataMaptiler.js
+++ b/resources/Widgets/VisualDataMaptiler.js
@@ -44,7 +44,7 @@
 		var zoomInput = data.model.properties.zoom.input;
 		var mapId = 'visualdata-maptiler-map-' + data.path;
 
-		VisualDataFunctions.loadScripts( this.scripts, function ( e ) {
+		VisualDataFunctions.loadScripts( this.scripts, ( e ) => {
 			if ( $( '#' + jQuery.escapeSelector( mapId ) ).length ) {
 				return;
 			}
@@ -113,14 +113,14 @@
 
 			function onDragEnd() {
 				var lngLat = marker.getLngLat();
-				setTimeout( function () {
+				setTimeout( () => {
 					lngInput.setValue( lngLat.lng );
 					latInput.setValue( lngLat.lat );
 					zoomInput.setValue( map.getZoom() );
 				}, 100 );
 			}
 
-			map.on( 'load', function () {
+			map.on( 'load', () => {
 				if ( !marker ) {
 					marker = new maptilersdk.Marker( {
 						draggable: true
@@ -143,10 +143,10 @@
 			}
 
 			// update marker
-			data.model.properties.latitude.input.on( 'change', function ( value ) {
+			data.model.properties.latitude.input.on( 'change', ( value ) => {
 				marker.setLngLat( [ lngInput.getValue(), value ] );
 			} );
-			data.model.properties.longitude.input.on( 'change', function ( value ) {
+			data.model.properties.longitude.input.on( 'change', ( value ) => {
 				marker.setLngLat( [ value, latInput.getValue() ] );
 			} );
 
diff --git a/resources/Widgets/VisualDataMenuTagSearchMultiselect.js b/resources/Widgets/VisualDataMenuTagSearchMultiselect.js
index 7f1fd67..9669f3a 100644
--- a/resources/Widgets/VisualDataMenuTagSearchMultiselect.js
+++ b/resources/Widgets/VisualDataMenuTagSearchMultiselect.js
@@ -55,7 +55,7 @@
 		// Mixin constructors
 		OO.ui.mixin.PendingElement.call(
 			this,
-			$.extend( {}, config, { $pending: this.$handle } )
+			Object.assign( {}, config, { $pending: this.$handle } )
 		);
 
 		// Event handler to call the autocomplete methods
@@ -95,7 +95,7 @@
 		function () {
 			this.getMenu().clearItems();
 			this.getNewMenuItems( this.input.$input.val() ).then(
-				function ( items ) {
+				( items ) => {
 					var existingItems,
 						menu = this.getMenu();
 
@@ -105,9 +105,7 @@
 					}
 
 					// Array of strings of the data of OO.ui.MenuOptionsWidgets
-					existingItems = menu.getItems().map( function ( item ) {
-						return item.data;
-					} );
+					existingItems = menu.getItems().map( ( item ) => item.data );
 
 					// Remove if items' data already exists
 					for ( var i in items ) {
@@ -128,7 +126,7 @@
 					}
 
 					menu.addItems( ret ).toggle( true );
-				}.bind( this )
+				}
 			);
 		};
 
diff --git a/resources/Widgets/VisualDataTinyMCE.js b/resources/Widgets/VisualDataTinyMCE.js
index d30f373..e82c70e 100644
--- a/resources/Widgets/VisualDataTinyMCE.js
+++ b/resources/Widgets/VisualDataTinyMCE.js
@@ -19,7 +19,6 @@
  * @copyright Copyright © 2024, https://wikisphere.org
  */
 
-/* eslint-disable no-tabs */
 /* eslint-disable no-unused-vars */
 
 ( function () {
diff --git a/resources/Widgets/VisualDataVisualEditor.js b/resources/Widgets/VisualDataVisualEditor.js
index 780a786..99348d7 100644
--- a/resources/Widgets/VisualDataVisualEditor.js
+++ b/resources/Widgets/VisualDataVisualEditor.js
@@ -49,7 +49,7 @@
 		this.Editor = null;
 		this.initialized = false;
 
-		setTimeout( function () {
+		setTimeout( () => {
 			if ( self.$element.parent().is( ':visible' ) ) {
 				self.initialize();
 			}
@@ -68,7 +68,7 @@
 		var self = this;
 		self.initialized = true;
 
-		this.loadVEForAll().then( function () {
+		this.loadVEForAll().then( () => {
 			// if (!self.isHtml) {
 			// 	return;
 			// }
@@ -107,7 +107,7 @@
 			resolve();
 		};
 		var callbackMaxAttempts = function ( resolve, reject ) {
-			jQuery( document ).on( 'VEForAllLoaded', function ( e ) {
+			jQuery( document ).on( 'VEForAllLoaded', ( e ) => {
 				self.textarea.applyVisualEditor();
 				resolve();
 			} );
@@ -161,7 +161,7 @@
 		// }
 
 		return new Promise( ( resolve, reject ) => {
-			$.when( editor.updateContent() ).then( function () {
+			$.when( editor.updateContent() ).then( () => {
 				// @see ext.veforall.target.js
 				// *** sometimes convertToWikiText is not called
 				// based on focus
diff --git a/resources/Widgets/VisualDataintlTelInput.js b/resources/Widgets/VisualDataintlTelInput.js
index 699a8f1..7cf401a 100644
--- a/resources/Widgets/VisualDataintlTelInput.js
+++ b/resources/Widgets/VisualDataintlTelInput.js
@@ -52,7 +52,7 @@
 		// 	self.emit("change", self.config.value);
 		// });
 
-		input.on( 'blur', function () {
+		input.on( 'blur', () => {
 			self.formatNumber();
 		} );
 
@@ -67,20 +67,18 @@
 
 		self.iti = window.intlTelInput(
 			input.get( 0 ),
-			$.extend(
+			Object.assign(
 				{
 					utilsScript:
 						'https://cdn.jsdelivr.net/npm/intl-tel-input@18.3.3/build/js/utils.js',
 					initialCountry: 'auto',
 					geoIpLookup: function ( callback ) {
 						fetch( 'https://ipapi.co/json' )
-							.then( function ( res ) {
-								return res.json();
-							} )
-							.then( function ( data ) {
+							.then( ( res ) => res.json() )
+							.then( ( data ) => {
 								callback( data.country_code );
 							} )
-							.catch( function () {
+							.catch( () => {
 								callback( 'us' );
 							} );
 					}
-- 
2.39.2

$ date
--- stdout ---
Wed Jul 24 04:27:09 UTC 2024

--- end ---
$ git clone file:///srv/git/mediawiki-extensions-VisualData.git repo --depth=1 -b master
--- stderr ---
Cloning into 'repo'...
--- stdout ---

--- end ---
$ git config user.name libraryupgrader
--- stdout ---

--- end ---
$ git config user.email tools.libraryupgrader@tools.wmflabs.org
--- stdout ---

--- end ---
$ git submodule update --init
--- stdout ---

--- end ---
$ grr init
--- stdout ---
Installed commit-msg hook.

--- end ---
$ git show-ref refs/heads/master
--- stdout ---
541a7bb3893565e08058ae32b5bd13ae8edc26b2 refs/heads/master

--- end ---
$ /usr/bin/npm audit --json
--- stdout ---
{
  "auditReportVersion": 2,
  "vulnerabilities": {
    "braces": {
      "name": "braces",
      "severity": "high",
      "isDirect": false,
      "via": [
        {
          "source": 1098094,
          "name": "braces",
          "dependency": "braces",
          "title": "Uncontrolled resource consumption in braces",
          "url": "https://github.com/advisories/GHSA-grv7-fg5c-xmjg",
          "severity": "high",
          "cwe": [
            "CWE-400",
            "CWE-1050"
          ],
          "cvss": {
            "score": 7.5,
            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H"
          },
          "range": "<3.0.3"
        }
      ],
      "effects": [],
      "range": "<3.0.3",
      "nodes": [
        "node_modules/braces"
      ],
      "fixAvailable": true
    }
  },
  "metadata": {
    "vulnerabilities": {
      "info": 0,
      "low": 0,
      "moderate": 0,
      "high": 1,
      "critical": 0,
      "total": 1
    },
    "dependencies": {
      "prod": 1,
      "dev": 436,
      "optional": 0,
      "peer": 10,
      "peerOptional": 0,
      "total": 436
    }
  }
}

--- end ---
$ /usr/bin/composer install
--- stderr ---
No composer.lock file present. Updating dependencies to latest instead of installing from lock file. See https://getcomposer.org/install for more information.
Loading composer repositories with package information
Updating dependencies
Lock file operations: 23 installs, 0 updates, 0 removals
  - Locking composer/semver (3.4.0)
  - Locking composer/spdx-licenses (1.5.8)
  - Locking dealerdirect/phpcodesniffer-composer-installer (v1.0.0)
  - Locking mediawiki/mediawiki-codesniffer (v43.0.0)
  - Locking mediawiki/minus-x (1.1.1)
  - Locking php-parallel-lint/php-console-color (v1.0.1)
  - Locking php-parallel-lint/php-console-highlighter (v1.0.0)
  - Locking php-parallel-lint/php-parallel-lint (v1.3.2)
  - Locking phpcsstandards/phpcsextra (1.1.2)
  - Locking phpcsstandards/phpcsutils (1.0.9)
  - Locking psr/container (2.0.2)
  - Locking squizlabs/php_codesniffer (3.8.1)
  - Locking swaggest/json-diff (v3.11.0)
  - Locking symfony/console (v5.4.41)
  - Locking symfony/deprecation-contracts (v3.5.0)
  - Locking symfony/polyfill-ctype (v1.30.0)
  - Locking symfony/polyfill-intl-grapheme (v1.30.0)
  - Locking symfony/polyfill-intl-normalizer (v1.30.0)
  - Locking symfony/polyfill-mbstring (v1.30.0)
  - Locking symfony/polyfill-php73 (v1.30.0)
  - Locking symfony/polyfill-php80 (v1.30.0)
  - Locking symfony/service-contracts (v3.5.0)
  - Locking symfony/string (v6.4.9)
Writing lock file
Installing dependencies from lock file (including require-dev)
Package operations: 23 installs, 0 updates, 0 removals
    0 [>---------------------------]    0 [->--------------------------]
  - Installing squizlabs/php_codesniffer (3.8.1): Extracting archive
  - Installing dealerdirect/phpcodesniffer-composer-installer (v1.0.0): Extracting archive
  - Installing symfony/polyfill-php80 (v1.30.0): Extracting archive
  - Installing phpcsstandards/phpcsutils (1.0.9): Extracting archive
  - Installing phpcsstandards/phpcsextra (1.1.2): Extracting archive
  - Installing symfony/polyfill-mbstring (v1.30.0): Extracting archive
  - Installing composer/spdx-licenses (1.5.8): Extracting archive
  - Installing composer/semver (3.4.0): Extracting archive
  - Installing mediawiki/mediawiki-codesniffer (v43.0.0): Extracting archive
  - Installing symfony/polyfill-intl-normalizer (v1.30.0): Extracting archive
  - Installing symfony/polyfill-intl-grapheme (v1.30.0): Extracting archive
  - Installing symfony/polyfill-ctype (v1.30.0): Extracting archive
  - Installing symfony/string (v6.4.9): Extracting archive
  - Installing symfony/deprecation-contracts (v3.5.0): Extracting archive
  - Installing psr/container (2.0.2): Extracting archive
  - Installing symfony/service-contracts (v3.5.0): Extracting archive
  - Installing symfony/polyfill-php73 (v1.30.0): Extracting archive
  - Installing symfony/console (v5.4.41): Extracting archive
  - Installing mediawiki/minus-x (1.1.1): Extracting archive
  - Installing php-parallel-lint/php-console-color (v1.0.1): Extracting archive
  - Installing php-parallel-lint/php-console-highlighter (v1.0.0): Extracting archive
  - Installing php-parallel-lint/php-parallel-lint (v1.3.2): Extracting archive
  - Installing swaggest/json-diff (v3.11.0): Extracting archive
  0/21 [>---------------------------]   0%
 20/21 [==========================>-]  95%
 21/21 [============================] 100%
4 package suggestions were added by new dependencies, use `composer suggest` to see details.
Generating autoload files
14 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
--- stdout ---
PHP CodeSniffer Config installed_paths set to ../../mediawiki/mediawiki-codesniffer,../../phpcsstandards/phpcsextra,../../phpcsstandards/phpcsutils

--- end ---
Upgrading n:eslint-config-wikimedia from 0.26.0 -> 0.28.2
Upgrading n:grunt-banana-checker from 0.11.1 -> 0.13.0
Upgrading n:grunt-stylelint from 0.19.0 -> 0.20.1
Upgrading n:stylelint-config-wikimedia from 0.16.1 -> 0.17.2
$ /usr/bin/npm install
--- stderr ---
npm WARN deprecated @humanwhocodes/config-array@0.11.14: Use @eslint/config-array instead
npm WARN deprecated @humanwhocodes/object-schema@2.0.3: Use @eslint/object-schema instead
--- stdout ---

added 419 packages, and audited 420 packages in 6s

90 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities

--- end ---
$ package-lock-lint package-lock.json
--- stdout ---
Checking package-lock.json

--- end ---
$ /usr/bin/npm install grunt-eslint@24.3.0 --save-exact
--- stdout ---

up to date, audited 420 packages in 1s

90 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities

--- end ---
$ package-lock-lint package-lock.json
--- stdout ---
Checking package-lock.json

--- end ---
$ ./node_modules/.bin/eslint resources/VisualData.js resources/VisualDataDatatables.js resources/Widgets/VisualDataButtonMultiselectWidget.js resources/Widgets/VisualDataMaptiler.js resources/VisualDataFunctions.js resources/VisualDataProcessModel.js resources/Widgets/VisualDataMenuTagSearchMultiselect.js resources/VisualDataFormField.js i18n/de.json resources/Widgets/VisualDataRatingWidget.js resources/VisualDataForms.js extension.json resources/Widgets/VisualDataTinyMCE.js resources/Widgets/VisualDataintlTelInput.js composer.json Gruntfile.js resources/VisualDataWindowManager.js resources/Widgets/VisualDataLookupElement.js resources/VisualDataInputConfig.js resources/VisualDataGeolocation.js resources/VersionCheck.js resources/VisualDataContentBlock.js resources/VisualDataSchemas.js resources/Widgets/VisualDataVisualEditor.js package.json i18n/qqq.json i18n/en.json resources/VisualDataUpload.js resources/Widgets/VisualDataDropdownWidget.js package-lock.json --fix
--- stdout ---

/src/repo/resources/VersionCheck.js
  57:22  warning  Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible  no-jquery/no-global-selector
  62:18  warning  Prefer DOM building to parsing HTML literals                                        no-jquery/no-parse-html-literal
  65:9   warning  Where possible, maintain application state in JS to avoid slower DOM queries        no-jquery/no-class-state

/src/repo/resources/VisualDataDatatables.js
  45:2  warning  Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible  no-jquery/no-global-selector
  48:7  warning  jQuery collection names must match the variablePattern                              no-jquery/variable-pattern

/src/repo/resources/VisualDataFormField.js
  1082:4  warning  Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible  no-jquery/no-global-selector

/src/repo/resources/VisualDataForms.js
    71:6   warning  Selector extensions are not allowed                                                 no-jquery/no-sizzle
    80:1   warning  This line has a length of 106. Maximum allowed is 100                               max-len
   209:5   warning  Selector extensions are not allowed                                                 no-jquery/no-sizzle
   408:1   warning  This line has a length of 110. Maximum allowed is 100                               max-len
   510:1   warning  This line has a length of 117. Maximum allowed is 100                               max-len
   527:1   warning  This line has a length of 131. Maximum allowed is 100                               max-len
  1362:26  warning  Prefer DOM building to parsing HTML literals                                        no-jquery/no-parse-html-literal
  1430:6   warning  Prefer DOM building to parsing HTML literals                                        no-jquery/no-parse-html-literal
  1433:7   warning  Prefer DOM building to parsing HTML literals                                        no-jquery/no-parse-html-literal
  1436:7   warning  Prefer DOM building to parsing HTML literals                                        no-jquery/no-parse-html-literal
  1465:7   warning  Prefer DOM building to parsing HTML literals                                        no-jquery/no-parse-html-literal
  1468:8   warning  Prefer DOM building to parsing HTML literals                                        no-jquery/no-parse-html-literal
  1471:8   warning  Prefer DOM building to parsing HTML literals                                        no-jquery/no-parse-html-literal
  2097:5   warning  Prefer DOM building to parsing HTML literals                                        no-jquery/no-parse-html-literal
  2254:1   warning  This line has a length of 107. Maximum allowed is 100                               max-len
  2396:1   warning  This line has a length of 109. Maximum allowed is 100                               max-len
  2726:1   warning  This line has a length of 102. Maximum allowed is 100                               max-len
  2744:7   warning  jQuery collection names must match the variablePattern                              no-jquery/variable-pattern
  2918:1   warning  This line has a length of 102. Maximum allowed is 100                               max-len
  3042:10  warning  Selector extensions are not allowed                                                 no-jquery/no-sizzle
  3122:1   warning  This line has a length of 108. Maximum allowed is 100                               max-len
  3127:1   warning  This line has a length of 105. Maximum allowed is 100                               max-len
  3347:15  warning  Prefer DOM building to parsing HTML literals                                        no-jquery/no-parse-html-literal
  3371:1   warning  This line has a length of 119. Maximum allowed is 100                               max-len
  3418:3   warning  Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible  no-jquery/no-global-selector

/src/repo/resources/VisualDataInputConfig.js
  838:1  warning  This line has a length of 110. Maximum allowed is 100  max-len

/src/repo/resources/VisualDataProcessModel.js
  159:11  warning  Selector extensions are not allowed  no-jquery/no-sizzle

/src/repo/resources/VisualDataSchemas.js
   327:1   warning  This line has a length of 103. Maximum allowed is 100                               max-len
  1496:15  warning  Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible  no-jquery/no-global-selector
  1671:4   warning  Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible  no-jquery/no-global-selector
  1674:15  warning  Prefer DOM building to parsing HTML literals                                        no-jquery/no-parse-html-literal
  1690:4   warning  Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible  no-jquery/no-global-selector

/src/repo/resources/Widgets/VisualDataButtonMultiselectWidget.js
  48:12  warning  Prefer Array#indexOf to $.inArray  no-jquery/no-in-array

/src/repo/resources/Widgets/VisualDataDropdownWidget.js
  38:7  warning  jQuery collection names must match the variablePattern  no-jquery/variable-pattern
  53:7  warning  jQuery collection names must match the variablePattern  no-jquery/variable-pattern

/src/repo/resources/Widgets/VisualDataMaptiler.js
  61:1  warning  This line has a length of 119. Maximum allowed is 100  max-len

/src/repo/resources/Widgets/VisualDataMenuTagSearchMultiselect.js
  29:1  warning  Invalid JSDoc tag name "mixins"                        jsdoc/check-tag-names
  49:1  warning  This line has a length of 110. Maximum allowed is 100  max-len
  50:1  warning  This line has a length of 107. Maximum allowed is 100  max-len

/src/repo/resources/Widgets/VisualDataRatingWidget.js
  38:19  warning  Prefer DOM building to parsing HTML literals            no-jquery/no-parse-html-literal
  45:8   warning  jQuery collection names must match the variablePattern  no-jquery/variable-pattern
  67:6   warning  Selector extensions are not allowed                     no-jquery/no-sizzle

/src/repo/resources/Widgets/VisualDataTinyMCE.js
  38:3   warning  jQuery collection names must match the variablePattern  no-jquery/variable-pattern
  38:19  warning  Prefer DOM building to parsing HTML literals            no-jquery/no-parse-html-literal

/src/repo/resources/Widgets/VisualDataVisualEditor.js
  40:3   warning  jQuery collection names must match the variablePattern  no-jquery/variable-pattern
  40:19  warning  Prefer DOM building to parsing HTML literals            no-jquery/no-parse-html-literal
  47:3   warning  jQuery collection names must match the variablePattern  no-jquery/variable-pattern
  53:9   warning  Selector extensions are not allowed                     no-jquery/no-sizzle

/src/repo/resources/Widgets/VisualDataintlTelInput.js
  38:7  warning  jQuery collection names must match the variablePattern  no-jquery/variable-pattern

✖ 55 problems (0 errors, 55 warnings)


--- end ---
$ ./node_modules/.bin/eslint resources/VisualData.js resources/VisualDataDatatables.js resources/Widgets/VisualDataButtonMultiselectWidget.js resources/Widgets/VisualDataMaptiler.js resources/VisualDataFunctions.js resources/VisualDataProcessModel.js resources/Widgets/VisualDataMenuTagSearchMultiselect.js resources/VisualDataFormField.js i18n/de.json resources/Widgets/VisualDataRatingWidget.js resources/VisualDataForms.js extension.json resources/Widgets/VisualDataTinyMCE.js resources/Widgets/VisualDataintlTelInput.js composer.json Gruntfile.js resources/VisualDataWindowManager.js resources/Widgets/VisualDataLookupElement.js resources/VisualDataInputConfig.js resources/VisualDataGeolocation.js resources/VersionCheck.js resources/VisualDataContentBlock.js resources/VisualDataSchemas.js resources/Widgets/VisualDataVisualEditor.js package.json i18n/qqq.json i18n/en.json resources/VisualDataUpload.js resources/Widgets/VisualDataDropdownWidget.js package-lock.json -f json
--- stdout ---
[{"filePath":"/src/repo/Gruntfile.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"max-len","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/composer.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/extension.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/i18n/de.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/i18n/en.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/i18n/qqq.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/package-lock.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/package.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/VersionCheck.js","messages":[{"ruleId":"no-jquery/no-global-selector","severity":1,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":57,"column":22,"nodeType":"CallExpression","endLine":57,"endColumn":45},{"ruleId":"no-jquery/no-parse-html-literal","severity":1,"message":"Prefer DOM building to parsing HTML literals","line":62,"column":18,"nodeType":"CallExpression","endLine":62,"endColumn":41},{"ruleId":"no-jquery/no-class-state","severity":1,"message":"Where possible, maintain application state in JS to avoid slower DOM queries","line":65,"column":9,"nodeType":"CallExpression","endLine":65,"endColumn":75}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":3,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/**\n * This file is part of the MediaWiki extension VisualData.\n *\n * VisualData is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 2 of the License, or\n * (at your option) any later version.\n *\n * VisualData is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with VisualData. If not, see <http://www.gnu.org/licenses/>.\n *\n * @file\n * @author thomas-topway-it <support@topway.it>\n * @copyright Copyright © 2021-2023, https://wikisphere.org\n */\n$( () => {\n\tif (\n\t\t!mw.config.get( 'visualdata-show-notice-outdated-version' ) ||\n\t\tmw.cookie.get( 'visualdata-check-latest-version' )\n\t) {\n\t\treturn;\n\t}\n\n\t// display every 3 days\n\tmw.loader.using( 'mediawiki.api', () => {\n\t\tnew mw.Api()\n\t\t\t.postWithToken( 'csrf', {\n\t\t\t\taction: 'visualdata-check-latest-version'\n\t\t\t} )\n\t\t\t.done( ( res ) => {\n\t\t\t\tif ( 'visualdata-check-latest-version' in res ) {\n\t\t\t\t\tif ( res[ 'visualdata-check-latest-version' ].result === 2 ) {\n\t\t\t\t\t\tvar messageWidget = new OO.ui.MessageWidget( {\n\t\t\t\t\t\t\ttype: 'warning',\n\t\t\t\t\t\t\tlabel: new OO.ui.HtmlSnippet(\n\t\t\t\t\t\t\t\tmw.msg(\n\t\t\t\t\t\t\t\t\t'visualdata-jsmodule-outdated-version'\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t// *** this does not work before ooui v0.43.0\n\t\t\t\t\t\t\tshowClose: true\n\t\t\t\t\t\t} );\n\t\t\t\t\t\tvar closeFunction = function () {\n\t\t\t\t\t\t\tvar three_days = 3 * 86400;\n\t\t\t\t\t\t\tmw.cookie.set( 'visualdata-check-latest-version', true, {\n\t\t\t\t\t\t\t\tpath: '/',\n\t\t\t\t\t\t\t\texpires: three_days\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t\t$( messageWidget.$element ).parent().remove();\n\t\t\t\t\t\t};\n\t\t\t\t\t\tmessageWidget.on( 'close', closeFunction );\n\t\t\t\t\t\tvar selector = $( '#visualdata-form' ).length ?\n\t\t\t\t\t\t\t'#visualdata-form' :\n\t\t\t\t\t\t\t'.VisualDataFormWrapper';\n\t\t\t\t\t\t$( selector )\n\t\t\t\t\t\t\t.first()\n\t\t\t\t\t\t\t.prepend( $( '<div><br/></div>' ).prepend( messageWidget.$element ) );\n\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t!messageWidget.$element.hasClass( 'oo-ui-messageWidget-showClose' )\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tmessageWidget.$element.addClass( 'oo-ui-messageWidget-showClose' );\n\t\t\t\t\t\t\tvar closeButton = new OO.ui.ButtonWidget( {\n\t\t\t\t\t\t\t\tclasses: [ 'oo-ui-messageWidget-close' ],\n\t\t\t\t\t\t\t\tframed: false,\n\t\t\t\t\t\t\t\ticon: 'close',\n\t\t\t\t\t\t\t\tlabel: OO.ui.msg( 'ooui-popup-widget-close-button-aria-label' ),\n\t\t\t\t\t\t\t\tinvisibleLabel: true\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t\tcloseButton.on( 'click', closeFunction );\n\t\t\t\t\t\t\tmessageWidget.$element.append( closeButton.$element );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\t} );\n} );\n","usedDeprecatedRules":[{"ruleId":"max-len","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/VisualData.js","messages":[],"suppressedMessages":[{"ruleId":"no-implicit-globals","severity":2,"message":"Global variable leak, declare the variable if it is intended to be local.","line":25,"column":1,"nodeType":"AssignmentExpression","messageId":"globalVariableLeak","endLine":147,"endColumn":6,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-console","severity":2,"message":"Unexpected console statement.","line":58,"column":6,"nodeType":"MemberExpression","messageId":"unexpected","endLine":58,"endColumn":19,"suggestions":[{"messageId":"removeConsole","data":{"propertyName":"error"},"fix":{"range":[1845,1896],"text":""},"desc":"Remove the console.error()."}],"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":64,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":64,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-console","severity":2,"message":"Unexpected console statement.","line":91,"column":6,"nodeType":"MemberExpression","messageId":"unexpected","endLine":91,"endColumn":19,"suggestions":[{"messageId":"removeConsole","data":{"propertyName":"error"},"fix":{"range":[2843,2890],"text":""},"desc":"Remove the console.error()."}],"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"max-len","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/VisualDataContentBlock.js","messages":[],"suppressedMessages":[{"ruleId":"no-unused-vars","severity":2,"message":"'VisualDataContentBlock' is assigned a value but never used.","line":23,"column":7,"nodeType":"Identifier","messageId":"unusedVar","endLine":23,"endColumn":29,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'Config' is assigned a value but never used.","line":25,"column":6,"nodeType":"Identifier","messageId":"unusedVar","endLine":25,"endColumn":12,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'data' is assigned a value but never used.","line":67,"column":7,"nodeType":"Identifier","messageId":"unusedVar","endLine":67,"endColumn":11,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'property' is defined but never used.","line":108,"column":45,"nodeType":"Identifier","messageId":"unusedVar","endLine":108,"endColumn":53,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"max-len","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/VisualDataDatatables.js","messages":[{"ruleId":"no-jquery/no-global-selector","severity":1,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":45,"column":2,"nodeType":"CallExpression","endLine":45,"endColumn":30},{"ruleId":"no-jquery/variable-pattern","severity":1,"message":"jQuery collection names must match the variablePattern","line":48,"column":7,"nodeType":"VariableDeclarator","endLine":48,"endColumn":24}],"suppressedMessages":[{"ruleId":"no-unused-vars","severity":2,"message":"'obj' is defined but never used.","line":27,"column":31,"nodeType":"Identifier","messageId":"unusedVar","endLine":27,"endColumn":34,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'data' is defined but never used.","line":31,"column":27,"nodeType":"Identifier","messageId":"unusedVar","endLine":31,"endColumn":31,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'callback' is defined but never used.","line":31,"column":33,"nodeType":"Identifier","messageId":"unusedVar","endLine":31,"endColumn":41,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'visualdataDatatables' is assigned a value but never used.","line":43,"column":6,"nodeType":"Identifier","messageId":"unusedVar","endLine":43,"endColumn":26,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'preloadData' is assigned a value but never used.","line":46,"column":7,"nodeType":"Identifier","messageId":"unusedVar","endLine":46,"endColumn":18,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'count' is assigned a value but never used.","line":49,"column":7,"nodeType":"Identifier","messageId":"unusedVar","endLine":49,"endColumn":12,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'tableData' is assigned a value but never used.","line":50,"column":7,"nodeType":"Identifier","messageId":"unusedVar","endLine":50,"endColumn":16,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":2,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/**\n * This file is part of the MediaWiki extension VisualData.\n *\n * VisualData is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 2 of the License, or\n * (at your option) any later version.\n *\n * VisualData is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with VisualData. If not, see <http://www.gnu.org/licenses/>.\n *\n * @file\n * @author thomas-topway-it <support@topway.it>\n * @copyright Copyright © 2021-2023, https://wikisphere.org\n */\n\n/* eslint-disable no-unused-vars */\n\nconst VisualDataDatatables = function () {\n\tvar cacheLimit = 40000;\n\n\tvar getCacheKey = function ( obj ) {\n\t\t// @TODO\n\t};\n\n\tvar callApi = function ( data, callback ) {\n\t\t// @TODO\n\t};\n\n\treturn {\n\t\tgetCacheKey,\n\t\tcallApi,\n\t\tcacheLimit\n\t};\n};\n\n$( () => {\n\tvar visualdataDatatables = new VisualDataDatatables();\n\n\t$( '.visualdata.datatable' ).each( function () {\n\t\tvar preloadData = {};\n\n\t\tvar table = $( this );\n\t\tvar count = table.data( 'count' );\n\t\tvar tableData = table.data();\n\n\t\tvar conf = {\n\t\t\tpageLength: 20\n\t\t};\n\t\t$( this ).DataTable( conf );\n\t} );\n} );\n","usedDeprecatedRules":[{"ruleId":"max-len","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/VisualDataFormField.js","messages":[{"ruleId":"no-jquery/no-global-selector","severity":1,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":1082,"column":4,"nodeType":"CallExpression","endLine":1082,"endColumn":61}],"suppressedMessages":[{"ruleId":"no-unused-vars","severity":2,"message":"'VisualDataFormField' is assigned a value but never used.","line":25,"column":7,"nodeType":"Identifier","messageId":"unusedVar","endLine":25,"endColumn":26,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-console","severity":2,"message":"Unexpected console statement.","line":74,"column":5,"nodeType":"MemberExpression","messageId":"unexpected","endLine":74,"endColumn":18,"suggestions":[{"messageId":"removeConsole","data":{"propertyName":"error"},"fix":{"range":[2000,2058],"text":""},"desc":"Remove the console.error()."}],"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":216,"column":14,"nodeType":"Program","messageId":"unexpectedTab","endLine":216,"endColumn":15,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":216,"column":32,"nodeType":"Program","messageId":"unexpectedTab","endLine":216,"endColumn":33,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'value' is defined but never used.","line":310,"column":40,"nodeType":"Identifier","messageId":"unusedVar","endLine":310,"endColumn":45,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":369,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":369,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":372,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":372,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":402,"column":14,"nodeType":"Program","messageId":"unexpectedTab","endLine":402,"endColumn":15,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":402,"column":32,"nodeType":"Program","messageId":"unexpectedTab","endLine":402,"endColumn":33,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'value' is defined but never used.","line":482,"column":40,"nodeType":"Identifier","messageId":"unusedVar","endLine":482,"endColumn":45,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'value' is defined but never used.","line":487,"column":37,"nodeType":"Identifier","messageId":"unusedVar","endLine":487,"endColumn":42,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'data' is assigned a value but never used.","line":511,"column":7,"nodeType":"Identifier","messageId":"unusedVar","endLine":511,"endColumn":11,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'value' is defined but never used.","line":730,"column":39,"nodeType":"Identifier","messageId":"unusedVar","endLine":730,"endColumn":44,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":746,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":746,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":747,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":747,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'value' is defined but never used.","line":805,"column":41,"nodeType":"Identifier","messageId":"unusedVar","endLine":805,"endColumn":46,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-use-before-define","severity":2,"message":"'defaultValueInput' was used before it was defined.","line":920,"column":20,"nodeType":"Identifier","messageId":"usedBeforeDefined","endLine":920,"endColumn":37,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-console","severity":2,"message":"Unexpected console statement.","line":950,"column":6,"nodeType":"MemberExpression","messageId":"unexpected","endLine":950,"endColumn":19,"suggestions":[{"messageId":"removeConsole","data":{"propertyName":"error"},"fix":{"range":[26528,26586],"text":""},"desc":"Remove the console.error()."}],"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1007,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":1007,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1008,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":1008,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1009,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":1009,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1010,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":1010,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1011,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":1011,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1021,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":1021,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1022,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":1022,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1023,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":1023,"endColumn":9,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1024,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":1024,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1045,"column":8,"nodeType":"Program","messageId":"unexpectedTab","endLine":1045,"endColumn":9,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1046,"column":8,"nodeType":"Program","messageId":"unexpectedTab","endLine":1046,"endColumn":9,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1052,"column":8,"nodeType":"Program","messageId":"unexpectedTab","endLine":1052,"endColumn":9,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1053,"column":8,"nodeType":"Program","messageId":"unexpectedTab","endLine":1053,"endColumn":10,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1054,"column":8,"nodeType":"Program","messageId":"unexpectedTab","endLine":1054,"endColumn":10,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1055,"column":8,"nodeType":"Program","messageId":"unexpectedTab","endLine":1055,"endColumn":10,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1056,"column":8,"nodeType":"Program","messageId":"unexpectedTab","endLine":1056,"endColumn":9,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'property' is defined but never used.","line":1178,"column":45,"nodeType":"Identifier","messageId":"unusedVar","endLine":1178,"endColumn":53,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/**\n * This file is part of the MediaWiki extension VisualData.\n *\n * VisualData is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 2 of the License, or\n * (at your option) any later version.\n *\n * VisualData is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with VisualData. If not, see <http://www.gnu.org/licenses/>.\n *\n * @file\n * @author thomas-topway-it <support@topway.it>\n * @copyright Copyright ©2023-2024, https://wikisphere.org\n */\n\n/* eslint-disable no-tabs */\n\n// eslint-disable-next-line no-unused-vars\nconst VisualDataFormField = function ( phpConfig, windowManager, schemas ) {\n\tvar Config = phpConfig;\n\tvar WindowManager = windowManager;\n\tvar Schemas = schemas;\n\tvar VisualDataInputConfigInst = new VisualDataInputConfig(\n\t\tphpConfig,\n\t\twindowManager\n\t);\n\n\tvar ProcessDialog;\n\tvar Model;\n\tvar ParentObj;\n\tvar panelLayout;\n\tvar CurrentKey;\n\tvar Callback;\n\n\tfunction inArray( val, arr ) {\n\t\treturn arr.indexOf( val ) !== -1;\n\t}\n\n\tfunction getCurrentItem() {\n\t\tif ( !( CurrentKey in ParentObj ) ) {\n\t\t\treturn null;\n\t\t}\n\t\treturn ParentObj[ CurrentKey ];\n\t}\n\n\tfunction getPropertyValue( value, propName ) {\n\t\treturn VisualDataSchemas.getPropertyValue( value, propName, {\n\t\t\tgetCurrentItem: getCurrentItem,\n\t\t\tgetModel: getModel\n\t\t} );\n\t}\n\n\tfunction getModel() {\n\t\treturn Model;\n\t}\n\n\tfunction getAvailableInputs(\n\t\tpropertyModel,\n\t\tSMWproperty,\n\t\tJSONSchemaType,\n\t\tstringFormat,\n\t\tmultipleItems\n\t) {\n\t\tif ( Config.SMW && propertyModel === 'smw-property' ) {\n\t\t\tvar dataType = VisualDataSMW.getSemanticProperty( SMWproperty, 'type' );\n\t\t\tif ( !dataType ) {\n\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\tconsole.error( SMWproperty + ' property does not exist' );\n\t\t\t\tdataType = '_wpg';\n\t\t\t}\n\t\t\tvar ret = VisualDataSMW.getAvailableInputs( dataType );\n\t\t} else {\n\t\t\tret = VisualDataFunctions.getAvailableInputs(\n\t\t\t\tJSONSchemaType,\n\t\t\t\tstringFormat,\n\t\t\t\tConfig\n\t\t\t);\n\t\t}\n\n\t\t// remove multiselects\n\t\tif ( multipleItems === false ) {\n\t\t\treturn ret.filter( ( x ) => !VisualDataFunctions.isMultiselect( x ) );\n\t\t}\n\n\t\t// remove options inputs and lookup widgets\n\t\t// except multiselect\n\t\treturn ret.filter(\n\t\t\t( x ) => ( VisualDataFunctions.lookupInputs.indexOf( x ) === -1 &&\n\t\t\t\t\tVisualDataFunctions.optionsInputs.indexOf( x ) === -1 ) ||\n\t\t\t\tVisualDataFunctions.isMultiselect( x )\n\t\t);\n\t}\n\n\t// @TODO move in VisualDataInputConfig ?\n\tfunction handleOptionsInputs( availableInputsInput, parentItems ) {\n\t\tvar items = [];\n\t\tvar layout = new OO.ui.PanelLayout( {\n\t\t\texpanded: false,\n\t\t\tpadded: true,\n\t\t\tframed: true,\n\t\t\tclasses: []\n\t\t} );\n\t\tvar fieldset = new OO.ui.FieldsetLayout( {\n\t\t\tlabel: 'Options'\n\t\t} );\n\t\tlayout.$element.append( fieldset.$element );\n\n\t\tparentItems.push( layout );\n\n\t\tvar optionsValues = getPropertyValue( 'options-values' ) || [];\n\n\t\tvar selectOptionsFromValue = 'options-values';\n\t\tvar wikilistValue = getPropertyValue( 'options-wikilist' );\n\n\t\t// @TODO add more data sources\n\t\tif ( !optionsValues.length ) {\n\t\t\tif ( wikilistValue ) {\n\t\t\t\tselectOptionsFromValue = 'options-wikilist';\n\t\t\t} else if ( getPropertyValue( 'options-askquery' ) ) {\n\t\t\t\tselectOptionsFromValue = 'options-askquery';\n\t\t\t}\n\t\t}\n\n\t\tvar selectOptionsFrom = new OO.ui.RadioSelectInputWidget( {\n\t\t\toptions: [\n\t\t\t\t{\n\t\t\t\t\tdata: 'options-values',\n\t\t\t\t\tlabel: mw.msg(\n\t\t\t\t\t\t'visualdata-jsmodule-formfield-optionsfrom-values'\n\t\t\t\t\t)\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tdata: 'options-wikilist',\n\t\t\t\t\tlabel: mw.msg(\n\t\t\t\t\t\t'visualdata-jsmodule-formfield-optionsfrom-wikilist'\n\t\t\t\t\t)\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tdata: 'options-askquery',\n\t\t\t\t\tlabel: mw.msg(\n\t\t\t\t\t\t'visualdata-jsmodule-formfield-optionsfrom-askquery'\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t],\n\t\t\tvalue: selectOptionsFromValue\n\t\t} );\n\n\t\tvar nullValueInput = new OO.ui.ToggleSwitchWidget( {\n\t\t\tvalue: getPropertyValue( 'options-allow-null' )\n\t\t} );\n\n\t\tvar fieldNullValue = new OO.ui.FieldLayout( nullValueInput, {\n\t\t\tlabel: '',\n\t\t\thelp: mw.msg( 'visualdata-jsmodule-formfield-nullvalue' ),\n\t\t\thelpInline: true,\n\t\t\talign: 'top'\n\t\t} );\n\n\t\titems.push( fieldNullValue );\n\n\t\t// used to clear \"options-values\", \"options-wikilist\", \"options-askquery\"\n\t\t// Model.selectOptionsFrom = selectOptionsFrom;\n\n\t\tvar fieldSelectOptionsFrom = new OO.ui.FieldLayout( selectOptionsFrom, {\n\t\t\tlabel: new OO.ui.HtmlSnippet(\n\t\t\t\tmw.msg( 'visualdata-jsmodule-formfield-options-from' )\n\t\t\t),\n\t\t\talign: 'top'\n\t\t} );\n\n\t\titems.push( fieldSelectOptionsFrom );\n\n\t\tvar messageWidgetOptionsAskQuery = new OO.ui.MessageWidget( {\n\t\t\ttype: 'info',\n\t\t\tlabel: mw.msg( 'visualdata-jsmodule-formfield-message-options-askquery' ),\n\t\t\tinvisibleLabel: false,\n\t\t\tclasses: [ 'VisualDataFormFieldMessage' ]\n\t\t} );\n\n\t\titems.push( messageWidgetOptionsAskQuery );\n\n\t\tvar optionsValuesInput = new OO.ui.TagMultiselectWidget( {\n\t\t\tselected: optionsValues.filter( ( x ) => x !== '' ),\n\t\t\tallowArbitrary: true,\n\t\t\torientation: 'vertical'\n\t\t} );\n\n\t\tvar fieldOptionsValues = new OO.ui.FieldLayout( optionsValuesInput, {\n\t\t\tlabel: '',\n\t\t\thelp: mw.msg( 'visualdata-jsmodule-formfield-options-values' ),\n\t\t\thelpInline: true,\n\t\t\talign: 'top'\n\t\t} );\n\n\t\titems.push( fieldOptionsValues );\n\n\t\tvar wikilistInput = new mw.widgets.TitleInputWidget( {\n\t\t\tvalue: wikilistValue\n\t\t} );\n\n\t\tvar fieldWikilist = new OO.ui.FieldLayout( wikilistInput, {\n\t\t\tlabel: '',\n\t\t\thelp: mw.msg( 'visualdata-jsmodule-formfield-wikilist' ),\n\t\t\thelpInline: true,\n\t\t\talign: 'top'\n\t\t} );\n\n\t\titems.push( fieldWikilist );\n\n\t\t// ////////\t@credits: WikiTeq\t///////\n\t\tvar optionsLabelFormulaInput = new OO.ui.MultilineTextInputWidget( {\n\t\t\tvalue: getPropertyValue( 'options-label-formula' ),\n\t\t\tautosize: true,\n\t\t\trows: 1\n\t\t} );\n\n\t\tvar fieldOptionsLabelFormula = new OO.ui.FieldLayout(\n\t\t\toptionsLabelFormulaInput,\n\t\t\t{\n\t\t\t\tlabel: mw.msg(\n\t\t\t\t\t'visualdata-jsmodule-formfield-options-label-formula'\n\t\t\t\t),\n\t\t\t\thelp: mw.msg(\n\t\t\t\t\t'visualdata-jsmodule-formfield-options-label-formula-help'\n\t\t\t\t),\n\t\t\t\thelpInline: true,\n\t\t\t\talign: 'top'\n\t\t\t}\n\t\t);\n\n\t\titems.push( fieldOptionsLabelFormula );\n\n\t\t// ///////////////////////////\n\n\t\tfunction hasVisibleItems( thisFieldset ) {\n\t\t\tfor ( var item of thisFieldset.items ) {\n\t\t\t\tif ( item.isVisible() ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\n\t\tselectOptionsFrom.on( 'change', ( value ) => {\n\t\t\tfieldOptionsValues.toggle( value === 'options-values' );\n\t\t\tfieldWikilist.toggle( value === 'options-wikilist' );\n\t\t\tfieldOptionsLabelFormula.toggle( value !== 'options-askquery' );\n\t\t\tmessageWidgetOptionsAskQuery.toggle( value === 'options-askquery' );\n\t\t} );\n\n\t\tvar modelMap = {\n\t\t\tselectOptionsFrom: selectOptionsFrom,\n\t\t\t'options-allow-null': nullValueInput,\n\t\t\t'options-values': optionsValuesInput,\n\t\t\t'options-wikilist': wikilistInput,\n\t\t\t'options-label-formula': optionsLabelFormulaInput\n\t\t};\n\n\t\tfunction updateModel( thisVisibleItems ) {\n\t\t\tfor ( var i in modelMap ) {\n\t\t\t\tif ( thisVisibleItems ) {\n\t\t\t\t\tModel[ i ] = modelMap[ i ];\n\t\t\t\t} else {\n\t\t\t\t\tdelete Model[ i ];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfunction onSelectAvailableInputs() {\n\t\t\tvar availableInputsValue = availableInputsInput.getValue();\n\t\t\tvar thisSelectOptionsFromValue = selectOptionsFrom.getValue();\n\t\t\tvar optionInput = inArray( availableInputsValue, VisualDataFunctions.optionsInputs );\n\n\t\t\tfieldSelectOptionsFrom.toggle( optionInput );\n\n\t\t\tmessageWidgetOptionsAskQuery.toggle( optionInput && thisSelectOptionsFromValue === 'options-wikilist' );\n\t\t\tfieldNullValue.toggle( optionInput );\n\n\t\t\tfieldOptionsValues.toggle(\n\t\t\t\toptionInput &&\n\t\t\t\t\t( !thisSelectOptionsFromValue ||\n\t\t\t\t\t\tthisSelectOptionsFromValue === 'options-values' )\n\t\t\t);\n\t\t\tfieldWikilist.toggle( optionInput && thisSelectOptionsFromValue === 'options-wikilist' );\n\n\t\t\tfieldOptionsLabelFormula.toggle(\n\t\t\t\tthisSelectOptionsFromValue !== 'options-askquery' &&\n\t\t\t\tinArray( availableInputsValue, VisualDataFunctions.labelFormulaInputs ) &&\n\t\t\t\t!inArray( availableInputsValue, VisualDataFunctions.lookupInputs )\n\t\t\t);\n\n\t\t\tvar thisVisibleItems = hasVisibleItems( fieldset );\n\t\t\tupdateModel( thisVisibleItems );\n\t\t\tlayout.toggle( thisVisibleItems );\n\t\t}\n\n\t\tfieldset.addItems( items );\n\n\t\tvar visibleItems = hasVisibleItems( fieldset );\n\t\tupdateModel( visibleItems );\n\t\tlayout.toggle( visibleItems );\n\n\t\t// eslint-disable-next-line no-unused-vars\n\t\tavailableInputsInput.on( 'change', ( value ) => {\n\t\t\tonSelectAvailableInputs();\n\t\t} );\n\n\t\tonSelectAvailableInputs();\n\n\t\treturn selectOptionsFrom;\n\t}\n\n\tfunction handleQueryOptions( availableInputsInput, selectOptionsFrom, parentItems ) {\n\t\tvar items = [];\n\t\tvar layout = new OO.ui.PanelLayout( {\n\t\t\texpanded: false,\n\t\t\tpadded: true,\n\t\t\tframed: true,\n\t\t\tclasses: []\n\t\t} );\n\t\tvar fieldset = new OO.ui.FieldsetLayout( {\n\t\t\tlabel: 'Options'\n\t\t} );\n\t\tlayout.$element.append( fieldset.$element );\n\n\t\tparentItems.push( layout );\n\n\t\tvar askqueryInput = new OO.ui.TextInputWidget( {\n\t\t\tvalue: getPropertyValue( 'options-askquery' )\n\t\t} );\n\n\t\tvar fieldAskquery = new OO.ui.FieldLayout( askqueryInput, {\n\t\t\tlabel: mw.msg( 'visualdata-jsmodule-formfield-askquery-label' ),\n\t\t\thelp: mw.msg( 'visualdata-jsmodule-formfield-askquery-help' ),\n\t\t\thelpInline: true,\n\t\t\talign: 'top'\n\t\t} );\n\n\t\titems.push( fieldAskquery );\n\n\t\tvar schemaInput = new OO.ui.DropdownInputWidget( {\n\t\t\toptions: VisualDataFunctions.createDropDownOptions(\n\t\t\t\tObject.keys( Schemas ),\n\t\t\t\t{ key: 'value' }\n\t\t\t),\n\t\t\tvalue: getPropertyValue( 'askquery-schema' )\n\t\t} );\n\n\t\tvar fieldSchema = new OO.ui.FieldLayout( schemaInput, {\n\t\t\tlabel: mw.msg(\n\t\t\t\t'visualdata-jsmodule-formfield-askquery-schema-label'\n\t\t\t),\n\t\t\thelp: mw.msg( 'visualdata-jsmodule-formfield-askquery-schema-help' ),\n\t\t\thelpInline: true,\n\t\t\talign: 'top'\n\t\t} );\n\n\t\titems.push( fieldSchema );\n\n\t\tvar printoutsInputValue = getPropertyValue( 'askquery-printouts' ) || [];\n\n\t\t// var printoutsInput = new mw.widgets.TitlesMultiselectWidget({\n\t\t// \tselected: printoutsInputValue,\n\n\t\t// https://www.semantic-mediawiki.org/wiki/Help:Namespaces\n\t\t// \tnamespace: 102,\n\t\t// });\n\n\t\tvar printoutsInput = new OO.ui.TagMultiselectWidget( {\n\t\t\tallowArbitrary: true,\n\t\t\tselected: printoutsInputValue\n\t\t} );\n\n\t\tvar fieldPrintouts = new OO.ui.FieldLayout( printoutsInput, {\n\t\t\tlabel: mw.msg( 'visualdata-jsmodule-formfield-printouts' ),\n\t\t\thelp: mw.msg( 'visualdata-jsmodule-formfield-printouts-help' ),\n\t\t\thelpInline: true,\n\t\t\talign: 'top'\n\t\t} );\n\n\t\titems.push( fieldPrintouts );\n\n\t\tvar optionFormulaInput = new OO.ui.TextInputWidget( {\n\t\t\tvalue: getPropertyValue( 'options-query-formula' )\n\t\t} );\n\n\t\tvar fieldOptionFormula = new OO.ui.FieldLayout( optionFormulaInput, {\n\t\t\tlabel: mw.msg( 'visualdata-jsmodule-formfield-optionformula' ),\n\t\t\thelp: mw.msg( 'visualdata-jsmodule-formfield-optionformula-help' ),\n\t\t\thelpInline: true,\n\t\t\talign: 'top'\n\t\t} );\n\n\t\titems.push( fieldOptionFormula );\n\n\t\t// ////////\t@credits: WikiTeq\t///////\n\n\t\tvar optionsLabelFormulaInput = new OO.ui.MultilineTextInputWidget( {\n\t\t\tvalue: getPropertyValue( 'options-label-formula' ),\n\t\t\tautosize: true,\n\t\t\trows: 1\n\t\t} );\n\n\t\tvar fieldOptionsLabelFormula = new OO.ui.FieldLayout(\n\t\t\toptionsLabelFormulaInput,\n\t\t\t{\n\t\t\t\tlabel: mw.msg(\n\t\t\t\t\t'visualdata-jsmodule-formfield-options-label-formula'\n\t\t\t\t),\n\t\t\t\thelp: mw.msg(\n\t\t\t\t\t'visualdata-jsmodule-formfield-options-label-formula-help'\n\t\t\t\t),\n\t\t\t\thelpInline: true,\n\t\t\t\talign: 'top'\n\t\t\t}\n\t\t);\n\n\t\titems.push( fieldOptionsLabelFormula );\n\t\t// ///////////////////////////\n\n\t\tvar modelMap = {\n\t\t\t'options-askquery': askqueryInput,\n\t\t\t'askquery-schema': schemaInput,\n\t\t\t'askquery-printouts': printoutsInput,\n\t\t\t'options-query-formula': optionFormulaInput,\n\t\t\t'options-label-formula': optionsLabelFormulaInput\n\t\t};\n\n\t\tfunction updateModel( thisVisibleItems ) {\n\t\t\tfor ( var i in modelMap ) {\n\t\t\t\tif ( thisVisibleItems ) {\n\t\t\t\t\tModel[ i ] = modelMap[ i ];\n\t\t\t\t} else {\n\t\t\t\t\tdelete Model[ i ];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfunction hasVisibleItems( thisFieldset ) {\n\t\t\tfor ( var item of thisFieldset.items ) {\n\t\t\t\tif ( item.isVisible() ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\n\t\tfunction onSelectAvailableInputs() {\n\t\t\tvar availableInputsValue = availableInputsInput.getValue();\n\t\t\tvar selectOptionsFromValue = selectOptionsFrom.getValue();\n\n\t\t\tvar optionInput = ( selectOptionsFromValue === 'options-askquery' &&\n\t\t\t\tinArray( availableInputsValue, VisualDataFunctions.optionsInputs ) );\n\t\t\tvar lookupInput = inArray( availableInputsValue, VisualDataFunctions.lookupInputs );\n\t\t\tvar labelFormulaInput = ( selectOptionsFromValue === 'options-askquery' &&\n\t\t\t\tinArray( availableInputsValue, VisualDataFunctions.labelFormulaInputs ) );\n\n\t\t\tfieldAskquery.toggle( lookupInput || optionInput );\n\t\t\tfieldPrintouts.toggle( lookupInput || optionInput );\n\t\t\tfieldSchema.toggle( lookupInput || optionInput );\n\t\t\tfieldOptionFormula.toggle( lookupInput || optionInput );\n\t\t\tfieldOptionsLabelFormula.toggle( labelFormulaInput );\n\n\t\t\tvar thisVisibleItems = hasVisibleItems( fieldset );\n\t\t\tupdateModel( thisVisibleItems );\n\t\t\tlayout.toggle( thisVisibleItems );\n\t\t}\n\n\t\tfieldset.addItems( items );\n\n\t\tvar visibleItems = hasVisibleItems( fieldset );\n\t\tupdateModel( visibleItems );\n\t\tlayout.toggle( visibleItems );\n\n\t\t// eslint-disable-next-line no-unused-vars\n\t\tavailableInputsInput.on( 'change', ( value ) => {\n\t\t\tonSelectAvailableInputs();\n\t\t} );\n\n\t\t// eslint-disable-next-line no-unused-vars\n\t\tselectOptionsFrom.on( 'change', ( value ) => {\n\t\t\tonSelectAvailableInputs();\n\t\t} );\n\n\t\tonSelectAvailableInputs();\n\t}\n\n\tfunction PanelLayout( config ) {\n\t\tPanelLayout.super.call( this, config );\n\n\t\tthis.fieldset = new OO.ui.FieldsetLayout( {\n\t\t\tlabel: ''\n\t\t} );\n\n\t\tthis.populateFieldset();\n\n\t\tthis.$element.append( this.fieldset.$element );\n\t}\n\n\tOO.inheritClass( PanelLayout, OO.ui.PanelLayout );\n\tPanelLayout.prototype.populateFieldset = function () {\n\t\tthis.fieldset.clearItems();\n\n\t\t// eslint-disable-next-line no-unused-vars\n\t\tvar data = this.data;\n\t\tvar items = [];\n\n\t\tvar currentItem = getCurrentItem();\n\t\tvar parentSchema = {};\n\n\t\t// @see VisualDataSchemas\n\t\tif (\n\t\t\tcurrentItem &&\n\t\t\tcurrentItem.type === 'array' &&\n\t\t\tVisualDataFunctions.isObject( currentItem.items )\n\t\t) {\n\t\t\tparentSchema = currentItem;\n\t\t\tcurrentItem = currentItem.items; // JSON.parse(JSON.stringify(currentItem.items));\n\t\t}\n\n\t\tvar nameInput = new OO.ui.TextInputWidget( {\n\t\t\tvalue: getPropertyValue( 'name' ) || CurrentKey\n\t\t} );\n\n\t\tModel.name = nameInput;\n\n\t\titems.push(\n\t\t\tnew OO.ui.FieldLayout( nameInput, {\n\t\t\t\tlabel: mw.msg( 'visualdata-jsmodule-formfield-name' ),\n\t\t\t\thelpInline: true,\n\t\t\t\thelp: mw.msg( 'visualdata-jsmodule-formfield-name-help' ),\n\t\t\t\talign: 'top'\n\t\t\t} )\n\t\t);\n\n\t\tvar visibilityInputValue = getPropertyValue( 'visibility' );\n\n\t\tvar visibilityInput = new OO.ui.DropdownInputWidget( {\n\t\t\toptions: VisualDataFunctions.createDropDownOptions( {\n\t\t\t\tvisible: mw.msg( 'visualdata-jsmodule-formfield-visibility-visible' ),\n\t\t\t\tcondition: mw.msg( 'visualdata-jsmodule-formfield-visibility-condition' ),\n\t\t\t\thidden: mw.msg( 'visualdata-jsmodule-formfield-visibility-hidden' ),\n\t\t\t\t'oncreate-only': mw.msg(\n\t\t\t\t\t'visualdata-jsmodule-formfield-visibility-create-only'\n\t\t\t\t)\n\t\t\t} ),\n\t\t\tvalue: visibilityInputValue\n\t\t} );\n\n\t\tModel.visibility = visibilityInput;\n\n\t\titems.push(\n\t\t\tnew OO.ui.FieldLayout( visibilityInput, {\n\t\t\t\tlabel: mw.msg( 'visualdata-jsmodule-formfield-visibility-label' ),\n\t\t\t\thelp: mw.msg( 'visualdata-jsmodule-formfield-visibility-help' ),\n\t\t\t\thelpInline: true,\n\t\t\t\talign: 'top'\n\t\t\t} )\n\t\t);\n\n\t\t// ------------------ show-if -----------------\n\n\t\tvar otherFields = Object.keys( ParentObj ).filter( ( x ) => ( x !== CurrentKey && ParentObj[ x ].wiki.type === 'property' &&\n\t\t\t\tParentObj[ x ].wiki[ 'multiple-items' ] === false ) );\n\n\t\tvar showifFieldInput = new OO.ui.DropdownInputWidget( {\n\t\t\toptions: VisualDataFunctions.createDropDownOptions( otherFields, { key: 'value' } ),\n\t\t\tvalue: getPropertyValue( 'showif-field' )\n\t\t} );\n\n\t\tvar showifConditionInput = new OO.ui.DropdownInputWidget( {\n\t\t\t// @https://github.com/Knowledge-Wiki/SemanticResultFormats/blob/561e5304e17fccc894d7b38ab88a03b75606d6c8/formats/datatables/Api.php\n\t\t\toptions: VisualDataFunctions.createDropDownOptions( {\n\t\t\t\t'=': mw.msg( 'visualdata-jsmodule-formfield-showif-condition-=' ),\n\t\t\t\t'!=': mw.msg( 'visualdata-jsmodule-formfield-showif-condition-!=' ),\n\t\t\t\tstarts: mw.msg( 'visualdata-jsmodule-formfield-showif-condition-starts' ),\n\t\t\t\t'!starts': mw.msg( 'visualdata-jsmodule-formfield-showif-condition-!starts' ),\n\t\t\t\tcontains: mw.msg( 'visualdata-jsmodule-formfield-showif-condition-contains' ),\n\t\t\t\t'!contains': mw.msg( 'visualdata-jsmodule-formfield-showif-condition-!contains' ),\n\t\t\t\tends: mw.msg( 'visualdata-jsmodule-formfield-showif-condition-ends' ),\n\t\t\t\t'!ends': mw.msg( 'visualdata-jsmodule-formfield-showif-condition-!ends' ),\n\t\t\t\t'!null': mw.msg( 'visualdata-jsmodule-formfield-showif-condition-!null' ),\n\t\t\t\tregex: mw.msg( 'visualdata-jsmodule-formfield-showif-condition-regex' )\n\t\t\t} ),\n\t\t\tvalue: getPropertyValue( 'showif-condition' )\n\t\t} );\n\n\t\tvar showifValueInput = new OO.ui.TextInputWidget( {\n\t\t\tvalue: getPropertyValue( 'showif-value' )\n\t\t} );\n\n\t\tshowifConditionInput.on( 'change', ( value ) => {\n\t\t\tshowifValueInput.toggle( value !== '!null' );\n\t\t\tupdateModelShowif( getPropertyValue( 'visibility' ) === 'condition' );\n\t\t} );\n\n\t\tshowifValueInput.toggle( getPropertyValue( 'showif-condition' ) !== '!null' );\n\n\t\tvar layoutHorizontal = new OO.ui.HorizontalLayout( { items: [\n\t\t\tshowifFieldInput,\n\t\t\tshowifConditionInput,\n\t\t\tshowifValueInput\n\t\t] } );\n\n\t\t// Model[ 'showif-field' ] = showifFieldInput;\n\t\t// Model[ 'showif-equal' ] = showifConditionInput;\n\t\t// Model[ 'showif-value' ] = showifValueInput;\n\n\t\tvar showifField = new OO.ui.FieldLayout(\n\t\t\tnew OO.ui.Widget( {\n\t\t\t\tcontent: [ layoutHorizontal ]\n\t\t\t} ),\n\t\t\t{\n\t\t\t\tlabel: mw.msg( 'visualdata-jsmodule-formfield-showif' ),\n\t\t\t\thelp: mw.msg( 'visualdata-jsmodule-formfield-showif-help' ),\n\t\t\t\thelpInline: true,\n\t\t\t\talign: 'top'\n\t\t\t}\n\t\t);\n\n\t\titems.push( showifField );\n\n\t\tvar modelMap = {\n\t\t\t'showif-field': showifFieldInput,\n\t\t\t'showif-condition': showifConditionInput,\n\t\t\t'showif-value': showifValueInput\n\t\t};\n\n\t\tfunction updateModelShowif( thisVisibleItems ) {\n\t\t\tfor ( var i in modelMap ) {\n\t\t\t\tif ( thisVisibleItems ) {\n\t\t\t\t\tModel[ i ] = modelMap[ i ];\n\t\t\t\t} else {\n\t\t\t\t\tdelete Model[ i ];\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( getPropertyValue( 'showif-condition' ) === '!null' ) {\n\t\t\t\tdelete Model[ 'showif-value' ];\n\t\t\t}\n\t\t}\n\n\t\tupdateModelShowif( visibilityInputValue === 'condition' );\n\t\tshowifField.toggle( visibilityInputValue === 'condition' );\n\n\t\t// ------------------ show-if >>>>>>>>>>>>>>>>>\n\n\t\tvar labelValue = getPropertyValue( 'label' );\n\n\t\tvar labelInput = new OO.ui.TextInputWidget( {\n\t\t\tvalue: labelValue\n\t\t} );\n\n\t\tModel.label = labelInput;\n\n\t\tvar labelField = new OO.ui.FieldLayout( labelInput, {\n\t\t\tlabel: mw.msg( 'visualdata-jsmodule-formfield-label' ),\n\t\t\thelpInline: true,\n\t\t\talign: 'top'\n\t\t} );\n\n\t\titems.push( labelField );\n\n\t\tvar helpMessageInput = new OO.ui.MultilineTextInputWidget( {\n\t\t\tvalue: getPropertyValue( 'help-message' ),\n\t\t\tautosize: true,\n\t\t\trows: 2\n\t\t} );\n\n\t\tModel[ 'help-message' ] = helpMessageInput;\n\n\t\tvar helpMessageField = new OO.ui.FieldLayout( helpMessageInput, {\n\t\t\tlabel: mw.msg( 'visualdata-jsmodule-formfield-help-message' ),\n\t\t\thelpInline: true,\n\t\t\thelp: mw.msg( 'visualdata-jsmodule-formfield-help-message-help' ),\n\t\t\talign: 'top'\n\t\t} );\n\n\t\titems.push( helpMessageField );\n\n\t\tvar propertyModelValue = 'json-schema';\n\t\tif ( Config.SMW ) {\n\t\t\tpropertyModelValue = getPropertyValue( 'propertyModel' ) || 'smw-property';\n\t\t\tvar propertyModelInput = new OO.ui.RadioSelectInputWidget( {\n\t\t\t\toptions: [\n\t\t\t\t\t{\n\t\t\t\t\t\tdata: 'smw-property',\n\t\t\t\t\t\tlabel: mw.msg(\n\t\t\t\t\t\t\t'visualdata-jsmodule-formfield-propertymodel-smwproperty'\n\t\t\t\t\t\t)\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tdata: 'json-schema',\n\t\t\t\t\t\tlabel: mw.msg(\n\t\t\t\t\t\t\t'visualdata-jsmodule-formfield-propertymodel-jsonschema'\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\t\t\t\t],\n\t\t\t\tvalue: propertyModelValue\n\t\t\t} );\n\n\t\t\tModel.propertyModel = propertyModelInput;\n\n\t\t\titems.push(\n\t\t\t\tnew OO.ui.FieldLayout( propertyModelInput, {\n\t\t\t\t\tlabel: mw.msg( 'visualdata-jsmodule-formfield-propertymodel' ),\n\t\t\t\t\thelpInline: true,\n\t\t\t\t\talign: 'top'\n\t\t\t\t} )\n\t\t\t);\n\n\t\t\tvar SMWpropertiesValue =\n\t\t\t\tgetPropertyValue( 'SMW-property' ) ||\n\t\t\t\tObject.keys( VisualDataSMW.getSemanticProperties() )[ 0 ];\n\n\t\t\tvar SMWpropertiesInput = new OO.ui.DropdownInputWidget( {\n\t\t\t\toptions: VisualDataFunctions.createDropDownOptions(\n\t\t\t\t\tObject.keys( VisualDataSMW.getSemanticProperties() ),\n\t\t\t\t\t{ key: 'value' }\n\t\t\t\t),\n\t\t\t\tvalue: SMWpropertiesValue\n\t\t\t} );\n\n\t\t\t// eslint-disable-next-line no-unused-vars\n\t\t\tSMWpropertiesInput.on( 'change', ( value ) => {\n\t\t\t\tredrawAvailableInputs();\n\t\t\t} );\n\n\t\t\tModel[ 'SMW-property' ] = SMWpropertiesInput;\n\n\t\t\tvar fieldSMWpropertiesInput = new OO.ui.FieldLayout( SMWpropertiesInput, {\n\t\t\t\tlabel: mw.msg( 'visualdata-jsmodule-formfield-smwproperties' ),\n\t\t\t\thelpInline: true,\n\t\t\t\talign: 'top'\n\t\t\t} );\n\n\t\t\titems.push( fieldSMWpropertiesInput );\n\t\t}\n\n\t\t// var smwTypesInput = new OO.ui.DropdownInputWidget({\n\t\t// \toptions: VisualDataFunctions.createDropDownOptions(VisualDataSMW.TypeLabels),\n\t\t// \tvalue:\n\t\t// });\n\n\t\tvar jsonSchemaValue = getPropertyValue( 'jsonSchema-type' ) || 'string';\n\n\t\tvar jsonSchemaInput = new OO.ui.DropdownInputWidget( {\n\t\t\toptions: VisualDataFunctions.createDropDownOptions(\n\t\t\t\t[\n\t\t\t\t\t'string',\n\t\t\t\t\t'number',\n\t\t\t\t\t'integer',\n\t\t\t\t\t'boolean'\n\t\t\t\t\t// select rather a type and toggle \"multiple values\"\n\t\t\t\t\t// \"array\",\n\t\t\t\t],\n\t\t\t\t{ key: 'value' }\n\t\t\t),\n\t\t\tvalue: jsonSchemaValue\n\t\t} );\n\n\t\tModel[ 'jsonSchema-type' ] = jsonSchemaInput;\n\n\t\tvar fieldjsonSchemaInput = new OO.ui.FieldLayout( jsonSchemaInput, {\n\t\t\tlabel: mw.msg( 'visualdata-jsmodule-formfield-schematypes' ),\n\t\t\thelpInline: true,\n\t\t\talign: 'top'\n\t\t} );\n\n\t\titems.push( fieldjsonSchemaInput );\n\n\t\tvar textFormat = [\n\t\t\t'color',\n\t\t\t'date',\n\t\t\t'datetime',\n\t\t\t'datetime-local',\n\t\t\t'email',\n\t\t\t'month',\n\t\t\t'password',\n\t\t\t'number',\n\t\t\t'range',\n\t\t\t'tel',\n\t\t\t'text',\n\t\t\t'textarea',\n\t\t\t'time',\n\t\t\t'url',\n\t\t\t'week'\n\t\t];\n\n\t\tvar jsonSchemaFormatValue = getPropertyValue( 'jsonSchema-format' ) || 'text';\n\t\tvar jsonSchemaFormatInput = new OO.ui.DropdownInputWidget( {\n\t\t\t// , { key: \"value\" }\n\t\t\toptions: VisualDataFunctions.createDropDownOptions( textFormat, {\n\t\t\t\tkey: 'value'\n\t\t\t} ),\n\t\t\tvalue: jsonSchemaFormatValue\n\t\t} );\n\n\t\t// eslint-disable-next-line no-unused-vars\n\t\tjsonSchemaFormatInput.on( 'change', ( value ) => {\n\t\t\tredrawAvailableInputs();\n\t\t} );\n\n\t\tModel[ 'jsonSchema-format' ] = jsonSchemaFormatInput;\n\n\t\tvar fieldjsonSchemaFormatInput = new OO.ui.FieldLayout(\n\t\t\tjsonSchemaFormatInput,\n\t\t\t{\n\t\t\t\tlabel: mw.msg( 'visualdata-jsmodule-formfield-schematextsubtypes' ),\n\t\t\t\thelpInline: true,\n\t\t\t\talign: 'top'\n\t\t\t}\n\t\t);\n\n\t\titems.push( fieldjsonSchemaFormatInput );\n\n\t\tjsonSchemaInput.on( 'change', ( value ) => {\n\t\t\tswitch ( value ) {\n\t\t\t\tcase 'string':\n\t\t\t\t\tfieldjsonSchemaFormatInput.toggle( true );\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'integer':\n\t\t\t\tcase 'number':\n\t\t\t\tcase 'boolean':\n\t\t\t\t\tfieldjsonSchemaFormatInput.toggle( false );\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tredrawAvailableInputs();\n\t\t} );\n\n\t\tif ( Config.SMW ) {\n\t\t\tfieldSMWpropertiesInput.toggle( propertyModelValue === 'smw-property' );\n\t\t}\n\t\tfieldjsonSchemaInput.toggle( propertyModelValue === 'json-schema' );\n\t\tfieldjsonSchemaFormatInput.toggle(\n\t\t\tpropertyModelValue === 'json-schema' && jsonSchemaValue === 'string'\n\t\t);\n\n\t\tif ( Config.SMW ) {\n\t\t\tpropertyModelInput.on( 'change', ( value ) => {\n\t\t\t\tswitch ( value ) {\n\t\t\t\t\tcase 'smw-property':\n\t\t\t\t\t\tfieldSMWpropertiesInput.toggle( true );\n\t\t\t\t\t\tfieldjsonSchemaInput.toggle( false );\n\t\t\t\t\t\tfieldjsonSchemaFormatInput.toggle( false );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'json-schema':\n\t\t\t\t\t\tfieldSMWpropertiesInput.toggle( false );\n\t\t\t\t\t\tfieldjsonSchemaInput.toggle( true );\n\t\t\t\t\t\tfieldjsonSchemaFormatInput.toggle(\n\t\t\t\t\t\t\tgetPropertyValue( 'jsonSchema-type' ) === 'string'\n\t\t\t\t\t\t);\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tredrawAvailableInputs();\n\t\t\t} );\n\t\t}\n\n\t\tvar multipleItemsInputValue =\n\t\t\tgetPropertyValue( 'multiple-items' ) || parentSchema.type === 'array';\n\t\tvar multipleItemsInput = new OO.ui.ToggleSwitchWidget( {\n\t\t\tvalue: multipleItemsInputValue\n\t\t} );\n\n\t\tModel[ 'multiple-items' ] = multipleItemsInput;\n\n\t\tvar layoutParentSchema = VisualDataSchemas.parentSchemaContainer(\n\t\t\t( Model.parentSchema = {} ),\n\t\t\t{\n\t\t\t\tgetPropertyValue: getPropertyValue\n\t\t\t}\n\t\t);\n\t\t// layoutParentSchema.toggle( multipleItemsInputValue );\n\n\t\tvar messageWidget = new OO.ui.MessageWidget( {\n\t\t\ttype: 'info',\n\t\t\tlabel: mw.msg( 'visualdata-jsmodule-formfield-message-more-inputs' ),\n\t\t\tinvisibleLabel: false,\n\t\t\tclasses: [ 'VisualDataFormFieldMessage' ]\n\t\t} );\n\n\t\tvar fieldMultipleValues = new OO.ui.FieldLayout( multipleItemsInput, {\n\t\t\tlabel: mw.msg( 'visualdata-jsmodule-formfield-multiple-values' ),\n\t\t\thelp: '',\n\t\t\thelpInline: true,\n\t\t\talign: 'top'\n\t\t} );\n\n\t\titems.push( fieldMultipleValues );\n\t\titems.push( layoutParentSchema );\n\n\t\tvar availableInputsValue = getPropertyValue( 'preferred-input' );\n\t\t// preferred input based on property type\n\t\tvar availableInputsInput = new OO.ui.DropdownInputWidget( {\n\t\t\t// , { key: \"value\" }\n\t\t\toptions: VisualDataFunctions.createDropDownOptions(\n\t\t\t\tgetAvailableInputs(\n\t\t\t\t\tpropertyModelValue,\n\t\t\t\t\tSMWpropertiesValue,\n\t\t\t\t\tjsonSchemaValue,\n\t\t\t\t\tjsonSchemaFormatValue,\n\t\t\t\t\tmultipleItemsInputValue\n\t\t\t\t),\n\t\t\t\t{\n\t\t\t\t\tkey: 'value'\n\t\t\t\t}\n\t\t\t),\n\t\t\tvalue: availableInputsValue\n\t\t} );\n\n\t\tavailableInputsInput.on( 'change', ( value ) => {\n\t\t\tvar thisDefaultValueInput = getDefaultValueInput();\n\n\t\t\t// eslint-disable-next-line no-use-before-define\n\t\t\tModel.default = defaultValueInput;\n\n\t\t\tif (\n\t\t\t\tvalue === 'OO.ui.SelectFileWidget' &&\n\t\t\t\t!( 'accept' in thisDefaultValueInput )\n\t\t\t) {\n\t\t\t\tthisDefaultValueInput.accept = Config.allowedMimeTypes;\n\t\t\t}\n\t\t} );\n\n\t\tModel[ 'preferred-input' ] = availableInputsInput;\n\n\t\tvar inputConfigButton = new OO.ui.ButtonWidget( {\n\t\t\ticon: 'settings',\n\t\t\tflags: []\n\t\t} );\n\n\t\tvar defaultInputConfig = getPropertyValue( 'input-config' ) || {};\n\n\t\tModel[ 'input-config' ] = new VisualDataFunctions.MockupOOUIClass(\n\t\t\tdefaultInputConfig\n\t\t);\n\n\t\tinputConfigButton.on( 'click', () => {\n\t\t\tvar dataType = null;\n\t\t\tif ( Config.SMW ) {\n\t\t\t\tvar SMWproperty = getPropertyValue( 'SMW-property' );\n\t\t\t\tdataType = VisualDataSMW.getSemanticProperty( SMWproperty, 'type' );\n\t\t\t\tif ( !dataType ) {\n\t\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\t\tconsole.error( SMWproperty + ' property does not exist' );\n\t\t\t\t\tdataType = '_wpg';\n\t\t\t\t}\n\t\t\t}\n\t\t\tVisualDataInputConfigInst.openDialog(\n\t\t\t\tModel[ 'input-config' ],\n\t\t\t\tavailableInputsInput.getValue(),\n\t\t\t\tVisualDataFunctions.getInputHelpUrl( availableInputsInput.getValue() ),\n\t\t\t\tnull\n\t\t\t);\n\t\t} );\n\n\t\titems.push( messageWidget );\n\n\t\titems.push(\n\t\t\tnew OO.ui.ActionFieldLayout( availableInputsInput, inputConfigButton, {\n\t\t\t\tlabel: mw.msg( 'visualdata-jsmodule-formfield-availableinputs' ),\n\t\t\t\thelpInline: true,\n\t\t\t\talign: 'top'\n\t\t\t} )\n\t\t);\n\n\t\tvar selectOptionsFrom = handleOptionsInputs( availableInputsInput, items );\n\t\thandleQueryOptions( availableInputsInput, selectOptionsFrom, items );\n\n\t\tvar requiredInput = new OO.ui.ToggleSwitchWidget( {\n\t\t\tvalue: !!getPropertyValue( 'required' )\n\t\t} );\n\n\t\tModel.required = requiredInput;\n\n\t\tvar fieldRequiredInput = new OO.ui.FieldLayout( requiredInput, {\n\t\t\tlabel: mw.msg( 'visualdata-jsmodule-formfield-required' ),\n\t\t\thelpInline: true,\n\t\t\talign: 'top'\n\t\t} );\n\n\t\tmultipleItemsInput.on( 'change', ( value ) => {\n\t\t\tredrawAvailableInputs();\n\t\t\tlayoutParentSchema.toggle( value );\n\t\t\tfieldRequiredInput.toggle( !value );\n\t\t\tnameInput.setDisabled( value );\n\t\t} );\n\n\t\tfieldRequiredInput.toggle( !multipleItemsInputValue );\n\n\t\titems.push( fieldRequiredInput );\n\n\t\tfunction getDefaultValueInput() {\n\t\t\t// @ATTENTION ! don't get the specific input othwerwise\n\t\t\t// the default values cannot be parsed as wikitext\n\t\t\t// print always a textInput and cast\n\t\t\t// the value server-side\n\n\t\t\tvar ret;\n\n\t\t\t// var availableInputs = getAvailableInputs(\n\t\t\t// \tgetPropertyValue(\"propertyModel\") || \"json-schema\",\n\t\t\t// \tgetPropertyValue(\"SMW-property\"),\n\t\t\t// \tgetPropertyValue(\"jsonSchema-type\"),\n\t\t\t// \t\"text\",\n\t\t\t// \tgetPropertyValue(\"multiple-items\")\n\t\t\t// );\n\n\t\t\t// @TODO use instead availableInputsInput.getValue()\n\t\t\t// as long as all the inputs support the standard\n\t\t\t// OOUI interface for the use with OO.ui.TagMultiselectWidget\n\t\t\t// -> inputWidget\n\t\t\t// var intputName = availableInputs[0]; // availableInputsInput.getValue()\n\n\t\t\t// var inputWidget = VisualDataFunctions.inputInstanceFromName(\n\t\t\t// \tintputName,\n\t\t\t// \t{\n\t\t\t// \t\tid: \"visualdata-jsmodule-formfield-default-value-input\",\n\t\t\t// \t}\n\t\t\t// );\n\n\t\t\tvar inputWidget = new OO.ui.TextInputWidget( {\n\t\t\t\t// value: getPropertyValue( 'default' ),\n\t\t\t\tid: 'visualdata-jsmodule-formfield-default-value-input'\n\t\t\t} );\n\n\t\t\tif ( !getPropertyValue( 'multiple-items' ) ) {\n\t\t\t\tif ( 'default' in Model ) {\n\t\t\t\t\tvar value = Model.default.getValue();\n\t\t\t\t\tif ( Array.isArray( value ) && value.length ) {\n\t\t\t\t\t\tModel.default.setValue( value[ 0 ] );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tinputWidget.setValue( getPropertyValue( 'default' ) );\n\t\t\t\t// set the proper input for each type\n\n\t\t\t\tret = inputWidget;\n\t\t\t\t// return new OO.ui.TextInputWidget({\n\t\t\t\t// \tvalue: getPropertyValue(\"default\"),\n\t\t\t\t// \tid: \"visualdata-jsmodule-formfield-default-value-input\",\n\t\t\t\t// });\n\t\t\t} else {\n\t\t\t\t// OO.ui.TagMultiselectWidget -> inputWidget: inputWidget does not work\n\t\t\t\t// with OO.ui.ToggleSwitchWidget\n\t\t\t\t// if (intputName === \"OO.ui.ToggleSwitchWidget\") {\n\t\t\t\t// \tinputWidget = new OO.ui.NumberInputWidget({\n\t\t\t\t// \t\tmin: 0,\n\t\t\t\t// \t\tmax: 1,\n\t\t\t\t// \t\tid: \"visualdata-jsmodule-formfield-default-value-input\",\n\t\t\t\t// \t});\n\t\t\t\t// }\n\n\t\t\t\tvar value = [];\n\t\t\t\tvar val = getPropertyValue( 'default' );\n\n\t\t\t\tif ( Array.isArray( val ) ) {\n\t\t\t\t\tvalue = val;\n\t\t\t\t} else if ( val !== '' ) {\n\t\t\t\t\tvalue = [ val ];\n\t\t\t\t}\n\n\t\t\t\tret = new OO.ui.TagMultiselectWidget( {\n\t\t\t\t\tvalue: value,\n\t\t\t\t\tselected: value,\n\t\t\t\t\tallowArbitrary: true,\n\t\t\t\t\tallowEditTags: true,\n\t\t\t\t\tallowReordering: true,\n\t\t\t\t\t// 0 means unlimited\n\t\t\t\t\t// tagLimit: !!multipleItemsInputValue ? 0 : 1,\n\t\t\t\t\tdraggable: true,\n\t\t\t\t\tinputPosition: 'outline',\n\t\t\t\t\tinputWidget: inputWidget,\n\t\t\t\t\tid: 'visualdata-jsmodule-formfield-default-value-input'\n\t\t\t\t} );\n\t\t\t}\n\t\t\t$( '#visualdata-jsmodule-formfield-default-value-input' ).replaceWith(\n\t\t\t\tret.$element\n\t\t\t);\n\n\t\t\treturn ret;\n\t\t}\n\n\t\tvar defaultValueInput = getDefaultValueInput();\n\n\t\tModel.default = defaultValueInput;\n\n\t\titems.push(\n\t\t\tnew OO.ui.FieldLayout( defaultValueInput, {\n\t\t\t\tlabel: mw.msg( 'visualdata-jsmodule-formfield-default' ),\n\t\t\t\thelp: mw.msg( 'visualdata-jsmodule-formfield-default-value-help' ),\n\t\t\t\thelpInline: true,\n\t\t\t\talign: 'top'\n\t\t\t} )\n\t\t);\n\n\t\tvar valueFormulaInput = new OO.ui.MultilineTextInputWidget( {\n\t\t\tvalue: getPropertyValue( 'value-formula' ),\n\t\t\tautosize: true,\n\t\t\trows: 1\n\t\t} );\n\n\t\tModel[ 'value-formula' ] = valueFormulaInput;\n\n\t\titems.push(\n\t\t\tnew OO.ui.FieldLayout( valueFormulaInput, {\n\t\t\t\tlabel: mw.msg( 'visualdata-jsmodule-formfield-valueformula' ),\n\t\t\t\thelp: mw.msg( 'visualdata-jsmodule-formfield-valueformula-help' ),\n\t\t\t\thelpInline: true,\n\t\t\t\talign: 'top'\n\t\t\t} )\n\t\t);\n\n\t\tfunction onVisibilityInputChange( value ) {\n\t\t\tonToggleHiddenInput( value === 'hidden' );\n\t\t\tshowifField.toggle( value === 'condition' );\n\t\t\tupdateModelShowif( value === 'condition' );\n\t\t}\n\n\t\tvisibilityInput.on( 'change', ( value ) => {\n\t\t\tonVisibilityInputChange( value );\n\t\t} );\n\n\t\tfunction onToggleHiddenInput( hidden ) {\n\t\t\tif ( hidden ) {\n\t\t\t\tModel[ 'preferred-input' ].setValue( 'OO.ui.TextInputWidget' );\n\t\t\t}\n\t\t\tavailableInputsInput.setDisabled( hidden );\n\t\t\trequiredInput.setDisabled( hidden );\n\t\t\tfieldMultipleValues.toggle( !hidden );\n\t\t\tlayoutParentSchema.toggle( !hidden && ( getPropertyValue( 'multiple-items' ) || parentSchema.type === 'array' ) );\n\t\t\tnameInput.setDisabled( layoutParentSchema.isVisible() );\n\t\t\tlabelField.toggle( !hidden );\n\t\t\thelpMessageField.toggle( !hidden );\n\t\t}\n\n\t\tonVisibilityInputChange( visibilityInputValue );\n\n\t\tfunction redrawAvailableInputs() {\n\t\t\tavailableInputsInput.setOptions(\n\t\t\t\tVisualDataFunctions.createDropDownOptions(\n\t\t\t\t\tgetAvailableInputs(\n\t\t\t\t\t\tgetPropertyValue( 'propertyModel' ) || 'json-schema',\n\t\t\t\t\t\tgetPropertyValue( 'SMW-property' ),\n\t\t\t\t\t\tgetPropertyValue( 'jsonSchema-type' ),\n\t\t\t\t\t\tgetPropertyValue( 'jsonSchema-format' ),\n\t\t\t\t\t\tgetPropertyValue( 'multiple-items' )\n\t\t\t\t\t),\n\t\t\t\t\t{\n\t\t\t\t\t\tkey: 'value'\n\t\t\t\t\t}\n\t\t\t\t)\n\t\t\t);\n\n\t\t\tvar thisDefaultValueInput = getDefaultValueInput();\n\t\t\tModel.default = thisDefaultValueInput;\n\t\t}\n\n\t\titems = items.filter( ( x ) => !( 'items' in x ) || x.items.length );\n\n\t\tthis.isEmpty = !items.length;\n\n\t\tthis.fieldset.addItems( items );\n\n\t\tsetTimeout( () => {\n\t\t\tVisualDataFunctions.removeNbspFromLayoutHeader(\n\t\t\t\t'#visualdata-processDialogEditField'\n\t\t\t);\n\t\t}, 30 );\n\t};\n\n\t// eslint-disable-next-line no-unused-vars\n\tPanelLayout.prototype.addItem = function ( property ) {\n\t\tthis.populateFieldset();\n\t};\n\n\tfunction ProcessDialog( config ) {\n\t\tProcessDialog.super.call( this, config );\n\t}\n\tOO.inheritClass( ProcessDialog, OO.ui.ProcessDialog );\n\n\tProcessDialog.static.name = 'myDialog';\n\t// ProcessDialog.static.title = mw.msg(\n\t// \"visualdata-jsmodule-manageproperties-define-property\"\n\t// );\n\tProcessDialog.static.actions = [\n\t\t{\n\t\t\taction: 'save',\n\t\t\tmodes: 'edit',\n\t\t\tlabel: mw.msg( 'visualdata-jsmodule-dialog-save' ),\n\t\t\tflags: [ 'primary', 'progressive' ]\n\t\t},\n\t\t{\n\t\t\tmodes: 'edit',\n\t\t\tlabel: mw.msg( 'visualdata-jsmodule-dialog-cancel' ),\n\t\t\tflags: [ 'safe', 'close' ]\n\t\t}\n\t];\n\n\tProcessDialog.prototype.initialize = function () {\n\t\tProcessDialog.super.prototype.initialize.apply( this, arguments );\n\n\t\tpanelLayout = new PanelLayout( {\n\t\t\texpanded: false,\n\t\t\tpadded: true,\n\t\t\tclasses: [],\n\t\t\tdata: {}\n\t\t} );\n\n\t\tvar frameA = new OO.ui.PanelLayout( {\n\t\t\t$content: [ panelLayout.$element ],\n\t\t\texpanded: false,\n\t\t\t// framed: false,\n\t\t\tpadded: false,\n\t\t\tdata: { name: 'manageforms' }\n\t\t} );\n\n\t\tthis.$body.append( frameA.$element );\n\t};\n\n\tProcessDialog.prototype.getActionProcess = function ( action ) {\n\t\tvar dialog = this;\n\n\t\tvar currentItem = getCurrentItem() || {\n\t\t\ttype: '',\n\t\t\twiki: { type: 'property' }\n\t\t};\n\t\tvar parentSchema = currentItem;\n\t\tif (\n\t\t\tcurrentItem.type === 'array' &&\n\t\t\tVisualDataFunctions.isObject( currentItem.items )\n\t\t) {\n\t\t\tcurrentItem = currentItem.items;\n\t\t}\n\n\t\tfunction getValueRec( model, thisObj ) {\n\t\t\tfor ( var i in model ) {\n\t\t\t\tif ( !( 'getValue' in model[ i ] ) ) {\n\t\t\t\t\tgetValueRec( model[ i ], ( thisObj[ i ] = {} ) );\n\t\t\t\t} else {\n\t\t\t\t\tthisObj[ i ] = VisualDataSchemas.getWidgetValue( model[ i ] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tswitch ( action ) {\n\t\t\tcase 'save':\n\t\t\t\tvar obj = { type: 'property' };\n\t\t\t\tgetValueRec( Model, obj );\n\n\t\t\t\tvar objName = obj[ 'multiple-items' ] ? obj.parentSchema.name : obj.name;\n\n\t\t\t\tswitch ( obj.propertyModel ) {\n\t\t\t\t\tcase 'json-schema':\n\t\t\t\t\t\tdelete obj[ 'SMW-property' ];\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'smw-property':\n\t\t\t\t\t\t// *** important! used to recover the type\n\t\t\t\t\t\t// if a property has been deleted\n\t\t\t\t\t\tobj[ 'smw-property-type' ] = VisualDataSMW.getSemanticProperty(\n\t\t\t\t\t\t\tobj[ 'SMW-property' ],\n\t\t\t\t\t\t\t'type'\n\t\t\t\t\t\t);\n\t\t\t\t\t\t// delete obj[\"jsonSchema-type\"];\n\t\t\t\t\t\t// delete obj[\"jsonSchema-format\"];\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tvar alert = null;\n\t\t\t\tif ( objName === '' ) {\n\t\t\t\t\talert = mw.msg( 'visualdata-jsmodule-schemas-alert-noname' );\n\t\t\t\t} else if ( objName !== CurrentKey && objName in ParentObj ) {\n\t\t\t\t\talert = mw.msg( 'visualdata-jsmodule-schemas-alert-existing-item' );\n\t\t\t\t}\n\n\t\t\t\tif ( alert ) {\n\t\t\t\t\tVisualDataFunctions.OOUIAlert( new OO.ui.HtmlSnippet( alert ), {\n\t\t\t\t\t\tsize: 'medium'\n\t\t\t\t\t} );\n\t\t\t\t\treturn ProcessDialog.super.prototype.getActionProcess.call(\n\t\t\t\t\t\tthis,\n\t\t\t\t\t\taction\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tVisualDataFunctions.renameObjectKey( ParentObj, CurrentKey, objName );\n\n\t\t\t\tParentObj[ objName ] = VisualDataSchemas.handleSaveArray(\n\t\t\t\t\tparentSchema,\n\t\t\t\t\tobj\n\t\t\t\t);\n\n\t\t\t\tCallback();\n\n\t\t\t\treturn new OO.ui.Process( () => {\n\t\t\t\t\tdialog.close( { action: action } );\n\t\t\t\t} );\n\t\t}\n\n\t\treturn ProcessDialog.super.prototype.getActionProcess.call( this, action );\n\t};\n\n\tProcessDialog.prototype.getTeardownProcess = function ( data ) {\n\t\treturn ProcessDialog.super.prototype.getTeardownProcess\n\t\t\t.call( this, data )\n\t\t\t.first( () => {\n\t\t\t\tWindowManager.removeActiveWindow();\n\t\t\t}, this );\n\t};\n\n\t/**\n\t * Override getBodyHeight to create a tall dialog relative to the screen.\n\t *\n\t * @return {number} Body height\n\t */\n\tProcessDialog.prototype.getBodyHeight = function () {\n\t\t// see here https://www.mediawiki.org/wiki/OOUI/Windows/Process_Dialogs\n\t\t// this.page1.content.$element.outerHeight( true );\n\t\treturn window.innerHeight - 100;\n\t};\n\n\tfunction openDialog( callback, parentObj, fieldName ) {\n\t\tCallback = callback;\n\t\tModel = {};\n\n\t\t// *** place here properties to copy\n\t\tif ( fieldName in parentObj && 'uuid' in parentObj[ fieldName ].wiki ) {\n\t\t\tModel.uuid = new VisualDataFunctions.MockupOOUIClass(\n\t\t\t\tparentObj[ fieldName ].wiki.uuid );\n\t\t}\n\n\t\tParentObj = parentObj;\n\n\t\tCurrentKey =\n\t\t\tfieldName ||\n\t\t\tVisualDataFunctions.createNewKey(\n\t\t\t\tparentObj,\n\t\t\t\tmw.msg( 'visualdata-jsmodule-formfield-newlabel' )\n\t\t\t);\n\n\t\tvar processDialog = new ProcessDialog( {\n\t\t\tsize: 'large',\n\t\t\tclasses: [],\n\t\t\tid: 'visualdata-processDialogEditField'\n\t\t} );\n\n\t\tWindowManager.newWindow( processDialog, {\n\t\t\ttitle:\n\t\t\t\tmw.msg(\n\t\t\t\t\t// The following messages are used here:\n\t\t\t\t\t// * visualdata-jsmodule-manageproperties-define-property\n\t\t\t\t\t// * visualdata-jsmodule-manageproperties-define-property - [name]\n\t\t\t\t\t'visualdata-jsmodule-formfield-definefield'\n\t\t\t\t) + ( fieldName ? ' - ' + fieldName : '' )\n\t\t} );\n\t}\n\n\treturn {\n\t\topenDialog\n\t};\n};\n","usedDeprecatedRules":[{"ruleId":"max-len","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/VisualDataForms.js","messages":[{"ruleId":"no-jquery/no-sizzle","severity":1,"message":"Selector extensions are not allowed","line":71,"column":6,"nodeType":"CallExpression","endLine":71,"endColumn":58},{"ruleId":"max-len","severity":1,"message":"This line has a length of 106. Maximum allowed is 100.","line":80,"column":1,"nodeType":"Program","messageId":"max","endLine":80,"endColumn":98},{"ruleId":"no-jquery/no-sizzle","severity":1,"message":"Selector extensions are not allowed","line":209,"column":5,"nodeType":"CallExpression","endLine":209,"endColumn":29},{"ruleId":"max-len","severity":1,"message":"This line has a length of 110. Maximum allowed is 100.","line":408,"column":1,"nodeType":"Program","messageId":"max","endLine":408,"endColumn":102},{"ruleId":"max-len","severity":1,"message":"This line has a length of 117. Maximum allowed is 100.","line":510,"column":1,"nodeType":"Program","messageId":"max","endLine":510,"endColumn":88},{"ruleId":"max-len","severity":1,"message":"This line has a length of 131. Maximum allowed is 100.","line":527,"column":1,"nodeType":"Program","messageId":"max","endLine":527,"endColumn":102},{"ruleId":"no-jquery/no-parse-html-literal","severity":1,"message":"Prefer DOM building to parsing HTML literals","line":1362,"column":26,"nodeType":"CallExpression","endLine":1362,"endColumn":78},{"ruleId":"no-jquery/no-parse-html-literal","severity":1,"message":"Prefer DOM building to parsing HTML literals","line":1430,"column":6,"nodeType":"CallExpression","endLine":1432,"endColumn":7},{"ruleId":"no-jquery/no-parse-html-literal","severity":1,"message":"Prefer DOM building to parsing HTML literals","line":1433,"column":7,"nodeType":"CallExpression","endLine":1433,"endColumn":69},{"ruleId":"no-jquery/no-parse-html-literal","severity":1,"message":"Prefer DOM building to parsing HTML literals","line":1436,"column":7,"nodeType":"CallExpression","endLine":1438,"endColumn":8},{"ruleId":"no-jquery/no-parse-html-literal","severity":1,"message":"Prefer DOM building to parsing HTML literals","line":1465,"column":7,"nodeType":"CallExpression","endLine":1467,"endColumn":8},{"ruleId":"no-jquery/no-parse-html-literal","severity":1,"message":"Prefer DOM building to parsing HTML literals","line":1468,"column":8,"nodeType":"CallExpression","endLine":1468,"endColumn":48},{"ruleId":"no-jquery/no-parse-html-literal","severity":1,"message":"Prefer DOM building to parsing HTML literals","line":1471,"column":8,"nodeType":"CallExpression","endLine":1473,"endColumn":9},{"ruleId":"no-jquery/no-parse-html-literal","severity":1,"message":"Prefer DOM building to parsing HTML literals","line":2097,"column":5,"nodeType":"CallExpression","endLine":2097,"endColumn":42},{"ruleId":"max-len","severity":1,"message":"This line has a length of 107. Maximum allowed is 100.","line":2254,"column":1,"nodeType":"Program","messageId":"max","endLine":2254,"endColumn":96},{"ruleId":"max-len","severity":1,"message":"This line has a length of 109. Maximum allowed is 100.","line":2396,"column":1,"nodeType":"Program","messageId":"max","endLine":2396,"endColumn":92},{"ruleId":"max-len","severity":1,"message":"This line has a length of 102. Maximum allowed is 100.","line":2726,"column":1,"nodeType":"Program","messageId":"max","endLine":2726,"endColumn":85},{"ruleId":"no-jquery/variable-pattern","severity":1,"message":"jQuery collection names must match the variablePattern","line":2744,"column":7,"nodeType":"VariableDeclarator","endLine":2744,"endColumn":25},{"ruleId":"max-len","severity":1,"message":"This line has a length of 102. Maximum allowed is 100.","line":2918,"column":1,"nodeType":"Program","messageId":"max","endLine":2918,"endColumn":70},{"ruleId":"no-jquery/no-sizzle","severity":1,"message":"Selector extensions are not allowed","line":3042,"column":10,"nodeType":"CallExpression","endLine":3042,"endColumn":67},{"ruleId":"max-len","severity":1,"message":"This line has a length of 108. Maximum allowed is 100.","line":3122,"column":1,"nodeType":"Program","messageId":"max","endLine":3122,"endColumn":94},{"ruleId":"max-len","severity":1,"message":"This line has a length of 105. Maximum allowed is 100.","line":3127,"column":1,"nodeType":"Program","messageId":"max","endLine":3127,"endColumn":91},{"ruleId":"no-jquery/no-parse-html-literal","severity":1,"message":"Prefer DOM building to parsing HTML literals","line":3347,"column":15,"nodeType":"CallExpression","endLine":3349,"endColumn":6},{"ruleId":"max-len","severity":1,"message":"This line has a length of 119. Maximum allowed is 100.","line":3371,"column":1,"nodeType":"Program","messageId":"max","endLine":3371,"endColumn":108},{"ruleId":"no-jquery/no-global-selector","severity":1,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":3418,"column":3,"nodeType":"CallExpression","endLine":3418,"endColumn":39}],"suppressedMessages":[{"ruleId":"no-unused-vars","severity":2,"message":"'reject' is defined but never used.","line":106,"column":42,"nodeType":"Identifier","messageId":"unusedVar","endLine":106,"endColumn":48,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'resolve' is defined but never used.","line":110,"column":44,"nodeType":"Identifier","messageId":"unusedVar","endLine":110,"endColumn":51,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'reject' is defined but never used.","line":110,"column":53,"nodeType":"Identifier","messageId":"unusedVar","endLine":110,"endColumn":59,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'item' is defined but never used.","line":136,"column":33,"nodeType":"Identifier","messageId":"unusedVar","endLine":136,"endColumn":37,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'items' is defined but never used.","line":141,"column":36,"nodeType":"Identifier","messageId":"unusedVar","endLine":141,"endColumn":41,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'reject' is defined but never used.","line":211,"column":39,"nodeType":"Identifier","messageId":"unusedVar","endLine":211,"endColumn":45,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'resolve' is defined but never used.","line":217,"column":41,"nodeType":"Identifier","messageId":"unusedVar","endLine":217,"endColumn":48,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'reject' is defined but never used.","line":217,"column":50,"nodeType":"Identifier","messageId":"unusedVar","endLine":217,"endColumn":56,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-underscore-dangle","severity":2,"message":"Unexpected dangling '_' in '_PVAL'.","line":324,"column":7,"nodeType":"MemberExpression","messageId":"unexpectedUnderscore","endLine":324,"endColumn":35,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'schema' is defined but never used.","line":368,"column":26,"nodeType":"Identifier","messageId":"unusedVar","endLine":368,"endColumn":32,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'schema' is defined but never used.","line":374,"column":26,"nodeType":"Identifier","messageId":"unusedVar","endLine":374,"endColumn":32,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-console","severity":2,"message":"Unexpected console statement.","line":577,"column":7,"nodeType":"MemberExpression","messageId":"unexpected","endLine":577,"endColumn":20,"suggestions":[{"messageId":"removeConsole","data":{"propertyName":"error"},"fix":{"range":[15762,15810],"text":""},"desc":"Remove the console.error()."}],"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":611,"column":9,"nodeType":"Program","messageId":"unexpectedTab","endLine":611,"endColumn":10,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'estimatedRemainingTime' is defined but never used.","line":684,"column":40,"nodeType":"Identifier","messageId":"unusedVar","endLine":684,"endColumn":62,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'res' is defined but never used.","line":703,"column":26,"nodeType":"Identifier","messageId":"unusedVar","endLine":703,"endColumn":29,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-inner-declarations","severity":2,"message":"Move function declaration to function body root.","line":804,"column":4,"nodeType":"FunctionDeclaration","messageId":"moveDeclToRoot","endLine":827,"endColumn":5,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-console","severity":2,"message":"Unexpected console statement.","line":864,"column":5,"nodeType":"MemberExpression","messageId":"unexpected","endLine":864,"endColumn":16,"suggestions":[{"messageId":"removeConsole","data":{"propertyName":"log"},"fix":{"range":[23042,23084],"text":""},"desc":"Remove the console.log()."}],"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-console","severity":2,"message":"Unexpected console statement.","line":869,"column":5,"nodeType":"MemberExpression","messageId":"unexpected","endLine":869,"endColumn":16,"suggestions":[{"messageId":"removeConsole","data":{"propertyName":"log"},"fix":{"range":[23185,23229],"text":""},"desc":"Remove the console.log()."}],"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1094,"column":8,"nodeType":"Program","messageId":"unexpectedTab","endLine":1094,"endColumn":9,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1095,"column":8,"nodeType":"Program","messageId":"unexpectedTab","endLine":1095,"endColumn":9,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'loadDataBeforeSelect' is assigned a value but never used.","line":1101,"column":7,"nodeType":"Identifier","messageId":"unusedVar","endLine":1101,"endColumn":27,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-console","severity":2,"message":"Unexpected console statement.","line":1124,"column":6,"nodeType":"MemberExpression","messageId":"unexpected","endLine":1124,"endColumn":19,"suggestions":[{"messageId":"removeConsole","data":{"propertyName":"error"},"fix":{"range":[30354,30395],"text":""},"desc":"Remove the console.error()."}],"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"mediawiki/msg-doc","severity":2,"message":"All possible message keys should be documented. See https://w.wiki/4r9a for details.","line":1130,"column":60,"nodeType":"CallExpression","endLine":1130,"endColumn":75,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1191,"column":8,"nodeType":"Program","messageId":"unexpectedTab","endLine":1191,"endColumn":10,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1192,"column":8,"nodeType":"Program","messageId":"unexpectedTab","endLine":1192,"endColumn":10,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1193,"column":8,"nodeType":"Program","messageId":"unexpectedTab","endLine":1193,"endColumn":9,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1194,"column":8,"nodeType":"Program","messageId":"unexpectedTab","endLine":1194,"endColumn":10,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1195,"column":8,"nodeType":"Program","messageId":"unexpectedTab","endLine":1195,"endColumn":10,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'res' is defined but never used.","line":1226,"column":14,"nodeType":"Identifier","messageId":"unusedVar","endLine":1226,"endColumn":17,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1233,"column":9,"nodeType":"Program","messageId":"unexpectedTab","endLine":1233,"endColumn":11,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1234,"column":9,"nodeType":"Program","messageId":"unexpectedTab","endLine":1234,"endColumn":11,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1235,"column":9,"nodeType":"Program","messageId":"unexpectedTab","endLine":1235,"endColumn":11,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1236,"column":9,"nodeType":"Program","messageId":"unexpectedTab","endLine":1236,"endColumn":11,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-console","severity":2,"message":"Unexpected console statement.","line":1245,"column":6,"nodeType":"MemberExpression","messageId":"unexpected","endLine":1245,"endColumn":19,"suggestions":[{"messageId":"removeConsole","data":{"propertyName":"error"},"fix":{"range":[33414,33455],"text":""},"desc":"Remove the console.error()."}],"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"mediawiki/msg-doc","severity":2,"message":"All possible message keys should be documented. See https://w.wiki/4r9a for details.","line":1251,"column":60,"nodeType":"CallExpression","endLine":1251,"endColumn":75,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1270,"column":8,"nodeType":"Program","messageId":"unexpectedTab","endLine":1270,"endColumn":9,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1274,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":1274,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1275,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":1275,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1276,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":1276,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1277,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":1277,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1278,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":1278,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1279,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":1279,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1279,"column":11,"nodeType":"Program","messageId":"unexpectedTab","endLine":1279,"endColumn":12,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1280,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":1280,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1299,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":1299,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1300,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":1300,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1301,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":1301,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"mediawiki/class-doc","severity":2,"message":"All possible CSS classes should be documented. See https://w.wiki/PS2 for details.","line":1349,"column":39,"nodeType":"ObjectExpression","endLine":1357,"endColumn":4,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1506,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":1506,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1507,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":1507,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1508,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":1508,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1509,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":1509,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1531,"column":4,"nodeType":"Program","messageId":"unexpectedTab","endLine":1531,"endColumn":5,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1544,"column":5,"nodeType":"Program","messageId":"unexpectedTab","endLine":1544,"endColumn":6,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'directive' is defined but never used.","line":1563,"column":66,"nodeType":"Identifier","messageId":"unusedVar","endLine":1563,"endColumn":75,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1574,"column":5,"nodeType":"Program","messageId":"unexpectedTab","endLine":1574,"endColumn":6,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-underscore-dangle","severity":2,"message":"Unexpected dangling '_' in 'schemaName_'.","line":1612,"column":14,"nodeType":"VariableDeclarator","messageId":"unexpectedUnderscore","endLine":1612,"endColumn":25,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-underscore-dangle","severity":2,"message":"Unexpected dangling '_' in 'schemaName_'.","line":1614,"column":18,"nodeType":"MemberExpression","messageId":"unexpectedUnderscore","endLine":1614,"endColumn":40,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-underscore-dangle","severity":2,"message":"Unexpected dangling '_' in 'schemaName_'.","line":1617,"column":7,"nodeType":"MemberExpression","messageId":"unexpectedUnderscore","endLine":1617,"endColumn":37,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-underscore-dangle","severity":2,"message":"Unexpected dangling '_' in 'schemaName_'.","line":1621,"column":6,"nodeType":"MemberExpression","messageId":"unexpectedUnderscore","endLine":1621,"endColumn":42,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-underscore-dangle","severity":2,"message":"Unexpected dangling '_' in 'schemaName_'.","line":1626,"column":19,"nodeType":"MemberExpression","messageId":"unexpectedUnderscore","endLine":1626,"endColumn":46,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-underscore-dangle","severity":2,"message":"Unexpected dangling '_' in 'schemaName_'.","line":1642,"column":6,"nodeType":"MemberExpression","messageId":"unexpectedUnderscore","endLine":1642,"endColumn":42,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-underscore-dangle","severity":2,"message":"Unexpected dangling '_' in 'schemaName_'.","line":1648,"column":5,"nodeType":"MemberExpression","messageId":"unexpectedUnderscore","endLine":1648,"endColumn":23,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-console","severity":2,"message":"Unexpected console statement.","line":1692,"column":7,"nodeType":"MemberExpression","messageId":"unexpected","endLine":1692,"endColumn":20,"suggestions":[{"messageId":"removeConsole","data":{"propertyName":"error"},"fix":{"range":[44667,44732],"text":""},"desc":"Remove the console.error()."}],"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1767,"column":10,"nodeType":"Program","messageId":"unexpectedTab","endLine":1767,"endColumn":11,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1801,"column":10,"nodeType":"Program","messageId":"unexpectedTab","endLine":1801,"endColumn":11,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'inputName' is assigned a value but never used.","line":1830,"column":10,"nodeType":"Identifier","messageId":"unusedVar","endLine":1830,"endColumn":19,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":2031,"column":5,"nodeType":"Program","messageId":"unexpectedTab","endLine":2031,"endColumn":6,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":2032,"column":5,"nodeType":"Program","messageId":"unexpectedTab","endLine":2032,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":2033,"column":5,"nodeType":"Program","messageId":"unexpectedTab","endLine":2033,"endColumn":6,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-underscore-dangle","severity":2,"message":"Unexpected dangling '_' in 'widget_'.","line":2164,"column":8,"nodeType":"VariableDeclarator","messageId":"unexpectedUnderscore","endLine":2164,"endColumn":70,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-underscore-dangle","severity":2,"message":"Unexpected dangling '_' in 'path_'.","line":2211,"column":8,"nodeType":"VariableDeclarator","messageId":"unexpectedUnderscore","endLine":2211,"endColumn":34,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-underscore-dangle","severity":2,"message":"Unexpected dangling '_' in 'widget_'.","line":2218,"column":8,"nodeType":"VariableDeclarator","messageId":"unexpectedUnderscore","endLine":2218,"endColumn":88,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-underscore-dangle","severity":2,"message":"Unexpected dangling '_' in 'thisPath_'.","line":2256,"column":9,"nodeType":"VariableDeclarator","messageId":"unexpectedUnderscore","endLine":2256,"endColumn":40,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":2293,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":2293,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":2294,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":2294,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":2295,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":2295,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":2296,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":2296,"endColumn":9,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":2297,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":2297,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":2298,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":2298,"endColumn":9,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":2299,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":2299,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":2300,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":2300,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-underscore-dangle","severity":2,"message":"Unexpected dangling '_' in 'items_'.","line":2376,"column":10,"nodeType":"VariableDeclarator","messageId":"unexpectedUnderscore","endLine":2376,"endColumn":21,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-underscore-dangle","severity":2,"message":"Unexpected dangling '_' in 'path_'.","line":2381,"column":11,"nodeType":"VariableDeclarator","messageId":"unexpectedUnderscore","endLine":2381,"endColumn":54,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-underscore-dangle","severity":2,"message":"Unexpected dangling '_' in 'pathNoIndex_'.","line":2383,"column":11,"nodeType":"VariableDeclarator","messageId":"unexpectedUnderscore","endLine":2385,"endColumn":26,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-underscore-dangle","severity":2,"message":"Unexpected dangling '_' in 'widget_'.","line":2396,"column":11,"nodeType":"VariableDeclarator","messageId":"unexpectedUnderscore","endLine":2396,"endColumn":91,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":2493,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":2493,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":2494,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":2494,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":2495,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":2495,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":2496,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":2496,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":2497,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":2497,"endColumn":9,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":2498,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":2498,"endColumn":9,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":2499,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":2499,"endColumn":9,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":2500,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":2500,"endColumn":9,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":2501,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":2501,"endColumn":10,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":2502,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":2502,"endColumn":9,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":2503,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":2503,"endColumn":10,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":2504,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":2504,"endColumn":9,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":2505,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":2505,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":2506,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":2506,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":2602,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":2602,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":2603,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":2603,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":2707,"column":21,"nodeType":"Program","messageId":"unexpectedTab","endLine":2707,"endColumn":22,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":2714,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":2714,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":2715,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":2715,"endColumn":9,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":2716,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":2716,"endColumn":9,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":2717,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":2717,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-alert","severity":2,"message":"Unexpected alert.","line":2760,"column":5,"nodeType":"CallExpression","messageId":"unexpected","endLine":2760,"endColumn":69,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":2788,"column":5,"nodeType":"Program","messageId":"unexpectedTab","endLine":2788,"endColumn":6,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-alert","severity":2,"message":"Unexpected confirm.","line":2861,"column":6,"nodeType":"CallExpression","messageId":"unexpected","endLine":2863,"endColumn":6,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-console","severity":2,"message":"Unexpected console statement.","line":2940,"column":11,"nodeType":"MemberExpression","messageId":"unexpected","endLine":2940,"endColumn":24,"suggestions":[{"messageId":"removeConsole","data":{"propertyName":"error"},"fix":{"range":[77681,77728],"text":""},"desc":"Remove the console.error()."}],"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":2952,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":2952,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3057,"column":5,"nodeType":"Program","messageId":"unexpectedTab","endLine":3057,"endColumn":6,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"mediawiki/class-doc","severity":2,"message":"All possible CSS classes should be documented. See https://w.wiki/PS2 for details.","line":3092,"column":45,"nodeType":"ObjectExpression","endLine":3099,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3123,"column":9,"nodeType":"Program","messageId":"unexpectedTab","endLine":3123,"endColumn":10,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3124,"column":9,"nodeType":"Program","messageId":"unexpectedTab","endLine":3124,"endColumn":11,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3125,"column":9,"nodeType":"Program","messageId":"unexpectedTab","endLine":3125,"endColumn":10,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3126,"column":9,"nodeType":"Program","messageId":"unexpectedTab","endLine":3126,"endColumn":10,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3127,"column":9,"nodeType":"Program","messageId":"unexpectedTab","endLine":3127,"endColumn":10,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"mediawiki/class-doc","severity":2,"message":"All possible CSS classes should be documented. See https://w.wiki/PS2 for details.","line":3155,"column":44,"nodeType":"ObjectExpression","endLine":3162,"endColumn":6,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3238,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3238,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3239,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3239,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3240,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3240,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3241,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3241,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"mediawiki/class-doc","severity":2,"message":"All possible CSS classes should be documented. See https://w.wiki/PS2 for details.","line":3281,"column":36,"nodeType":"ObjectExpression","endLine":3288,"endColumn":4,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3291,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3291,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3292,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3292,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3293,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3293,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3294,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3294,"endColumn":9,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3295,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3295,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3296,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3296,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3297,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3297,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3298,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3298,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3299,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3299,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3302,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3302,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3303,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3303,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3304,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3304,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3305,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3305,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3306,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3306,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3307,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3307,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3308,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3308,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3309,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3309,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":1,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":3321,"column":4,"nodeType":"CallExpression","endLine":3321,"endColumn":40,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3368,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3368,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3369,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3369,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3370,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3370,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3371,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3371,"endColumn":9,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3372,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3372,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3373,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3373,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3374,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3374,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3375,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3375,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3377,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3377,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3378,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3378,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3379,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3379,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3380,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3380,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3381,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3381,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3382,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3382,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3384,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3384,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3402,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3402,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3403,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3403,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3415,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3415,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'mutations' is defined but never used.","line":3513,"column":43,"nodeType":"Identifier","messageId":"unusedVar","endLine":3513,"endColumn":52,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'thisObserver' is defined but never used.","line":3513,"column":54,"nodeType":"Identifier","messageId":"unusedVar","endLine":3513,"endColumn":66,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":25,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/**\n * This file is part of the MediaWiki extension VisualData.\n *\n * VisualData is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 2 of the License, or\n * (at your option) any later version.\n *\n * VisualData is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with VisualData. If not, see <http://www.gnu.org/licenses/>.\n *\n * @file\n * @author thomas-topway-it <support@topway.it>\n * @copyright Copyright © 2021-2023, https://wikisphere.org\n */\n\n/* eslint-disable no-tabs */\n/* eslint-disable no-unused-vars */\n/* eslint-disable no-underscore-dangle */\n\nconst VisualDataForms = function ( Config, Form, FormID, Schemas, WindowManager ) {\n\tvar Model = {};\n\tvar ModelSchemas;\n\tvar OuterStack;\n\tvar PropertiesStack;\n\tvar processDialogSearch;\n\tvar DialogSearchName = 'dialogSearch';\n\tvar ToolbarMain;\n\tvar ActionToolbarMain;\n\tvar ActionWidget;\n\tvar SubmitButton;\n\tvar ValidateButton;\n\tvar GoBackButton;\n\t// var DeleteButton;\n\t// shallow copy\n\tvar RecordedSchemas = Form.schemas.slice();\n\tvar Fields;\n\tvar DialogName = 'dialogForm';\n\tvar StoredJsonData = VisualDataFunctions.deepCopy( Form.jsonData );\n\tvar ModelFlatten = [];\n\tvar SelectedSchema;\n\tvar PreviousSchemas = {};\n\tvar ProcessModel = {};\n\tvar InputWidgets;\n\tvar SchemasLayout;\n\tvar Initialized = false;\n\tvar PendingRecursive;\n\tvar QueuedWidgets = [];\n\tvar Maps = [];\n\tvar TargetSlotField;\n\n\tfunction inArray( val, arr ) {\n\t\treturn arr.indexOf( val ) !== -1;\n\t}\n\n\tfunction escapeJsonPtr( str ) {\n\t\treturn VisualDataFunctions.escapeJsonPtr( str );\n\t}\n\n\t// @FIXME destroy/reinitialize on tab change\n\tfunction showVisualEditor() {\n\t\tfunction timeOut( i ) {\n\t\t\tsetTimeout( () => {\n\t\t\t\tif (\n\t\t\t\t\tInputWidgets[ i ] &&\n\t\t\t\t\tInputWidgets[ i ].$element.parent().is( ':visible' )\n\t\t\t\t) {\n\t\t\t\t\tInputWidgets[ i ].initialize();\n\t\t\t\t}\n\t\t\t}, 100 );\n\t\t}\n\n\t\t// @IMPORTANT use \"let\" with timeout !!\n\t\tfor ( let i in InputWidgets ) {\n\t\t\tvar constructorName = InputWidgets[ i ].constructorName || InputWidgets[ i ].constructor.name;\n\t\t\tif ( constructorName === 'VisualDataVisualEditor' ||\n\t\t\t\t( 'constructorName' in InputWidgets[ i ] &&\n\t\t\t\t\tInputWidgets[ i ].constructorName === 'VisualDataVisualEditor' )\n\t\t\t) {\n\t\t\t\ttimeOut( i );\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction loadMaps() {\n\t\tfunction timeOut( obj ) {\n\t\t\t// setTimeout( function () {\n\t\t\t// @FIXME find a better way\n\t\t\tvar schemaName = obj.data.path.split( '/' )[ 0 ];\n\t\t\t// if ( obj.element.is( ':visible' ) ) {\n\t\t\tif ( schemaName === SelectedSchema ) {\n\t\t\t\tif ( obj.data.schema.wiki.coordinates === false ) {\n\t\t\t\t\tvar latFieldId = makeElementId( `${ obj.data.path }/latitude` );\n\t\t\t\t\tvar lonFieldId = makeElementId( `${ obj.data.path }/longitude` );\n\t\t\t\t\tvar escapeSelector = jQuery.escapeSelector;\n\n\t\t\t\t\tfor ( let fieldId of [ latFieldId, lonFieldId ] ) {\n\t\t\t\t\t\tlet callbackCond = function () {\n\t\t\t\t\t\t\treturn $( '#' + escapeSelector( fieldId ) ).length;\n\t\t\t\t\t\t};\n\t\t\t\t\t\tlet callback = function ( resolve, reject ) {\n\t\t\t\t\t\t\t$( '#' + escapeSelector( fieldId ) ).hide();\n\t\t\t\t\t\t\tresolve();\n\t\t\t\t\t\t};\n\t\t\t\t\t\tlet callbackMaxAttempts = function ( resolve, reject ) {\n\t\t\t\t\t\t\t$( '#' + escapeSelector( fieldId ) ).hide();\n\t\t\t\t\t\t};\n\t\t\t\t\t\tVisualDataFunctions.waitUntil(\n\t\t\t\t\t\t\tcallbackCond,\n\t\t\t\t\t\t\tcallback,\n\t\t\t\t\t\t\tcallbackMaxAttempts,\n\t\t\t\t\t\t\t5\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tmw.loader.using( 'ext.VisualData.Maptiler', () => {\n\t\t\t\t\tvar visualDataMaptiler = new VisualDataMaptiler();\n\t\t\t\t\tvisualDataMaptiler.initialize( obj.element, obj.data );\n\t\t\t\t} );\n\t\t\t}\n\t\t\t// }, 0 );\n\t\t}\n\n\t\t// @IMPORTANT use \"let\" with timeout !!\n\t\tfor ( let obj of Maps ) {\n\t\t\ttimeOut( obj );\n\t\t}\n\t}\n\n\tfunction onSetPropertiesStack( item ) {\n\t\tshowVisualEditor();\n\t\t// loadMaps();\n\t}\n\n\tfunction onChangePropertiesStack( items ) {}\n\n\tfunction onTabSelect( selectedSchema ) {\n\t\tSelectedSchema = selectedSchema;\n\t\tshowVisualEditor();\n\t\tloadMaps();\n\t}\n\n\tfunction makeElementId( path ) {\n\t\treturn `VisualDataGroupWidgetPanel-${ FormID }-${ path }`.replace(\n\t\t\t/ /g,\n\t\t\t'_'\n\t\t);\n\t}\n\n\tfunction callbackShowError( schemaName, errorMessage, errors, hiddenErrors ) {\n\n\t\t// remove previous error messages\n\t\tfor ( var i in Fields ) {\n\t\t\tif ( Fields[ i ].constructor.name === 'OoUiMessageWidget' ) {\n\t\t\t\tFields[ i ].toggle( false );\n\t\t\t} else {\n\t\t\t\tFields[ i ].setErrors( [] );\n\t\t\t}\n\t\t}\n\n\t\tif ( !schemaName ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar escapedSchemaName = escapeJsonPtr( schemaName );\n\n\t\tFields[ escapedSchemaName ].toggle( true );\n\t\tFields[ escapedSchemaName ].setType( 'error' );\n\n\t\tvar errorMessage = mw.msg( 'visualdata-jsmodule-forms-form-error' );\n\t\tif ( hiddenErrors && Object.keys( hiddenErrors ).length ) {\n\t\t\tfor ( var path in hiddenErrors ) {\n\t\t\t\terrorMessage += '<br />' + hiddenErrors[ path ];\n\t\t\t}\n\t\t}\n\n\t\tFields[ escapedSchemaName ].setLabel(\n\t\t\tnew OO.ui.HtmlSnippet( errorMessage )\n\t\t);\n\n\t\tfor ( var path in errors ) {\n\t\t\tif ( !( path in Fields ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif ( Fields[ path ].constructor.name === 'OoUiMessageWidget' ) {\n\t\t\t\tFields[ path ].setType( 'error' );\n\t\t\t\tFields[ path ].setLabel( errors[ path ] );\n\n\t\t\t\tFields[ path ].toggle( true );\n\t\t\t} else {\n\t\t\t\tFields[ path ].setErrors( [ errors[ path ] ] );\n\t\t\t}\n\t\t}\n\n\t\tselectSchema( schemaName );\n\n\t\tvar el = window.document.querySelector( '#' +\n\t\t\tjQuery.escapeSelector( makeElementId( escapedSchemaName ) ) );\n\n\t\tif ( el ) {\n\t\t\tlet callbackCond = function () {\n\t\t\t\t$( el ).is( ':visible' );\n\t\t\t};\n\t\t\tlet callback = function ( resolve, reject ) {\n\t\t\t\tel.scrollIntoView( {\n\t\t\t\t\tbehavior: 'smooth'\n\t\t\t\t} );\n\t\t\t\tresolve();\n\t\t\t};\n\t\t\tlet callbackMaxAttempts = function ( resolve, reject ) {\n\t\t\t\tel.scrollIntoView( {\n\t\t\t\t\tbehavior: 'smooth'\n\t\t\t\t} );\n\t\t\t};\n\n\t\t\tVisualDataFunctions.waitUntil(\n\t\t\t\tcallbackCond,\n\t\t\t\tcallback,\n\t\t\t\tcallbackMaxAttempts,\n\t\t\t\t5\n\t\t\t);\n\t\t}\n\t}\n\n\tfunction selectSchema( schemaName, init ) {\n\t\tif ( !schemaName ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar escapedSchemaName = escapeJsonPtr( schemaName );\n\n\t\tvar el = window.document.querySelector( '#' +\n\t\t\tjQuery.escapeSelector( makeElementId( escapedSchemaName ) ) );\n\n\t\tif ( !el ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// indexLayout\n\t\tif ( 'setTabPanel' in SchemasLayout ) {\n\t\t\tSchemasLayout.setTabPanel( schemaName );\n\n\t\t\tif ( init ) {\n\t\t\t\tSchemasLayout.on( 'set', () => {\n\t\t\t\t\tonTabSelect( SchemasLayout.getCurrentTabPanelName() );\n\t\t\t\t} );\n\t\t\t}\n\n\t\t// booklet\n\t\t} else if ( 'setPage' in SchemasLayout ) {\n\t\t\tSchemasLayout.setPage( schemaName );\n\n\t\t\tif ( init ) {\n\t\t\t\tSchemasLayout.on( 'set', () => {\n\t\t\t\t\tonTabSelect( SchemasLayout.getCurrentPageName() );\n\t\t\t\t} );\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction getInputWidget( config ) {\n\t\tvar field = config.model.schema.wiki;\n\n\t\tif ( !( 'input-config' in field ) ) {\n\t\t\tfield[ 'input-config' ] = {};\n\t\t}\n\t\tvar required = 'required' in field && field.required;\n\n\t\t// create deep copy, otherwise changes are\n\t\t// copied to Forms[ form ].properties[ property ][ 'input-config' ]\n\t\tvar inputConfig = Object.assign(\n\t\t\t{}, // *** important !! cast to object\n\t\t\tVisualDataFunctions.deepCopy( field[ 'input-config' ] ),\n\t\t\t{ value: config.data, required: required }\n\t\t);\n\n\t\tif ( 'options-values-parsed' in field ) {\n\t\t\tinputConfig.options = field[ 'options-values-parsed' ];\n\t\t}\n\n\t\tvar inputName =\n\t\t\t!( 'visibility' in field ) || field.visibility !== 'hidden' ?\n\t\t\t\tVisualDataFunctions.inputNameFromLabel(\n\t\t\t\t\tVisualDataFunctions.getPreferredInput( config.model.schema )\n\t\t\t\t) :\n\t\t\t\t'OO.ui.HiddenInputWidget';\n\n\t\t// FIXME with HiddenInputWidget, value is null (as string)\n\t\tconfig.model.inputName = inputName;\n\n\t\tif ( !( 'name' in config ) || config.name.trim() === '' ) {\n\t\t\tinputConfig.name = `${ FormID }-${ config.model.path }`;\n\t\t} else {\n\t\t\tinputConfig.name = config.name;\n\t\t}\n\n\t\tif ( Array.isArray( inputConfig.value ) ) {\n\t\t\tfor ( var i in inputConfig.value ) {\n\t\t\t\tif ( inputConfig.value[ i ].trim() === '' ) {\n\t\t\t\t\tdelete inputConfig.value[ i ];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// @see https://www.semantic-mediawiki.org/wiki/Help:Special_property_Allows_value\n\t\t// SemanticMediaWiki/src/DataValues/ValueValidator/AllowsListConstraintValueValidator.php\n\t\tif ( inArray( inputName, VisualDataFunctions.optionsInputs ) ) {\n\t\t\tif ( inputConfig.options && Object.keys( inputConfig.options ).length ) {\n\t\t\t\tinputConfig.options = VisualDataFunctions.createDropDownOptions(\n\t\t\t\t\tinputConfig.options\n\t\t\t\t);\n\t\t\t} else if ( isSMWProperty( field ) ) {\n\t\t\t\tinputConfig.options = [];\n\t\t\t\tvar SMWProperty = getSMWProperty( field );\n\t\t\t\tif ( '_PVAL' in SMWProperty.properties ) {\n\t\t\t\t\tinputConfig.options = VisualDataFunctions.createDropDownOptions(\n\t\t\t\t\t\tSMWProperty.properties._PVAL,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tkey: 'value'\n\t\t\t\t\t\t}\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tinputConfig.options = [];\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tinputConfig.options = [];\n\t\t\t}\n\t\t}\n\t\tinputConfig.data = {\n\t\t\t// path: config.model.path,\n\t\t\t// schema: config.model.schema,\n\t\t\tmodel: config.model,\n\t\t\tperformQuery\n\t\t};\n\t\treturn ( InputWidgets[ inputConfig.name ] =\n\t\t\tVisualDataFunctions.inputInstanceFromName( inputName, inputConfig ) );\n\t}\n\n\tfunction isSMWProperty( field ) {\n\t\treturn (\n\t\t\t'SMW-property' in field &&\n\t\t\tfield[ 'SMW-property' ] in VisualDataSMW.getSemanticProperties()\n\t\t);\n\t}\n\n\tfunction getSMWProperty( field ) {\n\t\tif ( 'SMW-property' in field ) {\n\t\t\treturn VisualDataSMW.getSemanticProperty( field[ 'SMW-property' ] );\n\t\t}\n\t\treturn null;\n\t}\n\n\tfunction isNewSchema( schemaName ) {\n\t\treturn !inArray( schemaName, RecordedSchemas );\n\t}\n\n\tfunction getCategories() {\n\t\treturn Form.categories;\n\t}\n\n\tfunction getFieldAlign( schema ) {\n\t\treturn 'layout-align' in Form.options ?\n\t\t\tForm.options[ 'layout-align' ] :\n\t\t\t'top';\n\t}\n\n\tfunction getHelpInline( schema ) {\n\t\treturn !( 'popup-help' in Form.options ? Form.options[ 'popup-help' ] : false );\n\t}\n\n\tfunction updateFieldsVisibility( sourceModel ) {\n\t\t// *** a more complicated solution is to loop through\n\t\t// siblings using model.parent or model.parentSchema\n\t\tvar pathParent = sourceModel.path.split( '/' ).slice( 0, -1 ).join( '/' );\n\t\tvar pathNoIndex = sourceModel.pathNoIndex.split( '/' ).slice( -1 )[ 0 ];\n\n\t\tfunction escapeRegExp( string ) {\n\t\t\treturn string.replace( /[.*+?^${}()|[\\]\\\\]/g, '\\\\$&' );\n\t\t}\n\n\t\tfor ( var i in ModelFlatten ) {\n\t\t\tvar model = ModelFlatten[ i ];\n\n\t\t\tif ( sourceModel.schemaName !== model.schemaName ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif ( pathParent !== model.path.split( '/' ).slice( 0, -1 ).join( '/' ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tvar field = model.schema.wiki;\n\t\t\tif ( !( 'showif-field' in field ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif ( field[ 'showif-field' ] !== pathNoIndex ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tvar value = VisualDataFunctions.castType( sourceModel.input.getValue(), sourceModel.schema.type );\n\t\t\tvar refValue = VisualDataFunctions.castType( field[ 'showif-value' ], sourceModel.schema.type );\n\n\t\t\tvar res;\n\t\t\tswitch ( field[ 'showif-condition' ] ) {\n\t\t\t\tcase '=':\n\t\t\t\t\tres = ( refValue === value );\n\t\t\t\t\tbreak;\n\t\t\t\tcase '!=':\n\t\t\t\t\tres = ( refValue !== value );\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'starts':\n\t\t\t\t\tres = ( value.indexOf( refValue ) === 0 );\n\t\t\t\t\tbreak;\n\t\t\t\tcase '!starts':\n\t\t\t\t\tres = ( value.indexOf( refValue ) !== 0 );\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'contains':\n\t\t\t\t\tres = ( value.indexOf( refValue ) !== -1 );\n\t\t\t\t\tbreak;\n\t\t\t\tcase '!contains':\n\t\t\t\t\tres = ( value.indexOf( refValue ) === -1 );\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'ends':\n\t\t\t\t\tvar regExp = new RegExp( escapeRegExp( refValue ) + '$' );\n\t\t\t\t\tres = regExp.test( value );\n\t\t\t\t\tbreak;\n\t\t\t\tcase '!ends':\n\t\t\t\t\tvar regExp = new RegExp( escapeRegExp( refValue ) + '$' );\n\t\t\t\t\tres = !regExp.test( value );\n\t\t\t\t\tbreak;\n\t\t\t\tcase '!null':\n\t\t\t\t\tres = ( !!value );\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'regex':\n\t\t\t\t\tvar regExp = new RegExp( refValue );\n\t\t\t\t\tres = regExp.test( value );\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tmodel.removed = !res;\n\n\t\t\t// Fields[ model.path ].toggle( res );\n\t\t\tvar el = window.document.querySelector( '#' +\n\t\t\t\tjQuery.escapeSelector( makeElementId( model.path ) ) );\n\n\t\t\t$( el ).toggle( res );\n\t\t}\n\t}\n\n\tfunction clearDependentFields( pathNoIndex ) {\n\t\tfor ( var model of ModelFlatten ) {\n\t\t\tvar field = model.schema.wiki;\n\t\t\tif ( !( 'options-askquery' in field ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tvar askQuery = field[ 'options-askquery' ];\n\t\t\tvar regExp = new RegExp( '<' + pathNoIndex + '>' );\n\t\t\tif ( regExp.test( askQuery ) ) {\n\t\t\t\tmodel.input.setValue( !model.multiselect ? '' : [] );\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction updateDependentFields( sourceModel ) {\n\n\t\t// @TODO complete with other optionsInputs\n\t\tvar allowedInputsByContructor = [\n\t\t\t'OoUiDropdownInputWidget',\n\t\t\t'OoUiMenuTagMultiselectWidget'\n\t\t];\n\t\tfor ( let model of ModelFlatten ) {\n\t\t\tlet constructorName = model.input.constructorName || model.input.constructor.name;\n\t\t\tif ( !inArray( constructorName, allowedInputsByContructor ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif ( sourceModel.schemaName !== model.schemaName ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tvar field = model.schema.wiki;\n\t\t\tif ( !( 'options-askquery' in field ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tvar askQuery = field[ 'options-askquery' ];\n\t\t\tvar regExp = new RegExp( '<' + sourceModel.pathNoIndex + '>' );\n\t\t\tif ( regExp.test( askQuery ) ) {\n\t\t\t\tProcessModel.getModel( 'schema', sourceModel.schemaName ).then( ( res ) => {\n\t\t\t\t\tfor ( var i in res.flatten ) {\n\n\t\t\t\t\t\tif ( res.flatten[ i ].pathNoIndex === sourceModel.pathNoIndex ) {\n\t\t\t\t\t\t\tperformQuery( model, res.flatten[ i ].value ).then( ( data_ ) => {\n\n\t\t\t\t\t\t\t\t// @TODO complete with other optionsInputs\n\t\t\t\t\t\t\t\tswitch ( constructorName ) {\n\t\t\t\t\t\t\t\t\tcase 'OoUiDropdownInputWidget':\n\t\t\t\t\t\t\t\t\t\t// *** @FIXME this unfortunately does not work.\n\t\t\t\t\t\t\t\t\t\t// see here https://doc.wikimedia.org/mediawiki-core/1.39.5/js/source/oojs-ui-core.html#OO-ui-DropdownInputWidget\n\t\t\t\t\t\t\t\t\t\tvar value = model.input.getValue();\n\t\t\t\t\t\t\t\t\t\tif ( !( value in data_ ) ) {\n\t\t\t\t\t\t\t\t\t\t\tvalue = null;\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tmodel.input.setOptions( VisualDataFunctions.createDropDownOptions( data_ ) );\n\t\t\t\t\t\t\t\t\t\tmodel.input.setValue( value );\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\tcase 'OoUiMenuTagMultiselectWidget':\n\t\t\t\t\t\t\t\t\t\tmodel.input.menu.clearItems();\n\t\t\t\t\t\t\t\t\t\t// Map to an array of OO.ui.MenuOptionWidgets\n\t\t\t\t\t\t\t\t\t\tvar values = model.input.getValue();\n\t\t\t\t\t\t\t\t\t\tvar items = [];\n\t\t\t\t\t\t\t\t\t\tfor ( var j in data_ ) {\n\t\t\t\t\t\t\t\t\t\t\titems.push(\n\t\t\t\t\t\t\t\t\t\t\t\tnew OO.ui.MenuOptionWidget( {\n\t\t\t\t\t\t\t\t\t\t\t\t\tdata: j,\n\t\t\t\t\t\t\t\t\t\t\t\t\tlabel: data_[ j ]\n\t\t\t\t\t\t\t\t\t\t\t\t} )\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tmodel.input.addOptions( items );\n\t\t\t\t\t\t\t\t\t\tmodel.input.setValue( values.filter( ( x ) => Object.keys( data_ ).indexOf( x ) !== -1 ) );\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t}\n\t\t}\n\t}\n\n\tasync function performQuery( model, value ) {\n\t\tvar field = model.schema.wiki;\n\t\tvar askQuery = field[ 'options-askquery' ];\n\t\tvar matches = [];\n\n\t\tvar re = /<([^<>]+)>/g;\n\t\twhile ( true ) {\n\t\t\tvar match = re.exec( askQuery );\n\t\t\tif ( !match ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tmatches.push( match );\n\t\t}\n\n\t\tfunction doQuery() {\n\t\t\tvar payload = {\n\t\t\t\taction: 'visualdata-askquery',\n\t\t\t\tdata: JSON.stringify( {\n\t\t\t\t\tquery: askQuery,\n\t\t\t\t\tproperties: field[ 'askquery-printouts' ],\n\t\t\t\t\tschema: field[ 'askquery-schema' ],\n\t\t\t\t\t'options-query-formula': field[ 'options-query-formula' ],\n\t\t\t\t\t'options-label-formula': field[ 'options-label-formula' ]\n\t\t\t\t} )\n\t\t\t};\n\n\t\t\treturn new Promise( ( resolve, reject ) => {\n\t\t\t\tnew mw.Api()\n\t\t\t\t\t.postWithToken( 'csrf', payload )\n\t\t\t\t\t.done( ( thisRes ) => {\n\t\t\t\t\t\tif ( payload.action in thisRes ) {\n\t\t\t\t\t\t\tvar thisData = thisRes[ payload.action ];\n\t\t\t\t\t\t\tthisData = JSON.parse( thisData.result );\n\t\t\t\t\t\t\tresolve( thisData );\n\t\t\t\t\t\t}\n\t\t\t\t\t} )\n\t\t\t\t\t.fail( ( thisRes ) => {\n\t\t\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\t\t\tconsole.error( 'visualdata-askquery', thisRes );\n\t\t\t\t\t\treject( thisRes );\n\t\t\t\t\t} );\n\t\t\t} ).catch( ( err ) => {\n\t\t\t\tVisualDataFunctions.OOUIAlert( `error: ${ err }`, { size: 'medium' } );\n\t\t\t} );\n\t\t}\n\n\t\tif ( matches.length ) {\n\t\t\tvar res = await ProcessModel.getModel( 'schema', model.schemaName );\n\n\t\t\t// @MUST MATCH classes/SubmitForm -> replaceFormula\n\t\t\tvar parent = model.path.slice( 0, Math.max( 0, model.path.indexOf( '/' ) ) );\n\t\t\tfor ( var match of matches ) {\n\t\t\t\tfor ( var i in res.flatten ) {\n\t\t\t\t\tif ( match[ 1 ] === 'value' ) {\n\t\t\t\t\t\taskQuery = askQuery.replace(\n\t\t\t\t\t\t\tmatch[ 0 ],\n\t\t\t\t\t\t\t// value of lookupElement\n\t\t\t\t\t\t\tvalue\n\t\t\t\t\t\t);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\t// match first names at the same level\n\t\t\t\t\tvar fullPath = parent + '/' + match[ 1 ];\n\n\t\t\t\t\tif ( fullPath in res.flatten ) {\n\t\t\t\t\t\taskQuery = askQuery.replace( match[ 0 ], res.flatten[ fullPath ].value );\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\t// var fullPath = match[1];\n\t\t\t\t\t// if (fullPath.charAt(0) !== \"/\") {\n\t\t\t\t\t// \tfullPath = \"/${ fullPath }\";\n\t\t\t\t\t// }\n\n\t\t\t\t\tif ( res.flatten[ i ].pathNoIndex === fullPath ) {\n\t\t\t\t\t\taskQuery = askQuery.replace( match[ 0 ], res.flatten[ i ].value );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn doQuery();\n\t}\n\n\tvar FileItemWidget = function ( config ) {\n\t\tconfig = config || {};\n\t\tFileItemWidget.super.call( this, config );\n\n\t\tvar self = this;\n\t\tthis.parentWidget = config.parentWidget;\n\t\tthis.parentWidget.setFileKey( null );\n\n\t\tOO.ui.mixin.GroupWidget.call(\n\t\t\tthis,\n\t\t\tObject.assign(\n\t\t\t\t{\n\t\t\t\t\t$group: this.$element\n\t\t\t\t},\n\t\t\t\tconfig\n\t\t\t)\n\t\t);\n\n\t\tvar deleteButton = new OO.ui.ButtonWidget( {\n\t\t\ticon: 'trash'\n\t\t\t// flags: [\"destructive\"],\n\t\t} );\n\n\t\tvar inputConfig = {\n\t\t\trequired: true,\n\t\t\tvalue: config.value\n\t\t};\n\n\t\tvar inputWidget = VisualDataFunctions.inputInstanceFromName(\n\t\t\t'OO.ui.TextInputWidget',\n\t\t\tinputConfig\n\t\t);\n\n\t\tthis.inputWidget = inputWidget;\n\n\t\tvar filePreview = new OO.ui.Widget( {\n\t\t\tclasses: [ 'mw-upload-bookletLayout-filePreview' ]\n\t\t} );\n\t\tvar progressBarWidget = new OO.ui.ProgressBarWidget( {\n\t\t\tprogress: 0\n\t\t} );\n\n\t\tthis.progressBarWidget = progressBarWidget;\n\t\tthis.textInputWidget = inputWidget;\n\n\t\tthis.messageWidget = new OO.ui.MessageWidget( {\n\t\t\ttype: 'error',\n\t\t\tlabel: '',\n\t\t\tinvisibleLabel: true,\n\t\t\tclasses: [ 'visualdata-upload-messagewidget' ]\n\t\t} );\n\n\t\tfilePreview.$element.append( progressBarWidget.$element );\n\t\tfilePreview.$element.append( inputWidget.$element );\n\t\tfilePreview.$element.append( this.messageWidget.$element );\n\n\t\tprogressBarWidget.toggle( !config.loaded );\n\t\tinputWidget.toggle( config.loaded );\n\t\tthis.messageWidget.toggle( false );\n\n\t\tthis.progress = function ( progress, estimatedRemainingTime ) {\n\t\t\tself.progressBarWidget.setProgress( progress * 100 );\n\t\t};\n\n\t\tthis.uploadComplete = function ( file, res ) {\n\t\t\tself.progressBarWidget.toggle( false );\n\t\t\tself.textInputWidget.toggle( true );\n\n\t\t\tself.parentWidget.setFileKey( res.upload.filekey );\n\t\t};\n\n\t\tthis.errorMessage = function ( errorMessage ) {\n\t\t\tself.textInputWidget.toggle( false );\n\t\t\tself.progressBarWidget.toggle( false );\n\n\t\t\tself.messageWidget.$element.append( errorMessage.getMessage() );\n\t\t\tself.messageWidget.toggle( true );\n\t\t};\n\n\t\tthis.fail = function ( res ) {};\n\n\t\tvar widget = new OO.ui.ActionFieldLayout( filePreview, deleteButton, {\n\t\t\tlabel: '',\n\t\t\talign: 'top'\n\t\t\t// classes: [\"inputName-\" + config.inputName],\n\t\t} );\n\n\t\tthis.$element.append( widget.$element );\n\n\t\tdeleteButton.connect( this, {\n\t\t\tclick: 'onDeleteButtonClick'\n\t\t} );\n\t};\n\n\tOO.inheritClass( FileItemWidget, OO.ui.Widget );\n\tOO.mixinClass( FileItemWidget, OO.ui.mixin.GroupWidget );\n\n\tFileItemWidget.prototype.onDeleteButtonClick = function () {\n\t\tthis.emit( 'delete', 'file' );\n\n\t\tthis.parentWidget.clearFileClick( this );\n\t};\n\n\tvar FileUploadGroupWidget = function ( config ) {\n\t\t// Configuration initialization\n\t\tconfig = config || {};\n\n\t\t// Parent constructor\n\t\tFileUploadGroupWidget.super.call( this, config );\n\n\t\t// Mixin constructors\n\t\tOO.ui.mixin.GroupElement.call(\n\t\t\tthis,\n\t\t\tObject.assign(\n\t\t\t\t{\n\t\t\t\t\t$group: this.$element\n\t\t\t\t},\n\t\t\t\tconfig\n\t\t\t)\n\t\t);\n\n\t\tthis.addItems( config.items || [] );\n\t};\n\n\tOO.inheritClass( FileUploadGroupWidget, OO.ui.Widget );\n\tOO.mixinClass( FileUploadGroupWidget, OO.ui.mixin.GroupElement );\n\n\tvar ItemWidget = function ( config ) {\n\t\tconfig = config || {};\n\t\tItemWidget.super.call( this, config );\n\n\t\tvar schema = config.model.schema;\n\t\tvar fieldAlign = getFieldAlign( schema );\n\t\tvar helpInline = getHelpInline( schema );\n\n\t\tvar inputWidget = getInputWidget( config );\n\n\t\tinputWidget.on( 'change', () => {\n\t\t\tupdateFieldsVisibility( config.model );\n\t\t\tclearDependentFields( config.model.pathNoIndex );\n\t\t} );\n\n\t\tinputWidget.$element.find( 'input' ).on( 'blur', () => {\n\t\t\tupdateFieldsVisibility( config.model );\n\t\t\tupdateDependentFields( config.model );\n\t\t} );\n\n\t\tconfig.model.input = inputWidget;\n\n\t\tModelFlatten.push( config.model );\n\n\t\tconfig.model.multiselect = VisualDataFunctions.isMultiselect(\n\t\t\tschema.wiki[ 'preferred-input' ]\n\t\t);\n\n\t\tconfig.model.isFile = config.model.inputName === 'OO.ui.SelectFileWidget';\n\n\t\tif ( config.model.isFile ) {\n\t\t\tvar fileItemWidget;\n\n\t\t\tvar restoreButton = new OO.ui.ButtonWidget( {\n\t\t\t\ticon: 'restore'\n\t\t\t} );\n\n\t\t\trestoreButton.toggle( false );\n\n\t\t\tvar fileUploadGroupWidget = new FileUploadGroupWidget( {\n\t\t\t\titems: [ inputWidget, restoreButton ]\n\t\t\t} );\n\n\t\t\tthis.setFileKey = function ( filekey ) {\n\t\t\t\tconfig.model.filekey = filekey;\n\t\t\t};\n\n\t\t\tvar loadedFiles = {};\n\n\t\t\tvar self = this;\n\n\t\t\t// @FIXME\n\t\t\t// eslint-disable-next-line no-inner-declarations\n\t\t\tfunction createFileItemWidget( filename, loaded ) {\n\t\t\t\t// inputWidget is the SelectFileWidget\n\t\t\t\tinputWidget.toggle( false );\n\n\t\t\t\t// if ( loaded ) {\n\t\t\t\tconfig.model.previousFilename = filename;\n\t\t\t\t// }\n\n\t\t\t\tvar thisFileItemWidget = new FileItemWidget( {\n\t\t\t\t\tclasses: [ 'VisualDataFileItemWidget' ],\n\t\t\t\t\tvalue: filename,\n\t\t\t\t\tloaded: loaded,\n\t\t\t\t\tparentWidget: self\n\t\t\t\t} );\n\n\t\t\t\tloadedFiles[ filename ] = thisFileItemWidget;\n\t\t\t\tfileUploadGroupWidget.addItems( [ thisFileItemWidget ] );\n\n\t\t\t\t// overwrite the model, we want to\n\t\t\t\t// validate the filename\n\t\t\t\tconfig.model.input = thisFileItemWidget.inputWidget;\n\n\t\t\t\treturn thisFileItemWidget;\n\t\t\t}\n\n\t\t\t// create fileItemWidget with existing filename\n\t\t\tif ( typeof config.data === 'string' && config.data.trim() !== '' ) {\n\t\t\t\tfileItemWidget = createFileItemWidget( config.data, true );\n\t\t\t}\n\n\t\t\tthis.clearFileClick = function ( item ) {\n\t\t\t\trestoreButton.toggle( true );\n\n\t\t\t\t// inputWidget is the SelectFileWidget\n\t\t\t\tinputWidget.toggle( true );\n\t\t\t\tinputWidget.setValue( null );\n\n\t\t\t\t// TextInputWidget used for validation\n\t\t\t\tconfig.model.input.setValue( null );\n\n\t\t\t\t// this will remove fileItemWidget\n\t\t\t\tfileUploadGroupWidget.removeItems( [ item ] );\n\t\t\t};\n\n\t\t\trestoreButton.on( 'click', () => {\n\t\t\t\tinputWidget.toggle( false );\n\t\t\t\trestoreButton.toggle( false );\n\t\t\t\tfileUploadGroupWidget.removeItems( [ fileItemWidget ] );\n\t\t\t\tfileItemWidget = createFileItemWidget(\n\t\t\t\t\t// the previous content of fileItemWidget.inputWidget\n\t\t\t\t\t// (a TextInputWidget with filename)\n\t\t\t\t\tconfig.model.previousFilename,\n\t\t\t\t\ttrue\n\t\t\t\t);\n\t\t\t} );\n\n\t\t\t// @FIXME move to FileItemWidget\n\n\t\t\tthis.on( 'fileUploaded', ( file ) => {\n\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\tconsole.log( 'event fileUploaded', file );\n\t\t\t} );\n\n\t\t\tthis.on( 'fileUploadInit', ( file ) => {\n\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\tconsole.log( 'event fileUploadInit', file );\n\t\t\t\trestoreButton.toggle( false );\n\t\t\t\tfileItemWidget = createFileItemWidget( file.name, false );\n\t\t\t} );\n\n\t\t\tthis.on(\n\t\t\t\t'fileUploadProgress',\n\t\t\t\t( file, progress, estimatedRemainingTime ) => {\n\t\t\t\t\tloadedFiles[ file.name ].progress( progress, estimatedRemainingTime );\n\t\t\t\t}\n\t\t\t);\n\n\t\t\tthis.on( 'fileUploadComplete', ( file, res ) => {\n\t\t\t\tloadedFiles[ file.name ].uploadComplete( file, res );\n\t\t\t} );\n\n\t\t\tthis.on( 'fileUploadErrorMessage', ( file, errorMessage ) => {\n\t\t\t\tloadedFiles[ file.name ].errorMessage( errorMessage );\n\t\t\t} );\n\n\t\t\tthis.on( 'fileUploadFail', ( file, res ) => {\n\t\t\t\tloadedFiles[ file.name ].fail( res );\n\t\t\t} );\n\n\t\t\tvar upload = new VisualDataUpload();\n\t\t\tupload.initialize( inputWidget, this );\n\t\t\tinputWidget.on( 'change', upload.uploadFiles.bind( upload ) );\n\t\t}\n\n\t\t// schema.description is removed if wiki['help-message'] was \"\"\n\t\tvar helpMessage = ( 'help-message' in schema.wiki && 'description' in schema ? schema.description : '' );\n\n\t\tvar fieldLayout = new OO.ui.FieldLayout(\n\t\t\t!config.model.isFile ? inputWidget : fileUploadGroupWidget, {\n\t\t\t\tlabel: new OO.ui.HtmlSnippet( 'label' in schema.wiki && 'title' in schema ? schema.title : '' ),\n\t\t\t\talign: fieldAlign,\n\t\t\t\thelpInline: helpMessage ? helpInline : true,\n\t\t\t\thelp: new OO.ui.HtmlSnippet( helpMessage )\n\t\t\t\t// classes: [`visualdata-input-${ config.model.path }`],\n\t\t\t}\n\t\t);\n\n\t\tFields[ config.model.path ] = fieldLayout;\n\n\t\tthis.$element.append( fieldLayout.$element );\n\t};\n\n\tOO.inheritClass( ItemWidget, OO.ui.Widget );\n\tOO.mixinClass( ItemWidget, OO.ui.mixin.GroupWidget );\n\n\t// @see https://gerrit.wikimedia.org/r/plugins/gitiles/oojs/ui/+/c2805c7e9e83e2f3a857451d46c80231d1658a0f/demos/classes/SearchWidgetDialog.js\n\tfunction ProcessDialogSearch( config ) {\n\t\tProcessDialogSearch.super.call( this, config );\n\t}\n\tOO.inheritClass( ProcessDialogSearch, OO.ui.ProcessDialog );\n\tProcessDialogSearch.static.name = DialogSearchName;\n\n\tProcessDialogSearch.prototype.initialize = function () {\n\t\tProcessDialogSearch.super.prototype.initialize.apply( this, arguments );\n\t\tvar self = this;\n\t\tvar selectedSchemas = Form.schemas;\n\t\tthis.selectedItems = [];\n\t\tfunction getItems( value ) {\n\t\t\tvar values;\n\t\t\tswitch ( self.data.toolName ) {\n\t\t\t\tcase 'addremoveschemas':\n\t\t\t\t\tself.selectedItems = selectedSchemas;\n\t\t\t\t\tvalues = Object.keys( Schemas );\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tif ( value ) {\n\t\t\t\tvar valueLowerCase = value.toLowerCase();\n\t\t\t\tvalues = values.filter(\n\t\t\t\t\t( x ) => x.toLowerCase().indexOf( valueLowerCase ) !== -1\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn values.map( ( x ) => {\n\t\t\t\tvar menuOptionWidget = new OO.ui.MenuOptionWidget( {\n\t\t\t\t\tdata: x,\n\t\t\t\t\tlabel: x,\n\t\t\t\t\tselected: inArray( x, self.selectedItems )\n\t\t\t\t} );\n\t\t\t\treturn menuOptionWidget;\n\t\t\t} );\n\t\t}\n\n\t\tvar searchWidget = new OO.ui.SearchWidget( {\n\t\t\t// id: \"visualdata-import-search-widget\",\n\t\t} );\n\n\t\tsearchWidget.results.addItems( getItems() );\n\n\t\t// searchWidget.getResults() is a SelectWidget\n\t\t// https://doc.wikimedia.org/oojs-ui/master/js/#!/api/OO.ui.SelectWidget\n\t\tvar searchWidgetResults = searchWidget.getResults();\n\t\tsearchWidgetResults.multiselect = true;\n\n\t\tsearchWidgetResults.on( 'press', ( value ) => {\n\t\t\tif ( value === null ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif ( inArray( value.data, self.selectedItems ) ) {\n\t\t\t\tself.selectedItems.splice( self.selectedItems.indexOf( value.data ), 1 );\n\t\t\t} else {\n\t\t\t\tself.selectedItems.push( value.data );\n\t\t\t}\n\t\t} );\n\t\tsearchWidget.onQueryChange = function ( value ) {\n\t\t\tsearchWidget.results.clearItems();\n\t\t\tsearchWidget.results.addItems( getItems( value ) );\n\t\t};\n\n\t\tthis.$body.append( [ searchWidget.$element ] );\n\t};\n\n\tProcessDialogSearch.prototype.getBodyHeight = function () {\n\t\treturn 300;\n\t};\n\n\tProcessDialogSearch.static.actions = [\n\t\t{\n\t\t\taction: 'save',\n\t\t\t// modes: \"edit\",\n\t\t\tlabel: mw.msg( 'visualdata-jsmodule-forms-searchdialog-save' ),\n\t\t\tflags: [ 'primary', 'progressive' ]\n\t\t},\n\t\t{\n\t\t\t// modes: \"edit\",\n\t\t\tlabel: mw.msg( 'visualdata-jsmodule-forms-cancel' ),\n\t\t\tflags: [ 'safe', 'close' ]\n\t\t}\n\t];\n\tProcessDialogSearch.prototype.getActionProcess = function ( action ) {\n\t\tvar dialog = this;\n\n\t\tif ( action === 'save' ) {\n\t\t\tvar values = processDialogSearch.selectedItems;\n\t\t\t// ProcessModel.getModel(\"fetch\").then(function (res) {\n\t\t\t// Form.jsonData.schemas = res;\n\n\t\t\tswitch ( dialog.data.toolName ) {\n\t\t\t\tcase 'addremoveschemas':\n\t\t\t\t\tfor ( var i in ModelSchemas ) {\n\t\t\t\t\t\tif ( !inArray( i, values ) ) {\n\t\t\t\t\t\t\t// delete Form.jsonData.schemas[ i ];\n\t\t\t\t\t\t\tdelete ModelSchemas[ i ];\n\t\t\t\t\t\t\tdelete Fields[ i ];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tvar missingSchemas = [];\n\t\t\t\t\tfor ( var i of values ) {\n\t\t\t\t\t\tif ( !( i in Schemas ) || !Object.keys( Schemas[ i ] ).length ) {\n\t\t\t\t\t\t\tmissingSchemas.push( i );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// select first schema of new selection\n\t\t\t\t\tfor ( var i of values ) {\n\t\t\t\t\t\tif ( !( i in ModelSchemas ) ) {\n\t\t\t\t\t\t\tSelectedSchema = i;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( missingSchemas.length ) {\n\t\t\t\t\t\tVisualData.loadSchemas( missingSchemas );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tupdatePanels();\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\t// });\n\t\t}\n\n\t\treturn new OO.ui.Process( () => {\n\t\t\tdialog.close( { action: action } );\n\t\t} );\n\n\t\t// return ProcessDialog.super.prototype.getActionProcess.call( this, action );\n\t};\n\tProcessDialogSearch.prototype.getTeardownProcess = function ( data ) {\n\t\treturn ProcessDialogSearch.super.prototype.getTeardownProcess\n\t\t\t.call( this, data )\n\t\t\t.first( () => {\n\t\t\t\tWindowManager.removeActiveWindow();\n\t\t\t}, this );\n\t};\n\n\tfunction openSearchDialog( toolName ) {\n\t\tprocessDialogSearch = new ProcessDialogSearch( {\n\t\t\tsize: 'medium',\n\t\t\t// classes: [\"visualdata-search-dialog\"],\n\t\t\tdata: { toolName: toolName }\n\t\t} );\n\n\t\tWindowManager.newWindow( processDialogSearch, {\n\t\t\ttitle: mw.msg(\n\t\t\t\t'visualdata-jsmodule-forms-dialogsearch-selectschemas'\n\t\t\t)\n\t\t} );\n\t}\n\n\t// @see https://doc.wikimedia.org/oojs-ui/master/js/#!/api/OO.ui.Toolbar\n\t// @see https://gerrit.wikimedia.org/r/plugins/gitiles/oojs/ui/+/c2805c7e9e83e2f3a857451d46c80231d1658a0f/demos/pages/toolbars.js\n\tfunction createToolbar( /* disabled */ ) {\n\t\tvar toolFactory = new OO.ui.ToolFactory();\n\t\tvar toolGroupFactory = new OO.ui.ToolGroupFactory();\n\n\t\tvar toolbar = new OO.ui.Toolbar( toolFactory, toolGroupFactory, {\n\t\t\tactions: true\n\t\t} );\n\n\t\tvar onSelect = function ( self ) {\n\t\t\tvar self = arguments.length ? self : this;\n\t\t\tvar toolName = self.getName();\n\n\t\t\tswitch ( toolName ) {\n\t\t\t\tcase 'addremoveschemas':\n\t\t\t\t\topenSearchDialog( toolName );\n\t\t\t\t\tbreak;\n\t\t\t\t// case \"createschema\":\n\t\t\t\t// \tVisualDataSchemas.openDialog(null, false);\n\t\t\t\t// \tbreak;\n\t\t\t}\n\n\t\t\tself.setActive( false );\n\t\t};\n\n\t\tvar loadDataBeforeSelect = function () {\n\t\t\tvar dataToLoad = VisualData.matchLoadedData( Config, [\n\t\t\t\t'schemas'\n\t\t\t] );\n\n\t\t\tif ( !dataToLoad.length ) {\n\t\t\t\treturn onSelect( this );\n\t\t\t}\n\n\t\t\tthis.setDisabled( true );\n\t\t\tthis.pushPending();\n\n\t\t\tVisualData.loadData( Config, dataToLoad )\n\t\t\t\t.then( ( res ) => {\n\t\t\t\t\tif ( 'schemas' in res ) {\n\t\t\t\t\t\tSchemas = res.schemas;\n\t\t\t\t\t}\n\t\t\t\t\tthis.setDisabled( false );\n\t\t\t\t\tthis.popPending();\n\t\t\t\t\tonSelect( this );\n\t\t\t\t} )\n\t\t\t\t.catch( ( error ) => {\n\t\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\t\tconsole.error( 'loadData error', error );\n\t\t\t\t\tthis.popPending();\n\t\t\t\t\tthis.setDisabled( false );\n\t\t\t\t\tthis.setActive( false );\n\n\t\t\t\t\t// eslint-disable-next-line mediawiki/msg-doc\n\t\t\t\t\tVisualDataFunctions.OOUIAlert( new OO.ui.HtmlSnippet( mw.msg( error ) ), {\n\t\t\t\t\t\tsize: 'medium'\n\t\t\t\t\t} );\n\t\t\t\t} );\n\t\t};\n\n\t\tvar toolGroup = [];\n\n\t\tif ( Config.context !== 'parserfunction' ) {\n\t\t\ttoolGroup.push( {\n\t\t\t\tname: 'addremoveschemas',\n\t\t\t\ticon: 'add',\n\t\t\t\ttitle: mw.msg(\n\t\t\t\t\t'visualdata-jsmodule-forms-addremoveschemas'\n\t\t\t\t),\n\t\t\t\tonSelect: onSelect\n\t\t\t} );\n\t\t}\n\n\t\tVisualDataFunctions.createToolGroup( toolFactory, 'group', toolGroup );\n\n\t\ttoolbar.setup( [\n\t\t\t{\n\t\t\t\tname: 'my-group',\n\t\t\t\t// type: \"bar\",\n\t\t\t\t// label: \"Create property\",\n\t\t\t\tinclude: [ { group: 'group' } ]\n\t\t\t}\n\t\t] );\n\n\t\treturn toolbar;\n\t}\n\n\tfunction createActionToolbar( /* disabled */ ) {\n\t\t// see https://gerrit.wikimedia.org/r/plugins/gitiles/oojs/ui/+/refs/tags/v0.40.4/demos/pages/toolbars.js\n\t\tvar toolFactory = new OO.ui.ToolFactory();\n\t\tvar toolGroupFactory = new OO.ui.ToolGroupFactory();\n\n\t\tvar toolbar = new OO.ui.Toolbar( toolFactory, toolGroupFactory, {\n\t\t\tactions: false\n\t\t} );\n\n\t\tvar onSelect = function ( self ) {\n\t\t\tvar self = arguments.length ? self : this;\n\t\t\tvar selected = self.getName();\n\n\t\t\tvar panels = OuterStack.getItems();\n\t\t\tfor ( var panel of panels ) {\n\t\t\t\tif ( panel.getData().name === selected ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tOuterStack.setItem( panel );\n\n\t\t\t// *** this prevents inconsistencies of the datatable layout\n\t\t\tswitch ( selected ) {\n\t\t\t\tcase 'manage-schemas':\n\t\t\t\t\tVisualDataSchemas.initialize();\n\t\t\t\t\tbreak;\n\t\t\t\t// case \"manage-forms\":\n\t\t\t\t// \t\tVisualDataForms.initialize();\n\t\t\t\t// \t\tbreak;\n\t\t\t\t// \tcase \"manage-semantic-properties\":\n\t\t\t\t// \t\tVisualDataSMW.initialize();\n\t\t\t\t// \t\tbreak;\n\t\t\t}\n\n\t\t\tself.setActive( false );\n\t\t};\n\n\t\tvar loadDataBeforeSelect = function () {\n\t\t\tvar dataToLoad = VisualData.matchLoadedData( Config, [\n\t\t\t\t// \"forms\",\n\t\t\t\t'schemas'\n\t\t\t\t// \"semantic-properties\",\n\t\t\t\t// \"imported-vocabularies\",\n\t\t\t\t// \"type-labels\",\n\t\t\t\t// \"property-labels\",\n\t\t\t] );\n\n\t\t\tif ( !dataToLoad.length ) {\n\t\t\t\treturn onSelect( this );\n\t\t\t}\n\n\t\t\t// this.setDisabled(true);\n\t\t\t// this.pushPending();\n\n\t\t\tActionWidget = new OO.ui.ActionWidget();\n\t\t\tToolbarMain.$bar.wrapInner( '<div class=\"wrapper\"></div>' );\n\t\t\tActionWidget.setPendingElement( ToolbarMain.$bar.find( '.wrapper' ) );\n\t\t\tActionWidget.pushPending();\n\n\t\t\t$( ToolbarMain.$bar ).find( '.wrapper' ).css( 'pointer-events', 'none' );\n\n\t\t\tVisualData.loadData( Config, dataToLoad )\n\t\t\t\t.then( ( res ) => {\n\t\t\t\t\t// this.setDisabled(false);\n\t\t\t\t\t// this.popPending();\n\t\t\t\t\tActionWidget.popPending();\n\t\t\t\t\t$( ToolbarMain.$bar ).find( '.wrapper' ).css( 'pointer-events', 'auto' );\n\n\t\t\t\t\t// VisualDataSMW.initialize(\n\t\t\t\t\t// \t\tSelf,\n\t\t\t\t\t// \t\tres[\"imported-vocabularies\"],\n\t\t\t\t\t// \t\tres[\"type-labels\"],\n\t\t\t\t\t// \t\tres[\"property-labels\"]\n\t\t\t\t\t// );\n\n\t\t\t\t\t// VisualDataForms.initialize(Self, Forms);\n\n\t\t\t\t\tonSelect( this );\n\t\t\t\t} )\n\t\t\t\t.catch( ( error ) => {\n\t\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\t\tconsole.error( 'loadData error', error );\n\t\t\t\t\tActionWidget.popPending();\n\t\t\t\t\t$( ToolbarMain.$bar ).find( '.wrapper' ).css( 'pointer-events', 'auto' );\n\t\t\t\t\tthis.setActive( false );\n\n\t\t\t\t\t// eslint-disable-next-line mediawiki/msg-doc\n\t\t\t\t\tVisualDataFunctions.OOUIAlert( new OO.ui.HtmlSnippet( mw.msg( error ) ), {\n\t\t\t\t\t\tsize: 'medium'\n\t\t\t\t\t} );\n\t\t\t\t} );\n\t\t};\n\n\t\tvar toolGroup = [\n\t\t\t{\n\t\t\t\tname: 'visualdata',\n\t\t\t\ticon: null,\n\t\t\t\ttitle: mw.msg( 'visualdata-jsmodule-forms-edit-data' ),\n\t\t\t\tonSelect: onSelect\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'manage-schemas',\n\t\t\t\ticon: null,\n\t\t\t\ttitle: mw.msg( 'visualdata-jsmodule-forms-manage-schemas' ),\n\t\t\t\tonSelect: loadDataBeforeSelect\n\t\t\t\t// config: {\n\t\t\t\t// \tdata: { disabled: disabled },\n\t\t\t\t// },\n\t\t\t}\n\t\t\t// {\n\t\t\t// \tname: 'manage-forms',\n\t\t\t// \ticon: null,\n\t\t\t// \ttitle: mw.msg( 'visualdata-jsmodule-forms-manage-forms' ),\n\t\t\t// \tonSelect: loadDataBeforeSelect\n\t\t\t// \t// config: {\n\t\t\t// \t// \tdata: { disabled: disabled },\n\t\t\t// \t// },\n\t\t\t// }\n\t\t];\n\n\t\ttoolbar.setup( [\n\t\t\t// see https://gerrit.wikimedia.org/r/plugins/gitiles/oojs/ui/+/c2805c7e9e83e2f3a857451d46c80231d1658a0f/demos/pages/toolbars.js\n\t\t\t{\n\t\t\t\tname: 'editorSwitch',\n\t\t\t\talign: 'after',\n\t\t\t\ttype: 'list',\n\t\t\t\tlabel: 'Switch editor',\n\t\t\t\tinvisibleLabel: true,\n\t\t\t\ticon: 'menu',\n\t\t\t\tinclude: [ { group: 'selectSwitch' } ]\n\t\t\t}\n\t\t] );\n\n\t\t// @see https://gerrit.wikimedia.org/r/plugins/gitiles/oojs/ui/+/c2805c7e9e83e2f3a857451d46c80231d1658a0f/demos/pages/toolbars.js\n\t\t// VisualDataFunctions.createDisabledToolGroup(\n\t\t// \ttoolGroupFactory,\n\t\t// \tOO.ui.ListToolGroup,\n\t\t// \t\"editorSwitch\",\n\t\t// );\n\n\t\tVisualDataFunctions.createToolGroup(\n\t\t\ttoolFactory,\n\t\t\t'selectSwitch',\n\t\t\ttoolGroup\n\t\t);\n\n\t\treturn toolbar;\n\t}\n\n\tvar GroupWidget = function ( config, data ) {\n\t\tconfig = config || {};\n\t\tGroupWidget.super.call( this, config );\n\n\t\tOO.ui.mixin.GroupWidget.call(\n\t\t\tthis,\n\t\t\tObject.assign( { $group: this.$element }, config )\n\t\t);\n\t\t// OO.EventEmitter.call( this );\n\n\t\tthis.data = data;\n\n\t\tfunction showBorder() {\n\t\t\tif (\n\t\t\t\tdata.root ||\n\t\t\t\tdata.schema.wiki.type === 'content-block' ||\n\t\t\t\tdata.schema.wiki.type === 'property'\n\t\t\t) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tdata.schema.type === 'array' &&\n\t\t\t\tVisualDataFunctions.getNestedProp( [ 'items', 'wiki', 'preferred-input' ], data.schema ) &&\n\t\t\t\tdata.schema.items.type !== 'object' &&\n\t\t\t\tVisualDataFunctions.isMultiselect(\n\t\t\t\t\tdata.schema.items.wiki[ 'preferred-input' ]\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\t\tvar showBorderValue = showBorder();\n\n\t\t// eslint-disable-next-line mediawiki/class-doc\n\t\tvar layout = new OO.ui.PanelLayout( {\n\t\t\texpanded: false,\n\t\t\tpadded: showBorderValue,\n\t\t\tframed: showBorderValue,\n\t\t\tclasses: [\n\t\t\t\t'VisualDataGroupWidgetPanel' + ( !showBorderValue ? '-border' : '' )\n\t\t\t],\n\t\t\tid: makeElementId( data.path )\n\t\t} );\n\n\t\tthis.layout = layout;\n\n\t\tif ( data.root ) {\n\t\t\tvar $containerRight = $( '<div class=\"visualdata-form-container-right\">' );\n\t\t\tlayout.$element.append( $containerRight );\n\n\t\t\tif ( Config.context === 'EditData' ) {\n\t\t\t\tvar deleteButton = new OO.ui.ButtonWidget( {\n\t\t\t\t\ticon: 'trash',\n\t\t\t\t\tframed: false,\n\t\t\t\t\tlabel: mw.msg( 'visualdata-jsmodule-forms-delete-schema' ),\n\t\t\t\t\tinvisibleLabel: true,\n\t\t\t\t\tflags: [ 'destructive' ]\n\t\t\t\t} );\n\n\t\t\t\tdeleteButton.on( 'click', () => {\n\t\t\t\t\tForm.schemas.splice( Form.schemas.indexOf( data.schema.wiki.name ), 1 );\n\t\t\t\t\t// delete Form.jsonData.schemas[ data.schema.wiki.name ];\n\t\t\t\t\tdelete ModelSchemas[ data.schema.wiki.name ];\n\t\t\t\t\tdelete Fields[ data.schema.wiki.name ];\n\t\t\t\t\tupdatePanels();\n\t\t\t\t} );\n\n\t\t\t\t$containerRight.append( deleteButton.$element );\n\t\t\t}\n\n\t\t\tif ( Config.canmanageschemas ) {\n\t\t\t\tvar editButton = new OO.ui.ButtonWidget( {\n\t\t\t\t\t// 'settings'\n\t\t\t\t\ticon: 'edit',\n\t\t\t\t\tframed: false,\n\t\t\t\t\tlabel: mw.msg( 'visualdata-jsmodule-forms-edit-schema' ),\n\t\t\t\t\tinvisibleLabel: true\n\t\t\t\t\t// classes: [\"VisualDataOptionsListDeleteButton\"],\n\t\t\t\t} );\n\n\t\t\t\teditButton.on( 'click', () => {\n\t\t\t\t\tVisualDataSchemas.openSchemaDialog(\n\t\t\t\t\t\t[ data.schema.wiki.name ],\n\t\t\t\t\t\t'properties'\n\t\t\t\t\t);\n\t\t\t\t} );\n\n\t\t\t\t$containerRight.append( editButton.$element );\n\t\t\t}\n\t\t}\n\n\t\tvar messageWidget = new OO.ui.MessageWidget( {\n\t\t\tclasses: [ 'VisualDataGroupWidgetMessageWidget' ]\n\t\t} );\n\n\t\t// @TODO toggle parent as well if all children\n\t\t// aren't visible\n\t\tthis.toggle(\n\t\t\t!VisualDataFunctions.getNestedProp(\n\t\t\t\t[ 'schema', 'options', 'hidden' ],\n\t\t\t\tdata\n\t\t\t)\n\t\t);\n\n\t\tmessageWidget.toggle( false );\n\n\t\tFields[ data.path ] = messageWidget;\n\n\t\tlayout.$element.append( messageWidget.$element );\n\n\t\tswitch ( data.schema.wiki.layout ) {\n\t\t\tcase 'horizontal':\n\t\t\t\tthis.layoutHorizontal = new OO.ui.HorizontalLayout();\n\n\t\t\t\tlayout.$element.append(\n\t\t\t\t\t$(\n\t\t\t\t\t\t'<div class=\"visualdata-form-table-multiple-fields\" style=\"display: table\">'\n\t\t\t\t\t).append( [\n\t\t\t\t\t\t$( '<div style=\"display: table-cell;vertical-align:middle\">' ).append(\n\t\t\t\t\t\t\tthis.layoutHorizontal.$element\n\t\t\t\t\t\t),\n\t\t\t\t\t\t$(\n\t\t\t\t\t\t\t'<div class=\"visualdata-horizontal-section-remove-row\" style=\"display: table-cell\">'\n\t\t\t\t\t\t)\n\t\t\t\t\t] )\n\t\t\t\t);\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\t// title and description are mapped to label and\n\t\t\t\t// help-message in the property field, and\n\t\t\t\t// schema.wiki.title and schema.wiki.description\n\t\t\t\t// contain the wikitext, not the parsed output\n\n\t\t\t\tthis.fieldset = new OO.ui.FieldsetLayout( {\n\t\t\t\t\tlabel: new OO.ui.HtmlSnippet( 'title' in data.schema.wiki && 'title' in data.schema ? data.schema.title : '' )\n\t\t\t\t} );\n\n\t\t\t\tif ( 'description' in data.schema.wiki && 'description' in data.schema ) {\n\t\t\t\t\tthis.fieldset.addItems( [\n\t\t\t\t\t\tnew OO.ui.Element( {\n\t\t\t\t\t\t\tcontent: [\n\t\t\t\t\t\t\t\tnew OO.ui.HtmlSnippet( data.schema.description )\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t} )\n\t\t\t\t\t] );\n\t\t\t\t}\n\n\t\t\t\tif ( data.schema.wiki.layout === 'table' ) {\n\t\t\t\t\tlayout.$element.append(\n\t\t\t\t\t\t$(\n\t\t\t\t\t\t\t'<div class=\"visualdata-form-table-multiple-fields\" style=\"display: table\">'\n\t\t\t\t\t\t).append( [\n\t\t\t\t\t\t\t$( '<div style=\"display: table-cell\">' ).append(\n\t\t\t\t\t\t\t\tthis.fieldset.$element\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t$(\n\t\t\t\t\t\t\t\t'<div class=\"visualdata-horizontal-section-remove-row\" style=\"display: table-cell\">'\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t] )\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tlayout.$element.append( this.fieldset.$element );\n\t\t\t\t}\n\n\t\t\t\tif ( data.schema.wiki.type === 'geolocation' && data.schema.wiki.map === true ) {\n\t\t\t\t\tif ( !Maps.length ) {\n\t\t\t\t\t\t( new VisualDataMaptiler() ).load();\n\t\t\t\t\t}\n\t\t\t\t\tMaps.push( { data, element: layout.$element } );\n\t\t\t\t}\n\n\t\t\t\tthis.connect( this, {\n\t\t\t\t\tformLoaded: 'formLoaded'\n\t\t\t\t} );\n\t\t}\n\n\t\t/*\n\t\t// @TODO implement button switch for oneOf, anyOf\n\t\tthis.buttonSelectWidget = new OO.ui.ButtonSelectWidget();\n\n\t\tvar self = this;\n\t\tthis.buttonSelectWidget.on(\"choose\", function (item, seleted) {\n\t\t\tself.booklet.setPage(item.data);\n\t\t});\n\n\t\tlayout.$element.append(this.buttonSelectWidget.$element);\n\n\t\t// var directives = [ 'anyOf', 'oneOf', 'allOf' ];\n\n\t\t// for ( var directive of directives ) {\n\t\t// \tthis['fieldset-' + directive] = new OO.ui.FieldsetLayout({\n\t\t// \t\t// label: data.wiki.title,\n\t\t// \t});\n\t\t// \tlayout.$element.append(this['fieldset-' + directive].$element);\n\t\t// }\n\n\t\tthis.booklet = new OO.ui.BookletLayout({\n\t\t\toutlined: false,\n\t\t\texpanded: true,\n\t\t\tpadded: false,\n\t\t\tclasses: [\"VisualDataGroupWidgetBooklet\"],\n\t\t});\n\n\t\tlayout.$element.append(this.booklet.$element);\n\n\t\t*/\n\n\t\tthis.$element.append( layout.$element );\n\t};\n\n\tOO.inheritClass( GroupWidget, OO.ui.Widget );\n\tOO.mixinClass( GroupWidget, OO.ui.mixin.GroupWidget );\n\t// OO.mixinClass( GroupWidget, OO.EventEmitter );\n\n\tGroupWidget.prototype.formLoaded = function () {\n\t//\tif ( this.data.root === true ) {\n\t\tsetTimeout( () => {\n\t\t\tVisualDataFunctions.removeNbspFromLayoutHeader( 'form' );\n\t\t}, 30 );\n\n\t\tsetTimeout( () => {\n\t\t\tVisualDataFunctions.removeNbspFromLayoutHeader(\n\t\t\t\t'#visualdataform-wrapper-dialog-' + FormID\n\t\t\t);\n\t\t}, 30 );\n\n\t\t// *** we use mutationChange instead\n\t\t// for ( var model of ModelFlatten ) {\n\t\t//\tupdateFieldsVisibility( model );\n\t\t// }\n\n\t\tloadMaps();\n\n\t\tfor ( var model of ModelFlatten ) {\n\t\t\tupdateDependentFields( model );\n\t\t}\n\t\t// }\n\t};\n\n\tGroupWidget.prototype.addItems = function ( items ) {\n\t\tif ( this.data.schema.wiki.layout === 'horizontal' ) {\n\t\t\tthis.layoutHorizontal.addItems( items );\n\t\t} else {\n\t\t\tthis.fieldset.addItems( items );\n\t\t}\n\t};\n\n\tGroupWidget.prototype.addCombinedItem = function ( item, title, directive ) {\n\t\t// this['fieldset-' + directive].addItems(items);\n\n\t\tvar items = [\n\t\t\tnew OO.ui.ButtonOptionWidget( {\n\t\t\t\tdata: title,\n\t\t\t\tlabel: title\n\t\t\t} )\n\t\t];\n\t\tthis.buttonSelectWidget.addItems( items );\n\n\t\t//\tthis['fieldset-' + directive]..addItems(items);\n\n\t\tif ( this.buttonSelectWidget.items.length === 1 ) {\n\t\t\tthis.buttonSelectWidget.selectItem( items[ 0 ] );\n\t\t}\n\n\t\tvar ThisPageLayout = function ( name, config ) {\n\t\t\tThisPageLayout.super.call( this, name, config );\n\t\t\tthis.$element.append( item.$element );\n\t\t};\n\t\tOO.inheritClass( ThisPageLayout, OO.ui.PageLayout );\n\n\t\tvar page = new ThisPageLayout( title );\n\n\t\tthis.booklet.addPages( [ page ] );\n\t};\n\n\tfunction PanelLayout( config ) {\n\t\tPanelLayout.super.call( this, config );\n\n\t\tvar data = this.data;\n\t\tvar content;\n\n\t\tif ( !( 'layout' in Form.options ) ) {\n\t\t\tForm.options.layout = 'tabs';\n\t\t}\n\n\t\t// @TODO implement booklet also outside dialog\n\t\tif ( Form.options.layout === 'booklet' && Form.options.view !== 'popup' && Form.options.view !== 'button' ) {\n\t\t\tForm.options.layout = 'tabs';\n\t\t}\n\n\t\tPendingRecursive = 0;\n\t\tQueuedWidgets = [];\n\t\tMaps = [];\n\t\tfunction getWidgets() {\n\t\t\tvar ret = {};\n\n\t\t\tfor ( var schemaName_ of Form.schemas ) {\n\n\t\t\t\tvar schema = Schemas[ schemaName_ ];\n\t\t\t\tvar previousSchema =\n\t\t\t\t\tschemaName_ in PreviousSchemas ?\n\t\t\t\t\t\tPreviousSchemas[ schemaName_ ] :\n\t\t\t\t\t\t{};\n\n\t\t\t\tif ( !( schemaName_ in Form.jsonData.schemas ) ) {\n\t\t\t\t\tForm.jsonData.schemas[ schemaName_ ] = {};\n\t\t\t\t}\n\n\t\t\t\tvar path = `${ escapeJsonPtr( schemaName_ ) }`;\n\t\t\t\tvar pathNoIndex = '';\n\t\t\t\tvar model = ( ModelSchemas[ schemaName_ ] = {\n\t\t\t\t\tparent: ModelSchemas,\n\t\t\t\t\tchildIndex: schemaName_,\n\t\t\t\t\tparentSchema: null\n\t\t\t\t} );\n\t\t\t\tvar widget = new GroupWidget(\n\t\t\t\t\t{},\n\t\t\t\t\t{ root: true, schema, path, model }\n\t\t\t\t);\n\n\t\t\t\tprocessSchema(\n\t\t\t\t\twidget,\n\t\t\t\t\tschema,\n\t\t\t\t\tpreviousSchema,\n\t\t\t\t\tschemaName_,\n\t\t\t\t\tmodel,\n\t\t\t\t\tForm.jsonData.schemas[ schemaName_ ],\n\t\t\t\t\tpath,\n\t\t\t\t\tpathNoIndex,\n\t\t\t\t\tfalse\n\t\t\t\t);\n\n\t\t\t\tret[ schemaName_ ] = widget;\n\t\t\t}\n\n\t\t\treturn ret;\n\t\t}\n\n\t\tfunction getFreeTextInput( wikitext, thisConfig ) {\n\t\t\tvar thisInputWidget;\n\n\t\t\tthisConfig = Object.assign(\n\t\t\t\t{\n\t\t\t\t\tname: `${ FormID }-model-freetext`,\n\t\t\t\t\tid: `${ FormID }-model-freetext`\n\t\t\t\t},\n\t\t\t\tthisConfig\n\t\t\t);\n\n\t\t\tif ( !wikitext || !Config.VEForAll ) {\n\t\t\t\tthisInputWidget = new OO.ui.MultilineTextInputWidget(\n\t\t\t\t\tObject.assign(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tautosize: true,\n\t\t\t\t\t\t\trows: 6\n\t\t\t\t\t\t},\n\t\t\t\t\t\tthisConfig\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tthisInputWidget = new VisualDataVisualEditor( thisConfig );\n\t\t\t}\n\t\t\tModel.freetext = thisInputWidget;\n\t\t\tInputWidgets[ thisConfig.name ] = thisInputWidget;\n\t\t\treturn thisInputWidget;\n\t\t}\n\n\t\tswitch ( data.name ) {\n\t\t\tcase 'schemas':\n\t\t\t\tif ( !( 'schemas' in Form.jsonData ) ) {\n\t\t\t\t\tForm.jsonData.schemas = {};\n\t\t\t\t}\n\n\t\t\t\tfor ( var thisSchemaName of Form.schemas ) {\n\t\t\t\t\tif ( !( thisSchemaName in Schemas ) ) {\n\t\t\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\t\t\tconsole.error( \"required schema doesn't exist\", thisSchemaName );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tForm.schemas = Form.schemas.filter( ( x ) => x in Schemas );\n\n\t\t\t\tif ( !SelectedSchema || Form.schemas.indexOf( SelectedSchema ) === -1 ) {\n\t\t\t\t\tSelectedSchema = ( Form.schemas.length ? Form.schemas[ 0 ] : null );\n\t\t\t\t}\n\n\t\t\t\tvar layout = Form.options.layout;\n\t\t\t\tvar widgets = getWidgets();\n\n\t\t\t\tif ( !SelectedSchema ) {\n\t\t\t\t\tthis.isEmpty = true;\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tvar ThisPageLayout = function ( name, thisConfig ) {\n\t\t\t\t\tThisPageLayout.super.call( this, name, thisConfig );\n\t\t\t\t};\n\n\t\t\t\tOO.inheritClass( ThisPageLayout, OO.ui.PageLayout );\n\n\t\t\t\tThisPageLayout.prototype.setupOutlineItem = function () {\n\t\t\t\t\tthis.outlineItem.setLabel( this.name );\n\t\t\t\t};\n\n\t\t\t\tvar ThisTabPanelLayout = function ( name, thisConfig ) {\n\t\t\t\t\tthis.name = name;\n\t\t\t\t\tThisTabPanelLayout.super.call( this, name, thisConfig );\n\t\t\t\t};\n\n\t\t\t\tOO.inheritClass( ThisTabPanelLayout, OO.ui.TabPanelLayout );\n\t\t\t\tThisTabPanelLayout.prototype.setupTabItem = function () {\n\t\t\t\t\tthis.tabItem.setLabel( this.name );\n\n\t\t\t\t\tthis.deleteButton = new OO.ui.ButtonWidget( {\n\t\t\t\t\t\ticon: 'close',\n\t\t\t\t\t\tframed: false,\n\t\t\t\t\t\tlabel: mw.msg( 'visualdata-jsmodule-forms-delete-schema' ),\n\t\t\t\t\t\tinvisibleLabel: true,\n\t\t\t\t\t\tclasses: [ 'VisualDataTabPanelLayoutTabItemDeleteButton' ]\n\t\t\t\t\t} );\n\n\t\t\t\t\tthis.deleteButton.on( 'click', function () {\n\t\t\t\t\t\tForm.schemas.splice( Form.schemas.indexOf( this.name ), 1 );\n\t\t\t\t\t\t// delete Form.jsonData.schemas[ data.schema.wiki.name ];\n\t\t\t\t\t\tdelete ModelSchemas[ this.name ];\n\t\t\t\t\t\tdelete Fields[ this.name ];\n\t\t\t\t\t\tupdatePanels();\n\t\t\t\t\t} );\n\n\t\t\t\t\tthis.deleteButton.toggle( this.name === SelectedSchema );\n\t\t\t\t\t// @TODO\n\t\t\t\t\t// this.tabItem.$label.append( this.deleteButton.$element );\n\t\t\t\t};\n\n\t\t\t\tThisTabPanelLayout.prototype.toggleCloseButton = function () {\n\t\t\t\t};\n\n\t\t\t\tswitch ( layout ) {\n\t\t\t\t\tcase 'single':\n\t\t\t\t\t\tcontent = widgets[ SelectedSchema ];\n\t\t\t\t\t\tthis.$element.addClass( 'PanelPropertiesStackPanelSingle' );\n\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'booklet':\n\t\t\t\t\t\tvar booklet = new OO.ui.BookletLayout( {\n\t\t\t\t\t\t\toutlined: true,\n\t\t\t\t\t\t\texpanded: true,\n\t\t\t\t\t\t\tpadded: false\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t\t// booklet.on( 'set', function () {\n\t\t\t\t\t\t// \tonTabSelect( booklet.getCurrentPageName() );\n\t\t\t\t\t\t// } );\n\n\t\t\t\t\t\tSchemasLayout = booklet;\n\n\t\t\t\t\t\tvar items = [];\n\n\t\t\t\t\t\tfor ( var schemaName in widgets ) {\n\t\t\t\t\t\t\tvar tabPanel = new ThisPageLayout( schemaName );\n\t\t\t\t\t\t\ttabPanel.$element.append( widgets[ schemaName ].$element );\n\t\t\t\t\t\t\titems.push( tabPanel );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbooklet.addPages( items );\n\t\t\t\t\t\tcontent = booklet;\n\n\t\t\t\t\t\t// booklet.setPage( SelectedSchema );\n\n\t\t\t\t\t\tthis.$element.addClass( 'PanelPropertiesStackPanelBooklet' );\n\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'tabs':\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tvar indexLayout = new OO.ui.IndexLayout( {\n\t\t\t\t\t\t\tframed: true,\n\t\t\t\t\t\t\tshowMenu: false,\n\t\t\t\t\t\t\texpanded: true,\n\t\t\t\t\t\t\tpadded: false,\n\t\t\t\t\t\t\tautoFocus: false\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t\tSchemasLayout = indexLayout;\n\n\t\t\t\t\t\t// indexLayout.on( 'set', function () {\n\t\t\t\t\t\t// \tonTabSelect( indexLayout.getCurrentTabPanelName() );\n\t\t\t\t\t\t// } );\n\n\t\t\t\t\t\tvar items = [];\n\t\t\t\t\t\tfor ( var schemaName in widgets ) {\n\t\t\t\t\t\t\tvar tabPanel = new ThisTabPanelLayout( schemaName );\n\t\t\t\t\t\t\ttabPanel.$element.append( widgets[ schemaName ].$element );\n\t\t\t\t\t\t\titems.push( tabPanel );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tindexLayout.addTabPanels( items );\n\t\t\t\t\t\t// indexLayout.setTabPanel( SelectedSchema );\n\t\t\t\t\t\tcontent = indexLayout;\n\n\t\t\t\t\t\tthis.$element.addClass( 'PanelPropertiesStackPanelTabs' );\n\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 'article':\n\t\t\t\tvar items = [];\n\t\t\t\tvar userDefinedInput;\n\t\t\t\tvar userDefinedField;\n\t\t\t\tvar freeTextField;\n\t\t\t\tvar categoriesField;\n\t\t\t\tvar contentModelField;\n\n\t\t\t\tif ( data.userDefined ) {\n\t\t\t\t\tvar inputName = 'mw.widgets.TitleInputWidget';\n\n\t\t\t\t\tuserDefinedInput = new mw.widgets.TitleInputWidget( {\n\t\t\t\t\t\tname: `${ FormID }-model-target-title`,\n\t\t\t\t\t\tvalue: !( 'userDefined' in Form ) ? '' : Form.userDefined,\n\t\t\t\t\t\t// @FIXME if the stack panel is hidden\n\t\t\t\t\t\t// this will create a browser error\n\t\t\t\t\t\trequired: true\n\t\t\t\t\t} );\n\n\t\t\t\t\tModel[ 'target-title' ] = userDefinedInput;\n\n\t\t\t\t\tuserDefinedField = new OO.ui.FieldLayout( userDefinedInput, {\n\t\t\t\t\t\tlabel: mw.msg( 'visualdata-jsmodule-forms-pagename' ),\n\t\t\t\t\t\talign: data.fieldAlign\n\t\t\t\t\t\t// classes: [\"ItemWidget\", \"inputName-\" + inputName],\n\t\t\t\t\t} );\n\t\t\t\t\titems.push( userDefinedField );\n\t\t\t\t}\n\n\t\t\t\tif ( data.editTargetSlot ) {\n\t\t\t\t\tvar targetSlotInput = new OO.ui.DropdownInputWidget( {\n\t\t\t\t\t\tname: `${ FormID }-model-target-slot`,\n\t\t\t\t\t\toptions: VisualDataFunctions.createDropDownOptions( {\n\t\t\t\t\t\t\tjsondata: mw.msg( 'visualdata-jsmodule-forms-target-slot-option-jsondata' ),\n\t\t\t\t\t\t\tmain: mw.msg( 'visualdata-jsmodule-forms-target-slot-option-main' )\n\t\t\t\t\t\t} ),\n\t\t\t\t\t\tvalue: Form.options[ 'target-slot' ]\n\t\t\t\t\t} );\n\n\t\t\t\t\tModel[ 'target-slot' ] = targetSlotInput;\n\n\t\t\t\t\ttargetSlotInput.on( 'change', ( value ) => {\n\t\t\t\t\t\tif ( freeTextField ) {\n\t\t\t\t\t\t\tfreeTextField.toggle( value !== 'main' );\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( contentModelField ) {\n\t\t\t\t\t\t\tcontentModelField.toggle( value !== 'main' );\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\n\t\t\t\t\tTargetSlotField = new OO.ui.FieldLayout( targetSlotInput, {\n\t\t\t\t\t\tlabel: mw.msg( 'visualdata-jsmodule-forms-target-slot' ),\n\t\t\t\t\t\thelp: mw.msg( 'visualdata-jsmodule-forms-target-slot-help' ),\n\t\t\t\t\t\thelpInline: true,\n\t\t\t\t\t\talign: data.fieldAlign\n\t\t\t\t\t} );\n\n\t\t\t\t\t// TargetSlotField.toggle( false );\n\n\t\t\t\t\titems.push( TargetSlotField );\n\t\t\t\t}\n\n\t\t\t\tif ( data.editFreeText ) {\n\t\t\t\t\tvar inputWidget = getFreeTextInput( Config.contentModel === 'wikitext', {\n\t\t\t\t\t\tvalue: Form.freetext,\n\t\t\t\t\t\tcontentModel: Config.contentModel\n\t\t\t\t\t} );\n\n\t\t\t\t\tfreeTextField = new OO.ui.FieldLayout( inputWidget, {\n\t\t\t\t\t\tlabel: mw.msg( 'visualdata-jsmodule-forms-freetext' ),\n\t\t\t\t\t\talign: data.fieldAlign\n\t\t\t\t\t} );\n\n\t\t\t\t\tfreeTextField.toggle( Form.options[ 'target-slot' ] !== 'main' );\n\n\t\t\t\t\titems.push( freeTextField );\n\t\t\t\t}\n\n\t\t\t\tif ( data.editCategories ) {\n\t\t\t\t\tvar categories = data.categories;\n\n\t\t\t\t\tvar categoriesInput = new mw.widgets.CategoryMultiselectWidget( {\n\t\t\t\t\t\tname: `${ FormID }-model-categories`\n\t\t\t\t\t\t// value: categories,\n\t\t\t\t\t} );\n\n\t\t\t\t\tModel.categories = categoriesInput;\n\n\t\t\t\t\t// ***prevents error \"Cannot read properties of undefined (reading 'apiUrl')\"\n\t\t\t\t\tfor ( var category of categories ) {\n\t\t\t\t\t\tcategoriesInput.addTag( category );\n\t\t\t\t\t}\n\n\t\t\t\t\tcategoriesField = new OO.ui.FieldLayout( categoriesInput, {\n\t\t\t\t\t\tlabel: mw.msg( 'visualdata-jsmodule-forms-categories' ),\n\t\t\t\t\t\talign: data.fieldAlign,\n\t\t\t\t\t\tclasses: [ 'VisualDataItemWidget' ]\n\t\t\t\t\t} );\n\n\t\t\t\t\titems.push( categoriesField );\n\t\t\t\t}\n\n\t\t\t\tif ( data.editContentModel ) {\n\t\t\t\t\tvar contentModelInput = new OO.ui.DropdownInputWidget( {\n\t\t\t\t\t\tname: `${ FormID }-model-content-model`,\n\t\t\t\t\t\toptions: VisualDataFunctions.createDropDownOptions(\n\t\t\t\t\t\t\tConfig.contentModels\n\t\t\t\t\t\t),\n\t\t\t\t\t\tvalue: Config.contentModel\n\t\t\t\t\t} );\n\n\t\t\t\t\tcontentModelInput.on( 'change', async ( value ) => {\n\t\t\t\t\t\tif ( !( 'freetext' in Model ) ) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tvar thisInputWidget;\n\t\t\t\t\t\tvar freetextValue = Model.freetext.getValue();\n\n\t\t\t\t\t\tif ( VisualDataFunctions.isPromise( freetextValue ) ) {\n\t\t\t\t\t\t\tfreetextValue = await freetextValue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// @TODO convert from/to html and wikitext\n\t\t\t\t\t\t// value === \"html\" ||\n\t\t\t\t\t\tif ( value === 'wikitext' ) {\n\t\t\t\t\t\t\tthisInputWidget = getFreeTextInput( true, {\n\t\t\t\t\t\t\t\tcontentModel: value,\n\t\t\t\t\t\t\t\tvalue: freetextValue\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t\t// // @TODO use TinyMCE for html\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthisInputWidget = getFreeTextInput( false, {\n\t\t\t\t\t\t\t\tvalue: freetextValue\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t}\n\t\t\t\t\t\t$( `#${ FormID }-model-freetext` ).replaceWith( thisInputWidget.$element );\n\t\t\t\t\t} );\n\n\t\t\t\t\tModel[ 'content-model' ] = contentModelInput;\n\n\t\t\t\t\tcontentModelField = new OO.ui.FieldLayout( contentModelInput, {\n\t\t\t\t\t\tlabel: mw.msg( 'visualdata-jsmodule-forms-content-models' ),\n\t\t\t\t\t\talign: data.fieldAlign,\n\t\t\t\t\t\tclasses: [ 'VisualDataItemWidget' ]\n\t\t\t\t\t} );\n\n\t\t\t\t\tcontentModelField.toggle( Form.options[ 'target-slot' ] !== 'main' );\n\n\t\t\t\t\titems.push( contentModelField );\n\t\t\t\t}\n\n\t\t\t\tif ( !items.length ) {\n\t\t\t\t\tthis.isEmpty = true;\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tthis.$element.addClass( 'PanelPropertiesStackPanelFieldset' );\n\n\t\t\t\tcontent = new OO.ui.FieldsetLayout( {\n\t\t\t\t\tlabel: '',\n\t\t\t\t\titems: items\n\t\t\t\t} );\n\t\t}\n\n\t\tthis.isEmpty = false;\n\t\tthis.$element.append( content.$element );\n\t}\n\n\tOO.inheritClass( PanelLayout, OO.ui.PanelLayout );\n\n\tvar OptionsList = function ListWidget( config, schema, model ) {\n\t\tconfig = config || {};\n\n\t\t// Call parent constructor\n\t\tOptionsList.super.call( this, config );\n\n\t\tOO.ui.mixin.GroupWidget.call(\n\t\t\tthis,\n\t\t\tObject.assign(\n\t\t\t\t{\n\t\t\t\t\t$group: this.$element\n\t\t\t\t},\n\t\t\t\tconfig\n\t\t\t)\n\t\t);\n\n\t\tthis.schema = schema;\n\t\tthis.model = model;\n\n\t\tthis.aggregate( {\n\t\t\tdelete: 'itemDelete'\n\t\t} );\n\n\t\tthis.connect( this, {\n\t\t\titemDelete: 'onItemDelete'\n\t\t} );\n\n\t\tthis.connect( this, {\n\t\t\tadd: 'onAddItem'\n\t\t} );\n\t};\n\n\tOO.inheritClass( OptionsList, OO.ui.Widget );\n\tOO.mixinClass( OptionsList, OO.ui.mixin.GroupWidget );\n\n\tOptionsList.prototype.onAddItem = function () {};\n\n\tOptionsList.prototype.onItemDelete = function () {};\n\n\t// OptionsList.prototype.addItems = function (items) {\n\t// \tfor ( var i in items ) {\n\t// \t\tOO.ui.mixin.GroupWidget.prototype.addItem.call(this, items[i], i);\n\t// \t}\n\t// }\n\n\tOptionsList.prototype.addItem = function ( item, i ) {\n\t\tvar self = this;\n\t\titem.data.index = i;\n\n\t\tfunction recDeleteValue( model ) {\n\t\t\tswitch ( model.schema.type ) {\n\t\t\t\tcase 'object':\n\t\t\t\t\tif ( 'properties' in model ) {\n\t\t\t\t\t\tfor ( var ii in model.properties ) {\n\t\t\t\t\t\t\trecDeleteValue( model.properties[ ii ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'array':\n\t\t\t\t\t// @TODO implement tuple\n\t\t\t\t\tif ( VisualDataFunctions.isObject( schema.items ) ) {\n\t\t\t\t\t\trecDeleteValue( model.items );\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tif ( 'input' in model ) {\n\t\t\t\t\t\tmodel.input.setValue( !model.multiselect ? '' : [] );\n\t\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tvar deleteButton = new OO.ui.ButtonWidget( {\n\t\t\ticon: 'close'\n\t\t\t// flags: [\"destructive\"],\n\t\t\t// classes: [\"VisualDataOptionsListDeleteButton\"],\n\t\t} );\n\t\tdeleteButton.on( 'click', () => {\n\t\t\tif (\n\t\t\t\t!( 'minItems' in self.schema ) ||\n\t\t\t\tself.items.length > self.schema.minItems\n\t\t\t) {\n\t\t\t\t// *** rather than removing the item\n\t\t\t\t// from the model, we mark it as removed\n\t\t\t\t// this ensures consistency of the data\n\t\t\t\t// structure, the items marked as removed\n\t\t\t\t// will be removed from submitted data.\n\t\t\t\t// Both the 2 alternate methods aren't\n\t\t\t\t// optimal: updatePanels() is too expensive\n\t\t\t\t// and renaming all the data structure\n\t\t\t\t// is too tricky and leads to errors\n\t\t\t\tself.removeItems( [ item ] );\n\t\t\t\tself.model[ item.data.index ].removed = true;\n\t\t\t} else {\n\t\t\t\trecDeleteValue( self.model[ item.data.index ] );\n\t\t\t}\n\t\t} );\n\n\t\tif (\n\t\t\titem.data.schema.wiki.layout === 'horizontal' ||\n\t\t\titem.data.schema.wiki.layout === 'table'\n\t\t) {\n\t\t\t$( item.$element )\n\t\t\t\t.find( '.visualdata-horizontal-section-remove-row' )\n\t\t\t\t.append( deleteButton.$element );\n\t\t} else {\n\t\t\titem.$element.prepend(\n\t\t\t\t$( '<div style=\"text-align:right\">' ).append( deleteButton.$element )\n\t\t\t);\n\t\t}\n\n\t\tOO.ui.mixin.GroupWidget.prototype.addItems.call( this, [ item ] );\n\n\t\tthis.emit( 'add', item );\n\n\t\treturn this;\n\t};\n\n\tOptionsList.prototype.removeItems = function ( items ) {\n\t\tOO.ui.mixin.GroupWidget.prototype.removeItems.call( this, items );\n\t\tthis.emit( 'remove', items );\n\t\treturn this;\n\t};\n\n\tOptionsList.prototype.clearItems = function () {\n\t\tvar items = this.items.slice();\n\t\tOO.ui.mixin.GroupWidget.prototype.clearItems.call( this );\n\t\tthis.emit( 'remove', items );\n\t\treturn this;\n\t};\n\n\tfunction schemaHasData( schemaName ) {\n\t\treturn VisualDataFunctions.getNestedProp( [ 'schemas', schemaName ], StoredJsonData ) &&\n\t\t\tObject.keys( StoredJsonData.schemas[ schemaName ] ).length;\n\t}\n\n\t// @FIXME store for each separate schema\n\tfunction applyUntransformed( data, i, path ) {\n\t\tif (\n\t\t\t!( 'schemas-data' in Form.jsonData ) ||\n\t\t\t!( 'untransformed' in Form.jsonData[ 'schemas-data' ] ) ||\n\t\t\t!( path in Form.jsonData[ 'schemas-data' ].untransformed )\n\t\t) {\n\t\t\treturn;\n\t\t}\n\n\t\t// *** this ensures subsequent edits are maintained\n\t\tdata[ i ] = Form.jsonData[ 'schemas-data' ].untransformed[ path ];\n\t\tdelete Form.jsonData[ 'schemas-data' ].untransformed[ path ];\n\t}\n\n\tvar OptionsListContainer = function OptionsListContainer(\n\t\tconfig,\n\t\tschema,\n\t\titem,\n\t\tpreviousItem,\n\t\tschemaName,\n\t\tmodel,\n\t\tdata,\n\t\tpath,\n\t\tpathNoIndex,\n\t\tnewItem\n\t) {\n\t\tconfig = config || {};\n\n\t\t// Call parent constructor\n\t\tOptionsListContainer.super.call( this, config );\n\n\t\t// display multiselect\n\t\tif (\n\t\t\titem.type !== 'object' &&\n\t\t\t'preferred-input' in item.wiki &&\n\t\t\tVisualDataFunctions.isMultiselect( item.wiki[ 'preferred-input' ] )\n\t\t) {\n\t\t\tvar widget_ = new GroupWidget( {}, { schema: item, path, model } );\n\t\t\tprocessSchema(\n\t\t\t\twidget_,\n\t\t\t\titem,\n\t\t\t\tpreviousItem,\n\t\t\t\tschemaName,\n\t\t\t\tmodel,\n\t\t\t\tdata,\n\t\t\t\tpath,\n\t\t\t\tpathNoIndex,\n\t\t\t\tnewItem\n\t\t\t);\n\t\t\tthis.$element.append( widget_.$element );\n\t\t\treturn;\n\t\t}\n\n\t\tthis.optionsList = new OptionsList( {}, schema, model );\n\n\t\tvar minItems = 'minItems' in schema ? schema.minItems : 0;\n\t\tvar data;\n\t\tif (\n\t\t\tArray.isArray( item.default ) &&\n\t\t\t( !Array.isArray( data ) || !data.length ) &&\n\t\t\t( isNewSchema( schemaName ) || Form.emptyData )\n\t\t) {\n\t\t\tdata = item.default;\n\t\t}\n\n\t\tif ( Array.isArray( data ) && minItems < data.length ) {\n\t\t\tminItems = data.length;\n\t\t}\n\n\t\t// data is not an object if the type of schema\n\t\t// changed from non object to object, e.g.\n\t\t// an array of text fields vs an array\n\t\t// of subitems, and the name/key was the same\n\t\tif ( data === null || typeof data !== 'object' ) {\n\t\t\tdata = {};\n\t\t}\n\n\t\tvar i = 0;\n\t\twhile ( this.optionsList.items.length < minItems ) {\n\t\t\tvar newItem = false;\n\t\t\tif ( !( i in data ) ) {\n\t\t\t\tdata[ i ] = {};\n\t\t\t\tnewItem = true;\n\t\t\t}\n\t\t\tvar path_ = `${ path }/${ i }`;\n\t\t\tapplyUntransformed( data, i, path );\n\t\t\tvar thisModel = ( model[ i ] = {\n\t\t\t\tparent: model,\n\t\t\t\tchildIndex: i,\n\t\t\t\tparentSchema: schema\n\t\t\t} );\n\t\t\tvar widget_ = new GroupWidget( {}, { schema: item, path: path_, model: thisModel } );\n\t\t\tprocessSchema(\n\t\t\t\twidget_,\n\t\t\t\titem,\n\t\t\t\tpreviousItem,\n\t\t\t\tschemaName,\n\t\t\t\tthisModel,\n\t\t\t\tdata[ i ],\n\t\t\t\tpath_,\n\t\t\t\tpathNoIndex,\n\t\t\t\tnewItem\n\t\t\t);\n\t\t\tthis.optionsList.addItem( widget_, i );\n\t\t\ti++;\n\t\t}\n\n\t\tvar self = this;\n\n\t\tvar addOption = new OO.ui.ButtonWidget( {\n\t\t\ticon: 'add'\n\t\t} );\n\n\t\taddOption.on( 'click', () => {\n\t\t\tif (\n\t\t\t\t!( 'maxItems' in schema ) ||\n\t\t\t\tself.optionsList.items.length < schema.maxItems\n\t\t\t) {\n\t\t\t\tvar ii = self.optionsList.items.length ?\n\t\t\t\t\tself.optionsList.items[ self.optionsList.items.length - 1 ].data\n\t\t\t\t\t\t.index + 1 :\n\t\t\t\t\t0;\n\t\t\t\tvar modelAddOption = ( model[ ii ] = {\n\t\t\t\t\tparent: model,\n\t\t\t\t\tchildIndex: ii,\n\t\t\t\t\tparentSchema: schema\n\t\t\t\t} );\n\t\t\t\tvar widgetAddOption = new GroupWidget( {}, { schema: item, path, model: modelAddOption } );\n\n\t\t\t\tvar thisPath_ = `${ path }/${ ii }`;\n\t\t\t\tprocessSchema(\n\t\t\t\t\twidgetAddOption,\n\t\t\t\t\titem,\n\t\t\t\t\tpreviousItem,\n\t\t\t\t\tschemaName,\n\t\t\t\t\tmodelAddOption,\n\t\t\t\t\t( data[ ii ] = {} ),\n\t\t\t\t\tthisPath_,\n\t\t\t\t\tpathNoIndex,\n\t\t\t\t\ttrue\n\t\t\t\t);\n\t\t\t\tself.optionsList.addItem( widgetAddOption, ii );\n\t\t\t}\n\t\t} );\n\n\t\tthis.$element.append( this.optionsList.$element );\n\t\tthis.$element.append( addOption.$element );\n\t};\n\n\tOO.inheritClass( OptionsListContainer, OO.ui.Widget );\n\t// OO.mixinClass(OptionsListContainer, OO.ui.mixin.GroupWidget);\n\n\tfunction determineInputValue(\n\t\tschema,\n\t\tpreviousSchema,\n\t\tschemaName,\n\t\tmodel,\n\t\tdata,\n\t\tnewItem\n\t) {\n\t\t// can be an array, in case of multiselect\n\t\tvar ret = VisualDataFunctions.isObject( data ) ? null : data;\n\t\t// remove value-prefix\n\t\t// ***this is not necessary, since is hanlded\n\t\t// by applyUntransformed\n\t\t// if (defaultValue) {\n\t\t// \tif (\"value-prefix\" in schema.wiki) {\n\t\t// \t\tvar prefixLength = schema.wiki[\"value-prefix\"].length;\n\t\t// \t\tif (Array.isArray(defaultValue)) {\n\t\t// \t\t\tdefaultValue = value.map((x) => x.substr(prefixLength));\n\t\t// \t\t} else {\n\t\t// \t\t\tdefaultValue = defaultValue.substr(prefixLength);\n\t\t// \t\t}\n\t\t// \t}\n\t\t// }\n\n\t\tif (\n\t\t\t!newItem &&\n\t\t\t!isNewSchema( schemaName ) &&\n\t\t\t!Form.emptyData\n\t\t) {\n\t\t\treturn ret;\n\t\t}\n\n\t\tif ( !( 'default' in schema ) ) {\n\t\t\treturn ret;\n\t\t}\n\n\t\t// if ret is the default of previousSchema\n\t\t// update to the default of current schema\n\t\tif (\n\t\t\tret !== null &&\n\t\t\t( !( 'default' in previousSchema ) || ret !== previousSchema.default )\n\t\t) {\n\t\t\treturn ret;\n\t\t}\n\n\t\t// *** in case of array the default values will\n\t\t// create the respective entries by OptionsListContainer\n\t\tif (\n\t\t\tArray.isArray( schema.default ) &&\n\t\t\t\t(\n\t\t\t\t\t!( 'preferred-input' in schema.wiki ) ||\n\t\t\t\t\t!VisualDataFunctions.isMultiselect( schema.wiki[ 'preferred-input' ] )\n\t\t\t\t)\n\t\t) {\n\t\t\treturn ret;\n\t\t}\n\n\t\treturn schema.default;\n\t}\n\n\tfunction processSchema(\n\t\twidget,\n\t\tschema,\n\t\tpreviousSchema,\n\t\tschemaName,\n\t\tmodel,\n\t\tdata,\n\t\tpath,\n\t\tpathNoIndex,\n\t\tnewItem\n\t) {\n\t\tPendingRecursive++;\n\t\tif ( !( 'type' in schema ) ) {\n\t\t\tschema.type = 'default' in schema ? 'string' : 'object';\n\t\t}\n\t\t// model.previousSchema = previousSchema;\n\n\t\tmodel.schema = VisualDataFunctions.deepCopy( schema );\n\t\tmodel.schemaName = schemaName;\n\t\tmodel.path = path;\n\t\tmodel.pathNoIndex = pathNoIndex;\n\t\t// @TODO implement allOf, anyOf, oneOf using addCombinedItem\n\t\t// @TODO implement \"$ref\"\n\n\t\tswitch ( schema.type ) {\n\t\t\tcase 'object':\n\t\t\t\tmodel.properties = {};\n\t\t\t\tif ( 'properties' in schema ) {\n\n\t\t\t\t\t// data is not an object if the type of schema\n\t\t\t\t\t// changed from non object to object, e.g.\n\t\t\t\t\t// an array of text fields vs an array\n\t\t\t\t\t// of subitems, and the name/key was the same\n\t\t\t\t\tif ( !VisualDataFunctions.isObject( data ) ) {\n\t\t\t\t\t\tdata = {};\n\t\t\t\t\t}\n\n\t\t\t\t\tvar items_ = [];\n\t\t\t\t\tfor ( var i in schema.properties ) {\n\t\t\t\t\t\tif ( !( i in data ) ) {\n\t\t\t\t\t\t\tdata[ i ] = {};\n\t\t\t\t\t\t}\n\t\t\t\t\t\tvar path_ = `${ path }/${ escapeJsonPtr( i ) }`;\n\t\t\t\t\t\tapplyUntransformed( data, i, path_ );\n\t\t\t\t\t\tvar pathNoIndex_ = pathNoIndex ?\n\t\t\t\t\t\t\t`${ pathNoIndex }/${ escapeJsonPtr( i ) }` :\n\t\t\t\t\t\t\tescapeJsonPtr( i );\n\t\t\t\t\t\tvar item = schema.properties[ i ];\n\t\t\t\t\t\tvar previousItem =\n\t\t\t\t\t\t\t'properties' in previousSchema && i in previousSchema.properties ?\n\t\t\t\t\t\t\t\tpreviousSchema.properties[ i ] :\n\t\t\t\t\t\t\t\t{};\n\t\t\t\t\t\tvar thisModel = ( model.properties[ i ] = {\n\t\t\t\t\t\t\tparent: model.properties,\n\t\t\t\t\t\t\tchildIndex: i,\n\t\t\t\t\t\t\tparentSchema: schema\n\t\t\t\t\t\t} );\n\t\t\t\t\t\tvar widget_ = new GroupWidget( {}, { schema: item, path: path_, model: thisModel } );\n\t\t\t\t\t\tprocessSchema(\n\t\t\t\t\t\t\twidget_,\n\t\t\t\t\t\t\titem,\n\t\t\t\t\t\t\tpreviousItem,\n\t\t\t\t\t\t\tschemaName,\n\t\t\t\t\t\t\tthisModel,\n\t\t\t\t\t\t\tdata[ i ],\n\t\t\t\t\t\t\tpath_,\n\t\t\t\t\t\t\tpathNoIndex_,\n\t\t\t\t\t\t\tnewItem\n\t\t\t\t\t\t);\n\t\t\t\t\t\titems_.push( widget_ );\n\t\t\t\t\t}\n\t\t\t\t\twidget.addItems( items_ );\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'array':\n\t\t\t\tif ( 'items' in schema ) {\n\t\t\t\t\tif ( VisualDataFunctions.isObject( schema.items ) ) {\n\t\t\t\t\t\tvar item = schema.items;\n\t\t\t\t\t\tmodel.items = {};\n\t\t\t\t\t\tif ( item.wiki.type === 'property' ) {\n\t\t\t\t\t\t\titem.wiki.layout = 'table';\n\t\t\t\t\t\t}\n\t\t\t\t\t\tvar previousItem =\n\t\t\t\t\t\t\t'items' in previousSchema ? previousSchema.items : {};\n\n\t\t\t\t\t\tvar optionsListContainer = new OptionsListContainer(\n\t\t\t\t\t\t\t{},\n\t\t\t\t\t\t\tschema,\n\t\t\t\t\t\t\titem,\n\t\t\t\t\t\t\tpreviousItem,\n\t\t\t\t\t\t\tschemaName,\n\t\t\t\t\t\t\tmodel.items,\n\t\t\t\t\t\t\tdata,\n\t\t\t\t\t\t\tpath,\n\t\t\t\t\t\t\tpathNoIndex,\n\t\t\t\t\t\t\tnewItem\n\t\t\t\t\t\t);\n\t\t\t\t\t\twidget.addItems( [ optionsListContainer ] );\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// @TODO\n\t\t\t\t\t\t// implement tuple\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\t// 'string',\n\t\t\t\t// 'number',\n\t\t\t\t// 'integer',\n\t\t\t\t// 'boolean',\n\t\t\t\t// 'null'\n\t\t\t\t// model.type = \"property\";\n\t\t\t\tif ( !( 'wiki' in schema ) ) {\n\t\t\t\t\tschema.wiki = {};\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\t'visibility' in schema.wiki &&\n\t\t\t\t\tschema.wiki.visibility === 'oncreate-only' &&\n\t\t\t\t\tForm.options.action !== 'create'\n\t\t\t\t) {\n\t\t\t\t\tdelete model.parent[ model.childIndex ];\n\n\t\t\t\t} else {\n\t\t\t\t\tvar inputValue = determineInputValue(\n\t\t\t\t\t\tschema,\n\t\t\t\t\t\tpreviousSchema,\n\t\t\t\t\t\tschemaName,\n\t\t\t\t\t\tmodel,\n\t\t\t\t\t\tdata,\n\t\t\t\t\t\tnewItem\n\t\t\t\t\t);\n\n\t\t\t\t\tif ( Array.isArray( inputValue ) ) {\n\t\t\t\t\t\tinputValue = inputValue.filter(\n\t\t\t\t\t\t\t( x ) => !VisualDataFunctions.isObject( x )\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\t// used by getFieldAlign\n\t\t\t\t\t// model.schema.wiki.schema = schemaName;\n\t\t\t\t\tvar item = new ItemWidget( {\n\t\t\t\t\t\tclasses: [ 'VisualDataItemWidget' ],\n\t\t\t\t\t\tmodel: model,\n\t\t\t\t\t\tdata: inputValue\n\t\t\t\t\t} );\n\n\t\t\t\t\twidget.addItems( [ item ] );\n\t\t\t\t}\n\t\t}\n\n\t\t// @TODO implement anyOf, oneOf, allOf\n\t\t// https://json-schema.org/understanding-json-schema/reference/combining.html\n\t\t// var directives = [\"anyOf\", \"oneOf\", \"allOf\"];\n\t\t// for (var directive of directives) {\n\t\t// \tif (directive in schema) {\n\t\t// \t\t// *** this is by default an array,\n\t\t// \t\t// but transformed to an object\n\t\t// \t\tfor (var i in schema[directive]) {\n\t\t// \t\t\tvar item = schema[directive][i];\n\t\t// \t\t\tlet widget_ = new GroupWidget({}, item);\n\t\t// \t\t\tprocessSchema(widget_, item, schemaName, (model[i] = {}));\n\t\t// \t\t\tif ( directive!=='allOf' ) {\n\t\t// \t\t\t\twidget.addCombinedItem(widget_, item.title || i, directive);\n\t\t// \t\t\t} else {\n\t\t// \t\t\t\twidget.addItems([widget_]);\n\t\t// \t\t\t}\n\t\t// \t\t}\n\t\t// \t}\n\t\t// }\n\n\t\tQueuedWidgets.push( widget );\n\t\t// inform queued widgets that the rendering of the form is complete\n\t\tif ( --PendingRecursive === 0 ) {\n\t\t\t// for ( widget_ of QueuedWidgets ) {\n\t\t\t// @see https://www.mediawiki.org/wiki/OOjs/Events\n\n\t\t\t// widget_.emit( 'formLoaded' );\n\t\t\tif ( QueuedWidgets.length ) {\n\t\t\t\tQueuedWidgets[ 0 ].emit( 'formLoaded' );\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction getSchemasPanelLayout() {\n\t\tFields = {};\n\t\tModelSchemas = {};\n\t\tModelFlatten = [];\n\t\tInputWidgets = {};\n\n\t\t// @TODO implement a better interface between\n\t\t// VisualData instance and this constructor\n\t\tProcessModel = new VisualDataProcessModel(\n\t\t\tcallbackShowError,\n\t\t\tForm,\n\t\t\tSchemas,\n\t\t\tRecordedSchemas,\n\t\t\tModel,\n\t\t\tModelSchemas,\n\t\t\tmakeElementId\n\t\t);\n\n\t\treturn new PanelLayout( {\n\t\t\texpanded: true,\n\t\t\tpadded: false,\n\t\t\tframed: false,\n\t\t\t// classes: [\"PanelProperties-panel-section\"],\n\t\t\tdata: {\n\t\t\t\tname: 'schemas',\n\t\t\t\tschemas: Form.schemas\n\t\t\t}\n\t\t} );\n\t}\n\n\tfunction getArticlePanelLayout() {\n\t\tvar userDefined = Config.isNewPage && Form.options[ 'edit-page' ] === '';\n\n\t\tvar editFreeText = Config.isNewPage && Config.context === 'EditData';\n\t\tvar editContentModel = Config.context === 'EditData';\n\t\tvar editCategories = Config.context === 'EditData';\n\t\tvar editTargetSlot = Config.context === 'EditData';\n\n\t\tvar categories = [];\n\n\t\tif ( 'edit-content-model' in Form.options ) {\n\t\t\teditContentModel = Form.options[ 'edit-content-model' ];\n\t\t}\n\n\t\tif ( 'edit-categories' in Form.options ) {\n\t\t\teditCategories = Form.options[ 'edit-categories' ]; // !Form.schemas.length || !Config.isNewPage;\n\t\t}\n\n\t\tif ( 'edit-freetext' in Form.options ) {\n\t\t\teditFreeText = Form.options[ 'edit-freetext' ];\n\t\t}\n\n\t\tif ( 'edit-target-slot' in Form.options ) {\n\t\t\teditTargetSlot = Form.options[ 'edit-target-slot' ];\n\t\t}\n\n\t\tif ( editTargetSlot === false &&\n\t\t\t'target-slot' in Form.options &&\n\t\t\tForm.options[ 'target-slot' ] === 'main'\n\t\t) {\n\t\t\teditFreeText = false;\n\t\t\teditContentModel = false;\n\t\t}\n\n\t\tvar fieldAlign = 'top';\n\n\t\tif (\n\t\t\tForm.options.action === 'create' &&\n\t\t\tForm.options[ 'pagename-formula' ] === ''\n\t\t) {\n\t\t\tuserDefined = true;\n\t\t}\n\n\t\t// this will set the fieldAlign of the wiki\n\t\t// section as the fieldAlign of last form\n\t\tif ( 'layout-align' in Form.options ) {\n\t\t\tfieldAlign = Form.options[ 'layout-align' ];\n\t\t}\n\n\t\t// if (Form.options[\"default-categories\"]) {\n\t\t// \tcategories = Form.options[\"default-categories\"].split(/\\s*,\\s*/)\n\t\t// \t\t.filter( x => x.trim() !== '' );\n\t\t// }\n\t\tvar categories = (\n\t\t\t'default-categories' in Form.options ?\n\t\t\t\tForm.options[ 'default-categories' ] :\n\t\t\t\t[]\n\t\t).concat( Form.categories );\n\n\t\t// for some reason appending the method\n\t\t// halts the execution combined with mw.loader\n\t\tcategories = categories.filter( ( value, index, self ) => self.indexOf( value ) === index );\n\n\t\t// create title and free text input\n\t\tif ( !userDefined && !editFreeText && !editCategories && !editContentModel ) {\n\t\t\treturn { isEmpty: true };\n\t\t}\n\n\t\treturn new PanelLayout( {\n\t\t\texpanded: false,\n\t\t\tpadded: true,\n\t\t\tframed: false,\n\t\t\t// classes: [\"PanelProperties-panel-section\"],\n\t\t\tdata: {\n\t\t\t\tname: 'article',\n\t\t\t\tlabel: mw.msg( 'visualdata-jsmodule-forms-wiki' ),\n\t\t\t\tuserDefined,\n\t\t\t\teditFreeText,\n\t\t\t\teditCategories,\n\t\t\t\teditContentModel,\n\t\t\t\teditTargetSlot,\n\t\t\t\tcategories,\n\t\t\t\tfieldAlign\n\t\t\t}\n\t\t} );\n\t}\n\n\tfunction removeSchemasPanel() {\n\t\tvar panels = PropertiesStack.getItems();\n\t\tfor ( var panel of panels ) {\n\t\t\tif ( panel.getData().name === 'schemas' ) {\n\t\t\t\tPropertiesStack.removeItems( [ panel ] );\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction updatePanels() {\n\t\tProcessModel.getModel( 'fetch' ).then( ( res ) => {\n\t\t\tForm.jsonData.schemas = Object.assign( Form.jsonData.schemas, res );\n\n\t\t\tremoveSchemasPanel();\n\n\t\t\tvar schemasPanelLayout = getSchemasPanelLayout();\n\t\t\tif ( !schemasPanelLayout.isEmpty ) {\n\t\t\t\tPropertiesStack.addItems( [ schemasPanelLayout ], 0 );\n\t\t\t}\n\n\t\t\tvar panels = PropertiesStack.getItems();\n\n\t\t\tPropertiesStack.setItem( panels[ 0 ] );\n\n\t\t\tselectSchema( SelectedSchema, true );\n\n\t\t\tPropertiesStack.$element.removeClass( [\n\t\t\t\t'PanelPropertiesStack',\n\t\t\t\t'PanelPropertiesStack-empty'\n\t\t\t] );\n\n\t\t\tswitch ( panels.length ) {\n\t\t\t\tcase 0:\n\t\t\t\t\tPropertiesStack.$element.addClass( 'PanelPropertiesStack-empty' );\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tPropertiesStack.$element.addClass( 'PanelPropertiesStack' );\n\t\t\t}\n\n\t\t\tupdateButtons( panels );\n\t\t} );\n\t}\n\n\tfunction updateButtons( panels ) {\n\t\tif ( TargetSlotField ) {\n\t\t\tTargetSlotField.toggle( hasMultiplePanels() ||\n\t\t\t\t( 'target-slot' in Model && Model[ 'target-slot' ].getValue() === 'main' ) );\n\t\t}\n\n\t\tif ( Form.options.view === 'popup' || Form.options.view === 'button' ) {\n\t\t\treturn;\n\t\t}\n\t\tif ( hasMultiplePanels() ) {\n\t\t\tValidateButton.toggle( panels.length !== 0 );\n\t\t\t// DeleteButton.toggle( hasStoredJsonData() );\n\t\t\tGoBackButton.toggle( false );\n\t\t\tSubmitButton.toggle( false );\n\t\t} else {\n\t\t\tSubmitButton.toggle( panels.length !== 0 );\n\t\t\t// DeleteButton.toggle( hasStoredJsonData() );\n\t\t\tGoBackButton.toggle( false );\n\t\t\tValidateButton.toggle( false );\n\t\t}\n\t}\n\n\tfunction updateSchemas( previousSchemas, schemas, data ) {\n\t\tPreviousSchemas = previousSchemas;\n\t\tSchemas = schemas;\t// VisualDataFunctions.deepCopy( schemas );\n\n\t\tif ( data && data[ 'result-action' ] === 'rename' ) {\n\t\t\t// *** do not compare Schemas with Form.schemas,\n\t\t\t// since a rename could match an existing entry\n\t\t\t// in Schemas\n\t\t\t// for ( var schemaName in Schemas ) {\n\t\t\t// \tif ( Form.schemas.indexOf( schemaName ) === -1 ) {\n\t\t\t// \t\tSelectedSchema = schemaName;\n\t\t\t// \t\tbreak;\n\t\t\t// \t}\n\t\t\t// }\n\t\t\tSelectedSchema = data.label;\n\n\t\t\tfor ( var i in Form.schemas ) {\n\t\t\t\tvar schemaName = Form.schemas[ i ];\n\t\t\t\tif ( !( schemaName in Schemas ) ) {\n\t\t\t\t\tForm.schemas.splice( i, 1, SelectedSchema );\n\t\t\t\t\tif ( !( SelectedSchema in Form.jsonData.schemas ) ) {\n\t\t\t\t\t\tForm.jsonData.schemas[ SelectedSchema ] = Form.jsonData.schemas[ schemaName ];\n\t\t\t\t\t}\n\t\t\t\t\tdelete Form.jsonData.schemas[ schemaName ];\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// uninitialized\n\t\tif ( !( 'getModel' in ProcessModel ) ) {\n\t\t\treturn;\n\t\t}\n\t\tupdatePanels();\n\t}\n\n\tasync function onSubmit( e ) {\n\t\te.preventDefault();\n\n\t\tvar action;\n\t\tvar formEl = $( this ); // .closest(\".VisualDataForm\");\n\n\t\tif ( formEl.data( 'delete' ) === true ) {\n\t\t\taction = 'delete';\n\t\t} else {\n\t\t\taction = !hasMultiplePanels() ? 'validate&submit' : 'submit';\n\t\t}\n\n\t\tProcessModel.getModel( action ).then( async ( res ) => {\n\t\t\tif ( typeof res === 'boolean' && res === false ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( res.form[ 'target-slot' ] === 'main' && !res.schemas.length &&\n\t\t\t\t!RecordedSchemas.length ) {\n\t\t\t\t// eslint-disable-next-line no-alert\n\t\t\t\talert( mw.msg( 'visualdata-jsmodule-forms-submit-no-schemas' ) );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( 'callback' in Form.options && Form.options.callback !== '' ) {\n\t\t\t\tVisualDataFunctions.executeFunctionByName( Form.options.callback, window, [ res ] );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t$( '<input>' )\n\t\t\t\t.attr( {\n\t\t\t\t\ttype: 'hidden',\n\t\t\t\t\tname: 'data',\n\t\t\t\t\tvalue: JSON.stringify( getFormAttributes( res ) )\n\t\t\t\t} )\n\t\t\t\t.appendTo( formEl );\n\n\t\t\tformEl.unbind( 'submit' ).submit();\n\t\t} );\n\t}\n\n\tfunction ProcessDialog( config ) {\n\t\tProcessDialog.super.call( this, config );\n\t}\n\tOO.inheritClass( ProcessDialog, OO.ui.ProcessDialog );\n\n\tProcessDialog.static.name = DialogName;\n\t// ProcessDialog.static.title = mw.msg(\n\t// \t\"visualdata-jsmodule-forms-defineform\"\n\t// );\n\tProcessDialog.static.actions = [\n\t\t{\n\t\t\taction: 'delete',\n\t\t\tlabel: mw.msg( 'visualdata-jsmodule-dialog-delete' ),\n\t\t\tflags: 'destructive',\n\t\t\tmodes: [ 'validate-delete', 'submit-single-delete' ]\n\t\t},\n\t\t{\n\t\t\taction: 'validate',\n\t\t\tmodes: [ 'validate', 'validate-delete' ],\n\t\t\tlabel: mw.msg( 'visualdata-jsmodule-dialog-validate' ),\n\t\t\tflags: [ 'primary', 'progressive' ]\n\t\t},\n\t\t{\n\t\t\taction: 'back',\n\t\t\tlabel: OO.ui.deferMsg( 'visualdata-jsmodule-dialog-goback' ),\n\t\t\tflags: [ 'safe', 'back' ],\n\t\t\tmodes: [ 'submit', 'submit-delete' ]\n\t\t},\n\t\t{\n\t\t\taction: 'submit',\n\t\t\tlabel: mw.msg( 'visualdata-jsmodule-dialog-submit' ),\n\t\t\tflags: [ 'primary', 'progressive' ],\n\t\t\tmodes: [ 'submit', 'submit-delete' ]\n\t\t},\n\t\t{\n\t\t\taction: 'validate&submit',\n\t\t\tlabel: mw.msg( 'visualdata-jsmodule-dialog-submit' ),\n\t\t\tflags: [ 'primary', 'progressive' ],\n\t\t\tmodes: [ 'submit-single', 'submit-single-delete' ]\n\t\t},\n\t\t{\n\t\t\tlabel: mw.msg( 'visualdata-jsmodule-dialog-close' ),\n\t\t\tflags: [ 'safe', 'close' ],\n\t\t\tmodes: [\n\t\t\t\t'validate',\n\t\t\t\t'submit-single',\n\t\t\t\t'validate-delete',\n\t\t\t\t'submit-single-delete'\n\t\t\t]\n\t\t}\n\t];\n\n\tProcessDialog.prototype.getSetupProcess = function ( data ) {\n\t\t// data = data || {};\n\t\t// @see https://www.mediawiki.org/wiki/OOUI/Windows/Process_Dialogs\n\t\treturn ProcessDialog.super.prototype.getSetupProcess\n\t\t\t.call( this, data )\n\t\t\t.next( function () {\n\t\t\t\t// @see resources/lib/ooui/oojs-ui-windows.js\n\t\t\t\tthis.actions.setMode(\n\t\t\t\t\t( hasMultiplePanels() ?\n\t\t\t\t\t\t'validate' :\n\t\t\t\t\t\t'submit-single' ) + ( !hasStoredJsonData() ? '' : '-delete' )\n\t\t\t\t);\n\n\t\t\t\tthis.$body.append( data.PropertiesStack.$element );\n\t\t\t}, this );\n\t};\n\n\tProcessDialog.prototype.initialize = function () {\n\t\tProcessDialog.super.prototype.initialize.apply( this, arguments );\n\t\t// this.$body.append(this.data.OuterStack.$element);\n\t\t// showVisualEditor();\n\t};\n\n\tProcessDialog.prototype.getActionProcess = function ( action ) {\n\t\tif (\n\t\t\t!action ||\n\t\t\t( action === 'delete' &&\n\t\t\t\t// eslint-disable-next-line no-alert\n\t\t\t\t!confirm(\n\t\t\t\t\tmw.msg( 'visualdata-jsmodule-forms-delete-data-confirm' )\n\t\t\t\t) )\n\t\t) {\n\t\t\treturn ProcessDialog.super.prototype.getActionProcess.call( this, action );\n\t\t}\n\t\tvar self = this;\n\t\treturn ProcessDialog.super.prototype.getActionProcess\n\t\t\t.call( this, action )\n\t\t\t.next( () => {\n\t\t\t\tswitch ( action ) {\n\t\t\t\t\tcase 'back':\n\t\t\t\t\t\tvar panels = PropertiesStack.getItems();\n\t\t\t\t\t\tPropertiesStack.setItem( panels[ 0 ] );\n\t\t\t\t\t\tself.setSize(\n\t\t\t\t\t\t\t!( 'popup-size' in Form.options ) ||\n\t\t\t\t\t\t\t\tForm.options[ 'popup-size' ] === '' ?\n\t\t\t\t\t\t\t\t'medium' :\n\t\t\t\t\t\t\t\tForm.options[ 'popup-size' ]\n\t\t\t\t\t\t);\n\t\t\t\t\t\tself.actions.setMode(\n\t\t\t\t\t\t\t'validate' + ( !hasStoredJsonData() ? '' : '-delete' )\n\t\t\t\t\t\t);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'validate':\n\t\t\t\t\t\tProcessModel.getModel( 'validate' ).then( ( res ) => {\n\t\t\t\t\t\t\tif ( typeof res === 'boolean' ) {\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tvar thisPanels = PropertiesStack.getItems();\n\t\t\t\t\t\t\tPropertiesStack.setItem( thisPanels[ thisPanels.length - 1 ] );\n\t\t\t\t\t\t\tself.setSize( 'medium' );\n\t\t\t\t\t\t\tself.actions.setMode(\n\t\t\t\t\t\t\t\t'submit' + ( !hasStoredJsonData() ? '' : '-delete' )\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t} );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'validate&submit':\n\t\t\t\t\tcase 'submit':\n\t\t\t\t\tcase 'delete':\n\t\t\t\t\t\treturn ProcessModel.getModel( action ).then( ( res ) => {\n\t\t\t\t\t\t\tif ( action.indexOf( 'submit' ) !== 1 && typeof res === 'boolean' ) {\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tvar payload = {\n\t\t\t\t\t\t\t\tdata: JSON.stringify( getFormAttributes( res ) ),\n\t\t\t\t\t\t\t\taction: 'visualdata-submit-form'\n\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\treturn new Promise( ( resolve, reject ) => {\n\t\t\t\t\t\t\t\tnew mw.Api()\n\t\t\t\t\t\t\t\t\t.postWithToken( 'csrf', payload )\n\t\t\t\t\t\t\t\t\t.done( ( thisRes ) => {\n\t\t\t\t\t\t\t\t\t\tresolve();\n\t\t\t\t\t\t\t\t\t\tif ( payload.action in thisRes ) {\n\t\t\t\t\t\t\t\t\t\t\tvar data = JSON.parse( thisRes[ payload.action ].result );\n\t\t\t\t\t\t\t\t\t\t\tif ( !data.errors.length ) {\n\t\t\t\t\t\t\t\t\t\t\t\tWindowManager.closeActiveWindow();\n\t\t\t\t\t\t\t\t\t\t\t\t// @FIXME reload only if the changes affect\n\t\t\t\t\t\t\t\t\t\t\t\t// the current page\n\t\t\t\t\t\t\t\t\t\t\t\tif ( data[ 'target-url' ] === window.location.href ) {\n\t\t\t\t\t\t\t\t\t\t\t\t\twindow.location.reload();\n\t\t\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\t\t\twindow.location.href = data[ 'target-url' ];\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\t\tVisualDataFunctions.OOUIAlert(\n\t\t\t\t\t\t\t\t\t\t\t\t\tnew OO.ui.HtmlSnippet( data.errors.join( '<br />' ) ),\n\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsize: 'medium'\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t} )\n\t\t\t\t\t\t\t\t\t.fail( ( thisRes ) => {\n\t\t\t\t\t\t\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\t\t\t\t\t\t\tconsole.error( 'visualdata-submit-form', res );\n\t\t\t\t\t\t\t\t\t\treject( thisRes );\n\t\t\t\t\t\t\t\t\t} );\n\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t} ).catch( ( err ) => {\n\t\t\t\t\t\t\tVisualDataFunctions.OOUIAlert( `error: ${ err }`, { size: 'medium' } );\n\t\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t} );\n\n\t\t// return new OO.ui.Process(function () {\n\t\t// \tdialog.close({ action: action });\n\t\t// });\n\n\t\t// return ProcessDialog.super.prototype.getActionProcess.call(this, action);\n\t};\n\n\tProcessDialog.prototype.getTeardownProcess = function ( data ) {\n\t\treturn ProcessDialog.super.prototype.getTeardownProcess\n\t\t\t.call( this, data )\n\t\t\t.first( () => {\n\t\t\t\tWindowManager.removeActiveWindow();\n\t\t\t}, this );\n\t};\n\n\t/**\n\t * Override getBodyHeight to create a tall dialog relative to the screen.\n\t *\n\t * @return {number} Body height\n\t */\n\tProcessDialog.prototype.getBodyHeight = function () {\n\t\t// see here https://www.mediawiki.org/wiki/OOUI/Windows/Process_Dialogs\n\t\t// this.page1.content.$element.outerHeight( true );\n\t\treturn window.innerHeight - 100;\n\t};\n\n\tfunction getFormAttributes( jsondata ) {\n\t\treturn Object.assign(\n\t\t\t{\n\t\t\t\tformID: FormID,\n\t\t\t\tconfig: Config\n\t\t\t},\n\t\t\tjsondata\n\t\t);\n\t}\n\n\tfunction initializePropertiesStack() {\n\t\tvar panels = [ getSchemasPanelLayout(), getArticlePanelLayout() ].filter(\n\t\t\t( x ) => !x.isEmpty\n\t\t);\n\n\t\tvar classes = [];\n\n\t\tswitch ( panels.length ) {\n\t\t\tcase 0:\n\t\t\t\tclasses.push( 'PanelPropertiesStack-empty' );\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tclasses.push( 'PanelPropertiesStack' );\n\t\t}\n\n\t\tPropertiesStack = new OO.ui.StackLayout( {\n\t\t\titems: panels,\n\t\t\tcontinuous: false, // !hasMultiplePanels(),\n\t\t\texpanded: true,\n\t\t\tpadded: false,\n\t\t\t// The following classes are used here:\n\t\t\t// * PanelPropertiesStack\n\t\t\t// * PanelPropertiesStack-empty\n\t\t\tclasses: classes\n\t\t} );\n\n\t\tPropertiesStack.on( 'change', onChangePropertiesStack );\n\t\tPropertiesStack.on( 'set', onSetPropertiesStack );\n\t\treturn panels;\n\t}\n\n\tfunction hasMultiplePanels() {\n\t\treturn PropertiesStack && PropertiesStack.getItems().length > 1;\n\t}\n\n\tfunction hasStoredJsonData() {\n\t\tif ( Config.context !== 'EditData' && Form.options.action !== 'edit' ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif ( !( 'schemas' in StoredJsonData ) ) {\n\t\t\treturn false;\n\t\t}\n\t\tfor ( var i in StoredJsonData.schemas ) {\n\t\t\tif (\n\t\t\t\tVisualDataFunctions.isObject( StoredJsonData.schemas[ i ] ) &&\n\t\t\t\tObject.keys( StoredJsonData.schemas[ i ] ).length\n\t\t\t) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n\tfunction isVisible() {\n\t\treturn $( '#visualdataform-wrapper-' + FormID ).is( ':visible' );\n\t}\n\n\tfunction mutationChange() {\n\t\tif ( !isVisible() ) {\n\t\t\tInitialized = false;\n\t\t} else if ( !Initialized ) {\n\t\t\tinitialize();\n\t\t}\n\n\t\tfor ( var model of ModelFlatten ) {\n\t\t\tupdateFieldsVisibility( model );\n\t\t}\n\n\t\t// for ( var model of ModelFlatten ) {\n\t\t//\tupdateDependentFields( model );\n\t\t// }\n\t}\n\n\tfunction initialize() {\n\t\tif ( !isVisible() ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tInitialized = true;\n\n\t\tif ( Form.options.view === 'button' ) {\n\n\t\t\tvar button = new OO.ui.ButtonWidget( {\n\t\t\t\ticon: Form.options.icon,\n\t\t\t\tflags: [ 'primary', 'progressive' ],\n\t\t\t\tlabel: Form.options.label\n\t\t\t} );\n\t\t\tvar widget;\n\n\t\t\tif ( Form.options.schema !== '' ) {\n\t\t\t\tvar editButton = new OO.ui.ButtonWidget( {\n\t\t\t\t\ticon: 'edit',\n\t\t\t\t\tflags: [ 'primary', 'progressive' ]\n\t\t\t\t} );\n\n\t\t\t\teditButton.on( 'click', () => {\n\t\t\t\t\tinitializePropertiesStack();\n\n\t\t\t\t\tvar thisClasses = [];\n\t\t\t\t\tif ( 'css-class' in Form.options && Form.options[ 'css-class' ] !== '' ) {\n\t\t\t\t\t\tthisClasses.push( Form.options[ 'css-class' ] );\n\t\t\t\t\t}\n\n\t\t\t\t\t// eslint-disable-next-line mediawiki/class-doc\n\t\t\t\t\tvar processDialog = new ProcessDialog( {\n\t\t\t\t\t\tsize:\n\t\t\t\t\t\t\t!( 'popup-size' in Form.options ) || Form.options[ 'popup-size' ] === '' ?\n\t\t\t\t\t\t\t\t'medium' :\n\t\t\t\t\t\t\t\tForm.options[ 'popup-size' ],\n\t\t\t\t\t\tid: 'visualdataform-wrapper-dialog-' + FormID,\n\t\t\t\t\t\tclasses: thisClasses\n\t\t\t\t\t} );\n\n\t\t\t\t\tWindowManager.newWindow( processDialog, {\n\t\t\t\t\t\ttitle: Form.options.title,\n\t\t\t\t\t\tPropertiesStack: PropertiesStack\n\t\t\t\t\t} );\n\t\t\t\t} );\n\n\t\t\t\twidget = new OO.ui.ActionFieldLayout( button, editButton, {\n\t\t\t\t\tlabel: '',\n\t\t\t\t\talign: 'top',\n\t\t\t\t\tclasses: [ 'VisualDataPageButtonsActionField' ]\n\t\t\t\t} );\n\n\t\t\t} else {\n\t\t\t\twidget = button;\n\t\t\t}\n\n\t\t\tbutton.on( 'click', () => {\n\t\t\t\tvar args = [ Form.options.value ];\n\n\t\t\t\tif ( Form.options.schema !== '' && schemaHasData( Form.options.schema ) ) {\n\t\t\t\t\t// initializePropertiesStack();\n\t\t\t\t\t// ProcessModel.getModel( 'schema', Form.options.schema ).then( async function ( res ) {\n\t\t\t\t\t// \tif ( typeof res === 'boolean' && res === false ) {\n\t\t\t\t\t// \t\treturn;\n\t\t\t\t\t// \t}\n\t\t\t\t\t// \targs.push( res.data );\n\t\t\t\t\t// \tVisualDataFunctions.executeFunctionByName( Form.options.callback, window, args );\n\t\t\t\t\t// } );\n\t\t\t\t\targs.push( StoredJsonData.schemas[ Form.options.schema ] );\n\t\t\t\t}\n\t\t\t\tVisualDataFunctions.executeFunctionByName( Form.options.callback, window, args );\n\t\t\t} );\n\n\t\t\t$( '#visualdataform-wrapper-' + FormID ).html( widget.$element );\n\n\t\t\treturn true;\n\t\t}\n\n\t\tif ( Form.options.view === 'popup' ) {\n\n\t\t\tvar popupButton = new OO.ui.ButtonWidget( {\n\t\t\t\ticon: 'edit',\n\t\t\t\tlabel: Form.options.title\n\t\t\t} );\n\n\t\t\tpopupButton.on( 'click', () => {\n\t\t\t\tinitializePropertiesStack();\n\n\t\t\t\tvar thisClasses = [];\n\t\t\t\tif ( 'css-class' in Form.options && Form.options[ 'css-class' ] !== '' ) {\n\t\t\t\t\tthisClasses.push( Form.options[ 'css-class' ] );\n\t\t\t\t}\n\n\t\t\t\t// eslint-disable-next-line mediawiki/class-doc\n\t\t\t\tvar processDialog = new ProcessDialog( {\n\t\t\t\t\tsize:\n\t\t\t\t\t\t!( 'popup-size' in Form.options ) || Form.options[ 'popup-size' ] === '' ?\n\t\t\t\t\t\t\t'medium' :\n\t\t\t\t\t\t\tForm.options[ 'popup-size' ],\n\t\t\t\t\tid: 'visualdataform-wrapper-dialog-' + FormID,\n\t\t\t\t\tclasses: thisClasses\n\t\t\t\t} );\n\n\t\t\t\tWindowManager.newWindow( processDialog, {\n\t\t\t\t\ttitle: Form.options.title,\n\t\t\t\t\tPropertiesStack: PropertiesStack\n\t\t\t\t} );\n\t\t\t} );\n\t\t\t$( '#visualdataform-wrapper-' + FormID ).html( popupButton.$element );\n\n\t\t\treturn true;\n\t\t}\n\n\t\tvar formContent = [];\n\n\t\tif ( Form.errors.length ) {\n\t\t\tvar messageWidget = new OO.ui.MessageWidget( {\n\t\t\t\ttype: 'error',\n\t\t\t\tlabel: new OO.ui.HtmlSnippet( Form.errors.join( '<br /> ' ) )\n\t\t\t} );\n\n\t\t\tformContent.push( messageWidget.$element );\n\t\t\tformContent.push( $( '<br>' ) );\n\t\t}\n\n\t\tvar panels = initializePropertiesStack();\n\n\t\tSubmitButton = new OO.ui.ButtonInputWidget( {\n\t\t\tlabel:\n\t\t\t\t!( 'submit-button-text' in Form.options ) ||\n\t\t\t\tForm.options[ 'submit-button-text' ] === '' ?\n\t\t\t\t\tmw.msg( 'visualdata-jsmodule-forms-submit' ) :\n\t\t\t\t\tForm.options[ 'submit-button-text' ],\n\n\t\t\tflags: [ 'primary', 'progressive' ],\n\t\t\tclasses: [ 'VisualDataFormSubmitButton' ],\n\t\t\ttype: 'submit'\n\t\t} );\n\n\t\tformContent.push( PropertiesStack.$element );\n\t\tformContent.push( SubmitButton.$element );\n\n\t\tValidateButton = new OO.ui.ButtonInputWidget( {\n\t\t\tlabel:\n\t\t\t\t!( 'validate-button-text' in Form.options ) ||\n\t\t\t\tForm.options[ 'validate-button-text' ] === '' ?\n\t\t\t\t\tmw.msg( 'visualdata-jsmodule-forms-validate' ) :\n\t\t\t\t\tForm.options[ 'validate-button-text' ],\n\t\t\tclasses: [ 'VisualDataFormSubmitButton' ],\n\t\t\tflags: [ 'primary', 'progressive' ]\n\t\t\t// type: \"submit\",\n\t\t} );\n\n\t\tValidateButton.on( 'click', () => {\n\t\t\tProcessModel.getModel( 'validate' ).then( ( res ) => {\n\t\t\t\tif ( typeof res === 'boolean' && res === false ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tvar thisPanels = PropertiesStack.getItems();\n\t\t\t\tPropertiesStack.setItem( thisPanels[ thisPanels.length - 1 ] );\n\n\t\t\t\tValidateButton.toggle( false );\n\t\t\t\tSubmitButton.toggle( true );\n\t\t\t\tGoBackButton.toggle( true );\n\t\t\t\t// DeleteButton.toggle( false );\n\t\t\t\t$( '#visualdataform-wrapper-' + FormID )\n\t\t\t\t\t.get( 0 )\n\t\t\t\t\t.scrollIntoView( { behavior: 'smooth' } );\n\t\t\t} );\n\t\t} );\n\n\t\tformContent.push( ValidateButton.$element );\n\n\t\t// var printDeleteButton = hasStoredJsonData();\n\n\t\t// DeleteButton = new OO.ui.ButtonInputWidget( {\n\t\t// \tlabel: mw.msg( 'visualdata-jsmodule-forms-delete' ),\n\t\t// \tclasses: [ 'VisualDataFormSubmitButton' ],\n\t\t// \tflags: [ 'destructive' ],\n\t\t// \ttype: 'submit'\n\t\t// } );\n\n\t\t// formContent.push( DeleteButton.$element );\n\n\t\tGoBackButton = new OO.ui.ButtonInputWidget( {\n\t\t\tlabel: mw.msg( 'visualdata-jsmodule-forms-goback' ),\n\t\t\tclasses: [ 'VisualDataFormSubmitButton' ],\n\t\t\tflags: [ 'progressive' ],\n\t\t\ticon: 'arrowPrevious'\n\t\t} );\n\n\t\tGoBackButton.on( 'click', () => {\n\t\t\tvar thisPanels = PropertiesStack.getItems();\n\t\t\tPropertiesStack.setItem( thisPanels[ 0 ] );\n\n\t\t\tValidateButton.toggle( true );\n\t\t\tSubmitButton.toggle( false );\n\t\t\tGoBackButton.toggle( false );\n\t\t\t// DeleteButton.toggle( hasStoredJsonData() );\n\n\t\t\t$( '#visualdataform-wrapper-' + FormID )\n\t\t\t\t.get( 0 )\n\t\t\t\t.scrollIntoView( { behavior: 'smooth' } );\n\t\t} );\n\n\t\tformContent.push( GoBackButton.$element );\n\n\t\tupdateButtons( panels );\n\n\t\tvar classes = [\n\t\t\t'VisualDataForm',\n\t\t\t'VisualDataFormContext-' + Config.context\n\t\t];\n\n\t\tif ( 'css-class' in Form.options && Form.options[ 'css-class' ] !== '' ) {\n\t\t\tclasses.push( Form.options[ 'css-class' ] );\n\t\t}\n\n\t\t// eslint-disable-next-line mediawiki/class-doc\n\t\tvar form = new OO.ui.FormLayout( {\n\t\t\taction: Config.actionUrl,\n\t\t\tmethod: 'post',\n\t\t\tenctype: 'multipart/form-data',\n\t\t\t$content: formContent,\n\t\t\tclasses: classes,\n\t\t\tdata: { name: 'visualdata' }\n\t\t} );\n\n\t\t// DeleteButton.on( 'click', function () {\n\t\t// \tif (\n\t\t// \t\t// eslint-disable-next-line no-alert\n\t\t// \t\tconfirm(\n\t\t// \t\t\tmw.msg( 'visualdata-jsmodule-forms-delete-data-confirm' )\n\t\t// \t\t)\n\t\t// \t) {\n\t\t// \t\tform.$element.data( { delete: true } );\n\t\t// \t\tform.$element.trigger( 'submit' );\n\t\t// \t}\n\n\t\t// VisualDataFunctions.OOUIAlert(\n\t\t// \tnew OO.ui.HtmlSnippet(\n\t\t// \t\tmw.msg(\"visualdata-jsmodule-visualdata-delete-data-confirm\")\n\t\t// \t),\n\t\t// \t{ size: \"medium\" },\n\t\t// \tfunction () {\n\t\t// \t\tform.$element.data({ delete: true });\n\t\t// \t\tform.$element.submit();\n\t\t// \t}\n\t\t// );\n\t\t// } );\n\n\t\tform.$element.on( 'submit', onSubmit );\n\n\t\tvar editToolbar = Config.canmanageschemas || Config.caneditdata;\n\n\t\tif ( Config.context === 'parserfunction' || !editToolbar ) {\n\t\t\t$( '#visualdataform-wrapper-' + FormID ).html( form.$element );\n\n\t\t\t// eslint-disable-next-line no-jquery/no-global-selector\n\t\t\t$( '#mw-rcfilters-spinner-wrapper' ).remove();\n\t\t\t// showVisualEditor();\n\n\t\t\treturn true;\n\t\t}\n\n\t\tvar items = [];\n\t\tToolbarMain = createToolbar( Config.context === 'EditData' );\n\n\t\tvar frameA = new OO.ui.PanelLayout( {\n\t\t\t$content: [ ToolbarMain.$element, form.$element ],\n\t\t\texpanded: false,\n\t\t\tframed: false,\n\t\t\tpadded: false,\n\t\t\tdata: { name: 'visualdata' }\n\t\t} );\n\n\t\titems.push( frameA );\n\n\t\tif ( Config.canmanageschemas ) {\n\t\t\tActionToolbarMain = createActionToolbar( Config.context === 'EditData' );\n\t\t\tToolbarMain.$actions.append( ActionToolbarMain.$element );\n\n\t\t\t// https://gerrit.wikimedia.org/r/plugins/gitiles/oojs/ui/+/c2805c7e9e83e2f3a857451d46c80231d1658a0f/demos/pages/layouts.js\n\t\t\tvar toolbarSchemas = VisualDataSchemas.createToolbarA();\n\t\t\tvar contentSchemas = new OO.ui.PanelLayout( {\n\t\t\t\t$content: $(\n\t\t\t\t\t'<table id=\"visualdata-schemas-datatable\" class=\"visualdata-datatable display\" width=\"100%\"></table>'\n\t\t\t\t),\n\t\t\t\texpanded: false,\n\t\t\t\tframed: true,\n\t\t\t\tpadded: true,\n\t\t\t\tclasses: [ 'VisualDataEditDataOuterStackPanel' ]\n\t\t\t} );\n\n\t\t\tvar frameSchemas = new OO.ui.PanelLayout( {\n\t\t\t\t$content: [ toolbarSchemas.$element, contentSchemas.$element ],\n\t\t\t\texpanded: false,\n\t\t\t\tframed: false,\n\t\t\t\tpadded: false,\n\t\t\t\tdata: { name: 'manage-schemas' }\n\t\t\t} );\n\n\t\t\titems.push( frameSchemas );\n\t\t}\n\n\t\t// if (Config.canmanageforms) {\n\t\t// \tvar toolbarForms = VisualDataForms.createToolbarA();\n\t\t// \tvar contentForms = new OO.ui.PanelLayout({\n\t\t// \t\t$content: $(\n\t\t// \t\t\t'<table id=\"visualdata-forms-datatable\" class=\"visualdata-datatable display\" width=\"100%\"></table>'\n\t\t// \t\t),\n\t\t// \t\texpanded: false,\n\t\t// \t\tpadded: true,\n\t\t// \t});\n\t\t//\n\t\t// \tvar frameForms = new OO.ui.PanelLayout({\n\t\t// \t\t$content: [toolbarForms.$element, contentForms.$element],\n\t\t// \t\texpanded: false,\n\t\t// \t\tframed: true,\n\t\t// \t\tdata: { name: \"manage-forms\" },\n\t\t// \t});\n\t\t//\n\t\t// \titems.push(frameForms);\n\t\t// }\n\n\t\tOuterStack = new OO.ui.StackLayout( {\n\t\t\titems: items,\n\t\t\texpanded: false,\n\t\t\tcontinuous: false\n\t\t\t// classes: [\"visualdataform-wrapper\"],\n\t\t} );\n\n\t\tif ( Config.canmanageschemas ) {\n\t\t\tvar actionToolbarSchemas = createActionToolbar(\n\t\t\t\tConfig.context === 'EditData'\n\t\t\t);\n\t\t\ttoolbarSchemas.$actions.append( actionToolbarSchemas.$element );\n\t\t}\n\n\t\t// if (Config.canmanageforms) {\n\t\t// \tvar actionToolbarForms = createActionToolbar();\n\t\t// \ttoolbarForms.$actions.append(actionToolbarForms.$element);\n\t\t// }\n\n\t\t$( '#visualdataform-wrapper-' + FormID ).html( OuterStack.$element );\n\n\t\tToolbarMain.initialize();\n\n\t\tif ( Config.canmanageschemas ) {\n\t\t\ttoolbarSchemas.initialize();\n\t\t}\n\n\t\t// if (Config.canmanageforms) {\n\t\t// \ttoolbarForms.initialize();\n\t\t// }\n\n\t\t$( '#mw-rcfilters-spinner-wrapper' ).remove();\n\n\t\t// showVisualEditor();\n\n\t\treturn true;\n\t}\n\n\treturn {\n\t\tinitialize,\n\t\tgetCategories,\n\t\t// updateForms,\n\t\tupdateSchemas,\n\t\tupdatePanels,\n\t\tmutationChange\n\t};\n};\n\n$( () => {\n\tvar schemas = JSON.parse( mw.config.get( 'visualdata-schemas' ) );\n\t// console.log(\"schemas\", schemas);\n\n\tvar submissionData = JSON.parse(\n\t\tmw.config.get( 'visualdata-submissiondata' )\n\t);\n\t// console.log(\"submissionData\", submissionData);\n\n\tvar pageForms = JSON.parse( mw.config.get( 'visualdata-pageforms' ) );\n\t// console.log(\"pageForms\", pageForms);\n\n\tvar config = JSON.parse( mw.config.get( 'visualdata-config' ) );\n\t// console.log(\"config\", config);\n\n\tvar windowManager = new VisualDataWindowManager();\n\n\tif ( !submissionData ) {\n\t\tsubmissionData = {};\n\t}\n\n\tfunction init() {\n\t\tvar instances = [];\n\n\t\tfor ( var formID in pageForms ) {\n\n\t\t\tvar form = pageForms[ formID ];\n\n\t\t\tform = Object.assign(\n\t\t\t\t{\n\t\t\t\t\tfreetext: '',\n\t\t\t\t\tjsonData: {},\n\t\t\t\t\tcategories: [],\n\t\t\t\t\terrors: [],\n\t\t\t\t\tschemas: [],\n\t\t\t\t\toptions: {}\n\t\t\t\t},\n\t\t\t\tform\n\t\t\t);\n\n\t\t\tif ( !config.caneditdata ) {\n\t\t\t\t// form.options.title\n\t\t\t\t$( '#visualdataform-wrapper-' + formID ).html( mw.msg( 'visualdata-jsmodule-forms-cannot-edit-form' ) );\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif ( formID in submissionData ) {\n\t\t\t\tform = Object.assign(\n\t\t\t\t\tform,\n\t\t\t\t\tsubmissionData[ formID ]\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tvar visualDataForm = new VisualDataForms(\n\t\t\t\tconfig,\n\t\t\t\tform,\n\t\t\t\tformID,\n\t\t\t\tschemas,\n\t\t\t\twindowManager\n\t\t\t);\n\n\t\t\tvisualDataForm.initialize();\n\n\t\t\tif ( config.context === 'parserfunction' && form.errors.length ) {\n\t\t\t\t$( '#visualdataform-wrapper-' + formID )\n\t\t\t\t\t.get( 0 )\n\t\t\t\t\t.scrollIntoView();\n\t\t\t}\n\n\t\t\tinstances.push( visualDataForm );\n\t\t}\n\n\t\t// *** this allows to render forms when they\n\t\t// are contained within not visible elements\n\t\t// like datatables cells, or dialogs\n\t\tvar MutationObserver = window.MutationObserver || window.WebKitMutationObserver;\n\n\t\tif ( MutationObserver ) {\n\t\t\tvar observer = new MutationObserver( ( mutations, thisObserver ) => {\n\t\t\t\tfor ( var instance of instances ) {\n\t\t\t\t\tinstance.mutationChange();\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\tobserver.observe( document, {\n\t\t\t\tsubtree: true,\n\t\t\t\tchildList: true\n\t\t\t} );\n\t\t}\n\n\t\treturn instances;\n\t}\n\n\tif ( !config.canmanageschemas ) {\n\t\tVisualData.setVars( config, schemas, init() );\n\n\t} else {\n\t\tmw.loader.using( 'ext.VisualData.ManageSchemas', () => {\n\t\t\tvar instances = init();\n\t\t\tVisualData.setVars( config, schemas, instances );\n\t\t\tVisualDataSchemas.setVars(\n\t\t\t\tconfig,\n\t\t\t\twindowManager,\n\t\t\t\tschemas,\n\t\t\t\tinstances\n\t\t\t);\n\t\t} );\n\t}\n\n} );\n","usedDeprecatedRules":[{"ruleId":"max-len","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/VisualDataFunctions.js","messages":[],"suppressedMessages":[{"ruleId":"no-implicit-globals","severity":2,"message":"Global variable leak, declare the variable if it is intended to be local.","line":25,"column":1,"nodeType":"AssignmentExpression","messageId":"globalVariableLeak","endLine":846,"endColumn":6,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":80,"column":5,"nodeType":"Program","messageId":"unexpectedTab","endLine":80,"endColumn":6,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":81,"column":5,"nodeType":"Program","messageId":"unexpectedTab","endLine":81,"endColumn":6,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":82,"column":5,"nodeType":"Program","messageId":"unexpectedTab","endLine":82,"endColumn":6,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":83,"column":5,"nodeType":"Program","messageId":"unexpectedTab","endLine":83,"endColumn":6,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":84,"column":5,"nodeType":"Program","messageId":"unexpectedTab","endLine":84,"endColumn":6,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":97,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":97,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-useless-escape","severity":2,"message":"Unnecessary escape character: \\(.","line":127,"column":52,"nodeType":"Literal","messageId":"unnecessaryEscape","endLine":127,"endColumn":53,"suggestions":[{"messageId":"removeEscape","fix":{"range":[3665,3666],"text":""},"desc":"Remove the `\\`. This maintains the current functionality."},{"messageId":"escapeBackslash","fix":{"range":[3665,3665],"text":"\\"},"desc":"Replace the `\\` with `\\\\` to include the actual backslash character."}],"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-useless-escape","severity":2,"message":"Unnecessary escape character: \\).","line":127,"column":54,"nodeType":"Literal","messageId":"unnecessaryEscape","endLine":127,"endColumn":55,"suggestions":[{"messageId":"removeEscape","fix":{"range":[3667,3668],"text":""},"desc":"Remove the `\\`. This maintains the current functionality."},{"messageId":"escapeBackslash","fix":{"range":[3667,3667],"text":"\\"},"desc":"Replace the `\\` with `\\\\` to include the actual backslash character."}],"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-console","severity":2,"message":"Unexpected console statement.","line":246,"column":3,"nodeType":"MemberExpression","messageId":"unexpected","endLine":246,"endColumn":14,"suggestions":[{"messageId":"removeConsole","data":{"propertyName":"log"},"fix":{"range":[6587,6605],"text":""},"desc":"Remove the console.log()."}],"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":496,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":496,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":497,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":497,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":498,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":498,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":499,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":499,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":500,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":500,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":501,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":501,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-sequences","severity":2,"message":"Unexpected use of comma operator.","line":653,"column":59,"nodeType":"SequenceExpression","messageId":"unexpectedCommaExpression","endLine":653,"endColumn":60,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-console","severity":2,"message":"Unexpected console statement.","line":776,"column":4,"nodeType":"MemberExpression","messageId":"unexpected","endLine":776,"endColumn":17,"suggestions":[{"messageId":"removeConsole","data":{"propertyName":"error"},"fix":{"range":[20608,20682],"text":""},"desc":"Remove the console.error()."}],"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'e' is defined but never used.","line":787,"column":47,"nodeType":"Identifier","messageId":"unusedVar","endLine":787,"endColumn":48,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-self-compare","severity":2,"message":"Comparing to itself is potentially pointless.","line":802,"column":39,"nodeType":"BinaryExpression","messageId":"comparingToSelf","endLine":802,"endColumn":54,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"max-len","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/VisualDataGeolocation.js","messages":[],"suppressedMessages":[{"ruleId":"no-unused-vars","severity":2,"message":"'VisualDataGeolocation' is assigned a value but never used.","line":24,"column":7,"nodeType":"Identifier","messageId":"unusedVar","endLine":24,"endColumn":28,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'Config' is assigned a value but never used.","line":26,"column":6,"nodeType":"Identifier","messageId":"unusedVar","endLine":26,"endColumn":12,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"max-len","severity":1,"message":"This line has a length of 158. Maximum allowed is 100.","line":65,"column":1,"nodeType":"Program","messageId":"max","endLine":65,"endColumn":144,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"max-len","severity":1,"message":"This line has a length of 161. Maximum allowed is 100.","line":70,"column":1,"nodeType":"Program","messageId":"max","endLine":70,"endColumn":147,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"max-len","severity":1,"message":"This line has a length of 116. Maximum allowed is 100.","line":86,"column":1,"nodeType":"Program","messageId":"max","endLine":86,"endColumn":102,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"max-len","severity":1,"message":"This line has a length of 147. Maximum allowed is 100.","line":108,"column":1,"nodeType":"Program","messageId":"max","endLine":108,"endColumn":133,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"max-len","severity":1,"message":"This line has a length of 356. Maximum allowed is 100.","line":112,"column":1,"nodeType":"Program","messageId":"max","endLine":112,"endColumn":342,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"max-len","severity":1,"message":"This line has a length of 273. Maximum allowed is 100.","line":116,"column":1,"nodeType":"Program","messageId":"max","endLine":116,"endColumn":259,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"max-len","severity":1,"message":"This line has a length of 102. Maximum allowed is 100.","line":123,"column":1,"nodeType":"Program","messageId":"max","endLine":123,"endColumn":88,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"max-len","severity":1,"message":"This line has a length of 250. Maximum allowed is 100.","line":124,"column":1,"nodeType":"Program","messageId":"max","endLine":124,"endColumn":236,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"max-len","severity":1,"message":"This line has a length of 204. Maximum allowed is 100.","line":126,"column":1,"nodeType":"Program","messageId":"max","endLine":126,"endColumn":190,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"max-len","severity":1,"message":"This line has a length of 186. Maximum allowed is 100.","line":132,"column":1,"nodeType":"Program","messageId":"max","endLine":132,"endColumn":172,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"max-len","severity":1,"message":"This line has a length of 237. Maximum allowed is 100.","line":141,"column":1,"nodeType":"Program","messageId":"max","endLine":141,"endColumn":223,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"max-len","severity":1,"message":"This line has a length of 118. Maximum allowed is 100.","line":157,"column":1,"nodeType":"Program","messageId":"max","endLine":157,"endColumn":104,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'data' is assigned a value but never used.","line":183,"column":7,"nodeType":"Identifier","messageId":"unusedVar","endLine":183,"endColumn":11,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"max-len","severity":1,"message":"This line has a length of 108. Maximum allowed is 100.","line":317,"column":1,"nodeType":"Program","messageId":"max","endLine":317,"endColumn":100,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-inner-declarations","severity":2,"message":"Move function declaration to function body root.","line":423,"column":4,"nodeType":"FunctionDeclaration","messageId":"moveDeclToRoot","endLine":428,"endColumn":5,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-inner-declarations","severity":2,"message":"Move function declaration to function body root.","line":433,"column":4,"nodeType":"FunctionDeclaration","messageId":"moveDeclToRoot","endLine":438,"endColumn":5,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-inner-declarations","severity":2,"message":"Move function declaration to function body root.","line":441,"column":4,"nodeType":"FunctionDeclaration","messageId":"moveDeclToRoot","endLine":446,"endColumn":5,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'property' is defined but never used.","line":459,"column":45,"nodeType":"Identifier","messageId":"unusedVar","endLine":459,"endColumn":53,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"max-len","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/VisualDataInputConfig.js","messages":[{"ruleId":"max-len","severity":1,"message":"This line has a length of 110. Maximum allowed is 100.","line":838,"column":1,"nodeType":"Program","messageId":"max","endLine":838,"endColumn":96}],"suppressedMessages":[{"ruleId":"no-unused-vars","severity":2,"message":"'VisualDataInputConfig' is assigned a value but never used.","line":26,"column":7,"nodeType":"Identifier","messageId":"unusedVar","endLine":26,"endColumn":28,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'Config' is assigned a value but never used.","line":28,"column":6,"nodeType":"Identifier","messageId":"unusedVar","endLine":28,"endColumn":12,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":294,"column":9,"nodeType":"Program","messageId":"unexpectedTab","endLine":294,"endColumn":10,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":295,"column":9,"nodeType":"Program","messageId":"unexpectedTab","endLine":295,"endColumn":10,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":304,"column":9,"nodeType":"Program","messageId":"unexpectedTab","endLine":304,"endColumn":10,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":305,"column":9,"nodeType":"Program","messageId":"unexpectedTab","endLine":305,"endColumn":10,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":425,"column":11,"nodeType":"Program","messageId":"unexpectedTab","endLine":425,"endColumn":12,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":426,"column":11,"nodeType":"Program","messageId":"unexpectedTab","endLine":426,"endColumn":12,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":485,"column":9,"nodeType":"Program","messageId":"unexpectedTab","endLine":485,"endColumn":10,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":486,"column":9,"nodeType":"Program","messageId":"unexpectedTab","endLine":486,"endColumn":10,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":494,"column":9,"nodeType":"Program","messageId":"unexpectedTab","endLine":494,"endColumn":10,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":495,"column":9,"nodeType":"Program","messageId":"unexpectedTab","endLine":495,"endColumn":10,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":649,"column":9,"nodeType":"Program","messageId":"unexpectedTab","endLine":649,"endColumn":10,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":650,"column":9,"nodeType":"Program","messageId":"unexpectedTab","endLine":650,"endColumn":10,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":678,"column":9,"nodeType":"Program","messageId":"unexpectedTab","endLine":678,"endColumn":10,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":679,"column":9,"nodeType":"Program","messageId":"unexpectedTab","endLine":679,"endColumn":10,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":715,"column":11,"nodeType":"Program","messageId":"unexpectedTab","endLine":715,"endColumn":12,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":716,"column":11,"nodeType":"Program","messageId":"unexpectedTab","endLine":716,"endColumn":12,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":774,"column":9,"nodeType":"Program","messageId":"unexpectedTab","endLine":774,"endColumn":10,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":775,"column":9,"nodeType":"Program","messageId":"unexpectedTab","endLine":775,"endColumn":10,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":832,"column":9,"nodeType":"Program","messageId":"unexpectedTab","endLine":832,"endColumn":10,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":833,"column":9,"nodeType":"Program","messageId":"unexpectedTab","endLine":833,"endColumn":10,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":837,"column":9,"nodeType":"Program","messageId":"unexpectedTab","endLine":837,"endColumn":10,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":838,"column":9,"nodeType":"Program","messageId":"unexpectedTab","endLine":838,"endColumn":10,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":854,"column":9,"nodeType":"Program","messageId":"unexpectedTab","endLine":854,"endColumn":10,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":855,"column":9,"nodeType":"Program","messageId":"unexpectedTab","endLine":855,"endColumn":10,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'data' is assigned a value but never used.","line":1088,"column":7,"nodeType":"Identifier","messageId":"unusedVar","endLine":1088,"endColumn":11,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'property' is defined but never used.","line":1154,"column":45,"nodeType":"Identifier","messageId":"unusedVar","endLine":1154,"endColumn":53,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/**\n * This file is part of the MediaWiki extension VisualData.\n *\n * VisualData is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 2 of the License, or\n * (at your option) any later version.\n *\n * VisualData is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with VisualData. If not, see <http://www.gnu.org/licenses/>.\n *\n * @file\n * @author thomas-topway-it <support@topway.it>\n * @copyright Copyright ©2023, https://wikisphere.org\n */\n\n/* eslint-disable no-tabs */\n\n// @see https://doc.wikimedia.org/oojs-ui/master/js/\n// eslint-disable-next-line no-unused-vars\nconst VisualDataInputConfig = function ( phpConfig, windowManager ) {\n\t// eslint-disable-next-line no-unused-vars\n\tvar Config = phpConfig;\n\tvar WindowManager = windowManager;\n\tvar ProcessDialog;\n\tvar DialogSearchName = 'dialogSearch';\n\tvar processDialogSearch;\n\tvar Model;\n\tvar InputName;\n\tvar CustomInputConfig;\n\tvar Callback;\n\tvar panelLayout;\n\tvar SelectedItems = {};\n\tvar HelpUrl;\n\n\tfunction inArray( val, arr ) {\n\t\treturn arr.indexOf( val ) !== -1;\n\t}\n\n\t// @TODO add default for each of them\n\tfunction getInputConfig( inputName ) {\n\t\tswitch ( inputName ) {\n\t\t\tcase 'mw.widgets.UserInputWidget':\n\t\t\tcase 'mw.widgets.TitleInputWidget':\n\t\t\tcase 'mw.widgets.DateInputWidget':\n\t\t\tcase 'OO.ui.TextInputWidget':\n\t\t\t\tvar ret = {\n\t\t\t\t\taccessKey: [ 'string', 'The access key' ],\n\t\t\t\t\tautocomplete: [\n\t\t\t\t\t\t'boolean', // 'boolean|string',\n\t\t\t\t\t\t'Should the browser support autocomplete for this field?'\n\t\t\t\t\t],\n\t\t\t\t\tautofocus: [\n\t\t\t\t\t\t'boolean',\n\t\t\t\t\t\t'Use an HTML autofocus attribute to instruct the browser to focus this widget.'\n\t\t\t\t\t],\n\t\t\t\t\tclasses: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t'The names of the CSS classes to apply to the element.'\n\t\t\t\t\t],\n\t\t\t\t\tdir: [ 'string', 'The directionality of the input (ltr/rtl).' ],\n\t\t\t\t\tdisabled: [ 'boolean', 'Disable the widget.' ],\n\t\t\t\t\tflags: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t\"The name or names of the flags (e.g., 'progressive' or 'primary') to apply.\"\n\t\t\t\t\t],\n\t\t\t\t\ticon: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t'The symbolic name of the icon (e.g., ‘remove’ or ‘menu’), or a map of symbolic names.'\n\t\t\t\t\t],\n\t\t\t\t\tid: [ 'string', 'The HTML id attribute used in the rendered tag.' ],\n\t\t\t\t\tindicator: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t'Symbolic name of the indicator (e.g. ‘required’ or ‘down’).'\n\t\t\t\t\t],\n\t\t\t\t\tinputFilter: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t'The name of an input filter function. Input filters modify the value of an input before it is accepted'\n\t\t\t\t\t],\n\t\t\t\t\tinputId: [ 'string', 'The value of the input’s HTML id attribute.' ],\n\t\t\t\t\tinvisibleLabel: [\n\t\t\t\t\t\t'boolean',\n\t\t\t\t\t\t'Whether the label should be visually hidden (but still accessible to screen-readers).'\n\t\t\t\t\t],\n\t\t\t\t\tlabel: [ 'string', 'The label text' ],\n\t\t\t\t\tlabelPosition: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t\"The position of the inline label relative to that of the value or placeholder text: 'before' or 'after'\"\n\t\t\t\t\t],\n\t\t\t\t\tmaxLength: [\n\t\t\t\t\t\t'integer',\n\t\t\t\t\t\t'Maximum number of characters allowed in the input.'\n\t\t\t\t\t],\n\t\t\t\t\tminLength: [\n\t\t\t\t\t\t'integer',\n\t\t\t\t\t\t'Minimum number of characters allowed in the input.'\n\t\t\t\t\t],\n\t\t\t\t\tname: [ 'string', 'The value of the input’s HTML name attribute.' ],\n\t\t\t\t\tplaceholder: [ 'string', 'Placeholder text' ],\n\t\t\t\t\treadOnly: [\n\t\t\t\t\t\t'boolean',\n\t\t\t\t\t\t'Prevent changes to the value of the text input.'\n\t\t\t\t\t],\n\t\t\t\t\tspellcheck: [\n\t\t\t\t\t\t'boolean',\n\t\t\t\t\t\t'Should the browser support spellcheck for this field (undefined means leaving it up to the browser).'\n\t\t\t\t\t],\n\t\t\t\t\ttext: [ 'string', 'Text to insert' ],\n\t\t\t\t\ttitle: [ 'string', 'The title text.' ],\n\t\t\t\t\ttype: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t\"The value of the HTML type attribute: 'text', 'password', 'email', 'url' or 'number'.\"\n\t\t\t\t\t],\n\t\t\t\t\tvalidate: [\n\t\t\t\t\t\t'string', // regex\n\t\t\t\t\t\t'A regular expression that must match the value for it to be considered valid. See <a target=\"_blank\" href=\"https://json-schema.org/understanding-json-schema/reference/regular_expressions\">Regular Expressions</a>'\n\t\t\t\t\t]\n\t\t\t\t\t// value: [\"string\", \"The value of the input.\"],\n\t\t\t\t};\n\n\t\t\t\tswitch ( inputName ) {\n\t\t\t\t\tcase 'mw.widgets.DateInputWidget':\n\t\t\t\t\t\treturn Object.assign( ret, {\n\t\t\t\t\t\t\tprecision: [ 'day/month', \" Date precision to use, 'day' or 'month'\" ],\n\t\t\t\t\t\t\tinputFormat: [\n\t\t\t\t\t\t\t\t'string',\n\t\t\t\t\t\t\t\t'Date format string to use for the textual input field'\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tdisplayFormat: [\n\t\t\t\t\t\t\t\t'string',\n\t\t\t\t\t\t\t\t'Date format string to use for the clickable label'\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tlongDisplayFormat: [\n\t\t\t\t\t\t\t\t'boolean',\n\t\t\t\t\t\t\t\t'If a custom displayFormat is not specified, use unabbreviated day of the week and month names in the default language-specific displayFormat'\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tplaceholderLabel: [\n\t\t\t\t\t\t\t\t'string',\n\t\t\t\t\t\t\t\t'Placeholder text shown when the widget is not'\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tplaceholderDateFormat: [\n\t\t\t\t\t\t\t\t'string',\n\t\t\t\t\t\t\t\t\"User-visible date format string displayed in the textual input field when it's empty\"\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tmustBeAfter: [ 'date', 'Validates the date to be after this' ],\n\t\t\t\t\t\t\tmustBeBefore: [ 'date', 'Validates the date to be before this' ]\n\t\t\t\t\t\t} );\n\n\t\t\t\t\tcase 'mw.widgets.TitleInputWidget':\n\t\t\t\t\t\treturn Object.assign( ret, {\n\t\t\t\t\t\t\tlimit: [ 'integer', 'Number of results to show' ],\n\t\t\t\t\t\t\tnamespace: [ 'integer', 'Namespace to prepend to queries' ],\n\t\t\t\t\t\t\tmaxLength: [ 'integer', 'Maximum query length' ],\n\t\t\t\t\t\t\trelative: [\n\t\t\t\t\t\t\t\t'boolean',\n\t\t\t\t\t\t\t\t'If a namespace is set, display titles relative to it'\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tsuggestions: [ 'boolean', 'Display search suggestions' ],\n\t\t\t\t\t\t\tshowRedirectTargets: [ 'boolean', 'Show the targets of redirects' ],\n\t\t\t\t\t\t\tshowImages: [ 'boolean', 'Show page images' ],\n\t\t\t\t\t\t\tshowDescriptions: [ 'boolean', 'Show page descriptions' ],\n\t\t\t\t\t\t\tshowDisambigsLast: [\n\t\t\t\t\t\t\t\t'boolean',\n\t\t\t\t\t\t\t\t'Show disambiguation pages as the last results'\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tshowMissing: [ 'boolean', 'Show missing pages' ],\n\t\t\t\t\t\t\tshowInterwikis: [\n\t\t\t\t\t\t\t\t'boolean',\n\t\t\t\t\t\t\t\t'Show pages with a valid interwiki prefix'\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\taddQueryInput: [ 'boolean', \"Add exact user's input query to results\" ],\n\t\t\t\t\t\t\texcludeCurrentPage: [\n\t\t\t\t\t\t\t\t'boolean',\n\t\t\t\t\t\t\t\t'Exclude the current page from suggestions'\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\texcludeDynamicNamespaces: [\n\t\t\t\t\t\t\t\t'boolean',\n\t\t\t\t\t\t\t\t'Exclude pages whose namespace is negative'\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tvalidateTitle: [ 'boolean', 'Whether the input must be a valid title' ],\n\t\t\t\t\t\t\trequired: [ 'boolean', 'Whether the input must not be empty' ],\n\t\t\t\t\t\t\thighlightSearchQuery: [\n\t\t\t\t\t\t\t\t'boolean',\n\t\t\t\t\t\t\t\t'Highlight the partial query the user used for this title'\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t} );\n\n\t\t\t\t\tcase 'mw.widgets.UserInputWidget':\n\t\t\t\t\t\treturn Object.assign( ret, {\n\t\t\t\t\t\t\tlimit: [ 'integer', 'Number of results to show' ]\n\t\t\t\t\t\t} );\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\treturn ret;\n\t\t\t\t}\n\n\t\t\tcase 'OO.ui.ToggleSwitchWidget':\n\t\t\t\treturn {\n\t\t\t\t\tclasses: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t'The names of the CSS classes to apply to the element.'\n\t\t\t\t\t],\n\t\t\t\t\tdisabled: [ 'boolean', 'Disable the widget.' ],\n\t\t\t\t\tid: [ 'string', 'The HTML id attribute used in the rendered tag.' ],\n\t\t\t\t\ttext: [ 'string', 'Text to insert' ],\n\t\t\t\t\ttitle: [ 'string', 'The title text.' ]\n\t\t\t\t\t// value: [\"string\", \"The value of the input.\"],\n\t\t\t\t};\n\n\t\t\tcase 'OO.ui.RadioSelectInputWidget':\n\t\t\t\treturn {\n\t\t\t\t\tclasses: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t'The names of the CSS classes to apply to the element.'\n\t\t\t\t\t],\n\t\t\t\t\tdir: [ 'string', 'The directionality of the input (ltr/rtl).' ],\n\t\t\t\t\tdisabled: [ 'boolean', 'Disable the widget.' ],\n\t\t\t\t\tid: [ 'string', 'The HTML id attribute used in the rendered tag.' ],\n\t\t\t\t\tinputFilter: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t'The name of an input filter function. Input filters modify the value of an input before it is accepted'\n\t\t\t\t\t],\n\t\t\t\t\tinputId: [ 'string', 'The value of the input’s HTML id attribute.' ],\n\t\t\t\t\tname: [ 'string', 'The value of the input’s HTML name attribute.' ],\n\t\t\t\t\t// options: [\"array\", \"Array of menu options\"],\n\t\t\t\t\ttext: [ 'string', 'Text to insert' ],\n\t\t\t\t\ttitle: [ 'string', 'The title text' ]\n\t\t\t\t};\n\n\t\t\tcase 'OO.ui.NumberInputWidget':\n\t\t\t\treturn {\n\t\t\t\t\taccessKey: [ 'string', 'The access key' ],\n\t\t\t\t\tautocomplete: [\n\t\t\t\t\t\t'boolean', // 'boolean|string',\n\t\t\t\t\t\t'Should the browser support autocomplete for this field?'\n\t\t\t\t\t],\n\t\t\t\t\tautofocus: [\n\t\t\t\t\t\t'boolean',\n\t\t\t\t\t\t'Use an HTML autofocus attribute to instruct the browser to focus this widget.'\n\t\t\t\t\t],\n\t\t\t\t\tbuttonStep: [\n\t\t\t\t\t\t'integer',\n\t\t\t\t\t\t'Delta when using the buttons or Up/Down arrow keys'\n\t\t\t\t\t],\n\t\t\t\t\tclasses: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t'The names of the CSS classes to apply to the element.'\n\t\t\t\t\t],\n\t\t\t\t\tdir: [ 'string', 'The directionality of the input (ltr/rtl).' ],\n\t\t\t\t\tdisabled: [ 'boolean', 'Disable the widget.' ],\n\t\t\t\t\tflags: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t\"The name or names of the flags (e.g., 'progressive' or 'primary') to apply.\"\n\t\t\t\t\t],\n\t\t\t\t\ticon: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t'The symbolic name of the icon (e.g., ‘remove’ or ‘menu’), or a map of symbolic names.'\n\t\t\t\t\t],\n\t\t\t\t\tid: [ 'string', 'The HTML id attribute used in the rendered tag.' ],\n\t\t\t\t\tindicator: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t'Symbolic name of the indicator (e.g. ‘required’ or ‘down’).'\n\t\t\t\t\t],\n\t\t\t\t\tinputFilter: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t'The name of an input filter function. Input filters modify the value of an input before it is accepted'\n\t\t\t\t\t],\n\t\t\t\t\tinputId: [ 'string', 'The value of the input’s HTML id attribute.' ],\n\t\t\t\t\tinvisibleLabel: [\n\t\t\t\t\t\t'boolean',\n\t\t\t\t\t\t'Whether the label should be visually hidden (but still accessible to screen-readers).'\n\t\t\t\t\t],\n\t\t\t\t\tlabel: [ 'string', 'The label text' ],\n\t\t\t\t\tlabelPosition: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t\"The position of the inline label relative to that of the value or placeholder text: 'before' or 'after'\"\n\t\t\t\t\t],\n\t\t\t\t\tmax: [ 'number', 'Maximum allowed value' ],\n\t\t\t\t\tmaxLength: [\n\t\t\t\t\t\t'integer',\n\t\t\t\t\t\t'Maximum number of characters allowed in the input.'\n\t\t\t\t\t],\n\t\t\t\t\tmin: [ 'number', 'Minimum allowed value' ],\n\t\t\t\t\tminLength: [\n\t\t\t\t\t\t'integer',\n\t\t\t\t\t\t'Minimum number of characters allowed in the input.'\n\t\t\t\t\t],\n\t\t\t\t\t// minusButton: [\n\t\t\t\t\t// \t'object',\n\t\t\t\t\t// \t'Configuration options to pass to the decrementing button widget'\n\t\t\t\t\t// ],\n\t\t\t\t\tname: [ 'string', 'The value of the input’s HTML name attribute.' ],\n\t\t\t\t\tpageStep: [\n\t\t\t\t\t\t'integer',\n\t\t\t\t\t\t'Delta when using the Page-up/Page-down keys. Defaults to 10 times buttonStep'\n\t\t\t\t\t],\n\t\t\t\t\tplaceholder: [ 'string', 'Placeholder text' ],\n\t\t\t\t\t// plusButton: [\n\t\t\t\t\t// \t'object',\n\t\t\t\t\t// \t'Configuration options to pass to the incrementing button widget.'\n\t\t\t\t\t// ],\n\t\t\t\t\treadOnly: [\n\t\t\t\t\t\t'boolean',\n\t\t\t\t\t\t'Prevent changes to the value of the text input.'\n\t\t\t\t\t],\n\t\t\t\t\tshowButtons: [\n\t\t\t\t\t\t'boolean',\n\t\t\t\t\t\t'Whether to show the plus and minus buttons.'\n\t\t\t\t\t],\n\t\t\t\t\tspellcheck: [\n\t\t\t\t\t\t'boolean',\n\t\t\t\t\t\t'Should the browser support spellcheck for this field (undefined means leaving it up to the browser).'\n\t\t\t\t\t],\n\t\t\t\t\tstep: [\n\t\t\t\t\t\t'integer',\n\t\t\t\t\t\t'If specified, the field only accepts values that are multiples of this.'\n\t\t\t\t\t],\n\t\t\t\t\ttext: [ 'string', 'Text to insert' ],\n\t\t\t\t\ttitle: [ 'string', 'The title text.' ],\n\t\t\t\t\ttype: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t\"The value of the HTML type attribute: 'text', 'password', 'email', 'url' or 'number'.\"\n\t\t\t\t\t],\n\t\t\t\t\tvalidate: [\n\t\t\t\t\t\t'string', // regex\n\t\t\t\t\t\t'A regular expression that must match the value for it to be considered valid'\n\t\t\t\t\t]\n\t\t\t\t\t// value: [\"string\", \"The value of the input.\"],\n\t\t\t\t};\n\n\t\t\tcase 'mw.widgets.UsersMultiselectWidget':\n\t\t\tcase 'mw.widgets.TitlesMultiselectWidget':\n\t\t\tcase 'mw.widgets.CategoryMultiselectWidget':\n\t\t\tcase 'OO.ui.TagMultiselectWidget':\n\t\t\tcase 'OO.ui.MenuTagMultiselectWidget':\n\t\t\t\tvar ret = {\n\t\t\t\t\tallowArbitrary: [\n\t\t\t\t\t\t'boolean',\n\t\t\t\t\t\t'Allow data items to be added even if not present in the menu.'\n\t\t\t\t\t],\n\t\t\t\t\tallowDisplayInvalidTags: [\n\t\t\t\t\t\t'boolean',\n\t\t\t\t\t\t'Allow the display of invalid tags.'\n\t\t\t\t\t],\n\t\t\t\t\tallowDuplicates: [ 'boolean', 'Allow duplicate items to be added' ],\n\t\t\t\t\tallowEditTags: [\n\t\t\t\t\t\t'boolean',\n\t\t\t\t\t\t'Allow editing of the tags by clicking them'\n\t\t\t\t\t],\n\t\t\t\t\tallowReordering: [ 'boolean', 'Allow reordering of the items' ],\n\t\t\t\t\tallowedValues: [\n\t\t\t\t\t\t'array',\n\t\t\t\t\t\t'An array representing the allowed items by their datas'\n\t\t\t\t\t],\n\t\t\t\t\tclasses: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t'The names of the CSS classes to apply to the element.'\n\t\t\t\t\t],\n\t\t\t\t\tdisabled: [ 'boolean', 'Disable the widget.' ],\n\t\t\t\t\tdraggable: [ 'boolean', 'The items are draggable.' ],\n\t\t\t\t\tflags: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t\"The name or names of the flags (e.g., 'progressive' or 'primary') to apply.\"\n\t\t\t\t\t],\n\t\t\t\t\ticon: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t'The symbolic name of the icon (e.g., ‘remove’ or ‘menu’), or a map of symbolic names.'\n\t\t\t\t\t],\n\t\t\t\t\tid: [ 'string', 'The HTML id attribute used in the rendered tag.' ],\n\t\t\t\t\tindicator: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t'Symbolic name of the indicator (e.g. ‘required’ or ‘down’).'\n\t\t\t\t\t],\n\t\t\t\t\t// input: [ 'object', 'Configuration options for the input widget' ],\n\n\t\t\t\t\tinputPosition: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t'Position of the input. Options are: - inline: The input is invisible, but exists inside the tag list, so the user types into the tag groups to add tags. - outline: The input is underneath the tag area. - none: No input supplied'\n\t\t\t\t\t],\n\t\t\t\t\t// items: [\"array\", \"\"],\n\t\t\t\t\t// menu: [ 'object', 'Configuration object for the menu widget' ],\n\n\t\t\t\t\t// options: [\"array\", \"Array of menu options\"],\n\t\t\t\t\torientation: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t\"Item orientation: 'horizontal' or 'vertical'.\"\n\t\t\t\t\t],\n\t\t\t\t\tplaceholder: [ 'string', 'Placeholder text' ],\n\t\t\t\t\t// selected: [\"array\", \"A set of selected tags\"],\n\t\t\t\t\ttagLimit: [\n\t\t\t\t\t\t'integer',\n\t\t\t\t\t\t'An optional limit on the number of selected options'\n\t\t\t\t\t],\n\t\t\t\t\ttext: [ 'string', 'Text to insert' ],\n\t\t\t\t\ttitle: [ 'string', 'The title text' ]\n\t\t\t\t};\n\t\t\t\tswitch ( inputName ) {\n\t\t\t\t\tcase 'OO.ui.MenuTagMultiselectWidget':\n\t\t\t\t\t\treturn Object.assign( ret, {\n\t\t\t\t\t\t\tclearInputOnChoose: [\n\t\t\t\t\t\t\t\t'boolean',\n\t\t\t\t\t\t\t\t'Clear the text input value when a menu option is chosen'\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t} );\n\t\t\t\t\tcase 'mw.widgets.CategoryMultiselectWidget':\n\t\t\t\t\t\treturn Object.assign( ret, {\n\t\t\t\t\t\t\tlimit: [ 'integer', 'Maximum number of results to load' ]\n\t\t\t\t\t\t} );\n\t\t\t\t\tcase 'mw.widgets.TitlesMultiselectWidget':\n\t\t\t\t\t\treturn Object.assign( ret, {\n\t\t\t\t\t\t\tclearInputOnChoose: [ 'boolean', 'clear input on choose' ],\n\t\t\t\t\t\t\tinputPosition: [ 'string', 'input position' ],\n\n\t\t\t\t\t\t\tallowEditTags: [ 'boolean', 'clear input on choose' ]\n\t\t\t\t\t\t} );\n\t\t\t\t\tcase 'mw.widgets.UsersMultiselectWidget':\n\t\t\t\t\t\treturn Object.assign( ret, {\n\t\t\t\t\t\t\tlimit: [ 'integer', 'Number of results to show' ],\n\t\t\t\t\t\t\t// name: [\n\t\t\t\t\t\t\t// \t'string',\n\t\t\t\t\t\t\t// \t'Name of input to submit results (when used in HTML forms)'\n\t\t\t\t\t\t\t// ],\n\t\t\t\t\t\t\tipAllowed: [ 'boolean', 'Show IP addresses in autocomplete menu' ],\n\t\t\t\t\t\t\t'ipRangeLimits.IPv4': [ 'integer', ' Maximum allowed IPv4 range' ],\n\t\t\t\t\t\t\t'ipRangeLimits.IPv6': [ 'integer', ' Maximum allowed IPv6 range' ]\n\t\t\t\t\t\t} );\n\t\t\t\t\tdefault:\n\t\t\t\t\t\treturn ret;\n\t\t\t\t}\n\n\t\t\tcase 'OO.ui.ComboBoxInputWidget':\n\t\t\t\treturn {\n\t\t\t\t\taccessKey: [ 'string', 'The access key' ],\n\t\t\t\t\tautocomplete: [\n\t\t\t\t\t\t'boolean', // |string\n\t\t\t\t\t\t'Should the browser support autocomplete for this field?'\n\t\t\t\t\t],\n\t\t\t\t\tautofocus: [\n\t\t\t\t\t\t'boolean',\n\t\t\t\t\t\t'Use an HTML autofocus attribute to instruct the browser to focus this widget.'\n\t\t\t\t\t],\n\t\t\t\t\tclasses: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t'The names of the CSS classes to apply to the element.'\n\t\t\t\t\t],\n\t\t\t\t\tdir: [ 'string', 'The directionality of the input (ltr/rtl).' ],\n\t\t\t\t\tdisabled: [ 'boolean', 'Disable the widget.' ],\n\t\t\t\t\tflags: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t\"The name or names of the flags (e.g., 'progressive' or 'primary') to apply.\"\n\t\t\t\t\t],\n\t\t\t\t\ticon: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t'The symbolic name of the icon (e.g., ‘remove’ or ‘menu’), or a map of symbolic names.'\n\t\t\t\t\t],\n\t\t\t\t\tid: [ 'string', 'The HTML id attribute used in the rendered tag.' ],\n\t\t\t\t\tindicator: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t'Symbolic name of the indicator (e.g. ‘required’ or ‘down’).'\n\t\t\t\t\t],\n\t\t\t\t\tinputFilter: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t'The name of an input filter function. Input filters modify the value of an input before it is accepted'\n\t\t\t\t\t],\n\t\t\t\t\tinputId: [ 'string', 'The value of the input’s HTML id attribute.' ],\n\t\t\t\t\tinvisibleLabel: [\n\t\t\t\t\t\t'boolean',\n\t\t\t\t\t\t'Whether the label should be visually hidden (but still accessible to screen-readers).'\n\t\t\t\t\t],\n\t\t\t\t\tlabel: [ 'string', 'The label text' ],\n\t\t\t\t\tlabelPosition: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t\"The position of the inline label relative to that of the value or placeholder text: 'before' or 'after'\"\n\t\t\t\t\t],\n\t\t\t\t\tmaxLength: [\n\t\t\t\t\t\t'integer',\n\t\t\t\t\t\t'Maximum number of characters allowed in the input.'\n\t\t\t\t\t],\n\t\t\t\t\t// menu: [\n\t\t\t\t\t// \t'object',\n\t\t\t\t\t// \t'configuration options to pass to the menu select widget'\n\t\t\t\t\t// ],\n\t\t\t\t\tminLength: [\n\t\t\t\t\t\t'integer',\n\t\t\t\t\t\t'Minimum number of characters allowed in the input.'\n\t\t\t\t\t],\n\t\t\t\t\tname: [ 'string', 'The value of the input’s HTML name attribute.' ],\n\t\t\t\t\t// options: [\n\t\t\t\t\t// \t\"object\",\n\t\t\t\t\t// \t\"onfiguration options to pass to the menu select widget\",\n\t\t\t\t\t// ],\n\t\t\t\t\tplaceholder: [ 'string', 'Placeholder text' ],\n\t\t\t\t\treadOnly: [\n\t\t\t\t\t\t'boolean',\n\t\t\t\t\t\t'Prevent changes to the value of the text input.'\n\t\t\t\t\t],\n\t\t\t\t\tspellcheck: [\n\t\t\t\t\t\t'boolean',\n\t\t\t\t\t\t'Should the browser support spellcheck for this field (undefined means leaving it up to the browser).'\n\t\t\t\t\t],\n\t\t\t\t\ttext: [ 'string', 'Text to insert' ],\n\t\t\t\t\ttitle: [ 'string', 'The title text.' ],\n\t\t\t\t\ttype: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t\"The value of the HTML type attribute: 'text', 'password', 'email', 'url' or 'number'.\"\n\t\t\t\t\t],\n\t\t\t\t\tvalidate: [\n\t\t\t\t\t\t'string', // regex\n\t\t\t\t\t\t'A regular expression that must match the value for it to be considered valid'\n\t\t\t\t\t]\n\t\t\t\t\t// value: [\"string\", \"The value of the input.\"],\n\t\t\t\t};\n\n\t\t\tcase 'OO.ui.MultilineTextInputWidget':\n\t\t\t\treturn {\n\t\t\t\t\taccessKey: [ 'string', 'The access key' ],\n\t\t\t\t\tautocomplete: [\n\t\t\t\t\t\t'boolean', // 'boolean|string',\n\t\t\t\t\t\t'Should the browser support autocomplete for this field?'\n\t\t\t\t\t],\n\t\t\t\t\tautofocus: [\n\t\t\t\t\t\t'boolean',\n\t\t\t\t\t\t'Use an HTML autofocus attribute to instruct the browser to focus this widget.'\n\t\t\t\t\t],\n\t\t\t\t\tautosize: [\n\t\t\t\t\t\t'boolean',\n\t\t\t\t\t\t'Automatically resize the text input to fit its content'\n\t\t\t\t\t],\n\t\t\t\t\tclasses: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t'The names of the CSS classes to apply to the element.'\n\t\t\t\t\t],\n\t\t\t\t\tdir: [ 'string', 'The directionality of the input (ltr/rtl).' ],\n\t\t\t\t\tdisabled: [ 'boolean', 'Disable the widget.' ],\n\t\t\t\t\tflags: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t\"The name or names of the flags (e.g., 'progressive' or 'primary') to apply.\"\n\t\t\t\t\t],\n\t\t\t\t\ticon: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t'The symbolic name of the icon (e.g., ‘remove’ or ‘menu’), or a map of symbolic names.'\n\t\t\t\t\t],\n\t\t\t\t\tid: [ 'string', 'The HTML id attribute used in the rendered tag.' ],\n\t\t\t\t\tindicator: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t'Symbolic name of the indicator (e.g. ‘required’ or ‘down’).'\n\t\t\t\t\t],\n\t\t\t\t\tinputFilter: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t'The name of an input filter function. Input filters modify the value of an input before it is accepted'\n\t\t\t\t\t],\n\t\t\t\t\tinputId: [ 'string', 'The value of the input’s HTML id attribute.' ],\n\t\t\t\t\tinvisibleLabel: [\n\t\t\t\t\t\t'boolean',\n\t\t\t\t\t\t'Whether the label should be visually hidden (but still accessible to screen-readers).'\n\t\t\t\t\t],\n\t\t\t\t\tlabel: [ 'string', 'The label text' ],\n\t\t\t\t\tlabelPosition: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t\"The position of the inline label relative to that of the value or placeholder text: 'before' or 'after'\"\n\t\t\t\t\t],\n\t\t\t\t\tmaxLength: [\n\t\t\t\t\t\t'integer',\n\t\t\t\t\t\t'Maximum number of characters allowed in the input.'\n\t\t\t\t\t],\n\t\t\t\t\tmaxRows: [\n\t\t\t\t\t\t'integer',\n\t\t\t\t\t\t'Maximum number of rows to display when autosize is set to true'\n\t\t\t\t\t],\n\t\t\t\t\tminLength: [\n\t\t\t\t\t\t'integer',\n\t\t\t\t\t\t'Minimum number of characters allowed in the input.'\n\t\t\t\t\t],\n\t\t\t\t\tname: [ 'string', 'The value of the input’s HTML name attribute.' ],\n\t\t\t\t\tplaceholder: [ 'string', 'Placeholder text' ],\n\t\t\t\t\treadOnly: [\n\t\t\t\t\t\t'boolean',\n\t\t\t\t\t\t'Prevent changes to the value of the text input.'\n\t\t\t\t\t],\n\t\t\t\t\trows: [\n\t\t\t\t\t\t'integer',\n\t\t\t\t\t\t'Number of visible lines in textarea. If used with autosize, specifies minimum number of rows to display.'\n\t\t\t\t\t],\n\t\t\t\t\tspellcheck: [\n\t\t\t\t\t\t'boolean',\n\t\t\t\t\t\t'Should the browser support spellcheck for this field (undefined means leaving it up to the browser).'\n\t\t\t\t\t],\n\t\t\t\t\ttext: [ 'string', 'Text to insert' ],\n\t\t\t\t\ttitle: [ 'string', 'The title text.' ],\n\t\t\t\t\ttype: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t\"The value of the HTML type attribute: 'text', 'password', 'email', 'url' or 'number'.\"\n\t\t\t\t\t],\n\t\t\t\t\tvalidate: [\n\t\t\t\t\t\t'string', // regex\n\t\t\t\t\t\t'A regular expression that must match the value for it to be considered valid'\n\t\t\t\t\t]\n\t\t\t\t\t// value: [\"string\", \"The value of the input.\"],\n\t\t\t\t};\n\n\t\t\tcase 'OO.ui.MultiselectWidget':\n\t\t\t\treturn {\n\t\t\t\t\tclasses: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t'The names of the CSS classes to apply to the element.'\n\t\t\t\t\t],\n\t\t\t\t\tdisabled: [ 'boolean', 'Disable the widget.' ],\n\t\t\t\t\tid: [ 'string', 'The HTML id attribute used in the rendered tag.' ],\n\t\t\t\t\t// items: ['array', 'An array of options to add to the multiselect'],\n\t\t\t\t\ttext: [ 'string', 'Text to insert' ],\n\t\t\t\t\ttitle: [ 'string', 'The title text.' ]\n\t\t\t\t};\n\n\t\t\tcase 'OO.ui.ButtonSelectWidget':\n\t\t\t\treturn {\n\t\t\t\t\tclasses: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t'The names of the CSS classes to apply to the element.'\n\t\t\t\t\t],\n\t\t\t\t\tdisabled: [ 'boolean', 'Disable the widget.' ],\n\t\t\t\t\tid: [ 'string', 'The HTML id attribute used in the rendered tag.' ],\n\t\t\t\t\titems: [ 'array', 'An array of options to add to the multiselect' ],\n\t\t\t\t\tmultiselect: [ 'boolean', 'Allow for multiple selections' ],\n\t\t\t\t\ttext: [ 'string', 'Text to insert' ]\n\t\t\t\t};\n\n\t\t\tcase 'OO.ui.CheckboxMultiselectInputWidget':\n\t\t\t\treturn {\n\t\t\t\t\taccessKey: [ 'string', 'The access key' ],\n\t\t\t\t\tclasses: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t'The names of the CSS classes to apply to the element.'\n\t\t\t\t\t],\n\t\t\t\t\tdir: [ 'string', 'The directionality of the input (ltr/rtl).' ],\n\t\t\t\t\tdisabled: [ 'boolean', 'Disable the widget.' ],\n\t\t\t\t\tid: [ 'string', 'The HTML id attribute used in the rendered tag.' ],\n\t\t\t\t\tinputFilter: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t'The name of an input filter function. Input filters modify the value of an input before it is accepted'\n\t\t\t\t\t],\n\t\t\t\t\tinputId: [ 'string', 'The value of the input’s HTML id attribute.' ],\n\t\t\t\t\tname: [ 'string', 'The value of the input’s HTML name attribute.' ],\n\t\t\t\t\t// options: [\n\t\t\t\t\t// \t'array',\n\t\t\t\t\t// \t'Array of menu options in the format described above.'\n\t\t\t\t\t// ],\n\t\t\t\t\ttext: [ 'string', 'Text to insert' ],\n\t\t\t\t\ttitle: [ 'string', 'The title text.' ]\n\t\t\t\t};\n\n\t\t\tcase 'OO.ui.DropdownInputWidget':\n\t\t\t\treturn {\n\t\t\t\t\taccessKey: [ 'string', 'The access key' ],\n\n\t\t\t\t\tclasses: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t'The names of the CSS classes to apply to the element.'\n\t\t\t\t\t],\n\t\t\t\t\tdir: [ 'string', 'The directionality of the input (ltr/rtl).' ],\n\t\t\t\t\tdisabled: [ 'boolean', 'Disable the widget.' ],\n\t\t\t\t\t// dropdown: [ 'object', 'Configuration options for DropdownWidget' ],\n\n\t\t\t\t\tid: [ 'string', 'The HTML id attribute used in the rendered tag.' ],\n\n\t\t\t\t\tinputFilter: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t'The name of an input filter function. Input filters modify the value of an input before it is accepted'\n\t\t\t\t\t],\n\t\t\t\t\tinputId: [ 'string', 'The value of the input’s HTML id attribute.' ],\n\n\t\t\t\t\tname: [ 'string', 'The value of the input’s HTML name attribute.' ],\n\t\t\t\t\t// options: [\n\t\t\t\t\t// \t'array',\n\t\t\t\t\t// \t'Array of menu options in the format described above.'\n\t\t\t\t\t// ],\n\t\t\t\t\ttext: [ 'string', 'Text to insert' ],\n\t\t\t\t\ttitle: [ 'string', 'The title text.' ]\n\t\t\t\t\t// value: [\"string\", \"The value of the input.\"],\n\t\t\t\t};\n\n\t\t\tcase 'OO.ui.InputWidget':\n\t\t\tcase 'mw.widgets.datetime.DateTimeInputWidget':\n\t\t\t\tvar ret = {\n\t\t\t\t\taccessKey: [ 'string', 'The access key' ],\n\t\t\t\t\tclasses: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t'The names of the CSS classes to apply to the element.'\n\t\t\t\t\t],\n\t\t\t\t\tdir: [ 'string', 'The directionality of the input (ltr/rtl).' ],\n\t\t\t\t\tdisabled: [ 'boolean', 'Disable the widget.' ],\n\t\t\t\t\tid: [ 'string', 'The HTML id attribute used in the rendered tag.' ],\n\t\t\t\t\tinputFilter: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t'The name of an input filter function. Input filters modify the value of an input before it is accepted'\n\t\t\t\t\t],\n\t\t\t\t\tinputId: [ 'string', 'The value of the input’s HTML id attribute.' ],\n\t\t\t\t\tname: [ 'string', 'The value of the input’s HTML name attribute.' ],\n\t\t\t\t\ttext: [ 'string', 'Text to insert' ],\n\t\t\t\t\ttitle: [ 'string', 'The title text.' ]\n\t\t\t\t\t// value: [\"string\", \"The value of the input.\"],\n\t\t\t\t};\n\n\t\t\t\tswitch ( inputName ) {\n\t\t\t\t\tcase 'mw.widgets.datetime.DateTimeInputWidget':\n\t\t\t\t\t\treturn Object.assign( ret, {\n\t\t\t\t\t\t\ttype: [ 'string', \"Whether to act like a 'date'\" ],\n\t\t\t\t\t\t\trequired: [ 'boolean', 'Whether a value is required' ],\n\t\t\t\t\t\t\tclearable: [ 'boolean', 'Whether to provide for blanking the value.' ],\n\t\t\t\t\t\t\t// value: [\n\t\t\t\t\t\t\t// \t'boolean',\n\t\t\t\t\t\t\t// \t'Default value for the widget'\n\t\t\t\t\t\t\t// ],\n\t\t\t\t\t\t\tmin: [ 'string', ' Minimum allowed date' ],\n\t\t\t\t\t\t\tmax: [ 'string', 'Maximum allowed date' ]\n\t\t\t\t\t\t} );\n\t\t\t\t\tdefault:\n\t\t\t\t\t\treturn ret;\n\t\t\t\t}\n\n\t\t\tcase 'ButtonMultiselectWidget':\n\t\t\t\treturn {\n\t\t\t\t\tclasses: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t'The names of the CSS classes to apply to the element.'\n\t\t\t\t\t],\n\t\t\t\t\tdisabled: [ 'boolean', 'Disable the widget.' ],\n\t\t\t\t\tid: [ 'string', 'The HTML id attribute used in the rendered tag.' ],\n\t\t\t\t\ttext: [ 'string', 'Text to insert' ]\n\t\t\t\t};\n\n\t\t\tcase 'intl-tel-input':\n\t\t\t\t// @see https://github.com/jackocnr/intl-tel-input\n\t\t\t\treturn {\n\t\t\t\t\tallowDropdown: [ 'boolean', 'Whether or not to allow the dropdown' ],\n\t\t\t\t\tautoInsertDialCode: [\n\t\t\t\t\t\t'Boolean',\n\t\t\t\t\t\t'When enabled (requires nationalMode to be disabled), the international dial code will be automatically inserted into the input'\n\t\t\t\t\t],\n\t\t\t\t\tautoPlaceholder: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t\"Set the input's placeholder to an example number for the selected country, and update it if the country changes\"\n\t\t\t\t\t],\n\t\t\t\t\tcustomContainer: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t'Additional classes to add to the parent div.'\n\t\t\t\t\t],\n\t\t\t\t\tcustomPlaceholder: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t'Change the placeholder generated by autoPlaceholder. Must return a string'\n\t\t\t\t\t],\n\t\t\t\t\texcludeCountries: [\n\t\t\t\t\t\t'array',\n\t\t\t\t\t\t'In the dropdown, display all countries except the ones you specify here.'\n\t\t\t\t\t],\n\t\t\t\t\tformatOnDisplay: [\n\t\t\t\t\t\t'boolean',\n\t\t\t\t\t\t'Format the input value (according to the nationalMode option) during initialisation, and on setNumber. Requires the utilsScript option'\n\t\t\t\t\t],\n\t\t\t\t\tgeoIpLookup: [\n\t\t\t\t\t\t'boolean',\n\t\t\t\t\t\t'When setting initialCountry to \"auto\", you must use this option to specify a custom function that looks up the user\\'s location, and then calls the success callback with the relevant country code'\n\t\t\t\t\t],\n\t\t\t\t\thiddenInput: [ 'string', 'Add a hidden input with the given name.' ],\n\t\t\t\t\tinitialCountry: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t'Set the initial country selection by specifying its country code'\n\t\t\t\t\t],\n\t\t\t\t\t// 'localizedCountries': [\n\t\t\t\t\t// \t'object',\n\t\t\t\t\t// \t'Allow localisation of country names'\n\t\t\t\t\t// ],\n\t\t\t\t\tnationalMode: [\n\t\t\t\t\t\t'boolean',\n\t\t\t\t\t\t'Format numbers in the national format, rather than the international format.'\n\t\t\t\t\t],\n\t\t\t\t\tonlyCountries: [\n\t\t\t\t\t\t'array',\n\t\t\t\t\t\t'In the dropdown, display only the countries you specify'\n\t\t\t\t\t],\n\t\t\t\t\tplaceholderNumberType: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t'Specify one of the keys from the global enum intlTelInputUtils.numberType'\n\t\t\t\t\t],\n\t\t\t\t\tpreferredCountries: [\n\t\t\t\t\t\t'array',\n\t\t\t\t\t\t'Specify the countries to appear at the top of the list'\n\t\t\t\t\t],\n\t\t\t\t\tseparateDialCode: [\n\t\t\t\t\t\t'boolean',\n\t\t\t\t\t\t'Display the country dial code next to the selected flag'\n\t\t\t\t\t],\n\t\t\t\t\tshowFlags: [\n\t\t\t\t\t\t'boolean',\n\t\t\t\t\t\t'Set this to false to hide the flags e.g. for political reasons'\n\t\t\t\t\t],\n\t\t\t\t\tutilsScript: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t'Enable formatting/validation etc. by specifying the URL of the included utils.js script (or alternatively just point it to the file on cdnjs.com)'\n\t\t\t\t\t]\n\t\t\t\t};\n\n\t\t\tcase 'RatingWidget':\n\t\t\t\treturn {\n\t\t\t\t\tclasses: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t'The names of the CSS classes to apply to the element.'\n\t\t\t\t\t],\n\t\t\t\t\tdisabled: [ 'boolean', 'Disable the widget.' ],\n\t\t\t\t\tid: [ 'string', 'The HTML id attribute used in the rendered tag.' ],\n\t\t\t\t\ttext: [ 'string', 'Text to insert' ]\n\t\t\t\t};\n\n\t\t\tcase 'VisualEditor':\n\t\t\t\treturn {\n\t\t\t\t\tclasses: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t'The names of the CSS classes to apply to the element.'\n\t\t\t\t\t]\n\t\t\t\t\t// contentModel: [ 'string', 'Output (wikitext or html)' ],\n\t\t\t\t};\n\n\t\t\tcase 'OO.ui.SelectFileWidget':\n\t\t\t\treturn {\n\t\t\t\t\taccept: [ 'array', 'MIME types to accept.' ],\n\t\t\t\t\taccessKey: [ 'string', 'The access key' ],\n\t\t\t\t\t// button: [\n\t\t\t\t\t// \t'object',\n\t\t\t\t\t// \t'Config to pass to select file button.'\n\t\t\t\t\t// ],\n\t\t\t\t\t// @TODO uncomment ...\n\t\t\t\t\t// buttonOnly: [\n\t\t\t\t\t// \t'boolean',\n\t\t\t\t\t// \t'Show only the select file button, no info field. Requires showDropTarget to be false'\n\t\t\t\t\t// ],\n\t\t\t\t\tdir: [ 'string', 'The directionality of the input (ltr/rtl).' ],\n\t\t\t\t\tdisabled: [ 'boolean', 'Disable the widget.' ],\n\t\t\t\t\tdroppable: [ 'boolean', 'Whether to accept files by drag and drop' ],\n\t\t\t\t\ticon: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t'The symbolic name of the icon (e.g., ‘remove’ or ‘menu’), or a map of symbolic names.'\n\t\t\t\t\t],\n\t\t\t\t\tid: [ 'string', 'The HTML id attribute used in the rendered tag.' ],\n\t\t\t\t\tinputFilter: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t'The name of an input filter function. Input filters modify the value of an input before it is accepted'\n\t\t\t\t\t],\n\t\t\t\t\tinputId: [ 'string', 'The value of the input’s HTML id attribute.' ],\n\t\t\t\t\t// multiple: [\n\t\t\t\t\t// \t'boolean',\n\t\t\t\t\t// \t'Allow multiple files to be selected'\n\t\t\t\t\t// ],\n\t\t\t\t\tinvisibleLabel: [\n\t\t\t\t\t\t'boolean',\n\t\t\t\t\t\t'Whether the label should be visually hidden (but still accessible to screen-readers).'\n\t\t\t\t\t],\n\t\t\t\t\tname: [ 'string', 'The value of the input’s HTML name attribute.' ],\n\t\t\t\t\tnotsupported: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t'Text to display when file support is missing in the browser.'\n\t\t\t\t\t],\n\t\t\t\t\tplaceholder: [ 'string', 'Placeholder text' ],\n\t\t\t\t\tshowDropTarget: [\n\t\t\t\t\t\t'boolean',\n\t\t\t\t\t\t'Whether to show a drop target. Requires droppable to be true.'\n\t\t\t\t\t],\n\t\t\t\t\ttext: [ 'string', 'Text to insert' ],\n\t\t\t\t\tthumbnailSizeLimit: [\n\t\t\t\t\t\t'number',\n\t\t\t\t\t\t'File size limit in MiB above which to not try and show a preview (for performance)'\n\t\t\t\t\t],\n\t\t\t\t\ttitle: [ 'string', 'The title text.' ]\n\t\t\t\t\t// value: [\"string\", \"The value of the input.\"],\n\t\t\t\t};\n\t\t}\n\t}\n\n\tfunction createToolbarB() {\n\t\tvar toolFactory = new OO.ui.ToolFactory();\n\t\tvar toolGroupFactory = new OO.ui.ToolGroupFactory();\n\n\t\tvar toolbar = new OO.ui.Toolbar( toolFactory, toolGroupFactory, {\n\t\t\tactions: true\n\t\t} );\n\n\t\tvar onSelect = function () {\n\t\t\tvar toolName = this.getName();\n\n\t\t\tswitch ( toolName ) {\n\t\t\t\tcase 'addfield':\n\t\t\t\t\topenSearchDialog();\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tthis.setActive( false );\n\t\t};\n\n\t\tvar toolGroup = [\n\t\t\t{\n\t\t\t\tname: 'addfield',\n\t\t\t\ticon: 'add',\n\t\t\t\ttitle: mw.msg( 'visualdata-jsmodule-inputconfig-addremoveoptions' ),\n\t\t\t\tonSelect: onSelect\n\t\t\t}\n\t\t];\n\t\tVisualDataFunctions.createToolGroup( toolFactory, 'group', toolGroup );\n\n\t\ttoolbar.setup( [\n\t\t\t{\n\t\t\t\tname: 'my-group',\n\t\t\t\t// type: \"bar\",\n\t\t\t\t// label: \"Create property\",\n\t\t\t\tinclude: [ { group: 'group' } ]\n\t\t\t}\n\t\t] );\n\n\t\treturn toolbar;\n\t}\n\n\t// @see https://gerrit.wikimedia.org/r/plugins/gitiles/oojs/ui/+/c2805c7e9e83e2f3a857451d46c80231d1658a0f/demos/classes/SearchWidgetDialog.js\n\tfunction ProcessDialogSearch( config ) {\n\t\tProcessDialogSearch.super.call( this, config );\n\t}\n\tOO.inheritClass( ProcessDialogSearch, OO.ui.ProcessDialog );\n\tProcessDialogSearch.static.name = DialogSearchName;\n\tProcessDialogSearch.static.title = mw.msg(\n\t\t'visualdata-jsmodule-inputconfig-selectfield'\n\t);\n\tProcessDialogSearch.prototype.initialize = function () {\n\t\tProcessDialogSearch.super.prototype.initialize.apply( this, arguments );\n\t\tvar self = this;\n\t\tthis.selectedItems = Object.keys( SelectedItems );\n\n\t\tvar obj = ( !CustomInputConfig ? getInputConfig( InputName ) :\n\t\t\tCustomInputConfig( InputName ) );\n\n\t\tfunction getItems( value ) {\n\t\t\tvar values = Object.keys( obj );\n\t\t\tif ( value ) {\n\t\t\t\tvar valueLowerCase = value.toLowerCase();\n\t\t\t\tvalues = values.filter(\n\t\t\t\t\t( x ) => x.toLowerCase().indexOf( valueLowerCase ) !== -1\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn values.map( ( x ) => {\n\t\t\t\tvar menuOptionWidget = new OO.ui.MenuOptionWidget( {\n\t\t\t\t\tdata: x,\n\t\t\t\t\tlabel: x,\n\t\t\t\t\tselected: inArray( x, self.selectedItems )\n\t\t\t\t} );\n\n\t\t\t\treturn menuOptionWidget;\n\t\t\t} );\n\t\t}\n\n\t\tvar searchWidget = new OO.ui.SearchWidget( {\n\t\t\t// id: 'visualdata-import-search-widget'\n\t\t} );\n\n\t\tsearchWidget.results.addItems( getItems() );\n\n\t\t// searchWidget.getResults() is a SelectWidget\n\t\t// https://doc.wikimedia.org/oojs-ui/master/js/#!/api/OO.ui.SelectWidget\n\t\tvar searchWidgetResults = searchWidget.getResults();\n\t\tsearchWidgetResults.multiselect = true;\n\n\t\t// this.searchWidgetResults = searchWidgetResults;\n\n\t\t// we don't rely anymore on searchWidgetResults.findSelectedItems()\n\t\t// to handle non-visible highlighted items\n\t\tsearchWidgetResults.on( 'press', ( value ) => {\n\t\t\tif ( value === null ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif ( inArray( value.data, self.selectedItems ) ) {\n\t\t\t\tself.selectedItems.splice( self.selectedItems.indexOf( value.data ), 1 );\n\t\t\t} else {\n\t\t\t\tself.selectedItems.push( value.data );\n\t\t\t}\n\t\t} );\n\n\t\tsearchWidget.onQueryChange = function ( value ) {\n\t\t\tsearchWidget.results.clearItems();\n\t\t\tsearchWidget.results.addItems( getItems( value ) );\n\t\t};\n\n\t\tthis.$body.append( [ searchWidget.$element ] );\n\t};\n\n\tProcessDialogSearch.prototype.getBodyHeight = function () {\n\t\treturn 300;\n\t};\n\n\tProcessDialogSearch.static.actions = [\n\t\t{\n\t\t\taction: 'save',\n\t\t\tmodes: 'edit',\n\t\t\tlabel: mw.msg( 'visualdata-jsmodule-dialog-done' ),\n\t\t\tflags: [ 'primary', 'progressive' ]\n\t\t},\n\t\t{\n\t\t\t// modes: \"edit\",\n\t\t\tlabel: mw.msg( 'visualdata-jsmodule-dialog-cancel' ),\n\t\t\tflags: [ 'safe', 'close' ]\n\t\t}\n\t];\n\tProcessDialogSearch.prototype.getActionProcess = function ( action ) {\n\t\tvar dialog = this;\n\n\t\tif ( action === 'save' ) {\n\t\t\t// var items = dialog.searchWidgetResults.findSelectedItems();\n\t\t\t// var selectedItems = items.map( ( x ) => x.data );\n\n\t\t\t// remove unselected properties\n\t\t\tfor ( var key in SelectedItems ) {\n\t\t\t\tif ( !inArray( key, dialog.selectedItems ) ) {\n\t\t\t\t\tdelete SelectedItems[ key ];\n\t\t\t\t\tdelete Model[ key ];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// add new properties\n\t\t\tfor ( var key of dialog.selectedItems ) {\n\t\t\t\tif ( !( key in SelectedItems ) ) {\n\t\t\t\t\tSelectedItems[ key ] = undefined;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tpanelLayout.populateFieldset();\n\t\t}\n\n\t\treturn new OO.ui.Process( () => {\n\t\t\tdialog.close( { action: action } );\n\t\t} );\n\n\t\t// return ProcessDialog.super.prototype.getActionProcess.call( this, action );\n\t};\n\tProcessDialogSearch.prototype.getTeardownProcess = function ( data ) {\n\t\treturn ProcessDialogSearch.super.prototype.getTeardownProcess\n\t\t\t.call( this, data )\n\t\t\t.first( () => {\n\t\t\t\tWindowManager.removeActiveWindow();\n\t\t\t}, this );\n\t};\n\n\tfunction openSearchDialog() {\n\t\tprocessDialogSearch = new ProcessDialogSearch( {\n\t\t\tsize: 'medium',\n\t\t\tclasses: [ 'visualdata-search-dialog' ]\n\t\t\t// data: { label: label }\n\t\t} );\n\n\t\tWindowManager.newWindow( processDialogSearch );\n\t}\n\n\tfunction PanelLayout( config ) {\n\t\tPanelLayout.super.call( this, config );\n\n\t\t/*\n\t\tthis.messageWidget = new OO.ui.MessageWidget({\n\t\t\ttype: \"notice\",\n\t\t\tlabel: new OO.ui.HtmlSnippet(\n\t\t\t\tmw.msg(\"visualdata-jsmodule-visualdata-no-properties\")\n\t\t\t),\n\t\t});\n*/\n\n\t\tthis.fieldset = new OO.ui.FieldsetLayout( {\n\t\t\tlabel: ''\n\t\t} );\n\n\t\tthis.populateFieldset();\n\n\t\tthis.$element.append( this.fieldset.$element );\n\t\t// this.$element.append(this.messageWidget.$element);\n\t}\n\n\tOO.inheritClass( PanelLayout, OO.ui.PanelLayout );\n\tPanelLayout.prototype.populateFieldset = function () {\n\t\tthis.fieldset.clearItems();\n\n\t\t// eslint-disable-next-line no-unused-vars\n\t\tvar data = this.data;\n\t\tvar items = [];\n\t\tvar obj = ( !CustomInputConfig ? getInputConfig( InputName ) :\n\t\t\tCustomInputConfig( InputName ) );\n\n\t\tfor ( var i in obj ) {\n\t\t\tif ( !( i in SelectedItems ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tvar inputName;\n\t\t\tvar config = {};\n\t\t\tvar type = obj[ i ][ 0 ];\n\t\t\tswitch ( type ) {\n\t\t\t\tcase 'boolean':\n\t\t\t\t\tinputName = 'OO.ui.ToggleSwitchWidget';\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'string':\n\t\t\t\t\tinputName = 'OO.ui.TextInputWidget';\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'number':\n\t\t\t\tcase 'integer':\n\t\t\t\t\tinputName = 'OO.ui.NumberInputWidget';\n\t\t\t\t\tconfig.type = 'number';\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'date':\n\t\t\t\t\tinputName = 'mw.widgets.DateInputWidget';\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'array':\n\t\t\t\t\tinputName = 'OO.ui.TagMultiselectWidget';\n\t\t\t\t\tbreak;\n\n\t\t\t\t// not implemented\n\t\t\t\tcase 'object':\n\t\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif ( typeof SelectedItems[ i ] !== 'undefined' ) {\n\t\t\t\tconfig.value = SelectedItems[ i ];\n\t\t\t}\n\n\t\t\tvar inputWidget = VisualDataFunctions.inputInstanceFromName(\n\t\t\t\tinputName,\n\t\t\t\tconfig\n\t\t\t);\n\t\t\tModel[ i ] = { input: inputWidget, type: type };\n\n\t\t\titems.push(\n\t\t\t\tnew OO.ui.FieldLayout( inputWidget, {\n\t\t\t\t\tlabel: i,\n\t\t\t\t\talign: 'top',\n\t\t\t\t\thelp: new OO.ui.HtmlSnippet( obj[ i ][ 1 ] ),\n\t\t\t\t\thelpInline: true,\n\t\t\t\t\tclasses: []\n\t\t\t\t} )\n\t\t\t);\n\t\t}\n\n\t\titems = items.filter( ( x ) => !( 'items' in x ) || x.items.length );\n\n\t\tthis.isEmpty = !items.length;\n\n\t\tthis.fieldset.addItems( items );\n\t};\n\n\t// eslint-disable-next-line no-unused-vars\n\tPanelLayout.prototype.addItem = function ( property ) {\n\t\tthis.populateFieldset();\n\t};\n\n\tfunction ProcessDialog( config ) {\n\t\tProcessDialog.super.call( this, config );\n\t}\n\tOO.inheritClass( ProcessDialog, OO.ui.ProcessDialog );\n\n\tProcessDialog.static.name = 'myDialog';\n\t// ProcessDialog.static.title = mw.msg(\n\t// \"visualdata-jsmodule-manageproperties-define-property\"\n\t// );\n\tProcessDialog.static.actions = [\n\t\t{\n\t\t\taction: 'save',\n\t\t\tmodes: 'edit',\n\t\t\tlabel: mw.msg( 'visualdata-jsmodule-dialog-save' ),\n\t\t\tflags: [ 'primary', 'progressive' ]\n\t\t},\n\t\t{\n\t\t\tmodes: 'edit',\n\t\t\tlabel: mw.msg( 'visualdata-jsmodule-dialog-cancel' ),\n\t\t\tflags: [ 'safe', 'close' ]\n\t\t}\n\t];\n\n\tfunction createActionToolbar() {\n\t\t// see https://gerrit.wikimedia.org/r/plugins/gitiles/oojs/ui/+/refs/tags/v0.40.4/demos/pages/toolbars.js\n\t\tvar toolFactory = new OO.ui.ToolFactory();\n\t\tvar toolGroupFactory = new OO.ui.ToolGroupFactory();\n\n\t\tvar toolbar = new OO.ui.Toolbar( toolFactory, toolGroupFactory, {\n\t\t\tactions: false\n\t\t} );\n\n\t\tvar onSelect = function () {\n\t\t\twindow.open( HelpUrl, '_blank' ).focus();\n\t\t\tthis.setActive( false );\n\t\t};\n\n\t\tvar toolGroup = [\n\t\t\t{\n\t\t\t\tname: 'help-button',\n\t\t\t\ticon: 'helpNotice',\n\t\t\t\t// title: mw.msg( 'visualdata-jsmodule-forms-toolbars-help-button' ),\n\t\t\t\tonSelect: onSelect\n\t\t\t}\n\t\t];\n\n\t\t// @see https://www.mediawiki.org/wiki/OOUI/Toolbars\n\t\ttoolbar.setup( [\n\t\t\t{\n\t\t\t\ttype: 'bar',\n\t\t\t\tinclude: [ 'help-button' ]\n\t\t\t}\n\t\t] );\n\n\t\tVisualDataFunctions.createToolGroup(\n\t\t\ttoolFactory,\n\t\t\t'selectSwitch',\n\t\t\ttoolGroup\n\t\t);\n\n\t\treturn toolbar;\n\t}\n\n\tProcessDialog.prototype.initialize = function () {\n\t\tProcessDialog.super.prototype.initialize.apply( this, arguments );\n\t\tvar toolbar = createToolbarB();\n\n\t\tif ( HelpUrl ) {\n\t\t\tvar actionToolbar = createActionToolbar();\n\t\t\ttoolbar.$actions.append( actionToolbar.$element );\n\t\t}\n\n\t\tpanelLayout = new PanelLayout( {\n\t\t\texpanded: false,\n\t\t\tpadded: true,\n\t\t\tclasses: [ 'visualdata-forms-fields-contentframe' ],\n\t\t\tdata: {}\n\t\t} );\n\n\t\tvar frameA = new OO.ui.PanelLayout( {\n\t\t\t$content: [ toolbar.$element, panelLayout.$element ],\n\t\t\texpanded: false,\n\t\t\t// framed: false,\n\t\t\tpadded: false,\n\t\t\tdata: { name: 'manageforms' }\n\t\t} );\n\n\t\tthis.$body.append( frameA.$element );\n\t};\n\n\tProcessDialog.prototype.getActionProcess = function ( action ) {\n\t\tvar dialog = this;\n\n\t\tswitch ( action ) {\n\t\t\tcase 'save':\n\t\t\t\tvar obj = {};\n\t\t\t\tfor ( var i in Model ) {\n\t\t\t\t\tobj[ i ] = VisualDataFunctions.castType(\n\t\t\t\t\t\tModel[ i ].input.getValue(),\n\t\t\t\t\t\tModel[ i ].type\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tCallback.setValue( obj );\n\t\t\t\treturn new OO.ui.Process( () => {\n\t\t\t\t\tdialog.close( { action: action } );\n\t\t\t\t} );\n\t\t}\n\n\t\treturn ProcessDialog.super.prototype.getActionProcess.call( this, action );\n\t};\n\n\tProcessDialog.prototype.getTeardownProcess = function ( data ) {\n\t\treturn ProcessDialog.super.prototype.getTeardownProcess\n\t\t\t.call( this, data )\n\t\t\t.first( () => {\n\t\t\t\tWindowManager.removeActiveWindow();\n\t\t\t}, this );\n\t};\n\n\t/**\n\t * Override getBodyHeight to create a tall dialog relative to the screen.\n\t *\n\t * @return {number} Body height\n\t */\n\tProcessDialog.prototype.getBodyHeight = function () {\n\t\t// see here https://www.mediawiki.org/wiki/OOUI/Windows/Process_Dialogs\n\t\t// this.page1.content.$element.outerHeight( true );\n\t\treturn window.innerHeight - 100;\n\t};\n\n\tfunction openDialog( callback, inputName, helpUrl, customInputConfig ) {\n\t\tModel = {};\n\t\tCallback = callback;\n\t\tSelectedItems = callback.getValue();\n\t\tHelpUrl = helpUrl;\n\n\t\t// @TODO update once a form key -> value is used\n\t\t// for the options widget of available inputs dropdown\n\t\tInputName = inputName.split( / / )[ 0 ];\n\t\tCustomInputConfig = customInputConfig;\n\n\t\tvar processDialog = new ProcessDialog( {\n\t\t\tsize: 'large'\n\t\t} );\n\n\t\tWindowManager.newWindow( processDialog, {\n\t\t\ttitle:\n\t\t\t\tmw.msg(\n\t\t\t\t\t// The following messages are used here:\n\t\t\t\t\t// * visualdata-jsmodule-manageproperties-define-property\n\t\t\t\t\t// * visualdata-jsmodule-manageproperties-define-property - [name]\n\t\t\t\t\t'visualdata-jsmodule-inputconfig-dialog-label'\n\t\t\t\t) + ( inputName ? ' - ' + inputName : '' )\n\t\t} );\n\t}\n\n\treturn {\n\t\topenDialog\n\t};\n};\n","usedDeprecatedRules":[{"ruleId":"max-len","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/VisualDataProcessModel.js","messages":[{"ruleId":"no-jquery/no-sizzle","severity":1,"message":"Selector extensions are not allowed","line":159,"column":11,"nodeType":"CallExpression","endLine":159,"endColumn":85}],"suppressedMessages":[{"ruleId":"no-unused-vars","severity":2,"message":"'VisualDataProcessModel' is assigned a value but never used.","line":25,"column":7,"nodeType":"Identifier","messageId":"unusedVar","endLine":25,"endColumn":29,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-underscore-dangle","severity":2,"message":"Unexpected dangling '_' in 'path_'.","line":61,"column":7,"nodeType":"VariableDeclarator","messageId":"unexpectedUnderscore","endLine":61,"endColumn":58,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-underscore-dangle","severity":2,"message":"Unexpected dangling '_' in 'path_'.","line":74,"column":5,"nodeType":"MemberExpression","messageId":"unexpectedUnderscore","endLine":74,"endColumn":20,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-underscore-dangle","severity":2,"message":"Unexpected dangling '_' in 'path_'.","line":84,"column":3,"nodeType":"MemberExpression","messageId":"unexpectedUnderscore","endLine":84,"endColumn":19,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-underscore-dangle","severity":2,"message":"Unexpected dangling '_' in 'path_'.","line":92,"column":4,"nodeType":"MemberExpression","messageId":"unexpectedUnderscore","endLine":92,"endColumn":20,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"new-cap","severity":2,"message":"A constructor name should not start with a lowercase letter.","line":102,"column":26,"nodeType":"NewExpression","messageId":"lower","endLine":102,"endColumn":30,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-console","severity":2,"message":"Unexpected console statement.","line":108,"column":4,"nodeType":"MemberExpression","messageId":"unexpected","endLine":108,"endColumn":17,"suggestions":[{"messageId":"removeConsole","data":{"propertyName":"error"},"fix":{"range":[2897,2928],"text":""},"desc":"Remove the console.error()."}],"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-underscore-dangle","severity":2,"message":"Unexpected dangling '_' in 'path_'.","line":143,"column":15,"nodeType":"VariableDeclarator","messageId":"unexpectedUnderscore","endLine":143,"endColumn":20,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-console","severity":2,"message":"Unexpected console statement.","line":152,"column":5,"nodeType":"MemberExpression","messageId":"unexpected","endLine":152,"endColumn":18,"suggestions":[{"messageId":"removeConsole","data":{"propertyName":"error"},"fix":{"range":[4521,4544],"text":""},"desc":"Remove the console.error()."}],"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-underscore-dangle","severity":2,"message":"Unexpected dangling '_' in 'path_'.","line":190,"column":11,"nodeType":"VariableDeclarator","messageId":"unexpectedUnderscore","endLine":190,"endColumn":37,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-underscore-dangle","severity":2,"message":"Unexpected dangling '_' in 'path_'.","line":218,"column":10,"nodeType":"VariableDeclarator","messageId":"unexpectedUnderscore","endLine":218,"endColumn":74,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-console","severity":2,"message":"Unexpected console statement.","line":277,"column":6,"nodeType":"MemberExpression","messageId":"unexpected","endLine":277,"endColumn":19,"suggestions":[{"messageId":"removeConsole","data":{"propertyName":"error"},"fix":{"range":[7491,7522],"text":""},"desc":"Remove the console.error()."}],"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/**\n * This file is part of the MediaWiki extension VisualData.\n *\n * VisualData is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 2 of the License, or\n * (at your option) any later version.\n *\n * VisualData is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with VisualData. If not, see <http://www.gnu.org/licenses/>.\n *\n * @file\n * @author thomas-topway-it <support@topway.it>\n * @copyright Copyright © 2023, https://wikisphere.org\n */\n\n/* eslint-disable no-unused-vars */\n/* eslint-disable no-underscore-dangle */\n\nconst VisualDataProcessModel = function (\n\tcallbackShowError,\n\tForm,\n\tSchemas,\n\tRecordedSchemas,\n\tModel,\n\tModelSchemas,\n\tmakeElementId\n) {\n\tvar Flatten;\n\tvar Action;\n\tvar Removed;\n\tvar Errors;\n\n\tfunction castType( value, model ) {\n\t\t// *** this is an hack to prevent\n\t\t// empty string, alternatively\n\t\t// use required native validation\n\t\t// or \"minLength\": 1\n\n\t\tif ( model.schema.wiki.required ) {\n\t\t\tswitch ( model.schema.type ) {\n\t\t\t\tcase 'number':\n\t\t\t\tcase 'string':\n\t\t\t\t\t// value can be undefined for OO.ui.SelectFileWidget\n\t\t\t\t\tif ( !value || ( typeof value === 'string' && value.trim() === '' ) ) {\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn VisualDataFunctions.castType( value, model.schema.type );\n\t}\n\n\tasync function formatValue( path, model ) {\n\t\tvar path_ = ( Action === 'submit' ? path : model.path );\n\t\tvar value = 'getValue' in model.input ? model.input.getValue() : '';\n\n\t\tif ( VisualDataFunctions.isPromise( value ) ) {\n\t\t\tvalue = await value;\n\t\t}\n\n\t\tif ( 'validateFunc' in model.input ) {\n\t\t\tvar errorMsg = model.input.validateFunc();\n\t\t\tif ( VisualDataFunctions.isPromise( errorMsg ) ) {\n\t\t\t\terrorMsg = await errorMsg;\n\t\t\t}\n\t\t\tif ( typeof errorMsg === 'string' ) {\n\t\t\t\tErrors[ path_ ] = errorMsg;\n\t\t\t}\n\t\t}\n\n\t\tif ( Array.isArray( value ) ) {\n\t\t\tvalue = value.map( ( x ) => castType( x, model ) );\n\t\t} else {\n\t\t\tvalue = castType( value, model );\n\t\t}\n\n\t\tFlatten[ path_ ] = {\n\t\t\tpathNoIndex: model.pathNoIndex,\n\t\t\tvalue: value,\n\t\t\tmultiselect: model.multiselect,\n\t\t\tschema: model.schema\n\t\t};\n\n\t\tif ( model.isFile ) {\n\t\t\tFlatten[ path_ ].filekey = model.filekey;\n\t\t\t// Flatten[model.path].previousFilaneme = model.previousFilaneme;\n\t\t}\n\n\t\treturn value;\n\t}\n\n\tfunction validate( schemaName, data, schema ) {\n\t\tvar errors = Errors;\n\t\t// eslint-disable-next-line new-cap\n\t\tconst ajv = new window.ajv7( { strict: false, allErrors: true } );\n\t\tvar validateAjv;\n\t\ttry {\n\t\t\tvalidateAjv = ajv.compile( schema );\n\t\t} catch ( e ) {\n\t\t\t// eslint-disable-next-line no-console\n\t\t\tconsole.error( 'validate', e );\n\t\t\tcallbackShowError( schemaName, e.message );\n\n\t\t\t// @MAYBETODO\n\t\t\t// add: \"please report the issue in the talk page\n\t\t\t// of the extension\"\n\t\t\treturn false;\n\t\t}\n\t\tif ( validateAjv( data ) && !Object.keys( errors ).length ) {\n\t\t\treturn true;\n\t\t}\n\n\t\tvar hiddenErrors = {};\n\t\tif ( 'errors' in validateAjv && Array.isArray( validateAjv.errors ) ) {\n\t\t\tvar AjvErrors = [];\n\n\t\t\t// pre-process errors\n\t\t\t// @see https://ajv.js.org/api.html\n\t\t\tfor ( var error of validateAjv.errors ) {\n\t\t\t\tswitch ( error.keyword ) {\n\t\t\t\t\tcase 'uniqueItems':\n\t\t\t\t\t\tif ( Removed.indexOf( `${ VisualDataFunctions.escapeJsonPtr( schemaName ) }${ error.instancePath }/${ error.params.j }` ) === -1 ) {\n\t\t\t\t\t\t\tAjvErrors.push( Object.assign( VisualDataFunctions.deepCopy( error ), { instancePath: `${ error.instancePath }/${ error.params.i }` } ) );\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( Removed.indexOf( `${ VisualDataFunctions.escapeJsonPtr( schemaName ) }${ error.instancePath }/${ error.params.i }` ) === -1 ) {\n\t\t\t\t\t\t\tAjvErrors.push( Object.assign( VisualDataFunctions.deepCopy( error ), { instancePath: `${ error.instancePath }/${ error.params.j }` } ) );\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tAjvErrors.push( error );\n\t\t\t\t}\n\t\t\t}\n\t\t\tloopA: for ( var error of AjvErrors ) {\n\t\t\t\tvar path = `${ VisualDataFunctions.escapeJsonPtr( schemaName ) }${ error.instancePath }`;\n\n\t\t\t\tfor ( var path_ of Removed ) {\n\t\t\t\t\tif ( path === path_ ||\n\t\t\t\t\t\t// @FIXME add specific reference to arrays\n\t\t\t\t\t\t( /\\/\\d+$/.test( path_ ) && path.indexOf( path_ ) === 0 ) ) {\n\t\t\t\t\t\tcontinue loopA;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\tconsole.error( error );\n\n\t\t\t\tif ( !( path in Flatten ) ) {\n\t\t\t\t\thiddenErrors[ path ] = `${ error.instancePath.slice( 1 ) } ${ error.message }`;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif ( !$( '#' + jQuery.escapeSelector( makeElementId( path ) ) ).is( ':visible' ) ) {\n\t\t\t\t\thiddenErrors[ path ] = `${ Flatten[ path ].schema.wiki.name } ${ error.message }`;\n\t\t\t\t}\n\n\t\t\t\terrors[ path ] = error.message;\n\t\t\t}\n\t\t}\n\n\t\tif ( !Object.keys( errors ).length && !Object.keys( hiddenErrors ).length ) {\n\t\t\treturn true;\n\t\t}\n\n\t\tcallbackShowError( schemaName, null, errors, hiddenErrors );\n\t\treturn false;\n\t}\n\n\tasync function getValuesRec( path, model ) {\n\t\tswitch ( model.schema.type ) {\n\t\t\tcase 'array':\n\t\t\t\t// @TODO handle tuple\n\t\t\t\tif ( !VisualDataFunctions.isObject( model.items ) ) {\n\t\t\t\t\treturn [];\n\t\t\t\t}\n\t\t\t\tvar items = [];\n\n\t\t\t\t// multiselect\n\t\t\t\tif ( 'schema' in model.items ) {\n\t\t\t\t\titems = await formatValue( path, model.items );\n\t\t\t\t} else {\n\t\t\t\t\tvar n = 0;\n\t\t\t\t\tfor ( var ii in model.items ) {\n\t\t\t\t\t\tvar path_ = `${ path }/${ n }`;\n\t\t\t\t\t\tif ( model.items[ ii ].removed ) {\n\t\t\t\t\t\t\tif ( Action !== 'validate' ) {\n\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tRemoved.push( path_ );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\titems.push( await getValuesRec( path_, model.items[ ii ] ) );\n\t\t\t\t\t\tn++;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t/* set to null only required items */\n\t\t\t\tfor ( var ii in items ) {\n\t\t\t\t\tif (\n\t\t\t\t\t\ttypeof items[ ii ] === 'string' &&\n\t\t\t\t\t\titems[ ii ].trim() === '' &&\n\t\t\t\t\t\t'minItems' in model.schema &&\n\t\t\t\t\t\tii <= model.schema.minItems\n\t\t\t\t\t) {\n\t\t\t\t\t\titems[ ii ] = null;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn items;\n\n\t\t\tcase 'object':\n\t\t\t\tvar items = {};\n\t\t\t\tfor ( var ii in model.properties ) {\n\t\t\t\t\tvar path_ = `${ path }/${ VisualDataFunctions.escapeJsonPtr( ii ) }`;\n\n\t\t\t\t\tif ( model.properties[ ii ].removed ) {\n\t\t\t\t\t\tif ( Action !== 'validate' ) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tRemoved.push( path_ );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\titems[ ii ] = await getValuesRec( path_, model.properties[ ii ] );\n\t\t\t\t}\n\t\t\t\treturn items;\n\n\t\t\tdefault:\n\t\t\t\treturn await formatValue( path, model );\n\t\t}\n\t}\n\n\tasync function getFormModel() {\n\t\tvar ret = {};\n\t\tfor ( var i in Model ) {\n\t\t\tret[ i ] = Model[ i ].getValue();\n\n\t\t\tif ( VisualDataFunctions.isPromise( ret[ i ] ) ) {\n\t\t\t\tret[ i ] = await ret[ i ];\n\t\t\t}\n\t\t}\n\t\treturn ret;\n\t}\n\n\tasync function getModel( action, schemaName ) {\n\t\tAction = action;\n\t\tFlatten = {};\n\t\tRemoved = [];\n\t\tErrors = {};\n\n\t\tvar ret = {};\n\t\tswitch ( action ) {\n\t\t\tcase 'validate':\n\t\t\t\tcallbackShowError( null );\n\n\t\t\t\ttry {\n\t\t\t\t\tfor ( var schemaName in ModelSchemas ) {\n\t\t\t\t\t\tif ( Form.schemas.indexOf( schemaName ) === -1 ) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tret[ schemaName ] = await getValuesRec(\n\t\t\t\t\t\t\tVisualDataFunctions.escapeJsonPtr( schemaName ),\n\t\t\t\t\t\t\tModelSchemas[ schemaName ]\n\t\t\t\t\t\t);\n\t\t\t\t\t\t// removeNulls(ret);\n\n\t\t\t\t\t\tif ( !validate( schemaName, ret[ schemaName ], Schemas[ schemaName ] ) ) {\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} catch ( e ) {\n\t\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\t\tconsole.error( 'validate', e );\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\treturn ret;\n\n\t\t\tcase 'fetch':\n\t\t\t\tfor ( var schemaName in ModelSchemas ) {\n\t\t\t\t\tret[ schemaName ] = await getValuesRec(\n\t\t\t\t\t\tVisualDataFunctions.escapeJsonPtr( schemaName ),\n\t\t\t\t\t\tModelSchemas[ schemaName ]\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\treturn ret;\n\n\t\t\tcase 'submit':\n\t\t\t\tfor ( var schemaName in ModelSchemas ) {\n\t\t\t\t\tif ( Form.schemas.indexOf( schemaName ) === -1 ) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tret[ schemaName ] = await getValuesRec(\n\t\t\t\t\t\tVisualDataFunctions.escapeJsonPtr( schemaName ),\n\t\t\t\t\t\tModelSchemas[ schemaName ]\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tvar formModel = await getFormModel();\n\n\t\t\t\treturn {\n\t\t\t\t\tdata: ret,\n\t\t\t\t\tflatten: Flatten,\n\t\t\t\t\tform: formModel,\n\t\t\t\t\tschemas: Form.schemas,\n\t\t\t\t\t// @FIXME or retrieve it server side\n\t\t\t\t\toptions: Form.options,\n\t\t\t\t\trecordedSchemas: RecordedSchemas\n\t\t\t\t};\n\n\t\t\tcase 'validate&submit':\n\t\t\t\tAction = 'validate';\n\n\t\t\t\tif ( !( await getModel( 'validate' ) ) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tAction = 'submit';\n\t\t\t\treturn await getModel( 'submit' );\n\n\t\t\tcase 'delete':\n\t\t\t\tvar formModel = await getFormModel();\n\t\t\t\tForm.options.action = 'delete';\n\t\t\t\treturn {\n\t\t\t\t\tform: formModel,\n\t\t\t\t\toptions: Form.options,\n\t\t\t\t\tschemas: RecordedSchemas // Object.keys(ModelSchemas),\n\t\t\t\t};\n\n\t\t\tcase 'schema':\n\t\t\t\tif ( !( schemaName in ModelSchemas ) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tvar ret = await getValuesRec(\n\t\t\t\t\tVisualDataFunctions.escapeJsonPtr( schemaName ),\n\t\t\t\t\tModelSchemas[ schemaName ]\n\t\t\t\t);\n\t\t\t\treturn {\n\t\t\t\t\tdata: ret,\n\t\t\t\t\tflatten: Flatten\n\t\t\t\t};\n\t\t}\n\t}\n\n\treturn {\n\t\tgetModel\n\t};\n};\n","usedDeprecatedRules":[{"ruleId":"max-len","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/VisualDataSchemas.js","messages":[{"ruleId":"max-len","severity":1,"message":"This line has a length of 103. Maximum allowed is 100.","line":327,"column":1,"nodeType":"Program","messageId":"max","endLine":327,"endColumn":95},{"ruleId":"no-jquery/no-global-selector","severity":1,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":1496,"column":15,"nodeType":"CallExpression","endLine":1496,"endColumn":51},{"ruleId":"no-jquery/no-global-selector","severity":1,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":1671,"column":4,"nodeType":"CallExpression","endLine":1671,"endColumn":27},{"ruleId":"no-jquery/no-parse-html-literal","severity":1,"message":"Prefer DOM building to parsing HTML literals","line":1674,"column":15,"nodeType":"CallExpression","endLine":1676,"endColumn":6},{"ruleId":"no-jquery/no-global-selector","severity":1,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":1690,"column":4,"nodeType":"CallExpression","endLine":1690,"endColumn":27}],"suppressedMessages":[{"ruleId":"no-implicit-globals","severity":2,"message":"Global variable leak, declare the variable if it is intended to be local.","line":26,"column":1,"nodeType":"AssignmentExpression","messageId":"globalVariableLeak","endLine":1733,"endColumn":6,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'VisualDataForms' is assigned a value but never used.","line":36,"column":6,"nodeType":"Identifier","messageId":"unusedVar","endLine":36,"endColumn":21,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-console","severity":2,"message":"Unexpected console statement.","line":95,"column":4,"nodeType":"MemberExpression","messageId":"unexpected","endLine":95,"endColumn":17,"suggestions":[{"messageId":"removeConsole","data":{"propertyName":"error"},"fix":{"range":[2412,2450],"text":""},"desc":"Remove the console.error()."}],"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'tableLoop' is defined but never used.","line":129,"column":37,"nodeType":"Identifier","messageId":"unusedVar","endLine":129,"endColumn":46,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'rowLoop' is defined but never used.","line":129,"column":48,"nodeType":"Identifier","messageId":"unusedVar","endLine":129,"endColumn":55,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"array-callback-return","severity":2,"message":"Array.prototype.every() expects a return value from arrow function.","line":129,"column":58,"nodeType":"ArrowFunctionExpression","messageId":"expectedInside","endLine":129,"endColumn":60,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'meta' is defined but never used.","line":292,"column":47,"nodeType":"Identifier","messageId":"unusedVar","endLine":292,"endColumn":51,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'thisIsArray' is assigned a value but never used.","line":327,"column":37,"nodeType":"Identifier","messageId":"unusedVar","endLine":327,"endColumn":48,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":445,"column":5,"nodeType":"Program","messageId":"unexpectedTab","endLine":445,"endColumn":6,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":487,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":487,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-alert","severity":2,"message":"Unexpected confirm.","line":556,"column":6,"nodeType":"CallExpression","messageId":"unexpected","endLine":556,"endColumn":78,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-fallthrough","severity":1,"message":"Expected a 'break' statement before 'case'.","line":636,"column":6,"nodeType":"SwitchCase","messageId":"case","endLine":713,"endColumn":11,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-console","severity":2,"message":"Unexpected console statement.","line":702,"column":10,"nodeType":"MemberExpression","messageId":"unexpected","endLine":702,"endColumn":23,"suggestions":[{"messageId":"removeConsole","data":{"propertyName":"error"},"fix":{"range":[18920,18967],"text":""},"desc":"Remove the console.error()."}],"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unreachable","severity":2,"message":"Unreachable code.","line":718,"column":3,"nodeType":"ReturnStatement","messageId":"unreachableCode","endLine":718,"endColumn":78,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":790,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":790,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-alert","severity":2,"message":"Unexpected confirm.","line":880,"column":6,"nodeType":"CallExpression","messageId":"unexpected","endLine":880,"endColumn":78,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":882,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":882,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-underscore-dangle","severity":2,"message":"Unexpected dangling '_' in 'target_'.","line":974,"column":9,"nodeType":"VariableDeclarator","messageId":"unexpectedUnderscore","endLine":976,"endColumn":25,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1087,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":1087,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1088,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":1088,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1089,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":1089,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1090,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":1090,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1094,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":1094,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1095,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":1095,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1096,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":1096,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1097,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":1097,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1312,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":1312,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1320,"column":8,"nodeType":"Program","messageId":"unexpectedTab","endLine":1320,"endColumn":9,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1472,"column":5,"nodeType":"Program","messageId":"unexpectedTab","endLine":1472,"endColumn":6,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1473,"column":5,"nodeType":"Program","messageId":"unexpectedTab","endLine":1473,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1474,"column":5,"nodeType":"Program","messageId":"unexpectedTab","endLine":1474,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1475,"column":5,"nodeType":"Program","messageId":"unexpectedTab","endLine":1475,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1476,"column":5,"nodeType":"Program","messageId":"unexpectedTab","endLine":1476,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1477,"column":5,"nodeType":"Program","messageId":"unexpectedTab","endLine":1477,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":5,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/**\n * This file is part of the MediaWiki extension VisualData.\n *\n * VisualData is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 2 of the License, or\n * (at your option) any later version.\n *\n * VisualData is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with VisualData. If not, see <http://www.gnu.org/licenses/>.\n *\n * @file\n * @author thomas-topway-it <support@topway.it>\n * @copyright Copyright ©2023, https://wikisphere.org\n */\n\n/* eslint-disable no-tabs */\n/* eslint-disable no-underscore-dangle */\n\n// eslint-disable-next-line no-implicit-globals\nVisualDataSchemas = ( function () {\n\tvar Models = [];\n\tvar SelectedItems = [];\n\tvar DataTable;\n\tvar DialogName = 'dialogSchemas';\n\tvar Config;\n\tvar WindowManager;\n\tvar Schemas = {};\n\n\t/* eslint-disable-next-line no-unused-vars */\n\tvar VisualDataForms;\n\tvar VisualDataFormFieldInst;\n\tvar VisualDataContentBlockInst;\n\tvar VisualDataGeolocationInst;\n\n\tfunction getModel() {\n\t\treturn Models[ Models.length - 1 ];\n\t}\n\n\tfunction getWidgetValue( obj ) {\n\t\tvar ret = '';\n\t\tif ( 'getValue' in obj ) {\n\t\t\tret = obj.getValue();\n\t\t\tif ( typeof ret === 'string' ) {\n\t\t\t\treturn ret.trim();\n\t\t\t} else if ( Array.isArray( ret ) ) {\n\t\t\t\treturn ret.map( ( x ) => x.trim() );\n\t\t\t}\n\t\t\treturn ret;\n\t\t}\n\t\treturn Object.keys( obj )\n\t\t\t.map( ( i ) => obj[ i ] )\n\t\t\t.map( ( x ) => x.getValue() );\n\t}\n\n\tfunction getPropertyValue( property, propName, self ) {\n\t\tif ( !self ) {\n\t\t\tvar self = VisualDataSchemas;\n\t\t}\n\t\tvar model = self.getModel();\n\n\t\tif ( propName ) {\n\t\t\tmodel = model[ propName ];\n\t\t}\n\t\tif ( property in model ) {\n\t\t\treturn getWidgetValue( model[ property ] );\n\t\t}\n\n\t\tvar currentItem = self.getCurrentItem();\n\n\t\tif ( !currentItem ) {\n\t\t\treturn '';\n\t\t}\n\n\t\t// new item\n\t\tif ( propName && currentItem.type !== 'array' ) {\n\t\t\treturn '';\n\t\t}\n\n\t\tif (\n\t\t\t!propName &&\n\t\t\tcurrentItem.type === 'array' &&\n\t\t\tVisualDataFunctions.isObject( currentItem.items )\n\t\t) {\n\t\t\tcurrentItem = currentItem.items;\n\t\t}\n\n\t\tif ( !( 'wiki' in currentItem ) ) {\n\t\t\t// eslint-disable-next-line no-console\n\t\t\tconsole.error( 'missing \"wiki\" key' );\n\t\t\treturn '';\n\t\t}\n\n\t\tif ( property in currentItem.wiki ) {\n\t\t\treturn currentItem.wiki[ property ];\n\t\t}\n\t\treturn '';\n\t}\n\n\tfunction getDatatableId( panel ) {\n\t\treturn `visualdata-schemas-datatable-dialog-${ SelectedItems.length }-${ panel }`;\n\t}\n\n\tfunction getCurrentItem() {\n\t\tif ( !SelectedItems.length ) {\n\t\t\treturn null;\n\t\t}\n\t\tvar ret = SelectedItems[ SelectedItems.length - 1 ];\n\n\t\tif ( ret.type === 'array' && !ret.items ) {\n\t\t\tret.items = { wiki: {}, properties: {} };\n\t\t}\n\n\t\treturn ret;\n\t}\n\n\tfunction orderFields( fields, panel ) {\n\t\tif ( !$.fn.DataTable.isDataTable( '#' + getDatatableId( panel ) ) ) {\n\t\t\treturn fields;\n\t\t}\n\t\tvar datatable = $( '#' + getDatatableId( panel ) ).DataTable();\n\t\tvar ret = {};\n\t\t// eslint-disable-next-line no-unused-vars, array-callback-return\n\t\tdatatable.rows().every( ( rowIdx, tableLoop, rowLoop ) => {\n\t\t\tvar key = Object.keys( fields )[ rowIdx ];\n\t\t\tif ( key in fields ) {\n\t\t\t\tret[ key ] = fields[ key ];\n\t\t\t}\n\t\t} );\n\t\tvar newItems = {};\n\t\tfor ( var i in fields ) {\n\t\t\tif ( !( i in ret ) ) {\n\t\t\t\tnewItems[ i ] = fields[ i ];\n\t\t\t}\n\t\t\tdelete fields[ i ];\n\t\t}\n\t\tfor ( var i in ret ) {\n\t\t\tfields[ i ] = ret[ i ];\n\t\t}\n\t\tfor ( var i in newItems ) {\n\t\t\tfields[ i ] = newItems[ i ];\n\t\t}\n\t}\n\n\tfunction initializeNestedDataTable( panel ) {\n\t\tvar currentItem = getCurrentItem();\n\n\t\t// array items can share the same schema for\n\t\t// all items, or to contain a tuple (to be an\n\t\t// array of items of fixed length)\n\t\t// in the first case, we consider the schema\n\t\t// being the child schema,\n\t\t// in the second case being the parent schema\n\t\t// (in the first case, we will provide an\n\t\t// editable panel with the properties of the\n\t\t// parent schema)\n\t\tif (\n\t\t\tcurrentItem.type === 'array' &&\n\t\t\tVisualDataFunctions.isObject( currentItem.items )\n\t\t) {\n\t\t\tcurrentItem = currentItem.items;\n\t\t}\n\n\t\torderFields( currentItem[ panel ], panel );\n\n\t\tVisualDataFunctions.destroyDataTable( getDatatableId( panel ) );\n\n\t\tfunction getType( thisItem ) {\n\t\t\tvar ret;\n\t\t\tswitch ( thisItem.wiki.type ) {\n\t\t\t\tcase 'schema':\n\t\t\t\t\tret = mw.msg( 'visualdata-jsmodule-schemas-subitem' );\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'property':\n\t\t\t\t\tret =\n\t\t\t\t\t\t'SMW-property' in thisItem ?\n\t\t\t\t\t\t\tthisItem[ 'SMW-property' ] :\n\t\t\t\t\t\t\tthisItem.wiki[ 'jsonSchema-type' ] +\n\t\t\t\t\t\t\t( thisItem.wiki[ 'jsonSchema-type' ] !== 'string' ?\n\t\t\t\t\t\t\t\t'' :\n\t\t\t\t\t\t\t\t' (' + thisItem.wiki[ 'jsonSchema-format' ] + ')' );\n\n\t\t\t\t\tif ( !( 'preferred-input' in thisItem.wiki ) ) {\n\t\t\t\t\t\tthisItem.wiki[ 'preferred-input' ] =\n\t\t\t\t\t\t\tVisualDataFunctions.getPreferredInput( thisItem.wiki );\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'content-block':\n\t\t\t\t\tret = mw.msg( 'visualdata-jsmodule-schemas-content-block' );\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'geolocation':\n\t\t\t\t\tret = mw.msg( 'visualdata-jsmodule-schemas-geolocation' );\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\treturn ret;\n\t\t}\n\n\t\t// this returns a modified item, the object schema\n\t\t// or the array schema \"subject\" in case of\n\t\t// array, with name of parent schema\n\t\tfunction getItem( thisItem ) {\n\t\t\tvar thisItem = VisualDataFunctions.deepCopy( thisItem );\n\t\t\tif ( !( 'wiki' in thisItem ) ) {\n\t\t\t\tthisItem.wiki = { name: '' };\n\t\t\t}\n\n\t\t\t// handle from property panel\n\t\t\t// @TODO handle tuple\n\t\t\tif (\n\t\t\t\tthisItem.type === 'array' &&\n\t\t\t\tVisualDataFunctions.isObject( thisItem.items ) &&\n\t\t\t\tthisItem.items.type !== 'array'\n\t\t\t) {\n\t\t\t\tvar ret = thisItem.items;\n\t\t\t\tret.wiki.name = thisItem.wiki.name;\n\t\t\t\treturn { item: ret, isArray: true };\n\t\t\t}\n\t\t\treturn { item: thisItem, isArray: false };\n\t\t}\n\n\t\tvar n = 0;\n\t\tvar data = [];\n\t\tvar propName = panel;\n\n\t\tfor ( var i in currentItem[ propName ] ) {\n\t\t\tvar { item, isArray } = getItem( currentItem[ propName ][ i ] );\n\t\t\tvar required = '';\n\t\t\t// var input = '';\n\t\t\tvar multiple = '';\n\t\t\tif ( item.wiki.type === 'property' ) {\n\t\t\t\t// input = item.wiki[ 'preferred-input' ];\n\t\t\t\trequired = item.wiki.required ?\n\t\t\t\t\tmw.msg( 'visualdata-jsmodule-formfield-required' ) :\n\t\t\t\t\tmw.msg( 'visualdata-jsmodule-formfield-not-required' );\n\t\t\t} else {\n\t\t\t\trequired = mw.msg( 'visualdata-jsmodule-formfield-n/a' );\n\t\t\t\t// input = mw.msg( 'visualdata-jsmodule-formfield-n/a' );\n\t\t\t}\n\t\t\tif ( isArray ) {\n\t\t\t\tmultiple = mw.msg( 'visualdata-jsmodule-schemas-multiple' );\n\t\t\t}\n\t\t\tvar type = getType( item );\n\t\t\tdata.push( [\n\t\t\t\tn,\n\t\t\t\titem.wiki.name,\n\t\t\t\ttype,\n\t\t\t\t// input\n\t\t\t\tmultiple,\n\t\t\t\trequired,\n\t\t\t\t''\n\t\t\t] );\n\n\t\t\tn++;\n\t\t}\n\n\t\tif ( !data.length ) {\n\t\t\treturn;\n\t\t}\n\n\t\t$( '#' + getDatatableId( panel ) ).DataTable( {\n\t\t\t// order: 1,\n\t\t\t// pageLength: 20,\n\t\t\t// https://datatables.net/reference/option/dom\n\t\t\tdom: '<\"visualdata-datatable-left\"f><\"visualdata-datatable-right\"l>rtip',\n\n\t\t\t// @ATTENTION! this conflicts with \"rowReorder\"\n\t\t\t// use instead an hidden column and set orderable to false\n\t\t\t// for all visible columns\n\t\t\t// ordering: false,\n\n\t\t\tiDisplayLength: 100,\n\t\t\tsearching: false,\n\t\t\tpaging: false,\n\t\t\tinfo: false,\n\t\t\trowReorder: {\n\t\t\t\t// update: false,\n\t\t\t\t// dataSrc: 0,\n\t\t\t\tselector: 'td:not(:last-child)'\n\t\t\t},\n\t\t\tscrollX: true,\n\t\t\tcolumnDefs: [\n\t\t\t\t{ targets: 0, orderable: true, visible: false },\n\t\t\t\t{ orderable: false, targets: '_all' },\n\t\t\t\t{\n\t\t\t\t\ttargets: 5,\n\t\t\t\t\t// eslint-disable-next-line no-unused-vars\n\t\t\t\t\trender: function ( data_, thisType, row, meta ) {\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t'<span class=\"buttons-wrapper\" style=\"white-space:nowrap\" data-row=\"' +\n\t\t\t\t\t\t\trow[ 0 ] +\n\t\t\t\t\t\t\t'\"></span>'\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t],\n\n\t\t\t// lengthMenu: [ 10, 20, 50, 100, 200 ],\n\t\t\t// lengthChange: false,\n\t\t\tdata: data,\n\t\t\t// stateSave: true,\n\t\t\tcolumns: [ '' ].concat(\n\t\t\t\tmw.msg( 'visualdata-jsmodule-schemas-properties-columns' )\n\t\t\t\t\t.split( /\\s*,\\s*/ )\n\t\t\t\t\t.map( ( x ) => ( { title: x } ) )\n\t\t\t)\n\t\t} );\n\n\t\t$( '#' + getDatatableId( panel ) + ' .buttons-wrapper' ).each( function () {\n\t\t\tvar buttonWidgetEdit = new OO.ui.ButtonWidget( {\n\t\t\t\ticon: 'edit'\n\t\t\t\t// flags: [\"progressive\"],\n\t\t\t} );\n\n\t\t\tvar row = $( this ).data().row;\n\t\t\tvar key = Object.keys( currentItem[ propName ] )[ row ];\n\n\t\t\t// this is the modified item, the object schema\n\t\t\t// or the array schema \"subject\" in case of\n\t\t\t// array, with name of parent schema\n\n\t\t\t// eslint-disable-next-line no-unused-vars\n\t\t\tconst { item: thisItem, isArray: thisIsArray } = getItem( currentItem[ propName ][ key ] );\n\n\t\t\tif ( !( 'type' in thisItem.wiki ) ) {\n\t\t\t\tthisItem.wiki.type = 'property';\n\t\t\t}\n\n\t\t\tvar targetItem =\n\t\t\t\tcurrentItem.type !== 'array' ?\n\t\t\t\t\tcurrentItem[ propName ] :\n\t\t\t\t\tcurrentItem.items[ propName ];\n\n\t\t\tvar callback = function () {\n\t\t\t\tinitializeNestedDataTable( panel );\n\t\t\t};\n\n\t\t\tbuttonWidgetEdit.on( 'click', () => {\n\t\t\t\t// switch by subschema type (if array)\n\t\t\t\tswitch ( thisItem.wiki.type ) {\n\t\t\t\t\tcase 'property':\n\t\t\t\t\t\tVisualDataFormFieldInst.openDialog( callback, targetItem, key );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'content-block':\n\t\t\t\t\t\tVisualDataContentBlockInst.openDialog(\n\t\t\t\t\t\t\tcallback,\n\t\t\t\t\t\t\ttargetItem,\n\t\t\t\t\t\t\tkey\n\t\t\t\t\t\t);\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'geolocation':\n\t\t\t\t\t\tVisualDataGeolocationInst.openDialog(\n\t\t\t\t\t\t\tcallback,\n\t\t\t\t\t\t\ttargetItem,\n\t\t\t\t\t\t\tkey\n\t\t\t\t\t\t);\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'schema':\n\t\t\t\t\t\t// pass the child schema, we don't pass the target\n\t\t\t\t\t\t// item since the dialog must handle the parent schema\n\t\t\t\t\t\t// as well (in case of array)\n\t\t\t\t\t\topenDialog( currentItem[ propName ][ key ], propName );\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\tvar buttonWidgetDelete = new OO.ui.ButtonWidget( {\n\t\t\t\ticon: 'close',\n\t\t\t\tflags: [ 'destructive' ]\n\t\t\t} );\n\n\t\t\tbuttonWidgetDelete.on( 'click', () => {\n\t\t\t\tVisualDataFunctions.OOUIAlert(\n\t\t\t\t\tnew OO.ui.HtmlSnippet(\n\t\t\t\t\t\tmw.msg( 'visualdata-jsmodule-schemas-delete-confirm' )\n\t\t\t\t\t),\n\t\t\t\t\t{ size: 'medium' },\n\t\t\t\t\t() => {\n\t\t\t\t\t\tdelete currentItem[ propName ][ key ];\n\t\t\t\t\t\t// *** or delete the row manually\n\t\t\t\t\t\tinitializeNestedDataTable( panel );\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t} );\n\t\t\t$( this ).append( [ buttonWidgetEdit.$element, buttonWidgetDelete.$element ] );\n\t\t} );\n\n\t\t// DataTables[DataTables.length - 1].draw();\n\t}\n\n\tfunction PageTwoLayout( name, config ) {\n\t\tPageTwoLayout.super.call( this, name, config );\n\n\t\tthis.name = name;\n\n\t\tvar toolbar = createToolbarB( name );\n\n\t\tvar contentFrame = new OO.ui.PanelLayout( {\n\t\t\t$content: $(\n\t\t\t\t// display\n\t\t\t\t'<table id=\"' +\n\t\t\t\t\tgetDatatableId( name ) +\n\t\t\t\t\t'\" class=\"visualdata-datatable\" width=\"100%\"></table>'\n\t\t\t), // this.fieldset.$element,\n\t\t\texpanded: false,\n\t\t\tpadded: false,\n\t\t\tclasses: [ 'visualdata-schemas-properties-contentframe' ]\n\t\t} );\n\n\t\tvar frameA = new OO.ui.PanelLayout( {\n\t\t\t$content: [ toolbar.$element, contentFrame.$element ],\n\t\t\texpanded: false,\n\t\t\t// framed: false,\n\t\t\tpadded: false,\n\t\t\tdata: { name: 'manage-schemas' }\n\t\t} );\n\n\t\tthis.$element.append( frameA.$element );\n\t}\n\n\tOO.inheritClass( PageTwoLayout, OO.ui.PageLayout );\n\tPageTwoLayout.prototype.setupOutlineItem = function () {\n\t\tthis.outlineItem.setLabel(\n\t\t\t// Messages that can be used here:\n\t\t\t// * visualdata-jsmodule-schemas-panel-properties\n\t\t\t// * visualdata-jsmodule-schemas-panel-oneOf\n\t\t\tmw.msg( 'visualdata-jsmodule-schemas-panel-' + this.name )\n\t\t);\n\t};\n\n\tfunction ProcessDialog( config ) {\n\t\tProcessDialog.super.call( this, config );\n\t}\n\tOO.inheritClass( ProcessDialog, OO.ui.ProcessDialog );\n\n\tProcessDialog.static.name = DialogName;\n\t// ProcessDialog.static.title = mw.msg(\n\t// \t\"visualdata-jsmodule-forms-defineform\"\n\t// );\n\tProcessDialog.static.actions = [\n\t\t{\n\t\t\taction: 'delete',\n\t\t\tmodes: 'main',\n\t\t\tlabel: mw.msg( 'visualdata-jsmodule-dialog-delete' ),\n\t\t\tflags: 'destructive'\n\t\t},\n\t\t{\n\t\t\taction: 'save',\n\t\t\tmodes: [ 'main', 'properties' ],\n\t\t\tlabel: mw.msg( 'visualdata-jsmodule-dialog-save' ),\n\t\t\tflags: [ 'primary', 'progressive' ]\n\t\t},\n\t\t{\n\t\t\tmodes: [ 'main', 'properties' ],\n\t\t\tlabel: mw.msg( 'visualdata-jsmodule-dialog-cancel' ),\n\t\t\tflags: [ 'safe', 'close' ]\n\t\t}\n\t];\n\n\tfunction DialogContent() {\n\t\tvar page1 = new PageOneLayout( 'main', {} );\n\n\t\tvar page2 = new PageTwoLayout( 'properties', {\n\t\t\tclasses: [ 'visualdata-schemas-panel-properties' ]\n\t\t} );\n\n\t\t// *** the following requires more brainstorming\n\t\t// specifically, anyOf and oneOf are expected to\n\t\t// be objects, not properties in the same schema\n\t\t// so addField should be disabled in this case\n\t\t// or should inherit the current schema ...\n\t\t/*\n\t\tthis.page3 = new PageTwoLayout(\"anyOf\", {\n\t\t\tclasses: [\"visualdata-schemas-panel-properties\"],\n\t\t});\n\t\tthis.page4 = new PageTwoLayout(\"oneOf\", {\n\t\t\tclasses: [\"visualdata-schemas-panel-properties\"],\n\t\t});\n\t\t// this.page5 = new PageTwoLayout(\"prefixItems\", {\n\t\t// \tclasses: [\"visualdata-schemas-panel-properties\"],\n\t\t// });\n\t\tthis.page5 = new PageTwoLayout(\"allOf\", {\n\t\t\tclasses: [\"visualdata-schemas-panel-properties\"],\n\t\t});\n\t\tthis.page6 = new PageTwoLayout(\"additionalProperties\", {\n\t\t\tclasses: [\"visualdata-schemas-panel-properties\"],\n\t\t});\n\t\t*/\n\n\t\tvar booklet = new OO.ui.BookletLayout( {\n\t\t\toutlined: true,\n\t\t\texpanded: true,\n\t\t\tpadded: false\n\t\t} );\n\n\t\tbooklet.addPages( [\n\t\t\tpage1,\n\t\t\tpage2\n\t\t\t// this.page3,\n\t\t\t// this.page4,\n\t\t\t// this.page5,\n\t\t\t// this.page6,\n\t\t] );\n\n\t\treturn booklet;\n\t}\n\n\tProcessDialog.prototype.getSetupProcess = function ( data ) {\n\t\tvar initPropertiesTab = function ( tabName ) {\n\t\t\tif (\n\t\t\t\ttabName !== 'page1' &&\n\t\t\t\t!$.fn.DataTable.isDataTable( '#' + getDatatableId( tabName ) )\n\t\t\t) {\n\t\t\t\t// $('#visualdata-forms-datatable-dialog').DataTable().clear().draw();\n\t\t\t\tinitializeNestedDataTable( tabName );\n\t\t\t}\n\t\t};\n\n\t\treturn ProcessDialog.super.prototype.getSetupProcess.call( this, data )\n\t\t\t.next( function () {\n\t\t\t\tthis.actions.setMode( data.initialTab );\n\t\t\t\tvar booklet = DialogContent();\n\t\t\t\tthis.$body.append( booklet.$element );\n\t\t\t\tbooklet.setPage( data.initialTab );\n\n\t\t\t\tbooklet.on( 'set', ( value ) => {\n\t\t\t\t\tinitPropertiesTab( value.name );\n\t\t\t\t} );\n\n\t\t\t\tsetTimeout( () => {\n\t\t\t\t\tinitPropertiesTab( data.initialTab );\n\t\t\t\t\tVisualDataFunctions.removeNbspFromLayoutHeader(\n\t\t\t\t\t\t'#visualdata-ProcessDialogEditData'\n\t\t\t\t\t);\n\t\t\t\t}, 30 );\n\n\t\t\t}, this );\n\t};\n\n\tProcessDialog.prototype.initialize = function () {\n\t\tProcessDialog.super.prototype.initialize.apply( this, arguments );\n\t};\n\n\tProcessDialog.prototype.getActionProcess = function ( action ) {\n\t\tif (\n\t\t\t!action ||\n\t\t\t( action === 'delete' &&\n\t\t\t\t// eslint-disable-next-line no-alert\n\t\t\t\t!confirm( mw.msg( 'visualdata-jsmodule-schemas-delete-schema-confirm' ) ) )\n\t\t) {\n\t\t\treturn ProcessDialog.super.prototype.getActionProcess.call( this, action );\n\t\t}\n\n\t\tvar currentItem = getCurrentItem();\n\n\t\tvar payload = {\n\t\t\taction: 'visualdata-save-schema',\n\t\t\t'dialog-action': action,\n\t\t\t'previous-label': currentItem.wiki.name,\n\t\t\t'source-page': mw.config.get( 'wgPageName' ),\n\t\t\tformat: 'json',\n\t\t\tschema: {}\n\t\t};\n\t\t// https://www.mediawiki.org/wiki/OOUI/Windows/Process_Dialogs#Action_sets\n\t\treturn ProcessDialog.super.prototype.getActionProcess\n\t\t\t.call( this, action )\n\t\t\t.next( function () {\n\t\t\t\tswitch ( action ) {\n\t\t\t\t\tcase 'save':\n\t\t\t\t\t\tvar obj = { type: 'schema' };\n\t\t\t\t\t\tvar model = Models[ 0 ];\n\n\t\t\t\t\t\t// var propName = currentItem.type === 'array' ? 'items': 'properties'\n\n\t\t\t\t\t\tfor ( var i in model ) {\n\t\t\t\t\t\t\tobj[ i ] = getPropertyValue( i );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// @TODO sanitize label\n\n\t\t\t\t\t\tvar alert = null;\n\t\t\t\t\t\tif ( obj.name === '' ) {\n\t\t\t\t\t\t\talert = mw.msg( 'visualdata-jsmodule-schemas-alert-noname' );\n\t\t\t\t\t\t} else if ( currentItem.wiki.name === '' && obj.name in Schemas ) {\n\t\t\t\t\t\t\talert = mw.msg(\n\t\t\t\t\t\t\t\t'visualdata-jsmodule-schemas-alert-existing-schema'\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t} else if (\n\t\t\t\t\t\t\t!Object.keys( currentItem.properties ).length\n\t\t\t\t\t\t\t//  && !Object.keys(currentItem.allOf).length &&\n\t\t\t\t\t\t\t// !Object.keys(currentItem.anyOf).length &&\n\t\t\t\t\t\t\t// !Object.keys(currentItem.oneOf).length\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\talert = mw.msg(\n\t\t\t\t\t\t\t\t'visualdata-jsmodule-schemas-alert-no-properties'\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( alert ) {\n\t\t\t\t\t\t\tVisualDataFunctions.OOUIAlert( new OO.ui.HtmlSnippet( alert ), {\n\t\t\t\t\t\t\t\tsize: 'medium'\n\t\t\t\t\t\t\t} );\n\n\t\t\t\t\t\t\treturn ProcessDialog.super.prototype.getActionProcess.call(\n\t\t\t\t\t\t\t\tthis,\n\t\t\t\t\t\t\t\taction\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tdelete obj.parentSchema;\n\t\t\t\t\t\tpayload.schema.wiki = obj;\n\t\t\t\t\t\tpayload.schema.type = 'object';\n\n\t\t\t\t\t\tfor ( var panel of [\n\t\t\t\t\t\t\t'properties'\n\t\t\t\t\t\t\t// \"anyOf\",\n\t\t\t\t\t\t\t// \"oneOf\",\n\t\t\t\t\t\t\t// \"additionalProperties\",\n\t\t\t\t\t\t] ) {\n\t\t\t\t\t\t\tif ( Object.keys( currentItem[ panel ] ).length ) {\n\t\t\t\t\t\t\t\tpayload.schema[ panel ] = currentItem[ panel ];\n\t\t\t\t\t\t\t\torderFields( payload.schema[ panel ], panel );\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tdelete payload.schema[ panel ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t// eslint-disable-next-line no-fallthrough\n\t\t\t\t\tcase 'delete':\n\t\t\t\t\t\t// console.log(\"payload\", JSON.parse(JSON.stringify(payload)));\n\t\t\t\t\t\tpayload.schema = JSON.stringify( payload.schema );\n\n\t\t\t\t\t\t// return;\n\t\t\t\t\t\tvar callApi = function ( postData, resolve, reject ) {\n\t\t\t\t\t\t\tnew mw.Api()\n\t\t\t\t\t\t\t\t.postWithToken( 'csrf', postData )\n\t\t\t\t\t\t\t\t.done( ( res ) => {\n\t\t\t\t\t\t\t\t\tresolve();\n\t\t\t\t\t\t\t\t\tif ( payload.action in res ) {\n\t\t\t\t\t\t\t\t\t\tvar data = res[ payload.action ];\n\t\t\t\t\t\t\t\t\t\tif ( 'schemas' in data ) {\n\t\t\t\t\t\t\t\t\t\t\tdata.schemas = JSON.parse( data.schemas );\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tif ( data[ 'result-action' ] === 'error' ) {\n\t\t\t\t\t\t\t\t\t\t\tVisualDataFunctions.OOUIAlert(\n\t\t\t\t\t\t\t\t\t\t\t\tnew OO.ui.HtmlSnippet( data.error ),\n\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\tsize: 'medium'\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\tif ( 'jobs-count-warning' in data ) {\n\t\t\t\t\t\t\t\t\t\t\t\tVisualDataFunctions.OOUIAlert(\n\t\t\t\t\t\t\t\t\t\t\t\t\tmw.msg(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t'visualdata-jsmodule-create-jobs-alert',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tparseInt( data[ 'jobs-count-warning' ] )\n\t\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t\t\t{ size: 'medium' },\n\t\t\t\t\t\t\t\t\t\t\t\t\tcallApi,\n\t\t\t\t\t\t\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tObject.assign( postData, {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'confirm-job-execution': true\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t} ),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tresolve,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treject\n\t\t\t\t\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\t\tif ( parseInt( data[ 'jobs-count' ] ) ) {\n\t\t\t\t\t\t\t\t\t\t\t\t\tVisualDataFunctions.OOUIAlert(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tmw.msg(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'visualdata-jsmodule-created-jobs',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tparseInt( data[ 'jobs-count' ] )\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{ size: 'medium' }\n\t\t\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\tSchemas = VisualData.updateSchemas( data, data[ 'result-action' ] );\n\t\t\t\t\t\t\t\t\t\t\t\t// initialize();\n\t\t\t\t\t\t\t\t\t\t\t\tModels.pop();\n\t\t\t\t\t\t\t\t\t\t\t\tSelectedItems.pop();\n\t\t\t\t\t\t\t\t\t\t\t\tWindowManager.closeActiveWindow();\n\t\t\t\t\t\t\t\t\t\t\t\tinitializeDataTable();\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\tVisualDataFunctions.OOUIAlert( 'unknown error', {\n\t\t\t\t\t\t\t\t\t\t\tsize: 'medium'\n\t\t\t\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t} )\n\t\t\t\t\t\t\t\t.fail( ( res ) => {\n\t\t\t\t\t\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\t\t\t\t\t\tconsole.error( 'visualdata-save-schema', res );\n\t\t\t\t\t\t\t\t\treject( res );\n\t\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\treturn new Promise( ( resolve, reject ) => {\n\t\t\t\t\t\t\tmw.loader.using( 'mediawiki.api', () => {\n\t\t\t\t\t\t\t\tcallApi( payload, resolve, reject );\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t} ).catch( ( err ) => {\n\t\t\t\t\t\t\tVisualDataFunctions.OOUIAlert( `error: ${ err }`, { size: 'medium' } );\n\t\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t} ); // .next\n\n\t\t// eslint-disable-next-line no-unreachable\n\t\treturn ProcessDialog.super.prototype.getActionProcess.call( this, action );\n\t};\n\n\tProcessDialog.prototype.getTeardownProcess = function ( data ) {\n\t\treturn ProcessDialog.super.prototype.getTeardownProcess\n\t\t\t.call( this, data )\n\t\t\t.first( () => {\n\t\t\t\tModels.pop();\n\t\t\t\tSelectedItems.pop();\n\t\t\t\tWindowManager.removeActiveWindow();\n\t\t\t}, this );\n\t};\n\n\t/**\n\t * Override getBodyHeight to create a tall dialog relative to the screen.\n\t *\n\t * @return {number} Body height\n\t */\n\tProcessDialog.prototype.getBodyHeight = function () {\n\t\t// see here https://www.mediawiki.org/wiki/OOUI/Windows/Process_Dialogs\n\t\t// this.page1.content.$element.outerHeight( true );\n\t\treturn window.innerHeight - 100;\n\t};\n\n\tfunction ProcessDialogNested( config ) {\n\t\tProcessDialogNested.super.call( this, config );\n\n\t\tthis.data = config.data;\n\t}\n\tOO.inheritClass( ProcessDialogNested, OO.ui.ProcessDialog );\n\n\tProcessDialogNested.static.name = DialogName;\n\n\tProcessDialogNested.static.actions = [\n\t\t/*\n\t\t{\n\t\t\taction: 'delete',\n\t\t\tlabel: mw.msg( 'visualdata-jsmodule-manageproperties-delete' ),\n\t\t\tflags: 'destructive'\n\t\t},\n\t\t*/\n\t\t{\n\t\t\taction: 'save',\n\t\t\tmodes: 'edit',\n\t\t\tlabel: mw.msg( 'visualdata-jsmodule-dialog-save' ),\n\t\t\tflags: [ 'primary', 'progressive' ]\n\t\t},\n\t\t{\n\t\t\tmodes: 'edit',\n\t\t\tlabel: mw.msg( 'visualdata-jsmodule-dialog-cancel' ),\n\t\t\tflags: [ 'safe', 'close' ]\n\t\t}\n\t];\n\n\tProcessDialogNested.prototype.initialize = function () {\n\t\tProcessDialogNested.super.prototype.initialize.apply( this, arguments );\n\t\tthis.page1 = new PageOneLayoutNested( 'page1', {} );\n\t\tthis.page2 = new PageTwoLayout( 'properties', {\n\t\t\tclasses: [ 'visualdata-schemas-panel-properties' ]\n\t\t} );\n\t\t/*\n\t\tthis.page3 = new PageTwoLayout(\"anyOf\", {\n\t\t\tclasses: [\"visualdata-schemas-panel-properties\"],\n\t\t});\n\t\tthis.page4 = new PageTwoLayout(\"oneOf\", {\n\t\t\tclasses: [\"visualdata-schemas-panel-properties\"],\n\t\t});\n\n\t\tthis.page5 = new PageTwoLayout(\"allOf\", {\n\t\t\tclasses: [\"visualdata-schemas-panel-properties\"],\n\t\t});\n\t\t// this.page5 = new PageTwoLayout(\"prefixItems\", {\n\t\t// \tclasses: [\"visualdata-schemas-panel-properties\"],\n\t\t// });\n\t\tthis.page6 = new PageTwoLayout(\"additionalProperties\", {\n\t\t\tclasses: [\"visualdata-schemas-panel-properties\"],\n\t\t});\n\t\t*/\n\n\t\tvar booklet = new OO.ui.BookletLayout( {\n\t\t\toutlined: true,\n\t\t\texpanded: true,\n\t\t\tpadded: false\n\t\t} );\n\n\t\tbooklet.addPages( [\n\t\t\tthis.page1,\n\t\t\tthis.page2\n\t\t\t// this.page3,\n\t\t\t// this.page4,\n\t\t\t// this.page5,\n\t\t\t// this.page6,\n\t\t] );\n\t\tbooklet.setPage( 'page1' );\n\n\t\tbooklet.on( 'set', ( value ) => {\n\t\t\tif (\n\t\t\t\tvalue.name !== 'page1' &&\n\t\t\t\t!$.fn.DataTable.isDataTable( '#' + getDatatableId( value.name ) )\n\t\t\t) {\n\t\t\t\t// $('#visualdata-forms-datatable-dialog').DataTable().clear().draw();\n\t\t\t\tinitializeNestedDataTable( value.name );\n\t\t\t}\n\t\t} );\n\n\t\tthis.$body.append( booklet.$element );\n\n\t\tsetTimeout( () => {\n\t\t\tVisualDataFunctions.removeNbspFromLayoutHeader(\n\t\t\t\t'#visualdata-ProcessDialogEditProperties'\n\t\t\t);\n\t\t}, 30 );\n\t};\n\n\tfunction handleSaveArray( currentItem, obj ) {\n\t\tvar parentSchema = obj.parentSchema;\n\t\tdelete obj.parentSchema;\n\n\t\t// *** important !! otherwise it will be processed\n\t\t// as field by VisualDataSchemaProcessor\n\t\tif ( obj[ 'multiple-items' ] ) {\n\t\t\tparentSchema.type = 'schema';\n\t\t}\n\n\t\tif (\n\t\t\t( obj[ 'multiple-items' ] && currentItem.type === 'array' ) ||\n\t\t\t( !obj[ 'multiple-items' ] && currentItem.type !== 'array' )\n\t\t) {\n\t\t\tif ( obj[ 'multiple-items' ] ) {\n\t\t\t\tcurrentItem.wiki = parentSchema;\n\t\t\t\tcurrentItem.items = Object.assign( currentItem.items, { wiki: obj } );\n\t\t\t\treturn currentItem;\n\t\t\t}\n\n\t\t\tcurrentItem.wiki = obj;\n\t\t\treturn currentItem;\n\t\t}\n\n\t\t// move child to parent\n\t\tif ( !obj[ 'multiple-items' ] ) {\n\t\t\t// currentItem.type should be always array\n\t\t\treturn Object.assign(\n\t\t\t\tcurrentItem.type === 'array' ? currentItem.items : currentItem,\n\t\t\t\t{ wiki: obj }\n\t\t\t);\n\t\t}\n\n\t\t// create parent - child\n\t\treturn {\n\t\t\ttype: 'array',\n\t\t\twiki: parentSchema,\n\t\t\titems: Object.assign( currentItem, { wiki: obj } )\n\t\t};\n\t}\n\n\tProcessDialogNested.prototype.getActionProcess = function ( action ) {\n\t\tvar dialog = this;\n\n\t\tif (\n\t\t\t!action ||\n\t\t\t( action === 'delete' &&\n\t\t\t\t// eslint-disable-next-line no-alert\n\t\t\t\t!confirm( mw.msg( 'visualdata-jsmodule-schemas-delete-schema-confirm' ) ) )\n\t\t) {\n\t\t\t//\treturn ProcessDialogNested.super.prototype.getActionProcess.call( this, action );\n\t\t}\n\n\t\tvar data = this.data;\n\t\tvar propName = data.propName;\n\n\t\tvar currentItem = getCurrentItem();\n\t\tvar parentSchema = currentItem;\n\t\tif (\n\t\t\tcurrentItem.type === 'array' &&\n\t\t\tVisualDataFunctions.isObject( currentItem.items )\n\t\t) {\n\t\t\tcurrentItem = currentItem.items;\n\t\t}\n\n\t\tfunction getValueRec( thisModel, thisObj ) {\n\t\t\tfor ( var i in thisModel ) {\n\t\t\t\tif ( !( 'getValue' in thisModel[ i ] ) ) {\n\t\t\t\t\tgetValueRec( thisModel[ i ], ( thisObj[ i ] = {} ) );\n\t\t\t\t} else {\n\t\t\t\t\tthisObj[ i ] = getWidgetValue( thisModel[ i ] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tswitch ( action ) {\n\t\t\tcase 'delete':\n\t\t\t\tif ( parentSchema.wiki.name !== '' ) {\n\t\t\t\t\tdelete SelectedItems[ SelectedItems.length - 1 ][ propName ][\n\t\t\t\t\t\tparentSchema.wiki.name\n\t\t\t\t\t];\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 'save':\n\t\t\t\tvar model = Models[ Models.length - 1 ];\n\t\t\t\tvar ParentObj = SelectedItems[ SelectedItems.length - 2 ];\n\n\t\t\t\tvar obj = { type: 'schema' };\n\t\t\t\tgetValueRec( model, obj );\n\n\t\t\t\tvar objName = obj[ 'multiple-items' ] ? obj.parentSchema.name : obj.name;\n\n\t\t\t\tvar target =\n\t\t\t\t\tParentObj.type !== 'array' ?\n\t\t\t\t\t\tParentObj[ propName ] :\n\t\t\t\t\t\tParentObj.items[ propName ];\n\n\t\t\t\tvar alert = null;\n\t\t\t\tif ( objName === '' ) {\n\t\t\t\t\talert = mw.msg( 'visualdata-jsmodule-schemas-alert-noname' );\n\n\t\t\t\t\t// @see VisualDataFormField\n\t\t\t\t} else if ( objName !== parentSchema.wiki.name && objName in target ) {\n\t\t\t\t\talert = mw.msg( 'visualdata-jsmodule-schemas-alert-existing-item' );\n\t\t\t\t} else if (\n\t\t\t\t\t!Object.keys( currentItem.properties ).length\n\t\t\t\t\t//  && !Object.keys(currentItem.allOf).length &&\n\t\t\t\t\t// !Object.keys(currentItem.anyOf).length &&\n\t\t\t\t\t// !Object.keys(currentItem.oneOf).length\n\t\t\t\t) {\n\t\t\t\t\talert = mw.msg( 'visualdata-jsmodule-schemas-alert-no-properties' );\n\t\t\t\t}\n\n\t\t\t\tif ( alert ) {\n\t\t\t\t\tVisualDataFunctions.OOUIAlert( new OO.ui.HtmlSnippet( alert ), {\n\t\t\t\t\t\tsize: 'medium'\n\t\t\t\t\t} );\n\n\t\t\t\t\treturn ProcessDialog.super.prototype.getActionProcess.call(\n\t\t\t\t\t\tthis,\n\t\t\t\t\t\taction\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tVisualDataFunctions.renameObjectKey(\n\t\t\t\t\ttarget,\n\t\t\t\t\tparentSchema.wiki.name,\n\t\t\t\t\tobjName\n\t\t\t\t);\n\n\t\t\t\tvar updatedSchema = handleSaveArray( parentSchema, obj );\n\t\t\t\tupdatedSchema.type = !obj[ 'multiple-items' ] ? 'object' : 'array';\n\n\t\t\t\tvar panels = [\n\t\t\t\t\t'properties'\n\t\t\t\t\t// \"anyOf\",\n\t\t\t\t\t// \"oneOf\",\n\t\t\t\t\t// \"allOf\",\n\t\t\t\t\t// \"additionalProperties\",\n\t\t\t\t];\n\n\t\t\t\tvar target_ = !obj[ 'multiple-items' ] ?\n\t\t\t\t\tupdatedSchema :\n\t\t\t\t\tupdatedSchema.items;\n\n\t\t\t\tfor ( var panel of panels ) {\n\t\t\t\t\tif ( panel in target_ ) {\n\t\t\t\t\t\torderFields( target_[ panel ], panel );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\ttarget[ objName ] = updatedSchema;\n\t\t\t\tbreak;\n\t\t}\n\n\t\treturn new OO.ui.Process( () => {\n\t\t\tdialog.close( { action: action } );\n\t\t} );\n\n\t\t// return ProcessDialogNested.super.prototype.getActionProcess.call( this, action );\n\t};\n\n\tProcessDialogNested.prototype.getTeardownProcess = function ( data ) {\n\t\tvar self = this;\n\t\treturn ProcessDialogNested.super.prototype.getTeardownProcess\n\t\t\t.call( this, data )\n\t\t\t.first( () => {\n\t\t\t\tModels.pop();\n\t\t\t\tSelectedItems.pop();\n\t\t\t\tinitializeNestedDataTable( self.data.propName );\n\t\t\t\tWindowManager.removeActiveWindow();\n\t\t\t}, this );\n\t};\n\n\t/**\n\t * Override getBodyHeight to create a tall dialog relative to the screen.\n\t *\n\t * @return {number} Body height\n\t */\n\tProcessDialogNested.prototype.getBodyHeight = function () {\n\t\t// see here https://www.mediawiki.org/wiki/OOUI/Windows/Process_Dialogs\n\t\t// this.page1.content.$element.outerHeight( true );\n\t\treturn window.innerHeight - 100;\n\t};\n\n\tfunction PageOneLayout( name, config ) {\n\t\tPageOneLayout.super.call( this, name, config );\n\n\t\tvar currentItem = getCurrentItem();\n\n\t\tvar model = Models[ Models.length - 1 ];\n\n\t\tvar fieldset = new OO.ui.FieldsetLayout( {\n\t\t\tlabel: ''\n\t\t} );\n\n\t\t//  || currentItem.wiki.name\n\t\tvar nameInput = new OO.ui.TextInputWidget( {\n\t\t\tvalue: getPropertyValue( 'name' )\n\t\t} );\n\n\t\tmodel.name = nameInput;\n\n\t\tvar titleInput = new OO.ui.TextInputWidget( {\n\t\t\tvalue: getPropertyValue( 'title' )\n\t\t} );\n\n\t\tmodel.title = titleInput;\n\n\t\tvar descriptionInput = new OO.ui.MultilineTextInputWidget( {\n\t\t\tautosize: true,\n\t\t\trows: 2,\n\t\t\tvalue: getPropertyValue( 'description' )\n\t\t} );\n\n\t\tmodel.description = descriptionInput;\n\n\t\tvar messageWidget = new OO.ui.MessageWidget( {\n\t\t\ttype: 'info',\n\t\t\tlabel: new OO.ui.HtmlSnippet(\n\t\t\t\tmw.msg(\n\t\t\t\t\t'visualdata-jsmodule-formfield-message-schemapage',\n\t\t\t\t\t`${ Config.VisualDataSchemaUrl }${ getPropertyValue( 'name' ) }`\n\t\t\t\t)\n\t\t\t),\n\n\t\t\tinvisibleLabel: false,\n\t\t\tclasses: [ 'VisualDataFormFieldMessage' ]\n\t\t} );\n\n\t\tmessageWidget.toggle( currentItem.wiki.name !== '' );\n\n\t\tfieldset.addItems( [\n\t\t\tmessageWidget,\n\t\t\tnew OO.ui.FieldLayout( nameInput, {\n\t\t\t\tlabel: mw.msg( 'visualdata-jsmodule-schemas-name' ),\n\t\t\t\talign: 'top'\n\t\t\t} ),\n\n\t\t\tnew OO.ui.FieldLayout( titleInput, {\n\t\t\t\tlabel: mw.msg( 'visualdata-jsmodule-schemas-title' ),\n\t\t\t\thelp: mw.msg( 'visualdata-jsmodule-schemas-title-help' ),\n\t\t\t\talign: 'top',\n\t\t\t\thelpInline: true\n\t\t\t} ),\n\n\t\t\tnew OO.ui.FieldLayout( descriptionInput, {\n\t\t\t\tlabel: mw.msg( 'visualdata-jsmodule-schemas-description' ),\n\t\t\t\thelp: mw.msg( 'visualdata-jsmodule-schemas-description-help' ),\n\t\t\t\thelpInline: true,\n\t\t\t\talign: 'top'\n\t\t\t} )\n\n\t\t\t// new OO.ui.FieldLayout(collapsibleInput, {\n\t\t\t// \tlabel: mw.msg(\"visualdata-jsmodule-schemas-collapsible\"),\n\t\t\t// \talign: \"top\",\n\t\t\t// \thelp: mw.msg(\"visualdata-jsmodule-schemas-collapsible-help\"),\n\t\t\t// \thelpInline: true,\n\t\t\t// }),\n\n\t\t\t// new OO.ui.FieldLayout(collapsedInput, {\n\t\t\t// \tlabel: mw.msg(\"visualdata-jsmodule-schemas-collapsed\"),\n\t\t\t// \talign: \"top\",\n\t\t\t// \thelp: mw.msg(\"visualdata-jsmodule-schemas-collapsed-help\"),\n\t\t\t// \thelpInline: true,\n\t\t\t// }),\n\t\t] );\n\n\t\tthis.content = new OO.ui.PanelLayout( {\n\t\t\t$content: fieldset.$element,\n\t\t\tpadded: true,\n\t\t\texpanded: false\n\t\t} );\n\n\t\tthis.$element.append( this.content.$element );\n\t}\n\n\tOO.inheritClass( PageOneLayout, OO.ui.PageLayout );\n\n\tPageOneLayout.prototype.setupOutlineItem = function () {\n\t\tthis.outlineItem.setLabel(\n\t\t\tmw.msg( 'visualdata-jsmodule-dialog-main' )\n\t\t);\n\t};\n\n\tfunction parentSchemaContainer( model, self ) {\n\t\tif ( !self ) {\n\t\t\tvar self = VisualDataSchemas;\n\t\t}\n\t\tvar layout = new OO.ui.PanelLayout( {\n\t\t\texpanded: false,\n\t\t\tpadded: true,\n\t\t\tframed: true,\n\t\t\tclasses: []\n\t\t} );\n\t\tvar fieldset = new OO.ui.FieldsetLayout( {\n\t\t\tlabel: mw.msg( 'visualdata-jsmodule-schemas-container-schema' )\n\t\t} );\n\n\t\tlayout.$element.append( fieldset.$element );\n\n\t\tvar nameInput = new OO.ui.TextInputWidget( {\n\t\t\tvalue: self.getPropertyValue( 'name', 'parentSchema' )\n\t\t} );\n\n\t\tmodel.name = nameInput;\n\n\t\tvar titleInput = new OO.ui.TextInputWidget( {\n\t\t\tvalue: self.getPropertyValue( 'title', 'parentSchema' )\n\t\t} );\n\n\t\tmodel.title = titleInput;\n\n\t\tvar descriptionInput = new OO.ui.MultilineTextInputWidget( {\n\t\t\tautosize: true,\n\t\t\trows: 2,\n\t\t\tvalue: self.getPropertyValue( 'description', 'parentSchema' )\n\t\t} );\n\n\t\tmodel.description = descriptionInput;\n\n\t\t// @TODO\n\t\t// add:\n\t\t// min: number, at least: number\n\t\t// layout: section, horizontal, greed\n\t\t// collapsible: toggle\n\t\t// collasped: toggle\n\t\tvar minItemsInput = new OO.ui.NumberInputWidget( {\n\t\t\tvalue: self.getPropertyValue( 'min-items', 'parentSchema' ),\n\t\t\ttype: 'number'\n\t\t} );\n\t\tvar maxItemsInput = new OO.ui.NumberInputWidget( {\n\t\t\tvalue: self.getPropertyValue( 'max-items', 'parentSchema' ),\n\t\t\ttype: 'number'\n\t\t} );\n\n\t\tmodel[ 'min-items' ] = minItemsInput;\n\t\tmodel[ 'max-items' ] = maxItemsInput;\n\n\t\tvar uniqueItemsInput = new OO.ui.ToggleSwitchWidget( {\n\t\t\tvalue: self.getPropertyValue( 'unique-items', 'parentSchema' )\n\t\t} );\n\n\t\tmodel[ 'unique-items' ] = uniqueItemsInput;\n\n\t\tvar fieldMinItems = new OO.ui.FieldLayout( minItemsInput, {\n\t\t\tlabel: mw.msg( 'visualdata-jsmodule-schemas-min-items' ),\n\t\t\talign: 'top',\n\t\t\thelp: mw.msg( 'visualdata-jsmodule-schemas-min-items-help' ),\n\t\t\thelpInline: true\n\t\t} );\n\n\t\tvar fieldMaxItems = new OO.ui.FieldLayout( maxItemsInput, {\n\t\t\tlabel: mw.msg( 'visualdata-jsmodule-schemas-max-items' ),\n\t\t\talign: 'top',\n\t\t\thelp: mw.msg( 'visualdata-jsmodule-schemas-max-items-help' ),\n\t\t\thelpInline: true\n\t\t} );\n\n\t\tvar fieldUniqueItems = new OO.ui.FieldLayout( uniqueItemsInput, {\n\t\t\tlabel: mw.msg( 'visualdata-jsmodule-schemas-unique-items' ),\n\t\t\talign: 'top',\n\t\t\thelp: mw.msg( 'visualdata-jsmodule-schemas-unique-items-help' ),\n\t\t\thelpInline: true\n\t\t} );\n\n\t\tvar messageWidget = new OO.ui.MessageWidget( {\n\t\t\ttype: 'info',\n\t\t\tlabel: new OO.ui.HtmlSnippet(\n\t\t\t\tmw.msg(\n\t\t\t\t\t'visualdata-jsmodule-schemas-message-container-info'\n\t\t\t\t)\n\t\t\t),\n\n\t\t\tinvisibleLabel: false,\n\t\t\tclasses: [ 'VisualDataFormFieldMessage' ]\n\t\t} );\n\n\t\tfieldset.addItems( [\n\t\t\tmessageWidget,\n\n\t\t\tnew OO.ui.FieldLayout( nameInput, {\n\t\t\t\tlabel: mw.msg( 'visualdata-jsmodule-schemas-name' ),\n\t\t\t\talign: 'top'\n\t\t\t} ),\n\n\t\t\tnew OO.ui.FieldLayout( titleInput, {\n\t\t\t\tlabel: mw.msg( 'visualdata-jsmodule-schemas-title' ),\n\t\t\t\thelp: mw.msg( 'visualdata-jsmodule-schemas-title-help' ),\n\t\t\t\talign: 'top',\n\t\t\t\thelpInline: true\n\t\t\t} ),\n\n\t\t\tnew OO.ui.FieldLayout( descriptionInput, {\n\t\t\t\tlabel: mw.msg( 'visualdata-jsmodule-schemas-description' ),\n\t\t\t\thelp: mw.msg( 'visualdata-jsmodule-schemas-description-help' ),\n\t\t\t\thelpInline: true,\n\t\t\t\talign: 'top'\n\t\t\t} ),\n\t\t\tfieldMinItems,\n\t\t\tfieldMaxItems,\n\t\t\tfieldUniqueItems\n\t\t] );\n\n\t\treturn layout;\n\t}\n\n\tfunction PageOneLayoutNested( name, config ) {\n\t\tPageOneLayoutNested.super.call( this, name, config );\n\n\t\tvar currentItem = getCurrentItem();\n\t\tvar parentSchema = {};\n\n\t\t// array items can share the same schema for\n\t\t// all items, or to contain a tuple (to be an\n\t\t// array of items of fixed length)\n\t\t// in the first case, we consider the schema\n\t\t// being the child schema,\n\t\t// in the second case being the parent schema\n\t\t// (in the firse case, we will provide an\n\t\t// editable panel with the properties of the\n\t\t// parent schema)\n\t\tif (\n\t\t\tcurrentItem.type === 'array' &&\n\t\t\tVisualDataFunctions.isObject( currentItem.items )\n\t\t) {\n\t\t\tparentSchema = currentItem;\n\t\t\tcurrentItem = currentItem.items;\n\t\t}\n\n\t\tvar model = Models[ Models.length - 1 ];\n\n\t\tvar fieldset = new OO.ui.FieldsetLayout( {\n\t\t\tlabel: ''\n\t\t} );\n\n\t\t//  || currentItem.wiki.name\n\t\tvar nameInput = new OO.ui.TextInputWidget( {\n\t\t\tvalue: getPropertyValue( 'name' )\n\t\t} );\n\n\t\tmodel.name = nameInput;\n\n\t\tvar titleInput = new OO.ui.TextInputWidget( {\n\t\t\tvalue: getPropertyValue( 'title' )\n\t\t} );\n\n\t\tmodel.title = titleInput;\n\n\t\tvar descriptionInput = new OO.ui.MultilineTextInputWidget( {\n\t\t\tautosize: true,\n\t\t\trows: 2,\n\t\t\tvalue: getPropertyValue( 'description' )\n\t\t} );\n\n\t\tmodel.description = descriptionInput;\n\n\t\t// *** TODO, manage arrays and tuples\n\t\t// @see https://json-schema.org/understanding-json-schema/reference/array.html#tuple-validation\n\n\t\tvar multipleItemsInputValue =\n\t\t\tgetPropertyValue( 'multiple-items' ) || parentSchema.type === 'array';\n\n\t\tvar multipleItemsInput = new OO.ui.ToggleSwitchWidget( {\n\t\t\tvalue: multipleItemsInputValue\n\t\t} );\n\n\t\tmodel[ 'multiple-items' ] = multipleItemsInput;\n\n\t\tvar layoutParentSchema = parentSchemaContainer( ( model.parentSchema = {} ) );\n\t\tlayoutParentSchema.toggle( multipleItemsInputValue );\n\t\tnameInput.setDisabled( multipleItemsInputValue );\n\n\t\tmultipleItemsInput.on( 'change', ( enabled ) => {\n\t\t\tlayoutParentSchema.toggle( enabled );\n\t\t\tnameInput.setDisabled( enabled );\n\t\t} );\n\n\t\t// var layout = new OO.ui.HorizontalLayout( {\n\t\t// \titems: [ minInstancesInput, maxInstancesInput ]\n\t\t// } );\n\n\t\tvar layoutInput = new OO.ui.DropdownInputWidget( {\n\t\t\toptions: VisualDataFunctions.createDropDownOptions( {\n\t\t\t\tsection: mw.msg( 'visualdata-jsmodule-schemas-layout-section' ),\n\t\t\t\thorizontal: mw.msg( 'visualdata-jsmodule-schemas-layout-horizontal' )\n\t\t\t\t// 'grid': mw.msg(\n\t\t\t\t// \t'visualdata-jsmodule-forms-freetext-showalways'\n\t\t\t\t// )\n\t\t\t} ),\n\t\t\tvalue: getPropertyValue( 'layout' ) || 'section'\n\t\t} );\n\n\t\tmodel.layout = layoutInput;\n\n\t\tfieldset.addItems( [\n\t\t\tnew OO.ui.FieldLayout( nameInput, {\n\t\t\t\tlabel: mw.msg( 'visualdata-jsmodule-schemas-name' ),\n\t\t\t\talign: 'top'\n\t\t\t} ),\n\n\t\t\tnew OO.ui.FieldLayout( titleInput, {\n\t\t\t\tlabel: mw.msg( 'visualdata-jsmodule-schemas-title' ),\n\t\t\t\thelp: mw.msg( 'visualdata-jsmodule-schemas-title-help' ),\n\t\t\t\talign: 'top',\n\t\t\t\thelpInline: true\n\t\t\t} ),\n\n\t\t\tnew OO.ui.FieldLayout( descriptionInput, {\n\t\t\t\tlabel: mw.msg( 'visualdata-jsmodule-schemas-description' ),\n\t\t\t\talign: 'top'\n\t\t\t} ),\n\n\t\t\tnew OO.ui.FieldLayout( multipleItemsInput, {\n\t\t\t\tlabel: mw.msg( 'visualdata-jsmodule-schemas-multiple-items' ),\n\t\t\t\talign: 'top',\n\t\t\t\thelp: mw.msg( 'visualdata-jsmodule-schemas-multiple-items-help' ),\n\t\t\t\t// 'Toggle on to allow multiple items', // mw.msg(),\n\t\t\t\thelpInline: true\n\t\t\t} ),\n\n\t\t\tlayoutParentSchema,\n\n\t\t\tnew OO.ui.FieldLayout( layoutInput, {\n\t\t\t\tlabel: mw.msg( 'visualdata-jsmodule-schemas-layout' ),\n\t\t\t\talign: 'top',\n\t\t\t\thelp: mw.msg( 'visualdata-jsmodule-schemas-layout-help' ),\n\t\t\t\thelpInline: true\n\t\t\t} )\n\t\t] );\n\n\t\tthis.content = new OO.ui.PanelLayout( {\n\t\t\t$content: fieldset.$element,\n\t\t\tpadded: true,\n\t\t\texpanded: false\n\t\t} );\n\n\t\tthis.$element.append( this.content.$element );\n\t}\n\n\tOO.inheritClass( PageOneLayoutNested, OO.ui.PageLayout );\n\n\tPageOneLayoutNested.prototype.setupOutlineItem = function () {\n\t\tthis.outlineItem.setLabel(\n\t\t\tmw.msg( 'visualdata-jsmodule-dialog-main' )\n\t\t);\n\t};\n\n\tfunction openDialog( schema, propName, initialTab ) {\n\t\tif ( !schema ) {\n\t\t\tSelectedItems.push( {\n\t\t\t\tproperties: {},\n\n\t\t\t\t// treat as objects\n\t\t\t\t// items: {},\n\t\t\t\t// anyOf: {},\n\t\t\t\t// oneOf: {},\n\t\t\t\t// allOf: {},\n\n\t\t\t\t// additionalProperties: {},\n\t\t\t\twiki: { name: '' }\n\t\t\t} );\n\t\t} else {\n\t\t\tSelectedItems.push(\n\t\t\t\tObject.assign(\n\t\t\t\t\t{\n\t\t\t\t\t\tproperties: {},\n\n\t\t\t\t\t\t// treat as objects\n\t\t\t\t\t\t// items: {},\n\t\t\t\t\t\t// anyOf: {},\n\t\t\t\t\t\t// oneOf: {},\n\t\t\t\t\t\t// allOf: {},\n\t\t\t\t\t\t// additionalProperties: {},\n\t\t\t\t\t\twiki: {}\n\t\t\t\t\t},\n\t\t\t\t\tschema\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\n\t\tModels.push( { parentSchema: {} } );\n\n\t\t// *** place here properties to copy\n\t\tif ( 'uuid' in SelectedItems[ SelectedItems.length - 1 ].wiki ) {\n\t\t\tModels[ Models.length - 1 ].uuid = new VisualDataFunctions.MockupOOUIClass(\n\t\t\t\tschema.wiki.uuid );\n\t\t}\n\n\t\tvar processDialog;\n\t\tvar title;\n\n\t\tif ( !propName ) {\n\t\t\tprocessDialog = new ProcessDialog( {\n\t\t\t\tsize: 'larger',\n\t\t\t\tid: 'visualdata-ProcessDialogEditData'\n\t\t\t} );\n\n\t\t\ttitle =\n\t\t\t\tmw.msg(\n\t\t\t\t\t// The following messages are used here:\n\t\t\t\t\t// * visualdata-jsmodule-schemas-defineschema\n\t\t\t\t\t// * visualdata-jsmodule-schemas-defineschema - [name]\n\t\t\t\t\t'visualdata-jsmodule-schemas-defineschema'\n\t\t\t\t) + ( name ? ' - ' + name : '' );\n\t\t} else {\n\t\t\tprocessDialog = new ProcessDialogNested( {\n\t\t\t\tsize: 'larger',\n\t\t\t\tid: 'visualdata-ProcessDialogEditProperties',\n\t\t\t\tdata: { propName: propName }\n\t\t\t} );\n\n\t\t\ttitle =\n\t\t\t\tmw.msg(\n\t\t\t\t\t// The following messages are used here:\n\t\t\t\t\t// * visualdata-jsmodule-schemas-defineschema\n\t\t\t\t\t// * visualdata-jsmodule-schemas-defineschema - [name]\n\t\t\t\t\t'visualdata-jsmodule-schemas-defineschema'\n\t\t\t\t) + ( name ? ' - ' + name : '' );\n\t\t}\n\n\t\tWindowManager.newWindow( processDialog, { title: title, initialTab: initialTab || 'main' } );\n\n\t\tif ( !Config.jsonDiffLibrary && !mw.cookie.get( 'visualdata-check-json-diff-library' ) ) {\n\t\t\tVisualDataFunctions.OOUIAlert( new OO.ui.HtmlSnippet( mw.msg( 'visualdata-jsmodule-missing-json-diff-library' ) ), {\n\t\t\t\tsize: 'medium',\n\t\t\t\tactions: [ OO.ui.MessageDialog.static.actions[ 0 ] ]\n\t\t\t}, () => {\n\t\t\t\t// 15 days\n\t\t\t\tvar timeLapse = 15 * 86400;\n\t\t\t\tmw.cookie.set( 'visualdata-check-json-diff-library', true, {\n\t\t\t\t\tpath: '/',\n\t\t\t\t\texpires: timeLapse\n\t\t\t\t} );\n\t\t\t} );\n\t\t}\n\t}\n\n\t// function escape( s ) {\n\t// \treturn String( s )\n\t// \t\t.replace( /&/g, '&amp;' )\n\t// \t\t.replace( /</g, '&lt;' )\n\t// \t\t.replace( />/g, '&gt;' )\n\t// \t\t.replace( /\"/g, '&quot;' )\n\t// \t\t.replace( /'/g, '&#039;' );\n\t// }\n\n\tfunction initializeDataTable() {\n\t\tVisualDataFunctions.destroyDataTable(\n\t\t\t'visualdata-schemas-datatable'\n\t\t);\n\n\t\tvar data = [];\n\t\tfor ( var i in Schemas ) {\n\t\t\tvar value = Schemas[ i ];\n\n\t\t\t// *** or use https://datatables.net/manual/data/renderers#Text-helper\n\t\t\tdata.push( [\n\t\t\t\ti,\n\t\t\t\t'properties' in value ? Object.keys( value.properties ).join( ', ' ) : ''\n\t\t\t] );\n\t\t}\n\n\t\tDataTable = $( '#visualdata-schemas-datatable' ).DataTable( {\n\t\t\torder: 1,\n\t\t\tpageLength: 20,\n\n\t\t\t// https://datatables.net/reference/option/dom\n\t\t\tdom: '<\"visualdata-datatable-left\"f><\"visualdata-datatable-right\"l>rtip',\n\t\t\tlengthMenu: [ 10, 20, 50, 100, 200 ],\n\t\t\t// lengthChange: false,\n\t\t\tdata: data,\n\t\t\tstateSave: true,\n\t\t\tcolumns: mw\n\t\t\t\t.msg( 'visualdata-jsmodule-schemas-columns' )\n\t\t\t\t.split( /\\s*,\\s*/ )\n\t\t\t\t.map( ( x ) => ( { title: x } ) )\n\t\t} );\n\n\t\tDataTable.on( 'click', 'tr', function () {\n\t\t\tvar index = DataTable.row( this ).index();\n\t\t\tif ( index !== undefined ) {\n\t\t\t\tvar label = data[ index ][ 0 ];\n\t\t\t\topenSchemaDialog( label, false );\n\t\t\t}\n\t\t} );\n\t}\n\n\tfunction openSchemaDialog( label, initialTab ) {\n\t\tif ( !Object.keys( Schemas[ label ] ).length ) {\n\t\t\tVisualData.loadSchemas( [ label ] ).then( ( schemas ) => {\n\t\t\t\tfor ( var i in schemas ) {\n\t\t\t\t\tSchemas[ i ] = schemas[ i ];\n\t\t\t\t}\n\t\t\t\topenDialog( Schemas[ label ], null, initialTab );\n\t\t\t} );\n\t\t} else {\n\t\t\topenDialog( Schemas[ label ], null, initialTab );\n\t\t}\n\t}\n\n\tfunction createToolbarB( panelName ) {\n\t\tvar toolFactory = new OO.ui.ToolFactory();\n\t\tvar toolGroupFactory = new OO.ui.ToolGroupFactory();\n\n\t\tvar toolbar = new OO.ui.Toolbar( toolFactory, toolGroupFactory, {\n\t\t\tactions: true\n\t\t} );\n\n\t\tvar currentItem = getCurrentItem();\n\t\t// var propName = currentItem.type === \"array\" ? \"items\" : panelName;\n\t\tvar propName = panelName;\n\n\t\tvar onSelect = function () {\n\t\t\tvar toolName = this.getName();\n\n\t\t\tvar callback = function () {\n\t\t\t\tinitializeNestedDataTable( panelName );\n\t\t\t};\n\t\t\tswitch ( toolName ) {\n\t\t\t\tcase 'add-geolocation':\n\t\t\t\t\tVisualDataGeolocationInst.openDialog(\n\t\t\t\t\t\tcallback,\n\t\t\t\t\t\tcurrentItem.type !== 'array' ?\n\t\t\t\t\t\t\tcurrentItem[ propName ] :\n\t\t\t\t\t\t\tcurrentItem.items[ propName ]\n\t\t\t\t\t);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'add-block-content':\n\t\t\t\t\tVisualDataContentBlockInst.openDialog(\n\t\t\t\t\t\tcallback,\n\t\t\t\t\t\tcurrentItem.type !== 'array' ?\n\t\t\t\t\t\t\tcurrentItem[ propName ] :\n\t\t\t\t\t\t\tcurrentItem.items[ propName ]\n\t\t\t\t\t);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'add-field':\n\t\t\t\t\tVisualDataFormFieldInst.openDialog(\n\t\t\t\t\t\tcallback,\n\t\t\t\t\t\tcurrentItem.type !== 'array' ?\n\t\t\t\t\t\t\tcurrentItem[ propName ] :\n\t\t\t\t\t\t\tcurrentItem.items[ propName ]\n\t\t\t\t\t);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'add-subitem':\n\t\t\t\t\topenDialog( null, propName );\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tthis.setActive( false );\n\t\t};\n\n\t\tvar toolGroup = [\n\t\t\t{\n\t\t\t\tname: 'add-field',\n\t\t\t\ticon: 'add',\n\t\t\t\ttitle: mw.msg( 'visualdata-jsmodule-schemas-add-field' ),\n\t\t\t\tonSelect: onSelect\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'add-block-content',\n\t\t\t\ticon: 'add',\n\t\t\t\ttitle: mw.msg( 'visualdata-jsmodule-schemas-add-block-content' ),\n\t\t\t\tonSelect: onSelect\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'add-subitem',\n\t\t\t\ticon: 'add',\n\t\t\t\ttitle: mw.msg( 'visualdata-jsmodule-schemas-add-subitem' ),\n\t\t\t\tonSelect: onSelect\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'add-geolocation',\n\t\t\t\ticon: 'add',\n\t\t\t\ttitle: mw.msg( 'visualdata-jsmodule-schemas-add-geolocation' ),\n\t\t\t\tonSelect: onSelect\n\t\t\t}\n\t\t];\n\t\tVisualDataFunctions.createToolGroup( toolFactory, 'group', toolGroup );\n\n\t\ttoolbar.setup( [\n\t\t\t{\n\t\t\t\tname: 'my-group',\n\t\t\t\t// type: \"bar\",\n\t\t\t\t// label: \"Create property\",\n\t\t\t\tinclude: [ { group: 'group' } ]\n\t\t\t}\n\t\t] );\n\n\t\treturn toolbar;\n\t}\n\n\tfunction createToolbarA() {\n\t\tvar toolFactory = new OO.ui.ToolFactory();\n\t\tvar toolGroupFactory = new OO.ui.ToolGroupFactory();\n\n\t\tvar toolbar = new OO.ui.Toolbar( toolFactory, toolGroupFactory, {\n\t\t\tactions: true\n\t\t} );\n\n\t\tvar onSelect = function () {\n\t\t\tvar toolName = this.getName();\n\n\t\t\tswitch ( toolName ) {\n\t\t\t\tcase 'createschema':\n\t\t\t\t\topenDialog( null, null );\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tthis.setActive( false );\n\t\t};\n\n\t\tvar toolGroup = [\n\t\t\t{\n\t\t\t\tname: 'createschema',\n\t\t\t\ticon: 'add',\n\t\t\t\ttitle: mw.msg( 'visualdata-jsmodule-schemas-create-schema' ),\n\t\t\t\tonSelect: onSelect\n\t\t\t}\n\t\t];\n\t\tVisualDataFunctions.createToolGroup( toolFactory, 'group', toolGroup );\n\n\t\ttoolbar.setup( [\n\t\t\t{\n\t\t\t\tname: 'my-group',\n\t\t\t\t// type: \"bar\",\n\t\t\t\t// label: \"Create property\",\n\t\t\t\tinclude: [ { group: 'group' } ]\n\t\t\t}\n\t\t] );\n\n\t\treturn toolbar;\n\t}\n\n\tfunction initialize() {\n\t\tif ( Config.context === 'ManageSchemas' ) {\n\t\t\t$( '#schemas-wrapper' ).empty();\n\n\t\t\tvar contentFrame = new OO.ui.PanelLayout( {\n\t\t\t\t$content: $(\n\t\t\t\t\t'<table id=\"visualdata-schemas-datatable\" class=\"visualdata-datatable display\" width=\"100%\"></table>'\n\t\t\t\t),\n\t\t\t\texpanded: false,\n\t\t\t\tpadded: true\n\t\t\t} );\n\n\t\t\tvar toolbar = createToolbarA();\n\n\t\t\tvar frame = new OO.ui.PanelLayout( {\n\t\t\t\t$content: [ toolbar.$element, contentFrame.$element ],\n\t\t\t\texpanded: false,\n\t\t\t\tframed: true,\n\t\t\t\tdata: { name: 'manage-schemas' }\n\t\t\t} );\n\n\t\t\t$( '#schemas-wrapper' ).append( frame.$element );\n\n\t\t\ttoolbar.initialize();\n\t\t\ttoolbar.emit( 'updateState' );\n\t\t}\n\n\t\tinitializeDataTable();\n\t}\n\n\tfunction setVars( config, windowManager, schemas, visualDataForms ) {\n\t\tConfig = config;\n\t\tWindowManager = windowManager;\n\t\tSchemas = schemas;\n\t\tVisualDataForms = visualDataForms;\n\n\t\tVisualDataFormFieldInst = new VisualDataFormField(\n\t\t\tconfig,\n\t\t\twindowManager,\n\t\t\tSchemas\n\t\t);\n\t\tVisualDataContentBlockInst = new VisualDataContentBlock(\n\t\t\tconfig,\n\t\t\twindowManager\n\t\t);\n\t\tVisualDataGeolocationInst = new VisualDataGeolocation(\n\t\t\tconfig,\n\t\t\twindowManager\n\t\t);\n\t}\n\n\treturn {\n\t\tinitialize,\n\t\tcreateToolbarA,\n\t\topenDialog,\n\t\tparentSchemaContainer,\n\t\tgetPropertyValue,\n\t\tgetCurrentItem,\n\t\tgetModel,\n\t\thandleSaveArray,\n\t\tgetWidgetValue,\n\t\topenSchemaDialog,\n\t\tsetVars\n\t};\n}() );\n\n$( () => {\n\tvar config = JSON.parse( mw.config.get( 'visualdata-config' ) );\n\t// console.log(\"config\", config);\n\n\tif ( config.context === 'ManageSchemas' ) {\n\t\tvar schemas = JSON.parse( mw.config.get( 'visualdata-schemas' ) );\n\t\t// console.log(\"schemas\", schemas);\n\n\t\tvar windowManager = new VisualDataWindowManager();\n\t\tvar instances = [];\n\t\tVisualData.setVars( config, schemas, instances );\n\n\t\tVisualDataSchemas.setVars(\n\t\t\tconfig,\n\t\t\twindowManager,\n\t\t\tschemas,\n\t\t\tinstances\n\t\t);\n\n\t\tVisualDataSchemas.initialize();\n\t}\n\n} );\n","usedDeprecatedRules":[{"ruleId":"max-len","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/VisualDataUpload.js","messages":[],"suppressedMessages":[{"ruleId":"no-implicit-globals","severity":2,"message":"Global variable leak, declare the variable if it is intended to be local.","line":26,"column":2,"nodeType":"AssignmentExpression","messageId":"globalVariableLeak","endLine":32,"endColumn":3,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-console","severity":2,"message":"Unexpected console statement.","line":105,"column":6,"nodeType":"MemberExpression","messageId":"unexpected","endLine":105,"endColumn":19,"suggestions":[{"messageId":"removeConsole","data":{"propertyName":"error"},"fix":{"range":[3090,3136],"text":""},"desc":"Remove the console.error()."}],"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"max-len","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/VisualDataWindowManager.js","messages":[],"suppressedMessages":[{"ruleId":"no-implicit-globals","severity":2,"message":"Global variable leak, declare the variable if it is intended to be local.","line":25,"column":1,"nodeType":"AssignmentExpression","messageId":"globalVariableLeak","endLine":62,"endColumn":2,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"max-len","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/Widgets/VisualDataButtonMultiselectWidget.js","messages":[{"ruleId":"no-jquery/no-in-array","severity":1,"message":"Prefer Array#indexOf to $.inArray","line":48,"column":12,"nodeType":"CallExpression","endLine":48,"endColumn":59}],"suppressedMessages":[{"ruleId":"no-implicit-globals","severity":2,"message":"Global variable leak, declare the variable if it is intended to be local.","line":24,"column":2,"nodeType":"AssignmentExpression","messageId":"globalVariableLeak","endLine":59,"endColumn":3,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/**\n * This file is part of the MediaWiki extension VisualData.\n *\n * VisualData is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 2 of the License, or\n * (at your option) any later version.\n *\n * VisualData is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with VisualData. If not, see <http://www.gnu.org/licenses/>.\n *\n * @file\n * @author thomas-topway-it <support@topway.it>\n * @copyright Copyright © 2021-2023, https://wikisphere.org\n */\n\n( function () {\n\t// eslint-disable-next-line no-implicit-globals\n\tVisualDataButtonMultiselectWidget = function ( config ) {\n\t\tconfig = config || {};\n\n\t\tif ( !( 'classes' in config ) ) {\n\t\t\tconfig.classes = [];\n\t\t}\n\n\t\tthis.options = {};\n\t\tfor ( var value of config.options ) {\n\t\t\tthis.options[ [ value.data ] ] = value.label;\n\t\t}\n\n\t\t// ***important, add position: relative to display\n\t\t// property native validation\n\t\tconfig.classes.push( 'visualdata-button-multiselect-widget' );\n\n\t\tVisualDataButtonMultiselectWidget.super.call( this, config );\n\n\t\tvar self = this;\n\t\tthis.items = {};\n\t\tfor ( var i in this.options ) {\n\t\t\tthis.items[ i ] = new OO.ui.ToggleButtonWidget( {\n\t\t\t\tdata: i,\n\t\t\t\tlabel: this.options[ i ],\n\t\t\t\tvalue: $.inArray( this.options[ i ], config.selected ) !== -1\n\t\t\t} );\n\n\t\t\tthis.items[ i ].on( 'change', () => {\n\t\t\t\tself.emit( 'change', self.getValue().join().trim() );\n\t\t\t} );\n\t\t}\n\n\t\tfor ( var i in this.items ) {\n\t\t\tthis.$element.append( this.items[ i ].$element );\n\t\t}\n\t};\n\n\tOO.inheritClass( VisualDataButtonMultiselectWidget, OO.ui.Widget );\n\tOO.mixinClass( VisualDataButtonMultiselectWidget, OO.EventEmitter );\n\n\tVisualDataButtonMultiselectWidget.prototype.getValue = function () {\n\t\tvar ret = [];\n\t\tfor ( var i in this.items ) {\n\t\t\tif ( this.items[ i ].getValue() ) {\n\t\t\t\tret.push( this.options[ i ] );\n\t\t\t}\n\t\t}\n\t\treturn ret;\n\t};\n}() );\n","usedDeprecatedRules":[{"ruleId":"max-len","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/Widgets/VisualDataDropdownWidget.js","messages":[{"ruleId":"no-jquery/variable-pattern","severity":1,"message":"jQuery collection names must match the variablePattern","line":38,"column":7,"nodeType":"VariableDeclarator","endLine":38,"endColumn":71},{"ruleId":"no-jquery/variable-pattern","severity":1,"message":"jQuery collection names must match the variablePattern","line":53,"column":7,"nodeType":"VariableDeclarator","endLine":59,"endColumn":21}],"suppressedMessages":[{"ruleId":"no-implicit-globals","severity":2,"message":"Global variable leak, declare the variable if it is intended to be local.","line":24,"column":2,"nodeType":"AssignmentExpression","messageId":"globalVariableLeak","endLine":62,"endColumn":3,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":2,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/**\n * This file is part of the MediaWiki extension VisualData.\n *\n * VisualData is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 2 of the License, or\n * (at your option) any later version.\n *\n * VisualData is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with VisualData. If not, see <http://www.gnu.org/licenses/>.\n *\n * @file\n * @author thomas-topway-it <support@topway.it>\n * @copyright Copyright © 2021-2023, https://wikisphere.org\n */\n\n( function () {\n\t// eslint-disable-next-line no-implicit-globals\n\tVisualDataDropdownWidget = function ( config ) {\n\t\tconfig = config || {};\n\n\t\tif ( !( 'classes' in config ) ) {\n\t\t\tconfig.classes = [];\n\t\t}\n\t\tvar self = this;\n\n\t\tconfig.classes.push( 'visualdata-dropdown-widget' );\n\n\t\tVisualDataDropdownWidget.super.call( this, config );\n\n\t\tvar options = config.options;\n\n\t\tvar select = $( '<select>' ).attr( 'class', 'oo-ui-indicator-down' );\n\t\tfor ( var option of options ) {\n\t\t\tselect.append(\n\t\t\t\t$( '<option>' )\n\t\t\t\t\t.attr( { value: option.data, selected: option.data === config.value } )\n\t\t\t\t\t.text( option.label )\n\t\t\t);\n\t\t}\n\n\t\tthis.select = select;\n\n\t\tselect.on( 'change', () => {\n\t\t\tself.emit( 'change', self.getValue() );\n\t\t} );\n\n\t\tvar div = $( '<div>' )\n\t\t\t.attr(\n\t\t\t\t'class',\n\t\t\t\t'oo-ui-widget oo-ui-widget-enabled oo-ui-inputWidget oo-ui-dropdownInputWidget'\n\t\t\t)\n\n\t\t\t.append( select );\n\n\t\tthis.$element.append( div );\n\t};\n\n\tOO.inheritClass( VisualDataDropdownWidget, OO.ui.Widget );\n\tOO.mixinClass( VisualDataDropdownWidget, OO.EventEmitter );\n\n\tVisualDataDropdownWidget.prototype.getValue = function () {\n\t\treturn this.select.val();\n\t};\n}() );\n","usedDeprecatedRules":[{"ruleId":"max-len","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/Widgets/VisualDataLookupElement.js","messages":[],"suppressedMessages":[{"ruleId":"no-implicit-globals","severity":2,"message":"Global variable leak, declare the variable if it is intended to be local.","line":24,"column":2,"nodeType":"AssignmentExpression","messageId":"globalVariableLeak","endLine":29,"endColumn":3,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"max-len","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/Widgets/VisualDataMaptiler.js","messages":[{"ruleId":"max-len","severity":1,"message":"This line has a length of 119. Maximum allowed is 100.","line":61,"column":1,"nodeType":"Program","messageId":"max","endLine":61,"endColumn":111}],"suppressedMessages":[{"ruleId":"no-implicit-globals","severity":2,"message":"Global variable leak, declare the variable if it is intended to be local.","line":26,"column":2,"nodeType":"AssignmentExpression","messageId":"globalVariableLeak","endLine":31,"endColumn":3,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'config' is defined but never used.","line":26,"column":34,"nodeType":"Identifier","messageId":"unusedVar","endLine":26,"endColumn":40,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'self' is assigned a value but never used.","line":38,"column":7,"nodeType":"Identifier","messageId":"unusedVar","endLine":38,"endColumn":11,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'e' is defined but never used.","line":47,"column":52,"nodeType":"Identifier","messageId":"unusedVar","endLine":47,"endColumn":53,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'res' is defined but never used.","line":82,"column":26,"nodeType":"Identifier","messageId":"unusedVar","endLine":82,"endColumn":29,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'res' is defined but never used.","line":88,"column":40,"nodeType":"Identifier","messageId":"unusedVar","endLine":88,"endColumn":43,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'res' is defined but never used.","line":99,"column":36,"nodeType":"Identifier","messageId":"unusedVar","endLine":99,"endColumn":39,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'res' is defined but never used.","line":103,"column":46,"nodeType":"Identifier","messageId":"unusedVar","endLine":103,"endColumn":49,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'res' is defined but never used.","line":107,"column":46,"nodeType":"Identifier","messageId":"unusedVar","endLine":107,"endColumn":49,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/**\n * This file is part of the MediaWiki extension VisualData.\n *\n * VisualData is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 2 of the License, or\n * (at your option) any later version.\n *\n * VisualData is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with VisualData. If not, see <http://www.gnu.org/licenses/>.\n *\n * @file\n * @author thomas-topway-it <support@topway.it>\n * @copyright Copyright © 2024, https://wikisphere.org\n */\n\n/* eslint-disable no-unused-vars */\n\n( function () {\n\t// eslint-disable-next-line no-implicit-globals\n\tVisualDataMaptiler = function ( config ) {\n\t\tthis.scripts = [\n\t\t\t'https://cdn.maptiler.com/maptiler-sdk-js/v1.2.0/maptiler-sdk.umd.min.js',\n\t\t\t'https://cdn.maptiler.com/maptiler-geocoding-control/v1.2.0/maptilersdk.umd.js'\n\t\t];\n\t};\n\n\tVisualDataMaptiler.prototype.load = function () {\n\t\tVisualDataFunctions.loadScripts( this.scripts );\n\t};\n\n\tVisualDataMaptiler.prototype.initialize = function ( $element, data ) {\n\t\tvar self = this;\n\n\t\t// *** prevents ajv error \"Maximum call stack size exceeded\"\n\t\tvar config = VisualDataFunctions.deepCopy( data.schema.wiki );\n\t\tvar latInput = data.model.properties.latitude.input;\n\t\tvar lngInput = data.model.properties.longitude.input;\n\t\tvar zoomInput = data.model.properties.zoom.input;\n\t\tvar mapId = 'visualdata-maptiler-map-' + data.path;\n\n\t\tVisualDataFunctions.loadScripts( this.scripts, ( e ) => {\n\t\t\tif ( $( '#' + jQuery.escapeSelector( mapId ) ).length ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tmaptilersdk.config.apiKey = mw.config.get( 'visualdata-maptiler-apikey' );\n\t\t\tvar $container = $( '<div style=\"width:100%;height:400px\" id=\"' + mapId + '\" />' );\n\t\t\t$element.append( $container );\n\n\t\t\tconfig[ 'maptiler-map-config' ].container = mapId;\n\t\t\tconfig[ 'maptiler-map-config' ].style = maptilersdk.MapStyle.HYBRID;\n\n\t\t\tvar center = [ parseFloat( lngInput.getValue() ), parseFloat( latInput.getValue() ) ];\n\n\t\t\tvar isValidCenter = !VisualDataFunctions.isNaN( center[ 0 ] ) && !VisualDataFunctions.isNaN( center[ 1 ] );\n\n\t\t\tif ( isValidCenter ) {\n\t\t\t\tconfig[ 'maptiler-map-config' ].center = center;\n\t\t\t\tconfig[ 'maptiler-map-config' ].zoom = parseInt( zoomInput.getValue() );\n\t\t\t\tconfig[ 'maptiler-map-config' ].geolocate = false;\n\n\t\t\t} else {\n\t\t\t\tif ( !( 'geolocate' in config[ 'maptiler-map-config' ] ) ) {\n\t\t\t\t\tconfig[ 'maptiler-map-config' ].geolocate = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst map = ( window.map = new maptilersdk.Map( config[ 'maptiler-map-config' ] ) );\n\t\t\tconfig[ 'maptiler-map-config' ].marker = false;\n\n\t\t\tvar marker;\n\n\t\t\tif ( config[ 'reverse-geocoding' ] ) {\n\t\t\t\tconst gc = new maptilersdkMaptilerGeocoder.GeocodingControl( config[ 'maptiler-map-config' ] );\n\n\t\t\t\tmap.on( 'zoomend', ( res ) => {\n\t\t\t\t\t// console.log('zoomend:', res);\n\t\t\t\t\tzoomInput.setValue( map.getZoom() );\n\t\t\t\t} );\n\n\t\t\t\t// https://docs.maptiler.com/sdk-js/modules/geocoding/api/api-reference/#event:featuresListed\n\t\t\t\tgc.addEventListener( 'response', ( res ) => {\n\t\t\t\t\t// console.log(\"response:\", res);\n\t\t\t\t} );\n\n\t\t\t\tgc.addEventListener( 'select', ( res ) => {\n\t\t\t\t\t// console.log(\"select:\", res );\n\t\t\t\t\tif ( res.detail ) {\n\t\t\t\t\t\tmarker.setLngLat( res.detail.center );\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\t\tgc.addEventListener( 'pick', ( res ) => {\n\t\t\t\t\t// console.log(\"pick:\", res );\n\t\t\t\t} );\n\n\t\t\t\tgc.addEventListener( 'featuresListed', ( res ) => {\n\t\t\t\t\t// console.log(\"featuresListed:\", res);\n\t\t\t\t} );\n\n\t\t\t\tgc.addEventListener( 'featuresMarked', ( res ) => {\n\t\t\t\t\t// console.log(\"featuresMarked:\", res);\n\t\t\t\t} );\n\n\t\t\t\tmap.addControl( gc, 'top-left' );\n\t\t\t}\n\n\t\t\tfunction onDragEnd() {\n\t\t\t\tvar lngLat = marker.getLngLat();\n\t\t\t\tsetTimeout( () => {\n\t\t\t\t\tlngInput.setValue( lngLat.lng );\n\t\t\t\t\tlatInput.setValue( lngLat.lat );\n\t\t\t\t\tzoomInput.setValue( map.getZoom() );\n\t\t\t\t}, 100 );\n\t\t\t}\n\n\t\t\tmap.on( 'load', () => {\n\t\t\t\tif ( !marker ) {\n\t\t\t\t\tmarker = new maptilersdk.Marker( {\n\t\t\t\t\t\tdraggable: true\n\t\t\t\t\t} )\n\t\t\t\t\t\t.setLngLat( map.getCenter() )\n\t\t\t\t\t\t.addTo( map );\n\n\t\t\t\t\tmarker.on( 'dragend', onDragEnd );\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\tif ( isValidCenter ) {\n\t\t\t\tmarker = new maptilersdk.Marker( {\n\t\t\t\t\tdraggable: true\n\t\t\t\t} )\n\t\t\t\t\t.setLngLat( center )\n\t\t\t\t\t.addTo( map );\n\n\t\t\t\tmarker.on( 'dragend', onDragEnd );\n\t\t\t}\n\n\t\t\t// update marker\n\t\t\tdata.model.properties.latitude.input.on( 'change', ( value ) => {\n\t\t\t\tmarker.setLngLat( [ lngInput.getValue(), value ] );\n\t\t\t} );\n\t\t\tdata.model.properties.longitude.input.on( 'change', ( value ) => {\n\t\t\t\tmarker.setLngLat( [ value, latInput.getValue() ] );\n\t\t\t} );\n\n\t\t} );\n\t};\n\n}() );\n","usedDeprecatedRules":[{"ruleId":"max-len","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/Widgets/VisualDataMenuTagSearchMultiselect.js","messages":[{"ruleId":"jsdoc/check-tag-names","severity":1,"message":"Invalid JSDoc tag name \"mixins\".","line":29,"column":1,"nodeType":"Block","endLine":29,"endColumn":1},{"ruleId":"max-len","severity":1,"message":"This line has a length of 110. Maximum allowed is 100.","line":49,"column":1,"nodeType":"Program","messageId":"max","endLine":49,"endColumn":99},{"ruleId":"max-len","severity":1,"message":"This line has a length of 107. Maximum allowed is 100.","line":50,"column":1,"nodeType":"Program","messageId":"max","endLine":50,"endColumn":96}],"suppressedMessages":[{"ruleId":"no-implicit-globals","severity":2,"message":"Global variable leak, declare the variable if it is intended to be local.","line":37,"column":2,"nodeType":"AssignmentExpression","messageId":"globalVariableLeak","endLine":71,"endColumn":3,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":3,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/**\n * This file is part of the MediaWiki extension VisualData.\n *\n * VisualData is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 2 of the License, or\n * (at your option) any later version.\n *\n * VisualData is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with VisualData. If not, see <http://www.gnu.org/licenses/>.\n *\n * @file\n * @author thomas-topway-it <support@topway.it>\n * @copyright Copyright © 2023, https://wikisphere.org\n */\n\n// @credits: mw.widgets.CategoryMultiselectWidget\n\n( function () {\n\t/**\n\t * @class VisualDataMenuTagSearchMultiselect\n\t * @uses mw.Api\n\t * @extends OO.ui.MenuTagMultiselectWidget\n\t * @mixins OO.ui.mixin.PendingElement\n\t *\n\t * @constructor\n\t * @param {Object} [config] Configuration options\n\t * @cfg {number} [limit=10] Maximum number of results to load\n\t */\n\n\t// eslint-disable-next-line no-implicit-globals\n\tVisualDataMenuTagSearchMultiselect = function ( config ) {\n\t\t// Config initialization\n\t\tthis.limit = config.limit;\n\n\t\t// Parent constructor\n\t\tVisualDataMenuTagSearchMultiselect.parent.call(\n\t\t\tthis,\n\t\t\t$.extend( true, {}, config, {\n\t\t\t\tmenu: {\n\t\t\t\t\tfilterFromInput: false\n\t\t\t\t},\n\t\t\t\tplaceholder: mw.msg( 'visualdata-menutagmultiselect-placeholder' ),\n\t\t\t\t// This allows the user to both select non-existent categories, and prevents the selector from\n\t\t\t\t// being wiped from #onMenuItemsChange when we change the available options in the dropdown\n\t\t\t\tallowArbitrary: false\n\t\t\t} )\n\t\t);\n\n\t\t// Mixin constructors\n\t\tOO.ui.mixin.PendingElement.call(\n\t\t\tthis,\n\t\t\tObject.assign( {}, config, { $pending: this.$handle } )\n\t\t);\n\n\t\t// Event handler to call the autocomplete methods\n\t\tthis.input.$input.on(\n\t\t\t'change input cut paste',\n\t\t\tOO.ui.debounce( this.updateMenuItems.bind( this ), 100 )\n\t\t);\n\n\t\t// Initialize\n\t\t// @TODO\n\t\tthis.api = { abort: function () {} }; // config.api || new mw.Api();\n\t\tthis.searchCache = {};\n\t};\n\n\t/* Setup */\n\n\tOO.inheritClass(\n\t\tVisualDataMenuTagSearchMultiselect,\n\t\tOO.ui.MenuTagMultiselectWidget\n\t);\n\tOO.mixinClass(\n\t\tVisualDataMenuTagSearchMultiselect,\n\t\tOO.ui.mixin.PendingElement\n\t);\n\n\t/* Methods */\n\n\t/**\n\t * Gets new items based on the input by calling\n\t * {@link #getNewMenuItems getNewItems} and updates the menu\n\t * after removing duplicates based on the data value.\n\t *\n\t * @private\n\t * @method\n\t */\n\tVisualDataMenuTagSearchMultiselect.prototype.updateMenuItems =\n\t\tfunction () {\n\t\t\tthis.getMenu().clearItems();\n\t\t\tthis.getNewMenuItems( this.input.$input.val() ).then(\n\t\t\t\t( items ) => {\n\t\t\t\t\tvar existingItems,\n\t\t\t\t\t\tmenu = this.getMenu();\n\n\t\t\t\t\t// Never show the menu if the input lost focus in the meantime\n\t\t\t\t\tif ( !this.input.$input.is( ':focus' ) ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Array of strings of the data of OO.ui.MenuOptionsWidgets\n\t\t\t\t\texistingItems = menu.getItems().map( ( item ) => item.data );\n\n\t\t\t\t\t// Remove if items' data already exists\n\t\t\t\t\tfor ( var i in items ) {\n\t\t\t\t\t\tif ( existingItems.indexOf( i ) !== -1 ) {\n\t\t\t\t\t\t\tdelete items[ i ];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Map to an array of OO.ui.MenuOptionWidgets\n\t\t\t\t\tvar ret = [];\n\t\t\t\t\tfor ( var i in items ) {\n\t\t\t\t\t\tret.push(\n\t\t\t\t\t\t\tnew OO.ui.MenuOptionWidget( {\n\t\t\t\t\t\t\t\tdata: i,\n\t\t\t\t\t\t\t\tlabel: items[ i ]\n\t\t\t\t\t\t\t} )\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tmenu.addItems( ret ).toggle( true );\n\t\t\t\t}\n\t\t\t);\n\t\t};\n\n\t/**\n\t * @inheritdoc\n\t */\n\tVisualDataMenuTagSearchMultiselect.prototype.clearInput = function () {\n\t\tVisualDataMenuTagSearchMultiselect.parent.prototype.clearInput.call(\n\t\t\tthis\n\t\t);\n\t\t// Abort all pending requests, we won't need their results\n\t\tthis.api.abort();\n\t};\n\n\t/**\n\t * Searches for categories based on the input.\n\t *\n\t * @private\n\t * @method\n\t * @param {string} input The input used to prefix search categories\n\t * @return {jQuery.Promise} Resolves with an array of categories\n\t */\n\tVisualDataMenuTagSearchMultiselect.prototype.getNewMenuItems = function (\n\t\tinput\n\t) {\n\t\tvar deferred = $.Deferred();\n\n\t\tif ( input.trim() === '' ) {\n\t\t\tdeferred.resolve( [] );\n\t\t\treturn deferred.promise();\n\t\t}\n\n\t\t// Abort all pending requests, we won't need their results\n\t\tthis.api.abort();\n\n\t\tthis.pushPending();\n\n\t\treturn this.searchItems( input ).always( this.popPending.bind( this ) );\n\t};\n\n\t/**\n\t * @private\n\t * @method\n\t * @param {string} value The input value\n\t * @return {jQuery.Promise} Resolves with an array of items\n\t */\n\tVisualDataMenuTagSearchMultiselect.prototype.searchItems = function (\n\t\tvalue\n\t) {\n\t\tvar deferred = $.Deferred(),\n\t\t\tcacheKey = value;\n\n\t\t// Check cache\n\t\tif ( cacheKey in this.searchCache ) {\n\t\t\treturn this.searchCache[ cacheKey ];\n\t\t}\n\n\t\tthis.data.performQuery( this.data.model, value ).then( ( data ) => {\n\t\t\tdeferred.resolve( data );\n\t\t} );\n\n\t\t// Cache the result\n\t\tthis.searchCache[ cacheKey ] = deferred.promise();\n\n\t\treturn deferred.promise( { abort: function () {} } );\n\t};\n}() );\n","usedDeprecatedRules":[{"ruleId":"max-len","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/Widgets/VisualDataRatingWidget.js","messages":[{"ruleId":"no-jquery/no-parse-html-literal","severity":1,"message":"Prefer DOM building to parsing HTML literals","line":38,"column":19,"nodeType":"CallExpression","endLine":38,"endColumn":47},{"ruleId":"no-jquery/variable-pattern","severity":1,"message":"jQuery collection names must match the variablePattern","line":45,"column":8,"nodeType":"VariableDeclarator","endLine":51,"endColumn":7},{"ruleId":"no-jquery/no-sizzle","severity":1,"message":"Selector extensions are not allowed","line":67,"column":6,"nodeType":"CallExpression","endLine":69,"endColumn":7}],"suppressedMessages":[{"ruleId":"no-implicit-globals","severity":2,"message":"Global variable leak, declare the variable if it is intended to be local.","line":24,"column":2,"nodeType":"AssignmentExpression","messageId":"globalVariableLeak","endLine":91,"endColumn":3,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"eqeqeq","severity":2,"message":"Expected '===' and instead saw '=='.","line":54,"column":11,"nodeType":"BinaryExpression","messageId":"unexpected","endLine":54,"endColumn":13,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"eqeqeq","severity":2,"message":"Expected '===' and instead saw '=='.","line":64,"column":25,"nodeType":"BinaryExpression","messageId":"unexpected","endLine":64,"endColumn":27,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":3,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/**\n * This file is part of the MediaWiki extension VisualData.\n *\n * VisualData is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 2 of the License, or\n * (at your option) any later version.\n *\n * VisualData is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with VisualData. If not, see <http://www.gnu.org/licenses/>.\n *\n * @file\n * @author thomas-topway-it <support@topway.it>\n * @copyright Copyright © 2021-2022, https://wikisphere.org\n */\n\n( function () {\n\t// eslint-disable-next-line no-implicit-globals\n\tVisualDataRatingWidget = function ( config ) {\n\t\tconfig = config || {};\n\n\t\tif ( !( 'classes' in config ) ) {\n\t\t\tconfig.classes = [];\n\t\t}\n\n\t\t// ***important, add position: relative to display\n\t\t// property native validation\n\t\tconfig.classes.push( 'visualdata-rating-widget' );\n\n\t\tVisualDataRatingWidget.super.call( this, config );\n\n\t\t// @see https://iamkate.com/code/star-rating-widget/\n\t\tvar $fieldset = $( ' <div class=\"rating\">' );\n\n\t\tthis.$input = $fieldset;\n\n\t\tvar self = this;\n\t\tthis.isChecked = 0;\n\t\tfor ( var i = 1; i < 6; i++ ) {\n\t\t\tvar input = $( '<input>' ).attr( {\n\t\t\t\ttype: 'radio',\n\t\t\t\tvalue: i,\n\t\t\t\tid: 'rating-' + i,\n\t\t\t\tname: config.name,\n\t\t\t\t'data-i': i\n\t\t\t} );\n\n\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\tif ( i == config.value ) {\n\t\t\t\tinput.prop( 'checked', true );\n\t\t\t\tthis.isChecked = i;\n\t\t\t}\n\n\t\t\t// uncheck the radio button if\n\t\t\t// alread selected, and check the previous one\n\t\t\tinput.on( 'click', function () {\n\t\t\t\tvar ii = $( this ).data( 'i' );\n\t\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\t\tif ( self.isChecked == ii ) {\n\t\t\t\t\tself.isChecked = ii - 1;\n\t\t\t\t\t$( this ).prop( 'checked', false );\n\t\t\t\t\t$(\n\t\t\t\t\t\t\":input[name='\" + config.name + \"'][data-i='\" + ( ii - 1 ) + \"']\"\n\t\t\t\t\t).prop( 'checked', true );\n\t\t\t\t} else {\n\t\t\t\t\tself.isChecked = ii;\n\t\t\t\t}\n\n\t\t\t\tself.emit( 'change', self.getValue() );\n\n\t\t\t} );\n\n\t\t\t$fieldset.append( [\n\t\t\t\tinput,\n\t\t\t\t$( '<label>' ).attr( {\n\t\t\t\t\tfor: 'rating-' + i\n\t\t\t\t} )\n\t\t\t] );\n\t\t}\n\n\t\tthis.getValue = function () {\n\t\t\treturn this.isChecked ? String( this.isChecked ) : '';\n\t\t};\n\n\t\tthis.$element.append( $fieldset );\n\t};\n\n\tOO.inheritClass( VisualDataRatingWidget, OO.ui.Widget );\n\tOO.mixinClass( VisualDataRatingWidget, OO.EventEmitter );\n}() );\n","usedDeprecatedRules":[{"ruleId":"max-len","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/Widgets/VisualDataTinyMCE.js","messages":[{"ruleId":"no-jquery/variable-pattern","severity":1,"message":"jQuery collection names must match the variablePattern","line":38,"column":3,"nodeType":"AssignmentExpression","endLine":40,"endColumn":34},{"ruleId":"no-jquery/no-parse-html-literal","severity":1,"message":"Prefer DOM building to parsing HTML literals","line":38,"column":19,"nodeType":"CallExpression","endLine":38,"endColumn":45}],"suppressedMessages":[{"ruleId":"no-implicit-globals","severity":2,"message":"Global variable leak, declare the variable if it is intended to be local.","line":26,"column":2,"nodeType":"AssignmentExpression","messageId":"globalVariableLeak","endLine":72,"endColumn":3,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'e' is defined but never used.","line":54,"column":61,"nodeType":"Identifier","messageId":"unusedVar","endLine":54,"endColumn":62,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":2,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/**\n * This file is part of the MediaWiki extension VisualData.\n *\n * VisualData is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 2 of the License, or\n * (at your option) any later version.\n *\n * VisualData is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with VisualData. If not, see <http://www.gnu.org/licenses/>.\n *\n * @file\n * @author thomas-topway-it <support@topway.it>\n * @copyright Copyright © 2024, https://wikisphere.org\n */\n\n/* eslint-disable no-unused-vars */\n\n( function () {\n\t// eslint-disable-next-line no-implicit-globals\n\tVisualDataTinyMCE = function ( config ) {\n\t\tconfig = config || {};\n\t\tif ( !( 'classes' in config ) ) {\n\t\t\tconfig.classes = [];\n\t\t}\n\t\tvar self = this;\n\t\tthis.config = config;\n\n\t\tVisualDataTinyMCE.super.call( this, config );\n\n\t\tthis.textareaId = 'visualdata-tinimce-' + config.data.model.path;\n\n\t\tthis.textarea = $( '<textarea rows=\"8\">' )\n\t\t\t.attr( 'name', config.name )\n\t\t\t.attr( 'id', this.textareaId );\n\n\t\tthis.text = this.config.value || '';\n\t\tthis.textarea.val( this.text );\n\n\t\tthis.$element.append( this.textarea );\n\n\t\tvar mw_extensionAssetsPath = mw.config.get( 'wgExtensionAssetsPath' );\n\t\tvar basePath = mw_extensionAssetsPath + '/VisualData/resources/tinymce';\n\n\t\tthis.scripts = [\n\t\t\tbasePath + '/tinymce.min.js'\n\t\t];\n\n\t\tVisualDataFunctions.loadScripts( this.scripts, function ( e ) {\n\t\t\tthis.tinymce = tinymce.init( {\n\t\t\t\tbase_url: basePath,\n\t\t\t\tstatusbar: false,\n\t\t\t\tselector: '#' + jQuery.escapeSelector( self.textareaId ),\n\t\t\t\tobject_resizing: true,\n\t\t\t\tallow_html_in_named_anchor: true,\n\t\t\t\tbrowser_spellcheck: true,\n\t\t\t\tautomatic_uploads: true,\n\t\t\t\tpaste_data_images: true,\n\t\t\t\tshowPlaceholders: false,\n\t\t\t\tdecodeHtmlEntitiesOnInput: false,\n\t\t\t\tauto_focus: true,\n\t\t\t\tvisual: false\n\t\t\t\t// license_key: 'gpl|<your-license-key>'\n\t\t\t} );\n\n\t\t} );\n\t};\n\n\tOO.inheritClass( VisualDataTinyMCE, OO.ui.Widget );\n\tOO.mixinClass( VisualDataTinyMCE, OO.EventEmitter );\n\n\tVisualDataTinyMCE.prototype.getValue = function () {\n\t\tvar editor = tinymce.get( this.textareaId );\n\t\treturn editor.getContent( this.textareaId );\n\t};\n}() );\n","usedDeprecatedRules":[{"ruleId":"max-len","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/Widgets/VisualDataVisualEditor.js","messages":[{"ruleId":"no-jquery/variable-pattern","severity":1,"message":"jQuery collection names must match the variablePattern","line":40,"column":3,"nodeType":"AssignmentExpression","endLine":42,"endColumn":47},{"ruleId":"no-jquery/no-parse-html-literal","severity":1,"message":"Prefer DOM building to parsing HTML literals","line":40,"column":19,"nodeType":"CallExpression","endLine":40,"endColumn":45},{"ruleId":"no-jquery/variable-pattern","severity":1,"message":"jQuery collection names must match the variablePattern","line":47,"column":3,"nodeType":"AssignmentExpression","endLine":47,"endColumn":69},{"ruleId":"no-jquery/no-sizzle","severity":1,"message":"Selector extensions are not allowed","line":53,"column":9,"nodeType":"CallExpression","endLine":53,"endColumn":48}],"suppressedMessages":[{"ruleId":"no-implicit-globals","severity":2,"message":"Global variable leak, declare the variable if it is intended to be local.","line":27,"column":2,"nodeType":"AssignmentExpression","messageId":"globalVariableLeak","endLine":57,"endColumn":3,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":37,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":37,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":73,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":73,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":76,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":76,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":79,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":79,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":80,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":80,"endColumn":9,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":81,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":81,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":82,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":82,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":85,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":85,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":89,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":89,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":90,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":90,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":91,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":91,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":92,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":92,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'reject' is defined but never used.","line":105,"column":38,"nodeType":"Identifier","messageId":"unusedVar","endLine":105,"endColumn":44,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'reject' is defined but never used.","line":109,"column":49,"nodeType":"Identifier","messageId":"unusedVar","endLine":109,"endColumn":55,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'e' is defined but never used.","line":110,"column":47,"nodeType":"Identifier","messageId":"unusedVar","endLine":110,"endColumn":48,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-return-assign","severity":2,"message":"Return statement should not contain assignment.","line":146,"column":5,"nodeType":"ReturnStatement","messageId":"returnAssignment","endLine":146,"endColumn":40,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":160,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":160,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'reject' is defined but never used.","line":163,"column":34,"nodeType":"Identifier","messageId":"unusedVar","endLine":163,"endColumn":40,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":4,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/**\n * This file is part of the MediaWiki extension VisualData.\n *\n * VisualData is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 2 of the License, or\n * (at your option) any later version.\n *\n * VisualData is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with VisualData. If not, see <http://www.gnu.org/licenses/>.\n *\n * @file\n * @author thomas-topway-it <support@topway.it>\n * @copyright Copyright © 2023, https://wikisphere.org\n */\n\n/* eslint-disable no-tabs */\n/* eslint-disable no-unused-vars */\n\n( function () {\n\t// eslint-disable-next-line no-implicit-globals\n\tVisualDataVisualEditor = function ( config ) {\n\t\tconfig = config || {};\n\t\tif ( !( 'classes' in config ) ) {\n\t\t\tconfig.classes = [];\n\t\t}\n\t\tvar self = this;\n\t\tthis.config = config;\n\n\t\t// @FIXME only allows wikitext for now\n\t\t// this.isHtml =\n\t\t// \t\"contentModel\" in this.config && this.config.contentModel === \"html\";\n\t\tVisualDataVisualEditor.super.call( this, config );\n\n\t\tthis.textarea = $( '<textarea rows=\"8\">' )\n\t\t\t.attr( 'name', config.name )\n\t\t\t.attr( 'class', 'visualdata toolbarOnTop' );\n\n\t\tthis.text = this.config.value || '';\n\t\tthis.textarea.val( this.text );\n\n\t\tthis.VEInstance = $( '<span>' ).attr( 'class', 've-area-wrapper' );\n\t\tthis.$element.append( this.VEInstance.append( this.textarea ) );\n\t\tthis.Editor = null;\n\t\tthis.initialized = false;\n\n\t\tsetTimeout( () => {\n\t\t\tif ( self.$element.parent().is( ':visible' ) ) {\n\t\t\t\tself.initialize();\n\t\t\t}\n\t\t}, 50 );\n\t};\n\n\tOO.inheritClass( VisualDataVisualEditor, OO.ui.Widget );\n\tOO.mixinClass( VisualDataVisualEditor, OO.EventEmitter );\n\n\t// @see https://github.com/Open-CSP/FlexForm/blob/main/Modules/FlexForm.general.js\n\tVisualDataVisualEditor.prototype.initialize = async function () {\n\t\tif ( this.initialized ) {\n\t\t\treturn;\n\t\t}\n\t\tthis.destroyEditor();\n\t\tvar self = this;\n\t\tself.initialized = true;\n\n\t\tthis.loadVEForAll().then( () => {\n\t\t\t// if (!self.isHtml) {\n\t\t\t// \treturn;\n\t\t\t// }\n\t\t\t// var callbackCond = function () {\n\t\t\t// \treturn self.getEditor();\n\t\t\t// };\n\t\t\t// var callback = function (resolve, reject) {\n\t\t\t// \tsetTimeout(function() {\n\t\t\t// \t\tself.getEditor().createWithHtmlContent(self.text);\n\t\t\t// \t}, 100);\n\t\t\t// \tresolve();\n\t\t\t// };\n\t\t\t// var callbackMaxAttempts = function (resolve, reject) {\n\t\t\t// \treject();\n\t\t\t// };\n\n\t\t\t// VisualDataFunctions.waitUntil(\n\t\t\t// \tcallbackCond,\n\t\t\t// \tcallback,\n\t\t\t// \tcallbackMaxAttempts,\n\t\t\t// \t8\n\t\t\t// );\n\t\t} );\n\t};\n\n\t// @see https://github.com/Open-CSP/FlexForm/blob/main/Modules/FlexForm.general.js\n\tVisualDataVisualEditor.prototype.loadVEForAll = async function () {\n\t\tvar self = this;\n\n\t\tvar callbackCond = function () {\n\t\t\treturn typeof $().applyVisualEditor === 'function';\n\t\t};\n\n\t\tvar callback = function ( resolve, reject ) {\n\t\t\tself.textarea.applyVisualEditor();\n\t\t\tresolve();\n\t\t};\n\t\tvar callbackMaxAttempts = function ( resolve, reject ) {\n\t\t\tjQuery( document ).on( 'VEForAllLoaded', ( e ) => {\n\t\t\t\tself.textarea.applyVisualEditor();\n\t\t\t\tresolve();\n\t\t\t} );\n\t\t};\n\n\t\treturn VisualDataFunctions.waitUntil(\n\t\t\tcallbackCond,\n\t\t\tcallback,\n\t\t\tcallbackMaxAttempts,\n\t\t\t5\n\t\t);\n\t};\n\n\tVisualDataVisualEditor.prototype.destroyEditor = function () {\n\t\tif ( typeof $.fn.getVEInstances === 'function' ) {\n\t\t\tvar visualEditors = $.fn.getVEInstances();\n\t\t\tfor ( var i in visualEditors ) {\n\t\t\t\tvar editor = visualEditors[ i ];\n\t\t\t\tif ( $( editor.$node ).attr( 'name' ) === this.config.name ) {\n\t\t\t\t\teditor.destroy();\n\t\t\t\t\tvisualEditors.splice( i, 1 );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\t// @see PageForms PF_submit.js\n\tVisualDataVisualEditor.prototype.getEditor = function () {\n\t\tif ( this.Editor ) {\n\t\t\treturn this.Editor;\n\t\t}\n\t\tvar visualEditors = $.fn.getVEInstances();\n\t\tfor ( var editor of visualEditors ) {\n\t\t\tif ( $( editor.$node ).attr( 'name' ) === this.config.name ) {\n\t\t\t\t// eslint-disable-next-line no-return-assign\n\t\t\t\treturn this.Editor = editor.target;\n\t\t\t}\n\t\t}\n\t};\n\n\tVisualDataVisualEditor.prototype.getValue = function () {\n\t\tvar self = this;\n\t\tvar editor = this.getEditor();\n\n\t\tif ( !this.initialized || !editor ) {\n\t\t\treturn this.textarea.val();\n\t\t}\n\n\t\t// if (this.isHtml) {\n\t\t// \treturn VisualDataFunctions.decodeHTMLEntities( editor.getSurface().getHtml() );\n\t\t// }\n\n\t\treturn new Promise( ( resolve, reject ) => {\n\t\t\t$.when( editor.updateContent() ).then( () => {\n\t\t\t\t// @see ext.veforall.target.js\n\t\t\t\t// *** sometimes convertToWikiText is not called\n\t\t\t\t// based on focus\n\t\t\t\teditor.$node.addClass( 've-for-all-waiting-for-update' );\n\n\t\t\t\tresolve( self.textarea.val() );\n\t\t\t} );\n\t\t} );\n\t};\n}() );\n","usedDeprecatedRules":[{"ruleId":"max-len","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/Widgets/VisualDataintlTelInput.js","messages":[{"ruleId":"no-jquery/variable-pattern","severity":1,"message":"jQuery collection names must match the variablePattern","line":38,"column":7,"nodeType":"VariableDeclarator","endLine":43,"endColumn":6}],"suppressedMessages":[{"ruleId":"no-implicit-globals","severity":2,"message":"Global variable leak, declare the variable if it is intended to be local.","line":26,"column":2,"nodeType":"AssignmentExpression","messageId":"globalVariableLeak","endLine":89,"endColumn":3,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":51,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":51,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":52,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":52,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"new-cap","severity":2,"message":"A constructor name should not start with a lowercase letter.","line":171,"column":25,"nodeType":"NewExpression","messageId":"lower","endLine":171,"endColumn":37,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-console","severity":2,"message":"Unexpected console statement.","line":181,"column":7,"nodeType":"MemberExpression","messageId":"unexpected","endLine":181,"endColumn":20,"suggestions":[{"messageId":"removeConsole","data":{"propertyName":"error"},"fix":{"range":[4946,5008],"text":""},"desc":"Remove the console.error()."}],"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-console","severity":2,"message":"Unexpected console statement.","line":190,"column":7,"nodeType":"MemberExpression","messageId":"unexpected","endLine":190,"endColumn":20,"suggestions":[{"messageId":"removeConsole","data":{"propertyName":"error"},"fix":{"range":[5211,5264],"text":""},"desc":"Remove the console.error()."}],"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/**\n * This file is part of the MediaWiki extension VisualData.\n *\n * VisualData is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 2 of the License, or\n * (at your option) any later version.\n *\n * VisualData is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with VisualData. If not, see <http://www.gnu.org/licenses/>.\n *\n * @file\n * @author thomas-topway-it <support@topway.it>\n * @copyright Copyright © 2021-2023, https://wikisphere.org\n */\n\n/* eslint-disable no-tabs */\n\n( function () {\n\t// eslint-disable-next-line no-implicit-globals\n\tVisualDataIntlTelInput = function ( config ) {\n\t\tVisualDataIntlTelInput.super.call( this, config );\n\n\t\tvar self = this;\n\t\tthis.config = config;\n\n\t\t// https://github.com/jackocnr/intl-tel-input/tree/master?tab=readme-ov-file\n\t\tif ( 'nationalMode' in this.config && this.config.nationalMode === true ) {\n\t\t\tthis.config.showFlags = false;\n\t\t\tthis.config.allowDropdown = false;\n\t\t}\n\n\t\tvar input = $( '<input>' ).attr( {\n\t\t\ttype: 'tel',\n\t\t\tname: config.name,\n\t\t\tvalue: config.value,\n\t\t\tclass: 'oo-ui-inputWidget-input'\n\t\t} );\n\n\t\tthis.input = input;\n\n\t\t// required when handled by OO.ui.TagMultiselectWidget -> inputWidget: inputWidget\n\t\tthis.$input = input;\n\n\t\t// input.on(\"input\", function () {\n\t\t// \tself.config.value = self.input.val();\n\t\t// \tself.emit(\"change\", self.config.value);\n\t\t// });\n\n\t\tinput.on( 'blur', () => {\n\t\t\tself.formatNumber();\n\t\t} );\n\n\t\tthis.$element = $( '<div>' )\n\t\t\t.attr(\n\t\t\t\t'class',\n\t\t\t\t'oo-ui-widget oo-ui-widget-enabled oo-ui-inputWidget oo-ui-textInputWidget oo-ui-textInputWidget-type-text'\n\t\t\t)\n\t\t\t.append( input );\n\n\t\tself.fixConfigCountries( config );\n\n\t\tself.iti = window.intlTelInput(\n\t\t\tinput.get( 0 ),\n\t\t\tObject.assign(\n\t\t\t\t{\n\t\t\t\t\tutilsScript:\n\t\t\t\t\t\t'https://cdn.jsdelivr.net/npm/intl-tel-input@18.3.3/build/js/utils.js',\n\t\t\t\t\tinitialCountry: 'auto',\n\t\t\t\t\tgeoIpLookup: function ( callback ) {\n\t\t\t\t\t\tfetch( 'https://ipapi.co/json' )\n\t\t\t\t\t\t\t.then( ( res ) => res.json() )\n\t\t\t\t\t\t\t.then( ( data ) => {\n\t\t\t\t\t\t\t\tcallback( data.country_code );\n\t\t\t\t\t\t\t} )\n\t\t\t\t\t\t\t.catch( () => {\n\t\t\t\t\t\t\t\tcallback( 'us' );\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tconfig\n\t\t\t)\n\t\t);\n\t};\n\n\tOO.inheritClass( VisualDataIntlTelInput, OO.ui.Widget );\n\tOO.mixinClass( VisualDataIntlTelInput, OO.EventEmitter );\n\n\tVisualDataIntlTelInput.prototype.formatNumber = function () {\n\t\t// https://github.com/jackocnr/intl-tel-input/blob/master/src/js/utils.js#L109\n\t\tvar numberFormat = intlTelInputUtils.numberFormat.E164;\n\t\tif ( 'nationalMode' in this.config && this.config.nationalMode === true ) {\n\t\t\tnumberFormat = intlTelInputUtils.numberFormat.NATIONAL;\n\t\t}\n\n\t\tif ( typeof this.iti === 'object' && typeof intlTelInputUtils === 'object' ) {\n\t\t\tthis.setValue(\n\t\t\t\tthis.iti.getNumber( numberFormat )\n\t\t\t);\n\t\t}\n\t};\n\n\tVisualDataIntlTelInput.prototype.validateFunc = async function () {\n\t\tif ( this.getValue().trim() === '' ) {\n\t\t\treturn true;\n\t\t}\n\n\t\tif ( !this.iti.isPossibleNumber() ) {\n\t\t\t// https://github.com/jackocnr/intl-tel-input/blob/master/src/js/utils.js#L148\n\t\t\tvar error = this.iti.getValidationError();\n\t\t\tvar msg = '';\n\t\t\tswitch ( error ) {\n\t\t\t\tcase 1:\n\t\t\t\t\tmsg = 'invalid country code';\n\t\t\t\t\tbreak;\n\t\t\t\tcase 2:\n\t\t\t\t\tmsg = 'too short';\n\t\t\t\t\tbreak;\n\t\t\t\tcase 3:\n\t\t\t\t\tmsg = 'too long';\n\t\t\t\t\tbreak;\n\t\t\t\tcase 4:\n\t\t\t\t\tmsg = 'is possible local only';\n\t\t\t\t\tbreak;\n\t\t\t\tcase 5:\n\t\t\t\t\tmsg = 'invalid length';\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\treturn 'wrong number' + ( msg ? `: ${ msg }` : '' );\n\t\t}\n\n\t\treturn true;\n\t};\n\n\tVisualDataIntlTelInput.prototype.getValue = function () {\n\t\tthis.formatNumber();\n\t\t// return this.config.value;\n\t\treturn this.input.val();\n\t};\n\n\tVisualDataIntlTelInput.prototype.setValue = function ( value ) {\n\t\t// this.config.value = value;\n\t\tthis.input.val( value );\n\t};\n\n\tVisualDataIntlTelInput.prototype.fixConfigCountries = function ( config ) {\n\t\t// excludeCountries, initialCountry, onlyCountries, preferredCountries\n\t\tvar configCountries = [\n\t\t\t'excludeCountries',\n\t\t\t'initialCountry',\n\t\t\t'onlyCountries',\n\t\t\t'preferredCountries'\n\t\t];\n\n\t\tif (\n\t\t\t!Object.keys( config ).filter( ( x ) => configCountries.indexOf( x ) !== -1 )\n\t\t\t\t.length\n\t\t) {\n\t\t\treturn;\n\t\t}\n\n\t\t// first get all countries to handle the error\n\t\t// \"No country data for ... \"\n\t\t// eslint-disable-next-line new-cap\n\t\tvar iso2 = new window.intlTelInput( this.input.get( 0 ) ).countries.map(\n\t\t\t( x ) => x.iso2\n\t\t);\n\n\t\tfor ( var i of configCountries ) {\n\t\t\tif ( i in config ) {\n\t\t\t\tif ( i === 'initialCountry' ) {\n\t\t\t\t\tconfig[ i ] = config[ i ].toLowerCase();\n\t\t\t\t\tif ( iso2.indexOf( config[ i ] ) === -1 ) {\n\t\t\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\t\t\tconsole.error( config[ i ] + ' is not a valid country code' );\n\t\t\t\t\t\tdelete config[ i ];\n\t\t\t\t\t}\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tvar values = [];\n\t\t\t\tfor ( var ii of config[ i ] ) {\n\t\t\t\t\tif ( iso2.indexOf( ii ) === -1 ) {\n\t\t\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\t\t\tconsole.error( ii + ' is not a valid country code' );\n\t\t\t\t\t\tvalues.splice( ii, 1 );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconfig[ i ] = values;\n\t\t\t}\n\t\t}\n\t};\n}() );\n","usedDeprecatedRules":[{"ruleId":"max-len","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]}]

--- end ---
Failed to parse a 'banana' section from Gruntfile.js
$ ./node_modules/.bin/grunt stylelint
--- stdout ---
Running "stylelint:all" (stylelint) task
>> Linted 3 files without errors

Done.

--- end ---
$ /usr/bin/npm ci
--- stderr ---
npm WARN deprecated @humanwhocodes/config-array@0.11.14: Use @eslint/config-array instead
npm WARN deprecated @humanwhocodes/object-schema@2.0.3: Use @eslint/object-schema instead
--- stdout ---

added 419 packages, and audited 420 packages in 5s

90 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities

--- end ---
$ /usr/bin/npm test
--- stdout ---

> test
> grunt test

Running "eslint:all" (eslint) task

/src/repo/resources/VersionCheck.js
  57:22  warning  Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible  no-jquery/no-global-selector
  62:18  warning  Prefer DOM building to parsing HTML literals                                        no-jquery/no-parse-html-literal
  65:9   warning  Where possible, maintain application state in JS to avoid slower DOM queries        no-jquery/no-class-state

/src/repo/resources/VisualDataDatatables.js
  45:2  warning  Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible  no-jquery/no-global-selector
  48:7  warning  jQuery collection names must match the variablePattern                              no-jquery/variable-pattern

/src/repo/resources/VisualDataFormField.js
  1082:4  warning  Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible  no-jquery/no-global-selector

/src/repo/resources/VisualDataForms.js
    71:6   warning  Selector extensions are not allowed                                                 no-jquery/no-sizzle
    80:1   warning  This line has a length of 106. Maximum allowed is 100                               max-len
   209:5   warning  Selector extensions are not allowed                                                 no-jquery/no-sizzle
   408:1   warning  This line has a length of 110. Maximum allowed is 100                               max-len
   510:1   warning  This line has a length of 117. Maximum allowed is 100                               max-len
   527:1   warning  This line has a length of 131. Maximum allowed is 100                               max-len
  1362:26  warning  Prefer DOM building to parsing HTML literals                                        no-jquery/no-parse-html-literal
  1430:6   warning  Prefer DOM building to parsing HTML literals                                        no-jquery/no-parse-html-literal
  1433:7   warning  Prefer DOM building to parsing HTML literals                                        no-jquery/no-parse-html-literal
  1436:7   warning  Prefer DOM building to parsing HTML literals                                        no-jquery/no-parse-html-literal
  1465:7   warning  Prefer DOM building to parsing HTML literals                                        no-jquery/no-parse-html-literal
  1468:8   warning  Prefer DOM building to parsing HTML literals                                        no-jquery/no-parse-html-literal
  1471:8   warning  Prefer DOM building to parsing HTML literals                                        no-jquery/no-parse-html-literal
  2097:5   warning  Prefer DOM building to parsing HTML literals                                        no-jquery/no-parse-html-literal
  2254:1   warning  This line has a length of 107. Maximum allowed is 100                               max-len
  2396:1   warning  This line has a length of 109. Maximum allowed is 100                               max-len
  2726:1   warning  This line has a length of 102. Maximum allowed is 100                               max-len
  2744:7   warning  jQuery collection names must match the variablePattern                              no-jquery/variable-pattern
  2918:1   warning  This line has a length of 102. Maximum allowed is 100                               max-len
  3042:10  warning  Selector extensions are not allowed                                                 no-jquery/no-sizzle
  3122:1   warning  This line has a length of 108. Maximum allowed is 100                               max-len
  3127:1   warning  This line has a length of 105. Maximum allowed is 100                               max-len
  3347:15  warning  Prefer DOM building to parsing HTML literals                                        no-jquery/no-parse-html-literal
  3371:1   warning  This line has a length of 119. Maximum allowed is 100                               max-len
  3418:3   warning  Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible  no-jquery/no-global-selector

/src/repo/resources/VisualDataInputConfig.js
  838:1  warning  This line has a length of 110. Maximum allowed is 100  max-len

/src/repo/resources/VisualDataProcessModel.js
  159:11  warning  Selector extensions are not allowed  no-jquery/no-sizzle

/src/repo/resources/VisualDataSchemas.js
   327:1   warning  This line has a length of 103. Maximum allowed is 100                               max-len
  1496:15  warning  Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible  no-jquery/no-global-selector
  1671:4   warning  Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible  no-jquery/no-global-selector
  1674:15  warning  Prefer DOM building to parsing HTML literals                                        no-jquery/no-parse-html-literal
  1690:4   warning  Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible  no-jquery/no-global-selector

/src/repo/resources/Widgets/VisualDataButtonMultiselectWidget.js
  48:12  warning  Prefer Array#indexOf to $.inArray  no-jquery/no-in-array

/src/repo/resources/Widgets/VisualDataDropdownWidget.js
  38:7  warning  jQuery collection names must match the variablePattern  no-jquery/variable-pattern
  53:7  warning  jQuery collection names must match the variablePattern  no-jquery/variable-pattern

/src/repo/resources/Widgets/VisualDataMaptiler.js
  61:1  warning  This line has a length of 119. Maximum allowed is 100  max-len

/src/repo/resources/Widgets/VisualDataMenuTagSearchMultiselect.js
  29:1  warning  Invalid JSDoc tag name "mixins"                        jsdoc/check-tag-names
  49:1  warning  This line has a length of 110. Maximum allowed is 100  max-len
  50:1  warning  This line has a length of 107. Maximum allowed is 100  max-len

/src/repo/resources/Widgets/VisualDataRatingWidget.js
  38:19  warning  Prefer DOM building to parsing HTML literals            no-jquery/no-parse-html-literal
  45:8   warning  jQuery collection names must match the variablePattern  no-jquery/variable-pattern
  67:6   warning  Selector extensions are not allowed                     no-jquery/no-sizzle

/src/repo/resources/Widgets/VisualDataTinyMCE.js
  38:3   warning  jQuery collection names must match the variablePattern  no-jquery/variable-pattern
  38:19  warning  Prefer DOM building to parsing HTML literals            no-jquery/no-parse-html-literal

/src/repo/resources/Widgets/VisualDataVisualEditor.js
  40:3   warning  jQuery collection names must match the variablePattern  no-jquery/variable-pattern
  40:19  warning  Prefer DOM building to parsing HTML literals            no-jquery/no-parse-html-literal
  47:3   warning  jQuery collection names must match the variablePattern  no-jquery/variable-pattern
  53:9   warning  Selector extensions are not allowed                     no-jquery/no-sizzle

/src/repo/resources/Widgets/VisualDataintlTelInput.js
  38:7  warning  jQuery collection names must match the variablePattern  no-jquery/variable-pattern

✖ 55 problems (0 errors, 55 warnings)


Running "stylelint:all" (stylelint) task
>> Linted 3 files without errors

Running "banana:VisualData" (banana) task
>> 1 message directory checked.

Done.

--- end ---
Upgrading c:mediawiki/minus-x from 1.1.1 -> 1.1.3
Upgrading c:php-parallel-lint/php-parallel-lint from 1.3.2 -> 1.4.0
$ /usr/bin/composer update
--- stderr ---
Loading composer repositories with package information
Updating dependencies
Lock file operations: 0 installs, 4 updates, 1 removal
  - Removing symfony/polyfill-php73 (v1.30.0)
  - Upgrading mediawiki/minus-x (1.1.1 => 1.1.3)
  - Upgrading php-parallel-lint/php-parallel-lint (v1.3.2 => v1.4.0)
  - Upgrading symfony/console (v5.4.41 => v7.1.2)
  - Upgrading symfony/string (v6.4.9 => v7.1.2)
Writing lock file
Installing dependencies from lock file (including require-dev)
Package operations: 0 installs, 4 updates, 1 removal
    0 [>---------------------------]    0 [->--------------------------]
  - Removing symfony/polyfill-php73 (v1.30.0)
  - Upgrading symfony/string (v6.4.9 => v7.1.2): Extracting archive
  - Upgrading symfony/console (v5.4.41 => v7.1.2): Extracting archive
  - Upgrading mediawiki/minus-x (1.1.1 => 1.1.3): Extracting archive
  - Upgrading php-parallel-lint/php-parallel-lint (v1.3.2 => v1.4.0): Extracting archive
 0/4 [>---------------------------]   0%
 4/4 [============================] 100%
Generating autoload files
13 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
No security vulnerability advisories found
--- stdout ---

--- end ---
$ /usr/bin/composer install
--- stderr ---
Installing dependencies from lock file (including require-dev)
Verifying lock file contents can be installed on current platform.
Nothing to install, update or remove
Generating autoload files
13 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
--- stdout ---

--- end ---
$ /usr/bin/composer test
--- stderr ---
> parallel-lint . --exclude vendor --exclude node_modules
> minus-x check .
> phpcs -sp --cache
--- stdout ---
PHP 8.2.7 | 10 parallel jobs
....................................................         52/52 (100%)


Checked 52 files in 0.3 seconds
No syntax error found
MinusX
======
Processing /src/repo...
.............................................................
.............................................................
.............................................................
.............................................................
...........
All good!
.................................................... 52 / 52 (100%)


Time: 392ms; Memory: 10MB


--- end ---
$ /usr/bin/npm audit --json
--- stdout ---
{
  "auditReportVersion": 2,
  "vulnerabilities": {},
  "metadata": {
    "vulnerabilities": {
      "info": 0,
      "low": 0,
      "moderate": 0,
      "high": 0,
      "critical": 0,
      "total": 0
    },
    "dependencies": {
      "prod": 1,
      "dev": 419,
      "optional": 0,
      "peer": 1,
      "peerOptional": 0,
      "total": 419
    }
  }
}

--- end ---
$ package-lock-lint package-lock.json
--- stdout ---
Checking package-lock.json

--- end ---
build: Updating dependencies

composer:
* mediawiki/minus-x: 1.1.1 → 1.1.3
* php-parallel-lint/php-parallel-lint: 1.3.2 → 1.4.0

npm:
* eslint-config-wikimedia: 0.26.0 → 0.28.2
* grunt-banana-checker: 0.11.1 → 0.13.0
* grunt-stylelint: 0.19.0 → 0.20.1
* stylelint-config-wikimedia: 0.16.1 → 0.17.2


$ git add .
--- stdout ---

--- end ---
$ git commit -F /tmp/tmpegdvhrsa
--- stdout ---
[master a2c2907] build: Updating dependencies
 23 files changed, 1855 insertions(+), 2236 deletions(-)

--- end ---
$ git format-patch HEAD~1 --stdout
--- stdout ---
From a2c2907929f919d4db79c4f4a987bdbd9a5bcc79 Mon Sep 17 00:00:00 2001
From: libraryupgrader <tools.libraryupgrader@tools.wmflabs.org>
Date: Wed, 24 Jul 2024 04:28:02 +0000
Subject: [PATCH] build: Updating dependencies
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

composer:
* mediawiki/minus-x: 1.1.1 → 1.1.3
* php-parallel-lint/php-parallel-lint: 1.3.2 → 1.4.0

npm:
* eslint-config-wikimedia: 0.26.0 → 0.28.2
* grunt-banana-checker: 0.11.1 → 0.13.0
* grunt-stylelint: 0.19.0 → 0.20.1
* stylelint-config-wikimedia: 0.16.1 → 0.17.2

Change-Id: Iaef420a5dc5d163dc24adc2629516f52e519bf9a
---
 composer.json                                 |    4 +-
 package-lock.json                             | 3689 ++++++++---------
 package.json                                  |    8 +-
 resources/VersionCheck.js                     |    6 +-
 resources/VisualData.js                       |   14 +-
 resources/VisualDataContentBlock.js           |   10 +-
 resources/VisualDataDatatables.js             |    2 +-
 resources/VisualDataFormField.js              |   45 +-
 resources/VisualDataForms.js                  |  116 +-
 resources/VisualDataFunctions.js              |   14 +-
 resources/VisualDataGeolocation.js            |   14 +-
 resources/VisualDataInputConfig.js            |   30 +-
 resources/VisualDataProcessModel.js           |    5 +-
 resources/VisualDataSchemas.js                |   58 +-
 resources/VisualDataUpload.js                 |   30 +-
 resources/VisualDataWindowManager.js          |    1 -
 .../VisualDataButtonMultiselectWidget.js      |    2 +-
 resources/Widgets/VisualDataDropdownWidget.js |    2 +-
 resources/Widgets/VisualDataMaptiler.js       |   10 +-
 .../VisualDataMenuTagSearchMultiselect.js     |   10 +-
 resources/Widgets/VisualDataTinyMCE.js        |    1 -
 resources/Widgets/VisualDataVisualEditor.js   |    8 +-
 resources/Widgets/VisualDataintlTelInput.js   |   12 +-
 23 files changed, 1855 insertions(+), 2236 deletions(-)

diff --git a/composer.json b/composer.json
index 65986e5..8a49490 100644
--- a/composer.json
+++ b/composer.json
@@ -1,9 +1,9 @@
 {
 	"require-dev": {
 		"mediawiki/mediawiki-codesniffer": "43.0.0",
-		"mediawiki/minus-x": "1.1.1",
+		"mediawiki/minus-x": "1.1.3",
 		"php-parallel-lint/php-console-highlighter": "1.0.0",
-		"php-parallel-lint/php-parallel-lint": "1.3.2"
+		"php-parallel-lint/php-parallel-lint": "1.4.0"
 	},
 	"scripts": {
 		"test": [
diff --git a/package-lock.json b/package-lock.json
index 7fffced..cfbd8cb 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -6,12 +6,12 @@
 		"": {
 			"name": "VisualData",
 			"devDependencies": {
-				"eslint-config-wikimedia": "0.26.0",
+				"eslint-config-wikimedia": "0.28.2",
 				"grunt": "1.6.1",
-				"grunt-banana-checker": "0.11.1",
+				"grunt-banana-checker": "0.13.0",
 				"grunt-eslint": "24.3.0",
-				"grunt-stylelint": "0.19.0",
-				"stylelint-config-wikimedia": "0.16.1"
+				"grunt-stylelint": "0.20.1",
+				"stylelint-config-wikimedia": "0.17.2"
 			}
 		},
 		"node_modules/@aashutoshrathi/word-wrap": {
@@ -24,107 +24,37 @@
 			}
 		},
 		"node_modules/@babel/code-frame": {
-			"version": "7.23.5",
-			"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz",
-			"integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==",
+			"version": "7.24.7",
+			"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz",
+			"integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==",
 			"dev": true,
 			"dependencies": {
-				"@babel/highlight": "^7.23.4",
-				"chalk": "^2.4.2"
+				"@babel/highlight": "^7.24.7",
+				"picocolors": "^1.0.0"
 			},
 			"engines": {
 				"node": ">=6.9.0"
 			}
 		},
-		"node_modules/@babel/code-frame/node_modules/ansi-styles": {
-			"version": "3.2.1",
-			"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
-			"integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
-			"dev": true,
-			"dependencies": {
-				"color-convert": "^1.9.0"
-			},
-			"engines": {
-				"node": ">=4"
-			}
-		},
-		"node_modules/@babel/code-frame/node_modules/chalk": {
-			"version": "2.4.2",
-			"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
-			"integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
-			"dev": true,
-			"dependencies": {
-				"ansi-styles": "^3.2.1",
-				"escape-string-regexp": "^1.0.5",
-				"supports-color": "^5.3.0"
-			},
-			"engines": {
-				"node": ">=4"
-			}
-		},
-		"node_modules/@babel/code-frame/node_modules/color-convert": {
-			"version": "1.9.3",
-			"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
-			"integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
-			"dev": true,
-			"dependencies": {
-				"color-name": "1.1.3"
-			}
-		},
-		"node_modules/@babel/code-frame/node_modules/color-name": {
-			"version": "1.1.3",
-			"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
-			"integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
-			"dev": true
-		},
-		"node_modules/@babel/code-frame/node_modules/escape-string-regexp": {
-			"version": "1.0.5",
-			"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
-			"integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
-			"dev": true,
-			"engines": {
-				"node": ">=0.8.0"
-			}
-		},
-		"node_modules/@babel/code-frame/node_modules/has-flag": {
-			"version": "3.0.0",
-			"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-			"integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
-			"dev": true,
-			"engines": {
-				"node": ">=4"
-			}
-		},
-		"node_modules/@babel/code-frame/node_modules/supports-color": {
-			"version": "5.5.0",
-			"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
-			"integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
-			"dev": true,
-			"dependencies": {
-				"has-flag": "^3.0.0"
-			},
-			"engines": {
-				"node": ">=4"
-			}
-		},
 		"node_modules/@babel/helper-validator-identifier": {
-			"version": "7.22.20",
-			"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz",
-			"integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==",
+			"version": "7.24.7",
+			"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz",
+			"integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==",
 			"dev": true,
 			"engines": {
 				"node": ">=6.9.0"
 			}
 		},
 		"node_modules/@babel/highlight": {
-			"version": "7.23.4",
-			"resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz",
-			"integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==",
+			"version": "7.24.7",
+			"resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz",
+			"integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==",
 			"dev": true,
 			"dependencies": {
-				"@babel/helper-validator-identifier": "^7.22.20",
+				"@babel/helper-validator-identifier": "^7.24.7",
 				"chalk": "^2.4.2",
-				"js-tokens": "^4.0.0"
+				"js-tokens": "^4.0.0",
+				"picocolors": "^1.0.0"
 			},
 			"engines": {
 				"node": ">=6.9.0"
@@ -202,9 +132,9 @@
 			}
 		},
 		"node_modules/@csstools/css-parser-algorithms": {
-			"version": "2.4.0",
-			"resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.4.0.tgz",
-			"integrity": "sha512-/PPLr2g5PAUCKAPEbfyk6/baZA+WJHQtUhPkoCQMpyRE8I0lXrG1QFRN8e5s3ZYxM8d/g5BZc6lH3s8Op7/VEg==",
+			"version": "2.7.1",
+			"resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.7.1.tgz",
+			"integrity": "sha512-2SJS42gxmACHgikc1WGesXLIT8d/q2l0UFM7TaEeIzdFCE/FPMtTiizcPGGJtlPo2xuQzY09OhrLTzRxqJqwGw==",
 			"dev": true,
 			"funding": [
 				{
@@ -220,13 +150,13 @@
 				"node": "^14 || ^16 || >=18"
 			},
 			"peerDependencies": {
-				"@csstools/css-tokenizer": "^2.2.2"
+				"@csstools/css-tokenizer": "^2.4.1"
 			}
 		},
 		"node_modules/@csstools/css-tokenizer": {
-			"version": "2.2.2",
-			"resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-2.2.2.tgz",
-			"integrity": "sha512-wCDUe/MAw7npAHFLyW3QjSyLA66S5QFaV1jIXlNQvdJ8RzXDSgALa49eWcUO6P55ARQaz0TsDdAgdRgkXFYY8g==",
+			"version": "2.4.1",
+			"resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-2.4.1.tgz",
+			"integrity": "sha512-eQ9DIktFJBhGjioABJRtUucoWR2mwllurfnM8LuNGAqX3ViZXaUchqk+1s7jjtkFiT9ySdACsFEA3etErkALUg==",
 			"dev": true,
 			"funding": [
 				{
@@ -243,9 +173,9 @@
 			}
 		},
 		"node_modules/@csstools/media-query-list-parser": {
-			"version": "2.1.6",
-			"resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.6.tgz",
-			"integrity": "sha512-R6AKl9vaU0It7D7TR2lQn0pre5aQfdeqHRePlaRCY8rHL3l9eVlNRpsEVDKFi/zAjzv68CxH2M5kqbhPFPKjvw==",
+			"version": "2.1.13",
+			"resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.13.tgz",
+			"integrity": "sha512-XaHr+16KRU9Gf8XLi3q8kDlI18d5vzKSKCY510Vrtc9iNR0NJzbY9hhTmwhzYZj/ZwGL4VmB3TA9hJW0Um2qFA==",
 			"dev": true,
 			"funding": [
 				{
@@ -261,14 +191,14 @@
 				"node": "^14 || ^16 || >=18"
 			},
 			"peerDependencies": {
-				"@csstools/css-parser-algorithms": "^2.4.0",
-				"@csstools/css-tokenizer": "^2.2.2"
+				"@csstools/css-parser-algorithms": "^2.7.1",
+				"@csstools/css-tokenizer": "^2.4.1"
 			}
 		},
 		"node_modules/@csstools/selector-specificity": {
-			"version": "3.0.1",
-			"resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-3.0.1.tgz",
-			"integrity": "sha512-NPljRHkq4a14YzZ3YD406uaxh7s0g6eAq3L9aLOWywoqe8PkYamAvtsh7KNX6c++ihDrJ0RiU+/z7rGnhlZ5ww==",
+			"version": "3.1.1",
+			"resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-3.1.1.tgz",
+			"integrity": "sha512-a7cxGcJ2wIlMFLlh8z2ONm+715QkPHiyJcxwQlKOz/03GPw1COpfhcmC9wm4xlZfp//jWHNNMwzjtqHXVWU9KA==",
 			"dev": true,
 			"funding": [
 				{
@@ -287,18 +217,31 @@
 				"postcss-selector-parser": "^6.0.13"
 			}
 		},
+		"node_modules/@dual-bundle/import-meta-resolve": {
+			"version": "4.1.0",
+			"resolved": "https://registry.npmjs.org/@dual-bundle/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz",
+			"integrity": "sha512-+nxncfwHM5SgAtrVzgpzJOI1ol0PkumhVo469KCf9lUi21IGcY90G98VuHm9VRrUypmAzawAHO9bs6hqeADaVg==",
+			"dev": true,
+			"funding": {
+				"type": "github",
+				"url": "https://github.com/sponsors/wooorm"
+			}
+		},
 		"node_modules/@es-joy/jsdoccomment": {
-			"version": "0.37.1",
-			"resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.37.1.tgz",
-			"integrity": "sha512-5vxWJ1gEkEF0yRd0O+uK6dHJf7adrxwQSX8PuRiPfFSAbNLnY0ZJfXaZucoz14Jj2N11xn2DnlEPwWRpYpvRjg==",
+			"version": "0.43.1",
+			"resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.43.1.tgz",
+			"integrity": "sha512-I238eDtOolvCuvtxrnqtlBaw0BwdQuYqK7eA6XIonicMdOOOb75mqdIzkGDUbS04+1Di007rgm9snFRNeVrOog==",
 			"dev": true,
 			"dependencies": {
-				"comment-parser": "1.3.1",
+				"@types/eslint": "^8.56.5",
+				"@types/estree": "^1.0.5",
+				"@typescript-eslint/types": "^7.2.0",
+				"comment-parser": "1.4.1",
 				"esquery": "^1.5.0",
 				"jsdoc-type-pratt-parser": "~4.0.0"
 			},
 			"engines": {
-				"node": "^14 || ^16 || ^17 || ^18 || ^19 || ^20"
+				"node": ">=16"
 			}
 		},
 		"node_modules/@eslint-community/eslint-utils": {
@@ -317,9 +260,9 @@
 			}
 		},
 		"node_modules/@eslint-community/regexpp": {
-			"version": "4.10.0",
-			"resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz",
-			"integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==",
+			"version": "4.11.0",
+			"resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz",
+			"integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==",
 			"dev": true,
 			"engines": {
 				"node": "^12.0.0 || ^14.0.0 || >=16.0.0"
@@ -349,22 +292,23 @@
 			}
 		},
 		"node_modules/@eslint/js": {
-			"version": "8.56.0",
-			"resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz",
-			"integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==",
+			"version": "8.57.0",
+			"resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz",
+			"integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==",
 			"dev": true,
 			"engines": {
 				"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
 			}
 		},
 		"node_modules/@humanwhocodes/config-array": {
-			"version": "0.11.13",
-			"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz",
-			"integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==",
+			"version": "0.11.14",
+			"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz",
+			"integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==",
+			"deprecated": "Use @eslint/config-array instead",
 			"dev": true,
 			"dependencies": {
-				"@humanwhocodes/object-schema": "^2.0.1",
-				"debug": "^4.1.1",
+				"@humanwhocodes/object-schema": "^2.0.2",
+				"debug": "^4.3.1",
 				"minimatch": "^3.0.5"
 			},
 			"engines": {
@@ -385,9 +329,10 @@
 			}
 		},
 		"node_modules/@humanwhocodes/object-schema": {
-			"version": "2.0.1",
-			"resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz",
-			"integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==",
+			"version": "2.0.3",
+			"resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz",
+			"integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==",
+			"deprecated": "Use @eslint/object-schema instead",
 			"dev": true
 		},
 		"node_modules/@mdn/browser-compat-data": {
@@ -431,6 +376,68 @@
 				"node": ">= 8"
 			}
 		},
+		"node_modules/@stylistic/stylelint-config": {
+			"version": "1.0.1",
+			"resolved": "https://registry.npmjs.org/@stylistic/stylelint-config/-/stylelint-config-1.0.1.tgz",
+			"integrity": "sha512-JgFP88HZEyo34k9RpWVdcQJtLPrMxYE58IO3qypXhmvE/NmZohj+xjDtQ8UfaarnYsLecnldw57/GHum07Ctdw==",
+			"dev": true,
+			"dependencies": {
+				"@stylistic/stylelint-plugin": "^2.0.0"
+			},
+			"engines": {
+				"node": "^18.12 || >=20.9"
+			},
+			"peerDependencies": {
+				"stylelint": "^16.0.2"
+			}
+		},
+		"node_modules/@stylistic/stylelint-plugin": {
+			"version": "2.0.0",
+			"resolved": "https://registry.npmjs.org/@stylistic/stylelint-plugin/-/stylelint-plugin-2.0.0.tgz",
+			"integrity": "sha512-dHKuT6PGd1WGZLOTuozAM7GdQzdmlmnFXYzvV1jYJXXpcCpV/OJ3+n8TXpMkoOeKHpJydY43EOoZTO1W/FOA4Q==",
+			"dev": true,
+			"dependencies": {
+				"@csstools/css-parser-algorithms": "^2.3.2",
+				"@csstools/css-tokenizer": "^2.2.1",
+				"@csstools/media-query-list-parser": "^2.1.5",
+				"is-plain-object": "^5.0.0",
+				"postcss-selector-parser": "^6.0.13",
+				"postcss-value-parser": "^4.2.0",
+				"style-search": "^0.1.0",
+				"stylelint": "^16.0.2"
+			},
+			"engines": {
+				"node": "^18.12 || >=20.9"
+			},
+			"peerDependencies": {
+				"stylelint": "^16.0.2"
+			}
+		},
+		"node_modules/@stylistic/stylelint-plugin/node_modules/is-plain-object": {
+			"version": "5.0.0",
+			"resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
+			"integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==",
+			"dev": true,
+			"engines": {
+				"node": ">=0.10.0"
+			}
+		},
+		"node_modules/@types/eslint": {
+			"version": "8.56.11",
+			"resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.11.tgz",
+			"integrity": "sha512-sVBpJMf7UPo/wGecYOpk2aQya2VUGeHhe38WG7/mN5FufNSubf5VT9Uh9Uyp8/eLJpu1/tuhJ/qTo4mhSB4V4Q==",
+			"dev": true,
+			"dependencies": {
+				"@types/estree": "*",
+				"@types/json-schema": "*"
+			}
+		},
+		"node_modules/@types/estree": {
+			"version": "1.0.5",
+			"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz",
+			"integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==",
+			"dev": true
+		},
 		"node_modules/@types/json-schema": {
 			"version": "7.0.15",
 			"resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
@@ -443,35 +450,23 @@
 			"integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==",
 			"dev": true
 		},
-		"node_modules/@types/minimist": {
-			"version": "1.2.5",
-			"resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz",
-			"integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==",
-			"dev": true
-		},
 		"node_modules/@types/normalize-package-data": {
 			"version": "2.4.4",
 			"resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz",
 			"integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==",
 			"dev": true
 		},
-		"node_modules/@types/semver": {
-			"version": "7.5.6",
-			"resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz",
-			"integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==",
-			"dev": true
-		},
 		"node_modules/@typescript-eslint/scope-manager": {
-			"version": "5.62.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz",
-			"integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==",
+			"version": "7.17.0",
+			"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.17.0.tgz",
+			"integrity": "sha512-0P2jTTqyxWp9HiKLu/Vemr2Rg1Xb5B7uHItdVZ6iAenXmPo4SZ86yOPCJwMqpCyaMiEHTNqizHfsbmCFT1x9SA==",
 			"dev": true,
 			"dependencies": {
-				"@typescript-eslint/types": "5.62.0",
-				"@typescript-eslint/visitor-keys": "5.62.0"
+				"@typescript-eslint/types": "7.17.0",
+				"@typescript-eslint/visitor-keys": "7.17.0"
 			},
 			"engines": {
-				"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+				"node": "^18.18.0 || >=20.0.0"
 			},
 			"funding": {
 				"type": "opencollective",
@@ -479,12 +474,12 @@
 			}
 		},
 		"node_modules/@typescript-eslint/types": {
-			"version": "5.62.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz",
-			"integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==",
+			"version": "7.17.0",
+			"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.17.0.tgz",
+			"integrity": "sha512-a29Ir0EbyKTKHnZWbNsrc/gqfIBqYPwj3F2M+jWE/9bqfEHg0AMtXzkbUkOG6QgEScxh2+Pz9OXe11jHDnHR7A==",
 			"dev": true,
 			"engines": {
-				"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+				"node": "^18.18.0 || >=20.0.0"
 			},
 			"funding": {
 				"type": "opencollective",
@@ -492,21 +487,22 @@
 			}
 		},
 		"node_modules/@typescript-eslint/typescript-estree": {
-			"version": "5.62.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz",
-			"integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==",
+			"version": "7.17.0",
+			"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.17.0.tgz",
+			"integrity": "sha512-72I3TGq93t2GoSBWI093wmKo0n6/b7O4j9o8U+f65TVD0FS6bI2180X5eGEr8MA8PhKMvYe9myZJquUT2JkCZw==",
 			"dev": true,
 			"dependencies": {
-				"@typescript-eslint/types": "5.62.0",
-				"@typescript-eslint/visitor-keys": "5.62.0",
+				"@typescript-eslint/types": "7.17.0",
+				"@typescript-eslint/visitor-keys": "7.17.0",
 				"debug": "^4.3.4",
 				"globby": "^11.1.0",
 				"is-glob": "^4.0.3",
-				"semver": "^7.3.7",
-				"tsutils": "^3.21.0"
+				"minimatch": "^9.0.4",
+				"semver": "^7.6.0",
+				"ts-api-utils": "^1.3.0"
 			},
 			"engines": {
-				"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+				"node": "^18.18.0 || >=20.0.0"
 			},
 			"funding": {
 				"type": "opencollective",
@@ -518,65 +514,63 @@
 				}
 			}
 		},
-		"node_modules/@typescript-eslint/utils": {
-			"version": "5.62.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz",
-			"integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==",
+		"node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": {
+			"version": "2.0.1",
+			"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+			"integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
 			"dev": true,
 			"dependencies": {
-				"@eslint-community/eslint-utils": "^4.2.0",
-				"@types/json-schema": "^7.0.9",
-				"@types/semver": "^7.3.12",
-				"@typescript-eslint/scope-manager": "5.62.0",
-				"@typescript-eslint/types": "5.62.0",
-				"@typescript-eslint/typescript-estree": "5.62.0",
-				"eslint-scope": "^5.1.1",
-				"semver": "^7.3.7"
-			},
-			"engines": {
-				"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
-			},
-			"funding": {
-				"type": "opencollective",
-				"url": "https://opencollective.com/typescript-eslint"
-			},
-			"peerDependencies": {
-				"eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
+				"balanced-match": "^1.0.0"
 			}
 		},
-		"node_modules/@typescript-eslint/utils/node_modules/eslint-scope": {
-			"version": "5.1.1",
-			"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
-			"integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
+		"node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": {
+			"version": "9.0.5",
+			"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
+			"integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
 			"dev": true,
 			"dependencies": {
-				"esrecurse": "^4.3.0",
-				"estraverse": "^4.1.1"
+				"brace-expansion": "^2.0.1"
 			},
 			"engines": {
-				"node": ">=8.0.0"
+				"node": ">=16 || 14 >=14.17"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/isaacs"
 			}
 		},
-		"node_modules/@typescript-eslint/utils/node_modules/estraverse": {
-			"version": "4.3.0",
-			"resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
-			"integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+		"node_modules/@typescript-eslint/utils": {
+			"version": "7.17.0",
+			"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.17.0.tgz",
+			"integrity": "sha512-r+JFlm5NdB+JXc7aWWZ3fKSm1gn0pkswEwIYsrGPdsT2GjsRATAKXiNtp3vgAAO1xZhX8alIOEQnNMl3kbTgJw==",
 			"dev": true,
+			"dependencies": {
+				"@eslint-community/eslint-utils": "^4.4.0",
+				"@typescript-eslint/scope-manager": "7.17.0",
+				"@typescript-eslint/types": "7.17.0",
+				"@typescript-eslint/typescript-estree": "7.17.0"
+			},
 			"engines": {
-				"node": ">=4.0"
+				"node": "^18.18.0 || >=20.0.0"
+			},
+			"funding": {
+				"type": "opencollective",
+				"url": "https://opencollective.com/typescript-eslint"
+			},
+			"peerDependencies": {
+				"eslint": "^8.56.0"
 			}
 		},
 		"node_modules/@typescript-eslint/visitor-keys": {
-			"version": "5.62.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz",
-			"integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==",
+			"version": "7.17.0",
+			"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.17.0.tgz",
+			"integrity": "sha512-RVGC9UhPOCsfCdI9pU++K4nD7to+jTcMIbXTSOcrLqUEW6gF2pU1UUbYJKc9cvcRSK1UDeMJ7pdMxf4bhMpV/A==",
 			"dev": true,
 			"dependencies": {
-				"@typescript-eslint/types": "5.62.0",
-				"eslint-visitor-keys": "^3.3.0"
+				"@typescript-eslint/types": "7.17.0",
+				"eslint-visitor-keys": "^3.4.3"
 			},
 			"engines": {
-				"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+				"node": "^18.18.0 || >=20.0.0"
 			},
 			"funding": {
 				"type": "opencollective",
@@ -596,9 +590,9 @@
 			"dev": true
 		},
 		"node_modules/acorn": {
-			"version": "8.11.2",
-			"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz",
-			"integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==",
+			"version": "8.12.1",
+			"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz",
+			"integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==",
 			"dev": true,
 			"bin": {
 				"acorn": "bin/acorn"
@@ -708,12 +702,12 @@
 			}
 		},
 		"node_modules/arrify": {
-			"version": "1.0.1",
-			"resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
-			"integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==",
+			"version": "2.0.1",
+			"resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz",
+			"integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==",
 			"dev": true,
 			"engines": {
-				"node": ">=0.10.0"
+				"node": ">=8"
 			}
 		},
 		"node_modules/ast-metadata-inferer": {
@@ -763,21 +757,21 @@
 			}
 		},
 		"node_modules/braces": {
-			"version": "3.0.2",
-			"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
-			"integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+			"version": "3.0.3",
+			"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
+			"integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
 			"dev": true,
 			"dependencies": {
-				"fill-range": "^7.0.1"
+				"fill-range": "^7.1.1"
 			},
 			"engines": {
 				"node": ">=8"
 			}
 		},
 		"node_modules/browserslist": {
-			"version": "4.22.2",
-			"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz",
-			"integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==",
+			"version": "4.23.2",
+			"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.2.tgz",
+			"integrity": "sha512-qkqSyistMYdxAcw+CzbZwlBy8AGmS/eEWs+sEV5TnLRGDOL+C5M2EnH6tlZyg0YoAxGJAFKh61En9BR941GnHA==",
 			"dev": true,
 			"funding": [
 				{
@@ -794,10 +788,10 @@
 				}
 			],
 			"dependencies": {
-				"caniuse-lite": "^1.0.30001565",
-				"electron-to-chromium": "^1.4.601",
+				"caniuse-lite": "^1.0.30001640",
+				"electron-to-chromium": "^1.4.820",
 				"node-releases": "^2.0.14",
-				"update-browserslist-db": "^1.0.13"
+				"update-browserslist-db": "^1.1.0"
 			},
 			"bin": {
 				"browserslist": "cli.js"
@@ -807,9 +801,9 @@
 			}
 		},
 		"node_modules/browserslist-config-wikimedia": {
-			"version": "0.5.1",
-			"resolved": "https://registry.npmjs.org/browserslist-config-wikimedia/-/browserslist-config-wikimedia-0.5.1.tgz",
-			"integrity": "sha512-jf532fUf/gaxiKdHgGCQUT552P5up3RpG+CzLixOQBJ5FwDmYQSRLYHCFUA9s3KMOHh4P3xVp+NUaGNxvtoT9g==",
+			"version": "0.7.0",
+			"resolved": "https://registry.npmjs.org/browserslist-config-wikimedia/-/browserslist-config-wikimedia-0.7.0.tgz",
+			"integrity": "sha512-CTa0lv78dXKEgrYsOLCkqO+9UUS3CV9MWEOYHcymgEvx4mYxB80sCoKRCR7wW2SOMNxjaP9hohrZripjnKuRTA==",
 			"dev": true
 		},
 		"node_modules/builtin-modules": {
@@ -824,15 +818,6 @@
 				"url": "https://github.com/sponsors/sindresorhus"
 			}
 		},
-		"node_modules/builtins": {
-			"version": "5.0.1",
-			"resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz",
-			"integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==",
-			"dev": true,
-			"dependencies": {
-				"semver": "^7.0.0"
-			}
-		},
 		"node_modules/callsites": {
 			"version": "3.1.0",
 			"resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
@@ -842,52 +827,10 @@
 				"node": ">=6"
 			}
 		},
-		"node_modules/camelcase": {
-			"version": "6.3.0",
-			"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
-			"integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
-			"dev": true,
-			"engines": {
-				"node": ">=10"
-			},
-			"funding": {
-				"url": "https://github.com/sponsors/sindresorhus"
-			}
-		},
-		"node_modules/camelcase-keys": {
-			"version": "7.0.2",
-			"resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-7.0.2.tgz",
-			"integrity": "sha512-Rjs1H+A9R+Ig+4E/9oyB66UC5Mj9Xq3N//vcLf2WzgdTi/3gUu3Z9KoqmlrEG4VuuLK8wJHofxzdQXz/knhiYg==",
-			"dev": true,
-			"dependencies": {
-				"camelcase": "^6.3.0",
-				"map-obj": "^4.1.0",
-				"quick-lru": "^5.1.1",
-				"type-fest": "^1.2.1"
-			},
-			"engines": {
-				"node": ">=12"
-			},
-			"funding": {
-				"url": "https://github.com/sponsors/sindresorhus"
-			}
-		},
-		"node_modules/camelcase-keys/node_modules/type-fest": {
-			"version": "1.4.0",
-			"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz",
-			"integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==",
-			"dev": true,
-			"engines": {
-				"node": ">=10"
-			},
-			"funding": {
-				"url": "https://github.com/sponsors/sindresorhus"
-			}
-		},
 		"node_modules/caniuse-lite": {
-			"version": "1.0.30001570",
-			"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001570.tgz",
-			"integrity": "sha512-+3e0ASu4sw1SWaoCtvPeyXp+5PsjigkSt8OXZbF9StH5pQWbxEjLAZE3n8Aup5udop1uRiKA7a4utUk/uoSpUw==",
+			"version": "1.0.30001643",
+			"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001643.tgz",
+			"integrity": "sha512-ERgWGNleEilSrHM6iUz/zJNSQTP8Mr21wDWpdgvRwcTXGAq6jMtOUPP4dqFPTdKqZ2wKTdtB+uucZ3MRpAUSmg==",
 			"dev": true,
 			"funding": [
 				{
@@ -921,9 +864,9 @@
 			}
 		},
 		"node_modules/ci-info": {
-			"version": "3.9.0",
-			"resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
-			"integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
+			"version": "4.0.0",
+			"resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.0.0.tgz",
+			"integrity": "sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==",
 			"dev": true,
 			"funding": [
 				{
@@ -957,14 +900,17 @@
 			}
 		},
 		"node_modules/cliui": {
-			"version": "7.0.4",
-			"resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
-			"integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
+			"version": "8.0.1",
+			"resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
+			"integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
 			"dev": true,
 			"dependencies": {
 				"string-width": "^4.2.0",
-				"strip-ansi": "^6.0.0",
+				"strip-ansi": "^6.0.1",
 				"wrap-ansi": "^7.0.0"
+			},
+			"engines": {
+				"node": ">=12"
 			}
 		},
 		"node_modules/color-convert": {
@@ -1001,9 +947,9 @@
 			}
 		},
 		"node_modules/comment-parser": {
-			"version": "1.3.1",
-			"resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.3.1.tgz",
-			"integrity": "sha512-B52sN2VNghyq5ofvUsqZjmk6YkihBX5vMSChmSK9v4ShjKf3Vk5Xcmgpw4o+iIgtrnM/u5FiMpz9VKb8lpBveA==",
+			"version": "1.4.1",
+			"resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.1.tgz",
+			"integrity": "sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==",
 			"dev": true,
 			"engines": {
 				"node": ">= 12.0.0"
@@ -1015,6 +961,19 @@
 			"integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
 			"dev": true
 		},
+		"node_modules/core-js-compat": {
+			"version": "3.37.1",
+			"resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.37.1.tgz",
+			"integrity": "sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg==",
+			"dev": true,
+			"dependencies": {
+				"browserslist": "^4.23.0"
+			},
+			"funding": {
+				"type": "opencollective",
+				"url": "https://opencollective.com/core-js"
+			}
+		},
 		"node_modules/core-util-is": {
 			"version": "1.0.3",
 			"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
@@ -1022,15 +981,15 @@
 			"dev": true
 		},
 		"node_modules/cosmiconfig": {
-			"version": "8.3.6",
-			"resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz",
-			"integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==",
+			"version": "9.0.0",
+			"resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz",
+			"integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==",
 			"dev": true,
 			"dependencies": {
+				"env-paths": "^2.2.1",
 				"import-fresh": "^3.3.0",
 				"js-yaml": "^4.1.0",
-				"parse-json": "^5.2.0",
-				"path-type": "^4.0.0"
+				"parse-json": "^5.2.0"
 			},
 			"engines": {
 				"node": ">=14"
@@ -1062,51 +1021,14 @@
 			}
 		},
 		"node_modules/css-functions-list": {
-			"version": "3.2.1",
-			"resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.1.tgz",
-			"integrity": "sha512-Nj5YcaGgBtuUmn1D7oHqPW0c9iui7xsTsj5lIX8ZgevdfhmjFfKB3r8moHJtNJnctnYXJyYX5I1pp90HM4TPgQ==",
+			"version": "3.2.2",
+			"resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.2.tgz",
+			"integrity": "sha512-c+N0v6wbKVxTu5gOBBFkr9BEdBWaqqjQeiJ8QvSRIJOf+UxlJh930m8e6/WNeODIK0mYLFkoONrnj16i2EcvfQ==",
 			"dev": true,
 			"engines": {
 				"node": ">=12 || >=16"
 			}
 		},
-		"node_modules/css-rule-stream": {
-			"version": "1.1.0",
-			"resolved": "https://registry.npmjs.org/css-rule-stream/-/css-rule-stream-1.1.0.tgz",
-			"integrity": "sha512-qiio/Zkr8I19jh/XuzEkK8OKDQRTrEYaRyIHy4Bwh/tPUe0w8GcQs7r6x24Yc9lT+FbnZFYULxEIXCmaymguUQ==",
-			"dev": true,
-			"dependencies": {
-				"css-tokenize": "^1.0.1",
-				"duplexer2": "0.0.2",
-				"ldjson-stream": "^1.2.1",
-				"through2": "^0.6.3"
-			},
-			"bin": {
-				"css-rule-stream": "index.js"
-			}
-		},
-		"node_modules/css-rule-stream/node_modules/readable-stream": {
-			"version": "1.0.34",
-			"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
-			"integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==",
-			"dev": true,
-			"dependencies": {
-				"core-util-is": "~1.0.0",
-				"inherits": "~2.0.1",
-				"isarray": "0.0.1",
-				"string_decoder": "~0.10.x"
-			}
-		},
-		"node_modules/css-rule-stream/node_modules/through2": {
-			"version": "0.6.5",
-			"resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz",
-			"integrity": "sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg==",
-			"dev": true,
-			"dependencies": {
-				"readable-stream": ">=1.0.33-1 <1.1.0-0",
-				"xtend": ">=4.0.0 <4.1.0-0"
-			}
-		},
 		"node_modules/css-tokenize": {
 			"version": "1.0.1",
 			"resolved": "https://registry.npmjs.org/css-tokenize/-/css-tokenize-1.0.1.tgz",
@@ -1152,9 +1074,9 @@
 			}
 		},
 		"node_modules/debug": {
-			"version": "4.3.4",
-			"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
-			"integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+			"version": "4.3.5",
+			"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz",
+			"integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==",
 			"dev": true,
 			"dependencies": {
 				"ms": "2.1.2"
@@ -1168,65 +1090,19 @@
 				}
 			}
 		},
-		"node_modules/decamelize": {
-			"version": "5.0.1",
-			"resolved": "https://registry.npmjs.org/decamelize/-/decamelize-5.0.1.tgz",
-			"integrity": "sha512-VfxadyCECXgQlkoEAjeghAr5gY3Hf+IKjKb+X8tGVDtveCjN+USwprd2q3QXBR9T1+x2DG0XZF5/w+7HAtSaXA==",
+		"node_modules/deep-is": {
+			"version": "0.1.4",
+			"resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+			"integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+			"dev": true
+		},
+		"node_modules/detect-file": {
+			"version": "1.0.0",
+			"resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz",
+			"integrity": "sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==",
 			"dev": true,
 			"engines": {
-				"node": ">=10"
-			},
-			"funding": {
-				"url": "https://github.com/sponsors/sindresorhus"
-			}
-		},
-		"node_modules/decamelize-keys": {
-			"version": "1.1.1",
-			"resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz",
-			"integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==",
-			"dev": true,
-			"dependencies": {
-				"decamelize": "^1.1.0",
-				"map-obj": "^1.0.0"
-			},
-			"engines": {
-				"node": ">=0.10.0"
-			},
-			"funding": {
-				"url": "https://github.com/sponsors/sindresorhus"
-			}
-		},
-		"node_modules/decamelize-keys/node_modules/decamelize": {
-			"version": "1.2.0",
-			"resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
-			"integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==",
-			"dev": true,
-			"engines": {
-				"node": ">=0.10.0"
-			}
-		},
-		"node_modules/decamelize-keys/node_modules/map-obj": {
-			"version": "1.0.1",
-			"resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
-			"integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==",
-			"dev": true,
-			"engines": {
-				"node": ">=0.10.0"
-			}
-		},
-		"node_modules/deep-is": {
-			"version": "0.1.4",
-			"resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
-			"integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
-			"dev": true
-		},
-		"node_modules/detect-file": {
-			"version": "1.0.0",
-			"resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz",
-			"integrity": "sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==",
-			"dev": true,
-			"engines": {
-				"node": ">=0.10.0"
+				"node": ">=0.10.0"
 			}
 		},
 		"node_modules/dir-glob": {
@@ -1254,27 +1130,26 @@
 			}
 		},
 		"node_modules/doiuse": {
-			"version": "4.4.1",
-			"resolved": "https://registry.npmjs.org/doiuse/-/doiuse-4.4.1.tgz",
-			"integrity": "sha512-TUpr1/YNg20IB09tZmwGCTsTQoxj8jUld/hUZprZMj8vj0VpAJySXEWCr8WMvqvgzk0/kG/FxeSMGKode4UjPg==",
+			"version": "6.0.2",
+			"resolved": "https://registry.npmjs.org/doiuse/-/doiuse-6.0.2.tgz",
+			"integrity": "sha512-eBTs23NOX+EAYPr4RbCR6J4DRW/TML3uMo37y0X1whlkersDYFCk9HmCl09KX98cis22VKsV1QaxfVNauJ3NBw==",
 			"dev": true,
 			"dependencies": {
-				"browserslist": "^4.16.1",
-				"caniuse-lite": "^1.0.30001179",
-				"css-rule-stream": "^1.1.0",
-				"duplexer2": "0.0.2",
+				"browserslist": "^4.21.5",
+				"caniuse-lite": "^1.0.30001487",
+				"css-tokenize": "^1.0.1",
+				"duplexify": "^4.1.2",
 				"ldjson-stream": "^1.2.1",
 				"multimatch": "^5.0.0",
-				"postcss": "^8.2.4",
-				"source-map": "^0.7.3",
-				"through2": "^4.0.2",
-				"yargs": "^16.2.0"
+				"postcss": "^8.4.21",
+				"source-map": "^0.7.4",
+				"yargs": "^17.7.1"
 			},
 			"bin": {
-				"doiuse": "cli.js"
+				"doiuse": "bin/cli.js"
 			},
 			"engines": {
-				"node": ">=10"
+				"node": ">=16"
 			}
 		},
 		"node_modules/dom-serializer": {
@@ -1332,19 +1207,45 @@
 				"url": "https://github.com/fb55/domutils?sponsor=1"
 			}
 		},
-		"node_modules/duplexer2": {
-			"version": "0.0.2",
-			"resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz",
-			"integrity": "sha512-+AWBwjGadtksxjOQSFDhPNQbed7icNXApT4+2BNpsXzcCBiInq2H9XW0O8sfHFaPmnQRs7cg/P0fAr2IWQSW0g==",
+		"node_modules/duplexify": {
+			"version": "4.1.3",
+			"resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.3.tgz",
+			"integrity": "sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==",
+			"dev": true,
+			"dependencies": {
+				"end-of-stream": "^1.4.1",
+				"inherits": "^2.0.3",
+				"readable-stream": "^3.1.1",
+				"stream-shift": "^1.0.2"
+			}
+		},
+		"node_modules/duplexify/node_modules/readable-stream": {
+			"version": "3.6.2",
+			"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
+			"integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
+			"dev": true,
+			"dependencies": {
+				"inherits": "^2.0.3",
+				"string_decoder": "^1.1.1",
+				"util-deprecate": "^1.0.1"
+			},
+			"engines": {
+				"node": ">= 6"
+			}
+		},
+		"node_modules/duplexify/node_modules/string_decoder": {
+			"version": "1.3.0",
+			"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+			"integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
 			"dev": true,
 			"dependencies": {
-				"readable-stream": "~1.1.9"
+				"safe-buffer": "~5.2.0"
 			}
 		},
 		"node_modules/electron-to-chromium": {
-			"version": "1.4.615",
-			"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.615.tgz",
-			"integrity": "sha512-/bKPPcgZVUziECqDc+0HkT87+0zhaWSZHNXqF8FLd2lQcptpmUFwoCSWjCdOng9Gdq+afKArPdEg/0ZW461Eng==",
+			"version": "1.5.0",
+			"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.0.tgz",
+			"integrity": "sha512-Vb3xHHYnLseK8vlMJQKJYXJ++t4u1/qJ3vykuVrVjvdiOEhYyT1AuP4x03G8EnPmYvYOhe9T+dADTmthjRQMkA==",
 			"dev": true
 		},
 		"node_modules/emoji-regex": {
@@ -1353,6 +1254,28 @@
 			"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
 			"dev": true
 		},
+		"node_modules/end-of-stream": {
+			"version": "1.4.4",
+			"resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
+			"integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
+			"dev": true,
+			"dependencies": {
+				"once": "^1.4.0"
+			}
+		},
+		"node_modules/enhanced-resolve": {
+			"version": "5.17.1",
+			"resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz",
+			"integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==",
+			"dev": true,
+			"dependencies": {
+				"graceful-fs": "^4.2.4",
+				"tapable": "^2.2.0"
+			},
+			"engines": {
+				"node": ">=10.13.0"
+			}
+		},
 		"node_modules/entities": {
 			"version": "4.5.0",
 			"resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
@@ -1365,6 +1288,15 @@
 				"url": "https://github.com/fb55/entities?sponsor=1"
 			}
 		},
+		"node_modules/env-paths": {
+			"version": "2.2.1",
+			"resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz",
+			"integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==",
+			"dev": true,
+			"engines": {
+				"node": ">=6"
+			}
+		},
 		"node_modules/error-ex": {
 			"version": "1.3.2",
 			"resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
@@ -1375,9 +1307,9 @@
 			}
 		},
 		"node_modules/escalade": {
-			"version": "3.1.1",
-			"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
-			"integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+			"version": "3.1.2",
+			"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz",
+			"integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==",
 			"dev": true,
 			"engines": {
 				"node": ">=6"
@@ -1396,16 +1328,16 @@
 			}
 		},
 		"node_modules/eslint": {
-			"version": "8.56.0",
-			"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz",
-			"integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==",
+			"version": "8.57.0",
+			"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz",
+			"integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==",
 			"dev": true,
 			"dependencies": {
 				"@eslint-community/eslint-utils": "^4.2.0",
 				"@eslint-community/regexpp": "^4.6.1",
 				"@eslint/eslintrc": "^2.1.4",
-				"@eslint/js": "8.56.0",
-				"@humanwhocodes/config-array": "^0.11.13",
+				"@eslint/js": "8.57.0",
+				"@humanwhocodes/config-array": "^0.11.14",
 				"@humanwhocodes/module-importer": "^1.0.1",
 				"@nodelib/fs.walk": "^1.2.8",
 				"@ungap/structured-clone": "^1.2.0",
@@ -1451,10 +1383,13 @@
 			}
 		},
 		"node_modules/eslint-compat-utils": {
-			"version": "0.1.2",
-			"resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.1.2.tgz",
-			"integrity": "sha512-Jia4JDldWnFNIru1Ehx1H5s9/yxiRHY/TimCuUc0jNexew3cF1gI6CYZil1ociakfWO3rRqFjl1mskBblB3RYg==",
+			"version": "0.5.1",
+			"resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.5.1.tgz",
+			"integrity": "sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==",
 			"dev": true,
+			"dependencies": {
+				"semver": "^7.5.4"
+			},
 			"engines": {
 				"node": ">=12"
 			},
@@ -1463,28 +1398,28 @@
 			}
 		},
 		"node_modules/eslint-config-wikimedia": {
-			"version": "0.26.0",
-			"resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.26.0.tgz",
-			"integrity": "sha512-TAXTySls9k3oWs754rIjlcd9PBLvYeMvjqjiuU8u4gweu0UDgBJGslf+zcvVNXEooAtyLZdENjrzDDjG8ssS7Q==",
+			"version": "0.28.2",
+			"resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.28.2.tgz",
+			"integrity": "sha512-5+rdnT7wH1gpKAO6tHYThg78eMhZMruJzvqku3Y5iaEY/A7kSKLFpA/vOj/snys9fKjDHC9BXmArQh+agkOoJQ==",
 			"dev": true,
 			"dependencies": {
-				"browserslist-config-wikimedia": "^0.5.1",
-				"eslint": "^8.53.0",
+				"browserslist-config-wikimedia": "^0.7.0",
+				"eslint": "^8.57.0",
 				"eslint-plugin-compat": "^4.2.0",
-				"eslint-plugin-es-x": "^7.3.0",
-				"eslint-plugin-jest": "^27.6.0",
-				"eslint-plugin-jsdoc": "^42.0.0",
-				"eslint-plugin-json-es": "^1.5.7",
-				"eslint-plugin-mediawiki": "^0.5.0",
-				"eslint-plugin-mocha": "^10.2.0",
-				"eslint-plugin-n": "^16.0.1",
-				"eslint-plugin-no-jquery": "^2.7.0",
-				"eslint-plugin-qunit": "^7.3.4",
+				"eslint-plugin-es-x": "^7.6.0",
+				"eslint-plugin-jest": "^28.5.0",
+				"eslint-plugin-jsdoc": "48.2.5",
+				"eslint-plugin-json-es": "^1.6.0",
+				"eslint-plugin-mediawiki": "^0.7.0",
+				"eslint-plugin-mocha": "^10.4.3",
+				"eslint-plugin-n": "^17.7.0",
+				"eslint-plugin-no-jquery": "^3.0.1",
+				"eslint-plugin-qunit": "^8.1.1",
 				"eslint-plugin-security": "^1.7.1",
-				"eslint-plugin-unicorn": "^47.0.0",
-				"eslint-plugin-vue": "^9.18.1",
-				"eslint-plugin-wdio": "^7.19.4",
-				"eslint-plugin-yml": "^1.10.0"
+				"eslint-plugin-unicorn": "^53.0.0",
+				"eslint-plugin-vue": "^9.26.0",
+				"eslint-plugin-wdio": "^8.24.12",
+				"eslint-plugin-yml": "^1.14.0"
 			}
 		},
 		"node_modules/eslint-plugin-compat": {
@@ -1509,39 +1444,40 @@
 			}
 		},
 		"node_modules/eslint-plugin-es-x": {
-			"version": "7.5.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.5.0.tgz",
-			"integrity": "sha512-ODswlDSO0HJDzXU0XvgZ3lF3lS3XAZEossh15Q2UHjwrJggWeBoKqqEsLTZLXl+dh5eOAozG0zRcYtuE35oTuQ==",
+			"version": "7.8.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.8.0.tgz",
+			"integrity": "sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==",
 			"dev": true,
+			"funding": [
+				"https://github.com/sponsors/ota-meshi",
+				"https://opencollective.com/eslint"
+			],
 			"dependencies": {
 				"@eslint-community/eslint-utils": "^4.1.2",
-				"@eslint-community/regexpp": "^4.6.0",
-				"eslint-compat-utils": "^0.1.2"
+				"@eslint-community/regexpp": "^4.11.0",
+				"eslint-compat-utils": "^0.5.1"
 			},
 			"engines": {
 				"node": "^14.18.0 || >=16.0.0"
 			},
-			"funding": {
-				"url": "https://github.com/sponsors/ota-meshi"
-			},
 			"peerDependencies": {
 				"eslint": ">=8"
 			}
 		},
 		"node_modules/eslint-plugin-jest": {
-			"version": "27.6.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.6.0.tgz",
-			"integrity": "sha512-MTlusnnDMChbElsszJvrwD1dN3x6nZl//s4JD23BxB6MgR66TZlL064su24xEIS3VACfAoHV1vgyMgPw8nkdng==",
+			"version": "28.6.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-28.6.0.tgz",
+			"integrity": "sha512-YG28E1/MIKwnz+e2H7VwYPzHUYU4aMa19w0yGcwXnnmJH6EfgHahTJ2un3IyraUxNfnz/KUhJAFXNNwWPo12tg==",
 			"dev": true,
 			"dependencies": {
-				"@typescript-eslint/utils": "^5.10.0"
+				"@typescript-eslint/utils": "^6.0.0 || ^7.0.0"
 			},
 			"engines": {
-				"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+				"node": "^16.10.0 || ^18.12.0 || >=20.0.0"
 			},
 			"peerDependencies": {
-				"@typescript-eslint/eslint-plugin": "^5.0.0 || ^6.0.0",
-				"eslint": "^7.0.0 || ^8.0.0",
+				"@typescript-eslint/eslint-plugin": "^6.0.0 || ^7.0.0",
+				"eslint": "^7.0.0 || ^8.0.0 || ^9.0.0",
 				"jest": "*"
 			},
 			"peerDependenciesMeta": {
@@ -1554,31 +1490,32 @@
 			}
 		},
 		"node_modules/eslint-plugin-jsdoc": {
-			"version": "42.0.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-42.0.0.tgz",
-			"integrity": "sha512-qXYr45G8atPKowZbIOdmABukMzu9IMjAlj6j5Fe0iuUItznWSXUDiBj57ejXcbt8bkPrg83333nuz+cqGKFgcQ==",
+			"version": "48.2.5",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-48.2.5.tgz",
+			"integrity": "sha512-ZeTfKV474W1N9niWfawpwsXGu+ZoMXu4417eBROX31d7ZuOk8zyG66SO77DpJ2+A9Wa2scw/jRqBPnnQo7VbcQ==",
 			"dev": true,
 			"dependencies": {
-				"@es-joy/jsdoccomment": "~0.37.0",
+				"@es-joy/jsdoccomment": "~0.43.0",
 				"are-docs-informative": "^0.0.2",
-				"comment-parser": "1.3.1",
+				"comment-parser": "1.4.1",
 				"debug": "^4.3.4",
 				"escape-string-regexp": "^4.0.0",
 				"esquery": "^1.5.0",
-				"semver": "^7.3.8",
-				"spdx-expression-parse": "^3.0.1"
+				"is-builtin-module": "^3.2.1",
+				"semver": "^7.6.1",
+				"spdx-expression-parse": "^4.0.0"
 			},
 			"engines": {
-				"node": "^14 || ^16 || ^17 || ^18 || ^19"
+				"node": ">=18"
 			},
 			"peerDependencies": {
-				"eslint": "^7.0.0 || ^8.0.0"
+				"eslint": "^7.0.0 || ^8.0.0 || ^9.0.0"
 			}
 		},
 		"node_modules/eslint-plugin-json-es": {
-			"version": "1.5.7",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-json-es/-/eslint-plugin-json-es-1.5.7.tgz",
-			"integrity": "sha512-ehBHcCcJo4iViYx6vp3T+SmwzLIlVDzZNoVxN/txZIiPwDQ26mnYaN5iJ3imqN4l1b8z6rbxEH2kB9XDGxeU/w==",
+			"version": "1.6.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-json-es/-/eslint-plugin-json-es-1.6.0.tgz",
+			"integrity": "sha512-xVn6hufGQH1Aa+yqOhQ43Cq28GuitTcMpQh+uaUh27U2qnVLBrvkN+2xQSnv6zpdLEPS35JCNhq4kvhR+PQCgw==",
 			"dev": true,
 			"dependencies": {
 				"eslint-visitor-keys": "^3.3.0",
@@ -1589,125 +1526,116 @@
 			}
 		},
 		"node_modules/eslint-plugin-mediawiki": {
-			"version": "0.5.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-mediawiki/-/eslint-plugin-mediawiki-0.5.0.tgz",
-			"integrity": "sha512-rjkHFyv3VDan/dmu7YpD1Rl9h64NOlz4mqqesRN316R+571+ymmb6lXVOdNMbT8H1iPhmtHc+nijVLVkn7pYDw==",
+			"version": "0.7.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-mediawiki/-/eslint-plugin-mediawiki-0.7.0.tgz",
+			"integrity": "sha512-1Y2nsFDPp96xOZCB5ivZAgqYe9i6w2u64VoCIaAzPyZnd/2h8VQR3CtD+u4Yk/KrpbKq9AAJjrs5LS8VAz6KOA==",
 			"dev": true,
 			"dependencies": {
-				"eslint-plugin-vue": "^8.7.1",
+				"eslint-plugin-vue": "^9.23.0",
 				"upath": "^2.0.1"
 			},
 			"peerDependencies": {
 				"eslint": ">=5.0.0"
 			}
 		},
-		"node_modules/eslint-plugin-mediawiki/node_modules/eslint-plugin-vue": {
-			"version": "8.7.1",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-8.7.1.tgz",
-			"integrity": "sha512-28sbtm4l4cOzoO1LtzQPxfxhQABararUb1JtqusQqObJpWX2e/gmVyeYVfepizPFne0Q5cILkYGiBoV36L12Wg==",
+		"node_modules/eslint-plugin-mocha": {
+			"version": "10.4.3",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-10.4.3.tgz",
+			"integrity": "sha512-emc4TVjq5Ht0/upR+psftuz6IBG5q279p+1dSRDeHf+NS9aaerBi3lXKo1SEzwC29hFIW21gO89CEWSvRsi8IQ==",
 			"dev": true,
 			"dependencies": {
 				"eslint-utils": "^3.0.0",
-				"natural-compare": "^1.4.0",
-				"nth-check": "^2.0.1",
-				"postcss-selector-parser": "^6.0.9",
-				"semver": "^7.3.5",
-				"vue-eslint-parser": "^8.0.1"
+				"globals": "^13.24.0",
+				"rambda": "^7.4.0"
 			},
 			"engines": {
-				"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+				"node": ">=14.0.0"
 			},
 			"peerDependencies": {
-				"eslint": "^6.2.0 || ^7.0.0 || ^8.0.0"
+				"eslint": ">=7.0.0"
 			}
 		},
-		"node_modules/eslint-plugin-mediawiki/node_modules/vue-eslint-parser": {
-			"version": "8.3.0",
-			"resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-8.3.0.tgz",
-			"integrity": "sha512-dzHGG3+sYwSf6zFBa0Gi9ZDshD7+ad14DGOdTLjruRVgZXe2J+DcZ9iUhyR48z5g1PqRa20yt3Njna/veLJL/g==",
+		"node_modules/eslint-plugin-n": {
+			"version": "17.9.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-17.9.0.tgz",
+			"integrity": "sha512-CPSaXDXdrT4nsrOrO4mT4VB6FMUkoySRkHWuuJJHVqsIEjIeZgMY1H7AzSwPbDScikBmLN82KeM1u7ixV7PzGg==",
 			"dev": true,
 			"dependencies": {
-				"debug": "^4.3.2",
-				"eslint-scope": "^7.0.0",
-				"eslint-visitor-keys": "^3.1.0",
-				"espree": "^9.0.0",
-				"esquery": "^1.4.0",
-				"lodash": "^4.17.21",
-				"semver": "^7.3.5"
+				"@eslint-community/eslint-utils": "^4.4.0",
+				"enhanced-resolve": "^5.17.0",
+				"eslint-plugin-es-x": "^7.5.0",
+				"get-tsconfig": "^4.7.0",
+				"globals": "^15.0.0",
+				"ignore": "^5.2.4",
+				"minimatch": "^9.0.0",
+				"semver": "^7.5.3"
 			},
 			"engines": {
-				"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+				"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
 			},
 			"funding": {
-				"url": "https://github.com/sponsors/mysticatea"
+				"url": "https://opencollective.com/eslint"
 			},
 			"peerDependencies": {
-				"eslint": ">=6.0.0"
+				"eslint": ">=8.23.0"
 			}
 		},
-		"node_modules/eslint-plugin-mocha": {
-			"version": "10.2.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-10.2.0.tgz",
-			"integrity": "sha512-ZhdxzSZnd1P9LqDPF0DBcFLpRIGdh1zkF2JHnQklKQOvrQtT73kdP5K9V2mzvbLR+cCAO9OI48NXK/Ax9/ciCQ==",
+		"node_modules/eslint-plugin-n/node_modules/brace-expansion": {
+			"version": "2.0.1",
+			"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+			"integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
 			"dev": true,
 			"dependencies": {
-				"eslint-utils": "^3.0.0",
-				"rambda": "^7.4.0"
-			},
+				"balanced-match": "^1.0.0"
+			}
+		},
+		"node_modules/eslint-plugin-n/node_modules/globals": {
+			"version": "15.8.0",
+			"resolved": "https://registry.npmjs.org/globals/-/globals-15.8.0.tgz",
+			"integrity": "sha512-VZAJ4cewHTExBWDHR6yptdIBlx9YSSZuwojj9Nt5mBRXQzrKakDsVKQ1J63sklLvzAJm0X5+RpO4i3Y2hcOnFw==",
+			"dev": true,
 			"engines": {
-				"node": ">=14.0.0"
+				"node": ">=18"
 			},
-			"peerDependencies": {
-				"eslint": ">=7.0.0"
+			"funding": {
+				"url": "https://github.com/sponsors/sindresorhus"
 			}
 		},
-		"node_modules/eslint-plugin-n": {
-			"version": "16.5.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-16.5.0.tgz",
-			"integrity": "sha512-Hw02Bj1QrZIlKyj471Tb1jSReTl4ghIMHGuBGiMVmw+s0jOPbI4CBuYpGbZr+tdQ+VAvSK6FDSta3J4ib/SKHQ==",
+		"node_modules/eslint-plugin-n/node_modules/minimatch": {
+			"version": "9.0.5",
+			"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
+			"integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
 			"dev": true,
 			"dependencies": {
-				"@eslint-community/eslint-utils": "^4.4.0",
-				"builtins": "^5.0.1",
-				"eslint-plugin-es-x": "^7.5.0",
-				"get-tsconfig": "^4.7.0",
-				"ignore": "^5.2.4",
-				"is-builtin-module": "^3.2.1",
-				"is-core-module": "^2.12.1",
-				"minimatch": "^3.1.2",
-				"resolve": "^1.22.2",
-				"semver": "^7.5.3"
+				"brace-expansion": "^2.0.1"
 			},
 			"engines": {
-				"node": ">=16.0.0"
+				"node": ">=16 || 14 >=14.17"
 			},
 			"funding": {
-				"url": "https://github.com/sponsors/mysticatea"
-			},
-			"peerDependencies": {
-				"eslint": ">=7.0.0"
+				"url": "https://github.com/sponsors/isaacs"
 			}
 		},
 		"node_modules/eslint-plugin-no-jquery": {
-			"version": "2.7.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-no-jquery/-/eslint-plugin-no-jquery-2.7.0.tgz",
-			"integrity": "sha512-Aeg7dA6GTH1AcWLlBtWNzOU9efK5KpNi7b0EhBO0o0M+awyzguUUo8gF6hXGjQ9n5h8/uRtYv9zOqQkeC5CG0w==",
+			"version": "3.0.2",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-no-jquery/-/eslint-plugin-no-jquery-3.0.2.tgz",
+			"integrity": "sha512-n/+6p6PFhWDNPVLJj1463hw4OTIRBbROGcbhmtOHTgw7yihSKzkwZiQ00EJTneyeR3jRiw5lpWSMCCBhtb8t2g==",
 			"dev": true,
 			"peerDependencies": {
-				"eslint": ">=2.3.0"
+				"eslint": ">=8.0.0"
 			}
 		},
 		"node_modules/eslint-plugin-qunit": {
-			"version": "7.3.4",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-qunit/-/eslint-plugin-qunit-7.3.4.tgz",
-			"integrity": "sha512-EbDM0zJerH9zVdUswMJpcFF7wrrpvsGuYfNexUpa5hZkkdFhaFcX+yD+RSK4Nrauw4psMGlcqeWUMhaVo+Manw==",
+			"version": "8.1.1",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-qunit/-/eslint-plugin-qunit-8.1.1.tgz",
+			"integrity": "sha512-j3xhiAf2Wvr8Dfwl5T6tlJ+F55vqYE9ZdAHUOTzq1lGerYrXzOS46RvK4SSWug2D8sl3ZYr2lA4/hgVXgLloxw==",
 			"dev": true,
 			"dependencies": {
 				"eslint-utils": "^3.0.0",
 				"requireindex": "^1.2.0"
 			},
 			"engines": {
-				"node": "12.x || 14.x || >=16.0.0"
+				"node": "^16.0.0 || ^18.0.0 || >=20.0.0"
 			}
 		},
 		"node_modules/eslint-plugin-security": {
@@ -1720,76 +1648,141 @@
 			}
 		},
 		"node_modules/eslint-plugin-unicorn": {
-			"version": "47.0.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-47.0.0.tgz",
-			"integrity": "sha512-ivB3bKk7fDIeWOUmmMm9o3Ax9zbMz1Bsza/R2qm46ufw4T6VBFBaJIR1uN3pCKSmSXm8/9Nri8V+iUut1NhQGA==",
+			"version": "53.0.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-53.0.0.tgz",
+			"integrity": "sha512-kuTcNo9IwwUCfyHGwQFOK/HjJAYzbODHN3wP0PgqbW+jbXqpNWxNVpVhj2tO9SixBwuAdmal8rVcWKBxwFnGuw==",
 			"dev": true,
 			"dependencies": {
-				"@babel/helper-validator-identifier": "^7.19.1",
+				"@babel/helper-validator-identifier": "^7.24.5",
 				"@eslint-community/eslint-utils": "^4.4.0",
-				"ci-info": "^3.8.0",
+				"@eslint/eslintrc": "^3.0.2",
+				"ci-info": "^4.0.0",
 				"clean-regexp": "^1.0.0",
+				"core-js-compat": "^3.37.0",
 				"esquery": "^1.5.0",
 				"indent-string": "^4.0.0",
 				"is-builtin-module": "^3.2.1",
 				"jsesc": "^3.0.2",
-				"lodash": "^4.17.21",
 				"pluralize": "^8.0.0",
 				"read-pkg-up": "^7.0.1",
-				"regexp-tree": "^0.1.24",
+				"regexp-tree": "^0.1.27",
 				"regjsparser": "^0.10.0",
-				"safe-regex": "^2.1.1",
-				"semver": "^7.3.8",
+				"semver": "^7.6.1",
 				"strip-indent": "^3.0.0"
 			},
 			"engines": {
-				"node": ">=16"
+				"node": ">=18.18"
 			},
 			"funding": {
 				"url": "https://github.com/sindresorhus/eslint-plugin-unicorn?sponsor=1"
 			},
 			"peerDependencies": {
-				"eslint": ">=8.38.0"
+				"eslint": ">=8.56.0"
+			}
+		},
+		"node_modules/eslint-plugin-unicorn/node_modules/@eslint/eslintrc": {
+			"version": "3.1.0",
+			"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz",
+			"integrity": "sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==",
+			"dev": true,
+			"dependencies": {
+				"ajv": "^6.12.4",
+				"debug": "^4.3.2",
+				"espree": "^10.0.1",
+				"globals": "^14.0.0",
+				"ignore": "^5.2.0",
+				"import-fresh": "^3.2.1",
+				"js-yaml": "^4.1.0",
+				"minimatch": "^3.1.2",
+				"strip-json-comments": "^3.1.1"
+			},
+			"engines": {
+				"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+			},
+			"funding": {
+				"url": "https://opencollective.com/eslint"
+			}
+		},
+		"node_modules/eslint-plugin-unicorn/node_modules/eslint-visitor-keys": {
+			"version": "4.0.0",
+			"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz",
+			"integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==",
+			"dev": true,
+			"engines": {
+				"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+			},
+			"funding": {
+				"url": "https://opencollective.com/eslint"
+			}
+		},
+		"node_modules/eslint-plugin-unicorn/node_modules/espree": {
+			"version": "10.1.0",
+			"resolved": "https://registry.npmjs.org/espree/-/espree-10.1.0.tgz",
+			"integrity": "sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA==",
+			"dev": true,
+			"dependencies": {
+				"acorn": "^8.12.0",
+				"acorn-jsx": "^5.3.2",
+				"eslint-visitor-keys": "^4.0.0"
+			},
+			"engines": {
+				"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+			},
+			"funding": {
+				"url": "https://opencollective.com/eslint"
+			}
+		},
+		"node_modules/eslint-plugin-unicorn/node_modules/globals": {
+			"version": "14.0.0",
+			"resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz",
+			"integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==",
+			"dev": true,
+			"engines": {
+				"node": ">=18"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/sindresorhus"
 			}
 		},
 		"node_modules/eslint-plugin-vue": {
-			"version": "9.19.2",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.19.2.tgz",
-			"integrity": "sha512-CPDqTOG2K4Ni2o4J5wixkLVNwgctKXFu6oBpVJlpNq7f38lh9I80pRTouZSJ2MAebPJlINU/KTFSXyQfBUlymA==",
+			"version": "9.27.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.27.0.tgz",
+			"integrity": "sha512-5Dw3yxEyuBSXTzT5/Ge1X5kIkRTQ3nvBn/VwPwInNiZBSJOO/timWMUaflONnFBzU6NhB68lxnCda7ULV5N7LA==",
 			"dev": true,
 			"dependencies": {
 				"@eslint-community/eslint-utils": "^4.4.0",
+				"globals": "^13.24.0",
 				"natural-compare": "^1.4.0",
 				"nth-check": "^2.1.1",
-				"postcss-selector-parser": "^6.0.13",
-				"semver": "^7.5.4",
-				"vue-eslint-parser": "^9.3.1",
+				"postcss-selector-parser": "^6.0.15",
+				"semver": "^7.6.0",
+				"vue-eslint-parser": "^9.4.3",
 				"xml-name-validator": "^4.0.0"
 			},
 			"engines": {
 				"node": "^14.17.0 || >=16.0.0"
 			},
 			"peerDependencies": {
-				"eslint": "^6.2.0 || ^7.0.0 || ^8.0.0"
+				"eslint": "^6.2.0 || ^7.0.0 || ^8.0.0 || ^9.0.0"
 			}
 		},
 		"node_modules/eslint-plugin-wdio": {
-			"version": "7.25.3",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-wdio/-/eslint-plugin-wdio-7.25.3.tgz",
-			"integrity": "sha512-2zbYwV14Md9FNlyhaIILVGPB6w4bu2eJdOTywDUs2Qy4ebcQNwrxB0qCaf7Rm4O+T0Ir+tdYHYBBfbDocSLKng==",
+			"version": "8.37.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-wdio/-/eslint-plugin-wdio-8.37.0.tgz",
+			"integrity": "sha512-X217zXxSqj1IPWu3bxN7D/xEUmNk7Jg5lBf2JwYH3mCogaqL2tnHZnwt0EQ5D9oEejfEl2+4zqHSzhXq1X7F2A==",
 			"dev": true,
 			"engines": {
-				"node": ">=12.0.0"
+				"node": "^16.13 || >=18"
 			}
 		},
 		"node_modules/eslint-plugin-yml": {
-			"version": "1.11.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-yml/-/eslint-plugin-yml-1.11.0.tgz",
-			"integrity": "sha512-NBZP1NDGy0u38pY5ieix75jxS9GNOJy9xd4gQa0rU4gWbfEsVhKDwuFaQ6RJpDbv6Lq5TtcAZS/YnAc0oeRw0w==",
+			"version": "1.14.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-yml/-/eslint-plugin-yml-1.14.0.tgz",
+			"integrity": "sha512-ESUpgYPOcAYQO9czugcX5OqRvn/ydDVwGCPXY4YjPqc09rHaUVUA6IE6HLQys4rXk/S+qx3EwTd1wHCwam/OWQ==",
 			"dev": true,
 			"dependencies": {
 				"debug": "^4.3.2",
-				"eslint-compat-utils": "^0.1.1",
+				"eslint-compat-utils": "^0.5.0",
 				"lodash": "^4.17.21",
 				"natural-compare": "^1.4.0",
 				"yaml-eslint-parser": "^1.2.1"
@@ -2010,6 +2003,12 @@
 			"integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
 			"dev": true
 		},
+		"node_modules/fast-uri": {
+			"version": "3.0.1",
+			"resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.1.tgz",
+			"integrity": "sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==",
+			"dev": true
+		},
 		"node_modules/fastest-levenshtein": {
 			"version": "1.0.16",
 			"resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz",
@@ -2041,9 +2040,9 @@
 			}
 		},
 		"node_modules/fill-range": {
-			"version": "7.0.1",
-			"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
-			"integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+			"version": "7.1.1",
+			"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+			"integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
 			"dev": true,
 			"dependencies": {
 				"to-regex-range": "^5.0.1"
@@ -2123,9 +2122,9 @@
 			}
 		},
 		"node_modules/flatted": {
-			"version": "3.2.9",
-			"resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz",
-			"integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==",
+			"version": "3.3.1",
+			"resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz",
+			"integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==",
 			"dev": true
 		},
 		"node_modules/for-in": {
@@ -2174,9 +2173,9 @@
 			}
 		},
 		"node_modules/get-tsconfig": {
-			"version": "4.7.2",
-			"resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.2.tgz",
-			"integrity": "sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==",
+			"version": "4.7.6",
+			"resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.6.tgz",
+			"integrity": "sha512-ZAqrLlu18NbDdRaHq+AKXzAmqIUPswPWKUchfytdAjiRFnCe5ojG2bstg6mRiZabkKfCoL/e98pbBELIV/YCeA==",
 			"dev": true,
 			"dependencies": {
 				"resolve-pkg-maps": "^1.0.0"
@@ -2309,6 +2308,12 @@
 			"integrity": "sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==",
 			"dev": true
 		},
+		"node_modules/graceful-fs": {
+			"version": "4.2.11",
+			"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+			"integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
+			"dev": true
+		},
 		"node_modules/graphemer": {
 			"version": "1.4.0",
 			"resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
@@ -2343,15 +2348,18 @@
 			}
 		},
 		"node_modules/grunt-banana-checker": {
-			"version": "0.11.1",
-			"resolved": "https://registry.npmjs.org/grunt-banana-checker/-/grunt-banana-checker-0.11.1.tgz",
-			"integrity": "sha512-CF0h/TXaX9sbF2yIz+fUfJc4Zvms7XGYQ7ZYMD5+vv0LMZzSFf7JSHXDaBEs72nQWw4r4ap5fOW3baAliW+0bQ==",
+			"version": "0.13.0",
+			"resolved": "https://registry.npmjs.org/grunt-banana-checker/-/grunt-banana-checker-0.13.0.tgz",
+			"integrity": "sha512-uAUKILcP69Q4OJHHV2wzxqVaoXB8G3Uh/XuSJLn0Bk/9+WiUY/Q4+OX7dUhrPPeDZPtoGh37qqJLVvZlDTUecg==",
 			"dev": true,
+			"dependencies": {
+				"chalk": "4.1.2"
+			},
 			"bin": {
 				"banana-checker": "src/cli.js"
 			},
 			"engines": {
-				"node": ">=8"
+				"node": ">=16"
 			}
 		},
 		"node_modules/grunt-cli": {
@@ -2461,18 +2469,18 @@
 			}
 		},
 		"node_modules/grunt-stylelint": {
-			"version": "0.19.0",
-			"resolved": "https://registry.npmjs.org/grunt-stylelint/-/grunt-stylelint-0.19.0.tgz",
-			"integrity": "sha512-td+OvkfQ/2bYXNTBAlnpXmfa6sddLSloXRp1zoUONcMScbvEq5S3GSkOZKpCjK90WSjTYR0L7WYFcMVd1TXd+w==",
+			"version": "0.20.1",
+			"resolved": "https://registry.npmjs.org/grunt-stylelint/-/grunt-stylelint-0.20.1.tgz",
+			"integrity": "sha512-tDep9ceEerB+fK6CkzPBXu5qPM7RuwCRgfrtwugEyYYnxINreMZktqQU5eoTW+MhhFj81uWQQnxf+c4geyAmQg==",
 			"dev": true,
 			"dependencies": {
 				"chalk": "^4.1.2"
 			},
 			"engines": {
-				"node": ">=16"
+				"node": ">=18.12.0"
 			},
 			"peerDependencies": {
-				"stylelint": "15.x"
+				"stylelint": "16.x"
 			}
 		},
 		"node_modules/grunt/node_modules/argparse": {
@@ -2515,15 +2523,6 @@
 			"integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
 			"dev": true
 		},
-		"node_modules/hard-rejection": {
-			"version": "2.1.0",
-			"resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz",
-			"integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==",
-			"dev": true,
-			"engines": {
-				"node": ">=6"
-			}
-		},
 		"node_modules/has-flag": {
 			"version": "4.0.0",
 			"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
@@ -2616,9 +2615,9 @@
 			}
 		},
 		"node_modules/ignore": {
-			"version": "5.3.0",
-			"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz",
-			"integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==",
+			"version": "5.3.1",
+			"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz",
+			"integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==",
 			"dev": true,
 			"engines": {
 				"node": ">= 4"
@@ -2640,15 +2639,6 @@
 				"url": "https://github.com/sponsors/sindresorhus"
 			}
 		},
-		"node_modules/import-lazy": {
-			"version": "4.0.0",
-			"resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz",
-			"integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==",
-			"dev": true,
-			"engines": {
-				"node": ">=8"
-			}
-		},
 		"node_modules/imurmurhash": {
 			"version": "0.1.4",
 			"resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
@@ -2789,15 +2779,6 @@
 				"node": ">=8"
 			}
 		},
-		"node_modules/is-plain-obj": {
-			"version": "1.1.0",
-			"resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
-			"integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==",
-			"dev": true,
-			"engines": {
-				"node": ">=0.10.0"
-			}
-		},
 		"node_modules/is-plain-object": {
 			"version": "2.0.4",
 			"resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
@@ -2946,11 +2927,10 @@
 			}
 		},
 		"node_modules/known-css-properties": {
-			"version": "0.29.0",
-			"resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.29.0.tgz",
-			"integrity": "sha512-Ne7wqW7/9Cz54PDt4I3tcV+hAyat8ypyOGzYRJQfdxnnjeWsTxt1cy8pjvvKeI5kfXuyvULyeeAvwvvtAX3ayQ==",
-			"dev": true,
-			"peer": true
+			"version": "0.34.0",
+			"resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.34.0.tgz",
+			"integrity": "sha512-tBECoUqNFbyAY4RrbqsBQqDFpGXAEbdD5QKr8kACx3+rnArmuuR22nKQWKazvp07N9yjTyDZaw/20UIH8tL9DQ==",
+			"dev": true
 		},
 		"node_modules/ldjson-stream": {
 			"version": "1.2.1",
@@ -2962,28 +2942,6 @@
 				"through2": "^0.6.1"
 			}
 		},
-		"node_modules/ldjson-stream/node_modules/readable-stream": {
-			"version": "1.0.34",
-			"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
-			"integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==",
-			"dev": true,
-			"dependencies": {
-				"core-util-is": "~1.0.0",
-				"inherits": "~2.0.1",
-				"isarray": "0.0.1",
-				"string_decoder": "~0.10.x"
-			}
-		},
-		"node_modules/ldjson-stream/node_modules/through2": {
-			"version": "0.6.5",
-			"resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz",
-			"integrity": "sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg==",
-			"dev": true,
-			"dependencies": {
-				"readable-stream": ">=1.0.33-1 <1.1.0-0",
-				"xtend": ">=4.0.0 <4.1.0-0"
-			}
-		},
 		"node_modules/levn": {
 			"version": "0.4.1",
 			"resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
@@ -3076,18 +3034,6 @@
 			"integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==",
 			"dev": true
 		},
-		"node_modules/lru-cache": {
-			"version": "6.0.0",
-			"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
-			"integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
-			"dev": true,
-			"dependencies": {
-				"yallist": "^4.0.0"
-			},
-			"engines": {
-				"node": ">=10"
-			}
-		},
 		"node_modules/make-iterator": {
 			"version": "1.0.1",
 			"resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz",
@@ -3109,18 +3055,6 @@
 				"node": ">=0.10.0"
 			}
 		},
-		"node_modules/map-obj": {
-			"version": "4.3.0",
-			"resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz",
-			"integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==",
-			"dev": true,
-			"engines": {
-				"node": ">=8"
-			},
-			"funding": {
-				"url": "https://github.com/sponsors/sindresorhus"
-			}
-		},
 		"node_modules/mathml-tag-names": {
 			"version": "2.1.3",
 			"resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz",
@@ -3138,100 +3072,12 @@
 			"dev": true
 		},
 		"node_modules/meow": {
-			"version": "10.1.5",
-			"resolved": "https://registry.npmjs.org/meow/-/meow-10.1.5.tgz",
-			"integrity": "sha512-/d+PQ4GKmGvM9Bee/DPa8z3mXs/pkvJE2KEThngVNOqtmljC6K7NMPxtc2JeZYTmpWb9k/TmxjeL18ez3h7vCw==",
-			"dev": true,
-			"dependencies": {
-				"@types/minimist": "^1.2.2",
-				"camelcase-keys": "^7.0.0",
-				"decamelize": "^5.0.0",
-				"decamelize-keys": "^1.1.0",
-				"hard-rejection": "^2.1.0",
-				"minimist-options": "4.1.0",
-				"normalize-package-data": "^3.0.2",
-				"read-pkg-up": "^8.0.0",
-				"redent": "^4.0.0",
-				"trim-newlines": "^4.0.2",
-				"type-fest": "^1.2.2",
-				"yargs-parser": "^20.2.9"
-			},
-			"engines": {
-				"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
-			},
-			"funding": {
-				"url": "https://github.com/sponsors/sindresorhus"
-			}
-		},
-		"node_modules/meow/node_modules/hosted-git-info": {
-			"version": "4.1.0",
-			"resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz",
-			"integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==",
-			"dev": true,
-			"dependencies": {
-				"lru-cache": "^6.0.0"
-			},
-			"engines": {
-				"node": ">=10"
-			}
-		},
-		"node_modules/meow/node_modules/normalize-package-data": {
-			"version": "3.0.3",
-			"resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz",
-			"integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==",
-			"dev": true,
-			"dependencies": {
-				"hosted-git-info": "^4.0.1",
-				"is-core-module": "^2.5.0",
-				"semver": "^7.3.4",
-				"validate-npm-package-license": "^3.0.1"
-			},
-			"engines": {
-				"node": ">=10"
-			}
-		},
-		"node_modules/meow/node_modules/read-pkg": {
-			"version": "6.0.0",
-			"resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-6.0.0.tgz",
-			"integrity": "sha512-X1Fu3dPuk/8ZLsMhEj5f4wFAF0DWoK7qhGJvgaijocXxBmSToKfbFtqbxMO7bVjNA1dmE5huAzjXj/ey86iw9Q==",
-			"dev": true,
-			"dependencies": {
-				"@types/normalize-package-data": "^2.4.0",
-				"normalize-package-data": "^3.0.2",
-				"parse-json": "^5.2.0",
-				"type-fest": "^1.0.1"
-			},
-			"engines": {
-				"node": ">=12"
-			},
-			"funding": {
-				"url": "https://github.com/sponsors/sindresorhus"
-			}
-		},
-		"node_modules/meow/node_modules/read-pkg-up": {
-			"version": "8.0.0",
-			"resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-8.0.0.tgz",
-			"integrity": "sha512-snVCqPczksT0HS2EC+SxUndvSzn6LRCwpfSvLrIfR5BKDQQZMaI6jPRC9dYvYFDRAuFEAnkwww8kBBNE/3VvzQ==",
-			"dev": true,
-			"dependencies": {
-				"find-up": "^5.0.0",
-				"read-pkg": "^6.0.0",
-				"type-fest": "^1.0.1"
-			},
-			"engines": {
-				"node": ">=12"
-			},
-			"funding": {
-				"url": "https://github.com/sponsors/sindresorhus"
-			}
-		},
-		"node_modules/meow/node_modules/type-fest": {
-			"version": "1.4.0",
-			"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz",
-			"integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==",
+			"version": "13.2.0",
+			"resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz",
+			"integrity": "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==",
 			"dev": true,
 			"engines": {
-				"node": ">=10"
+				"node": ">=18"
 			},
 			"funding": {
 				"url": "https://github.com/sponsors/sindresorhus"
@@ -3247,12 +3093,12 @@
 			}
 		},
 		"node_modules/micromatch": {
-			"version": "4.0.5",
-			"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
-			"integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
+			"version": "4.0.7",
+			"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz",
+			"integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==",
 			"dev": true,
 			"dependencies": {
-				"braces": "^3.0.2",
+				"braces": "^3.0.3",
 				"picomatch": "^2.3.1"
 			},
 			"engines": {
@@ -3280,20 +3126,6 @@
 				"node": "*"
 			}
 		},
-		"node_modules/minimist-options": {
-			"version": "4.1.0",
-			"resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz",
-			"integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==",
-			"dev": true,
-			"dependencies": {
-				"arrify": "^1.0.1",
-				"is-plain-obj": "^1.1.0",
-				"kind-of": "^6.0.3"
-			},
-			"engines": {
-				"node": ">= 6"
-			}
-		},
 		"node_modules/ms": {
 			"version": "2.1.2",
 			"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
@@ -3319,15 +3151,6 @@
 				"url": "https://github.com/sponsors/sindresorhus"
 			}
 		},
-		"node_modules/multimatch/node_modules/arrify": {
-			"version": "2.0.1",
-			"resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz",
-			"integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==",
-			"dev": true,
-			"engines": {
-				"node": ">=8"
-			}
-		},
 		"node_modules/nanoid": {
 			"version": "3.3.7",
 			"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",
@@ -3662,9 +3485,9 @@
 			}
 		},
 		"node_modules/picocolors": {
-			"version": "1.0.0",
-			"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
-			"integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
+			"version": "1.0.1",
+			"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz",
+			"integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==",
 			"dev": true
 		},
 		"node_modules/picomatch": {
@@ -3689,9 +3512,9 @@
 			}
 		},
 		"node_modules/postcss": {
-			"version": "8.4.32",
-			"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.32.tgz",
-			"integrity": "sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==",
+			"version": "8.4.39",
+			"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.39.tgz",
+			"integrity": "sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==",
 			"dev": true,
 			"funding": [
 				{
@@ -3709,17 +3532,17 @@
 			],
 			"dependencies": {
 				"nanoid": "^3.3.7",
-				"picocolors": "^1.0.0",
-				"source-map-js": "^1.0.2"
+				"picocolors": "^1.0.1",
+				"source-map-js": "^1.2.0"
 			},
 			"engines": {
 				"node": "^10 || ^12 || >=14"
 			}
 		},
 		"node_modules/postcss-html": {
-			"version": "1.5.0",
-			"resolved": "https://registry.npmjs.org/postcss-html/-/postcss-html-1.5.0.tgz",
-			"integrity": "sha512-kCMRWJRHKicpA166kc2lAVUGxDZL324bkj/pVOb6RhjB0Z5Krl7mN0AsVkBhVIRZZirY0lyQXG38HCVaoKVNoA==",
+			"version": "1.6.0",
+			"resolved": "https://registry.npmjs.org/postcss-html/-/postcss-html-1.6.0.tgz",
+			"integrity": "sha512-OWgQ9/Pe23MnNJC0PL4uZp8k0EDaUvqpJFSiwFxOLClAhmD7UEisyhO3x5hVsD4xFrjReVTXydlrMes45dJ71w==",
 			"dev": true,
 			"dependencies": {
 				"htmlparser2": "^8.0.0",
@@ -3732,11 +3555,27 @@
 			}
 		},
 		"node_modules/postcss-html/node_modules/js-tokens": {
-			"version": "8.0.2",
-			"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-8.0.2.tgz",
-			"integrity": "sha512-Olnt+V7xYdvGze9YTbGFZIfQXuGV4R3nQwwl8BrtgaPE/wq8UFpUHWuTNc05saowhSr1ZO6tx+V6RjE9D5YQog==",
+			"version": "8.0.3",
+			"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-8.0.3.tgz",
+			"integrity": "sha512-UfJMcSJc+SEXEl9lH/VLHSZbThQyLpw1vLO1Lb+j4RWDvG3N2f7yj3PVQA3cmkTBNldJ9eFnM+xEXxHIXrYiJw==",
 			"dev": true
 		},
+		"node_modules/postcss-html/node_modules/postcss-safe-parser": {
+			"version": "6.0.0",
+			"resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz",
+			"integrity": "sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==",
+			"dev": true,
+			"engines": {
+				"node": ">=12.0"
+			},
+			"funding": {
+				"type": "opencollective",
+				"url": "https://opencollective.com/postcss/"
+			},
+			"peerDependencies": {
+				"postcss": "^8.3.3"
+			}
+		},
 		"node_modules/postcss-less": {
 			"version": "6.0.0",
 			"resolved": "https://registry.npmjs.org/postcss-less/-/postcss-less-6.0.0.tgz",
@@ -3749,12 +3588,6 @@
 				"postcss": "^8.3.5"
 			}
 		},
-		"node_modules/postcss-media-query-parser": {
-			"version": "0.2.3",
-			"resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz",
-			"integrity": "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==",
-			"dev": true
-		},
 		"node_modules/postcss-resolve-nested-selector": {
 			"version": "0.1.1",
 			"resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz",
@@ -3762,25 +3595,35 @@
 			"dev": true
 		},
 		"node_modules/postcss-safe-parser": {
-			"version": "6.0.0",
-			"resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz",
-			"integrity": "sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==",
+			"version": "7.0.0",
+			"resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-7.0.0.tgz",
+			"integrity": "sha512-ovehqRNVCpuFzbXoTb4qLtyzK3xn3t/CUBxOs8LsnQjQrShaB4lKiHoVqY8ANaC0hBMHq5QVWk77rwGklFUDrg==",
 			"dev": true,
+			"funding": [
+				{
+					"type": "opencollective",
+					"url": "https://opencollective.com/postcss/"
+				},
+				{
+					"type": "tidelift",
+					"url": "https://tidelift.com/funding/github/npm/postcss-safe-parser"
+				},
+				{
+					"type": "github",
+					"url": "https://github.com/sponsors/ai"
+				}
+			],
 			"engines": {
-				"node": ">=12.0"
-			},
-			"funding": {
-				"type": "opencollective",
-				"url": "https://opencollective.com/postcss/"
+				"node": ">=18.0"
 			},
 			"peerDependencies": {
-				"postcss": "^8.3.3"
+				"postcss": "^8.4.31"
 			}
 		},
 		"node_modules/postcss-selector-parser": {
-			"version": "6.0.13",
-			"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz",
-			"integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==",
+			"version": "6.1.1",
+			"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.1.tgz",
+			"integrity": "sha512-b4dlw/9V8A71rLIDsSwVmak9z2DuBUB7CA1/wSdelNEzqsjoSPeADTWNO09lpH49Diy3/JIZ2bSPB1dI3LJCHg==",
 			"dev": true,
 			"dependencies": {
 				"cssesc": "^3.0.0",
@@ -3834,18 +3677,6 @@
 				}
 			]
 		},
-		"node_modules/quick-lru": {
-			"version": "5.1.1",
-			"resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz",
-			"integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==",
-			"dev": true,
-			"engines": {
-				"node": ">=10"
-			},
-			"funding": {
-				"url": "https://github.com/sponsors/sindresorhus"
-			}
-		},
 		"node_modules/rambda": {
 			"version": "7.5.0",
 			"resolved": "https://registry.npmjs.org/rambda/-/rambda-7.5.0.tgz",
@@ -3978,49 +3809,6 @@
 				"node": ">= 0.10"
 			}
 		},
-		"node_modules/redent": {
-			"version": "4.0.0",
-			"resolved": "https://registry.npmjs.org/redent/-/redent-4.0.0.tgz",
-			"integrity": "sha512-tYkDkVVtYkSVhuQ4zBgfvciymHaeuel+zFKXShfDnFP5SyVEP7qo70Rf1jTOTCx3vGNAbnEi/xFkcfQVMIBWag==",
-			"dev": true,
-			"dependencies": {
-				"indent-string": "^5.0.0",
-				"strip-indent": "^4.0.0"
-			},
-			"engines": {
-				"node": ">=12"
-			},
-			"funding": {
-				"url": "https://github.com/sponsors/sindresorhus"
-			}
-		},
-		"node_modules/redent/node_modules/indent-string": {
-			"version": "5.0.0",
-			"resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz",
-			"integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==",
-			"dev": true,
-			"engines": {
-				"node": ">=12"
-			},
-			"funding": {
-				"url": "https://github.com/sponsors/sindresorhus"
-			}
-		},
-		"node_modules/redent/node_modules/strip-indent": {
-			"version": "4.0.0",
-			"resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.0.0.tgz",
-			"integrity": "sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==",
-			"dev": true,
-			"dependencies": {
-				"min-indent": "^1.0.1"
-			},
-			"engines": {
-				"node": ">=12"
-			},
-			"funding": {
-				"url": "https://github.com/sponsors/sindresorhus"
-			}
-		},
 		"node_modules/regexp-tree": {
 			"version": "0.1.27",
 			"resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.27.tgz",
@@ -4210,13 +3998,10 @@
 			"dev": true
 		},
 		"node_modules/semver": {
-			"version": "7.5.4",
-			"resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
-			"integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
+			"version": "7.6.3",
+			"resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
+			"integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
 			"dev": true,
-			"dependencies": {
-				"lru-cache": "^6.0.0"
-			},
 			"bin": {
 				"semver": "bin/semver.js"
 			},
@@ -4293,9 +4078,9 @@
 			}
 		},
 		"node_modules/source-map-js": {
-			"version": "1.0.2",
-			"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
-			"integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
+			"version": "1.2.0",
+			"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz",
+			"integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==",
 			"dev": true,
 			"engines": {
 				"node": ">=0.10.0"
@@ -4311,16 +4096,26 @@
 				"spdx-license-ids": "^3.0.0"
 			}
 		},
+		"node_modules/spdx-correct/node_modules/spdx-expression-parse": {
+			"version": "3.0.1",
+			"resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
+			"integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
+			"dev": true,
+			"dependencies": {
+				"spdx-exceptions": "^2.1.0",
+				"spdx-license-ids": "^3.0.0"
+			}
+		},
 		"node_modules/spdx-exceptions": {
-			"version": "2.3.0",
-			"resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz",
-			"integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==",
+			"version": "2.5.0",
+			"resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz",
+			"integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==",
 			"dev": true
 		},
 		"node_modules/spdx-expression-parse": {
-			"version": "3.0.1",
-			"resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
-			"integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
+			"version": "4.0.0",
+			"resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-4.0.0.tgz",
+			"integrity": "sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==",
 			"dev": true,
 			"dependencies": {
 				"spdx-exceptions": "^2.1.0",
@@ -4328,9 +4123,9 @@
 			}
 		},
 		"node_modules/spdx-license-ids": {
-			"version": "3.0.16",
-			"resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz",
-			"integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==",
+			"version": "3.0.18",
+			"resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.18.tgz",
+			"integrity": "sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ==",
 			"dev": true
 		},
 		"node_modules/split2": {
@@ -4342,34 +4137,18 @@
 				"through2": "~0.6.1"
 			}
 		},
-		"node_modules/split2/node_modules/readable-stream": {
-			"version": "1.0.34",
-			"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
-			"integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==",
-			"dev": true,
-			"dependencies": {
-				"core-util-is": "~1.0.0",
-				"inherits": "~2.0.1",
-				"isarray": "0.0.1",
-				"string_decoder": "~0.10.x"
-			}
-		},
-		"node_modules/split2/node_modules/through2": {
-			"version": "0.6.5",
-			"resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz",
-			"integrity": "sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg==",
-			"dev": true,
-			"dependencies": {
-				"readable-stream": ">=1.0.33-1 <1.1.0-0",
-				"xtend": ">=4.0.0 <4.1.0-0"
-			}
-		},
 		"node_modules/sprintf-js": {
 			"version": "1.1.3",
 			"resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz",
 			"integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==",
 			"dev": true
 		},
+		"node_modules/stream-shift": {
+			"version": "1.0.3",
+			"resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz",
+			"integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==",
+			"dev": true
+		},
 		"node_modules/string_decoder": {
 			"version": "0.10.31",
 			"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
@@ -4433,105 +4212,141 @@
 			"dev": true
 		},
 		"node_modules/stylelint": {
-			"version": "15.11.0",
-			"resolved": "https://registry.npmjs.org/stylelint/-/stylelint-15.11.0.tgz",
-			"integrity": "sha512-78O4c6IswZ9TzpcIiQJIN49K3qNoXTM8zEJzhaTE/xRTCZswaovSEVIa/uwbOltZrk16X4jAxjaOhzz/hTm1Kw==",
+			"version": "16.7.0",
+			"resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.7.0.tgz",
+			"integrity": "sha512-Q1ATiXlz+wYr37a7TGsfvqYn2nSR3T/isw3IWlZQzFzCNoACHuGBb6xBplZXz56/uDRJHIygxjh7jbV/8isewA==",
 			"dev": true,
-			"peer": true,
+			"funding": [
+				{
+					"type": "opencollective",
+					"url": "https://opencollective.com/stylelint"
+				},
+				{
+					"type": "github",
+					"url": "https://github.com/sponsors/stylelint"
+				}
+			],
 			"dependencies": {
-				"@csstools/css-parser-algorithms": "^2.3.1",
-				"@csstools/css-tokenizer": "^2.2.0",
-				"@csstools/media-query-list-parser": "^2.1.4",
-				"@csstools/selector-specificity": "^3.0.0",
+				"@csstools/css-parser-algorithms": "^2.7.1",
+				"@csstools/css-tokenizer": "^2.4.1",
+				"@csstools/media-query-list-parser": "^2.1.13",
+				"@csstools/selector-specificity": "^3.1.1",
+				"@dual-bundle/import-meta-resolve": "^4.1.0",
 				"balanced-match": "^2.0.0",
 				"colord": "^2.9.3",
-				"cosmiconfig": "^8.2.0",
-				"css-functions-list": "^3.2.1",
+				"cosmiconfig": "^9.0.0",
+				"css-functions-list": "^3.2.2",
 				"css-tree": "^2.3.1",
-				"debug": "^4.3.4",
-				"fast-glob": "^3.3.1",
+				"debug": "^4.3.5",
+				"fast-glob": "^3.3.2",
 				"fastest-levenshtein": "^1.0.16",
-				"file-entry-cache": "^7.0.0",
+				"file-entry-cache": "^9.0.0",
 				"global-modules": "^2.0.0",
 				"globby": "^11.1.0",
 				"globjoin": "^0.1.4",
 				"html-tags": "^3.3.1",
-				"ignore": "^5.2.4",
-				"import-lazy": "^4.0.0",
+				"ignore": "^5.3.1",
 				"imurmurhash": "^0.1.4",
 				"is-plain-object": "^5.0.0",
-				"known-css-properties": "^0.29.0",
+				"known-css-properties": "^0.34.0",
 				"mathml-tag-names": "^2.1.3",
-				"meow": "^10.1.5",
-				"micromatch": "^4.0.5",
+				"meow": "^13.2.0",
+				"micromatch": "^4.0.7",
 				"normalize-path": "^3.0.0",
-				"picocolors": "^1.0.0",
-				"postcss": "^8.4.28",
+				"picocolors": "^1.0.1",
+				"postcss": "^8.4.39",
 				"postcss-resolve-nested-selector": "^0.1.1",
-				"postcss-safe-parser": "^6.0.0",
-				"postcss-selector-parser": "^6.0.13",
+				"postcss-safe-parser": "^7.0.0",
+				"postcss-selector-parser": "^6.1.0",
 				"postcss-value-parser": "^4.2.0",
 				"resolve-from": "^5.0.0",
 				"string-width": "^4.2.3",
-				"strip-ansi": "^6.0.1",
-				"style-search": "^0.1.0",
+				"strip-ansi": "^7.1.0",
 				"supports-hyperlinks": "^3.0.0",
 				"svg-tags": "^1.0.0",
-				"table": "^6.8.1",
+				"table": "^6.8.2",
 				"write-file-atomic": "^5.0.1"
 			},
 			"bin": {
 				"stylelint": "bin/stylelint.mjs"
 			},
 			"engines": {
-				"node": "^14.13.1 || >=16.0.0"
-			},
-			"funding": {
-				"type": "opencollective",
-				"url": "https://opencollective.com/stylelint"
+				"node": ">=18.12.0"
 			}
 		},
 		"node_modules/stylelint-config-recommended": {
-			"version": "13.0.0",
-			"resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-13.0.0.tgz",
-			"integrity": "sha512-EH+yRj6h3GAe/fRiyaoO2F9l9Tgg50AOFhaszyfov9v6ayXJ1IkSHwTxd7lB48FmOeSGDPLjatjO11fJpmarkQ==",
+			"version": "14.0.0",
+			"resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-14.0.0.tgz",
+			"integrity": "sha512-jSkx290CglS8StmrLp2TxAppIajzIBZKYm3IxT89Kg6fGlxbPiTiyH9PS5YUuVAFwaJLl1ikiXX0QWjI0jmgZQ==",
 			"dev": true,
 			"engines": {
-				"node": "^14.13.1 || >=16.0.0"
+				"node": ">=18.12.0"
 			},
 			"peerDependencies": {
-				"stylelint": "^15.10.0"
+				"stylelint": "^16.0.0"
 			}
 		},
 		"node_modules/stylelint-config-wikimedia": {
-			"version": "0.16.1",
-			"resolved": "https://registry.npmjs.org/stylelint-config-wikimedia/-/stylelint-config-wikimedia-0.16.1.tgz",
-			"integrity": "sha512-FDVUyDyCBap2o2HAeJqIobdVdSTur5HFX5FymoKrzfMIYWxIV/55lTpyL1PR71TfVMaroDXJrIftLFW9mXKFhQ==",
+			"version": "0.17.2",
+			"resolved": "https://registry.npmjs.org/stylelint-config-wikimedia/-/stylelint-config-wikimedia-0.17.2.tgz",
+			"integrity": "sha512-cc3PYhe1O/GTgsMOp+Ri3ru579YBbZ3Me0oU7xNb06n4iwyXYPz8qO5G4iQ13UH19UW2NIS8Tk0goPRrJ1RAfw==",
 			"dev": true,
 			"dependencies": {
-				"browserslist-config-wikimedia": "0.5.0",
-				"postcss-html": "1.5.0",
+				"@stylistic/stylelint-config": "1.0.1",
+				"@stylistic/stylelint-plugin": "2.0.0",
+				"browserslist-config-wikimedia": "0.7.0",
+				"postcss-html": "1.6.0",
 				"postcss-less": "6.0.0",
-				"stylelint": "15.10.1",
-				"stylelint-config-recommended": "13.0.0",
-				"stylelint-no-unsupported-browser-features": "6.1.0",
-				"stylelint-stylistic": "0.4.3"
+				"stylelint": "16.2.0",
+				"stylelint-config-recommended": "14.0.0",
+				"stylelint-no-unsupported-browser-features": "8.0.1"
 			},
 			"peerDependencies": {
 				"postcss-less": "^6.0.0"
 			}
 		},
+		"node_modules/stylelint-config-wikimedia/node_modules/ansi-regex": {
+			"version": "6.0.1",
+			"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
+			"integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
+			"dev": true,
+			"engines": {
+				"node": ">=12"
+			},
+			"funding": {
+				"url": "https://github.com/chalk/ansi-regex?sponsor=1"
+			}
+		},
 		"node_modules/stylelint-config-wikimedia/node_modules/balanced-match": {
 			"version": "2.0.0",
 			"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz",
 			"integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==",
 			"dev": true
 		},
-		"node_modules/stylelint-config-wikimedia/node_modules/browserslist-config-wikimedia": {
-			"version": "0.5.0",
-			"resolved": "https://registry.npmjs.org/browserslist-config-wikimedia/-/browserslist-config-wikimedia-0.5.0.tgz",
-			"integrity": "sha512-t+tvSnTeVhVF2lNRxoAlE51/ZCfUs5SNNZUnWu2N8xXOGMPTMyKk5l4mayvDdm+5L8oqmnALU+TjnN2Z+ZTCTw==",
-			"dev": true
+		"node_modules/stylelint-config-wikimedia/node_modules/file-entry-cache": {
+			"version": "8.0.0",
+			"resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz",
+			"integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==",
+			"dev": true,
+			"dependencies": {
+				"flat-cache": "^4.0.0"
+			},
+			"engines": {
+				"node": ">=16.0.0"
+			}
+		},
+		"node_modules/stylelint-config-wikimedia/node_modules/flat-cache": {
+			"version": "4.0.1",
+			"resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz",
+			"integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==",
+			"dev": true,
+			"dependencies": {
+				"flatted": "^3.2.9",
+				"keyv": "^4.5.4"
+			},
+			"engines": {
+				"node": ">=16"
+			}
 		},
 		"node_modules/stylelint-config-wikimedia/node_modules/global-modules": {
 			"version": "2.0.0",
@@ -4569,9 +4384,9 @@
 			}
 		},
 		"node_modules/stylelint-config-wikimedia/node_modules/known-css-properties": {
-			"version": "0.27.0",
-			"resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.27.0.tgz",
-			"integrity": "sha512-uMCj6+hZYDoffuvAJjFAPz56E9uoowFHmTkqRtRq5WyC5Q6Cu/fTZKNQpX/RbzChBYLLl3lo8CjFZBAZXq9qFg==",
+			"version": "0.29.0",
+			"resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.29.0.tgz",
+			"integrity": "sha512-Ne7wqW7/9Cz54PDt4I3tcV+hAyat8ypyOGzYRJQfdxnnjeWsTxt1cy8pjvvKeI5kfXuyvULyeeAvwvvtAX3ayQ==",
 			"dev": true
 		},
 		"node_modules/stylelint-config-wikimedia/node_modules/resolve-from": {
@@ -4583,48 +4398,61 @@
 				"node": ">=8"
 			}
 		},
+		"node_modules/stylelint-config-wikimedia/node_modules/strip-ansi": {
+			"version": "7.1.0",
+			"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+			"integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+			"dev": true,
+			"dependencies": {
+				"ansi-regex": "^6.0.1"
+			},
+			"engines": {
+				"node": ">=12"
+			},
+			"funding": {
+				"url": "https://github.com/chalk/strip-ansi?sponsor=1"
+			}
+		},
 		"node_modules/stylelint-config-wikimedia/node_modules/stylelint": {
-			"version": "15.10.1",
-			"resolved": "https://registry.npmjs.org/stylelint/-/stylelint-15.10.1.tgz",
-			"integrity": "sha512-CYkzYrCFfA/gnOR+u9kJ1PpzwG10WLVnoxHDuBA/JiwGqdM9+yx9+ou6SE/y9YHtfv1mcLo06fdadHTOx4gBZQ==",
+			"version": "16.2.0",
+			"resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.2.0.tgz",
+			"integrity": "sha512-gwqU5AkIb52wrAzzn+359S3NIJDMl02TXLUaV2tzA/L6jUdpTwNt+MCxHlc8+Hb2bUHlYVo92YeSIryF2gJthA==",
 			"dev": true,
 			"dependencies": {
-				"@csstools/css-parser-algorithms": "^2.3.0",
-				"@csstools/css-tokenizer": "^2.1.1",
-				"@csstools/media-query-list-parser": "^2.1.2",
-				"@csstools/selector-specificity": "^3.0.0",
+				"@csstools/css-parser-algorithms": "^2.5.0",
+				"@csstools/css-tokenizer": "^2.2.3",
+				"@csstools/media-query-list-parser": "^2.1.7",
+				"@csstools/selector-specificity": "^3.0.1",
 				"balanced-match": "^2.0.0",
 				"colord": "^2.9.3",
-				"cosmiconfig": "^8.2.0",
-				"css-functions-list": "^3.1.0",
+				"cosmiconfig": "^9.0.0",
+				"css-functions-list": "^3.2.1",
 				"css-tree": "^2.3.1",
 				"debug": "^4.3.4",
-				"fast-glob": "^3.3.0",
+				"fast-glob": "^3.3.2",
 				"fastest-levenshtein": "^1.0.16",
-				"file-entry-cache": "^6.0.1",
+				"file-entry-cache": "^8.0.0",
 				"global-modules": "^2.0.0",
 				"globby": "^11.1.0",
 				"globjoin": "^0.1.4",
 				"html-tags": "^3.3.1",
-				"ignore": "^5.2.4",
-				"import-lazy": "^4.0.0",
+				"ignore": "^5.3.0",
 				"imurmurhash": "^0.1.4",
 				"is-plain-object": "^5.0.0",
-				"known-css-properties": "^0.27.0",
+				"known-css-properties": "^0.29.0",
 				"mathml-tag-names": "^2.1.3",
-				"meow": "^10.1.5",
+				"meow": "^13.1.0",
 				"micromatch": "^4.0.5",
 				"normalize-path": "^3.0.0",
 				"picocolors": "^1.0.0",
-				"postcss": "^8.4.24",
+				"postcss": "^8.4.33",
 				"postcss-resolve-nested-selector": "^0.1.1",
-				"postcss-safe-parser": "^6.0.0",
-				"postcss-selector-parser": "^6.0.13",
+				"postcss-safe-parser": "^7.0.0",
+				"postcss-selector-parser": "^6.0.15",
 				"postcss-value-parser": "^4.2.0",
 				"resolve-from": "^5.0.0",
 				"string-width": "^4.2.3",
-				"strip-ansi": "^6.0.1",
-				"style-search": "^0.1.0",
+				"strip-ansi": "^7.1.0",
 				"supports-hyperlinks": "^3.0.0",
 				"svg-tags": "^1.0.0",
 				"table": "^6.8.1",
@@ -4634,7 +4462,7 @@
 				"stylelint": "bin/stylelint.mjs"
 			},
 			"engines": {
-				"node": "^14.13.1 || >=16.0.0"
+				"node": ">=18.12.0"
 			},
 			"funding": {
 				"type": "opencollective",
@@ -4654,66 +4482,62 @@
 			}
 		},
 		"node_modules/stylelint-no-unsupported-browser-features": {
-			"version": "6.1.0",
-			"resolved": "https://registry.npmjs.org/stylelint-no-unsupported-browser-features/-/stylelint-no-unsupported-browser-features-6.1.0.tgz",
-			"integrity": "sha512-3Taj+z9PjIiY6cz4hg3eN8Khue3kMm9lPXYuEvdjAFXDK20uQo2NocJaWN6anIKclYlwrpkBAS9W/KV3qPTWsw==",
+			"version": "8.0.1",
+			"resolved": "https://registry.npmjs.org/stylelint-no-unsupported-browser-features/-/stylelint-no-unsupported-browser-features-8.0.1.tgz",
+			"integrity": "sha512-tc8Xn5DaqJhxTmbA4H8gZbYdAz027NfuSZv5+cVieQb7BtBrF/1/iKYdpcGwXPl3GtqkQrisiXuGqKkKnzWcLw==",
 			"dev": true,
 			"dependencies": {
-				"doiuse": "^4.4.1",
-				"lodash": "^4.17.15",
-				"postcss": "^8.4.16"
+				"doiuse": "^6.0.2",
+				"postcss": "^8.4.32"
 			},
 			"engines": {
-				"node": ">=14"
+				"node": ">=18.12.0"
 			},
 			"peerDependencies": {
-				"stylelint": "^14.0.0||^15.0.0"
+				"stylelint": "^16.0.2"
 			}
 		},
-		"node_modules/stylelint-stylistic": {
-			"version": "0.4.3",
-			"resolved": "https://registry.npmjs.org/stylelint-stylistic/-/stylelint-stylistic-0.4.3.tgz",
-			"integrity": "sha512-WphmneK3MRrm5ixvRPWy7+c9+EQUh0FPvNMXW/N9VD85vyqtpxUejpD+mxubVVht0fRgidcqBxtW3s3tU2Ujhw==",
-			"deprecated": "This package has been deprecated in favor of @stylistic/stylelint-plugin",
-			"dev": true,
-			"dependencies": {
-				"is-plain-object": "^5.0.0",
-				"postcss": "^8.4.21",
-				"postcss-media-query-parser": "^0.2.3",
-				"postcss-value-parser": "^4.2.0",
-				"style-search": "^0.1.0"
-			},
-			"peerDependencies": {
-				"stylelint": "^15.0.0"
-			}
-		},
-		"node_modules/stylelint-stylistic/node_modules/is-plain-object": {
-			"version": "5.0.0",
-			"resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
-			"integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==",
+		"node_modules/stylelint/node_modules/ansi-regex": {
+			"version": "6.0.1",
+			"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
+			"integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
 			"dev": true,
 			"engines": {
-				"node": ">=0.10.0"
+				"node": ">=12"
+			},
+			"funding": {
+				"url": "https://github.com/chalk/ansi-regex?sponsor=1"
 			}
 		},
 		"node_modules/stylelint/node_modules/balanced-match": {
 			"version": "2.0.0",
 			"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz",
 			"integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==",
-			"dev": true,
-			"peer": true
+			"dev": true
 		},
 		"node_modules/stylelint/node_modules/file-entry-cache": {
-			"version": "7.0.2",
-			"resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-7.0.2.tgz",
-			"integrity": "sha512-TfW7/1iI4Cy7Y8L6iqNdZQVvdXn0f8B4QcIXmkIbtTIe/Okm/nSlHb4IwGzRVOd3WfSieCgvf5cMzEfySAIl0g==",
+			"version": "9.0.0",
+			"resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-9.0.0.tgz",
+			"integrity": "sha512-6MgEugi8p2tiUhqO7GnPsmbCCzj0YRCwwaTbpGRyKZesjRSzkqkAE9fPp7V2yMs5hwfgbQLgdvSSkGNg1s5Uvw==",
 			"dev": true,
-			"peer": true,
 			"dependencies": {
-				"flat-cache": "^3.2.0"
+				"flat-cache": "^5.0.0"
 			},
 			"engines": {
-				"node": ">=12.0.0"
+				"node": ">=18"
+			}
+		},
+		"node_modules/stylelint/node_modules/flat-cache": {
+			"version": "5.0.0",
+			"resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-5.0.0.tgz",
+			"integrity": "sha512-JrqFmyUl2PnPi1OvLyTVHnQvwQ0S+e6lGSwu8OkAZlSaNIZciTY2H/cOOROxsBA1m/LZNHDsqAgDZt6akWcjsQ==",
+			"dev": true,
+			"dependencies": {
+				"flatted": "^3.3.1",
+				"keyv": "^4.5.4"
+			},
+			"engines": {
+				"node": ">=18"
 			}
 		},
 		"node_modules/stylelint/node_modules/global-modules": {
@@ -4721,7 +4545,6 @@
 			"resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz",
 			"integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==",
 			"dev": true,
-			"peer": true,
 			"dependencies": {
 				"global-prefix": "^3.0.0"
 			},
@@ -4734,7 +4557,6 @@
 			"resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz",
 			"integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==",
 			"dev": true,
-			"peer": true,
 			"dependencies": {
 				"ini": "^1.3.5",
 				"kind-of": "^6.0.2",
@@ -4749,7 +4571,6 @@
 			"resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
 			"integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==",
 			"dev": true,
-			"peer": true,
 			"engines": {
 				"node": ">=0.10.0"
 			}
@@ -4759,17 +4580,30 @@
 			"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
 			"integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
 			"dev": true,
-			"peer": true,
 			"engines": {
 				"node": ">=8"
 			}
 		},
+		"node_modules/stylelint/node_modules/strip-ansi": {
+			"version": "7.1.0",
+			"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+			"integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+			"dev": true,
+			"dependencies": {
+				"ansi-regex": "^6.0.1"
+			},
+			"engines": {
+				"node": ">=12"
+			},
+			"funding": {
+				"url": "https://github.com/chalk/strip-ansi?sponsor=1"
+			}
+		},
 		"node_modules/stylelint/node_modules/which": {
 			"version": "1.3.1",
 			"resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
 			"integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
 			"dev": true,
-			"peer": true,
 			"dependencies": {
 				"isexe": "^2.0.0"
 			},
@@ -4821,9 +4655,9 @@
 			"dev": true
 		},
 		"node_modules/table": {
-			"version": "6.8.1",
-			"resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz",
-			"integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==",
+			"version": "6.8.2",
+			"resolved": "https://registry.npmjs.org/table/-/table-6.8.2.tgz",
+			"integrity": "sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==",
 			"dev": true,
 			"dependencies": {
 				"ajv": "^8.0.1",
@@ -4837,15 +4671,15 @@
 			}
 		},
 		"node_modules/table/node_modules/ajv": {
-			"version": "8.12.0",
-			"resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz",
-			"integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==",
+			"version": "8.17.1",
+			"resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
+			"integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
 			"dev": true,
 			"dependencies": {
-				"fast-deep-equal": "^3.1.1",
+				"fast-deep-equal": "^3.1.3",
+				"fast-uri": "^3.0.1",
 				"json-schema-traverse": "^1.0.0",
-				"require-from-string": "^2.0.2",
-				"uri-js": "^4.2.2"
+				"require-from-string": "^2.0.2"
 			},
 			"funding": {
 				"type": "github",
@@ -4858,6 +4692,15 @@
 			"integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
 			"dev": true
 		},
+		"node_modules/tapable": {
+			"version": "2.2.1",
+			"resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
+			"integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==",
+			"dev": true,
+			"engines": {
+				"node": ">=6"
+			}
+		},
 		"node_modules/text-table": {
 			"version": "0.2.0",
 			"resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
@@ -4865,35 +4708,25 @@
 			"dev": true
 		},
 		"node_modules/through2": {
-			"version": "4.0.2",
-			"resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz",
-			"integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==",
+			"version": "0.6.5",
+			"resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz",
+			"integrity": "sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg==",
 			"dev": true,
 			"dependencies": {
-				"readable-stream": "3"
+				"readable-stream": ">=1.0.33-1 <1.1.0-0",
+				"xtend": ">=4.0.0 <4.1.0-0"
 			}
 		},
 		"node_modules/through2/node_modules/readable-stream": {
-			"version": "3.6.2",
-			"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
-			"integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
-			"dev": true,
-			"dependencies": {
-				"inherits": "^2.0.3",
-				"string_decoder": "^1.1.1",
-				"util-deprecate": "^1.0.1"
-			},
-			"engines": {
-				"node": ">= 6"
-			}
-		},
-		"node_modules/through2/node_modules/string_decoder": {
-			"version": "1.3.0",
-			"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
-			"integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+			"version": "1.0.34",
+			"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
+			"integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==",
 			"dev": true,
 			"dependencies": {
-				"safe-buffer": "~5.2.0"
+				"core-util-is": "~1.0.0",
+				"inherits": "~2.0.1",
+				"isarray": "0.0.1",
+				"string_decoder": "~0.10.x"
 			}
 		},
 		"node_modules/to-regex-range": {
@@ -4908,37 +4741,16 @@
 				"node": ">=8.0"
 			}
 		},
-		"node_modules/trim-newlines": {
-			"version": "4.1.1",
-			"resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-4.1.1.tgz",
-			"integrity": "sha512-jRKj0n0jXWo6kh62nA5TEh3+4igKDXLvzBJcPpiizP7oOolUrYIxmVBG9TOtHYFHoddUk6YvAkGeGoSVTXfQXQ==",
-			"dev": true,
-			"engines": {
-				"node": ">=12"
-			},
-			"funding": {
-				"url": "https://github.com/sponsors/sindresorhus"
-			}
-		},
-		"node_modules/tslib": {
-			"version": "1.14.1",
-			"resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
-			"integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
-			"dev": true
-		},
-		"node_modules/tsutils": {
-			"version": "3.21.0",
-			"resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz",
-			"integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==",
+		"node_modules/ts-api-utils": {
+			"version": "1.3.0",
+			"resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz",
+			"integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==",
 			"dev": true,
-			"dependencies": {
-				"tslib": "^1.8.1"
-			},
 			"engines": {
-				"node": ">= 6"
+				"node": ">=16"
 			},
 			"peerDependencies": {
-				"typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta"
+				"typescript": ">=4.2.0"
 			}
 		},
 		"node_modules/type-check": {
@@ -4966,9 +4778,9 @@
 			}
 		},
 		"node_modules/typescript": {
-			"version": "5.3.3",
-			"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz",
-			"integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==",
+			"version": "5.5.4",
+			"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz",
+			"integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==",
 			"dev": true,
 			"peer": true,
 			"bin": {
@@ -5012,9 +4824,9 @@
 			}
 		},
 		"node_modules/update-browserslist-db": {
-			"version": "1.0.13",
-			"resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz",
-			"integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==",
+			"version": "1.1.0",
+			"resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz",
+			"integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==",
 			"dev": true,
 			"funding": [
 				{
@@ -5031,8 +4843,8 @@
 				}
 			],
 			"dependencies": {
-				"escalade": "^3.1.1",
-				"picocolors": "^1.0.0"
+				"escalade": "^3.1.2",
+				"picocolors": "^1.0.1"
 			},
 			"bin": {
 				"update-browserslist-db": "cli.js"
@@ -5078,10 +4890,20 @@
 				"spdx-expression-parse": "^3.0.0"
 			}
 		},
+		"node_modules/validate-npm-package-license/node_modules/spdx-expression-parse": {
+			"version": "3.0.1",
+			"resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
+			"integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
+			"dev": true,
+			"dependencies": {
+				"spdx-exceptions": "^2.1.0",
+				"spdx-license-ids": "^3.0.0"
+			}
+		},
 		"node_modules/vue-eslint-parser": {
-			"version": "9.3.2",
-			"resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.3.2.tgz",
-			"integrity": "sha512-q7tWyCVaV9f8iQyIA5Mkj/S6AoJ9KBN8IeUSf3XEmBrOtxOZnfTg5s4KClbZBCK3GtnT/+RyCLZyDHuZwTuBjg==",
+			"version": "9.4.3",
+			"resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.4.3.tgz",
+			"integrity": "sha512-2rYRLWlIpaiN8xbPiDyXZXRgLGOtWxERV7ND5fFAv5qo1D2N9Fu9MNajBNc6o13lZ+24DAWCkQCvj4klgmcITg==",
 			"dev": true,
 			"dependencies": {
 				"debug": "^4.3.4",
@@ -5180,25 +5002,22 @@
 				"node": ">=10"
 			}
 		},
-		"node_modules/yallist": {
-			"version": "4.0.0",
-			"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
-			"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
-			"dev": true
-		},
 		"node_modules/yaml": {
-			"version": "2.3.4",
-			"resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz",
-			"integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==",
+			"version": "2.4.5",
+			"resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.5.tgz",
+			"integrity": "sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg==",
 			"dev": true,
+			"bin": {
+				"yaml": "bin.mjs"
+			},
 			"engines": {
 				"node": ">= 14"
 			}
 		},
 		"node_modules/yaml-eslint-parser": {
-			"version": "1.2.2",
-			"resolved": "https://registry.npmjs.org/yaml-eslint-parser/-/yaml-eslint-parser-1.2.2.tgz",
-			"integrity": "sha512-pEwzfsKbTrB8G3xc/sN7aw1v6A6c/pKxLAkjclnAyo5g5qOh6eL9WGu0o3cSDQZKrTNk4KL4lQSwZW+nBkANEg==",
+			"version": "1.2.3",
+			"resolved": "https://registry.npmjs.org/yaml-eslint-parser/-/yaml-eslint-parser-1.2.3.tgz",
+			"integrity": "sha512-4wZWvE398hCP7O8n3nXKu/vdq1HcH01ixYlCREaJL5NUMwQ0g3MaGFUBNSlmBtKmhbtVG/Cm6lyYmSVTEVil8A==",
 			"dev": true,
 			"dependencies": {
 				"eslint-visitor-keys": "^3.0.0",
@@ -5213,30 +5032,30 @@
 			}
 		},
 		"node_modules/yargs": {
-			"version": "16.2.0",
-			"resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
-			"integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
+			"version": "17.7.2",
+			"resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
+			"integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
 			"dev": true,
 			"dependencies": {
-				"cliui": "^7.0.2",
+				"cliui": "^8.0.1",
 				"escalade": "^3.1.1",
 				"get-caller-file": "^2.0.5",
 				"require-directory": "^2.1.1",
-				"string-width": "^4.2.0",
+				"string-width": "^4.2.3",
 				"y18n": "^5.0.5",
-				"yargs-parser": "^20.2.2"
+				"yargs-parser": "^21.1.1"
 			},
 			"engines": {
-				"node": ">=10"
+				"node": ">=12"
 			}
 		},
 		"node_modules/yargs-parser": {
-			"version": "20.2.9",
-			"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
-			"integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
+			"version": "21.1.1",
+			"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
+			"integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
 			"dev": true,
 			"engines": {
-				"node": ">=10"
+				"node": ">=12"
 			}
 		},
 		"node_modules/yocto-queue": {
@@ -5253,95 +5072,38 @@
 		}
 	},
 	"dependencies": {
-		"@aashutoshrathi/word-wrap": {
-			"version": "1.2.6",
-			"resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz",
-			"integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==",
-			"dev": true
-		},
-		"@babel/code-frame": {
-			"version": "7.23.5",
-			"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz",
-			"integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==",
-			"dev": true,
-			"requires": {
-				"@babel/highlight": "^7.23.4",
-				"chalk": "^2.4.2"
-			},
-			"dependencies": {
-				"ansi-styles": {
-					"version": "3.2.1",
-					"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
-					"integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
-					"dev": true,
-					"requires": {
-						"color-convert": "^1.9.0"
-					}
-				},
-				"chalk": {
-					"version": "2.4.2",
-					"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
-					"integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
-					"dev": true,
-					"requires": {
-						"ansi-styles": "^3.2.1",
-						"escape-string-regexp": "^1.0.5",
-						"supports-color": "^5.3.0"
-					}
-				},
-				"color-convert": {
-					"version": "1.9.3",
-					"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
-					"integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
-					"dev": true,
-					"requires": {
-						"color-name": "1.1.3"
-					}
-				},
-				"color-name": {
-					"version": "1.1.3",
-					"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
-					"integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
-					"dev": true
-				},
-				"escape-string-regexp": {
-					"version": "1.0.5",
-					"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
-					"integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
-					"dev": true
-				},
-				"has-flag": {
-					"version": "3.0.0",
-					"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-					"integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
-					"dev": true
-				},
-				"supports-color": {
-					"version": "5.5.0",
-					"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
-					"integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
-					"dev": true,
-					"requires": {
-						"has-flag": "^3.0.0"
-					}
-				}
+		"@aashutoshrathi/word-wrap": {
+			"version": "1.2.6",
+			"resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz",
+			"integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==",
+			"dev": true
+		},
+		"@babel/code-frame": {
+			"version": "7.24.7",
+			"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz",
+			"integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==",
+			"dev": true,
+			"requires": {
+				"@babel/highlight": "^7.24.7",
+				"picocolors": "^1.0.0"
 			}
 		},
 		"@babel/helper-validator-identifier": {
-			"version": "7.22.20",
-			"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz",
-			"integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==",
+			"version": "7.24.7",
+			"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz",
+			"integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==",
 			"dev": true
 		},
 		"@babel/highlight": {
-			"version": "7.23.4",
-			"resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz",
-			"integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==",
+			"version": "7.24.7",
+			"resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz",
+			"integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==",
 			"dev": true,
 			"requires": {
-				"@babel/helper-validator-identifier": "^7.22.20",
+				"@babel/helper-validator-identifier": "^7.24.7",
 				"chalk": "^2.4.2",
-				"js-tokens": "^4.0.0"
+				"js-tokens": "^4.0.0",
+				"picocolors": "^1.0.0"
 			},
 			"dependencies": {
 				"ansi-styles": {
@@ -5403,39 +5165,48 @@
 			}
 		},
 		"@csstools/css-parser-algorithms": {
-			"version": "2.4.0",
-			"resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.4.0.tgz",
-			"integrity": "sha512-/PPLr2g5PAUCKAPEbfyk6/baZA+WJHQtUhPkoCQMpyRE8I0lXrG1QFRN8e5s3ZYxM8d/g5BZc6lH3s8Op7/VEg==",
+			"version": "2.7.1",
+			"resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.7.1.tgz",
+			"integrity": "sha512-2SJS42gxmACHgikc1WGesXLIT8d/q2l0UFM7TaEeIzdFCE/FPMtTiizcPGGJtlPo2xuQzY09OhrLTzRxqJqwGw==",
 			"dev": true,
 			"requires": {}
 		},
 		"@csstools/css-tokenizer": {
-			"version": "2.2.2",
-			"resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-2.2.2.tgz",
-			"integrity": "sha512-wCDUe/MAw7npAHFLyW3QjSyLA66S5QFaV1jIXlNQvdJ8RzXDSgALa49eWcUO6P55ARQaz0TsDdAgdRgkXFYY8g==",
+			"version": "2.4.1",
+			"resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-2.4.1.tgz",
+			"integrity": "sha512-eQ9DIktFJBhGjioABJRtUucoWR2mwllurfnM8LuNGAqX3ViZXaUchqk+1s7jjtkFiT9ySdACsFEA3etErkALUg==",
 			"dev": true
 		},
 		"@csstools/media-query-list-parser": {
-			"version": "2.1.6",
-			"resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.6.tgz",
-			"integrity": "sha512-R6AKl9vaU0It7D7TR2lQn0pre5aQfdeqHRePlaRCY8rHL3l9eVlNRpsEVDKFi/zAjzv68CxH2M5kqbhPFPKjvw==",
+			"version": "2.1.13",
+			"resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.13.tgz",
+			"integrity": "sha512-XaHr+16KRU9Gf8XLi3q8kDlI18d5vzKSKCY510Vrtc9iNR0NJzbY9hhTmwhzYZj/ZwGL4VmB3TA9hJW0Um2qFA==",
 			"dev": true,
 			"requires": {}
 		},
 		"@csstools/selector-specificity": {
-			"version": "3.0.1",
-			"resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-3.0.1.tgz",
-			"integrity": "sha512-NPljRHkq4a14YzZ3YD406uaxh7s0g6eAq3L9aLOWywoqe8PkYamAvtsh7KNX6c++ihDrJ0RiU+/z7rGnhlZ5ww==",
+			"version": "3.1.1",
+			"resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-3.1.1.tgz",
+			"integrity": "sha512-a7cxGcJ2wIlMFLlh8z2ONm+715QkPHiyJcxwQlKOz/03GPw1COpfhcmC9wm4xlZfp//jWHNNMwzjtqHXVWU9KA==",
 			"dev": true,
 			"requires": {}
 		},
+		"@dual-bundle/import-meta-resolve": {
+			"version": "4.1.0",
+			"resolved": "https://registry.npmjs.org/@dual-bundle/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz",
+			"integrity": "sha512-+nxncfwHM5SgAtrVzgpzJOI1ol0PkumhVo469KCf9lUi21IGcY90G98VuHm9VRrUypmAzawAHO9bs6hqeADaVg==",
+			"dev": true
+		},
 		"@es-joy/jsdoccomment": {
-			"version": "0.37.1",
-			"resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.37.1.tgz",
-			"integrity": "sha512-5vxWJ1gEkEF0yRd0O+uK6dHJf7adrxwQSX8PuRiPfFSAbNLnY0ZJfXaZucoz14Jj2N11xn2DnlEPwWRpYpvRjg==",
+			"version": "0.43.1",
+			"resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.43.1.tgz",
+			"integrity": "sha512-I238eDtOolvCuvtxrnqtlBaw0BwdQuYqK7eA6XIonicMdOOOb75mqdIzkGDUbS04+1Di007rgm9snFRNeVrOog==",
 			"dev": true,
 			"requires": {
-				"comment-parser": "1.3.1",
+				"@types/eslint": "^8.56.5",
+				"@types/estree": "^1.0.5",
+				"@typescript-eslint/types": "^7.2.0",
+				"comment-parser": "1.4.1",
 				"esquery": "^1.5.0",
 				"jsdoc-type-pratt-parser": "~4.0.0"
 			}
@@ -5450,9 +5221,9 @@
 			}
 		},
 		"@eslint-community/regexpp": {
-			"version": "4.10.0",
-			"resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz",
-			"integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==",
+			"version": "4.11.0",
+			"resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz",
+			"integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==",
 			"dev": true
 		},
 		"@eslint/eslintrc": {
@@ -5473,19 +5244,19 @@
 			}
 		},
 		"@eslint/js": {
-			"version": "8.56.0",
-			"resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz",
-			"integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==",
+			"version": "8.57.0",
+			"resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz",
+			"integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==",
 			"dev": true
 		},
 		"@humanwhocodes/config-array": {
-			"version": "0.11.13",
-			"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz",
-			"integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==",
+			"version": "0.11.14",
+			"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz",
+			"integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==",
 			"dev": true,
 			"requires": {
-				"@humanwhocodes/object-schema": "^2.0.1",
-				"debug": "^4.1.1",
+				"@humanwhocodes/object-schema": "^2.0.2",
+				"debug": "^4.3.1",
 				"minimatch": "^3.0.5"
 			}
 		},
@@ -5496,9 +5267,9 @@
 			"dev": true
 		},
 		"@humanwhocodes/object-schema": {
-			"version": "2.0.1",
-			"resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz",
-			"integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==",
+			"version": "2.0.3",
+			"resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz",
+			"integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==",
 			"dev": true
 		},
 		"@mdn/browser-compat-data": {
@@ -5533,6 +5304,55 @@
 				"fastq": "^1.6.0"
 			}
 		},
+		"@stylistic/stylelint-config": {
+			"version": "1.0.1",
+			"resolved": "https://registry.npmjs.org/@stylistic/stylelint-config/-/stylelint-config-1.0.1.tgz",
+			"integrity": "sha512-JgFP88HZEyo34k9RpWVdcQJtLPrMxYE58IO3qypXhmvE/NmZohj+xjDtQ8UfaarnYsLecnldw57/GHum07Ctdw==",
+			"dev": true,
+			"requires": {
+				"@stylistic/stylelint-plugin": "^2.0.0"
+			}
+		},
+		"@stylistic/stylelint-plugin": {
+			"version": "2.0.0",
+			"resolved": "https://registry.npmjs.org/@stylistic/stylelint-plugin/-/stylelint-plugin-2.0.0.tgz",
+			"integrity": "sha512-dHKuT6PGd1WGZLOTuozAM7GdQzdmlmnFXYzvV1jYJXXpcCpV/OJ3+n8TXpMkoOeKHpJydY43EOoZTO1W/FOA4Q==",
+			"dev": true,
+			"requires": {
+				"@csstools/css-parser-algorithms": "^2.3.2",
+				"@csstools/css-tokenizer": "^2.2.1",
+				"@csstools/media-query-list-parser": "^2.1.5",
+				"is-plain-object": "^5.0.0",
+				"postcss-selector-parser": "^6.0.13",
+				"postcss-value-parser": "^4.2.0",
+				"style-search": "^0.1.0",
+				"stylelint": "^16.0.2"
+			},
+			"dependencies": {
+				"is-plain-object": {
+					"version": "5.0.0",
+					"resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
+					"integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==",
+					"dev": true
+				}
+			}
+		},
+		"@types/eslint": {
+			"version": "8.56.11",
+			"resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.11.tgz",
+			"integrity": "sha512-sVBpJMf7UPo/wGecYOpk2aQya2VUGeHhe38WG7/mN5FufNSubf5VT9Uh9Uyp8/eLJpu1/tuhJ/qTo4mhSB4V4Q==",
+			"dev": true,
+			"requires": {
+				"@types/estree": "*",
+				"@types/json-schema": "*"
+			}
+		},
+		"@types/estree": {
+			"version": "1.0.5",
+			"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz",
+			"integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==",
+			"dev": true
+		},
 		"@types/json-schema": {
 			"version": "7.0.15",
 			"resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
@@ -5545,97 +5365,84 @@
 			"integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==",
 			"dev": true
 		},
-		"@types/minimist": {
-			"version": "1.2.5",
-			"resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz",
-			"integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==",
-			"dev": true
-		},
 		"@types/normalize-package-data": {
 			"version": "2.4.4",
 			"resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz",
 			"integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==",
 			"dev": true
 		},
-		"@types/semver": {
-			"version": "7.5.6",
-			"resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz",
-			"integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==",
-			"dev": true
-		},
 		"@typescript-eslint/scope-manager": {
-			"version": "5.62.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz",
-			"integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==",
+			"version": "7.17.0",
+			"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.17.0.tgz",
+			"integrity": "sha512-0P2jTTqyxWp9HiKLu/Vemr2Rg1Xb5B7uHItdVZ6iAenXmPo4SZ86yOPCJwMqpCyaMiEHTNqizHfsbmCFT1x9SA==",
 			"dev": true,
 			"requires": {
-				"@typescript-eslint/types": "5.62.0",
-				"@typescript-eslint/visitor-keys": "5.62.0"
+				"@typescript-eslint/types": "7.17.0",
+				"@typescript-eslint/visitor-keys": "7.17.0"
 			}
 		},
 		"@typescript-eslint/types": {
-			"version": "5.62.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz",
-			"integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==",
+			"version": "7.17.0",
+			"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.17.0.tgz",
+			"integrity": "sha512-a29Ir0EbyKTKHnZWbNsrc/gqfIBqYPwj3F2M+jWE/9bqfEHg0AMtXzkbUkOG6QgEScxh2+Pz9OXe11jHDnHR7A==",
 			"dev": true
 		},
 		"@typescript-eslint/typescript-estree": {
-			"version": "5.62.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz",
-			"integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==",
+			"version": "7.17.0",
+			"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.17.0.tgz",
+			"integrity": "sha512-72I3TGq93t2GoSBWI093wmKo0n6/b7O4j9o8U+f65TVD0FS6bI2180X5eGEr8MA8PhKMvYe9myZJquUT2JkCZw==",
 			"dev": true,
 			"requires": {
-				"@typescript-eslint/types": "5.62.0",
-				"@typescript-eslint/visitor-keys": "5.62.0",
+				"@typescript-eslint/types": "7.17.0",
+				"@typescript-eslint/visitor-keys": "7.17.0",
 				"debug": "^4.3.4",
 				"globby": "^11.1.0",
 				"is-glob": "^4.0.3",
-				"semver": "^7.3.7",
-				"tsutils": "^3.21.0"
-			}
-		},
-		"@typescript-eslint/utils": {
-			"version": "5.62.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz",
-			"integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==",
-			"dev": true,
-			"requires": {
-				"@eslint-community/eslint-utils": "^4.2.0",
-				"@types/json-schema": "^7.0.9",
-				"@types/semver": "^7.3.12",
-				"@typescript-eslint/scope-manager": "5.62.0",
-				"@typescript-eslint/types": "5.62.0",
-				"@typescript-eslint/typescript-estree": "5.62.0",
-				"eslint-scope": "^5.1.1",
-				"semver": "^7.3.7"
-			},
-			"dependencies": {
-				"eslint-scope": {
-					"version": "5.1.1",
-					"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
-					"integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
+				"minimatch": "^9.0.4",
+				"semver": "^7.6.0",
+				"ts-api-utils": "^1.3.0"
+			},
+			"dependencies": {
+				"brace-expansion": {
+					"version": "2.0.1",
+					"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+					"integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
 					"dev": true,
 					"requires": {
-						"esrecurse": "^4.3.0",
-						"estraverse": "^4.1.1"
+						"balanced-match": "^1.0.0"
 					}
 				},
-				"estraverse": {
-					"version": "4.3.0",
-					"resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
-					"integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
-					"dev": true
+				"minimatch": {
+					"version": "9.0.5",
+					"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
+					"integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
+					"dev": true,
+					"requires": {
+						"brace-expansion": "^2.0.1"
+					}
 				}
 			}
 		},
+		"@typescript-eslint/utils": {
+			"version": "7.17.0",
+			"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.17.0.tgz",
+			"integrity": "sha512-r+JFlm5NdB+JXc7aWWZ3fKSm1gn0pkswEwIYsrGPdsT2GjsRATAKXiNtp3vgAAO1xZhX8alIOEQnNMl3kbTgJw==",
+			"dev": true,
+			"requires": {
+				"@eslint-community/eslint-utils": "^4.4.0",
+				"@typescript-eslint/scope-manager": "7.17.0",
+				"@typescript-eslint/types": "7.17.0",
+				"@typescript-eslint/typescript-estree": "7.17.0"
+			}
+		},
 		"@typescript-eslint/visitor-keys": {
-			"version": "5.62.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz",
-			"integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==",
+			"version": "7.17.0",
+			"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.17.0.tgz",
+			"integrity": "sha512-RVGC9UhPOCsfCdI9pU++K4nD7to+jTcMIbXTSOcrLqUEW6gF2pU1UUbYJKc9cvcRSK1UDeMJ7pdMxf4bhMpV/A==",
 			"dev": true,
 			"requires": {
-				"@typescript-eslint/types": "5.62.0",
-				"eslint-visitor-keys": "^3.3.0"
+				"@typescript-eslint/types": "7.17.0",
+				"eslint-visitor-keys": "^3.4.3"
 			}
 		},
 		"@ungap/structured-clone": {
@@ -5651,9 +5458,9 @@
 			"dev": true
 		},
 		"acorn": {
-			"version": "8.11.2",
-			"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz",
-			"integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==",
+			"version": "8.12.1",
+			"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz",
+			"integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==",
 			"dev": true
 		},
 		"acorn-jsx": {
@@ -5727,9 +5534,9 @@
 			"dev": true
 		},
 		"arrify": {
-			"version": "1.0.1",
-			"resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
-			"integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==",
+			"version": "2.0.1",
+			"resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz",
+			"integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==",
 			"dev": true
 		},
 		"ast-metadata-inferer": {
@@ -5776,30 +5583,30 @@
 			}
 		},
 		"braces": {
-			"version": "3.0.2",
-			"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
-			"integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+			"version": "3.0.3",
+			"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
+			"integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
 			"dev": true,
 			"requires": {
-				"fill-range": "^7.0.1"
+				"fill-range": "^7.1.1"
 			}
 		},
 		"browserslist": {
-			"version": "4.22.2",
-			"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz",
-			"integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==",
+			"version": "4.23.2",
+			"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.2.tgz",
+			"integrity": "sha512-qkqSyistMYdxAcw+CzbZwlBy8AGmS/eEWs+sEV5TnLRGDOL+C5M2EnH6tlZyg0YoAxGJAFKh61En9BR941GnHA==",
 			"dev": true,
 			"requires": {
-				"caniuse-lite": "^1.0.30001565",
-				"electron-to-chromium": "^1.4.601",
+				"caniuse-lite": "^1.0.30001640",
+				"electron-to-chromium": "^1.4.820",
 				"node-releases": "^2.0.14",
-				"update-browserslist-db": "^1.0.13"
+				"update-browserslist-db": "^1.1.0"
 			}
 		},
 		"browserslist-config-wikimedia": {
-			"version": "0.5.1",
-			"resolved": "https://registry.npmjs.org/browserslist-config-wikimedia/-/browserslist-config-wikimedia-0.5.1.tgz",
-			"integrity": "sha512-jf532fUf/gaxiKdHgGCQUT552P5up3RpG+CzLixOQBJ5FwDmYQSRLYHCFUA9s3KMOHh4P3xVp+NUaGNxvtoT9g==",
+			"version": "0.7.0",
+			"resolved": "https://registry.npmjs.org/browserslist-config-wikimedia/-/browserslist-config-wikimedia-0.7.0.tgz",
+			"integrity": "sha512-CTa0lv78dXKEgrYsOLCkqO+9UUS3CV9MWEOYHcymgEvx4mYxB80sCoKRCR7wW2SOMNxjaP9hohrZripjnKuRTA==",
 			"dev": true
 		},
 		"builtin-modules": {
@@ -5808,51 +5615,16 @@
 			"integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==",
 			"dev": true
 		},
-		"builtins": {
-			"version": "5.0.1",
-			"resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz",
-			"integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==",
-			"dev": true,
-			"requires": {
-				"semver": "^7.0.0"
-			}
-		},
 		"callsites": {
 			"version": "3.1.0",
 			"resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
 			"integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
 			"dev": true
 		},
-		"camelcase": {
-			"version": "6.3.0",
-			"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
-			"integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
-			"dev": true
-		},
-		"camelcase-keys": {
-			"version": "7.0.2",
-			"resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-7.0.2.tgz",
-			"integrity": "sha512-Rjs1H+A9R+Ig+4E/9oyB66UC5Mj9Xq3N//vcLf2WzgdTi/3gUu3Z9KoqmlrEG4VuuLK8wJHofxzdQXz/knhiYg==",
-			"dev": true,
-			"requires": {
-				"camelcase": "^6.3.0",
-				"map-obj": "^4.1.0",
-				"quick-lru": "^5.1.1",
-				"type-fest": "^1.2.1"
-			},
-			"dependencies": {
-				"type-fest": {
-					"version": "1.4.0",
-					"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz",
-					"integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==",
-					"dev": true
-				}
-			}
-		},
 		"caniuse-lite": {
-			"version": "1.0.30001570",
-			"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001570.tgz",
-			"integrity": "sha512-+3e0ASu4sw1SWaoCtvPeyXp+5PsjigkSt8OXZbF9StH5pQWbxEjLAZE3n8Aup5udop1uRiKA7a4utUk/uoSpUw==",
+			"version": "1.0.30001643",
+			"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001643.tgz",
+			"integrity": "sha512-ERgWGNleEilSrHM6iUz/zJNSQTP8Mr21wDWpdgvRwcTXGAq6jMtOUPP4dqFPTdKqZ2wKTdtB+uucZ3MRpAUSmg==",
 			"dev": true
 		},
 		"chalk": {
@@ -5866,9 +5638,9 @@
 			}
 		},
 		"ci-info": {
-			"version": "3.9.0",
-			"resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
-			"integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
+			"version": "4.0.0",
+			"resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.0.0.tgz",
+			"integrity": "sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==",
 			"dev": true
 		},
 		"clean-regexp": {
@@ -5889,13 +5661,13 @@
 			}
 		},
 		"cliui": {
-			"version": "7.0.4",
-			"resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
-			"integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
+			"version": "8.0.1",
+			"resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
+			"integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
 			"dev": true,
 			"requires": {
 				"string-width": "^4.2.0",
-				"strip-ansi": "^6.0.0",
+				"strip-ansi": "^6.0.1",
 				"wrap-ansi": "^7.0.0"
 			}
 		},
@@ -5927,9 +5699,9 @@
 			"dev": true
 		},
 		"comment-parser": {
-			"version": "1.3.1",
-			"resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.3.1.tgz",
-			"integrity": "sha512-B52sN2VNghyq5ofvUsqZjmk6YkihBX5vMSChmSK9v4ShjKf3Vk5Xcmgpw4o+iIgtrnM/u5FiMpz9VKb8lpBveA==",
+			"version": "1.4.1",
+			"resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.1.tgz",
+			"integrity": "sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==",
 			"dev": true
 		},
 		"concat-map": {
@@ -5938,6 +5710,15 @@
 			"integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
 			"dev": true
 		},
+		"core-js-compat": {
+			"version": "3.37.1",
+			"resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.37.1.tgz",
+			"integrity": "sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg==",
+			"dev": true,
+			"requires": {
+				"browserslist": "^4.23.0"
+			}
+		},
 		"core-util-is": {
 			"version": "1.0.3",
 			"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
@@ -5945,15 +5726,15 @@
 			"dev": true
 		},
 		"cosmiconfig": {
-			"version": "8.3.6",
-			"resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz",
-			"integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==",
+			"version": "9.0.0",
+			"resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz",
+			"integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==",
 			"dev": true,
 			"requires": {
+				"env-paths": "^2.2.1",
 				"import-fresh": "^3.3.0",
 				"js-yaml": "^4.1.0",
-				"parse-json": "^5.2.0",
-				"path-type": "^4.0.0"
+				"parse-json": "^5.2.0"
 			}
 		},
 		"cross-spawn": {
@@ -5968,47 +5749,11 @@
 			}
 		},
 		"css-functions-list": {
-			"version": "3.2.1",
-			"resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.1.tgz",
-			"integrity": "sha512-Nj5YcaGgBtuUmn1D7oHqPW0c9iui7xsTsj5lIX8ZgevdfhmjFfKB3r8moHJtNJnctnYXJyYX5I1pp90HM4TPgQ==",
+			"version": "3.2.2",
+			"resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.2.tgz",
+			"integrity": "sha512-c+N0v6wbKVxTu5gOBBFkr9BEdBWaqqjQeiJ8QvSRIJOf+UxlJh930m8e6/WNeODIK0mYLFkoONrnj16i2EcvfQ==",
 			"dev": true
 		},
-		"css-rule-stream": {
-			"version": "1.1.0",
-			"resolved": "https://registry.npmjs.org/css-rule-stream/-/css-rule-stream-1.1.0.tgz",
-			"integrity": "sha512-qiio/Zkr8I19jh/XuzEkK8OKDQRTrEYaRyIHy4Bwh/tPUe0w8GcQs7r6x24Yc9lT+FbnZFYULxEIXCmaymguUQ==",
-			"dev": true,
-			"requires": {
-				"css-tokenize": "^1.0.1",
-				"duplexer2": "0.0.2",
-				"ldjson-stream": "^1.2.1",
-				"through2": "^0.6.3"
-			},
-			"dependencies": {
-				"readable-stream": {
-					"version": "1.0.34",
-					"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
-					"integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==",
-					"dev": true,
-					"requires": {
-						"core-util-is": "~1.0.0",
-						"inherits": "~2.0.1",
-						"isarray": "0.0.1",
-						"string_decoder": "~0.10.x"
-					}
-				},
-				"through2": {
-					"version": "0.6.5",
-					"resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz",
-					"integrity": "sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg==",
-					"dev": true,
-					"requires": {
-						"readable-stream": ">=1.0.33-1 <1.1.0-0",
-						"xtend": ">=4.0.0 <4.1.0-0"
-					}
-				}
-			}
-		},
 		"css-tokenize": {
 			"version": "1.0.1",
 			"resolved": "https://registry.npmjs.org/css-tokenize/-/css-tokenize-1.0.1.tgz",
@@ -6042,44 +5787,14 @@
 			"dev": true
 		},
 		"debug": {
-			"version": "4.3.4",
-			"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
-			"integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+			"version": "4.3.5",
+			"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz",
+			"integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==",
 			"dev": true,
 			"requires": {
 				"ms": "2.1.2"
 			}
 		},
-		"decamelize": {
-			"version": "5.0.1",
-			"resolved": "https://registry.npmjs.org/decamelize/-/decamelize-5.0.1.tgz",
-			"integrity": "sha512-VfxadyCECXgQlkoEAjeghAr5gY3Hf+IKjKb+X8tGVDtveCjN+USwprd2q3QXBR9T1+x2DG0XZF5/w+7HAtSaXA==",
-			"dev": true
-		},
-		"decamelize-keys": {
-			"version": "1.1.1",
-			"resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz",
-			"integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==",
-			"dev": true,
-			"requires": {
-				"decamelize": "^1.1.0",
-				"map-obj": "^1.0.0"
-			},
-			"dependencies": {
-				"decamelize": {
-					"version": "1.2.0",
-					"resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
-					"integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==",
-					"dev": true
-				},
-				"map-obj": {
-					"version": "1.0.1",
-					"resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
-					"integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==",
-					"dev": true
-				}
-			}
-		},
 		"deep-is": {
 			"version": "0.1.4",
 			"resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
@@ -6111,21 +5826,20 @@
 			}
 		},
 		"doiuse": {
-			"version": "4.4.1",
-			"resolved": "https://registry.npmjs.org/doiuse/-/doiuse-4.4.1.tgz",
-			"integrity": "sha512-TUpr1/YNg20IB09tZmwGCTsTQoxj8jUld/hUZprZMj8vj0VpAJySXEWCr8WMvqvgzk0/kG/FxeSMGKode4UjPg==",
+			"version": "6.0.2",
+			"resolved": "https://registry.npmjs.org/doiuse/-/doiuse-6.0.2.tgz",
+			"integrity": "sha512-eBTs23NOX+EAYPr4RbCR6J4DRW/TML3uMo37y0X1whlkersDYFCk9HmCl09KX98cis22VKsV1QaxfVNauJ3NBw==",
 			"dev": true,
 			"requires": {
-				"browserslist": "^4.16.1",
-				"caniuse-lite": "^1.0.30001179",
-				"css-rule-stream": "^1.1.0",
-				"duplexer2": "0.0.2",
+				"browserslist": "^4.21.5",
+				"caniuse-lite": "^1.0.30001487",
+				"css-tokenize": "^1.0.1",
+				"duplexify": "^4.1.2",
 				"ldjson-stream": "^1.2.1",
 				"multimatch": "^5.0.0",
-				"postcss": "^8.2.4",
-				"source-map": "^0.7.3",
-				"through2": "^4.0.2",
-				"yargs": "^16.2.0"
+				"postcss": "^8.4.21",
+				"source-map": "^0.7.4",
+				"yargs": "^17.7.1"
 			}
 		},
 		"dom-serializer": {
@@ -6165,19 +5879,44 @@
 				"domhandler": "^5.0.3"
 			}
 		},
-		"duplexer2": {
-			"version": "0.0.2",
-			"resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz",
-			"integrity": "sha512-+AWBwjGadtksxjOQSFDhPNQbed7icNXApT4+2BNpsXzcCBiInq2H9XW0O8sfHFaPmnQRs7cg/P0fAr2IWQSW0g==",
+		"duplexify": {
+			"version": "4.1.3",
+			"resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.3.tgz",
+			"integrity": "sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==",
 			"dev": true,
 			"requires": {
-				"readable-stream": "~1.1.9"
+				"end-of-stream": "^1.4.1",
+				"inherits": "^2.0.3",
+				"readable-stream": "^3.1.1",
+				"stream-shift": "^1.0.2"
+			},
+			"dependencies": {
+				"readable-stream": {
+					"version": "3.6.2",
+					"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
+					"integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
+					"dev": true,
+					"requires": {
+						"inherits": "^2.0.3",
+						"string_decoder": "^1.1.1",
+						"util-deprecate": "^1.0.1"
+					}
+				},
+				"string_decoder": {
+					"version": "1.3.0",
+					"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+					"integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+					"dev": true,
+					"requires": {
+						"safe-buffer": "~5.2.0"
+					}
+				}
 			}
 		},
 		"electron-to-chromium": {
-			"version": "1.4.615",
-			"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.615.tgz",
-			"integrity": "sha512-/bKPPcgZVUziECqDc+0HkT87+0zhaWSZHNXqF8FLd2lQcptpmUFwoCSWjCdOng9Gdq+afKArPdEg/0ZW461Eng==",
+			"version": "1.5.0",
+			"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.0.tgz",
+			"integrity": "sha512-Vb3xHHYnLseK8vlMJQKJYXJ++t4u1/qJ3vykuVrVjvdiOEhYyT1AuP4x03G8EnPmYvYOhe9T+dADTmthjRQMkA==",
 			"dev": true
 		},
 		"emoji-regex": {
@@ -6186,12 +5925,37 @@
 			"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
 			"dev": true
 		},
+		"end-of-stream": {
+			"version": "1.4.4",
+			"resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
+			"integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
+			"dev": true,
+			"requires": {
+				"once": "^1.4.0"
+			}
+		},
+		"enhanced-resolve": {
+			"version": "5.17.1",
+			"resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz",
+			"integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==",
+			"dev": true,
+			"requires": {
+				"graceful-fs": "^4.2.4",
+				"tapable": "^2.2.0"
+			}
+		},
 		"entities": {
 			"version": "4.5.0",
 			"resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
 			"integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
 			"dev": true
 		},
+		"env-paths": {
+			"version": "2.2.1",
+			"resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz",
+			"integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==",
+			"dev": true
+		},
 		"error-ex": {
 			"version": "1.3.2",
 			"resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
@@ -6202,9 +5966,9 @@
 			}
 		},
 		"escalade": {
-			"version": "3.1.1",
-			"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
-			"integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+			"version": "3.1.2",
+			"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz",
+			"integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==",
 			"dev": true
 		},
 		"escape-string-regexp": {
@@ -6214,16 +5978,16 @@
 			"dev": true
 		},
 		"eslint": {
-			"version": "8.56.0",
-			"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz",
-			"integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==",
+			"version": "8.57.0",
+			"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz",
+			"integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==",
 			"dev": true,
 			"requires": {
 				"@eslint-community/eslint-utils": "^4.2.0",
 				"@eslint-community/regexpp": "^4.6.1",
 				"@eslint/eslintrc": "^2.1.4",
-				"@eslint/js": "8.56.0",
-				"@humanwhocodes/config-array": "^0.11.13",
+				"@eslint/js": "8.57.0",
+				"@humanwhocodes/config-array": "^0.11.14",
 				"@humanwhocodes/module-importer": "^1.0.1",
 				"@nodelib/fs.walk": "^1.2.8",
 				"@ungap/structured-clone": "^1.2.0",
@@ -6260,35 +6024,37 @@
 			}
 		},
 		"eslint-compat-utils": {
-			"version": "0.1.2",
-			"resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.1.2.tgz",
-			"integrity": "sha512-Jia4JDldWnFNIru1Ehx1H5s9/yxiRHY/TimCuUc0jNexew3cF1gI6CYZil1ociakfWO3rRqFjl1mskBblB3RYg==",
+			"version": "0.5.1",
+			"resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.5.1.tgz",
+			"integrity": "sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==",
 			"dev": true,
-			"requires": {}
+			"requires": {
+				"semver": "^7.5.4"
+			}
 		},
 		"eslint-config-wikimedia": {
-			"version": "0.26.0",
-			"resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.26.0.tgz",
-			"integrity": "sha512-TAXTySls9k3oWs754rIjlcd9PBLvYeMvjqjiuU8u4gweu0UDgBJGslf+zcvVNXEooAtyLZdENjrzDDjG8ssS7Q==",
+			"version": "0.28.2",
+			"resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.28.2.tgz",
+			"integrity": "sha512-5+rdnT7wH1gpKAO6tHYThg78eMhZMruJzvqku3Y5iaEY/A7kSKLFpA/vOj/snys9fKjDHC9BXmArQh+agkOoJQ==",
 			"dev": true,
 			"requires": {
-				"browserslist-config-wikimedia": "^0.5.1",
-				"eslint": "^8.53.0",
+				"browserslist-config-wikimedia": "^0.7.0",
+				"eslint": "^8.57.0",
 				"eslint-plugin-compat": "^4.2.0",
-				"eslint-plugin-es-x": "^7.3.0",
-				"eslint-plugin-jest": "^27.6.0",
-				"eslint-plugin-jsdoc": "^42.0.0",
-				"eslint-plugin-json-es": "^1.5.7",
-				"eslint-plugin-mediawiki": "^0.5.0",
-				"eslint-plugin-mocha": "^10.2.0",
-				"eslint-plugin-n": "^16.0.1",
-				"eslint-plugin-no-jquery": "^2.7.0",
-				"eslint-plugin-qunit": "^7.3.4",
+				"eslint-plugin-es-x": "^7.6.0",
+				"eslint-plugin-jest": "^28.5.0",
+				"eslint-plugin-jsdoc": "48.2.5",
+				"eslint-plugin-json-es": "^1.6.0",
+				"eslint-plugin-mediawiki": "^0.7.0",
+				"eslint-plugin-mocha": "^10.4.3",
+				"eslint-plugin-n": "^17.7.0",
+				"eslint-plugin-no-jquery": "^3.0.1",
+				"eslint-plugin-qunit": "^8.1.1",
 				"eslint-plugin-security": "^1.7.1",
-				"eslint-plugin-unicorn": "^47.0.0",
-				"eslint-plugin-vue": "^9.18.1",
-				"eslint-plugin-wdio": "^7.19.4",
-				"eslint-plugin-yml": "^1.10.0"
+				"eslint-plugin-unicorn": "^53.0.0",
+				"eslint-plugin-vue": "^9.26.0",
+				"eslint-plugin-wdio": "^8.24.12",
+				"eslint-plugin-yml": "^1.14.0"
 			}
 		},
 		"eslint-plugin-compat": {
@@ -6307,45 +6073,46 @@
 			}
 		},
 		"eslint-plugin-es-x": {
-			"version": "7.5.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.5.0.tgz",
-			"integrity": "sha512-ODswlDSO0HJDzXU0XvgZ3lF3lS3XAZEossh15Q2UHjwrJggWeBoKqqEsLTZLXl+dh5eOAozG0zRcYtuE35oTuQ==",
+			"version": "7.8.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.8.0.tgz",
+			"integrity": "sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==",
 			"dev": true,
 			"requires": {
 				"@eslint-community/eslint-utils": "^4.1.2",
-				"@eslint-community/regexpp": "^4.6.0",
-				"eslint-compat-utils": "^0.1.2"
+				"@eslint-community/regexpp": "^4.11.0",
+				"eslint-compat-utils": "^0.5.1"
 			}
 		},
 		"eslint-plugin-jest": {
-			"version": "27.6.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.6.0.tgz",
-			"integrity": "sha512-MTlusnnDMChbElsszJvrwD1dN3x6nZl//s4JD23BxB6MgR66TZlL064su24xEIS3VACfAoHV1vgyMgPw8nkdng==",
+			"version": "28.6.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-28.6.0.tgz",
+			"integrity": "sha512-YG28E1/MIKwnz+e2H7VwYPzHUYU4aMa19w0yGcwXnnmJH6EfgHahTJ2un3IyraUxNfnz/KUhJAFXNNwWPo12tg==",
 			"dev": true,
 			"requires": {
-				"@typescript-eslint/utils": "^5.10.0"
+				"@typescript-eslint/utils": "^6.0.0 || ^7.0.0"
 			}
 		},
 		"eslint-plugin-jsdoc": {
-			"version": "42.0.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-42.0.0.tgz",
-			"integrity": "sha512-qXYr45G8atPKowZbIOdmABukMzu9IMjAlj6j5Fe0iuUItznWSXUDiBj57ejXcbt8bkPrg83333nuz+cqGKFgcQ==",
+			"version": "48.2.5",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-48.2.5.tgz",
+			"integrity": "sha512-ZeTfKV474W1N9niWfawpwsXGu+ZoMXu4417eBROX31d7ZuOk8zyG66SO77DpJ2+A9Wa2scw/jRqBPnnQo7VbcQ==",
 			"dev": true,
 			"requires": {
-				"@es-joy/jsdoccomment": "~0.37.0",
+				"@es-joy/jsdoccomment": "~0.43.0",
 				"are-docs-informative": "^0.0.2",
-				"comment-parser": "1.3.1",
+				"comment-parser": "1.4.1",
 				"debug": "^4.3.4",
 				"escape-string-regexp": "^4.0.0",
 				"esquery": "^1.5.0",
-				"semver": "^7.3.8",
-				"spdx-expression-parse": "^3.0.1"
+				"is-builtin-module": "^3.2.1",
+				"semver": "^7.6.1",
+				"spdx-expression-parse": "^4.0.0"
 			}
 		},
 		"eslint-plugin-json-es": {
-			"version": "1.5.7",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-json-es/-/eslint-plugin-json-es-1.5.7.tgz",
-			"integrity": "sha512-ehBHcCcJo4iViYx6vp3T+SmwzLIlVDzZNoVxN/txZIiPwDQ26mnYaN5iJ3imqN4l1b8z6rbxEH2kB9XDGxeU/w==",
+			"version": "1.6.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-json-es/-/eslint-plugin-json-es-1.6.0.tgz",
+			"integrity": "sha512-xVn6hufGQH1Aa+yqOhQ43Cq28GuitTcMpQh+uaUh27U2qnVLBrvkN+2xQSnv6zpdLEPS35JCNhq4kvhR+PQCgw==",
 			"dev": true,
 			"requires": {
 				"eslint-visitor-keys": "^3.3.0",
@@ -6353,85 +6120,79 @@
 			}
 		},
 		"eslint-plugin-mediawiki": {
-			"version": "0.5.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-mediawiki/-/eslint-plugin-mediawiki-0.5.0.tgz",
-			"integrity": "sha512-rjkHFyv3VDan/dmu7YpD1Rl9h64NOlz4mqqesRN316R+571+ymmb6lXVOdNMbT8H1iPhmtHc+nijVLVkn7pYDw==",
+			"version": "0.7.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-mediawiki/-/eslint-plugin-mediawiki-0.7.0.tgz",
+			"integrity": "sha512-1Y2nsFDPp96xOZCB5ivZAgqYe9i6w2u64VoCIaAzPyZnd/2h8VQR3CtD+u4Yk/KrpbKq9AAJjrs5LS8VAz6KOA==",
 			"dev": true,
 			"requires": {
-				"eslint-plugin-vue": "^8.7.1",
+				"eslint-plugin-vue": "^9.23.0",
 				"upath": "^2.0.1"
-			},
-			"dependencies": {
-				"eslint-plugin-vue": {
-					"version": "8.7.1",
-					"resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-8.7.1.tgz",
-					"integrity": "sha512-28sbtm4l4cOzoO1LtzQPxfxhQABararUb1JtqusQqObJpWX2e/gmVyeYVfepizPFne0Q5cILkYGiBoV36L12Wg==",
-					"dev": true,
-					"requires": {
-						"eslint-utils": "^3.0.0",
-						"natural-compare": "^1.4.0",
-						"nth-check": "^2.0.1",
-						"postcss-selector-parser": "^6.0.9",
-						"semver": "^7.3.5",
-						"vue-eslint-parser": "^8.0.1"
-					}
-				},
-				"vue-eslint-parser": {
-					"version": "8.3.0",
-					"resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-8.3.0.tgz",
-					"integrity": "sha512-dzHGG3+sYwSf6zFBa0Gi9ZDshD7+ad14DGOdTLjruRVgZXe2J+DcZ9iUhyR48z5g1PqRa20yt3Njna/veLJL/g==",
-					"dev": true,
-					"requires": {
-						"debug": "^4.3.2",
-						"eslint-scope": "^7.0.0",
-						"eslint-visitor-keys": "^3.1.0",
-						"espree": "^9.0.0",
-						"esquery": "^1.4.0",
-						"lodash": "^4.17.21",
-						"semver": "^7.3.5"
-					}
-				}
 			}
 		},
 		"eslint-plugin-mocha": {
-			"version": "10.2.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-10.2.0.tgz",
-			"integrity": "sha512-ZhdxzSZnd1P9LqDPF0DBcFLpRIGdh1zkF2JHnQklKQOvrQtT73kdP5K9V2mzvbLR+cCAO9OI48NXK/Ax9/ciCQ==",
+			"version": "10.4.3",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-10.4.3.tgz",
+			"integrity": "sha512-emc4TVjq5Ht0/upR+psftuz6IBG5q279p+1dSRDeHf+NS9aaerBi3lXKo1SEzwC29hFIW21gO89CEWSvRsi8IQ==",
 			"dev": true,
 			"requires": {
 				"eslint-utils": "^3.0.0",
+				"globals": "^13.24.0",
 				"rambda": "^7.4.0"
 			}
 		},
 		"eslint-plugin-n": {
-			"version": "16.5.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-16.5.0.tgz",
-			"integrity": "sha512-Hw02Bj1QrZIlKyj471Tb1jSReTl4ghIMHGuBGiMVmw+s0jOPbI4CBuYpGbZr+tdQ+VAvSK6FDSta3J4ib/SKHQ==",
+			"version": "17.9.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-17.9.0.tgz",
+			"integrity": "sha512-CPSaXDXdrT4nsrOrO4mT4VB6FMUkoySRkHWuuJJHVqsIEjIeZgMY1H7AzSwPbDScikBmLN82KeM1u7ixV7PzGg==",
 			"dev": true,
 			"requires": {
 				"@eslint-community/eslint-utils": "^4.4.0",
-				"builtins": "^5.0.1",
+				"enhanced-resolve": "^5.17.0",
 				"eslint-plugin-es-x": "^7.5.0",
 				"get-tsconfig": "^4.7.0",
+				"globals": "^15.0.0",
 				"ignore": "^5.2.4",
-				"is-builtin-module": "^3.2.1",
-				"is-core-module": "^2.12.1",
-				"minimatch": "^3.1.2",
-				"resolve": "^1.22.2",
+				"minimatch": "^9.0.0",
 				"semver": "^7.5.3"
+			},
+			"dependencies": {
+				"brace-expansion": {
+					"version": "2.0.1",
+					"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+					"integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+					"dev": true,
+					"requires": {
+						"balanced-match": "^1.0.0"
+					}
+				},
+				"globals": {
+					"version": "15.8.0",
+					"resolved": "https://registry.npmjs.org/globals/-/globals-15.8.0.tgz",
+					"integrity": "sha512-VZAJ4cewHTExBWDHR6yptdIBlx9YSSZuwojj9Nt5mBRXQzrKakDsVKQ1J63sklLvzAJm0X5+RpO4i3Y2hcOnFw==",
+					"dev": true
+				},
+				"minimatch": {
+					"version": "9.0.5",
+					"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
+					"integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
+					"dev": true,
+					"requires": {
+						"brace-expansion": "^2.0.1"
+					}
+				}
 			}
 		},
 		"eslint-plugin-no-jquery": {
-			"version": "2.7.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-no-jquery/-/eslint-plugin-no-jquery-2.7.0.tgz",
-			"integrity": "sha512-Aeg7dA6GTH1AcWLlBtWNzOU9efK5KpNi7b0EhBO0o0M+awyzguUUo8gF6hXGjQ9n5h8/uRtYv9zOqQkeC5CG0w==",
+			"version": "3.0.2",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-no-jquery/-/eslint-plugin-no-jquery-3.0.2.tgz",
+			"integrity": "sha512-n/+6p6PFhWDNPVLJj1463hw4OTIRBbROGcbhmtOHTgw7yihSKzkwZiQ00EJTneyeR3jRiw5lpWSMCCBhtb8t2g==",
 			"dev": true,
 			"requires": {}
 		},
 		"eslint-plugin-qunit": {
-			"version": "7.3.4",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-qunit/-/eslint-plugin-qunit-7.3.4.tgz",
-			"integrity": "sha512-EbDM0zJerH9zVdUswMJpcFF7wrrpvsGuYfNexUpa5hZkkdFhaFcX+yD+RSK4Nrauw4psMGlcqeWUMhaVo+Manw==",
+			"version": "8.1.1",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-qunit/-/eslint-plugin-qunit-8.1.1.tgz",
+			"integrity": "sha512-j3xhiAf2Wvr8Dfwl5T6tlJ+F55vqYE9ZdAHUOTzq1lGerYrXzOS46RvK4SSWug2D8sl3ZYr2lA4/hgVXgLloxw==",
 			"dev": true,
 			"requires": {
 				"eslint-utils": "^3.0.0",
@@ -6448,58 +6209,101 @@
 			}
 		},
 		"eslint-plugin-unicorn": {
-			"version": "47.0.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-47.0.0.tgz",
-			"integrity": "sha512-ivB3bKk7fDIeWOUmmMm9o3Ax9zbMz1Bsza/R2qm46ufw4T6VBFBaJIR1uN3pCKSmSXm8/9Nri8V+iUut1NhQGA==",
+			"version": "53.0.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-53.0.0.tgz",
+			"integrity": "sha512-kuTcNo9IwwUCfyHGwQFOK/HjJAYzbODHN3wP0PgqbW+jbXqpNWxNVpVhj2tO9SixBwuAdmal8rVcWKBxwFnGuw==",
 			"dev": true,
 			"requires": {
-				"@babel/helper-validator-identifier": "^7.19.1",
+				"@babel/helper-validator-identifier": "^7.24.5",
 				"@eslint-community/eslint-utils": "^4.4.0",
-				"ci-info": "^3.8.0",
+				"@eslint/eslintrc": "^3.0.2",
+				"ci-info": "^4.0.0",
 				"clean-regexp": "^1.0.0",
+				"core-js-compat": "^3.37.0",
 				"esquery": "^1.5.0",
 				"indent-string": "^4.0.0",
 				"is-builtin-module": "^3.2.1",
 				"jsesc": "^3.0.2",
-				"lodash": "^4.17.21",
 				"pluralize": "^8.0.0",
 				"read-pkg-up": "^7.0.1",
-				"regexp-tree": "^0.1.24",
+				"regexp-tree": "^0.1.27",
 				"regjsparser": "^0.10.0",
-				"safe-regex": "^2.1.1",
-				"semver": "^7.3.8",
+				"semver": "^7.6.1",
 				"strip-indent": "^3.0.0"
+			},
+			"dependencies": {
+				"@eslint/eslintrc": {
+					"version": "3.1.0",
+					"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz",
+					"integrity": "sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==",
+					"dev": true,
+					"requires": {
+						"ajv": "^6.12.4",
+						"debug": "^4.3.2",
+						"espree": "^10.0.1",
+						"globals": "^14.0.0",
+						"ignore": "^5.2.0",
+						"import-fresh": "^3.2.1",
+						"js-yaml": "^4.1.0",
+						"minimatch": "^3.1.2",
+						"strip-json-comments": "^3.1.1"
+					}
+				},
+				"eslint-visitor-keys": {
+					"version": "4.0.0",
+					"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz",
+					"integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==",
+					"dev": true
+				},
+				"espree": {
+					"version": "10.1.0",
+					"resolved": "https://registry.npmjs.org/espree/-/espree-10.1.0.tgz",
+					"integrity": "sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA==",
+					"dev": true,
+					"requires": {
+						"acorn": "^8.12.0",
+						"acorn-jsx": "^5.3.2",
+						"eslint-visitor-keys": "^4.0.0"
+					}
+				},
+				"globals": {
+					"version": "14.0.0",
+					"resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz",
+					"integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==",
+					"dev": true
+				}
 			}
 		},
 		"eslint-plugin-vue": {
-			"version": "9.19.2",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.19.2.tgz",
-			"integrity": "sha512-CPDqTOG2K4Ni2o4J5wixkLVNwgctKXFu6oBpVJlpNq7f38lh9I80pRTouZSJ2MAebPJlINU/KTFSXyQfBUlymA==",
+			"version": "9.27.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.27.0.tgz",
+			"integrity": "sha512-5Dw3yxEyuBSXTzT5/Ge1X5kIkRTQ3nvBn/VwPwInNiZBSJOO/timWMUaflONnFBzU6NhB68lxnCda7ULV5N7LA==",
 			"dev": true,
 			"requires": {
 				"@eslint-community/eslint-utils": "^4.4.0",
+				"globals": "^13.24.0",
 				"natural-compare": "^1.4.0",
 				"nth-check": "^2.1.1",
-				"postcss-selector-parser": "^6.0.13",
-				"semver": "^7.5.4",
-				"vue-eslint-parser": "^9.3.1",
+				"postcss-selector-parser": "^6.0.15",
+				"semver": "^7.6.0",
+				"vue-eslint-parser": "^9.4.3",
 				"xml-name-validator": "^4.0.0"
 			}
 		},
 		"eslint-plugin-wdio": {
-			"version": "7.25.3",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-wdio/-/eslint-plugin-wdio-7.25.3.tgz",
-			"integrity": "sha512-2zbYwV14Md9FNlyhaIILVGPB6w4bu2eJdOTywDUs2Qy4ebcQNwrxB0qCaf7Rm4O+T0Ir+tdYHYBBfbDocSLKng==",
+			"version": "8.37.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-wdio/-/eslint-plugin-wdio-8.37.0.tgz",
+			"integrity": "sha512-X217zXxSqj1IPWu3bxN7D/xEUmNk7Jg5lBf2JwYH3mCogaqL2tnHZnwt0EQ5D9oEejfEl2+4zqHSzhXq1X7F2A==",
 			"dev": true
 		},
 		"eslint-plugin-yml": {
-			"version": "1.11.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-yml/-/eslint-plugin-yml-1.11.0.tgz",
-			"integrity": "sha512-NBZP1NDGy0u38pY5ieix75jxS9GNOJy9xd4gQa0rU4gWbfEsVhKDwuFaQ6RJpDbv6Lq5TtcAZS/YnAc0oeRw0w==",
+			"version": "1.14.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-yml/-/eslint-plugin-yml-1.14.0.tgz",
+			"integrity": "sha512-ESUpgYPOcAYQO9czugcX5OqRvn/ydDVwGCPXY4YjPqc09rHaUVUA6IE6HLQys4rXk/S+qx3EwTd1wHCwam/OWQ==",
 			"dev": true,
 			"requires": {
 				"debug": "^4.3.2",
-				"eslint-compat-utils": "^0.1.1",
+				"eslint-compat-utils": "^0.5.0",
 				"lodash": "^4.17.21",
 				"natural-compare": "^1.4.0",
 				"yaml-eslint-parser": "^1.2.1"
@@ -6654,6 +6458,12 @@
 			"integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
 			"dev": true
 		},
+		"fast-uri": {
+			"version": "3.0.1",
+			"resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.1.tgz",
+			"integrity": "sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==",
+			"dev": true
+		},
 		"fastest-levenshtein": {
 			"version": "1.0.16",
 			"resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz",
@@ -6679,9 +6489,9 @@
 			}
 		},
 		"fill-range": {
-			"version": "7.0.1",
-			"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
-			"integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+			"version": "7.1.1",
+			"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+			"integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
 			"dev": true,
 			"requires": {
 				"to-regex-range": "^5.0.1"
@@ -6740,9 +6550,9 @@
 			}
 		},
 		"flatted": {
-			"version": "3.2.9",
-			"resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz",
-			"integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==",
+			"version": "3.3.1",
+			"resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz",
+			"integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==",
 			"dev": true
 		},
 		"for-in": {
@@ -6779,9 +6589,9 @@
 			"dev": true
 		},
 		"get-tsconfig": {
-			"version": "4.7.2",
-			"resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.2.tgz",
-			"integrity": "sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==",
+			"version": "4.7.6",
+			"resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.6.tgz",
+			"integrity": "sha512-ZAqrLlu18NbDdRaHq+AKXzAmqIUPswPWKUchfytdAjiRFnCe5ojG2bstg6mRiZabkKfCoL/e98pbBELIV/YCeA==",
 			"dev": true,
 			"requires": {
 				"resolve-pkg-maps": "^1.0.0"
@@ -6880,6 +6690,12 @@
 			"integrity": "sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==",
 			"dev": true
 		},
+		"graceful-fs": {
+			"version": "4.2.11",
+			"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+			"integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
+			"dev": true
+		},
 		"graphemer": {
 			"version": "1.4.0",
 			"resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
@@ -6944,10 +6760,13 @@
 			}
 		},
 		"grunt-banana-checker": {
-			"version": "0.11.1",
-			"resolved": "https://registry.npmjs.org/grunt-banana-checker/-/grunt-banana-checker-0.11.1.tgz",
-			"integrity": "sha512-CF0h/TXaX9sbF2yIz+fUfJc4Zvms7XGYQ7ZYMD5+vv0LMZzSFf7JSHXDaBEs72nQWw4r4ap5fOW3baAliW+0bQ==",
-			"dev": true
+			"version": "0.13.0",
+			"resolved": "https://registry.npmjs.org/grunt-banana-checker/-/grunt-banana-checker-0.13.0.tgz",
+			"integrity": "sha512-uAUKILcP69Q4OJHHV2wzxqVaoXB8G3Uh/XuSJLn0Bk/9+WiUY/Q4+OX7dUhrPPeDZPtoGh37qqJLVvZlDTUecg==",
+			"dev": true,
+			"requires": {
+				"chalk": "4.1.2"
+			}
 		},
 		"grunt-cli": {
 			"version": "1.4.3",
@@ -7028,19 +6847,13 @@
 			}
 		},
 		"grunt-stylelint": {
-			"version": "0.19.0",
-			"resolved": "https://registry.npmjs.org/grunt-stylelint/-/grunt-stylelint-0.19.0.tgz",
-			"integrity": "sha512-td+OvkfQ/2bYXNTBAlnpXmfa6sddLSloXRp1zoUONcMScbvEq5S3GSkOZKpCjK90WSjTYR0L7WYFcMVd1TXd+w==",
+			"version": "0.20.1",
+			"resolved": "https://registry.npmjs.org/grunt-stylelint/-/grunt-stylelint-0.20.1.tgz",
+			"integrity": "sha512-tDep9ceEerB+fK6CkzPBXu5qPM7RuwCRgfrtwugEyYYnxINreMZktqQU5eoTW+MhhFj81uWQQnxf+c4geyAmQg==",
 			"dev": true,
 			"requires": {
 				"chalk": "^4.1.2"
-			}
-		},
-		"hard-rejection": {
-			"version": "2.1.0",
-			"resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz",
-			"integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==",
-			"dev": true
+			}
 		},
 		"has-flag": {
 			"version": "4.0.0",
@@ -7106,9 +6919,9 @@
 			}
 		},
 		"ignore": {
-			"version": "5.3.0",
-			"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz",
-			"integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==",
+			"version": "5.3.1",
+			"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz",
+			"integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==",
 			"dev": true
 		},
 		"import-fresh": {
@@ -7121,12 +6934,6 @@
 				"resolve-from": "^4.0.0"
 			}
 		},
-		"import-lazy": {
-			"version": "4.0.0",
-			"resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz",
-			"integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==",
-			"dev": true
-		},
 		"imurmurhash": {
 			"version": "0.1.4",
 			"resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
@@ -7234,12 +7041,6 @@
 			"integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
 			"dev": true
 		},
-		"is-plain-obj": {
-			"version": "1.1.0",
-			"resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
-			"integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==",
-			"dev": true
-		},
 		"is-plain-object": {
 			"version": "2.0.4",
 			"resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
@@ -7358,11 +7159,10 @@
 			"dev": true
 		},
 		"known-css-properties": {
-			"version": "0.29.0",
-			"resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.29.0.tgz",
-			"integrity": "sha512-Ne7wqW7/9Cz54PDt4I3tcV+hAyat8ypyOGzYRJQfdxnnjeWsTxt1cy8pjvvKeI5kfXuyvULyeeAvwvvtAX3ayQ==",
-			"dev": true,
-			"peer": true
+			"version": "0.34.0",
+			"resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.34.0.tgz",
+			"integrity": "sha512-tBECoUqNFbyAY4RrbqsBQqDFpGXAEbdD5QKr8kACx3+rnArmuuR22nKQWKazvp07N9yjTyDZaw/20UIH8tL9DQ==",
+			"dev": true
 		},
 		"ldjson-stream": {
 			"version": "1.2.1",
@@ -7372,30 +7172,6 @@
 			"requires": {
 				"split2": "^0.2.1",
 				"through2": "^0.6.1"
-			},
-			"dependencies": {
-				"readable-stream": {
-					"version": "1.0.34",
-					"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
-					"integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==",
-					"dev": true,
-					"requires": {
-						"core-util-is": "~1.0.0",
-						"inherits": "~2.0.1",
-						"isarray": "0.0.1",
-						"string_decoder": "~0.10.x"
-					}
-				},
-				"through2": {
-					"version": "0.6.5",
-					"resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz",
-					"integrity": "sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg==",
-					"dev": true,
-					"requires": {
-						"readable-stream": ">=1.0.33-1 <1.1.0-0",
-						"xtend": ">=4.0.0 <4.1.0-0"
-					}
-				}
 			}
 		},
 		"levn": {
@@ -7477,15 +7253,6 @@
 			"integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==",
 			"dev": true
 		},
-		"lru-cache": {
-			"version": "6.0.0",
-			"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
-			"integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
-			"dev": true,
-			"requires": {
-				"yallist": "^4.0.0"
-			}
-		},
 		"make-iterator": {
 			"version": "1.0.1",
 			"resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz",
@@ -7501,12 +7268,6 @@
 			"integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==",
 			"dev": true
 		},
-		"map-obj": {
-			"version": "4.3.0",
-			"resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz",
-			"integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==",
-			"dev": true
-		},
 		"mathml-tag-names": {
 			"version": "2.1.3",
 			"resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz",
@@ -7520,76 +7281,10 @@
 			"dev": true
 		},
 		"meow": {
-			"version": "10.1.5",
-			"resolved": "https://registry.npmjs.org/meow/-/meow-10.1.5.tgz",
-			"integrity": "sha512-/d+PQ4GKmGvM9Bee/DPa8z3mXs/pkvJE2KEThngVNOqtmljC6K7NMPxtc2JeZYTmpWb9k/TmxjeL18ez3h7vCw==",
-			"dev": true,
-			"requires": {
-				"@types/minimist": "^1.2.2",
-				"camelcase-keys": "^7.0.0",
-				"decamelize": "^5.0.0",
-				"decamelize-keys": "^1.1.0",
-				"hard-rejection": "^2.1.0",
-				"minimist-options": "4.1.0",
-				"normalize-package-data": "^3.0.2",
-				"read-pkg-up": "^8.0.0",
-				"redent": "^4.0.0",
-				"trim-newlines": "^4.0.2",
-				"type-fest": "^1.2.2",
-				"yargs-parser": "^20.2.9"
-			},
-			"dependencies": {
-				"hosted-git-info": {
-					"version": "4.1.0",
-					"resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz",
-					"integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==",
-					"dev": true,
-					"requires": {
-						"lru-cache": "^6.0.0"
-					}
-				},
-				"normalize-package-data": {
-					"version": "3.0.3",
-					"resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz",
-					"integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==",
-					"dev": true,
-					"requires": {
-						"hosted-git-info": "^4.0.1",
-						"is-core-module": "^2.5.0",
-						"semver": "^7.3.4",
-						"validate-npm-package-license": "^3.0.1"
-					}
-				},
-				"read-pkg": {
-					"version": "6.0.0",
-					"resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-6.0.0.tgz",
-					"integrity": "sha512-X1Fu3dPuk/8ZLsMhEj5f4wFAF0DWoK7qhGJvgaijocXxBmSToKfbFtqbxMO7bVjNA1dmE5huAzjXj/ey86iw9Q==",
-					"dev": true,
-					"requires": {
-						"@types/normalize-package-data": "^2.4.0",
-						"normalize-package-data": "^3.0.2",
-						"parse-json": "^5.2.0",
-						"type-fest": "^1.0.1"
-					}
-				},
-				"read-pkg-up": {
-					"version": "8.0.0",
-					"resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-8.0.0.tgz",
-					"integrity": "sha512-snVCqPczksT0HS2EC+SxUndvSzn6LRCwpfSvLrIfR5BKDQQZMaI6jPRC9dYvYFDRAuFEAnkwww8kBBNE/3VvzQ==",
-					"dev": true,
-					"requires": {
-						"find-up": "^5.0.0",
-						"read-pkg": "^6.0.0",
-						"type-fest": "^1.0.1"
-					}
-				},
-				"type-fest": {
-					"version": "1.4.0",
-					"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz",
-					"integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==",
-					"dev": true
-				}
-			}
+			"version": "13.2.0",
+			"resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz",
+			"integrity": "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==",
+			"dev": true
 		},
 		"merge2": {
 			"version": "1.4.1",
@@ -7598,12 +7293,12 @@
 			"dev": true
 		},
 		"micromatch": {
-			"version": "4.0.5",
-			"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
-			"integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
+			"version": "4.0.7",
+			"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz",
+			"integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==",
 			"dev": true,
 			"requires": {
-				"braces": "^3.0.2",
+				"braces": "^3.0.3",
 				"picomatch": "^2.3.1"
 			}
 		},
@@ -7622,17 +7317,6 @@
 				"brace-expansion": "^1.1.7"
 			}
 		},
-		"minimist-options": {
-			"version": "4.1.0",
-			"resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz",
-			"integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==",
-			"dev": true,
-			"requires": {
-				"arrify": "^1.0.1",
-				"is-plain-obj": "^1.1.0",
-				"kind-of": "^6.0.3"
-			}
-		},
 		"ms": {
 			"version": "2.1.2",
 			"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
@@ -7650,14 +7334,6 @@
 				"array-union": "^2.1.0",
 				"arrify": "^2.0.1",
 				"minimatch": "^3.0.4"
-			},
-			"dependencies": {
-				"arrify": {
-					"version": "2.0.1",
-					"resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz",
-					"integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==",
-					"dev": true
-				}
 			}
 		},
 		"nanoid": {
@@ -7906,9 +7582,9 @@
 			"dev": true
 		},
 		"picocolors": {
-			"version": "1.0.0",
-			"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
-			"integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
+			"version": "1.0.1",
+			"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz",
+			"integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==",
 			"dev": true
 		},
 		"picomatch": {
@@ -7924,20 +7600,20 @@
 			"dev": true
 		},
 		"postcss": {
-			"version": "8.4.32",
-			"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.32.tgz",
-			"integrity": "sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==",
+			"version": "8.4.39",
+			"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.39.tgz",
+			"integrity": "sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==",
 			"dev": true,
 			"requires": {
 				"nanoid": "^3.3.7",
-				"picocolors": "^1.0.0",
-				"source-map-js": "^1.0.2"
+				"picocolors": "^1.0.1",
+				"source-map-js": "^1.2.0"
 			}
 		},
 		"postcss-html": {
-			"version": "1.5.0",
-			"resolved": "https://registry.npmjs.org/postcss-html/-/postcss-html-1.5.0.tgz",
-			"integrity": "sha512-kCMRWJRHKicpA166kc2lAVUGxDZL324bkj/pVOb6RhjB0Z5Krl7mN0AsVkBhVIRZZirY0lyQXG38HCVaoKVNoA==",
+			"version": "1.6.0",
+			"resolved": "https://registry.npmjs.org/postcss-html/-/postcss-html-1.6.0.tgz",
+			"integrity": "sha512-OWgQ9/Pe23MnNJC0PL4uZp8k0EDaUvqpJFSiwFxOLClAhmD7UEisyhO3x5hVsD4xFrjReVTXydlrMes45dJ71w==",
 			"dev": true,
 			"requires": {
 				"htmlparser2": "^8.0.0",
@@ -7947,10 +7623,17 @@
 			},
 			"dependencies": {
 				"js-tokens": {
-					"version": "8.0.2",
-					"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-8.0.2.tgz",
-					"integrity": "sha512-Olnt+V7xYdvGze9YTbGFZIfQXuGV4R3nQwwl8BrtgaPE/wq8UFpUHWuTNc05saowhSr1ZO6tx+V6RjE9D5YQog==",
+					"version": "8.0.3",
+					"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-8.0.3.tgz",
+					"integrity": "sha512-UfJMcSJc+SEXEl9lH/VLHSZbThQyLpw1vLO1Lb+j4RWDvG3N2f7yj3PVQA3cmkTBNldJ9eFnM+xEXxHIXrYiJw==",
 					"dev": true
+				},
+				"postcss-safe-parser": {
+					"version": "6.0.0",
+					"resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz",
+					"integrity": "sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==",
+					"dev": true,
+					"requires": {}
 				}
 			}
 		},
@@ -7961,12 +7644,6 @@
 			"dev": true,
 			"requires": {}
 		},
-		"postcss-media-query-parser": {
-			"version": "0.2.3",
-			"resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz",
-			"integrity": "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==",
-			"dev": true
-		},
 		"postcss-resolve-nested-selector": {
 			"version": "0.1.1",
 			"resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz",
@@ -7974,16 +7651,16 @@
 			"dev": true
 		},
 		"postcss-safe-parser": {
-			"version": "6.0.0",
-			"resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz",
-			"integrity": "sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==",
+			"version": "7.0.0",
+			"resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-7.0.0.tgz",
+			"integrity": "sha512-ovehqRNVCpuFzbXoTb4qLtyzK3xn3t/CUBxOs8LsnQjQrShaB4lKiHoVqY8ANaC0hBMHq5QVWk77rwGklFUDrg==",
 			"dev": true,
 			"requires": {}
 		},
 		"postcss-selector-parser": {
-			"version": "6.0.13",
-			"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz",
-			"integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==",
+			"version": "6.1.1",
+			"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.1.tgz",
+			"integrity": "sha512-b4dlw/9V8A71rLIDsSwVmak9z2DuBUB7CA1/wSdelNEzqsjoSPeADTWNO09lpH49Diy3/JIZ2bSPB1dI3LJCHg==",
 			"dev": true,
 			"requires": {
 				"cssesc": "^3.0.0",
@@ -8014,12 +7691,6 @@
 			"integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
 			"dev": true
 		},
-		"quick-lru": {
-			"version": "5.1.1",
-			"resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz",
-			"integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==",
-			"dev": true
-		},
 		"rambda": {
 			"version": "7.5.0",
 			"resolved": "https://registry.npmjs.org/rambda/-/rambda-7.5.0.tgz",
@@ -8123,33 +7794,6 @@
 				"resolve": "^1.9.0"
 			}
 		},
-		"redent": {
-			"version": "4.0.0",
-			"resolved": "https://registry.npmjs.org/redent/-/redent-4.0.0.tgz",
-			"integrity": "sha512-tYkDkVVtYkSVhuQ4zBgfvciymHaeuel+zFKXShfDnFP5SyVEP7qo70Rf1jTOTCx3vGNAbnEi/xFkcfQVMIBWag==",
-			"dev": true,
-			"requires": {
-				"indent-string": "^5.0.0",
-				"strip-indent": "^4.0.0"
-			},
-			"dependencies": {
-				"indent-string": {
-					"version": "5.0.0",
-					"resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz",
-					"integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==",
-					"dev": true
-				},
-				"strip-indent": {
-					"version": "4.0.0",
-					"resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.0.0.tgz",
-					"integrity": "sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==",
-					"dev": true,
-					"requires": {
-						"min-indent": "^1.0.1"
-					}
-				}
-			}
-		},
 		"regexp-tree": {
 			"version": "0.1.27",
 			"resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.27.tgz",
@@ -8270,13 +7914,10 @@
 			"dev": true
 		},
 		"semver": {
-			"version": "7.5.4",
-			"resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
-			"integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
-			"dev": true,
-			"requires": {
-				"lru-cache": "^6.0.0"
-			}
+			"version": "7.6.3",
+			"resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
+			"integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
+			"dev": true
 		},
 		"shebang-command": {
 			"version": "2.0.0",
@@ -8323,9 +7964,9 @@
 			"dev": true
 		},
 		"source-map-js": {
-			"version": "1.0.2",
-			"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
-			"integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
+			"version": "1.2.0",
+			"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz",
+			"integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==",
 			"dev": true
 		},
 		"spdx-correct": {
@@ -8336,18 +7977,30 @@
 			"requires": {
 				"spdx-expression-parse": "^3.0.0",
 				"spdx-license-ids": "^3.0.0"
+			},
+			"dependencies": {
+				"spdx-expression-parse": {
+					"version": "3.0.1",
+					"resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
+					"integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
+					"dev": true,
+					"requires": {
+						"spdx-exceptions": "^2.1.0",
+						"spdx-license-ids": "^3.0.0"
+					}
+				}
 			}
 		},
 		"spdx-exceptions": {
-			"version": "2.3.0",
-			"resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz",
-			"integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==",
+			"version": "2.5.0",
+			"resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz",
+			"integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==",
 			"dev": true
 		},
 		"spdx-expression-parse": {
-			"version": "3.0.1",
-			"resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
-			"integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
+			"version": "4.0.0",
+			"resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-4.0.0.tgz",
+			"integrity": "sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==",
 			"dev": true,
 			"requires": {
 				"spdx-exceptions": "^2.1.0",
@@ -8355,9 +8008,9 @@
 			}
 		},
 		"spdx-license-ids": {
-			"version": "3.0.16",
-			"resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz",
-			"integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==",
+			"version": "3.0.18",
+			"resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.18.tgz",
+			"integrity": "sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ==",
 			"dev": true
 		},
 		"split2": {
@@ -8367,30 +8020,6 @@
 			"dev": true,
 			"requires": {
 				"through2": "~0.6.1"
-			},
-			"dependencies": {
-				"readable-stream": {
-					"version": "1.0.34",
-					"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
-					"integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==",
-					"dev": true,
-					"requires": {
-						"core-util-is": "~1.0.0",
-						"inherits": "~2.0.1",
-						"isarray": "0.0.1",
-						"string_decoder": "~0.10.x"
-					}
-				},
-				"through2": {
-					"version": "0.6.5",
-					"resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz",
-					"integrity": "sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg==",
-					"dev": true,
-					"requires": {
-						"readable-stream": ">=1.0.33-1 <1.1.0-0",
-						"xtend": ">=4.0.0 <4.1.0-0"
-					}
-				}
 			}
 		},
 		"sprintf-js": {
@@ -8399,6 +8028,12 @@
 			"integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==",
 			"dev": true
 		},
+		"stream-shift": {
+			"version": "1.0.3",
+			"resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz",
+			"integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==",
+			"dev": true
+		},
 		"string_decoder": {
 			"version": "0.10.31",
 			"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
@@ -8447,69 +8082,81 @@
 			"dev": true
 		},
 		"stylelint": {
-			"version": "15.11.0",
-			"resolved": "https://registry.npmjs.org/stylelint/-/stylelint-15.11.0.tgz",
-			"integrity": "sha512-78O4c6IswZ9TzpcIiQJIN49K3qNoXTM8zEJzhaTE/xRTCZswaovSEVIa/uwbOltZrk16X4jAxjaOhzz/hTm1Kw==",
+			"version": "16.7.0",
+			"resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.7.0.tgz",
+			"integrity": "sha512-Q1ATiXlz+wYr37a7TGsfvqYn2nSR3T/isw3IWlZQzFzCNoACHuGBb6xBplZXz56/uDRJHIygxjh7jbV/8isewA==",
 			"dev": true,
-			"peer": true,
 			"requires": {
-				"@csstools/css-parser-algorithms": "^2.3.1",
-				"@csstools/css-tokenizer": "^2.2.0",
-				"@csstools/media-query-list-parser": "^2.1.4",
-				"@csstools/selector-specificity": "^3.0.0",
+				"@csstools/css-parser-algorithms": "^2.7.1",
+				"@csstools/css-tokenizer": "^2.4.1",
+				"@csstools/media-query-list-parser": "^2.1.13",
+				"@csstools/selector-specificity": "^3.1.1",
+				"@dual-bundle/import-meta-resolve": "^4.1.0",
 				"balanced-match": "^2.0.0",
 				"colord": "^2.9.3",
-				"cosmiconfig": "^8.2.0",
-				"css-functions-list": "^3.2.1",
+				"cosmiconfig": "^9.0.0",
+				"css-functions-list": "^3.2.2",
 				"css-tree": "^2.3.1",
-				"debug": "^4.3.4",
-				"fast-glob": "^3.3.1",
+				"debug": "^4.3.5",
+				"fast-glob": "^3.3.2",
 				"fastest-levenshtein": "^1.0.16",
-				"file-entry-cache": "^7.0.0",
+				"file-entry-cache": "^9.0.0",
 				"global-modules": "^2.0.0",
 				"globby": "^11.1.0",
 				"globjoin": "^0.1.4",
 				"html-tags": "^3.3.1",
-				"ignore": "^5.2.4",
-				"import-lazy": "^4.0.0",
+				"ignore": "^5.3.1",
 				"imurmurhash": "^0.1.4",
 				"is-plain-object": "^5.0.0",
-				"known-css-properties": "^0.29.0",
+				"known-css-properties": "^0.34.0",
 				"mathml-tag-names": "^2.1.3",
-				"meow": "^10.1.5",
-				"micromatch": "^4.0.5",
+				"meow": "^13.2.0",
+				"micromatch": "^4.0.7",
 				"normalize-path": "^3.0.0",
-				"picocolors": "^1.0.0",
-				"postcss": "^8.4.28",
+				"picocolors": "^1.0.1",
+				"postcss": "^8.4.39",
 				"postcss-resolve-nested-selector": "^0.1.1",
-				"postcss-safe-parser": "^6.0.0",
-				"postcss-selector-parser": "^6.0.13",
+				"postcss-safe-parser": "^7.0.0",
+				"postcss-selector-parser": "^6.1.0",
 				"postcss-value-parser": "^4.2.0",
 				"resolve-from": "^5.0.0",
 				"string-width": "^4.2.3",
-				"strip-ansi": "^6.0.1",
-				"style-search": "^0.1.0",
+				"strip-ansi": "^7.1.0",
 				"supports-hyperlinks": "^3.0.0",
 				"svg-tags": "^1.0.0",
-				"table": "^6.8.1",
+				"table": "^6.8.2",
 				"write-file-atomic": "^5.0.1"
 			},
 			"dependencies": {
+				"ansi-regex": {
+					"version": "6.0.1",
+					"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
+					"integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
+					"dev": true
+				},
 				"balanced-match": {
 					"version": "2.0.0",
 					"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz",
 					"integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==",
-					"dev": true,
-					"peer": true
+					"dev": true
 				},
 				"file-entry-cache": {
-					"version": "7.0.2",
-					"resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-7.0.2.tgz",
-					"integrity": "sha512-TfW7/1iI4Cy7Y8L6iqNdZQVvdXn0f8B4QcIXmkIbtTIe/Okm/nSlHb4IwGzRVOd3WfSieCgvf5cMzEfySAIl0g==",
+					"version": "9.0.0",
+					"resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-9.0.0.tgz",
+					"integrity": "sha512-6MgEugi8p2tiUhqO7GnPsmbCCzj0YRCwwaTbpGRyKZesjRSzkqkAE9fPp7V2yMs5hwfgbQLgdvSSkGNg1s5Uvw==",
+					"dev": true,
+					"requires": {
+						"flat-cache": "^5.0.0"
+					}
+				},
+				"flat-cache": {
+					"version": "5.0.0",
+					"resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-5.0.0.tgz",
+					"integrity": "sha512-JrqFmyUl2PnPi1OvLyTVHnQvwQ0S+e6lGSwu8OkAZlSaNIZciTY2H/cOOROxsBA1m/LZNHDsqAgDZt6akWcjsQ==",
 					"dev": true,
-					"peer": true,
 					"requires": {
-						"flat-cache": "^3.2.0"
+						"flatted": "^3.3.1",
+						"keyv": "^4.5.4"
 					}
 				},
 				"global-modules": {
@@ -8517,7 +8164,6 @@
 					"resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz",
 					"integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==",
 					"dev": true,
-					"peer": true,
 					"requires": {
 						"global-prefix": "^3.0.0"
 					}
@@ -8527,7 +8173,6 @@
 					"resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz",
 					"integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==",
 					"dev": true,
-					"peer": true,
 					"requires": {
 						"ini": "^1.3.5",
 						"kind-of": "^6.0.2",
@@ -8538,22 +8183,28 @@
 					"version": "5.0.0",
 					"resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
 					"integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==",
-					"dev": true,
-					"peer": true
+					"dev": true
 				},
 				"resolve-from": {
 					"version": "5.0.0",
 					"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
 					"integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+					"dev": true
+				},
+				"strip-ansi": {
+					"version": "7.1.0",
+					"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+					"integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
 					"dev": true,
-					"peer": true
+					"requires": {
+						"ansi-regex": "^6.0.1"
+					}
 				},
 				"which": {
 					"version": "1.3.1",
 					"resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
 					"integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
 					"dev": true,
-					"peer": true,
 					"requires": {
 						"isexe": "^2.0.0"
 					}
@@ -8561,38 +8212,58 @@
 			}
 		},
 		"stylelint-config-recommended": {
-			"version": "13.0.0",
-			"resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-13.0.0.tgz",
-			"integrity": "sha512-EH+yRj6h3GAe/fRiyaoO2F9l9Tgg50AOFhaszyfov9v6ayXJ1IkSHwTxd7lB48FmOeSGDPLjatjO11fJpmarkQ==",
+			"version": "14.0.0",
+			"resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-14.0.0.tgz",
+			"integrity": "sha512-jSkx290CglS8StmrLp2TxAppIajzIBZKYm3IxT89Kg6fGlxbPiTiyH9PS5YUuVAFwaJLl1ikiXX0QWjI0jmgZQ==",
 			"dev": true,
 			"requires": {}
 		},
 		"stylelint-config-wikimedia": {
-			"version": "0.16.1",
-			"resolved": "https://registry.npmjs.org/stylelint-config-wikimedia/-/stylelint-config-wikimedia-0.16.1.tgz",
-			"integrity": "sha512-FDVUyDyCBap2o2HAeJqIobdVdSTur5HFX5FymoKrzfMIYWxIV/55lTpyL1PR71TfVMaroDXJrIftLFW9mXKFhQ==",
+			"version": "0.17.2",
+			"resolved": "https://registry.npmjs.org/stylelint-config-wikimedia/-/stylelint-config-wikimedia-0.17.2.tgz",
+			"integrity": "sha512-cc3PYhe1O/GTgsMOp+Ri3ru579YBbZ3Me0oU7xNb06n4iwyXYPz8qO5G4iQ13UH19UW2NIS8Tk0goPRrJ1RAfw==",
 			"dev": true,
 			"requires": {
-				"browserslist-config-wikimedia": "0.5.0",
-				"postcss-html": "1.5.0",
+				"@stylistic/stylelint-config": "1.0.1",
+				"@stylistic/stylelint-plugin": "2.0.0",
+				"browserslist-config-wikimedia": "0.7.0",
+				"postcss-html": "1.6.0",
 				"postcss-less": "6.0.0",
-				"stylelint": "15.10.1",
-				"stylelint-config-recommended": "13.0.0",
-				"stylelint-no-unsupported-browser-features": "6.1.0",
-				"stylelint-stylistic": "0.4.3"
+				"stylelint": "16.2.0",
+				"stylelint-config-recommended": "14.0.0",
+				"stylelint-no-unsupported-browser-features": "8.0.1"
 			},
 			"dependencies": {
+				"ansi-regex": {
+					"version": "6.0.1",
+					"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
+					"integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
+					"dev": true
+				},
 				"balanced-match": {
 					"version": "2.0.0",
 					"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz",
 					"integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==",
 					"dev": true
 				},
-				"browserslist-config-wikimedia": {
-					"version": "0.5.0",
-					"resolved": "https://registry.npmjs.org/browserslist-config-wikimedia/-/browserslist-config-wikimedia-0.5.0.tgz",
-					"integrity": "sha512-t+tvSnTeVhVF2lNRxoAlE51/ZCfUs5SNNZUnWu2N8xXOGMPTMyKk5l4mayvDdm+5L8oqmnALU+TjnN2Z+ZTCTw==",
-					"dev": true
+				"file-entry-cache": {
+					"version": "8.0.0",
+					"resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz",
+					"integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==",
+					"dev": true,
+					"requires": {
+						"flat-cache": "^4.0.0"
+					}
+				},
+				"flat-cache": {
+					"version": "4.0.1",
+					"resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz",
+					"integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==",
+					"dev": true,
+					"requires": {
+						"flatted": "^3.2.9",
+						"keyv": "^4.5.4"
+					}
 				},
 				"global-modules": {
 					"version": "2.0.0",
@@ -8621,9 +8292,9 @@
 					"dev": true
 				},
 				"known-css-properties": {
-					"version": "0.27.0",
-					"resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.27.0.tgz",
-					"integrity": "sha512-uMCj6+hZYDoffuvAJjFAPz56E9uoowFHmTkqRtRq5WyC5Q6Cu/fTZKNQpX/RbzChBYLLl3lo8CjFZBAZXq9qFg==",
+					"version": "0.29.0",
+					"resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.29.0.tgz",
+					"integrity": "sha512-Ne7wqW7/9Cz54PDt4I3tcV+hAyat8ypyOGzYRJQfdxnnjeWsTxt1cy8pjvvKeI5kfXuyvULyeeAvwvvtAX3ayQ==",
 					"dev": true
 				},
 				"resolve-from": {
@@ -8632,48 +8303,55 @@
 					"integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
 					"dev": true
 				},
+				"strip-ansi": {
+					"version": "7.1.0",
+					"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+					"integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+					"dev": true,
+					"requires": {
+						"ansi-regex": "^6.0.1"
+					}
+				},
 				"stylelint": {
-					"version": "15.10.1",
-					"resolved": "https://registry.npmjs.org/stylelint/-/stylelint-15.10.1.tgz",
-					"integrity": "sha512-CYkzYrCFfA/gnOR+u9kJ1PpzwG10WLVnoxHDuBA/JiwGqdM9+yx9+ou6SE/y9YHtfv1mcLo06fdadHTOx4gBZQ==",
+					"version": "16.2.0",
+					"resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.2.0.tgz",
+					"integrity": "sha512-gwqU5AkIb52wrAzzn+359S3NIJDMl02TXLUaV2tzA/L6jUdpTwNt+MCxHlc8+Hb2bUHlYVo92YeSIryF2gJthA==",
 					"dev": true,
 					"requires": {
-						"@csstools/css-parser-algorithms": "^2.3.0",
-						"@csstools/css-tokenizer": "^2.1.1",
-						"@csstools/media-query-list-parser": "^2.1.2",
-						"@csstools/selector-specificity": "^3.0.0",
+						"@csstools/css-parser-algorithms": "^2.5.0",
+						"@csstools/css-tokenizer": "^2.2.3",
+						"@csstools/media-query-list-parser": "^2.1.7",
+						"@csstools/selector-specificity": "^3.0.1",
 						"balanced-match": "^2.0.0",
 						"colord": "^2.9.3",
-						"cosmiconfig": "^8.2.0",
-						"css-functions-list": "^3.1.0",
+						"cosmiconfig": "^9.0.0",
+						"css-functions-list": "^3.2.1",
 						"css-tree": "^2.3.1",
 						"debug": "^4.3.4",
-						"fast-glob": "^3.3.0",
+						"fast-glob": "^3.3.2",
 						"fastest-levenshtein": "^1.0.16",
-						"file-entry-cache": "^6.0.1",
+						"file-entry-cache": "^8.0.0",
 						"global-modules": "^2.0.0",
 						"globby": "^11.1.0",
 						"globjoin": "^0.1.4",
 						"html-tags": "^3.3.1",
-						"ignore": "^5.2.4",
-						"import-lazy": "^4.0.0",
+						"ignore": "^5.3.0",
 						"imurmurhash": "^0.1.4",
 						"is-plain-object": "^5.0.0",
-						"known-css-properties": "^0.27.0",
+						"known-css-properties": "^0.29.0",
 						"mathml-tag-names": "^2.1.3",
-						"meow": "^10.1.5",
+						"meow": "^13.1.0",
 						"micromatch": "^4.0.5",
 						"normalize-path": "^3.0.0",
 						"picocolors": "^1.0.0",
-						"postcss": "^8.4.24",
+						"postcss": "^8.4.33",
 						"postcss-resolve-nested-selector": "^0.1.1",
-						"postcss-safe-parser": "^6.0.0",
-						"postcss-selector-parser": "^6.0.13",
+						"postcss-safe-parser": "^7.0.0",
+						"postcss-selector-parser": "^6.0.15",
 						"postcss-value-parser": "^4.2.0",
 						"resolve-from": "^5.0.0",
 						"string-width": "^4.2.3",
-						"strip-ansi": "^6.0.1",
-						"style-search": "^0.1.0",
+						"strip-ansi": "^7.1.0",
 						"supports-hyperlinks": "^3.0.0",
 						"svg-tags": "^1.0.0",
 						"table": "^6.8.1",
@@ -8692,35 +8370,13 @@
 			}
 		},
 		"stylelint-no-unsupported-browser-features": {
-			"version": "6.1.0",
-			"resolved": "https://registry.npmjs.org/stylelint-no-unsupported-browser-features/-/stylelint-no-unsupported-browser-features-6.1.0.tgz",
-			"integrity": "sha512-3Taj+z9PjIiY6cz4hg3eN8Khue3kMm9lPXYuEvdjAFXDK20uQo2NocJaWN6anIKclYlwrpkBAS9W/KV3qPTWsw==",
-			"dev": true,
-			"requires": {
-				"doiuse": "^4.4.1",
-				"lodash": "^4.17.15",
-				"postcss": "^8.4.16"
-			}
-		},
-		"stylelint-stylistic": {
-			"version": "0.4.3",
-			"resolved": "https://registry.npmjs.org/stylelint-stylistic/-/stylelint-stylistic-0.4.3.tgz",
-			"integrity": "sha512-WphmneK3MRrm5ixvRPWy7+c9+EQUh0FPvNMXW/N9VD85vyqtpxUejpD+mxubVVht0fRgidcqBxtW3s3tU2Ujhw==",
+			"version": "8.0.1",
+			"resolved": "https://registry.npmjs.org/stylelint-no-unsupported-browser-features/-/stylelint-no-unsupported-browser-features-8.0.1.tgz",
+			"integrity": "sha512-tc8Xn5DaqJhxTmbA4H8gZbYdAz027NfuSZv5+cVieQb7BtBrF/1/iKYdpcGwXPl3GtqkQrisiXuGqKkKnzWcLw==",
 			"dev": true,
 			"requires": {
-				"is-plain-object": "^5.0.0",
-				"postcss": "^8.4.21",
-				"postcss-media-query-parser": "^0.2.3",
-				"postcss-value-parser": "^4.2.0",
-				"style-search": "^0.1.0"
-			},
-			"dependencies": {
-				"is-plain-object": {
-					"version": "5.0.0",
-					"resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
-					"integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==",
-					"dev": true
-				}
+				"doiuse": "^6.0.2",
+				"postcss": "^8.4.32"
 			}
 		},
 		"supports-color": {
@@ -8755,9 +8411,9 @@
 			"dev": true
 		},
 		"table": {
-			"version": "6.8.1",
-			"resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz",
-			"integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==",
+			"version": "6.8.2",
+			"resolved": "https://registry.npmjs.org/table/-/table-6.8.2.tgz",
+			"integrity": "sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==",
 			"dev": true,
 			"requires": {
 				"ajv": "^8.0.1",
@@ -8768,15 +8424,15 @@
 			},
 			"dependencies": {
 				"ajv": {
-					"version": "8.12.0",
-					"resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz",
-					"integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==",
+					"version": "8.17.1",
+					"resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
+					"integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
 					"dev": true,
 					"requires": {
-						"fast-deep-equal": "^3.1.1",
+						"fast-deep-equal": "^3.1.3",
+						"fast-uri": "^3.0.1",
 						"json-schema-traverse": "^1.0.0",
-						"require-from-string": "^2.0.2",
-						"uri-js": "^4.2.2"
+						"require-from-string": "^2.0.2"
 					}
 				},
 				"json-schema-traverse": {
@@ -8787,6 +8443,12 @@
 				}
 			}
 		},
+		"tapable": {
+			"version": "2.2.1",
+			"resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
+			"integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==",
+			"dev": true
+		},
 		"text-table": {
 			"version": "0.2.0",
 			"resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
@@ -8794,32 +8456,25 @@
 			"dev": true
 		},
 		"through2": {
-			"version": "4.0.2",
-			"resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz",
-			"integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==",
+			"version": "0.6.5",
+			"resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz",
+			"integrity": "sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg==",
 			"dev": true,
 			"requires": {
-				"readable-stream": "3"
+				"readable-stream": ">=1.0.33-1 <1.1.0-0",
+				"xtend": ">=4.0.0 <4.1.0-0"
 			},
 			"dependencies": {
 				"readable-stream": {
-					"version": "3.6.2",
-					"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
-					"integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
-					"dev": true,
-					"requires": {
-						"inherits": "^2.0.3",
-						"string_decoder": "^1.1.1",
-						"util-deprecate": "^1.0.1"
-					}
-				},
-				"string_decoder": {
-					"version": "1.3.0",
-					"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
-					"integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+					"version": "1.0.34",
+					"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
+					"integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==",
 					"dev": true,
 					"requires": {
-						"safe-buffer": "~5.2.0"
+						"core-util-is": "~1.0.0",
+						"inherits": "~2.0.1",
+						"isarray": "0.0.1",
+						"string_decoder": "~0.10.x"
 					}
 				}
 			}
@@ -8833,26 +8488,12 @@
 				"is-number": "^7.0.0"
 			}
 		},
-		"trim-newlines": {
-			"version": "4.1.1",
-			"resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-4.1.1.tgz",
-			"integrity": "sha512-jRKj0n0jXWo6kh62nA5TEh3+4igKDXLvzBJcPpiizP7oOolUrYIxmVBG9TOtHYFHoddUk6YvAkGeGoSVTXfQXQ==",
-			"dev": true
-		},
-		"tslib": {
-			"version": "1.14.1",
-			"resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
-			"integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
-			"dev": true
-		},
-		"tsutils": {
-			"version": "3.21.0",
-			"resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz",
-			"integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==",
+		"ts-api-utils": {
+			"version": "1.3.0",
+			"resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz",
+			"integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==",
 			"dev": true,
-			"requires": {
-				"tslib": "^1.8.1"
-			}
+			"requires": {}
 		},
 		"type-check": {
 			"version": "0.4.0",
@@ -8870,9 +8511,9 @@
 			"dev": true
 		},
 		"typescript": {
-			"version": "5.3.3",
-			"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz",
-			"integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==",
+			"version": "5.5.4",
+			"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz",
+			"integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==",
 			"dev": true,
 			"peer": true
 		},
@@ -8899,13 +8540,13 @@
 			"dev": true
 		},
 		"update-browserslist-db": {
-			"version": "1.0.13",
-			"resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz",
-			"integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==",
+			"version": "1.1.0",
+			"resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz",
+			"integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==",
 			"dev": true,
 			"requires": {
-				"escalade": "^3.1.1",
-				"picocolors": "^1.0.0"
+				"escalade": "^3.1.2",
+				"picocolors": "^1.0.1"
 			}
 		},
 		"uri-js": {
@@ -8940,12 +8581,24 @@
 			"requires": {
 				"spdx-correct": "^3.0.0",
 				"spdx-expression-parse": "^3.0.0"
+			},
+			"dependencies": {
+				"spdx-expression-parse": {
+					"version": "3.0.1",
+					"resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
+					"integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
+					"dev": true,
+					"requires": {
+						"spdx-exceptions": "^2.1.0",
+						"spdx-license-ids": "^3.0.0"
+					}
+				}
 			}
 		},
 		"vue-eslint-parser": {
-			"version": "9.3.2",
-			"resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.3.2.tgz",
-			"integrity": "sha512-q7tWyCVaV9f8iQyIA5Mkj/S6AoJ9KBN8IeUSf3XEmBrOtxOZnfTg5s4KClbZBCK3GtnT/+RyCLZyDHuZwTuBjg==",
+			"version": "9.4.3",
+			"resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.4.3.tgz",
+			"integrity": "sha512-2rYRLWlIpaiN8xbPiDyXZXRgLGOtWxERV7ND5fFAv5qo1D2N9Fu9MNajBNc6o13lZ+24DAWCkQCvj4klgmcITg==",
 			"dev": true,
 			"requires": {
 				"debug": "^4.3.4",
@@ -9011,22 +8664,16 @@
 			"integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
 			"dev": true
 		},
-		"yallist": {
-			"version": "4.0.0",
-			"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
-			"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
-			"dev": true
-		},
 		"yaml": {
-			"version": "2.3.4",
-			"resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz",
-			"integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==",
+			"version": "2.4.5",
+			"resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.5.tgz",
+			"integrity": "sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg==",
 			"dev": true
 		},
 		"yaml-eslint-parser": {
-			"version": "1.2.2",
-			"resolved": "https://registry.npmjs.org/yaml-eslint-parser/-/yaml-eslint-parser-1.2.2.tgz",
-			"integrity": "sha512-pEwzfsKbTrB8G3xc/sN7aw1v6A6c/pKxLAkjclnAyo5g5qOh6eL9WGu0o3cSDQZKrTNk4KL4lQSwZW+nBkANEg==",
+			"version": "1.2.3",
+			"resolved": "https://registry.npmjs.org/yaml-eslint-parser/-/yaml-eslint-parser-1.2.3.tgz",
+			"integrity": "sha512-4wZWvE398hCP7O8n3nXKu/vdq1HcH01ixYlCREaJL5NUMwQ0g3MaGFUBNSlmBtKmhbtVG/Cm6lyYmSVTEVil8A==",
 			"dev": true,
 			"requires": {
 				"eslint-visitor-keys": "^3.0.0",
@@ -9035,24 +8682,24 @@
 			}
 		},
 		"yargs": {
-			"version": "16.2.0",
-			"resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
-			"integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
+			"version": "17.7.2",
+			"resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
+			"integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
 			"dev": true,
 			"requires": {
-				"cliui": "^7.0.2",
+				"cliui": "^8.0.1",
 				"escalade": "^3.1.1",
 				"get-caller-file": "^2.0.5",
 				"require-directory": "^2.1.1",
-				"string-width": "^4.2.0",
+				"string-width": "^4.2.3",
 				"y18n": "^5.0.5",
-				"yargs-parser": "^20.2.2"
+				"yargs-parser": "^21.1.1"
 			}
 		},
 		"yargs-parser": {
-			"version": "20.2.9",
-			"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
-			"integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
+			"version": "21.1.1",
+			"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
+			"integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
 			"dev": true
 		},
 		"yocto-queue": {
diff --git a/package.json b/package.json
index 8815f3b..38d3bd4 100644
--- a/package.json
+++ b/package.json
@@ -5,11 +5,11 @@
 		"test": "grunt test"
 	},
 	"devDependencies": {
-		"eslint-config-wikimedia": "0.26.0",
+		"eslint-config-wikimedia": "0.28.2",
 		"grunt": "1.6.1",
-		"grunt-banana-checker": "0.11.1",
+		"grunt-banana-checker": "0.13.0",
 		"grunt-eslint": "24.3.0",
-		"grunt-stylelint": "0.19.0",
-		"stylelint-config-wikimedia": "0.16.1"
+		"grunt-stylelint": "0.20.1",
+		"stylelint-config-wikimedia": "0.17.2"
 	}
 }
diff --git a/resources/VersionCheck.js b/resources/VersionCheck.js
index 06d625f..a337266 100644
--- a/resources/VersionCheck.js
+++ b/resources/VersionCheck.js
@@ -18,7 +18,7 @@
  * @author thomas-topway-it <support@topway.it>
  * @copyright Copyright © 2021-2023, https://wikisphere.org
  */
-$( function () {
+$( () => {
 	if (
 		!mw.config.get( 'visualdata-show-notice-outdated-version' ) ||
 		mw.cookie.get( 'visualdata-check-latest-version' )
@@ -27,12 +27,12 @@ $( function () {
 	}
 
 	// display every 3 days
-	mw.loader.using( 'mediawiki.api', function () {
+	mw.loader.using( 'mediawiki.api', () => {
 		new mw.Api()
 			.postWithToken( 'csrf', {
 				action: 'visualdata-check-latest-version'
 			} )
-			.done( function ( res ) {
+			.done( ( res ) => {
 				if ( 'visualdata-check-latest-version' in res ) {
 					if ( res[ 'visualdata-check-latest-version' ].result === 2 ) {
 						var messageWidget = new OO.ui.MessageWidget( {
diff --git a/resources/VisualData.js b/resources/VisualData.js
index 196c94d..b81c428 100644
--- a/resources/VisualData.js
+++ b/resources/VisualData.js
@@ -41,7 +41,7 @@ VisualData = ( function () {
 			};
 			new mw.Api()
 				.postWithToken( 'csrf', payload )
-				.done( function ( res ) {
+				.done( ( res ) => {
 					if ( payload.action in res ) {
 						var data = res[ payload.action ];
 						for ( var i in data ) {
@@ -53,7 +53,7 @@ VisualData = ( function () {
 						reject();
 					}
 				} )
-				.fail( function ( res ) {
+				.fail( ( res ) => {
 					// eslint-disable-next-line no-console
 					console.error( 'visualdata-load-data error', res );
 					reject( res );
@@ -74,7 +74,7 @@ VisualData = ( function () {
 		return new Promise( ( resolve, reject ) => {
 			new mw.Api()
 				.postWithToken( 'csrf', payload )
-				.done( function ( res ) {
+				.done( ( res ) => {
 					if ( payload.action in res ) {
 						var thisSchemas = JSON.parse( res[ payload.action ].schemas );
 						for ( var i in thisSchemas ) {
@@ -86,7 +86,7 @@ VisualData = ( function () {
 						}
 					}
 				} )
-				.fail( function ( res ) {
+				.fail( ( res ) => {
 					// eslint-disable-next-line no-console
 					console.error( 'visualdata-get-schemas', res );
 					reject( res );
@@ -107,7 +107,7 @@ VisualData = ( function () {
 
 		switch ( action ) {
 			case 'update':
-				Schemas = jQuery.extend( Schemas, data.schemas );
+				Schemas = Object.assign( Schemas, data.schemas );
 				break;
 
 			case 'delete':
@@ -117,13 +117,13 @@ VisualData = ( function () {
 				break;
 
 			case 'create':
-				Schemas = jQuery.extend( Schemas, data.schemas );
+				Schemas = Object.assign( Schemas, data.schemas );
 				Schemas = VisualDataFunctions.sortObjectByKeys( Schemas );
 				break;
 
 			case 'rename':
 				delete Schemas[ data[ 'previous-label' ] ];
-				Schemas = jQuery.extend( Schemas, data.schemas );
+				Schemas = Object.assign( Schemas, data.schemas );
 				Schemas = VisualDataFunctions.sortObjectByKeys( Schemas );
 				break;
 		}
diff --git a/resources/VisualDataContentBlock.js b/resources/VisualDataContentBlock.js
index 09c4f26..16ebe19 100644
--- a/resources/VisualDataContentBlock.js
+++ b/resources/VisualDataContentBlock.js
@@ -97,9 +97,7 @@ const VisualDataContentBlock = function ( phpConfig, windowManager ) {
 			} )
 		);
 
-		items = items.filter( function ( x ) {
-			return !( 'items' in x ) || x.items.length;
-		} );
+		items = items.filter( ( x ) => !( 'items' in x ) || x.items.length );
 
 		this.isEmpty = !items.length;
 
@@ -185,11 +183,11 @@ const VisualDataContentBlock = function ( phpConfig, windowManager ) {
 
 				VisualDataFunctions.renameObjectKey( ParentObj, CurrentKey, objName );
 
-				ParentObj[ objName ] = $.extend( ParentObj[ objName ], { wiki: obj } );
+				ParentObj[ objName ] = Object.assign( ParentObj[ objName ], { wiki: obj } );
 
 				Callback();
 
-				return new OO.ui.Process( function () {
+				return new OO.ui.Process( () => {
 					dialog.close( { action: action } );
 				} );
 		}
@@ -200,7 +198,7 @@ const VisualDataContentBlock = function ( phpConfig, windowManager ) {
 	ProcessDialog.prototype.getTeardownProcess = function ( data ) {
 		return ProcessDialog.super.prototype.getTeardownProcess
 			.call( this, data )
-			.first( function () {
+			.first( () => {
 				WindowManager.removeActiveWindow();
 			}, this );
 	};
diff --git a/resources/VisualDataDatatables.js b/resources/VisualDataDatatables.js
index 302b635..5e30678 100644
--- a/resources/VisualDataDatatables.js
+++ b/resources/VisualDataDatatables.js
@@ -39,7 +39,7 @@ const VisualDataDatatables = function () {
 	};
 };
 
-$( function () {
+$( () => {
 	var visualdataDatatables = new VisualDataDatatables();
 
 	$( '.visualdata.datatable' ).each( function () {
diff --git a/resources/VisualDataFormField.js b/resources/VisualDataFormField.js
index 85fc035..d98989c 100644
--- a/resources/VisualDataFormField.js
+++ b/resources/VisualDataFormField.js
@@ -91,8 +91,7 @@ const VisualDataFormField = function ( phpConfig, windowManager, schemas ) {
 		// remove options inputs and lookup widgets
 		// except multiselect
 		return ret.filter(
-			( x ) =>
-				( VisualDataFunctions.lookupInputs.indexOf( x ) === -1 &&
+			( x ) => ( VisualDataFunctions.lookupInputs.indexOf( x ) === -1 &&
 					VisualDataFunctions.optionsInputs.indexOf( x ) === -1 ) ||
 				VisualDataFunctions.isMultiselect( x )
 		);
@@ -248,7 +247,7 @@ const VisualDataFormField = function ( phpConfig, windowManager, schemas ) {
 			return false;
 		}
 
-		selectOptionsFrom.on( 'change', function ( value ) {
+		selectOptionsFrom.on( 'change', ( value ) => {
 			fieldOptionsValues.toggle( value === 'options-values' );
 			fieldWikilist.toggle( value === 'options-wikilist' );
 			fieldOptionsLabelFormula.toggle( value !== 'options-askquery' );
@@ -308,7 +307,7 @@ const VisualDataFormField = function ( phpConfig, windowManager, schemas ) {
 		layout.toggle( visibleItems );
 
 		// eslint-disable-next-line no-unused-vars
-		availableInputsInput.on( 'change', function ( value ) {
+		availableInputsInput.on( 'change', ( value ) => {
 			onSelectAvailableInputs();
 		} );
 
@@ -480,12 +479,12 @@ const VisualDataFormField = function ( phpConfig, windowManager, schemas ) {
 		layout.toggle( visibleItems );
 
 		// eslint-disable-next-line no-unused-vars
-		availableInputsInput.on( 'change', function ( value ) {
+		availableInputsInput.on( 'change', ( value ) => {
 			onSelectAvailableInputs();
 		} );
 
 		// eslint-disable-next-line no-unused-vars
-		selectOptionsFrom.on( 'change', function ( value ) {
+		selectOptionsFrom.on( 'change', ( value ) => {
 			onSelectAvailableInputs();
 		} );
 
@@ -567,10 +566,8 @@ const VisualDataFormField = function ( phpConfig, windowManager, schemas ) {
 
 		// ------------------ show-if -----------------
 
-		var otherFields = Object.keys( ParentObj ).filter( ( x ) => {
-			return ( x !== CurrentKey && ParentObj[ x ].wiki.type === 'property' &&
-				ParentObj[ x ].wiki[ 'multiple-items' ] === false );
-		} );
+		var otherFields = Object.keys( ParentObj ).filter( ( x ) => ( x !== CurrentKey && ParentObj[ x ].wiki.type === 'property' &&
+				ParentObj[ x ].wiki[ 'multiple-items' ] === false ) );
 
 		var showifFieldInput = new OO.ui.DropdownInputWidget( {
 			options: VisualDataFunctions.createDropDownOptions( otherFields, { key: 'value' } ),
@@ -598,7 +595,7 @@ const VisualDataFormField = function ( phpConfig, windowManager, schemas ) {
 			value: getPropertyValue( 'showif-value' )
 		} );
 
-		showifConditionInput.on( 'change', function ( value ) {
+		showifConditionInput.on( 'change', ( value ) => {
 			showifValueInput.toggle( value !== '!null' );
 			updateModelShowif( getPropertyValue( 'visibility' ) === 'condition' );
 		} );
@@ -730,7 +727,7 @@ const VisualDataFormField = function ( phpConfig, windowManager, schemas ) {
 			} );
 
 			// eslint-disable-next-line no-unused-vars
-			SMWpropertiesInput.on( 'change', function ( value ) {
+			SMWpropertiesInput.on( 'change', ( value ) => {
 				redrawAvailableInputs();
 			} );
 
@@ -805,7 +802,7 @@ const VisualDataFormField = function ( phpConfig, windowManager, schemas ) {
 		} );
 
 		// eslint-disable-next-line no-unused-vars
-		jsonSchemaFormatInput.on( 'change', function ( value ) {
+		jsonSchemaFormatInput.on( 'change', ( value ) => {
 			redrawAvailableInputs();
 		} );
 
@@ -822,7 +819,7 @@ const VisualDataFormField = function ( phpConfig, windowManager, schemas ) {
 
 		items.push( fieldjsonSchemaFormatInput );
 
-		jsonSchemaInput.on( 'change', function ( value ) {
+		jsonSchemaInput.on( 'change', ( value ) => {
 			switch ( value ) {
 				case 'string':
 					fieldjsonSchemaFormatInput.toggle( true );
@@ -845,7 +842,7 @@ const VisualDataFormField = function ( phpConfig, windowManager, schemas ) {
 		);
 
 		if ( Config.SMW ) {
-			propertyModelInput.on( 'change', function ( value ) {
+			propertyModelInput.on( 'change', ( value ) => {
 				switch ( value ) {
 					case 'smw-property':
 						fieldSMWpropertiesInput.toggle( true );
@@ -916,7 +913,7 @@ const VisualDataFormField = function ( phpConfig, windowManager, schemas ) {
 			value: availableInputsValue
 		} );
 
-		availableInputsInput.on( 'change', function ( value ) {
+		availableInputsInput.on( 'change', ( value ) => {
 			var thisDefaultValueInput = getDefaultValueInput();
 
 			// eslint-disable-next-line no-use-before-define
@@ -943,7 +940,7 @@ const VisualDataFormField = function ( phpConfig, windowManager, schemas ) {
 			defaultInputConfig
 		);
 
-		inputConfigButton.on( 'click', function () {
+		inputConfigButton.on( 'click', () => {
 			var dataType = null;
 			if ( Config.SMW ) {
 				var SMWproperty = getPropertyValue( 'SMW-property' );
@@ -987,7 +984,7 @@ const VisualDataFormField = function ( phpConfig, windowManager, schemas ) {
 			align: 'top'
 		} );
 
-		multipleItemsInput.on( 'change', function ( value ) {
+		multipleItemsInput.on( 'change', ( value ) => {
 			redrawAvailableInputs();
 			layoutParentSchema.toggle( value );
 			fieldRequiredInput.toggle( !value );
@@ -1125,7 +1122,7 @@ const VisualDataFormField = function ( phpConfig, windowManager, schemas ) {
 			updateModelShowif( value === 'condition' );
 		}
 
-		visibilityInput.on( 'change', function ( value ) {
+		visibilityInput.on( 'change', ( value ) => {
 			onVisibilityInputChange( value );
 		} );
 
@@ -1164,15 +1161,13 @@ const VisualDataFormField = function ( phpConfig, windowManager, schemas ) {
 			Model.default = thisDefaultValueInput;
 		}
 
-		items = items.filter( function ( x ) {
-			return !( 'items' in x ) || x.items.length;
-		} );
+		items = items.filter( ( x ) => !( 'items' in x ) || x.items.length );
 
 		this.isEmpty = !items.length;
 
 		this.fieldset.addItems( items );
 
-		setTimeout( function () {
+		setTimeout( () => {
 			VisualDataFunctions.removeNbspFromLayoutHeader(
 				'#visualdata-processDialogEditField'
 			);
@@ -1302,7 +1297,7 @@ const VisualDataFormField = function ( phpConfig, windowManager, schemas ) {
 
 				Callback();
 
-				return new OO.ui.Process( function () {
+				return new OO.ui.Process( () => {
 					dialog.close( { action: action } );
 				} );
 		}
@@ -1313,7 +1308,7 @@ const VisualDataFormField = function ( phpConfig, windowManager, schemas ) {
 	ProcessDialog.prototype.getTeardownProcess = function ( data ) {
 		return ProcessDialog.super.prototype.getTeardownProcess
 			.call( this, data )
-			.first( function () {
+			.first( () => {
 				WindowManager.removeActiveWindow();
 			}, this );
 	};
diff --git a/resources/VisualDataForms.js b/resources/VisualDataForms.js
index 7456234..102e297 100644
--- a/resources/VisualDataForms.js
+++ b/resources/VisualDataForms.js
@@ -22,8 +22,6 @@
 /* eslint-disable no-tabs */
 /* eslint-disable no-unused-vars */
 /* eslint-disable no-underscore-dangle */
-/* eslint-disable es-x/no-async-functions */
-/* eslint-disable compat/compat */
 
 const VisualDataForms = function ( Config, Form, FormID, Schemas, WindowManager ) {
 	var Model = {};
@@ -67,7 +65,7 @@ const VisualDataForms = function ( Config, Form, FormID, Schemas, WindowManager
 	// @FIXME destroy/reinitialize on tab change
 	function showVisualEditor() {
 		function timeOut( i ) {
-			setTimeout( function () {
+			setTimeout( () => {
 				if (
 					InputWidgets[ i ] &&
 					InputWidgets[ i ].$element.parent().is( ':visible' )
@@ -121,7 +119,7 @@ const VisualDataForms = function ( Config, Form, FormID, Schemas, WindowManager
 					}
 				}
 
-				mw.loader.using( 'ext.VisualData.Maptiler', function () {
+				mw.loader.using( 'ext.VisualData.Maptiler', () => {
 					var visualDataMaptiler = new VisualDataMaptiler();
 					visualDataMaptiler.initialize( obj.element, obj.data );
 				} );
@@ -250,7 +248,7 @@ const VisualDataForms = function ( Config, Form, FormID, Schemas, WindowManager
 			SchemasLayout.setTabPanel( schemaName );
 
 			if ( init ) {
-				SchemasLayout.on( 'set', function () {
+				SchemasLayout.on( 'set', () => {
 					onTabSelect( SchemasLayout.getCurrentTabPanelName() );
 				} );
 			}
@@ -260,7 +258,7 @@ const VisualDataForms = function ( Config, Form, FormID, Schemas, WindowManager
 			SchemasLayout.setPage( schemaName );
 
 			if ( init ) {
-				SchemasLayout.on( 'set', function () {
+				SchemasLayout.on( 'set', () => {
 					onTabSelect( SchemasLayout.getCurrentPageName() );
 				} );
 			}
@@ -277,7 +275,7 @@ const VisualDataForms = function ( Config, Form, FormID, Schemas, WindowManager
 
 		// create deep copy, otherwise changes are
 		// copied to Forms[ form ].properties[ property ][ 'input-config' ]
-		var inputConfig = $.extend(
+		var inputConfig = Object.assign(
 			{}, // *** important !! cast to object
 			VisualDataFunctions.deepCopy( field[ 'input-config' ] ),
 			{ value: config.data, required: required }
@@ -493,7 +491,7 @@ const VisualDataForms = function ( Config, Form, FormID, Schemas, WindowManager
 			var askQuery = field[ 'options-askquery' ];
 			var regExp = new RegExp( '<' + sourceModel.pathNoIndex + '>' );
 			if ( regExp.test( askQuery ) ) {
-				ProcessModel.getModel( 'schema', sourceModel.schemaName ).then( function ( res ) {
+				ProcessModel.getModel( 'schema', sourceModel.schemaName ).then( ( res ) => {
 					for ( var i in res.flatten ) {
 
 						if ( res.flatten[ i ].pathNoIndex === sourceModel.pathNoIndex ) {
@@ -567,14 +565,14 @@ const VisualDataForms = function ( Config, Form, FormID, Schemas, WindowManager
 			return new Promise( ( resolve, reject ) => {
 				new mw.Api()
 					.postWithToken( 'csrf', payload )
-					.done( function ( thisRes ) {
+					.done( ( thisRes ) => {
 						if ( payload.action in thisRes ) {
 							var thisData = thisRes[ payload.action ];
 							thisData = JSON.parse( thisData.result );
 							resolve( thisData );
 						}
 					} )
-					.fail( function ( thisRes ) {
+					.fail( ( thisRes ) => {
 						// eslint-disable-next-line no-console
 						console.error( 'visualdata-askquery', thisRes );
 						reject( thisRes );
@@ -633,7 +631,7 @@ const VisualDataForms = function ( Config, Form, FormID, Schemas, WindowManager
 
 		OO.ui.mixin.GroupWidget.call(
 			this,
-			$.extend(
+			Object.assign(
 				{
 					$group: this.$element
 				},
@@ -736,7 +734,7 @@ const VisualDataForms = function ( Config, Form, FormID, Schemas, WindowManager
 		// Mixin constructors
 		OO.ui.mixin.GroupElement.call(
 			this,
-			$.extend(
+			Object.assign(
 				{
 					$group: this.$element
 				},
@@ -760,12 +758,12 @@ const VisualDataForms = function ( Config, Form, FormID, Schemas, WindowManager
 
 		var inputWidget = getInputWidget( config );
 
-		inputWidget.on( 'change', function () {
+		inputWidget.on( 'change', () => {
 			updateFieldsVisibility( config.model );
 			clearDependentFields( config.model.pathNoIndex );
 		} );
 
-		inputWidget.$element.find( 'input' ).on( 'blur', function () {
+		inputWidget.$element.find( 'input' ).on( 'blur', () => {
 			updateFieldsVisibility( config.model );
 			updateDependentFields( config.model );
 		} );
@@ -847,7 +845,7 @@ const VisualDataForms = function ( Config, Form, FormID, Schemas, WindowManager
 				fileUploadGroupWidget.removeItems( [ item ] );
 			};
 
-			restoreButton.on( 'click', function () {
+			restoreButton.on( 'click', () => {
 				inputWidget.toggle( false );
 				restoreButton.toggle( false );
 				fileUploadGroupWidget.removeItems( [ fileItemWidget ] );
@@ -861,12 +859,12 @@ const VisualDataForms = function ( Config, Form, FormID, Schemas, WindowManager
 
 			// @FIXME move to FileItemWidget
 
-			this.on( 'fileUploaded', function ( file ) {
+			this.on( 'fileUploaded', ( file ) => {
 				// eslint-disable-next-line no-console
 				console.log( 'event fileUploaded', file );
 			} );
 
-			this.on( 'fileUploadInit', function ( file ) {
+			this.on( 'fileUploadInit', ( file ) => {
 				// eslint-disable-next-line no-console
 				console.log( 'event fileUploadInit', file );
 				restoreButton.toggle( false );
@@ -875,20 +873,20 @@ const VisualDataForms = function ( Config, Form, FormID, Schemas, WindowManager
 
 			this.on(
 				'fileUploadProgress',
-				function ( file, progress, estimatedRemainingTime ) {
+				( file, progress, estimatedRemainingTime ) => {
 					loadedFiles[ file.name ].progress( progress, estimatedRemainingTime );
 				}
 			);
 
-			this.on( 'fileUploadComplete', function ( file, res ) {
+			this.on( 'fileUploadComplete', ( file, res ) => {
 				loadedFiles[ file.name ].uploadComplete( file, res );
 			} );
 
-			this.on( 'fileUploadErrorMessage', function ( file, errorMessage ) {
+			this.on( 'fileUploadErrorMessage', ( file, errorMessage ) => {
 				loadedFiles[ file.name ].errorMessage( errorMessage );
 			} );
 
-			this.on( 'fileUploadFail', function ( file, res ) {
+			this.on( 'fileUploadFail', ( file, res ) => {
 				loadedFiles[ file.name ].fail( res );
 			} );
 
@@ -967,7 +965,7 @@ const VisualDataForms = function ( Config, Form, FormID, Schemas, WindowManager
 		var searchWidgetResults = searchWidget.getResults();
 		searchWidgetResults.multiselect = true;
 
-		searchWidgetResults.on( 'press', function ( value ) {
+		searchWidgetResults.on( 'press', ( value ) => {
 			if ( value === null ) {
 				return;
 			}
@@ -1046,7 +1044,7 @@ const VisualDataForms = function ( Config, Form, FormID, Schemas, WindowManager
 			// });
 		}
 
-		return new OO.ui.Process( function () {
+		return new OO.ui.Process( () => {
 			dialog.close( { action: action } );
 		} );
 
@@ -1055,7 +1053,7 @@ const VisualDataForms = function ( Config, Form, FormID, Schemas, WindowManager
 	ProcessDialogSearch.prototype.getTeardownProcess = function ( data ) {
 		return ProcessDialogSearch.super.prototype.getTeardownProcess
 			.call( this, data )
-			.first( function () {
+			.first( () => {
 				WindowManager.removeActiveWindow();
 			}, this );
 	};
@@ -1318,7 +1316,7 @@ const VisualDataForms = function ( Config, Form, FormID, Schemas, WindowManager
 
 		OO.ui.mixin.GroupWidget.call(
 			this,
-			$.extend( { $group: this.$element }, config )
+			Object.assign( { $group: this.$element }, config )
 		);
 		// OO.EventEmitter.call( this );
 
@@ -1373,7 +1371,7 @@ const VisualDataForms = function ( Config, Form, FormID, Schemas, WindowManager
 					flags: [ 'destructive' ]
 				} );
 
-				deleteButton.on( 'click', function () {
+				deleteButton.on( 'click', () => {
 					Form.schemas.splice( Form.schemas.indexOf( data.schema.wiki.name ), 1 );
 					// delete Form.jsonData.schemas[ data.schema.wiki.name ];
 					delete ModelSchemas[ data.schema.wiki.name ];
@@ -1394,7 +1392,7 @@ const VisualDataForms = function ( Config, Form, FormID, Schemas, WindowManager
 					// classes: ["VisualDataOptionsListDeleteButton"],
 				} );
 
-				editButton.on( 'click', function () {
+				editButton.on( 'click', () => {
 					VisualDataSchemas.openSchemaDialog(
 						[ data.schema.wiki.name ],
 						'properties'
@@ -1531,11 +1529,11 @@ const VisualDataForms = function ( Config, Form, FormID, Schemas, WindowManager
 
 	GroupWidget.prototype.formLoaded = function () {
 	//	if ( this.data.root === true ) {
-		setTimeout( function () {
+		setTimeout( () => {
 			VisualDataFunctions.removeNbspFromLayoutHeader( 'form' );
 		}, 30 );
 
-		setTimeout( function () {
+		setTimeout( () => {
 			VisualDataFunctions.removeNbspFromLayoutHeader(
 				'#visualdataform-wrapper-dialog-' + FormID
 			);
@@ -1656,7 +1654,7 @@ const VisualDataForms = function ( Config, Form, FormID, Schemas, WindowManager
 		function getFreeTextInput( wikitext, thisConfig ) {
 			var thisInputWidget;
 
-			thisConfig = $.extend(
+			thisConfig = Object.assign(
 				{
 					name: `${ FormID }-model-freetext`,
 					id: `${ FormID }-model-freetext`
@@ -1666,7 +1664,7 @@ const VisualDataForms = function ( Config, Form, FormID, Schemas, WindowManager
 
 			if ( !wikitext || !Config.VEForAll ) {
 				thisInputWidget = new OO.ui.MultilineTextInputWidget(
-					$.extend(
+					Object.assign(
 						{
 							autosize: true,
 							rows: 6
@@ -1861,7 +1859,7 @@ const VisualDataForms = function ( Config, Form, FormID, Schemas, WindowManager
 
 					Model[ 'target-slot' ] = targetSlotInput;
 
-					targetSlotInput.on( 'change', function ( value ) {
+					targetSlotInput.on( 'change', ( value ) => {
 						if ( freeTextField ) {
 							freeTextField.toggle( value !== 'main' );
 						}
@@ -1931,7 +1929,7 @@ const VisualDataForms = function ( Config, Form, FormID, Schemas, WindowManager
 						value: Config.contentModel
 					} );
 
-					contentModelInput.on( 'change', async function ( value ) {
+					contentModelInput.on( 'change', async ( value ) => {
 						if ( !( 'freetext' in Model ) ) {
 							return;
 						}
@@ -1998,7 +1996,7 @@ const VisualDataForms = function ( Config, Form, FormID, Schemas, WindowManager
 
 		OO.ui.mixin.GroupWidget.call(
 			this,
-			$.extend(
+			Object.assign(
 				{
 					$group: this.$element
 				},
@@ -2066,7 +2064,7 @@ const VisualDataForms = function ( Config, Form, FormID, Schemas, WindowManager
 			// flags: ["destructive"],
 			// classes: ["VisualDataOptionsListDeleteButton"],
 		} );
-		deleteButton.on( 'click', function () {
+		deleteButton.on( 'click', () => {
 			if (
 				!( 'minItems' in self.schema ) ||
 				self.items.length > self.schema.minItems
@@ -2239,7 +2237,7 @@ const VisualDataForms = function ( Config, Form, FormID, Schemas, WindowManager
 			icon: 'add'
 		} );
 
-		addOption.on( 'click', function () {
+		addOption.on( 'click', () => {
 			if (
 				!( 'maxItems' in schema ) ||
 				self.optionsList.items.length < schema.maxItems
@@ -2612,9 +2610,7 @@ const VisualDataForms = function ( Config, Form, FormID, Schemas, WindowManager
 
 		// for some reason appending the method
 		// halts the execution combined with mw.loader
-		categories = categories.filter( function onlyUnique( value, index, self ) {
-			return self.indexOf( value ) === index;
-		} );
+		categories = categories.filter( ( value, index, self ) => self.indexOf( value ) === index );
 
 		// create title and free text input
 		if ( !userDefined && !editFreeText && !editCategories && !editContentModel ) {
@@ -2651,8 +2647,8 @@ const VisualDataForms = function ( Config, Form, FormID, Schemas, WindowManager
 	}
 
 	function updatePanels() {
-		ProcessModel.getModel( 'fetch' ).then( function ( res ) {
-			Form.jsonData.schemas = $.extend( Form.jsonData.schemas, res );
+		ProcessModel.getModel( 'fetch' ).then( ( res ) => {
+			Form.jsonData.schemas = Object.assign( Form.jsonData.schemas, res );
 
 			removeSchemasPanel();
 
@@ -2753,7 +2749,7 @@ const VisualDataForms = function ( Config, Form, FormID, Schemas, WindowManager
 			action = !hasMultiplePanels() ? 'validate&submit' : 'submit';
 		}
 
-		ProcessModel.getModel( action ).then( async function ( res ) {
+		ProcessModel.getModel( action ).then( async ( res ) => {
 			if ( typeof res === 'boolean' && res === false ) {
 				return;
 			}
@@ -2871,7 +2867,7 @@ const VisualDataForms = function ( Config, Form, FormID, Schemas, WindowManager
 		var self = this;
 		return ProcessDialog.super.prototype.getActionProcess
 			.call( this, action )
-			.next( function () {
+			.next( () => {
 				switch ( action ) {
 					case 'back':
 						var panels = PropertiesStack.getItems();
@@ -2887,7 +2883,7 @@ const VisualDataForms = function ( Config, Form, FormID, Schemas, WindowManager
 						);
 						break;
 					case 'validate':
-						ProcessModel.getModel( 'validate' ).then( function ( res ) {
+						ProcessModel.getModel( 'validate' ).then( ( res ) => {
 							if ( typeof res === 'boolean' ) {
 								return;
 							}
@@ -2903,7 +2899,7 @@ const VisualDataForms = function ( Config, Form, FormID, Schemas, WindowManager
 					case 'validate&submit':
 					case 'submit':
 					case 'delete':
-						return ProcessModel.getModel( action ).then( function ( res ) {
+						return ProcessModel.getModel( action ).then( ( res ) => {
 							if ( action.indexOf( 'submit' ) !== 1 && typeof res === 'boolean' ) {
 								return;
 							}
@@ -2916,7 +2912,7 @@ const VisualDataForms = function ( Config, Form, FormID, Schemas, WindowManager
 							return new Promise( ( resolve, reject ) => {
 								new mw.Api()
 									.postWithToken( 'csrf', payload )
-									.done( function ( thisRes ) {
+									.done( ( thisRes ) => {
 										resolve();
 										if ( payload.action in thisRes ) {
 											var data = JSON.parse( thisRes[ payload.action ].result );
@@ -2939,7 +2935,7 @@ const VisualDataForms = function ( Config, Form, FormID, Schemas, WindowManager
 											}
 										}
 									} )
-									.fail( function ( thisRes ) {
+									.fail( ( thisRes ) => {
 										// eslint-disable-next-line no-console
 										console.error( 'visualdata-submit-form', res );
 										reject( thisRes );
@@ -2962,7 +2958,7 @@ const VisualDataForms = function ( Config, Form, FormID, Schemas, WindowManager
 	ProcessDialog.prototype.getTeardownProcess = function ( data ) {
 		return ProcessDialog.super.prototype.getTeardownProcess
 			.call( this, data )
-			.first( function () {
+			.first( () => {
 				WindowManager.removeActiveWindow();
 			}, this );
 	};
@@ -2979,7 +2975,7 @@ const VisualDataForms = function ( Config, Form, FormID, Schemas, WindowManager
 	};
 
 	function getFormAttributes( jsondata ) {
-		return $.extend(
+		return Object.assign(
 			{
 				formID: FormID,
 				config: Config
@@ -3084,7 +3080,7 @@ const VisualDataForms = function ( Config, Form, FormID, Schemas, WindowManager
 					flags: [ 'primary', 'progressive' ]
 				} );
 
-				editButton.on( 'click', function () {
+				editButton.on( 'click', () => {
 					initializePropertiesStack();
 
 					var thisClasses = [];
@@ -3118,7 +3114,7 @@ const VisualDataForms = function ( Config, Form, FormID, Schemas, WindowManager
 				widget = button;
 			}
 
-			button.on( 'click', function () {
+			button.on( 'click', () => {
 				var args = [ Form.options.value ];
 
 				if ( Form.options.schema !== '' && schemaHasData( Form.options.schema ) ) {
@@ -3147,7 +3143,7 @@ const VisualDataForms = function ( Config, Form, FormID, Schemas, WindowManager
 				label: Form.options.title
 			} );
 
-			popupButton.on( 'click', function () {
+			popupButton.on( 'click', () => {
 				initializePropertiesStack();
 
 				var thisClasses = [];
@@ -3215,8 +3211,8 @@ const VisualDataForms = function ( Config, Form, FormID, Schemas, WindowManager
 			// type: "submit",
 		} );
 
-		ValidateButton.on( 'click', function () {
-			ProcessModel.getModel( 'validate' ).then( function ( res ) {
+		ValidateButton.on( 'click', () => {
+			ProcessModel.getModel( 'validate' ).then( ( res ) => {
 				if ( typeof res === 'boolean' && res === false ) {
 					return;
 				}
@@ -3254,7 +3250,7 @@ const VisualDataForms = function ( Config, Form, FormID, Schemas, WindowManager
 			icon: 'arrowPrevious'
 		} );
 
-		GoBackButton.on( 'click', function () {
+		GoBackButton.on( 'click', () => {
 			var thisPanels = PropertiesStack.getItems();
 			PropertiesStack.setItem( thisPanels[ 0 ] );
 
@@ -3436,7 +3432,7 @@ const VisualDataForms = function ( Config, Form, FormID, Schemas, WindowManager
 	};
 };
 
-$( function () {
+$( () => {
 	var schemas = JSON.parse( mw.config.get( 'visualdata-schemas' ) );
 	// console.log("schemas", schemas);
 
@@ -3464,7 +3460,7 @@ $( function () {
 
 			var form = pageForms[ formID ];
 
-			form = $.extend(
+			form = Object.assign(
 				{
 					freetext: '',
 					jsonData: {},
@@ -3483,7 +3479,7 @@ $( function () {
 			}
 
 			if ( formID in submissionData ) {
-				form = $.extend(
+				form = Object.assign(
 					form,
 					submissionData[ formID ]
 				);
@@ -3514,7 +3510,7 @@ $( function () {
 		var MutationObserver = window.MutationObserver || window.WebKitMutationObserver;
 
 		if ( MutationObserver ) {
-			var observer = new MutationObserver( function ( mutations, thisObserver ) {
+			var observer = new MutationObserver( ( mutations, thisObserver ) => {
 				for ( var instance of instances ) {
 					instance.mutationChange();
 				}
@@ -3533,7 +3529,7 @@ $( function () {
 		VisualData.setVars( config, schemas, init() );
 
 	} else {
-		mw.loader.using( 'ext.VisualData.ManageSchemas', function () {
+		mw.loader.using( 'ext.VisualData.ManageSchemas', () => {
 			var instances = init();
 			VisualData.setVars( config, schemas, instances );
 			VisualDataSchemas.setVars(
diff --git a/resources/VisualDataFunctions.js b/resources/VisualDataFunctions.js
index 1129b81..57ecea6 100644
--- a/resources/VisualDataFunctions.js
+++ b/resources/VisualDataFunctions.js
@@ -437,7 +437,7 @@ VisualDataFunctions = ( function () {
 		var Input = function ( configInput ) {
 			Input.super.call(
 				this,
-				jQuery.extend( configInput, { indicator: 'required' } )
+				Object.assign( configInput, { indicator: 'required' } )
 			);
 			this.constructorName = constructor.name;
 		};
@@ -483,7 +483,7 @@ VisualDataFunctions = ( function () {
 		var ret = {};
 		Object.keys( object )
 			.sort()
-			.forEach( function ( key ) {
+			.forEach( ( key ) => {
 				ret[ key ] = object[ key ];
 			} );
 		return ret;
@@ -575,8 +575,8 @@ VisualDataFunctions = ( function () {
 	}
 
 	function createToolGroup( toolFactory, groupName, tools ) {
-		tools.forEach( function ( tool ) {
-			var obj = jQuery.extend( {}, tool );
+		tools.forEach( ( tool ) => {
+			var obj = Object.assign( {}, tool );
 			obj.group = groupName;
 			var config = tool.config ? tool.config : {};
 			delete obj.config;
@@ -666,7 +666,7 @@ VisualDataFunctions = ( function () {
 
 		// @TODO or return promise
 		return windowManager
-			.openWindow( 'message', $.extend( obj, options ) )
+			.openWindow( 'message', Object.assign( obj, options ) )
 			.closed.then( function ( action ) {
 				return action.action === 'accept' && callback ?
 					callback.apply( this, args ) :
@@ -722,7 +722,7 @@ VisualDataFunctions = ( function () {
 	}
 
 	function createDropDownOptions( obj, config ) {
-		var config = jQuery.extend( { key: 'key', value: 'value' }, config || {} );
+		var config = Object.assign( { key: 'key', value: 'value' }, config || {} );
 		var ret = [];
 		for ( var i in obj ) {
 			var label = config.value === 'value' ? obj[ i ] : i;
@@ -746,7 +746,7 @@ VisualDataFunctions = ( function () {
 					callback( resolve, reject );
 				} else {
 					if ( n <= maxAttempts ) {
-						setTimeout( function () {
+						setTimeout( () => {
 							init( ++n );
 						}, 50 );
 					} else if ( callbackMaxAttempts ) {
diff --git a/resources/VisualDataGeolocation.js b/resources/VisualDataGeolocation.js
index 280b8a1..a2051f5 100644
--- a/resources/VisualDataGeolocation.js
+++ b/resources/VisualDataGeolocation.js
@@ -275,7 +275,7 @@ const VisualDataGeolocation = function ( phpConfig, windowManager ) {
 				defaultMaptilerMapConfig
 			);
 
-			maptilerMapConfigButton.on( 'click', function () {
+			maptilerMapConfigButton.on( 'click', () => {
 				VisualDataInputConfigInst.openDialog(
 					Model[ 'maptiler-map-config' ],
 					'maptiler-map',
@@ -305,7 +305,7 @@ const VisualDataGeolocation = function ( phpConfig, windowManager ) {
 				defaultMaptilerGeocodingConfig
 			);
 
-			maptilerGeocodingConfigButton.on( 'click', function () {
+			maptilerGeocodingConfigButton.on( 'click', () => {
 				VisualDataInputConfigInst.openDialog(
 					Model[ 'maptiler-geocoding-config' ],
 					'maptiler-geocoding',
@@ -411,9 +411,7 @@ const VisualDataGeolocation = function ( phpConfig, windowManager ) {
 
 		items.push( longitudeInputHelpField );
 
-		items = items.filter( function ( x ) {
-			return !( 'items' in x ) || x.items.length;
-		} );
+		items = items.filter( ( x ) => !( 'items' in x ) || x.items.length );
 
 		this.isEmpty = !items.length;
 
@@ -537,11 +535,11 @@ const VisualDataGeolocation = function ( phpConfig, windowManager ) {
 
 				VisualDataFunctions.renameObjectKey( ParentObj, CurrentKey, objName );
 
-				ParentObj[ objName ] = $.extend( ParentObj[ objName ], { wiki: obj } );
+				ParentObj[ objName ] = Object.assign( ParentObj[ objName ], { wiki: obj } );
 
 				Callback();
 
-				return new OO.ui.Process( function () {
+				return new OO.ui.Process( () => {
 					dialog.close( { action: action } );
 				} );
 		}
@@ -552,7 +550,7 @@ const VisualDataGeolocation = function ( phpConfig, windowManager ) {
 	ProcessDialog.prototype.getTeardownProcess = function ( data ) {
 		return ProcessDialog.super.prototype.getTeardownProcess
 			.call( this, data )
-			.first( function () {
+			.first( () => {
 				WindowManager.removeActiveWindow();
 			}, this );
 	};
diff --git a/resources/VisualDataInputConfig.js b/resources/VisualDataInputConfig.js
index bd8bbce..a90316b 100644
--- a/resources/VisualDataInputConfig.js
+++ b/resources/VisualDataInputConfig.js
@@ -125,7 +125,7 @@ const VisualDataInputConfig = function ( phpConfig, windowManager ) {
 
 				switch ( inputName ) {
 					case 'mw.widgets.DateInputWidget':
-						return jQuery.extend( ret, {
+						return Object.assign( ret, {
 							precision: [ 'day/month', " Date precision to use, 'day' or 'month'" ],
 							inputFormat: [
 								'string',
@@ -152,7 +152,7 @@ const VisualDataInputConfig = function ( phpConfig, windowManager ) {
 						} );
 
 					case 'mw.widgets.TitleInputWidget':
-						return jQuery.extend( ret, {
+						return Object.assign( ret, {
 							limit: [ 'integer', 'Number of results to show' ],
 							namespace: [ 'integer', 'Namespace to prepend to queries' ],
 							maxLength: [ 'integer', 'Maximum query length' ],
@@ -191,7 +191,7 @@ const VisualDataInputConfig = function ( phpConfig, windowManager ) {
 						} );
 
 					case 'mw.widgets.UserInputWidget':
-						return jQuery.extend( ret, {
+						return Object.assign( ret, {
 							limit: [ 'integer', 'Number of results to show' ]
 						} );
 
@@ -401,25 +401,25 @@ const VisualDataInputConfig = function ( phpConfig, windowManager ) {
 				};
 				switch ( inputName ) {
 					case 'OO.ui.MenuTagMultiselectWidget':
-						return jQuery.extend( ret, {
+						return Object.assign( ret, {
 							clearInputOnChoose: [
 								'boolean',
 								'Clear the text input value when a menu option is chosen'
 							]
 						} );
 					case 'mw.widgets.CategoryMultiselectWidget':
-						return jQuery.extend( ret, {
+						return Object.assign( ret, {
 							limit: [ 'integer', 'Maximum number of results to load' ]
 						} );
 					case 'mw.widgets.TitlesMultiselectWidget':
-						return jQuery.extend( ret, {
+						return Object.assign( ret, {
 							clearInputOnChoose: [ 'boolean', 'clear input on choose' ],
 							inputPosition: [ 'string', 'input position' ],
 
 							allowEditTags: [ 'boolean', 'clear input on choose' ]
 						} );
 					case 'mw.widgets.UsersMultiselectWidget':
-						return jQuery.extend( ret, {
+						return Object.assign( ret, {
 							limit: [ 'integer', 'Number of results to show' ],
 							// name: [
 							// 	'string',
@@ -707,7 +707,7 @@ const VisualDataInputConfig = function ( phpConfig, windowManager ) {
 
 				switch ( inputName ) {
 					case 'mw.widgets.datetime.DateTimeInputWidget':
-						return jQuery.extend( ret, {
+						return Object.assign( ret, {
 							type: [ 'string', "Whether to act like a 'date'" ],
 							required: [ 'boolean', 'Whether a value is required' ],
 							clearable: [ 'boolean', 'Whether to provide for blanking the value.' ],
@@ -973,7 +973,7 @@ const VisualDataInputConfig = function ( phpConfig, windowManager ) {
 
 		// we don't rely anymore on searchWidgetResults.findSelectedItems()
 		// to handle non-visible highlighted items
-		searchWidgetResults.on( 'press', function ( value ) {
+		searchWidgetResults.on( 'press', ( value ) => {
 			if ( value === null ) {
 				return;
 			}
@@ -1034,7 +1034,7 @@ const VisualDataInputConfig = function ( phpConfig, windowManager ) {
 			panelLayout.populateFieldset();
 		}
 
-		return new OO.ui.Process( function () {
+		return new OO.ui.Process( () => {
 			dialog.close( { action: action } );
 		} );
 
@@ -1043,7 +1043,7 @@ const VisualDataInputConfig = function ( phpConfig, windowManager ) {
 	ProcessDialogSearch.prototype.getTeardownProcess = function ( data ) {
 		return ProcessDialogSearch.super.prototype.getTeardownProcess
 			.call( this, data )
-			.first( function () {
+			.first( () => {
 				WindowManager.removeActiveWindow();
 			}, this );
 	};
@@ -1143,9 +1143,7 @@ const VisualDataInputConfig = function ( phpConfig, windowManager ) {
 			);
 		}
 
-		items = items.filter( function ( x ) {
-			return !( 'items' in x ) || x.items.length;
-		} );
+		items = items.filter( ( x ) => !( 'items' in x ) || x.items.length );
 
 		this.isEmpty = !items.length;
 
@@ -1261,7 +1259,7 @@ const VisualDataInputConfig = function ( phpConfig, windowManager ) {
 				}
 
 				Callback.setValue( obj );
-				return new OO.ui.Process( function () {
+				return new OO.ui.Process( () => {
 					dialog.close( { action: action } );
 				} );
 		}
@@ -1272,7 +1270,7 @@ const VisualDataInputConfig = function ( phpConfig, windowManager ) {
 	ProcessDialog.prototype.getTeardownProcess = function ( data ) {
 		return ProcessDialog.super.prototype.getTeardownProcess
 			.call( this, data )
-			.first( function () {
+			.first( () => {
 				WindowManager.removeActiveWindow();
 			}, this );
 	};
diff --git a/resources/VisualDataProcessModel.js b/resources/VisualDataProcessModel.js
index 0b1b920..80e8aa5 100644
--- a/resources/VisualDataProcessModel.js
+++ b/resources/VisualDataProcessModel.js
@@ -19,7 +19,6 @@
  * @copyright Copyright © 2023, https://wikisphere.org
  */
 
-/* eslint-disable no-tabs */
 /* eslint-disable no-unused-vars */
 /* eslint-disable no-underscore-dangle */
 
@@ -128,10 +127,10 @@ const VisualDataProcessModel = function (
 				switch ( error.keyword ) {
 					case 'uniqueItems':
 						if ( Removed.indexOf( `${ VisualDataFunctions.escapeJsonPtr( schemaName ) }${ error.instancePath }/${ error.params.j }` ) === -1 ) {
-							AjvErrors.push( $.extend( VisualDataFunctions.deepCopy( error ), { instancePath: `${ error.instancePath }/${ error.params.i }` } ) );
+							AjvErrors.push( Object.assign( VisualDataFunctions.deepCopy( error ), { instancePath: `${ error.instancePath }/${ error.params.i }` } ) );
 						}
 						if ( Removed.indexOf( `${ VisualDataFunctions.escapeJsonPtr( schemaName ) }${ error.instancePath }/${ error.params.i }` ) === -1 ) {
-							AjvErrors.push( $.extend( VisualDataFunctions.deepCopy( error ), { instancePath: `${ error.instancePath }/${ error.params.j }` } ) );
+							AjvErrors.push( Object.assign( VisualDataFunctions.deepCopy( error ), { instancePath: `${ error.instancePath }/${ error.params.j }` } ) );
 						}
 						break;
 					default:
diff --git a/resources/VisualDataSchemas.js b/resources/VisualDataSchemas.js
index 39a0115..102bb6b 100644
--- a/resources/VisualDataSchemas.js
+++ b/resources/VisualDataSchemas.js
@@ -54,9 +54,7 @@ VisualDataSchemas = ( function () {
 			return ret;
 		}
 		return Object.keys( obj )
-			.map( ( i ) => {
-				return obj[ i ];
-			} )
+			.map( ( i ) => obj[ i ] )
 			.map( ( x ) => x.getValue() );
 	}
 
@@ -128,7 +126,7 @@ VisualDataSchemas = ( function () {
 		var datatable = $( '#' + getDatatableId( panel ) ).DataTable();
 		var ret = {};
 		// eslint-disable-next-line no-unused-vars, array-callback-return
-		datatable.rows().every( function ( rowIdx, tableLoop, rowLoop ) {
+		datatable.rows().every( ( rowIdx, tableLoop, rowLoop ) => {
 			var key = Object.keys( fields )[ rowIdx ];
 			if ( key in fields ) {
 				ret[ key ] = fields[ key ];
@@ -308,9 +306,7 @@ VisualDataSchemas = ( function () {
 			columns: [ '' ].concat(
 				mw.msg( 'visualdata-jsmodule-schemas-properties-columns' )
 					.split( /\s*,\s*/ )
-					.map( function ( x ) {
-						return { title: x };
-					} )
+					.map( ( x ) => ( { title: x } ) )
 			)
 		} );
 
@@ -343,7 +339,7 @@ VisualDataSchemas = ( function () {
 				initializeNestedDataTable( panel );
 			};
 
-			buttonWidgetEdit.on( 'click', function () {
+			buttonWidgetEdit.on( 'click', () => {
 				// switch by subschema type (if array)
 				switch ( thisItem.wiki.type ) {
 					case 'property':
@@ -380,13 +376,13 @@ VisualDataSchemas = ( function () {
 				flags: [ 'destructive' ]
 			} );
 
-			buttonWidgetDelete.on( 'click', function () {
+			buttonWidgetDelete.on( 'click', () => {
 				VisualDataFunctions.OOUIAlert(
 					new OO.ui.HtmlSnippet(
 						mw.msg( 'visualdata-jsmodule-schemas-delete-confirm' )
 					),
 					{ size: 'medium' },
-					function () {
+					() => {
 						delete currentItem[ propName ][ key ];
 						// *** or delete the row manually
 						initializeNestedDataTable( panel );
@@ -534,11 +530,11 @@ VisualDataSchemas = ( function () {
 				this.$body.append( booklet.$element );
 				booklet.setPage( data.initialTab );
 
-				booklet.on( 'set', function ( value ) {
+				booklet.on( 'set', ( value ) => {
 					initPropertiesTab( value.name );
 				} );
 
-				setTimeout( function () {
+				setTimeout( () => {
 					initPropertiesTab( data.initialTab );
 					VisualDataFunctions.removeNbspFromLayoutHeader(
 						'#visualdata-ProcessDialogEditData'
@@ -645,7 +641,7 @@ VisualDataSchemas = ( function () {
 						var callApi = function ( postData, resolve, reject ) {
 							new mw.Api()
 								.postWithToken( 'csrf', postData )
-								.done( function ( res ) {
+								.done( ( res ) => {
 									resolve();
 									if ( payload.action in res ) {
 										var data = res[ payload.action ];
@@ -669,7 +665,7 @@ VisualDataSchemas = ( function () {
 													{ size: 'medium' },
 													callApi,
 													[
-														$.extend( postData, {
+														Object.assign( postData, {
 															'confirm-job-execution': true
 														} ),
 														resolve,
@@ -701,7 +697,7 @@ VisualDataSchemas = ( function () {
 										} );
 									}
 								} )
-								.fail( function ( res ) {
+								.fail( ( res ) => {
 									// eslint-disable-next-line no-console
 									console.error( 'visualdata-save-schema', res );
 									reject( res );
@@ -709,7 +705,7 @@ VisualDataSchemas = ( function () {
 						};
 
 						return new Promise( ( resolve, reject ) => {
-							mw.loader.using( 'mediawiki.api', function () {
+							mw.loader.using( 'mediawiki.api', () => {
 								callApi( payload, resolve, reject );
 							} );
 						} ).catch( ( err ) => {
@@ -725,7 +721,7 @@ VisualDataSchemas = ( function () {
 	ProcessDialog.prototype.getTeardownProcess = function ( data ) {
 		return ProcessDialog.super.prototype.getTeardownProcess
 			.call( this, data )
-			.first( function () {
+			.first( () => {
 				Models.pop();
 				SelectedItems.pop();
 				WindowManager.removeActiveWindow();
@@ -814,7 +810,7 @@ VisualDataSchemas = ( function () {
 		] );
 		booklet.setPage( 'page1' );
 
-		booklet.on( 'set', function ( value ) {
+		booklet.on( 'set', ( value ) => {
 			if (
 				value.name !== 'page1' &&
 				!$.fn.DataTable.isDataTable( '#' + getDatatableId( value.name ) )
@@ -826,7 +822,7 @@ VisualDataSchemas = ( function () {
 
 		this.$body.append( booklet.$element );
 
-		setTimeout( function () {
+		setTimeout( () => {
 			VisualDataFunctions.removeNbspFromLayoutHeader(
 				'#visualdata-ProcessDialogEditProperties'
 			);
@@ -849,7 +845,7 @@ VisualDataSchemas = ( function () {
 		) {
 			if ( obj[ 'multiple-items' ] ) {
 				currentItem.wiki = parentSchema;
-				currentItem.items = $.extend( currentItem.items, { wiki: obj } );
+				currentItem.items = Object.assign( currentItem.items, { wiki: obj } );
 				return currentItem;
 			}
 
@@ -860,7 +856,7 @@ VisualDataSchemas = ( function () {
 		// move child to parent
 		if ( !obj[ 'multiple-items' ] ) {
 			// currentItem.type should be always array
-			return $.extend(
+			return Object.assign(
 				currentItem.type === 'array' ? currentItem.items : currentItem,
 				{ wiki: obj }
 			);
@@ -870,7 +866,7 @@ VisualDataSchemas = ( function () {
 		return {
 			type: 'array',
 			wiki: parentSchema,
-			items: $.extend( currentItem, { wiki: obj } )
+			items: Object.assign( currentItem, { wiki: obj } )
 		};
 	}
 
@@ -989,7 +985,7 @@ VisualDataSchemas = ( function () {
 				break;
 		}
 
-		return new OO.ui.Process( function () {
+		return new OO.ui.Process( () => {
 			dialog.close( { action: action } );
 		} );
 
@@ -1000,7 +996,7 @@ VisualDataSchemas = ( function () {
 		var self = this;
 		return ProcessDialogNested.super.prototype.getTeardownProcess
 			.call( this, data )
-			.first( function () {
+			.first( () => {
 				Models.pop();
 				SelectedItems.pop();
 				initializeNestedDataTable( self.data.propName );
@@ -1307,7 +1303,7 @@ VisualDataSchemas = ( function () {
 		layoutParentSchema.toggle( multipleItemsInputValue );
 		nameInput.setDisabled( multipleItemsInputValue );
 
-		multipleItemsInput.on( 'change', function ( enabled ) {
+		multipleItemsInput.on( 'change', ( enabled ) => {
 			layoutParentSchema.toggle( enabled );
 			nameInput.setDisabled( enabled );
 		} );
@@ -1398,7 +1394,7 @@ VisualDataSchemas = ( function () {
 			} );
 		} else {
 			SelectedItems.push(
-				jQuery.extend(
+				Object.assign(
 					{
 						properties: {},
 
@@ -1461,7 +1457,7 @@ VisualDataSchemas = ( function () {
 			VisualDataFunctions.OOUIAlert( new OO.ui.HtmlSnippet( mw.msg( 'visualdata-jsmodule-missing-json-diff-library' ) ), {
 				size: 'medium',
 				actions: [ OO.ui.MessageDialog.static.actions[ 0 ] ]
-			}, function () {
+			}, () => {
 				// 15 days
 				var timeLapse = 15 * 86400;
 				mw.cookie.set( 'visualdata-check-json-diff-library', true, {
@@ -1510,9 +1506,7 @@ VisualDataSchemas = ( function () {
 			columns: mw
 				.msg( 'visualdata-jsmodule-schemas-columns' )
 				.split( /\s*,\s*/ )
-				.map( function ( x ) {
-					return { title: x };
-				} )
+				.map( ( x ) => ( { title: x } ) )
 		} );
 
 		DataTable.on( 'click', 'tr', function () {
@@ -1526,7 +1520,7 @@ VisualDataSchemas = ( function () {
 
 	function openSchemaDialog( label, initialTab ) {
 		if ( !Object.keys( Schemas[ label ] ).length ) {
-			VisualData.loadSchemas( [ label ] ).then( function ( schemas ) {
+			VisualData.loadSchemas( [ label ] ).then( ( schemas ) => {
 				for ( var i in schemas ) {
 					Schemas[ i ] = schemas[ i ];
 				}
@@ -1738,7 +1732,7 @@ VisualDataSchemas = ( function () {
 	};
 }() );
 
-$( function () {
+$( () => {
 	var config = JSON.parse( mw.config.get( 'visualdata-config' ) );
 	// console.log("config", config);
 
diff --git a/resources/VisualDataUpload.js b/resources/VisualDataUpload.js
index a131aa0..b571f73 100644
--- a/resources/VisualDataUpload.js
+++ b/resources/VisualDataUpload.js
@@ -94,20 +94,20 @@
 		// this.upload.setFilename(  this.selectFileWidget.getValue().name );
 
 		this.upload.upload().then(
-			function ( res ) {
+			( res ) => {
 				deferred.resolve();
 				layout.parentWidget.emit( 'fileUploadComplete', file, res );
 			},
-			function () {
+			() => {
 				// These errors will be thrown while the user is on the info page.
-				layout.getErrorMessageForStateDetails().then( function ( errorMessage ) {
+				layout.getErrorMessageForStateDetails().then( ( errorMessage ) => {
 					// eslint-disable-next-line no-console
 					console.error( 'errorMessage', errorMessage );
 					deferred.reject( errorMessage );
 					layout.parentWidget.emit( 'fileUploadErrorMessage', file, errorMessage );
 				} );
 			},
-			function ( progress ) {
+			( progress ) => {
 				var elapsedTime = mw.now() - startTime,
 					estimatedTotalTime = ( 1 / progress ) * elapsedTime,
 					estimatedRemainingTime = moment.duration(
@@ -125,7 +125,7 @@
 		);
 
 		// cancel uploading
-		deferred.fail( function ( res ) {
+		deferred.fail( ( res ) => {
 			// layout.setPage( 'upload' );
 			layout.parentWidget.emit( 'fileUploadFail', file, res );
 		} );
@@ -174,7 +174,7 @@
 					)
 				);
 			} else if ( Array.isArray( warnings.duplicate ) ) {
-				warnings.duplicate.forEach( function ( filename ) {
+				warnings.duplicate.forEach( ( filename ) => {
 					var $a = $( '<a>' ).text( filename ),
 						href = mw.Title.makeTitle(
 							mw.config.get( 'wgNamespaceIds' ).file,
@@ -257,7 +257,7 @@
 		// Validation (if the SFW is for a stashed file, this never fires)
 		this.selectFileWidget.on( 'change', this.onUploadFormChange.bind( this ) );
 
-		this.selectFileWidget.on( 'change', function () {
+		this.selectFileWidget.on( 'change', () => {
 			layout.updateFilePreview();
 		} );
 
@@ -280,16 +280,16 @@
 		this.selectFileWidget
 			.loadAndGetImageUrl()
 			.done(
-				function ( url ) {
+				( url ) => {
 					this.filePreview.$element.find( 'p' ).remove();
 					this.filePreview.$element.css( 'background-image', 'url(' + url + ')' );
 					this.infoForm.$element.addClass(
 						'mw-upload-bookletLayout-hasThumbnail'
 					);
-				}.bind( this )
+				}
 			)
 			.fail(
-				function () {
+				() => {
 					this.filePreview.$element.find( 'p' ).remove();
 					if ( this.selectFileWidget.getValue() ) {
 						this.filePreview.$element.append(
@@ -300,7 +300,7 @@
 					this.infoForm.$element.removeClass(
 						'mw-upload-bookletLayout-hasThumbnail'
 					);
-				}.bind( this )
+				}
 			);
 	};
 
@@ -353,9 +353,9 @@
 
 		this.on(
 			'fileUploadProgress',
-			function ( progress ) {
+			( progress ) => {
 				this.progressBarWidget.setProgress( progress * 100 );
-			}.bind( this )
+			}
 		);
 
 		this.filenameWidget.on( 'change', this.onInfoFormChange.bind( this ) );
@@ -370,10 +370,10 @@
 			this.filenameWidget.getValidity(),
 			this.descriptionWidget.getValidity()
 		)
-			.done( function () {
+			.done( () => {
 				layout.emit( 'infoValid', true );
 			} )
-			.fail( function () {
+			.fail( () => {
 				layout.emit( 'infoValid', false );
 			} );
 	};
diff --git a/resources/VisualDataWindowManager.js b/resources/VisualDataWindowManager.js
index 9f4b647..aca33ee 100644
--- a/resources/VisualDataWindowManager.js
+++ b/resources/VisualDataWindowManager.js
@@ -20,7 +20,6 @@
  */
 
 // @see https://doc.wikimedia.org/oojs-ui/master/js/
-// eslint-disable-next-line no-unused-vars
 
 // eslint-disable-next-line no-implicit-globals
 VisualDataWindowManager = function () {
diff --git a/resources/Widgets/VisualDataButtonMultiselectWidget.js b/resources/Widgets/VisualDataButtonMultiselectWidget.js
index fe04060..72f557f 100644
--- a/resources/Widgets/VisualDataButtonMultiselectWidget.js
+++ b/resources/Widgets/VisualDataButtonMultiselectWidget.js
@@ -48,7 +48,7 @@
 				value: $.inArray( this.options[ i ], config.selected ) !== -1
 			} );
 
-			this.items[ i ].on( 'change', function () {
+			this.items[ i ].on( 'change', () => {
 				self.emit( 'change', self.getValue().join().trim() );
 			} );
 		}
diff --git a/resources/Widgets/VisualDataDropdownWidget.js b/resources/Widgets/VisualDataDropdownWidget.js
index 50f9133..962a738 100644
--- a/resources/Widgets/VisualDataDropdownWidget.js
+++ b/resources/Widgets/VisualDataDropdownWidget.js
@@ -46,7 +46,7 @@
 
 		this.select = select;
 
-		select.on( 'change', function () {
+		select.on( 'change', () => {
 			self.emit( 'change', self.getValue() );
 		} );
 
diff --git a/resources/Widgets/VisualDataMaptiler.js b/resources/Widgets/VisualDataMaptiler.js
index b2f043a..cc32c0f 100644
--- a/resources/Widgets/VisualDataMaptiler.js
+++ b/resources/Widgets/VisualDataMaptiler.js
@@ -44,7 +44,7 @@
 		var zoomInput = data.model.properties.zoom.input;
 		var mapId = 'visualdata-maptiler-map-' + data.path;
 
-		VisualDataFunctions.loadScripts( this.scripts, function ( e ) {
+		VisualDataFunctions.loadScripts( this.scripts, ( e ) => {
 			if ( $( '#' + jQuery.escapeSelector( mapId ) ).length ) {
 				return;
 			}
@@ -113,14 +113,14 @@
 
 			function onDragEnd() {
 				var lngLat = marker.getLngLat();
-				setTimeout( function () {
+				setTimeout( () => {
 					lngInput.setValue( lngLat.lng );
 					latInput.setValue( lngLat.lat );
 					zoomInput.setValue( map.getZoom() );
 				}, 100 );
 			}
 
-			map.on( 'load', function () {
+			map.on( 'load', () => {
 				if ( !marker ) {
 					marker = new maptilersdk.Marker( {
 						draggable: true
@@ -143,10 +143,10 @@
 			}
 
 			// update marker
-			data.model.properties.latitude.input.on( 'change', function ( value ) {
+			data.model.properties.latitude.input.on( 'change', ( value ) => {
 				marker.setLngLat( [ lngInput.getValue(), value ] );
 			} );
-			data.model.properties.longitude.input.on( 'change', function ( value ) {
+			data.model.properties.longitude.input.on( 'change', ( value ) => {
 				marker.setLngLat( [ value, latInput.getValue() ] );
 			} );
 
diff --git a/resources/Widgets/VisualDataMenuTagSearchMultiselect.js b/resources/Widgets/VisualDataMenuTagSearchMultiselect.js
index 7f1fd67..9669f3a 100644
--- a/resources/Widgets/VisualDataMenuTagSearchMultiselect.js
+++ b/resources/Widgets/VisualDataMenuTagSearchMultiselect.js
@@ -55,7 +55,7 @@
 		// Mixin constructors
 		OO.ui.mixin.PendingElement.call(
 			this,
-			$.extend( {}, config, { $pending: this.$handle } )
+			Object.assign( {}, config, { $pending: this.$handle } )
 		);
 
 		// Event handler to call the autocomplete methods
@@ -95,7 +95,7 @@
 		function () {
 			this.getMenu().clearItems();
 			this.getNewMenuItems( this.input.$input.val() ).then(
-				function ( items ) {
+				( items ) => {
 					var existingItems,
 						menu = this.getMenu();
 
@@ -105,9 +105,7 @@
 					}
 
 					// Array of strings of the data of OO.ui.MenuOptionsWidgets
-					existingItems = menu.getItems().map( function ( item ) {
-						return item.data;
-					} );
+					existingItems = menu.getItems().map( ( item ) => item.data );
 
 					// Remove if items' data already exists
 					for ( var i in items ) {
@@ -128,7 +126,7 @@
 					}
 
 					menu.addItems( ret ).toggle( true );
-				}.bind( this )
+				}
 			);
 		};
 
diff --git a/resources/Widgets/VisualDataTinyMCE.js b/resources/Widgets/VisualDataTinyMCE.js
index d30f373..e82c70e 100644
--- a/resources/Widgets/VisualDataTinyMCE.js
+++ b/resources/Widgets/VisualDataTinyMCE.js
@@ -19,7 +19,6 @@
  * @copyright Copyright © 2024, https://wikisphere.org
  */
 
-/* eslint-disable no-tabs */
 /* eslint-disable no-unused-vars */
 
 ( function () {
diff --git a/resources/Widgets/VisualDataVisualEditor.js b/resources/Widgets/VisualDataVisualEditor.js
index 780a786..99348d7 100644
--- a/resources/Widgets/VisualDataVisualEditor.js
+++ b/resources/Widgets/VisualDataVisualEditor.js
@@ -49,7 +49,7 @@
 		this.Editor = null;
 		this.initialized = false;
 
-		setTimeout( function () {
+		setTimeout( () => {
 			if ( self.$element.parent().is( ':visible' ) ) {
 				self.initialize();
 			}
@@ -68,7 +68,7 @@
 		var self = this;
 		self.initialized = true;
 
-		this.loadVEForAll().then( function () {
+		this.loadVEForAll().then( () => {
 			// if (!self.isHtml) {
 			// 	return;
 			// }
@@ -107,7 +107,7 @@
 			resolve();
 		};
 		var callbackMaxAttempts = function ( resolve, reject ) {
-			jQuery( document ).on( 'VEForAllLoaded', function ( e ) {
+			jQuery( document ).on( 'VEForAllLoaded', ( e ) => {
 				self.textarea.applyVisualEditor();
 				resolve();
 			} );
@@ -161,7 +161,7 @@
 		// }
 
 		return new Promise( ( resolve, reject ) => {
-			$.when( editor.updateContent() ).then( function () {
+			$.when( editor.updateContent() ).then( () => {
 				// @see ext.veforall.target.js
 				// *** sometimes convertToWikiText is not called
 				// based on focus
diff --git a/resources/Widgets/VisualDataintlTelInput.js b/resources/Widgets/VisualDataintlTelInput.js
index 699a8f1..7cf401a 100644
--- a/resources/Widgets/VisualDataintlTelInput.js
+++ b/resources/Widgets/VisualDataintlTelInput.js
@@ -52,7 +52,7 @@
 		// 	self.emit("change", self.config.value);
 		// });
 
-		input.on( 'blur', function () {
+		input.on( 'blur', () => {
 			self.formatNumber();
 		} );
 
@@ -67,20 +67,18 @@
 
 		self.iti = window.intlTelInput(
 			input.get( 0 ),
-			$.extend(
+			Object.assign(
 				{
 					utilsScript:
 						'https://cdn.jsdelivr.net/npm/intl-tel-input@18.3.3/build/js/utils.js',
 					initialCountry: 'auto',
 					geoIpLookup: function ( callback ) {
 						fetch( 'https://ipapi.co/json' )
-							.then( function ( res ) {
-								return res.json();
-							} )
-							.then( function ( data ) {
+							.then( ( res ) => res.json() )
+							.then( ( data ) => {
 								callback( data.country_code );
 							} )
-							.catch( function () {
+							.catch( () => {
 								callback( 'us' );
 							} );
 					}
-- 
2.39.2


--- end ---
Source code is licensed under the AGPL.