mediawiki/extensions/PageForms (master)

sourcepatches
From 60c9da590ea68df95b95ce4ef8746ac086fdaafb Mon Sep 17 00:00:00 2001
From: libraryupgrader <tools.libraryupgrader@tools.wmflabs.org>
Date: Sun, 7 Mar 2021 11:59:37 +0000
Subject: [PATCH] build: Updating eslint-config-wikimedia to 0.18.2

Change-Id: Ibaac8719890ac08100a98b370295912f262e66b0
---
 package-lock.json | 1006 ++++++++++++++++-----------------------------
 package.json      |    2 +-
 2 files changed, 360 insertions(+), 648 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 78306ac..c4b1159 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -3,32 +3,49 @@
 	"lockfileVersion": 1,
 	"dependencies": {
 		"@babel/code-frame": {
-			"version": "7.10.4",
-			"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz",
-			"integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==",
+			"version": "7.12.11",
+			"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz",
+			"integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==",
+			"dev": true,
 			"requires": {
 				"@babel/highlight": "^7.10.4"
 			}
 		},
 		"@babel/helper-validator-identifier": {
-			"version": "7.10.4",
-			"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz",
-			"integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw=="
+			"version": "7.12.11",
+			"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz",
+			"integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==",
+			"dev": true
 		},
 		"@babel/highlight": {
-			"version": "7.10.4",
-			"resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz",
-			"integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==",
+			"version": "7.13.8",
+			"resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.8.tgz",
+			"integrity": "sha512-4vrIhfJyfNf+lCtXC2ck1rKSzDwciqF7IWFhXXrSOUC2O5DrVp+w4c6ed4AllTxhTkUP5x2tYj41VaxdVMMRDw==",
+			"dev": true,
 			"requires": {
-				"@babel/helper-validator-identifier": "^7.10.4",
+				"@babel/helper-validator-identifier": "^7.12.11",
 				"chalk": "^2.0.0",
 				"js-tokens": "^4.0.0"
+			},
+			"dependencies": {
+				"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"
+					}
+				}
 			}
 		},
 		"@eslint/eslintrc": {
-			"version": "0.3.0",
-			"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.3.0.tgz",
-			"integrity": "sha512-1JTKgrOKAHVivSvOYw+sJOunkBjUOvjqWk1DPja7ZFhIS2mX/4EgTT8M7eTK9jrKhL/FvXXEbQwIs3pg1xp3dg==",
+			"version": "0.4.0",
+			"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.0.tgz",
+			"integrity": "sha512-2ZPCc+uNbjV5ERJr+aKSPRwZgKd2z11x0EgLvb1PURmUrn9QNRXFqje0Ldq454PfAVyaJYyrDvvIKSFP4NnBog==",
+			"dev": true,
 			"requires": {
 				"ajv": "^6.12.4",
 				"debug": "^4.1.1",
@@ -37,27 +54,8 @@
 				"ignore": "^4.0.6",
 				"import-fresh": "^3.2.1",
 				"js-yaml": "^3.13.1",
-				"lodash": "^4.17.20",
 				"minimatch": "^3.0.4",
 				"strip-json-comments": "^3.1.1"
-			},
-			"dependencies": {
-				"ajv": {
-					"version": "6.12.6",
-					"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
-					"integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
-					"requires": {
-						"fast-deep-equal": "^3.1.1",
-						"fast-json-stable-stringify": "^2.0.0",
-						"json-schema-traverse": "^0.4.1",
-						"uri-js": "^4.2.2"
-					}
-				},
-				"lodash": {
-					"version": "4.17.20",
-					"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz",
-					"integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA=="
-				}
 			}
 		},
 		"@mdn/browser-compat-data": {
@@ -84,18 +82,20 @@
 		"acorn": {
 			"version": "7.4.1",
 			"resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
-			"integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A=="
+			"integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
+			"dev": true
 		},
 		"acorn-jsx": {
-			"version": "5.2.0",
-			"resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz",
-			"integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==",
+			"version": "5.3.1",
+			"resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz",
+			"integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==",
 			"dev": true
 		},
 		"ajv": {
-			"version": "6.12.3",
-			"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz",
-			"integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==",
+			"version": "6.12.6",
+			"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+			"integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+			"dev": true,
 			"requires": {
 				"fast-deep-equal": "^3.1.1",
 				"fast-json-stable-stringify": "^2.0.0",
@@ -106,17 +106,20 @@
 		"ansi-colors": {
 			"version": "4.1.1",
 			"resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
-			"integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA=="
+			"integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==",
+			"dev": true
 		},
 		"ansi-regex": {
 			"version": "5.0.0",
 			"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
-			"integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg=="
+			"integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
+			"dev": true
 		},
 		"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"
 			}
@@ -125,6 +128,7 @@
 			"version": "1.0.10",
 			"resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
 			"integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+			"dev": true,
 			"requires": {
 				"sprintf-js": "~1.0.2"
 			},
@@ -132,7 +136,8 @@
 				"sprintf-js": {
 					"version": "1.0.3",
 					"resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
-					"integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw="
+					"integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
+					"dev": true
 				}
 			}
 		},
@@ -187,7 +192,8 @@
 		"astral-regex": {
 			"version": "2.0.0",
 			"resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
-			"integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ=="
+			"integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
+			"dev": true
 		},
 		"async": {
 			"version": "1.5.2",
@@ -204,7 +210,8 @@
 		"balanced-match": {
 			"version": "1.0.0",
 			"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
-			"integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
+			"integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+			"dev": true
 		},
 		"base": {
 			"version": "0.11.2",
@@ -265,6 +272,7 @@
 			"version": "1.1.11",
 			"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
 			"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+			"dev": true,
 			"requires": {
 				"balanced-match": "^1.0.0",
 				"concat-map": "0.0.1"
@@ -300,16 +308,16 @@
 			}
 		},
 		"browserslist": {
-			"version": "4.16.1",
-			"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.1.tgz",
-			"integrity": "sha512-UXhDrwqsNcpTYJBTZsbGATDxZbiVDsx6UjpmRUmtnP10pr8wAYr5LgFoEFw9ixriQH2mv/NX2SfGzE/o8GndLA==",
+			"version": "4.16.3",
+			"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.3.tgz",
+			"integrity": "sha512-vIyhWmIkULaq04Gt93txdh+j02yX/JzlyhLYbV3YQCn/zvES3JnY7TifHHvvr1w5hTDluNKMkV05cs4vy8Q7sw==",
 			"dev": true,
 			"requires": {
-				"caniuse-lite": "^1.0.30001173",
+				"caniuse-lite": "^1.0.30001181",
 				"colorette": "^1.2.1",
-				"electron-to-chromium": "^1.3.634",
+				"electron-to-chromium": "^1.3.649",
 				"escalade": "^3.1.1",
-				"node-releases": "^1.1.69"
+				"node-releases": "^1.1.70"
 			}
 		},
 		"cache-base": {
@@ -332,22 +340,64 @@
 		"callsites": {
 			"version": "3.1.0",
 			"resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
-			"integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="
+			"integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+			"dev": true
 		},
 		"caniuse-lite": {
-			"version": "1.0.30001181",
-			"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001181.tgz",
-			"integrity": "sha512-m5ul/ARCX50JB8BSNM+oiPmQrR5UmngaQ3QThTTp5HcIIQGP/nPBs82BYLE+tigzm3VW+F4BJIhUyaVtEweelQ==",
+			"version": "1.0.30001196",
+			"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001196.tgz",
+			"integrity": "sha512-CPvObjD3ovWrNBaXlAIGWmg2gQQuJ5YhuciUOjPRox6hIQttu8O+b51dx6VIpIY9ESd2d0Vac1RKpICdG4rGUg==",
 			"dev": true
 		},
 		"chalk": {
-			"version": "2.4.2",
-			"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
-			"integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+			"version": "4.1.0",
+			"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+			"integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+			"dev": true,
 			"requires": {
-				"ansi-styles": "^3.2.1",
-				"escape-string-regexp": "^1.0.5",
-				"supports-color": "^5.3.0"
+				"ansi-styles": "^4.1.0",
+				"supports-color": "^7.1.0"
+			},
+			"dependencies": {
+				"ansi-styles": {
+					"version": "4.3.0",
+					"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+					"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+					"dev": true,
+					"requires": {
+						"color-convert": "^2.0.1"
+					}
+				},
+				"color-convert": {
+					"version": "2.0.1",
+					"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+					"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+					"dev": true,
+					"requires": {
+						"color-name": "~1.1.4"
+					}
+				},
+				"color-name": {
+					"version": "1.1.4",
+					"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+					"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+					"dev": true
+				},
+				"has-flag": {
+					"version": "4.0.0",
+					"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+					"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+					"dev": true
+				},
+				"supports-color": {
+					"version": "7.2.0",
+					"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+					"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+					"dev": true,
+					"requires": {
+						"has-flag": "^4.0.0"
+					}
+				}
 			}
 		},
 		"class-utils": {
@@ -387,6 +437,7 @@
 			"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"
 			}
@@ -394,12 +445,13 @@
 		"color-name": {
 			"version": "1.1.3",
 			"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
-			"integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
+			"integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+			"dev": true
 		},
 		"colorette": {
-			"version": "1.2.1",
-			"resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.1.tgz",
-			"integrity": "sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw==",
+			"version": "1.2.2",
+			"resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz",
+			"integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==",
 			"dev": true
 		},
 		"colors": {
@@ -423,7 +475,8 @@
 		"concat-map": {
 			"version": "0.0.1",
 			"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
-			"integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
+			"integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+			"dev": true
 		},
 		"copy-descriptor": {
 			"version": "0.1.1",
@@ -432,15 +485,16 @@
 			"dev": true
 		},
 		"core-js": {
-			"version": "3.8.3",
-			"resolved": "https://registry.npmjs.org/core-js/-/core-js-3.8.3.tgz",
-			"integrity": "sha512-KPYXeVZYemC2TkNEkX/01I+7yd+nX3KddKwZ1Ww7SKWdI2wQprSgLmrTddT8nw92AjEklTsPBoSdQBhbI1bQ6Q==",
+			"version": "3.9.1",
+			"resolved": "https://registry.npmjs.org/core-js/-/core-js-3.9.1.tgz",
+			"integrity": "sha512-gSjRvzkxQc1zjM/5paAmL4idJBFzuJoo+jDjF1tStYFMV2ERfD02HhahhCGXUyHxQRG4yFKVSdO6g62eoRMcDg==",
 			"dev": true
 		},
 		"cross-spawn": {
 			"version": "7.0.3",
 			"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
 			"integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+			"dev": true,
 			"requires": {
 				"path-key": "^3.1.0",
 				"shebang-command": "^2.0.0",
@@ -451,6 +505,7 @@
 					"version": "2.0.2",
 					"resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
 					"integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+					"dev": true,
 					"requires": {
 						"isexe": "^2.0.0"
 					}
@@ -467,6 +522,7 @@
 			"version": "4.1.1",
 			"resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
 			"integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+			"dev": true,
 			"requires": {
 				"ms": "^2.1.1"
 			}
@@ -480,7 +536,8 @@
 		"deep-is": {
 			"version": "0.1.3",
 			"resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
-			"integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ="
+			"integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
+			"dev": true
 		},
 		"define-property": {
 			"version": "2.0.2",
@@ -533,25 +590,28 @@
 			"version": "3.0.0",
 			"resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
 			"integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+			"dev": true,
 			"requires": {
 				"esutils": "^2.0.2"
 			}
 		},
 		"electron-to-chromium": {
-			"version": "1.3.649",
-			"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.649.tgz",
-			"integrity": "sha512-ojGDupQ3UMkvPWcTICe4JYe17+o9OLiFMPoduoR72Zp2ILt1mRVeqnxBEd6s/ptekrnsFU+0A4lStfBe/wyG/A==",
+			"version": "1.3.682",
+			"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.682.tgz",
+			"integrity": "sha512-zok2y37qR00U14uM6qBz/3iIjWHom2eRfC2S1StA0RslP7x34jX+j4mxv80t8OEOHLJPVG54ZPeaFxEI7gPrwg==",
 			"dev": true
 		},
 		"emoji-regex": {
 			"version": "8.0.0",
 			"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
-			"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
+			"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+			"dev": true
 		},
 		"enquirer": {
 			"version": "2.3.6",
 			"resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz",
 			"integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==",
+			"dev": true,
 			"requires": {
 				"ansi-colors": "^4.1.1"
 			}
@@ -565,15 +625,17 @@
 		"escape-string-regexp": {
 			"version": "1.0.5",
 			"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
-			"integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
+			"integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+			"dev": true
 		},
 		"eslint": {
-			"version": "7.18.0",
-			"resolved": "https://registry.npmjs.org/eslint/-/eslint-7.18.0.tgz",
-			"integrity": "sha512-fbgTiE8BfUJZuBeq2Yi7J3RB3WGUQ9PNuNbmgi6jt9Iv8qrkxfy19Ds3OpL1Pm7zg3BtTVhvcUZbIRQ0wmSjAQ==",
+			"version": "7.21.0",
+			"resolved": "https://registry.npmjs.org/eslint/-/eslint-7.21.0.tgz",
+			"integrity": "sha512-W2aJbXpMNofUp0ztQaF40fveSsJBjlSCSWpy//gzfTvwC+USs/nceBrKmlJOiM8r1bLwP2EuYkCqArn/6QTIgg==",
+			"dev": true,
 			"requires": {
-				"@babel/code-frame": "^7.0.0",
-				"@eslint/eslintrc": "^0.3.0",
+				"@babel/code-frame": "7.12.11",
+				"@eslint/eslintrc": "^0.4.0",
 				"ajv": "^6.10.0",
 				"chalk": "^4.0.0",
 				"cross-spawn": "^7.0.2",
@@ -584,9 +646,9 @@
 				"eslint-utils": "^2.1.0",
 				"eslint-visitor-keys": "^2.0.0",
 				"espree": "^7.3.1",
-				"esquery": "^1.2.0",
+				"esquery": "^1.4.0",
 				"esutils": "^2.0.2",
-				"file-entry-cache": "^6.0.0",
+				"file-entry-cache": "^6.0.1",
 				"functional-red-black-tree": "^1.0.1",
 				"glob-parent": "^5.0.0",
 				"globals": "^12.1.0",
@@ -611,89 +673,24 @@
 				"v8-compile-cache": "^2.0.3"
 			},
 			"dependencies": {
-				"ansi-styles": {
-					"version": "4.3.0",
-					"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-					"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-					"requires": {
-						"color-convert": "^2.0.1"
-					}
-				},
-				"chalk": {
-					"version": "4.1.0",
-					"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
-					"integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
-					"requires": {
-						"ansi-styles": "^4.1.0",
-						"supports-color": "^7.1.0"
-					}
-				},
-				"color-convert": {
-					"version": "2.0.1",
-					"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-					"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-					"requires": {
-						"color-name": "~1.1.4"
-					}
-				},
-				"color-name": {
-					"version": "1.1.4",
-					"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-					"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
-				},
-				"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==",
-					"requires": {
-						"esrecurse": "^4.3.0",
-						"estraverse": "^4.1.1"
-					}
-				},
 				"eslint-visitor-keys": {
 					"version": "2.0.0",
 					"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz",
-					"integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ=="
-				},
-				"esrecurse": {
-					"version": "4.3.0",
-					"resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
-					"integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
-					"requires": {
-						"estraverse": "^5.2.0"
-					},
-					"dependencies": {
-						"estraverse": {
-							"version": "5.2.0",
-							"resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
-							"integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ=="
-						}
-					}
-				},
-				"has-flag": {
-					"version": "4.0.0",
-					"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-					"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+					"integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==",
+					"dev": true
 				},
 				"lodash": {
-					"version": "4.17.20",
-					"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz",
-					"integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA=="
-				},
-				"supports-color": {
-					"version": "7.2.0",
-					"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-					"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-					"requires": {
-						"has-flag": "^4.0.0"
-					}
+					"version": "4.17.21",
+					"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+					"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+					"dev": true
 				}
 			}
 		},
 		"eslint-config-wikimedia": {
-			"version": "0.18.1",
-			"resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.18.1.tgz",
-			"integrity": "sha512-93nHVH4CGxYwelbTjJQLr0xqn4XIe9WwWeGL4wMnELZW/Aceg52aT7AgIdV0659ReLzrCgxLPDvbeqB47LjBTQ==",
+			"version": "0.18.2",
+			"resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.18.2.tgz",
+			"integrity": "sha512-OllUgce2qODU/6481jg/a1kT/dygBDY1xhxXuAiQdYxJARV6LXyuiJw+wl1QBQz+huV9NXRxoJGC3L6x/NzC4g==",
 			"dev": true,
 			"requires": {
 				"eslint": "^7.17.0",
@@ -701,311 +698,13 @@
 				"eslint-plugin-es": "^4.1.0",
 				"eslint-plugin-jsdoc": "^30.7.13",
 				"eslint-plugin-json-es": "^1.5.1",
-				"eslint-plugin-mediawiki": "^0.2.6",
+				"eslint-plugin-mediawiki": "^0.2.7",
 				"eslint-plugin-mocha": "^8.0.0",
 				"eslint-plugin-no-jquery": "^2.5.0",
 				"eslint-plugin-node": "^11.1.0",
 				"eslint-plugin-qunit": "^5.2.0",
-				"eslint-plugin-vue": "^7.4.1",
+				"eslint-plugin-vue": "^7.7.0",
 				"eslint-plugin-wdio": "^6.0.12"
-			},
-			"dependencies": {
-				"@eslint/eslintrc": {
-					"version": "0.3.0",
-					"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.3.0.tgz",
-					"integrity": "sha512-1JTKgrOKAHVivSvOYw+sJOunkBjUOvjqWk1DPja7ZFhIS2mX/4EgTT8M7eTK9jrKhL/FvXXEbQwIs3pg1xp3dg==",
-					"dev": true,
-					"requires": {
-						"ajv": "^6.12.4",
-						"debug": "^4.1.1",
-						"espree": "^7.3.0",
-						"globals": "^12.1.0",
-						"ignore": "^4.0.6",
-						"import-fresh": "^3.2.1",
-						"js-yaml": "^3.13.1",
-						"lodash": "^4.17.20",
-						"minimatch": "^3.0.4",
-						"strip-json-comments": "^3.1.1"
-					},
-					"dependencies": {
-						"ajv": {
-							"version": "6.12.6",
-							"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
-							"integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
-							"dev": true,
-							"requires": {
-								"fast-deep-equal": "^3.1.1",
-								"fast-json-stable-stringify": "^2.0.0",
-								"json-schema-traverse": "^0.4.1",
-								"uri-js": "^4.2.2"
-							}
-						}
-					}
-				},
-				"acorn-jsx": {
-					"version": "5.3.1",
-					"resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz",
-					"integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==",
-					"dev": true
-				},
-				"ansi-styles": {
-					"version": "4.3.0",
-					"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-					"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-					"dev": true,
-					"requires": {
-						"color-convert": "^2.0.1"
-					}
-				},
-				"astral-regex": {
-					"version": "2.0.0",
-					"resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
-					"integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
-					"dev": true
-				},
-				"chalk": {
-					"version": "4.1.0",
-					"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
-					"integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
-					"dev": true,
-					"requires": {
-						"ansi-styles": "^4.1.0",
-						"supports-color": "^7.1.0"
-					}
-				},
-				"color-convert": {
-					"version": "2.0.1",
-					"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-					"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-					"dev": true,
-					"requires": {
-						"color-name": "~1.1.4"
-					}
-				},
-				"color-name": {
-					"version": "1.1.4",
-					"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-					"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-					"dev": true
-				},
-				"emoji-regex": {
-					"version": "8.0.0",
-					"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
-					"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
-					"dev": true
-				},
-				"eslint": {
-					"version": "7.18.0",
-					"resolved": "https://registry.npmjs.org/eslint/-/eslint-7.18.0.tgz",
-					"integrity": "sha512-fbgTiE8BfUJZuBeq2Yi7J3RB3WGUQ9PNuNbmgi6jt9Iv8qrkxfy19Ds3OpL1Pm7zg3BtTVhvcUZbIRQ0wmSjAQ==",
-					"dev": true,
-					"requires": {
-						"@babel/code-frame": "^7.0.0",
-						"@eslint/eslintrc": "^0.3.0",
-						"ajv": "^6.10.0",
-						"chalk": "^4.0.0",
-						"cross-spawn": "^7.0.2",
-						"debug": "^4.0.1",
-						"doctrine": "^3.0.0",
-						"enquirer": "^2.3.5",
-						"eslint-scope": "^5.1.1",
-						"eslint-utils": "^2.1.0",
-						"eslint-visitor-keys": "^2.0.0",
-						"espree": "^7.3.1",
-						"esquery": "^1.2.0",
-						"esutils": "^2.0.2",
-						"file-entry-cache": "^6.0.0",
-						"functional-red-black-tree": "^1.0.1",
-						"glob-parent": "^5.0.0",
-						"globals": "^12.1.0",
-						"ignore": "^4.0.6",
-						"import-fresh": "^3.0.0",
-						"imurmurhash": "^0.1.4",
-						"is-glob": "^4.0.0",
-						"js-yaml": "^3.13.1",
-						"json-stable-stringify-without-jsonify": "^1.0.1",
-						"levn": "^0.4.1",
-						"lodash": "^4.17.20",
-						"minimatch": "^3.0.4",
-						"natural-compare": "^1.4.0",
-						"optionator": "^0.9.1",
-						"progress": "^2.0.0",
-						"regexpp": "^3.1.0",
-						"semver": "^7.2.1",
-						"strip-ansi": "^6.0.0",
-						"strip-json-comments": "^3.1.0",
-						"table": "^6.0.4",
-						"text-table": "^0.2.0",
-						"v8-compile-cache": "^2.0.3"
-					}
-				},
-				"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==",
-					"dev": true,
-					"requires": {
-						"esrecurse": "^4.3.0",
-						"estraverse": "^4.1.1"
-					}
-				},
-				"eslint-visitor-keys": {
-					"version": "2.0.0",
-					"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz",
-					"integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==",
-					"dev": true
-				},
-				"espree": {
-					"version": "7.3.1",
-					"resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz",
-					"integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==",
-					"dev": true,
-					"requires": {
-						"acorn": "^7.4.0",
-						"acorn-jsx": "^5.3.1",
-						"eslint-visitor-keys": "^1.3.0"
-					},
-					"dependencies": {
-						"eslint-visitor-keys": {
-							"version": "1.3.0",
-							"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
-							"integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
-							"dev": true
-						}
-					}
-				},
-				"esrecurse": {
-					"version": "4.3.0",
-					"resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
-					"integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
-					"dev": true,
-					"requires": {
-						"estraverse": "^5.2.0"
-					},
-					"dependencies": {
-						"estraverse": {
-							"version": "5.2.0",
-							"resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
-							"integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==",
-							"dev": true
-						}
-					}
-				},
-				"file-entry-cache": {
-					"version": "6.0.0",
-					"resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.0.tgz",
-					"integrity": "sha512-fqoO76jZ3ZnYrXLDRxBR1YvOvc0k844kcOg40bgsPrE25LAb/PDqTY+ho64Xh2c8ZXgIKldchCFHczG2UVRcWA==",
-					"dev": true,
-					"requires": {
-						"flat-cache": "^3.0.4"
-					}
-				},
-				"flat-cache": {
-					"version": "3.0.4",
-					"resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
-					"integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
-					"dev": true,
-					"requires": {
-						"flatted": "^3.1.0",
-						"rimraf": "^3.0.2"
-					}
-				},
-				"flatted": {
-					"version": "3.1.1",
-					"resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz",
-					"integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==",
-					"dev": true
-				},
-				"has-flag": {
-					"version": "4.0.0",
-					"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-					"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-					"dev": true
-				},
-				"is-fullwidth-code-point": {
-					"version": "3.0.0",
-					"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
-					"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
-					"dev": true
-				},
-				"lodash": {
-					"version": "4.17.20",
-					"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz",
-					"integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==",
-					"dev": true
-				},
-				"rimraf": {
-					"version": "3.0.2",
-					"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
-					"integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
-					"dev": true,
-					"requires": {
-						"glob": "^7.1.3"
-					}
-				},
-				"slice-ansi": {
-					"version": "4.0.0",
-					"resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
-					"integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
-					"dev": true,
-					"requires": {
-						"ansi-styles": "^4.0.0",
-						"astral-regex": "^2.0.0",
-						"is-fullwidth-code-point": "^3.0.0"
-					}
-				},
-				"string-width": {
-					"version": "4.2.0",
-					"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
-					"integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
-					"dev": true,
-					"requires": {
-						"emoji-regex": "^8.0.0",
-						"is-fullwidth-code-point": "^3.0.0",
-						"strip-ansi": "^6.0.0"
-					}
-				},
-				"supports-color": {
-					"version": "7.2.0",
-					"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-					"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-					"dev": true,
-					"requires": {
-						"has-flag": "^4.0.0"
-					}
-				},
-				"table": {
-					"version": "6.0.7",
-					"resolved": "https://registry.npmjs.org/table/-/table-6.0.7.tgz",
-					"integrity": "sha512-rxZevLGTUzWna/qBLObOe16kB2RTnnbhciwgPbMMlazz1yZGVEgnZK762xyVdVznhqxrfCeBMmMkgOOaPwjH7g==",
-					"dev": true,
-					"requires": {
-						"ajv": "^7.0.2",
-						"lodash": "^4.17.20",
-						"slice-ansi": "^4.0.0",
-						"string-width": "^4.2.0"
-					},
-					"dependencies": {
-						"ajv": {
-							"version": "7.0.3",
-							"resolved": "https://registry.npmjs.org/ajv/-/ajv-7.0.3.tgz",
-							"integrity": "sha512-R50QRlXSxqXcQP5SvKUrw8VZeypvo12i2IX0EeR5PiZ7bEKeHWgzgo264LDadUsCU42lTJVhFikTqJwNeH34gQ==",
-							"dev": true,
-							"requires": {
-								"fast-deep-equal": "^3.1.1",
-								"json-schema-traverse": "^1.0.0",
-								"require-from-string": "^2.0.2",
-								"uri-js": "^4.2.2"
-							}
-						},
-						"json-schema-traverse": {
-							"version": "1.0.0",
-							"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
-							"integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
-							"dev": true
-						}
-					}
-				}
 			}
 		},
 		"eslint-plugin-compat": {
@@ -1059,9 +758,9 @@
 					}
 				},
 				"lodash": {
-					"version": "4.17.20",
-					"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz",
-					"integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==",
+					"version": "4.17.21",
+					"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+					"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
 					"dev": true
 				},
 				"semver": {
@@ -1076,67 +775,37 @@
 			}
 		},
 		"eslint-plugin-json-es": {
-			"version": "1.5.1",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-json-es/-/eslint-plugin-json-es-1.5.1.tgz",
-			"integrity": "sha512-YMzAWMcmKOYWiH0MsN3JOr0AdtZ2Rvmk3YmscsX1rHYJZRsL4KRo+yj9ktRk7S7mgy+G5TORWJ5D3/vH/u7R5A==",
+			"version": "1.5.3",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-json-es/-/eslint-plugin-json-es-1.5.3.tgz",
+			"integrity": "sha512-9wWjwhoN+ipMel70ktkWy0H7jj9sm5OAbAy3N3F3AT0swpIofVsIjDXyjGZJwSzy9tZzDtI/aKIj2WsqMHw2QA==",
 			"dev": true,
 			"requires": {
-				"eslint-visitor-keys": "^1.3.0",
+				"eslint-visitor-keys": "^2.0.0",
 				"espree": "^7.3.1"
 			},
 			"dependencies": {
-				"acorn-jsx": {
-					"version": "5.3.1",
-					"resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz",
-					"integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==",
+				"eslint-visitor-keys": {
+					"version": "2.0.0",
+					"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz",
+					"integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==",
 					"dev": true
-				},
-				"espree": {
-					"version": "7.3.1",
-					"resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz",
-					"integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==",
-					"dev": true,
-					"requires": {
-						"acorn": "^7.4.0",
-						"acorn-jsx": "^5.3.1",
-						"eslint-visitor-keys": "^1.3.0"
-					}
 				}
 			}
 		},
 		"eslint-plugin-mediawiki": {
-			"version": "0.2.6",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-mediawiki/-/eslint-plugin-mediawiki-0.2.6.tgz",
-			"integrity": "sha512-e7gx15H39ceam9AnSr6DDyfhMM9L43PVagHzclH3CF33DvWKi/OA+j2dqzJTuJcl5P/EmVIQHG5qoTaepkADsw==",
+			"version": "0.2.7",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-mediawiki/-/eslint-plugin-mediawiki-0.2.7.tgz",
+			"integrity": "sha512-2ZvPvLEwCIqrJxV1349bdX5Q03c30WccuUMCfB1Gh2IVxbBSrY0gbzOk/gPZeYigVhODt9xoFWUCIz8jwTWfrA==",
 			"dev": true,
 			"requires": {
-				"eslint-plugin-vue": "^6.2.2",
+				"eslint-plugin-vue": "^7.7.0",
 				"upath": "^1.2.0"
-			},
-			"dependencies": {
-				"eslint-plugin-vue": {
-					"version": "6.2.2",
-					"resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-6.2.2.tgz",
-					"integrity": "sha512-Nhc+oVAHm0uz/PkJAWscwIT4ijTrK5fqNqz9QB1D35SbbuMG1uB6Yr5AJpvPSWg+WOw7nYNswerYh0kOk64gqQ==",
-					"dev": true,
-					"requires": {
-						"natural-compare": "^1.4.0",
-						"semver": "^5.6.0",
-						"vue-eslint-parser": "^7.0.0"
-					}
-				},
-				"semver": {
-					"version": "5.7.1",
-					"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
-					"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
-					"dev": true
-				}
 			}
 		},
 		"eslint-plugin-mocha": {
-			"version": "8.0.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-8.0.0.tgz",
-			"integrity": "sha512-n67etbWDz6NQM+HnTwZHyBwz/bLlYPOxUbw7bPuCyFujv7ZpaT/Vn6KTAbT02gf7nRljtYIjWcTxK/n8a57rQQ==",
+			"version": "8.1.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-8.1.0.tgz",
+			"integrity": "sha512-1EgHvXKRl7W3mq3sntZAi5T24agRMyiTPL4bSXe+B4GksYOjAPEWYx+J3eJg4It1l2NMNZJtk0gQyQ6mfiPhQg==",
 			"dev": true,
 			"requires": {
 				"eslint-utils": "^2.1.0",
@@ -1198,15 +867,15 @@
 			}
 		},
 		"eslint-plugin-vue": {
-			"version": "7.5.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-7.5.0.tgz",
-			"integrity": "sha512-QnMMTcyV8PLxBz7QQNAwISSEs6LYk2LJvGlxalXvpCtfKnqo7qcY0aZTIxPe8QOnHd7WCwiMZLOJzg6A03T0Gw==",
+			"version": "7.7.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-7.7.0.tgz",
+			"integrity": "sha512-mYz4bpLGv5jx6YG/GvKkqbGSfV7uma2u1P3mLA41Q5vQl8W1MeuTneB8tfsLq6xxxesFubcrOC0BZBJ5R+eaCQ==",
 			"dev": true,
 			"requires": {
 				"eslint-utils": "^2.1.0",
 				"natural-compare": "^1.4.0",
 				"semver": "^7.3.2",
-				"vue-eslint-parser": "^7.4.1"
+				"vue-eslint-parser": "^7.6.0"
 			}
 		},
 		"eslint-plugin-wdio": {
@@ -1216,12 +885,12 @@
 			"dev": true
 		},
 		"eslint-scope": {
-			"version": "5.1.0",
-			"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.0.tgz",
-			"integrity": "sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w==",
+			"version": "5.1.1",
+			"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
+			"integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
 			"dev": true,
 			"requires": {
-				"esrecurse": "^4.1.0",
+				"esrecurse": "^4.3.0",
 				"estraverse": "^4.1.1"
 			}
 		},
@@ -1229,6 +898,7 @@
 			"version": "2.1.0",
 			"resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz",
 			"integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==",
+			"dev": true,
 			"requires": {
 				"eslint-visitor-keys": "^1.1.0"
 			}
@@ -1236,12 +906,14 @@
 		"eslint-visitor-keys": {
 			"version": "1.3.0",
 			"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
-			"integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ=="
+			"integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
+			"dev": true
 		},
 		"espree": {
 			"version": "7.3.1",
 			"resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz",
 			"integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==",
+			"dev": true,
 			"requires": {
 				"acorn": "^7.4.0",
 				"acorn-jsx": "^5.3.1",
@@ -1251,48 +923,62 @@
 				"acorn-jsx": {
 					"version": "5.3.1",
 					"resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz",
-					"integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng=="
+					"integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==",
+					"dev": true
 				}
 			}
 		},
 		"esprima": {
 			"version": "4.0.1",
 			"resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
-			"integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="
+			"integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+			"dev": true
 		},
 		"esquery": {
-			"version": "1.3.1",
-			"resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz",
-			"integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==",
+			"version": "1.4.0",
+			"resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz",
+			"integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==",
+			"dev": true,
 			"requires": {
 				"estraverse": "^5.1.0"
 			},
 			"dependencies": {
 				"estraverse": {
-					"version": "5.1.0",
-					"resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.1.0.tgz",
-					"integrity": "sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw=="
+					"version": "5.2.0",
+					"resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
+					"integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==",
+					"dev": true
 				}
 			}
 		},
 		"esrecurse": {
-			"version": "4.2.1",
-			"resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz",
-			"integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==",
+			"version": "4.3.0",
+			"resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+			"integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
 			"dev": true,
 			"requires": {
-				"estraverse": "^4.1.0"
+				"estraverse": "^5.2.0"
+			},
+			"dependencies": {
+				"estraverse": {
+					"version": "5.2.0",
+					"resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
+					"integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==",
+					"dev": true
+				}
 			}
 		},
 		"estraverse": {
 			"version": "4.3.0",
 			"resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
-			"integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw=="
+			"integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+			"dev": true
 		},
 		"esutils": {
 			"version": "2.0.3",
 			"resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
-			"integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="
+			"integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+			"dev": true
 		},
 		"eventemitter2": {
 			"version": "0.4.14",
@@ -1460,22 +1146,26 @@
 		"fast-deep-equal": {
 			"version": "3.1.3",
 			"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
-			"integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
+			"integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+			"dev": true
 		},
 		"fast-json-stable-stringify": {
 			"version": "2.1.0",
 			"resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
-			"integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
+			"integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+			"dev": true
 		},
 		"fast-levenshtein": {
 			"version": "2.0.6",
 			"resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
-			"integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc="
+			"integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+			"dev": true
 		},
 		"file-entry-cache": {
-			"version": "6.0.0",
-			"resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.0.tgz",
-			"integrity": "sha512-fqoO76jZ3ZnYrXLDRxBR1YvOvc0k844kcOg40bgsPrE25LAb/PDqTY+ho64Xh2c8ZXgIKldchCFHczG2UVRcWA==",
+			"version": "6.0.1",
+			"resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
+			"integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
+			"dev": true,
 			"requires": {
 				"flat-cache": "^3.0.4"
 			}
@@ -1560,6 +1250,7 @@
 			"version": "3.0.4",
 			"resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
 			"integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
+			"dev": true,
 			"requires": {
 				"flatted": "^3.1.0",
 				"rimraf": "^3.0.2"
@@ -1568,7 +1259,8 @@
 		"flatted": {
 			"version": "3.1.1",
 			"resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz",
-			"integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA=="
+			"integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==",
+			"dev": true
 		},
 		"for-in": {
 			"version": "1.0.2",
@@ -1597,12 +1289,14 @@
 		"fs.realpath": {
 			"version": "1.0.0",
 			"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
-			"integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
+			"integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+			"dev": true
 		},
 		"functional-red-black-tree": {
 			"version": "1.0.1",
 			"resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
-			"integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc="
+			"integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
+			"dev": true
 		},
 		"get-value": {
 			"version": "2.0.6",
@@ -1620,6 +1314,7 @@
 			"version": "7.1.6",
 			"resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
 			"integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
+			"dev": true,
 			"requires": {
 				"fs.realpath": "^1.0.0",
 				"inflight": "^1.0.4",
@@ -1630,9 +1325,10 @@
 			}
 		},
 		"glob-parent": {
-			"version": "5.1.1",
-			"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz",
-			"integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==",
+			"version": "5.1.2",
+			"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+			"integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+			"dev": true,
 			"requires": {
 				"is-glob": "^4.0.1"
 			}
@@ -1665,6 +1361,7 @@
 			"version": "12.4.0",
 			"resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz",
 			"integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==",
+			"dev": true,
 			"requires": {
 				"type-fest": "^0.8.1"
 			}
@@ -1758,58 +1455,6 @@
 			"requires": {
 				"chalk": "^4.0.0",
 				"eslint": "^7.0.0"
-			},
-			"dependencies": {
-				"ansi-styles": {
-					"version": "4.2.1",
-					"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
-					"integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
-					"dev": true,
-					"requires": {
-						"@types/color-name": "^1.1.1",
-						"color-convert": "^2.0.1"
-					}
-				},
-				"chalk": {
-					"version": "4.1.0",
-					"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
-					"integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
-					"dev": true,
-					"requires": {
-						"ansi-styles": "^4.1.0",
-						"supports-color": "^7.1.0"
-					}
-				},
-				"color-convert": {
-					"version": "2.0.1",
-					"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-					"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-					"dev": true,
-					"requires": {
-						"color-name": "~1.1.4"
-					}
-				},
-				"color-name": {
-					"version": "1.1.4",
-					"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-					"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-					"dev": true
-				},
-				"has-flag": {
-					"version": "4.0.0",
-					"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-					"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-					"dev": true
-				},
-				"supports-color": {
-					"version": "7.1.0",
-					"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
-					"integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
-					"dev": true,
-					"requires": {
-						"has-flag": "^4.0.0"
-					}
-				}
 			}
 		},
 		"grunt-known-options": {
@@ -1918,7 +1563,8 @@
 		"has-flag": {
 			"version": "3.0.0",
 			"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-			"integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
+			"integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+			"dev": true
 		},
 		"has-value": {
 			"version": "1.0.0",
@@ -1979,12 +1625,14 @@
 		"ignore": {
 			"version": "4.0.6",
 			"resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
-			"integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg=="
+			"integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
+			"dev": true
 		},
 		"import-fresh": {
-			"version": "3.2.1",
-			"resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz",
-			"integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==",
+			"version": "3.3.0",
+			"resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
+			"integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
+			"dev": true,
 			"requires": {
 				"parent-module": "^1.0.0",
 				"resolve-from": "^4.0.0"
@@ -1993,12 +1641,14 @@
 		"imurmurhash": {
 			"version": "0.1.4",
 			"resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
-			"integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o="
+			"integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
+			"dev": true
 		},
 		"inflight": {
 			"version": "1.0.6",
 			"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
 			"integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+			"dev": true,
 			"requires": {
 				"once": "^1.3.0",
 				"wrappy": "1"
@@ -2007,7 +1657,8 @@
 		"inherits": {
 			"version": "2.0.3",
 			"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
-			"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
+			"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+			"dev": true
 		},
 		"ini": {
 			"version": "1.3.7",
@@ -2105,17 +1756,20 @@
 		"is-extglob": {
 			"version": "2.1.1",
 			"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
-			"integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI="
+			"integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+			"dev": true
 		},
 		"is-fullwidth-code-point": {
 			"version": "3.0.0",
 			"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
-			"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="
+			"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+			"dev": true
 		},
 		"is-glob": {
 			"version": "4.0.1",
 			"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
 			"integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
+			"dev": true,
 			"requires": {
 				"is-extglob": "^2.1.1"
 			}
@@ -2182,7 +1836,8 @@
 		"isexe": {
 			"version": "2.0.0",
 			"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
-			"integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA="
+			"integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
+			"dev": true
 		},
 		"isobject": {
 			"version": "3.0.1",
@@ -2193,12 +1848,14 @@
 		"js-tokens": {
 			"version": "4.0.0",
 			"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
-			"integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
+			"integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+			"dev": true
 		},
 		"js-yaml": {
-			"version": "3.13.1",
-			"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
-			"integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
+			"version": "3.14.1",
+			"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
+			"integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
+			"dev": true,
 			"requires": {
 				"argparse": "^1.0.7",
 				"esprima": "^4.0.0"
@@ -2213,12 +1870,14 @@
 		"json-schema-traverse": {
 			"version": "0.4.1",
 			"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
-			"integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
+			"integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+			"dev": true
 		},
 		"json-stable-stringify-without-jsonify": {
 			"version": "1.0.1",
 			"resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
-			"integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE="
+			"integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
+			"dev": true
 		},
 		"kind-of": {
 			"version": "6.0.3",
@@ -2230,6 +1889,7 @@
 			"version": "0.4.1",
 			"resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
 			"integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+			"dev": true,
 			"requires": {
 				"prelude-ls": "^1.2.1",
 				"type-check": "~0.4.0"
@@ -2353,6 +2013,7 @@
 			"version": "3.0.4",
 			"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
 			"integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+			"dev": true,
 			"requires": {
 				"brace-expansion": "^1.1.7"
 			}
@@ -2381,7 +2042,8 @@
 		"ms": {
 			"version": "2.1.2",
 			"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-			"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+			"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+			"dev": true
 		},
 		"nanomatch": {
 			"version": "1.2.13",
@@ -2405,12 +2067,13 @@
 		"natural-compare": {
 			"version": "1.4.0",
 			"resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
-			"integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc="
+			"integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
+			"dev": true
 		},
 		"node-releases": {
-			"version": "1.1.70",
-			"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.70.tgz",
-			"integrity": "sha512-Slf2s69+2/uAD79pVVQo8uSiC34+g8GWY8UH2Qtqv34ZfhYrxpYpfzs9Js9d6O0mbDmALuxaTlplnBTnSELcrw==",
+			"version": "1.1.71",
+			"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.71.tgz",
+			"integrity": "sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg==",
 			"dev": true
 		},
 		"nopt": {
@@ -2497,6 +2160,7 @@
 			"version": "1.4.0",
 			"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
 			"integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+			"dev": true,
 			"requires": {
 				"wrappy": "1"
 			}
@@ -2505,6 +2169,7 @@
 			"version": "0.9.1",
 			"resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
 			"integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
+			"dev": true,
 			"requires": {
 				"deep-is": "^0.1.3",
 				"fast-levenshtein": "^2.0.6",
@@ -2564,6 +2229,7 @@
 			"version": "1.0.1",
 			"resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
 			"integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+			"dev": true,
 			"requires": {
 				"callsites": "^3.0.0"
 			}
@@ -2600,12 +2266,14 @@
 		"path-is-absolute": {
 			"version": "1.0.1",
 			"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
-			"integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
+			"integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+			"dev": true
 		},
 		"path-key": {
 			"version": "3.1.1",
 			"resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
-			"integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="
+			"integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+			"dev": true
 		},
 		"path-parse": {
 			"version": "1.0.6",
@@ -2637,17 +2305,20 @@
 		"prelude-ls": {
 			"version": "1.2.1",
 			"resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
-			"integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="
+			"integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+			"dev": true
 		},
 		"progress": {
 			"version": "2.0.3",
 			"resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
-			"integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA=="
+			"integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
+			"dev": true
 		},
 		"punycode": {
 			"version": "2.1.1",
 			"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
-			"integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
+			"integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
+			"dev": true
 		},
 		"ramda": {
 			"version": "0.27.1",
@@ -2677,7 +2348,8 @@
 		"regexpp": {
 			"version": "3.1.0",
 			"resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz",
-			"integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q=="
+			"integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==",
+			"dev": true
 		},
 		"regextras": {
 			"version": "0.7.1",
@@ -2700,7 +2372,8 @@
 		"require-from-string": {
 			"version": "2.0.2",
 			"resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
-			"integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="
+			"integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
+			"dev": true
 		},
 		"requireindex": {
 			"version": "1.2.0",
@@ -2730,7 +2403,8 @@
 		"resolve-from": {
 			"version": "4.0.0",
 			"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
-			"integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="
+			"integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+			"dev": true
 		},
 		"resolve-url": {
 			"version": "0.2.1",
@@ -2748,6 +2422,7 @@
 			"version": "3.0.2",
 			"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
 			"integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+			"dev": true,
 			"requires": {
 				"glob": "^7.1.3"
 			}
@@ -2770,7 +2445,8 @@
 		"semver": {
 			"version": "7.3.2",
 			"resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
-			"integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ=="
+			"integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==",
+			"dev": true
 		},
 		"set-value": {
 			"version": "2.0.1",
@@ -2799,6 +2475,7 @@
 			"version": "2.0.0",
 			"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
 			"integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+			"dev": true,
 			"requires": {
 				"shebang-regex": "^3.0.0"
 			}
@@ -2806,12 +2483,14 @@
 		"shebang-regex": {
 			"version": "3.0.0",
 			"resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
-			"integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="
+			"integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+			"dev": true
 		},
 		"slice-ansi": {
 			"version": "4.0.0",
 			"resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
 			"integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
+			"dev": true,
 			"requires": {
 				"ansi-styles": "^4.0.0",
 				"astral-regex": "^2.0.0",
@@ -2822,6 +2501,7 @@
 					"version": "4.3.0",
 					"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
 					"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+					"dev": true,
 					"requires": {
 						"color-convert": "^2.0.1"
 					}
@@ -2830,6 +2510,7 @@
 					"version": "2.0.1",
 					"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
 					"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+					"dev": true,
 					"requires": {
 						"color-name": "~1.1.4"
 					}
@@ -2837,7 +2518,8 @@
 				"color-name": {
 					"version": "1.1.4",
 					"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-					"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+					"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+					"dev": true
 				}
 			}
 		},
@@ -3047,9 +2729,10 @@
 			}
 		},
 		"string-width": {
-			"version": "4.2.0",
-			"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
-			"integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
+			"version": "4.2.2",
+			"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz",
+			"integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==",
+			"dev": true,
 			"requires": {
 				"emoji-regex": "^8.0.0",
 				"is-fullwidth-code-point": "^3.0.0",
@@ -3060,6 +2743,7 @@
 			"version": "6.0.0",
 			"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
 			"integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+			"dev": true,
 			"requires": {
 				"ansi-regex": "^5.0.0"
 			}
@@ -3067,12 +2751,14 @@
 		"strip-json-comments": {
 			"version": "3.1.1",
 			"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
-			"integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="
+			"integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+			"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"
 			}
@@ -3081,6 +2767,7 @@
 			"version": "6.0.7",
 			"resolved": "https://registry.npmjs.org/table/-/table-6.0.7.tgz",
 			"integrity": "sha512-rxZevLGTUzWna/qBLObOe16kB2RTnnbhciwgPbMMlazz1yZGVEgnZK762xyVdVznhqxrfCeBMmMkgOOaPwjH7g==",
+			"dev": true,
 			"requires": {
 				"ajv": "^7.0.2",
 				"lodash": "^4.17.20",
@@ -3089,9 +2776,10 @@
 			},
 			"dependencies": {
 				"ajv": {
-					"version": "7.0.3",
-					"resolved": "https://registry.npmjs.org/ajv/-/ajv-7.0.3.tgz",
-					"integrity": "sha512-R50QRlXSxqXcQP5SvKUrw8VZeypvo12i2IX0EeR5PiZ7bEKeHWgzgo264LDadUsCU42lTJVhFikTqJwNeH34gQ==",
+					"version": "7.2.0",
+					"resolved": "https://registry.npmjs.org/ajv/-/ajv-7.2.0.tgz",
+					"integrity": "sha512-51Na3IUg3uOACsQ7hzTUCjSzGy8xROySgI8tmNJ+y9JF2hfDS6qkTP7+Ep3htUtSQG1t17QMbe+jZFTlaU4dDQ==",
+					"dev": true,
 					"requires": {
 						"fast-deep-equal": "^3.1.1",
 						"json-schema-traverse": "^1.0.0",
@@ -3102,19 +2790,22 @@
 				"json-schema-traverse": {
 					"version": "1.0.0",
 					"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
-					"integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="
+					"integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+					"dev": true
 				},
 				"lodash": {
-					"version": "4.17.20",
-					"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz",
-					"integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA=="
+					"version": "4.17.21",
+					"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+					"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+					"dev": true
 				}
 			}
 		},
 		"text-table": {
 			"version": "0.2.0",
 			"resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
-			"integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ="
+			"integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
+			"dev": true
 		},
 		"to-object-path": {
 			"version": "0.3.0",
@@ -3162,6 +2853,7 @@
 			"version": "0.4.0",
 			"resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
 			"integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+			"dev": true,
 			"requires": {
 				"prelude-ls": "^1.2.1"
 			}
@@ -3169,7 +2861,8 @@
 		"type-fest": {
 			"version": "0.8.1",
 			"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
-			"integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA=="
+			"integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
+			"dev": true
 		},
 		"unc-path-regex": {
 			"version": "0.1.2",
@@ -3246,9 +2939,10 @@
 			"dev": true
 		},
 		"uri-js": {
-			"version": "4.2.2",
-			"resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
-			"integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==",
+			"version": "4.4.1",
+			"resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+			"integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+			"dev": true,
 			"requires": {
 				"punycode": "^2.1.0"
 			}
@@ -3272,9 +2966,10 @@
 			"dev": true
 		},
 		"v8-compile-cache": {
-			"version": "2.1.1",
-			"resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz",
-			"integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ=="
+			"version": "2.3.0",
+			"resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz",
+			"integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==",
+			"dev": true
 		},
 		"v8flags": {
 			"version": "3.1.3",
@@ -3286,16 +2981,16 @@
 			}
 		},
 		"vue-eslint-parser": {
-			"version": "7.4.1",
-			"resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-7.4.1.tgz",
-			"integrity": "sha512-AFvhdxpFvliYq1xt/biNBslTHE/zbEvSnr1qfHA/KxRIpErmEDrQZlQnvEexednRHmLfDNOMuDYwZL5xkLzIXQ==",
+			"version": "7.6.0",
+			"resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-7.6.0.tgz",
+			"integrity": "sha512-QXxqH8ZevBrtiZMZK0LpwaMfevQi9UL7lY6Kcp+ogWHC88AuwUPwwCIzkOUc1LR4XsYAt/F9yHXAB/QoD17QXA==",
 			"dev": true,
 			"requires": {
 				"debug": "^4.1.1",
 				"eslint-scope": "^5.0.0",
 				"eslint-visitor-keys": "^1.1.0",
 				"espree": "^6.2.1",
-				"esquery": "^1.0.1",
+				"esquery": "^1.4.0",
 				"lodash": "^4.17.15"
 			},
 			"dependencies": {
@@ -3309,6 +3004,21 @@
 						"acorn-jsx": "^5.2.0",
 						"eslint-visitor-keys": "^1.1.0"
 					}
+				},
+				"esquery": {
+					"version": "1.4.0",
+					"resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz",
+					"integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==",
+					"dev": true,
+					"requires": {
+						"estraverse": "^5.1.0"
+					}
+				},
+				"estraverse": {
+					"version": "5.2.0",
+					"resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
+					"integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==",
+					"dev": true
 				}
 			}
 		},
@@ -3324,12 +3034,14 @@
 		"word-wrap": {
 			"version": "1.2.3",
 			"resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
-			"integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ=="
+			"integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
+			"dev": true
 		},
 		"wrappy": {
 			"version": "1.0.2",
 			"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
-			"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
+			"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+			"dev": true
 		},
 		"yallist": {
 			"version": "4.0.0",
diff --git a/package.json b/package.json
index 7f7b61c..0a5a347 100644
--- a/package.json
+++ b/package.json
@@ -4,7 +4,7 @@
 		"test": "grunt test"
 	},
 	"devDependencies": {
-		"eslint-config-wikimedia": "0.18.1",
+		"eslint-config-wikimedia": "0.18.2",
 		"grunt": "1.3.0",
 		"grunt-banana-checker": "0.9.0",
 		"grunt-eslint": "23.0.0"
-- 
2.20.1

$ date
Sun Mar  7 11:54:29 UTC 2021

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

$ git config user.name libraryupgrader

$ git config user.email tools.libraryupgrader@tools.wmflabs.org

$ git submodule update --init

$ grr init
Installed commit-msg hook.

$ git show-ref refs/heads/master
dc563fff0bd5ec83db85eeb477645ae7d620906f refs/heads/master

$ composer install
Loading composer repositories with package information
Warning from https://repo.packagist.org: You are using an outdated version of Composer. Composer 2 is now available and you should upgrade. See https://getcomposer.org/2
Updating dependencies (including require-dev)
Package operations: 19 installs, 0 updates, 0 removals
  - Installing composer/installers (v1.10.0): Loading from cache
  - Installing squizlabs/php_codesniffer (3.5.8): Loading from cache
  - Installing composer/spdx-licenses (1.5.5): Loading from cache
  - Installing composer/semver (3.2.4): Loading from cache
  - Installing mediawiki/mediawiki-codesniffer (v35.0.0): Loading from cache
  - Installing symfony/polyfill-php80 (v1.22.1): Loading from cache
  - Installing symfony/polyfill-mbstring (v1.22.1): Loading from cache
  - Installing symfony/polyfill-intl-normalizer (v1.22.1): Loading from cache
  - Installing symfony/polyfill-intl-grapheme (v1.22.1): Loading from cache
  - Installing symfony/polyfill-ctype (v1.22.1): Loading from cache
  - Installing symfony/string (v5.2.4): Loading from cache
  - Installing psr/container (1.1.1): Loading from cache
  - Installing symfony/service-contracts (v2.2.0): Loading from cache
  - Installing symfony/polyfill-php73 (v1.22.1): Loading from cache
  - Installing symfony/console (v5.2.4): Loading from cache
  - Installing mediawiki/minus-x (1.1.1): Loading from cache
  - Installing php-parallel-lint/php-console-color (v0.3): Loading from cache
  - Installing php-parallel-lint/php-console-highlighter (v0.5): Loading from cache
  - Installing php-parallel-lint/php-parallel-lint (v1.2.0): Loading from cache
symfony/service-contracts suggests installing symfony/service-implementation
symfony/console suggests installing symfony/event-dispatcher
symfony/console suggests installing symfony/lock
symfony/console suggests installing symfony/process
symfony/console suggests installing psr/log (For using the console logger)
Writing lock file
Generating autoload files
12 packages you are using are looking for funding.
Use the `composer fund` command to find out more!

Upgrading n:eslint-config-wikimedia from 0.18.1 -> 0.18.2
$ npm install

> core-js@3.9.1 postinstall /src/repo/node_modules/core-js
> node -e "try{require('./postinstall')}catch(e){}"

Thank you for using core-js ( https://github.com/zloirock/core-js ) for polyfilling JavaScript standard library!

The project needs your help! Please consider supporting of core-js on Open Collective or Patreon: 
> https://opencollective.com/core-js 
> https://www.patreon.com/zloirock 

Also, the author of core-js ( https://github.com/zloirock ) is looking for a good job -)

added 356 packages from 242 contributors and audited 356 packages in 71.675s

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

found 0 vulnerabilities


$ npm update eslint -depth 10
+ eslint@7.21.0
added 1 package, removed 6 packages, updated 19 packages, moved 5 packages and audited 351 packages in 98.403s

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

found 0 vulnerabilities


$ npm install grunt-eslint@23.0.0 --save-exact
+ grunt-eslint@23.0.0
removed 6 packages, updated 1 package and audited 345 packages in 3.771s

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

found 0 vulnerabilities


$ ./node_modules/.bin/eslint i18n/ha.json i18n/ba.json i18n/ce.json i18n/sd.json i18n/be-tarask.json i18n/bcc.json i18n/li.json i18n/si.json i18n/tg-cyrl.json i18n/kiu.json i18n/hak.json i18n/br.json i18n/eu.json i18n/te.json i18n/cu.json i18n/kri.json i18n/tet.json i18n/azb.json libs/PF_maps.offline.js i18n/bs.json i18n/pt.json package.json i18n/pfl.json i18n/cv.json i18n/kab.json libs/PF_FullCalendar.js i18n/pt-br.json i18n/ms.json i18n/sw.json libs/PF_wikieditor.js libs/PF_CreateTemplate.js i18n/shn.json i18n/myv.json i18n/az.json i18n/gu.json i18n/bar.json i18n/smn.json i18n/vep.json i18n/kjp.json i18n/got.json i18n/is.json i18n/ht.json composer.json i18n/sk.json extension.json i18n/sa.json i18n/jv.json libs/ext.pf.js i18n/rif.json i18n/pl.json i18n/ml.json i18n/mwl.json libs/PF_datetimepicker.js i18n/tyv.json libs/PF_rating.js i18n/tcy.json i18n/lv.json i18n/gsw.json i18n/lt.json i18n/sl.json i18n/avk.json i18n/hsb.json i18n/sr-el.json libs/PF_AutocompleteWidget.js libs/PF_submit.js libs/PF_collapsible.js i18n/skr-arab.json i18n/lb.json libs/ext.pf.select2.tokens.js i18n/ksh.json i18n/lki.json libs/PF_checkboxes.js libs/PageForms.js libs/PF_timepicker.js i18n/ko.json i18n/gom-latn.json i18n/mt.json i18n/it.json i18n/krc.json i18n/ru.json i18n/fa.json i18n/inh.json i18n/gcr.json libs/PF_datepicker.js libs/PF_simpleupload.js i18n/io.json i18n/et.json i18n/nso.json i18n/el.json i18n/bo.json i18n/ig.json i18n/wa.json i18n/hy.json i18n/zgh.json libs/PF_CreateClass.js i18n/bgn.json libs/PF_editWarning.js i18n/nn.json i18n/szy.json i18n/nb.json i18n/he.json i18n/jbo.json i18n/arc.json i18n/nds-nl.json i18n/mzn.json i18n/ta.json i18n/aln.json libs/PF_CreateProperty.js i18n/kea.json i18n/es.json i18n/su.json i18n/mn.json i18n/ast.json i18n/tk.json i18n/krj.json i18n/id.json i18n/ne.json libs/PF_regexp.js i18n/km.json i18n/frp.json i18n/nds.json i18n/ug-arab.json i18n/om.json i18n/hil.json i18n/oc.json i18n/tg-latn.json i18n/gom.json i18n/tzm.json i18n/mr.json i18n/tt-cyrl.json i18n/zh-tw.json i18n/de-formal.json i18n/sco.json i18n/szl.json i18n/ee.json i18n/udm.json i18n/ka.json i18n/bn.json i18n/tr.json i18n/gv.json i18n/ckb.json i18n/ky.json i18n/ti.json i18n/bg.json i18n/ku-latn.json i18n/haw.json i18n/ps.json i18n/pa.json libs/PF_CreateForm.js i18n/be.json i18n/dsb.json i18n/so.json i18n/yi.json i18n/am.json package-lock.json i18n/ca.json i18n/pam.json i18n/fo.json i18n/vi.json Gruntfile.js i18n/niu.json i18n/sah.json i18n/uz.json libs/PF_maps.js i18n/ro.json i18n/th.json i18n/pdc.json i18n/sq.json i18n/an.json i18n/arz.json i18n/mk.json libs/PF_autogrow.js i18n/fit.json i18n/atj.json i18n/sv.json i18n/pms.json i18n/my.json libs/PF_tree.js i18n/rmc.json i18n/ur.json i18n/ia.json i18n/ga.json i18n/frr.json i18n/bjn.json i18n/tl.json libs/PF_imagePreview.js i18n/pnb.json i18n/kn.json libs/PF_popupform.js i18n/en.json i18n/diq.json i18n/ja.json i18n/rue.json libs/PF_formInput.js i18n/roa-tara.json i18n/wuu.json i18n/zh-hans.json libs/PF_PageSchemas.js i18n/da.json i18n/af.json i18n/zh-hant.json i18n/sc.json i18n/en-ca.json i18n/grc.json i18n/fi.json i18n/sr-ec.json libs/PF_preview.js i18n/bcl.json i18n/qqq.json i18n/nl.json i18n/cs.json i18n/stq.json libs/ext.pf.select2.base.js i18n/os.json libs/PF_spreadsheet.js i18n/gl.json i18n/mhr.json i18n/as.json i18n/uk.json i18n/kw.json i18n/fy.json i18n/min.json i18n/eo.json i18n/ar.json libs/PF_autoedit.js i18n/hr.json i18n/tly.json i18n/nah.json i18n/fr.json i18n/de.json i18n/hu.json libs/ext.pf.select2.combobox.js i18n/vo.json i18n/hi.json --fix

/src/repo/libs/PF_CreateClass.js
   7:6  warning  jQuery collection names must match the variablePattern  no-jquery/variable-pattern
  43:3  warning  Positional selector extensions are not allowed          no-jquery/no-sizzle
  44:3  warning  Positional selector extensions are not allowed          no-jquery/no-sizzle
  47:3  warning  Positional selector extensions are not allowed          no-jquery/no-sizzle
  49:3  warning  Positional selector extensions are not allowed          no-jquery/no-sizzle
  83:6  warning  jQuery collection names must match the variablePattern  no-jquery/variable-pattern

/src/repo/libs/PF_CreateForm.js
  23:8  warning  jQuery collection names must match the variablePattern  no-jquery/variable-pattern

/src/repo/libs/PF_CreateTemplate.js
  21:6  warning  jQuery collection names must match the variablePattern  no-jquery/variable-pattern

/src/repo/libs/PF_FullCalendar.js
   192:5   warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   194:7   warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   195:7   warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   196:7   warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   204:5   warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   206:7   warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   207:7   warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   208:7   warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   209:7   warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   210:7   warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   211:7   warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   217:16  warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   218:44  warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   219:18  warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   220:16  warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   221:44  warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   222:18  warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   224:16  warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   225:8   warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   226:18  warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   227:16  warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   228:8   warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   229:18  warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   231:11  warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   232:9   warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   233:9   warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   234:9   warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   235:9   warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   236:9   warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   237:23  warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   238:11  warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   239:11  warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   240:23  warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   241:11  warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   242:11  warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   268:13  warning  'dateEntry' is already declared in the upper scope on line 61 column 4        no-shadow
   273:11  warning  'monthIndex' is already declared in the upper scope on line 63 column 58      no-shadow
   610:5   warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   612:11  warning  Where possible, maintain application state in JS to avoid slower DOM queries  no-jquery/no-class-state
   641:6   warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   642:6   warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   644:7   warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   646:7   warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   673:6   warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   674:6   warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   676:7   warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   678:7   warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   680:6   warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   681:6   warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   683:7   warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   685:7   warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   746:9   warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   748:9   warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   751:8   warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   754:7   warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   758:9   warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   764:25  warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   766:9   warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   772:11  warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   775:10  warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   791:8   warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   813:5   warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   815:11  warning  Where possible, maintain application state in JS to avoid slower DOM queries  no-jquery/no-class-state
  1059:8   warning  'ampm24h' is already declared in the upper scope on line 60 column 45         no-shadow

/src/repo/libs/PF_autoedit.js
  21:7   warning  jQuery collection names must match the variablePattern          no-jquery/variable-pattern
  79:39  warning  '$' is already declared in the upper scope on line 9 column 14  no-shadow

/src/repo/libs/PF_checkboxes.js
  16:8   warning  jQuery collection names must match the variablePattern          no-jquery/variable-pattern
  32:8   warning  jQuery collection names must match the variablePattern          no-jquery/variable-pattern
  39:8   warning  jQuery collection names must match the variablePattern          no-jquery/variable-pattern
  47:24  warning  '$' is already declared in the upper scope on line 7 column 14  no-shadow

/src/repo/libs/PF_collapsible.js
  27:7  warning  jQuery collection names must match the variablePattern  no-jquery/variable-pattern

/src/repo/libs/PF_imagePreview.js
   4:0  warning  Invalid JSDoc tag name "licence"                  jsdoc/check-tag-names
  28:7  warning  Invalid loop. Its body allows only one iteration  no-unreachable-loop

/src/repo/libs/PF_maps.js
  136:8   warning  jQuery collection names must match the variablePattern                no-jquery/variable-pattern
  137:8   warning  jQuery collection names must match the variablePattern                no-jquery/variable-pattern
  138:8   warning  jQuery collection names must match the variablePattern                no-jquery/variable-pattern
  254:10  warning  'bounds' is already declared in the upper scope on line 200 column 8  no-shadow
  303:31  warning  'map' is already declared in the upper scope on line 8 column 6       no-shadow
  310:2   warning  Missing JSDoc @return declaration                                     jsdoc/require-returns
  314:0   warning  Missing JSDoc @param "num" type                                       jsdoc/require-param-type

/src/repo/libs/PF_maps.offline.js
   10:2   warning  Missing JSDoc @return declaration                                 jsdoc/require-returns
   14:0   warning  Missing JSDoc @param "num" type                                   jsdoc/require-param-type
  183:31  warning  'map' is already declared in the upper scope on line 20 column 6  no-shadow
  238:8   warning  jQuery collection names must match the variablePattern            no-jquery/variable-pattern
  239:8   warning  jQuery collection names must match the variablePattern            no-jquery/variable-pattern
  240:8   warning  jQuery collection names must match the variablePattern            no-jquery/variable-pattern

/src/repo/libs/PF_popupform.js
  367:3   warning  jQuery collection names must match the variablePattern                        no-jquery/variable-pattern
  368:3   warning  jQuery collection names must match the variablePattern                        no-jquery/variable-pattern
  370:7   warning  jQuery collection names must match the variablePattern                        no-jquery/variable-pattern
  372:3   warning  jQuery collection names must match the variablePattern                        no-jquery/variable-pattern
  374:7   warning  jQuery collection names must match the variablePattern                        no-jquery/variable-pattern
  376:3   warning  jQuery collection names must match the variablePattern                        no-jquery/variable-pattern
  377:3   warning  jQuery collection names must match the variablePattern                        no-jquery/variable-pattern
  378:3   warning  jQuery collection names must match the variablePattern                        no-jquery/variable-pattern
  380:7   warning  jQuery collection names must match the variablePattern                        no-jquery/variable-pattern
  435:7   warning  jQuery collection names must match the variablePattern                        no-jquery/variable-pattern
  440:8   warning  jQuery collection names must match the variablePattern                        no-jquery/variable-pattern
  447:9   warning  'iframe' is already declared in the upper scope on line 41 column 6           no-shadow
  448:9   warning  'doc' is already declared in the upper scope on line 49 column 6              no-shadow
  489:4   warning  jQuery collection names must match the variablePattern                        no-jquery/variable-pattern
  613:9   warning  jQuery collection names must match the variablePattern                        no-jquery/variable-pattern
  765:12  warning  Where possible, maintain application state in JS to avoid slower DOM queries  no-jquery/no-class-state
  779:12  warning  Where possible, maintain application state in JS to avoid slower DOM queries  no-jquery/no-class-state

/src/repo/libs/PF_preview.js
   17:2  warning  Missing JSDoc @return declaration                       jsdoc/require-returns
   22:7  warning  jQuery collection names must match the variablePattern  no-jquery/variable-pattern
   82:0  warning  Missing JSDoc @param "result" type                      jsdoc/require-param-type
   95:4  warning  jQuery collection names must match the variablePattern  no-jquery/variable-pattern
  177:2  warning  Missing JSDoc @return declaration                       jsdoc/require-returns
  183:3  warning  jQuery collection names must match the variablePattern  no-jquery/variable-pattern
  195:7  warning  jQuery collection names must match the variablePattern  no-jquery/variable-pattern

/src/repo/libs/PF_rating.js
  43:4  warning  Selector extensions are not allowed  no-jquery/no-sizzle

/src/repo/libs/PF_regexp.js
  11:0  warning  Missing JSDoc @param "inputId" type  jsdoc/require-param-type
  12:0  warning  Missing JSDoc @param "params" type   jsdoc/require-param-type
  16:0  warning  Missing JSDoc @return type           jsdoc/require-returns-type

/src/repo/libs/PF_spreadsheet.js
  324:33  warning  'templateName' is already declared in the upper scope on line 241 column 7   no-shadow
  472:9   warning  'spreadsheetID' is already declared in the upper scope on line 243 column 4  no-shadow
  473:9   warning  'columnName' is already declared in the upper scope on line 262 column 8     no-shadow
  580:11  warning  'columnName' is already declared in the upper scope on line 262 column 8     no-shadow
  617:10  warning  'spreadsheetID' is already declared in the upper scope on line 243 column 4  no-shadow
  621:36  warning  'spreadsheetID' is already declared in the upper scope on line 243 column 4  no-shadow
  624:16  warning  'columnNum' is already declared in the upper scope on line 579 column 16     no-shadow
  641:22  warning  Positional selector extensions are not allowed                               no-jquery/no-sizzle
  644:10  warning  jQuery collection names must match the variablePattern                       no-jquery/variable-pattern

/src/repo/libs/PF_submit.js
   27:0   warning  Missing JSDoc @param "result" type                                 jsdoc/require-param-type
   28:0   warning  Missing JSDoc @param "textStatus" type                             jsdoc/require-param-type
   29:0   warning  Missing JSDoc @param "jqXHR" type                                  jsdoc/require-param-type
   37:4   warning  jQuery collection names must match the variablePattern             no-jquery/variable-pattern
   47:4   warning  jQuery collection names must match the variablePattern             no-jquery/variable-pattern
   85:24  warning  'form' is already declared in the upper scope on line 14 column 6  no-shadow
   86:7   warning  jQuery collection names must match the variablePattern             no-jquery/variable-pattern
  156:8   warning  jQuery collection names must match the variablePattern             no-jquery/variable-pattern
  156:8   warning  'form' is already declared in the upper scope on line 14 column 6  no-shadow
  196:4   warning  jQuery collection names must match the variablePattern             no-jquery/variable-pattern
  198:4   warning  jQuery collection names must match the variablePattern             no-jquery/variable-pattern

/src/repo/libs/PF_timepicker.js
   11:0  warning  Missing JSDoc @param "inputID" type                     jsdoc/require-param-type
   12:0  warning  Missing JSDoc @param "params" type                      jsdoc/require-param-type
   23:6  warning  jQuery collection names must match the variablePattern  no-jquery/variable-pattern
   31:3  warning  jQuery collection names must match the variablePattern  no-jquery/variable-pattern
   49:6  warning  jQuery collection names must match the variablePattern  no-jquery/variable-pattern
   64:9  warning  Selector extensions are not allowed                     no-jquery/no-sizzle
   74:6  warning  jQuery collection names must match the variablePattern  no-jquery/variable-pattern
  120:6  warning  jQuery collection names must match the variablePattern  no-jquery/variable-pattern
  122:6  warning  jQuery collection names must match the variablePattern  no-jquery/variable-pattern
  127:7  warning  jQuery collection names must match the variablePattern  no-jquery/variable-pattern
  134:7  warning  jQuery collection names must match the variablePattern  no-jquery/variable-pattern
  138:8  warning  jQuery collection names must match the variablePattern  no-jquery/variable-pattern

/src/repo/libs/PF_tree.js
  50:7  warning  jQuery collection names must match the variablePattern  no-jquery/variable-pattern
  63:7  warning  jQuery collection names must match the variablePattern  no-jquery/variable-pattern
  72:8  warning  jQuery collection names must match the variablePattern  no-jquery/variable-pattern

/src/repo/libs/PF_wikieditor.js
  14:9  warning  jQuery collection names must match the variablePattern  no-jquery/variable-pattern

/src/repo/libs/PageForms.js
   147:3   warning  jQuery collection names must match the variablePattern                              no-jquery/variable-pattern
   149:3   warning  jQuery collection names must match the variablePattern                              no-jquery/variable-pattern
   178:7   warning  jQuery collection names must match the variablePattern                              no-jquery/variable-pattern
   218:3   warning  jQuery collection names must match the variablePattern                              no-jquery/variable-pattern
   234:9   warning  Selector extensions are not allowed                                                 no-jquery/no-sizzle
   381:61  warning  All possible message keys should be documented. See https://w.wiki/PRw for details  mediawiki/msg-doc
   388:58  warning  All possible message keys should be documented. See https://w.wiki/PRw for details  mediawiki/msg-doc
   454:6   warning  jQuery collection names must match the variablePattern                              no-jquery/variable-pattern
   458:6   warning  jQuery collection names must match the variablePattern                              no-jquery/variable-pattern
   468:3   warning  jQuery collection names must match the variablePattern                              no-jquery/variable-pattern
   488:7   warning  jQuery collection names must match the variablePattern                              no-jquery/variable-pattern
   520:6   warning  jQuery collection names must match the variablePattern                              no-jquery/variable-pattern
   523:6   warning  jQuery collection names must match the variablePattern                              no-jquery/variable-pattern
   972:7   warning  jQuery collection names must match the variablePattern                              no-jquery/variable-pattern
   991:9   warning  Where possible, maintain application state in JS to avoid slower DOM queries        no-jquery/no-class-state
  1023:1   warning  Missing JSDoc @return declaration                                                   jsdoc/require-returns
  1026:0   warning  Missing JSDoc @param "addAboveCurInstance" type                                     jsdoc/require-param-type
  1241:6   warning  jQuery collection names must match the variablePattern                              no-jquery/variable-pattern
  1269:1   warning  Missing JSDoc @return declaration                                                   jsdoc/require-returns
  1273:0   warning  Missing JSDoc @param "partOfMultiple" type                                          jsdoc/require-param-type
  1297:4   warning  jQuery collection names must match the variablePattern                              no-jquery/variable-pattern
  1300:4   warning  jQuery collection names must match the variablePattern                              no-jquery/variable-pattern
  1323:0   warning  Missing JSDoc @param "partOfMultiple" type                                          jsdoc/require-param-type
  1526:27  warning  performance.now() is not supported in Safari 5.1, android 4.1                       compat/compat
  1526:47  warning  performance.now() is not supported in Safari 5.1, android 4.1                       compat/compat
  1549:13  warning  'i' is already declared in the upper scope on line 1542 column 6                    no-shadow
  1609:8   warning  jQuery collection names must match the variablePattern                              no-jquery/variable-pattern
  1638:6   warning  jQuery collection names must match the variablePattern                              no-jquery/variable-pattern

/src/repo/libs/ext.pf.js
  20:0  warning  Invalid JSDoc tag name "alternateClassName"  jsdoc/check-tag-names

/src/repo/libs/ext.pf.select2.base.js
   93:12  warning  'newOption' is already declared in the upper scope on line 73 column 10  no-shadow
  199:5   warning  jQuery collection names must match the variablePattern                   no-jquery/variable-pattern
  202:5   warning  jQuery collection names must match the variablePattern                   no-jquery/variable-pattern
  230:3   warning  Missing JSDoc @return declaration                                        jsdoc/require-returns
  237:0   warning  Missing JSDoc @param "markup" type                                       jsdoc/require-param-type

/src/repo/libs/ext.pf.select2.combobox.js
  223:23  warning  'data' is already declared in the upper scope on line 122 column 10  no-shadow
  322:5   warning  jQuery collection names must match the variablePattern               no-jquery/variable-pattern
  325:5   warning  jQuery collection names must match the variablePattern               no-jquery/variable-pattern

/src/repo/libs/ext.pf.select2.tokens.js
  326:23  warning  'data' is already declared in the upper scope on line 262 column 10  no-shadow

✖ 196 problems (0 errors, 196 warnings)


$ ./node_modules/.bin/eslint i18n/ha.json i18n/ba.json i18n/ce.json i18n/sd.json i18n/be-tarask.json i18n/bcc.json i18n/li.json i18n/si.json i18n/tg-cyrl.json i18n/kiu.json i18n/hak.json i18n/br.json i18n/eu.json i18n/te.json i18n/cu.json i18n/kri.json i18n/tet.json i18n/azb.json libs/PF_maps.offline.js i18n/bs.json i18n/pt.json package.json i18n/pfl.json i18n/cv.json i18n/kab.json libs/PF_FullCalendar.js i18n/pt-br.json i18n/ms.json i18n/sw.json libs/PF_wikieditor.js libs/PF_CreateTemplate.js i18n/shn.json i18n/myv.json i18n/az.json i18n/gu.json i18n/bar.json i18n/smn.json i18n/vep.json i18n/kjp.json i18n/got.json i18n/is.json i18n/ht.json composer.json i18n/sk.json extension.json i18n/sa.json i18n/jv.json libs/ext.pf.js i18n/rif.json i18n/pl.json i18n/ml.json i18n/mwl.json libs/PF_datetimepicker.js i18n/tyv.json libs/PF_rating.js i18n/tcy.json i18n/lv.json i18n/gsw.json i18n/lt.json i18n/sl.json i18n/avk.json i18n/hsb.json i18n/sr-el.json libs/PF_AutocompleteWidget.js libs/PF_submit.js libs/PF_collapsible.js i18n/skr-arab.json i18n/lb.json libs/ext.pf.select2.tokens.js i18n/ksh.json i18n/lki.json libs/PF_checkboxes.js libs/PageForms.js libs/PF_timepicker.js i18n/ko.json i18n/gom-latn.json i18n/mt.json i18n/it.json i18n/krc.json i18n/ru.json i18n/fa.json i18n/inh.json i18n/gcr.json libs/PF_datepicker.js libs/PF_simpleupload.js i18n/io.json i18n/et.json i18n/nso.json i18n/el.json i18n/bo.json i18n/ig.json i18n/wa.json i18n/hy.json i18n/zgh.json libs/PF_CreateClass.js i18n/bgn.json libs/PF_editWarning.js i18n/nn.json i18n/szy.json i18n/nb.json i18n/he.json i18n/jbo.json i18n/arc.json i18n/nds-nl.json i18n/mzn.json i18n/ta.json i18n/aln.json libs/PF_CreateProperty.js i18n/kea.json i18n/es.json i18n/su.json i18n/mn.json i18n/ast.json i18n/tk.json i18n/krj.json i18n/id.json i18n/ne.json libs/PF_regexp.js i18n/km.json i18n/frp.json i18n/nds.json i18n/ug-arab.json i18n/om.json i18n/hil.json i18n/oc.json i18n/tg-latn.json i18n/gom.json i18n/tzm.json i18n/mr.json i18n/tt-cyrl.json i18n/zh-tw.json i18n/de-formal.json i18n/sco.json i18n/szl.json i18n/ee.json i18n/udm.json i18n/ka.json i18n/bn.json i18n/tr.json i18n/gv.json i18n/ckb.json i18n/ky.json i18n/ti.json i18n/bg.json i18n/ku-latn.json i18n/haw.json i18n/ps.json i18n/pa.json libs/PF_CreateForm.js i18n/be.json i18n/dsb.json i18n/so.json i18n/yi.json i18n/am.json package-lock.json i18n/ca.json i18n/pam.json i18n/fo.json i18n/vi.json Gruntfile.js i18n/niu.json i18n/sah.json i18n/uz.json libs/PF_maps.js i18n/ro.json i18n/th.json i18n/pdc.json i18n/sq.json i18n/an.json i18n/arz.json i18n/mk.json libs/PF_autogrow.js i18n/fit.json i18n/atj.json i18n/sv.json i18n/pms.json i18n/my.json libs/PF_tree.js i18n/rmc.json i18n/ur.json i18n/ia.json i18n/ga.json i18n/frr.json i18n/bjn.json i18n/tl.json libs/PF_imagePreview.js i18n/pnb.json i18n/kn.json libs/PF_popupform.js i18n/en.json i18n/diq.json i18n/ja.json i18n/rue.json libs/PF_formInput.js i18n/roa-tara.json i18n/wuu.json i18n/zh-hans.json libs/PF_PageSchemas.js i18n/da.json i18n/af.json i18n/zh-hant.json i18n/sc.json i18n/en-ca.json i18n/grc.json i18n/fi.json i18n/sr-ec.json libs/PF_preview.js i18n/bcl.json i18n/qqq.json i18n/nl.json i18n/cs.json i18n/stq.json libs/ext.pf.select2.base.js i18n/os.json libs/PF_spreadsheet.js i18n/gl.json i18n/mhr.json i18n/as.json i18n/uk.json i18n/kw.json i18n/fy.json i18n/min.json i18n/eo.json i18n/ar.json libs/PF_autoedit.js i18n/hr.json i18n/tly.json i18n/nah.json i18n/fr.json i18n/de.json i18n/hu.json libs/ext.pf.select2.combobox.js i18n/vo.json i18n/hi.json -f json
[{"filePath":"/src/repo/Gruntfile.js","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/composer.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/extension.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/af.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/aln.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/am.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/an.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/ar.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/arc.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/arz.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/as.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/ast.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/atj.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/avk.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/az.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/azb.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/ba.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/bar.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/bcc.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/bcl.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/be-tarask.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/be.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/bg.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/bgn.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/bjn.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/bn.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/bo.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/br.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/bs.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/ca.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/ce.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/ckb.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/cs.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/cu.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/cv.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/da.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/de-formal.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/de.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/diq.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/dsb.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/ee.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/el.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/en-ca.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/en.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/eo.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/es.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/et.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/eu.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/fa.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/fi.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/fit.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/fo.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/fr.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/frp.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/frr.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/fy.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/ga.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/gcr.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/gl.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/gom-latn.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/gom.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/got.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/grc.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/gsw.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/gu.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/gv.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/ha.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/hak.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/haw.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/he.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/hi.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/hil.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/hr.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/hsb.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/ht.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/hu.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/hy.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/ia.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/id.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/ig.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/inh.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/io.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/is.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/it.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/ja.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/jbo.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/jv.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/ka.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/kab.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/kea.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/kiu.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/kjp.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/km.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/kn.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/ko.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/krc.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/kri.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/krj.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/ksh.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/ku-latn.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/kw.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/ky.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/lb.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/li.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/lki.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/lt.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/lv.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/mhr.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/min.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/mk.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/ml.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/mn.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/mr.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/ms.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/mt.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/mwl.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/my.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/myv.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/mzn.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/nah.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/nb.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/nds-nl.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/nds.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/ne.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/niu.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/nl.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/nn.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/nso.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/oc.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/om.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/os.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pa.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pam.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pdc.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pfl.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pl.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pms.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pnb.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/ps.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pt-br.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pt.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/qqq.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/rif.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/rmc.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/ro.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/roa-tara.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/ru.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/rue.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sa.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sah.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sc.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sco.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sd.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/shn.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/si.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sk.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/skr-arab.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sl.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/smn.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/so.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sq.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sr-ec.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sr-el.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/stq.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/su.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sv.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sw.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/szl.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/szy.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/ta.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/tcy.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/te.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/tet.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/tg-cyrl.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/tg-latn.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/th.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/ti.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/tk.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/tl.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/tly.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/tr.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/tt-cyrl.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/tyv.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/tzm.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/udm.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/ug-arab.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/uk.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/ur.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/uz.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/vep.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/vi.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/vo.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/wa.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/wuu.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/yi.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/zgh.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/zh-hans.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/zh-hant.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/zh-tw.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/libs/PF_AutocompleteWidget.js","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/libs/PF_CreateClass.js","messages":[{"ruleId":"no-jquery/variable-pattern","severity":1,"message":"jQuery collection names must match the variablePattern","line":7,"column":6,"nodeType":"VariableDeclarator","endLine":7,"endColumn":82},{"ruleId":"no-jquery/no-sizzle","severity":1,"message":"Positional selector extensions are not allowed","line":43,"column":3,"nodeType":"CallExpression","endLine":43,"endColumn":39},{"ruleId":"no-jquery/no-sizzle","severity":1,"message":"Positional selector extensions are not allowed","line":44,"column":3,"nodeType":"CallExpression","endLine":44,"endColumn":44},{"ruleId":"no-jquery/no-sizzle","severity":1,"message":"Positional selector extensions are not allowed","line":47,"column":3,"nodeType":"CallExpression","endLine":47,"endColumn":39},{"ruleId":"no-jquery/no-sizzle","severity":1,"message":"Positional selector extensions are not allowed","line":49,"column":3,"nodeType":"CallExpression","endLine":49,"endColumn":44},{"ruleId":"no-jquery/variable-pattern","severity":1,"message":"jQuery collection names must match the variablePattern","line":83,"column":6,"nodeType":"VariableDeclarator","endLine":83,"endColumn":75}],"errorCount":0,"warningCount":6,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/*global alert*/\n\nvar rowNum = mediaWiki.config.get( '$numStartingRows');\nvar hierarchyPlaceholder =  mediaWiki.msg( 'pf_createtemplate_hierarchystructureplaceholder' );\nfunction createClassAddRow() {\n\trowNum++;\n\tvar newRow = jQuery('#starterRow').clone().css('display', '').removeAttr( 'id' );\n\tvar newHTML = newRow.html().replace(/starter/g, rowNum);\n\tnewRow.html(newHTML);\n\tnewRow.find( \"input[name*='is_hierarchy_']\" ).click( function () {\n\t\ttoggleHierarchyInput(jQuery( this ).closest( \"tr\" ));\n\t} );\n\tnewRow.find( \".hierarchy_structure\" ).blur( function () {\n\t\tsetHierarchyPlaceholder( jQuery( this ) );\n\t} );\n\tnewRow.find( \".hierarchy_structure\" ).click( function () {\n\t\tif (jQuery( this ).attr( 'validInput' ) === undefined || jQuery( this ).attr( 'validInput' ) !== 'true') {\n\t\t\tremoveHierarchyPlaceholder( jQuery( this ) );\n\t\t}\n\t} );\n\tjQuery('#mainTable').append(newRow);\n}\n\nfunction disableFormAndCategoryInputs() {\n\tif (jQuery('#template_multiple').prop('checked')) {\n\t\tjQuery('#form_name').attr('disabled', 'disabled');\n\t\tjQuery('label[for=\"form_name\"]').css('color', 'gray').css('font-style', 'italic');\n\t\tjQuery('#category_name').attr('disabled', 'disabled');\n\t\tjQuery('label[for=\"category_name\"]').css('color', 'gray').css('font-style', 'italic');\n\t\tjQuery('#connecting_property_div').show('fast');\n\t} else {\n\t\tjQuery('#form_name').removeAttr('disabled');\n\t\tjQuery('label[for=\"form_name\"]').css('color', '').css('font-style', '');\n\t\tjQuery('#category_name').removeAttr('disabled');\n\t\tjQuery('label[for=\"category_name\"]').css('color', '').css('font-style', '');\n\t\tjQuery('#connecting_property_div').hide('fast');\n\t}\n}\n\nfunction toggleCargoInputs() {\n\tif (jQuery('#use_cargo').prop('checked')) {\n\t\tjQuery('#cargo_table_input').show('medium');\n\t\t$('td:nth-child(4),th:nth-child(3)').show('medium');\n\t\tjQuery('td:nth-child(6),th:nth-child(5)').show('medium');\n\t} else {\n\t\tjQuery('#cargo_table_input').hide('medium');\n\t\t$('td:nth-child(4),th:nth-child(3)').hide('medium');\n\t\tjQuery(\"input[name*='is_hierarchy_']\").prop('checked', false);\n\t\tjQuery('td:nth-child(6),th:nth-child(5)').hide('medium');\n\t\tjQuery(\"textarea[name*='hierarchy_structure_']\").hide('medium');\n\t\tjQuery(\"input[name*='allowed_values_']\").show('medium');\n\t}\n}\n\nfunction toggleHierarchyInput(containerElement) {\n\tif (containerElement.find( \"input[name*='is_hierarchy_']\" ).prop('checked')) {\n\t\tcontainerElement.find( \"input[name*='allowed_values_']\" ).hide('medium');\n\t\tcontainerElement.find( \"textarea[name*='hierarchy_structure_']\" ).show('medium');\n\t\tif (containerElement.find( \"textarea[name*='hierarchy_structure_']\" ).val() === \"\") {\n\t\t\tsetHierarchyPlaceholder( containerElement.find( \"textarea[name*='hierarchy_structure_']\" ) );\n\t\t}\n\t} else {\n\t\tcontainerElement.find( \"textarea[name*='hierarchy_structure_']\" ).hide('medium');\n\t\tcontainerElement.find( \"input[name*='allowed_values_']\" ).show('medium');\n\t}\n}\n\nfunction setHierarchyPlaceholder( textareaElement ) {\n\tif (textareaElement.val() === \"\") {\n\t\ttextareaElement.val( hierarchyPlaceholder );\n\t\ttextareaElement.css( 'color', 'gray' );\n\t\ttextareaElement.attr( 'validInput', 'false' );\n\t}\n}\n\nfunction removeHierarchyPlaceholder( textareaElement ) {\n\ttextareaElement.val( '' );\n\ttextareaElement.css( 'color', 'black' );\n\ttextareaElement.attr( 'validInput', 'true' );\n}\n\nfunction validateHierarchyStructure() {\n\tvar hierarchyTextAreas = jQuery(\"textarea[name*='hierarchy_structure_']\");\n\tfor (var i = 0; i < hierarchyTextAreas.length; i++) {\n\t\tvar structure = hierarchyTextAreas[i].value.trim();\n\t\tif (structure !== \"\") {\n\t\t\tvar nodes = structure.split(/\\n/);\n\t\t\tvar matches = nodes[0].match(/^([*]*)[^*]*/i);\n\t\t\tif (matches[1].length !== 1) {\n\t\t\t\talert(\"Error: The first entry of hierarchy values should start with exactly one \\'*\\'; the entry \\\"\" +\n\t\t\t\t\tnodes[0] + \"\\\" has \" + matches[1].length + \" \\'*\\'\");\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tvar level = 0;\n\t\t\tfor (var j = 0; j < nodes.length; j++) {\n\t\t\t\tmatches = nodes[j].match(/^([*]*)( *)(.*)/i);\n\t\t\t\tif (matches[1].length < 1) {\n\t\t\t\t\talert(\"Error: Each entry of hierarchy values should start with at least one \\'*\\'; the entry \\\"\" +\n\t\t\t\t\t\tnodes[j] + \"\\\" starts with none\");\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tif (matches[1].length - level > 1) {\n\t\t\t\t\talert(\"Error: Level or count of '*' in hierarchy values should increase by no more than 1 at a time, so the entry \\\"\" +\n\t\t\t\t\t\tnodes[j] + \"\\\" should have \" + ( level + 1 ) + \" or fewer '*'\");\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tlevel = matches[1].length;\n\t\t\t\tif (matches[3].length === 0) {\n\t\t\t\t\talert(\"Error: An entry in hierarchy values cannot be empty.\");\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn true;\n}\n\njQuery( document ).ready( function () {\n\tjQuery( \".disableFormAndCategoryInputs\" ).click( function () {\n\t\tdisableFormAndCategoryInputs();\n\t} );\n\tjQuery( \"#use_cargo\" ).click( function() {\n\t\ttoggleCargoInputs();\n\t} );\n\tjQuery( \".createClassAddRow\" ).click( function () {\n\t\tcreateClassAddRow();\n\t} );\n\tjQuery( \"input[name*='is_hierarchy_']\" ).click( function () {\n\t\ttoggleHierarchyInput(jQuery( this ).closest( \"tr\" ));\n\t} );\n\tjQuery( \".hierarchy_structure\" ).blur( function () {\n\t\tsetHierarchyPlaceholder( jQuery( this ) );\n\t} );\n\tjQuery( \".hierarchy_structure\" ).click( function () {\n\t\tif (jQuery( this ).attr( 'validInput' ) === undefined || jQuery( this ).attr( 'validInput' ) !== 'true') {\n\t\t\tremoveHierarchyPlaceholder( jQuery( this ) );\n\t\t}\n\t} );\n\tjQuery( '#createClassForm' ).submit( function () {\n\t\treturn validateHierarchyStructure();\n\t} );\n} );\n","usedDeprecatedRules":[]},{"filePath":"/src/repo/libs/PF_CreateForm.js","messages":[{"ruleId":"no-jquery/variable-pattern","severity":1,"message":"jQuery collection names must match the variablePattern","line":23,"column":8,"nodeType":"VariableDeclarator","endLine":23,"endColumn":120}],"errorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"jQuery.fn.displayInputParams = function () {\n\tvar inputParamsDiv = this.closest( '.formField' ).find( '.otherInputParams' );\n\tjQuery.ajax( {\n\t\turl: window.location.href +\n\t\t\t( ( window.location.href.indexOf('?') === -1 ) ? '?' : '&' ) +\n\t\t\t'showinputtypeoptions=' + encodeURIComponent( this.val() ) +\n\t\t\t'&formfield=' + encodeURIComponent( this.attr( 'formfieldid' ) ),\n\t\tcontext: document.body,\n\t\tsuccess: function ( data ){\n\t\t\tinputParamsDiv.html( data );\n\t\t}\n\t});\n};\n\njQuery(document).ready( function () {\n\tjQuery( '.inputTypeSelector' ).change( function () {\n\t\tjQuery( this ).displayInputParams();\n\t} );\n\tjQuery( '#addsection' ).click( function( event ) {\n\t\tif( jQuery( '#sectionname' ).val() === '' ) {\n\t\t\tevent.preventDefault();\n\t\t\tjQuery( '#section_error' ).remove();\n\t\t\tvar errorSpan = jQuery( '<span class=\"error\" id=\"section_error\"></span>' ).text( mediaWiki.msg( 'pf_blank_error' ) );\n\t\t\tjQuery( '<div/>' ).append( errorSpan ).appendTo( '#sectionerror' );\n\t\t}\n\t} );\n} );\n\njQuery( \"input,select\" ).keypress( function ( event ) {\n\t// Don't submit the form if enter is pressed on a text input box or a select.\n\treturn event.keyCode !== 13;\n} );\n","usedDeprecatedRules":[]},{"filePath":"/src/repo/libs/PF_CreateProperty.js","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/libs/PF_CreateTemplate.js","messages":[{"ruleId":"no-jquery/variable-pattern","severity":1,"message":"jQuery collection names must match the variablePattern","line":21,"column":6,"nodeType":"VariableDeclarator","endLine":21,"endColumn":90}],"errorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"function toggleCargoInputs() {\n\tif (jQuery('#use_cargo').prop('checked')) {\n\t\tjQuery('#cargo_table_input').show('medium');\n\t\tjQuery('label.cargo_field_type').show('medium');\n\t\tjQuery('.allowed_values_input').show('medium');\n\t\tjQuery('.is_hierarchy').parent().show('medium');\n\t} else {\n\t\tjQuery('#cargo_table_input').hide('medium');\n\t\tjQuery('label.cargo_field_type').hide('medium');\n\t\tjQuery(\"input[name*='is_hierarchy_']\").prop('checked', false);\n\t\tjQuery('.is_hierarchy').parent().hide('medium');\n\t\tjQuery('.hierarchy_structure_input').hide('medium');\n\t\tjQuery('.allowed_values_input').show('medium');\n\t}\n}\n\nvar fieldNum = 1;\nvar hierarchyPlaceholder =  mediaWiki.msg( 'pf_createtemplate_hierarchystructureplaceholder' );\nfunction createTemplateAddField() {\n\tfieldNum++;\n\tvar newField = jQuery( '#starterField' ).clone().css( 'display', '' ).removeAttr( 'id' );\n\tvar newHTML = newField.html().replace(/starter/g, fieldNum);\n\tnewField.html( newHTML );\n\tnewField.find( \".deleteField\" ).click( function () {\n\t\t// Remove the encompassing div for this instance.\n\t\tjQuery( this ).closest( \".fieldBox\" )\n\t\t\t.fadeOut( 'fast', function () {\n\t\t\t\tjQuery(this).remove();\n\t\t\t} );\n\t} );\n\tnewField.find( \".isList\" ).click( function () {\n\t\tjQuery( this ).closest( \".fieldBox\" ).find( \".delimiter\" ).toggle();\n\t} );\n\tnewField.find( \".is_hierarchy\" ).click( function () {\n\t\ttoggleHierarchyInput(jQuery( this ).closest( \".fieldBox\" ));\n\t} );\n\tnewField.find( \".hierarchy_structure\" ).click( function () {\n\t\tif (jQuery( this ).attr( 'validInput' ) === undefined || jQuery( this ).attr( 'validInput' ) !== 'true') {\n\t\t\tremoveHierarchyPlaceholder( jQuery( this ) );\n\t\t}\n\t} );\n\tnewField.find( \".hierarchy_structure\" ).blur( function () {\n\t\tsetHierarchyPlaceholder( jQuery( this ) );\n\t} );\n\tvar combobox = new pf.select2.combobox();\n\tcombobox.apply( $( newField.find( '.pfComboBox' ) ) );\n\tjQuery( '#fieldsList' ).append( newField );\n}\n\nfunction validateCreateTemplateForm() {\n\tvar blankTemplateName = ( jQuery( '#template_name' ).val() === '' );\n\tvar blankCargoTableName = ( jQuery( '#use_cargo' ).is(':checked') &&\n\t\tjQuery( '#cargo_table' ).val() === '' );\n\tif ( blankTemplateName || blankCargoTableName ) {\n\t\tscroll( 0, 0 );\n\t\tif ( blankTemplateName ) {\n\t\t\tjQuery( '#template_name_p' ).append( ' <span class=\"error\">' + mediaWiki.msg( 'pf_blank_error' ) + '</span>' );\n\t\t}\n\t\tif ( blankCargoTableName ) {\n\t\t\tjQuery( '#cargo_table_input' ).append( ' <span class=\"error\">' + mediaWiki.msg( 'pf_blank_error' ) + '</span>' );\n\t\t}\n\t\treturn false;\n\t} else {\n\t\treturn true;\n\t}\n}\n\nfunction toggleHierarchyInput(containerElement) {\n\tif (containerElement.find( \"input[name*='is_hierarchy_']\" ).prop('checked')) {\n\t\tcontainerElement.find( \".allowed_values_input\" ).hide('medium');\n\t\tcontainerElement.find( \".hierarchy_structure_input\" ).show('medium');\n\t\tif (containerElement.find( \"textarea[name*='hierarchy_structure_']\" ).val() === \"\") {\n\t\t\tsetHierarchyPlaceholder( containerElement.find( \"textarea[name*='hierarchy_structure_']\" ) );\n\t\t}\n\t} else {\n\t\tcontainerElement.find( \".hierarchy_structure_input\" ).hide('medium');\n\t\tcontainerElement.find( \".allowed_values_input\" ).show('medium');\n\t}\n}\n\nfunction setHierarchyPlaceholder( textareaElement ) {\n\tif (textareaElement.val() === \"\") {\n\t\ttextareaElement.val( hierarchyPlaceholder );\n\t\ttextareaElement.css( 'color', 'gray' );\n\t\ttextareaElement.attr( 'validInput', 'false' );\n\t}\n}\n\nfunction removeHierarchyPlaceholder( textareaElement ) {\n\ttextareaElement.val( '' );\n\ttextareaElement.css( 'color', 'black' );\n\ttextareaElement.attr( 'validInput', 'true' );\n}\n\njQuery( document ).ready( function () {\n\tjQuery( \"#use_cargo\" ).click( function() {\n\t\ttoggleCargoInputs();\n\t} );\n\tjQuery( \".createTemplateAddField\" ).click( function () {\n\t\tcreateTemplateAddField();\n\t} );\n\tjQuery( \".deleteField\" ).click( function () {\n\t\t// Remove the encompassing div for this instance.\n\t\tjQuery( this ).closest( \".fieldBox\" )\n\t\t\t.fadeOut( 'fast', function () {\n\t\t\t\tjQuery( this ).remove();\n\t\t\t} );\n\t} );\n\tjQuery( \".isList\" ).click( function () {\n\t\tjQuery( this ).closest( \".fieldBox\" ).find( \".delimiter\" ).toggle();\n\t} );\n\tjQuery( \".is_hierarchy\" ).click( function () {\n\t\ttoggleHierarchyInput( jQuery( this ).closest( \".fieldBox\" ) );\n\t} );\n\tjQuery( \".hierarchy_structure\" ).click( function () {\n\t\tif (jQuery( this ).attr( 'validInput' ) === undefined || jQuery( this ).attr( 'validInput' ) !== 'true') {\n\t\t\tremoveHierarchyPlaceholder( jQuery( this ) );\n\t\t}\n\t} );\n\tjQuery( \".hierarchy_structure\" ).blur( function () {\n\t\tsetHierarchyPlaceholder( jQuery( this ) );\n\t} );\n\tjQuery( '#createTemplateForm' ).submit( function () {\n\t\treturn validateCreateTemplateForm();\n\t} );\n} );\n","usedDeprecatedRules":[]},{"filePath":"/src/repo/libs/PF_FullCalendar.js","messages":[{"ruleId":"no-jquery/no-sizzle","severity":1,"message":"Selector extensions are not allowed","line":192,"column":5,"nodeType":"CallExpression","endLine":192,"endColumn":18},{"ruleId":"no-jquery/no-sizzle","severity":1,"message":"Selector extensions are not allowed","line":194,"column":7,"nodeType":"CallExpression","endLine":194,"endColumn":48},{"ruleId":"no-jquery/no-sizzle","severity":1,"message":"Selector extensions are not allowed","line":195,"column":7,"nodeType":"CallExpression","endLine":195,"endColumn":49},{"ruleId":"no-jquery/no-sizzle","severity":1,"message":"Selector extensions are not allowed","line":196,"column":7,"nodeType":"CallExpression","endLine":196,"endColumn":50},{"ruleId":"no-jquery/no-sizzle","severity":1,"message":"Selector extensions are not allowed","line":204,"column":5,"nodeType":"CallExpression","endLine":204,"endColumn":18},{"ruleId":"no-jquery/no-sizzle","severity":1,"message":"Selector extensions are not allowed","line":206,"column":7,"nodeType":"CallExpression","endLine":206,"endColumn":53},{"ruleId":"no-jquery/no-sizzle","severity":1,"message":"Selector extensions are not allowed","line":207,"column":7,"nodeType":"CallExpression","endLine":207,"endColumn":51},{"ruleId":"no-jquery/no-sizzle","severity":1,"message":"Selector extensions are not allowed","line":208,"column":7,"nodeType":"CallExpression","endLine":208,"endColumn":54},{"ruleId":"no-jquery/no-sizzle","severity":1,"message":"Selector extensions are not allowed","line":209,"column":7,"nodeType":"CallExpression","endLine":209,"endColumn":52},{"ruleId":"no-jquery/no-sizzle","severity":1,"message":"Selector extensions are not allowed","line":210,"column":7,"nodeType":"CallExpression","endLine":210,"endColumn":55},{"ruleId":"no-jquery/no-sizzle","severity":1,"message":"Selector extensions are not allowed","line":211,"column":7,"nodeType":"CallExpression","endLine":211,"endColumn":53},{"ruleId":"no-jquery/no-sizzle","severity":1,"message":"Selector extensions are not allowed","line":217,"column":16,"nodeType":"CallExpression","endLine":217,"endColumn":63},{"ruleId":"no-jquery/no-sizzle","severity":1,"message":"Selector extensions are not allowed","line":218,"column":44,"nodeType":"CallExpression","endLine":218,"endColumn":92},{"ruleId":"no-jquery/no-sizzle","severity":1,"message":"Selector extensions are not allowed","line":219,"column":18,"nodeType":"CallExpression","endLine":219,"endColumn":64},{"ruleId":"no-jquery/no-sizzle","severity":1,"message":"Selector extensions are not allowed","line":220,"column":16,"nodeType":"CallExpression","endLine":220,"endColumn":61},{"ruleId":"no-jquery/no-sizzle","severity":1,"message":"Selector extensions are not allowed","line":221,"column":44,"nodeType":"CallExpression","endLine":221,"endColumn":90},{"ruleId":"no-jquery/no-sizzle","severity":1,"message":"Selector extensions are not allowed","line":222,"column":18,"nodeType":"CallExpression","endLine":222,"endColumn":62},{"ruleId":"no-jquery/no-sizzle","severity":1,"message":"Selector extensions are not allowed","line":224,"column":16,"nodeType":"CallExpression","endLine":224,"endColumn":63},{"ruleId":"no-jquery/no-sizzle","severity":1,"message":"Selector extensions are not allowed","line":225,"column":8,"nodeType":"CallExpression","endLine":225,"endColumn":56},{"ruleId":"no-jquery/no-sizzle","severity":1,"message":"Selector extensions are not allowed","line":226,"column":18,"nodeType":"CallExpression","endLine":226,"endColumn":64},{"ruleId":"no-jquery/no-sizzle","severity":1,"message":"Selector extensions are not allowed","line":227,"column":16,"nodeType":"CallExpression","endLine":227,"endColumn":61},{"ruleId":"no-jquery/no-sizzle","severity":1,"message":"Selector extensions are not allowed","line":228,"column":8,"nodeType":"CallExpression","endLine":228,"endColumn":54},{"ruleId":"no-jquery/no-sizzle","severity":1,"message":"Selector extensions are not allowed","line":229,"column":18,"nodeType":"CallExpression","endLine":229,"endColumn":62},{"ruleId":"no-jquery/no-sizzle","severity":1,"message":"Selector extensions are not allowed","line":231,"column":11,"nodeType":"CallExpression","endLine":231,"endColumn":58},{"ruleId":"no-jquery/no-sizzle","severity":1,"message":"Selector extensions are not allowed","line":232,"column":9,"nodeType":"CallExpression","endLine":232,"endColumn":58},{"ruleId":"no-jquery/no-sizzle","severity":1,"message":"Selector extensions are not allowed","line":233,"column":9,"nodeType":"CallExpression","endLine":233,"endColumn":58},{"ruleId":"no-jquery/no-sizzle","severity":1,"message":"Selector extensions are not allowed","line":234,"column":9,"nodeType":"CallExpression","endLine":234,"endColumn":54},{"ruleId":"no-jquery/no-sizzle","severity":1,"message":"Selector extensions are not allowed","line":235,"column":9,"nodeType":"CallExpression","endLine":235,"endColumn":56},{"ruleId":"no-jquery/no-sizzle","severity":1,"message":"Selector extensions are not allowed","line":236,"column":9,"nodeType":"CallExpression","endLine":236,"endColumn":56},{"ruleId":"no-jquery/no-sizzle","severity":1,"message":"Selector extensions are not allowed","line":237,"column":23,"nodeType":"CallExpression","endLine":237,"endColumn":70},{"ruleId":"no-jquery/no-sizzle","severity":1,"message":"Selector extensions are not allowed","line":238,"column":11,"nodeType":"CallExpression","endLine":238,"endColumn":60},{"ruleId":"no-jquery/no-sizzle","severity":1,"message":"Selector extensions are not allowed","line":239,"column":11,"nodeType":"CallExpression","endLine":239,"endColumn":60},{"ruleId":"no-jquery/no-sizzle","severity":1,"message":"Selector extensions are not allowed","line":240,"column":23,"nodeType":"CallExpression","endLine":240,"endColumn":68},{"ruleId":"no-jquery/no-sizzle","severity":1,"message":"Selector extensions are not allowed","line":241,"column":11,"nodeType":"CallExpression","endLine":241,"endColumn":58},{"ruleId":"no-jquery/no-sizzle","severity":1,"message":"Selector extensions are not allowed","line":242,"column":11,"nodeType":"CallExpression","endLine":242,"endColumn":58},{"ruleId":"no-shadow","severity":1,"message":"'dateEntry' is already declared in the upper scope on line 61 column 4.","line":268,"column":13,"nodeType":"Identifier","messageId":"noShadow","endLine":268,"endColumn":22},{"ruleId":"no-shadow","severity":1,"message":"'monthIndex' is already declared in the upper scope on line 63 column 58.","line":273,"column":11,"nodeType":"Identifier","messageId":"noShadow","endLine":273,"endColumn":21},{"ruleId":"no-jquery/no-sizzle","severity":1,"message":"Selector extensions are not allowed","line":610,"column":5,"nodeType":"CallExpression","endLine":610,"endColumn":16},{"ruleId":"no-jquery/no-class-state","severity":1,"message":"Where possible, maintain application state in JS to avoid slower DOM queries","line":612,"column":11,"nodeType":"CallExpression","endLine":612,"endColumn":43},{"ruleId":"no-jquery/no-sizzle","severity":1,"message":"Selector extensions are not allowed","line":641,"column":6,"nodeType":"CallExpression","endLine":641,"endColumn":47},{"ruleId":"no-jquery/no-sizzle","severity":1,"message":"Selector extensions are not allowed","line":642,"column":6,"nodeType":"CallExpression","endLine":642,"endColumn":48},{"ruleId":"no-jquery/no-sizzle","severity":1,"message":"Selector extensions are not allowed","line":644,"column":7,"nodeType":"CallExpression","endLine":644,"endColumn":50},{"ruleId":"no-jquery/no-sizzle","severity":1,"message":"Selector extensions are not allowed","line":646,"column":7,"nodeType":"CallExpression","endLine":646,"endColumn":50},{"ruleId":"no-jquery/no-sizzle","severity":1,"message":"Selector extensions are not allowed","line":673,"column":6,"nodeType":"CallExpression","endLine":673,"endColumn":52},{"ruleId":"no-jquery/no-sizzle","severity":1,"message":"Selector extensions are not allowed","line":674,"column":6,"nodeType":"CallExpression","endLine":674,"endColumn":53},{"ruleId":"no-jquery/no-sizzle","severity":1,"message":"Selector extensions are not allowed","line":676,"column":7,"nodeType":"CallExpression","endLine":676,"endColumn":55},{"ruleId":"no-jquery/no-sizzle","severity":1,"message":"Selector extensions are not allowed","line":678,"column":7,"nodeType":"CallExpression","endLine":678,"endColumn":55},{"ruleId":"no-jquery/no-sizzle","severity":1,"message":"Selector extensions are not allowed","line":680,"column":6,"nodeType":"CallExpression","endLine":680,"endColumn":50},{"ruleId":"no-jquery/no-sizzle","severity":1,"message":"Selector extensions are not allowed","line":681,"column":6,"nodeType":"CallExpression","endLine":681,"endColumn":51},{"ruleId":"no-jquery/no-sizzle","severity":1,"message":"Selector extensions are not allowed","line":683,"column":7,"nodeType":"CallExpression","endLine":683,"endColumn":53},{"ruleId":"no-jquery/no-sizzle","severity":1,"message":"Selector extensions are not allowed","line":685,"column":7,"nodeType":"CallExpression","endLine":685,"endColumn":53},{"ruleId":"no-jquery/no-sizzle","severity":1,"message":"Selector extensions are not allowed","line":746,"column":9,"nodeType":"CallExpression","endLine":746,"endColumn":37},{"ruleId":"no-jquery/no-sizzle","severity":1,"message":"Selector extensions are not allowed","line":748,"column":9,"nodeType":"CallExpression","endLine":748,"endColumn":37},{"ruleId":"no-jquery/no-sizzle","severity":1,"message":"Selector extensions are not allowed","line":751,"column":8,"nodeType":"CallExpression","endLine":751,"endColumn":36},{"ruleId":"no-jquery/no-sizzle","severity":1,"message":"Selector extensions are not allowed","line":754,"column":7,"nodeType":"CallExpression","endLine":754,"endColumn":35},{"ruleId":"no-jquery/no-sizzle","severity":1,"message":"Selector extensions are not allowed","line":758,"column":9,"nodeType":"CallExpression","endLine":758,"endColumn":59},{"ruleId":"no-jquery/no-sizzle","severity":1,"message":"Selector extensions are not allowed","line":764,"column":25,"nodeType":"CallExpression","endLine":764,"endColumn":54},{"ruleId":"no-jquery/no-sizzle","severity":1,"message":"Selector extensions are not allowed","line":766,"column":9,"nodeType":"CallExpression","endLine":766,"endColumn":38},{"ruleId":"no-jquery/no-sizzle","severity":1,"message":"Selector extensions are not allowed","line":772,"column":11,"nodeType":"CallExpression","endLine":772,"endColumn":59},{"ruleId":"no-jquery/no-sizzle","severity":1,"message":"Selector extensions are not allowed","line":775,"column":10,"nodeType":"CallExpression","endLine":775,"endColumn":60},{"ruleId":"no-jquery/no-sizzle","severity":1,"message":"Selector extensions are not allowed","line":791,"column":8,"nodeType":"CallExpression","endLine":791,"endColumn":36},{"ruleId":"no-jquery/no-sizzle","severity":1,"message":"Selector extensions are not allowed","line":813,"column":5,"nodeType":"CallExpression","endLine":813,"endColumn":16},{"ruleId":"no-jquery/no-class-state","severity":1,"message":"Where possible, maintain application state in JS to avoid slower DOM queries","line":815,"column":11,"nodeType":"CallExpression","endLine":815,"endColumn":43},{"ruleId":"no-shadow","severity":1,"message":"'ampm24h' is already declared in the upper scope on line 60 column 45.","line":1059,"column":8,"nodeType":"Identifier","messageId":"noShadow","endLine":1059,"endColumn":15}],"errorCount":0,"warningCount":64,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/**\n * Code to integrate the FullCalendar JavaScript library into Page Forms.\n *\n * @author Priyanshu Varshney\n */\n/* global moment */\n( function ( $, mw, pf ) {\n\t'use strict';\n\n\t$( '.pfFullCalendarJS' ).each( function() {\n\n\t\t$( '#fullCalendarLoading' ).css(\"display\", \"block\");\n\n\t\t// This counter is used to assign unique ids to the calendar events.\n\t\t// If the event is deleted, we lose that unique id and can't be used gain.\n\t\tvar counter = 0;\n\t\tvar monthNames = mw.config.get('monthMessages');\n\t\t// Stuff from PF_FormPrinter.php\n\t\tvar calendarParams = mw.config.get( 'wgPageFormsCalendarParams' );\n\t\tvar calendarGridValues = mw.config.get( 'wgPageFormsCalendarValues' );\n\t\tvar calendarHTML = mw.config.get('wgPageFormsCalendarHTML');\n\n\t\tvar $fcDiv = $( this );\n\t\tvar calendarId = $fcDiv.attr( 'id' );\n\t\tvar templateName = $fcDiv.attr( 'template-name' );\n\t\tvar eventTitleField = $fcDiv.attr( 'title-field' );\n\t\tvar eventDateField = $fcDiv.attr( 'event-date-field' );\n\t\tvar eventStartDateField = $fcDiv.attr( 'event-start-date-field' );\n\t\tvar eventEndDateField = $fcDiv.attr( 'event-end-date-field' );\n\t\tvar flagOneDayEvent = true;\n\t\tvar pageLoaded = false;\n\t\tvar isEventEndDateTime = false;\n\t\tvar isEventStartTime = false;\n\n\t\tif( eventDateField === undefined ) {\n\n\t\t\tflagOneDayEvent = false;\n\t\t}\n\n\t\tvar fieldType=[];\n\t\tvar englishMonthNames = [ 'January', 'February',\n\t\t\t'March', 'April', 'May', 'June', 'July',\n\t\t\t'August', 'September', 'October', 'November',\n\t\t\t'December' ];\n\n\t\t// From here the game begins - getting the form HTML to be used as the popup form -\n\t\t// for the calendar interface\n\t\tvar formHtml = calendarHTML[templateName];\n\t\tvar popup = '<form id=\"popupForm\">';\n\t\tvar deleteButton = '<button id=\"event_delete\" class = \"delete-event-button\" name=\"data\" type=\"button\" >' + mw.msg('pf-calendar-deleteevent') + '</button>';\n\t\tvar createButton = '<button id=\"form_submit\" class = \"submit-event-button\" name=\"data\" type=\"button\" >' + mw.msg('pf-calendar-createevent') + '</button>';\n\t\tvar updateButton = '<button id=\"form_submit\" class = \"submit-event-button\" name=\"data\" type=\"button\" >' + mw.msg('pf-calendar-updateevent') + '</button>';\n\t\tpopup += formHtml;\n\t\tvar createEventPopup = popup + createButton;\n\t\tvar updateEventPopup = popup + updateButton;\n\t\tvar suitableForCalendar = true;\n\t\tvar calendarIdSelector = '#' + calendarId;\n\t\tvar events = [], data = [], dateFields = [], dateStartFields = [], dateEndFields = [], eventsNoDate = [], checkboxesNum = [];\n\t\tvar segment, dateSegment, yearFC, monthFC, dateFC,\n\t\t\ttimeSegment, hourFC, minuteFC, secondFC, ampm24h,\n\t\t\tdateEntry, monthEntry, yearEntry, hourEntry,\n\t\t\tminuteEntry, secondEntry, ampm24hEntry, regularEntry,\n\t\t\teventData, preEventData, currParam, temp, titleIndex, monthIndex,\n\t\t\teventDate, eventDateDay,eventDateYear, eventDateMonth, eventDateHour,\n\t\t\teventStartDate, eventEndDate , eventDateMinute, eventDateSecond, eventDateAmPm24h, reserveDate, idForm,\n\t\t\teventStartDateDay, eventStartDateYear, eventStartDateMonth, eventStartDateHour,\n\t\t\teventStartDateMinute, eventStartDateSecond, eventStartDateAmPm24;\n\t\tvar currentEndDateMoment;\n\t\tvar checkboxesValues = [];\n\t\tvar listboxValues = [];\n\t\tvar tokensProto, comboboxProto, result, eventTemplateName, parameterName, eventContents, allEvents,\n\t\t\tdateElement, nextDate, formatted, i, j;\n\n\t\tvar autoFillDay = templateName + '[cf][' + eventDateField + '][day]',\n\t\t\tautoFillMonth = templateName + '[cf][' + eventDateField + '][month]',\n\t\t\tautoFillYear = templateName + '[cf][' + eventDateField + '][year]',\n\t\t\tautoFillHour = templateName+'[cf]['+ eventDateField + '][hour]',\n\t\t\tautoFillMinute = templateName+'[cf]['+ eventDateField + '][minute]',\n\t\t\tautoFillSecond = templateName+'[cf]['+ eventDateField + '][second]',\n\t\t\tautoFillAmPm24h = templateName+'[cf]['+ eventDateField + '][ampm24h]',\n\t\t\tautoFillStartDay = templateName + '[cf][' + eventStartDateField + '][day]',\n\t\t\tautoFillStartMonth = templateName + '[cf][' + eventStartDateField + '][month]',\n\t\t\tautoFillStartYear = templateName + '[cf][' + eventStartDateField + '][year]',\n\t\t\tautoFillEndDay = templateName + '[cf][' + eventEndDateField + '][day]',\n\t\t\tautoFillEndMonth = templateName + '[cf][' + eventEndDateField + '][month]',\n\t\t\tautoFillEndYear = templateName + '[cf][' + eventEndDateField + '][year]',\n\t\t\tautoFillStartHour = templateName+'[cf]['+ eventStartDateField + '][hour]',\n\t\t\tautoFillStartMinute = templateName+'[cf]['+ eventStartDateField + '][minute]',\n\t\t\tautoFillStartSecond = templateName+'[cf]['+ eventStartDateField + '][second]',\n\t\t\tautoFillStartAmPm24h = templateName+'[cf]['+ eventStartDateField + '][ampm24h]',\n\t\t\tautoFillEndHour = templateName+'[cf]['+ eventEndDateField + '][hour]',\n\t\t\tautoFillEndMinute = templateName+'[cf]['+ eventEndDateField + '][minute]',\n\t\t\tautoFillEndSecond = templateName+'[cf]['+ eventEndDateField + '][second]',\n\t\t\tautoFillEndAmPm24h = templateName+'[cf]['+ eventEndDateField + '][ampm24h]';\n\t\tfor( i = 0; i<calendarParams[templateName].length; i++ ) {\n\t\t\tfieldType[calendarParams[templateName][i].name]=calendarParams[templateName][i].type;\n\t\t}\n\n\t\tif( fieldType[eventStartDateField] === \"datetime\" || fieldType[eventDateField] === \"datetime\" ) {\n\t\t\tisEventStartTime = true;\n\t\t}\n\n\t\tif( fieldType[eventEndDateField] === \"datetime\") {\n\t\t\tisEventEndDateTime = true;\n\t\t}\n\n\t\tfunction saveData( flag ) {\n\t\t\tif(flag === 'single' ) {\n\t\t\t\tdata = $('#popupForm').serializeArray();\n\t\t\t\ttitleIndex = -1;\n\t\t\t\tdateFields = [];\n\t\t\t\teventDate = '';\n\t\t\t\tfor(j=0;j<data.length;j++){\n\t\t\t\t\tresult = data[j].name.split(\"[\");\n\t\t\t\t\teventTemplateName = result[0];\n\t\t\t\t\tparameterName = result[2].split(\"]\")[0];\n\t\t\t\t\tif( parameterName === eventTitleField ) {\n\t\t\t\t\t\tif( titleIndex === -1 ) {\n\t\t\t\t\t\t\ttitleIndex = j;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if ( parameterName === eventDateField ) {\n\t\t\t\t\t\tdateFields.push({'name':data[j].name,'value':data[j].value});\n\t\t\t\t\t\tif( data[j].name.includes('second') ) {\n\t\t\t\t\t\t\tif( data[j].value === '' ) {\n\t\t\t\t\t\t\t\tdata[j].value = '59';\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else if ( data[j].name.includes('hour') ) {\n\t\t\t\t\t\t\tif( data[j].value === '' ) {\n\t\t\t\t\t\t\t\tdata[j].value = '23';\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else if ( data[j].name.includes('minute') ) {\n\t\t\t\t\t\t\tif( data[j].value === '' ) {\n\t\t\t\t\t\t\t\tdata[j].value = '59';\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\t\t\t} else if ( flag === 'multiple' ) {\n\t\t\t\tdata = $('#popupForm').serializeArray();\n\t\t\t\ttitleIndex = -1;\n\t\t\t\tdateStartFields = [];\n\t\t\t\tdateEndFields = [];\n\t\t\t\teventStartDate = '';\n\t\t\t\teventEndDate = '';\n\t\t\t\tfor(j=0;j<data.length;j++) {\n\t\t\t\t\tresult = data[j].name.split(\"[\");\n\t\t\t\t\teventTemplateName = result[0];\n\t\t\t\t\tparameterName = result[2].split(\"]\")[0];\n\n\t\t\t\t\tif( parameterName === eventTitleField ) {\n\t\t\t\t\t\tif( titleIndex === -1 ) {\n\t\t\t\t\t\t\ttitleIndex = j;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if ( parameterName === eventStartDateField ) {\n\t\t\t\t\t\tdateStartFields.push({'name':data[j].name,'value':data[j].value});\n\t\t\t\t\t\tif( data[j].name.includes('second') ) {\n\t\t\t\t\t\t\tif( data[j].value === '' ) {\n\t\t\t\t\t\t\t\tdata[j].value = '00';\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else if ( data[j].name.includes('hour') ) {\n\t\t\t\t\t\t\tif( data[j].value === '' ) {\n\t\t\t\t\t\t\t\tdata[j].value = '00';\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else if ( data[j].name.includes('minute') ) {\n\t\t\t\t\t\t\tif( data[j].value === '' ) {\n\t\t\t\t\t\t\t\tdata[j].value = '00';\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if ( parameterName === eventEndDateField ) {\n\t\t\t\t\t\tdateEndFields.push({'name':data[j].name,'value':data[j].value});\n\t\t\t\t\t\tif( data[j].name.includes('second') ) {\n\t\t\t\t\t\t\tif( data[j].value === '' ) {\n\t\t\t\t\t\t\t\tdata[j].value = '59';\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else if ( data[j].name.includes('hour') ) {\n\t\t\t\t\t\t\tif( data[j].value === '' ) {\n\t\t\t\t\t\t\t\tdata[j].value = '23';\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else if ( data[j].name.includes('minute') ) {\n\t\t\t\t\t\t\tif( data[j].value === '' ) {\n\t\t\t\t\t\t\t\tdata[j].value = '59';\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\t\t\t}\n\t\t}\n\t\t// Checks if the date field parts are empty or not - if not,\n\t\t// don't allow the user to submit\n\t\tfunction checkAndSave( flag ) {\n\t\t\tif( flag === 'single' ) {\n\t\t\t\t$( ':input' ).on('keyup',function() {\n\t\t\t\t\tif(\n\t\t\t\t\t\t$( ':input[name=\"' + autoFillDay + '\"]' ).val() === '' ||\n\t\t\t\t\t\t$( ':input[name=\"' + autoFillYear + '\"]' ).val() === '' ||\n\t\t\t\t\t\t$( ':input[name=\"' + autoFillMonth + '\"]' ).val() === ''\n\t\t\t\t\t) {\n\t\t\t\t\t\t$(\"#form_submit\").attr(\"disabled\", \"disabled\").css({'background-color':'#c8ccd1','color':'#fff'});\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$(\"#form_submit\").removeAttr(\"disabled\").css({'background-color': '#3366CC','color': 'white'});\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t} else if ( flag === 'multiple' ) {\n\t\t\t\t$( ':input' ).on('keyup',function() {\n\t\t\t\t\tif(\n\t\t\t\t\t\t$( ':input[name=\"' + autoFillStartDay + '\"]' ).val() === '' ||\n\t\t\t\t\t\t$( ':input[name=\"' + autoFillEndDay + '\"]' ).val() === '' ||\n\t\t\t\t\t\t$( ':input[name=\"' + autoFillStartYear + '\"]' ).val() === '' ||\n\t\t\t\t\t\t$( ':input[name=\"' + autoFillEndYear + '\"]' ).val() === '' ||\n\t\t\t\t\t\t$( ':input[name=\"' + autoFillStartMonth + '\"]' ).val() === '' ||\n\t\t\t\t\t\t$( ':input[name=\"' + autoFillEndMonth + '\"]' ).val() === ''\n\t\t\t\t\t) {\n\t\t\t\t\t\t$(\"#form_submit\").attr(\"disabled\", \"disabled\").css({'background-color':'#c8ccd1','color':'#fff'});\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvar date1, date2;\n\t\t\t\t\t\tif( mw.config.get('wgAmericanDates') ) {\n\t\t\t\t\t\t\tdate1 = $( ':input[name=\"' + autoFillStartYear + '\"]' ).val() + '-' +\n\t\t\t\t\t\t\tpadNumber(englishMonthNames.indexOf($( ':input[name=\"' + autoFillStartMonth + '\"]' ).val())) + '-' +\n\t\t\t\t\t\t\tpadNumber($( ':input[name=\"' + autoFillStartDay + '\"]' ).val());\n\t\t\t\t\t\t\tdate2 = $( ':input[name=\"' + autoFillEndYear + '\"]' ).val() + '-' +\n\t\t\t\t\t\t\tpadNumber(englishMonthNames.indexOf($( ':input[name=\"' + autoFillEndMonth + '\"]' ).val())) + '-' +\n\t\t\t\t\t\t\tpadNumber($( ':input[name=\"' + autoFillEndDay + '\"]' ).val());\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tdate1 = $( ':input[name=\"' + autoFillStartYear + '\"]' ).val() + '-' +\n\t\t\t\t\t\t\t$( ':input[name=\"' + autoFillStartMonth + '\"]' ).val() + '-' +\n\t\t\t\t\t\t\tpadNumber($( ':input[name=\"' + autoFillStartDay + '\"]' ).val());\n\t\t\t\t\t\t\tdate2 = $( ':input[name=\"' + autoFillEndYear + '\"]' ).val() + '-' +\n\t\t\t\t\t\t\t$( ':input[name=\"' + autoFillEndMonth + '\"]' ).val() + '-' +\n\t\t\t\t\t\t\tpadNumber($( ':input[name=\"' + autoFillEndDay + '\"]' ).val());\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif( $( ':input[name=\"' + autoFillStartHour + '\"]' ).val() !== undefined &&\n\t\t\t\t\t\t\t\t$( ':input[name=\"' + autoFillStartMinute + '\"]' ).val() !== undefined &&\n\t\t\t\t\t\t\t\t$( ':input[name=\"' + autoFillStartSecond + '\"]' ).val() !== undefined &&\n\t\t\t\t\t\t\t\t$( ':input[name=\"' + autoFillEndHour + '\"]' ).val() !== undefined &&\n\t\t\t\t\t\t\t\t$( ':input[name=\"' + autoFillEndMinute + '\"]' ).val() !== undefined &&\n\t\t\t\t\t\t\t\t$( ':input[name=\"' + autoFillEndSecond + '\"]' ).val() !== undefined) {\n\t\t\t\t\t\t\tdate1 += ' ' + $( ':input[name=\"' + autoFillStartHour + '\"]' ).val() + ':'\n\t\t\t\t\t\t\t\t+ $( ':input[name=\"' + autoFillStartMinute + '\"]' ).val() + ':'\n\t\t\t\t\t\t\t\t+ $( ':input[name=\"' + autoFillStartSecond + '\"]' ).val();\n\t\t\t\t\t\t\tdate2 += ' ' + $( ':input[name=\"' + autoFillEndHour + '\"]' ).val() + ':'\n\t\t\t\t\t\t\t\t+ $( ':input[name=\"' + autoFillEndMinute + '\"]' ).val() + ':'\n\t\t\t\t\t\t\t\t+ $( ':input[name=\"' + autoFillEndSecond + '\"]' ).val();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tdate1 = moment(date1);\n\t\t\t\t\t\tdate2 = moment(date2);\n\t\t\t\t\t\tif ( date1 <= date2 ) {\n\t\t\t\t\t\t\t$(\"#form_submit\").removeAttr(\"disabled\").css({'background-color': '#3366CC','color': 'white'});\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t$(\"#form_submit\").attr(\"disabled\", \"disabled\").css({'background-color':'#c8ccd1','color':'#fff'});\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\n\t\tfunction resetDateAndTime() {\n\t\t\teventDateDay = '01';\n\t\t\teventDateYear = '2010';\n\t\t\teventDateMonth = '00';\n\t\t\teventDateHour = '00';\n\t\t\teventDateMinute = '00';\n\t\t\teventDateSecond = '00';\n\t\t\teventDateAmPm24h = \"\";\n\t\t}\n\n\t\t// flag : 0 - one day , 1 - start, 2 - end\n\t\tfunction setDateAndTime( arrData, flag ) {\n\t\t\tfor( var dateEntry=0; dateEntry < arrData.length ; dateEntry++ ) {\n\t\t\t\tif( arrData[dateEntry].name.includes('year') ) {\n\t\t\t\t\teventDateYear = arrData[dateEntry].value;\n\t\t\t\t} else if ( arrData[dateEntry].name.includes('month') ) {\n\t\t\t\t\tif ( mw.config.get('wgAmericanDates') ) { //check for date-style format.\n\t\t\t\t\t\tvar monthIndex = englishMonthNames.indexOf( arrData[dateEntry].value );\n\t\t\t\t\t\teventDateMonth = padNumber(monthIndex + 1);\n\t\t\t\t\t} else {\n\t\t\t\t\t\teventDateMonth = padNumber(arrData[dateEntry].value);\n\t\t\t\t\t}\n\t\t\t\t} else if ( arrData[dateEntry].name.includes('day') ) {\n\t\t\t\t\teventDateDay = padNumber( arrData[dateEntry].value ) ;\n\t\t\t\t} else if ( arrData[dateEntry].name.includes('hour') ) {\n\t\t\t\t\teventDateHour = arrData[dateEntry].value ;\n\t\t\t\t\tif( eventDateHour === '' ) {\n\t\t\t\t\t\tif ( flag === '1' ) {\n\t\t\t\t\t\t\teventDateHour = '00';\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\teventDateHour = '23';\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else if ( arrData[dateEntry].name.includes('minute') ) {\n\t\t\t\t\teventDateMinute = arrData[dateEntry].value ;\n\t\t\t\t\tif( eventDateMinute === '' ) {\n\t\t\t\t\t\tif ( flag === '1' ) {\n\t\t\t\t\t\t\teventDateMinute = '00';\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\teventDateMinute = '59';\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else if ( arrData[dateEntry].name.includes('second') ) {\n\t\t\t\t\teventDateSecond = arrData[dateEntry].value ;\n\t\t\t\t\tif( eventDateSecond === '' ) {\n\t\t\t\t\t\tif ( flag === '1' ) {\n\t\t\t\t\t\t\teventDateSecond = '00';\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\teventDateSecond = '59';\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else if ( arrData[dateEntry].name.includes('ampm24h') ) {\n\t\t\t\t\teventDateAmPm24h = arrData[dateEntry].value ;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfunction checkDateTime( arrData, date ) {\n\t\t\tif( arrData.length === 7 ) {\n\t\t\t\tif( eventDateAmPm24h === \"\" ) {\n\t\t\t\t\tdate = date + 'T' + padNumber( eventDateHour ) + ':' + padNumber( eventDateMinute ) + ':' + padNumber( eventDateSecond );\n\t\t\t\t} else if ( eventDateAmPm24h === \"AM\" ) {\n\t\t\t\t\tif( eventDateHour === \"12\" ) {\n\t\t\t\t\t\tdate = date + 'T' + '00' + ':' + padNumber( eventDateMinute ) + ':' + padNumber( eventDateSecond );\n\t\t\t\t\t} else {\n\t\t\t\t\t\t\tdate = date + 'T' + padNumber( eventDateHour ) + ':' + padNumber( eventDateMinute ) + ':' + padNumber( eventDateSecond );\n\t\t\t\t\t}\n\t\t\t\t} else if ( eventDateAmPm24h === \"PM\" ) {\n\t\t\t\t\tif( eventDateHour === \"12\" ) {\n\t\t\t\t\t\tdate = date + 'T' + '12' + ':' + padNumber( eventDateMinute ) + ':' + padNumber( eventDateSecond );\n\t\t\t\t\t} else {\n\t\t\t\t\t\t\tdate = date + 'T' + padNumber( parseInt(eventDateHour) + 12 ) + ':' + padNumber( eventDateMinute ) + ':' + padNumber( eventDateSecond );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn date;\n\t\t}\n\n\t\t// Check if the date/datetime formats are suitable for the\n\t\t// calendar eventStartDate - if not, these are not proper\n\t\t// events, and they will be stored in eventsNoDate.\n\t\tfunction isValidDate(dateString) {\n\t\t\tif( mw.config.get( 'wgAmericanDates' ) ) {\n\t\t\t\tvar reg = /^(January?|February?|March?|April?|May|June?|July?|August?|September?|October?|November?|December?)\\s\\d{1,2},\\s\\d{4}$/;\n\t\t\t\tif(!dateString.match(reg)) { return false; }\n\t\t\t} else {\n\t\t\t\tdateString = dateString.replace('/','-');\n\t\t\t\tdateString = dateString.replace('/','-');\n\t\t\t\tvar regEx = /^\\d{4}-\\d{2}-\\d{2}$/;\n\t\t\t\tif(!dateString.match(regEx)) { return false; } // Invalid format\n\t\t\t\tvar d = new Date(dateString);\n\t\t\t\tvar dNum = d.getTime();\n\t\t\t\tif(!dNum && dNum !== 0) { return false; } // NaN value, Invalid date\n\t\t\t\treturn d.toISOString().slice(0,10) === dateString;\n\t\t\t}\n\t\t}\n\n\t\tfunction dateTimeValidation(dateString) {\n\t\t\tif( mw.config.get( 'wgAmericanDates' ) ) {\n\t\t\t\tvar reg = /^(January?|February?|March?|April?|May|June?|July?|August?|September?|October?|November?|December?)\\s\\d{1,2},\\s\\d{4}\\s\\d{2}:\\d{2}:\\d{2}$/;\n\t\t\t\tif ( !dateString.match( reg ) ) { return false; }\n\t\t\t} else {\n\t\t\t\tdateString = dateString.replace('/','-');\n\t\t\t\tdateString = dateString.replace('/','-');\n\t\t\t\tvar regEx = /^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}$/;\n\t\t\t\tif ( !dateString.match( regEx ) ) { return false; } // Invalid format\n\t\t\t\treturn !!new Date(dateString).getTime();\n\t\t\t}\n\t\t}\n\n\t\tfunction addDays(myDate,days) {\n\t\t\treturn new Date(myDate.getTime() + days*24*60*60*1000);\n\t\t}\n\n\t\tfunction padNumber(number) {\n\t\t\tvar string = '' + number;\n\t\t\tstring = string.length < 2 ? '0' + string : string;\n\t\t\treturn string;\n\t\t}\n\n\t\t$( calendarIdSelector ).fullCalendar({\n\n\t\t\teditable: true,\n\t\t\teventLimit: true, // when too many events in a day, show the popover\n\t\t\theader: {\n\t\t\t\tleft: 'prev,next today',\n\t\t\t\tcenter: 'title',\n\t\t\t\tright: 'month,agendaWeek,agendaDay'\n\t\t\t},\n\t\t\tnavLinks: true, // can click day/week names to navigate views\n\t\t\tselectable: true,\n\t\t\tselectHelper: true,\n\t\t\tnextDayThreshold: \"00:00:00\",\n\n\t\t\t// Populate the calendar with the already saved events - if any\n\t\t\tevents: function( start, end, timezone, callback ) {\n\t\t\t\tvar calendarValues = calendarGridValues[templateName];\n\t\t\t\tfor( i = 0; i < calendarValues.length; i++ ) {\n\t\t\t\t\tdata = [];\n\t\t\t\t\teventData = calendarValues[i];\n\t\t\t\t\tfor( j=0; j<calendarParams[templateName].length;j++ ) {\n\t\t\t\t\t\tcurrParam = calendarParams[templateName][j];\n\t\t\t\t\t\ttemp = eventData[currParam.name];\n\t\t\t\t\t\tif( fieldType[currParam.name] === 'date' && isValidDate(temp) === false ) {\n\t\t\t\t\t\t\teventsNoDate.push(eventData);\n\t\t\t\t\t\t\tsuitableForCalendar = false;\n\t\t\t\t\t\t} else if ( fieldType[currParam.name] === 'datetime' && dateTimeValidation(temp) === false ) {\n\t\t\t\t\t\t\teventsNoDate.push(eventData);\n\t\t\t\t\t\t\tsuitableForCalendar = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif(suitableForCalendar === true ) {\n\t\t\t\t\t\tfor( j=0; j<calendarParams[templateName].length;j++ ) {\n\t\t\t\t\t\t\tcurrParam = calendarParams[templateName][j];\n\t\t\t\t\t\t\ttemp = eventData[currParam.name];\n\t\t\t\t\t\t\tif( fieldType[currParam.name] === 'date' ) {\n\t\t\t\t\t\t\t\tif ( mw.config.get( 'wgAmericanDates' ) ) { //check for date-style format.\n\t\t\t\t\t\t\t\t\tdateSegment = temp.split(' ');\n\t\t\t\t\t\t\t\t\tyearFC = dateSegment[2];\n\t\t\t\t\t\t\t\t\tmonthFC = dateSegment[0];\n\t\t\t\t\t\t\t\t\tdateFC = padNumber(dateSegment[1].split(',')[0]);\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tdateSegment = temp.split('/');\n\t\t\t\t\t\t\t\t\tyearFC = dateSegment[0];\n\t\t\t\t\t\t\t\t\tmonthFC = dateSegment[1];\n\t\t\t\t\t\t\t\t\tdateFC = padNumber(dateSegment[2]);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tdateEntry = {\n\t\t\t\t\t\t\t\t\t'name': templateName + '[cf]['+currParam.name+'][day]',\n\t\t\t\t\t\t\t\t\t'value': dateFC\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\tdata.push( dateEntry );\n\t\t\t\t\t\t\t\tmonthEntry = {\n\t\t\t\t\t\t\t\t\t'name': templateName + '[cf]['+currParam.name+'][month]',\n\t\t\t\t\t\t\t\t\t'value': monthFC\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\tdata.push( monthEntry );\n\t\t\t\t\t\t\t\tyearEntry = {\n\t\t\t\t\t\t\t\t\t'name': templateName + '[cf]['+currParam.name+'][year]',\n\t\t\t\t\t\t\t\t\t'value': yearFC\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\tdata.push( yearEntry );\n\t\t\t\t\t\t\t} else if ( fieldType[currParam.name] === \"datetime\" ) {\n\t\t\t\t\t\t\t\tif ( mw.config.get('wgAmericanDates') ) { //check for date-style format.\n\t\t\t\t\t\t\t\t\tdateSegment = temp.split(' ');\n\t\t\t\t\t\t\t\t\tyearFC = dateSegment[2];\n\t\t\t\t\t\t\t\t\tmonthFC = dateSegment[0];\n\t\t\t\t\t\t\t\t\tdateFC = padNumber(dateSegment[1].split(',')[0]);\n\t\t\t\t\t\t\t\t\ttimeSegment = dateSegment[3].split(':');\n\t\t\t\t\t\t\t\t\thourFC = timeSegment[0];\n\t\t\t\t\t\t\t\t\tminuteFC = timeSegment[1];\n\t\t\t\t\t\t\t\t\tsecondFC = timeSegment[2];\n\t\t\t\t\t\t\t\t\tampm24h = dateSegment[4];\n\t\t\t\t\t\t\t\t\tif( ampm24h === undefined ) {\n\t\t\t\t\t\t\t\t\t\tampm24h = '';\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tsegment = temp.split(' '); // will be used\n\t\t\t\t\t\t\t\t\tdateSegment = segment[0].split('/');\n\t\t\t\t\t\t\t\t\ttimeSegment = segment[1].split(':');\n\t\t\t\t\t\t\t\t\tyearFC = dateSegment[0];\n\t\t\t\t\t\t\t\t\tmonthFC = dateSegment[1];\n\t\t\t\t\t\t\t\t\tdateFC = padNumber(dateSegment[2]);\n\t\t\t\t\t\t\t\t\thourFC = timeSegment[0];\n\t\t\t\t\t\t\t\t\tminuteFC = timeSegment[1];\n\t\t\t\t\t\t\t\t\tsecondFC = timeSegment[2];\n\t\t\t\t\t\t\t\t\tampm24h = segment[2];\n\t\t\t\t\t\t\t\t\tif( ampm24h === undefined ) {\n\t\t\t\t\t\t\t\t\t\tampm24h = '';\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tdateEntry = {\n\t\t\t\t\t\t\t\t\t'name': templateName+'[cf]['+currParam.name+'][day]',\n\t\t\t\t\t\t\t\t\t'value': dateFC\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\tdata.push( dateEntry );\n\t\t\t\t\t\t\t\tmonthEntry = {\n\t\t\t\t\t\t\t\t\t'name': templateName+'[cf]['+currParam.name+'][month]',\n\t\t\t\t\t\t\t\t\t'value': monthFC\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\tdata.push( monthEntry );\n\t\t\t\t\t\t\t\tyearEntry = {\n\t\t\t\t\t\t\t\t\t'name': templateName+'[cf]['+currParam.name+'][year]',\n\t\t\t\t\t\t\t\t\t'value': yearFC\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\tdata.push(yearEntry);\n\t\t\t\t\t\t\t\thourEntry = {\n\t\t\t\t\t\t\t\t\t'name': templateName+'[cf]['+currParam.name+'][hour]',\n\t\t\t\t\t\t\t\t\t'value': hourFC\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\tdata.push( hourEntry );\n\t\t\t\t\t\t\t\tminuteEntry = {\n\t\t\t\t\t\t\t\t\t'name': templateName+'[cf]['+currParam.name+'][minute]',\n\t\t\t\t\t\t\t\t\t'value': minuteFC\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\tdata.push( minuteEntry );\n\t\t\t\t\t\t\t\tsecondEntry = {\n\t\t\t\t\t\t\t\t\t'name': templateName+'[cf]['+currParam.name+'][second]',\n\t\t\t\t\t\t\t\t\t'value': secondFC\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\tdata.push( secondEntry );\n\t\t\t\t\t\t\t\tampm24hEntry = {\n\t\t\t\t\t\t\t\t\t'name': templateName+'[cf]['+currParam.name+'][ampm24h]',\n\t\t\t\t\t\t\t\t\t'value': ampm24h\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\tdata.push( ampm24hEntry );\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tregularEntry = {\n\t\t\t\t\t\t\t\t\t'name': templateName+'[cf]['+currParam.name+']',\n\t\t\t\t\t\t\t\t\t'value':temp\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\tdata.push( regularEntry );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\tif( flagOneDayEvent === true ) {\n\t\t\t\t\t\ttitleIndex = -1;\n\t\t\t\t\t\tdateFields = [];\n\t\t\t\t\t\teventDate = '';\n\t\t\t\t\t\tfor(j=0;j<data.length;j++){\n\t\t\t\t\t\t\tresult = data[j].name.split(\"[\");\n\t\t\t\t\t\t\teventTemplateName = result[0];\n\t\t\t\t\t\t\tparameterName = result[2].split(\"]\")[0];\n\n\t\t\t\t\t\t\tif ( parameterName === eventTitleField ) {\n\t\t\t\t\t\t\t\tif( titleIndex === -1 ) {\n\t\t\t\t\t\t\t\t\ttitleIndex = j;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if ( parameterName === eventDateField ) {\n\t\t\t\t\t\t\t\tdateFields.push( {'name':data[j].name, 'value':data[j].value} );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tresetDateAndTime();\n\t\t\t\t\t\tsetDateAndTime( dateFields );\n\t\t\t\t\t\teventDate = eventDateYear + '-' + eventDateMonth + '-' + eventDateDay;\n\t\t\t\t\t\treserveDate = eventDate;\n\t\t\t\t\t\teventDate = checkDateTime( dateFields, eventDate );\n\t\t\t\t\t\tidForm = eventDate + \"_fc\" + counter;\n\t\t\t\t\t\tpreEventData = {\n\t\t\t\t\t\t\ttitle: data[titleIndex].value,\n\t\t\t\t\t\t\tstart: eventDate,\n\t\t\t\t\t\t\tend: reserveDate + 'T23:59:59',\n\t\t\t\t\t\t\tcontents: data,\n\t\t\t\t\t\t\tid: idForm\n\t\t\t\t\t\t};\n\t\t\t\t\t\tif(!pageLoaded){\n\t\t\t\t\t\t\tcounter++;\n\t\t\t\t\t\t\t$( calendarIdSelector ).fullCalendar( 'renderEvent', preEventData, true );\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttitleIndex = -1;\n\t\t\t\t\t\tdateStartFields = [];\n\t\t\t\t\t\tdateEndFields = [];\n\t\t\t\t\t\teventStartDate = '';\n\t\t\t\t\t\teventEndDate = '';\n\t\t\t\t\t\tfor( j = 0; j < data.length; j++ ){\n\t\t\t\t\t\t\tresult = data[j].name.split(\"[\");\n\t\t\t\t\t\t\teventTemplateName = result[0];\n\t\t\t\t\t\t\tparameterName = result[2].split(\"]\")[0];\n\n\t\t\t\t\t\t\tif ( parameterName === eventTitleField ) {\n\t\t\t\t\t\t\t\tif( titleIndex === -1 ) {\n\t\t\t\t\t\t\t\t\ttitleIndex = j;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if ( parameterName === eventStartDateField ) {\n\t\t\t\t\t\t\t\tdateStartFields.push({'name': data[j].name, 'value': data[j].value});\n\t\t\t\t\t\t\t} else if ( parameterName === eventEndDateField ) {\n\t\t\t\t\t\t\t\tdateEndFields.push({'name': data[j].name, 'value': data[j].value});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tresetDateAndTime();\n\t\t\t\t\t\tsetDateAndTime( dateStartFields );\n\t\t\t\t\t\teventStartDate = eventDateYear + '-' + eventDateMonth + '-' + eventDateDay;\n\t\t\t\t\t\treserveDate = eventStartDate;\n\t\t\t\t\t\teventStartDate = checkDateTime( dateStartFields, eventStartDate );\n\t\t\t\t\t\tresetDateAndTime();\n\t\t\t\t\t\tsetDateAndTime( dateEndFields );\n\t\t\t\t\t\teventEndDate = eventDateYear + '-' + eventDateMonth + '-' + eventDateDay;\n\t\t\t\t\t\treserveDate = eventEndDate;\n\t\t\t\t\t\teventEndDate = checkDateTime( dateEndFields, eventEndDate );\n\t\t\t\t\t\tidForm = eventStartDate +\"_fc\"+counter;\n\t\t\t\t\t\tif ( fieldType[eventEndDateField] === 'date' ) {\n\t\t\t\t\t\t\tdateElement = new Date(eventEndDate);\n\t\t\t\t\t\t\tnextDate = new Date(dateElement.setDate(dateElement.getDate() + 1));\n\t\t\t\t\t\t\tformatted = nextDate.getUTCFullYear() + '-' + padNumber(nextDate.getUTCMonth() + 1) + '-' + padNumber(nextDate.getUTCDate());\n\t\t\t\t\t\t\teventEndDate = formatted;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tpreEventData = {\n\t\t\t\t\t\t\ttitle: eventData[eventTitleField],\n\t\t\t\t\t\t\tstart: eventStartDate,\n\t\t\t\t\t\t\tend: eventEndDate,\n\t\t\t\t\t\t\tcontents: data,\n\t\t\t\t\t\t\tid: idForm\n\t\t\t\t\t\t};\n\t\t\t\t\t\tif(!pageLoaded){\n\t\t\t\t\t\t\tcounter++;\n\t\t\t\t\t\t\t$( calendarIdSelector ).fullCalendar( 'renderEvent', preEventData, true );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tsuitableForCalendar = true;\n\t\t\t\t}\n\t\t\t\tcallback(events);\n\t\t\t\tpageLoaded = true;\n\t\t\t},\n\n\t\t\t// Select : JS method to put events on the calendar by selecting\n\t\t\t// one or more dates\n\t\t\tselect: function( start, end ) {\n\t\t\t\t// Open the popup form to allow the user to create the event\n\t\t\t\t$.fancybox.open( createEventPopup + '</form>' );\n\t\t\t\t$(\"[class|='fancybox-close-small']\").attr(\"type\", \"button\");\n\t\t\t\t// Handle token input type\n\t\t\t\t$(':input').each( function() {\n\t\t\t\t\ttokensProto = new pf.select2.tokens();\n\t\t\t\t\tif ( $( this ).hasClass( 'pfTokens' ) ){\n\t\t\t\t\t\ttokensProto.apply( $(this) );\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\t// Handling the text with autocomplete\n\t\t\t\t$('#popupForm').find(\".autocompleteInput\").each( function() {\n\t\t\t\t\t$(this).attachAutocomplete();\n\t\t\t\t});\n\t\t\t\t// Handle combobox input type\n\t\t\t\t// $(':input').each( function() {\n\t\t\t\t// \tcomboboxProto = new pf.select2.combobox();\n\t\t\t\t// \tif ( $( this ).hasClass( 'pfComboBox' ) ){\n\t\t\t\t// \t\tcomboboxProto.apply( $(this) );\n\t\t\t\t// \t}\n\t\t\t\t// });\n\n\t\t\t\t// Handle the tree input types\n\t\t\t\t$('#popupForm').find(\".pfTreeInput\").each( function() {\n\t\t\t\t\t$(this).applyJSTree();\n\t\t\t\t});\n\t\t\t\t$('#popupForm').find(\".pfRating\").each( function() {\n\t\t\t\t\t$(this).applyRatingInput();\n\t\t\t\t});\n\t\t\t\t// Check if the event is only one day long\n\t\t\t\t// For current code - it is required to see if the event is one day long or not.\n\t\t\t\t// In future the code can be reduced and this if-else condition can be removed\n\t\t\t\tif ( flagOneDayEvent === true ) {\n\t\t\t\t\tidForm = start.format() + \"_fc\" + counter;\n\t\t\t\t\t// Atuomatically set the event date value\n\t\t\t\t\t$( ':input[name=\"' + autoFillDay + '\"]' ).val( start.format( 'DD' ) );\n\t\t\t\t\t$( ':input[name=\"' + autoFillYear + '\"]' ).val( start.format( 'YYYY' ) );\n\t\t\t\t\tif ( mw.config.get('wgAmericanDates') ) { //check for date-style format.\n\t\t\t\t\t\t$( ':input[name=\"' + autoFillMonth + '\"]' ).val( englishMonthNames[parseInt( start.format( 'MM' ) ) -1 ] );\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$( ':input[name=\"' + autoFillMonth + '\"]' ).val( start.format( 'MM' ) );\n\t\t\t\t\t}\n\t\t\t\t\tcheckAndSave( 'single' );\n\t\t\t\t\t// Save all the data of the popup form and set the title, event date and the unique ID of the event\n\t\t\t\t\t$( \"#form_submit\" ).click(function( event ) {\n\t\t\t\t\t\tsaveData( 'single' );\n\t\t\t\t\t\tresetDateAndTime();\n\t\t\t\t\t\tsetDateAndTime( dateFields );\n\t\t\t\t\t\teventDate = eventDateYear + '-' + eventDateMonth + '-' + eventDateDay;\n\t\t\t\t\t\treserveDate = eventDate;\n\t\t\t\t\t\teventDate = checkDateTime( dateFields, eventDate );\n\t\t\t\t\t\teventData = {\n\t\t\t\t\t\t\ttitle: data[titleIndex].value,\n\t\t\t\t\t\t\tstart: eventDate,\n\t\t\t\t\t\t\tend: reserveDate + 'T23:59:59',\n\t\t\t\t\t\t\tcontents: data,\n\t\t\t\t\t\t\tid:idForm\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tcounter++;\n\t\t\t\t\t\t$( '.fancybox-close-small' ).click();\n\t\t\t\t\t\t$( calendarIdSelector ).fullCalendar( 'renderEvent', eventData, true );\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tidForm = start.format() + \"_fc\" + counter;\n\t\t\t\t\tcurrentEndDateMoment = moment(end);\n\t\t\t\t\tcurrentEndDateMoment = currentEndDateMoment.subtract(1 , 'days');\n\t\t\t\t\t$( ':input[name=\"' + autoFillStartDay + '\"]' ).val( Number(start.format( 'DD' )) );\n\t\t\t\t\t$( ':input[name=\"' + autoFillStartYear + '\"]' ).val( start.format( 'YYYY' ) );\n\t\t\t\t\tif ( mw.config.get('wgAmericanDates') ) { //check for date-style format.\n\t\t\t\t\t\t$( ':input[name=\"' + autoFillStartMonth + '\"]' ).val( englishMonthNames[parseInt( start.format( 'MM' ) ) -1 ] );\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$( ':input[name=\"' + autoFillStartMonth + '\"]' ).val( start.format( 'MM' ) );\n\t\t\t\t\t}\n\t\t\t\t\t$( ':input[name=\"' + autoFillEndDay + '\"]' ).val( Number(currentEndDateMoment.format( 'DD' )) );\n\t\t\t\t\t$( ':input[name=\"' + autoFillEndYear + '\"]' ).val( currentEndDateMoment.format( 'YYYY' ) );\n\t\t\t\t\tif ( mw.config.get('wgAmericanDates') ) { //check for date-style format.\n\t\t\t\t\t\t$( ':input[name=\"' + autoFillEndMonth + '\"]' ).val( englishMonthNames[parseInt( currentEndDateMoment.format( 'MM' ) ) -1 ] );\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$( ':input[name=\"' + autoFillEndMonth + '\"]' ).val( currentEndDateMoment.format( 'MM' ) );\n\t\t\t\t\t}\n\n\t\t\t\t\tcheckAndSave( 'multiple' );\n\t\t\t\t\t$( \"#form_submit\" ).click(function( event ) {\n\t\t\t\t\t\tsaveData( 'multiple' );\n\t\t\t\t\t\tresetDateAndTime();\n\t\t\t\t\t\tsetDateAndTime( dateStartFields, '1' );\n\t\t\t\t\t\teventStartDate = eventDateYear + '-' + eventDateMonth + '-' + eventDateDay;\n\t\t\t\t\t\treserveDate = eventStartDate;\n\t\t\t\t\t\teventStartDate = checkDateTime( dateStartFields, eventStartDate );\n\t\t\t\t\t\tresetDateAndTime();\n\t\t\t\t\t\tsetDateAndTime( dateEndFields, '2' );\n\t\t\t\t\t\teventEndDate = eventDateYear + '-' + eventDateMonth + '-' + eventDateDay;\n\t\t\t\t\t\treserveDate = eventEndDate;\n\t\t\t\t\t\teventEndDate = checkDateTime( dateEndFields, eventEndDate );\n\n\t\t\t\t\t\tif ( fieldType[eventEndDateField] === 'date' ) {\n\t\t\t\t\t\t\tdateElement = new Date(eventEndDate);\n\t\t\t\t\t\t\tnextDate = new Date(dateElement.setDate(dateElement.getDate() + 1));\n\t\t\t\t\t\t\tformatted = nextDate.getUTCFullYear() + '-' + padNumber(nextDate.getUTCMonth() + 1) + '-' + padNumber(nextDate.getUTCDate());\n\t\t\t\t\t\t\teventEndDate = formatted;\n\t\t\t\t\t\t}\n\t\t\t\t\t\teventData = {\n\t\t\t\t\t\t\ttitle: data[titleIndex].value,\n\t\t\t\t\t\t\tstart: eventStartDate,\n\t\t\t\t\t\t\tend: eventEndDate,\n\t\t\t\t\t\t\tresourceEditable:true,\n\t\t\t\t\t\t\tcontents: data,\n\t\t\t\t\t\t\tid:idForm\n\t\t\t\t\t\t};\n\t\t\t\t\t\tcounter++;\n\t\t\t\t\t\t$( '.fancybox-close-small' ).click();\n\t\t\t\t\t\t$( calendarIdSelector ).fullCalendar( 'renderEvent', eventData, true );\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t// // Edit an event placed on the calendar by simply clicking on it\n\t\t\teventClick: function( info ) {\n\t\t\t\tvar content = $( calendarIdSelector ).fullCalendar( 'clientEvents', info.id );\n\t\t\t\tvar formContents = content[0].contents;\n\t\t\t\tvar ratingArr = [];\n\t\t\t\tcheckboxesValues = [];\n\t\t\t\tvar paramName, rateSample = 0;\n\t\t\t\t// Open the popup form and populate it with the values to allow editing\n\t\t\t\t$.fancybox.open( updateEventPopup + deleteButton + '</form>' );\n\t\t\t\t$(\"[class|='fancybox-close-small']\").attr(\"type\", \"button\");\n\n\t\t\t\t$('#popupForm').find(\".pfTreeInput\").each( function() {\n\t\t\t\t\t$(this).applyFancytree();\n\t\t\t\t});\n\n\t\t\t\t// Prepare the popup form for editing\n\t\t\t\tfor( i = 0; i < formContents.length; i++ ) {\n\t\t\t\t\ttemp = formContents[i].name;\n\t\t\t\t\tparamName = temp.split('[')[2].split(']')[0];\n\t\t\t\t\t// If there is a month field, set according to the date format\n\t\t\t\t\tif ( temp.includes('month') ) {\n\t\t\t\t\t\tif ( mw.config.get('wgAmericanDates') ) { //check for date-style format.\n\t\t\t\t\t\t\tif ( englishMonthNames.indexOf( formContents[i].value ) !== - 1 ) {\n\t\t\t\t\t\t\t\t$(':input[name=\"'+temp+'\"]').val( formContents[i].value );\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t$(':input[name=\"'+temp+'\"]').val( englishMonthNames[ parseInt(formContents[i].value) - 1] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t$(':input[name=\"'+temp+'\"]').val(formContents[i].value);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if ( temp.includes('day') ) {\n\t\t\t\t\t\t$(':input[name=\"'+temp+'\"]').val( Number(formContents[i].value) );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif(fieldType[paramName] === 'radiobutton' || fieldType[paramName] === 'checkbox' || fieldType[paramName] === 'checkboxes' || fieldType[paramName] === 'listbox' ) {\n\t\t\t\t\t\t\tif( fieldType[paramName] === 'radiobutton' ) {\n\t\t\t\t\t\t\t\t$(':input[value=\"' + formContents[i].value + '\"]').attr('checked',true);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif( fieldType[paramName] === 'checkbox' && !temp.includes('[is_checkbox]')) {\n\t\t\t\t\t\t\t\ttemp = temp.replace('[value]','');\n\t\t\t\t\t\t\t\ttemp = temp.replace('[is_checkbox]','');\n\t\t\t\t\t\t\t\ttemp+='[is_checkbox]';\n\t\t\t\t\t\t\t\tvar checkId1 = ($(':hidden[name=\"'+temp+'\"]')[0].nextElementSibling.id);\n\t\t\t\t\t\t\t\t$('#'+ checkId1).prop('checked',formContents[i].value);\n\t\t\t\t\t\t\t\t$(':hidden[name=\"'+temp+'\"]').attr('value',0);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif( fieldType[paramName] === 'checkboxes' && !temp.includes('[is_list]')) {\n\t\t\t\t\t\t\t\tif( formContents[i].value.includes(',') ) {\n\t\t\t\t\t\t\t\t\tcheckboxesValues = formContents[i].value.split(', ');\n\t\t\t\t\t\t\t\t\tfor( var p = 0; p<checkboxesValues.length; p++ ) {\n\t\t\t\t\t\t\t\t\t\t$(':input[value=\"' + checkboxesValues[p] + '\"]').attr('checked',true);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t$(':input[value=\"' + formContents[i].value + '\"]').attr('checked',true);\n\t\t\t\t\t\t\t\t\t// checkboxes_values.push(formContents[i].value);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif( fieldType[paramName] === 'listbox' && !temp.includes('[is_list]')) {\n\t\t\t\t\t\t\t\tif( formContents[i].value.includes(',') ) {\n\t\t\t\t\t\t\t\t\tlistboxValues = formContents[i].value.split(', ');\n\t\t\t\t\t\t\t\t\tfor( var list = 0; list<listboxValues.length; list++ ) {\n\t\t\t\t\t\t\t\t\t\t$('option[value=\"' + listboxValues[list] + '\"]').attr(\"selected\", \"selected\");\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t$('option[value=\"' + formContents[i].value + '\"]').attr(\"selected\", \"selected\");\n\t\t\t\t\t\t\t\t\t// checkboxes_values.push(form_contents[i].value);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t$(':input[name=\"'+temp+'\"]').val( formContents[i].value );\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif( fieldType[paramName] === 'rating' ) {\n\t\t\t\t\t\t\tratingArr.push( formContents[i].value );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t// checkboxesNum.push(checkboxes_values);\n\t\t\t\t}\n\t\t\t\t// This is my little experiment to include rating input type to the calendar interface\n\t\t\t\t// This can improve in future version of this file.\n\t\t\t\t// I have saved the rating values in the ratingArr and just filling it in the 'each'\n\t\t\t\t// This may seem like a risky bet..\n\t\t\t\t$('#popupForm').find(\".pfRating\").each( function() {\n\t\t\t\t\t$(this).applyRatingInput( ratingArr[rateSample] );\n\t\t\t\t\trateSample++;\n\t\t\t\t});\n\t\t\t\t// Handling the text with autocomplete\n\t\t\t\t$('#popupForm').find(\".autocompleteInput\").each( function() {\n\t\t\t\t\t$(this).attachAutocomplete();\n\t\t\t\t});\n\n\t\t\t\t// Handling token input type\n\t\t\t\t$(':input').each(function() {\n\t\t\t\t\ttokensProto = new pf.select2.tokens();\n\t\t\t\t\tif ( $( this ).hasClass( 'pfTokens' ) ) {\n\t\t\t\t\t\ttokensProto.apply( $(this) );\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\t// FIXME: This is not yet working correctly - possibly due\n\t\t\t\t// to z-index of fancybox popup or select2\n\t\t\t\t// $(':input').each( function() {\n\t\t\t\t// \tcomboboxProto = new pf.select2.combobox();\n\t\t\t\t// \tif ( $( this ).hasClass( 'pfComboBox' ) ) {\n\t\t\t\t// \t\tcomboboxProto.apply( $(this) );\n\t\t\t\t// \t}\n\t\t\t\t// });\n\t\t\t\t// Delete button for the existing event\n\t\t\t\t$( \"#event_delete\" ).click(function( event ) {\n\t\t\t\t\t$( calendarIdSelector ).fullCalendar('removeEvents',info.id);\n\t\t\t\t\t$( '.fancybox-close-small' ).click();\n\t\t\t\t});\n\n\t\t\t\tif ( flagOneDayEvent === true ) {\n\t\t\t\t\t// Check if the date fields are left empty or not\n\t\t\t\t\tcheckAndSave( 'single' );\n\t\t\t\t\t// Save everything again once the submit button is pressed\n\t\t\t\t\t$( \"#form_submit\" ).click(function( event ) {\n\t\t\t\t\t\tsaveData( 'single' );\n\t\t\t\t\t\tresetDateAndTime();\n\t\t\t\t\t\tsetDateAndTime( dateFields );\n\t\t\t\t\t\teventDate = eventDateYear + '-' + padNumber(eventDateMonth) + '-' + padNumber(eventDateDay);\n\t\t\t\t\t\teventDate = checkDateTime( dateFields, eventDate );\n\t\t\t\t\t\tinfo.title = data[titleIndex].value;\n\t\t\t\t\t\tinfo.contents = data;\n\t\t\t\t\t\tinfo.start = eventDate;\n\t\t\t\t\t\t$('.fancybox-close-small').click();\n\t\t\t\t\t\t$( calendarIdSelector ).fullCalendar( 'updateEvent' , info , true );\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tvar end = info.end;\n\t\t\t\t\tvar start = info.start;\n\t\t\t\t\tcheckAndSave( 'multiple' );\n\t\t\t\t\t$( \"#form_submit\" ).click(function( event ) {\n\t\t\t\t\t\tsaveData( 'multiple' );\n\t\t\t\t\t\tresetDateAndTime();\n\t\t\t\t\t\tsetDateAndTime( dateStartFields , '1' );\n\t\t\t\t\t\teventStartDate = eventDateYear + '-' + eventDateMonth + '-' + eventDateDay;\n\t\t\t\t\t\teventStartDate = checkDateTime( dateStartFields, eventStartDate );\n\n\t\t\t\t\t\tresetDateAndTime();\n\t\t\t\t\t\tsetDateAndTime( dateEndFields , '2' );\n\t\t\t\t\t\teventEndDate = eventDateYear + '-' + eventDateMonth + '-' + eventDateDay;\n\t\t\t\t\t\teventEndDate = checkDateTime( dateEndFields, eventEndDate );\n\n\t\t\t\t\t\tif ( fieldType[eventEndDateField] === 'date' ) {\n\t\t\t\t\t\t\tdateElement = new Date(eventEndDate);\n\t\t\t\t\t\t\tnextDate = new Date(dateElement.setDate(dateElement.getDate() + 1));\n\t\t\t\t\t\t\tformatted = nextDate.getUTCFullYear() + '-' + padNumber(nextDate.getUTCMonth() + 1) + '-' + padNumber(nextDate.getUTCDate());\n\t\t\t\t\t\t\teventEndDate = formatted;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tinfo.title = data[titleIndex].value;\n\t\t\t\t\t\tinfo.contents = data;\n\t\t\t\t\t\tinfo.start = eventStartDate;\n\t\t\t\t\t\tinfo.end = eventEndDate;\n\t\t\t\t\t\t$( '.fancybox-close-small') .click();\n\t\t\t\t\t\t$( calendarIdSelector ).fullCalendar( 'updateEvent', info, true );\n\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t},\n\n\t\t\teventResize: function(event) {\n\t\t\t\tevent.start._i = event.start.format();\n\t\t\t\tevent.end._i = event.end.format();\n\t\t\t\tcurrentEndDateMoment = moment(event.end);\n\t\t\t\tif( fieldType[eventStartDateField] === 'date' && event.allDay ) {\n\t\t\t\t\tcurrentEndDateMoment = currentEndDateMoment.subtract(1 , 'days');\n\t\t\t\t}\n\n\t\t\t\teventContents = event.contents;\n\t\t\t\tfor ( i = 0; i < eventContents.length; i++ ) {\n\t\t\t\t\tif ( eventContents[i].name === autoFillStartDay ) {\n\t\t\t\t\t\teventContents[i].value = event.start.format('DD');\n\t\t\t\t\t} else if ( eventContents[i].name === autoFillStartMonth ) {\n\t\t\t\t\t\tif ( mw.config.get('wgAmericanDates') ) {\n\t\t\t\t\t\t\teventContents[i].value = englishMonthNames[ parseInt(event.start.format('MM')) - 1 ];\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\teventContents[i].value = event.start.format('MM');\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if ( eventContents[i].name === autoFillStartYear ) {\n\t\t\t\t\t\teventContents[i].value = event.start.format('YYYY');\n\t\t\t\t\t} else if ( eventContents[i].name === autoFillEndDay ) {\n\t\t\t\t\t\teventContents[i].value = currentEndDateMoment.format('DD');\n\t\t\t\t\t} else if ( eventContents[i].name === autoFillEndMonth ) {\n\t\t\t\t\t\tif ( mw.config.get('wgAmericanDates') ) {\n\t\t\t\t\t\t\teventContents[i].value = englishMonthNames[ parseInt(currentEndDateMoment.format('MM')) - 1 ];\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\teventContents[i].value = currentEndDateMoment.format('MM');\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if ( eventContents[i].name === autoFillEndYear ) {\n\t\t\t\t\t\teventContents[i].value = currentEndDateMoment.format('YYYY');\n\t\t\t\t\t} else if ( eventContents[i].name === autoFillStartHour ) {\n\t\t\t\t\t\teventContents[i].value = event.start.format('hh');\n\t\t\t\t\t} else if ( eventContents[i].name === autoFillStartMinute ) {\n\t\t\t\t\t\teventContents[i].value = event.start.format('mm');\n\t\t\t\t\t} else if ( eventContents[i].name === autoFillStartSecond ) {\n\t\t\t\t\t\teventContents[i].value = event.start.format('ss');\n\t\t\t\t\t} else if ( eventContents[i].name === autoFillStartAmPm24h ) {\n\t\t\t\t\t\teventContents[i].value = ( event.start.format('t') === 'p' ? 'PM' : 'AM' );\n\t\t\t\t\t} else if ( eventContents[i].name === autoFillEndHour ) {\n\t\t\t\t\t\teventContents[i].value = event.end.format('hh');\n\t\t\t\t\t} else if ( eventContents[i].name === autoFillEndMinute ) {\n\t\t\t\t\t\teventContents[i].value = event.end.format('mm');\n\t\t\t\t\t} else if ( eventContents[i].name === autoFillEndSecond ) {\n\t\t\t\t\t\teventContents[i].value = event.end.format('ss');\n\t\t\t\t\t} else if ( eventContents[i].name === autoFillEndAmPm24h ) {\n\t\t\t\t\t\teventContents[i].value = ( event.end.format('t') === 'p' ? 'PM' : 'AM' );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tevent.contents = eventContents;\n\t\t\t\t$( calendarIdSelector ).fullCalendar('updateEvent',event);\n\n\t\t\t},\n\n\t\t\teventDrop: function( event, delta, revertFunc ) {\n\t\t\t\tvar oldEvent = $( calendarIdSelector ).fullCalendar( 'clientEvents', event.id );\n\t\t\t\t$( calendarIdSelector ).fullCalendar('removeEvents',oldEvent[0].id);\n\t\t\t\tevent.start._i = event.start.format();\n\n\t\t\t\tif ( flagOneDayEvent === false ) {\n\t\t\t\t\tif ( event.end !== null ) {\n\t\t\t\t\t\tevent.end._i = event.end.format() ;\n\t\t\t\t\t\tcurrentEndDateMoment = moment(event.end);\n\t\t\t\t\t\tif( fieldType[eventStartDateField] === 'date' && event.allDay ) {\n\t\t\t\t\t\t\tcurrentEndDateMoment = currentEndDateMoment.subtract(1 , 'days');\n\t\t\t\t\t\t}\n\t\t\t\t\t\teventContents = event.contents;\n\t\t\t\t\t\tfor( i = 0; i<eventContents.length; i++ ) {\n\t\t\t\t\t\t\tif ( eventContents[i].name === autoFillStartDay ) {\n\t\t\t\t\t\t\t\teventContents[i].value = event.start.format('DD');\n\t\t\t\t\t\t\t} else if ( eventContents[i].name === autoFillStartMonth ) {\n\t\t\t\t\t\t\t\tif ( mw.config.get('wgAmericanDates') ) {\n\t\t\t\t\t\t\t\t\teventContents[i].value = englishMonthNames[ parseInt( event.start.format('MM')) - 1 ];\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\teventContents[i].value = event.start.format('MM');\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if ( eventContents[i].name === autoFillStartYear ) {\n\t\t\t\t\t\t\t\teventContents[i].value = event.start.format('YYYY');\n\t\t\t\t\t\t\t} else if ( eventContents[i].name === autoFillEndDay ) {\n\t\t\t\t\t\t\t\teventContents[i].value = currentEndDateMoment.format('DD');\n\t\t\t\t\t\t\t} else if ( eventContents[i].name === autoFillEndMonth ) {\n\t\t\t\t\t\t\t\tif ( mw.config.get('wgAmericanDates') ) {\n\t\t\t\t\t\t\t\t\teventContents[i].value = englishMonthNames[ parseInt(currentEndDateMoment.format('MM')) - 1 ];\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\teventContents[i].value = currentEndDateMoment.format('MM');\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if ( eventContents[i].name === autoFillEndYear ) {\n\t\t\t\t\t\t\t\teventContents[i].value = currentEndDateMoment.format('YYYY');\n\t\t\t\t\t\t\t} else if ( eventContents[i].name === autoFillStartHour ) {\n\t\t\t\t\t\t\t\teventContents[i].value = event.start.format('hh');\n\t\t\t\t\t\t\t} else if ( eventContents[i].name === autoFillStartMinute ) {\n\t\t\t\t\t\t\t\teventContents[i].value = event.start.format('mm');\n\t\t\t\t\t\t\t} else if ( eventContents[i].name === autoFillStartSecond ) {\n\t\t\t\t\t\t\t\teventContents[i].value = event.start.format('ss');\n\t\t\t\t\t\t\t} else if ( eventContents[i].name === autoFillStartAmPm24h ) {\n\t\t\t\t\t\t\t\teventContents[i].value = ( event.start.format('t') ==='p' ? 'PM' : 'AM' );\n\t\t\t\t\t\t\t} else if ( eventContents[i].name === autoFillEndHour ) {\n\t\t\t\t\t\t\t\teventContents[i].value = event.end.format('hh');\n\t\t\t\t\t\t\t} else if ( eventContents[i].name === autoFillEndMinute ) {\n\t\t\t\t\t\t\t\teventContents[i].value = event.end.format('mm');\n\t\t\t\t\t\t\t} else if ( eventContents[i].name === autoFillEndSecond ) {\n\t\t\t\t\t\t\t\teventContents[i].value = event.end.format('ss');\n\t\t\t\t\t\t\t} else if ( eventContents[i].name === autoFillEndAmPm24h ) {\n\t\t\t\t\t\t\t\teventContents[i].value = ( event.end.format('t') ==='p' ? 'PM' : 'AM' );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\teventContents = event.contents;\n\t\t\t\t\t\tfor ( i = 0; i < eventContents.length; i++ ) {\n\t\t\t\t\t\t\tif ( eventContents[i].name === autoFillStartDay ) {\n\t\t\t\t\t\t\t\teventContents[i].value = event.start.format('DD');\n\t\t\t\t\t\t\t} else if ( eventContents[i].name === autoFillStartMonth ) {\n\t\t\t\t\t\t\t\tif ( mw.config.get('wgAmericanDates') ) {\n\t\t\t\t\t\t\t\t\teventContents[i].value = englishMonthNames[ parseInt( event.start.format('MM')) - 1 ];\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\teventContents[i].value = event.start.format('MM');\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if ( eventContents[i].name === autoFillStartYear ) {\n\t\t\t\t\t\t\t\teventContents[i].value = event.start.format('YYYY');\n\t\t\t\t\t\t\t} else if ( eventContents[i].name === autoFillEndDay ) {\n\t\t\t\t\t\t\t\teventContents[i].value = event.start.format('DD');\n\t\t\t\t\t\t\t} else if ( eventContents[i].name === autoFillEndMonth ) {\n\t\t\t\t\t\t\t\tif ( mw.config.get('wgAmericanDates') ) {\n\t\t\t\t\t\t\t\t\teventContents[i].value = englishMonthNames[ parseInt( event.start.format('MM')) - 1 ];\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\teventContents[i].value = event.start.format('MM');\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if ( eventContents[i].name === autoFillEndYear ) {\n\t\t\t\t\t\t\t\teventContents[i].value = event.start.format('YYYY');\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} else {\n\t\t\t\t\teventContents = event.contents;\n\t\t\t\t\tevent.end._i = event.start.format( 'YYYY' ) + '-' + event.start.format('MM') + '-' + event.start.format('DD') + \"T23:59:59\";\n\t\t\t\t\tfor( i = 0; i<eventContents.length; i++ ) {\n\t\t\t\t\t\tif ( eventContents[i].name === autoFillDay ) {\n\t\t\t\t\t\t\teventContents[i].value = event.start.format('DD');\n\t\t\t\t\t\t} else if ( eventContents[i].name === autoFillMonth ) {\n\t\t\t\t\t\t\tif ( mw.config.get('wgAmericanDates') ) {\n\t\t\t\t\t\t\t\teventContents[i].value = englishMonthNames[ parseInt( event.start.format('MM')) - 1 ];\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\teventContents[i].value = event.start.format('MM');\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else if ( eventContents[i].name === autoFillYear ) {\n\t\t\t\t\t\t\teventContents[i].value = event.start.format('YYYY');\n\t\t\t\t\t\t} else if ( eventContents[i].name === autoFillHour ) {\n\t\t\t\t\t\t\teventContents[i].value = event.start.format('hh');\n\t\t\t\t\t\t} else if ( eventContents[i].name === autoFillMinute ) {\n\t\t\t\t\t\t\teventContents[i].value = event.start.format('mm');\n\t\t\t\t\t\t} else if ( eventContents[i].name === autoFillSecond ) {\n\t\t\t\t\t\t\teventContents[i].value = event.start.format('ss');\n\t\t\t\t\t\t} else if ( eventContents[i].name === autoFillAmPm24h ) {\n\t\t\t\t\t\t\teventContents[i].value = ( event.start.format('t') ==='p' ? 'PM' : 'AM' );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t$( calendarIdSelector ).fullCalendar( 'renderEvent', event, true );\n\t\t\t},\n\t\t\tdisplayEventEnd: isEventEndDateTime,\n\t\t\ttimeFormat: 'H(:mm:ss)t',\n\t\t\teventDurationEditable: true,\n\t\t\tdisplayEventTime: isEventStartTime\n\t\t});\n\t\t$('#fullCalendarLoading').css(\"display\", \"none\");\n\n\t\t// Handle the \"Save page\" button\n\t\t$( \"#pfForm\" ).submit(function( event ) {\n\t\t\tallEvents = $( calendarIdSelector ).fullCalendar('clientEvents');\n\t\t\tvar dateValue = '';\n\t\t\tvar day = '';\n\t\t\tvar month = '';\n\t\t\tvar year = '';\n\t\t\tvar hour = '';\n\t\t\tvar minute = '';\n\t\t\tvar second = '';\n\t\t\tvar ampm24h = ' ';\n\t\t\tfor( i =0;i<allEvents.length;i++ ) {\n\t\t\t\tvar eventContent = allEvents[i].contents;\n\t\t\t\tvar finalFieldValues = [];\n\t\t\t\tfor( var ii=0; ii < calendarParams[templateName].length; ii++ ) {\n\t\t\t\t\tparameterName = calendarParams[templateName][ii].name;\n\t\t\t\t\tvar inputValue = '';\n\t\t\t\t\tif( fieldType[parameterName] === \"date\" ) {\n\t\t\t\t\t\tdateValue = '';\n\t\t\t\t\t\tday = '';\n\t\t\t\t\t\tmonth = '';\n\t\t\t\t\t\tyear = '';\n\t\t\t\t\t\tfor ( j = 0; j < eventContent.length; j++ ) {\n\t\t\t\t\t\t\tif( eventContent[j].name.includes('['+parameterName+']') ) {\n\t\t\t\t\t\t\t\tif( eventContent[j].name.includes('[day]') ) {\n\t\t\t\t\t\t\t\t\tday = eventContent[j].value.replace(/(^|-)0+/g, \"$1\");\n\t\t\t\t\t\t\t\t} else if( eventContent[j].name.includes('[year]') ) {\n\t\t\t\t\t\t\t\t\tyear = eventContent[j].value;\n\t\t\t\t\t\t\t\t} else if( eventContent[j].name.includes('[month]') ) {\n\t\t\t\t\t\t\t\t\tmonth = eventContent[j].value;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( mw.config.get('wgAmericanDates') ) {\n\t\t\t\t\t\t\tif( englishMonthNames.indexOf(month) ) {\n\t\t\t\t\t\t\t\tdateValue = month + ' ' + day + ', ' + year;\n\t\t\t\t\t\t\t} else if ( englishMonthNames.indexOf(month) === -1 ) {\n\t\t\t\t\t\t\t\tdateValue = englishMonthNames[ parseInt(month) - 1 ] + ' ' + day + ', ' + year;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tdateValue = year + '/' + month + '/' + padNumber(day);\n\t\t\t\t\t\t\tif( year === '' && month === '' && day === '' || year === '' && month === '' ) {\n\t\t\t\t\t\t\t\tdateValue = '';\n\t\t\t\t\t\t\t} else if ( day === '' ) {\n\t\t\t\t\t\t\t\tif( month === '' && year !== '' ) {\n\t\t\t\t\t\t\t\t\tdateValue = month;\n\t\t\t\t\t\t\t\t} else if ( month !== '' && year === '' ) {\n\t\t\t\t\t\t\t\t\tdateValue = year;\n\t\t\t\t\t\t\t\t} else if ( month !== '' && year !== '' ) {\n\t\t\t\t\t\t\t\t\tdateValue = month + ' ' + year;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tinputValue = dateValue;\n\t\t\t\t\t} else if ( fieldType[parameterName] === \"datetime\" ) {\n\t\t\t\t\t\tdateValue = '';\n\t\t\t\t\t\tday = '';\n\t\t\t\t\t\tmonth = '';\n\t\t\t\t\t\tyear = '';\n\t\t\t\t\t\thour = '';\n\t\t\t\t\t\tminute = '';\n\t\t\t\t\t\tsecond = '';\n\t\t\t\t\t\tampm24h = ' ';\n\t\t\t\t\t\tfor( j = 0; j < eventContent.length; j++ ) {\n\t\t\t\t\t\t\tif( eventContent[j].name.includes('['+parameterName+']') ) {\n\t\t\t\t\t\t\t\tif( eventContent[j].name.includes('[day]') ) {\n\t\t\t\t\t\t\t\t\tday = eventContent[j].value.replace(/(^|-)0+/g, \"$1\");\n\t\t\t\t\t\t\t\t} else if( eventContent[j].name.includes('[year]') ) {\n\t\t\t\t\t\t\t\t\tyear = eventContent[j].value;\n\t\t\t\t\t\t\t\t} else if( eventContent[j].name.includes('[month]') ) {\n\t\t\t\t\t\t\t\t\tmonth = eventContent[j].value;\n\t\t\t\t\t\t\t\t} else if( eventContent[j].name.includes('[hour]') ) {\n\t\t\t\t\t\t\t\t\thour = eventContent[j].value;\n\t\t\t\t\t\t\t\t} else if( eventContent[j].name.includes('[minute]') ) {\n\t\t\t\t\t\t\t\t\tminute = eventContent[j].value;\n\t\t\t\t\t\t\t\t} else if( eventContent[j].name.includes('[second]') ) {\n\t\t\t\t\t\t\t\t\tsecond = eventContent[j].value;\n\t\t\t\t\t\t\t\t} else if( eventContent[j].name.includes('[ampm24h]') ) {\n\t\t\t\t\t\t\t\t\tampm24h = (eventContent[j].value !== '' ) ? eventContent[j].value : ' ';\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( mw.config.get('wgAmericanDates') ) {\n\t\t\t\t\t\t\tif( englishMonthNames.indexOf(month) ) {\n\t\t\t\t\t\t\t\tdateValue = month + ' ' + day + ', ' + year + ' ' + padNumber(hour) + ':' + padNumber(minute) + ':' + padNumber(second) + ' ' + ampm24h;\n\t\t\t\t\t\t\t} else if ( englishMonthNames.indexOf(month) === -1 ) {\n\t\t\t\t\t\t\t\tdateValue = englishMonthNames[ parseInt(month) - 1 ] + ' ' + day + ', ' + year + ' ' + padNumber(hour) + ':' + padNumber(minute) + ':' + padNumber(second) + ' ' + ampm24h;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tdateValue = year + '/' + month + '/' + padNumber( day ) + ' ' + padNumber(hour) + ':' + padNumber(minute) + ':' + padNumber(second) + ' ' + ampm24h;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tinputValue = dateValue;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvar checkboxesFinal = '';\n\t\t\t\t\t\tcheckboxesNum= [];\n\t\t\t\t\t\tif ( fieldType[parameterName] === 'checkboxes' || fieldType[parameterName] === 'listbox' ) {\n\t\t\t\t\t\t\tfor ( j = 0; j < eventContent.length; j++ ) {\n\t\t\t\t\t\t\t\tif ( eventContent[j].name.includes('['+parameterName+']') && !eventContent[j].name.includes('[is_list]') ) {\n\t\t\t\t\t\t\t\t\tcheckboxesNum.push(eventContent[j].value);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tfor ( var t = 0; t < checkboxesNum.length; t++ ) {\n\t\t\t\t\t\t\t\tif( t < checkboxesNum.length -1 ) {\n\t\t\t\t\t\t\t\t\tcheckboxesFinal += checkboxesNum[t] + ', ';\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tcheckboxesFinal += checkboxesNum[t];\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tinputValue = checkboxesFinal;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tfor ( j = 0; j < eventContent.length; j++ ) {\n\t\t\t\t\t\t\t\tif ( eventContent[j].name.includes('['+parameterName+']') ) {\n\t\t\t\t\t\t\t\t\tinputValue = eventContent[j].value;\n\t\t\t\t\t\t\t\t}\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\tvar inputName = templateName + '['+ (i+1) +'][' + parameterName + ']';\n\t\t\t\t\tfinalFieldValues[inputName] = inputValue;\n\t\t\t\t\t$('<input>').attr( 'type', 'hidden' ).attr( 'name', inputName ).attr( 'value',finalFieldValues[inputName] ).appendTo( '#pfForm' );\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor ( var k = 0; k < eventsNoDate.length; k++ ) {\n\t\t\t\tvar index = i+1;\n\t\t\t\tfor( var jj = 0; jj < calendarParams[templateName].length; jj++ ) {\n\t\t\t\t\tparameterName = calendarParams[templateName][jj].name;\n\t\t\t\t\tvar entryName = templateName + '['+ (index) +'][' + parameterName + ']';\n\t\t\t\t\t$('<input>').attr( 'type', 'hidden' ).attr( 'name', entryName ).attr( 'value',eventsNoDate[k][parameterName] ).appendTo( '#pfForm' );\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t});\n}( jQuery, mediaWiki, pf ) );\n","usedDeprecatedRules":[]},{"filePath":"/src/repo/libs/PF_PageSchemas.js","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/libs/PF_autoedit.js","messages":[{"ruleId":"no-jquery/variable-pattern","severity":1,"message":"jQuery collection names must match the variablePattern","line":21,"column":7,"nodeType":"VariableDeclarator","endLine":21,"endColumn":32},{"ruleId":"no-shadow","severity":1,"message":"'$' is already declared in the upper scope on line 9 column 14.","line":79,"column":39,"nodeType":"Identifier","messageId":"noShadow","endLine":79,"endColumn":40}],"errorCount":0,"warningCount":2,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/**\n * Javascript handler for the autoedit parser function\n *\n * @author Stephan Gambke\n */\n\n/*global confirm */\n\n( function ( $, mw ) {\n\n\t'use strict';\n\n\tvar autoEditHandler = function handleAutoEdit(){\n\n\t\tif ( mw.config.get( 'wgUserName' ) === null &&\n\t\t\t! confirm( mw.msg( 'pf_autoedit_anoneditwarning' ) ) ) {\n\n\t\t\treturn;\n\t\t}\n\n\t\tvar jtrigger = jQuery( this );\n\t\tvar jautoedit = jtrigger.closest( '.autoedit' );\n\t\tvar jresult = jautoedit.find( '.autoedit-result' );\n\n\t\tvar reload = jtrigger.hasClass( 'reload' );\n\n\t\tjtrigger.attr( 'class', 'autoedit-trigger autoedit-trigger-wait' );\n\t\tjresult.attr( 'class', 'autoedit-result autoedit-result-wait' );\n\n\t\tjresult.text( mw.msg( 'pf-autoedit-wait' ) );\n\n\n\t\t// data array to be sent to the server\n\t\tvar data = {\n\t\t\taction: 'pfautoedit',\n\t\t\tformat: 'json'\n\t\t};\n\n\t\t// add form values to the data\n\t\tdata.query =  jautoedit.find( 'form.autoedit-data' ).serialize();\n\n\t\t$.ajax( {\n\n\t\t\ttype:     'POST', // request type ( GET or POST )\n\t\t\turl:      mw.util.wikiScript( 'api' ), // URL to which the request is sent\n\t\t\tdata:     data, // data to be sent to the server\n\t\t\tdataType: 'json', // type of data expected back from the server\n\t\t\tsuccess:  function ( result ){\n\t\t\t\tjresult.empty().append( result.responseText );\n\n\t\t\t\tif ( result.status === 200 ) {\n\n\t\t\t\t\tif ( reload ) {\n\t\t\t\t\t\twindow.location.reload();\n\t\t\t\t\t}\n\n\t\t\t\t\tjresult.removeClass( 'autoedit-result-wait' ).addClass( 'autoedit-result-ok' );\n\t\t\t\t\tjtrigger.removeClass( 'autoedit-trigger-wait' ).addClass( 'autoedit-trigger-ok' );\n\t\t\t\t} else {\n\t\t\t\t\tjresult.removeClass( 'autoedit-result-wait' ).addClass( 'autoedit-result-error' );\n\t\t\t\t\tjtrigger.removeClass( 'autoedit-trigger-wait' ).addClass( 'autoedit-trigger-error' );\n\t\t\t\t}\n\t\t\t}, // function to be called if the request succeeds\n\t\t\terror:  function ( jqXHR, textStatus, errorThrown ) {\n\t\t\t\tvar result = jQuery.parseJSON(jqXHR.responseText);\n\t\t\t\tvar text = result.responseText;\n\n\t\t\t\tfor ( var i = 0; i < result.errors.length; i++ ) {\n\t\t\t\t\ttext += ' ' + result.errors[i].message;\n\t\t\t\t}\n\n\t\t\t\tjresult.empty().append( text );\n\t\t\t\tjresult.removeClass( 'autoedit-result-wait' ).addClass( 'autoedit-result-error' );\n\t\t\t\tjtrigger.removeClass( 'autoedit-trigger-wait' ).addClass( 'autoedit-trigger-error' );\n\t\t\t} // function to be called if the request fails\n\t\t} );\n\t};\n\n\tjQuery( document ).ready( function ( $ ) {\n\t\t$( '.autoedit-trigger' ).click( autoEditHandler );\n\t} );\n\n}( jQuery, mediaWiki ) );\n","usedDeprecatedRules":[]},{"filePath":"/src/repo/libs/PF_autogrow.js","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/libs/PF_checkboxes.js","messages":[{"ruleId":"no-jquery/variable-pattern","severity":1,"message":"jQuery collection names must match the variablePattern","line":16,"column":8,"nodeType":"VariableDeclarator","endLine":16,"endColumn":51},{"ruleId":"no-jquery/variable-pattern","severity":1,"message":"jQuery collection names must match the variablePattern","line":32,"column":8,"nodeType":"VariableDeclarator","endLine":32,"endColumn":74},{"ruleId":"no-jquery/variable-pattern","severity":1,"message":"jQuery collection names must match the variablePattern","line":39,"column":8,"nodeType":"VariableDeclarator","endLine":39,"endColumn":85},{"ruleId":"no-shadow","severity":1,"message":"'$' is already declared in the upper scope on line 7 column 14.","line":47,"column":24,"nodeType":"Identifier","messageId":"noShadow","endLine":47,"endColumn":25}],"errorCount":0,"warningCount":4,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/**\n * Javascript handler for the checkboxes input type\n *\n * @author Stephan Gambke\n */\n\n( function ( $, mw ) {\n\n\t'use strict';\n\n\t// jQuery plugin that will attach a select all/select none switch to all checkboxes in \"this\" element\n\t$.fn.appendSelectionSwitches = function () {\n\n\t\tfunction insertSwitch( switchesWrapper, label, checked  ) {\n\t\t\t// create a link element that will trigger the selection of all checkboxes\n\t\t\tvar link = $( '<a href=\"#\">' + label + '</a>' );\n\n\t\t\t// will be initialized only when the event is triggered to avoid lag during page loading\n\t\t\tvar $checkboxes;\n\n\t\t\t// attach an event handler\n\t\t\tlink.click( function ( event ) {\n\t\t\t\tevent.preventDefault();\n\n\t\t\t\t// store checkboxes during first method call so the DOM is not searched on every click on the link\n\t\t\t\t$checkboxes = $checkboxes || switchesWrapper.siblings().find( 'input[type=\"checkbox\"]' );\n\n\t\t\t\t$checkboxes.prop( 'checked', checked );\n\t\t\t} );\n\n\t\t\t// wrap the link into a span to simplify styling\n\t\t\tvar switchWrapper = $('<span class=\"checkboxSwitch\">' ).append( link );\n\n\t\t\t// insert the complete switch into the DOM\n\t\t\tswitchesWrapper.append( switchWrapper );\n\t\t}\n\n\t\tthis.each( function ( index, element ) {\n\t\t\tvar switchesWrapper = $( '<span class=\"checkboxSwitches\">' ).prependTo( element );\n\t\t\tinsertSwitch( switchesWrapper, mw.message( 'pf_forminputs_checkboxes_select_all' ).escaped(), true );\n\t\t\tinsertSwitch( switchesWrapper, mw.message( 'pf_forminputs_checkboxes_select_none' ).escaped(), false );\n\t\t} );\n\n\t\treturn this;\n\t};\n\n\t$().ready( function ( $ ) {\n\t\t$( '.checkboxesSpan.select-all' ).appendSelectionSwitches();\n\t} );\n\n}( jQuery, mediaWiki ) );\n","usedDeprecatedRules":[]},{"filePath":"/src/repo/libs/PF_collapsible.js","messages":[{"ruleId":"no-jquery/variable-pattern","severity":1,"message":"jQuery collection names must match the variablePattern","line":27,"column":7,"nodeType":"VariableDeclarator","endLine":27,"endColumn":30}],"errorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/**\n * PF_collapsible.js\n *\n * Allows for collapsible fieldsets.\n *\n * This code was originally based heavily on the 'coolfieldset' jQuery plugin:\n * http://w3shaman.com/article/jquery-plugin-collapsible-fieldset\n *\n * Now it's less so, because that code used a .toggle() function that was\n * removed in jQuery 1.9.\n */\n\nfunction pfHideFieldsetContent(obj){\n\tobj.find('div').slideUp( 'medium' );\n\tobj.removeClass(\"pfExpandedFieldset\");\n\tobj.addClass(\"pfCollapsedFieldset\");\n}\n\nfunction pfShowFieldsetContent(obj){\n\tobj.find('div').slideDown( 'medium' );\n\tobj.removeClass(\"pfCollapsedFieldset\");\n\tobj.addClass(\"pfExpandedFieldset\");\n}\n\njQuery.fn.pfMakeCollapsible = function(){\n\tthis.each(function(){\n\t\tvar fieldset = jQuery(this);\n\n\t\tfieldset.children('legend').click( function() {\n\t\t\tif (fieldset.hasClass('pfCollapsedFieldset')) {\n\t\t\t\tpfShowFieldsetContent(fieldset);\n\t\t\t} else {\n\t\t\t\tpfHideFieldsetContent(fieldset);\n\t\t\t}\n\t\t});\n\t\tpfHideFieldsetContent(fieldset);\n\t});\n};\n\njQuery(document).ready(function() {\n\tjQuery('.pfCollapsibleFieldset').pfMakeCollapsible();\n});\n","usedDeprecatedRules":[]},{"filePath":"/src/repo/libs/PF_datepicker.js","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/libs/PF_datetimepicker.js","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/libs/PF_editWarning.js","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/libs/PF_formInput.js","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/libs/PF_imagePreview.js","messages":[{"ruleId":"jsdoc/check-tag-names","severity":1,"message":"Invalid JSDoc tag name \"licence\".","line":4,"column":null,"nodeType":"Block","endLine":4,"endColumn":null},{"ruleId":"no-unreachable-loop","severity":1,"message":"Invalid loop. Its body allows only one iteration.","line":28,"column":7,"nodeType":"ForStatement","messageId":"invalid","endLine":31,"endColumn":8}],"errorCount":0,"warningCount":2,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/**\n * JavaScript for the Page Forms MediaWiki extension.\n *\n * @licence GNU GPL v3+\n * @author Jeroen De Dauw <jeroendedauw at gmail dot com>\n */\n\n( function ( $, mw ) {\n\tvar _this = this;\n\n\tthis.getPreviewImage = function( args, callback ) {\n\t\t$.getJSON(\n\t\t\tmw.config.get( 'wgScriptPath' ) + '/api.php',\n\t\t\t{\n\t\t\t\t'action': 'query',\n\t\t\t\t'format': 'json',\n\t\t\t\t'prop': 'imageinfo',\n\t\t\t\t'iiprop': 'url',\n\t\t\t\t'titles': 'File:' + args.title,\n\t\t\t\t'iiurlwidth': args.width\n\t\t\t},\n\t\t\tfunction( data ) {\n\t\t\t\tif ( data.query && data.query.pages ) {\n\t\t\t\t\tvar pages = data.query.pages;\n\n\t\t\t\t\tfor ( var p in pages ) { // object, not an array\n\t\t\t\t\t\tvar info = pages[p].imageinfo;\n\t\t\t\t\t\tfor ( var i = 0; i < info.length; i++ ) {\n\t\t\t\t\t\t\tcallback( info[i].thumburl );\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcallback( false );\n\t\t\t}\n\t\t);\n\t};\n\n\t$( document ).ready( function() {\n\t\t$( '.pfImagePreview' ).each( function( index, domElement ) {\n\t\t\tvar $uploadLink = $( domElement );\n\t\t\tvar inputId = $uploadLink.attr( 'data-input-id' );\n\t\t\tvar $input = $( '#' + inputId );\n\t\t\tvar $previewDiv = $( '#' + inputId + '_imagepreview' );\n\n\t\t\tvar showPreview = function() {\n\t\t\t\t_this.getPreviewImage(\n\t\t\t\t\t{\n\t\t\t\t\t\t'title': $input.val(),\n\t\t\t\t\t\t'width': 200\n\t\t\t\t\t},\n\t\t\t\t\tfunction( url ) {\n\t\t\t\t\t\tif ( url === false ) {\n\t\t\t\t\t\t\t$previewDiv.html( '' );\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t$previewDiv.html( $( '<img />' ).attr( { 'src': url } ) );\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$input.change( showPreview );\n\t\t} );\n\t} );\n}( jQuery, mediaWiki ) );\n","usedDeprecatedRules":[]},{"filePath":"/src/repo/libs/PF_maps.js","messages":[{"ruleId":"no-jquery/variable-pattern","severity":1,"message":"jQuery collection names must match the variablePattern","line":136,"column":8,"nodeType":"VariableDeclarator","endLine":136,"endColumn":107},{"ruleId":"no-jquery/variable-pattern","severity":1,"message":"jQuery collection names must match the variablePattern","line":137,"column":8,"nodeType":"VariableDeclarator","endLine":137,"endColumn":93},{"ruleId":"no-jquery/variable-pattern","severity":1,"message":"jQuery collection names must match the variablePattern","line":138,"column":8,"nodeType":"VariableDeclarator","endLine":139,"endColumn":55},{"ruleId":"no-shadow","severity":1,"message":"'bounds' is already declared in the upper scope on line 200 column 8.","line":254,"column":10,"nodeType":"Identifier","messageId":"noShadow","endLine":254,"endColumn":16},{"ruleId":"no-shadow","severity":1,"message":"'map' is already declared in the upper scope on line 8 column 6.","line":303,"column":31,"nodeType":"Identifier","messageId":"noShadow","endLine":303,"endColumn":34},{"ruleId":"jsdoc/require-returns","severity":1,"message":"Missing JSDoc @return declaration.","line":310,"column":2,"nodeType":"Block","endLine":315,"endColumn":5},{"ruleId":"jsdoc/require-param-type","severity":1,"message":"Missing JSDoc @param \"num\" type.","line":314,"column":null,"nodeType":"Block","endLine":314,"endColumn":null}],"errorCount":0,"warningCount":7,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/**\n * @author Yaron Koren\n */\n\n/* global L */\n\nfunction setupMapFormInput( inputDiv, mapService ) {\n\tvar map, marker, markers, mapCanvas, mapOptions;\n\tvar imageHeight = null, imageWidth = null;\n\tvar numClicks = 0, timer = null;\n\n\tif ( mapService === \"Google Maps\" ) {\n\t\tmapCanvas = inputDiv.find('.pfMapCanvas')[0];\n\t\tmapOptions = {\n\t\t\tzoom: 1,\n\t\t\tcenter: new google.maps.LatLng(0,0)\n\t\t};\n\t\tmap = new google.maps.Map(mapCanvas, mapOptions);\n\t\tvar geocoder = new google.maps.Geocoder();\n\n\t\t// Let a click set the marker, while keeping the default\n\t\t// behavior (zoom and center) for double clicks.\n\t\t// Code copied from http://stackoverflow.com/a/8417447\n\t\tgoogle.maps.event.addListener( map, 'click', function( event ) {\n\t\t\ttimer = setTimeout( function() {\n\t\t\t\tgoogleMapsSetMarker( event.latLng );\n\t\t\t}, 200 );\n\t\t});\n\t\tgoogle.maps.event.addListener( map, 'dblclick', function( event ) {\n\t\t\tclearTimeout( timer );\n\t\t});\n\t} else if (mapService === \"Leaflet\") {\n\t\tmapCanvas = inputDiv.find('.pfMapCanvas').get(0);\n\t\tmapOptions = {\n\t\t\tzoom: 1,\n\t\t\tcenter: [ 0, 0 ]\n\t\t};\n\t\tvar layerOptions = {\n\t\t\tattribution: '&copy; <a href=\"https://www.openstreetmap.org/copyright\">OpenStreetMap</a> contributors'\n\t\t};\n\n\t\tvar imageUrl = inputDiv.attr('data-image-path');\n\t\tif ( imageUrl !== undefined ) {\n\t\t\timageHeight = inputDiv.attr('data-height');\n\t\t\timageWidth = inputDiv.attr('data-width');\n\t\t\tmapOptions.crs = L.CRS.Simple;\n\t\t}\n\n\t\tmap = L.map(mapCanvas, mapOptions);\n\n\t\tif ( imageUrl !== undefined ) {\n\t\t\tvar imageBounds = [ [ 0, 0 ], [ imageHeight, imageWidth ] ];\n\t\t\tL.imageOverlay(imageUrl, imageBounds).addTo(map);\n\t\t\tmap.fitBounds(imageBounds);\n\t\t} else {\n\t\t\tnew L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', layerOptions).addTo(map);\n\t\t}\n\n\t\tmap.on( 'click', function( event ) {\n\t\t\t// Place/move the marker only on a single click, not a\n\t\t\t// double click (double clicks do a zoom).\n\t\t\t// Code based on https://stackoverflow.com/a/7845282\n\t\t\tnumClicks++;\n\t\t\tif (numClicks === 1) {\n\t\t\t\ttimer = setTimeout( function() {\n\t\t\t\t\tleafletSetMarker( event.latlng );\n\t\t\t\t\tnumClicks = 0;\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tclearTimeout(timer);\n\t\t\t\tnumClicks = 0;\n\t\t\t}\n\t\t});\n\t} else { // if ( mapService === \"OpenLayers\" ) {\n\t\tvar mapCanvas = inputDiv.find('.pfMapCanvas');\n\t\tvar mapCanvasID = mapCanvas.attr('id');\n\t\tif ( mapCanvasID === undefined ) {\n\t\t\t// If no ID is set, it's probably in a multiple-\n\t\t\t// instance template; just set the ID to a random\n\t\t\t// string, so we can attach the map to it.\n\t\t\tmapCanvasID = mapCanvas.attr('data-origID') + '-' +\n\t\t\t\tMath.random().toString(36).substring(2, 15);\n\t\t\tmapCanvas.attr('ID', mapCanvasID);\n\t\t}\n\t\tmap = new OpenLayers.Map( mapCanvasID );\n\t\t// We do this more complex initialization, rather than just\n\t\t// calling OpenLayers.Layer.OSM(), so that the tiles will be\n\t\t// loaded via either HTTP or HTTPS, depending on what we are\n\t\t// using.\n\t\tmap.addLayer( new OpenLayers.Layer.OSM(\n\t\t\t\"OpenStreetMap\",\n\t\t\t// Official OSM tileset as protocol-independent URLs\n\t\t\t[\n\t\t\t\t'//a.tile.openstreetmap.org/${z}/${x}/${y}.png',\n\t\t\t\t'//b.tile.openstreetmap.org/${z}/${x}/${y}.png',\n\t\t\t\t'//c.tile.openstreetmap.org/${z}/${x}/${y}.png'\n\t\t\t],\n\t\t\tnull\n\t\t) );\n\n\t\tmap.zoomTo(0);\n\t\tmarkers = new OpenLayers.Layer.Markers( \"Markers\" );\n\t\tmap.addLayer( markers );\n\n\t\tmap.events.register(\"click\", map, function(e) {\n\t\t\tnumClicks++;\n\t\t\tif (numClicks === 1) {\n\t\t\t\ttimer = setTimeout( function() {\n\t\t\t\t\tvar loc = map.getLonLatFromPixel( e.xy );\n\t\t\t\t\topenLayersSetMarker( loc );\n\t\t\t\t\tnumClicks = 0;\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tclearTimeout(timer);\n\t\t\t\tnumClicks = 0;\n\t\t\t}\n\t\t});\n\t}\n\n\tvar coordsInput = inputDiv.find('.pfCoordsInput');\n\tcoordsInput.keypress( function( e ) {\n\t\t// Is this still necessary for IE compatibility?\n\t\tvar keycode = (e.keyCode ? e.keyCode : e.which);\n\t\tif ( keycode == 13 ) {\n\t\t\tsetMarkerFromCoordinates();\n\t\t\t// Prevent the form from getting submitted.\n\t\t\te.preventDefault();\n\t\t\t$(this).removeClass( 'modifiedInput' )\n\t\t\t\t.parent().find('.pfCoordsInputHelpers').remove();\n\t\t}\n\t});\n\n\tcoordsInput.keydown( function( e ) {\n\t\tif ( ! coordsInput.hasClass( 'modifiedInput' ) ) {\n\t\t\tcoordsInput.addClass( 'modifiedInput' );\n\t\t\tvar checkMark = $('<a></a>').addClass( 'pfCoordsCheckMark' ).css( 'color', 'green' ).html( '&#10004;' );\n\t\t\tvar xMark = $('<a></a>').addClass( 'pfCoordsX' ).css( 'color', 'red' ).html( '&#10008;' );\n\t\t\tvar marksDiv = $('<span></span>').addClass( 'pfCoordsInputHelpers' )\n\t\t\t\t.append( checkMark ).append( ' ' ).append( xMark );\n\t\t\tcoordsInput.parent().append( marksDiv );\n\n\t\t\tcheckMark.click( function() {\n\t\t\t\tsetMarkerFromCoordinates();\n\t\t\t\tcoordsInput.removeClass( 'modifiedInput' );\n\t\t\t\tmarksDiv.remove();\n\t\t\t});\n\n\t\t\txMark.click( function() {\n\t\t\t\tcoordsInput.removeClass( 'modifiedInput' )\n\t\t\t\t\t.val( coordsInput.attr('data-original-value') );\n\t\t\t\tmarksDiv.remove();\n\t\t\t});\n\t\t}\n\t});\n\n\tinputDiv.find('.pfAddressInput').keypress( function( e ) {\n\t\t// Is this still necessary fro IE compatibility?\n\t\tvar keycode = (e.keyCode ? e.keyCode : e.which);\n\t\tif ( keycode == 13 ) {\n\t\t\tsetMarkerFromAddress();\n\t\t\t// Prevent the form from getting submitted.\n\t\t\te.preventDefault();\n\t\t}\n\t});\n\n\tinputDiv.find('.pfLookUpAddress').click( function() {\n\t\tsetMarkerFromAddress();\n\t});\n\n\n\tif ( coordsInput.val() != '' ) {\n\t\tif ( mapService == 'OpenLayers' ) {\n\t\t\tmap.zoomTo( 14 );\n\t\t} else {\n\t\t\tmap.setZoom( 14 );\n\t\t}\n\t\t// This has to be called after the zooming, for the OpenLayers\n\t\t// zoom to work correctly.\n\t\tsetMarkerFromCoordinates();\n\t} else {\n\t\tif ( coordsInput.attr('data-bound-coords') ) {\n\t\t\tvar boundCoords = coordsInput.attr('data-bound-coords');\n\t\t\tvar coords = boundCoords.split(\";\");\n\t\t\tvar boundCoords1 = coords[0];\n\t\t\tvar lat1 = boundCoords1.split(\",\")[0].trim();\n\t\t\tvar lon1 = boundCoords1.split(\",\")[1].trim();\n\t\t\tvar boundCoords2 = coords[1];\n\t\t\tvar lat2 = boundCoords2.split(\",\")[0].trim();\n\t\t\tvar lon2 = boundCoords2.split(\",\")[1].trim();\n\t\t\tif ( !jQuery.isNumeric( lat1 ) || !jQuery.isNumeric( lon1 ) ||\n\t\t\t!jQuery.isNumeric( lat2 ) || !jQuery.isNumeric( lon2 ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif ( lat1 < -90 || lat1 > 90 || lon1 < -180 || lon1 > 180 ||\n\t\t\t\tlat2 < -90 || lat2 > 90 || lon2 < -180 || lon2 > 180 ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tvar bound1 = new google.maps.LatLng(lat1, lon1);\n\t\t\tvar bound2 = new google.maps.LatLng(lat2, lon2);\n\t\t\tvar bounds = new google.maps.LatLngBounds();\n\t\t\tbounds.extend(bound1);\n\t\t\tbounds.extend(bound2);\n\t\t\tmap.fitBounds(bounds);\n\t\t}\n\t}\n\n\tfunction setMarkerFromAddress() {\n\t\tvar currentMapName = coordsInput.attr('name');\n\t\tvar allFeedersForCurrentMap = jQuery('[data-feeds-to-map=\"' + currentMapName + '\"]').map( function() {\n\t\t\treturn $( this ).val()\n\t\t}).get();\n\t\tif ( allFeedersForCurrentMap.length > 0 ) {\n\t\t\t// Assemble a single string from all the address inputs that feed to this map.\n\t\t\tvar addressText = allFeedersForCurrentMap.join( ', ' );\n\t\t} else {\n\t\t\t// No other inputs feed to this map, so use the standard \"Enter address here\" input.\n\t\t\tvar addressText = inputDiv.find('.pfAddressInput').val();\n\t\t}\n\t\tif ( mapService === \"Google Maps\" ) {\n\t\t\tgeocoder.geocode( { 'address': addressText }, function(results, status) {\n\t\t\t\tif (status == google.maps.GeocoderStatus.OK) {\n\t\t\t\t\tmap.setCenter(results[0].geometry.location);\n\t\t\t\t\tgoogleMapsSetMarker( results[0].geometry.location );\n\t\t\t\t\tmap.setZoom(14);\n\t\t\t\t} else {\n\t\t\t\t\talert(\"Geocode was not successful for the following reason: \" + status);\n\t\t\t\t}\n\t\t\t});\n\t\t} else { // Leaflet, OpenLayers\n\t\t\t$.ajax( 'https://nominatim.openstreetmap.org/search?format=json&q=' + encodeURIComponent( addressText ) )\n\t\t\t.done( function( result ) {\n\t\t\t\tif ( result.length === 0 ) {\n\t\t\t\t\talert(\"Geocode was not successful\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tvar lat = result[0].lat;\n\t\t\t\tvar lon = result[0].lon;\n\t\t\t\t// Use the specified bounds - this is better\n\t\t\t\t// than a preset zoom, because it handles the\n\t\t\t\t// precision correctly for countries, cities,\n\t\t\t\t// etc.\n\t\t\t\tvar boundsStr = String(result[0].boundingbox);\n\t\t\t\tvar vals = boundsStr.split(\",\");\n\t\t\t\tvar bottom = vals[0];\n\t\t\t\tvar top = vals[1];\n\t\t\t\tvar left = vals[2];\n\t\t\t\tvar right = vals[3];\n\t\t\t\tif ( mapService === \"OpenLayers\" ) {\n\t\t\t\t\tvar olPoint = toOpenLayersLonLat( map, lat, lon );\n\t\t\t\t\topenLayersSetMarker( olPoint );\n\t\t\t\t\tmap.setCenter( olPoint );\n\t\t\t\t\tvar fromProjection = new OpenLayers.Projection(\"EPSG:4326\"); // transform from WGS 1984\n\t\t\t\t\tvar toProjection = map.getProjectionObject(); // to Spherical Mercator Projection\n\t\t\t\t\tvar bounds = new OpenLayers.Bounds(left,bottom,right,top).transform(fromProjection,toProjection);\n\t\t\t\t\tmap.zoomToExtent(bounds);\n\t\t\t\t} else if ( mapService === \"Leaflet\" ) {\n\t\t\t\t\tvar lPoint = L.latLng( lat, lon );\n\t\t\t\t\tleafletSetMarker( lPoint );\n\t\t\t\t\tmap.fitBounds([ [ bottom, left ], [ top, right ] ]);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tfunction setMarkerFromCoordinates() {\n\t\tvar coordsText = coordsInput.val();\n\t\tvar coordsParts = coordsText.split(\",\");\n\t\tif ( coordsParts.length != 2 ) {\n\t\t\tcoordsInput.val('');\n\t\t\treturn;\n\t\t}\n\t\tvar lat = coordsParts[0].trim();\n\t\tvar lon = coordsParts[1].trim();\n\t\tif ( !jQuery.isNumeric( lat ) || !jQuery.isNumeric( lon ) ) {\n\t\t\tcoordsInput.val('');\n\t\t\treturn;\n\t\t}\n\t\tif ( lat < -90 || lat > 90 || lon < -180 || lon > 180 ) {\n\t\t\tcoordsInput.val('');\n\t\t\treturn;\n\t\t}\n\t\tif ( mapService === \"Google Maps\" ) {\n\t\t\tvar gmPoint = new google.maps.LatLng( lat, lon );\n\t\t\tgoogleMapsSetMarker( gmPoint );\n\t\t\tmap.setCenter( gmPoint );\n\t\t} else if ( mapService === \"Leaflet\" ){\n\t\t\tif ( imageHeight !== null && imageWidth !== null ) {\n\t\t\t\tlat *= imageWidth / 100;\n\t\t\t\tlon *= imageWidth / 100;\n\t\t\t}\n\t\t\tvar lPoint = L.latLng( lat, lon );\n\t\t\tleafletSetMarker( lPoint );\n\t\t\tif ( imageHeight == null && imageWidth == null ) {\n\t\t\t\tmap.setView( lPoint, 14 );\n\t\t\t}\n\t\t} else { // if ( mapService === \"OpenLayers\" ) {\n\t\t\tvar olPoint = toOpenLayersLonLat( map, lat, lon );\n\t\t\topenLayersSetMarker( olPoint );\n\t\t\tmap.setCenter( olPoint );\n\t\t}\n\t}\n\n\tfunction toOpenLayersLonLat( map, lat, lon ) {\n\t\treturn new OpenLayers.LonLat( lon, lat ).transform(\n\t\t\tnew OpenLayers.Projection(\"EPSG:4326\"), // transform from WGS 1984\n\t\t\tmap.getProjectionObject() // to Spherical Mercator Projection\n\t\t);\n\t}\n\n\t/**\n\t * Round off a number to five decimal places - that's the most\n\t * we need for coordinates, one would think.\n\t *\n\t * @param num\n\t */\n\tfunction pfRoundOffDecimal( num ) {\n\t\treturn Math.round( num * 100000 ) / 100000;\n\t}\n\n\tfunction googleMapsSetMarker(location) {\n\t\tif (marker == undefined){\n\t\t\tmarker = new google.maps.Marker({\n\t\t\t\tposition: location,\n\t\t\t\tmap: map,\n\t\t\t\tdraggable: true\n\t\t\t});\n\t\t\tgoogle.maps.event.addListener( marker, 'dragend', function( event ) {\n\t\t\t\tgoogleMapsSetMarker( event.latLng );\n\t\t\t});\n\n\t\t} else {\n\t\t\tmarker.setPosition(location);\n\t\t}\n\t\tvar stringVal = pfRoundOffDecimal( location.lat() ) + ', ' + pfRoundOffDecimal( location.lng() );\n\t\tcoordsInput.val( stringVal )\n\t\t\t.attr( 'data-original-value', stringVal )\n\t\t\t.removeClass( 'modifiedInput' )\n\t\t\t.parent().find('.pfCoordsInputHelpers').remove();\n\t}\n\n\tfunction leafletSetMarker( location ) {\n\t\tif ( marker == null) {\n\t\t\tmarker = L.marker( location ).addTo( map );\n\t\t} else {\n\t\t\tmarker.setLatLng( location, { draggable: true } );\n\t\t}\n\t\tmarker.dragging.enable();\n\n\t\tfunction setInput() {\n\t\t\tvar lat = marker.getLatLng().lat;\n\t\t\tvar lng = marker.getLatLng().lng;\n\t\t\tif ( imageHeight == null && imageWidth == null ) {\n\t\t\t\t// Normal map.\n\t\t\t\t// Leaflet permits longitude beyond ±180, so\n\t\t\t\t// we have to normalize this here.\n\t\t\t\t// Google Maps and OpenLayers don't have this\n\t\t\t\t// issue.\n\t\t\t\twhile ( lng < -180 ) {\n\t\t\t\t\tlng += 360;\n\t\t\t\t}\n\t\t\t\twhile ( lng > 180 ) {\n\t\t\t\t\tlng -= 360;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tlat *= 100 / imageWidth;\n\t\t\t\tlng *= 100 / imageWidth;\n\t\t\t}\n\t\t\tvar stringVal = pfRoundOffDecimal( lat ) + ', ' +\n\t\t\t\tpfRoundOffDecimal( lng );\n\t\t\tcoordsInput.val( stringVal )\n\t\t\t\t.attr( 'data-original-value', stringVal )\n\t\t\t\t.removeClass( 'modifiedInput' )\n\t\t\t\t.parent().find('.pfCoordsInputHelpers').remove();\n\t\t}\n\n\t\tmarker.off('dragend').on('dragend', function( event ) {\n\t\t\tsetInput();\n\t\t});\n\t\tsetInput();\n\t}\n\n\tfunction openLayersSetMarker( location ) {\n\t\t// OpenLayers does not have a real marker move\n\t\t// option - instead, just delete the old marker\n\t\t// and add a new one.\n\t\tmarkers.clearMarkers();\n\t\tmarker = new OpenLayers.Marker( location );\n\t\tmarkers.addMarker( marker );\n\n\t\t// Transform the coordinates back, in order to display them.\n\t\tvar realLonLat = location.clone();\n\t\trealLonLat.transform(\n\t\t\tmap.getProjectionObject(), // transform from Spherical Mercator Projection\n\t\t\tnew OpenLayers.Projection(\"EPSG:4326\") // to WGS 1984\n\t\t);\n\t\tvar stringVal = pfRoundOffDecimal( realLonLat.lat ) + ', ' + pfRoundOffDecimal( realLonLat.lon );\n\t\tcoordsInput.val( stringVal )\n\t\t\t.attr( 'data-original-value', stringVal )\n\t\t\t.removeClass( 'modifiedInput' )\n\t\t\t.parent().find('.pfCoordsInputHelpers').remove();\n\t}\n}\n\njQuery(document).ready( function() {\n\tjQuery(\".pfGoogleMapsInput\").each( function() {\n\t\t// Ignore the hidden \"starter\" div in multiple-instance templates.\n\t\tif ( $(this).closest(\".multipleTemplateStarter\").length > 0 ) {\n\t\t\treturn;\n\t\t}\n\t\tsetupMapFormInput( jQuery(this), \"Google Maps\" );\n\t});\n\tjQuery(\".pfLeafletInput\").each( function() {\n\t\tif ( $(this).closest(\".multipleTemplateStarter\").length > 0 ) {\n\t\t\treturn;\n\t\t}\n\t\tsetupMapFormInput( jQuery(this), \"Leaflet\" );\n\t});\n\tjQuery(\".pfOpenLayersInput\").each( function() {\n\t\tif ( $(this).closest(\".multipleTemplateStarter\").length > 0 ) {\n\t\t\treturn;\n\t\t}\n\t\tsetupMapFormInput( jQuery(this), \"OpenLayers\" );\n\t});\n});\n\n// Activate maps in a new instance of a multiple-instance template.\nmw.hook('pf.addTemplateInstance').add( function( $newInstance ) {\n\t$newInstance.find(\".pfGoogleMapsInput\").each( function() {\n\t\tsetupMapFormInput( jQuery(this), \"Google Maps\" );\n\t});\n\t$newInstance.find(\".pfLeafletInput\").each( function() {\n\t\tsetupMapFormInput( jQuery(this), \"Leaflet\" );\n\t});\n\t$newInstance.find(\".pfOpenLayersInput\").each( function() {\n\t\tsetupMapFormInput( jQuery(this), \"OpenLayers\" );\n\t});\n});\n","usedDeprecatedRules":[]},{"filePath":"/src/repo/libs/PF_maps.offline.js","messages":[{"ruleId":"jsdoc/require-returns","severity":1,"message":"Missing JSDoc @return declaration.","line":10,"column":2,"nodeType":"Block","endLine":15,"endColumn":5},{"ruleId":"jsdoc/require-param-type","severity":1,"message":"Missing JSDoc @param \"num\" type.","line":14,"column":null,"nodeType":"Block","endLine":14,"endColumn":null},{"ruleId":"no-shadow","severity":1,"message":"'map' is already declared in the upper scope on line 20 column 6.","line":183,"column":31,"nodeType":"Identifier","messageId":"noShadow","endLine":183,"endColumn":34},{"ruleId":"no-jquery/variable-pattern","severity":1,"message":"jQuery collection names must match the variablePattern","line":238,"column":8,"nodeType":"VariableDeclarator","endLine":238,"endColumn":107},{"ruleId":"no-jquery/variable-pattern","severity":1,"message":"jQuery collection names must match the variablePattern","line":239,"column":8,"nodeType":"VariableDeclarator","endLine":239,"endColumn":93},{"ruleId":"no-jquery/variable-pattern","severity":1,"message":"jQuery collection names must match the variablePattern","line":240,"column":8,"nodeType":"VariableDeclarator","endLine":241,"endColumn":55}],"errorCount":0,"warningCount":6,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/**\n * @author Yaron Koren\n * @author Paladox\n */\n\n/* global L */\n\nfunction setupMapFormInput( inputDiv, mapService ) {\n\n\t/**\n\t * Round off a number to five decimal places - that's the most\n\t * we need for coordinates, one would think.\n\t *\n\t * @param num\n\t */\n\tfunction pfRoundOffDecimal( num ) {\n\t\treturn Math.round( num * 100000 ) / 100000;\n\t}\n\n\tvar map, marker, markers, mapCanvas, mapOptions;\n\tvar numClicks = 0, timer = null;\n\n\tvar coordsInput = inputDiv.find('.pfCoordsInput');\n\n\tfunction googleMapsSetMarker( location ) {\n\t\tif ( marker === undefined ){\n\t\t\tmarker = new google.maps.Marker( {\n\t\t\t\tposition: location,\n\t\t\t\tmap: map,\n\t\t\t\tdraggable: true\n\t\t\t} );\n\t\t\tgoogle.maps.event.addListener( marker, 'dragend', function( event ) {\n\t\t\t\tgoogleMapsSetMarker( event.latLng );\n\t\t\t});\n\t\t} else {\n\t\t\tmarker.setPosition(location);\n\t\t}\n\t\tvar stringVal = pfRoundOffDecimal( location.lat() ) + ', ' + pfRoundOffDecimal( location.lng() );\n\t\tcoordsInput.val( stringVal )\n\t\t\t.attr( 'data-original-value', stringVal )\n\t\t\t.removeClass( 'modifiedInput' )\n\t\t\t.parent().find('.pfCoordsInputHelpers').remove();\n\n\t}\n\n\tfunction leafletSetMarker( location ) {\n\t\tif ( marker === null) {\n\t\t\tmarker = L.marker( location ).addTo( map );\n\t\t} else {\n\t\t\tmarker.setLatLng( location, { draggable: true } );\n\t\t}\n\t\tmarker.dragging.enable();\n\n\t\tfunction setInput() {\n\t\t\tvar stringVal = pfRoundOffDecimal( marker.getLatLng().lat ) + ', ' +\n\t\t\t\tpfRoundOffDecimal( marker.getLatLng().lng );\n\t\t\tcoordsInput.val( stringVal )\n\t\t\t\t.attr( 'data-original-value', stringVal )\n\t\t\t\t.removeClass( 'modifiedInput' )\n\t\t\t\t.parent().find('.pfCoordsInputHelpers').remove();\n\t\t}\n\n\t\tmarker.off('dragend').on('dragend', function( event ) {\n\t\t\tsetInput();\n\t\t});\n\t\tsetInput();\n\t}\n\n\tfunction openLayersSetMarker( location ) {\n\t\t// OpenLayers does not have a real marker move\n\t\t// option - instead, just delete the old marker\n\t\t// and add a new one.\n\t\tmarkers.clearMarkers();\n\t\tmarker = new OpenLayers.Marker( location );\n\t\tmarkers.addMarker( marker );\n\n\t\t// Transform the coordinates back, in order to display them.\n\t\tvar realLonLat = location.clone();\n\t\trealLonLat.transform(\n\t\t\tmap.getProjectionObject(), // transform from Spherical Mercator Projection\n\t\t\tnew OpenLayers.Projection(\"EPSG:4326\") // to WGS 1984\n\t\t);\n\t\tvar stringVal = pfRoundOffDecimal( realLonLat.lat ) + ', ' + pfRoundOffDecimal( realLonLat.lon );\n\t\tcoordsInput.val( stringVal )\n\t\t\t.attr( 'data-original-value', stringVal )\n\t\t\t.removeClass( 'modifiedInput' )\n\t\t\t.parent().find('.pfCoordsInputHelpers').remove();\n\t}\n\n\tif ( mapService === \"Google Maps\" ) {\n\t\tmapCanvas = inputDiv.find('.pfMapCanvas')[ 0 ];\n\t\tmapOptions = {\n\t\t\tzoom: 1,\n\t\t\tcenter: new google.maps.LatLng( 0, 0 )\n\t\t};\n\t\tmap = new google.maps.Map( mapCanvas, mapOptions );\n\t\tvar geocoder = new google.maps.Geocoder();\n\n\t\t// Let a click set the marker, while keeping the default\n\t\t// behavior (zoom and center) for double clicks.\n\t\t// Code copied from http://stackoverflow.com/a/8417447\n\t\tgoogle.maps.event.addListener( map, 'click', function( event ) {\n\t\t\ttimer = setTimeout( function(){\n\t\t\t\tgoogleMapsSetMarker( event.latLng );\n\t\t\t}, 200 );\n\t\t});\n\t\tgoogle.maps.event.addListener( map, 'dblclick', function( event ) {\n\t\t\tclearTimeout( timer );\n\t\t});\n\t} else if (mapService === \"Leaflet\") {\n\t\tmapCanvas = inputDiv.find('.pfMapCanvas').get(0);\n\t\tmapOptions = {\n\t\t\tzoom: 1,\n\t\t\tcenter: [ 0, 0 ]\n\t\t};\n\t\tvar layerOptions = {\n\t\t\tattribution: '&copy; <a href=\"https://www.openstreetmap.org/copyright\">OpenStreetMap</a> contributors'\n\t\t};\n\n\t\tmap = L.map(mapCanvas, mapOptions);\n\t\tnew L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', layerOptions).addTo(map);\n\n\t\tmap.on( 'click', function( event ) {\n\t\t\t// Place/move the marker only on a single click, not a\n\t\t\t// double click (double clicks do a zoom).\n\t\t\t// Code based on https://stackoverflow.com/a/7845282\n\t\t\tnumClicks++;\n\t\t\tif (numClicks === 1) {\n\t\t\t\ttimer = setTimeout( function() {\n\t\t\t\t\tleafletSetMarker( event.latlng );\n\t\t\t\t\tnumClicks = 0;\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tclearTimeout(timer);\n\t\t\t\tnumClicks = 0;\n\t\t\t}\n\t\t});\n\t} else { // if ( mapService == \"OpenLayers\" ) {\n\t\tvar mapCanvas = inputDiv.find('.pfMapCanvas');\n\t\tvar mapCanvasID = mapCanvas.attr('id');\n\t\tif ( mapCanvasID === undefined ) {\n\t\t\t// If no ID is set, it's probably in a multiple-\n\t\t\t// instance template; just set the ID to a random\n\t\t\t// string, so we can attach the map to it.\n\t\t\tmapCanvasID = mapCanvas.attr('data-origID') + '-' +\n\t\t\t\tMath.random().toString(36).substring(2, 15);\n\t\t\tmapCanvas.attr('ID', mapCanvasID);\n\t\t}\n\t\tmap = new OpenLayers.Map( mapCanvasID );\n\t\t// We do this more complex initialization, rather than just\n\t\t// calling OpenLayers.Layer.OSM(), so that the tiles will be\n\t\t// loaded via either HTTP or HTTPS, depending on what we are\n\t\t// using.\n\t\tmap.addLayer( new OpenLayers.Layer.OSM(\n\t\t\t\"OpenStreetMap\",\n\t\t\t// Official OSM tileset as protocol-independent URLs\n\t\t\t[\n\t\t\t\t'//a.tile.openstreetmap.org/${z}/${x}/${y}.png',\n\t\t\t\t'//b.tile.openstreetmap.org/${z}/${x}/${y}.png',\n\t\t\t\t'//c.tile.openstreetmap.org/${z}/${x}/${y}.png'\n\t\t\t],\n\t\t\tnull\n\t\t) );\n\t\tmap.zoomTo( 0 );\n\t\tmarkers = new OpenLayers.Layer.Markers( \"Markers\" );\n\t\tmap.addLayer( markers );\n\n\t\tmap.events.register( \"click\", map, function( e ) {\n\t\t\tnumClicks++;\n\t\t\tif (numClicks === 1) {\n\t\t\t\ttimer = setTimeout( function() {\n\t\t\t\t\tvar loc = map.getLonLatFromPixel( e.xy );\n\t\t\t\t\topenLayersSetMarker( loc );\n\t\t\t\t\tnumClicks = 0;\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tclearTimeout(timer);\n\t\t\t\tnumClicks = 0;\n\t\t\t}\n\t\t} );\n\t}\n\n\tfunction toOpenLayersLonLat( map, lat, lon ) {\n\t\treturn new OpenLayers.LonLat( lon, lat ).transform(\n\t\t\tnew OpenLayers.Projection( \"EPSG:4326\" ), // transform from WGS 1984\n\t\t\tmap.getProjectionObject() // to Spherical Mercator Projection\n\t\t);\n\t}\n\n\tfunction setMarkerFromCoordinates() {\n\t\tvar coordsText = coordsInput.val();\n\t\tvar coordsParts = coordsText.split(\",\");\n\t\tif ( coordsParts.length !== 2 ) {\n\t\t\tcoordsInput.val('');\n\t\t\treturn;\n\t\t}\n\t\tvar lat = coordsParts[0].trim();\n\t\tvar lon = coordsParts[1].trim();\n\t\tif ( !jQuery.isNumeric( lat ) || !jQuery.isNumeric( lon ) ) {\n\t\t\tcoordsInput.val('');\n\t\t\treturn;\n\t\t}\n\t\tif ( lat < -90 || lat > 90 || lon < -180 || lon > 180 ) {\n\t\t\tcoordsInput.val('');\n\t\t\treturn;\n\t\t}\n\t\tif ( mapService === \"Google Maps\" ) {\n\t\t\tvar gmPoint = new google.maps.LatLng( lat, lon );\n\t\t\tgoogleMapsSetMarker( gmPoint );\n\t\t\tmap.setCenter( gmPoint );\n\t\t} else if ( mapService === \"Leaflet\" ){\n\t\t\tvar lPoint = L.latLng( lat, lon );\n\t\t\tleafletSetMarker( lPoint );\n\t\t\tmap.setView( lPoint, 14 );\n\t\t} else { // if ( mapService === \"OpenLayers\" ) {\n\t\t\tvar olPoint = toOpenLayersLonLat( map, lat, lon );\n\t\t\topenLayersSetMarker( olPoint );\n\t\t\tmap.setCenter( olPoint, 14 );\n\t\t}\n\t}\n\n\tcoordsInput.keypress( function( e ) {\n\t\t// Is this still necessary fro IE compatibility?\n\t\tvar keycode = (e.keyCode ? e.keyCode : e.which);\n\t\tif ( keycode === 13 ) {\n\t\t\tsetMarkerFromCoordinates();\n\t\t\t// Prevent the form from getting submitted.\n\t\t\te.preventDefault();\n\t\t\t$(this).removeClass( 'modifiedInput' )\n\t\t\t\t.parent().find('.pfCoordsInputHelpers').remove();\n\n\t\t}\n\t});\n\n\tcoordsInput.keydown( function( e ) {\n\t\tif ( ! coordsInput.hasClass( 'modifiedInput' ) ) {\n\t\t\tcoordsInput.addClass( 'modifiedInput' );\n\t\t\tvar checkMark = $('<a></a>').addClass( 'pfCoordsCheckMark' ).css( 'color', 'green' ).html( '&#10004;' );\n\t\t\tvar xMark = $('<a></a>').addClass( 'pfCoordsX' ).css( 'color', 'red' ).html( '&#10008;' );\n\t\t\tvar marksDiv = $('<span></span>').addClass( 'pfCoordsInputHelpers' )\n\t\t\t\t.append( checkMark ).append( ' ' ).append( xMark );\n\t\t\tcoordsInput.parent().append( marksDiv );\n\n\t\t\tcheckMark.click( function() {\n\t\t\t\tsetMarkerFromCoordinates();\n\t\t\t\tcoordsInput.removeClass( 'modifiedInput' );\n\t\t\t\tmarksDiv.remove();\n\t\t\t});\n\n\t\t\txMark.click( function() {\n\t\t\t\tcoordsInput.removeClass( 'modifiedInput' )\n\t\t\t\t\t.val( coordsInput.attr('data-original-value') );\n\t\t\t\tmarksDiv.remove();\n\t\t\t});\n\t\t}\n\t});\n\n\tfunction setMarkerFromAddress() {\n\t\tvar addressText = inputDiv.find('.pfAddressInput').val(),\n\t\t\talert;\n\t\tif ( mapService === \"Google Maps\" ) {\n\t\t\tmap.setZoom(14);\n\t\t\tgeocoder.geocode( { 'address': addressText }, function(results, status) {\n\t\t\t\tif (status === google.maps.GeocoderStatus.OK) {\n\t\t\t\t\tmap.setCenter(results[0].geometry.location);\n\t\t\t\t\tgoogleMapsSetMarker( results[0].geometry.location );\n\t\t\t\t\tmap.setZoom(14);\n\t\t\t\t} else {\n\t\t\t\t\talert(\"Geocode was not successful for the following reason: \" + status);\n\t\t\t\t}\n\t\t\t});\n\t\t } else { // Leaflet, OpenLayers\n\t\t\t$.ajax( 'https://nominatim.openstreetmap.org/search?format=json&q=' + encodeURIComponent( addressText ) )\n\t\t\t.done( function( result ) {\n\t\t\t\tif ( result.length === 0 ) {\n\t\t\t\t\talert(\"Geocode was not successful\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tvar lat = result[0].lat;\n\t\t\t\tvar lon = result[0].lon;\n\t\t\t\t// Use the specified bounds - this is better\n\t\t\t\t// than a preset zoom, because it handles the\n\t\t\t\t// precision correctly for countries, cities,\n\t\t\t\t// etc.\n\t\t\t\tvar boundsStr = String(result[0].boundingbox);\n\t\t\t\tvar vals = boundsStr.split(\",\");\n\t\t\t\tvar bottom = vals[0];\n\t\t\t\tvar top = vals[1];\n\t\t\t\tvar left = vals[2];\n\t\t\t\tvar right = vals[3];\n\t\t\t\tif ( mapService === \"OpenLayers\" ) {\n\t\t\t\t\tvar olPoint = toOpenLayersLonLat( map, lat, lon );\n\t\t\t\t\topenLayersSetMarker( olPoint );\n\t\t\t\t\tmap.setCenter( olPoint );\n\t\t\t\t\tvar fromProjection = new OpenLayers.Projection(\"EPSG:4326\"); // transform from WGS 1984\n\t\t\t\t\tvar toProjection = map.getProjectionObject(); // to Spherical Mercator Projection\n\t\t\t\t\tvar bounds = new OpenLayers.Bounds(left,bottom,right,top).transform(fromProjection,toProjection);\n\t\t\t\t\tmap.zoomToExtent(bounds);\n\t\t\t\t} else if ( mapService === \"Leaflet\" ) {\n\t\t\t\t\tvar lPoint = L.latLng( lat, lon );\n\t\t\t\t\tleafletSetMarker( lPoint );\n\t\t\t\t\tmap.fitBounds([ [ bottom, left ], [ top, right ] ]);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tinputDiv.find('.pfAddressInput').keypress( function( e ) {\n\t\t// Is this still necessary fro IE compatibility?\n\t\tvar keycode = (e.keyCode ? e.keyCode : e.which);\n\t\tif ( keycode === 13 ) {\n\t\t\tsetMarkerFromAddress();\n\t\t\t// Prevent the form from getting submitted.\n\t\t\te.preventDefault();\n\t\t}\n\t} );\n\n\tinputDiv.find('.pfLookUpAddress').click( function() {\n\t\tsetMarkerFromAddress();\n\t});\n\n\n\tif ( coordsInput.val() !== '' ) {\n\t\tsetMarkerFromCoordinates();\n\t}\n}\n\njQuery(document).ready( function() {\n\tjQuery(\".pfGoogleMapsInput\").each( function() {\n\t\t// Ignore the hidden \"starter\" div in multiple-instance templates.\n\t\tif ( $(this).closest(\".multipleTemplateStarter\").length > 0 ) {\n\t\t\treturn;\n\t\t}\n\t\tsetupMapFormInput( jQuery(this), \"Google Maps\" );\n\t});\n\tjQuery(\".pfLeafletInput\").each( function() {\n\t\tif ( $(this).closest(\".multipleTemplateStarter\").length > 0 ) {\n\t\t\treturn;\n\t\t}\n\t\tsetupMapFormInput( jQuery(this), \"Leaflet\" );\n\t});\n\tjQuery(\".pfOpenLayersInput\").each( function() {\n\t\tif ( $(this).closest(\".multipleTemplateStarter\").length > 0 ) {\n\t\t\treturn;\n\t\t}\n\t\tsetupMapFormInput( jQuery(this), \"OpenLayers\" );\n\t});\n});\n\n// Activate maps in a new instance of a multiple-instance template.\nmw.hook('pf.addTemplateInstance').add(function( $newInstance ) {\n\t$newInstance.find(\".pfGoogleMapsInput\").each( function() {\n\t\tsetupMapFormInput( jQuery(this), \"Google Maps\" );\n\t});\n\t$newInstance.find(\".pfLeafletInput\").each( function() {\n\t\tsetupMapFormInput( jQuery(this), \"Leaflet\" );\n\t});\n\t$newInstance.find(\".pfOpenLayersInput\").each( function() {\n\t\tsetupMapFormInput( jQuery(this), \"OpenLayers\" );\n\t});\n});\n","usedDeprecatedRules":[]},{"filePath":"/src/repo/libs/PF_popupform.js","messages":[{"ruleId":"no-jquery/variable-pattern","severity":1,"message":"jQuery collection names must match the variablePattern","line":367,"column":3,"nodeType":"AssignmentExpression","endLine":367,"endColumn":57},{"ruleId":"no-jquery/variable-pattern","severity":1,"message":"jQuery collection names must match the variablePattern","line":368,"column":3,"nodeType":"AssignmentExpression","endLine":368,"endColumn":63},{"ruleId":"no-jquery/variable-pattern","severity":1,"message":"jQuery collection names must match the variablePattern","line":370,"column":7,"nodeType":"VariableDeclarator","endLine":370,"endColumn":73},{"ruleId":"no-jquery/variable-pattern","severity":1,"message":"jQuery collection names must match the variablePattern","line":372,"column":3,"nodeType":"AssignmentExpression","endLine":372,"endColumn":109},{"ruleId":"no-jquery/variable-pattern","severity":1,"message":"jQuery collection names must match the variablePattern","line":374,"column":7,"nodeType":"VariableDeclarator","endLine":374,"endColumn":59},{"ruleId":"no-jquery/variable-pattern","severity":1,"message":"jQuery collection names must match the variablePattern","line":376,"column":3,"nodeType":"AssignmentExpression","endLine":376,"endColumn":61},{"ruleId":"no-jquery/variable-pattern","severity":1,"message":"jQuery collection names must match the variablePattern","line":377,"column":3,"nodeType":"AssignmentExpression","endLine":377,"endColumn":71},{"ruleId":"no-jquery/variable-pattern","severity":1,"message":"jQuery collection names must match the variablePattern","line":378,"column":3,"nodeType":"AssignmentExpression","endLine":378,"endColumn":142},{"ruleId":"no-jquery/variable-pattern","severity":1,"message":"jQuery collection names must match the variablePattern","line":380,"column":7,"nodeType":"VariableDeclarator","endLine":380,"endColumn":66},{"ruleId":"no-jquery/variable-pattern","severity":1,"message":"jQuery collection names must match the variablePattern","line":435,"column":7,"nodeType":"VariableDeclarator","endLine":435,"endColumn":36},{"ruleId":"no-jquery/variable-pattern","severity":1,"message":"jQuery collection names must match the variablePattern","line":440,"column":8,"nodeType":"VariableDeclarator","endLine":440,"endColumn":74},{"ruleId":"no-shadow","severity":1,"message":"'iframe' is already declared in the upper scope on line 41 column 6.","line":447,"column":9,"nodeType":"Identifier","messageId":"noShadow","endLine":447,"endColumn":15},{"ruleId":"no-shadow","severity":1,"message":"'doc' is already declared in the upper scope on line 49 column 6.","line":448,"column":9,"nodeType":"Identifier","messageId":"noShadow","endLine":448,"endColumn":12},{"ruleId":"no-jquery/variable-pattern","severity":1,"message":"jQuery collection names must match the variablePattern","line":489,"column":4,"nodeType":"AssignmentExpression","endLine":490,"endColumn":21},{"ruleId":"no-jquery/variable-pattern","severity":1,"message":"jQuery collection names must match the variablePattern","line":613,"column":9,"nodeType":"VariableDeclarator","endLine":613,"endColumn":28},{"ruleId":"no-jquery/no-class-state","severity":1,"message":"Where possible, maintain application state in JS to avoid slower DOM queries","line":765,"column":12,"nodeType":"CallExpression","endLine":765,"endColumn":38},{"ruleId":"no-jquery/no-class-state","severity":1,"message":"Where possible, maintain application state in JS to avoid slower DOM queries","line":779,"column":12,"nodeType":"CallExpression","endLine":779,"endColumn":38}],"errorCount":0,"warningCount":17,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/**\n * Javascript code to be used with extension PageForms for popup forms.\n *\n * @author Stephan Gambke\n *\n */\n/*global escape*/\n\n// initialise\njQuery( function() {\n\n\t// register eventhandlers on 'edit' links and buttons\n\n\t// register formlink with link\n\tjQuery('a.popupformlink').click(function(evt){\n\t\treturn ext.popupform.handlePopupFormLink( this.getAttribute('href'), this );\n\t});\n\n\t// register formlink with button\n\tjQuery( 'form.popupformlink' ).submit(function(evt){\n\t\treturn ext.popupform.handlePopupFormLink( this.getAttribute( 'action' ), this );\n\t});\n\n\t// register forminput\n\tjQuery( 'form.popupforminput' ).submit(function(evt){\n\t\treturn ext.popupform.handlePopupFormInput( this.getAttribute( 'action' ), this );\n\t});\n\n} );\n\n// create ext if it does not exist yet\nif ( typeof( window.ext ) === \"undefined\" ) {\n\twindow.ext = {};\n}\n\nwindow.ext.popupform = ( function () {\n\tvar wrapper;\n\tvar background;\n\tvar container;\n\tvar innerContainer;\n\tvar iframe;\n\tvar content;\n\tvar waitIndicator;\n\tvar instance = 0;\n\n\tvar timer;\n\tvar needsRender = true;\n\n\tvar doc;\n\n\tvar brokenBrowser, brokenChrome;\n\n\tvar padding = 20;\n\tvar reload;\n\tfunction fadeOut(elem, callback ) {\n\t\t// no fading for broken browsers\n\t\tif ( brokenBrowser ){\n\t\t\telem.hide();\n\t\t\tif ( callback ) {\n\t\t\t\tcallback();\n\t\t\t}\n\t\t} else {\n\t\t\t// what an ugly hack\n\t\t\tif ( elem === waitIndicator ) {\n\t\t\t\telem.fadeOut( 200, callback );\n\t\t\t} else {\n\t\t\t\telem.fadeOut( callback );\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction adjustFrameSize( animate ) {\n\t\t// set some inputs\n\t\tvar oldFrameW = container.width();\n\t\tvar oldFrameH = container.height();\n\t\tvar oldContW = content.width();\n\t\tvar oldContH = content.height();\n\n\t\tvar availW = Math.floor( jQuery(window).width() * 0.8 );\n\t\tvar availH = Math.floor( jQuery(window).height() * 0.8 );\n\n\t\tvar emergencyW = Math.floor( jQuery(window).width() * 0.85 );\n\t\tvar emergencyH = Math.floor( jQuery(window).height() * 0.85 );\n\n\t\t// FIXME: these might not be the true values\n\t\tvar scrollW = 25;\n\t\tvar scrollH = 25;\n\n\n\t\t// find the dimensions of the document\n\n\t\tvar body = content.closest('body');\n\t\tvar html = body.parent();\n\n\t\tvar scrollTgt = html;\n\n\t\tif ( jQuery.browser.webkit || jQuery.browser.safari ) {\n\t\t\tscrollTgt = body;\n\t\t}\n\n\t\tvar scrollTop = scrollTgt.scrollTop();\n\t\tvar scrollLeft = scrollTgt.scrollLeft();\n\n\t\tcontent\n\t\t.css('position', 'absolute')\n\t\t.width( 'auto' )\n\t\t.height( 'auto' );\n\n\t\t// set max dimensions for layout of content\n\t\tiframe\n\t\t.width( emergencyW )\n\t\t.height( emergencyH );\n\n\t\t// get dimension values\n\t\tvar docW = content.width();\n\t\tvar docH = content.height();\n\t\t// On Firefox, this doesn't work for some reason, so use\n\t\t// this roundabout method to set the dimensions.\n\t\tif ( docW === 0 || docH === 0 ) {\n\t\t\tdocW = availW * 0.95;\n\t\t\tdocH = availH * 0.95;\n\t\t}\n\n\t\t// set old dimensions for layout of content\n\t\tiframe\n\t\t.width( '100%' )\n\t\t.height( '100%' );\n\n\t\tcontent\n\t\t.css('position', 'relative')\n\t\t.width( oldContW )\n\t\t.height( oldContH );\n\n\t\tif ( jQuery.browser.msie ) {\n\t\t\tdocW += 20;\n\t\t\tdocH += 20;\n\t\t}\n\n\t\tvar docpW = docW + 2 * padding;\n\t\tvar docpH = docH + 2 * padding;\n\n\t\t// Flags\n\n\t\tvar needsHScroll = docpW > emergencyW || ( docpW > emergencyW - scrollW && docpH > emergencyH );\n\t\tvar needsVScroll = docpH > emergencyH || ( docpH > emergencyH - scrollH && docpW > emergencyW );\n\n\t\tvar needsWStretch =\n\t\t( docpW > availW && docpW <= emergencyW ) && ( docpH <= emergencyH ) ||\n\t\t( docpW > availW - scrollW && docpW <= emergencyW - scrollW ) && ( docpH > emergencyH );\n\n\t\tvar needsHStretch =\n\t\t( docpH > availH && docpH <= emergencyH ) && ( docpW <= emergencyW ) ||\n\t\t( docpH > availH - scrollH && docpH <= emergencyH - scrollH ) && ( docpW > emergencyW );\n\n\t\t// Outputs\n\n\t\tvar frameW;\n\t\tvar frameH;\n\n\t\tvar contW;\n\t\tvar contH;\n\n\t\tif ( needsWStretch ) {\n\t\t\tcontW = docW;\n\t\t\tframeW = docpW;\n\t\t} else if ( docpW > availW ) { // form does not even fit with stretching\n\t\t\tcontW = docW;\n\t\t\tframeW = availW;\n\t\t} else {\n\t\t\t//contW = Math.max( Math.min( 1.5 * docW, availW ), availW / 2 );\n\t\t\tcontW = docW;\n\t\t\tframeW = docpW;\n\t\t}\n\n\t\tif ( needsVScroll ){\n\t\t\tframeW += scrollW;\n\t\t} else {\n\t\t\tscrollTop = 0;\n\t\t}\n\n\t\tif ( needsHStretch ) {\n\t\t\tcontH = docH;\n\t\t\tframeH = docpH;\n\t\t} else if ( docpH > availH ) { // form does not even fit with stretching\n\t\t\tcontH = docH;\n\t\t\tframeH = availH;\n\t\t} else {\n\t\t\t//contH = Math.min( 1.1 * docH, availH);\n\t\t\tcontH = docH;\n\t\t\tframeH = docpH;\n\t\t}\n\n\t\tif ( needsHScroll ){\n\t\t\tframeH += scrollH;\n\t\t} else {\n\t\t\tscrollLeft = 0;\n\t\t}\n\n\t\tif ( frameW !== oldFrameW || frameH !== oldFrameH ) {\n\n\t\t\tif ( jQuery.browser.safari ) {\n\t\t\t\thtml[0].style.overflow=\"hidden\";\n\t\t\t} else {\n\t\t\t\tiframe[0].style.overflow=\"hidden\";\n\t\t\t}\n\n\t\t\tif ( animate ) {\n\t\t\t\tcontent\n\t\t\t\t.width ( 'auto' )\n\t\t\t\t.height ( 'auto' );\n\n\t\t\t\tcontainer.animate({\n\t\t\t\t\twidth: frameW,\n\t\t\t\t\theight: frameH,\n\t\t\t\t\ttop: Math.floor(( - frameH ) / 2),\n\t\t\t\t\tleft: Math.floor(( - frameW ) / 2)\n\t\t\t\t}, {\n\t\t\t\t\tduration: 500,\n\t\t\t\t\tcomplete: function() {\n\n\t\t\t\t\t\tif ( jQuery.browser.safari ) {\n\t\t\t\t\t\t\thtml[0].style.overflow=\"visible\";\n\t\t\t\t\t\t} else if ( jQuery.browser.msie ) {\n\t\t\t\t\t\t\tiframe[0].style.overflow=\"auto\";\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tiframe[0].style.overflow=\"visible\";\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( jQuery.browser.mozilla ) {\n\t\t\t\t\t\t\tcontent\n\t\t\t\t\t\t\t.width ( contW )\n\t\t\t\t\t\t\t.height ( contH );\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tcontent\n\t\t\t\t\t\t\t.width ( 'auto' )\n\t\t\t\t\t\t\t.height ( 'auto' );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t} else {\n\t\t\t\tcontainer\n\t\t\t\t.width( frameW )\n\t\t\t\t.height ( frameH );\n\n\t\t\t\tcontainer[0].style.top = (Math.floor(( - frameH ) / 2)) + \"px\";\n\t\t\t\tcontainer[0].style.left = (Math.floor(( - frameW ) / 2)) + \"px\";\n\n\n\t\t\t\tsetTimeout(function(){\n\n\t\t\t\t\t\tif ( jQuery.browser.safari ) {\n\t\t\t\t\t\t\thtml[0].style.overflow=\"visible\";\n\t\t\t\t\t\t} else if ( jQuery.browser.msie ) {\n\t\t\t\t\t\t\tiframe[0].style.overflow=\"auto\";\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tiframe[0].style.overflow=\"visible\";\n\t\t\t\t\t\t}\n\n\t\t\t\t}, 100);\n\n\t\t\t\tif ( jQuery.browser.mozilla ) {\n\t\t\t\t\tcontent\n\t\t\t\t\t.width ( contW )\n\t\t\t\t\t.height ( contH );\n\t\t\t\t} else {\n\t\t\t\t\tcontent\n\t\t\t\t\t.width ( 'auto' )\n\t\t\t\t\t.height ( 'auto' );\n\t\t\t\t}\n\n\t\t\t}\n\t\t} else {\n\t\t\tcontent\n\t\t\t.width ( 'auto' )\n\t\t\t.height ( 'auto' );\n\n\t\t\tif ( jQuery.browser.safari ) { // Google chrome needs a kick\n\n\t\t\t\t// turn scrollbars off and on again to really only show them when needed\n\t\t\t\t\thtml[0].style.overflow=\"hidden\";\n\n\t\t\t\t\tsetTimeout(function(){\n\t\t\t\t\t\thtml[0].style.overflow=\"visible\";\n\t\t\t\t}, 1);\n\t\t\t}\n\t\t}\n\n\t\tscrollTgt\n\t\t.css('overflow', 'auto')\n\t\t.scrollTop(Math.min(scrollTop, docpH - frameH))\n\t\t.scrollLeft(scrollLeft);\n\n\t\tif ( jQuery.browser.mozilla ) {\n\t\t\tbody\n\t\t\t.css('overflow', 'auto');\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tfunction handleCloseFrame( event ){\n\t\tjQuery(window).unbind( \"resize\", adjustFrameSize );\n\t\tclearTimeout(timer);\n\n\t\tfadeOut( container, function(){\n\t\t\tbackground.fadeOut( function(){\n\t\t\t\twrapper.remove();\n\t\t\t});\n\t\t});\n\t\treturn false;\n\t}\n\n\tfunction fadeIn(elem, callback ) {\n\t\t// no fading for broken browsers\n\t\tif ( brokenBrowser ){\n\n\t\t\telem.show();\n\t\t\tif ( callback ) {\n\t\t\t\tcallback();\n\t\t\t}\n\t\t} else {\n\t\t\t// what an ugly hack\n\t\t\tif ( elem === waitIndicator ) {\n\t\t\t\telem.fadeIn( 200, callback );\n\t\t\t} else {\n\t\t\t\telem.fadeIn( callback );\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction fadeTo(elem, time, target, callback) {\n\t\t// no fading for broken browsers\n\t\tif ( brokenBrowser ){\n\n\t\t\tif (target > 0) {\n\t\t\t\telem[0].style.visibility = \"visible\";\n\t\t\t} else {\n\t\t\t\telem[0].style.visibility = \"hidden\";\n\t\t\t}\n\n\t\t\tif ( callback ) {\n\t\t\t\tcallback();\n\t\t\t}\n\n\t\t} else {\n\t\t\telem.fadeTo(time, target, callback);\n\t\t}\n\t}\n\n\tfunction showForm() {\n\t\tinstance++;\n\n\t\tbrokenChrome =\n\t\t( navigator.userAgent.indexOf(\"Chrome\") >= 0 &&\n\t\t\tnavigator.platform.indexOf(\"Linux x86_64\") >= 0 );\n\n\t\tbrokenBrowser = jQuery.browser.msie || brokenChrome;\n\n\t\tvar maxZIndex = 0;\n\n\t\tjQuery(\"*\").each(function() {\n\t\t\tvar curr = parseInt( jQuery( this ).css( \"z-index\" ) );\n\t\t\tmaxZIndex = curr > maxZIndex ? curr : maxZIndex;\n\t\t});\n\n\t\twrapper = jQuery( \"<div class='popupform-wrapper' >\" );\n\t\tbackground = jQuery( \"<div class='popupform-background' >\" );\n\n\t\tvar waitIndicatorWrapper = jQuery( \"<div class='popupform-loading'>\" );\n\n\t\twaitIndicator = jQuery( \"<div class='popupform-loadingbg'></div><div class='popupform-loadingfg'></div>\" );\n\n\t\tvar anchor = jQuery( \"<div class='popupform-anchor' >\" );\n\n\t\tcontainer = jQuery( \"<div class='popupform-container' >\" );\n\t\tinnerContainer = jQuery( \"<div class='popupform-innercontainer' >\" );\n\t\tiframe = jQuery( \"<iframe class='popupform-innerdocument' name='popupform-iframe\" + instance + \"' id='popupform-iframe\" + instance + \"' >\");\n\n\t\tvar closeBtn = jQuery( \"<div class='popupform-close'></div> \" );\n\n\t\t// initially hide background and waitIndicator\n\t\tif (brokenChrome) {\n\t\t\tbackground.css(\"background\", \"transparent\");\n\t\t} else {\n\t\t\tbackground.css(\"opacity\", 0.0);\n\t\t}\n\n\t\twaitIndicator.hide();\n\t\tcontainer.hide();\n\n\t\t// insert background and wait indicator into wrapper and all into document\n\t\twaitIndicatorWrapper\n\t\t.append( waitIndicator );\n\n\t\tinnerContainer\n\t\t.append( iframe );\n\n\t\tcontainer\n\t\t.append( closeBtn )\n\t\t.append( innerContainer );\n\n\t\tanchor\n\t\t.append(container);\n\n\t\twrapper\n\t\t.css( \"z-index\", maxZIndex + 1 )\n\t\t.append( background )\n\t\t.append( waitIndicatorWrapper )\n\t\t.append( anchor )\n\t\t.appendTo( \"body\" );\n\n\t\t// fade background in\n\t\tif ( !brokenChrome ) {\n\t\t\tbackground.fadeTo( 400, 0.3 );\n\t\t}\n\t\tfadeIn( waitIndicator );\n\n\t\t// attach event handler to close button\n\t\tcloseBtn.click( handleCloseFrame );\n\t}\n\n\tfunction purgePage() {\n\t\tvar path = location.pathname;\n\t\t// get name of the current page from the url\n\t\tvar pageName = path.split(\"/\").pop();\n\t\treturn ( new mw.Api() ).post( { action: 'purge', titles: pageName } );\n\t}\n\n\tfunction handleSubmitData( event, returnedData, textStatus, XMLHttpRequest ){\n\t\tfadeOut( container, function() {\n\t\t\tfadeIn( waitIndicator );\n\t\t});\n\n\t\tvar form = jQuery( event.target );\n\t\tvar formdata = form.serialize() + \"&wpSave=\" + encodeURIComponent(form.find(\"#wpSave\").attr(\"value\"));\n\n\t\tfunction handleInnerSubmit() {\n\t\t\t// find form in fake edit page\n\t\t\tvar innerform = jQuery(\"<div>\" + returnedData + \"</div>\").find(\"form\");\n\n\t\t\t// check if we got an error page\n\t\t\tif ( innerform.length === 0 ) {\n\n\t\t\t\tform.unbind( event );\n\n\t\t\t\tvar iframe = container.find(\"iframe\");\n\t\t\t\tvar doc = iframe[0].contentWindow || iframe[0].contentDocument;\n\t\t\t\tif (doc.document) {\n\t\t\t\t\tdoc = doc.document;\n\t\t\t\t}\n\n\t\t\t\tdoc.open();\n\t\t\t\tdoc.write(returnedData);\n\t\t\t\tdoc.close();\n\n\t\t\t\thandleCloseFrame();\n\t\t\t\tif ( reload ) {\n\t\t\t\t\tpurgePage().then( function( data ) {\n\t\t\t\t\t\tlocation.reload();\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Send the form data off, we do not care for the returned data\n\t\t\tvar innerformdata = innerform.serialize();\n\t\t\tjQuery.post( innerform.attr(\"action\"), innerformdata );\n\n\t\t\t// build new url for outer page (we have to ask for a purge)\n\n\t\t\tvar url = location.href;\n\n\t\t\t// does a querystring exist?\n\t\t\tvar start = url.indexOf(\"action=\");\n\n\t\t\tif ( start >= 0 ) {\n\n\t\t\t\tvar stop = url.indexOf(\"&\", start);\n\n\t\t\t\tif ( stop >= 0 ) {\n\t\t\t\t\turl = url.substr( 0, start - 1 ) + url.substr(stop + 1);\n\t\t\t\t} else {\n\t\t\t\t\turl = url.substr( 0, start - 1 );\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tform = jQuery('<form action=\"' + url + '\" method=\"POST\"><input type=\"hidden\" name=\"action\" value=\"purge\"></form>')\n\t\t\t.appendTo('body');\n\n\t\t\tform\n\t\t\t.submit();\n\n\t\t\tfadeOut( container, function(){\n\t\t\t\tfadeIn( waitIndicator );\n\t\t\t});\n\n\t\t\treturn false;\n\t\t}\n\n\t\t// Send form data off. PF will send back a fake edit page\n\t\t//\n\t\t// Normally we should check this.action first and only if it is empty\n\t\t// revert to this.ownerDocument.URL. Tough luck, IE does not return an\n\t\t// empty action but fills in some bogus\n\t\tjQuery.post( event.target.ownerDocument.URL , formdata, handleInnerSubmit);\n\n\t\treturn false;\n\t}\n\n\tfunction closeFrameAndFollowLink( link ){\n\t\tclearTimeout(timer);\n\n\t\tfadeOut( container, function(){\n\t\t\tfadeIn ( waitIndicator );\n\t\t\twindow.location.href = link;\n\t\t});\n\t}\n\n\t// Saw it on http://robertnyman.com/2006/04/24/get-the-rendered-style-of-an-element\n\t// and liked it\n\tfunction getStyle(oElm, strCssRule){\n\t\tvar strValue = \"\";\n\t\tif(document.defaultView && document.defaultView.getComputedStyle){\n\t\t\tstrValue = document.defaultView.getComputedStyle(oElm, \"\").getPropertyValue(strCssRule);\n\t\t} else if(oElm.currentStyle){\n\t\t\tstrCssRule = strCssRule.replace(/\\-(\\w)/g, function (strMatch, p1){\n\t\t\t\treturn p1.toUpperCase();\n\t\t\t});\n\t\t\tstrValue = oElm.currentStyle[strCssRule];\n\t\t}\n\t\treturn strValue;\n\t}\n\n\tfunction handleLoadFrame() {\n\t\tvar iframecontents = iframe.contents();\n\n\t\tvar containerAlreadyVisible = container.is( ':visible' );\n\n\t\tif ( !containerAlreadyVisible ) {\n\t\t\t// no need to hide it again\n\t\t\tif ( brokenBrowser ) {\n\t\t\t\tcontainer[0].style.visibility = \"hidden\";\n\t\t\t} else {\n\t\t\t\tcontainer[0].style.opacity = 0;\n\t\t\t}\n\t\t}\n\n\t\tcontainer.show();\n\n\t\t// GuMaxDD has #content but keeps headlines in #gumax-content-body\n\t\tcontent = iframecontents.find(\"#gumax-content-body\");\n\n\t\t// Normal skins use #content (e.g. Vector, Monobook)\n\t\tif ( content.length === 0 ) {\n\t\t\tcontent = iframecontents.find(\"#content\");\n\t\t}\n\n\t\t// Some skins use #mw_content (e.g. Modern)\n\t\tif ( content.length === 0 ) {\n\t\t\tcontent = iframecontents.find(\"#mw_content\");\n\t\t}\n\n\t\tvar iframebody = content.closest(\"body\");\n\t\tvar iframedoc = iframebody.parent();\n\n\t\t// This is not a normal MW page (or it uses an unknown skin)\n\t\tif ( content.length === 0 ) {\n\t\t\tcontent = iframebody;\n\t\t}\n\n\t\t// The huge left margin looks ugly in Vector - reduce it.\n\t\t// (How does this look for other skins?)\n\t\tvar siblings = content\n\t\t.css( {\n\t\t\tmargin: 0,\n\t\t\tpadding: padding,\n\t\t\twidth: \"auto\",\n\t\t\theight: \"auto\",\n\t\t\tminWidth: \"0px\",\n\t\t\tminHeight:\"0px\",\n//\t\t\toverflow: \"visible\",\n//\t\t\tposition: \"relative\",\n//\t\t\ttop: \"0\",\n//\t\t\tleft: \"0\",\n\t\t\tborder: \"none\"\n\t\t} )\n\t\t.parentsUntil('html')\n\t\t.css( {\n\t\t\tmargin: 0,\n\t\t\tpadding: 0,\n\t\t\twidth: \"auto\",\n\t\t\theight: \"auto\",\n\t\t\tminWidth: \"0px\",\n\t\t\tminHeight: \"0px\",\n\t\t\t\"float\": \"none\", // Cavendish skin uses floating -> unfloat content\n//\t\t\tposition: \"relative\",\n//\t\t\ttop: \"0\",\n//\t\t\tleft: \"0\",\n\t\t\tbackground: \"transparent\"\n\t\t})\n\t\t.andSelf().siblings();\n\n\t\tiframedoc.height('100%').width('100%');\n\t\tiframebody.height('100%').width('100%');\n\n\t\tif ( jQuery.browser.msie && jQuery.browser.version < \"8\" ) {\n\t\t\tsiblings.hide();\n\t\t} else {\n\t\t\tsiblings\n\t\t\t.each( function(){\n\t\t\t\tvar elem = jQuery(this);\n\n\t\t\t\t// TODO: Does this really help?\n\t\t\t\tif ( getStyle(this, \"display\") !== \"none\" && ! (\n\t\t\t\t\t\t( this.offsetLeft + elem.outerWidth(true) < 0 ) ||\t\t// left of document\n\t\t\t\t\t\t( this.offsetTop + elem.outerHeight(true) < 0 ) || // above document\n\t\t\t\t\t\t( this.offsetLeft > 100000 ) ||\t\t// right of document\n\t\t\t\t\t\t( this.offsetTop > 100000 ) // below document\n\t\t\t\t\t\t)\n\t\t\t\t\t) {\n\n\t\t\t\t\tjQuery(this).hide();\n\t\t\t\t//\t\t\t\t\tcss({\n\t\t\t\t//\t\t\t\t\t\theight : \"0px\",\n\t\t\t\t//\t\t\t\t\t\twidth : \"0px\",\n\t\t\t\t//\t\t\t\t\t\tminWidth : \"0px\",\n\t\t\t\t//\t\t\t\t\t\tminHeight : \"0px\",\n\t\t\t\t//\t\t\t\t\t\tmargin : \"0px\",\n\t\t\t\t//\t\t\t\t\t\tpadding : \"0px\"\n\t\t\t\t//\t\t\t\t\t\tborder : \"none\",\n\t\t\t\t//\t\t\t\t\t\toverflow: \"hidden\"\n\t\t\t\t//\t\t\t\t\t//position: \"static\"\n\t\t\t\t//\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tif ( ( this.offsetLeft + elem.outerWidth() < 0 ) ||\n\t\t\t\t\t( this.offsetTop + elem.outerHeight() < 0 )\n\t\t\t\t\t) {\n\t\t\t\t\tthis.style.left = (-elem.outerWidth(true)) + \"px\";\n\t\t\t\t\tthis.style.top = (-elem.outerHeight(true)) + \"px\";\n\t\t\t\t}\n\t\t\t});\n\t\t//.children().css(\"position\", \"static\");\n\t\t}\n\n\t\tcontainer.show();\n\n\t\t// adjust frame size to dimensions just calculated\n\t\tadjustFrameSize();\n\n\t\t// and attach event handler to adjust frame size every time the window\n\t\t// size changes\n\t\tjQuery( window ).resize( function() {\n\t\t\tadjustFrameSize();\n\t\t} );\n\n\t\t//interval = setInterval(adjustFrameSize, 100);\n\n\t\tvar form = content.find(\"#pfForm\");\n\t\tvar innerwdw = document.getElementById( 'popupform-iframe' + instance ).contentWindow;\n\t\tvar innerJ = innerwdw.jQuery;\n\n\t\t// if we have a form and it is not a RunQuery form\n\t\tif (form.length > 0 && ( typeof form[0].wpRunQuery === 'undefined') ) {\n\t\t\tvar submitok = false;\n\t\t\tvar innersubmitprocessed = false;\n\n\t\t\t// catch form submit event\n\t\t\tform\n\t\t\t.bind( \"submit\", function( event ){\n\t\t\t\tvar interval = setInterval(function(){\n\t\t\t\t\tif ( innersubmitprocessed ) {\n\t\t\t\t\t\tclearInterval( interval );\n\t\t\t\t\t\tinnersubmitprocessed = false;\n\t\t\t\t\t\tif ( submitok ) {\n\t\t\t\t\t\t\thandleSubmitData( event );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t}, 10);\n\t\t\t\tevent.stopPropagation();\n\t\t\t\treturn false;\n\t\t\t});\n\n\t\t\t// catch inner form submit event\n\t\t\tif ( innerJ ) {\n\t\t\t\tinnerwdw.jQuery(form[0])\n\t\t\t\t.bind( \"submit\", function( event ) {\n\t\t\t\t\t\tsubmitok = ( event.result === undefined ) ? true : event.result;\n\t\t\t\t\t\tinnersubmitprocessed = true;\n\t\t\t\t\t\treturn false;\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tsubmitok = true;\n\t\t\t\tinnersubmitprocessed = true;\n\t\t\t}\n\t\t}\n\n\t\tif (innerJ) {\n\t\t\t// FIXME: Why did I put this in?\n\t\t\tinnerwdw.jQuery( innerwdw[0] ).unload(function (event) {\n\t\t\t\treturn false;\n\t\t\t});\n\n\t\t\t//\n\t\t\tcontent.bind( 'click', function() {\n\t\t\t\tvar foundQueue = false;\n\t\t\t\tinnerJ('*', content[0]).each( function() {\n\t\t\t\t\tif ( innerJ(this).queue().length > 0 ) {\n\t\t\t\t\t\tfoundQueue = true;\n\t\t\t\t\t\tinnerJ(this).queue( function(){\n\t\t\t\t\t\t\tsetTimeout( adjustFrameSize, 100, true );\n\t\t\t\t\t\t\tinnerJ(this).dequeue();\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tif ( ! foundQueue ) {\n\t\t\t\t\tadjustFrameSize( true );\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t});\n\t\t} else {\n\t\t\tcontent.bind( 'click', function() {\n\t\t\t\t\tadjustFrameSize( true );\n\t\t\t});\n\t\t}\n\n\t\t// find all links. Have to use inner jQuery so event.result below\n\t\t// reflects the result of inner event handlers. We (hopefully) come last\n\t\t// in the chain of event handlers as we only attach when the frame is\n\t\t// already completely loaded, i.e. every inner event handler is already\n\t\t// attached.\n\t\tvar allLinks = (innerJ)?innerJ(\"a[href]\"):jQuery(\"a[href]\");\n\n\t\t// catch 'Cancel'-Link (and other 'back'-links) and close frame instead of going back\n\t\tvar backlinks = allLinks.filter('a[href=\"javascript:history.go(-1);\"]');\n\t\tbacklinks.click(handleCloseFrame);\n\n\t\t// promote any other links to open in main window, prevent nested browsing\n\t\tallLinks\n\t\t.not('a[href*=\"javascript:\"]') // scripted links\n\t\t.not('a[target]')              // targeted links\n\t\t.not('a[href^=\"#\"]')           // local links\n\t\t.not('a.pfFancyBox')           // link to file upload\n\t\t.click(function(event){\n\t\t\tif ( event.result !== false ) { // if not already caught by somebody else\n\t\t\t\tcloseFrameAndFollowLink( event.target.getAttribute('href') );\n\t\t\t}\n\t\t\treturn false;\n\t\t});\n\n\t\t// finally show the frame, but only if it is not already visible\n\t\tif ( ! containerAlreadyVisible ) {\n\t\t\t\tfadeOut ( waitIndicator, function () {\n\t\t\t\tfadeTo( container, 400, 1 );\n\t\t\t} );\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tfunction handlePopupFormInput( ptarget, elem ) {\n\t\tshowForm();\n\t\treload = $(elem).hasClass('reload');\n\n\t\tiframe.on( 'load', function(){\n\t\t\t// attach event handler to iframe\n\t\t\tiframe.bind( 'load', handleLoadFrame );\n\t\t\treturn false;\n\t\t});\n\n\t\telem.target = 'popupform-iframe' + instance;\n\t\treturn true;\n\t}\n\n\tfunction handlePopupFormLink( ptarget, elem ) {\n\t\tshowForm();\n\t\treload = $(elem).hasClass('reload');\n\t\t// store initial readystate\n\t\tvar readystate = iframe.contents()[0].readyState;\n\n\t\t// set up timer for waiting on the document in the iframe to be dom-ready\n\t\t// this sucks, but there is no other way to catch that event\n\t\t// onload is already too late\n\t\ttimer = setInterval(function(){\n\t\t\t// if the readystate changed\n\t\t\tif ( readystate !== iframe.contents()[0].readyState ) {\n\t\t\t\t// store new readystate\n\t\t\t\treadystate = iframe.contents()[0].readyState;\n\n\t\t\t\t// if dom is built but document not yet displayed\n\t\t\t\tif ( readystate === 'interactive' || readystate === 'complete' ) {\n\t\t\t\t\tneedsRender = false; // flag that rendering is already done\n\t\t\t\t\thandleLoadFrame();\n\t\t\t\t}\n\t\t\t}\n\t\t}, 100 );\n\n\t\t// fallback in case we did not catch the dom-ready state\n\t\tiframe.on('load', function( event ){\n\t\t\tif ( needsRender ) { // rendering not already done?\n\t\t\t\thandleLoadFrame( event );\n\t\t\t}\n\t\t\tneedsRender = true;\n\t\t});\n\n\t\tif ( elem.tagName === 'FORM' ) {\n\t\t\telem.target = 'popupform-iframe' + instance;\n\t\t\treturn true;\n\t\t} else {\n\t\t\tvar delim = ptarget.indexOf( '?' );\n\t\t\tvar form = document.createElement(\"form\");\n\n\t\t\tform.target = 'popupform-iframe' + instance;\n\n\t\t\t// Do we have parameters?\n\t\t\tif ( delim > 0 ) {\n\t\t\t\tform.action = ptarget.substr( 0, delim );\n\t\t\t\tvar params = String( ptarget.substr( delim + 1 ) ).split(\"&\");\n\t\t\t\tfor ( var i = 0; i < params.length; ++i ) {\n\n\t\t\t\t\tvar input = document.createElement(\"input\");\n\t\t\t\t\tvar param = String( params[i] ).split('=');\n\t\t\t\t\tinput.type = 'hidden';\n\t\t\t\t\tinput.name = decodeURIComponent( param[0] );\n\t\t\t\t\tinput.value = decodeURIComponent( param[1] );\n\t\t\t\t\tform.appendChild( input );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tform.action = ptarget;\n\t\t\t}\n\n\t\t\tdocument.getElementsByTagName('body')[0].appendChild(form);\n\t\t\tform.submit();\n\t\t\tdocument.getElementsByTagName('body')[0].removeChild(form);\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t// export public funcitons\n\tthis.handlePopupFormInput = handlePopupFormInput;\n\tthis.handlePopupFormLink = handlePopupFormLink;\n\tthis.adjustFrameSize = adjustFrameSize;\n\n\treturn this;\n}() );\n","usedDeprecatedRules":[]},{"filePath":"/src/repo/libs/PF_preview.js","messages":[{"ruleId":"jsdoc/require-returns","severity":1,"message":"Missing JSDoc @return declaration.","line":17,"column":2,"nodeType":"Block","endLine":19,"endColumn":5},{"ruleId":"no-jquery/variable-pattern","severity":1,"message":"jQuery collection names must match the variablePattern","line":22,"column":7,"nodeType":"VariableDeclarator","endLine":22,"endColumn":25},{"ruleId":"jsdoc/require-param-type","severity":1,"message":"Missing JSDoc @param \"result\" type.","line":82,"column":null,"nodeType":"Block","endLine":82,"endColumn":null},{"ruleId":"no-jquery/variable-pattern","severity":1,"message":"jQuery collection names must match the variablePattern","line":95,"column":4,"nodeType":"AssignmentExpression","endLine":103,"endColumn":28},{"ruleId":"jsdoc/require-returns","severity":1,"message":"Missing JSDoc @return declaration.","line":177,"column":2,"nodeType":"Block","endLine":179,"endColumn":5},{"ruleId":"no-jquery/variable-pattern","severity":1,"message":"jQuery collection names must match the variablePattern","line":183,"column":3,"nodeType":"AssignmentExpression","endLine":183,"endColumn":36},{"ruleId":"no-jquery/variable-pattern","severity":1,"message":"jQuery collection names must match the variablePattern","line":195,"column":7,"nodeType":"VariableDeclarator","endLine":195,"endColumn":66}],"errorCount":0,"warningCount":7,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/**\n * Handles dynamic Page Preview for Page Forms.\n *\n * @author Stephan Gambke\n */\n\n/*global validateAll */\n\n( function ( $, mw ) {\n\n\t'use strict';\n\n\tvar form;\n\tvar previewpane;\n\tvar previewHeight;\n\n\t/**\n\t * Called when the content is loaded into the preview pane\n\t */\n\tvar loadFrameHandler = function handleLoadFrame() {\n\n\t\tvar iframe = $( this );\n\t\tvar iframecontents = iframe.contents();\n\n\t\t// find div containing the preview\n\t\tvar content = iframecontents.find( '#wikiPreview' );\n\n\t\tvar iframebody = content.closest( 'body' );\n\t\tvar iframedoc = iframebody.parent();\n\t\tiframedoc.height( 'auto' );\n\n\t\t// this is not a normal MW page (or it uses an unknown skin)\n\t\tif ( content.length === 0 ) {\n\t\t\tcontent = iframebody;\n\t\t}\n\n\t\tcontent.parentsUntil( 'html' ).andSelf()\n\t\t.css( {\n\t\t\tmargin: 0,\n\t\t\tpadding: 0,\n\t\t\twidth: '100%',\n\t\t\theight: 'auto',\n\t\t\tminWidth: '0px',\n\t\t\tminHeight: '0px',\n\t\t\t'float': 'none', // Cavendish skin uses floating -> unfloat content\n\t\t\tborder: 'none',\n\t\t\tbackground: 'transparent'\n\t\t} )\n\t\t.siblings()\n\t\t.hide(); // FIXME: Some JS scripts don't like working on hidden elements\n\n\t\t// and attach event handler to adjust frame size every time the window\n\t\t// size changes\n\t\t$( window ).resize( function () {\n\t\t\tiframe.height( iframedoc.height() );\n\t\t} );\n\n\t\tpreviewpane.show();\n\n\t\tvar newPreviewHeight = iframedoc.height();\n\n\t\tiframe.height( newPreviewHeight );\n\n\t\t$( 'html, body' )\n\t\t.scrollTop( $( 'html, body' ).scrollTop() + newPreviewHeight - previewHeight )\n\t\t.animate( {\n\t\t\tscrollTop: previewpane.offset().top\n\t\t}, 1000 );\n\n\t\tpreviewHeight = newPreviewHeight;\n\n\t\t$( function() {\n\t\t\twindow.dispatchEvent( new Event( 'resize' ) ); // It fixes form preview\n\t\t} );\n\n\t\treturn false;\n\t};\n\n\t/**\n\t * Called when the server has sent the preview\n\t *\n\t * @param result\n\t */\n\tvar resultReceivedHandler = function handleResultReceived( result ) {\n\n\t\tvar htm = result.result;\n\n\t\tvar iframe = previewpane.children();\n\n\t\tif ( iframe.length === 0 ) {\n\n\t\t\t// set initial height of preview area\n\t\t\tpreviewHeight = 0;\n\n\t\t\tiframe = $( '<iframe>' )\n\t\t\t.css( { //FIXME: Should this go in a style file?\n\t\t\t\t'width': '100%',\n\t\t\t\t'height': previewHeight,\n\t\t\t\t'border': 'none',\n\t\t\t\t'overflow': 'hidden'\n\t\t\t} )\n\t\t\t.load( loadFrameHandler )\n\t\t\t.appendTo( previewpane );\n\n\t\t}\n\n\t\tvar ifr = iframe[0];\n\t\tvar doc = ifr.contentDocument || ifr.contentWindow.document || ifr.Document;\n\n\t\tdoc.open();\n\t\tdoc.write( htm );\n\t\tdoc.close();\n\n\t};\n\n\t/**\n\t * Called when the preview button was clicked\n\t */\n\tvar previewButtonClickedHandler = function handlePreviewButtonClicked() {\n\n\t\tif ( !validateAll() ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// data array to be sent to the server\n\t\tvar data = {\n\t\t\taction: 'pfautoedit',\n\t\t\tformat: 'json'\n\t\t};\n\n\t\t// do we have a URL like .../index.php?title=pagename&action=formedit ?\n\t\tif ( mw.config.get( 'wgAction' ) === 'formedit' ) {\n\n\t\t\t// set the title, server has to find a suitable form\n\t\t\tdata.target = mw.config.get( 'wgPageName' );\n\n\t\t\t// do we have a URL like .../Special:FormEdit/formname/pagename ?\n\t\t} else if ( mw.config.get( 'wgCanonicalNamespace' ) === 'Special' && mw.config.get( 'wgCanonicalSpecialPageName' ) === 'FormEdit' ) {\n\n\t\t\t// get the pagename and split it into parts\n\t\t\tvar pageName = mw.config.get( 'wgPageName' );\n\t\t\tvar parts = pageName.split( '/' );\n\n\t\t\tif ( mw.util.getParamValue( 'form' ) ) {\n\t\t\t\tdata.form = mw.util.getParamValue( 'form' );\n\t\t\t} else if ( parts.length > 1 ) { // found a formname\n\t\t\t\tdata.form = parts[1];\n\t\t\t}\n\n\t\t\tif ( mw.util.getParamValue( 'target' ) ) {\n\t\t\t\tdata.target = mw.util.getParamValue( 'target' );\n\t\t\t} else if ( parts.length > 2 ) { // found a pagename\n\t\t\t\t// Put the name back together, if it contains slashes.\n\t\t\t\tdata.target = parts.slice(2).join( '/' );\n\t\t\t}\n\t\t}\n\n\t\t// add form values to the data\n\t\tdata.query = form.serialize();\n\n\t\tif ( data.query.length > 0 ) {\n\t\t\tdata.query += '&';\n\t\t}\n\n\t\tdata.query += 'wpPreview=' + encodeURIComponent( $( this ).attr( 'value' ) );\n\n\t\t$.ajax( {\n\n\t\t\ttype: 'POST', // request type ( GET or POST )\n\t\t\turl: mw.util.wikiScript( 'api' ), // URL to which the request is sent\n\t\t\tdata: data, // data to be sent to the server\n\t\t\tdataType: 'json', // type of data expected back from the server\n\t\t\tsuccess: resultReceivedHandler // function to be called if the request succeeds\n\t\t} );\n\t};\n\n\t/**\n\t * Register plugin\n\t */\n\t$.fn.pfAjaxPreview = function () {\n\n\t\tform = this.closest( 'form' );\n\t\tpreviewpane = $( '#wikiPreview' );\n\n\t\t// do some sanity checks\n\t\tif ( previewpane.length === 0 || // no ajax preview without preview area\n\t\t\tpreviewpane.contents().length > 0 || // preview only on an empty previewpane\n\t\t\tform.length === 0 ) { // no ajax preview without form\n\n\t\t\treturn this;\n\t\t}\n\n\t\t// IE does not allow setting of the 'type' attribute for inputs\n\t\t// => completely replace the original preview button\n\t\tvar btn = $( '<input type=\\'button\\' />' ).insertBefore( this );\n\n\t\tthis.remove();\n\n\t\t// copy all explicitly specified attributes (except 'type' attribute)\n\t\t// from the old to the new button\n\t\tvar oldBtnElement = this[0];\n\t\tvar i;\n\n\t\tfor ( i = 0; i < oldBtnElement.attributes.length; i = i + 1 ) {\n\t\t\tvar attribute = oldBtnElement.attributes[i];\n\t\t\tif ( attribute.name !== 'type' ) {\n\t\t\t\tbtn.attr( attribute.name,  attribute.value );\n\t\t\t}\n\t\t}\n\n\t\t// register event handler\n\t\tbtn.click( previewButtonClickedHandler );\n\n\t\treturn btn;\n\t};\n\n\t$( document ).ready( function () {\n\t\tif ( mw.config.get( 'wgAction' ) === 'formedit' ||\n\t\t\tmw.config.get( 'wgCanonicalSpecialPageName' ) === 'FormEdit' ) {\n\t\t\t$( '#wpPreview' ).pfAjaxPreview();\n\t\t\t$( document ).on( 'VEForAllLoaded', function() {\n\t\t\t\tif ( $('.visualeditor').length > 0 ) {\n\t\t\t\t\t$( '#wpPreview' ).off('click', previewButtonClickedHandler).on('click', function( event ) {\n\t\t\t\t\t\tmw.pageFormsActualizeVisualEditorFields( function() {\n\t\t\t\t\t\t\tpreviewButtonClickedHandler( event );\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}( jQuery, mediaWiki ) );\n","usedDeprecatedRules":[]},{"filePath":"/src/repo/libs/PF_rating.js","messages":[{"ruleId":"no-jquery/no-sizzle","severity":1,"message":"Selector extensions are not allowed","line":43,"column":4,"nodeType":"CallExpression","endLine":43,"endColumn":40}],"errorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"( function( $, mw, pf ) {\n        'use strict';\n\n\tjQuery.fn.applyRatingInput = function( fromCalendar ) {\n\t\tvar starWidth = $(this).attr('data-starwidth');\n\t\tvar curValue = '';\n\t\tif ( starWidth === undefined ) {\n\t\t\t// This is probably because we're in a multple-instance\n\t\t\t// template \"starter\", but, in any case, just exit.\n\t\t\treturn;\n\t\t}\n\n\t\tif( fromCalendar !== undefined ) {\n\t\t\tcurValue = fromCalendar;\n\t\t} else {\n\t\t\tcurValue = $(this).attr('data-curvalue');\n\t\t}\n\t\tif ( curValue === '' || curValue === undefined ) {\n\t\t\tcurValue = 0;\n\t\t}\n\t\tvar numStars = $(this).attr('data-numstars');\n\t\tvar allowsHalf = $(this).attr('data-allows-half');\n\t\tvar disabled = $(this).attr('disabled');\n\t\tvar ratingsSettings = {\n\t\t\tnormalFill: '#ddd',\n\t\t\tstarWidth: starWidth,\n\t\t\tnumStars: numStars,\n\t\t\tmaxValue: numStars,\n\t\t\trating: curValue\n\t\t};\n\t\tif ( allowsHalf === undefined ) {\n\t\t\tratingsSettings.fullStar = true;\n\t\t} else {\n\t\t\tratingsSettings.halfStar = true;\n\t\t}\n\t\tif ( disabled === \"disabled\" ) {\n\t\t\tratingsSettings.readOnly = true;\n\t\t}\n\n\t\t$(this).rateYo(ratingsSettings)\n\t\t.on(\"rateyo.set\", function (e, data) {\n\n\t\t\t$(this).parent().children(\":hidden\").attr(\"value\", data.rating);\n\t\t});\n\t};\n\n}( jQuery, mediaWiki, pf ) );\n","usedDeprecatedRules":[]},{"filePath":"/src/repo/libs/PF_regexp.js","messages":[{"ruleId":"jsdoc/require-param-type","severity":1,"message":"Missing JSDoc @param \"inputId\" type.","line":11,"column":null,"nodeType":"Block","endLine":11,"endColumn":null},{"ruleId":"jsdoc/require-param-type","severity":1,"message":"Missing JSDoc @param \"params\" type.","line":12,"column":null,"nodeType":"Block","endLine":12,"endColumn":null},{"ruleId":"jsdoc/require-returns-type","severity":1,"message":"Missing JSDoc @return type.","line":16,"column":null,"nodeType":"Block","endLine":16,"endColumn":null}],"errorCount":0,"warningCount":3,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/**\n * Javascript code to be used with input type regexp.\n *\n * @author Stephan Gambke\n *\n */\n\n/**\n * Validates inputs of type regexp.\n *\n * @param inputId (String) the id string of the input to check\n * @param params (Object) the parameter object for the check, contains\n *\t\tretext: (String) regular expression the input's value has to match\n *\t\tinverse: (Boolean) if the check result shall be inverted\n *\t\tmessage: (String) the message too be printed if the input's value does not match\n * @return (Boolean) true, if the input's value matches the regular expression in\n *         retext, false otherwise; the value is inverted if inverse is true\n */\nwindow.PF_RE_validate = function( inputId, params ) { //input_number, retext, inverse, message, multiple\n\n\tvar match;\n\tvar message;\n\ttry {\n\t\tvar re = new RegExp( params.retext );\n\t\tmatch = re.test( jQuery('#' + inputId).val() );\n\t\tmessage = params.message;\n\t} catch (e) {\n\t\tmatch = false;\n\t\tmessage = params.error.replace('$1', e );\n\t}\n\n\tif ( ( match && ! params.inverse ) || ( ! match && params.inverse ) ) {\n\t\treturn true;\n\t} else {\n\t\tjQuery( '#' + inputId ).parent().addErrorMessage( message );\n\t\treturn false;\n\t}\n};\n","usedDeprecatedRules":[]},{"filePath":"/src/repo/libs/PF_simpleupload.js","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/libs/PF_spreadsheet.js","messages":[{"ruleId":"no-shadow","severity":1,"message":"'templateName' is already declared in the upper scope on line 241 column 7.","line":324,"column":33,"nodeType":"Identifier","messageId":"noShadow","endLine":324,"endColumn":45},{"ruleId":"no-shadow","severity":1,"message":"'spreadsheetID' is already declared in the upper scope on line 243 column 4.","line":472,"column":9,"nodeType":"Identifier","messageId":"noShadow","endLine":472,"endColumn":22},{"ruleId":"no-shadow","severity":1,"message":"'columnName' is already declared in the upper scope on line 262 column 8.","line":473,"column":9,"nodeType":"Identifier","messageId":"noShadow","endLine":473,"endColumn":19},{"ruleId":"no-shadow","severity":1,"message":"'columnName' is already declared in the upper scope on line 262 column 8.","line":580,"column":11,"nodeType":"Identifier","messageId":"noShadow","endLine":580,"endColumn":21},{"ruleId":"no-shadow","severity":1,"message":"'spreadsheetID' is already declared in the upper scope on line 243 column 4.","line":617,"column":10,"nodeType":"Identifier","messageId":"noShadow","endLine":617,"endColumn":23},{"ruleId":"no-shadow","severity":1,"message":"'spreadsheetID' is already declared in the upper scope on line 243 column 4.","line":621,"column":36,"nodeType":"Identifier","messageId":"noShadow","endLine":621,"endColumn":49},{"ruleId":"no-shadow","severity":1,"message":"'columnNum' is already declared in the upper scope on line 579 column 16.","line":624,"column":16,"nodeType":"Identifier","messageId":"noShadow","endLine":624,"endColumn":25},{"ruleId":"no-jquery/no-sizzle","severity":1,"message":"Positional selector extensions are not allowed","line":641,"column":22,"nodeType":"CallExpression","endLine":641,"endColumn":77},{"ruleId":"no-jquery/variable-pattern","severity":1,"message":"jQuery collection names must match the variablePattern","line":644,"column":10,"nodeType":"VariableDeclarator","endLine":644,"endColumn":42}],"errorCount":0,"warningCount":9,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/**\n * Code to integrate the jExcel JavaScript library into Page Forms.\n *\n * @author Yaron Koren\n * @author Balabky9\n * @author Amr El-Absy\n */\n\n// @TODO - make this based on the API limit, which in turn is based on whether the user has the \"apihighlimits\" right.\nconst numPagesToQuery = 50;\nconst saveIcon = '<span class=\"oo-ui-widget oo-ui-widget-enabled oo-ui-iconElement oo-ui-iconElement-icon oo-ui-icon-check oo-ui-labelElement-invisible oo-ui-iconWidget\" aria-disabled=\"false\" title=\"' + mw.msg( 'upload-dialog-button-save' ) + '\"></span>';\nconst cancelIcon = '<span class=\"oo-ui-widget oo-ui-widget-enabled oo-ui-iconElement oo-ui-iconElement-icon oo-ui-icon-close oo-ui-labelElement-invisible oo-ui-iconWidget\" aria-disabled=\"false\" title=\"' + mw.msg( 'cancel' ) + '\"></span>';\nconst addIcon = '<span class=\"oo-ui-widget oo-ui-widget-enabled oo-ui-iconElement oo-ui-iconElement-icon oo-ui-icon-add oo-ui-labelElement-invisible oo-ui-iconWidget\" aria-disabled=\"false\" title=\"' + mw.msg( 'apisandbox-add-multi' ) + '\"></span>';\nconst upIcon = '<span class=\"oo-ui-widget oo-ui-widget-enabled oo-ui-iconElement oo-ui-iconElement-icon oo-ui-icon-upTriangle oo-ui-labelElement-invisible oo-ui-iconWidget\" aria-disabled=\"false\" title=\"' + 'Raise' + '\"></span>';\nconst downIcon = '<span class=\"oo-ui-widget oo-ui-widget-enabled oo-ui-iconElement oo-ui-iconElement-icon oo-ui-icon-downTriangle oo-ui-labelElement-invisible oo-ui-iconWidget\" aria-disabled=\"false\" title=\"' + 'Lower' + '\"></span>';\nconst deleteIcon = '<span class=\"oo-ui-widget oo-ui-widget-enabled oo-ui-iconElement oo-ui-iconElement-icon oo-ui-icon-trash oo-ui-labelElement-invisible oo-ui-iconWidget\" aria-disabled=\"false\" title=\"' + mw.msg( 'delete' ) + '\"></span>';\nconst manageColumnTitle = '\\u2699';\n\n( function( jexcel, mw ) {\n\tvar baseUrl = mw.config.get( 'wgScriptPath' );\n\tmw.spreadsheets = {};\n\n\t// Handle any possible Boolean values from the wiki page.\n\tjexcel.prototype.valueIsYes = function(value) {\n\t\tif ( value === null ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif ( typeof value === 'boolean' ) {\n\t\t\treturn value;\n\t\t}\n\n\t\tif ( typeof value === 'string' ) {\n\t\t\tvalue = value.toLowerCase();\n\t\t}\n\t\tvar possibleYesMessages = [\n\t\t\tmw.config.get( 'wgPageFormsContLangYes' ).toLowerCase(),\n\t\t\t// Add in '1', and some hardcoded English.\n\t\t\t'1', 'yes', 'true'\n\t\t];\n\t\treturn ( possibleYesMessages.indexOf( value ) >= 0 );\n\t};\n\n\tjexcel.prototype.getjExcelValue = function( mwValue, columnAttributes ) {\n\t\tif ( mwValue == null ) {\n\t\t\treturn null;\n\t\t}\n\t\tif ( columnAttributes['type'] == 'checkbox' ) {\n\t\t\treturn jexcel.prototype.valueIsYes(mwValue);\n\t\t} else if ( columnAttributes['list'] == true ) {\n\t\t\t// The list delimiter unfortunately can't be set for\n\t\t\t// jExcel - it's hardcoded to a semicolon - and values\n\t\t\t// can't have spaces around them. So we have to\n\t\t\t// modify the current value for it to be handled\n\t\t\t// correctly.\n\t\t\tvar individualValues = mwValue.split( columnAttributes['delimiter'] );\n\t\t\treturn $.map( individualValues, $.trim ).join(';');\n\t\t} else if ( columnAttributes['type'] == 'date' ) {\n\t\t\tvar date = new Date( mwValue );\n\t\t\t// Avoid timezone strangeness.\n\t\t\tdate.setTime( date.getTime() + 60000 * date.getTimezoneOffset());\n\t\t\tvar monthNum = date.getMonth() + 1;\n\t\t\treturn date.getFullYear() + '-' + monthNum + '-' + date.getDate();\n\t\t} else if ( columnAttributes['type'] == 'datetime' ) {\n\t\t\tvar date = new Date( mwValue );\n\t\t\t// Avoid timezone strangeness, if what we're handling\n\t\t\t// is just a date.\n\t\t\tif ( ! mwValue.includes(':') ) {\n\t\t\t\tdate.setTime( date.getTime() + 60000 * date.getTimezoneOffset());\n\t\t\t}\n\t\t\tvar monthNum = date.getMonth() + 1;\n\t\t\treturn date.getFullYear() + '-' + monthNum + '-' + date.getDate() +\n\t\t\t\t' ' + date.getHours() + ':' + date.getMinutes();\n\t\t} else {\n\t\t\treturn mwValue;\n\t\t}\n\t}\n\n\tjexcel.prototype.getMWValueFromCell = function( $cell, columnAttributes ) {\n\t\tvar jExcelValue;\n\t\tif ( columnAttributes['type'] == 'checkbox' ) {\n\t\t\tjExcelValue = $cell.find('input').prop( 'checked' );\n\t\t} else {\n\t\t\tjExcelValue = $cell.html();\n\t\t}\n\t\treturn jexcel.prototype.getMWValueFromjExcelValue( jExcelValue, columnAttributes );\n\t}\n\n\tjexcel.prototype.getMWValueFromjExcelValue = function( jExcelValue, columnAttributes ) {\n\t\tif ( jExcelValue == null ) {\n\t\t\treturn null;\n\t\t}\n\t\tif ( columnAttributes['type'] == 'checkbox' ) {\n\t\t\treturn ( jExcelValue == true ) ?\n\t\t\t\tmw.config.get( 'wgPageFormsContLangYes' ) :\n\t\t\t\tmw.config.get( 'wgPageFormsContLangNo' );\n\t\t} else if ( columnAttributes['list'] == true ) {\n\t\t\tvar delimiter = columnAttributes['delimiter'] + ' ';\n\t\t\treturn jExcelValue.replace(/;/g, delimiter);\n\t\t} else if ( columnAttributes['type'] == 'date' || columnAttributes['type'] == 'datetime' ) {\n\t\t\treturn jExcelValue;\n\t\t} else {\n\t\t\tvar mwValue = jExcelValue.replace( /\\<br\\>/g, \"\\n\" );\n\t\t\treturn mwValue;\n\t\t}\n\t}\n\n\tjexcel.prototype.generateQueryStringForSave = function( formName, templateName, pageName, rowValues, columns ) {\n\t\tvar queryString = 'form=' + formName + '&target=' + encodeURIComponent( pageName );\n\t\tfor ( var columnName in rowValues ) {\n\t\t\tif ( columnName == 'page' ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tfor ( var columnNum in columns ) {\n\t\t\t\tif ( columns[columnNum]['title'] == columnName ) {\n\t\t\t\t\tvar curColumn = columns[columnNum];\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tqueryString += '&' + templateName + '[' + columnName + ']=' +\n\t\t\t\tencodeURIComponent( jexcel.prototype.getMWValueFromjExcelValue( rowValues[columnName], curColumn ) );\n\t\t}\n\t\treturn queryString;\n\t}\n\n\tjexcel.prototype.saveChanges = function( spreadsheetID, templateName, pageName, newPageName, formName, rowNum, rowValues, columns, editMultiplePages ) {\n\t\t$(\"div#\" + spreadsheetID + \" table.jexcel td[data-y = \" + rowNum + \"]\").not(\".jexcel_row\").each( function () {\n\t\t\tvar columnNum = $(this).attr(\"data-x\");\n\t\t\tvar curColumn = columns[columnNum]['title'];\n\t\t\tvar curValue = rowValues[curColumn];\n\t\t\tif ( rowValues[curColumn] !== undefined ) {\n\t\t\t\tmw.spreadsheets[spreadsheetID].setValue( this, curValue );\n\t\t\t}\n\t\t});\n\n\t\tif ( editMultiplePages === undefined ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar data = {\n\t\t\taction: 'pfautoedit',\n\t\t\tformat: 'json',\n\t\t\tquery: jexcel.prototype.generateQueryStringForSave( formName, templateName, pageName, rowValues, columns )\n\t\t};\n\t\treturn $.ajax({\n\t\t\ttype: 'POST',\n\t\t\turl: baseUrl + '/api.php',\n\t\t\tdata: data,\n\t\t\tdataType: 'json',\n\t\t\tsuccess: function(successData) {\n\t\t\t\tif ( newPageName !== '' && newPageName !== undefined && newPageName !== pageName ) {\n\t\t\t\t\tjexcel.prototype.movePage( pageName, newPageName );\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\tjexcel.prototype.getToken = function() {\n\t\tvar url = baseUrl + '/api.php?action=query&format=json&meta=tokens&type=csrf';\n\t\treturn $.post( url );\n\t}\n\n\tjexcel.prototype.movePage = function( fromPage, toPage ) {\n\t\treturn $.when( jexcel.prototype.getToken() ).then( function successHandler( postResult ){\n\t\t\tvar data = {\n\t\t\t\ttoken: postResult.query.tokens.csrftoken\n\t\t\t};\n\t\t\tvar query = 'from=' + encodeURIComponent( fromPage ) + \"&to=\" + encodeURIComponent( toPage ) + \"&movetalk&noredirect\";\n\t\t\treturn $.ajax( {\n\t\t\t\ttype: 'POST',\n\t\t\t\turl: baseUrl + '/api.php?action=move&format=json&' + query,\n\t\t\t\tdataType: 'json',\n\t\t\t\tdata: data\n\t\t\t} );\n\t\t});\n\t}\n\n\tjexcel.prototype.cancelChanges = function( spreadsheetID, rowValues, rowNum, columnNames ) {\n\t\t$(\"div#\" + spreadsheetID + \" table.jexcel td[data-y = \" + rowNum + \"]\").not(\".jexcel_row\").each( function () {\n\t\t\tvar columnNum = $(this).attr(\"data-x\");\n\t\t\tvar curColumn = columnNames[columnNum];\n\t\t\tif ( rowValues[curColumn] !== undefined ) {\n\t\t\t\tmw.spreadsheets[spreadsheetID].setValue( this, rowValues[curColumn] );\n\t\t\t} else {\n\t\t\t\tmw.spreadsheets[spreadsheetID].setValue( this, \"\" );\n\t\t\t}\n\t\t} );\n\n\t\t$(\"div#\" + spreadsheetID + \" td[data-y = \" + rowNum + \"] .save-changes\").each( function () {\n\t\t\t$(this).parent().hide();\n\t\t\t$(this).parent().siblings('.mit-row-icons').show();\n\t\t} );\n\t}\n\n\t// Add a new page.\n\tjexcel.prototype.saveNewRow = function( spreadsheetID, templateName, formName, rowNum, pageName, rowValues, columns, editMultiplePages ) {\n\t\tvar $manageCell = $( \"div#\" + spreadsheetID + \" td[data-y=\" + rowNum + \"]\" ).last();\n\n\t\tvar spanContents = '<a href=\"#\" class=\"save-changes\">' + saveIcon + '</a> | ' +\n\t\t\t'<a href=\"#\" class=\"cancel-changes\">' + cancelIcon + '</a>';\n\n\t\t$manageCell.children('span.save-or-cancel')\n\t\t\t.attr('id', 'page-span-' + pageName)\n\t\t\t.html( spanContents )\n\t\t\t.hide();\n\n\t\tif ( editMultiplePages == undefined ) {\n\t\t\t$manageCell.children('.mit-row-icons').show();\n\t\t\treturn;\n\t\t}\n\n\t\tvar data = {\n\t\t\taction: 'pfautoedit',\n\t\t\tformat: 'json',\n\t\t\tquery: jexcel.prototype.generateQueryStringForSave( formName, templateName, pageName, rowValues, columns )\n\t\t};\n\t\treturn $.ajax( {\n\t\t\ttype: 'POST',\n\t\t\turl: baseUrl + '/api.php',\n\t\t\tdata: data,\n\t\t\tdataType: 'json'\n\t\t} );\n\t}\n\n\n\tjexcel.prototype.deleteRow = function( spreadsheetID, rowNum ) {\n\t\trowNum = parseInt(rowNum);\n\t\tmw.spreadsheets[spreadsheetID].deleteRow(rowNum);\n\t\tdataValues[spreadsheetID].splice(rowNum, 1);\n\t}\n\n})( jexcel, mediaWiki );\n\n( function ( $, mw, pf ) {\n\tvar baseUrl = mw.config.get( 'wgScriptPath' ),\n\t\tgridParams = mw.config.get( 'wgPageFormsGridParams' ),\n\t\tgridValues = mw.config.get( 'wgPageFormsGridValues' );\n\n\t$( '.pfSpreadsheet' ).each( function() {\n\t\tvar table = this;\n\t\tvar templateName = $(this).attr( 'data-template-name' ),\n\t\t\tformName = $(this).attr( 'data-form-name' ),\n\t\t\tspreadsheetID = $(this).attr( 'id' ),\n\t\t\teditMultiplePages = $(this).attr( 'editMultiplePages' );\n\t\tvar columns = [];\n\n\t\t// Somewhat crude attempt at setting reasonable column widths,\n\t\t// based on the browser width and the number of columns, with\n\t\t// built-in maximum and minimum widths.\n\t\tvar numColumns = Object.keys(gridParams[templateName]).length;\n\t\tvar columnWidth = ( $('#content').width() - 150 ) / numColumns;\n\t\tif ( isNaN(columnWidth) ) {\n\t\t\tcolumnWidth = 200;\n\t\t}\n\t\tif ( columnWidth < 100 ) {\n\t\t\tcolumnWidth = 100;\n\t\t} else if ( columnWidth > 400 ) {\n\t\t\tcolumnWidth = 400;\n\t\t}\n\n\t\tfor ( var templateParam of gridParams[templateName] ) {\n\t\t\tvar columnName = templateParam['name'];\n\t\t\tvar columnType = templateParam['type'];\n\t\t\tvar jExcelType = 'text';\n\t\t\tvar columnAttributes = {\n\t\t\t\ttitle: columnName,\n\t\t\t\twidth: columnWidth + \"px\"\n\t\t\t};\n\t\t\tif ( columnType == 'checkbox' ) {\n\t\t\t\tjExcelType = 'checkbox';\n\t\t\t} else if ( columnType == 'date' ) {\n\t\t\t\tjExcelType = 'calendar';\n\t\t\t\tcolumnAttributes['options'] = {\n\t\t\t\t\tformat: 'YYYY-MM-DD'\n\t\t\t\t}\n\t\t\t} else if ( columnType == 'datetime' ) {\n\t\t\t\tjExcelType = 'calendar';\n\t\t\t\tcolumnAttributes['options'] = {\n\t\t\t\t\ttime: 1,\n\t\t\t\t\tformat: 'YYYY-MM-DD HH:MI'\n\t\t\t\t}\n\t\t\t}\n\t\t\tvar allowedValues = templateParam['values'];\n\t\t\tif ( allowedValues !== undefined ) {\n\t\t\t\tjExcelType = 'dropdown';\n\t\t\t\tcolumnAttributes['source'] = allowedValues;\n\t\t\t\tif ( templateParam['list'] === true ) {\n\t\t\t\t\tcolumnAttributes['multiple'] = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( jExcelType == 'text' ) {\n\t\t\t\tcolumnAttributes['wordWrap'] = true;\n\t\t\t}\n\t\t\tcolumnAttributes['type'] = jExcelType;\n\t\t\tcolumns.push( columnAttributes );\n\t\t}\n\n\t\t// One more column, for the management icons.\n\t\tcolumns.push( {\n\t\t\ttitle: manageColumnTitle,\n\t\t\twidth: \"100px\",\n\t\t\ttype: \"html\",\n\t\t\treadOnly: true\n\t\t} );\n\n\t\tvar columnNames = [];\n\t\tfor ( var column of columns ) {\n\t\t\tcolumnNames.push( column.title );\n\t\t}\n\n\t\tvar pageIDs = [];\n\t\tvar pagesData = [];\n\t\tvar myData = [];\n\t\tvar newPageNames = [];\n\t\tvar dataValues = [];\n\t\tvar modifiedDataValues = [];\n\n\t\tif ( editMultiplePages == undefined ) {\n\t\t\tpopulateSpreadsheet();\n\t\t} else {\n\t\t\tgetPagesForTemplate( templateName, null );\n\t\t}\n\n\t\tfunction getPagesForTemplate( templateName, continueStr ) {\n\t\t\tvar apiUrl = baseUrl + '/api.php?action=query&format=json&list=embeddedin&eilimit=500&eititle=Template:' + templateName;\n\t\t\tif ( continueStr !== null ) {\n\t\t\t\tapiUrl += \"&eicontinue=\" + continueStr;\n\t\t\t}\n\t\t\t$.ajax({\n\t\t\t\t// We get 500 pages because that's the limit\n\t\t\t\t// for \"prop=revision\".\n\t\t\t\turl: apiUrl,\n\t\t\t\tdataType: 'json',\n\t\t\t\ttype: 'POST',\n\t\t\t\tasync: false,\n\t\t\t\theaders: { 'Api-User-Agent': 'Example/1.0' },\n\t\t\t\tsuccess: function( data ) {\n\t\t\t\t\tvar pageObjects = data.query.embeddedin;\n\t\t\t\t\tfor ( var i = 0; i < pageObjects.length; i++ ) {\n\t\t\t\t\t\tpageIDs.push(pageObjects[i].pageid);\n\t\t\t\t\t}\n\t\t\t\t\tif ( data.continue !== undefined ) {\n\t\t\t\t\t\tgetPagesForTemplate( templateName, data.continue.eicontinue );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tgetAllPageDataAndPopulateSpreadsheet( 0 );\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\terror: function(xhr, status, error){\n\t\t\t\t\tmw.notify( \"ERROR: Unable to retrieve pages for the selected template\", { type: 'error' } );\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\t// Recursive function to get the contents of each page from\n\t\t// the API, some number of pages at a time.\n\t\tfunction getAllPageDataAndPopulateSpreadsheet( offset ) {\n\t\t\tvar curPageIDs = pageIDs.slice(offset, offset + numPagesToQuery);\n\t\t\tvar pageIDsStr = curPageIDs.join('|');\n\t\t\t$.ajax({\n\t\t\t\turl: baseUrl + '/api.php?action=query&format=json&prop=revisions&rvprop=content&rvslots=main&formatversion=2&pageids=' + pageIDsStr,\n\t\t\t\tdataType: 'json',\n\t\t\t\ttype: 'POST',\n\t\t\t\theaders: { 'Api-User-Agent': 'Example/1.0' },\n\t\t\t\tsuccess: function(data) {\n\t\t\t\t\tif ( data.query == undefined ) {\n\t\t\t\t\t\t// There are no calls to this template.\n\t\t\t\t\t\tpopulateSpreadsheet();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tfor ( var pageNum = 0; pageNum < data.query.pages.length; pageNum++ ) {\n\t\t\t\t\t\tvar curRevision = data.query.pages[pageNum].revisions[0];\n\t\t\t\t\t\tif (curRevision.hasOwnProperty('slots')) {\n\t\t\t\t\t\t\t// MW 1.31+ (or maybe 1.32+)\n\t\t\t\t\t\t\tvar pageContents = curRevision.slots.main.content;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tvar pageContents = curRevision.content;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tpagesData.push( {\n\t\t\t\t\t\t\ttitle: data.query.pages[pageNum].title,\n\t\t\t\t\t\t\tcontents: pageContents\n\t\t\t\t\t\t} );\n\t\t\t\t\t}\n\t\t\t\t\tif ( curPageIDs.length == numPagesToQuery ) {\n\t\t\t\t\t\tgetAllPageDataAndPopulateSpreadsheet( offset + numPagesToQuery );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tpopulateSpreadsheet();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tfunction getTemplateCalls( pageContent, pageName ) {\n\t\t\t// Match all the template calls and their contents\n\t\t\tvar startDelimiter = '{{' + templateName.toLowerCase() + '\\\\b';\n\t\t\tvar endDelimiter = '}}';\n\t\t\tvar regex = new RegExp( startDelimiter, 'g' );\n\t\t\tvar contents = [];\n\t\t\tvar contentStart, contentEnd;\n\t\t\tcontentStart = contentEnd = 0;\n\t\t\tvar match;\n\t\t\t// Parse contents of individual templates\n\t\t\twhile ( ( match = regex.exec( pageContent.toLowerCase() ) ) !== null ) {\n\t\t\t\tcontentStart = match['index'];\n\t\t\t\tvar content = '';\n\t\t\t\tvar numOpenCurlyBracketPairs = 1;\n\t\t\t\tvar curPos = contentStart + startDelimiter.length - 2;\n\t\t\t\tdo {\n\t\t\t\t\tvar curChar = pageContent.charAt(curPos);\n\t\t\t\t\tvar curPair = curChar + pageContent.charAt(curPos + 1);\n\t\t\t\t\tif ( curPair == '{{' ) {\n\t\t\t\t\t\tnumOpenCurlyBracketPairs++;\n\t\t\t\t\t} else if ( curPair == '}}' ) {\n\t\t\t\t\t\tnumOpenCurlyBracketPairs--;\n\t\t\t\t\t}\n\t\t\t\t\tif ( numOpenCurlyBracketPairs > 0 ) {\n\t\t\t\t\t\tcontent += curChar;\n\t\t\t\t\t}\n\t\t\t\t\tcurPos++;\n\t\t\t\t} while ( numOpenCurlyBracketPairs > 0 && curPair !== '' );\n\n\t\t\t\tcontent = content.trim();\n\t\t\t\t// If this is actually a call to a template with\n\t\t\t\t// a different name, ignore it.\n\t\t\t\tif ( content !== '' && content.charAt(0) !== '|' ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tcontents.push( 'page=' + pageName + content );\n\t\t\t}\n\t\t\treturn contents;\n\t\t}\n\n\t\tfunction getTemplateParams( templateText ) {\n\t\t\tvar params = [];\n\t\t\tif ( templateText == '' ) {\n\t\t\t\treturn params;\n\t\t\t}\n\n\t\t\tvar numOpenCurlyBrackets = 0;\n\t\t\tvar numOpenSquareBrackets = 0;\n\t\t\tvar curReturnValue = '';\n\n\t\t\tfor ( var i = 0; i < templateText.length; i++ ) {\n\t\t\t\tvar curChar = templateText.charAt(i);\n\t\t\t\tif ( curChar == '{' ) {\n\t\t\t\t\tnumOpenCurlyBrackets++;\n\t\t\t\t} else if ( curChar == '}' ) {\n\t\t\t\t\tnumOpenCurlyBrackets--;\n\t\t\t\t}\n\t\t\t\tif ( curChar == '[' ) {\n\t\t\t\t\tnumOpenSquareBrackets++;\n\t\t\t\t} else if ( curChar == ']' ) {\n\t\t\t\t\tnumOpenSquareBrackets--;\n\t\t\t\t}\n\n\t\t\t\tif ( curChar == '|' && numOpenCurlyBrackets == 0 && numOpenSquareBrackets == 0 ) {\n\t\t\t\t\tparams.push( curReturnValue.trim() );\n\t\t\t\t\tcurReturnValue = '';\n\t\t\t\t} else {\n\t\t\t\t\tcurReturnValue += curChar;\n\t\t\t\t}\n\t\t\t}\n\t\t\tparams.push( curReturnValue.trim() );\n\n\t\t\treturn params;\n\t\t}\n\n\t\t//(function getData () {\n\t\t\tvar page = \"\";\n\n\t\t\t// Called whenever the user makes a change to the data.\n\t\t\tfunction editMade( instance, cell, x, y, value ) {\n\t\t\t\tvar spreadsheetID = $(instance).attr('id');\n\t\t\t\tvar columnName = columnNames[x];\n\t\t\t\tif ( columnName === \"page\" ) {\n\t\t\t\t\tnewPageNames[y] = value;\n\t\t\t\t\tpage = value === '' ? \" \" : value;\n\t\t\t\t}\n\n\t\t\t\t// Update either the \"save\" or the \"add\" icon,\n\t\t\t\t// depending on which one exists for this row.\n\t\t\t\t$( \"div#\" + spreadsheetID + \" td[data-y = \" + y + \"] .save-changes\" ).each( function () {\n\t\t\t\t\tif ( modifiedDataValues[spreadsheetID] === undefined ) {\n\t\t\t\t\t\tmodifiedDataValues[spreadsheetID] = {};\n\t\t\t\t\t}\n\t\t\t\t\tvar pageName = $(this).parent().attr(\"id\").replace(\"page-span-\", \"\");\n\t\t\t\t\tif ( modifiedDataValues[spreadsheetID][y] === undefined ) {\n\t\t\t\t\t\t// Hacky way to do a \"deep copy\".\n\t\t\t\t\t\tmodifiedDataValues[spreadsheetID][y] = JSON.parse(JSON.stringify(dataValues[spreadsheetID][y]));\n\t\t\t\t\t}\n\t\t\t\t\tmodifiedDataValues[spreadsheetID][y][columnName] = value;\n\t\t\t\t\t// @HACK - there's probably a better way to only\n\t\t\t\t\t// attach one click listener to this icon.\n\t\t\t\t\t$(this).off();\n\t\t\t\t\t$(this).click( function( event ) {\n\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\tjexcel.prototype.saveChanges(\n\t\t\t\t\t\t\tspreadsheetID,\n\t\t\t\t\t\t\ttemplateName,\n\t\t\t\t\t\t\tpageName,\n\t\t\t\t\t\t\tnewPageNames[y],\n\t\t\t\t\t\t\tformName,\n\t\t\t\t\t\t\ty,\n\t\t\t\t\t\t\tmodifiedDataValues[spreadsheetID][y],\n\t\t\t\t\t\t\tcolumns,\n\t\t\t\t\t\t\teditMultiplePages\n\t\t\t\t\t\t);\n\t\t\t\t\t\tdataValues[spreadsheetID][y] = JSON.parse(JSON.stringify(modifiedDataValues[spreadsheetID][y]));\n\t\t\t\t\t\t$(this).parent().hide();\n\t\t\t\t\t\t$(this).parent().siblings('.mit-row-icons').show();\n\t\t\t\t\t} );\n\t\t\t\t\t// Use this opportunity to make the icons appear.\n\t\t\t\t\t$(this).parent().show();\n\t\t\t\t\t$(this).parent().siblings('.mit-row-icons').hide();\n\t\t\t\t});\n\t\t\t\t$(\"div#\" + spreadsheetID + \" td[data-y = \" + y + \"] .save-new-row\").each(function () {\n\t\t\t\t\tdataValues[spreadsheetID][y][columnName] = value;\n\t\t\t\t\t// @HACK - see above\n\t\t\t\t\t$(this).off();\n\t\t\t\t\t$(this).click( function( event ) {\n\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\tjexcel.prototype.saveNewRow(\n\t\t\t\t\t\t\tspreadsheetID,\n\t\t\t\t\t\t\ttemplateName,\n\t\t\t\t\t\t\tformName,\n\t\t\t\t\t\t\ty,\n\t\t\t\t\t\t\tpage,\n\t\t\t\t\t\t\tdataValues[spreadsheetID][y],\n\t\t\t\t\t\t\tcolumns,\n\t\t\t\t\t\t\teditMultiplePages\n\t\t\t\t\t\t);\n\t\t\t\t\t\t$(this).parent().hide();\n\t\t\t\t\t} );\n\t\t\t\t});\n\t\t\t\t$( \"div#\" + spreadsheetID + \" td[data-y = \" + y + \"] .cancel-changes\" ).each( function () {\n\t\t\t\t\t// @HACK - see above\n\t\t\t\t\t$(this).off();\n\t\t\t\t\t$(this).click( function( event ) {\n\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\tjexcel.prototype.cancelChanges(\n\t\t\t\t\t\t\tspreadsheetID,\n\t\t\t\t\t\t\tdataValues[spreadsheetID][y],\n\t\t\t\t\t\t\ty,\n\t\t\t\t\t\t\tcolumnNames\n\t\t\t\t\t\t);\n\t\t\t\t\t\t$(this).parent().hide();\n\t\t\t\t\t\t$(this).parent().siblings('.mit-row-icons').show();\n\t\t\t\t\t} );\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Populate the starting spreadsheet.\n\t\t\tfunction populateSpreadsheet() {\n\t\t\t\tif ( dataValues[spreadsheetID] == undefined ) {\n\t\t\t\t\tdataValues[spreadsheetID] = [];\n\t\t\t\t}\n\t\t\t\tvar templateCalls = [];\n\t\t\t\tvar numRows = pagesData.length;\n\t\t\t\tfor (var j = 0; j < numRows; j++) {\n\t\t\t\t\ttemplateCalls = getTemplateCalls(pagesData[j].contents, pagesData[j].title);\n\t\t\t\t\tfor (const templateCall of templateCalls) {\n\t\t\t\t\t\tvar fieldArray = getTemplateParams( templateCall );\n\t\t\t\t\t\tvar fieldValueObject = {};\n\t\t\t\t\t\tfor (const field of fieldArray) {\n\t\t\t\t\t\t\tvar equalPos = field.indexOf('=');\n\t\t\t\t\t\t\tvar fieldLabel = field.substring(0, equalPos);\n\t\t\t\t\t\t\tvar fieldValue = field.substring(equalPos + 1);\n\t\t\t\t\t\t\tfieldLabel = fieldLabel.trim();\n\t\t\t\t\t\t\tfieldValueObject[fieldLabel] = fieldValue.trim();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tdataValues[spreadsheetID].push(fieldValueObject);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif ( editMultiplePages == undefined ) {\n\t\t\t\t\tdataValues[spreadsheetID] = gridValues[templateName];\n\t\t\t\t}\n\t\t\t\tfor ( var rowNum = 0; rowNum < dataValues[spreadsheetID].length; rowNum++ ) {\n\t\t\t\t\tvar rowValues = dataValues[spreadsheetID][rowNum];\n\t\t\t\t\tfor ( var columnNum = 0; columnNum < columnNames.length; columnNum++ ) {\n\t\t\t\t\t\tvar columnName = columnNames[columnNum];\n\t\t\t\t\t\tvar curValue = rowValues[columnName];\n\t\t\t\t\t\tif ( myData[rowNum] == undefined ) {\n\t\t\t\t\t\t\tmyData[rowNum] = [];\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( columnName == 'page' ) {\n\t\t\t\t\t\t\tvar pageName = curValue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( curValue !== undefined ) {\n\t\t\t\t\t\t\tvar jExcelValue = jexcel.prototype.getjExcelValue( curValue, gridParams[templateName][columnNum] );\n\t\t\t\t\t\t\tmyData[rowNum].push( jExcelValue );\n\t\t\t\t\t\t\tdataValues[spreadsheetID][rowNum][columnName] = jExcelValue;\n\t\t\t\t\t\t} else if ( columnName === manageColumnTitle ) {\n\t\t\t\t\t\t\tvar cellContents = '<span class=\"save-or-cancel\" style=\"display: none\" id=\"page-span-' + pageName + '\">' +\n\t\t\t\t\t\t\t\t'<a href=\"#\" class=\"save-changes\">' + saveIcon + '</a> | ' +\n\t\t\t\t\t\t\t\t'<a href=\"#\" class=\"cancel-changes\">' + cancelIcon + '</a>' +\n\t\t\t\t\t\t\t\t'</span>';\n\n\t\t\t\t\t\t\tif ( editMultiplePages === undefined ) {\n\t\t\t\t\t\t\t\tcellContents += '<span class=\"mit-row-icons\">' + // \"mit\" = \"multiple-instance template\"\n\t\t\t\t\t\t\t\t\t'<a href=\"#\" class=\"raise-row\">' + upIcon + '</a>' +\n\t\t\t\t\t\t\t\t\t' <a href=\"#\" class=\"lower-row\">' + downIcon + '</a>' +\n\t\t\t\t\t\t\t\t\t' | <a href=\"#\" class=\"delete-row\">' + deleteIcon + '</a>' +\n\t\t\t\t\t\t\t\t\t'</span>';\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tmyData[rowNum].push( cellContents );\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tmyData[rowNum].push(\"\");\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Called after a new row is added.\n\t\t\t\tfunction rowAdded(instance) {\n\t\t\t\t\tvar $instance = $(instance);\n\t\t\t\t\tvar spreadsheetID = $instance.attr('id');\n\t\t\t\t\trowAdded2( $instance, spreadsheetID );\n\t\t\t\t}\n\n\t\t\t\tfunction rowAdded2( $instance, spreadsheetID ) {\n\t\t\t\t\tvar $newRow = $instance.find(\"tr\").last();\n\t\t\t\t\tvar columnParams = gridParams[templateName];\n\t\t\t\t\tfor ( var columnNum = 0; columnNum < columnParams.length; columnNum++ ) {\n\t\t\t\t\t\tvar defaultValue = columnParams[columnNum]['default'];\n\t\t\t\t\t\tif ( defaultValue == undefined ) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tvar realDefaultValue = defaultValue;\n\t\t\t\t\t\t// Special handling for some default values.\n\t\t\t\t\t\tif ( defaultValue == 'now' ) {\n\t\t\t\t\t\t\tvar date = new Date();\n\t\t\t\t\t\t\tvar monthNum = date.getMonth() + 1;\n\t\t\t\t\t\t\trealDefaultValue = date.getFullYear() + '-' + monthNum + '-' + date.getDate() +\n\t\t\t\t\t\t\t\t' ' + date.getHours() + ':' + date.getMinutes();\n\t\t\t\t\t\t} else if ( defaultValue == 'current user' ) {\n\t\t\t\t\t\t\trealDefaultValue = mw.config.get( 'wgUserName' );\n\t\t\t\t\t\t} else if ( defaultValue == 'uuid' ) {\n\t\t\t\t\t\t\trealDefaultValue = window.pfGenerateUUID();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tvar $curCell = $newRow.find(\"td:nth-child(\" + ( columnNum + 2 ) + \")\");\n\t\t\t\t\t\t$curCell.html(realDefaultValue);\n\t\t\t\t\t}\n\t\t\t\t\tvar cell = $newRow.find(\"td\").last();\n\t\t\t\t\tvar manageCellContents = '';\n\n\t\t\t\t\tif ( editMultiplePages === undefined ) {\n\t\t\t\t\t\tmanageCellContents = '<span class=\"mit-row-icons\">' +\n\t\t\t\t\t\t\t'<a href=\"#\" class=\"raise-row\">' + upIcon + '</a>' +\n\t\t\t\t\t\t\t' <a href=\"#\" class=\"lower-row\">' + downIcon + '</a>' +\n\t\t\t\t\t\t\t' | <a href=\"#\" class=\"delete-row\">' + deleteIcon + '</a>' +\n\t\t\t\t\t\t\t'</span>';\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmanageCellContents = '<span class=\"save-or-cancel\">' +\n\t\t\t\t\t\t\t'<a class=\"save-new-row\">' + addIcon + '</a> | ' +\n\t\t\t\t\t\t\t'<a class=\"cancel-adding\">' + cancelIcon + '</a></span>';\n\t\t\t\t\t}\n\t\t\t\t\tcell.html(manageCellContents);\n\n\t\t\t\t\t// Don't activate the \"add page\" icon\n\t\t\t\t\t// yet, because the row doesn't have a\n\t\t\t\t\t// page name.\n\t\t\t\t\t// @TODO - should the icon even be there?\n\t\t\t\t\tcell.find(\"a.cancel-adding\").click( function( event ) {\n\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\tjexcel.prototype.deleteRow(spreadsheetID, dataValues[spreadsheetID].length);\n\t\t\t\t\t} );\n\t\t\t\t\tif ( editMultiplePages === undefined ) {\n\t\t\t\t\t\tcell.find(\"a.delete-row\").click( function( event ) {\n\t\t\t\t\t\t\tvar y = cell.attr(\"data-y\");\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\tjexcel.prototype.deleteRow( spreadsheetID, y );\n\t\t\t\t\t\t\t//dataValues[spreadsheetID].splice(y, 1);\n\t\t\t\t\t\t} );\n\t\t\t\t\t\tcell.find(\"a.raise-row\").click( function( event ) {\n\t\t\t\t\t\t\tvar y = cell.attr(\"data-y\");\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\tif ( y > 0 ) {\n\t\t\t\t\t\t\t\tmw.spreadsheets[spreadsheetID].moveRow( y, y - 1 );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} );\n\t\t\t\t\t\tcell.find(\"a.lower-row\").click( function( event ) {\n\t\t\t\t\t\t\tvar curSpreadsheet = mw.spreadsheets[spreadsheetID];\n\t\t\t\t\t\t\tvar y = parseInt( cell.attr(\"data-y\") );\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\tif ( y + 1 < curSpreadsheet.getData().length ) {\n\t\t\t\t\t\t\t\tcurSpreadsheet.moveRow( y, y + 1 );\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\tdataValues[spreadsheetID].push( {} );\n\t\t\t\t}\n\n\t\t\t\tmw.spreadsheets[spreadsheetID] = jexcel( table, {\n\t\t\t\t\tdata: myData,\n\t\t\t\t\tcolumns: columns,\n\t\t\t\t\ttableOverflow: true,\n\t\t\t\t\tloadingSpin: true,\n\t\t\t\t\tonchange: editMade,\n\t\t\t\t\tcolumnSorting: false,\n\t\t\t\t\tallowInsertColumn: false,\n\t\t\t\t\tallowDeletingAllRows: true,\n\t\t\t\t\toninsertrow: rowAdded,\n\t\t\t\t\tcontextMenu: function() { return false; },\n\t\t\t\t\ttableHeight: \"2500px\",\n\t\t\t\t\tpagination: (editMultiplePages === undefined ) ? false : 100,\n\t\t\t\t\tsearch: (editMultiplePages !== undefined ),\n\t\t\t\t\ttext: {\n\t\t\t\t\t\tsearch: mw.msg( 'search' )\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\t\t// Set the \"label\" for columns that have a label defined.\n\t\t\t\tvar columnParams = gridParams[templateName];\n\t\t\t\tfor ( var columnNum = 0; columnNum < columnParams.length; columnNum++ ) {\n\t\t\t\t\tvar columnLabel = columnParams[columnNum]['label'];\n\t\t\t\t\tif ( columnLabel == undefined ) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\t$(table).find('thead').find('td[data-x=' + columnNum + ']').html(columnLabel);\n\t\t\t\t}\n\n\t\t\t\t$(table).append('<p><a href=\"#\" class=\"add-row\">' + mw.msg( 'pf-spreadsheet-addrow' ) + '</a></p>');\n\n\t\t\t\t$('div#' + spreadsheetID + ' a.add-row').click( function ( event ) {\n\t\t\t\t\tvar curSpreadsheet = mw.spreadsheets[spreadsheetID];\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tif ( curSpreadsheet.getData().length > 0 ) {\n\t\t\t\t\t\tcurSpreadsheet.insertRow();\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcurSpreadsheet.setData([ ' ' ]);\n\t\t\t\t\t\tvar $curSpreadsheetDiv = $(this).closest('.pfSpreadsheet');\n\t\t\t\t\t\trowAdded2($curSpreadsheetDiv, spreadsheetID);\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\t$('div#' + spreadsheetID + ' a.raise-row').click( function ( event ) {\n\t\t\t\t\tvar y = $(this).parents('td').attr(\"data-y\");\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tif ( y > 0 ) {\n\t\t\t\t\t\tmw.spreadsheets[spreadsheetID].moveRow( y, y - 1 );\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\t$('div#' + spreadsheetID + ' a.lower-row').click( function ( event ) {\n\t\t\t\t\tvar curSpreadsheet = mw.spreadsheets[spreadsheetID];\n\t\t\t\t\tvar y = parseInt( $(this).parents('td').attr(\"data-y\") );\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tif ( y + 1 < curSpreadsheet.getData().length ) {\n\t\t\t\t\t\tmw.spreadsheets[spreadsheetID].moveRow( y, y + 1 );\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\t$('div#' + spreadsheetID + ' a.delete-row').click( function ( event ) {\n\t\t\t\t\tvar y = $(this).parents('td').attr(\"data-y\");\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tjexcel.prototype.deleteRow( spreadsheetID, y );\n\t\t\t\t\t//dataValues[spreadsheetID].splice(y, 1);\n\t\t\t\t} );\n\n\t\t\t\t$('div#' + spreadsheetID + ' div.loadingImage').css( \"display\", \"none\" );\n\n\t\t\t}\n\t\t//})();\n\t});\n\n\t// If this is a spreadsheet display within a form, create hidden\n\t// inputs for every cell when the form is submitted, so that all the\n\t// data will actually get submitted.\n\t$( \"#pfForm\" ).submit(function( event ) {\n\t\t$( '.pfSpreadsheet' ).each( function() {\n\t\t\tvar $grid = $(this),\n\t\t\t\ttemplateName = $(this).attr( 'data-template-name' ),\n\t\t\t\tformName = $(this).attr( 'data-form-name' ),\n\t\t\t\teditMultiplePages = $(this).attr( 'editMultiplePages' );\n\n\t\t\t// Add a hidden input for each template, so that the PHP code can know\n\t\t\t// which values came from a spreadsheet.\n\t\t\tif ( !editMultiplePages ) {\n\t\t\t\t$('<input>').attr( 'type', 'hidden' ).attr( 'name', 'spreadsheet_templates[' + templateName + ']' ).attr( 'value', 'true' ).appendTo( '#pfForm' );\n\t\t\t}\n\n\t\t\t$grid.find( \"td\" ).not('.readonly').each( function() {\n\t\t\t\tvar rowNum = $(this).attr('data-y');\n\t\t\t\tvar columnNum = $(this).attr('data-x');\n\t\t\t\tif ( rowNum == undefined || columnNum == undefined ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tvar mwValue = jexcel.prototype.getMWValueFromCell( $(this), gridParams[templateName][columnNum] );\n\t\t\t\tvar paramName = gridParams[templateName][columnNum].name;\n\t\t\t\tvar inputName = templateName + '[' + ( rowNum + 1 ) + '][' + paramName + ']';\n\t\t\t\t$('<input>').attr( 'type', 'hidden' ).attr( 'name', inputName ).attr( 'value', mwValue ).appendTo( '#pfForm' );\n\t\t\t});\n\t\t});\n\t});\n\n\n}( jQuery, mediaWiki, pf ) );\n","usedDeprecatedRules":[]},{"filePath":"/src/repo/libs/PF_submit.js","messages":[{"ruleId":"jsdoc/require-param-type","severity":1,"message":"Missing JSDoc @param \"result\" type.","line":27,"column":null,"nodeType":"Block","endLine":27,"endColumn":null},{"ruleId":"jsdoc/require-param-type","severity":1,"message":"Missing JSDoc @param \"textStatus\" type.","line":28,"column":null,"nodeType":"Block","endLine":28,"endColumn":null},{"ruleId":"jsdoc/require-param-type","severity":1,"message":"Missing JSDoc @param \"jqXHR\" type.","line":29,"column":null,"nodeType":"Block","endLine":29,"endColumn":null},{"ruleId":"no-jquery/variable-pattern","severity":1,"message":"jQuery collection names must match the variablePattern","line":37,"column":4,"nodeType":"AssignmentExpression","endLine":37,"endColumn":55},{"ruleId":"no-jquery/variable-pattern","severity":1,"message":"jQuery collection names must match the variablePattern","line":47,"column":4,"nodeType":"AssignmentExpression","endLine":47,"endColumn":53},{"ruleId":"no-shadow","severity":1,"message":"'form' is already declared in the upper scope on line 14 column 6.","line":85,"column":24,"nodeType":"Identifier","messageId":"noShadow","endLine":85,"endColumn":28},{"ruleId":"no-jquery/variable-pattern","severity":1,"message":"jQuery collection names must match the variablePattern","line":86,"column":7,"nodeType":"VariableDeclarator","endLine":86,"endColumn":50},{"ruleId":"no-jquery/variable-pattern","severity":1,"message":"jQuery collection names must match the variablePattern","line":156,"column":8,"nodeType":"VariableDeclarator","endLine":156,"endColumn":29},{"ruleId":"no-shadow","severity":1,"message":"'form' is already declared in the upper scope on line 14 column 6.","line":156,"column":8,"nodeType":"Identifier","messageId":"noShadow","endLine":156,"endColumn":12},{"ruleId":"no-jquery/variable-pattern","severity":1,"message":"jQuery collection names must match the variablePattern","line":196,"column":4,"nodeType":"AssignmentExpression","endLine":196,"endColumn":25},{"ruleId":"no-jquery/variable-pattern","severity":1,"message":"jQuery collection names must match the variablePattern","line":198,"column":4,"nodeType":"AssignmentExpression","endLine":198,"endColumn":51}],"errorCount":0,"warningCount":11,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/**\n * Javascript handler for the save-and-continue button\n *\n * @author Stephan Gambke\n */\n\n/*global validateAll */\n\n( function ( $, mw ) {\n\n\t'use strict';\n\n\tvar sacButtons;\n\tvar form;\n\n\tfunction setChanged( event ) {\n\t\tsacButtons\n\t\t\t.prop( 'disabled', false )\n\t\t\t.addClass( 'pf-save_and_continue-changed' );\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Called when the server has sent the preview\n\t *\n\t * @param result\n\t * @param textStatus\n\t * @param jqXHR\n\t */\n\tvar resultReceivedHandler = function handleResultReceived( result, textStatus, jqXHR ) {\n\n\t\t// Store the target name\n\t\tvar target = form.find( 'input[name=\"target\"]' );\n\n\t\tif ( target.length === 0 ) {\n\t\t\ttarget = $( '<input type=\"hidden\" name=\"target\">' );\n\t\t\tform.append ( target );\n\t\t}\n\n\t\ttarget.attr( 'value', result.target );\n\n\t\t// Store the form name\n\t\ttarget = form.find( 'input[name=\"form\"]' );\n\n\t\tif ( target.length === 0 ) {\n\t\t\ttarget = $( '<input type=\"hidden\" name=\"form\">' );\n\t\t\tform.append ( target );\n\t\t}\n\n\t\ttarget.attr( 'value', result.form.title );\n\n\t\tsacButtons\n\t\t.addClass( 'pf-save_and_continue-ok' )\n\t\t.removeClass( 'pf-save_and_continue-wait' )\n\t\t.removeClass( 'pf-save_and_continue-error' );\n\n\t};\n\n\tvar resultReceivedErrorHandler = function handleError( jqXHR ){\n\n\t\tvar errors = $.parseJSON( jqXHR.responseText ).errors;\n\n\t\tsacButtons\n\t\t.addClass( 'pf-save_and_continue-error' )\n\t\t.removeClass( 'pf-save_and_continue-wait' );\n\n\t\t// Remove all old error messages and set new ones\n\t\t$( '.errorbox' ).remove();\n\n\n\t\tif ( errors.length > 0 ){\n\t\t\tvar i;\n\t\t\tfor ( i = 0; i < errors.length; i += 1 ) {\n\t\t\t\tif ( errors[i].level < 2 ) { // show errors and warnings\n\t\t\t\t\t$( '#contentSub' )\n\t\t\t\t\t.append( '<div id=\"form_error_header\" class=\"errorbox\" style=\"font-size: medium\"><img src=\"' + mw.config.get( 'wgPageFormsScriptPath' ) + '/skins/MW-Icon-AlertMark.png\" />&nbsp;' + errors[i].message + '</div><br clear=\"both\" />' );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t$( 'html, body' ).scrollTop( $( '#contentSub' ).offset().top );\n\t\t}\n\t};\n\n\tfunction collectData( form ) {\n\t\tvar summaryfield = jQuery( '#wpSummary', form );\n\t\tvar saveAndContinueSummary = mw.msg( 'pf_formedit_saveandcontinue_summary', mw.msg( 'pf_formedit_saveandcontinueediting' ) );\n\t\tvar params;\n\n\t\tif ( summaryfield.length > 0 ) {\n\n\t\t\tvar oldsummary = summaryfield.attr( 'value' );\n\n\t\t\tif ( oldsummary !== '' ) {\n\t\t\t\tsummaryfield.attr( 'value', oldsummary + ' (' + saveAndContinueSummary + ')' );\n\t\t\t} else {\n\t\t\t\tsummaryfield.attr( 'value', saveAndContinueSummary );\n\t\t\t}\n\n\t\t\tparams = form.serialize();\n\n\t\t\tsummaryfield.attr( 'value', oldsummary );\n\t\t} else {\n\t\t\tparams = form.serialize();\n\t\t\tparams += '&wpSummary=' + saveAndContinueSummary;\n\t\t}\n\n\t\tif  ( mw.config.get( 'wgAction' ) === 'formedit' ) {\n\t\t\tparams += '&target=' + encodeURIComponent( mw.config.get( 'wgPageName' ) );\n\t\t} else if ( mw.config.get( 'wgCanonicalSpecialPageName' ) === 'FormEdit' ) {\n\t\t\tvar url = mw.config.get( 'wgPageName' );\n\n\t\t\tvar start = url.indexOf( '/' ) + 1; // find start of subpage\n\t\t\tvar stop;\n\n\t\t\tif ( start >= 0 ) {\n\t\t\t\tstop = url.indexOf( '/', start ); // find end of first subpage\n\t\t\t} else {\n\t\t\t\tstop = -1;\n\t\t\t}\n\n\t\t\tif ( stop >= 0 ) {\n\t\t\t\tparams += '&form=' + encodeURIComponent( url.substring( start, stop ) );\n\n\t\t\t\tstart = stop + 1;\n\t\t\t\tparams += '&target=' + encodeURIComponent( url.substr( start ) );\n\n\t\t\t} else {\n\t\t\t\tparams += '&form=' + encodeURIComponent( url.substr( start ) );\n\t\t\t}\n\t\t}\n\n\t\tparams += '&wpMinoredit=1';\n\n\t\treturn params;\n\t}\n\n\tfunction handleSaveAndContinue( event ) {\n\n\t\tevent.stopImmediatePropagation();\n\n\t\t// remove old error messages\n\t\tvar el = document.getElementById( 'form_error_header' );\n\n\t\tif ( el ) {\n\t\t\tel.parentNode.removeChild( el );\n\t\t}\n\n\t\tif ( validateAll() ) {\n\t\t\t// disable save and continue button\n\t\t\tsacButtons\n\t\t\t.attr( 'disabled', 'disabled' )\n\t\t\t.addClass( 'pf-save_and_continue-wait' )\n\t\t\t.removeClass( 'pf-save_and_continue-changed' );\n\n\t\t\tvar form = $( '#pfForm' );\n\n\t\t\tvar data = {\n\t\t\t\taction: 'pfautoedit',\n\t\t\t\tformat: 'json',\n\t\t\t\tquery: collectData( form ) // add form values to the data\n\t\t\t};\n\n\t\t\tdata.query +=  '&wpSave=' + encodeURIComponent( $( event.currentTarget ).attr( 'value' ) );\n\n\t\t\t$.ajax( {\n\n\t\t\t\ttype: 'POST', // request type ( GET or POST )\n\t\t\t\turl: mw.util.wikiScript( 'api' ), // URL to which the request is sent\n\t\t\t\tdata: data, // data to be sent to the server\n\t\t\t\tdataType: 'json', // type of data expected back from the server\n\t\t\t\tsuccess: resultReceivedHandler, // function to be called if the request succeeds\n\t\t\t\terror: resultReceivedErrorHandler // function to be called on error\n\t\t\t} );\n\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tmw.pageFormsActualizeVisualEditorFields = function( callback ) {\n\t\tvar visualEditors = $.fn.getVEInstances();\n\t\tif( visualEditors.length > 0 ) {\n\t\t\tvar savingQueue = [];\n\t\t\t$(visualEditors).each( function( i, ve ) {\n\t\t\t\tsavingQueue.push( ve.target.updateContent() );\n\t\t\t});\n\t\t\t$.when.apply( $, savingQueue ).then( function () {\n\t\t\t\tcallback();\n\t\t\t});\n\t\t}\n\t};\n\n\tif ( mw.config.get( 'wgAction' ) === 'formedit' || mw.config.get( 'wgCanonicalSpecialPageName' ) === 'FormEdit' ) {\n\t\t$(function() { // Wait until DOM is loaded.\n\t\t\tform = $( '#pfForm' );\n\n\t\t\tsacButtons = $( '.pf-save_and_continue', form );\n\t\t\tsacButtons.click( handleSaveAndContinue );\n\n\t\t\t$( form )\n\t\t\t.on( 'keyup', 'input,select,textarea', function ( event ) {\n\t\t\t\tif ( event.which < 32 ){\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\treturn setChanged( event );\n\t\t\t} )\n\t\t\t.on( 'change', 'input,select,textarea', setChanged )\n\t\t\t.on( 'click', '.multipleTemplateAdder,.removeButton,.rearrangerImage', setChanged )\n\t\t\t.on( 'mousedown', '.rearrangerImage',setChanged );\n\n\t\t\t// Run only when VEForAll extension is present\n\t\t\t$( document ).on( 'VEForAllLoaded', function() {\n\t\t\t\t// Special submit form & other actions handling when VEForAll editor is present\n\t\t\t\tif ( $('.visualeditor').length > 0 ) {\n\t\t\t\t\t// Interrupt \"Save page\" and \"Show changes\" actions\n\t\t\t\t\tvar $formButtons = $( '#wpSave, #wpDiff' );\n\t\t\t\t\tvar canSubmit = false;\n\n\t\t\t\t\tif ( $formButtons.length > 0 ) {\n\t\t\t\t\t\t$formButtons.each( function ( i, button ) {\n\t\t\t\t\t\t\t$( button ).on( 'click', function ( event ) {\n\t\t\t\t\t\t\t\tif ( !canSubmit ) {\n\t\t\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\t\t\tmw.pageFormsActualizeVisualEditorFields( function () {\n\t\t\t\t\t\t\t\t\t\tcanSubmit = true;\n\t\t\t\t\t\t\t\t\t\t$( button ).click();\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} );\n\t\t\t\t\t\t} );\n\t\t\t\t\t}\n\t\t\t\t\t// Interrupt \"Save and continue\" action\n\t\t\t\t\tsacButtons.off('click', handleSaveAndContinue).click( function( event ) {\n\t\t\t\t\t\tmw.pageFormsActualizeVisualEditorFields( function() {\n\t\t\t\t\t\t\thandleSaveAndContinue( event );\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}( jQuery, mediaWiki ) );\n","usedDeprecatedRules":[]},{"filePath":"/src/repo/libs/PF_timepicker.js","messages":[{"ruleId":"jsdoc/require-param-type","severity":1,"message":"Missing JSDoc @param \"inputID\" type.","line":11,"column":null,"nodeType":"Block","endLine":11,"endColumn":null},{"ruleId":"jsdoc/require-param-type","severity":1,"message":"Missing JSDoc @param \"params\" type.","line":12,"column":null,"nodeType":"Block","endLine":12,"endColumn":null},{"ruleId":"no-jquery/variable-pattern","severity":1,"message":"jQuery collection names must match the variablePattern","line":23,"column":6,"nodeType":"VariableDeclarator","endLine":23,"endColumn":41},{"ruleId":"no-jquery/variable-pattern","severity":1,"message":"jQuery collection names must match the variablePattern","line":31,"column":3,"nodeType":"AssignmentExpression","endLine":31,"endColumn":44},{"ruleId":"no-jquery/variable-pattern","severity":1,"message":"jQuery collection names must match the variablePattern","line":49,"column":6,"nodeType":"VariableDeclarator","endLine":49,"endColumn":59},{"ruleId":"no-jquery/no-sizzle","severity":1,"message":"Selector extensions are not allowed","line":64,"column":9,"nodeType":"CallExpression","endLine":64,"endColumn":60},{"ruleId":"no-jquery/variable-pattern","severity":1,"message":"jQuery collection names must match the variablePattern","line":74,"column":6,"nodeType":"VariableDeclarator","endLine":74,"endColumn":29},{"ruleId":"no-jquery/variable-pattern","severity":1,"message":"jQuery collection names must match the variablePattern","line":120,"column":6,"nodeType":"VariableDeclarator","endLine":120,"endColumn":111},{"ruleId":"no-jquery/variable-pattern","severity":1,"message":"jQuery collection names must match the variablePattern","line":122,"column":6,"nodeType":"VariableDeclarator","endLine":122,"endColumn":72},{"ruleId":"no-jquery/variable-pattern","severity":1,"message":"jQuery collection names must match the variablePattern","line":127,"column":7,"nodeType":"VariableDeclarator","endLine":127,"endColumn":131},{"ruleId":"no-jquery/variable-pattern","severity":1,"message":"jQuery collection names must match the variablePattern","line":134,"column":7,"nodeType":"VariableDeclarator","endLine":134,"endColumn":76},{"ruleId":"no-jquery/variable-pattern","severity":1,"message":"jQuery collection names must match the variablePattern","line":138,"column":8,"nodeType":"VariableDeclarator","endLine":138,"endColumn":135}],"errorCount":0,"warningCount":12,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/**\n * Javascript code to be used with input type timepicker.\n *\n * @author Stephan Gambke\n *\n */\n\n/**\n * Initializes a timepicker input\n *\n * @param inputID (String) the id of the input to initialize\n * @param params (Object) the parameter object for the timepicker, contains\n *\t\tminTime: (String) the minimum time to be shown (format hh:mm)\n *\t\tmaxTime: (String) the maximum time to be shown (format hh:mm)\n *\t\tinterval: (String) the interval between selectable times in minutes\n *\t\tformat: (String) a format string (unused) (do we even need it?)\n *\n */\nwindow.PF_TP_init = function( inputID, params ) { // minTime, maxTime, interval, format\n\n\tvar inputIDshow = inputID + '_show';\n\n\tvar inputShow = jQuery( '#' + inputID );\n\tinputShow.attr( 'id', inputIDshow );\n\n\tvar input;\n\n\t// set up hidden input if this timepicker is not part of a datetimepicker\n\tif ( ! params.partOfDTP ) {\n\n\t\tinput = jQuery( '<input type=\"hidden\" >');\n\t\tinput.attr( {\n\t\t\tid: inputID,\n\t\t\tname: inputShow.attr( 'name' ),\n\t\t\tvalue: inputShow.val()\n\t\t} );\n\t\tinput.val(inputShow.val());\n\n\t\tinputShow.after( input );\n\t\tinputShow.removeAttr( 'name' );\n\n\t} else {\n\t\tinput = inputShow;\n\t}\n\n\tvar tabindex = inputShow.attr('tabindex');\n\n\t// append time picker button\n\tvar button = jQuery( '<button type=\"button\" ></button>' );\n\tbutton.attr({\n\t\t'class': params.userClasses,\n\t\t'id': inputID + '_button',\n\t\t'tabindex': tabindex\n\t});\n\n\n\tif ( params.disabled ) {\n\n\t\tbutton.attr( 'disabled', 'disabled' );\n\n\t} else {\n\n\t\tbutton.click( function(){\n\t\t\tif ( jQuery( '#' + inputID + '_tree>ul' ).is(':visible') ) {\n\t\t\t\tinputShow.blur();\n\t\t\t} else {\n\t\t\t\tinputShow.focus();\n\t\t\t}\n\n\t\t} );\n\n\t}\n\n\tvar img = jQuery( '<img>' );\n\timg.attr( 'src', params.buttonImage );\n\n\tbutton.append( img );\n\n\tinput.after( button );\n\n\t// sanitize inputs\n\tvar re = /^\\d+:\\d\\d$/;\n\tvar minh = 0;\n\tvar minm = 0;\n\n\tvar maxh = 23;\n\tvar maxm = 59;\n\n\tif ( re.test( params.minTime ) ) {\n\n\t\tvar min = params.minTime.split( ':', 2 );\n\t\tminh = Number( min[0] );\n\t\tminm = Number( min[1] );\n\n\t\tif ( minm > 59 ) {\n\t\t\tminm = 59;\n\t\t}\n\t}\n\n\tif ( re.test( params.maxTime ) ) {\n\n\t\tvar max = params.maxTime.split( ':', 2 );\n\t\tmaxh = Number( max[0] );\n\t\tmaxm = Number( max[1] );\n\n\t\tif ( maxm > 59 ) {\n\t\t\tmaxm = 59;\n\t\t}\n\t}\n\n\tvar interv = Number( params.interval );\n\n\tif ( interv < 1 ) {\n\t\tinterv = 1;\n\t} else if ( interv > 60 ) {\n\t\tinterv = 60;\n\t}\n\n\t// build html structure\n\tvar sp = jQuery( '<span class=\"PF_timepicker\" id=\"' + inputID + '_tree\" ></span>' ).insertBefore( inputShow );\n\n\tvar ulh = jQuery( '<ul class=\"PF_timepicker_hours\" >' ).appendTo( sp );\n\n\n\tfor ( var h = minh; h <= maxh; ++h ) {\n\n\t\tvar lih = jQuery( '<li class=\"ui-state-default PF_timepicker_hour\">' + ( ( h < 10 ) ? '0' : '' ) + h + '</li>' ).appendTo( ulh );\n\n\t\t//TODO: Replace value for \"show\" by formatted string\n\t\tlih\n\t\t.data( 'value', ( ( h < 10 ) ? '0' : '' ) + h + ':00' )\n\t\t.data( 'show', ( ( h < 10 ) ? '0' : '' ) + h + ':00' );\n\n\t\tvar ulm = jQuery( '<ul class=\"PF_timepicker_minutes\" >' ).appendTo( lih );\n\n\t\tfor ( var m = ( (h === minh) ? minm : 0 ) ; m <= ( (h === maxh) ? maxm : 59 ); m += interv ) {\n\n\t\t\tvar lim = jQuery( '<li class=\"ui-state-default PF_timepicker_minute\">' + ( ( m < 10 ) ? '0' : '' ) + m  + '</li>' ).appendTo( ulm );\n\n\t\t\t//TODO: Replace value for \"show\" by formatted string\n\t\t\tlim\n\t\t\t.data( 'value', ( ( h < 10 ) ? '0' : '' ) + h + ':' + ( ( m < 10 ) ? '0' : \"\" ) + m )\n\t\t\t.data( 'show', ( ( h < 10 ) ? '0' : '' ) + h + ':' + ( ( m < 10 ) ? '0' : \"\" ) + m );\n\n\t\t}\n\n\t}\n\n\t// initially hide everything\n\tjQuery( '#' + inputID + '_tree ul' )\n\t.hide();\n\n\t// attach event handlers\n\tjQuery( '#' + inputID + '_tree li' ) // hours\n\t.mouseover(function(evt){\n\n\t\t// clear any timeout that may still run on the last list item\n\t\tclearTimeout( jQuery( evt.currentTarget ).data( 'timeout' ) );\n\n\t\tjQuery( evt.currentTarget )\n\n\t\t// switch classes to change display style\n\t\t.removeClass( 'ui-state-default' )\n\t\t.addClass( 'ui-state-hover' )\n\n\t\t// set timeout to show minutes for selected hour\n\t\t.data( 'timeout', setTimeout(\n\t\t\tfunction(){\n\t\t\t\tjQuery( evt.currentTarget ).children().fadeIn();\n\t\t\t}, 400 ) );\n\n\t})\n\n\t.mouseout(function(evt){\n\n\t\t// clear any timeout that may still run on this jQuery list item\n\t\tclearTimeout( jQuery( evt.currentTarget ).data( 'timeout' ) );\n\n\t\tjQuery( evt.currentTarget )\n\n\t\t// switch classes to change display style\n\t\t.removeClass( 'ui-state-hover' )\n\t\t.addClass( 'ui-state-default' )\n\n\t\t// hide minutes after a short pause\n\t\t.data( 'timeout', setTimeout(\n\t\t\tfunction(){\n\t\t\t\tjQuery(evt.currentTarget).children().fadeOut();\n\t\t\t}, 400 ) );\n\n\t});\n\n\tjQuery( '#' + inputID + '_tree li' ) // hours, minutes\n\t.mousedown(function(evt){\n\n\t\t// set values and leave input\n\t\tinputShow\n\t\t// Are both these calls necessary? At least the 2nd one is.\n\t\t.attr( 'value', jQuery( this ).data( 'show' ) )\n\t\t.val(jQuery( this ).data( 'show' ) )\n\t\t.blur()\n\t\t.change();\n\n\t\t// clear any timeout that may still run on this jQuery list item\n\t\tclearTimeout( jQuery( evt.currentTarget ).data( 'timeout' ) );\n\n\t\tjQuery( evt.currentTarget )\n\n\t\t// switch classes to change display style\n\t\t.removeClass( 'ui-state-hover' )\n\t\t.addClass( 'ui-state-default' );\n\n\t\t// avoid propagation to parent list item (e.g. hours),\n\t\t// they would overwrite the input value\n\t\treturn false;\n\t});\n\n\t// show timepicker when input gets focus\n\tinputShow\n\t.focus(function() {\n\t\tjQuery( '#' + inputID + '_tree>ul' ).fadeIn();\n\t});\n\n\t// hide timepicker when input loses focus\n\tinputShow\n\t.blur(function() {\n\t\tjQuery( '#' + inputID + '_tree ul' ).fadeOut( 'normal', function() { jQuery(this).hide(); });\n\t});\n\n\tif ( ! params.partOfDTP ) {\n\t\tinputShow\n\t\t.change(function() {\n\t\t\tjQuery( '#' + inputID ).val( jQuery(this).val() );\n\t\t});\n\t}\n\n\tjQuery( '#' + inputID + '_show ~ button[name=\"button\"]' )\n\t.click( function() {\n\t\tinputShow.focus();\n\t});\n\n};\n","usedDeprecatedRules":[]},{"filePath":"/src/repo/libs/PF_tree.js","messages":[{"ruleId":"no-jquery/variable-pattern","severity":1,"message":"jQuery collection names must match the variablePattern","line":50,"column":7,"nodeType":"VariableDeclarator","endLine":50,"endColumn":56},{"ruleId":"no-jquery/variable-pattern","severity":1,"message":"jQuery collection names must match the variablePattern","line":63,"column":7,"nodeType":"VariableDeclarator","endLine":63,"endColumn":60},{"ruleId":"no-jquery/variable-pattern","severity":1,"message":"jQuery collection names must match the variablePattern","line":72,"column":8,"nodeType":"VariableDeclarator","endLine":72,"endColumn":61}],"errorCount":0,"warningCount":3,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/**\n * Defines the applyJStree() function, which turns an HTML \"tree\" of\n * checkboxes or radiobuttons into a dynamic and collapsible tree of options\n * using the jsTree JS library.\n *\n * @author Mathias Lidal\n * @author Yaron Koren\n * @author Priyanshu Varshney\n * @author Amr El-Absy\n */\n\n ( function ($, mw, pf) {\n\n\tpf.TreeInput = function (elem) {\n\t\tthis.element = elem;\n\t\tthis.id = $(this.element).attr('id');\n\t};\n\n\tvar TreeInput_proto = new pf.TreeInput();\n\n\tTreeInput_proto.setOptions = function () {\n\t\tvar data = $(this.element).attr('data');\n\t\tthis.data = JSON.parse(data);\n\t\tvar params = $(this.element).attr('params');\n\t\tthis.params = JSON.parse(params);\n\t\tthis.delimiter = this.params.delimiter;\n\t\tthis.multiple = this.params.multiple;\n\t\tthis.values = [];\n\t\tthis.cur_value = this.params.cur_value;\n\n\t\tvar options = {\n\t\t\t'plugins' :  [ 'checkbox' ],\n\t\t\t'core' : {\n\t\t\t\t'data' : this.data,\n\t\t\t\t'multiple': this.multiple,\n\t\t\t\t'themes' : {\n\t\t\t\t\t\"icons\": false\n\t\t\t\t}\n\t\t\t},\n\t\t\t'checkbox': {\n\t\t\t\t'three_state': false,\n\t\t\t\t'cascade': \"none\"\n\t\t\t}\n\t\t};\n\n\t\treturn options;\n\t};\n\n\tTreeInput_proto.check = function( data ) {\n\t\tvar input = $(this.element).next('input.PFTree_data');\n\n\t\tif ( this.multiple ) {\n\t\t\tthis.values.push( data );\n\t\t\tvar data_string = this.values.join( this.delimiter );\n\t\t\tinput.attr( 'value', data_string );\n\t\t} else {\n\t\t\tthis.values.push( data );\n\t\t\tinput.attr('value', data);\n\t\t}\n\t};\n\n\tTreeInput_proto.uncheck = function( data ) {\n\t\tvar input = $( this.element ).next( 'input.PFTree_data' );\n\n\t\tthis.values.splice( this.values.indexOf( data ), 1 );\n\t\tvar data_string = this.values.join( this.delimiter );\n\t\tinput.attr( 'value', data_string );\n\t};\n\n\tTreeInput_proto.setCurValue = function () {\n\t\tif ( this.cur_value !== null && this.cur_value !== undefined && this.cur_value !== \"\" ) {\n\t\t\tvar input = $( this.element ).next( 'input.PFTree_data' );\n\n\t\t\tinput.attr( 'value', this.cur_value );\n\t\t\tthis.values = this.cur_value.split( this.delimiter );\n\t\t}\n\t};\n\n\tpf.TreeInput.prototype = TreeInput_proto;\n\n} (jQuery, mediaWiki, pf) );\n\n$.fn.extend({\n\tapplyJSTree: function () {\n\t\tvar tree = new pf.TreeInput(this);\n\t\tvar options = tree.setOptions();\n\n\t\t$(this).jstree(options);\n\n\t\t$(this).bind('select_node.jstree', function (evt, data) {\n\t\t\ttree.check(data.node.text);\n\t\t});\n\t\t$(this).bind('deselect_node.jstree', function (evt, data) {\n\t\t\ttree.uncheck(data.node.text);\n\t\t});\n\n\t\ttree.setCurValue();\n\t}\n});\n","usedDeprecatedRules":[]},{"filePath":"/src/repo/libs/PF_wikieditor.js","messages":[{"ruleId":"no-jquery/variable-pattern","severity":1,"message":"jQuery collection names must match the variablePattern","line":14,"column":9,"nodeType":"VariableDeclarator","endLine":14,"endColumn":35}],"errorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"// create ext if it does not exist yet\n/*global wgWikiEditorEnabledModules*/\nif ( window.ext === null || typeof( window.ext ) === \"undefined\" ) {\n\twindow.ext = {};\n}\n\n( function ( $, mw ) {\n\nwindow.ext.wikieditor = {\n\t// initialize the wikieditor on the specified element\n\tinit : function init ( inputId, params ) {\n\t\t$( function() {\n\t\t\tif ( mw ) {\n\t\t\t\tvar input = $( '#' + inputId );\n\n\t\t\t\t// The code below this \"if\" clause does not\n\t\t\t\t// work for MW 1.34 and higher. Therefore, this\n\t\t\t\t// alternative approach is needed. However, it\n\t\t\t\t// requires the presence of an addWikiEditor()\n\t\t\t\t// function, which, at the time of this writing\n\t\t\t\t// (January 2021) had not yet been added to\n\t\t\t\t// WikiEditor. Anyone who wants this code to run\n\t\t\t\t// may thus need to patch the WikiEditor code\n\t\t\t\t// themselves, with the following:\n\t\t\t\t// https://github.com/Nikerabbit/mediawiki-extensions-WikiEditor/commit/9a1188d0850418d8ae64bd06b7f39d9a8cbf127f\n\t\t\t\tif ( typeof( mw.addWikiEditor ) == 'function' ) {\n\t\t\t\t\tmw.loader.using( [ 'ext.wikiEditor' ], function () {\n\t\t\t\t\t\tmw.addWikiEditor( input );\n\t\t\t\t\t} );\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif ( mw.config.values.wgVersion < \"1.33\" ) {\n\t\t\t\t\tvar toolbarmodules = [ 'jquery.wikiEditor.toolbar', 'jquery.wikiEditor.toolbar.config' ];\n\t\t\t\t\tvar dialogmodules = [ 'jquery.wikiEditor.dialogs', 'jquery.wikiEditor.dialogs.config' ];\n\t\t\t\t} else {\n\t\t\t\t\tvar toolbarmodules = [ 'ext.wikiEditor' ];\n\t\t\t\t\tvar dialogmodules = [ 'ext.wikiEditor' ];\n\t\t\t\t}\n\n\t\t\t\t// load toolbar\n\t\t\t\t$.when( mw.loader.using( toolbarmodules ), $.ready ).then( function() {\n\t\t\t\t\tif ( typeof $.wikiEditor.isSupported !== 'function' || $.wikiEditor.isSupported( $.wikiEditor.modules.toolbar ) ) {\n\t\t\t\t\t\tinput.wikiEditor( 'addModule', $.wikiEditor.modules.toolbar.config.getDefaultConfig() );\n\n\t\t\t\t\t\t// hide sig if required\n\t\t\t\t\t\tif ( mw.config.get( 'wgWikiEditorEnabledModules' ) && mw.config.get( 'wgWikiEditorEnabledModules.hidesig' ) === true ) {\n\t\t\t\t\t\t\tinput.wikiEditor( 'removeFromToolbar', {\n\t\t\t\t\t\t\t\t'section': 'main',\n\t\t\t\t\t\t\t\t'group': 'insert',\n\t\t\t\t\t\t\t\t'tool': 'signature'\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\t// load dialogs\n\t\t\t\t$.when( mw.loader.using( dialogmodules ), $.ready ).then( function() {\n\t\t\t\t\tif ( typeof $.wikiEditor.isSupported !== 'function' || $.wikiEditor.isSupported( $.wikiEditor.modules.dialogs ) ) {\n\t\t\t\t\t\t$.wikiEditor.modules.dialogs.config.replaceIcons( input );\n\t\t\t\t\t\tinput.wikiEditor( 'addModule', $.wikiEditor.modules.dialogs.config.getDefaultConfig() );\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t}\n\t\t} );\n\t}\n};\n}( jQuery, mediaWiki ) );\n","usedDeprecatedRules":[]},{"filePath":"/src/repo/libs/PageForms.js","messages":[{"ruleId":"no-jquery/variable-pattern","severity":1,"message":"jQuery collection names must match the variablePattern","line":147,"column":3,"nodeType":"AssignmentExpression","endLine":147,"endColumn":65},{"ruleId":"no-jquery/variable-pattern","severity":1,"message":"jQuery collection names must match the variablePattern","line":149,"column":3,"nodeType":"AssignmentExpression","endLine":149,"endColumn":25},{"ruleId":"no-jquery/variable-pattern","severity":1,"message":"jQuery collection names must match the variablePattern","line":178,"column":7,"nodeType":"VariableDeclarator","endLine":178,"endColumn":31},{"ruleId":"no-jquery/variable-pattern","severity":1,"message":"jQuery collection names must match the variablePattern","line":218,"column":3,"nodeType":"AssignmentExpression","endLine":218,"endColumn":25},{"ruleId":"no-jquery/no-sizzle","severity":1,"message":"Selector extensions are not allowed","line":234,"column":9,"nodeType":"CallExpression","endLine":234,"endColumn":30},{"ruleId":"mediawiki/msg-doc","severity":1,"message":"All possible message keys should be documented. See https://w.wiki/PRw for details.","line":381,"column":61,"nodeType":"CallExpression","endLine":381,"endColumn":79},{"ruleId":"mediawiki/msg-doc","severity":1,"message":"All possible message keys should be documented. See https://w.wiki/PRw for details.","line":388,"column":58,"nodeType":"CallExpression","endLine":388,"endColumn":76},{"ruleId":"no-jquery/variable-pattern","severity":1,"message":"jQuery collection names must match the variablePattern","line":454,"column":6,"nodeType":"VariableDeclarator","endLine":454,"endColumn":59},{"ruleId":"no-jquery/variable-pattern","severity":1,"message":"jQuery collection names must match the variablePattern","line":458,"column":6,"nodeType":"VariableDeclarator","endLine":458,"endColumn":61},{"ruleId":"no-jquery/variable-pattern","severity":1,"message":"jQuery collection names must match the variablePattern","line":468,"column":3,"nodeType":"VariableDeclarator","endLine":468,"endColumn":56},{"ruleId":"no-jquery/variable-pattern","severity":1,"message":"jQuery collection names must match the variablePattern","line":488,"column":7,"nodeType":"VariableDeclarator","endLine":488,"endColumn":58},{"ruleId":"no-jquery/variable-pattern","severity":1,"message":"jQuery collection names must match the variablePattern","line":520,"column":6,"nodeType":"VariableDeclarator","endLine":520,"endColumn":63},{"ruleId":"no-jquery/variable-pattern","severity":1,"message":"jQuery collection names must match the variablePattern","line":523,"column":6,"nodeType":"VariableDeclarator","endLine":523,"endColumn":63},{"ruleId":"no-jquery/variable-pattern","severity":1,"message":"jQuery collection names must match the variablePattern","line":972,"column":7,"nodeType":"VariableDeclarator","endLine":972,"endColumn":25},{"ruleId":"no-jquery/no-class-state","severity":1,"message":"Where possible, maintain application state in JS to avoid slower DOM queries","line":991,"column":9,"nodeType":"CallExpression","endLine":991,"endColumn":42},{"ruleId":"jsdoc/require-returns","severity":1,"message":"Missing JSDoc @return declaration.","line":1023,"column":1,"nodeType":"Block","endLine":1027,"endColumn":4},{"ruleId":"jsdoc/require-param-type","severity":1,"message":"Missing JSDoc @param \"addAboveCurInstance\" type.","line":1026,"column":null,"nodeType":"Block","endLine":1026,"endColumn":null},{"ruleId":"no-jquery/variable-pattern","severity":1,"message":"jQuery collection names must match the variablePattern","line":1241,"column":6,"nodeType":"VariableDeclarator","endLine":1241,"endColumn":25},{"ruleId":"jsdoc/require-returns","severity":1,"message":"Missing JSDoc @return declaration.","line":1269,"column":1,"nodeType":"Block","endLine":1274,"endColumn":4},{"ruleId":"jsdoc/require-param-type","severity":1,"message":"Missing JSDoc @param \"partOfMultiple\" type.","line":1273,"column":null,"nodeType":"Block","endLine":1273,"endColumn":null},{"ruleId":"no-jquery/variable-pattern","severity":1,"message":"jQuery collection names must match the variablePattern","line":1297,"column":4,"nodeType":"AssignmentExpression","endLine":1298,"endColumn":49},{"ruleId":"no-jquery/variable-pattern","severity":1,"message":"jQuery collection names must match the variablePattern","line":1300,"column":4,"nodeType":"AssignmentExpression","endLine":1300,"endColumn":50},{"ruleId":"jsdoc/require-param-type","severity":1,"message":"Missing JSDoc @param \"partOfMultiple\" type.","line":1323,"column":null,"nodeType":"Block","endLine":1323,"endColumn":null},{"ruleId":"compat/compat","severity":1,"message":"performance.now() is not supported in Safari 5.1, android 4.1","line":1526,"column":27,"nodeType":"MemberExpression","endLine":1526,"endColumn":42},{"ruleId":"compat/compat","severity":1,"message":"performance.now() is not supported in Safari 5.1, android 4.1","line":1526,"column":47,"nodeType":"MemberExpression","endLine":1526,"endColumn":62},{"ruleId":"no-shadow","severity":1,"message":"'i' is already declared in the upper scope on line 1542 column 6.","line":1549,"column":13,"nodeType":"Identifier","messageId":"noShadow","endLine":1549,"endColumn":14},{"ruleId":"no-jquery/variable-pattern","severity":1,"message":"jQuery collection names must match the variablePattern","line":1609,"column":8,"nodeType":"VariableDeclarator","endLine":1609,"endColumn":22},{"ruleId":"no-jquery/variable-pattern","severity":1,"message":"jQuery collection names must match the variablePattern","line":1638,"column":6,"nodeType":"VariableDeclarator","endLine":1638,"endColumn":26}],"errorCount":0,"warningCount":28,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/**\n * PageForms.js\n *\n * Javascript utility functions for the Page Forms extension.\n *\n * @author Yaron Koren\n * @author Sanyam Goyal\n * @author Stephan Gambke\n * @author Jeffrey Stuckman\n * @author Harold Solbrig\n * @author Eugene Mednikov\n */\n/*global wgPageFormsShowOnSelect, wgPageFormsFieldProperties, wgPageFormsCargoFields, wgPageFormsDependentFields, validateAll, alert, mwTinyMCEInit, pf, Sortable*/\n\n( function ( $, mw ) {\n\n/*\n * Functions to register/unregister methods for the initialization and\n * validation of inputs.\n */\n\n// Initialize data object to hold initialization and validation data\nfunction setupPF() {\n\n\t$(\"#pfForm\").data(\"PageForms\",{\n\t\tinitFunctions : [],\n\t\tvalidationFunctions : []\n\t});\n\n}\n\n// Register a validation method\n//\n// More than one method may be registered for one input by subsequent calls to\n// PageForms_registerInputValidation.\n//\n// Validation functions and their data are stored in a numbered array\n//\n// @param valfunction The validation functions. Must take a string (the input's id) and an object as parameters\n// @param param The parameter object given to the validation function\n$.fn.PageForms_registerInputValidation = function(valfunction, param) {\n\n\tif ( ! this.attr(\"id\") ) {\n\t\treturn this;\n\t}\n\n\tif ( ! $(\"#pfForm\").data(\"PageForms\") ) {\n\t\tsetupPF();\n\t}\n\n\t$(\"#pfForm\").data(\"PageForms\").validationFunctions.push({\n\t\tinput : this.attr(\"id\"),\n\t\tvalfunction : valfunction,\n\t\tparameters : param\n\t});\n\n\treturn this;\n};\n\n// Register an initialization method\n//\n// More than one method may be registered for one input by subsequent calls to\n// PageForms_registerInputInit. This method also executes the initFunction\n// if the element referenced by /this/ is not part of a multipleTemplateStarter.\n//\n// Initialization functions and their data are stored in a associative array\n//\n// @param initFunction The initialization function. Must take a string (the input's id) and an object as parameters\n// @param param The parameter object given to the initialization function\n// @param noexecute If set, the initialization method will not be executed here\n$.fn.PageForms_registerInputInit = function( initFunction, param, noexecute ) {\n\n\t// return if element has no id\n\tif ( ! this.attr(\"id\") ) {\n\t\treturn this;\n\t}\n\n\t// setup data structure if necessary\n\tif ( ! $(\"#pfForm\").data(\"PageForms\") ) {\n\t\tsetupPF();\n\t}\n\n\t// if no initialization function for this input was registered yet,\n\t// create entry\n\tif ( ! $(\"#pfForm\").data(\"PageForms\").initFunctions[this.attr(\"id\")] ) {\n\t\t$(\"#pfForm\").data(\"PageForms\").initFunctions[this.attr(\"id\")] = [];\n\t}\n\n\t// record initialization function\n\t$(\"#pfForm\").data(\"PageForms\").initFunctions[this.attr(\"id\")].push({\n\t\tinitFunction : initFunction,\n\t\tparameters : param\n\t});\n\n\t// execute initialization if input is not part of multipleTemplateStarter\n\t// and if not forbidden\n\tif ( this.closest(\".multipleTemplateStarter\").length === 0 && !noexecute) {\n\t\tvar input = this;\n\t\t// ensure initFunction is only executed after doc structure is complete\n\t\t$(function() {\n\t\t\tif ( initFunction !== undefined ) {\n\t\t\t\tinitFunction ( input.attr(\"id\"), param );\n\t\t\t}\n\t\t});\n\t}\n\n\treturn this;\n};\n\n// Unregister all validation methods for the element referenced by /this/\n$.fn.PageForms_unregisterInputValidation = function() {\n\n\tvar pfdata = $(\"#pfForm\").data(\"PageForms\");\n\n\tif ( this.attr(\"id\") && pfdata ) {\n\t\t// delete every validation method for this input\n\t\tfor ( var i = 0; i < pfdata.validationFunctions.length; i++ ) {\n\t\t\tif ( typeof pfdata.validationFunctions[i] !== 'undefined' &&\n\t\t\t\tpfdata.validationFunctions[i].input === this.attr(\"id\") ) {\n\t\t\t\tdelete pfdata.validationFunctions[i];\n\t\t\t}\n\t\t}\n\t}\n\n\treturn this;\n};\n\n// Unregister all initialization methods for the element referenced by /this/\n$.fn.PageForms_unregisterInputInit = function() {\n\n\tif ( this.attr(\"id\") && $(\"#pfForm\").data(\"PageForms\") ) {\n\t\tdelete $(\"#pfForm\").data(\"PageForms\").initFunctions[this.attr(\"id\")];\n\t}\n\n\treturn this;\n};\n\n/*\n * Functions for handling 'show on select'\n */\n\n// Display a div that would otherwise be hidden by \"show on select\".\nfunction showDiv( div_id, instanceWrapperDiv, initPage ) {\n\tvar speed = initPage ? 0 : 'fast';\n\tvar elem;\n\tif ( instanceWrapperDiv !== null ) {\n\t\telem = $('[data-origID=\"' + div_id + '\"]', instanceWrapperDiv);\n\t} else {\n\t\telem = $('#' + div_id);\n\t}\n\n\telem\n\t.addClass('shownByPF')\n\n\t.find(\".hiddenByPF\")\n\t.removeClass('hiddenByPF')\n\t.addClass('shownByPF')\n\n\t.find(\".disabledByPF\")\n\t.prop('disabled', false)\n\t.removeClass('disabledByPF');\n\n\telem.each( function() {\n\t\tif ( $(this).css('display') === 'none' ) {\n\n\t\t\t$(this).slideDown(speed, function() {\n\t\t\t\t$(this).fadeTo(speed,1);\n\t\t\t});\n\n\t\t}\n\t});\n\n\t// Now re-show any form elements that are meant to be shown due\n\t// to the current value of form inputs in this div that are now\n\t// being uncovered.\n\tvar wgPageFormsShowOnSelect = mw.config.get( 'wgPageFormsShowOnSelect' );\n\telem.find(\".pfShowIfSelected, .pfShowIfChecked\").each( function() {\n\t\tvar uncoveredInput = $(this);\n\t\tvar uncoveredInputID = null;\n\t\tif ( instanceWrapperDiv === null ) {\n\t\t\tuncoveredInputID = uncoveredInput.attr(\"id\");\n\t\t} else {\n\t\t\tuncoveredInputID = uncoveredInput.attr(\"data-origID\");\n\t\t}\n\t\tvar showOnSelectVals = wgPageFormsShowOnSelect[uncoveredInputID];\n\n\t\tif ( showOnSelectVals !== undefined ) {\n\t\t\tvar inputVal = uncoveredInput.val();\n\t\t\tfor ( var i = 0; i < showOnSelectVals.length; i++ ) {\n\t\t\t\tvar options = showOnSelectVals[i][0];\n\t\t\t\tvar div_id2 = showOnSelectVals[i][1];\n\t\t\t\tif ( uncoveredInput.hasClass( 'pfShowIfSelected' ) ) {\n\t\t\t\t\tshowDivIfSelected( options, div_id2, inputVal, instanceWrapperDiv, initPage );\n\t\t\t\t} else {\n\t\t\t\t\tuncoveredInput.showDivIfChecked( options, div_id2, instanceWrapperDiv, initPage );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n}\n\n// Hide a div due to \"show on select\". The CSS class is there so that PF can\n// ignore the div's contents when the form is submitted.\nfunction hideDiv( div_id, instanceWrapperDiv, initPage ) {\n\tvar speed = initPage ? 0 : 'fast';\n\tvar elem;\n\t// IDs can't contain spaces, and jQuery won't work with such IDs - if\n\t// this one has a space, display an alert.\n\tif ( div_id.indexOf( ' ' ) > -1 ) {\n\t\t// TODO - this should probably be a language value, instead of\n\t\t// hardcoded in English.\n\t\talert( \"Warning: this form has \\\"show on select\\\" pointing to an invalid element ID (\\\"\" + div_id + \"\\\") - IDs in HTML cannot contain spaces.\" );\n\t}\n\n\tif ( instanceWrapperDiv !== null ) {\n\t\telem = instanceWrapperDiv.find('[data-origID=' + div_id + ']');\n\t} else {\n\t\telem = $('#' + div_id);\n\t}\n\n\t// If we're just setting up the page, and this element has already\n\t// been marked to be shown by some other input, don't hide it.\n\tif ( initPage && elem.hasClass('shownByPF') ) {\n\t\treturn;\n\t}\n\n\telem.find(\"span, div\").addClass('hiddenByPF');\n\n\telem.each( function() {\n\t\tif ( $(this).css('display') !== 'none' ) {\n\n\t\t\t// if 'display' is not 'hidden', but the element is hidden otherwise\n\t\t\t// (e.g. by having height = 0), just hide it, else animate the hiding\n\t\t\tif ( $(this).is(':hidden') ) {\n\t\t\t\t$(this).hide();\n\t\t\t} else {\n\t\t\t\t$(this).fadeTo(speed, 0, function() {\n\t\t\t\t\t$(this).slideUp(speed);\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t});\n\n\t// Also, recursively hide further elements that are only shown because\n\t// inputs within this now-hidden div were checked/selected.\n\tvar wgPageFormsShowOnSelect = mw.config.get( 'wgPageFormsShowOnSelect' );\n\telem.find(\".pfShowIfSelected, .pfShowIfChecked\").each( function() {\n\t\tvar showOnSelectVals;\n\t\tif ( instanceWrapperDiv === null ) {\n\t\t\tshowOnSelectVals = wgPageFormsShowOnSelect[$(this).attr(\"id\")];\n\t\t} else {\n\t\t\tshowOnSelectVals = wgPageFormsShowOnSelect[$(this).attr(\"data-origID\")];\n\t\t}\n\n\t\tif ( showOnSelectVals !== undefined ) {\n\t\t\tfor ( var i = 0; i < showOnSelectVals.length; i++ ) {\n\t\t\t\t//var options = showOnSelectVals[i][0];\n\t\t\t\tvar div_id2 = showOnSelectVals[i][1];\n\t\t\t\thideDiv( div_id2, instanceWrapperDiv, initPage );\n\t\t\t}\n\t\t}\n\t});\n}\n\n// Show this div if the current value is any of the relevant options -\n// otherwise, hide it.\nfunction showDivIfSelected(options, div_id, inputVal, instanceWrapperDiv, initPage) {\n\tfor ( var i = 0; i < options.length; i++ ) {\n\t\t// If it's a listbox and the user has selected more than one\n\t\t// value, it'll be an array - handle either case.\n\t\tif (($.isArray(inputVal) && $.inArray(options[i], inputVal) >= 0) ||\n\t\t\t(!$.isArray(inputVal) && (inputVal === options[i]))) {\n\t\t\tshowDiv( div_id, instanceWrapperDiv, initPage );\n\t\t\treturn;\n\t\t}\n\t}\n\thideDiv( div_id, instanceWrapperDiv, initPage );\n}\n\n// Used for handling 'show on select' for the 'dropdown' and 'listbox' inputs.\n$.fn.showIfSelected = function(partOfMultiple, initPage) {\n\tvar inputVal = this.val(),\n\t\twgPageFormsShowOnSelect = mw.config.get( 'wgPageFormsShowOnSelect' ),\n\t\tshowOnSelectVals,\n\t\tinstanceWrapperDiv;\n\n\tif ( partOfMultiple ) {\n\t\tshowOnSelectVals = wgPageFormsShowOnSelect[this.attr(\"data-origID\")];\n\t\tinstanceWrapperDiv = this.closest('.multipleTemplateInstance');\n\t} else {\n\t\tshowOnSelectVals = wgPageFormsShowOnSelect[this.attr(\"id\")];\n\t\tinstanceWrapperDiv = null;\n\t}\n\n\tif ( showOnSelectVals !== undefined ) {\n\t\tfor ( var i = 0; i < showOnSelectVals.length; i++ ) {\n\t\t\tvar options = showOnSelectVals[i][0];\n\t\t\tvar div_id = showOnSelectVals[i][1];\n\t\t\tshowDivIfSelected( options, div_id, inputVal, instanceWrapperDiv, initPage );\n\t\t}\n\t}\n\n\treturn this;\n};\n\n// Show this div if any of the relevant selections are checked -\n// otherwise, hide it.\n$.fn.showDivIfChecked = function(options, div_id, instanceWrapperDiv, initPage ) {\n\tfor ( var i = 0; i < options.length; i++ ) {\n\t\tif ($(this).find('[value=\"' + options[i] + '\"]').is(\":checked\")) {\n\t\t\tshowDiv( div_id, instanceWrapperDiv, initPage );\n\t\t\treturn this;\n\t\t}\n\t}\n\thideDiv( div_id, instanceWrapperDiv, initPage );\n\n\treturn this;\n};\n\n// Used for handling 'show on select' for the 'checkboxes' and 'radiobutton'\n// inputs.\n$.fn.showIfChecked = function(partOfMultiple, initPage) {\n\tvar wgPageFormsShowOnSelect = mw.config.get( 'wgPageFormsShowOnSelect' ),\n\t\tshowOnSelectVals,\n\t\tinstanceWrapperDiv,\n\t\ti;\n\n\tif ( partOfMultiple ) {\n\t\tshowOnSelectVals = wgPageFormsShowOnSelect[this.attr(\"data-origID\")];\n\t\tinstanceWrapperDiv = this.closest('.multipleTemplateInstance');\n\t} else {\n\t\tshowOnSelectVals = wgPageFormsShowOnSelect[this.attr(\"id\")];\n\t\tinstanceWrapperDiv = null;\n\t}\n\n\tif ( showOnSelectVals !== undefined ) {\n\t\tfor ( i = 0; i < showOnSelectVals.length; i++ ) {\n\t\t\tvar options = showOnSelectVals[i][0];\n\t\t\tvar div_id = showOnSelectVals[i][1];\n\t\t\tthis.showDivIfChecked( options, div_id, instanceWrapperDiv, initPage );\n\t\t}\n\t}\n\n\treturn this;\n};\n\n// Used for handling 'show on select' for the 'checkbox' input.\n$.fn.showIfCheckedCheckbox = function( partOfMultiple, initPage ) {\n\tvar wgPageFormsShowOnSelect = mw.config.get( 'wgPageFormsShowOnSelect' ),\n\t\tdivIDs,\n\t\tinstanceWrapperDiv,\n\t\ti;\n\n\tif (partOfMultiple) {\n\t\tdivIDs = wgPageFormsShowOnSelect[this.attr(\"data-origID\")];\n\t\tinstanceWrapperDiv = this.closest(\".multipleTemplateInstance\");\n\t} else {\n\t\tdivIDs = wgPageFormsShowOnSelect[this.attr(\"id\")];\n\t\tinstanceWrapperDiv = null;\n\t}\n\n\tfor ( i = 0; i < divIDs.length; i++ ) {\n\t\tvar divID = divIDs[i];\n\t\tif ($(this).is(\":checked\")) {\n\t\t\tshowDiv( divID, instanceWrapperDiv, initPage );\n\t\t} else {\n\t\t\thideDiv( divID, instanceWrapperDiv, initPage );\n\t\t}\n\t}\n\n\treturn this;\n};\n\n/*\n * Validation functions\n */\n\n// Set the error message for an input.\n$.fn.setErrorMessage = function(msg, val) {\n\tvar container = this.find('.pfErrorMessages');\n\tcontainer.html($('<div>').addClass( 'errorMessage' ).text( mw.msg( msg, val ) ));\n};\n\n// Append an error message to the end of an input.\n$.fn.addErrorMessage = function(msg, val) {\n\tthis.find('input').addClass('inputError');\n\tthis.find('select2-container').addClass('inputError');\n\tthis.append($('<div>').addClass( 'errorMessage' ).text( mw.msg( msg, val ) ));\n\t// If this is part of a minimized multiple-template instance, add a\n\t// red border around the instance rectangle to make it easier to find.\n\tthis.parents( '.multipleTemplateInstance.minimized' ).css( 'border', '1px solid red' );\n};\n\n$.fn.isAtMaxInstances = function() {\n\tvar numInstances = this.find(\"div.multipleTemplateInstance\").length;\n\tvar maximumInstances = this.attr(\"maximumInstances\");\n\tif ( numInstances >= maximumInstances ) {\n\t\tthis.parent().setErrorMessage( 'pf_too_many_instances_error', maximumInstances );\n\t\treturn true;\n\t}\n\treturn false;\n};\n\n$.fn.validateNumInstances = function() {\n\tvar minimumInstances = this.attr(\"minimumInstances\");\n\tvar maximumInstances = this.attr(\"maximumInstances\");\n\tvar numInstances = this.find(\"div.multipleTemplateInstance\").length;\n\tif ( numInstances < minimumInstances ) {\n\t\tthis.parent().addErrorMessage( 'pf_too_few_instances_error', minimumInstances );\n\t\treturn false;\n\t} else if ( numInstances > maximumInstances ) {\n\t\tthis.parent().addErrorMessage( 'pf_too_many_instances_error', maximumInstances );\n\t\treturn false;\n\t} else {\n\t\treturn true;\n\t}\n};\n\n$.fn.validateMandatoryField = function() {\n\tvar fieldVal = this.find(\".mandatoryField\").val();\n\tvar isEmpty;\n\n\tif (fieldVal === null) {\n\t\tisEmpty = true;\n\t} else if ($.isArray(fieldVal)) {\n\t\tisEmpty = (fieldVal.length === 0);\n\t} else {\n\t\tisEmpty = (fieldVal.replace(/\\s+/, '') === '');\n\t}\n\tif (isEmpty) {\n\t\tthis.addErrorMessage( 'pf_blank_error' );\n\t\treturn false;\n\t} else {\n\t\treturn true;\n\t}\n};\n\n$.fn.validateUniqueField = function() {\n\n\tvar UNDEFINED = \"undefined\";\n\tvar field = this.find(\".uniqueField\");\n\tvar fieldVal = field.val();\n\n\tif (typeof fieldVal === UNDEFINED || fieldVal.replace(/\\s+/, '') === '') {\n\t\treturn true;\n\t}\n\n\tvar fieldOrigVal = field.prop(\"defaultValue\");\n\tif (fieldVal === fieldOrigVal) {\n\t\treturn true;\n\t}\n\n\tvar categoryFieldName = field.prop(\"id\") + \"_unique_for_category\";\n\tvar categoryField = $(\"[name=\" + categoryFieldName + \"]\");\n\tvar category = categoryField.val();\n\n\tvar namespaceFieldName = field.prop(\"id\") + \"_unique_for_namespace\";\n\tvar namespaceField = $(\"[name=\" + namespaceFieldName + \"]\");\n\tvar namespace = namespaceField.val();\n\n\tvar url = mw.config.get( 'wgScriptPath' ) + \"/api.php?format=json&action=\";\n\n\tvar query,\n\t\tisNotUnique;\n\n\t// SMW\n\tvar propertyFieldName = field.prop(\"id\") + \"_unique_property\",\n\t\tpropertyField = $(\"[name=\" + propertyFieldName + \"]\"),\n\t\tproperty = propertyField.val();\n\tif (typeof property !== UNDEFINED && property.replace(/\\s+/, '') !== '') {\n\n\t\tquery = \"[[\" + property + \"::\" + fieldVal + \"]]\";\n\n\t\tif (typeof category !== UNDEFINED &&\n\t\t\tcategory.replace(/\\s+/, '') !== '') {\n\t\t\tquery += \"[[Category:\" + category + \"]]\";\n\t\t}\n\n\t\tif (typeof namespace !== UNDEFINED) {\n\t\t\tif (namespace.replace(/\\s+/, '') !== '') {\n\t\t\t\tquery += \"[[:\" + namespace + \":+]]\";\n\t\t\t} else {\n\t\t\t\tquery += \"[[:+]]\";\n\t\t\t}\n\t\t}\n\n\t\tvar conceptFieldName = field.prop(\"id\") + \"_unique_for_concept\";\n\t\tvar conceptField = $(\"[name=\" + conceptFieldName + \"]\");\n\t\tvar concept = conceptField.val();\n\t\tif (typeof concept !== UNDEFINED &&\n\t\t\tconcept.replace(/\\s+/, '') !== '') {\n\t\t\tquery += \"[[Concept:\" + concept + \"]]\";\n\t\t}\n\n\t\tquery += \"|limit=1\";\n\t\tquery = encodeURIComponent(query);\n\n\t\turl += \"ask&query=\" + query;\n\t\tisNotUnique = true;\n\t\t$.ajax({\n\t\t\turl: url,\n\t\t\tdataType: 'json',\n\t\t\tasync: false,\n\t\t\tsuccess: function(data) {\n\t\t\t\tif (data.query.meta.count === 0) {\n\t\t\t\t\tisNotUnique = false;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\tif (isNotUnique) {\n\t\t\tthis.addErrorMessage( 'pf_not_unique_error' );\n\t\t\treturn false;\n\t\t} else {\n\t\t\treturn true;\n\t\t}\n\t}\n\n\t// Cargo\n\tvar cargoTableFieldName = field.prop(\"id\") + \"_unique_cargo_table\";\n\tvar cargoTableField = $(\"[name=\" + cargoTableFieldName + \"]\");\n\tvar cargoTable = cargoTableField.val();\n\tvar cargoFieldFieldName = field.prop(\"id\") + \"_unique_cargo_field\";\n\tvar cargoFieldField = $(\"[name=\" + cargoFieldFieldName + \"]\");\n\tvar cargoField = cargoFieldField.val();\n\tif (typeof cargoTable !== UNDEFINED && cargoTable.replace(/\\s+/, '') !== ''\n\t\t&& typeof cargoField !== UNDEFINED\n\t\t&& cargoField.replace(/\\s+/, '') !== '') {\n\n\t\tquery = \"&where=\" + cargoField + \"+=+'\" + fieldVal + \"'\";\n\n\t\tif (typeof category !== UNDEFINED &&\n\t\t\tcategory.replace(/\\s+/, '') !== '') {\n\t\t\tcategory = category.replace(/\\s/, '_');\n\t\t\tquery += \"+AND+cl_to=\" + category + \"+AND+cl_from=_pageID\";\n\t\t\tcargoTable += \",categorylinks\";\n\t\t}\n\n\t\tif (typeof namespace !== UNDEFINED) {\n\t\t\tquery += \"+AND+_pageNamespace=\";\n\t\t\tif (namespace.replace(/\\s+/, '') !== '') {\n\t\t\t\tvar ns = mw.config.get('wgNamespaceIds')[namespace.toLowerCase()];\n\t\t\t\tif (typeof ns !== UNDEFINED) {\n\t\t\t\t\tquery += ns;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tquery += \"0\";\n\t\t\t}\n\t\t}\n\n\t\tquery += \"&limit=1\";\n\n\t\turl += \"cargoquery&tables=\" + cargoTable + \"&fields=\" + cargoField +\n\t\t\tquery;\n\t\tisNotUnique = true;\n\t\t$.ajax({\n\t\t\turl: url,\n\t\t\tdataType: 'json',\n\t\t\tasync: false,\n\t\t\tsuccess: function(data) {\n\t\t\t\tif (data.cargoquery.length === 0) {\n\t\t\t\t\tisNotUnique = false;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\tif (isNotUnique) {\n\t\t\tthis.addErrorMessage( 'pf_not_unique_error' );\n\t\t\treturn false;\n\t\t} else {\n\t\t\treturn true;\n\t\t}\n\t}\n\n\treturn true;\n\n};\n\n$.fn.validateMandatoryComboBox = function() {\n\tvar combobox = this.find('.mandatoryField');\n\tif (combobox.val() === null || combobox.val() === '') {\n\t\tthis.addErrorMessage( 'pf_blank_error' );\n\t\treturn false;\n\t} else {\n\t\treturn true;\n\t}\n};\n\n$.fn.validateMandatoryDateField = function() {\n\tif (this.find(\".dayInput\").val() === '' ||\n\t\tthis.find(\".monthInput\").val() === '' ||\n\t\tthis.find(\".yearInput\").val() === '') {\n\t\tthis.addErrorMessage( 'pf_blank_error' );\n\t\treturn false;\n\t} else {\n\t\treturn true;\n\t}\n};\n\n$.fn.validateMandatoryRadioButton = function() {\n\tvar checkedValue = this.find(\"input:checked\").val();\n\tif (!checkedValue || checkedValue == '') {\n\t\tthis.addErrorMessage('pf_blank_error');\n\t\treturn false;\n\t} else {\n\t\treturn true;\n\t}\n};\n\n$.fn.validateMandatoryCheckboxes = function() {\n\t// Get the number of checked checkboxes within this span - must\n\t// be at least one.\n\tvar numChecked = this.find(\"input:checked\").size();\n\tif (numChecked === 0) {\n\t\tthis.addErrorMessage('pf_blank_error');\n\t\treturn false;\n\t} else {\n\t\treturn true;\n\t}\n};\n\n$.fn.validateMandatoryTree = function() {\n\tvar input_value = this.find( 'input' ).attr( 'value' );\n\tif ( input_value === undefined || input_value === '' ) {\n\t\tthis.addErrorMessage( 'pf_blank_error' );\n\t\treturn false;\n\t} else {\n\t\treturn true;\n\t}\n};\n\n$.fn.validateMandatoryDatePicker = function() {\n\tvar input = this.find('input');\n\tif (input.val() === null || input.val() === '') {\n\t\tthis.addErrorMessage( 'pf_blank_error' );\n\t\treturn false;\n\t} else {\n\t\treturn true;\n\t}\n};\n\n/*\n * Type-based validation\n */\n\n$.fn.validateURLField = function() {\n\tvar fieldVal = this.find(\"input\").val();\n\tvar url_protocol = mw.config.get( 'wgUrlProtocols' );\n\t//removing backslash before colon from url_protocol string\n\turl_protocol = url_protocol.replace( /\\\\:/, ':' );\n\t//removing '//' from wgUrlProtocols as this causes to match any protocol in regexp\n\turl_protocol = url_protocol.replace( /\\|\\\\\\/\\\\\\//, '' );\n\tvar url_regexp = new RegExp( '(' + url_protocol + ')' + '(\\\\w+:{0,1}\\\\w*@)?(\\\\S+)(:[0-9]+)?(\\/|\\/([\\\\w#!:.?+=&%@!\\\\-\\/]))?' );\n\tif (fieldVal === \"\" || url_regexp.test(fieldVal)) {\n\t\treturn true;\n\t} else {\n\t\tthis.addErrorMessage( 'pf_bad_url_error' );\n\t\treturn false;\n\t}\n};\n\n$.fn.validateEmailField = function() {\n\tvar fieldVal = this.find(\"input\").val();\n\t// code borrowed from http://javascript.internet.com/forms/email-validation---basic.html\n\tvar email_regexp = /^\\s*\\w+([\\.-]?\\w+)*@\\w+([\\.-]?\\w+)*(\\.\\w{2,6})+\\s*$/;\n\tif (fieldVal === '' || email_regexp.test(fieldVal)) {\n\t\treturn true;\n\t} else {\n\t\tthis.addErrorMessage( 'pf_bad_email_error' );\n\t\treturn false;\n\t}\n};\n\n$.fn.validateNumberField = function() {\n\tvar fieldVal = this.find(\"input\").val();\n\t// Handle \"E notation\"/scientific notation (\"1.2e-3\") in addition\n\t// to regular numbers\n\tif (fieldVal === '' ||\n\tfieldVal.match(/^\\s*[\\-+]?((\\d+[\\.,]?\\d*)|(\\d*[\\.,]?\\d+))([eE]?[\\-\\+]?\\d+)?\\s*$/)) {\n\t\treturn true;\n\t} else {\n\t\tthis.addErrorMessage( 'pf_bad_number_error' );\n\t\treturn false;\n\t}\n};\n\n$.fn.validateIntegerField = function() {\n\tvar fieldVal = this.find(\"input\").val();\n\tif ( fieldVal === '' || fieldVal == parseInt( fieldVal, 10 ) ) {\n\t\treturn true;\n\t} else {\n\t\tthis.addErrorMessage( 'pf_bad_integer_error' );\n\t\treturn false;\n\t}\n};\n\n$.fn.validateDateField = function() {\n\t// validate only if day and year fields are both filled in\n\tvar dayVal = this.find(\".dayInput\").val();\n\tvar yearVal = this.find(\".yearInput\").val();\n\tif (dayVal === '' || yearVal === '') {\n\t\treturn true;\n\t} else if (dayVal.match(/^\\d+$/) && dayVal <= 31) {\n\t\t// no year validation, since it can also include\n\t\t// 'BC' and possibly other non-number strings\n\t\treturn true;\n\t} else {\n\t\tthis.addErrorMessage( 'pf_bad_date_error' );\n\t\treturn false;\n\t}\n};\n\n// Standalone pipes are not allowed, because they mess up the template\n// parsing; unless they're part of a call to a template or a parser function.\n$.fn.checkForPipes = function() {\n\tvar fieldVal = this.find(\"input, textarea\").val();\n\t// We need to check for a few different things because this is\n\t// called for a variety of different input types.\n\tif ( fieldVal === undefined || fieldVal === '' ) {\n\t\tfieldVal = this.text();\n\t}\n\tif ( fieldVal === undefined || fieldVal === '' ) {\n\t\treturn true;\n\t}\n\tif ( fieldVal.indexOf( '|' ) < 0 ) {\n\t\treturn true;\n\t}\n\n\t// Also allow pipes within special tags, like <pre> or <syntaxhighlight>.\n\t// Code copied, more or less, from PFTemplateInForm::escapeNonTemplatePipes().\n\tvar startAndEndTags = [\n\t\t[ '<pre', 'pre>' ],\n\t\t[ '<syntaxhighlight', 'syntaxhighlight>' ],\n\t\t[ '<source', 'source>' ],\n\t\t[ '<ref', 'ref>' ]\n\t];\n\n\tfor ( var i in startAndEndTags ) {\n\t\tvar startTag = startAndEndTags[i][0];\n\t\tvar endTag = startAndEndTags[i][1];\n\t\tvar pattern = RegExp( \"(\" + startTag + \"[^]*?)\\\\|([^]*?\" + endTag + \")\", 'i' );\n\t\tvar matches;\n\t\twhile ( ( matches = fieldVal.match( pattern ) ) !== null ) {\n\t\t\t// Special handling, to avoid escaping pipes\n\t\t\t// within a string that looks like:\n\t\t\t// startTag ... endTag | startTag ... endTag\n\t\t\tif ( matches[1].includes( endTag ) &&\n\t\t\t\tmatches[2].includes( startTag ) ) {\n\t\t\t\tfieldVal = fieldVal.replace( pattern, \"$1\" + \"\\2\" + \"$2\");\n\t\t\t} else {\n\t\t\t\tfieldVal = fieldVal.replace( pattern, \"$1\" + \"\\1\" + \"$2\" );\n\t\t\t}\n\t\t}\n\t}\n\tfieldVal = fieldVal.replace( \"\\2\", '|' );\n\n\t// Now check for pipes outside of brackets.\n\tvar nextPipe,\n\t\tnextDoubleBracketsStart,\n\t\tnextDoubleBracketsEnd;\n\n\t// There's at least one pipe - here's where the real work begins.\n\t// We do a mini-parsing of the string to try to make sure that every\n\t// pipe is within either double square brackets (links) or double\n\t// curly brackets (parser functions, template calls).\n\t// For simplicity's sake, turn all curly brackets into square brackets,\n\t// so we only have to check for one thing.\n\t// This will incorrectly allow bad text like \"[[a|b}}\", but hopefully\n\t// that's not a major problem.\n\tfieldVal = fieldVal.replace( /{{/g, '[[' );\n\tfieldVal = fieldVal.replace( /}}/g, ']]' );\n\tvar curIndex = 0;\n\tvar numUnclosedBrackets = 0;\n\twhile ( true ) {\n\t\tnextDoubleBracketsStart = fieldVal.indexOf( '[[', curIndex );\n\n\t\tif ( numUnclosedBrackets === 0 ) {\n\t\t\tnextPipe = fieldVal.indexOf( '|', curIndex );\n\t\t\tif ( nextPipe < 0 ) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif ( nextDoubleBracketsStart < 0 || nextPipe < nextDoubleBracketsStart ) {\n\t\t\t\t// There's a pipe where it shouldn't be.\n\t\t\t\tthis.addErrorMessage( 'pf_pipe_error' );\n\t\t\t\treturn false;\n\t\t\t}\n\t\t} else {\n\t\t\tif ( nextDoubleBracketsEnd < 0 ) {\n\t\t\t\t// Something is malformed - might as well throw\n\t\t\t\t// an error.\n\t\t\t\tthis.addErrorMessage( 'pf_pipe_error' );\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tnextDoubleBracketsEnd = fieldVal.indexOf( ']]', curIndex );\n\n\t\tif ( nextDoubleBracketsStart >= 0 && nextDoubleBracketsStart < nextDoubleBracketsEnd ) {\n\t\t\tnumUnclosedBrackets++;\n\t\t\tcurIndex = nextDoubleBracketsStart + 2;\n\t\t} else {\n\t\t\tnumUnclosedBrackets--;\n\t\t\tcurIndex = nextDoubleBracketsEnd + 2;\n\t\t}\n\t}\n\n\t// We'll never get here, but let's have this line anyway.\n\treturn true;\n};\n\nwindow.validateAll = function () {\n\n\t// Hook that fires on form submission, before the validation.\n\tmw.hook('pf.formValidationBefore').fire();\n\n\tvar args = {numErrors: 0};\n\tmw.hook('pf.formValidation').fire( args );\n\tvar num_errors = args.numErrors;\n\n\t// Remove all old error messages.\n\t$(\".errorMessage\").remove();\n\n\t// Make sure all inputs are ignored in the \"starter\" instance\n\t// of any multiple-instance template.\n\t$(\".multipleTemplateStarter\").find(\"span, div\").addClass(\"hiddenByPF\");\n\n\t$(\".multipleTemplateList\").each( function() {\n\t\tif (! $(this).validateNumInstances() ) {\n\t\t\tnum_errors += 1;\n\t\t}\n\t});\n\n\t$(\"span.inputSpan.mandatoryFieldSpan\").not(\".hiddenByPF\").each( function() {\n\t\tif (! $(this).validateMandatoryField() ) {\n\t\t\tnum_errors += 1;\n\t\t}\n\t});\n\t$(\"span.comboboxSpan.mandatoryFieldSpan\").not(\".hiddenByPF\").each( function() {\n\t\tif (! $(this).validateMandatoryComboBox() ) {\n\t\t\tnum_errors += 1;\n\t\t}\n\t});\n\t$(\"span.dateInput.mandatoryFieldSpan\").not(\".hiddenByPF\").each( function() {\n\t\tif (! $(this).validateMandatoryDateField() ) {\n\t\t\tnum_errors += 1;\n\t\t}\n\t});\n\t$(\"span.radioButtonSpan.mandatoryFieldSpan\").not(\".hiddenByPF\").each( function() {\n\t\tif (! $(this).validateMandatoryRadioButton() ) {\n\t\t\tnum_errors += 1;\n\t\t}\n\t});\n\t$(\"span.checkboxesSpan.mandatoryFieldSpan\").not(\".hiddenByPF\").each( function() {\n\t\tif (! $(this).validateMandatoryCheckboxes() ) {\n\t\t\tnum_errors += 1;\n\t\t}\n\t});\n\t$(\"div.pfTreeInputWrapper.mandatory\").not(\".hiddenByPF\").each( function() {\n\t\tif (! $(this).validateMandatoryTree() ) {\n\t\t\tnum_errors += 1;\n\t\t}\n\t});\n\t$(\"div.pfPickerWrapper.mandatory\").not(\".hiddenByPF\").each( function() {\n\t\tif (! $(this).find('.pfPicker').validateMandatoryDatePicker() ) {\n\t\t\tnum_errors += 1;\n\t\t}\n\t});\n\t$(\"span.inputSpan.uniqueFieldSpan\").not(\".hiddenByPF\").each( function() {\n\t\tif (! $(this).validateUniqueField() ) {\n\t\t\tnum_errors += 1;\n\t\t}\n\t});\n\t$(\"span.inputSpan, div.pfComboBox\").not(\".hiddenByPF, .freeText, .pageSection\").each( function() {\n\t\tif (! $(this).checkForPipes() ) {\n\t\t\tnum_errors += 1;\n\t\t}\n\t});\n\t$(\"span.URLInput\").not(\".hiddenByPF\").each( function() {\n\t\tif (! $(this).validateURLField() ) {\n\t\t\tnum_errors += 1;\n\t\t}\n\t});\n\t$(\"span.emailInput\").not(\".hiddenByPF\").each( function() {\n\t\tif (! $(this).validateEmailField() ) {\n\t\t\tnum_errors += 1;\n\t\t}\n\t});\n\t$(\"span.numberInput\").not(\".hiddenByPF\").each( function() {\n\t\tif (! $(this).validateNumberField() ) {\n\t\t\tnum_errors += 1;\n\t\t}\n\t});\n\t$(\"span.integerInput\").not(\".hiddenByPF\").each( function() {\n\t\tif (! $(this).validateIntegerField() ) {\n\t\t\tnum_errors += 1;\n\t\t}\n\t});\n\t$(\"span.dateInput\").not(\".hiddenByPF\").each( function() {\n\t\tif (! $(this).validateDateField() ) {\n\t\t\tnum_errors += 1;\n\t\t}\n\t});\n\t$(\"input.modifiedInput\").not(\".hiddenByPF\").each( function() {\n\t\t// No separate function needed.\n\t\t$(this).parent().addErrorMessage( 'pf_modified_input_error' );\n\t\tnum_errors += 1;\n\t});\n\n\t// call registered validation functions\n\tvar pfdata = $(\"#pfForm\").data('PageForms');\n\n\tif ( pfdata && pfdata.validationFunctions.length > 0 ) { // found data object?\n\n\t\t// for every registered input\n\t\tfor ( var i = 0; i < pfdata.validationFunctions.length; i++ ) {\n\n\t\t\t// if input is not part of multipleTemplateStarter\n\t\t\tif ( typeof pfdata.validationFunctions[i] !== 'undefined' &&\n\t\t\t\t$(\"#\" + pfdata.validationFunctions[i].input).closest(\".multipleTemplateStarter\").length === 0 &&\n\t\t\t\t$(\"#\" + pfdata.validationFunctions[i].input).closest(\".hiddenByPF\").length === 0 ) {\n\n\t\t\t\tif (! pfdata.validationFunctions[i].valfunction(\n\t\t\t\t\t\tpfdata.validationFunctions[i].input,\n\t\t\t\t\t\tpfdata.validationFunctions[i].parameters)\n\t\t\t\t\t) {\n\t\t\t\t\tnum_errors += 1;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tif (num_errors > 0) {\n\t\t// add error header, if it's not there already\n\t\tif ($(\"#form_error_header\").size() === 0) {\n\t\t\t$(\"#contentSub\").append('<div id=\"form_error_header\" class=\"errorbox\" style=\"font-size: medium\"><img src=\"' + mw.config.get( 'wgPageFormsScriptPath' ) + '/skins/MW-Icon-AlertMark.png\" />&nbsp;' + mw.message( 'pf_formerrors_header' ).escaped() + '</div><br clear=\"both\" />');\n\t\t}\n\t\tscroll(0, 0);\n\t} else {\n\t\t// Disable inputs hidden due to either \"show on select\" or\n\t\t// because they're part of the \"starter\" div for\n\t\t// multiple-instance templates, so that they aren't\n\t\t// submitted by the form.\n\t\t$('.hiddenByPF').find(\"input, select, textarea\").not(':disabled')\n\t\t.prop('disabled', true)\n\t\t.addClass('disabledByPF');\n\t\t//remove error box if it exists because there are no errors in the form now\n\t\t$(\"#contentSub\").find(\".errorbox\").remove();\n\t}\n\n\t// Hook that fires on form submission, after the validation.\n\tmw.hook('pf.formValidationAfter').fire();\n\n\treturn (num_errors === 0);\n};\n\n/**\n * Minimize all instances if the total height of all the instances\n * is over 800 pixels - to allow for easier navigation and sorting.\n */\n$.fn.possiblyMinimizeAllOpenInstances = function() {\n\tif ( ! this.hasClass( 'minimizeAll' ) ) {\n\t\treturn;\n\t}\n\n\tvar displayedFieldsWhenMinimized = this.attr('data-displayed-fields-when-minimized');\n\tvar allDisplayedFields = null;\n\tif ( displayedFieldsWhenMinimized ) {\n\t\tallDisplayedFields = displayedFieldsWhenMinimized.split(',').map(function(item) {\n\t\t\treturn item.trim().toLowerCase();\n\t\t});\n\t}\n\n\tthis.find('.multipleTemplateInstance').not('.minimized').each( function() {\n\t\tvar instance = $(this);\n\t\tinstance.addClass('minimized');\n\t\tvar valuesStr = '';\n\t\tinstance.find( \"input[type != 'hidden'][type != 'button'], select, textarea, div.ve-ce-surface\" ).each( function() {\n\t\t\t// If the set of fields to be displayed was specified in\n\t\t\t// the form definition, check against that list.\n\t\t\tif ( allDisplayedFields !== null ) {\n\t\t\t\tvar fieldFullName = $(this).attr('name');\n\t\t\t\tif ( !fieldFullName ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tvar matches = fieldFullName.match(/.*\\[.*\\]\\[(.*)\\]/);\n\t\t\t\tvar fieldRealName = matches[1].toLowerCase();\n\t\t\t\tif ( !allDisplayedFields.includes( fieldRealName ) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvar curVal = $(this).val();\n\t\t\tif ( $(this).hasClass('ve-ce-surface') ) {\n\t\t\t\t// Special handling for VisualEditor/VEForAll textareas.\n\t\t\t\tcurVal = $(this).text();\n\t\t\t}\n\t\t\tif ( typeof curVal !== 'string' || curVal === '' ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tvar inputType = $(this).attr('type');\n\t\t\tif ( inputType === 'checkbox' || inputType === 'radio' ) {\n\t\t\t\tif ( ! $(this).is(':checked') ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( curVal.length > 70 ) {\n\t\t\t\tcurVal = curVal.substring(0, 70) + \"...\";\n\t\t\t}\n\t\t\tif ( valuesStr !== '' ) {\n\t\t\t\tvaluesStr += ' &middot; ';\n\t\t\t}\n\t\t\tvaluesStr += curVal;\n\t\t});\n\t\tif ( valuesStr === '' ) {\n\t\t\tvaluesStr = '<em>No data</em>';\n\t\t}\n\t\tinstance.find('.instanceMain').fadeOut( \"medium\", function() {\n\t\t\tinstance.find('.instanceRearranger').after('<td class=\"fieldValuesDisplay\">' + valuesStr + '</td>');\n\t\t});\n\t});\n};\n\nvar num_elements = 0;\n\n/**\n * Functions for multiple-instance templates.\n *\n * @param addAboveCurInstance\n */\n$.fn.addInstance = function( addAboveCurInstance ) {\n\tvar wgPageFormsShowOnSelect = mw.config.get( 'wgPageFormsShowOnSelect' );\n\tvar wgPageFormsHeightForMinimizingInstances = mw.config.get( 'wgPageFormsHeightForMinimizingInstances' );\n\tvar wrapper = this.closest(\".multipleTemplateWrapper\");\n\tvar multipleTemplateList = wrapper.find('.multipleTemplateList');\n\n\t// If the nubmer of instances is already at the maximum allowed,\n\t// exit here.\n\tif ( multipleTemplateList.isAtMaxInstances() ) {\n\t\treturn false;\n\t}\n\n\tif ( wgPageFormsHeightForMinimizingInstances >= 0 ) {\n\t\tif ( ! multipleTemplateList.hasClass('minimizeAll') &&\n\t\t\tmultipleTemplateList.height() >= wgPageFormsHeightForMinimizingInstances ) {\n\t\t\tmultipleTemplateList.addClass('minimizeAll');\n\t\t}\n\t\tif ( multipleTemplateList.hasClass('minimizeAll') ) {\n\t\t\tmultipleTemplateList\n\t\t\t\t.addClass('currentFocus')\n\t\t\t\t.possiblyMinimizeAllOpenInstances();\n\t\t}\n\t}\n\n\t// Global variable.\n\tnum_elements++;\n\n\t// Create the new instance\n\tvar new_div = wrapper\n\t\t.find(\".multipleTemplateStarter\")\n\t\t.clone()\n\t\t.removeClass('multipleTemplateStarter')\n\t\t.addClass('multipleTemplateInstance')\n\t\t.addClass('multipleTemplate') // backwards compatibility\n\t\t.removeAttr(\"id\")\n\t\t.fadeTo(0,0)\n\t\t.slideDown('fast', function() {\n\t\t\t$(this).fadeTo('fast', 1);\n\t\t});\n\n\t// Add on a new attribute, \"data-origID\", representing the ID of all\n\t// HTML elements that had an ID; and delete the actual ID attribute\n\t// of any divs and spans (presumably, these exist only for the\n\t// sake of \"show on select\"). We do the deletions because no two\n\t// elements on the page are allowed to have the same ID.\n\tnew_div.find('[id!=\"\"]').attr('data-origID', function() { return this.id; });\n\tnew_div.find('div[id!=\"\"], span[id!=\"\"]').removeAttr('id');\n\n\tnew_div.find('.hiddenByPF')\n\t.removeClass('hiddenByPF')\n\n\t.find('.disabledByPF')\n\t.prop('disabled', false)\n\t.removeClass('disabledByPF');\n\n\t// Make internal ID unique for the relevant form elements, and replace\n\t// the [num] index in the element names with an actual unique index\n\tnew_div.find(\"input, select, textarea\").each(\n\t\tfunction() {\n\t\t\t// Add in a 'b' at the end of the name to reduce the\n\t\t\t// chance of name collision with another field\n\t\t\tif (this.name) {\n\t\t\t\tvar old_name = this.name.replace(/\\[num\\]/g, '');\n\t\t\t\t$(this).attr('origName', old_name);\n\t\t\t\tthis.name = this.name.replace(/\\[num\\]/g, '[' + num_elements + 'b]');\n\t\t\t}\n\n\t\t\tif (this.id) {\n\n\t\t\t\tvar old_id = this.id;\n\n\t\t\t\tthis.id = this.id.replace(/input_/g, 'input_' + num_elements + '_');\n\n\t\t\t\t// TODO: Data in wgPageFormsShowOnSelect should probably be stored in\n\t\t\t\t// $(\"#pfForm\").data('PageForms')\n\t\t\t\tif ( wgPageFormsShowOnSelect[ old_id ] ) {\n\t\t\t\t\twgPageFormsShowOnSelect[ this.id ] = wgPageFormsShowOnSelect[ old_id ];\n\t\t\t\t}\n\n\t\t\t\t// register initialization and validation methods for new inputs\n\n\t\t\t\tvar pfdata = $(\"#pfForm\").data('PageForms');\n\t\t\t\tif ( pfdata ) { // found data object?\n\t\t\t\t\tvar i;\n\t\t\t\t\tif ( pfdata.initFunctions[old_id] ) {\n\n\t\t\t\t\t\t// For every initialization method for\n\t\t\t\t\t\t// input with id old_id, register the\n\t\t\t\t\t\t// method for the new input.\n\t\t\t\t\t\tfor ( i = 0; i < pfdata.initFunctions[old_id].length; i++ ) {\n\n\t\t\t\t\t\t\t$(this).PageForms_registerInputInit(\n\t\t\t\t\t\t\t\tpfdata.initFunctions[old_id][i].initFunction,\n\t\t\t\t\t\t\t\tpfdata.initFunctions[old_id][i].parameters,\n\t\t\t\t\t\t\t\ttrue //do not yet execute\n\t\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\t// For every validation method for the\n\t\t\t\t\t// input with ID old_id, register it\n\t\t\t\t\t// for the new input.\n\t\t\t\t\tfor ( i = 0; i < pfdata.validationFunctions.length; i++ ) {\n\n\t\t\t\t\t\tif ( typeof pfdata.validationFunctions[i] !== 'undefined' &&\n\t\t\t\t\t\t\tpfdata.validationFunctions[i].input === old_id ) {\n\n\t\t\t\t\t\t\t$(this).PageForms_registerInputValidation(\n\t\t\t\t\t\t\t\tpfdata.validationFunctions[i].valfunction,\n\t\t\t\t\t\t\t\tpfdata.validationFunctions[i].parameters\n\t\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\t\t\t}\n\t\t}\n\t);\n\n\t// datepicker and datetimepicker inputs require special handling.\n\tnew_div.find(\"div.pfPicker\").attr('data-ooui', function() {\n\t\treturn $(this).attr('data-ooui').replace(/\\[num\\]/g, '[' + num_elements + 'b]');\n\t});\n\n\tnew_div.find('a').attr('href', function() {\n\t\treturn this.href.replace(/input_/g, 'input_' + num_elements + '_');\n\t});\n\n\tnew_div.find('span').attr('id', function() {\n\t\treturn this.id.replace(/span_/g, 'span_' + num_elements + '_');\n\t});\n\n\t// Add the new instance.\n\tif ( addAboveCurInstance ) {\n\t\tnew_div.insertBefore(this.closest(\".multipleTemplateInstance\"));\n\t} else {\n\t\tthis.closest(\".multipleTemplateWrapper\")\n\t\t\t.find(\".multipleTemplateList\")\n\t\t\t.append(new_div);\n\t}\n\n\tnew_div.initializeJSElements(true);\n\n\t// Initialize new inputs.\n\tnew_div.find(\"input, select, textarea\").each( function() {\n\t\tif ( ! this.id ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar pfdata = $(\"#pfForm\").data('PageForms');\n\t\tif ( ! pfdata ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// have to store data array: the id attribute\n\t\t// of 'this' might be changed in the init function\n\t\tvar thatData = pfdata.initFunctions[this.id] ;\n\t\tif ( !thatData ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Call every initialization method for this input.\n\t\tfor ( var i = 0; i < thatData.length; i++ ) {\n\t\t\tvar initFunction = thatData[i].initFunction;\n\t\t\tif ( initFunction === undefined ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t// If the code attempted to store this function before\n\t\t\t// it was defined, only its name was stored. In that\n\t\t\t// case, get the function now.\n\t\t\t// @TODO - move getFunctionFromName() so that it can be\n\t\t\t// called from here, which would be better than\n\t\t\t// window[].\n\t\t\tif ( typeof initFunction === 'string' ) {\n\t\t\t\tinitFunction = window[initFunction];\n\t\t\t}\n\t\t\tinitFunction(\n\t\t\t\tthis.id,\n\t\t\t\tthatData[i].parameters\n\t\t\t);\n\t\t}\n\t});\n\n\t// Hook that fires each time a new template instance is added.\n\t// The first parameter is a jQuery selection of the newly created instance div.\n\tmw.hook('pf.addTemplateInstance').fire(new_div);\n};\n\n// The first argument is needed, even though it's an attribute of the element\n// on which this function is called, because it's the 'name' attribute for\n// regular inputs, and the 'origName' attribute for inputs in multiple-instance\n// templates.\n$.fn.setDependentAutocompletion = function( dependentField, baseField, baseValue ) {\n\t// Get data from either Cargo or Semantic MediaWiki.\n\tvar myServer = mw.config.get( 'wgScriptPath' ) + \"/api.php\",\n\t\twgPageFormsCargoFields = mw.config.get( 'wgPageFormsCargoFields' ),\n\t\twgPageFormsFieldProperties = mw.config.get( 'wgPageFormsFieldProperties' );\n\tmyServer += \"?action=pfautocomplete&format=json\";\n\tif ( wgPageFormsCargoFields.hasOwnProperty( dependentField ) ) {\n\t\tvar cargoTableAndFieldStr = wgPageFormsCargoFields[dependentField];\n\t\tvar cargoTableAndField = cargoTableAndFieldStr.split('|');\n\t\tvar cargoTable = cargoTableAndField[0];\n\t\tvar cargoField = cargoTableAndField[1];\n\t\tvar baseCargoTableAndFieldStr = wgPageFormsCargoFields[baseField];\n\t\tvar baseCargoTableAndField = baseCargoTableAndFieldStr.split('|');\n\t\tvar baseCargoTable = baseCargoTableAndField[0];\n\t\tvar baseCargoField = baseCargoTableAndField[1];\n\t\tmyServer += \"&cargo_table=\" + cargoTable + \"&cargo_field=\" + cargoField + \"&is_array=true\" + \"&base_cargo_table=\" + baseCargoTable + \"&base_cargo_field=\" + baseCargoField + \"&basevalue=\" + baseValue;\n\t} else {\n\t\tvar propName = wgPageFormsFieldProperties[dependentField];\n\t\tvar baseProp = wgPageFormsFieldProperties[baseField];\n\t\tmyServer += \"&property=\" + propName + \"&baseprop=\" + baseProp + \"&basevalue=\" + baseValue;\n\t}\n\tvar dependentValues = [];\n\tvar thisInput = $(this);\n\t// We use $.ajax() here instead of $.getJSON() so that the\n\t// 'async' parameter can be set. That, in turn, is set because\n\t// if the 2nd, \"dependent\" field is a combo box, it can have weird\n\t// behavior: clicking on the down arrow for the combo box leads to a\n\t// \"blur\" event for the base field, which causes the possible\n\t// values to get recalculated, but not in time for the dropdown to\n\t// change values - it still shows the old values. By setting\n\t// \"async: false\", we guarantee that old values won't be shown - if\n\t// the values haven't been recalculated yet, the dropdown won't\n\t// appear at all.\n\t// @TODO - handle this the right way, by having special behavior for\n\t// the dropdown - it should get delayed until the values are\n\t// calculated, then appear.\n\t$.ajax({\n\t\turl: myServer,\n\t\tdataType: 'json',\n\t\tasync: false,\n\t\tsuccess: function(data) {\n\t\t\tvar realData = data.pfautocomplete;\n\t\t\t$.each(realData, function(key, val) {\n\t\t\t\tdependentValues.push(val.title);\n\t\t\t});\n\t\t\tthisInput.data('autocompletevalues', dependentValues);\n\t\t}\n\t});\n};\n\n/**\n * Called on a 'base' field (e.g., for a country) - sets the autocompletion\n * for its 'dependent' field (e.g., for a city).\n *\n * @param partOfMultiple\n */\n$.fn.setAutocompleteForDependentField = function( partOfMultiple ) {\n\tvar curValue = $(this).val();\n\tif ( curValue === null ) { return this; }\n\n\tvar nameAttr = partOfMultiple ? 'origName' : 'name';\n\tvar name = $(this).attr(nameAttr);\n\tvar wgPageFormsDependentFields = mw.config.get( 'wgPageFormsDependentFields' );\n\tvar dependent_on_me = [];\n\tfor ( var i = 0; i < wgPageFormsDependentFields.length; i++ ) {\n\t\tvar dependentFieldPair = wgPageFormsDependentFields[i];\n\t\tif ( dependentFieldPair[0] === name ) {\n\t\t\tdependent_on_me.push(dependentFieldPair[1]);\n\t\t}\n\t}\n\tdependent_on_me = $.uniqueSort(dependent_on_me);\n\n\tvar self = this;\n\t$.each( dependent_on_me, function() {\n\t\tvar element, cmbox, tokens,\n\t\t\tdependentField = this;\n\n\t\tif ( partOfMultiple ) {\n\t\t\telement = $( self ).closest( '.multipleTemplateInstance' )\n\t\t\t\t.find('[origName=\"' + dependentField + '\"]');\n\t\t} else {\n\t\t\telement = $('[name=\"' + dependentField + '\"]');\n\t\t}\n\n\t\tif ( element.hasClass( 'pfComboBox' ) ) {\n\t\t\tcmbox = new pf.select2.combobox();\n\t\t\tcmbox.refresh(element);\n\t\t} else if ( element.hasClass( 'pfTokens' ) ) {\n\t\t\ttokens = new pf.select2.tokens();\n\t\t\ttokens.refresh(element);\n\t\t} else {\n\t\t\telement.setDependentAutocompletion(dependentField, name, curValue);\n\t\t}\n\t});\n\n\n\treturn this;\n};\n\n/**\n * Initialize all the JS-using elements contained within this block - can be\n * called for either the entire HTML body, or for a div representing an\n * instance of a multiple-instance template.\n *\n * @param partOfMultiple\n */\n$.fn.initializeJSElements = function( partOfMultiple ) {\n\tvar fancyBoxSettings;\n\n\tthis.find(\".pfShowIfSelected\").each( function() {\n\t\t// Avoid duplicate calls on any one element.\n\t\tif ( !partOfMultiple && $(this).parents('.multipleTemplateWrapper').length > 0 ) {\n\t\t\treturn;\n\t\t}\n\t\t$(this)\n\t\t.showIfSelected(partOfMultiple, true)\n\t\t.change( function() {\n\t\t\t$(this).showIfSelected(partOfMultiple, false);\n\t\t});\n\t});\n\n\tthis.find(\".pfShowIfChecked\").each( function() {\n\t\t// Avoid duplicate calls on any one element.\n\t\tif ( !partOfMultiple && $(this).parents('.multipleTemplateWrapper').length > 0 ) {\n\t\t\treturn;\n\t\t}\n\t\t$(this)\n\t\t.showIfChecked(partOfMultiple, true)\n\t\t.click( function() {\n\t\t\t$(this).showIfChecked(partOfMultiple, false);\n\t\t});\n\t});\n\n\tthis.find(\".pfShowIfCheckedCheckbox\").each( function() {\n\t\t// Avoid duplicate calls on any one element.\n\t\tif ( !partOfMultiple && $(this).parents('.multipleTemplateWrapper').length > 0 ) {\n\t\t\treturn;\n\t\t}\n\t\t$(this)\n\t\t.showIfCheckedCheckbox(partOfMultiple, true)\n\t\t.click( function() {\n\t\t\t$(this).showIfCheckedCheckbox(partOfMultiple, false);\n\t\t});\n\t});\n\n\tif ( partOfMultiple ) {\n\t\t// Enable the new remove button\n\t\tthis.find(\".removeButton\").click( function() {\n\n\t\t\t// Unregister initialization and validation for deleted inputs\n\t\t\t$(this).parentsUntil( '.multipleTemplateInstance' ).last().parent().find(\"input, select, textarea\").each( function() {\n\t\t\t\t$(this).PageForms_unregisterInputInit();\n\t\t\t\t$(this).PageForms_unregisterInputValidation();\n\t\t\t});\n\n\t\t\t// Remove the encompassing div for this instance.\n\t\t\t$(this).closest(\".multipleTemplateInstance\")\n\t\t\t.fadeTo('fast', 0, function() {\n\t\t\t\t$(this).slideUp('fast', function() {\n\t\t\t\t\t$(this).remove();\n\t\t\t\t});\n\t\t\t});\n\t\t\treturn false;\n\t\t});\n\n\t\t// ...and the new adder\n\t\tthis.find('.addAboveButton').click( function() {\n\t\t\t$(this).addInstance( true );\n\t\t\treturn false; // needed to disable <a> behavior\n\t\t});\n\t}\n\n\tvar combobox = new pf.select2.combobox();\n\tthis.find('.pfComboBox').not('#semantic_property_starter, .multipleTemplateStarter .pfComboBox, .select2-container').each( function() {\n\t\tcombobox.apply($(this));\n\t});\n\n\tvar tokens = new pf.select2.tokens();\n\tthis.find('.pfTokens').not('.multipleTemplateStarter .pfTokens, .select2-container').each( function() {\n\t\ttokens.apply($(this));\n\t});\n\n\tfancyBoxSettings = {\n\t\ttoolbar : false,\n\t\tsmallBtn : true,\n\t\tiframe : {\n\t\t\tpreload : false,\n\t\t\tcss : {\n\t\t\t\twidth : '75%',\n\t\t\t\theight : '75%'\n\t\t\t}\n\t\t},\n\t\tanimationEffect : false\n\t};\n\n\tif ( partOfMultiple ) {\n\t\tthis.find('.pfFancyBox').fancybox(fancyBoxSettings);\n\t\tthis.find('.autoGrow').autoGrow();\n\t\tthis.find(\".pfRating\").each( function() {\n\t\t\t$(this).applyRatingInput();\n\t\t});\n\t\tthis.find(\".pfTreeInput\").each( function() {\n\t\t\t$(this).applyJSTree();\n\t\t});\n\t\tthis.find('.pfDatePicker').applyDatePicker();\n\t\tthis.find('.pfDateTimePicker').applyDateTimePicker();\n\t\t// Only defined if $wgPageFormsSimpleUpload == true.\n\t\tif ( typeof this.initializeSimpleUpload === 'function' ) {\n\t\t\tthis.find(\".simpleUploadInterface\").each( function() {\n\t\t\t\t$(this).initializeSimpleUpload();\n\t\t\t});\n\t\t}\n\n\t\t// Also add support in new template instances to any non-Page\n\t\t// Forms classes that require special JS handling.\n\t\tthis.find('.mw-collapsible').makeCollapsible();\n\t} else {\n\t\tthis.find('.pfFancyBox').not('multipleTemplateWrapper .pfFancyBox').fancybox(fancyBoxSettings);\n\t\tthis.find('.autoGrow').not('.multipleTemplateWrapper .autoGrow').autoGrow();\n\t\tthis.find(\".pfRating\").not(\".multipleTemplateWrapper .pfRating\").each( function() {\n\t\t\t$(this).applyRatingInput();\n\t\t});\n\t\tthis.find(\".pfTreeInput\").not(\".multipleTemplateWrapper .pfTreeInput\").each( function() {\n\t\t\t$(this).applyJSTree();\n\t\t});\n\t\tthis.find('.pfDatePicker').not(\".multipleTemplateWrapper .pfDatePicker\").applyDatePicker();\n\t\tthis.find('.pfDateTimePicker').not(\".multipleTemplateWrapper .pfDateTimePicker\").applyDateTimePicker();\n\t\t// Only defined if $wgPageFormsSimpleUpload == true.\n\t\tif ( typeof this.initializeSimpleUpload === 'function' ) {\n\t\t\tthis.find(\".simpleUploadInterface\").not(\".multipleTemplateWrapper .simpleUploadInterface\").each( function() {\n\t\t\t\t$(this).initializeSimpleUpload();\n\t\t\t});\n\t\t}\n\t}\n\n\t// @TODO - this should ideally be called only for inputs that have\n\t// a dependent field - which might involve changing the storage of\n\t// \"dependent fields\" information from a global variable to a\n\t// per-input HTML attribute.\n\tthis.find('input, select').each( function() {\n\t\t$(this)\n\t\t.setAutocompleteForDependentField( partOfMultiple )\n\t\t.blur( function() {\n\t\t\t$(this).setAutocompleteForDependentField( partOfMultiple );\n\t\t});\n\t});\n\t// The 'blur' event doesn't get triggered for radio buttons for\n\t// Chrome and Safari (the WebKit-based browsers) so use the 'change'\n\t// event in addition.\n\t// @TODO - blur() shuldn't be called at all for radio buttons.\n\tthis.find('input:radio')\n\t\t.change( function() {\n\t\t\t$(this).setAutocompleteForDependentField( partOfMultiple );\n\t\t});\n\n\tthis.find('.new-uuid').each( function() {\n\t\t$(this).val(window.pfGenerateUUID());\n\t});\n\n\tvar myThis = this;\n\tif ( $.fn.applyVisualEditor ) {\n\t\tif ( partOfMultiple ) {\n\t\t\tmyThis.find(\".visualeditor\").applyVisualEditor();\n\t\t} else {\n\t\t\tmyThis.find(\".visualeditor\").not(\".multipleTemplateWrapper .visualeditor\").applyVisualEditor();\n\t\t}\n\t} else {\n\t\t$(document).on('VEForAllLoaded', function(e) {\n\t\t\tif ( partOfMultiple ) {\n\t\t\t\tmyThis.find(\".visualeditor\").applyVisualEditor();\n\t\t\t} else {\n\t\t\t\tmyThis.find(\".visualeditor\").not(\".multipleTemplateWrapper .visualeditor\").applyVisualEditor();\n\t\t\t}\n\t\t});\n\t}\n\n\t// @TODO - this should be in the TinyMCE extension, and use a hook.\n\tif ( typeof( mwTinyMCEInit ) === 'function' ) {\n\t\tif ( partOfMultiple ) {\n\t\t\tmyThis.find(\".tinymce\").each( function() {\n\t\t\t\tmwTinyMCEInit( '#' + $(this).attr('id') );\n\t\t\t});\n\t\t} else {\n\t\t\tmyThis.find(\".tinymce\").not(\".multipleTemplateWrapper .tinymce\").each( function() {\n\t\t\t\tmwTinyMCEInit( '#' + $(this).attr('id') );\n\t\t\t});\n\t\t}\n\t} else {\n\t\t$(document).on('TinyMCELoaded', function(e) {\n\t\t\tif ( partOfMultiple ) {\n\t\t\t\tmyThis.find(\".tinymce\").each( function() {\n\t\t\t\t\tmwTinyMCEInit( '#' + $(this).attr('id') );\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tmyThis.find(\".tinymce\").not(\".multipleTemplateWrapper .tinymce\").each( function() {\n\t\t\t\t\tmwTinyMCEInit( '#' + $(this).attr('id') );\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t}\n\n};\n\n// Copied from https://stackoverflow.com/a/8809472\n// License: public domain/MIT\nwindow.pfGenerateUUID = function() {\n\tvar d = new Date().getTime();\n\tvar d2 = (performance && performance.now && (performance.now() * 1000)) || 0; // Time in microseconds since page-load or 0 if unsupported\n\treturn 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\n\t\tvar r = Math.random() * 16; // random number between 0 and 16\n\t\tif (d > 0) { // Use timestamp until depleted\n\t\t\tr = (d + r) % 16 | 0; // eslint-disable-line no-bitwise\n\t\t\td = Math.floor(d / 16);\n\t\t} else { // Use microseconds since page-load if supported\n\t\t\tr = (d2 + r) % 16 | 0; // eslint-disable-line no-bitwise\n\t\t\td2 = Math.floor(d2 / 16);\n\t\t}\n\t\treturn (c === 'x' ? r : (r & 0x3 | 0x8)).toString(16); // eslint-disable-line no-bitwise\n\t});\n}\n\n// Once the document has finished loading, set up everything!\n$(document).ready( function() {\n\tvar i,\n\t\tinputID,\n\t\tvalidationFunctionData;\n\n\tfunction getFunctionFromName( functionName ) {\n\t\tvar func = window;\n\t\tvar namespaces = functionName.split( \".\" );\n\t\tfor ( var i = 0; i < namespaces.length; i++ ) {\n\t\t\tfunc = func[ namespaces[ i ] ];\n\t\t}\n\t\t// If this gets called before the function is defined, just\n\t\t// store the function name instead, for later lookup.\n\t\tif ( func === null ) {\n\t\t\treturn functionName;\n\t\t}\n\t\treturn func;\n\t}\n\n\t// Exit now if a Page Forms form is not present.\n\tif ( $('#pfForm').length === 0 ) {\n\t\treturn;\n\t}\n\n\t// jQuery's .ready() function is being called before the resource was actually loaded.\n\t// This is a workaround for https://phabricator.wikimedia.org/T216805.\n\tsetTimeout( function(){\n\t\t// \"Mask\" to prevent users from clicking while form is still loading.\n\t\t$('#loadingMask').css({'width': $(document).width(),'height': $(document).height()});\n\n\t\t// register init functions\n\t\tvar initFunctionData = mw.config.get( 'ext.pf.initFunctionData' );\n\t\tfor ( inputID in initFunctionData ) {\n\t\t\tfor ( i in initFunctionData[inputID] ) {\n\t\t\t\t/*jshint -W069 */\n\t\t\t\t$( '#' + inputID ).PageForms_registerInputInit( getFunctionFromName( initFunctionData[ inputID ][ i ][ 'name' ] ), initFunctionData[ inputID ][ i ][ 'param' ] );\n\t\t\t\t/*jshint +W069 */\n\t\t\t}\n\t\t}\n\n\t\t// register validation functions\n\t\tvalidationFunctionData = mw.config.get( 'ext.pf.validationFunctionData' );\n\t\tfor ( inputID in validationFunctionData ) {\n\t\t\tfor ( i in validationFunctionData[inputID] ) {\n\t\t\t\t/*jshint -W069 */\n\t\t\t\t$( '#' + inputID ).PageForms_registerInputValidation( getFunctionFromName( validationFunctionData[ inputID ][ i ][ 'name' ] ), validationFunctionData[ inputID ][ i ][ 'param' ] );\n\t\t\t\t/*jshint +W069 */\n\t\t\t}\n\t\t}\n\n\t\t$( 'body' ).initializeJSElements(false);\n\n\t\t$('.multipleTemplateInstance').each( function() {\n\t\t\t$(this).initializeJSElements(true);\n\t\t});\n\t\t$('.multipleTemplateAdder').click( function() {\n\t\t\t$(this).addInstance( false );\n\t\t});\n\t\tvar wgPageFormsHeightForMinimizingInstances = mw.config.get( 'wgPageFormsHeightForMinimizingInstances' );\n\t\tif ( wgPageFormsHeightForMinimizingInstances >= 0) {\n\t\t\t$('.multipleTemplateList').each( function() {\n\t\t\t\tif ( $(this).height() > wgPageFormsHeightForMinimizingInstances ) {\n\t\t\t\t\t$(this).addClass('minimizeAll');\n\t\t\t\t\t$(this).possiblyMinimizeAllOpenInstances();\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\t$('.multipleTemplateList').each( function() {\n\t\t\tvar list = $(this);\n\t\t\tvar sortable = Sortable.create(list[0], {\n\t\t\t\thandle: '.instanceRearranger',\n\t\t\t\tonStart: function (/**Event*/evt) {\n\t\t\t\t\tlist.possiblyMinimizeAllOpenInstances();\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\n\t\t// If the form is submitted, validate everything!\n\t\t$('#pfForm').submit( function() {\n\t\t\treturn validateAll();\n\t\t} );\n\n\t\t// We are all done - remove the loading spinner.\n\t\t$('.loadingImage').remove();\n\t}, 0 );\n\n\tmw.hook('pf.formSetupAfter').fire();\n});\n\n// If some part of the form is clicked, minimize any multiple-instance\n// template instances that need minimizing, and move the \"focus\" to the current\n// instance list, if one is being clicked and it's different from the\n// previous one.\n// We make only the form itself clickable, instead of the whole screen, to\n// try to avoid a click on a popup, like the \"Upload file\" window, minimizing\n// the current open instance.\n$('form#pfForm').click( function(e) {\n\tvar target = $(e.target);\n\t// Ignore the \"add instance\" buttons - those get handling of their own.\n\tif ( target.hasClass('multipleTemplateAdder') || target.hasClass('addAboveButton') ) {\n\t\treturn;\n\t}\n\n\tvar instance = target.closest('.multipleTemplateInstance');\n\tif ( instance === null ) {\n\t\t$('.multipleTemplateList.currentFocus')\n\t\t\t.removeClass('currentFocus')\n\t\t\t.possiblyMinimizeAllOpenInstances();\n\t\treturn;\n\t}\n\n\tvar instancesList = instance.closest('.multipleTemplateList');\n\tif ( !instancesList.hasClass('currentFocus') ) {\n\t\t$('.multipleTemplateList.currentFocus')\n\t\t\t.removeClass('currentFocus')\n\t\t\t.possiblyMinimizeAllOpenInstances();\n\t\tif ( instancesList.hasClass('minimizeAll') ) {\n\t\t\tinstancesList.addClass('currentFocus');\n\t\t}\n\t}\n\n\tif ( instance.hasClass('minimized') ) {\n\t\tinstancesList.possiblyMinimizeAllOpenInstances();\n\t\tinstance.removeClass('minimized');\n\t\tinstance.find('.fieldValuesDisplay').html('');\n\t\tinstance.find('.instanceMain').fadeIn();\n\t\tinstance.find('.fieldValuesDisplay').remove();\n\t}\n});\n\n$('#pf-expand-all a').click(function( event ) {\n\tevent.preventDefault();\n\n\t// Page Forms minimized template instances.\n\t$('.minimized').each( function() {\n\t\t$(this).removeClass('minimized');\n\t\t$(this).find('.fieldValuesDisplay').html('');\n\t\t$(this).find('.instanceMain').fadeIn();\n\t\t$(this).find('.fieldValuesDisplay').remove();\n\t});\n\n\t// Standard MediaWiki \"collapsible\" sections.\n\t$('div.mw-collapsed a.mw-collapsible-text').click();\n});\n\n$('.pfSendBack').click( function() {\n\twindow.history.back();\n});\n\n}( jQuery, mediaWiki ) );\n","usedDeprecatedRules":[]},{"filePath":"/src/repo/libs/ext.pf.js","messages":[{"ruleId":"jsdoc/check-tag-names","severity":1,"message":"Invalid JSDoc tag name \"alternateClassName\".","line":20,"column":null,"nodeType":"Block","endLine":20,"endColumn":null}],"errorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/*\n* ext.pf.js\n*\n* @file\n*\n*\n* @licence GNU GPL v2+\n* @author Jatin Mehta\n*\n*/\n\nwindow.pf = ( function ( $, undefined ) {\n\t'use strict';\n\t/**\n\t *\n\t * Declares methods and properties that are available through the pf\n\t * namespace.\n\t *\n\t * @class pf\n\t * @alternateClassName pageforms\n\t * @singleton\n\t */\n\treturn {\n\n\t};\n}( jQuery ) );\n\n// Assigning namespace.\nwindow.pf = window.pageforms = pf;\n","usedDeprecatedRules":[]},{"filePath":"/src/repo/libs/ext.pf.select2.base.js","messages":[{"ruleId":"no-shadow","severity":1,"message":"'newOption' is already declared in the upper scope on line 73 column 10.","line":93,"column":12,"nodeType":"Identifier","messageId":"noShadow","endLine":93,"endColumn":21},{"ruleId":"no-jquery/variable-pattern","severity":1,"message":"jQuery collection names must match the variablePattern","line":199,"column":5,"nodeType":"AssignmentExpression","endLine":200,"endColumn":46},{"ruleId":"no-jquery/variable-pattern","severity":1,"message":"jQuery collection names must match the variablePattern","line":202,"column":5,"nodeType":"AssignmentExpression","endLine":202,"endColumn":50},{"ruleId":"jsdoc/require-returns","severity":1,"message":"Missing JSDoc @return declaration.","line":230,"column":3,"nodeType":"Block","endLine":238,"endColumn":6},{"ruleId":"jsdoc/require-param-type","severity":1,"message":"Missing JSDoc @param \"markup\" type.","line":237,"column":null,"nodeType":"Block","endLine":237,"endColumn":null}],"errorCount":0,"warningCount":5,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/*\n * ext.pf.select2.base.js\n *\n * Base class to handle autocomplete for various input types using the Select2\n * JS library.\n *\n * @file\n *\n * @licence GNU GPL v2+\n * @author Jatin Mehta\n * @author Priyanshu Varshney\n * @author Yaron Koren\n */\n\n( function ( $, mw, pf ) {\n\t'use strict';\n\t/**\n\t * Inheritance class for the pf.select2 constructor\n\t *\n\t *\n\t * @class\n\t */\n\tpf.select2 = pf.select2 || {};\n\n\t/**\n\t * @class\n\t * @constructor\n\t */\n\tpf.select2.base = function() {\n\n\t};\n\n\tpf.select2.base.prototype = {\n\t\t/*\n\t\t * Applies select2 to the HTML element\n\t\t *\n\t\t * @param {HTMLElement} element\n\t\t *\n\t\t */\n\t\tapply: function( element ) {\n\t\t\tvar existingValuesOnly = (element.attr(\"existingvaluesonly\") == \"true\");\n\t\t\tthis.existingValuesOnly = existingValuesOnly;\n\t\t\tthis.id = element.attr( \"id\" );\n\t\t\ttry {\n\t\t\t\tvar opts = this.setOptions();\n\t\t\t\t// element.val() would be simpler, but for some\n\t\t\t\t// reason it returns the wrong value.\n\t\t\t\tvar origValue = element.attr('value');\n\t\t\t\t// We call empty() in case this input was\n\t\t\t\t// modified due to \"values dependent on\", and\n\t\t\t\t// the old set of allowed values needs to\n\t\t\t\t// be removed.\n\t\t\t\telement.empty();\n\t\t\t\tvar $input = element.select2(opts);\n\n\t\t\t\t// We need an empty string as the first option; otherwise,\n\t\t\t\t// if it's non-empty string, Select2 might pick it and\n\t\t\t\t// display it as its value even if we remove it.\n\t\t\t\tvar newEmptyOption = new Option( \"\", \"\", false, false );\n\t\t\t\t$input.append(newEmptyOption).trigger('change');\n\n\t\t\t\tif ( origValue === undefined ) {\n\t\t\t\t\torigValue = \"\";\n\t\t\t\t}\n\t\t\t\tif ( this.getAutocompleteOpts().autocompletedatatype !== undefined && this.dependentOn() === null ) {\n\t\t\t\t\tvar data = {\n\t\t\t\t\t\tid: origValue,\n\t\t\t\t\t\ttext: origValue\n\t\t\t\t\t};\n\t\t\t\t\t// This is needed after the empty() call,\n\t\t\t\t\t// to create an option element to restore\n\t\t\t\t\t// correct value in remote autocompletion.\n\t\t\t\t\tvar newOption = new Option(data.text, data.id, false, false);\n\t\t\t\t\t$input.append(newOption).trigger('change');\n\t\t\t\t}\n\t\t\t\t// This is required so that the existing value\n\t\t\t\t// can be displayed.\n\t\t\t\t$input.val(origValue).trigger('change');\n\t\t\t\tvar inputData = $input.data(\"select2\");\n\t\t\t\tvar rawValue = \"\";\n\n\t\t\t\t$(inputData.dropdown.$searchContainer).on(\"keydown\",function(e){\n\t\t\t\t\tif ( existingValuesOnly ) {\n\t\t\t\t\t\treturn ;\n\t\t\t\t\t}\n\t\t\t\t\tif ( e.keyCode === 9 ) { // Tab.\n\t\t\t\t\t\tvar valHighlighted = inputData.$results.find('.select2-results__option--highlighted')[0];\n\t\t\t\t\t\tif ( valHighlighted !== undefined ){\n\t\t\t\t\t\t\trawValue = valHighlighted.textContent;\n\t\t\t\t\t\t};\n\t\t\t\t\t\tif ( !$input.find( \"option[value='\" + rawValue + \"']\" ).length ) {\n\t\t\t\t\t\t\t// Does this ever get called?\n\t\t\t\t\t\t\tvar newOption = new Option( rawValue, rawValue, false, false );\n\t\t\t\t\t\t\t$input.append(newOption).trigger( 'change' );\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( rawValue !== '' ) {\n\t\t\t\t\t\t\t$input.val(rawValue).trigger(\"change\");\n                                                }\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\telement.on( \"change\", this.onChange );\n\t\t\t} catch (e) {\n\t\t\t\twindow.console.log(e);\n\t\t\t}\n\t\t},\n\t\t/*\n\t\t * Used to remove the Select2 applied to the HTML element;\n\t\t * the selected value will remain preserved.\n\t\t *\n\t\t * @param {HTMLElement} element\n\t\t *\n\t\t */\n\t\tdestroy: function( element ) {\n\t\t\telement.select2( \"destroy\" );\n\t\t},\n\t \t/*\n\t\t * If a field is dependent on some other field in the form\n\t\t * then it returns its name.\n\t\t *\n\t\t * @return {string}\n\t\t *\n\t\t */\n\t\tdependentOn: function() {\n\t\t\tvar input_id = \"#\" + this.id;\n\t\t\tvar name_attr = this.nameAttr( $(input_id) );\n\t\t\tvar name = $(input_id).attr( name_attr );\n\n\t\t\tvar wgPageFormsDependentFields = mw.config.get( 'wgPageFormsDependentFields' );\n\t\t\tfor ( var i = 0; i < wgPageFormsDependentFields.length; i++ ) {\n\t\t\t\tvar dependentFieldPair = wgPageFormsDependentFields[i];\n\t\t\t\tif ( dependentFieldPair[1] === name ) {\n\t\t\t\t\treturn dependentFieldPair[0];\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t\t/*\n\t\t * Returns the array of names of fields in the form which are dependent\n\t\t * on the field passed as a param to this function,\n\t\t *\n\t\t * @param {HTMLElement} element\n\t\t *\n\t\t * @return {associative array} dependent_on_me\n\t\t *\n\t\t */\n\t\tdependentOnMe: function( element ) {\n\t\t\tvar name_attr = this.nameAttr(element);\n\t\t\tvar name = element.attr( name_attr );\n\t\t\tvar dependent_on_me = [];\n\n\t\t\tvar wgPageFormsDependentFields = mw.config.get( 'wgPageFormsDependentFields' );\n\t\t\tfor ( var i = 0; i < wgPageFormsDependentFields.length; i++ ) {\n\t\t\t\tvar dependentFieldPair = wgPageFormsDependentFields[i];\n\t\t\t\tif ( dependentFieldPair[0] === name ) {\n\t\t\t\t\tdependent_on_me.push(dependentFieldPair[1]);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn dependent_on_me;\n\t\t},\n\t\t/*\n\t\t * Returns the name attribute of the field depending on\n\t\t * whether it is a part of a multiple instance template or not\n\t\t *\n\t\t * @param {HTMLElement} element\n\t\t *\n\t\t * @return {string}\n\t\t *\n\t\t */\n\t\tnameAttr: function( element ) {\n\t\t\treturn this.partOfMultiple( element ) ? \"origname\" : \"name\";\n\t\t},\n\t\t/*\n\t\t * Checks whether the field is part of a multiple instance template or not\n\t\t *\n\t\t * @param {HTMLElement} element\n\t\t *\n\t\t * @return {boolean}\n\t\t *\n\t\t */\n\t\tpartOfMultiple: function( element ) {\n\t\t\treturn element.attr( \"origname\" ) !== undefined ? true : false;\n\t\t},\n\t\t/*\n\t\t * Gives dependent field options which include\n\t\t * property, base property and base value\n\t\t *\n\t\t * @param {string} dep_on\n\t\t *\n\t\t * @return {object} dep_field_opts\n\t\t *\n\t\t */\n\t\tgetDependentFieldOpts: function( dep_on ) {\n\t\t\tvar input_id = \"#\" + this.id;\n\t\t\tvar dep_field_opts = {};\n\t\t\tvar base_element;\n\n\t\t\tif ( this.partOfMultiple($(input_id)) ) {\n\t\t\t\tbase_element = $(input_id).closest( \".multipleTemplateInstance\" )\n\t\t\t\t\t.find( '[origname =\"' + dep_on + '\" ]' );\n\t\t\t} else {\n\t\t\t\tbase_element = $('[name =\"' + dep_on + '\" ]');\n\t\t\t}\n\t\t\tdep_field_opts.base_value = base_element.val();\n\t\t\tdep_field_opts.base_prop = mw.config.get( 'wgPageFormsFieldProperties' )[dep_on] ||\n\t\t\t\tbase_element.attr( \"autocompletesettings\" );\n\t\t\tdep_field_opts.prop = $(input_id).attr( \"autocompletesettings\" ).split( \",\" )[0];\n\n\t\t\treturn dep_field_opts;\n\t\t},\n\t\t/*\n\t\t * Gives autocomplete options for a field\n\t\t *\n\t\t * @return {object} autocomplete_opts\n\t\t *\n\t\t */\n\t\tgetAutocompleteOpts: function() {\n\t\t\tvar input_id = \"#\" + this.id;\n\t\t\tvar autocomplete_opts = {};\n\n\t\t\tif ( $(input_id).attr( \"autocompletesettings\" ) === undefined ) {\n\t\t\t\tthrow \"Error: No autocomplete settings set for input \" + input_id;\n\t\t\t}\n\n\t\t\tautocomplete_opts.autocompletedatatype = $(input_id).attr( \"autocompletedatatype\" );\n\t\t\tautocomplete_opts.autocompletesettings = $(input_id).attr( \"autocompletesettings\" );\n\t\t\treturn autocomplete_opts;\n\t\t},\n\n\t\t/**\n\t\t * Escape out any HTML, and then add our own HTML to display\n\t\t * the correct bolding.\n\t\t * The first part of this function is directly copied from\n\t\t * Utils::escapeMarkup() in the Select2 code. @TODO: figure out\n\t\t * how to just call that code directly.\n\t\t *\n\t\t * @param markup\n\t\t */\n\t\tescapeMarkupAndAddHTML: function( markup ) {\n\t\t\tvar replaceMap = {\n\t\t\t\t'\\\\': '&#92;',\n\t\t\t\t'&': '&amp;',\n\t\t\t\t'<': '&lt;',\n\t\t\t\t'>': '&gt;',\n\t\t\t\t'\"': '&quot;',\n\t\t\t\t'\\'': '&#39;',\n\t\t\t\t'/': '&#47;'\n\t\t\t};\n\n\t\t\t// Do not try to escape the markup if it's not a string\n\t\t\tif (typeof markup !== 'string') {\n\t\t\t\treturn markup;\n\t\t\t}\n\n\t\t\tvar escapedMarkup = String(markup).replace(/[&<>\"'\\/\\\\]/g, function (match) {\n\t\t\t\treturn replaceMap[match];\n\t\t\t})\n\n\t\t\tvar boldStart = String.fromCharCode(1);\n\t\t\tvar boldEnd = String.fromCharCode(2);\n\t\t\treturn '<span class=\"select2-match-entire\">' +\n\t\t\t\tescapedMarkup\n\t\t\t\t.replace(boldStart, '<span class=\"select2-match\"><b>')\n\t\t\t\t.replace(boldEnd, '</b></span>') +\n\t\t\t\t'</span>';\n\t\t},\n\n\t\t/*\n\t\t * Refreshes the field if there is a change\n\t\t * in the autocomplete values.\n\t\t *\n\t\t * @param {HTMLElement} element\n\t\t *\n\t\t */\n\t\trefresh: function( element ) {\n\t\t\tthis.destroy($(element));\n\t\t\tthis.apply($(element));\n\t\t},\n\t\t/*\n\t\t * Removes diacritics from the string and replaces\n\t\t * them with English characters.\n\t\t * This code is basically copied from:\n\t\t * http://jpfiddle.net/potherca/Gtmr2/\n\t\t *\n\t\t * @param {string} text\n\t\t *\n\t\t * @return {string}\n\t\t *\n\t\t */\n\t\tremoveDiacritics: function( text ) {\n\t\t\tvar diacriticsMap = { 'Á': 'A', 'Ă': 'A', 'Ắ': 'A', 'Ặ': 'A', 'Ằ': 'A', 'Ẳ': 'A', 'Ẵ': 'A', 'Ǎ': 'A', 'Â': 'A', 'Ấ': 'A', 'Ậ': 'A', 'Ầ': 'A', 'Ẩ': 'A', 'Ẫ': 'A', 'Ä': 'A', 'Ǟ': 'A', 'Ȧ': 'A', 'Ǡ': 'A', 'Ạ': 'A', 'Ȁ': 'A', 'À': 'A', 'Ả': 'A', 'Ȃ': 'A', 'Ā': 'A', 'Ą': 'A', 'Å': 'A', 'Ǻ': 'A', 'Ḁ': 'A', 'Ⱥ': 'A', 'Ã': 'A', 'Ꜳ': 'AA', 'Æ': 'AE', 'Ǽ': 'AE', 'Ǣ': 'AE', 'Ꜵ': 'AO', 'Ꜷ': 'AU', 'Ꜹ': 'AV', 'Ꜻ': 'AV', 'Ꜽ': 'AY', 'Ḃ': 'B', 'Ḅ': 'B', 'Ɓ': 'B', 'Ḇ': 'B', 'Ƀ': 'B', 'Ƃ': 'B', 'Ć': 'C', 'Č': 'C', 'Ç': 'C', 'Ḉ': 'C', 'Ĉ': 'C', 'Ċ': 'C', 'Ƈ': 'C', 'Ȼ': 'C', 'Ď': 'D', 'Ḑ': 'D', 'Ḓ': 'D', 'Ḋ': 'D', 'Ḍ': 'D', 'Ɗ': 'D', 'Ḏ': 'D', 'Dz': 'D', 'Dž': 'D', 'Đ': 'D', 'Ƌ': 'D', 'DZ': 'DZ', 'DŽ': 'DZ', 'É': 'E', 'Ĕ': 'E', 'Ě': 'E', 'Ȩ': 'E', 'Ḝ': 'E', 'Ê': 'E', 'Ế': 'E', 'Ệ': 'E', 'Ề': 'E', 'Ể': 'E', 'Ễ': 'E', 'Ḙ': 'E', 'Ë': 'E', 'Ė': 'E', 'Ẹ': 'E', 'Ȅ': 'E', 'È': 'E', 'Ẻ': 'E', 'Ȇ': 'E', 'Ē': 'E', 'Ḗ': 'E', 'Ḕ': 'E', 'Ę': 'E', 'Ɇ': 'E', 'Ẽ': 'E', 'Ḛ': 'E', 'Ꝫ': 'ET', 'Ḟ': 'F', 'Ƒ': 'F', 'Ǵ': 'G', 'Ğ': 'G', 'Ǧ': 'G', 'Ģ': 'G', 'Ĝ': 'G', 'Ġ': 'G', 'Ɠ': 'G', 'Ḡ': 'G', 'Ǥ': 'G', 'Ḫ': 'H', 'Ȟ': 'H', 'Ḩ': 'H', 'Ĥ': 'H', 'Ⱨ': 'H', 'Ḧ': 'H', 'Ḣ': 'H', 'Ḥ': 'H', 'Ħ': 'H', 'Í': 'I', 'Ĭ': 'I', 'Ǐ': 'I', 'Î': 'I', 'Ï': 'I', 'Ḯ': 'I', 'İ': 'I', 'Ị': 'I', 'Ȉ': 'I', 'Ì': 'I', 'Ỉ': 'I', 'Ȋ': 'I', 'Ī': 'I', 'Į': 'I', 'Ɨ': 'I', 'Ĩ': 'I', 'Ḭ': 'I', 'Ꝺ': 'D', 'Ꝼ': 'F', 'Ᵹ': 'G', 'Ꞃ': 'R', 'Ꞅ': 'S', 'Ꞇ': 'T', 'Ꝭ': 'IS', 'Ĵ': 'J', 'Ɉ': 'J', 'Ḱ': 'K', 'Ǩ': 'K', 'Ķ': 'K', 'Ⱪ': 'K', 'Ꝃ': 'K', 'Ḳ': 'K', 'Ƙ': 'K', 'Ḵ': 'K', 'Ꝁ': 'K', 'Ꝅ': 'K', 'Ĺ': 'L', 'Ƚ': 'L', 'Ľ': 'L', 'Ļ': 'L', 'Ḽ': 'L', 'Ḷ': 'L', 'Ḹ': 'L', 'Ⱡ': 'L', 'Ꝉ': 'L', 'Ḻ': 'L', 'Ŀ': 'L', 'Ɫ': 'L', 'Lj': 'L', 'Ł': 'L', 'LJ': 'LJ', 'Ḿ': 'M', 'Ṁ': 'M', 'Ṃ': 'M', 'Ɱ': 'M', 'Ń': 'N', 'Ň': 'N', 'Ņ': 'N', 'Ṋ': 'N', 'Ṅ': 'N', 'Ṇ': 'N', 'Ǹ': 'N', 'Ɲ': 'N', 'Ṉ': 'N', 'Ƞ': 'N', 'Nj': 'N', 'Ñ': 'N', 'NJ': 'NJ', 'Ó': 'O', 'Ŏ': 'O', 'Ǒ': 'O', 'Ô': 'O', 'Ố': 'O', 'Ộ': 'O', 'Ồ': 'O', 'Ổ': 'O', 'Ỗ': 'O', 'Ö': 'O', 'Ȫ': 'O', 'Ȯ': 'O', 'Ȱ': 'O', 'Ọ': 'O', 'Ő': 'O', 'Ȍ': 'O', 'Ò': 'O', 'Ỏ': 'O', 'Ơ': 'O', 'Ớ': 'O', 'Ợ': 'O', 'Ờ': 'O', 'Ở': 'O', 'Ỡ': 'O', 'Ȏ': 'O', 'Ꝋ': 'O', 'Ꝍ': 'O', 'Ō': 'O', 'Ṓ': 'O', 'Ṑ': 'O', 'Ɵ': 'O', 'Ǫ': 'O', 'Ǭ': 'O', 'Ø': 'O', 'Ǿ': 'O', 'Õ': 'O', 'Ṍ': 'O', 'Ṏ': 'O', 'Ȭ': 'O', 'Ƣ': 'OI', 'Ꝏ': 'OO', 'Ɛ': 'E', 'Ɔ': 'O', 'Ȣ': 'OU', 'Ṕ': 'P', 'Ṗ': 'P', 'Ꝓ': 'P', 'Ƥ': 'P', 'Ꝕ': 'P', 'Ᵽ': 'P', 'Ꝑ': 'P', 'Ꝙ': 'Q', 'Ꝗ': 'Q', 'Ŕ': 'R', 'Ř': 'R', 'Ŗ': 'R', 'Ṙ': 'R', 'Ṛ': 'R', 'Ṝ': 'R', 'Ȑ': 'R', 'Ȓ': 'R', 'Ṟ': 'R', 'Ɍ': 'R', 'Ɽ': 'R', 'Ꜿ': 'C', 'Ǝ': 'E', 'Ś': 'S', 'Ṥ': 'S', 'Š': 'S', 'Ṧ': 'S', 'Ş': 'S', 'Ŝ': 'S', 'Ș': 'S', 'Ṡ': 'S', 'Ṣ': 'S', 'Ṩ': 'S', 'ẞ': 'SS', 'Ť': 'T', 'Ţ': 'T', 'Ṱ': 'T', 'Ț': 'T', 'Ⱦ': 'T', 'Ṫ': 'T', 'Ṭ': 'T', 'Ƭ': 'T', 'Ṯ': 'T', 'Ʈ': 'T', 'Ŧ': 'T', 'Ɐ': 'A', 'Ꞁ': 'L', 'Ɯ': 'M', 'Ʌ': 'V', 'Ꜩ': 'TZ', 'Ú': 'U', 'Ŭ': 'U', 'Ǔ': 'U', 'Û': 'U', 'Ṷ': 'U', 'Ü': 'U', 'Ǘ': 'U', 'Ǚ': 'U', 'Ǜ': 'U', 'Ǖ': 'U', 'Ṳ': 'U', 'Ụ': 'U', 'Ű': 'U', 'Ȕ': 'U', 'Ù': 'U', 'Ủ': 'U', 'Ư': 'U', 'Ứ': 'U', 'Ự': 'U', 'Ừ': 'U', 'Ử': 'U', 'Ữ': 'U', 'Ȗ': 'U', 'Ū': 'U', 'Ṻ': 'U', 'Ų': 'U', 'Ů': 'U', 'Ũ': 'U', 'Ṹ': 'U', 'Ṵ': 'U', 'Ꝟ': 'V', 'Ṿ': 'V', 'Ʋ': 'V', 'Ṽ': 'V', 'Ꝡ': 'VY', 'Ẃ': 'W', 'Ŵ': 'W', 'Ẅ': 'W', 'Ẇ': 'W', 'Ẉ': 'W', 'Ẁ': 'W', 'Ⱳ': 'W', 'Ẍ': 'X', 'Ẋ': 'X', 'Ý': 'Y', 'Ŷ': 'Y', 'Ÿ': 'Y', 'Ẏ': 'Y', 'Ỵ': 'Y', 'Ỳ': 'Y', 'Ƴ': 'Y', 'Ỷ': 'Y', 'Ỿ': 'Y', 'Ȳ': 'Y', 'Ɏ': 'Y', 'Ỹ': 'Y', 'Ź': 'Z', 'Ž': 'Z', 'Ẑ': 'Z', 'Ⱬ': 'Z', 'Ż': 'Z', 'Ẓ': 'Z', 'Ȥ': 'Z', 'Ẕ': 'Z', 'Ƶ': 'Z', 'IJ': 'IJ', 'Œ': 'OE', 'ᴀ': 'A', 'ᴁ': 'AE', 'ʙ': 'B', 'ᴃ': 'B', 'ᴄ': 'C', 'ᴅ': 'D', 'ᴇ': 'E', 'ꜰ': 'F', 'ɢ': 'G', 'ʛ': 'G', 'ʜ': 'H', 'ɪ': 'I', 'ʁ': 'R', 'ᴊ': 'J', 'ᴋ': 'K', 'ʟ': 'L', 'ᴌ': 'L', 'ᴍ': 'M', 'ɴ': 'N', 'ᴏ': 'O', 'ɶ': 'OE', 'ᴐ': 'O', 'ᴕ': 'OU', 'ᴘ': 'P', 'ʀ': 'R', 'ᴎ': 'N', 'ᴙ': 'R', 'ꜱ': 'S', 'ᴛ': 'T', 'ⱻ': 'E', 'ᴚ': 'R', 'ᴜ': 'U', 'ᴠ': 'V', 'ᴡ': 'W', 'ʏ': 'Y', 'ᴢ': 'Z', 'á': 'a', 'ă': 'a', 'ắ': 'a', 'ặ': 'a', 'ằ': 'a', 'ẳ': 'a', 'ẵ': 'a', 'ǎ': 'a', 'â': 'a', 'ấ': 'a', 'ậ': 'a', 'ầ': 'a', 'ẩ': 'a', 'ẫ': 'a', 'ä': 'a', 'ǟ': 'a', 'ȧ': 'a', 'ǡ': 'a', 'ạ': 'a', 'ȁ': 'a', 'à': 'a', 'ả': 'a', 'ȃ': 'a', 'ā': 'a', 'ą': 'a', 'ᶏ': 'a', 'ẚ': 'a', 'å': 'a', 'ǻ': 'a', 'ḁ': 'a', 'ⱥ': 'a', 'ã': 'a', 'ꜳ': 'aa', 'æ': 'ae', 'ǽ': 'ae', 'ǣ': 'ae', 'ꜵ': 'ao', 'ꜷ': 'au', 'ꜹ': 'av', 'ꜻ': 'av', 'ꜽ': 'ay', 'ḃ': 'b', 'ḅ': 'b', 'ɓ': 'b', 'ḇ': 'b', 'ᵬ': 'b', 'ᶀ': 'b', 'ƀ': 'b', 'ƃ': 'b', 'ɵ': 'o', 'ć': 'c', 'č': 'c', 'ç': 'c', 'ḉ': 'c', 'ĉ': 'c', 'ɕ': 'c', 'ċ': 'c', 'ƈ': 'c', 'ȼ': 'c', 'ď': 'd', 'ḑ': 'd', 'ḓ': 'd', 'ȡ': 'd', 'ḋ': 'd', 'ḍ': 'd', 'ɗ': 'd', 'ᶑ': 'd', 'ḏ': 'd', 'ᵭ': 'd', 'ᶁ': 'd', 'đ': 'd', 'ɖ': 'd', 'ƌ': 'd', 'ı': 'i', 'ȷ': 'j', 'ɟ': 'j', 'ʄ': 'j', 'dz': 'dz', 'dž': 'dz', 'é': 'e', 'ĕ': 'e', 'ě': 'e', 'ȩ': 'e', 'ḝ': 'e', 'ê': 'e', 'ế': 'e', 'ệ': 'e', 'ề': 'e', 'ể': 'e', 'ễ': 'e', 'ḙ': 'e', 'ë': 'e', 'ė': 'e', 'ẹ': 'e', 'ȅ': 'e', 'è': 'e', 'ẻ': 'e', 'ȇ': 'e', 'ē': 'e', 'ḗ': 'e', 'ḕ': 'e', 'ⱸ': 'e', 'ę': 'e', 'ᶒ': 'e', 'ɇ': 'e', 'ẽ': 'e', 'ḛ': 'e', 'ꝫ': 'et', 'ḟ': 'f', 'ƒ': 'f', 'ᵮ': 'f', 'ᶂ': 'f', 'ǵ': 'g', 'ğ': 'g', 'ǧ': 'g', 'ģ': 'g', 'ĝ': 'g', 'ġ': 'g', 'ɠ': 'g', 'ḡ': 'g', 'ᶃ': 'g', 'ǥ': 'g', 'ḫ': 'h', 'ȟ': 'h', 'ḩ': 'h', 'ĥ': 'h', 'ⱨ': 'h', 'ḧ': 'h', 'ḣ': 'h', 'ḥ': 'h', 'ɦ': 'h', 'ẖ': 'h', 'ħ': 'h', 'ƕ': 'hv', 'í': 'i', 'ĭ': 'i', 'ǐ': 'i', 'î': 'i', 'ï': 'i', 'ḯ': 'i', 'ị': 'i', 'ȉ': 'i', 'ì': 'i', 'ỉ': 'i', 'ȋ': 'i', 'ī': 'i', 'į': 'i', 'ᶖ': 'i', 'ɨ': 'i', 'ĩ': 'i', 'ḭ': 'i', 'ꝺ': 'd', 'ꝼ': 'f', 'ᵹ': 'g', 'ꞃ': 'r', 'ꞅ': 's', 'ꞇ': 't', 'ꝭ': 'is', 'ǰ': 'j', 'ĵ': 'j', 'ʝ': 'j', 'ɉ': 'j', 'ḱ': 'k', 'ǩ': 'k', 'ķ': 'k', 'ⱪ': 'k', 'ꝃ': 'k', 'ḳ': 'k', 'ƙ': 'k', 'ḵ': 'k', 'ᶄ': 'k', 'ꝁ': 'k', 'ꝅ': 'k', 'ĺ': 'l', 'ƚ': 'l', 'ɬ': 'l', 'ľ': 'l', 'ļ': 'l', 'ḽ': 'l', 'ȴ': 'l', 'ḷ': 'l', 'ḹ': 'l', 'ⱡ': 'l', 'ꝉ': 'l', 'ḻ': 'l', 'ŀ': 'l', 'ɫ': 'l', 'ᶅ': 'l', 'ɭ': 'l', 'ł': 'l', 'lj': 'lj', 'ſ': 's', 'ẜ': 's', 'ẛ': 's', 'ẝ': 's', 'ḿ': 'm', 'ṁ': 'm', 'ṃ': 'm', 'ɱ': 'm', 'ᵯ': 'm', 'ᶆ': 'm', 'ń': 'n', 'ň': 'n', 'ņ': 'n', 'ṋ': 'n', 'ȵ': 'n', 'ṅ': 'n', 'ṇ': 'n', 'ǹ': 'n', 'ɲ': 'n', 'ṉ': 'n', 'ƞ': 'n', 'ᵰ': 'n', 'ᶇ': 'n', 'ɳ': 'n', 'ñ': 'n', 'nj': 'nj', 'ó': 'o', 'ŏ': 'o', 'ǒ': 'o', 'ô': 'o', 'ố': 'o', 'ộ': 'o', 'ồ': 'o', 'ổ': 'o', 'ỗ': 'o', 'ö': 'o', 'ȫ': 'o', 'ȯ': 'o', 'ȱ': 'o', 'ọ': 'o', 'ő': 'o', 'ȍ': 'o', 'ò': 'o', 'ỏ': 'o', 'ơ': 'o', 'ớ': 'o', 'ợ': 'o', 'ờ': 'o', 'ở': 'o', 'ỡ': 'o', 'ȏ': 'o', 'ꝋ': 'o', 'ꝍ': 'o', 'ⱺ': 'o', 'ō': 'o', 'ṓ': 'o', 'ṑ': 'o', 'ǫ': 'o', 'ǭ': 'o', 'ø': 'o', 'ǿ': 'o', 'õ': 'o', 'ṍ': 'o', 'ṏ': 'o', 'ȭ': 'o', 'ƣ': 'oi', 'ꝏ': 'oo', 'ɛ': 'e', 'ᶓ': 'e', 'ɔ': 'o', 'ᶗ': 'o', 'ȣ': 'ou', 'ṕ': 'p', 'ṗ': 'p', 'ꝓ': 'p', 'ƥ': 'p', 'ᵱ': 'p', 'ᶈ': 'p', 'ꝕ': 'p', 'ᵽ': 'p', 'ꝑ': 'p', 'ꝙ': 'q', 'ʠ': 'q', 'ɋ': 'q', 'ꝗ': 'q', 'ŕ': 'r', 'ř': 'r', 'ŗ': 'r', 'ṙ': 'r', 'ṛ': 'r', 'ṝ': 'r', 'ȑ': 'r', 'ɾ': 'r', 'ᵳ': 'r', 'ȓ': 'r', 'ṟ': 'r', 'ɼ': 'r', 'ᵲ': 'r', 'ᶉ': 'r', 'ɍ': 'r', 'ɽ': 'r', 'ↄ': 'c', 'ꜿ': 'c', 'ɘ': 'e', 'ɿ': 'r', 'ś': 's', 'ṥ': 's', 'š': 's', 'ṧ': 's', 'ş': 's', 'ŝ': 's', 'ș': 's', 'ṡ': 's', 'ṣ': 's', 'ṩ': 's', 'ʂ': 's', 'ᵴ': 's', 'ᶊ': 's', 'ȿ': 's', 'ß': 'ss', 'ɡ': 'g', 'ᴑ': 'o', 'ᴓ': 'o', 'ᴝ': 'u', 'ť': 't', 'ţ': 't', 'ṱ': 't', 'ț': 't', 'ȶ': 't', 'ẗ': 't', 'ⱦ': 't', 'ṫ': 't', 'ṭ': 't', 'ƭ': 't', 'ṯ': 't', 'ᵵ': 't', 'ƫ': 't', 'ʈ': 't', 'ŧ': 't', 'ᵺ': 'th', 'ɐ': 'a', 'ᴂ': 'ae', 'ǝ': 'e', 'ᵷ': 'g', 'ɥ': 'h', 'ʮ': 'h', 'ʯ': 'h', 'ᴉ': 'i', 'ʞ': 'k', 'ꞁ': 'l', 'ɯ': 'm', 'ɰ': 'm', 'ᴔ': 'oe', 'ɹ': 'r', 'ɻ': 'r', 'ɺ': 'r', 'ⱹ': 'r', 'ʇ': 't', 'ʌ': 'v', 'ʍ': 'w', 'ʎ': 'y', 'ꜩ': 'tz', 'ú': 'u', 'ŭ': 'u', 'ǔ': 'u', 'û': 'u', 'ṷ': 'u', 'ü': 'u', 'ǘ': 'u', 'ǚ': 'u', 'ǜ': 'u', 'ǖ': 'u', 'ṳ': 'u', 'ụ': 'u', 'ű': 'u', 'ȕ': 'u', 'ù': 'u', 'ủ': 'u', 'ư': 'u', 'ứ': 'u', 'ự': 'u', 'ừ': 'u', 'ử': 'u', 'ữ': 'u', 'ȗ': 'u', 'ū': 'u', 'ṻ': 'u', 'ų': 'u', 'ᶙ': 'u', 'ů': 'u', 'ũ': 'u', 'ṹ': 'u', 'ṵ': 'u', 'ᵫ': 'ue', 'ꝸ': 'um', 'ⱴ': 'v', 'ꝟ': 'v', 'ṿ': 'v', 'ʋ': 'v', 'ᶌ': 'v', 'ⱱ': 'v', 'ṽ': 'v', 'ꝡ': 'vy', 'ẃ': 'w', 'ŵ': 'w', 'ẅ': 'w', 'ẇ': 'w', 'ẉ': 'w', 'ẁ': 'w', 'ⱳ': 'w', 'ẘ': 'w', 'ẍ': 'x', 'ẋ': 'x', 'ᶍ': 'x', 'ý': 'y', 'ŷ': 'y', 'ÿ': 'y', 'ẏ': 'y', 'ỵ': 'y', 'ỳ': 'y', 'ƴ': 'y', 'ỷ': 'y', 'ỿ': 'y', 'ȳ': 'y', 'ẙ': 'y', 'ɏ': 'y', 'ỹ': 'y', 'ź': 'z', 'ž': 'z', 'ẑ': 'z', 'ʑ': 'z', 'ⱬ': 'z', 'ż': 'z', 'ẓ': 'z', 'ȥ': 'z', 'ẕ': 'z', 'ᵶ': 'z', 'ᶎ': 'z', 'ʐ': 'z', 'ƶ': 'z', 'ɀ': 'z', 'ff': 'ff', 'ffi': 'ffi', 'ffl': 'ffl', 'fi': 'fi', 'fl': 'fl', 'ij': 'ij', 'œ': 'oe', 'st': 'st', 'ₐ': 'a', 'ₑ': 'e', 'ᵢ': 'i', 'ⱼ': 'j', 'ₒ': 'o', 'ᵣ': 'r', 'ᵤ': 'u', 'ᵥ': 'v', 'ₓ': 'x' };\n\n\t\t\treturn text.toString().replace(/[\\u007F-\\uFFFF]/g, function(key) {\n\t\t\t\treturn diacriticsMap[key] || key;\n\t\t\t});\n\t\t},\n\t\ttextHighlight: function( text, term ) {\n\t\t\tif ( text === undefined ) {\n\t\t\t\ttext = \"\";\n\t\t\t}\n\t\t\tvar markup = \"\";\n\t\t\tvar remove_diacritics = pf.select2.base.prototype.removeDiacritics;\n\t\t\tvar no_diac_text = remove_diacritics(text);\n\t\t\tvar no_diac_term = remove_diacritics(term);\n\t\t\tvar start = no_diac_text.toUpperCase().indexOf(no_diac_term.toString().toUpperCase());\n\t\t\tif ( start !== 0 && !mw.config.get( 'wgPageFormsAutocompleteOnAllChars' ) ) {\n\t\t\t\tstart = no_diac_text.toUpperCase().indexOf(\" \" + no_diac_term.toString().toUpperCase());\n\t\t\t\tif ( start !== -1 ) {\n\t\t\t\t\tstart = start + 1;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( start !== -1 ) {\n\t\t\t\tvar boldStart = String.fromCharCode(1);\n\t\t\t\tvar boldEnd = String.fromCharCode(2);\n\t\t\t\tmarkup = text.substr(0, start) + boldStart +\n\t\t\t\t\ttext.substr(start,term.length) + boldEnd +\n\t\t\t\t\ttext.substr(start + term.length, text.length);\n\t\t\t} else {\n\t\t\t\tmarkup = (text);\n\t\t\t}\n\t\t\treturn markup;\n\t\t},\n\t};\n}( jQuery, mediaWiki, pageforms ) );\n","usedDeprecatedRules":[]},{"filePath":"/src/repo/libs/ext.pf.select2.combobox.js","messages":[{"ruleId":"no-shadow","severity":1,"message":"'data' is already declared in the upper scope on line 122 column 10.","line":223,"column":23,"nodeType":"Identifier","messageId":"noShadow","endLine":223,"endColumn":27},{"ruleId":"no-jquery/variable-pattern","severity":1,"message":"jQuery collection names must match the variablePattern","line":322,"column":5,"nodeType":"AssignmentExpression","endLine":323,"endColumn":60},{"ruleId":"no-jquery/variable-pattern","severity":1,"message":"jQuery collection names must match the variablePattern","line":325,"column":5,"nodeType":"AssignmentExpression","endLine":325,"endColumn":67}],"errorCount":0,"warningCount":3,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/*\n * ext.pf.select2.comboboxjs\n *\n * JavaScript utility class to handle autocomplete\n * for combobox input type using Select2 JS library\n *\n * @file\n *\n * @licence GNU GPL v2+\n * @author Jatin Mehta\n * @author Priyanshu Varshney\n * @author Yaron Koren\n */\n\n( function( $, mw, pf ) {\n\t'use strict';\n\n\t/**\n\t * Inheritance class for the pf.select2 constructor\n\t *\n\t *\n\t * @class\n\t */\n\tpf.select2 = pf.select2 || {};\n\n\t/**\n\t * @class\n\t * @constructor\n\t */\n\tpf.select2.combobox = function() {\n\n\t};\n\n\tvar combobox_proto = new pf.select2.base();\n\n\t/*\n\t * Returns options to be set by select2\n\t *\n\t * @return {object} opts\n\t *\n\t */\n\tcombobox_proto.setOptions = function() {\n\t\tvar self = this;\n\t\tvar input_id = this.id;\n\t\tvar opts = {};\n\t\topts.language = {};\n\t\tinput_id = \"#\" + input_id;\n\t\tvar input_tagname = $(input_id).prop( \"tagName\" );\n\t\tvar autocomplete_opts = this.getAutocompleteOpts();\n\t\topts.escapeMarkup = function (m) {\n\t\t\treturn self.escapeMarkupAndAddHTML(m);\n\t\t};\n\t\tif ( autocomplete_opts.autocompletedatatype !== undefined ) {\n\t\t\topts.ajax = this.getAjaxOpts();\n\t\t\topts.minimumInputLength = 1;\n\t\t\topts.language.inputTooShort = function() {\n\t\t\t\treturn mw.msg( \"pf-select2-input-too-short\", opts.minimumInputLength );\n\t\t\t};\n\t\t} else if ( input_tagname === \"SELECT\" ) {\n\t\t\topts.data = this.getData( autocomplete_opts.autocompletesettings );\n\t\t}\n\t\tvar wgPageFormsAutocompleteOnAllChars = mw.config.get( 'wgPageFormsAutocompleteOnAllChars' );\n\t\tif ( !wgPageFormsAutocompleteOnAllChars ) {\n\t\t\topts.matcher = function( term, text ) {\n\t\t\t\tif( term.term === undefined ) {\n\t\t\t\t\tterm.term = \"\";\n\t\t\t\t}\n\t\t\t\tvar no_diac_text = pf.select2.base.prototype.removeDiacritics( text.text );\n\t\t\t\tvar position = no_diac_text.toUpperCase().indexOf(term.term.toString().toUpperCase());\n\t\t\t\tvar position_with_space = no_diac_text.toUpperCase().indexOf(\" \" + term.term.toString().toUpperCase());\n\t\t\t\tif ( (position !== -1 && position === 0 ) || position_with_space !== -1 ) {\n\t\t\t\t\treturn text;\n\t\t\t\t} else {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t\treturn null;\n\t\t\t};\n\t\t}\n\t\topts.templateResult = function( result ) {\n\t\t\tvar term = $( input_id ).data(\"select2\").dropdown.$search.val();\n\t\t\tif ( term === undefined ) {\n\t\t\t\tterm = \"\";\n\t\t\t}\n\t\t\treturn pf.select2.base.prototype.textHighlight( result.id, term );\n\t\t}\n\t\topts.language.searching = function() {\n\t\t\treturn mw.msg( \"pf-select2-searching\" );\n\t\t};\n\t\topts.language.noMatches = function() {\n\t\t\treturn mw.msg( \"pf-select2-no-matches\" );\n\t\t};\n\t\topts.placeholder = $(input_id).attr( \"placeholder\" );\n\t\tif( opts.placeholder === undefined ) {\n\t\t\topts.placeholder = \"\";\n\t\t}\n\t\topts.allowClear = true;\n\t\tvar size = $(input_id).attr(\"data-size\");\n\t\tif ( size === undefined ) {\n\t\t\tsize = '200'; //default value\n\t\t}\n\t\topts.containerCss = { 'min-width': size };\n\t\topts.width= NaN;\n\t\tif( !this.existingValuesOnly ){\n\t\t\topts.tags = true;\n\t\t}\n\t\topts.containerCssClass = 'pf-select2-container';\n\t\topts.dropdownCssClass = 'pf-select2-dropdown';\n\t\treturn opts;\n\t};\n\n\t/*\n\t * Returns data to be used by select2 for combobox autocompletion\n\t *\n\t * @param {string} autocompletesettings\n\t * @return {associative array} values\n\t *\n\t */\n\tcombobox_proto.getData = function( autocompletesettings ) {\n\t\tvar input_id = \"#\" + this.id;\n\t\tvar values = [];\n\t\tvar dep_on = this.dependentOn();\n\t\tvar i, data;\n\t\tif ( dep_on === null ) {\n\t\t\tif ( autocompletesettings === 'external data' ) {\n\t\t\t\tvar name = $(input_id).attr(this.nameAttr($(input_id)));\n\t\t\t\tvar wgPageFormsEDSettings = mw.config.get( 'wgPageFormsEDSettings' );\n\t\t\t\tvar edgValues = mw.config.get( 'edgValues' );\n\t\t\t\tdata = {};\n\t\t\t\tif ( wgPageFormsEDSettings[name].title !== undefined && wgPageFormsEDSettings[name].title !== \"\" ) {\n\t\t\t\t\tdata.title = edgValues[wgPageFormsEDSettings[name].title];\n\t\t\t\t\tif ( data.title !== undefined && data.title !== null ) {\n\t\t\t\t\t\ti = 0;\n\t\t\t\t\t\tdata.title.forEach(function() {\n\t\t\t\t\t\t\tvalues.push({\n\t\t\t\t\t\t\t\tid: data.title[i], text: data.title[i]\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\ti++;\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tif ( wgPageFormsEDSettings[name].image !== undefined && wgPageFormsEDSettings[name].image !== \"\" ) {\n\t\t\t\t\t\tdata.image = edgValues[wgPageFormsEDSettings[name].image];\n\t\t\t\t\t\ti = 0;\n\t\t\t\t\t\tif ( data.image !== undefined && data.image !== null ) {\n\t\t\t\t\t\t\tdata.image.forEach(function() {\n\t\t\t\t\t\t\t\tvalues[i].image = data.image[i];\n\t\t\t\t\t\t\t\ti++;\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\tif ( wgPageFormsEDSettings[name].description !== undefined && wgPageFormsEDSettings[name].description !== \"\" ) {\n\t\t\t\t\t\tdata.description = edgValues[wgPageFormsEDSettings[name].description];\n\t\t\t\t\t\ti = 0;\n\t\t\t\t\t\tif ( data.description !== undefined && data.description !== null ) {\n\t\t\t\t\t\t\tdata.description.forEach(function() {\n\t\t\t\t\t\t\t\tvalues[i].description = data.description[i];\n\t\t\t\t\t\t\t\ti++;\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} else {\n\t\t\t\tvar wgPageFormsAutocompleteValues = mw.config.get( 'wgPageFormsAutocompleteValues' );\n\t\t\t\tdata = wgPageFormsAutocompleteValues[autocompletesettings];\n\n\t\t\t\tif ( Array.isArray( data ) || typeof data == 'object' ) {\n\t\t\t\t\t// Insert an empty string at the start of the array,\n\t\t\t\t\t// so that when Select2 gets the data it doesn't\n\t\t\t\t\t// duplicate the first option in the dropdown\n\t\t\t\t\tvalues.push({\n\t\t\t\t\t\tid: '', text: ''\n\t\t\t\t\t});\n\t\t\t\t\t// Convert data into the format accepted by Select2\n\t\t\t\t\tfor (var key in data) {\n\t\t\t\t\t\tvalues.push({\n\t\t\t\t\t\t\tid: data[key], text: data[key]\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\t// Add the current value to the list of allowed\n\t\t\t\t\t// values, if it's not there already, so that the\n\t\t\t\t\t// combobox won't show up as blank.\n\t\t\t\t\t// Should this be done even if \"existing values\n\t\t\t\t\t// only\" is specified\"? For now, yes - based on\n\t\t\t\t\t// the \"principle of least astonishment\", it's\n\t\t\t\t\t// generally better for the form to not wipe out\n\t\t\t\t\t// existing content when possible. However,\n\t\t\t\t\t// there's also an argument the other way.\n\t\t\t\t\tvar curValue = $('#' + this.id).attr('value');\n\t\t\t\t\tif ( curValue !== '' && curValue !== undefined && !Object.keys(data).includes( curValue ) ) {\n\t\t\t\t\t\tvalues.push({\n\t\t\t\t\t\t\tid: curValue, text: curValue\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} else { // Dependent field autocompletion\n\t\t\tvar dep_field_opts = this.getDependentFieldOpts( dep_on );\n\t\t\tvar my_server = mw.config.get( 'wgScriptPath' ) + \"/api.php\";\n\t\t\tmy_server += \"?action=pfautocomplete&format=json\";\n\t\t\t// URL depends on whether Cargo or Semantic MediaWiki\n\t\t\t// is being used.\n\t\t\tif ( dep_field_opts.prop.indexOf('|') === -1 ) {\n\t\t\t\t// SMW\n\t\t\t\tmy_server += \"&property=\" + dep_field_opts.prop + \"&baseprop=\" + dep_field_opts.base_prop + \"&basevalue=\" + dep_field_opts.base_value;\n\t\t\t} else {\n\t\t\t\t// Cargo\n\t\t\t\tvar cargoTableAndFieldStr = dep_field_opts.prop;\n\t\t\t\tvar cargoTableAndField = cargoTableAndFieldStr.split('|');\n\t\t\t\tvar cargoTable = cargoTableAndField[0];\n\t\t\t\tvar cargoField = cargoTableAndField[1];\n\t\t\t\tvar baseCargoTableAndFieldStr = dep_field_opts.base_prop;\n\t\t\t\tvar baseCargoTableAndField = baseCargoTableAndFieldStr.split('|');\n\t\t\t\tvar baseCargoTable = baseCargoTableAndField[0];\n\t\t\t\tvar baseCargoField = baseCargoTableAndField[1];\n\t\t\t\tmy_server += \"&cargo_table=\" + cargoTable + \"&cargo_field=\" + cargoField + \"&base_cargo_table=\" + baseCargoTable + \"&base_cargo_field=\" + baseCargoField + \"&basevalue=\" + dep_field_opts.base_value;\n\t\t\t}\n\n\t\t\t$.ajax({\n\t\t\t\turl: my_server,\n\t\t\t\tdataType: 'json',\n\t\t\t\tasync: false,\n\t\t\t\tsuccess: function(data) {\n\t\t\t\t\t//Convert data into the format accepted by Select2\n\t\t\t\t\tdata.pfautocomplete.forEach( function(item) {\n\t\t\t\t\t\tif (item.displaytitle !== undefined) {\n\t\t\t\t\t\t\tvalues.push({\n\t\t\t\t\t\t\t\tid: item.displaytitle, text: item.displaytitle\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tvalues.push({\n\t\t\t\t\t\t\t\tid: item.title, text: item.title\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\treturn values;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\treturn values;\n\t};\n\n\t/*\n\t * Returns ajax options to be used by select2 for\n\t * remote autocompletion of combobox\n\t *\n\t * @return {object} ajaxOpts\n\t *\n\t */\n\tcombobox_proto.getAjaxOpts = function() {\n\t\tvar autocomplete_opts = this.getAutocompleteOpts();\n\t\tvar data_source = autocomplete_opts.autocompletesettings.split(',')[0];\n\t\tvar my_server = mw.util.wikiScript( 'api' );\n\t\tvar autocomplete_type = autocomplete_opts.autocompletedatatype;\n\t\tif ( autocomplete_type === 'cargo field' ) {\n\t\t\tvar table_and_field = data_source.split('|');\n\t\t\tmy_server += \"?action=pfautocomplete&format=json&cargo_table=\" + table_and_field[0] + \"&cargo_field=\" + table_and_field[1];\n\t\t} else {\n\t\t\tmy_server += \"?action=pfautocomplete&format=json&\" + autocomplete_opts.autocompletedatatype + \"=\" + data_source;\n\t\t}\n\n\t\tvar ajaxOpts = {\n\t\t\turl: my_server,\n\t\t\tdataType: 'json',\n\t\t\tdata: function (term) {\n\t\t\t\treturn {\n\t\t\t\t\tsubstr: term.term, // search term\n\t\t\t\t};\n\t\t\t},\n\t\t\tprocessResults: function (data) { // parse the results into the format expected by Select2.\n\t\t\t\tif (data.pfautocomplete !== undefined) {\n\t\t\t\t\tdata.pfautocomplete.forEach( function(item) {\n\t\t\t\t\t\titem.id = item.title;\n\t\t\t\t\t\tif (item.displaytitle !== undefined) {\n\t\t\t\t\t\t\titem.text = item.displaytitle;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\titem.text = item.title;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\treturn {results: data.pfautocomplete};\n\t\t\t\t} else {\n\t\t\t\t\treturn {results: []};\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\treturn ajaxOpts;\n\t};\n\n\t/*\n\t * Used to set the value of the HTMLInputElement\n\t * when there is a change in the select2 value\n\t *\n\t */\n\tcombobox_proto.onChange = function() {\n\t\tvar self = this;\n\t\tvar data = $(this).select2( \"data\" );\n\t\tvar namespace = $(this).attr( \"data-namespace\" );\n\t\tif (data.length !== 0) {\n \t\t\tvar val = data[0].text;\n \t\t\tif ( namespace && data[0].id === data[0].text ) {\n \t\t\t\tif ( val.indexOf( namespace + ':' ) !== 0 ) {\n \t\t\t\t\tval = namespace + ':' + val;\n \t\t\t\t}\n \t\t\t}\n\t\t\t$(this)[0].children[0].text=val;\n\t\t\t$(this)[0].children[0].value=val;\n\n \t\t\t$(this).value = val;\n\t\t} else {\n\t\t\t$(this).value = '';\n\t\t}\n\n\t\t// Set the corresponding values for any other field\n\t\t// in the form which is dependent on this element\n\t\tvar cmbox = new pf.select2.combobox();\n\t\tvar dep_on_me = $.unique(cmbox.dependentOnMe( $(this) ));\n\t\tdep_on_me.forEach( function( dependent_field_name ) {\n\t\t\tvar dependent_field;\n\t\t\tif ( cmbox.partOfMultiple( $(self) ) ) {\n\t\t\t\tdependent_field = $(self).closest( \".multipleTemplateInstance\" )\n\t\t\t\t\t.find( '[origname =\"' + dependent_field_name + '\" ]' );\n\t\t\t} else {\n\t\t\t\tdependent_field = $('[name =\"' + dependent_field_name + '\" ]');\n\t\t\t}\n\t\t\tcmbox.dependentFieldAutocompleteHandler( dependent_field, self );\n\t\t});\n\t};\n\t/*\n\t * Handles dependent field autocompletion\n\t *\n\t * @param {HTMLElement} dependent_field\n\t * @param {HTMLElement} dependent_on\n\t *\n\t */\n\tcombobox_proto.dependentFieldAutocompleteHandler = function( dependent_field, dependent_on ) {\n\t\tvar class_name = $(dependent_field).attr( 'class' );\n\t\tvar cmbox = new pf.select2.combobox();\n\t\tvar tokens = new pf.select2.tokens();\n\n\t\tif ( class_name.indexOf( 'pfComboBox' ) !== -1 ) {\n\t\t\tcmbox.refresh(dependent_field);\n\t\t} else if ( class_name.indexOf( 'pfTokens' ) !== -1 ) {\n\t\t\ttokens.refresh(dependent_field);\n\t\t} else if ( class_name.indexOf( 'createboxInput' ) !== -1 ) {\n\t\t\tvar name_attr = cmbox.nameAttr($(dependent_on));\n\t\t\tvar field_name = $(dependent_field).attr(name_attr),\n\t\t\tbase_field_name = $(dependent_on).attr(name_attr),\n\t\t\tbase_value = $(dependent_on).val();\n\t\t\t$(dependent_field).setDependentAutocompletion(field_name, base_field_name, base_value);\n\t\t}\n\n\t};\n\n\tpf.select2.combobox.prototype = combobox_proto;\n\n\t// Open the combobox if the user tabs to it, but only if it's blank.\n\t// Based in part on\n\t// https://github.com/select2/select2/issues/4025#issuecomment-372735893\n\t$(document).on('focus', '.select2.select2-container', function (e) {\n\t\tif ( e.originalEvent &&\n\t\t$(this).find(\".select2-selection--single\").length > 0 &&\n\t\t$(this).find('.select2-selection__rendered').attr('title') == undefined ) {\n\t\t\t$(this).siblings('select').select2('open');\n\t\t}\n\t});\n\n\t// When the combobox dropdown appears, put the current selected value\n\t// in the entry field, so that it can be edited.\n\t$(document).on('click', 'span.select2-selection', function(e) {\n\t\tvar comboboxAltID = $(this).attr('aria-owns');\n\t\tif ( comboboxAltID == undefined ) {\n\t\t\treturn;\n\t\t}\n\t\tvar comboboxValue = $(this).parents('span.comboboxSpan').find('select').val();\n\t\t$( \"[aria-controls='\" + comboboxAltID + \"']\" ).val(comboboxValue);\n\t});\n\n}( jQuery, mediaWiki, pageforms ) );\n","usedDeprecatedRules":[]},{"filePath":"/src/repo/libs/ext.pf.select2.tokens.js","messages":[{"ruleId":"no-shadow","severity":1,"message":"'data' is already declared in the upper scope on line 262 column 10.","line":326,"column":23,"nodeType":"Identifier","messageId":"noShadow","endLine":326,"endColumn":27}],"errorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/*\n * ext.pf.select2.tokens.js\n *\n * JavaScript utility class to handle autocomplete\n * for tokens input type using Select2 JS library\n *\n * @file\n *\n * @licence GNU GPL v2+\n * @author Jatin Mehta\n * @author Yaron Koren\n * @author Priyanshu Varshney\n */\n\n( function( $, mw, pf ) {\n\t'use strict';\n\n\t/**\n\t * Inheritance class for the pf.select2 constructor\n\t *\n\t *\n\t * @class\n\t */\n\tpf.select2 = pf.select2 || {};\n\n\t/**\n\t * @class\n\t * @constructor\n\t */\n\tpf.select2.tokens = function() {\n\n\t};\n\n\tvar tokens_proto = new pf.select2.base();\n\n\t/*\n\t * Applies select2 to the HTML element\n\t *\n\t * @param {HTMLElement} element\n\t *\n\t */\n\ttokens_proto.apply = function( element ) {\n\t\tvar cur_val = element.attr('value');\n\t\tvar existingValuesOnly = (element.attr(\"existingvaluesonly\") == \"true\");\n\t\tthis.existingValuesOnly = existingValuesOnly;\n\t\tthis.id = element.attr( \"id\" );\n\n\t\t// This happens sometimes, although it shouldn't. If it does,\n\t\t// something went wrong, so just exit.\n\t\tif ( this.id == undefined ) {\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tvar opts = this.setOptions();\n\t\t\tvar $input = element.select2(opts);\n\t\t\tvar inputData = $input.data(\"select2\");\n\t\t} catch (e) {\n\t\t\twindow.console.log(e);\n\t\t}\n\n\t\t// Make the tokens sortable, using the SortableJS library.\n\t\tvar tokensUL = element.parent().find('ul.select2-selection__rendered');\n\t\tvar tokensSelect = element.parents('span.inputSpan').find('select');\n\t\tvar sortable = Sortable.create(tokensUL[0], {\n\t\t\tghostClass: 'pfTokensGhost',\n\n\t\t\t// Somewhat of a @HACK - the tokens are stored in two\n\t\t\t// places in the DOM, a <ul> tag (which is displayed)\n\t\t\t// and a <select> tag (which is what gets submitted).\n\t\t\t// SortableJS only handles the first of these, so when\n\t\t\t// a rearrange is done, we rearrange the <select> layout\n\t\t\t// to match what's in the <ul>.\n\t\t\t// Is there a simpler way to do this?\n\t\t\tonEnd: function(event, dragEvent) {\n\t\t\t\tvar newTokensOrder = [];\n\t\t\t\ttokensUL.find('li.select2-selection__choice').not('.sortable-ghost').each( function() {\n\t\t\t\t\t// Remove the \"x\" from the beginning of\n\t\t\t\t\t// the string.\n\t\t\t\t\tnewTokensOrder.push($(this).text().substring(1));\n\t\t\t\t});\n\t\t\t\tvar dropdownItems = {};\n\t\t\t\ttokensSelect.find('option').each( function() {\n\t\t\t\t\tvar optionName = $(this).text();\n\t\t\t\t\tdropdownItems[optionName] = $(this);\n\t\t\t\t} );\n\t\t\t\ttokensSelect.prepend(dropdownItems[newTokensOrder[i]]);\n\t\t\t\tfor ( var i = 1; i < newTokensOrder.length; i++ ){\n\t\t\t\t\tdropdownItems[newTokensOrder[i]].insertAfter(dropdownItems[newTokensOrder[i - 1]]);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\t// Make sure that entries added with \"local autocompletion\"\n\t\t// show up in the order they were entered, not alphabetical\n\t\t// order.\n\t\t// Copied from https://github.com/select2/select2/issues/3106#issuecomment-234702241\n\t\telement.on(\"select2:select\", function (evt) {\n\t\t\tvar elem = evt.params.data.element;\n\t\t\tvar $element = $(elem);\n\n\t\t\t$element.detach();\n\t\t\t$(this).append($element);\n\t\t\t$(this).trigger(\"change\");\n\t\t\t// In order for this selection to truly \"take\", the\n\t\t\t// full input needs to be clicked on, for some reason.\n\t\t\t// We click on it *twice*, though, to get rid of the\n\t\t\t// \"Please enter...\" message.\n\t\t\t// There's probably a less hacky way to accomplish this.\n\t\t\t$(this).parent().find('span.select2-selection').click().click();\n\t\t});\n\n\t\t$(inputData.$container[0]).on(\"keyup\",function(e){\n\t\t\tif( existingValuesOnly ){\n\t\t\t\treturn ;\n\t\t\t}\n\t\t\tif( e.keyCode === 9 ){\n\t\t\t\tvar rawValue = \"\";\n\t\t\t\tvar checkIfPresent = false;\n\t\t\t\tvar valHighlighted = inputData.$results.find('.select2-results__option--highlighted')[0];\n\t\t\t\tif( valHighlighted !== undefined ){\n\t\t\t\t\trawValue = valHighlighted.textContent;\n\t\t\t\t}\n\t\t\t\tvar newValue = $.grep(inputData.val(), function (value) {\n\t\t\t\t\tif( value === rawValue ){\n\t\t\t\t\t\tcheckIfPresent = true;\n\t\t\t\t\t}\n\t\t\t\t\treturn value !== rawValue;\n\t\t\t\t});\n\t\t\t\tif( checkIfPresent === false && rawValue !== \"\" ) {\n\t\t\t\t\tnewValue.push(rawValue);\n\t\t\t\t}\n\t\t\t\tif ( !$input.find( \"option[value='\" + rawValue + \"']\" ).length ) {\n\t\t\t\t\tvar newOption = new Option( rawValue, rawValue, false, false );\n\t\t\t\t\t$input.append(newOption).trigger( 'change' );\n\t\t\t\t}\n\t\t\t\t$input.val( newValue ).trigger( 'change' );\n\t\t\t}\n\t\t});\n\t\tif ( element.attr( \"existingvaluesonly\" ) !== \"true\" ) {\n\t\t\telement.parent().on( \"dblclick\", \"li.select2-selection__choice\", function ( event ) {\n\t\t\t\tvar $target = $(event.target);\n\n\t\t\t\t// get the text and id of the clicked value\n\t\t\t\tvar targetData = $target.data();\n\t\t\t\tvar clickedValue = $target[0].title;\n\t\t\t\tvar clickedValueId = targetData.select2Id;\n\n\t\t\t\t// remove that value from select2 selection\n\t\t\t\tvar newValue = $.grep(inputData.val(), function (value) {\n\t\t\t\t\treturn value !== clickedValue;\n\t\t\t\t});\n\t\t\t\t$input.val(newValue).trigger(\"change\");\n\n\t\t\t\t// set the currently entered text to equal the clicked value\n\t\t\t\tinputData.$container.find(\".select2-search__field\").val(clickedValue).trigger(\"input\").focus();\n\t\t\t} );\n\t\t}\n\t};\n\t/*\n\t * Returns options to be set by select2\n\t *\n\t * @return {object} opts\n\t *\n\t */\n\ttokens_proto.setOptions = function() {\n\t\tvar self = this;\n\t\tvar input_id = this.id;\n\t\tvar opts = {};\n\t\topts.language = {};\n\t\tinput_id = \"#\" + input_id;\n\t\tvar input_tagname = $(input_id).prop( \"tagName\" );\n\t\tvar autocomplete_opts = this.getAutocompleteOpts();\n\t\topts.escapeMarkup = function (m) {\n\t\t\treturn self.escapeMarkupAndAddHTML(m);\n\t\t};\n\t\tif ( autocomplete_opts.autocompletedatatype !== undefined ) {\n\t\t\topts.ajax = this.getAjaxOpts();\n\t\t\topts.minimumInputLength = 1;\n\t\t\topts.language.inputTooShort = function() {\n\t\t\t\treturn mw.msg( \"pf-select2-input-too-short\", opts.minimumInputLength );\n\t\t\t};\n\t\t} else if ( input_tagname === \"SELECT\" ) {\n\t\t\topts.data = this.getData( autocomplete_opts.autocompletesettings );\n\t\t}\n\t\tvar wgPageFormsAutocompleteOnAllChars = mw.config.get( 'wgPageFormsAutocompleteOnAllChars' );\n\t\tif ( !wgPageFormsAutocompleteOnAllChars ) {\n\t\t\topts.matcher = function( term, text ) {\n\t\t\t\tvar folded_term = pf.select2.base.prototype.removeDiacritics( term.term ).toUpperCase();\n\t\t\t\tvar folded_text = pf.select2.base.prototype.removeDiacritics( text.text ).toUpperCase();\n\t\t\t\tvar position = folded_text.indexOf(folded_term);\n\t\t\t\tvar position_with_space = folded_text.indexOf(\" \" + folded_term);\n\t\t\t\tif ( (position !== -1 && position === 0 ) || position_with_space !== -1 ) {\n\t\t\t\t\treturn text;\n\t\t\t\t} else {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\topts.templateResult = function( result ) {\n\t\t\tvar term = \"\";\n\t\t\tvar inputData = $( input_id ).data(\"select2\");\n\t\t\tif ( inputData.results.lastParams !== undefined ){\n\t\t\t\tterm = inputData.results.lastParams.term;\n\t\t\t}\n\t\t\tif ( term === \"\" || term === undefined ) {\n\t\t\t\tterm = inputData.$dropdown[0].textContent;\n\t\t\t}\n\t\t\tif ( term === \"\" || term === undefined ) {\n\t\t\t\tvar htmlElements = inputData.$selection[0].children[0].children;\n\t\t\t\tterm = htmlElements[htmlElements.length - 1].children[0].value;\n\t\t\t}\n\t\t\treturn pf.select2.base.prototype.textHighlight( result.id, term );\n\t\t};\n\t\topts.language.searching = function() {\n\t\t\treturn mw.msg( \"pf-select2-searching\" );\n\t\t};\n\t\topts.placeholder = $(input_id).attr( \"placeholder\" );\n\n\t\tvar size = $(input_id).attr(\"data-size\");\n\t\tif ( size === undefined ) {\n\t\t\tsize = '100'; //default value\n\t\t}\n\t\topts.containerCss = { 'min-width': size };\n\t\topts.containerCssClass = 'pf-select2-container';\n\t\topts.dropdownCssClass = 'pf-select2-dropdown';\n\t\tif( !this.existingValuesOnly ){\n\t\t\topts.tags = true;\n\t\t}\n\t\topts.multiple = true;\n\t\topts.width= NaN; // A helpful way to expand tokenbox horizontally\n\t\topts.tokenSeparators = this.getDelimiter($(input_id));\n\t\tvar maxvalues = $(input_id).attr( \"maxvalues\" );\n\t\tif ( maxvalues !== undefined ) {\n\t\t\topts.maximumSelectionLength = maxvalues;\n\t\t\topts.language.maximumSelected = function() {\n\t\t\t\treturn mw.msg( \"pf-select2-selection-too-big\", maxvalues );\n\t\t\t};\n\t\t}\n\t\t// opts.selectOnClose = true;\n\t\topts.adaptContainerCssClass = function( clazz ) {\n\t\t\tif (clazz === \"mandatoryField\") {\n\t\t\t\treturn \"\";\n\t\t\t} else {\n\t\t\t\treturn clazz;\n\t\t\t}\n\t\t};\n\n\t\treturn opts;\n\t};\n\n\t/*\n\t * Returns data to be used by select2 for tokens autocompletion\n\t *\n\t * @param {string} autocompletesettings\n\t * @return {associative array} values\n\t *\n\t */\n\ttokens_proto.getData = function( autocompletesettings ) {\n\t\tvar input_id = \"#\" + this.id;\n\t\tvar values = [];\n\t\tvar i, data;\n\t\tvar dep_on = this.dependentOn();\n\t\tif ( dep_on === null ) {\n\t\t\tif ( autocompletesettings === 'external data' ) {\n\t\t\t\tvar name = $(input_id).attr(this.nameAttr($(input_id)));\n\t\t\t\t// Remove the final \"[]\".\n\t\t\t\tname = name.substring(0, name.length - 2);\n\t\t\t\tvar wgPageFormsEDSettings = mw.config.get( 'wgPageFormsEDSettings' );\n\t\t\t\tvar edgValues = mw.config.get( 'edgValues' );\n\t\t\t\tdata = {};\n\t\t\t\tif ( wgPageFormsEDSettings[name].title !== undefined && wgPageFormsEDSettings[name].title !== \"\" ) {\n\t\t\t\t\tdata.title = edgValues[wgPageFormsEDSettings[name].title];\n\t\t\t\t\tif ( data.title !== undefined && data.title !== null ) {\n\t\t\t\t\t\ti = 0;\n\t\t\t\t\t\tdata.title.forEach(function() {\n\t\t\t\t\t\t\tvalues.push({\n\t\t\t\t\t\t\t\tid: data.title[i], text: data.title[i]\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\ti++;\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tif ( wgPageFormsEDSettings[name].image !== undefined && wgPageFormsEDSettings[name].image !== \"\" ) {\n\t\t\t\t\t\tdata.image = edgValues[wgPageFormsEDSettings[name].image];\n\t\t\t\t\t\ti = 0;\n\t\t\t\t\t\tif ( data.image !== undefined && data.image !== null ) {\n\t\t\t\t\t\t\tdata.image.forEach(function() {\n\t\t\t\t\t\t\t\tvalues[i].image = data.image[i];\n\t\t\t\t\t\t\t\ti++;\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\tif ( wgPageFormsEDSettings[name].description !== undefined && wgPageFormsEDSettings[name].description !== \"\" ) {\n\t\t\t\t\t\tdata.description = edgValues[wgPageFormsEDSettings[name].description];\n\t\t\t\t\t\ti = 0;\n\t\t\t\t\t\tif ( data.description !== undefined && data.description !== null ) {\n\t\t\t\t\t\t\tdata.description.forEach(function() {\n\t\t\t\t\t\t\t\tvalues[i].description = data.description[i];\n\t\t\t\t\t\t\t\ti++;\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} else {\n\t\t\t\tvar wgPageFormsAutocompleteValues = mw.config.get( 'wgPageFormsAutocompleteValues' );\n\t\t\t\tdata = wgPageFormsAutocompleteValues[autocompletesettings];\n\t\t\t\t//Convert data into the format accepted by Select2\n\t\t\t\tif ( data !== undefined && data !== null ) {\n\t\t\t\t\tfor (var key in data) {\n\t\t\t\t\t\tvalues.push({\n\t\t\t\t\t\t\tid: data[key], text: data[key]\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} else { // Dependent field autocompletion\n\t\t\tvar dep_field_opts = this.getDependentFieldOpts( dep_on );\n\t\t\tvar my_server = mw.config.get( 'wgScriptPath' ) + \"/api.php\";\n\t\t\tmy_server += \"?action=pfautocomplete&format=json&property=\" + dep_field_opts.prop +\n\t\t\t\t\"&baseprop=\" + dep_field_opts.base_prop + \"&basevalue=\" + dep_field_opts.base_value;\n\t\t\t$.ajax({\n\t\t\t\turl: my_server,\n\t\t\t\tdataType: 'json',\n\t\t\t\tasync: false,\n\t\t\t\tsuccess: function(data) {\n\t\t\t\t\t// Convert data into the format accepted by Select2.\n\t\t\t\t\tdata.pfautocomplete.forEach( function(item) {\n\t\t\t\t\t\tif (item.displaytitle !== undefined) {\n\t\t\t\t\t\t\tvalues.push({\n\t\t\t\t\t\t\t\tid: item.displaytitle, text: item.displaytitle\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tvalues.push({\n\t\t\t\t\t\t\t\tid: item.title, text: item.title\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\treturn values;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\treturn values;\n\t};\n\n\t/*\n\t * Returns ajax options to be used by select2 for\n\t * remote autocompletion of tokens\n\t *\n\t * @return {object} ajaxOpts\n\t *\n\t */\n\ttokens_proto.getAjaxOpts = function() {\n\t\tvar autocomplete_opts = this.getAutocompleteOpts();\n\t\tvar data_source = autocomplete_opts.autocompletesettings.split(',')[0];\n\t\tvar my_server = mw.util.wikiScript( 'api' );\n\t\tvar autocomplete_type = autocomplete_opts.autocompletedatatype;\n\t\tif ( autocomplete_type === 'cargo field' ) {\n\t\t\tvar table_and_field = data_source.split('|');\n\t\t\tmy_server += \"?action=pfautocomplete&format=json&cargo_table=\" + table_and_field[0] + \"&cargo_field=\" + table_and_field[1];\n\t\t} else {\n\t\t\tmy_server += \"?action=pfautocomplete&format=json&\" + autocomplete_opts.autocompletedatatype + \"=\" + data_source;\n\t\t}\n\n\t\tvar ajaxOpts = {\n\t\t\turl: my_server,\n\t\t\tdataType: 'json',\n\t\t\tdata: function (term) {\n\t\t\t\treturn {\n\t\t\t\t\tsubstr: term.term, // search term\n\t\t\t\t};\n\t\t\t},\n\t\t\tprocessResults: function (data) { // parse the results into the format expected by Select2.\n\t\t\t\tif (data.pfautocomplete !== undefined) {\n\t\t\t\t\tdata.pfautocomplete.forEach( function(item) {\n\t\t\t\t\t\titem.id = item.title;\n\t\t\t\t\t\tif (item.displaytitle !== undefined) {\n\t\t\t\t\t\t\titem.text = item.displaytitle;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\titem.text = item.title;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\treturn {results: data.pfautocomplete};\n\t\t\t\t} else {\n\t\t\t\t\treturn {results: []};\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\treturn ajaxOpts;\n\t};\n\n\t/*\n\t * Returns delimiter for the token field\n\t *\n\t * @return {string} delimiter\n\t *\n\t */\n\ttokens_proto.getDelimiter = function ( element ) {\n\t\tvar autoCompleteSettingsIntermediate;\n\t\tif(element.attr('autocompletesettings') === undefined){\n\t\t\tvar tokenId = element.prevObject[0].firstElementChild.id;\n\t\t\tautoCompleteSettingsIntermediate = $('#'+tokenId).attr('autocompletesettings');\n\t\t} else {\n\t\t\tautoCompleteSettingsIntermediate = element.attr('autocompletesettings');\n\t\t}\n\t\tvar field_values = autoCompleteSettingsIntermediate.split( ',' );\n\t\tvar delimiter = \",\";\n\t\tif (field_values[1] === 'list' && field_values[2] !== undefined && field_values[2] !== \"\") {\n\t\t\tdelimiter = field_values[2];\n\t\t}\n\n\t\treturn delimiter;\n\t};\n\n\tpf.select2.tokens.prototype = tokens_proto;\n\n}( jQuery, mediaWiki, pageforms ) );\n","usedDeprecatedRules":[]},{"filePath":"/src/repo/package-lock.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/package.json","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]}]

$ npm ci
npm WARN prepare removing existing node_modules/ before installation

> core-js@3.9.1 postinstall /src/repo/node_modules/core-js
> node -e "try{require('./postinstall')}catch(e){}"

Thank you for using core-js ( https://github.com/zloirock/core-js ) for polyfilling JavaScript standard library!

The project needs your help! Please consider supporting of core-js on Open Collective or Patreon: 
> https://opencollective.com/core-js 
> https://www.patreon.com/zloirock 

Also, the author of core-js ( https://github.com/zloirock ) is looking for a good job -)

added 345 packages in 9.957s

$ npm test

> @ test /src/repo
> grunt test

Running "eslint:all" (eslint) task

/src/repo/libs/ext.pf.js
  20:0  warning  Invalid JSDoc tag name "alternateClassName"  jsdoc/check-tag-names

/src/repo/libs/ext.pf.select2.base.js
   93:12  warning  'newOption' is already declared in the upper scope on line 73 column 10  no-shadow
  199:5   warning  jQuery collection names must match the variablePattern                   no-jquery/variable-pattern
  202:5   warning  jQuery collection names must match the variablePattern                   no-jquery/variable-pattern
  230:3   warning  Missing JSDoc @return declaration                                        jsdoc/require-returns
  237:0   warning  Missing JSDoc @param "markup" type                                       jsdoc/require-param-type

/src/repo/libs/ext.pf.select2.combobox.js
  223:23  warning  'data' is already declared in the upper scope on line 122 column 10  no-shadow
  322:5   warning  jQuery collection names must match the variablePattern               no-jquery/variable-pattern
  325:5   warning  jQuery collection names must match the variablePattern               no-jquery/variable-pattern

/src/repo/libs/ext.pf.select2.tokens.js
  326:23  warning  'data' is already declared in the upper scope on line 262 column 10  no-shadow

/src/repo/libs/PageForms.js
   147:3   warning  jQuery collection names must match the variablePattern                              no-jquery/variable-pattern
   149:3   warning  jQuery collection names must match the variablePattern                              no-jquery/variable-pattern
   178:7   warning  jQuery collection names must match the variablePattern                              no-jquery/variable-pattern
   218:3   warning  jQuery collection names must match the variablePattern                              no-jquery/variable-pattern
   234:9   warning  Selector extensions are not allowed                                                 no-jquery/no-sizzle
   381:61  warning  All possible message keys should be documented. See https://w.wiki/PRw for details  mediawiki/msg-doc
   388:58  warning  All possible message keys should be documented. See https://w.wiki/PRw for details  mediawiki/msg-doc
   454:6   warning  jQuery collection names must match the variablePattern                              no-jquery/variable-pattern
   458:6   warning  jQuery collection names must match the variablePattern                              no-jquery/variable-pattern
   468:3   warning  jQuery collection names must match the variablePattern                              no-jquery/variable-pattern
   488:7   warning  jQuery collection names must match the variablePattern                              no-jquery/variable-pattern
   520:6   warning  jQuery collection names must match the variablePattern                              no-jquery/variable-pattern
   523:6   warning  jQuery collection names must match the variablePattern                              no-jquery/variable-pattern
   972:7   warning  jQuery collection names must match the variablePattern                              no-jquery/variable-pattern
   991:9   warning  Where possible, maintain application state in JS to avoid slower DOM queries        no-jquery/no-class-state
  1023:1   warning  Missing JSDoc @return declaration                                                   jsdoc/require-returns
  1026:0   warning  Missing JSDoc @param "addAboveCurInstance" type                                     jsdoc/require-param-type
  1241:6   warning  jQuery collection names must match the variablePattern                              no-jquery/variable-pattern
  1269:1   warning  Missing JSDoc @return declaration                                                   jsdoc/require-returns
  1273:0   warning  Missing JSDoc @param "partOfMultiple" type                                          jsdoc/require-param-type
  1297:4   warning  jQuery collection names must match the variablePattern                              no-jquery/variable-pattern
  1300:4   warning  jQuery collection names must match the variablePattern                              no-jquery/variable-pattern
  1323:0   warning  Missing JSDoc @param "partOfMultiple" type                                          jsdoc/require-param-type
  1526:27  warning  performance.now() is not supported in Safari 5.1, android 4.1                       compat/compat
  1526:47  warning  performance.now() is not supported in Safari 5.1, android 4.1                       compat/compat
  1549:13  warning  'i' is already declared in the upper scope on line 1542 column 6                    no-shadow
  1609:8   warning  jQuery collection names must match the variablePattern                              no-jquery/variable-pattern
  1638:6   warning  jQuery collection names must match the variablePattern                              no-jquery/variable-pattern

/src/repo/libs/PF_autoedit.js
  21:7   warning  jQuery collection names must match the variablePattern          no-jquery/variable-pattern
  79:39  warning  '$' is already declared in the upper scope on line 9 column 14  no-shadow

/src/repo/libs/PF_checkboxes.js
  16:8   warning  jQuery collection names must match the variablePattern          no-jquery/variable-pattern
  32:8   warning  jQuery collection names must match the variablePattern          no-jquery/variable-pattern
  39:8   warning  jQuery collection names must match the variablePattern          no-jquery/variable-pattern
  47:24  warning  '$' is already declared in the upper scope on line 7 column 14  no-shadow

/src/repo/libs/PF_collapsible.js
  27:7  warning  jQuery collection names must match the variablePattern  no-jquery/variable-pattern

/src/repo/libs/PF_CreateClass.js
   7:6  warning  jQuery collection names must match the variablePattern  no-jquery/variable-pattern
  43:3  warning  Positional selector extensions are not allowed          no-jquery/no-sizzle
  44:3  warning  Positional selector extensions are not allowed          no-jquery/no-sizzle
  47:3  warning  Positional selector extensions are not allowed          no-jquery/no-sizzle
  49:3  warning  Positional selector extensions are not allowed          no-jquery/no-sizzle
  83:6  warning  jQuery collection names must match the variablePattern  no-jquery/variable-pattern

/src/repo/libs/PF_CreateForm.js
  23:8  warning  jQuery collection names must match the variablePattern  no-jquery/variable-pattern

/src/repo/libs/PF_CreateTemplate.js
  21:6  warning  jQuery collection names must match the variablePattern  no-jquery/variable-pattern

/src/repo/libs/PF_FullCalendar.js
   192:5   warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   194:7   warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   195:7   warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   196:7   warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   204:5   warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   206:7   warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   207:7   warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   208:7   warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   209:7   warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   210:7   warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   211:7   warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   217:16  warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   218:44  warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   219:18  warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   220:16  warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   221:44  warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   222:18  warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   224:16  warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   225:8   warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   226:18  warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   227:16  warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   228:8   warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   229:18  warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   231:11  warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   232:9   warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   233:9   warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   234:9   warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   235:9   warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   236:9   warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   237:23  warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   238:11  warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   239:11  warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   240:23  warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   241:11  warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   242:11  warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   268:13  warning  'dateEntry' is already declared in the upper scope on line 61 column 4        no-shadow
   273:11  warning  'monthIndex' is already declared in the upper scope on line 63 column 58      no-shadow
   610:5   warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   612:11  warning  Where possible, maintain application state in JS to avoid slower DOM queries  no-jquery/no-class-state
   641:6   warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   642:6   warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   644:7   warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   646:7   warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   673:6   warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   674:6   warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   676:7   warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   678:7   warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   680:6   warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   681:6   warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   683:7   warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   685:7   warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   746:9   warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   748:9   warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   751:8   warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   754:7   warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   758:9   warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   764:25  warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   766:9   warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   772:11  warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   775:10  warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   791:8   warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   813:5   warning  Selector extensions are not allowed                                           no-jquery/no-sizzle
   815:11  warning  Where possible, maintain application state in JS to avoid slower DOM queries  no-jquery/no-class-state
  1059:8   warning  'ampm24h' is already declared in the upper scope on line 60 column 45         no-shadow

/src/repo/libs/PF_imagePreview.js
   4:0  warning  Invalid JSDoc tag name "licence"                  jsdoc/check-tag-names
  28:7  warning  Invalid loop. Its body allows only one iteration  no-unreachable-loop

/src/repo/libs/PF_maps.js
  136:8   warning  jQuery collection names must match the variablePattern                no-jquery/variable-pattern
  137:8   warning  jQuery collection names must match the variablePattern                no-jquery/variable-pattern
  138:8   warning  jQuery collection names must match the variablePattern                no-jquery/variable-pattern
  254:10  warning  'bounds' is already declared in the upper scope on line 200 column 8  no-shadow
  303:31  warning  'map' is already declared in the upper scope on line 8 column 6       no-shadow
  310:2   warning  Missing JSDoc @return declaration                                     jsdoc/require-returns
  314:0   warning  Missing JSDoc @param "num" type                                       jsdoc/require-param-type

/src/repo/libs/PF_maps.offline.js
   10:2   warning  Missing JSDoc @return declaration                                 jsdoc/require-returns
   14:0   warning  Missing JSDoc @param "num" type                                   jsdoc/require-param-type
  183:31  warning  'map' is already declared in the upper scope on line 20 column 6  no-shadow
  238:8   warning  jQuery collection names must match the variablePattern            no-jquery/variable-pattern
  239:8   warning  jQuery collection names must match the variablePattern            no-jquery/variable-pattern
  240:8   warning  jQuery collection names must match the variablePattern            no-jquery/variable-pattern

/src/repo/libs/PF_popupform.js
  367:3   warning  jQuery collection names must match the variablePattern                        no-jquery/variable-pattern
  368:3   warning  jQuery collection names must match the variablePattern                        no-jquery/variable-pattern
  370:7   warning  jQuery collection names must match the variablePattern                        no-jquery/variable-pattern
  372:3   warning  jQuery collection names must match the variablePattern                        no-jquery/variable-pattern
  374:7   warning  jQuery collection names must match the variablePattern                        no-jquery/variable-pattern
  376:3   warning  jQuery collection names must match the variablePattern                        no-jquery/variable-pattern
  377:3   warning  jQuery collection names must match the variablePattern                        no-jquery/variable-pattern
  378:3   warning  jQuery collection names must match the variablePattern                        no-jquery/variable-pattern
  380:7   warning  jQuery collection names must match the variablePattern                        no-jquery/variable-pattern
  435:7   warning  jQuery collection names must match the variablePattern                        no-jquery/variable-pattern
  440:8   warning  jQuery collection names must match the variablePattern                        no-jquery/variable-pattern
  447:9   warning  'iframe' is already declared in the upper scope on line 41 column 6           no-shadow
  448:9   warning  'doc' is already declared in the upper scope on line 49 column 6              no-shadow
  489:4   warning  jQuery collection names must match the variablePattern                        no-jquery/variable-pattern
  613:9   warning  jQuery collection names must match the variablePattern                        no-jquery/variable-pattern
  765:12  warning  Where possible, maintain application state in JS to avoid slower DOM queries  no-jquery/no-class-state
  779:12  warning  Where possible, maintain application state in JS to avoid slower DOM queries  no-jquery/no-class-state

/src/repo/libs/PF_preview.js
   17:2  warning  Missing JSDoc @return declaration                       jsdoc/require-returns
   22:7  warning  jQuery collection names must match the variablePattern  no-jquery/variable-pattern
   82:0  warning  Missing JSDoc @param "result" type                      jsdoc/require-param-type
   95:4  warning  jQuery collection names must match the variablePattern  no-jquery/variable-pattern
  177:2  warning  Missing JSDoc @return declaration                       jsdoc/require-returns
  183:3  warning  jQuery collection names must match the variablePattern  no-jquery/variable-pattern
  195:7  warning  jQuery collection names must match the variablePattern  no-jquery/variable-pattern

/src/repo/libs/PF_rating.js
  43:4  warning  Selector extensions are not allowed  no-jquery/no-sizzle

/src/repo/libs/PF_regexp.js
  11:0  warning  Missing JSDoc @param "inputId" type  jsdoc/require-param-type
  12:0  warning  Missing JSDoc @param "params" type   jsdoc/require-param-type
  16:0  warning  Missing JSDoc @return type           jsdoc/require-returns-type

/src/repo/libs/PF_spreadsheet.js
  324:33  warning  'templateName' is already declared in the upper scope on line 241 column 7   no-shadow
  472:9   warning  'spreadsheetID' is already declared in the upper scope on line 243 column 4  no-shadow
  473:9   warning  'columnName' is already declared in the upper scope on line 262 column 8     no-shadow
  580:11  warning  'columnName' is already declared in the upper scope on line 262 column 8     no-shadow
  617:10  warning  'spreadsheetID' is already declared in the upper scope on line 243 column 4  no-shadow
  621:36  warning  'spreadsheetID' is already declared in the upper scope on line 243 column 4  no-shadow
  624:16  warning  'columnNum' is already declared in the upper scope on line 579 column 16     no-shadow
  641:22  warning  Positional selector extensions are not allowed                               no-jquery/no-sizzle
  644:10  warning  jQuery collection names must match the variablePattern                       no-jquery/variable-pattern

/src/repo/libs/PF_submit.js
   27:0   warning  Missing JSDoc @param "result" type                                 jsdoc/require-param-type
   28:0   warning  Missing JSDoc @param "textStatus" type                             jsdoc/require-param-type
   29:0   warning  Missing JSDoc @param "jqXHR" type                                  jsdoc/require-param-type
   37:4   warning  jQuery collection names must match the variablePattern             no-jquery/variable-pattern
   47:4   warning  jQuery collection names must match the variablePattern             no-jquery/variable-pattern
   85:24  warning  'form' is already declared in the upper scope on line 14 column 6  no-shadow
   86:7   warning  jQuery collection names must match the variablePattern             no-jquery/variable-pattern
  156:8   warning  jQuery collection names must match the variablePattern             no-jquery/variable-pattern
  156:8   warning  'form' is already declared in the upper scope on line 14 column 6  no-shadow
  196:4   warning  jQuery collection names must match the variablePattern             no-jquery/variable-pattern
  198:4   warning  jQuery collection names must match the variablePattern             no-jquery/variable-pattern

/src/repo/libs/PF_timepicker.js
   11:0  warning  Missing JSDoc @param "inputID" type                     jsdoc/require-param-type
   12:0  warning  Missing JSDoc @param "params" type                      jsdoc/require-param-type
   23:6  warning  jQuery collection names must match the variablePattern  no-jquery/variable-pattern
   31:3  warning  jQuery collection names must match the variablePattern  no-jquery/variable-pattern
   49:6  warning  jQuery collection names must match the variablePattern  no-jquery/variable-pattern
   64:9  warning  Selector extensions are not allowed                     no-jquery/no-sizzle
   74:6  warning  jQuery collection names must match the variablePattern  no-jquery/variable-pattern
  120:6  warning  jQuery collection names must match the variablePattern  no-jquery/variable-pattern
  122:6  warning  jQuery collection names must match the variablePattern  no-jquery/variable-pattern
  127:7  warning  jQuery collection names must match the variablePattern  no-jquery/variable-pattern
  134:7  warning  jQuery collection names must match the variablePattern  no-jquery/variable-pattern
  138:8  warning  jQuery collection names must match the variablePattern  no-jquery/variable-pattern

/src/repo/libs/PF_tree.js
  50:7  warning  jQuery collection names must match the variablePattern  no-jquery/variable-pattern
  63:7  warning  jQuery collection names must match the variablePattern  no-jquery/variable-pattern
  72:8  warning  jQuery collection names must match the variablePattern  no-jquery/variable-pattern

/src/repo/libs/PF_wikieditor.js
  14:9  warning  jQuery collection names must match the variablePattern  no-jquery/variable-pattern

✖ 196 problems (0 errors, 196 warnings)


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

Done.

$ git add .

$ git commit -F /tmp/tmpfnwwe7nh
[master 60c9da5] build: Updating eslint-config-wikimedia to 0.18.2
 2 files changed, 360 insertions(+), 648 deletions(-)

$ git format-patch HEAD~1 --stdout
From 60c9da590ea68df95b95ce4ef8746ac086fdaafb Mon Sep 17 00:00:00 2001
From: libraryupgrader <tools.libraryupgrader@tools.wmflabs.org>
Date: Sun, 7 Mar 2021 11:59:37 +0000
Subject: [PATCH] build: Updating eslint-config-wikimedia to 0.18.2

Change-Id: Ibaac8719890ac08100a98b370295912f262e66b0
---
 package-lock.json | 1006 ++++++++++++++++-----------------------------
 package.json      |    2 +-
 2 files changed, 360 insertions(+), 648 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 78306ac..c4b1159 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -3,32 +3,49 @@
 	"lockfileVersion": 1,
 	"dependencies": {
 		"@babel/code-frame": {
-			"version": "7.10.4",
-			"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz",
-			"integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==",
+			"version": "7.12.11",
+			"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz",
+			"integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==",
+			"dev": true,
 			"requires": {
 				"@babel/highlight": "^7.10.4"
 			}
 		},
 		"@babel/helper-validator-identifier": {
-			"version": "7.10.4",
-			"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz",
-			"integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw=="
+			"version": "7.12.11",
+			"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz",
+			"integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==",
+			"dev": true
 		},
 		"@babel/highlight": {
-			"version": "7.10.4",
-			"resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz",
-			"integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==",
+			"version": "7.13.8",
+			"resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.8.tgz",
+			"integrity": "sha512-4vrIhfJyfNf+lCtXC2ck1rKSzDwciqF7IWFhXXrSOUC2O5DrVp+w4c6ed4AllTxhTkUP5x2tYj41VaxdVMMRDw==",
+			"dev": true,
 			"requires": {
-				"@babel/helper-validator-identifier": "^7.10.4",
+				"@babel/helper-validator-identifier": "^7.12.11",
 				"chalk": "^2.0.0",
 				"js-tokens": "^4.0.0"
+			},
+			"dependencies": {
+				"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"
+					}
+				}
 			}
 		},
 		"@eslint/eslintrc": {
-			"version": "0.3.0",
-			"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.3.0.tgz",
-			"integrity": "sha512-1JTKgrOKAHVivSvOYw+sJOunkBjUOvjqWk1DPja7ZFhIS2mX/4EgTT8M7eTK9jrKhL/FvXXEbQwIs3pg1xp3dg==",
+			"version": "0.4.0",
+			"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.0.tgz",
+			"integrity": "sha512-2ZPCc+uNbjV5ERJr+aKSPRwZgKd2z11x0EgLvb1PURmUrn9QNRXFqje0Ldq454PfAVyaJYyrDvvIKSFP4NnBog==",
+			"dev": true,
 			"requires": {
 				"ajv": "^6.12.4",
 				"debug": "^4.1.1",
@@ -37,27 +54,8 @@
 				"ignore": "^4.0.6",
 				"import-fresh": "^3.2.1",
 				"js-yaml": "^3.13.1",
-				"lodash": "^4.17.20",
 				"minimatch": "^3.0.4",
 				"strip-json-comments": "^3.1.1"
-			},
-			"dependencies": {
-				"ajv": {
-					"version": "6.12.6",
-					"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
-					"integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
-					"requires": {
-						"fast-deep-equal": "^3.1.1",
-						"fast-json-stable-stringify": "^2.0.0",
-						"json-schema-traverse": "^0.4.1",
-						"uri-js": "^4.2.2"
-					}
-				},
-				"lodash": {
-					"version": "4.17.20",
-					"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz",
-					"integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA=="
-				}
 			}
 		},
 		"@mdn/browser-compat-data": {
@@ -84,18 +82,20 @@
 		"acorn": {
 			"version": "7.4.1",
 			"resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
-			"integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A=="
+			"integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
+			"dev": true
 		},
 		"acorn-jsx": {
-			"version": "5.2.0",
-			"resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz",
-			"integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==",
+			"version": "5.3.1",
+			"resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz",
+			"integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==",
 			"dev": true
 		},
 		"ajv": {
-			"version": "6.12.3",
-			"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz",
-			"integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==",
+			"version": "6.12.6",
+			"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+			"integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+			"dev": true,
 			"requires": {
 				"fast-deep-equal": "^3.1.1",
 				"fast-json-stable-stringify": "^2.0.0",
@@ -106,17 +106,20 @@
 		"ansi-colors": {
 			"version": "4.1.1",
 			"resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
-			"integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA=="
+			"integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==",
+			"dev": true
 		},
 		"ansi-regex": {
 			"version": "5.0.0",
 			"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
-			"integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg=="
+			"integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
+			"dev": true
 		},
 		"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"
 			}
@@ -125,6 +128,7 @@
 			"version": "1.0.10",
 			"resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
 			"integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+			"dev": true,
 			"requires": {
 				"sprintf-js": "~1.0.2"
 			},
@@ -132,7 +136,8 @@
 				"sprintf-js": {
 					"version": "1.0.3",
 					"resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
-					"integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw="
+					"integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
+					"dev": true
 				}
 			}
 		},
@@ -187,7 +192,8 @@
 		"astral-regex": {
 			"version": "2.0.0",
 			"resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
-			"integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ=="
+			"integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
+			"dev": true
 		},
 		"async": {
 			"version": "1.5.2",
@@ -204,7 +210,8 @@
 		"balanced-match": {
 			"version": "1.0.0",
 			"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
-			"integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
+			"integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+			"dev": true
 		},
 		"base": {
 			"version": "0.11.2",
@@ -265,6 +272,7 @@
 			"version": "1.1.11",
 			"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
 			"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+			"dev": true,
 			"requires": {
 				"balanced-match": "^1.0.0",
 				"concat-map": "0.0.1"
@@ -300,16 +308,16 @@
 			}
 		},
 		"browserslist": {
-			"version": "4.16.1",
-			"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.1.tgz",
-			"integrity": "sha512-UXhDrwqsNcpTYJBTZsbGATDxZbiVDsx6UjpmRUmtnP10pr8wAYr5LgFoEFw9ixriQH2mv/NX2SfGzE/o8GndLA==",
+			"version": "4.16.3",
+			"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.3.tgz",
+			"integrity": "sha512-vIyhWmIkULaq04Gt93txdh+j02yX/JzlyhLYbV3YQCn/zvES3JnY7TifHHvvr1w5hTDluNKMkV05cs4vy8Q7sw==",
 			"dev": true,
 			"requires": {
-				"caniuse-lite": "^1.0.30001173",
+				"caniuse-lite": "^1.0.30001181",
 				"colorette": "^1.2.1",
-				"electron-to-chromium": "^1.3.634",
+				"electron-to-chromium": "^1.3.649",
 				"escalade": "^3.1.1",
-				"node-releases": "^1.1.69"
+				"node-releases": "^1.1.70"
 			}
 		},
 		"cache-base": {
@@ -332,22 +340,64 @@
 		"callsites": {
 			"version": "3.1.0",
 			"resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
-			"integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="
+			"integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+			"dev": true
 		},
 		"caniuse-lite": {
-			"version": "1.0.30001181",
-			"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001181.tgz",
-			"integrity": "sha512-m5ul/ARCX50JB8BSNM+oiPmQrR5UmngaQ3QThTTp5HcIIQGP/nPBs82BYLE+tigzm3VW+F4BJIhUyaVtEweelQ==",
+			"version": "1.0.30001196",
+			"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001196.tgz",
+			"integrity": "sha512-CPvObjD3ovWrNBaXlAIGWmg2gQQuJ5YhuciUOjPRox6hIQttu8O+b51dx6VIpIY9ESd2d0Vac1RKpICdG4rGUg==",
 			"dev": true
 		},
 		"chalk": {
-			"version": "2.4.2",
-			"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
-			"integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+			"version": "4.1.0",
+			"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+			"integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+			"dev": true,
 			"requires": {
-				"ansi-styles": "^3.2.1",
-				"escape-string-regexp": "^1.0.5",
-				"supports-color": "^5.3.0"
+				"ansi-styles": "^4.1.0",
+				"supports-color": "^7.1.0"
+			},
+			"dependencies": {
+				"ansi-styles": {
+					"version": "4.3.0",
+					"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+					"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+					"dev": true,
+					"requires": {
+						"color-convert": "^2.0.1"
+					}
+				},
+				"color-convert": {
+					"version": "2.0.1",
+					"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+					"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+					"dev": true,
+					"requires": {
+						"color-name": "~1.1.4"
+					}
+				},
+				"color-name": {
+					"version": "1.1.4",
+					"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+					"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+					"dev": true
+				},
+				"has-flag": {
+					"version": "4.0.0",
+					"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+					"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+					"dev": true
+				},
+				"supports-color": {
+					"version": "7.2.0",
+					"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+					"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+					"dev": true,
+					"requires": {
+						"has-flag": "^4.0.0"
+					}
+				}
 			}
 		},
 		"class-utils": {
@@ -387,6 +437,7 @@
 			"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"
 			}
@@ -394,12 +445,13 @@
 		"color-name": {
 			"version": "1.1.3",
 			"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
-			"integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
+			"integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+			"dev": true
 		},
 		"colorette": {
-			"version": "1.2.1",
-			"resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.1.tgz",
-			"integrity": "sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw==",
+			"version": "1.2.2",
+			"resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz",
+			"integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==",
 			"dev": true
 		},
 		"colors": {
@@ -423,7 +475,8 @@
 		"concat-map": {
 			"version": "0.0.1",
 			"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
-			"integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
+			"integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+			"dev": true
 		},
 		"copy-descriptor": {
 			"version": "0.1.1",
@@ -432,15 +485,16 @@
 			"dev": true
 		},
 		"core-js": {
-			"version": "3.8.3",
-			"resolved": "https://registry.npmjs.org/core-js/-/core-js-3.8.3.tgz",
-			"integrity": "sha512-KPYXeVZYemC2TkNEkX/01I+7yd+nX3KddKwZ1Ww7SKWdI2wQprSgLmrTddT8nw92AjEklTsPBoSdQBhbI1bQ6Q==",
+			"version": "3.9.1",
+			"resolved": "https://registry.npmjs.org/core-js/-/core-js-3.9.1.tgz",
+			"integrity": "sha512-gSjRvzkxQc1zjM/5paAmL4idJBFzuJoo+jDjF1tStYFMV2ERfD02HhahhCGXUyHxQRG4yFKVSdO6g62eoRMcDg==",
 			"dev": true
 		},
 		"cross-spawn": {
 			"version": "7.0.3",
 			"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
 			"integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+			"dev": true,
 			"requires": {
 				"path-key": "^3.1.0",
 				"shebang-command": "^2.0.0",
@@ -451,6 +505,7 @@
 					"version": "2.0.2",
 					"resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
 					"integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+					"dev": true,
 					"requires": {
 						"isexe": "^2.0.0"
 					}
@@ -467,6 +522,7 @@
 			"version": "4.1.1",
 			"resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
 			"integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+			"dev": true,
 			"requires": {
 				"ms": "^2.1.1"
 			}
@@ -480,7 +536,8 @@
 		"deep-is": {
 			"version": "0.1.3",
 			"resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
-			"integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ="
+			"integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
+			"dev": true
 		},
 		"define-property": {
 			"version": "2.0.2",
@@ -533,25 +590,28 @@
 			"version": "3.0.0",
 			"resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
 			"integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+			"dev": true,
 			"requires": {
 				"esutils": "^2.0.2"
 			}
 		},
 		"electron-to-chromium": {
-			"version": "1.3.649",
-			"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.649.tgz",
-			"integrity": "sha512-ojGDupQ3UMkvPWcTICe4JYe17+o9OLiFMPoduoR72Zp2ILt1mRVeqnxBEd6s/ptekrnsFU+0A4lStfBe/wyG/A==",
+			"version": "1.3.682",
+			"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.682.tgz",
+			"integrity": "sha512-zok2y37qR00U14uM6qBz/3iIjWHom2eRfC2S1StA0RslP7x34jX+j4mxv80t8OEOHLJPVG54ZPeaFxEI7gPrwg==",
 			"dev": true
 		},
 		"emoji-regex": {
 			"version": "8.0.0",
 			"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
-			"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
+			"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+			"dev": true
 		},
 		"enquirer": {
 			"version": "2.3.6",
 			"resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz",
 			"integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==",
+			"dev": true,
 			"requires": {
 				"ansi-colors": "^4.1.1"
 			}
@@ -565,15 +625,17 @@
 		"escape-string-regexp": {
 			"version": "1.0.5",
 			"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
-			"integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
+			"integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+			"dev": true
 		},
 		"eslint": {
-			"version": "7.18.0",
-			"resolved": "https://registry.npmjs.org/eslint/-/eslint-7.18.0.tgz",
-			"integrity": "sha512-fbgTiE8BfUJZuBeq2Yi7J3RB3WGUQ9PNuNbmgi6jt9Iv8qrkxfy19Ds3OpL1Pm7zg3BtTVhvcUZbIRQ0wmSjAQ==",
+			"version": "7.21.0",
+			"resolved": "https://registry.npmjs.org/eslint/-/eslint-7.21.0.tgz",
+			"integrity": "sha512-W2aJbXpMNofUp0ztQaF40fveSsJBjlSCSWpy//gzfTvwC+USs/nceBrKmlJOiM8r1bLwP2EuYkCqArn/6QTIgg==",
+			"dev": true,
 			"requires": {
-				"@babel/code-frame": "^7.0.0",
-				"@eslint/eslintrc": "^0.3.0",
+				"@babel/code-frame": "7.12.11",
+				"@eslint/eslintrc": "^0.4.0",
 				"ajv": "^6.10.0",
 				"chalk": "^4.0.0",
 				"cross-spawn": "^7.0.2",
@@ -584,9 +646,9 @@
 				"eslint-utils": "^2.1.0",
 				"eslint-visitor-keys": "^2.0.0",
 				"espree": "^7.3.1",
-				"esquery": "^1.2.0",
+				"esquery": "^1.4.0",
 				"esutils": "^2.0.2",
-				"file-entry-cache": "^6.0.0",
+				"file-entry-cache": "^6.0.1",
 				"functional-red-black-tree": "^1.0.1",
 				"glob-parent": "^5.0.0",
 				"globals": "^12.1.0",
@@ -611,89 +673,24 @@
 				"v8-compile-cache": "^2.0.3"
 			},
 			"dependencies": {
-				"ansi-styles": {
-					"version": "4.3.0",
-					"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-					"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-					"requires": {
-						"color-convert": "^2.0.1"
-					}
-				},
-				"chalk": {
-					"version": "4.1.0",
-					"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
-					"integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
-					"requires": {
-						"ansi-styles": "^4.1.0",
-						"supports-color": "^7.1.0"
-					}
-				},
-				"color-convert": {
-					"version": "2.0.1",
-					"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-					"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-					"requires": {
-						"color-name": "~1.1.4"
-					}
-				},
-				"color-name": {
-					"version": "1.1.4",
-					"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-					"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
-				},
-				"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==",
-					"requires": {
-						"esrecurse": "^4.3.0",
-						"estraverse": "^4.1.1"
-					}
-				},
 				"eslint-visitor-keys": {
 					"version": "2.0.0",
 					"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz",
-					"integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ=="
-				},
-				"esrecurse": {
-					"version": "4.3.0",
-					"resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
-					"integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
-					"requires": {
-						"estraverse": "^5.2.0"
-					},
-					"dependencies": {
-						"estraverse": {
-							"version": "5.2.0",
-							"resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
-							"integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ=="
-						}
-					}
-				},
-				"has-flag": {
-					"version": "4.0.0",
-					"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-					"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+					"integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==",
+					"dev": true
 				},
 				"lodash": {
-					"version": "4.17.20",
-					"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz",
-					"integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA=="
-				},
-				"supports-color": {
-					"version": "7.2.0",
-					"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-					"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-					"requires": {
-						"has-flag": "^4.0.0"
-					}
+					"version": "4.17.21",
+					"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+					"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+					"dev": true
 				}
 			}
 		},
 		"eslint-config-wikimedia": {
-			"version": "0.18.1",
-			"resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.18.1.tgz",
-			"integrity": "sha512-93nHVH4CGxYwelbTjJQLr0xqn4XIe9WwWeGL4wMnELZW/Aceg52aT7AgIdV0659ReLzrCgxLPDvbeqB47LjBTQ==",
+			"version": "0.18.2",
+			"resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.18.2.tgz",
+			"integrity": "sha512-OllUgce2qODU/6481jg/a1kT/dygBDY1xhxXuAiQdYxJARV6LXyuiJw+wl1QBQz+huV9NXRxoJGC3L6x/NzC4g==",
 			"dev": true,
 			"requires": {
 				"eslint": "^7.17.0",
@@ -701,311 +698,13 @@
 				"eslint-plugin-es": "^4.1.0",
 				"eslint-plugin-jsdoc": "^30.7.13",
 				"eslint-plugin-json-es": "^1.5.1",
-				"eslint-plugin-mediawiki": "^0.2.6",
+				"eslint-plugin-mediawiki": "^0.2.7",
 				"eslint-plugin-mocha": "^8.0.0",
 				"eslint-plugin-no-jquery": "^2.5.0",
 				"eslint-plugin-node": "^11.1.0",
 				"eslint-plugin-qunit": "^5.2.0",
-				"eslint-plugin-vue": "^7.4.1",
+				"eslint-plugin-vue": "^7.7.0",
 				"eslint-plugin-wdio": "^6.0.12"
-			},
-			"dependencies": {
-				"@eslint/eslintrc": {
-					"version": "0.3.0",
-					"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.3.0.tgz",
-					"integrity": "sha512-1JTKgrOKAHVivSvOYw+sJOunkBjUOvjqWk1DPja7ZFhIS2mX/4EgTT8M7eTK9jrKhL/FvXXEbQwIs3pg1xp3dg==",
-					"dev": true,
-					"requires": {
-						"ajv": "^6.12.4",
-						"debug": "^4.1.1",
-						"espree": "^7.3.0",
-						"globals": "^12.1.0",
-						"ignore": "^4.0.6",
-						"import-fresh": "^3.2.1",
-						"js-yaml": "^3.13.1",
-						"lodash": "^4.17.20",
-						"minimatch": "^3.0.4",
-						"strip-json-comments": "^3.1.1"
-					},
-					"dependencies": {
-						"ajv": {
-							"version": "6.12.6",
-							"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
-							"integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
-							"dev": true,
-							"requires": {
-								"fast-deep-equal": "^3.1.1",
-								"fast-json-stable-stringify": "^2.0.0",
-								"json-schema-traverse": "^0.4.1",
-								"uri-js": "^4.2.2"
-							}
-						}
-					}
-				},
-				"acorn-jsx": {
-					"version": "5.3.1",
-					"resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz",
-					"integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==",
-					"dev": true
-				},
-				"ansi-styles": {
-					"version": "4.3.0",
-					"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-					"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-					"dev": true,
-					"requires": {
-						"color-convert": "^2.0.1"
-					}
-				},
-				"astral-regex": {
-					"version": "2.0.0",
-					"resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
-					"integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
-					"dev": true
-				},
-				"chalk": {
-					"version": "4.1.0",
-					"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
-					"integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
-					"dev": true,
-					"requires": {
-						"ansi-styles": "^4.1.0",
-						"supports-color": "^7.1.0"
-					}
-				},
-				"color-convert": {
-					"version": "2.0.1",
-					"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-					"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-					"dev": true,
-					"requires": {
-						"color-name": "~1.1.4"
-					}
-				},
-				"color-name": {
-					"version": "1.1.4",
-					"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-					"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-					"dev": true
-				},
-				"emoji-regex": {
-					"version": "8.0.0",
-					"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
-					"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
-					"dev": true
-				},
-				"eslint": {
-					"version": "7.18.0",
-					"resolved": "https://registry.npmjs.org/eslint/-/eslint-7.18.0.tgz",
-					"integrity": "sha512-fbgTiE8BfUJZuBeq2Yi7J3RB3WGUQ9PNuNbmgi6jt9Iv8qrkxfy19Ds3OpL1Pm7zg3BtTVhvcUZbIRQ0wmSjAQ==",
-					"dev": true,
-					"requires": {
-						"@babel/code-frame": "^7.0.0",
-						"@eslint/eslintrc": "^0.3.0",
-						"ajv": "^6.10.0",
-						"chalk": "^4.0.0",
-						"cross-spawn": "^7.0.2",
-						"debug": "^4.0.1",
-						"doctrine": "^3.0.0",
-						"enquirer": "^2.3.5",
-						"eslint-scope": "^5.1.1",
-						"eslint-utils": "^2.1.0",
-						"eslint-visitor-keys": "^2.0.0",
-						"espree": "^7.3.1",
-						"esquery": "^1.2.0",
-						"esutils": "^2.0.2",
-						"file-entry-cache": "^6.0.0",
-						"functional-red-black-tree": "^1.0.1",
-						"glob-parent": "^5.0.0",
-						"globals": "^12.1.0",
-						"ignore": "^4.0.6",
-						"import-fresh": "^3.0.0",
-						"imurmurhash": "^0.1.4",
-						"is-glob": "^4.0.0",
-						"js-yaml": "^3.13.1",
-						"json-stable-stringify-without-jsonify": "^1.0.1",
-						"levn": "^0.4.1",
-						"lodash": "^4.17.20",
-						"minimatch": "^3.0.4",
-						"natural-compare": "^1.4.0",
-						"optionator": "^0.9.1",
-						"progress": "^2.0.0",
-						"regexpp": "^3.1.0",
-						"semver": "^7.2.1",
-						"strip-ansi": "^6.0.0",
-						"strip-json-comments": "^3.1.0",
-						"table": "^6.0.4",
-						"text-table": "^0.2.0",
-						"v8-compile-cache": "^2.0.3"
-					}
-				},
-				"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==",
-					"dev": true,
-					"requires": {
-						"esrecurse": "^4.3.0",
-						"estraverse": "^4.1.1"
-					}
-				},
-				"eslint-visitor-keys": {
-					"version": "2.0.0",
-					"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz",
-					"integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==",
-					"dev": true
-				},
-				"espree": {
-					"version": "7.3.1",
-					"resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz",
-					"integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==",
-					"dev": true,
-					"requires": {
-						"acorn": "^7.4.0",
-						"acorn-jsx": "^5.3.1",
-						"eslint-visitor-keys": "^1.3.0"
-					},
-					"dependencies": {
-						"eslint-visitor-keys": {
-							"version": "1.3.0",
-							"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
-							"integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
-							"dev": true
-						}
-					}
-				},
-				"esrecurse": {
-					"version": "4.3.0",
-					"resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
-					"integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
-					"dev": true,
-					"requires": {
-						"estraverse": "^5.2.0"
-					},
-					"dependencies": {
-						"estraverse": {
-							"version": "5.2.0",
-							"resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
-							"integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==",
-							"dev": true
-						}
-					}
-				},
-				"file-entry-cache": {
-					"version": "6.0.0",
-					"resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.0.tgz",
-					"integrity": "sha512-fqoO76jZ3ZnYrXLDRxBR1YvOvc0k844kcOg40bgsPrE25LAb/PDqTY+ho64Xh2c8ZXgIKldchCFHczG2UVRcWA==",
-					"dev": true,
-					"requires": {
-						"flat-cache": "^3.0.4"
-					}
-				},
-				"flat-cache": {
-					"version": "3.0.4",
-					"resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
-					"integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
-					"dev": true,
-					"requires": {
-						"flatted": "^3.1.0",
-						"rimraf": "^3.0.2"
-					}
-				},
-				"flatted": {
-					"version": "3.1.1",
-					"resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz",
-					"integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==",
-					"dev": true
-				},
-				"has-flag": {
-					"version": "4.0.0",
-					"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-					"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-					"dev": true
-				},
-				"is-fullwidth-code-point": {
-					"version": "3.0.0",
-					"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
-					"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
-					"dev": true
-				},
-				"lodash": {
-					"version": "4.17.20",
-					"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz",
-					"integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==",
-					"dev": true
-				},
-				"rimraf": {
-					"version": "3.0.2",
-					"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
-					"integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
-					"dev": true,
-					"requires": {
-						"glob": "^7.1.3"
-					}
-				},
-				"slice-ansi": {
-					"version": "4.0.0",
-					"resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
-					"integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
-					"dev": true,
-					"requires": {
-						"ansi-styles": "^4.0.0",
-						"astral-regex": "^2.0.0",
-						"is-fullwidth-code-point": "^3.0.0"
-					}
-				},
-				"string-width": {
-					"version": "4.2.0",
-					"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
-					"integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
-					"dev": true,
-					"requires": {
-						"emoji-regex": "^8.0.0",
-						"is-fullwidth-code-point": "^3.0.0",
-						"strip-ansi": "^6.0.0"
-					}
-				},
-				"supports-color": {
-					"version": "7.2.0",
-					"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-					"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-					"dev": true,
-					"requires": {
-						"has-flag": "^4.0.0"
-					}
-				},
-				"table": {
-					"version": "6.0.7",
-					"resolved": "https://registry.npmjs.org/table/-/table-6.0.7.tgz",
-					"integrity": "sha512-rxZevLGTUzWna/qBLObOe16kB2RTnnbhciwgPbMMlazz1yZGVEgnZK762xyVdVznhqxrfCeBMmMkgOOaPwjH7g==",
-					"dev": true,
-					"requires": {
-						"ajv": "^7.0.2",
-						"lodash": "^4.17.20",
-						"slice-ansi": "^4.0.0",
-						"string-width": "^4.2.0"
-					},
-					"dependencies": {
-						"ajv": {
-							"version": "7.0.3",
-							"resolved": "https://registry.npmjs.org/ajv/-/ajv-7.0.3.tgz",
-							"integrity": "sha512-R50QRlXSxqXcQP5SvKUrw8VZeypvo12i2IX0EeR5PiZ7bEKeHWgzgo264LDadUsCU42lTJVhFikTqJwNeH34gQ==",
-							"dev": true,
-							"requires": {
-								"fast-deep-equal": "^3.1.1",
-								"json-schema-traverse": "^1.0.0",
-								"require-from-string": "^2.0.2",
-								"uri-js": "^4.2.2"
-							}
-						},
-						"json-schema-traverse": {
-							"version": "1.0.0",
-							"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
-							"integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
-							"dev": true
-						}
-					}
-				}
 			}
 		},
 		"eslint-plugin-compat": {
@@ -1059,9 +758,9 @@
 					}
 				},
 				"lodash": {
-					"version": "4.17.20",
-					"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz",
-					"integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==",
+					"version": "4.17.21",
+					"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+					"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
 					"dev": true
 				},
 				"semver": {
@@ -1076,67 +775,37 @@
 			}
 		},
 		"eslint-plugin-json-es": {
-			"version": "1.5.1",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-json-es/-/eslint-plugin-json-es-1.5.1.tgz",
-			"integrity": "sha512-YMzAWMcmKOYWiH0MsN3JOr0AdtZ2Rvmk3YmscsX1rHYJZRsL4KRo+yj9ktRk7S7mgy+G5TORWJ5D3/vH/u7R5A==",
+			"version": "1.5.3",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-json-es/-/eslint-plugin-json-es-1.5.3.tgz",
+			"integrity": "sha512-9wWjwhoN+ipMel70ktkWy0H7jj9sm5OAbAy3N3F3AT0swpIofVsIjDXyjGZJwSzy9tZzDtI/aKIj2WsqMHw2QA==",
 			"dev": true,
 			"requires": {
-				"eslint-visitor-keys": "^1.3.0",
+				"eslint-visitor-keys": "^2.0.0",
 				"espree": "^7.3.1"
 			},
 			"dependencies": {
-				"acorn-jsx": {
-					"version": "5.3.1",
-					"resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz",
-					"integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==",
+				"eslint-visitor-keys": {
+					"version": "2.0.0",
+					"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz",
+					"integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==",
 					"dev": true
-				},
-				"espree": {
-					"version": "7.3.1",
-					"resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz",
-					"integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==",
-					"dev": true,
-					"requires": {
-						"acorn": "^7.4.0",
-						"acorn-jsx": "^5.3.1",
-						"eslint-visitor-keys": "^1.3.0"
-					}
 				}
 			}
 		},
 		"eslint-plugin-mediawiki": {
-			"version": "0.2.6",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-mediawiki/-/eslint-plugin-mediawiki-0.2.6.tgz",
-			"integrity": "sha512-e7gx15H39ceam9AnSr6DDyfhMM9L43PVagHzclH3CF33DvWKi/OA+j2dqzJTuJcl5P/EmVIQHG5qoTaepkADsw==",
+			"version": "0.2.7",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-mediawiki/-/eslint-plugin-mediawiki-0.2.7.tgz",
+			"integrity": "sha512-2ZvPvLEwCIqrJxV1349bdX5Q03c30WccuUMCfB1Gh2IVxbBSrY0gbzOk/gPZeYigVhODt9xoFWUCIz8jwTWfrA==",
 			"dev": true,
 			"requires": {
-				"eslint-plugin-vue": "^6.2.2",
+				"eslint-plugin-vue": "^7.7.0",
 				"upath": "^1.2.0"
-			},
-			"dependencies": {
-				"eslint-plugin-vue": {
-					"version": "6.2.2",
-					"resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-6.2.2.tgz",
-					"integrity": "sha512-Nhc+oVAHm0uz/PkJAWscwIT4ijTrK5fqNqz9QB1D35SbbuMG1uB6Yr5AJpvPSWg+WOw7nYNswerYh0kOk64gqQ==",
-					"dev": true,
-					"requires": {
-						"natural-compare": "^1.4.0",
-						"semver": "^5.6.0",
-						"vue-eslint-parser": "^7.0.0"
-					}
-				},
-				"semver": {
-					"version": "5.7.1",
-					"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
-					"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
-					"dev": true
-				}
 			}
 		},
 		"eslint-plugin-mocha": {
-			"version": "8.0.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-8.0.0.tgz",
-			"integrity": "sha512-n67etbWDz6NQM+HnTwZHyBwz/bLlYPOxUbw7bPuCyFujv7ZpaT/Vn6KTAbT02gf7nRljtYIjWcTxK/n8a57rQQ==",
+			"version": "8.1.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-8.1.0.tgz",
+			"integrity": "sha512-1EgHvXKRl7W3mq3sntZAi5T24agRMyiTPL4bSXe+B4GksYOjAPEWYx+J3eJg4It1l2NMNZJtk0gQyQ6mfiPhQg==",
 			"dev": true,
 			"requires": {
 				"eslint-utils": "^2.1.0",
@@ -1198,15 +867,15 @@
 			}
 		},
 		"eslint-plugin-vue": {
-			"version": "7.5.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-7.5.0.tgz",
-			"integrity": "sha512-QnMMTcyV8PLxBz7QQNAwISSEs6LYk2LJvGlxalXvpCtfKnqo7qcY0aZTIxPe8QOnHd7WCwiMZLOJzg6A03T0Gw==",
+			"version": "7.7.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-7.7.0.tgz",
+			"integrity": "sha512-mYz4bpLGv5jx6YG/GvKkqbGSfV7uma2u1P3mLA41Q5vQl8W1MeuTneB8tfsLq6xxxesFubcrOC0BZBJ5R+eaCQ==",
 			"dev": true,
 			"requires": {
 				"eslint-utils": "^2.1.0",
 				"natural-compare": "^1.4.0",
 				"semver": "^7.3.2",
-				"vue-eslint-parser": "^7.4.1"
+				"vue-eslint-parser": "^7.6.0"
 			}
 		},
 		"eslint-plugin-wdio": {
@@ -1216,12 +885,12 @@
 			"dev": true
 		},
 		"eslint-scope": {
-			"version": "5.1.0",
-			"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.0.tgz",
-			"integrity": "sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w==",
+			"version": "5.1.1",
+			"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
+			"integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
 			"dev": true,
 			"requires": {
-				"esrecurse": "^4.1.0",
+				"esrecurse": "^4.3.0",
 				"estraverse": "^4.1.1"
 			}
 		},
@@ -1229,6 +898,7 @@
 			"version": "2.1.0",
 			"resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz",
 			"integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==",
+			"dev": true,
 			"requires": {
 				"eslint-visitor-keys": "^1.1.0"
 			}
@@ -1236,12 +906,14 @@
 		"eslint-visitor-keys": {
 			"version": "1.3.0",
 			"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
-			"integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ=="
+			"integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
+			"dev": true
 		},
 		"espree": {
 			"version": "7.3.1",
 			"resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz",
 			"integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==",
+			"dev": true,
 			"requires": {
 				"acorn": "^7.4.0",
 				"acorn-jsx": "^5.3.1",
@@ -1251,48 +923,62 @@
 				"acorn-jsx": {
 					"version": "5.3.1",
 					"resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz",
-					"integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng=="
+					"integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==",
+					"dev": true
 				}
 			}
 		},
 		"esprima": {
 			"version": "4.0.1",
 			"resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
-			"integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="
+			"integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+			"dev": true
 		},
 		"esquery": {
-			"version": "1.3.1",
-			"resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz",
-			"integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==",
+			"version": "1.4.0",
+			"resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz",
+			"integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==",
+			"dev": true,
 			"requires": {
 				"estraverse": "^5.1.0"
 			},
 			"dependencies": {
 				"estraverse": {
-					"version": "5.1.0",
-					"resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.1.0.tgz",
-					"integrity": "sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw=="
+					"version": "5.2.0",
+					"resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
+					"integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==",
+					"dev": true
 				}
 			}
 		},
 		"esrecurse": {
-			"version": "4.2.1",
-			"resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz",
-			"integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==",
+			"version": "4.3.0",
+			"resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+			"integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
 			"dev": true,
 			"requires": {
-				"estraverse": "^4.1.0"
+				"estraverse": "^5.2.0"
+			},
+			"dependencies": {
+				"estraverse": {
+					"version": "5.2.0",
+					"resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
+					"integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==",
+					"dev": true
+				}
 			}
 		},
 		"estraverse": {
 			"version": "4.3.0",
 			"resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
-			"integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw=="
+			"integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+			"dev": true
 		},
 		"esutils": {
 			"version": "2.0.3",
 			"resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
-			"integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="
+			"integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+			"dev": true
 		},
 		"eventemitter2": {
 			"version": "0.4.14",
@@ -1460,22 +1146,26 @@
 		"fast-deep-equal": {
 			"version": "3.1.3",
 			"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
-			"integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
+			"integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+			"dev": true
 		},
 		"fast-json-stable-stringify": {
 			"version": "2.1.0",
 			"resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
-			"integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
+			"integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+			"dev": true
 		},
 		"fast-levenshtein": {
 			"version": "2.0.6",
 			"resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
-			"integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc="
+			"integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+			"dev": true
 		},
 		"file-entry-cache": {
-			"version": "6.0.0",
-			"resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.0.tgz",
-			"integrity": "sha512-fqoO76jZ3ZnYrXLDRxBR1YvOvc0k844kcOg40bgsPrE25LAb/PDqTY+ho64Xh2c8ZXgIKldchCFHczG2UVRcWA==",
+			"version": "6.0.1",
+			"resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
+			"integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
+			"dev": true,
 			"requires": {
 				"flat-cache": "^3.0.4"
 			}
@@ -1560,6 +1250,7 @@
 			"version": "3.0.4",
 			"resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
 			"integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
+			"dev": true,
 			"requires": {
 				"flatted": "^3.1.0",
 				"rimraf": "^3.0.2"
@@ -1568,7 +1259,8 @@
 		"flatted": {
 			"version": "3.1.1",
 			"resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz",
-			"integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA=="
+			"integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==",
+			"dev": true
 		},
 		"for-in": {
 			"version": "1.0.2",
@@ -1597,12 +1289,14 @@
 		"fs.realpath": {
 			"version": "1.0.0",
 			"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
-			"integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
+			"integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+			"dev": true
 		},
 		"functional-red-black-tree": {
 			"version": "1.0.1",
 			"resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
-			"integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc="
+			"integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
+			"dev": true
 		},
 		"get-value": {
 			"version": "2.0.6",
@@ -1620,6 +1314,7 @@
 			"version": "7.1.6",
 			"resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
 			"integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
+			"dev": true,
 			"requires": {
 				"fs.realpath": "^1.0.0",
 				"inflight": "^1.0.4",
@@ -1630,9 +1325,10 @@
 			}
 		},
 		"glob-parent": {
-			"version": "5.1.1",
-			"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz",
-			"integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==",
+			"version": "5.1.2",
+			"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+			"integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+			"dev": true,
 			"requires": {
 				"is-glob": "^4.0.1"
 			}
@@ -1665,6 +1361,7 @@
 			"version": "12.4.0",
 			"resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz",
 			"integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==",
+			"dev": true,
 			"requires": {
 				"type-fest": "^0.8.1"
 			}
@@ -1758,58 +1455,6 @@
 			"requires": {
 				"chalk": "^4.0.0",
 				"eslint": "^7.0.0"
-			},
-			"dependencies": {
-				"ansi-styles": {
-					"version": "4.2.1",
-					"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
-					"integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
-					"dev": true,
-					"requires": {
-						"@types/color-name": "^1.1.1",
-						"color-convert": "^2.0.1"
-					}
-				},
-				"chalk": {
-					"version": "4.1.0",
-					"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
-					"integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
-					"dev": true,
-					"requires": {
-						"ansi-styles": "^4.1.0",
-						"supports-color": "^7.1.0"
-					}
-				},
-				"color-convert": {
-					"version": "2.0.1",
-					"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-					"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-					"dev": true,
-					"requires": {
-						"color-name": "~1.1.4"
-					}
-				},
-				"color-name": {
-					"version": "1.1.4",
-					"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-					"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-					"dev": true
-				},
-				"has-flag": {
-					"version": "4.0.0",
-					"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-					"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-					"dev": true
-				},
-				"supports-color": {
-					"version": "7.1.0",
-					"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
-					"integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
-					"dev": true,
-					"requires": {
-						"has-flag": "^4.0.0"
-					}
-				}
 			}
 		},
 		"grunt-known-options": {
@@ -1918,7 +1563,8 @@
 		"has-flag": {
 			"version": "3.0.0",
 			"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-			"integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
+			"integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+			"dev": true
 		},
 		"has-value": {
 			"version": "1.0.0",
@@ -1979,12 +1625,14 @@
 		"ignore": {
 			"version": "4.0.6",
 			"resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
-			"integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg=="
+			"integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
+			"dev": true
 		},
 		"import-fresh": {
-			"version": "3.2.1",
-			"resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz",
-			"integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==",
+			"version": "3.3.0",
+			"resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
+			"integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
+			"dev": true,
 			"requires": {
 				"parent-module": "^1.0.0",
 				"resolve-from": "^4.0.0"
@@ -1993,12 +1641,14 @@
 		"imurmurhash": {
 			"version": "0.1.4",
 			"resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
-			"integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o="
+			"integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
+			"dev": true
 		},
 		"inflight": {
 			"version": "1.0.6",
 			"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
 			"integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+			"dev": true,
 			"requires": {
 				"once": "^1.3.0",
 				"wrappy": "1"
@@ -2007,7 +1657,8 @@
 		"inherits": {
 			"version": "2.0.3",
 			"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
-			"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
+			"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+			"dev": true
 		},
 		"ini": {
 			"version": "1.3.7",
@@ -2105,17 +1756,20 @@
 		"is-extglob": {
 			"version": "2.1.1",
 			"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
-			"integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI="
+			"integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+			"dev": true
 		},
 		"is-fullwidth-code-point": {
 			"version": "3.0.0",
 			"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
-			"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="
+			"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+			"dev": true
 		},
 		"is-glob": {
 			"version": "4.0.1",
 			"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
 			"integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
+			"dev": true,
 			"requires": {
 				"is-extglob": "^2.1.1"
 			}
@@ -2182,7 +1836,8 @@
 		"isexe": {
 			"version": "2.0.0",
 			"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
-			"integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA="
+			"integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
+			"dev": true
 		},
 		"isobject": {
 			"version": "3.0.1",
@@ -2193,12 +1848,14 @@
 		"js-tokens": {
 			"version": "4.0.0",
 			"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
-			"integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
+			"integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+			"dev": true
 		},
 		"js-yaml": {
-			"version": "3.13.1",
-			"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
-			"integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
+			"version": "3.14.1",
+			"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
+			"integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
+			"dev": true,
 			"requires": {
 				"argparse": "^1.0.7",
 				"esprima": "^4.0.0"
@@ -2213,12 +1870,14 @@
 		"json-schema-traverse": {
 			"version": "0.4.1",
 			"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
-			"integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
+			"integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+			"dev": true
 		},
 		"json-stable-stringify-without-jsonify": {
 			"version": "1.0.1",
 			"resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
-			"integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE="
+			"integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
+			"dev": true
 		},
 		"kind-of": {
 			"version": "6.0.3",
@@ -2230,6 +1889,7 @@
 			"version": "0.4.1",
 			"resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
 			"integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+			"dev": true,
 			"requires": {
 				"prelude-ls": "^1.2.1",
 				"type-check": "~0.4.0"
@@ -2353,6 +2013,7 @@
 			"version": "3.0.4",
 			"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
 			"integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+			"dev": true,
 			"requires": {
 				"brace-expansion": "^1.1.7"
 			}
@@ -2381,7 +2042,8 @@
 		"ms": {
 			"version": "2.1.2",
 			"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-			"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+			"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+			"dev": true
 		},
 		"nanomatch": {
 			"version": "1.2.13",
@@ -2405,12 +2067,13 @@
 		"natural-compare": {
 			"version": "1.4.0",
 			"resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
-			"integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc="
+			"integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
+			"dev": true
 		},
 		"node-releases": {
-			"version": "1.1.70",
-			"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.70.tgz",
-			"integrity": "sha512-Slf2s69+2/uAD79pVVQo8uSiC34+g8GWY8UH2Qtqv34ZfhYrxpYpfzs9Js9d6O0mbDmALuxaTlplnBTnSELcrw==",
+			"version": "1.1.71",
+			"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.71.tgz",
+			"integrity": "sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg==",
 			"dev": true
 		},
 		"nopt": {
@@ -2497,6 +2160,7 @@
 			"version": "1.4.0",
 			"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
 			"integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+			"dev": true,
 			"requires": {
 				"wrappy": "1"
 			}
@@ -2505,6 +2169,7 @@
 			"version": "0.9.1",
 			"resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
 			"integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
+			"dev": true,
 			"requires": {
 				"deep-is": "^0.1.3",
 				"fast-levenshtein": "^2.0.6",
@@ -2564,6 +2229,7 @@
 			"version": "1.0.1",
 			"resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
 			"integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+			"dev": true,
 			"requires": {
 				"callsites": "^3.0.0"
 			}
@@ -2600,12 +2266,14 @@
 		"path-is-absolute": {
 			"version": "1.0.1",
 			"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
-			"integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
+			"integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+			"dev": true
 		},
 		"path-key": {
 			"version": "3.1.1",
 			"resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
-			"integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="
+			"integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+			"dev": true
 		},
 		"path-parse": {
 			"version": "1.0.6",
@@ -2637,17 +2305,20 @@
 		"prelude-ls": {
 			"version": "1.2.1",
 			"resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
-			"integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="
+			"integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+			"dev": true
 		},
 		"progress": {
 			"version": "2.0.3",
 			"resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
-			"integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA=="
+			"integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
+			"dev": true
 		},
 		"punycode": {
 			"version": "2.1.1",
 			"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
-			"integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
+			"integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
+			"dev": true
 		},
 		"ramda": {
 			"version": "0.27.1",
@@ -2677,7 +2348,8 @@
 		"regexpp": {
 			"version": "3.1.0",
 			"resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz",
-			"integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q=="
+			"integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==",
+			"dev": true
 		},
 		"regextras": {
 			"version": "0.7.1",
@@ -2700,7 +2372,8 @@
 		"require-from-string": {
 			"version": "2.0.2",
 			"resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
-			"integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="
+			"integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
+			"dev": true
 		},
 		"requireindex": {
 			"version": "1.2.0",
@@ -2730,7 +2403,8 @@
 		"resolve-from": {
 			"version": "4.0.0",
 			"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
-			"integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="
+			"integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+			"dev": true
 		},
 		"resolve-url": {
 			"version": "0.2.1",
@@ -2748,6 +2422,7 @@
 			"version": "3.0.2",
 			"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
 			"integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+			"dev": true,
 			"requires": {
 				"glob": "^7.1.3"
 			}
@@ -2770,7 +2445,8 @@
 		"semver": {
 			"version": "7.3.2",
 			"resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
-			"integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ=="
+			"integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==",
+			"dev": true
 		},
 		"set-value": {
 			"version": "2.0.1",
@@ -2799,6 +2475,7 @@
 			"version": "2.0.0",
 			"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
 			"integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+			"dev": true,
 			"requires": {
 				"shebang-regex": "^3.0.0"
 			}
@@ -2806,12 +2483,14 @@
 		"shebang-regex": {
 			"version": "3.0.0",
 			"resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
-			"integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="
+			"integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+			"dev": true
 		},
 		"slice-ansi": {
 			"version": "4.0.0",
 			"resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
 			"integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
+			"dev": true,
 			"requires": {
 				"ansi-styles": "^4.0.0",
 				"astral-regex": "^2.0.0",
@@ -2822,6 +2501,7 @@
 					"version": "4.3.0",
 					"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
 					"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+					"dev": true,
 					"requires": {
 						"color-convert": "^2.0.1"
 					}
@@ -2830,6 +2510,7 @@
 					"version": "2.0.1",
 					"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
 					"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+					"dev": true,
 					"requires": {
 						"color-name": "~1.1.4"
 					}
@@ -2837,7 +2518,8 @@
 				"color-name": {
 					"version": "1.1.4",
 					"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-					"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+					"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+					"dev": true
 				}
 			}
 		},
@@ -3047,9 +2729,10 @@
 			}
 		},
 		"string-width": {
-			"version": "4.2.0",
-			"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
-			"integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
+			"version": "4.2.2",
+			"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz",
+			"integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==",
+			"dev": true,
 			"requires": {
 				"emoji-regex": "^8.0.0",
 				"is-fullwidth-code-point": "^3.0.0",
@@ -3060,6 +2743,7 @@
 			"version": "6.0.0",
 			"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
 			"integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+			"dev": true,
 			"requires": {
 				"ansi-regex": "^5.0.0"
 			}
@@ -3067,12 +2751,14 @@
 		"strip-json-comments": {
 			"version": "3.1.1",
 			"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
-			"integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="
+			"integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+			"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"
 			}
@@ -3081,6 +2767,7 @@
 			"version": "6.0.7",
 			"resolved": "https://registry.npmjs.org/table/-/table-6.0.7.tgz",
 			"integrity": "sha512-rxZevLGTUzWna/qBLObOe16kB2RTnnbhciwgPbMMlazz1yZGVEgnZK762xyVdVznhqxrfCeBMmMkgOOaPwjH7g==",
+			"dev": true,
 			"requires": {
 				"ajv": "^7.0.2",
 				"lodash": "^4.17.20",
@@ -3089,9 +2776,10 @@
 			},
 			"dependencies": {
 				"ajv": {
-					"version": "7.0.3",
-					"resolved": "https://registry.npmjs.org/ajv/-/ajv-7.0.3.tgz",
-					"integrity": "sha512-R50QRlXSxqXcQP5SvKUrw8VZeypvo12i2IX0EeR5PiZ7bEKeHWgzgo264LDadUsCU42lTJVhFikTqJwNeH34gQ==",
+					"version": "7.2.0",
+					"resolved": "https://registry.npmjs.org/ajv/-/ajv-7.2.0.tgz",
+					"integrity": "sha512-51Na3IUg3uOACsQ7hzTUCjSzGy8xROySgI8tmNJ+y9JF2hfDS6qkTP7+Ep3htUtSQG1t17QMbe+jZFTlaU4dDQ==",
+					"dev": true,
 					"requires": {
 						"fast-deep-equal": "^3.1.1",
 						"json-schema-traverse": "^1.0.0",
@@ -3102,19 +2790,22 @@
 				"json-schema-traverse": {
 					"version": "1.0.0",
 					"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
-					"integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="
+					"integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+					"dev": true
 				},
 				"lodash": {
-					"version": "4.17.20",
-					"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz",
-					"integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA=="
+					"version": "4.17.21",
+					"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+					"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+					"dev": true
 				}
 			}
 		},
 		"text-table": {
 			"version": "0.2.0",
 			"resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
-			"integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ="
+			"integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
+			"dev": true
 		},
 		"to-object-path": {
 			"version": "0.3.0",
@@ -3162,6 +2853,7 @@
 			"version": "0.4.0",
 			"resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
 			"integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+			"dev": true,
 			"requires": {
 				"prelude-ls": "^1.2.1"
 			}
@@ -3169,7 +2861,8 @@
 		"type-fest": {
 			"version": "0.8.1",
 			"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
-			"integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA=="
+			"integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
+			"dev": true
 		},
 		"unc-path-regex": {
 			"version": "0.1.2",
@@ -3246,9 +2939,10 @@
 			"dev": true
 		},
 		"uri-js": {
-			"version": "4.2.2",
-			"resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
-			"integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==",
+			"version": "4.4.1",
+			"resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+			"integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+			"dev": true,
 			"requires": {
 				"punycode": "^2.1.0"
 			}
@@ -3272,9 +2966,10 @@
 			"dev": true
 		},
 		"v8-compile-cache": {
-			"version": "2.1.1",
-			"resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz",
-			"integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ=="
+			"version": "2.3.0",
+			"resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz",
+			"integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==",
+			"dev": true
 		},
 		"v8flags": {
 			"version": "3.1.3",
@@ -3286,16 +2981,16 @@
 			}
 		},
 		"vue-eslint-parser": {
-			"version": "7.4.1",
-			"resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-7.4.1.tgz",
-			"integrity": "sha512-AFvhdxpFvliYq1xt/biNBslTHE/zbEvSnr1qfHA/KxRIpErmEDrQZlQnvEexednRHmLfDNOMuDYwZL5xkLzIXQ==",
+			"version": "7.6.0",
+			"resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-7.6.0.tgz",
+			"integrity": "sha512-QXxqH8ZevBrtiZMZK0LpwaMfevQi9UL7lY6Kcp+ogWHC88AuwUPwwCIzkOUc1LR4XsYAt/F9yHXAB/QoD17QXA==",
 			"dev": true,
 			"requires": {
 				"debug": "^4.1.1",
 				"eslint-scope": "^5.0.0",
 				"eslint-visitor-keys": "^1.1.0",
 				"espree": "^6.2.1",
-				"esquery": "^1.0.1",
+				"esquery": "^1.4.0",
 				"lodash": "^4.17.15"
 			},
 			"dependencies": {
@@ -3309,6 +3004,21 @@
 						"acorn-jsx": "^5.2.0",
 						"eslint-visitor-keys": "^1.1.0"
 					}
+				},
+				"esquery": {
+					"version": "1.4.0",
+					"resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz",
+					"integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==",
+					"dev": true,
+					"requires": {
+						"estraverse": "^5.1.0"
+					}
+				},
+				"estraverse": {
+					"version": "5.2.0",
+					"resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
+					"integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==",
+					"dev": true
 				}
 			}
 		},
@@ -3324,12 +3034,14 @@
 		"word-wrap": {
 			"version": "1.2.3",
 			"resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
-			"integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ=="
+			"integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
+			"dev": true
 		},
 		"wrappy": {
 			"version": "1.0.2",
 			"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
-			"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
+			"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+			"dev": true
 		},
 		"yallist": {
 			"version": "4.0.0",
diff --git a/package.json b/package.json
index 7f7b61c..0a5a347 100644
--- a/package.json
+++ b/package.json
@@ -4,7 +4,7 @@
 		"test": "grunt test"
 	},
 	"devDependencies": {
-		"eslint-config-wikimedia": "0.18.1",
+		"eslint-config-wikimedia": "0.18.2",
 		"grunt": "1.3.0",
 		"grunt-banana-checker": "0.9.0",
 		"grunt-eslint": "23.0.0"
-- 
2.20.1

composer dependencies

Dependencies
Development dependencies

npm dependencies

Development dependencies

Logs

Source code is licensed under the AGPL.