diff --git a/.classpath b/.classpath
index 6e0021feb305ffa1cda191a1eb3c4d28089b9cf0..268dab35dd7ad9758c8ceb5521d9371447cd0c3e 100644
--- a/.classpath
+++ b/.classpath
@@ -13,15 +13,15 @@
 	</classpathentry>
 	<classpathentry kind="src" output="target/test-classes" path="src/test/java">
 		<attributes>
+			<attribute name="test" value="true"/>
 			<attribute name="optional" value="true"/>
 			<attribute name="maven.pomderived" value="true"/>
-			<attribute name="test" value="true"/>
 		</attributes>
 	</classpathentry>
 	<classpathentry excluding="**" kind="src" output="target/test-classes" path="src/test/resources">
 		<attributes>
-			<attribute name="maven.pomderived" value="true"/>
 			<attribute name="test" value="true"/>
+			<attribute name="maven.pomderived" value="true"/>
 		</attributes>
 	</classpathentry>
 	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11">
@@ -34,21 +34,19 @@
 			<attribute name="maven.pomderived" value="true"/>
 		</attributes>
 	</classpathentry>
-	<classpathentry kind="src" path="target/generated-sources/annotations">
+	<classpathentry kind="src" output="target/test-classes" path="target/generated-test-sources/test-annotations">
 		<attributes>
+			<attribute name="test" value="true"/>
 			<attribute name="optional" value="true"/>
 			<attribute name="maven.pomderived" value="true"/>
 			<attribute name="ignore_optional_problems" value="true"/>
 			<attribute name="m2e-apt" value="true"/>
 		</attributes>
 	</classpathentry>
-	<classpathentry kind="src" output="target/test-classes" path="target/generated-test-sources/test-annotations">
+	<classpathentry combineaccessrules="false" kind="src" path="/SharingPluginPlattform"/>
+	<classpathentry kind="src" path="target/generated-sources/annotations">
 		<attributes>
 			<attribute name="optional" value="true"/>
-			<attribute name="maven.pomderived" value="true"/>
-			<attribute name="ignore_optional_problems" value="true"/>
-			<attribute name="m2e-apt" value="true"/>
-			<attribute name="test" value="true"/>
 		</attributes>
 	</classpathentry>
 	<classpathentry kind="output" path="target/classes"/>
diff --git a/.jhipster/Likes.json b/.jhipster/Likes.json
new file mode 100644
index 0000000000000000000000000000000000000000..4b584ed87faace079cde214637fd10589244bedc
--- /dev/null
+++ b/.jhipster/Likes.json
@@ -0,0 +1,31 @@
+{
+  "fluentMethods": true,
+  "clientRootFolder": "",
+  "relationships": [],
+  "fields": [
+    {
+      "fieldName": "date",
+      "fieldType": "LocalDate",
+      "fieldValidateRules": ["required"]
+    },
+    {
+      "fieldName": "userID",
+      "fieldType": "Integer",
+      "fieldValidateRules": ["required"]
+    },
+    {
+      "fieldName": "projectID",
+      "fieldType": "String",
+      "fieldValidateRules": ["required"]
+    }
+  ],
+  "changelogDate": "20210701160634",
+  "dto": "no",
+  "searchEngine": "elasticsearch",
+  "service": "serviceClass",
+  "entityTableName": "likes",
+  "databaseType": "sql",
+  "readOnly": false,
+  "jpaMetamodelFiltering": true,
+  "pagination": "no"
+}
diff --git a/.jhipster/UserWatchList.json b/.jhipster/UserWatchList.json
index a754814c96711c952c1b53be082e486ca02abaa8..1ded8df2bb84b68c75df5750077904e6d2f7e3af 100644
--- a/.jhipster/UserWatchList.json
+++ b/.jhipster/UserWatchList.json
@@ -18,6 +18,12 @@
       "fieldType": "String",
       "fieldValidateRules": ["required", "minlength"],
       "fieldValidateRulesMinlength": "1"
+    },
+    {
+      "fieldName": "checkFrequency",
+      "fieldType": "CheckFrequency",
+      "fieldValues": "NEVER,DAILY,WEEKLY,MONTHLY",
+      "fieldValidateRules": ["required"]
     }
   ],
   "changelogDate": "20210414140546",
diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs
index 3c4883f5d06b1570cebd7fc2eb5239079409cd01..e78c8bcdfe9b6704db97dd8491003bd8cc6f086e 100644
--- a/.settings/org.eclipse.core.resources.prefs
+++ b/.settings/org.eclipse.core.resources.prefs
@@ -1,6 +1,8 @@
 eclipse.preferences.version=1
 encoding//src/main/java=UTF-8
 encoding//src/main/resources=UTF-8
+encoding//src/main/resources/i18n/messages_de.properties=UTF-8
+encoding//src/main/webapp/i18n/de/checkFrequency.json=UTF-8
 encoding//src/main/webapp/i18n/de/exercise.json=UTF-8
 encoding//src/main/webapp/i18n/de/global.json=UTF-8
 encoding//src/main/webapp/i18n/de/search.json=UTF-8
@@ -8,7 +10,4 @@ encoding//src/main/webapp/i18n/de/userWatchList.json=UTF-8
 encoding//src/main/webapp/i18n/de/watchListEntry.json=UTF-8
 encoding//src/test/java=UTF-8
 encoding//src/test/resources=UTF-8
-encoding//src/test/resources/at/ac/uibk/gitsearch/repository/search/testData/content1.json=UTF-8
-encoding//src/test/resources/at/ac/uibk/gitsearch/repository/search/testData/content2.json=UTF-8
-encoding//src/test/resources/at/ac/uibk/gitsearch/repository/search/testData/content3.json=UTF-8
 encoding/<project>=UTF-8
diff --git a/.yo-rc.json b/.yo-rc.json
index 44120c15705ba6129d5a1635b89dc1c6088b2475..622ee30efe312aea692244b5bcda3f6f34fc6d23 100644
--- a/.yo-rc.json
+++ b/.yo-rc.json
@@ -39,6 +39,6 @@
     "nativeLanguage": "en",
     "languages": ["en", "de"],
     "blueprints": [],
-    "lastLiquibaseTimestamp": 1618412995000
+    "lastLiquibaseTimestamp": 1624029069000
   }
 }
diff --git a/Jenkinsfile b/Jenkinsfile
index 1b717ea90d1d4774ac4ebd86ad4a84a536a89959..6023fca551c701be5ec4237b0fddf134661fae82 100644
--- a/Jenkinsfile
+++ b/Jenkinsfile
@@ -56,7 +56,7 @@ pipeline {
 }
 
     void notifyByEmail(String reason) {
-        def mailRecipients = "michael.breu@arctis.at"
+        def mailRecipients = "michael.breu@uibk.ac.at"
       emailext (
           subject: reason + ": Job '${env.JOB_NAME} [${env.BUILD_NUMBER}]'",
           body: '''${SCRIPT, template="groovy-html.template"}''',
diff --git a/package-lock.json b/package-lock.json
index 3633b5e58f65ecbb49dbb7ea7340d563af343af4..20a6d78bfcd9676e3b64120efb753ba1dc22dea1 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -5,13 +5,61 @@
   "requires": true,
   "dependencies": {
     "@angular-devkit/architect": {
-      "version": "0.1000.0",
-      "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1000.0.tgz",
-      "integrity": "sha512-luzBYe7t994ebq6xIfYJudxOkMBO0bywafk6sQqb+bOaBQAran4orF1R/zEx6f8TJzEoXELjUvxm/ePSqZdpKg==",
+      "version": "0.1002.3",
+      "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1002.3.tgz",
+      "integrity": "sha512-7ainXRNO1njZ6bBbJXGpMzCh0OYrzuIRe/+zRj0ncV1YfEsJb2yWBuiza0+y2Ljco7hdd4wr+7eJm7cfn+NvAw==",
       "dev": true,
       "requires": {
-        "@angular-devkit/core": "10.0.0",
-        "rxjs": "6.5.5"
+        "@angular-devkit/core": "10.2.3",
+        "rxjs": "6.6.2"
+      },
+      "dependencies": {
+        "@angular-devkit/core": {
+          "version": "10.2.3",
+          "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-10.2.3.tgz",
+          "integrity": "sha512-pMM1v9Xjqx6YLOQxQYs0D+03H6XPDZLS8cyEtoQX2iYdh8qlKHZVbJa2WsfzwMoIPtgcXfQAXn113VEgrQPLFA==",
+          "dev": true,
+          "requires": {
+            "ajv": "6.12.4",
+            "fast-json-stable-stringify": "2.1.0",
+            "magic-string": "0.25.7",
+            "rxjs": "6.6.2",
+            "source-map": "0.7.3"
+          }
+        },
+        "ajv": {
+          "version": "6.12.4",
+          "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.4.tgz",
+          "integrity": "sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ==",
+          "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"
+          }
+        },
+        "rxjs": {
+          "version": "6.6.2",
+          "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.2.tgz",
+          "integrity": "sha512-BHdBMVoWC2sL26w//BCu3YzKT4s2jip/WhwsGEDmeKYBhKDZeYezVUnHatYB7L85v5xs0BAQmg6BEYJEKxBabg==",
+          "dev": true,
+          "requires": {
+            "tslib": "^1.9.0"
+          }
+        },
+        "source-map": {
+          "version": "0.7.3",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
+          "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==",
+          "dev": true
+        },
+        "tslib": {
+          "version": "1.14.1",
+          "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+          "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+          "dev": true
+        }
       }
     },
     "@angular-devkit/core": {
@@ -36,55 +84,224 @@
       }
     },
     "@angular-devkit/schematics": {
-      "version": "10.0.0",
-      "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-10.0.0.tgz",
-      "integrity": "sha512-FJ/dY18M+cnAT9RkVjVRJ0PMFZci3ok0WoOosW25Fk68jwNSbGCeF8k8NcD6YE60+CfF4/0LxQWgFagr/wdEhw==",
+      "version": "10.2.3",
+      "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-10.2.3.tgz",
+      "integrity": "sha512-uCNeq5qH4QEiftgOud+EhTVvdriYQVBrYmX4f4BjVHkjnFhm73h30nfAgs6YuStIp8oxSI8jUGE9DAy331xvmA==",
       "dev": true,
       "requires": {
-        "@angular-devkit/core": "10.0.0",
-        "ora": "4.0.4",
-        "rxjs": "6.5.5"
+        "@angular-devkit/core": "10.2.3",
+        "ora": "5.0.0",
+        "rxjs": "6.6.2"
+      },
+      "dependencies": {
+        "@angular-devkit/core": {
+          "version": "10.2.3",
+          "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-10.2.3.tgz",
+          "integrity": "sha512-pMM1v9Xjqx6YLOQxQYs0D+03H6XPDZLS8cyEtoQX2iYdh8qlKHZVbJa2WsfzwMoIPtgcXfQAXn113VEgrQPLFA==",
+          "dev": true,
+          "requires": {
+            "ajv": "6.12.4",
+            "fast-json-stable-stringify": "2.1.0",
+            "magic-string": "0.25.7",
+            "rxjs": "6.6.2",
+            "source-map": "0.7.3"
+          }
+        },
+        "ajv": {
+          "version": "6.12.4",
+          "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.4.tgz",
+          "integrity": "sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ==",
+          "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"
+          }
+        },
+        "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"
+          }
+        },
+        "chalk": {
+          "version": "4.1.1",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
+          "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==",
+          "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
+        },
+        "log-symbols": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
+          "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==",
+          "dev": true,
+          "requires": {
+            "chalk": "^4.1.0",
+            "is-unicode-supported": "^0.1.0"
+          }
+        },
+        "ora": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/ora/-/ora-5.0.0.tgz",
+          "integrity": "sha512-s26qdWqke2kjN/wC4dy+IQPBIMWBJlSU/0JZhk30ZDBLelW25rv66yutUWARMigpGPzcXHb+Nac5pNhN/WsARw==",
+          "dev": true,
+          "requires": {
+            "chalk": "^4.1.0",
+            "cli-cursor": "^3.1.0",
+            "cli-spinners": "^2.4.0",
+            "is-interactive": "^1.0.0",
+            "log-symbols": "^4.0.0",
+            "mute-stream": "0.0.8",
+            "strip-ansi": "^6.0.0",
+            "wcwidth": "^1.0.1"
+          }
+        },
+        "rxjs": {
+          "version": "6.6.2",
+          "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.2.tgz",
+          "integrity": "sha512-BHdBMVoWC2sL26w//BCu3YzKT4s2jip/WhwsGEDmeKYBhKDZeYezVUnHatYB7L85v5xs0BAQmg6BEYJEKxBabg==",
+          "dev": true,
+          "requires": {
+            "tslib": "^1.9.0"
+          }
+        },
+        "source-map": {
+          "version": "0.7.3",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
+          "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==",
+          "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"
+          }
+        },
+        "tslib": {
+          "version": "1.14.1",
+          "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+          "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+          "dev": true
+        }
       }
     },
     "@angular/cli": {
-      "version": "10.0.0",
-      "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-10.0.0.tgz",
-      "integrity": "sha512-I+2cltQCmThgrnHwsG5AX0hQ9z6rK/8ysRWWeiJXHtEtqupW9eNzXX1QfXWxWB3o6oIKgijvnLlp04BUlWCyXA==",
+      "version": "10.2.3",
+      "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-10.2.3.tgz",
+      "integrity": "sha512-LLt0AUgLpmaoWA1R7tnUxbJDNs37+WogjNCbNLfvf4YHI04PwKx3OXgx0d8IYNtjHEaGmGp9AQRynvQ2qfXkaA==",
       "dev": true,
       "requires": {
-        "@angular-devkit/architect": "0.1000.0",
-        "@angular-devkit/core": "10.0.0",
-        "@angular-devkit/schematics": "10.0.0",
-        "@schematics/angular": "10.0.0",
-        "@schematics/update": "0.1000.0",
+        "@angular-devkit/architect": "0.1002.3",
+        "@angular-devkit/core": "10.2.3",
+        "@angular-devkit/schematics": "10.2.3",
+        "@schematics/angular": "10.2.3",
+        "@schematics/update": "0.1002.3",
         "@yarnpkg/lockfile": "1.1.0",
         "ansi-colors": "4.1.1",
         "debug": "4.1.1",
-        "ini": "1.3.5",
-        "inquirer": "7.1.0",
+        "ini": "1.3.6",
+        "inquirer": "7.3.3",
         "npm-package-arg": "8.0.1",
         "npm-pick-manifest": "6.1.0",
-        "open": "7.0.4",
+        "open": "7.2.0",
         "pacote": "9.5.12",
         "read-package-tree": "5.3.1",
         "rimraf": "3.0.2",
         "semver": "7.3.2",
         "symbol-observable": "1.2.0",
-        "universal-analytics": "0.4.20",
-        "uuid": "8.1.0"
+        "universal-analytics": "0.4.23",
+        "uuid": "8.3.0"
       },
       "dependencies": {
+        "@angular-devkit/core": {
+          "version": "10.2.3",
+          "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-10.2.3.tgz",
+          "integrity": "sha512-pMM1v9Xjqx6YLOQxQYs0D+03H6XPDZLS8cyEtoQX2iYdh8qlKHZVbJa2WsfzwMoIPtgcXfQAXn113VEgrQPLFA==",
+          "dev": true,
+          "requires": {
+            "ajv": "6.12.4",
+            "fast-json-stable-stringify": "2.1.0",
+            "magic-string": "0.25.7",
+            "rxjs": "6.6.2",
+            "source-map": "0.7.3"
+          }
+        },
+        "ajv": {
+          "version": "6.12.4",
+          "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.4.tgz",
+          "integrity": "sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ==",
+          "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"
+          }
+        },
         "ini": {
-          "version": "1.3.5",
-          "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
-          "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==",
+          "version": "1.3.6",
+          "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.6.tgz",
+          "integrity": "sha512-IZUoxEjNjubzrmvzZU4lKP7OnYmX72XRl3sqkfJhBKweKi5rnGi5+IUdlj/H1M+Ip5JQ1WzaDMOBRY90Ajc5jg==",
           "dev": true
         },
+        "rxjs": {
+          "version": "6.6.2",
+          "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.2.tgz",
+          "integrity": "sha512-BHdBMVoWC2sL26w//BCu3YzKT4s2jip/WhwsGEDmeKYBhKDZeYezVUnHatYB7L85v5xs0BAQmg6BEYJEKxBabg==",
+          "dev": true,
+          "requires": {
+            "tslib": "^1.9.0"
+          }
+        },
         "semver": {
           "version": "7.3.2",
           "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
           "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==",
           "dev": true
+        },
+        "source-map": {
+          "version": "0.7.3",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
+          "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==",
+          "dev": true
+        },
+        "tslib": {
+          "version": "1.14.1",
+          "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+          "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+          "dev": true
         }
       }
     },
@@ -140,9 +357,9 @@
       }
     },
     "@angular/core": {
-      "version": "10.0.0",
-      "resolved": "https://registry.npmjs.org/@angular/core/-/core-10.0.0.tgz",
-      "integrity": "sha512-N1m6op428ktgcsnXqqspb1xGZ9gp664Jmb4JoVajCD3JXucRfidw+vt3kPOldbWA6M4pIu5ZtZY3IZc2GrK5UQ==",
+      "version": "10.2.5",
+      "resolved": "https://registry.npmjs.org/@angular/core/-/core-10.2.5.tgz",
+      "integrity": "sha512-krhOKNTj5XE92Rk9ASX5KmgTF72j7qT2PLVxrGEVjuUKjBY2XaK3TV0Kotq9zI3qa9WgeCrP/Njn6jlKQCCAEQ==",
       "requires": {
         "tslib": "^2.0.0"
       }
@@ -1184,9 +1401,14 @@
       "integrity": "sha512-ARQjtRuT+ZskzJDJKPwuiGO3+7nS0iyNLU/uHVJHfG4LwGJxwVIGldwg1SU957sra0Z0OtWEajHMhiS4vB9LwQ=="
     },
     "@fortawesome/fontawesome-common-types": {
-      "version": "0.2.29",
-      "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.29.tgz",
-      "integrity": "sha512-cY+QfDTbZ7XVxzx7jxbC98Oxr/zc7R2QpTLqTxqlfyXDrAJjzi/xUIqAUsygELB62JIrbsWxtSRhayKFkGI7MA=="
+      "version": "0.2.35",
+      "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.35.tgz",
+      "integrity": "sha512-IHUfxSEDS9dDGqYwIW7wTN6tn/O8E0n5PcAHz9cAaBoZw6UpG20IG/YM3NNLaGPwPqgjBAFjIURzqoQs3rrtuw=="
+    },
+    "@fortawesome/fontawesome-free": {
+      "version": "5.15.3",
+      "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-5.15.3.tgz",
+      "integrity": "sha512-rFnSUN/QOtnOAgqFRooTA3H57JLDm0QEG/jPdk+tLQNL/eWd+Aok8g3qCI+Q1xuDPWpGW/i9JySpJVsq8Q0s9w=="
     },
     "@fortawesome/fontawesome-svg-core": {
       "version": "1.2.29",
@@ -1196,6 +1418,14 @@
         "@fortawesome/fontawesome-common-types": "^0.2.29"
       }
     },
+    "@fortawesome/free-regular-svg-icons": {
+      "version": "5.15.3",
+      "resolved": "https://registry.npmjs.org/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-5.15.3.tgz",
+      "integrity": "sha512-q4/p8Xehy9qiVTdDWHL4Z+o5PCLRChePGZRTXkl+/Z7erDVL8VcZUuqzJjs6gUz6czss4VIPBRdCz6wP37/zMQ==",
+      "requires": {
+        "@fortawesome/fontawesome-common-types": "^0.2.35"
+      }
+    },
     "@fortawesome/free-solid-svg-icons": {
       "version": "5.13.1",
       "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.13.1.tgz",
@@ -2080,36 +2310,27 @@
       }
     },
     "@ng-select/ng-select": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/@ng-select/ng-select/-/ng-select-4.0.1.tgz",
-      "integrity": "sha512-f5NzrKRvswOvxa8BzBgAUOpzl0B8SrlVQHQLB2zPymuZlzC2dWUi9mUhgu6s2igwdClmrZ8bysNBBNpgqHskyA==",
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/@ng-select/ng-select/-/ng-select-4.0.4.tgz",
+      "integrity": "sha512-KaVlVdt7DWZBfmL6nc16i80l1dDx0cO3eGjW+grQPnhZ9KurapioQUYVf6dSmYyWyBXihvt4I3SWkCzqSWFJbQ==",
       "requires": {
         "tslib": "^1.10.0"
       },
       "dependencies": {
         "tslib": {
-          "version": "1.13.0",
-          "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz",
-          "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q=="
+          "version": "1.14.1",
+          "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+          "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
         }
       }
     },
     "@ngqp/core": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/@ngqp/core/-/core-1.0.2.tgz",
-      "integrity": "sha512-NJ5ktrQwv7mRsmcOlA2ueTceI+vThSKhiQEzSJIlLtcHCLE26S7Zb8h4Gn40KlPYxC58fROGRAHqHKW6wdbcYw==",
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/@ngqp/core/-/core-1.2.0.tgz",
+      "integrity": "sha512-OzluBu8wLbQPyoJNEHjQcCLWNJYMDmD3+X5Gv38VYdslN4n/FxSES3TkxThjJFiBWjwQkEsn7Ph3OaxFk2C2qg==",
       "dev": true,
       "requires": {
-        "schematics-utilities": "^1.1.2",
-        "tslib": "^1.9.0"
-      },
-      "dependencies": {
-        "tslib": {
-          "version": "1.13.0",
-          "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz",
-          "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==",
-          "dev": true
-        }
+        "tslib": "^2.0.0"
       }
     },
     "@ngtools/webpack": {
@@ -2240,43 +2461,137 @@
       "integrity": "sha512-Fx6atDc7JM1r0WkPCDhNetVZNp+DO21q/HGlomAKBG+k8vb1B8fg8Yige4oCf1P9OWTZWm5tM5i3jlXhrSbNOg=="
     },
     "@schematics/angular": {
-      "version": "10.0.0",
-      "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-10.0.0.tgz",
-      "integrity": "sha512-m7Pxz4guAMbe7NASKCPUNxvUX/LeieDjGsXwIt09tVE4dEi9yqJP5zq8kOnZEiLKKflP7GoB65RNex4dTxsydw==",
+      "version": "10.2.3",
+      "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-10.2.3.tgz",
+      "integrity": "sha512-xcnfH5XMmGcs33VHm2cu0+4g3rkfSD+qpiKFjfg7KGC4lLoOKSED4ZnjzIYwcQ6QN4gTpAvlZKxI8zO7NkKv0A==",
       "dev": true,
       "requires": {
-        "@angular-devkit/core": "10.0.0",
-        "@angular-devkit/schematics": "10.0.0"
+        "@angular-devkit/core": "10.2.3",
+        "@angular-devkit/schematics": "10.2.3",
+        "jsonc-parser": "2.3.0"
+      },
+      "dependencies": {
+        "@angular-devkit/core": {
+          "version": "10.2.3",
+          "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-10.2.3.tgz",
+          "integrity": "sha512-pMM1v9Xjqx6YLOQxQYs0D+03H6XPDZLS8cyEtoQX2iYdh8qlKHZVbJa2WsfzwMoIPtgcXfQAXn113VEgrQPLFA==",
+          "dev": true,
+          "requires": {
+            "ajv": "6.12.4",
+            "fast-json-stable-stringify": "2.1.0",
+            "magic-string": "0.25.7",
+            "rxjs": "6.6.2",
+            "source-map": "0.7.3"
+          }
+        },
+        "ajv": {
+          "version": "6.12.4",
+          "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.4.tgz",
+          "integrity": "sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ==",
+          "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"
+          }
+        },
+        "rxjs": {
+          "version": "6.6.2",
+          "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.2.tgz",
+          "integrity": "sha512-BHdBMVoWC2sL26w//BCu3YzKT4s2jip/WhwsGEDmeKYBhKDZeYezVUnHatYB7L85v5xs0BAQmg6BEYJEKxBabg==",
+          "dev": true,
+          "requires": {
+            "tslib": "^1.9.0"
+          }
+        },
+        "source-map": {
+          "version": "0.7.3",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
+          "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==",
+          "dev": true
+        },
+        "tslib": {
+          "version": "1.14.1",
+          "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+          "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+          "dev": true
+        }
       }
     },
     "@schematics/update": {
-      "version": "0.1000.0",
-      "resolved": "https://registry.npmjs.org/@schematics/update/-/update-0.1000.0.tgz",
-      "integrity": "sha512-snjz7sQCOn4Xi66XQREXZx9K6R/vAnUfdyO5nXekls8+E+MIowlP+gqHM0whi8qJDwCLd9maYmeVsD6XZaGImQ==",
+      "version": "0.1002.3",
+      "resolved": "https://registry.npmjs.org/@schematics/update/-/update-0.1002.3.tgz",
+      "integrity": "sha512-UnuMgRQtAOp/Pk9rSYW12medajXe9s5mW4a6foixC/B2UCFFlIAVbFBTiFpr69xbalfLlFcFx1MD+8/8njWtbQ==",
       "dev": true,
       "requires": {
-        "@angular-devkit/core": "10.0.0",
-        "@angular-devkit/schematics": "10.0.0",
+        "@angular-devkit/core": "10.2.3",
+        "@angular-devkit/schematics": "10.2.3",
         "@yarnpkg/lockfile": "1.1.0",
-        "ini": "1.3.5",
+        "ini": "1.3.6",
         "npm-package-arg": "^8.0.0",
         "pacote": "9.5.12",
-        "rxjs": "6.5.5",
         "semver": "7.3.2",
         "semver-intersect": "1.4.0"
       },
       "dependencies": {
+        "@angular-devkit/core": {
+          "version": "10.2.3",
+          "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-10.2.3.tgz",
+          "integrity": "sha512-pMM1v9Xjqx6YLOQxQYs0D+03H6XPDZLS8cyEtoQX2iYdh8qlKHZVbJa2WsfzwMoIPtgcXfQAXn113VEgrQPLFA==",
+          "dev": true,
+          "requires": {
+            "ajv": "6.12.4",
+            "fast-json-stable-stringify": "2.1.0",
+            "magic-string": "0.25.7",
+            "rxjs": "6.6.2",
+            "source-map": "0.7.3"
+          }
+        },
+        "ajv": {
+          "version": "6.12.4",
+          "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.4.tgz",
+          "integrity": "sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ==",
+          "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"
+          }
+        },
         "ini": {
-          "version": "1.3.5",
-          "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
-          "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==",
+          "version": "1.3.6",
+          "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.6.tgz",
+          "integrity": "sha512-IZUoxEjNjubzrmvzZU4lKP7OnYmX72XRl3sqkfJhBKweKi5rnGi5+IUdlj/H1M+Ip5JQ1WzaDMOBRY90Ajc5jg==",
           "dev": true
         },
+        "rxjs": {
+          "version": "6.6.2",
+          "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.2.tgz",
+          "integrity": "sha512-BHdBMVoWC2sL26w//BCu3YzKT4s2jip/WhwsGEDmeKYBhKDZeYezVUnHatYB7L85v5xs0BAQmg6BEYJEKxBabg==",
+          "dev": true,
+          "requires": {
+            "tslib": "^1.9.0"
+          }
+        },
         "semver": {
           "version": "7.3.2",
           "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
           "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==",
           "dev": true
+        },
+        "source-map": {
+          "version": "0.7.3",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
+          "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==",
+          "dev": true
+        },
+        "tslib": {
+          "version": "1.14.1",
+          "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+          "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+          "dev": true
         }
       }
     },
@@ -2480,9 +2795,9 @@
       "dev": true
     },
     "@types/lodash": {
-      "version": "4.14.168",
-      "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.168.tgz",
-      "integrity": "sha512-oVfRvqHV/V6D1yifJbVRU3TMp8OT6o6BG+U9MkwuJ3U8/CsDHvalRpsxBqivn71ztOFZBTfJMvETbqHiaNSj7Q==",
+      "version": "4.14.170",
+      "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.170.tgz",
+      "integrity": "sha512-bpcvu/MKHHeYX+qeEN8GE7DIravODWdACVA1ctevD8CN24RhPZIKMn9ntfAsrvLfSX3cR5RrBKAbYm9bGs0A+Q==",
       "dev": true
     },
     "@types/marked": {
@@ -2509,9 +2824,9 @@
       "dev": true
     },
     "@types/node": {
-      "version": "13.13.41",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.41.tgz",
-      "integrity": "sha512-qLT9IvHiXJfdrje9VmsLzun7cQ65obsBTmtU3EOnCSLFOoSHx1hpiRHoBnpdbyFqnzqdUUIv81JcEJQCB8un9g==",
+      "version": "13.13.52",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.52.tgz",
+      "integrity": "sha512-s3nugnZumCC//n4moGGe6tkNMyYEdaDBitVjwPxXmR5lnMG5dHePinH2EdxkG3Rh1ghFHHixAG4NJhpJW1rthQ==",
       "dev": true
     },
     "@types/normalize-package-data": {
@@ -2533,9 +2848,9 @@
       "dev": true
     },
     "@types/prismjs": {
-      "version": "1.9.0",
-      "resolved": "https://registry.npmjs.org/@types/prismjs/-/prismjs-1.9.0.tgz",
-      "integrity": "sha512-zeh+xd2pcCvWm1XtWLR4v5pzZMybKeq6X8Q4cIZMMx8GmyKDUfJaOtw+JaONHUQt5ncKFXezl8QGIDQsSF5YfA==",
+      "version": "1.16.5",
+      "resolved": "https://registry.npmjs.org/@types/prismjs/-/prismjs-1.16.5.tgz",
+      "integrity": "sha512-nSU7U6FQDJJCraFNwaHmH5YDsd/VA9rTnJ7B7AGFdn+m+VSt3FjLWN7+AbqxZ67dbFazqtrDFUto3HK4ljrHIg==",
       "dev": true
     },
     "@types/q": {
@@ -3923,9 +4238,9 @@
       "dev": true
     },
     "bootstrap": {
-      "version": "4.5.2",
-      "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.5.2.tgz",
-      "integrity": "sha512-vlGn0bcySYl/iV+BGA544JkkZP5LB3jsmkeKLFQakCOwCM3AOk7VkldBz4jrzSe+Z0Ezn99NVXa1o45cQY4R6A=="
+      "version": "4.6.0",
+      "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.6.0.tgz",
+      "integrity": "sha512-Io55IuQY3kydzHtbGvQya3H+KorS/M9rSNyfCGCg9WZ4pyT/lCxIlpJgG1GXW/PswzC84Tr2fBYi+7+jFVQQBw=="
     },
     "brace-expansion": {
       "version": "1.1.11",
@@ -4211,15 +4526,16 @@
       }
     },
     "browserslist": {
-      "version": "4.12.2",
-      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.12.2.tgz",
-      "integrity": "sha512-MfZaeYqR8StRZdstAK9hCKDd2StvePCYp5rHzQCPicUjfFliDgmuaBNPHYUTpAywBN8+Wc/d7NYVFkO0aqaBUw==",
+      "version": "4.16.6",
+      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz",
+      "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==",
       "dev": true,
       "requires": {
-        "caniuse-lite": "^1.0.30001088",
-        "electron-to-chromium": "^1.3.483",
-        "escalade": "^3.0.1",
-        "node-releases": "^1.1.58"
+        "caniuse-lite": "^1.0.30001219",
+        "colorette": "^1.2.2",
+        "electron-to-chromium": "^1.3.723",
+        "escalade": "^3.1.1",
+        "node-releases": "^1.1.71"
       }
     },
     "browserstack": {
@@ -4379,6 +4695,16 @@
         "unset-value": "^1.0.0"
       }
     },
+    "call-bind": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
+      "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
+      "dev": true,
+      "requires": {
+        "function-bind": "^1.1.1",
+        "get-intrinsic": "^1.0.2"
+      }
+    },
     "call-me-maybe": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz",
@@ -4464,9 +4790,9 @@
       }
     },
     "caniuse-lite": {
-      "version": "1.0.30001185",
-      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001185.tgz",
-      "integrity": "sha512-Fpi4kVNtNvJ15H0F6vwmXtb3tukv3Zg3qhKkOGUq7KJ1J6b9kf4dnNgtEAFXhRsJo0gNj9W60+wBvn0JcTvdTg==",
+      "version": "1.0.30001239",
+      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001239.tgz",
+      "integrity": "sha512-cyBkXJDMeI4wthy8xJ2FvDU6+0dtcZSJW3voUF8+e9f1bBeuvyZfc3PNbkOETyhbR+dGCPzn9E7MA3iwzusOhQ==",
       "dev": true
     },
     "canonical-path": {
@@ -4688,9 +5014,9 @@
       }
     },
     "cli-spinners": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.3.0.tgz",
-      "integrity": "sha512-Xs2Hf2nzrvJMFKimOR7YR0QwZ8fc0u98kdtwN1eNAZzNQgH3vK2pXzff6GJtKh7S5hoJ87ECiAiZFS2fb5Ii2w==",
+      "version": "2.6.0",
+      "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.0.tgz",
+      "integrity": "sha512-t+4/y50K/+4xcCRosKkA7W4gTr1MySvLV0q+PxmG7FJ5g+66ChKurYjxBCjHggHH3HA5Hh9cy+lcUGWDqVH+4Q==",
       "dev": true
     },
     "cli-table": {
@@ -4920,9 +5246,9 @@
       }
     },
     "colorette": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.0.tgz",
-      "integrity": "sha512-soRSroY+OF/8OdA3PTQXwaDJeMc7TfknKKrxeSCencL2a4+Tx5zhxmmv7hdpCjhKBjehzp8+bwe/T68K0hpIjw==",
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz",
+      "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==",
       "dev": true
     },
     "colornames": {
@@ -5313,9 +5639,9 @@
           "dev": true
         },
         "ssri": {
-          "version": "8.0.0",
-          "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.0.tgz",
-          "integrity": "sha512-aq/pz989nxVYwn16Tsbj1TqFpD5LLrQxHf5zaHuieFV+R0Bbr4y8qUsOA45hXT/N4/9UNXTarBjnjVmjSOVaAA==",
+          "version": "8.0.1",
+          "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz",
+          "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==",
           "dev": true,
           "requires": {
             "minipass": "^3.1.1"
@@ -5564,31 +5890,25 @@
       }
     },
     "css-select": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz",
-      "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=",
+      "version": "4.1.3",
+      "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.1.3.tgz",
+      "integrity": "sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA==",
       "dev": true,
       "requires": {
-        "boolbase": "~1.0.0",
-        "css-what": "2.1",
-        "domutils": "1.5.1",
-        "nth-check": "~1.0.1"
+        "boolbase": "^1.0.0",
+        "css-what": "^5.0.0",
+        "domhandler": "^4.2.0",
+        "domutils": "^2.6.0",
+        "nth-check": "^2.0.0"
       },
       "dependencies": {
-        "domelementtype": {
-          "version": "1.3.1",
-          "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz",
-          "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==",
-          "dev": true
-        },
-        "domutils": {
-          "version": "1.5.1",
-          "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz",
-          "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=",
+        "domhandler": {
+          "version": "4.2.0",
+          "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.2.0.tgz",
+          "integrity": "sha512-zk7sgt970kzPks2Bf+dwT/PLzghLnsivb9CcxkvR8Mzr66Olr0Ofd8neSbglHJHaHa2MadfoSdNlKYAaafmWfA==",
           "dev": true,
           "requires": {
-            "dom-serializer": "0",
-            "domelementtype": "1"
+            "domelementtype": "^2.2.0"
           }
         }
       }
@@ -5628,9 +5948,9 @@
       }
     },
     "css-what": {
-      "version": "2.1.3",
-      "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz",
-      "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==",
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.0.1.tgz",
+      "integrity": "sha512-FYDTSHb/7KXsWICVsxdmiExPjCfRC4qRFBdVwv7Ax9hMnvMmEjP9RfxTEZ3qPZGmADDn2vAKSo9UcN1jKVYscg==",
       "dev": true
     },
     "cssauron": {
@@ -5649,13 +5969,13 @@
       "dev": true
     },
     "cssnano": {
-      "version": "4.1.10",
-      "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.10.tgz",
-      "integrity": "sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ==",
+      "version": "4.1.11",
+      "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.11.tgz",
+      "integrity": "sha512-6gZm2htn7xIPJOHY824ERgj8cNPgPxyCSnkXc4v7YvNW+TdVfzgngHcEhy/8D11kUWRUMbke+tC+AUcUsnMz2g==",
       "dev": true,
       "requires": {
         "cosmiconfig": "^5.0.0",
-        "cssnano-preset-default": "^4.0.7",
+        "cssnano-preset-default": "^4.0.8",
         "is-resolvable": "^1.0.0",
         "postcss": "^7.0.0"
       },
@@ -5701,9 +6021,9 @@
       }
     },
     "cssnano-preset-default": {
-      "version": "4.0.7",
-      "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz",
-      "integrity": "sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA==",
+      "version": "4.0.8",
+      "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.8.tgz",
+      "integrity": "sha512-LdAyHuq+VRyeVREFmuxUZR1TXjQm8QQU/ktoo/x7bz+SdOge1YKc5eMN6pRW7YWBmyq59CqYba1dJ5cUukEjLQ==",
       "dev": true,
       "requires": {
         "css-declaration-sorter": "^4.0.1",
@@ -5734,7 +6054,7 @@
         "postcss-ordered-values": "^4.1.2",
         "postcss-reduce-initial": "^4.0.3",
         "postcss-reduce-transforms": "^4.0.2",
-        "postcss-svgo": "^4.0.2",
+        "postcss-svgo": "^4.0.3",
         "postcss-unique-selectors": "^4.0.1"
       }
     },
@@ -5766,28 +6086,28 @@
       "dev": true
     },
     "csso": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/csso/-/csso-4.0.3.tgz",
-      "integrity": "sha512-NL3spysxUkcrOgnpsT4Xdl2aiEiBG6bXswAABQVHcMrfjjBisFOKwLDOmf4wf32aPdcJws1zds2B0Rg+jqMyHQ==",
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz",
+      "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==",
       "dev": true,
       "requires": {
-        "css-tree": "1.0.0-alpha.39"
+        "css-tree": "^1.1.2"
       },
       "dependencies": {
         "css-tree": {
-          "version": "1.0.0-alpha.39",
-          "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.39.tgz",
-          "integrity": "sha512-7UvkEYgBAHRG9Nt980lYxjsTrCyHFN53ky3wVsDkiMdVqylqRt+Zc+jm5qw7/qyOvN2dHSYtX0e4MbCCExSvnA==",
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz",
+          "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==",
           "dev": true,
           "requires": {
-            "mdn-data": "2.0.6",
+            "mdn-data": "2.0.14",
             "source-map": "^0.6.1"
           }
         },
         "mdn-data": {
-          "version": "2.0.6",
-          "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.6.tgz",
-          "integrity": "sha512-rQvjv71olwNHgiTbfPZFkJtjNMciWgswYeciZhtvWLO8bmX3TnhyA62I6sTWOyZssWHJJjY6/KiWwqQsWWsqOA==",
+          "version": "2.0.14",
+          "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz",
+          "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==",
           "dev": true
         },
         "source-map": {
@@ -6286,9 +6606,9 @@
       "dev": true
     },
     "dns-packet": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz",
-      "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==",
+      "version": "1.3.4",
+      "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz",
+      "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==",
       "dev": true,
       "requires": {
         "ip": "^1.1.0",
@@ -6323,13 +6643,25 @@
       }
     },
     "dom-serializer": {
-      "version": "0.2.2",
-      "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz",
-      "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==",
+      "version": "1.3.2",
+      "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz",
+      "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==",
       "dev": true,
       "requires": {
         "domelementtype": "^2.0.1",
+        "domhandler": "^4.2.0",
         "entities": "^2.0.0"
+      },
+      "dependencies": {
+        "domhandler": {
+          "version": "4.2.0",
+          "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.2.0.tgz",
+          "integrity": "sha512-zk7sgt970kzPks2Bf+dwT/PLzghLnsivb9CcxkvR8Mzr66Olr0Ofd8neSbglHJHaHa2MadfoSdNlKYAaafmWfA==",
+          "dev": true,
+          "requires": {
+            "domelementtype": "^2.2.0"
+          }
+        }
       }
     },
     "domain-browser": {
@@ -6339,9 +6671,9 @@
       "dev": true
     },
     "domelementtype": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz",
-      "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==",
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz",
+      "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==",
       "dev": true
     },
     "domexception": {
@@ -6371,14 +6703,25 @@
       }
     },
     "domutils": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.1.0.tgz",
-      "integrity": "sha512-CD9M0Dm1iaHfQ1R/TI+z3/JWp/pgub0j4jIQKH89ARR4ATAV2nbaOQS5XxU9maJP5jHaPdDDQSEHuE2UmpUTKg==",
+      "version": "2.7.0",
+      "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.7.0.tgz",
+      "integrity": "sha512-8eaHa17IwJUPAiB+SoTYBo5mCdeMgdcAoXJ59m6DT1vw+5iLS3gNoqYaRowaBKtGVrOF1Jz4yDTgYKLK2kvfJg==",
       "dev": true,
       "requires": {
-        "dom-serializer": "^0.2.1",
-        "domelementtype": "^2.0.1",
-        "domhandler": "^3.0.0"
+        "dom-serializer": "^1.0.1",
+        "domelementtype": "^2.2.0",
+        "domhandler": "^4.2.0"
+      },
+      "dependencies": {
+        "domhandler": {
+          "version": "4.2.0",
+          "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.2.0.tgz",
+          "integrity": "sha512-zk7sgt970kzPks2Bf+dwT/PLzghLnsivb9CcxkvR8Mzr66Olr0Ofd8neSbglHJHaHa2MadfoSdNlKYAaafmWfA==",
+          "dev": true,
+          "requires": {
+            "domelementtype": "^2.2.0"
+          }
+        }
       }
     },
     "dot-case": {
@@ -6511,9 +6854,9 @@
       }
     },
     "electron-to-chromium": {
-      "version": "1.3.483",
-      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.483.tgz",
-      "integrity": "sha512-+05RF8S9rk8S0G8eBCqBRBaRq7+UN3lDs2DAvnG8SBSgQO3hjy0+qt4CmRk5eiuGbTcaicgXfPmBi31a+BD3lg==",
+      "version": "1.3.755",
+      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.755.tgz",
+      "integrity": "sha512-BJ1s/kuUuOeo1bF/EM2E4yqW9te0Hpof3wgwBx40AWJE18zsD1Tqo0kr7ijnOc+lRsrlrqKPauJAHqaxOItoUA==",
       "dev": true
     },
     "elegant-spinner": {
@@ -6586,9 +6929,9 @@
       },
       "dependencies": {
         "iconv-lite": {
-          "version": "0.6.2",
-          "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.2.tgz",
-          "integrity": "sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ==",
+          "version": "0.6.3",
+          "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
+          "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
           "dev": true,
           "requires": {
             "safer-buffer": ">= 2.1.2 < 3.0.0"
@@ -6620,17 +6963,17 @@
       },
       "dependencies": {
         "ws": {
-          "version": "7.4.4",
-          "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.4.tgz",
-          "integrity": "sha512-Qm8k8ojNQIMx7S+Zp8u/uHOx7Qazv3Yv4q68MiWWWOJhiwG5W3x7iqmRtJo8xxrciZUY4vRxUTJCKuRnF28ZZw==",
+          "version": "7.4.6",
+          "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz",
+          "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==",
           "dev": true
         }
       }
     },
     "engine.io-client": {
-      "version": "3.5.1",
-      "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.5.1.tgz",
-      "integrity": "sha512-oVu9kBkGbcggulyVF0kz6BV3ganqUeqXvD79WOFKa+11oK692w1NyFkuEj4xrkFRpZhn92QOqTk4RQq5LiBXbQ==",
+      "version": "3.5.2",
+      "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.5.2.tgz",
+      "integrity": "sha512-QEqIp+gJ/kMHeUun7f5Vv3bteRHppHH/FMBQX/esFj/fuYfjyUKWGMo3VCvIP/V8bE9KcjHmRZrhIz2Z9oNsDA==",
       "dev": true,
       "requires": {
         "component-emitter": "~1.3.0",
@@ -6642,7 +6985,7 @@
         "parseqs": "0.0.6",
         "parseuri": "0.0.6",
         "ws": "~7.4.2",
-        "xmlhttprequest-ssl": "~1.5.4",
+        "xmlhttprequest-ssl": "~1.6.2",
         "yeast": "0.1.2"
       },
       "dependencies": {
@@ -6668,9 +7011,9 @@
           "dev": true
         },
         "ws": {
-          "version": "7.4.4",
-          "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.4.tgz",
-          "integrity": "sha512-Qm8k8ojNQIMx7S+Zp8u/uHOx7Qazv3Yv4q68MiWWWOJhiwG5W3x7iqmRtJo8xxrciZUY4vRxUTJCKuRnF28ZZw==",
+          "version": "7.4.6",
+          "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz",
+          "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==",
           "dev": true
         }
       }
@@ -6766,22 +7109,27 @@
       }
     },
     "es-abstract": {
-      "version": "1.17.6",
-      "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz",
-      "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==",
+      "version": "1.18.3",
+      "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.3.tgz",
+      "integrity": "sha512-nQIr12dxV7SSxE6r6f1l3DtAeEYdsGpps13dR0TwJg1S8gyp4ZPgy3FZcHBgbiQqnoqSTb+oC+kO4UQ0C/J8vw==",
       "dev": true,
       "requires": {
+        "call-bind": "^1.0.2",
         "es-to-primitive": "^1.2.1",
         "function-bind": "^1.1.1",
+        "get-intrinsic": "^1.1.1",
         "has": "^1.0.3",
-        "has-symbols": "^1.0.1",
-        "is-callable": "^1.2.0",
-        "is-regex": "^1.1.0",
-        "object-inspect": "^1.7.0",
+        "has-symbols": "^1.0.2",
+        "is-callable": "^1.2.3",
+        "is-negative-zero": "^2.0.1",
+        "is-regex": "^1.1.3",
+        "is-string": "^1.0.6",
+        "object-inspect": "^1.10.3",
         "object-keys": "^1.1.1",
-        "object.assign": "^4.1.0",
-        "string.prototype.trimend": "^1.0.1",
-        "string.prototype.trimstart": "^1.0.1"
+        "object.assign": "^4.1.2",
+        "string.prototype.trimend": "^1.0.4",
+        "string.prototype.trimstart": "^1.0.4",
+        "unbox-primitive": "^1.0.1"
       }
     },
     "es-to-primitive": {
@@ -6811,9 +7159,9 @@
       }
     },
     "escalade": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.0.1.tgz",
-      "integrity": "sha512-DR6NO3h9niOT+MZs7bjxlj2a1k+POu5RN8CLTPX2+i78bRi9eLe7+0zXgUHMnGXWybYcL61E9hGhPKqedy8tQA==",
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+      "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
       "dev": true
     },
     "escape-html": {
@@ -8288,6 +8636,17 @@
       "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=",
       "dev": true
     },
+    "get-intrinsic": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
+      "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
+      "dev": true,
+      "requires": {
+        "function-bind": "^1.1.1",
+        "has": "^1.0.3",
+        "has-symbols": "^1.0.1"
+      }
+    },
     "get-own-enumerable-property-symbols": {
       "version": "3.0.2",
       "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz",
@@ -8363,9 +8722,9 @@
       }
     },
     "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"
@@ -8530,9 +8889,9 @@
       "dev": true
     },
     "handlebars": {
-      "version": "4.7.6",
-      "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.6.tgz",
-      "integrity": "sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA==",
+      "version": "4.7.7",
+      "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz",
+      "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==",
       "dev": true,
       "requires": {
         "minimist": "^1.2.5",
@@ -8598,6 +8957,12 @@
         }
       }
     },
+    "has-bigints": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz",
+      "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==",
+      "dev": true
+    },
     "has-binary2": {
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz",
@@ -8627,9 +8992,9 @@
       "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
     },
     "has-symbols": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz",
-      "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==",
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz",
+      "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==",
       "dev": true
     },
     "has-unicode": {
@@ -8769,9 +9134,9 @@
       "dev": true
     },
     "hosted-git-info": {
-      "version": "3.0.7",
-      "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.7.tgz",
-      "integrity": "sha512-fWqc0IcuXs+BmE9orLDyVykAG9GJtGLGuZAAqgcckPgv5xad4AcXGIv8galtQvlwutxSlaMcdw7BUtq2EIvqCQ==",
+      "version": "3.0.8",
+      "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.8.tgz",
+      "integrity": "sha512-aXpmwoOhRBrw6X3j0h5RloK4x1OzsxMPyxqIHyNfSe2pypkVTZFpEiRoSipPEPlMrh0HW/XsjkJ5WgnCirpNUw==",
       "dev": true,
       "requires": {
         "lru-cache": "^6.0.0"
@@ -8818,12 +9183,6 @@
       "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=",
       "dev": true
     },
-    "html-comment-regex": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz",
-      "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==",
-      "dev": true
-    },
     "html-encoding-sniffer": {
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz",
@@ -9223,9 +9582,9 @@
       "dev": true
     },
     "ignore-walk": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz",
-      "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==",
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.4.tgz",
+      "integrity": "sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ==",
       "dev": true,
       "requires": {
         "minimatch": "^3.0.4"
@@ -9340,46 +9699,51 @@
       "dev": true
     },
     "inquirer": {
-      "version": "7.1.0",
-      "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.1.0.tgz",
-      "integrity": "sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg==",
+      "version": "7.3.3",
+      "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz",
+      "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==",
       "dev": true,
       "requires": {
         "ansi-escapes": "^4.2.1",
-        "chalk": "^3.0.0",
+        "chalk": "^4.1.0",
         "cli-cursor": "^3.1.0",
-        "cli-width": "^2.0.0",
+        "cli-width": "^3.0.0",
         "external-editor": "^3.0.3",
         "figures": "^3.0.0",
-        "lodash": "^4.17.15",
+        "lodash": "^4.17.19",
         "mute-stream": "0.0.8",
         "run-async": "^2.4.0",
-        "rxjs": "^6.5.3",
+        "rxjs": "^6.6.0",
         "string-width": "^4.1.0",
         "strip-ansi": "^6.0.0",
         "through": "^2.3.6"
       },
       "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==",
+          "version": "4.3.0",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
           "dev": true,
           "requires": {
-            "@types/color-name": "^1.1.1",
             "color-convert": "^2.0.1"
           }
         },
         "chalk": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
-          "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
+          "version": "4.1.1",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
+          "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==",
           "dev": true,
           "requires": {
             "ansi-styles": "^4.1.0",
             "supports-color": "^7.1.0"
           }
         },
+        "cli-width": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz",
+          "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==",
+          "dev": true
+        },
         "color-convert": {
           "version": "2.0.1",
           "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
@@ -9401,14 +9765,29 @@
           "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
           "dev": true
         },
+        "rxjs": {
+          "version": "6.6.7",
+          "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz",
+          "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==",
+          "dev": true,
+          "requires": {
+            "tslib": "^1.9.0"
+          }
+        },
         "supports-color": {
-          "version": "7.1.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
-          "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+          "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"
           }
+        },
+        "tslib": {
+          "version": "1.14.1",
+          "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+          "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+          "dev": true
         }
       }
     },
@@ -9788,6 +10167,12 @@
       "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
       "dev": true
     },
+    "is-bigint": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.2.tgz",
+      "integrity": "sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA==",
+      "dev": true
+    },
     "is-binary-path": {
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
@@ -9797,6 +10182,15 @@
         "binary-extensions": "^2.0.0"
       }
     },
+    "is-boolean-object": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.1.tgz",
+      "integrity": "sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng==",
+      "dev": true,
+      "requires": {
+        "call-bind": "^1.0.2"
+      }
+    },
     "is-buffer": {
       "version": "1.1.6",
       "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
@@ -9804,9 +10198,9 @@
       "dev": true
     },
     "is-callable": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz",
-      "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==",
+      "version": "1.2.3",
+      "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz",
+      "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==",
       "dev": true
     },
     "is-ci": {
@@ -9933,6 +10327,12 @@
       "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=",
       "dev": true
     },
+    "is-negative-zero": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz",
+      "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==",
+      "dev": true
+    },
     "is-number": {
       "version": "7.0.0",
       "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
@@ -9948,6 +10348,12 @@
         "lodash.isfinite": "^3.3.2"
       }
     },
+    "is-number-object": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.5.tgz",
+      "integrity": "sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw==",
+      "dev": true
+    },
     "is-obj": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz",
@@ -10021,12 +10427,13 @@
       "dev": true
     },
     "is-regex": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.0.tgz",
-      "integrity": "sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw==",
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.3.tgz",
+      "integrity": "sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==",
       "dev": true,
       "requires": {
-        "has-symbols": "^1.0.1"
+        "call-bind": "^1.0.2",
+        "has-symbols": "^1.0.2"
       }
     },
     "is-regexp": {
@@ -10062,14 +10469,11 @@
       "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=",
       "dev": true
     },
-    "is-svg": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-3.0.0.tgz",
-      "integrity": "sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ==",
-      "dev": true,
-      "requires": {
-        "html-comment-regex": "^1.1.0"
-      }
+    "is-string": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.6.tgz",
+      "integrity": "sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w==",
+      "dev": true
     },
     "is-symbol": {
       "version": "1.0.3",
@@ -10086,6 +10490,12 @@
       "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
       "dev": true
     },
+    "is-unicode-supported": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
+      "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
+      "dev": true
+    },
     "is-utf8": {
       "version": "0.2.1",
       "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
@@ -10293,6 +10703,12 @@
             "regexp-to-ast": "0.4.0"
           }
         },
+        "lodash": {
+          "version": "4.17.20",
+          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz",
+          "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==",
+          "dev": true
+        },
         "regexp-to-ast": {
           "version": "0.4.0",
           "resolved": "https://registry.npmjs.org/regexp-to-ast/-/regexp-to-ast-0.4.0.tgz",
@@ -12648,9 +13064,9 @@
       "dev": true
     },
     "jquery": {
-      "version": "3.5.1",
-      "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.5.1.tgz",
-      "integrity": "sha512-XwIBPqcMn57FxfT+Go5pzySnm4KWkT1Tv7gjrpT1srtf8Weynl6R273VJ5GjkRb51IzMp5nbaPjJXMWeju2MKg=="
+      "version": "3.6.0",
+      "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.0.tgz",
+      "integrity": "sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw=="
     },
     "js-object-pretty-print": {
       "version": "0.3.0",
@@ -12725,9 +13141,9 @@
           }
         },
         "ws": {
-          "version": "7.3.0",
-          "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.0.tgz",
-          "integrity": "sha512-iFtXzngZVXPGgpTlP1rBqsUK82p9tKqsWRPg5L56egiljujJT3vGAYnHANvFxBieXrTFavhzhxW52jnaWV+w2w==",
+          "version": "7.5.0",
+          "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.0.tgz",
+          "integrity": "sha512-6ezXvzOZupqKj4jUqbQ9tXuJNo+BR2gU8fFRk3XCP3e0G6WT414u5ELe6Y0vtp7kmSJ3F7YWObSNr1ESsgi4vw==",
           "dev": true
         }
       }
@@ -12793,6 +13209,12 @@
         "minimist": "^1.2.5"
       }
     },
+    "jsonc-parser": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-2.3.0.tgz",
+      "integrity": "sha512-b0EBt8SWFNnixVdvoR2ZtEGa9ZqLhbJnOjezn+WP+8kspFm+PFYDN8Z4Bc7pRlDjvuVcADSUkroIuTWWn/YiIA==",
+      "dev": true
+    },
     "jsonfile": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
@@ -13287,12 +13709,6 @@
             "ms": "2.1.2"
           }
         },
-        "escalade": {
-          "version": "3.1.1",
-          "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
-          "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
-          "dev": true
-        },
         "wrap-ansi": {
           "version": "7.0.0",
           "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
@@ -13342,9 +13758,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=="
     },
     "lodash._reinterpolate": {
       "version": "3.0.0",
@@ -14398,44 +14814,38 @@
       }
     },
     "mocha": {
-      "version": "8.2.1",
-      "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.2.1.tgz",
-      "integrity": "sha512-cuLBVfyFfFqbNR0uUKbDGXKGk+UDFe6aR4os78XIrMQpZl/nv7JYHcvP5MFIAb374b2zFXsdgEGwmzMtP0Xg8w==",
+      "version": "8.4.0",
+      "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.4.0.tgz",
+      "integrity": "sha512-hJaO0mwDXmZS4ghXsvPVriOhsxQ7ofcpQdm8dE+jISUOKopitvnXFQmpRR7jd2K6VBG6E26gU3IAbXXGIbu4sQ==",
       "dev": true,
       "requires": {
         "@ungap/promise-all-settled": "1.1.2",
         "ansi-colors": "4.1.1",
         "browser-stdout": "1.3.1",
-        "chokidar": "3.4.3",
-        "debug": "4.2.0",
-        "diff": "4.0.2",
+        "chokidar": "3.5.1",
+        "debug": "4.3.1",
+        "diff": "5.0.0",
         "escape-string-regexp": "4.0.0",
         "find-up": "5.0.0",
         "glob": "7.1.6",
         "growl": "1.10.5",
         "he": "1.2.0",
-        "js-yaml": "3.14.0",
+        "js-yaml": "4.0.0",
         "log-symbols": "4.0.0",
         "minimatch": "3.0.4",
-        "ms": "2.1.2",
-        "nanoid": "3.1.12",
+        "ms": "2.1.3",
+        "nanoid": "3.1.20",
         "serialize-javascript": "5.0.1",
         "strip-json-comments": "3.1.1",
-        "supports-color": "7.2.0",
+        "supports-color": "8.1.1",
         "which": "2.0.2",
         "wide-align": "1.1.3",
-        "workerpool": "6.0.2",
-        "yargs": "13.3.2",
-        "yargs-parser": "13.1.2",
+        "workerpool": "6.1.0",
+        "yargs": "16.2.0",
+        "yargs-parser": "20.2.4",
         "yargs-unparser": "2.0.0"
       },
       "dependencies": {
-        "ansi-regex": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
-          "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
-          "dev": true
-        },
         "ansi-styles": {
           "version": "4.3.0",
           "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
@@ -14445,41 +14855,42 @@
             "color-convert": "^2.0.1"
           }
         },
+        "argparse": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+          "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+          "dev": true
+        },
         "chalk": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
-          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+          "version": "4.1.1",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
+          "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==",
           "dev": true,
           "requires": {
             "ansi-styles": "^4.1.0",
             "supports-color": "^7.1.0"
-          }
-        },
-        "chokidar": {
-          "version": "3.4.3",
-          "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.3.tgz",
-          "integrity": "sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ==",
-          "dev": true,
-          "requires": {
-            "anymatch": "~3.1.1",
-            "braces": "~3.0.2",
-            "fsevents": "~2.1.2",
-            "glob-parent": "~5.1.0",
-            "is-binary-path": "~2.1.0",
-            "is-glob": "~4.0.1",
-            "normalize-path": "~3.0.0",
-            "readdirp": "~3.5.0"
+          },
+          "dependencies": {
+            "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"
+              }
+            }
           }
         },
         "cliui": {
-          "version": "5.0.0",
-          "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
-          "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
+          "version": "7.0.4",
+          "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
+          "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
           "dev": true,
           "requires": {
-            "string-width": "^3.1.0",
-            "strip-ansi": "^5.2.0",
-            "wrap-ansi": "^5.1.0"
+            "string-width": "^4.2.0",
+            "strip-ansi": "^6.0.0",
+            "wrap-ansi": "^7.0.0"
           }
         },
         "color-convert": {
@@ -14498,24 +14909,26 @@
           "dev": true
         },
         "debug": {
-          "version": "4.2.0",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz",
-          "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==",
+          "version": "4.3.1",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
+          "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
           "dev": true,
           "requires": {
             "ms": "2.1.2"
+          },
+          "dependencies": {
+            "ms": {
+              "version": "2.1.2",
+              "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+              "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+              "dev": true
+            }
           }
         },
         "diff": {
-          "version": "4.0.2",
-          "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
-          "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
-          "dev": true
-        },
-        "emoji-regex": {
-          "version": "7.0.3",
-          "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
-          "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz",
+          "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==",
           "dev": true
         },
         "escape-string-regexp": {
@@ -14554,11 +14967,14 @@
           "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
           "dev": true
         },
-        "is-fullwidth-code-point": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
-          "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
-          "dev": true
+        "js-yaml": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.0.0.tgz",
+          "integrity": "sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q==",
+          "dev": true,
+          "requires": {
+            "argparse": "^2.0.1"
+          }
         },
         "locate-path": {
           "version": "6.0.0",
@@ -14578,13 +14994,19 @@
             "chalk": "^4.0.0"
           }
         },
+        "ms": {
+          "version": "2.1.3",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+          "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+          "dev": true
+        },
         "p-limit": {
-          "version": "3.0.2",
-          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.0.2.tgz",
-          "integrity": "sha512-iwqZSOoWIW+Ew4kAGUlN16J4M7OB3ysMLSZtnhmqx7njIHFPlxWBX8xo3lVTyFVq6mI/lL9qt2IsN1sHwaxJkg==",
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+          "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
           "dev": true,
           "requires": {
-            "p-try": "^2.0.0"
+            "yocto-queue": "^0.1.0"
           }
         },
         "p-locate": {
@@ -14605,26 +15027,6 @@
             "randombytes": "^2.1.0"
           }
         },
-        "string-width": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
-          "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
-          "dev": true,
-          "requires": {
-            "emoji-regex": "^7.0.1",
-            "is-fullwidth-code-point": "^2.0.0",
-            "strip-ansi": "^5.1.0"
-          }
-        },
-        "strip-ansi": {
-          "version": "5.2.0",
-          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
-          "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
-          "dev": true,
-          "requires": {
-            "ansi-regex": "^4.1.0"
-          }
-        },
         "strip-json-comments": {
           "version": "3.1.1",
           "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
@@ -14632,9 +15034,9 @@
           "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==",
+          "version": "8.1.1",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+          "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
           "dev": true,
           "requires": {
             "has-flag": "^4.0.0"
@@ -14650,114 +15052,42 @@
           }
         },
         "wrap-ansi": {
-          "version": "5.1.0",
-          "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
-          "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+          "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
           "dev": true,
           "requires": {
-            "ansi-styles": "^3.2.0",
-            "string-width": "^3.0.0",
-            "strip-ansi": "^5.0.0"
-          },
-          "dependencies": {
-            "ansi-styles": {
-              "version": "3.2.1",
-              "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
-              "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
-              "dev": true,
-              "requires": {
-                "color-convert": "^1.9.0"
-              }
-            },
-            "color-convert": {
-              "version": "1.9.3",
-              "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
-              "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
-              "dev": true,
-              "requires": {
-                "color-name": "1.1.3"
-              }
-            },
-            "color-name": {
-              "version": "1.1.3",
-              "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
-              "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
-              "dev": true
-            }
+            "ansi-styles": "^4.0.0",
+            "string-width": "^4.1.0",
+            "strip-ansi": "^6.0.0"
           }
         },
-        "yargs": {
-          "version": "13.3.2",
-          "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz",
-          "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==",
+        "y18n": {
+          "version": "5.0.8",
+          "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+          "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+          "dev": true
+        },
+        "yargs": {
+          "version": "16.2.0",
+          "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
+          "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
           "dev": true,
           "requires": {
-            "cliui": "^5.0.0",
-            "find-up": "^3.0.0",
-            "get-caller-file": "^2.0.1",
+            "cliui": "^7.0.2",
+            "escalade": "^3.1.1",
+            "get-caller-file": "^2.0.5",
             "require-directory": "^2.1.1",
-            "require-main-filename": "^2.0.0",
-            "set-blocking": "^2.0.0",
-            "string-width": "^3.0.0",
-            "which-module": "^2.0.0",
-            "y18n": "^4.0.0",
-            "yargs-parser": "^13.1.2"
-          },
-          "dependencies": {
-            "find-up": {
-              "version": "3.0.0",
-              "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
-              "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
-              "dev": true,
-              "requires": {
-                "locate-path": "^3.0.0"
-              }
-            },
-            "locate-path": {
-              "version": "3.0.0",
-              "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
-              "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
-              "dev": true,
-              "requires": {
-                "p-locate": "^3.0.0",
-                "path-exists": "^3.0.0"
-              }
-            },
-            "p-limit": {
-              "version": "2.3.0",
-              "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
-              "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
-              "dev": true,
-              "requires": {
-                "p-try": "^2.0.0"
-              }
-            },
-            "p-locate": {
-              "version": "3.0.0",
-              "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
-              "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
-              "dev": true,
-              "requires": {
-                "p-limit": "^2.0.0"
-              }
-            },
-            "path-exists": {
-              "version": "3.0.0",
-              "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
-              "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
-              "dev": true
-            }
+            "string-width": "^4.2.0",
+            "y18n": "^5.0.5",
+            "yargs-parser": "^20.2.2"
           }
         },
         "yargs-parser": {
-          "version": "13.1.2",
-          "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz",
-          "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==",
-          "dev": true,
-          "requires": {
-            "camelcase": "^5.0.0",
-            "decamelize": "^1.2.0"
-          }
+          "version": "20.2.4",
+          "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz",
+          "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==",
+          "dev": true
         }
       }
     },
@@ -14862,9 +15192,9 @@
       "optional": true
     },
     "nanoid": {
-      "version": "3.1.12",
-      "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.12.tgz",
-      "integrity": "sha512-1qstj9z5+x491jfiC4Nelk+f8XBad7LN20PmyWINJEMRSf3wcAjAWysw1qaA8z6NSKe2sjq1hRSDpBH5paCb6A==",
+      "version": "3.1.20",
+      "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.20.tgz",
+      "integrity": "sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==",
       "dev": true
     },
     "nanomatch": {
@@ -14913,9 +15243,19 @@
       }
     },
     "ngx-cookie-service": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/ngx-cookie-service/-/ngx-cookie-service-3.0.4.tgz",
-      "integrity": "sha512-g4KHpCWL2EtKatWqn8lz/DdyMQO8sDS7BNwCSvxF1ETTW5DPJnbdEwCjSdm84MmfqBh6JdgvoQd//rOxH5EbgQ=="
+      "version": "3.1.3",
+      "resolved": "https://registry.npmjs.org/ngx-cookie-service/-/ngx-cookie-service-3.1.3.tgz",
+      "integrity": "sha512-7bKSmpoUzfz9y7KSw83UqNnFGXnssMu5hFHyXvKKeqMBnhMqrpX1caZwNjvPW/61q71fGEdS/ZLZKvEedn2Wug==",
+      "requires": {
+        "tslib": "^1.10.0"
+      },
+      "dependencies": {
+        "tslib": {
+          "version": "1.14.1",
+          "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+          "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
+        }
+      }
     },
     "ngx-infinite-scroll": {
       "version": "9.0.0",
@@ -15096,9 +15436,9 @@
       }
     },
     "node-releases": {
-      "version": "1.1.58",
-      "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.58.tgz",
-      "integrity": "sha512-NxBudgVKiRh/2aPWMgPR7bPTX0VPmGx5QBwCtdHitnqFE5/O8DeBXuIMH1nwNnw/aMo6AjOrpsHzfY3UbUJ7yg==",
+      "version": "1.1.73",
+      "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.73.tgz",
+      "integrity": "sha512-uW7fodD6pyW2FZNZnp/Z3hvWKeEW1Y8R1+1CnErE8cXFXzl5blBOoVB41CvMer6P6Q0S5FXDwcHgFd1Wj0U9zg==",
       "dev": true
     },
     "normalize-package-data": {
@@ -15114,9 +15454,9 @@
       },
       "dependencies": {
         "hosted-git-info": {
-          "version": "2.8.8",
-          "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz",
-          "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==",
+          "version": "2.8.9",
+          "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
+          "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
           "dev": true
         }
       }
@@ -15160,9 +15500,9 @@
       }
     },
     "npm-bundled": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz",
-      "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==",
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz",
+      "integrity": "sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==",
       "dev": true,
       "requires": {
         "npm-normalize-package-bin": "^1.0.1"
@@ -15303,55 +15643,6 @@
         }
       }
     },
-    "npm-registry-client": {
-      "version": "8.6.0",
-      "resolved": "https://registry.npmjs.org/npm-registry-client/-/npm-registry-client-8.6.0.tgz",
-      "integrity": "sha512-Qs6P6nnopig+Y8gbzpeN/dkt+n7IyVd8f45NTMotGk6Qo7GfBmzwYx6jRLoOOgKiMnaQfYxsuyQlD8Mc3guBhg==",
-      "dev": true,
-      "requires": {
-        "concat-stream": "^1.5.2",
-        "graceful-fs": "^4.1.6",
-        "normalize-package-data": "~1.0.1 || ^2.0.0",
-        "npm-package-arg": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0",
-        "npmlog": "2 || ^3.1.0 || ^4.0.0",
-        "once": "^1.3.3",
-        "request": "^2.74.0",
-        "retry": "^0.10.0",
-        "safe-buffer": "^5.1.1",
-        "semver": "2 >=2.2.1 || 3.x || 4 || 5",
-        "slide": "^1.1.3",
-        "ssri": "^5.2.4"
-      },
-      "dependencies": {
-        "hosted-git-info": {
-          "version": "2.8.8",
-          "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz",
-          "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==",
-          "dev": true
-        },
-        "npm-package-arg": {
-          "version": "6.1.1",
-          "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.1.tgz",
-          "integrity": "sha512-qBpssaL3IOZWi5vEKUKW0cO7kzLeT+EQO9W8RsLOZf76KF9E/K9+wH0C7t06HXPpaH8WH5xF1MExLuCwbTqRUg==",
-          "dev": true,
-          "requires": {
-            "hosted-git-info": "^2.7.1",
-            "osenv": "^0.1.5",
-            "semver": "^5.6.0",
-            "validate-npm-package-name": "^3.0.0"
-          }
-        },
-        "ssri": {
-          "version": "5.3.0",
-          "resolved": "https://registry.npmjs.org/ssri/-/ssri-5.3.0.tgz",
-          "integrity": "sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ==",
-          "dev": true,
-          "requires": {
-            "safe-buffer": "^5.1.1"
-          }
-        }
-      }
-    },
     "npm-registry-fetch": {
       "version": "4.0.7",
       "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-4.0.7.tgz",
@@ -15368,9 +15659,9 @@
       },
       "dependencies": {
         "hosted-git-info": {
-          "version": "2.8.8",
-          "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz",
-          "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==",
+          "version": "2.8.9",
+          "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
+          "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
           "dev": true
         },
         "npm-package-arg": {
@@ -15425,12 +15716,12 @@
       }
     },
     "nth-check": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz",
-      "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==",
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.0.tgz",
+      "integrity": "sha512-i4sc/Kj8htBrAiH1viZ0TgU8Y5XqCaV/FziYK6TBczxmeKm3AEFWqqF3195yKudrarqy7Zu80Ra5dobFjn9X/Q==",
       "dev": true,
       "requires": {
-        "boolbase": "~1.0.0"
+        "boolbase": "^1.0.0"
       }
     },
     "num2fraction": {
@@ -15501,9 +15792,9 @@
       "dev": true
     },
     "object-inspect": {
-      "version": "1.8.0",
-      "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz",
-      "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==",
+      "version": "1.10.3",
+      "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.3.tgz",
+      "integrity": "sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw==",
       "dev": true
     },
     "object-is": {
@@ -15532,15 +15823,15 @@
       }
     },
     "object.assign": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz",
-      "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==",
+      "version": "4.1.2",
+      "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz",
+      "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==",
       "dev": true,
       "requires": {
-        "define-properties": "^1.1.2",
-        "function-bind": "^1.1.1",
-        "has-symbols": "^1.0.0",
-        "object-keys": "^1.0.11"
+        "call-bind": "^1.0.0",
+        "define-properties": "^1.1.3",
+        "has-symbols": "^1.0.1",
+        "object-keys": "^1.1.1"
       }
     },
     "object.getownpropertydescriptors": {
@@ -15563,15 +15854,14 @@
       }
     },
     "object.values": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz",
-      "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==",
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.4.tgz",
+      "integrity": "sha512-TnGo7j4XSnKQoK3MfvkzqKCi0nVe/D9I9IjwTNYdb/fxYHpjrluHVOgw0AF6jrRFGMPHdfuidR09tIDiIvnaSg==",
       "dev": true,
       "requires": {
+        "call-bind": "^1.0.2",
         "define-properties": "^1.1.3",
-        "es-abstract": "^1.17.0-next.1",
-        "function-bind": "^1.1.1",
-        "has": "^1.0.3"
+        "es-abstract": "^1.18.2"
       }
     },
     "obuf": {
@@ -15619,9 +15909,9 @@
       }
     },
     "open": {
-      "version": "7.0.4",
-      "resolved": "https://registry.npmjs.org/open/-/open-7.0.4.tgz",
-      "integrity": "sha512-brSA+/yq+b08Hsr4c8fsEW2CRzk1BmfN3SAK/5VCHQ9bdoZJ4qa/+AfR0xHjlbbZUyPkUHs1b8x1RqdyZdkVqQ==",
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/open/-/open-7.2.0.tgz",
+      "integrity": "sha512-4HeyhxCvBTI5uBePsAdi55C5fmqnWZ2e2MlmvWi5KW5tdH5rxoiv/aMtbeVxKZc3eWkT1GymMnLG8XC4Rq4TDQ==",
       "dev": true,
       "requires": {
         "is-docker": "^2.0.0",
@@ -16012,9 +16302,9 @@
       },
       "dependencies": {
         "glob": {
-          "version": "7.1.6",
-          "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
-          "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
+          "version": "7.1.7",
+          "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz",
+          "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==",
           "dev": true,
           "requires": {
             "fs.realpath": "^1.0.0",
@@ -16026,9 +16316,9 @@
           }
         },
         "hosted-git-info": {
-          "version": "2.8.8",
-          "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz",
-          "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==",
+          "version": "2.8.9",
+          "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
+          "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
           "dev": true
         },
         "npm-package-arg": {
@@ -16506,9 +16796,9 @@
       "dev": true
     },
     "postcss": {
-      "version": "7.0.32",
-      "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz",
-      "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==",
+      "version": "7.0.36",
+      "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz",
+      "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==",
       "dev": true,
       "requires": {
         "chalk": "^2.4.2",
@@ -17119,12 +17409,11 @@
       }
     },
     "postcss-svgo": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.2.tgz",
-      "integrity": "sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw==",
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.3.tgz",
+      "integrity": "sha512-NoRbrcMWTtUghzuKSoIm6XV+sJdvZ7GZSc3wdBN0W19FTtp2ko8NqLsgoh/m9CzNhU3KLPvQmjIwtaNFkaFTvw==",
       "dev": true,
       "requires": {
-        "is-svg": "^3.0.0",
         "postcss": "^7.0.0",
         "postcss-value-parser": "^3.0.0",
         "svgo": "^1.0.0"
@@ -17184,6 +17473,12 @@
         "prettier": "2.1.1"
       },
       "dependencies": {
+        "lodash": {
+          "version": "4.17.20",
+          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz",
+          "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==",
+          "dev": true
+        },
         "prettier": {
           "version": "2.1.1",
           "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.1.1.tgz",
@@ -17877,16 +18172,16 @@
       "dev": true
     },
     "renderkid": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.3.tgz",
-      "integrity": "sha512-z8CLQp7EZBPCwCnncgf9C4XAi3WR0dv+uWu/PjIyhhAb5d6IJ/QZqlHFprHeKT+59//V6BNUsLbvN8+2LarxGA==",
+      "version": "2.0.7",
+      "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.7.tgz",
+      "integrity": "sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ==",
       "dev": true,
       "requires": {
-        "css-select": "^1.1.0",
-        "dom-converter": "^0.2",
-        "htmlparser2": "^3.3.0",
-        "strip-ansi": "^3.0.0",
-        "utila": "^0.4.0"
+        "css-select": "^4.1.3",
+        "dom-converter": "^0.2.0",
+        "htmlparser2": "^6.1.0",
+        "lodash": "^4.17.21",
+        "strip-ansi": "^3.0.1"
       },
       "dependencies": {
         "ansi-regex": {
@@ -17895,61 +18190,32 @@
           "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
           "dev": true
         },
-        "domelementtype": {
-          "version": "1.3.1",
-          "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz",
-          "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==",
-          "dev": true
-        },
         "domhandler": {
-          "version": "2.4.2",
-          "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz",
-          "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==",
-          "dev": true,
-          "requires": {
-            "domelementtype": "1"
-          }
-        },
-        "domutils": {
-          "version": "1.7.0",
-          "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz",
-          "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==",
+          "version": "4.2.0",
+          "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.2.0.tgz",
+          "integrity": "sha512-zk7sgt970kzPks2Bf+dwT/PLzghLnsivb9CcxkvR8Mzr66Olr0Ofd8neSbglHJHaHa2MadfoSdNlKYAaafmWfA==",
           "dev": true,
           "requires": {
-            "dom-serializer": "0",
-            "domelementtype": "1"
+            "domelementtype": "^2.2.0"
           }
         },
-        "entities": {
-          "version": "1.1.2",
-          "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz",
-          "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==",
-          "dev": true
-        },
         "htmlparser2": {
-          "version": "3.10.1",
-          "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz",
-          "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==",
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz",
+          "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==",
           "dev": true,
           "requires": {
-            "domelementtype": "^1.3.1",
-            "domhandler": "^2.3.0",
-            "domutils": "^1.5.1",
-            "entities": "^1.1.1",
-            "inherits": "^2.0.1",
-            "readable-stream": "^3.1.1"
+            "domelementtype": "^2.0.1",
+            "domhandler": "^4.0.0",
+            "domutils": "^2.5.2",
+            "entities": "^2.0.0"
           }
         },
-        "readable-stream": {
-          "version": "3.6.0",
-          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
-          "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
-          "dev": true,
-          "requires": {
-            "inherits": "^2.0.3",
-            "string_decoder": "^1.1.1",
-            "util-deprecate": "^1.0.1"
-          }
+        "lodash": {
+          "version": "4.17.21",
+          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+          "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+          "dev": true
         },
         "strip-ansi": {
           "version": "3.0.1",
@@ -18322,343 +18588,29 @@
     },
     "sane": {
       "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz",
-      "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==",
-      "dev": true,
-      "requires": {
-        "@cnakazawa/watch": "^1.0.3",
-        "anymatch": "^2.0.0",
-        "capture-exit": "^2.0.0",
-        "exec-sh": "^0.3.2",
-        "execa": "^1.0.0",
-        "fb-watchman": "^2.0.0",
-        "micromatch": "^3.1.4",
-        "minimist": "^1.1.1",
-        "walker": "~1.0.5"
-      },
-      "dependencies": {
-        "anymatch": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz",
-          "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==",
-          "dev": true,
-          "requires": {
-            "micromatch": "^3.1.4",
-            "normalize-path": "^2.1.1"
-          }
-        },
-        "normalize-path": {
-          "version": "2.1.1",
-          "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
-          "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
-          "dev": true,
-          "requires": {
-            "remove-trailing-separator": "^1.0.1"
-          }
-        }
-      }
-    },
-    "sass": {
-      "version": "1.26.9",
-      "resolved": "https://registry.npmjs.org/sass/-/sass-1.26.9.tgz",
-      "integrity": "sha512-t8AkRVi+xvba4yZiLWkJdgJHBFCB3Dh4johniQkPy9ywkgFHNasXFEFP+RG/F6LhQ+aoE4aX+IorIWQjS0esVw==",
-      "dev": true,
-      "requires": {
-        "chokidar": ">=2.0.0 <4.0.0"
-      }
-    },
-    "sass-loader": {
-      "version": "8.0.2",
-      "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-8.0.2.tgz",
-      "integrity": "sha512-7o4dbSK8/Ol2KflEmSco4jTjQoV988bM82P9CZdmo9hR3RLnvNc0ufMNdMrB0caq38JQ/FgF4/7RcbcfKzxoFQ==",
-      "dev": true,
-      "requires": {
-        "clone-deep": "^4.0.1",
-        "loader-utils": "^1.2.3",
-        "neo-async": "^2.6.1",
-        "schema-utils": "^2.6.1",
-        "semver": "^6.3.0"
-      },
-      "dependencies": {
-        "json5": {
-          "version": "1.0.1",
-          "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
-          "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
-          "dev": true,
-          "requires": {
-            "minimist": "^1.2.0"
-          }
-        },
-        "loader-utils": {
-          "version": "1.4.0",
-          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz",
-          "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
-          "dev": true,
-          "requires": {
-            "big.js": "^5.2.2",
-            "emojis-list": "^3.0.0",
-            "json5": "^1.0.1"
-          }
-        },
-        "semver": {
-          "version": "6.3.0",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
-          "dev": true
-        }
-      }
-    },
-    "saucelabs": {
-      "version": "1.5.0",
-      "resolved": "https://registry.npmjs.org/saucelabs/-/saucelabs-1.5.0.tgz",
-      "integrity": "sha512-jlX3FGdWvYf4Q3LFfFWS1QvPg3IGCGWxIc8QBFdPTbpTJnt/v17FHXYVAn7C8sHf1yUXo2c7yIM0isDryfYtHQ==",
-      "dev": true,
-      "requires": {
-        "https-proxy-agent": "^2.2.1"
-      }
-    },
-    "sax": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz",
-      "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=",
-      "dev": true
-    },
-    "saxes": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz",
-      "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==",
-      "dev": true,
-      "requires": {
-        "xmlchars": "^2.2.0"
-      }
-    },
-    "schema-utils": {
-      "version": "2.7.0",
-      "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz",
-      "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==",
-      "dev": true,
-      "requires": {
-        "@types/json-schema": "^7.0.4",
-        "ajv": "^6.12.2",
-        "ajv-keywords": "^3.4.1"
-      }
-    },
-    "schematics-utilities": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/schematics-utilities/-/schematics-utilities-1.1.3.tgz",
-      "integrity": "sha512-5HnrH+MJkUmK7KfRpA457FY0BZatX2oxNts54P1347xlICCC7KjAh0r2Tue20Xfruw1mS3X5woTxa8od+JsqUA==",
-      "dev": true,
-      "requires": {
-        "@angular-devkit/core": "^7.3.6",
-        "@angular-devkit/schematics": "^7.3.6",
-        "npm-registry-client": "^8.5.1",
-        "parse5": "^5.0.0",
-        "rxjs": "^6.4.0",
-        "typescript": "^3.3.3333"
-      },
-      "dependencies": {
-        "@angular-devkit/core": {
-          "version": "7.3.10",
-          "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-7.3.10.tgz",
-          "integrity": "sha512-h8Yj2+UfBsPI7jZ8X88tImO/7RPgNWUcKF8Uq/J5eUSN6z0FMO0lluD4sM7X8aikb7RK8MwkwrqB/xfxvvkOow==",
-          "dev": true,
-          "requires": {
-            "ajv": "6.9.1",
-            "chokidar": "2.0.4",
-            "fast-json-stable-stringify": "2.0.0",
-            "rxjs": "6.3.3",
-            "source-map": "0.7.3"
-          },
-          "dependencies": {
-            "rxjs": {
-              "version": "6.3.3",
-              "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.3.tgz",
-              "integrity": "sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw==",
-              "dev": true,
-              "requires": {
-                "tslib": "^1.9.0"
-              }
-            }
-          }
-        },
-        "@angular-devkit/schematics": {
-          "version": "7.3.10",
-          "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-7.3.10.tgz",
-          "integrity": "sha512-LMTGQ8kJb80LjTttu0ZqWXddzYtDwjKtMKY9X0A60Iz8/wbGl0j+wYG7KAVoRF0JeieYXs8Dl9KWdjyJyvJ/RA==",
-          "dev": true,
-          "requires": {
-            "@angular-devkit/core": "7.3.10",
-            "rxjs": "6.3.3"
-          },
-          "dependencies": {
-            "rxjs": {
-              "version": "6.3.3",
-              "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.3.tgz",
-              "integrity": "sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw==",
-              "dev": true,
-              "requires": {
-                "tslib": "^1.9.0"
-              }
-            }
-          }
-        },
-        "ajv": {
-          "version": "6.9.1",
-          "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.9.1.tgz",
-          "integrity": "sha512-XDN92U311aINL77ieWHmqCcNlwjoP5cHXDxIxbf2MaPYuCXOHS7gHH8jktxeK5omgd52XbSTX6a4Piwd1pQmzA==",
-          "dev": true,
-          "requires": {
-            "fast-deep-equal": "^2.0.1",
-            "fast-json-stable-stringify": "^2.0.0",
-            "json-schema-traverse": "^0.4.1",
-            "uri-js": "^4.2.2"
-          }
-        },
-        "anymatch": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz",
-          "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==",
-          "dev": true,
-          "requires": {
-            "micromatch": "^3.1.4",
-            "normalize-path": "^2.1.1"
-          }
-        },
-        "binary-extensions": {
-          "version": "1.13.1",
-          "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz",
-          "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==",
-          "dev": true
-        },
-        "braces": {
-          "version": "2.3.2",
-          "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
-          "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
-          "dev": true,
-          "requires": {
-            "arr-flatten": "^1.1.0",
-            "array-unique": "^0.3.2",
-            "extend-shallow": "^2.0.1",
-            "fill-range": "^4.0.0",
-            "isobject": "^3.0.1",
-            "repeat-element": "^1.1.2",
-            "snapdragon": "^0.8.1",
-            "snapdragon-node": "^2.0.1",
-            "split-string": "^3.0.2",
-            "to-regex": "^3.0.1"
-          }
-        },
-        "chokidar": {
-          "version": "2.0.4",
-          "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz",
-          "integrity": "sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ==",
-          "dev": true,
-          "requires": {
-            "anymatch": "^2.0.0",
-            "async-each": "^1.0.0",
-            "braces": "^2.3.0",
-            "fsevents": "^1.2.2",
-            "glob-parent": "^3.1.0",
-            "inherits": "^2.0.1",
-            "is-binary-path": "^1.0.0",
-            "is-glob": "^4.0.0",
-            "lodash.debounce": "^4.0.8",
-            "normalize-path": "^2.1.1",
-            "path-is-absolute": "^1.0.0",
-            "readdirp": "^2.0.0",
-            "upath": "^1.0.5"
-          }
-        },
-        "extend-shallow": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-          "dev": true,
-          "requires": {
-            "is-extendable": "^0.1.0"
-          }
-        },
-        "fast-deep-equal": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz",
-          "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=",
-          "dev": true
-        },
-        "fast-json-stable-stringify": {
+      "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz",
+      "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==",
+      "dev": true,
+      "requires": {
+        "@cnakazawa/watch": "^1.0.3",
+        "anymatch": "^2.0.0",
+        "capture-exit": "^2.0.0",
+        "exec-sh": "^0.3.2",
+        "execa": "^1.0.0",
+        "fb-watchman": "^2.0.0",
+        "micromatch": "^3.1.4",
+        "minimist": "^1.1.1",
+        "walker": "~1.0.5"
+      },
+      "dependencies": {
+        "anymatch": {
           "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
-          "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=",
-          "dev": true
-        },
-        "fill-range": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
-          "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
-          "dev": true,
-          "requires": {
-            "extend-shallow": "^2.0.1",
-            "is-number": "^3.0.0",
-            "repeat-string": "^1.6.1",
-            "to-regex-range": "^2.1.0"
-          }
-        },
-        "fsevents": {
-          "version": "1.2.13",
-          "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz",
-          "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "bindings": "^1.5.0",
-            "nan": "^2.12.1"
-          }
-        },
-        "glob-parent": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
-          "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
-          "dev": true,
-          "requires": {
-            "is-glob": "^3.1.0",
-            "path-dirname": "^1.0.0"
-          },
-          "dependencies": {
-            "is-glob": {
-              "version": "3.1.0",
-              "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
-              "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
-              "dev": true,
-              "requires": {
-                "is-extglob": "^2.1.0"
-              }
-            }
-          }
-        },
-        "is-binary-path": {
-          "version": "1.0.1",
-          "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz",
-          "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
-          "dev": true,
-          "requires": {
-            "binary-extensions": "^1.0.0"
-          }
-        },
-        "is-number": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
-          "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
-          "dev": true,
-          "requires": {
-            "kind-of": "^3.0.2"
-          }
-        },
-        "kind-of": {
-          "version": "3.2.2",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+          "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz",
+          "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==",
           "dev": true,
           "requires": {
-            "is-buffer": "^1.1.5"
+            "micromatch": "^3.1.4",
+            "normalize-path": "^2.1.1"
           }
         },
         "normalize-path": {
@@ -18669,42 +18621,94 @@
           "requires": {
             "remove-trailing-separator": "^1.0.1"
           }
-        },
-        "readdirp": {
-          "version": "2.2.1",
-          "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz",
-          "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==",
+        }
+      }
+    },
+    "sass": {
+      "version": "1.26.9",
+      "resolved": "https://registry.npmjs.org/sass/-/sass-1.26.9.tgz",
+      "integrity": "sha512-t8AkRVi+xvba4yZiLWkJdgJHBFCB3Dh4johniQkPy9ywkgFHNasXFEFP+RG/F6LhQ+aoE4aX+IorIWQjS0esVw==",
+      "dev": true,
+      "requires": {
+        "chokidar": ">=2.0.0 <4.0.0"
+      }
+    },
+    "sass-loader": {
+      "version": "8.0.2",
+      "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-8.0.2.tgz",
+      "integrity": "sha512-7o4dbSK8/Ol2KflEmSco4jTjQoV988bM82P9CZdmo9hR3RLnvNc0ufMNdMrB0caq38JQ/FgF4/7RcbcfKzxoFQ==",
+      "dev": true,
+      "requires": {
+        "clone-deep": "^4.0.1",
+        "loader-utils": "^1.2.3",
+        "neo-async": "^2.6.1",
+        "schema-utils": "^2.6.1",
+        "semver": "^6.3.0"
+      },
+      "dependencies": {
+        "json5": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
+          "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
           "dev": true,
           "requires": {
-            "graceful-fs": "^4.1.11",
-            "micromatch": "^3.1.10",
-            "readable-stream": "^2.0.2"
+            "minimist": "^1.2.0"
           }
         },
-        "source-map": {
-          "version": "0.7.3",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
-          "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==",
-          "dev": true
-        },
-        "to-regex-range": {
-          "version": "2.1.1",
-          "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
-          "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
+        "loader-utils": {
+          "version": "1.4.0",
+          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz",
+          "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
           "dev": true,
           "requires": {
-            "is-number": "^3.0.0",
-            "repeat-string": "^1.6.1"
+            "big.js": "^5.2.2",
+            "emojis-list": "^3.0.0",
+            "json5": "^1.0.1"
           }
         },
-        "tslib": {
-          "version": "1.13.0",
-          "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz",
-          "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==",
+        "semver": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
           "dev": true
         }
       }
     },
+    "saucelabs": {
+      "version": "1.5.0",
+      "resolved": "https://registry.npmjs.org/saucelabs/-/saucelabs-1.5.0.tgz",
+      "integrity": "sha512-jlX3FGdWvYf4Q3LFfFWS1QvPg3IGCGWxIc8QBFdPTbpTJnt/v17FHXYVAn7C8sHf1yUXo2c7yIM0isDryfYtHQ==",
+      "dev": true,
+      "requires": {
+        "https-proxy-agent": "^2.2.1"
+      }
+    },
+    "sax": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz",
+      "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=",
+      "dev": true
+    },
+    "saxes": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz",
+      "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==",
+      "dev": true,
+      "requires": {
+        "xmlchars": "^2.2.0"
+      }
+    },
+    "schema-utils": {
+      "version": "2.7.0",
+      "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz",
+      "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==",
+      "dev": true,
+      "requires": {
+        "@types/json-schema": "^7.0.4",
+        "ajv": "^6.12.2",
+        "ajv-keywords": "^3.4.1"
+      }
+    },
     "scoped-regex": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/scoped-regex/-/scoped-regex-1.0.0.tgz",
@@ -18984,9 +18988,9 @@
       "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc="
     },
     "set-getter": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/set-getter/-/set-getter-0.1.0.tgz",
-      "integrity": "sha1-12nBgsnVpR9AkUXy+6guXoboA3Y=",
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/set-getter/-/set-getter-0.1.1.tgz",
+      "integrity": "sha512-9sVWOy+gthr+0G9DzqqLaYNA7+5OKkSmcqjL9cBpDEaZrr3ShQlyX2cZ/O/ozE41oxn/Tt0LGEM/w4Rub3A3gw==",
       "dev": true,
       "requires": {
         "to-object-path": "^0.3.0"
@@ -19180,12 +19184,6 @@
         }
       }
     },
-    "slide": {
-      "version": "1.1.6",
-      "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz",
-      "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=",
-      "dev": true
-    },
     "smart-buffer": {
       "version": "4.1.0",
       "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.1.0.tgz",
@@ -19674,9 +19672,9 @@
       }
     },
     "ssri": {
-      "version": "6.0.1",
-      "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz",
-      "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==",
+      "version": "6.0.2",
+      "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz",
+      "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==",
       "dev": true,
       "requires": {
         "figgy-pudding": "^3.5.1"
@@ -19866,23 +19864,23 @@
       }
     },
     "string.prototype.trimend": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz",
-      "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==",
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz",
+      "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==",
       "dev": true,
       "requires": {
-        "define-properties": "^1.1.3",
-        "es-abstract": "^1.17.5"
+        "call-bind": "^1.0.2",
+        "define-properties": "^1.1.3"
       }
     },
     "string.prototype.trimstart": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz",
-      "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==",
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz",
+      "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==",
       "dev": true,
       "requires": {
-        "define-properties": "^1.1.3",
-        "es-abstract": "^1.17.5"
+        "call-bind": "^1.0.2",
+        "define-properties": "^1.1.3"
       }
     },
     "string_decoder": {
@@ -20089,16 +20087,20 @@
           }
         },
         "css-what": {
-          "version": "3.3.0",
-          "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.3.0.tgz",
-          "integrity": "sha512-pv9JPyatiPaQ6pf4OvD/dbfm0o5LviWmwxNWzblYf/1u9QZd0ihV+PMwy5jdQWQ3349kZmKEx9WXuSka2dM4cg==",
+          "version": "3.4.2",
+          "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz",
+          "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==",
           "dev": true
         },
-        "domelementtype": {
-          "version": "1.3.1",
-          "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz",
-          "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==",
-          "dev": true
+        "dom-serializer": {
+          "version": "0.2.2",
+          "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz",
+          "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==",
+          "dev": true,
+          "requires": {
+            "domelementtype": "^2.0.1",
+            "entities": "^2.0.0"
+          }
         },
         "domutils": {
           "version": "1.7.0",
@@ -20108,6 +20110,23 @@
           "requires": {
             "dom-serializer": "0",
             "domelementtype": "1"
+          },
+          "dependencies": {
+            "domelementtype": {
+              "version": "1.3.1",
+              "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz",
+              "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==",
+              "dev": true
+            }
+          }
+        },
+        "nth-check": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz",
+          "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==",
+          "dev": true,
+          "requires": {
+            "boolbase": "~1.0.0"
           }
         },
         "sax": {
@@ -20636,9 +20655,9 @@
           "dev": true
         },
         "ssri": {
-          "version": "8.0.0",
-          "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.0.tgz",
-          "integrity": "sha512-aq/pz989nxVYwn16Tsbj1TqFpD5LLrQxHf5zaHuieFV+R0Bbr4y8qUsOA45hXT/N4/9UNXTarBjnjVmjSOVaAA==",
+          "version": "8.0.1",
+          "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz",
+          "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==",
           "dev": true,
           "requires": {
             "minipass": "^3.1.1"
@@ -21023,9 +21042,9 @@
       }
     },
     "trim-newlines": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.0.tgz",
-      "integrity": "sha512-C4+gOpvmxaSMKuEf9Qc134F1ZuOHVXKRbtEflf4NTtuuJDEIJ9p5PXsalL8SkeRw+qit1Mo+yuvMPAKwWg/1hA==",
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz",
+      "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==",
       "dev": true
     },
     "triple-beam": {
@@ -21299,9 +21318,9 @@
       "dev": true
     },
     "ua-parser-js": {
-      "version": "0.7.22",
-      "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.22.tgz",
-      "integrity": "sha512-YUxzMjJ5T71w6a8WWVcMGM6YWOTX27rCoIQgLXiWaxqXSx9D7DNjiGWn1aJIRSQ5qr0xuhra77bSIh6voR/46Q==",
+      "version": "0.7.28",
+      "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.28.tgz",
+      "integrity": "sha512-6Gurc1n//gjp9eQNXjD9O3M/sMwVtN5S8Lv9bvOYBfKfDNiIIhqiyi01vMBO45u4zkDE420w/e0se7Vs+sIg+g==",
       "dev": true
     },
     "uglify-js": {
@@ -21311,6 +21330,18 @@
       "dev": true,
       "optional": true
     },
+    "unbox-primitive": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz",
+      "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==",
+      "dev": true,
+      "requires": {
+        "function-bind": "^1.1.1",
+        "has-bigints": "^1.0.1",
+        "has-symbols": "^1.0.2",
+        "which-boxed-primitive": "^1.0.2"
+      }
+    },
     "unicode-canonical-property-names-ecmascript": {
       "version": "1.0.4",
       "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz",
@@ -21391,25 +21422,16 @@
       }
     },
     "universal-analytics": {
-      "version": "0.4.20",
-      "resolved": "https://registry.npmjs.org/universal-analytics/-/universal-analytics-0.4.20.tgz",
-      "integrity": "sha512-gE91dtMvNkjO+kWsPstHRtSwHXz0l2axqptGYp5ceg4MsuurloM0PU3pdOfpb5zBXUvyjT4PwhWK2m39uczZuw==",
+      "version": "0.4.23",
+      "resolved": "https://registry.npmjs.org/universal-analytics/-/universal-analytics-0.4.23.tgz",
+      "integrity": "sha512-lgMIH7XBI6OgYn1woDEmxhGdj8yDefMKg7GkWdeATAlQZFrMrNyxSkpDzY57iY0/6fdlzTbBV03OawvvzG+q7A==",
       "dev": true,
       "requires": {
-        "debug": "^3.0.0",
-        "request": "^2.88.0",
+        "debug": "^4.1.1",
+        "request": "^2.88.2",
         "uuid": "^3.0.0"
       },
       "dependencies": {
-        "debug": {
-          "version": "3.2.7",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
-          "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
-          "dev": true,
-          "requires": {
-            "ms": "^2.1.1"
-          }
-        },
         "uuid": {
           "version": "3.4.0",
           "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
@@ -21528,9 +21550,9 @@
       }
     },
     "url-parse": {
-      "version": "1.4.7",
-      "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.7.tgz",
-      "integrity": "sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==",
+      "version": "1.5.1",
+      "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.1.tgz",
+      "integrity": "sha512-HOfCOUJt7iSYzEx/UqgtwKRMC6EU91NFhsCHMv9oM03VJcVo2Qrp8T8kI9D7amFf1cu+/3CEhgb3rF9zL7k85Q==",
       "dev": true,
       "requires": {
         "querystringify": "^2.1.1",
@@ -21607,9 +21629,9 @@
       "dev": true
     },
     "uuid": {
-      "version": "8.1.0",
-      "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.1.0.tgz",
-      "integrity": "sha512-CI18flHDznR0lq54xBycOVmphdCYnQLKn8abKn7PXUiKUGdEd+/l9LWNJmugXel4hXq7S+RMNl34ecyC9TntWg==",
+      "version": "8.3.0",
+      "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.0.tgz",
+      "integrity": "sha512-fX6Z5o4m6XsXBdli9g7DtWgAx+osMsRRZFKma1mIUsLCz6vRvv+pz5VNbyu9UEDzpMWulZfvpgb/cmDXVulYFQ==",
       "dev": true
     },
     "v8-compile-cache": {
@@ -21760,9 +21782,9 @@
       }
     },
     "watchpack-chokidar2": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.0.tgz",
-      "integrity": "sha512-9TyfOyN/zLUbA288wZ8IsMZ+6cbzvsNyEzSBp6e/zkifi6xxbl8SmQ/CxQq32k8NNqrdVEVUVSEf56L4rQ/ZxA==",
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz",
+      "integrity": "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==",
       "dev": true,
       "optional": true,
       "requires": {
@@ -23133,15 +23155,6 @@
             }
           }
         },
-        "ws": {
-          "version": "6.2.1",
-          "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz",
-          "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==",
-          "dev": true,
-          "requires": {
-            "async-limiter": "~1.0.0"
-          }
-        },
         "yargs": {
           "version": "13.3.2",
           "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz",
@@ -23328,6 +23341,19 @@
         "isexe": "^2.0.0"
       }
     },
+    "which-boxed-primitive": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz",
+      "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==",
+      "dev": true,
+      "requires": {
+        "is-bigint": "^1.0.1",
+        "is-boolean-object": "^1.1.0",
+        "is-number-object": "^1.0.4",
+        "is-string": "^1.0.5",
+        "is-symbol": "^1.0.3"
+      }
+    },
     "which-module": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
@@ -23898,9 +23924,9 @@
       }
     },
     "workerpool": {
-      "version": "6.0.2",
-      "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.0.2.tgz",
-      "integrity": "sha512-DSNyvOpFKrNusaaUwk+ej6cBj1bmhLcBfj80elGk+ZIo5JSkq+unB1dLKEOcNfJDZgjGICfhQ0Q5TbP0PvF4+Q==",
+      "version": "6.1.0",
+      "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.0.tgz",
+      "integrity": "sha512-toV7q9rWNYha963Pl/qyeZ6wG+3nnsyvolaNUS8+R5Wtw6qJPTxIlOP1ZSvcGhEJw+l3HMMmtiNo9Gl61G4GVg==",
       "dev": true
     },
     "wrap-ansi": {
@@ -24001,9 +24027,9 @@
       }
     },
     "ws": {
-      "version": "6.1.4",
-      "resolved": "https://registry.npmjs.org/ws/-/ws-6.1.4.tgz",
-      "integrity": "sha512-eqZfL+NE/YQc1/ZynhojeV8q+H050oR8AZ2uIev7RU10svA9ZnJUddHcOUZTJLinZ9yEfdA2kSATS2qZK5fhJA==",
+      "version": "6.2.2",
+      "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz",
+      "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==",
       "dev": true,
       "requires": {
         "async-limiter": "~1.0.0"
@@ -24044,9 +24070,9 @@
       "dev": true
     },
     "xmlhttprequest-ssl": {
-      "version": "1.5.5",
-      "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz",
-      "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=",
+      "version": "1.6.3",
+      "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.6.3.tgz",
+      "integrity": "sha512-3XfeQE/wNkvrIktn2Kf0869fC0BN6UpydVasGIeSm2B1Llihf7/0UfZM+eCkOw3P7bP4+qPgqhm7ZoxuJtFU0Q==",
       "dev": true
     },
     "xtend": {
@@ -24665,6 +24691,12 @@
       "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==",
       "dev": true
     },
+    "yocto-queue": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+      "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+      "dev": true
+    },
     "yup": {
       "version": "0.27.0",
       "resolved": "https://registry.npmjs.org/yup/-/yup-0.27.0.tgz",
diff --git a/package.json b/package.json
index c3a1997d2f53dae120ac8332bbb958cc348ed353..525816fa9135a068742e540eeda76d17b39816b6 100644
--- a/package.json
+++ b/package.json
@@ -11,28 +11,31 @@
     "@angular/animations": "^12.0.4",
     "@angular/common": "10.0.0",
     "@angular/compiler": "10.0.0",
-    "@angular/core": "^10.0.0",
+    "@angular/core": "^10.2.5",
     "@angular/forms": "10.0.0",
     "@angular/localize": "10.0.0",
     "@angular/platform-browser": "10.0.0",
     "@angular/platform-browser-dynamic": "10.0.0",
     "@angular/router": "10.0.0",
     "@fortawesome/angular-fontawesome": "0.6.1",
-    "@fortawesome/fontawesome-svg-core": "1.2.29",
+    "@fortawesome/fontawesome-common-types": "^0.2.35",
+    "@fortawesome/fontawesome-free": "^5.15.3",
+    "@fortawesome/fontawesome-svg-core": "^1.2.29",
+    "@fortawesome/free-regular-svg-icons": "^5.15.3",
     "@fortawesome/free-solid-svg-icons": "5.13.1",
     "@ng-bootstrap/ng-bootstrap": "^7.0.0",
-    "@ng-select/ng-select": "^4.0.1",
+    "@ng-select/ng-select": "^4.0.4",
     "@ngx-translate/core": "12.1.2",
     "@ngx-translate/http-loader": "5.0.0",
     "angular-tag-cloud-module": "^5.3.0",
     "anymatch": "^3.1.2",
-    "bootstrap": "^4.5.2",
-    "jquery": "^3.5.1",
+    "bootstrap": "^4.6.0",
+    "jquery": "^3.6.0",
     "lodash": "^4.17.21",
     "moment": "2.27.0",
     "ng-jhipster": "0.14.0",
     "ngx-chips": "^2.2.2",
-    "ngx-cookie-service": "^3.0.4",
+    "ngx-cookie-service": "^3.1.3",
     "ngx-infinite-scroll": "9.0.0",
     "ngx-markdown": "^10.1.1",
     "ngx-webstorage": "5.0.0",
@@ -44,18 +47,18 @@
     "zone.js": "0.10.3"
   },
   "devDependencies": {
-    "@angular/cli": "^10.0.0",
+    "@angular/cli": "^10.2.3",
     "@angular/compiler-cli": "10.0.0",
-    "@ngqp/core": "^1.0.2",
+    "@ngqp/core": "^1.2.0",
     "@ngtools/webpack": "10.0.0",
     "@openapitools/openapi-generator-cli": "1.0.13-4.3.1",
     "@types/chai": "4.2.11",
     "@types/chai-string": "1.4.2",
     "@types/jest": "26.0.3",
-    "@types/lodash": "^4.14.168",
+    "@types/lodash": "^4.14.170",
     "@types/mocha": "7.0.2",
     "@types/node": "^13.13.52",
-    "@types/prismjs": "^1.9.0",
+    "@types/prismjs": "^1.16.5",
     "@types/selenium-webdriver": "4.0.9",
     "@typescript-eslint/eslint-plugin": "2.30.0",
     "@typescript-eslint/eslint-plugin-tslint": "2.30.0",
@@ -87,7 +90,7 @@
     "lint-staged": "8.2.1",
     "merge-jsons-webpack-plugin": "1.0.21",
     "mini-css-extract-plugin": "0.9.0",
-    "mocha": "^8.2.1",
+    "mocha": "^8.4.0",
     "moment-locales-webpack-plugin": "1.2.0",
     "optimize-css-assets-webpack-plugin": "5.0.3",
     "postcss-loader": "3.0.0",
diff --git a/pom.xml b/pom.xml
index 4e2136570db72b90551f0c05ae34f24569988d96..1baf984bdc98737131da97d250a14cfd3adf0ace 100644
--- a/pom.xml
+++ b/pom.xml
@@ -141,7 +141,7 @@
 		<dependency>
 		    <groupId>org.codeability.sharing</groupId>
 		    <artifactId>SharingPluginPlatformAPI</artifactId>
-		    <version>0.1.2</version>
+		    <version>0.1.8</version>
 		</dependency>
         <dependency>
             <groupId>com.h2database</groupId>
diff --git a/src/main/java/at/ac/uibk/gitsearch/GitsearchApp.java b/src/main/java/at/ac/uibk/gitsearch/GitsearchApp.java
index 7320d14473230a63d872dbfde1fd8737236269e6..cc24ac789519f0c6fde4fafe5ae952a9adb61486 100644
--- a/src/main/java/at/ac/uibk/gitsearch/GitsearchApp.java
+++ b/src/main/java/at/ac/uibk/gitsearch/GitsearchApp.java
@@ -10,6 +10,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.jmx.JmxAutoConfiguration;
 import org.springframework.boot.autoconfigure.liquibase.LiquibaseProperties;
 import org.springframework.boot.context.properties.EnableConfigurationProperties;
 import org.springframework.core.env.Environment;
@@ -20,7 +21,7 @@ import java.net.UnknownHostException;
 import java.util.Arrays;
 import java.util.Collection;
 
-@SpringBootApplication
+@SpringBootApplication(exclude = JmxAutoConfiguration.class)
 @EnableConfigurationProperties({LiquibaseProperties.class, ApplicationProperties.class})
 public class GitsearchApp {
 
diff --git a/src/main/java/at/ac/uibk/gitsearch/config/CacheConfiguration.java b/src/main/java/at/ac/uibk/gitsearch/config/CacheConfiguration.java
index bca39dd25929c1566aa5402e8ec3251ea90329b3..ea1d0280c26e1045e519320d565b329e36af762c 100644
--- a/src/main/java/at/ac/uibk/gitsearch/config/CacheConfiguration.java
+++ b/src/main/java/at/ac/uibk/gitsearch/config/CacheConfiguration.java
@@ -52,6 +52,7 @@ public class CacheConfiguration {
             createCache(cm, at.ac.uibk.gitsearch.domain.UserWatchList.class.getName());
             createCache(cm, at.ac.uibk.gitsearch.domain.WatchListEntry.class.getName());
             createCache(cm, at.ac.uibk.gitsearch.domain.SavedSearches.class.getName());
+            createCache(cm, at.ac.uibk.gitsearch.domain.Likes.class.getName());
             // jhipster-needle-ehcache-add-entry
         };
     }
diff --git a/src/main/java/at/ac/uibk/gitsearch/config/SecurityConfiguration.java b/src/main/java/at/ac/uibk/gitsearch/config/SecurityConfiguration.java
index 6a06679a02bb8f7ae1bf6aaffc4d61a01d618c45..eef3ee72e28f893c3e0b31cf6a06b511cb7543ae 100644
--- a/src/main/java/at/ac/uibk/gitsearch/config/SecurityConfiguration.java
+++ b/src/main/java/at/ac/uibk/gitsearch/config/SecurityConfiguration.java
@@ -158,12 +158,16 @@ public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
             .antMatchers("/api/pluginIF/**").permitAll() // plugins calls are always allowed, security by tokens
             .antMatchers("/api/applicationInfo/**").permitAll() // everybody may retrieve deployment infos
             .antMatchers("/api/authenticate").permitAll()
+            .antMatchers("/api/exerciseFile/**").permitAll()
             .antMatchers("/api/exercise/**").permitAll()
+            .antMatchers("/api/exerciseFile/**").permitAll()
             .antMatchers("/api/refreshToken").permitAll()
             .antMatchers("/api/register").denyAll()
             .antMatchers("/api/activate").permitAll()
             .antMatchers("/api/account/reset-password/init").permitAll()
             .antMatchers("/api/account/reset-password/finish").permitAll()
+            .antMatchers("/api/numberOfLikes/**").permitAll()
+            .antMatchers("/api/hasLiked/**").permitAll()
             .antMatchers("/api/**").authenticated()
             .antMatchers("/management/health").permitAll()
             .antMatchers("/management/info").permitAll()
diff --git a/src/main/java/at/ac/uibk/gitsearch/domain/Authority.java b/src/main/java/at/ac/uibk/gitsearch/domain/Authority.java
index fdaa67e7b528477ce37e077fa938e39148aab6f8..7df972d5f17a909244dfbb7da029999fc70dec86 100644
--- a/src/main/java/at/ac/uibk/gitsearch/domain/Authority.java
+++ b/src/main/java/at/ac/uibk/gitsearch/domain/Authority.java
@@ -20,6 +20,15 @@ import java.util.Objects;
 public class Authority implements Serializable {
 
     private static final long serialVersionUID = 1L;
+    
+    public Authority(@NotNull @Size(max = 50) String name) {
+		super();
+		this.name = name;
+	}
+
+    public Authority() {
+    	// For JPA
+	}
 
     @NotNull
     @Size(max = 50)
diff --git a/src/main/java/at/ac/uibk/gitsearch/domain/Likes.java b/src/main/java/at/ac/uibk/gitsearch/domain/Likes.java
new file mode 100644
index 0000000000000000000000000000000000000000..7a9aa2a54d4fb433099d636614155e43f8b49406
--- /dev/null
+++ b/src/main/java/at/ac/uibk/gitsearch/domain/Likes.java
@@ -0,0 +1,115 @@
+package at.ac.uibk.gitsearch.domain;
+
+import org.hibernate.annotations.Cache;
+import org.hibernate.annotations.CacheConcurrencyStrategy;
+
+import javax.persistence.*;
+import javax.validation.constraints.*;
+
+import org.springframework.data.elasticsearch.annotations.FieldType;
+import java.io.Serializable;
+import java.time.LocalDate;
+
+/**
+ * A Likes.
+ */
+@Entity
+@Table(name = "likes")
+@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
+@org.springframework.data.elasticsearch.annotations.Document(indexName = "likes")
+public class Likes implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    private Long id;
+
+    @NotNull
+    @Column(name = "date", nullable = false)
+    private LocalDate date;
+
+    @NotNull
+    @Column(name = "user_id", nullable = false)
+    private Integer userID;
+
+    @NotNull
+    @Column(name = "exercise_id", nullable = false)
+    private String exerciseID;
+
+    // jhipster-needle-entity-add-field - JHipster will add fields here
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public LocalDate getDate() {
+        return date;
+    }
+
+    public Likes date(LocalDate date) {
+        this.date = date;
+        return this;
+    }
+
+    public void setDate(LocalDate date) {
+        this.date = date;
+    }
+
+    public Integer getUserID() {
+        return userID;
+    }
+
+    public Likes userID(Integer userID) {
+        this.userID = userID;
+        return this;
+    }
+
+    public void setUserID(Integer userID) {
+        this.userID = userID;
+    }
+
+    public String getExerciseID() {
+        return exerciseID;
+    }
+
+    public Likes exerciseID(String exerciseID) {
+        this.exerciseID = exerciseID;
+        return this;
+    }
+
+    public void setExerciseID(String exerciseID) {
+        this.exerciseID = exerciseID;
+    }
+    // jhipster-needle-entity-add-getters-setters - JHipster will add getters and setters here
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (!(o instanceof Likes)) {
+            return false;
+        }
+        return id != null && id.equals(((Likes) o).id);
+    }
+
+    @Override
+    public int hashCode() {
+        return 31;
+    }
+
+    // prettier-ignore
+    @Override
+    public String toString() {
+        return "Likes{" +
+            "id=" + getId() +
+            ", date='" + getDate() + "'" +
+            ", userID=" + getUserID() +
+            ", exerciseID=" + getExerciseID() +
+            "}";
+    }
+}
diff --git a/src/main/java/at/ac/uibk/gitsearch/domain/SavedSearches.java b/src/main/java/at/ac/uibk/gitsearch/domain/SavedSearches.java
index cd0e2735a0ec00f46d231be3ffea9eec900ad7aa..4a3c11f267327c2cd0b17e4955666a2c7e6f759d 100644
--- a/src/main/java/at/ac/uibk/gitsearch/domain/SavedSearches.java
+++ b/src/main/java/at/ac/uibk/gitsearch/domain/SavedSearches.java
@@ -7,7 +7,6 @@ import org.hibernate.annotations.CacheConcurrencyStrategy;
 import javax.persistence.*;
 import javax.validation.constraints.*;
 
-import org.springframework.data.elasticsearch.annotations.FieldType;
 import java.io.Serializable;
 
 /**
@@ -35,9 +34,10 @@ public class SavedSearches implements Serializable {
     private String jsonQuery;
 
     @ManyToOne(optional = false)
+    @JoinColumn(name = "userId")
     @NotNull
     @JsonIgnoreProperties(value = "savedSearches", allowSetters = true)
-    private User userId;
+    private User user;
 
     // jhipster-needle-entity-add-field - JHipster will add fields here
     public Long getId() {
@@ -74,17 +74,12 @@ public class SavedSearches implements Serializable {
         this.jsonQuery = jsonQuery;
     }
 
-    public User getUserId() {
-        return userId;
+    public User getUser() {
+        return user;
     }
 
-    public SavedSearches userId(User user) {
-        this.userId = user;
-        return this;
-    }
-
-    public void setUserId(User user) {
-        this.userId = user;
+    public void setUser(User user) {
+        this.user = user;
     }
     // jhipster-needle-entity-add-getters-setters - JHipster will add getters and setters here
 
diff --git a/src/main/java/at/ac/uibk/gitsearch/domain/Statistics.java b/src/main/java/at/ac/uibk/gitsearch/domain/Statistics.java
index 35e5e91cdb25c521b94a1e23b40b0e63b0ee6991..3c1ece460cd05aab3c7bb7c333c7678f8ffa014c 100644
--- a/src/main/java/at/ac/uibk/gitsearch/domain/Statistics.java
+++ b/src/main/java/at/ac/uibk/gitsearch/domain/Statistics.java
@@ -6,14 +6,13 @@ import org.hibernate.annotations.CacheConcurrencyStrategy;
 import javax.persistence.*;
 import javax.validation.constraints.*;
 
-import org.springframework.data.elasticsearch.annotations.FieldType;
 import java.io.Serializable;
 
 /**
  * A Statistics.
  */
 @Entity
-@Table(name = "statistics")
+@Table(name = "statistics", indexes = @Index(columnList = "exercise_id"))
 @Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
 @org.springframework.data.elasticsearch.annotations.Document(indexName = "statistics")
 public class Statistics implements Serializable {
@@ -32,7 +31,7 @@ public class Statistics implements Serializable {
     private Integer downloads;
 
     @Column(name = "exercise_id")
-    private Long exerciseID;
+    private String exerciseID;
 
     // jhipster-needle-entity-add-field - JHipster will add fields here
     public Long getId() {
@@ -69,16 +68,16 @@ public class Statistics implements Serializable {
         this.downloads = downloads;
     }
 
-    public Long getExerciseID() {
+    public String getExerciseID() {
         return exerciseID;
     }
 
-    public Statistics exerciseID(Long exerciseID) {
+    public Statistics exerciseID(String exerciseID) {
         this.exerciseID = exerciseID;
         return this;
     }
 
-    public void setExerciseID(Long exerciseID) {
+    public void setExerciseID(String exerciseID) {
         this.exerciseID = exerciseID;
     }
     // jhipster-needle-entity-add-getters-setters - JHipster will add getters and setters here
diff --git a/src/main/java/at/ac/uibk/gitsearch/domain/User.java b/src/main/java/at/ac/uibk/gitsearch/domain/User.java
index 424b279a1691425417a1a7b5e8d43c1db6637b01..ceab1e74e8026f551c0035a80d024a753104d684 100644
--- a/src/main/java/at/ac/uibk/gitsearch/domain/User.java
+++ b/src/main/java/at/ac/uibk/gitsearch/domain/User.java
@@ -94,6 +94,13 @@ public class User extends AbstractAuditingEntity implements Serializable {
     @Column(name = "reset_date")
     private Instant resetDate = null;
 
+
+    @Column(name = "last_login", nullable = true)
+    private Instant lastLogin;
+
+    @Column(name = "last_mail_sent", nullable = true)
+    private Instant lastMailSent;
+
     @JsonIgnore
     @ManyToMany
     @JoinTable(
@@ -209,6 +216,23 @@ public class User extends AbstractAuditingEntity implements Serializable {
     public void setAuthorities(Set<Authority> authorities) {
         this.authorities = authorities;
     }
+    
+    public Instant getLastLogin() {
+        return lastLogin;
+    }
+
+    public void setLastLogin(Instant lastLogin) {
+        this.lastLogin = lastLogin;
+    }
+
+    public Instant getLastMailSent() {
+        return lastMailSent;
+    }
+
+    public void setLastMailSent(Instant lastMailSent) {
+        this.lastMailSent = lastMailSent;
+    }
+
 
     @Override
     public boolean equals(Object o) {
diff --git a/src/main/java/at/ac/uibk/gitsearch/domain/UserWatchList.java b/src/main/java/at/ac/uibk/gitsearch/domain/UserWatchList.java
index 697184244dcb88f16be3d53ffeefe66750afe99a..dcdc724c98c148fa75144661af1df90e4d72927a 100644
--- a/src/main/java/at/ac/uibk/gitsearch/domain/UserWatchList.java
+++ b/src/main/java/at/ac/uibk/gitsearch/domain/UserWatchList.java
@@ -1,14 +1,17 @@
 package at.ac.uibk.gitsearch.domain;
 
 import java.io.Serializable;
+import java.util.HashSet;
 import java.util.Set;
 
-import javax.persistence.CascadeType;
 import javax.persistence.Column;
 import javax.persistence.Entity;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
 import javax.persistence.GeneratedValue;
 import javax.persistence.GenerationType;
 import javax.persistence.Id;
+import javax.persistence.JoinColumn;
 import javax.persistence.ManyToOne;
 import javax.persistence.OneToMany;
 import javax.persistence.Table;
@@ -20,6 +23,8 @@ import org.hibernate.annotations.CacheConcurrencyStrategy;
 
 import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
 
+import at.ac.uibk.gitsearch.domain.enumeration.CheckFrequency;
+
 /**
  * A UserWatchList.
  */
@@ -29,7 +34,19 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
 @org.springframework.data.elasticsearch.annotations.Document(indexName = "userwatchlist")
 public class UserWatchList implements Serializable {
 
-    private static final long serialVersionUID = 1L;
+    public UserWatchList(@NotNull @Size(min = 1) String name, @NotNull CheckFrequency checkFrequency,
+			@NotNull User user) {
+		super();
+		this.name = name;
+		this.checkFrequency = checkFrequency;
+		this.user = user;
+		this.watchListEntries = new HashSet<>();
+	}
+
+    public UserWatchList() {
+    	// JPA
+    }
+	private static final long serialVersionUID = 1L;
 
     @Id
     @GeneratedValue(strategy = GenerationType.IDENTITY)
@@ -40,10 +57,16 @@ public class UserWatchList implements Serializable {
     @Column(name = "name", nullable = false)
     private String name;
 
+    @NotNull
+    @Enumerated(EnumType.ORDINAL)
+    @Column(name = "check_frequency", nullable = false)
+    private CheckFrequency checkFrequency;
+
     @ManyToOne(optional = false)
+    @JoinColumn(name = "userId")
     @NotNull
     @JsonIgnoreProperties(value = "userWatchLists", allowSetters = true)
-    private User userId;
+    private User user;
 
     @OneToMany(mappedBy = "watchlist", orphanRemoval = true)
     private Set<WatchListEntry> watchListEntries;
@@ -70,17 +93,25 @@ public class UserWatchList implements Serializable {
         this.name = name;
     }
 
-    public User getUserId() {
-        return userId;
+    public CheckFrequency getCheckFrequency() {
+        return checkFrequency;
     }
 
-    public UserWatchList userId(User user) {
-        this.userId = user;
+    public UserWatchList checkFrequency(CheckFrequency checkFrequency) {
+        this.checkFrequency = checkFrequency;
         return this;
     }
 
-    public void setUserId(User user) {
-        this.userId = user;
+    public void setCheckFrequency(CheckFrequency checkFrequency) {
+        this.checkFrequency = checkFrequency;
+    }
+
+    public User getUser() {
+        return user;
+    }
+
+    public void setUser(User user) {
+        this.user = user;
     }
     // jhipster-needle-entity-add-getters-setters - JHipster will add getters and setters here
 
@@ -98,7 +129,7 @@ public class UserWatchList implements Serializable {
 		this.watchListEntries = watchListEntries;
 	}
 
-	@Override
+    @Override
     public boolean equals(Object o) {
         if (this == o) {
             return true;
@@ -120,6 +151,7 @@ public class UserWatchList implements Serializable {
         return "UserWatchList{" +
             "id=" + getId() +
             ", name='" + getName() + "'" +
+            ", checkFrequency='" + getCheckFrequency() + "'" +
             "}";
     }
 }
diff --git a/src/main/java/at/ac/uibk/gitsearch/domain/enumeration/CheckFrequency.java b/src/main/java/at/ac/uibk/gitsearch/domain/enumeration/CheckFrequency.java
new file mode 100644
index 0000000000000000000000000000000000000000..1296cc32c0abd51fc25c7f4f61aa3ea457fa0000
--- /dev/null
+++ b/src/main/java/at/ac/uibk/gitsearch/domain/enumeration/CheckFrequency.java
@@ -0,0 +1,23 @@
+package at.ac.uibk.gitsearch.domain.enumeration;
+
+import java.time.Instant;
+import java.time.temporal.ChronoUnit;
+
+/**
+ * The CheckFrequency enumeration.
+ */
+public enum CheckFrequency {
+    NEVER, DAILY, WEEKLY, MONTHLY;
+	
+	public Instant getChangedBefore() {
+		Instant now = Instant.now();
+		switch(this) {
+		case NEVER: return now;
+		case DAILY: return now.minus(1, ChronoUnit.DAYS);
+		case WEEKLY: return now.minus(7, ChronoUnit.DAYS);
+		case MONTHLY: return now.minus(30, ChronoUnit.DAYS);
+		default: // should never happen
+			return now;
+		}
+	}
+}
diff --git a/src/main/java/at/ac/uibk/gitsearch/repository/AuthorityRepository.java b/src/main/java/at/ac/uibk/gitsearch/repository/AuthorityRepository.java
index 00c7f12877d99c970aece2232ccc87e67ebe4fac..7ff5e1e648a963eb617d9d2d5d4362bf6e8e4541 100644
--- a/src/main/java/at/ac/uibk/gitsearch/repository/AuthorityRepository.java
+++ b/src/main/java/at/ac/uibk/gitsearch/repository/AuthorityRepository.java
@@ -1,11 +1,27 @@
 package at.ac.uibk.gitsearch.repository;
 
-import at.ac.uibk.gitsearch.domain.Authority;
+import java.util.List;
 
 import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+
+import at.ac.uibk.gitsearch.domain.Authority;
 
 /**
  * Spring Data JPA repository for the {@link Authority} entity.
  */
 public interface AuthorityRepository extends JpaRepository<Authority, String> {
+	
+	@Query("DELETE FROM Authority auth WHERE not exists (SELECT u FROM User u WHERE auth member u.authorities)")
+	@Modifying
+	void deleteUnusedAuthorities();
+	
+	/**
+	 * mainly for test purposes only. Returns all authentications that are used by some user
+	 * @return
+	 */
+	@Query("SELECT DISTINCT u.authorities  FROM User u ")
+	List<Authority> getUsedAuthorities();
+
 }
diff --git a/src/main/java/at/ac/uibk/gitsearch/repository/LikesRepository.java b/src/main/java/at/ac/uibk/gitsearch/repository/LikesRepository.java
new file mode 100644
index 0000000000000000000000000000000000000000..8d6e9cd667d89644fd235164e91bdab64a2e67f3
--- /dev/null
+++ b/src/main/java/at/ac/uibk/gitsearch/repository/LikesRepository.java
@@ -0,0 +1,20 @@
+package at.ac.uibk.gitsearch.repository;
+
+import at.ac.uibk.gitsearch.domain.Likes;
+
+import org.springframework.data.jpa.repository.*;
+import org.springframework.stereotype.Repository;
+
+/**
+ * Spring Data repository for the Likes entity.
+ */
+@SuppressWarnings("unused")
+@Repository
+public interface LikesRepository extends JpaRepository<Likes, Long>, JpaSpecificationExecutor<Likes> {
+
+    @Query(value = "SELECT * FROM LIKES u where u.user_id = ?1 and exercise_id = ?2", nativeQuery = true)
+    Likes findLikesByUserIDandExerciseID(Integer userID, String ExerciseID);
+
+    @Query(value = "SELECT COUNT(u.exercise_id) FROM LIKES u where exercise_id = ?1", nativeQuery = true)
+    Integer findNumberOfLikesByExerciseID(String ExerciseID);
+}
diff --git a/src/main/java/at/ac/uibk/gitsearch/repository/SavedSearchesRepository.java b/src/main/java/at/ac/uibk/gitsearch/repository/SavedSearchesRepository.java
index b083b8c7ef3f9cf62f9671abc3a4b4c48a5bfc83..efa86a177479794c8eb6a45e5f5977a2464efb77 100644
--- a/src/main/java/at/ac/uibk/gitsearch/repository/SavedSearchesRepository.java
+++ b/src/main/java/at/ac/uibk/gitsearch/repository/SavedSearchesRepository.java
@@ -14,6 +14,6 @@ import java.util.List;
 @Repository
 public interface SavedSearchesRepository extends JpaRepository<SavedSearches, Long> {
 
-    @Query("select savedSearches from SavedSearches savedSearches where savedSearches.userId.login = ?#{principal.username}")
-    List<SavedSearches> findByUserIdIsCurrentUser();
+    @Query("select savedSearches from SavedSearches savedSearches where savedSearches.user.login = ?#{principal.username}")
+    List<SavedSearches> findByUserIsCurrentUser();
 }
diff --git a/src/main/java/at/ac/uibk/gitsearch/repository/StatisticsRepository.java b/src/main/java/at/ac/uibk/gitsearch/repository/StatisticsRepository.java
index d654a0c5ab2005bd7c090b7091deb4f6d8c66478..3a1fc4b3cd1aa070d5aaf888128329cb8c6524cf 100644
--- a/src/main/java/at/ac/uibk/gitsearch/repository/StatisticsRepository.java
+++ b/src/main/java/at/ac/uibk/gitsearch/repository/StatisticsRepository.java
@@ -13,5 +13,5 @@ import at.ac.uibk.gitsearch.domain.Statistics;
 @Repository
 public interface StatisticsRepository extends JpaRepository<Statistics, Long> {
 
-    Optional<Statistics> findByExerciseID(Long id);
+    Optional<Statistics> findByExerciseID(String id);
 }
diff --git a/src/main/java/at/ac/uibk/gitsearch/repository/UserWatchListRepository.java b/src/main/java/at/ac/uibk/gitsearch/repository/UserWatchListRepository.java
index 336983358b21c5ad06db94a497118e3c92f639d2..13524c09ee70ebd82082c850755705275de45148 100644
--- a/src/main/java/at/ac/uibk/gitsearch/repository/UserWatchListRepository.java
+++ b/src/main/java/at/ac/uibk/gitsearch/repository/UserWatchListRepository.java
@@ -1,6 +1,7 @@
 package at.ac.uibk.gitsearch.repository;
 
-import java.util.List;
+import at.ac.uibk.gitsearch.domain.User;
+import at.ac.uibk.gitsearch.domain.UserWatchList;
 
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
@@ -10,16 +11,16 @@ import org.springframework.data.jpa.repository.Query;
 import org.springframework.data.repository.query.Param;
 import org.springframework.stereotype.Repository;
 
-import at.ac.uibk.gitsearch.domain.UserWatchList;
-
+import java.util.List;
 /**
  * Spring Data  repository for the UserWatchList entity.
  */
+@SuppressWarnings("unused")
 @Repository
 public interface UserWatchListRepository extends JpaRepository<UserWatchList, Long>, JpaSpecificationExecutor<UserWatchList> {
 
-    @Query("select userWatchList from UserWatchList userWatchList where userWatchList.userId.login = ?#{principal.username}")
-    List<UserWatchList> findByUserIdIsCurrentUser();
+    @Query("select userWatchList from UserWatchList userWatchList where userWatchList.user.login = ?#{principal.username}")
+    List<UserWatchList> findByUserIsCurrentUser();
     
     @Query("select uwl from UserWatchList uwl where uwl.name LIKE CONCAT('%',:query,'%')")
     Page<UserWatchList> search(@Param("query") String query, Pageable pageable);
@@ -27,12 +28,12 @@ public interface UserWatchListRepository extends JpaRepository<UserWatchList, Lo
     /**
 	 * Returns all watchlists of the current user.
 	 *
-	 * @param userId the id of the user
+	 * @param user the user
 	 * @return the list of watchlists
 	 */
-	List<UserWatchList> findByUserId(long UserId);
+	List<UserWatchList> findByUser(User user);
 
-    @Query("select uwl from UserWatchList uwl where uwl.userId.login = ?#{principal.username} AND uwl.name LIKE CONCAT('%',:query,'%')")
+    @Query("select uwl from UserWatchList uwl where uwl.user.login = ?#{principal.username} AND uwl.name LIKE CONCAT('%',:query,'%')")
     Page<UserWatchList> searchForCurrentUser(@Param("query") String query, Pageable pageable);
 
 
diff --git a/src/main/java/at/ac/uibk/gitsearch/repository/search/GitFilesRepository.java b/src/main/java/at/ac/uibk/gitsearch/repository/search/GitFilesRepository.java
index 662c29ef3dbdcc8ec30679db782cca488cf7a3bb..750df7fbb672c613f4a5b90eb06169bc8475baf6 100644
--- a/src/main/java/at/ac/uibk/gitsearch/repository/search/GitFilesRepository.java
+++ b/src/main/java/at/ac/uibk/gitsearch/repository/search/GitFilesRepository.java
@@ -2,13 +2,14 @@ package at.ac.uibk.gitsearch.repository.search;
 
 import java.io.IOException;
 
+import org.codeability.sharing.plugins.api.search.SearchInputDTO;
+
 import at.ac.uibk.gitsearch.service.dto.GitFilesAggregationDTO;
 import at.ac.uibk.gitsearch.service.dto.GitFilesPageDetailsDTO;
-import at.ac.uibk.gitsearch.service.dto.SearchInputDTO;
 
 public interface GitFilesRepository {
 
-    GitFilesPageDetailsDTO pageDetails(SearchInputDTO searchInputDTO, int pageSize) throws IOException;
+    GitFilesPageDetailsDTO pageDetails(SearchInputDTO searchInputDTO) throws IOException;
 
     GitFilesAggregationDTO aggregation(String query) throws IOException;
 }
diff --git a/src/main/java/at/ac/uibk/gitsearch/repository/search/GitFilesRepositoryImpl.java b/src/main/java/at/ac/uibk/gitsearch/repository/search/GitFilesRepositoryImpl.java
index 195b9eb22f4ab86318118657cbe2f22859da73d8..f15ba7a3c8c3247b0b74858e9ac0f8aea96b45c7 100644
--- a/src/main/java/at/ac/uibk/gitsearch/repository/search/GitFilesRepositoryImpl.java
+++ b/src/main/java/at/ac/uibk/gitsearch/repository/search/GitFilesRepositoryImpl.java
@@ -1,14 +1,11 @@
 package at.ac.uibk.gitsearch.repository.search;
 
-import at.ac.uibk.gitsearch.config.ApplicationProperties;
-import at.ac.uibk.gitsearch.es.model.DocumentInfo;
-import at.ac.uibk.gitsearch.service.dto.GitFilesAggregationDTO;
-import at.ac.uibk.gitsearch.service.dto.GitFilesDTO;
-import at.ac.uibk.gitsearch.service.dto.GitFilesPageDetailsDTO;
-import at.ac.uibk.gitsearch.service.dto.SearchInputDTO;
-import com.fasterxml.jackson.databind.DeserializationFeature;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import org.codeability.sharing.plugins.api.search.SearchInputDTO;
 import org.elasticsearch.action.search.SearchRequest;
 import org.elasticsearch.action.search.SearchResponse;
 import org.elasticsearch.client.RequestOptions;
@@ -22,10 +19,15 @@ import org.elasticsearch.search.builder.SearchSourceBuilder;
 import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
 import org.springframework.stereotype.Repository;
 
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
+
+import at.ac.uibk.gitsearch.config.ApplicationProperties;
+import at.ac.uibk.gitsearch.es.model.DocumentInfo;
+import at.ac.uibk.gitsearch.service.dto.GitFilesAggregationDTO;
+import at.ac.uibk.gitsearch.service.dto.GitFilesDTO;
+import at.ac.uibk.gitsearch.service.dto.GitFilesPageDetailsDTO;
 
 @Repository
 public class GitFilesRepositoryImpl implements GitFilesRepository {
@@ -41,8 +43,9 @@ public class GitFilesRepositoryImpl implements GitFilesRepository {
         this.properties = properties;
     }
 
-    @Override
-    public GitFilesPageDetailsDTO pageDetails(SearchInputDTO searchInputDTO, int pageSize) throws IOException {
+    @SuppressWarnings("deprecation")
+	@Override
+    public GitFilesPageDetailsDTO pageDetails(SearchInputDTO searchInputDTO) throws IOException {
         Collection<String> projectIDs = searchProjectsIDsMetadata(searchInputDTO);
         SearchRequest searchRequest = new SearchRequest(SearchRepositoryConstants.INDEX_FULLTEXT);
 
@@ -77,8 +80,8 @@ public class GitFilesRepositoryImpl implements GitFilesRepository {
         SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
         sourceBuilder.query(queryBuilder)
             .highlighter(highlightBuilder)
-            .size(pageSize)
-            .from((searchInputDTO.getPage() - 1) * pageSize);
+            .size(searchInputDTO.getPageSize())
+            .from((searchInputDTO.getPage() - 1) * searchInputDTO.getPageSize());
         //.fetchSource(includes, excludes);
 
         searchRequest.source(sourceBuilder);
diff --git a/src/main/java/at/ac/uibk/gitsearch/repository/search/LikesSearchRepository.java b/src/main/java/at/ac/uibk/gitsearch/repository/search/LikesSearchRepository.java
new file mode 100644
index 0000000000000000000000000000000000000000..2c2dc39abb2b8d6a8bf368fd3472a9824aad3881
--- /dev/null
+++ b/src/main/java/at/ac/uibk/gitsearch/repository/search/LikesSearchRepository.java
@@ -0,0 +1,11 @@
+package at.ac.uibk.gitsearch.repository.search;
+
+import at.ac.uibk.gitsearch.domain.Likes;
+import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
+
+
+/**
+ * Spring Data Elasticsearch repository for the {@link Likes} entity.
+ */
+public interface LikesSearchRepository extends ElasticsearchRepository<Likes, Long> {
+}
diff --git a/src/main/java/at/ac/uibk/gitsearch/repository/search/MetaDataRepository.java b/src/main/java/at/ac/uibk/gitsearch/repository/search/MetaDataRepository.java
index bd8182de62f02fcf15a772fe92f6d0316befdd1b..2a21de546f6b9ba2a595fc1aa937b0cb4b69cee5 100644
--- a/src/main/java/at/ac/uibk/gitsearch/repository/search/MetaDataRepository.java
+++ b/src/main/java/at/ac/uibk/gitsearch/repository/search/MetaDataRepository.java
@@ -1,6 +1,7 @@
 package at.ac.uibk.gitsearch.repository.search;
 
 import java.io.IOException;
+import java.time.Instant;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
@@ -20,8 +21,13 @@ import java.util.stream.Stream;
 import javax.annotation.PostConstruct;
 import javax.ws.rs.NotFoundException;
 
+import org.apache.commons.lang3.StringUtils;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
+import org.codeability.sharing.plugins.api.search.SearchResultDTO;
+import org.codeability.sharing.plugins.api.search.SearchResultsDTO;
+import org.codeability.sharing.plugins.api.search.UserProvidedMetadataDTO.Person;
+import org.codeability.sharing.plugins.api.search.util.ExerciseId;
 import org.elasticsearch.action.search.SearchRequest;
 import org.elasticsearch.action.search.SearchResponse;
 import org.elasticsearch.client.RequestOptions;
@@ -48,10 +54,6 @@ import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
 
 import at.ac.uibk.gitsearch.config.ApplicationProperties;
 import at.ac.uibk.gitsearch.service.dto.AutoCompleteEntry;
-import at.ac.uibk.gitsearch.service.dto.SearchInputDTO;
-import at.ac.uibk.gitsearch.service.dto.SearchResultDTO;
-import at.ac.uibk.gitsearch.service.dto.SearchResultsDTO;
-import at.ac.uibk.gitsearch.service.dto.UserProvidedMetadataDTO.Person;
 
 @Repository
 public class MetaDataRepository {
@@ -77,8 +79,6 @@ public class MetaDataRepository {
 	 */
 	private Map<String, Map<String, Map<String, Integer>>> cachedCompletions = null;
 
-	private static final int MAX_AUTO_COMPLETION_RESULTS = 10;
-
 	/**
 	 * returns all keyword autocompletes for keyWord
 	 *
@@ -86,8 +86,8 @@ public class MetaDataRepository {
 	 * @return
 	 * @throws IOException
 	 */
-	public List<AutoCompleteEntry> getKeywordsAutoComplete(String keyWordPrefix) throws IOException {
-		return getFieldAutoCompletion(keyWordPrefix, SearchRepositoryConstants.METADATA_KEYWORDS);
+	public List<AutoCompleteEntry> getKeywordsAutoComplete(String keyWordPrefix, int max) throws IOException {
+		return getFieldAutoCompletion(keyWordPrefix, SearchRepositoryConstants.METADATA_KEYWORDS, max);
 	}
 
 	/**
@@ -97,8 +97,8 @@ public class MetaDataRepository {
 	 * @return
 	 * @throws IOException
 	 */
-	public List<AutoCompleteEntry> getFormatsAutoComplete(String formatPrefix) throws IOException {
-		return getFieldAutoCompletion(formatPrefix, SearchRepositoryConstants.METADATA_FORMATS);
+	public List<AutoCompleteEntry> getFormatsAutoComplete(String formatPrefix, int max) throws IOException {
+		return getFieldAutoCompletion(formatPrefix, SearchRepositoryConstants.METADATA_FORMATS, max);
 	}
 
 	/**
@@ -108,10 +108,10 @@ public class MetaDataRepository {
 	 * @return
 	 * @throws IOException
 	 */
-	public List<AutoCompleteEntry> getProgrammingLanguageAutoComplete(String progammingLanguagePrefix)
+	public List<AutoCompleteEntry> getProgrammingLanguageAutoComplete(String progammingLanguagePrefix, int max)
 			throws IOException {
 		return getFieldAutoCompletion(progammingLanguagePrefix,
-				SearchRepositoryConstants.METADATA_PROGRAMMING_LANGUAGES);
+				SearchRepositoryConstants.METADATA_PROGRAMMING_LANGUAGES, max);
 	}
 
 	/**
@@ -121,8 +121,8 @@ public class MetaDataRepository {
 	 * @return
 	 * @throws IOException
 	 */
-	public List<AutoCompleteEntry> getCreatorAutoComplete(String creatorPrefix) throws IOException {
-		return getFieldAutoCompletion(creatorPrefix, SearchRepositoryConstants.METADATA_CREATOR);
+	public List<AutoCompleteEntry> getCreatorAutoComplete(String creatorPrefix, int max) throws IOException {
+		return getFieldAutoCompletion(creatorPrefix, SearchRepositoryConstants.METADATA_CREATOR, max);
 	}
 
 	/**
@@ -132,8 +132,8 @@ public class MetaDataRepository {
 	 * @return
 	 * @throws IOException
 	 */
-	public List<AutoCompleteEntry> getContributorAutoComplete(String contributorPrefix) throws IOException {
-		return getFieldAutoCompletion(contributorPrefix, SearchRepositoryConstants.METADATA_CONTRIBUTOR);
+	public List<AutoCompleteEntry> getContributorAutoComplete(String contributorPrefix, int max) throws IOException {
+		return getFieldAutoCompletion(contributorPrefix, SearchRepositoryConstants.METADATA_CONTRIBUTOR, max);
 	}
 
 	/**
@@ -143,9 +143,9 @@ public class MetaDataRepository {
 	 * @return
 	 * @throws IOException
 	 */
-	public List<AutoCompleteEntry> getContributorCreatorAutoComplete(String contributorPrefix) throws IOException {
-		final List<AutoCompleteEntry> contributors = getContributorAutoComplete(contributorPrefix);
-		final List<AutoCompleteEntry> creatorAutoComplete = getCreatorAutoComplete(contributorPrefix);
+	public List<AutoCompleteEntry> getContributorCreatorAutoComplete(String contributorPrefix, int max) throws IOException {
+		final List<AutoCompleteEntry> contributors = getContributorAutoComplete(contributorPrefix, max);
+		final List<AutoCompleteEntry> creatorAutoComplete = getCreatorAutoComplete(contributorPrefix, max);
 		// merging
 		for (AutoCompleteEntry creator : creatorAutoComplete) {
 			contributors.stream().filter(entry -> entry.getTarget().equals(creator.getTarget())).findAny()
@@ -161,18 +161,19 @@ public class MetaDataRepository {
 	/**
 	 * returns a list of hits together with the number of occurences
 	 * 
-	 * @param keyWordPrefix
-	 * @param metaDataField
+	 * @param prefix the prefix
+	 * @param metaDataField the meta data field
+	 * @param maxCount the maximum of hits, returned
 	 * @return
 	 * @throws IOException
 	 * @throws JsonProcessingException
 	 * @throws JsonMappingException
 	 */
-	private List<AutoCompleteEntry> getFieldAutoCompletion(String keyWordPrefix, final String metaDataField)
+	private List<AutoCompleteEntry> getFieldAutoCompletion(String prefix, final String metaDataField, int maxCount)
 			throws IOException, JsonProcessingException, JsonMappingException {
 		fillAutoCompletion();
 
-		String lcKeyWordPrefix = keyWordPrefix.toLowerCase();
+		String lcKeyWordPrefix = prefix.toLowerCase();
 		// höllisch kompliziert und höllisch unverständlich mit Streams :-)
 		// idea
 		// 1. Filtern nach Prefix
@@ -188,7 +189,7 @@ public class MetaDataRepository {
 				.flatMap(e -> e.getValue().entrySet().stream()) // Stream< Map<String, Integer>> with duplicates
 				.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, Integer::max));
 		return combinedHits.entrySet().stream().sorted((e1, e2) -> e2.getValue() - e1.getValue())
-				.limit(MAX_AUTO_COMPLETION_RESULTS).map(s -> new AutoCompleteEntry(s.getKey(), s.getValue()))
+				.limit(maxCount).map(s -> new AutoCompleteEntry(s.getKey(), s.getValue()))
 				.collect(Collectors.toList()); // Map.Entry<String,
 		// Map<String,
 		// Integer>>
@@ -252,9 +253,7 @@ public class MetaDataRepository {
 
 			SearchResponse searchResponse = elasticsearchClient.search(searchRequest, RequestOptions.DEFAULT);
 
-			ObjectMapper objectMapper = new ObjectMapper();
-			objectMapper.registerModule(new JavaTimeModule());
-			objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+			ObjectMapper objectMapper = getSearchResultObjectMapper();
 
 			tryNextPage = searchResponse.getHits().getHits().length > 0;
 
@@ -286,6 +285,17 @@ public class MetaDataRepository {
 		cachedCompletions = reloadedCachedCompletions;
 	}
 
+	/**
+	 * returns a preconfigured object mapper
+	 * @return
+	 */
+	public static ObjectMapper getSearchResultObjectMapper() {
+		ObjectMapper objectMapper = new ObjectMapper();
+		objectMapper.registerModule(new JavaTimeModule());
+		objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+		return objectMapper;
+	}
+
 	private static void addTo(Map<String, Map<String, Integer>> completionMap, List<String> tokenList, String target) {
 		tokenList.forEach(token -> {
 			String lowercaseToken = token.toLowerCase();
@@ -314,6 +324,8 @@ public class MetaDataRepository {
 		}
 		return result;
 	}
+	
+	
 
 	/**
 	 * returns the hits from the meta data search index for the input query
@@ -326,7 +338,7 @@ public class MetaDataRepository {
 	 * @return the search hits.
 	 * @throws IOException when search index is not available.
 	 */
-	public SearchResultsDTO pageDetails(SearchInputDTO searchInputDTO, int pageSize, Optional<User> user)
+	public SearchResultsDTO pageDetails(org.codeability.sharing.plugins.api.search.SearchInputDTO searchInputDTO, Optional<User> user)
 			throws IOException {
 		fillAutoCompletion();
 
@@ -360,6 +372,10 @@ public class MetaDataRepository {
 				.should(QueryBuilders.prefixQuery(SearchRepositoryConstants.METADATA_FORMATS, term)));
 		if (formatBuilder.hasClauses())
 			queryBuilder.must(formatBuilder);
+		
+		if(!StringUtils.isEmpty(searchInputDTO.getMetadata().getParentId())) {
+			queryBuilder.must(QueryBuilders.matchQuery(SearchRepositoryConstants.FILE_PARENTID, searchInputDTO.getMetadata().getParentId()));
+		}
 
 		BoolQueryBuilder authorBuilder = QueryBuilders.boolQuery();
 		if (searchInputDTO.getMetadata().getAuthor() != null)
@@ -401,8 +417,8 @@ public class MetaDataRepository {
 				.boundaryScannerType(HighlightBuilder.BoundaryScannerType.SENTENCE).fragmentSize(FRAGMENT_SIZE);
 
 		SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
-		sourceBuilder.query(queryBuilder).highlighter(highlightBuilder).size(pageSize)
-				.from((searchInputDTO.getPage()) * pageSize);
+		sourceBuilder.query(queryBuilder).highlighter(highlightBuilder).size(searchInputDTO.getPageSize())
+				.from((searchInputDTO.getPage()) * searchInputDTO.getPageSize());
 
 		searchRequest.source(sourceBuilder);
 
@@ -477,8 +493,22 @@ public class MetaDataRepository {
 			exec.accept(st.nextToken());
 		}
 	}
-
+	
 	public SearchResultsDTO getExercisesById(Stream<String> exerciseIds, Optional<User> user, int page, int pageSize) {
+		return getExercisesById(exerciseIds, user, page, pageSize, null);
+	}
+	
+
+	/**
+	 * returns all exercises, referred by their ids, changed after since (if not null)
+	 * @param exerciseIds a stream of exercise ids
+	 * @param user the user: needed for authorization
+	 * @param page the page
+	 * @param pageSize the page size
+	 * @param since an instant since when the exercise was last changed (or null, if not relevant)
+	 * @return
+	 */
+	public SearchResultsDTO getExercisesById(Stream<String> exerciseIds, Optional<User> user, int page, int pageSize, Instant since) {
 		SearchRequest searchRequest = new SearchRequest(SearchRepositoryConstants.INDEX_METADATA);
 
 		BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
@@ -495,6 +525,9 @@ public class MetaDataRepository {
 
 		}
 		queryBuilder.must(idQueryBuilder);
+		if(since != null) {
+			queryBuilder.must(QueryBuilders.rangeQuery(SearchRepositoryConstants.PROJECT_LASTACTIVITYAT).gte(since) /*.lte(Instant.now()) */);
+		}
 
 		addAuthorizationQuery(user, queryBuilder);
 
@@ -506,10 +539,6 @@ public class MetaDataRepository {
 		try {
 			SearchResponse searchResponse = elasticsearchClient.search(searchRequest, RequestOptions.DEFAULT);
 
-			ObjectMapper objectMapper = new ObjectMapper();
-			objectMapper.registerModule(new JavaTimeModule());
-			objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
-
 			return parseSearchResponse(searchResponse);
 
 		} catch (JsonProcessingException e) {
@@ -519,7 +548,19 @@ public class MetaDataRepository {
 		}
 	}
 
-	public SearchResultDTO getExerciseById(String exerciseId) throws NotFoundException {
+	/**
+	 * just a convenience method 
+	 * @param exerciseId the parsed exercise id
+	 * @param user the user (if authenticated)
+	 * @return search result 
+	 * @throws NotFoundException if not found
+	 */
+	public SearchResultDTO getExerciseById(ExerciseId exerciseId, Optional<User> user) throws NotFoundException {
+		return getExerciseById(exerciseId.toString(), user);
+	}
+
+	
+	public SearchResultDTO getExerciseById(String exerciseId, Optional<User> user) throws NotFoundException {
 		SearchRequest searchRequest = new SearchRequest(SearchRepositoryConstants.INDEX_METADATA);
 
 		BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
@@ -528,6 +569,7 @@ public class MetaDataRepository {
 
 		SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
 		sourceBuilder.query(queryBuilder).size(10);
+		addAuthorizationQuery(user, queryBuilder);
 
 		searchRequest.source(sourceBuilder);
 
diff --git a/src/main/java/at/ac/uibk/gitsearch/repository/search/SearchRepositoryConstants.java b/src/main/java/at/ac/uibk/gitsearch/repository/search/SearchRepositoryConstants.java
index fe458ad6554892d56b9c898455fecc715e9995fa..ec565280af927f98085a6a68bf62294de4a9146b 100644
--- a/src/main/java/at/ac/uibk/gitsearch/repository/search/SearchRepositoryConstants.java
+++ b/src/main/java/at/ac/uibk/gitsearch/repository/search/SearchRepositoryConstants.java
@@ -29,9 +29,11 @@ public final class SearchRepositoryConstants {
     public static final String METADATA_TYPE = "metadata.type";
     public static final String METADATA_LANGUAGE = "metadata.language";
 
+    public static final String FILE_PARENTID = "file.parentId";
 
     public static final String PROJECT_VISIBILITY = "project.visibility";
     public static final String PROJECT_NAMESPACE = "project.namespace";
+    public static final String PROJECT_LASTACTIVITYAT = "project.last_activity_at";
     
     private SearchRepositoryConstants() {
     	// just a list of constants
diff --git a/src/main/java/at/ac/uibk/gitsearch/security/oauth2/UserDetailsFetcher.java b/src/main/java/at/ac/uibk/gitsearch/security/oauth2/UserDetailsFetcher.java
index 70460aabf53784b52388f0eae4da8b79ace61c9e..4609737bdf4762c44e5dd0d7ffc392c945873f06 100644
--- a/src/main/java/at/ac/uibk/gitsearch/security/oauth2/UserDetailsFetcher.java
+++ b/src/main/java/at/ac/uibk/gitsearch/security/oauth2/UserDetailsFetcher.java
@@ -1,6 +1,9 @@
 package at.ac.uibk.gitsearch.security.oauth2;
 
 import java.time.Instant;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
 import java.util.function.Consumer;
 
 import org.apache.logging.log4j.LogManager;
@@ -46,10 +49,21 @@ public class UserDetailsFetcher {
 		boolean modified = false;
 		gitLabApi.enableRequestResponseLogging();
 		// List<Project> memberProjects = gitLabApi.getProjectApi().getMemberProjects();
+		final Set<String> authorities = new HashSet<>();
+		authorities.addAll(u.getAuthorities());
+		@SuppressWarnings("unchecked")
+		final List<String> gitLabGroups = (List<String>)oidcUser.getAttribute("groups");
+		authorities.addAll(gitLabGroups);
+		
 		User gitUser = gitLabApi.getUserApi().getCurrentUser();
+		
 		modified |= updateAttribute(gitUser.getAvatarUrl(),u.getImageUrl(), u::setImageUrl);
 		modified |= updateAttribute(gitUser.getEmail(), u.getEmail(), u::setEmail);
 		modified |= updateAttribute(gitUser.getName(),u.getLastName(), u::setLastName);
+		if(!u.getAuthorities().equals(authorities)) {
+			u.setAuthorities(authorities);
+			modified = true;
+		}
 		// modified |= updateAttribute(gitUser.getUsername(),u.getLogin(), u::setLogin);
 		
 		
diff --git a/src/main/java/at/ac/uibk/gitsearch/service/GitlabService.java b/src/main/java/at/ac/uibk/gitsearch/service/GitlabService.java
index 43da23e0dfa9dee02194591bf4bfc3f384ada225..2e2570cc955564bafb5c7955c4f6bc8dc8ecf440 100644
--- a/src/main/java/at/ac/uibk/gitsearch/service/GitlabService.java
+++ b/src/main/java/at/ac/uibk/gitsearch/service/GitlabService.java
@@ -11,6 +11,11 @@ import java.util.zip.ZipEntry;
 import java.util.zip.ZipInputStream;
 import java.util.zip.ZipOutputStream;
 
+import org.codeability.sharing.plugins.api.search.SearchResultDTO;
+import org.codeability.sharing.plugins.api.search.util.ExerciseId;
+import org.gitlab4j.api.GitLabApi;
+import org.gitlab4j.api.GitLabApiException;
+import org.gitlab4j.api.ProjectApi;
 import org.eclipse.jgit.api.Git;
 import org.eclipse.jgit.api.errors.GitAPIException;
 import org.eclipse.jgit.lib.Repository;
@@ -37,7 +42,6 @@ import org.apache.commons.io.FileUtils;
 import at.ac.uibk.gitsearch.repository.gitlab.GitLabRepository;
 import at.ac.uibk.gitsearch.repository.search.MetaDataRepository;
 import at.ac.uibk.gitsearch.security.jwt.TokenProvider;
-import at.ac.uibk.gitsearch.service.dto.SearchResultDTO;
 
 import javax.naming.AuthenticationException;
 
@@ -164,11 +168,15 @@ public class GitlabService {
 
 	}
 
-	public InputStream getRepositoryFile(String projectId, String filePath) throws GitLabApiException, IOException {
-		final SearchResultDTO exercise = metaDataRepository.getExerciseById(projectId);
-        final GitLabApi gitLabApi = gitLabRepository.getGitLabApi(tokenProvider.getGitLabAccessInfo());
-        RepositoryFile file =  gitLabApi.getRepositoryFileApi().getFile(exercise.getProject().getProjectId(), filePath, "master");
-        return new ByteArrayInputStream(file.getDecodedContentAsBytes());
+	public InputStream getRepositoryFile(ExerciseId exerciseId, String filePath)
+			throws GitLabApiException, IOException {
+
+		final SearchResultDTO exercise = metaDataRepository.getExerciseById(exerciseId, tokenProvider.getCurrentPrincipal());
+		final GitLabApi gitLabApi = gitLabRepository.getGitLabApi(tokenProvider.getGitLabAccessInfo());
+		RepositoryFile file;
+		file = gitLabApi.getRepositoryFileApi().getFile(exercise.getProject().getProjectId(),
+				exerciseId.extendPath(filePath), "master");
+		return new ByteArrayInputStream(file.getDecodedContentAsBytes());
 	}
 
     /**
diff --git a/src/main/java/at/ac/uibk/gitsearch/service/LikesQueryService.java b/src/main/java/at/ac/uibk/gitsearch/service/LikesQueryService.java
new file mode 100644
index 0000000000000000000000000000000000000000..ece5f1bce5b04fccd0503be718afe9cd755a194d
--- /dev/null
+++ b/src/main/java/at/ac/uibk/gitsearch/service/LikesQueryService.java
@@ -0,0 +1,104 @@
+package at.ac.uibk.gitsearch.service;
+
+import java.util.List;
+
+import javax.persistence.criteria.JoinType;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.jpa.domain.Specification;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import io.github.jhipster.service.QueryService;
+
+import at.ac.uibk.gitsearch.domain.Likes;
+import at.ac.uibk.gitsearch.domain.*; // for static metamodels
+import at.ac.uibk.gitsearch.repository.LikesRepository;
+import at.ac.uibk.gitsearch.repository.search.LikesSearchRepository;
+import at.ac.uibk.gitsearch.service.dto.LikesCriteria;
+
+/**
+ * Service for executing complex queries for {@link Likes} entities in the database.
+ * The main input is a {@link LikesCriteria} which gets converted to {@link Specification},
+ * in a way that all the filters must apply.
+ * It returns a {@link List} of {@link Likes} or a {@link Page} of {@link Likes} which fulfills the criteria.
+ */
+@Service
+@Transactional(readOnly = true)
+public class LikesQueryService extends QueryService<Likes> {
+
+    private final Logger log = LoggerFactory.getLogger(LikesQueryService.class);
+
+    private final LikesRepository likesRepository;
+
+    private final LikesSearchRepository likesSearchRepository;
+
+    public LikesQueryService(LikesRepository likesRepository, LikesSearchRepository likesSearchRepository) {
+        this.likesRepository = likesRepository;
+        this.likesSearchRepository = likesSearchRepository;
+    }
+
+    /**
+     * Return a {@link List} of {@link Likes} which matches the criteria from the database.
+     * @param criteria The object which holds all the filters, which the entities should match.
+     * @return the matching entities.
+     */
+    @Transactional(readOnly = true)
+    public List<Likes> findByCriteria(LikesCriteria criteria) {
+        log.debug("find by criteria : {}", criteria);
+        final Specification<Likes> specification = createSpecification(criteria);
+        return likesRepository.findAll(specification);
+    }
+
+    /**
+     * Return a {@link Page} of {@link Likes} which matches the criteria from the database.
+     * @param criteria The object which holds all the filters, which the entities should match.
+     * @param page The page, which should be returned.
+     * @return the matching entities.
+     */
+    @Transactional(readOnly = true)
+    public Page<Likes> findByCriteria(LikesCriteria criteria, Pageable page) {
+        log.debug("find by criteria : {}, page: {}", criteria, page);
+        final Specification<Likes> specification = createSpecification(criteria);
+        return likesRepository.findAll(specification, page);
+    }
+
+    /**
+     * Return the number of matching entities in the database.
+     * @param criteria The object which holds all the filters, which the entities should match.
+     * @return the number of matching entities.
+     */
+    @Transactional(readOnly = true)
+    public long countByCriteria(LikesCriteria criteria) {
+        log.debug("count by criteria : {}", criteria);
+        final Specification<Likes> specification = createSpecification(criteria);
+        return likesRepository.count(specification);
+    }
+
+    /**
+     * Function to convert {@link LikesCriteria} to a {@link Specification}
+     * @param criteria The object which holds all the filters, which the entities should match.
+     * @return the matching {@link Specification} of the entity.
+     */
+    protected Specification<Likes> createSpecification(LikesCriteria criteria) {
+        Specification<Likes> specification = Specification.where(null);
+        if (criteria != null) {
+            if (criteria.getId() != null) {
+                specification = specification.and(buildRangeSpecification(criteria.getId(), Likes_.id));
+            }
+            if (criteria.getDate() != null) {
+                specification = specification.and(buildRangeSpecification(criteria.getDate(), Likes_.date));
+            }
+            if (criteria.getUserID() != null) {
+                specification = specification.and(buildRangeSpecification(criteria.getUserID(), Likes_.userID));
+            }
+            // if (criteria.getProjectID() != null) {
+            //     specification = specification.and(buildRangeSpecification(criteria.getProjectID(), Likes_.projectID));
+            // }
+        }
+        return specification;
+    }
+}
diff --git a/src/main/java/at/ac/uibk/gitsearch/service/LikesService.java b/src/main/java/at/ac/uibk/gitsearch/service/LikesService.java
new file mode 100644
index 0000000000000000000000000000000000000000..608b20f909514e21c6e478db1b71240bbb6b75d8
--- /dev/null
+++ b/src/main/java/at/ac/uibk/gitsearch/service/LikesService.java
@@ -0,0 +1,117 @@
+package at.ac.uibk.gitsearch.service;
+
+import at.ac.uibk.gitsearch.domain.Likes;
+import at.ac.uibk.gitsearch.repository.LikesRepository;
+import at.ac.uibk.gitsearch.repository.search.LikesSearchRepository;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+import java.util.Optional;
+import java.util.stream.Collectors;
+import java.util.stream.StreamSupport;
+
+import static org.elasticsearch.index.query.QueryBuilders.*;
+
+/**
+ * Service Implementation for managing {@link Likes}.
+ */
+@Service
+@Transactional
+public class LikesService {
+
+    private final Logger log = LoggerFactory.getLogger(LikesService.class);
+
+    private final LikesRepository likesRepository;
+
+    private final LikesSearchRepository likesSearchRepository;
+
+    public LikesService(LikesRepository likesRepository, LikesSearchRepository likesSearchRepository) {
+        this.likesRepository = likesRepository;
+        this.likesSearchRepository = likesSearchRepository;
+    }
+
+    /**
+     * Save a likes.
+     *
+     * @param likes the entity to save.
+     * @return the persisted entity.
+     */
+    public Likes save(Likes likes) {
+        log.debug("Request to save Likes : {}", likes);
+        Likes result = likesRepository.save(likes);
+        likesSearchRepository.save(result);
+        return result;
+    }
+
+    /**
+     * Get all the likes.
+     *
+     * @return the list of entities.
+     */
+    @Transactional(readOnly = true)
+    public List<Likes> findAll() {
+        log.debug("Request to get all Likes");
+        return likesRepository.findAll();
+    }
+
+
+    /**
+     * Get one likes by id.
+     *
+     * @param id the id of the entity.
+     * @return the entity.
+     */
+    @Transactional(readOnly = true)
+    public Optional<Likes> findOne(Long id) {
+        log.debug("Request to get Likes : {}", id);
+        return likesRepository.findById(id);
+    }
+
+    /**
+     * Delete the likes by id.
+     *
+     * @param id the id of the entity.
+     */
+    public void delete(Long id) {
+        log.debug("Request to delete Likes : {}", id);
+        likesRepository.deleteById(id);
+        likesSearchRepository.deleteById(id);
+    }
+
+    public void deleteByUserIDandExerciseID(Integer userID, String exerciseID) {
+        Likes like = findLikesByUserIDandExerciseID(userID, exerciseID);
+        if (like.getId() != null){
+            delete(like.getId());
+        }
+    }
+
+    /**
+     * Search for the likes corresponding to the query.
+     *
+     * @param query the query of the search.
+     * @return the list of entities.
+     */
+    @Transactional(readOnly = true)
+    public List<Likes> search(String query) {
+        log.debug("Request to search Likes for query {}", query);
+        return StreamSupport
+            .stream(likesSearchRepository.search(queryStringQuery(query)).spliterator(), false)
+        .collect(Collectors.toList());
+    }
+
+    @Transactional(readOnly = true)
+    public Likes findLikesByUserIDandExerciseID(Integer userID, String exerciseID) {
+        log.debug("Request to get Likes by User id and project id : {} {}", userID, exerciseID);
+        return likesRepository.findLikesByUserIDandExerciseID(userID, exerciseID);
+    }
+
+    @Transactional(readOnly = true)
+    public Integer findNumberOfLikesByExerciseID(String exerciseID) {
+        log.debug("Request to get number of Likes by project id : {}", exerciseID);
+        return likesRepository.findNumberOfLikesByExerciseID(exerciseID);
+    }
+}
diff --git a/src/main/java/at/ac/uibk/gitsearch/service/MailService.java b/src/main/java/at/ac/uibk/gitsearch/service/MailService.java
index a173c3e1fa3d052b49dc13db323293479ac3e92a..7b39f444f598c9283748dd50767c3f294b0db479 100644
--- a/src/main/java/at/ac/uibk/gitsearch/service/MailService.java
+++ b/src/main/java/at/ac/uibk/gitsearch/service/MailService.java
@@ -1,14 +1,23 @@
 package at.ac.uibk.gitsearch.service;
 
 import at.ac.uibk.gitsearch.domain.User;
-
+import at.ac.uibk.gitsearch.domain.UserWatchList;
+import at.ac.uibk.gitsearch.domain.enumeration.CheckFrequency;
+import at.ac.uibk.gitsearch.repository.UserRepository;
 import io.github.jhipster.config.JHipsterProperties;
 
 import java.nio.charset.StandardCharsets;
+import java.time.Instant;
+import java.util.List;
 import java.util.Locale;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.stream.Collectors;
+
 import javax.mail.MessagingException;
 import javax.mail.internet.MimeMessage;
 
+import org.codeability.sharing.plugins.api.search.SearchResultDTO;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.context.MessageSource;
@@ -16,6 +25,7 @@ import org.springframework.mail.MailException;
 import org.springframework.mail.javamail.JavaMailSender;
 import org.springframework.mail.javamail.MimeMessageHelper;
 import org.springframework.scheduling.annotation.Async;
+import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Service;
 import org.thymeleaf.context.Context;
 import org.thymeleaf.spring5.SpringTemplateEngine;
@@ -41,18 +51,34 @@ public class MailService {
     private final MessageSource messageSource;
 
     private final SpringTemplateEngine templateEngine;
+    
+    private final UserRepository userRepository;
+    
+    private final UserWatchListService userWatchListService;
 
     public MailService(JHipsterProperties jHipsterProperties, JavaMailSender javaMailSender,
-            MessageSource messageSource, SpringTemplateEngine templateEngine) {
+            MessageSource messageSource, SpringTemplateEngine templateEngine,
+            UserRepository userRepository, UserWatchListService userWatchListService) {
 
         this.jHipsterProperties = jHipsterProperties;
         this.javaMailSender = javaMailSender;
         this.messageSource = messageSource;
         this.templateEngine = templateEngine;
+        this.userRepository = userRepository;
+        this.userWatchListService = userWatchListService;
     }
 
+    /**
+     * send email
+     * @param to
+     * @param subject
+     * @param content
+     * @param isMultipart
+     * @param isHtml
+     * @return true if mail was successfully sent.
+     */
     @Async
-    public void sendEmail(String to, String subject, String content, boolean isMultipart, boolean isHtml) {
+    public boolean sendEmail(String to, String subject, String content, boolean isMultipart, boolean isHtml) {
         log.debug("Send email[multipart '{}' and html '{}'] to '{}' with subject '{}' and content={}",
             isMultipart, isHtml, to, subject, content);
 
@@ -66,8 +92,10 @@ public class MailService {
             message.setText(content, isHtml);
             javaMailSender.send(mimeMessage);
             log.debug("Sent email to User '{}'", to);
+            return true;
         }  catch (MailException | MessagingException e) {
             log.warn("Email could not be sent to user '{}'", to, e);
+            return false;
         }
     }
 
@@ -85,6 +113,74 @@ public class MailService {
         String subject = messageSource.getMessage(titleKey, null, locale);
         sendEmail(user.getEmail(), subject, content, false, true);
     }
+    
+    /**
+     * Send info mails to every user, iff he/she was scheduled for sending.
+     * This is scheduled to get fired everyday, at 05:00 (am).
+     */
+    @Scheduled(cron = "0 0 5 * * ?")
+    public void sendInfoMails() {
+
+    	for(User user: userRepository.findAll()) {
+    	  sendInfoMail(user, false /* only if content */);
+    	}
+    }
+
+    /**
+     * send an info mail to user, if relevant.
+     * For test purposes mainly.
+     * @param user the user
+     * @param force force mail sending, even if mail is empty.
+     * @return true if mail was sent.
+     */
+	public boolean sendInfoMail(User user, boolean force) {
+		boolean hasContent = force;
+		Locale locale = Locale.forLanguageTag(user.getLangKey());
+		Context context = new Context(locale);
+		context.setVariable(USER, user);
+		context.setVariable(BASE_URL, jHipsterProperties.getMail().getBaseUrl());
+		Instant lastMailSending = user.getLastMailSent();
+		if (lastMailSending == null) {
+			lastMailSending = user.getLastLogin();
+			if (lastMailSending == null) {
+				lastMailSending = Instant.ofEpochMilli(0); // should only happen during testing
+			}
+			user.setLastMailSent(lastMailSending);
+			user = userRepository.save(user);
+		}
+		Map<SearchResultDTO, UserWatchList> findChangesSince = null;
+		
+		findChangesSince = userWatchListService.findChangesSince(lastMailSending, user);
+		
+		
+		boolean dailyRelevant = findChangesSince.entrySet().stream().anyMatch(entry -> entry.getValue().getCheckFrequency() == CheckFrequency.DAILY);
+		boolean weeklyRelevant = findChangesSince.entrySet().stream().anyMatch(entry -> entry.getValue().getCheckFrequency() == CheckFrequency.WEEKLY);
+		boolean monthlyRelevant = findChangesSince.entrySet().stream().anyMatch(entry -> entry.getValue().getCheckFrequency() == CheckFrequency.MONTHLY);
+
+		boolean shouldSend = 
+				(dailyRelevant && lastMailSending.isBefore(CheckFrequency.DAILY.getChangedBefore())) ||
+				(weeklyRelevant && lastMailSending.isBefore(CheckFrequency.WEEKLY.getChangedBefore())) ||
+				(monthlyRelevant && lastMailSending.isBefore(CheckFrequency.MONTHLY.getChangedBefore()));
+				
+		
+		
+		hasContent = hasContent || shouldSend;
+		
+		if(hasContent) {
+			final List<Entry<SearchResultDTO, UserWatchList>> changedExercises = findChangesSince.entrySet().stream().collect(Collectors.toList());
+			context.setVariable("watchListUpdates", changedExercises);
+		    String content = templateEngine.process("mail/info/infoEmail", context);
+		    String subject = messageSource.getMessage("email.info.title", null, locale);
+		    boolean success = sendEmail(user.getEmail(), subject, content, false, true);
+		    if(success) {
+			    user.setLastMailSent(Instant.now());
+			    userRepository.save(user);
+			    return true;
+		    }
+		}
+		return false;
+	}
+
 
     @Async
     public void sendActivationEmail(User user) {
diff --git a/src/main/java/at/ac/uibk/gitsearch/service/PluginManagementService.java b/src/main/java/at/ac/uibk/gitsearch/service/PluginManagementService.java
index b9a41c03c2d27ab0af47c33329d149c735c496b8..11ba91a582b5a3b29732d092a242781cffbfda45 100644
--- a/src/main/java/at/ac/uibk/gitsearch/service/PluginManagementService.java
+++ b/src/main/java/at/ac/uibk/gitsearch/service/PluginManagementService.java
@@ -2,7 +2,6 @@ package at.ac.uibk.gitsearch.service;
 
 import java.net.URI;
 import java.net.URISyntaxException;
-import java.nio.charset.Charset;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
@@ -28,6 +27,8 @@ import javax.ws.rs.core.MediaType;
 import org.apache.commons.lang3.StringUtils;
 import org.codeability.sharing.plugins.api.SharingPluginConfig;
 import org.codeability.sharing.plugins.api.SharingPluginConfig.Action;
+import org.codeability.sharing.plugins.api.search.SearchResultDTO;
+import org.codeability.sharing.plugins.api.search.SearchResultDTO.PluginActionInfo;
 import org.glassfish.jersey.client.ClientConfig;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -39,8 +40,6 @@ import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider;
 import at.ac.uibk.gitsearch.config.ApplicationProperties;
 import at.ac.uibk.gitsearch.config.ApplicationProperties.RegisteredConnector;
 import at.ac.uibk.gitsearch.service.PluginManagementService.ConnectorConfigWrapper.ActionWrapper;
-import at.ac.uibk.gitsearch.service.dto.SearchResultDTO;
-import at.ac.uibk.gitsearch.service.dto.SearchResultDTO.PluginActionInfo;
 
 /**
  * management services for plugins.
@@ -107,8 +106,6 @@ public class PluginManagementService {
 		}
 	}
 
-	private final Charset UTF8_CS = Charset.forName("UTF-8");
-
 
 	/**
 	 * this is just a wrapper, to provide a more efficient access to the original
diff --git a/src/main/java/at/ac/uibk/gitsearch/service/SearchService.java b/src/main/java/at/ac/uibk/gitsearch/service/SearchService.java
index 1dad90510fd53001e48256b0c0ba2a6939023ef3..14bc90c8c0a33e3dcfaf81a23a00354b5bead59f 100644
--- a/src/main/java/at/ac/uibk/gitsearch/service/SearchService.java
+++ b/src/main/java/at/ac/uibk/gitsearch/service/SearchService.java
@@ -12,6 +12,10 @@ import java.util.Optional;
 import java.util.stream.Stream;
 import java.util.zip.ZipInputStream;
 
+import org.codeability.sharing.plugins.api.search.SearchInputDTO;
+import org.codeability.sharing.plugins.api.search.SearchResultDTO;
+import org.codeability.sharing.plugins.api.search.SearchResultsDTO;
+import org.codeability.sharing.plugins.api.search.util.ExerciseId;
 import org.gitlab4j.api.GitLabApi;
 import org.gitlab4j.api.GitLabApiException;
 import org.slf4j.Logger;
@@ -25,9 +29,6 @@ import at.ac.uibk.gitsearch.repository.gitlab.GitLabRepository;
 import at.ac.uibk.gitsearch.repository.search.MetaDataRepository;
 import at.ac.uibk.gitsearch.security.jwt.TokenProvider;
 import at.ac.uibk.gitsearch.service.dto.AutoCompleteEntry;
-import at.ac.uibk.gitsearch.service.dto.SearchInputDTO;
-import at.ac.uibk.gitsearch.service.dto.SearchResultDTO;
-import at.ac.uibk.gitsearch.service.dto.SearchResultsDTO;
 
 /**
  * Service for exercise/course search results
@@ -60,8 +61,8 @@ public class SearchService {
 	 * @return
 	 * @throws IOException
 	 */
-	public List<AutoCompleteEntry> getKeywordsAutoComplete(String keyWordPrefix) throws IOException {
-		return metaDataRepository.getKeywordsAutoComplete(keyWordPrefix);
+	public List<AutoCompleteEntry> getKeywordsAutoComplete(String keyWordPrefix, int max) throws IOException {
+		return metaDataRepository.getKeywordsAutoComplete(keyWordPrefix, max);
 	}
 
 		/**
@@ -71,8 +72,8 @@ public class SearchService {
 	 * @return
 	 * @throws IOException
 	 */
-	public List<AutoCompleteEntry> getFormatsAutoComplete(String formatPrefix) throws IOException {
-		return metaDataRepository.getFormatsAutoComplete(formatPrefix);
+	public List<AutoCompleteEntry> getFormatsAutoComplete(String formatPrefix, int max) throws IOException {
+		return metaDataRepository.getFormatsAutoComplete(formatPrefix, max);
 	}
 
 	/**
@@ -82,8 +83,8 @@ public class SearchService {
 	 * @return
 	 * @throws IOException
 	 */
-	public List<AutoCompleteEntry> getCreatorAutoComplete(String creatorPrefix) throws IOException {
-		return metaDataRepository.getCreatorAutoComplete(creatorPrefix);
+	public List<AutoCompleteEntry> getCreatorAutoComplete(String creatorPrefix, int max) throws IOException {
+		return metaDataRepository.getCreatorAutoComplete(creatorPrefix, max);
 	}
 
 	/**
@@ -93,8 +94,8 @@ public class SearchService {
 	 * @return
 	 * @throws IOException
 	 */
-	public List<AutoCompleteEntry> getContributorAutoComplete(String contributorPrefix) throws IOException {
-		return metaDataRepository.getContributorAutoComplete(contributorPrefix);
+	public List<AutoCompleteEntry> getContributorAutoComplete(String contributorPrefix, int max) throws IOException {
+		return metaDataRepository.getContributorAutoComplete(contributorPrefix, max);
 	}
 
 	/**
@@ -104,8 +105,8 @@ public class SearchService {
 	 * @return
 	 * @throws IOException
 	 */
-	public List<AutoCompleteEntry> getContributorCreatorAutoComplete(String contributorPrefix) throws IOException {
-		return metaDataRepository.getContributorCreatorAutoComplete(contributorPrefix);
+	public List<AutoCompleteEntry> getContributorCreatorAutoComplete(String contributorPrefix, int max) throws IOException {
+		return metaDataRepository.getContributorCreatorAutoComplete(contributorPrefix, max);
 	}
 
 	/**
@@ -115,9 +116,9 @@ public class SearchService {
 	 * @return
 	 * @throws IOException
 	 */
-	public List<AutoCompleteEntry> getProgrammingLanguageAutoComplete(String programmingLanguagePrefix)
+	public List<AutoCompleteEntry> getProgrammingLanguageAutoComplete(String programmingLanguagePrefix, int max)
 			throws IOException {
-		return metaDataRepository.getProgrammingLanguageAutoComplete(programmingLanguagePrefix);
+		return metaDataRepository.getProgrammingLanguageAutoComplete(programmingLanguagePrefix, max);
 	}
 
 	/**
@@ -127,11 +128,11 @@ public class SearchService {
 	 * @param first       the index of the first record to be returned
 	 * @param pageLength  the number of records on each page
 	 */
-	public SearchResultsDTO searchResultPage(SearchInputDTO searchInput, int pageLength) throws IOException {
+	public SearchResultsDTO searchResultPage(SearchInputDTO searchInput) throws IOException {
 		final Optional<User> principal = tokenProvider.getCurrentPrincipal();
 		log.debug("Searchrequest for {} ", searchInput);
 		
-		final SearchResultsDTO pageDetails = metaDataRepository.pageDetails(searchInput, pageLength,
+		final SearchResultsDTO pageDetails = metaDataRepository.pageDetails(searchInput,
 				principal);
 
 		pageDetails.getSearchResult().stream()
@@ -212,18 +213,18 @@ public class SearchService {
 	}
 
 	
-	public File exportExercise(long projectId) throws IOException {
-		// TODO projectId and exercise Id are mixed up here!
+	public File exportExercise(String exerciseId) throws IOException {
 		try{
-		final GitLabApi gitLabApi = gitLabRepository.getGitLabApi(tokenProvider.getGitLabAccessInfo());
-		InputStream inputFile = shoppingBasketService.rePackageGitLabProjectZip(new ZipInputStream(gitLabApi.getRepositoryApi().getRepositoryArchive((int)projectId, "HEAD", "zip")), "from project " + projectId);
-		File file = new File("exercise" + projectId + ".zip");
-
-		return copyInputStreamToFile(inputFile, file);}
-		catch(GitLabApiException exception){
-			log.error(exception.getMessage());
-			return null;
-		}
+			final SearchResultDTO exercise = metaDataRepository.getExerciseById(exerciseId, tokenProvider.getCurrentPrincipal());
+			final GitLabApi gitLabApi = gitLabRepository.getGitLabApi(tokenProvider.getGitLabAccessInfo());
+			InputStream inputFile = shoppingBasketService.rePackageGitLabProjectZip(new ZipInputStream(gitLabApi.getRepositoryApi().getRepositoryArchive(exercise.getProject().getProject_id(), "HEAD", "zip")), "from project " + exerciseId);
+			File file = new File("exercise" + exerciseId + ".zip");
+	
+			return copyInputStreamToFile(inputFile, file);}
+			catch(GitLabApiException exception){
+				log.error(exception.getMessage());
+				return null;
+			}
 	}
 
 	private File copyInputStreamToFile(InputStream inputStream, File file) throws IOException {
@@ -238,5 +239,15 @@ public class SearchService {
 			return file;
 		}
 	}
+	
+	public Optional<SearchResultDTO> findExerciseById(ExerciseId exerciseId) {
+		try {
+			SearchResultDTO result = metaDataRepository.getExerciseById(exerciseId.toString(), tokenProvider.getCurrentPrincipal());
+			return Optional.ofNullable(result);
+		} catch (javax.ws.rs.NotFoundException e) {
+			log.error("exercise with id {} not found?", exerciseId, e);
+			return Optional.empty();
+		}
+	}
 
 }
diff --git a/src/main/java/at/ac/uibk/gitsearch/service/ShoppingBasketService.java b/src/main/java/at/ac/uibk/gitsearch/service/ShoppingBasketService.java
index 1ab304243c41408f82da6e77ab1f80913206e2f3..7965405e89635716d38b93016a0db4eec51dddc6 100644
--- a/src/main/java/at/ac/uibk/gitsearch/service/ShoppingBasketService.java
+++ b/src/main/java/at/ac/uibk/gitsearch/service/ShoppingBasketService.java
@@ -16,6 +16,7 @@ import java.util.zip.ZipOutputStream;
 import org.checkerframework.checker.nullness.qual.Nullable;
 import org.codeability.sharing.plugins.api.ShoppingBasket;
 import org.codeability.sharing.plugins.api.ShoppingBasket.UserInfo;
+import org.codeability.sharing.plugins.api.search.SearchResultDTO;
 import org.gitlab4j.api.GitLabApi;
 import org.gitlab4j.api.GitLabApiException;
 import org.slf4j.Logger;
@@ -36,7 +37,6 @@ import com.google.common.cache.LoadingCache;
 
 import at.ac.uibk.gitsearch.repository.gitlab.GitLabRepository;
 import at.ac.uibk.gitsearch.security.jwt.TokenProvider.GitLabAccessInfo;
-import at.ac.uibk.gitsearch.service.dto.SearchResultDTO;
 
 /**
  * Service for exercise/course search results
diff --git a/src/main/java/at/ac/uibk/gitsearch/service/StatisticsService.java b/src/main/java/at/ac/uibk/gitsearch/service/StatisticsService.java
index eac85d46461d86eb97eec6e2614a0af10b895319..0d74db43a9c6a912da515ca34d2170bd2bb7a81a 100644
--- a/src/main/java/at/ac/uibk/gitsearch/service/StatisticsService.java
+++ b/src/main/java/at/ac/uibk/gitsearch/service/StatisticsService.java
@@ -54,5 +54,5 @@ public interface StatisticsService {
      */
     Page<StatisticsDTO> search(String query, Pageable pageable);
 
-    Optional<StatisticsDTO> findOneByExerciseID(Long id);
+    Optional<StatisticsDTO> findOneByExerciseID(String id);
 }
diff --git a/src/main/java/at/ac/uibk/gitsearch/service/UserService.java b/src/main/java/at/ac/uibk/gitsearch/service/UserService.java
index 53812dfe261b38d5d0c16430aba07c2f670c8c52..399a637758e0e3eff22d4955282924af0de07a4d 100644
--- a/src/main/java/at/ac/uibk/gitsearch/service/UserService.java
+++ b/src/main/java/at/ac/uibk/gitsearch/service/UserService.java
@@ -1,16 +1,13 @@
 package at.ac.uibk.gitsearch.service;
 
-import at.ac.uibk.gitsearch.config.Constants;
-import at.ac.uibk.gitsearch.domain.Authority;
-import at.ac.uibk.gitsearch.domain.User;
-import at.ac.uibk.gitsearch.repository.AuthorityRepository;
-import at.ac.uibk.gitsearch.repository.UserRepository;
-import at.ac.uibk.gitsearch.repository.search.UserSearchRepository;
-import at.ac.uibk.gitsearch.security.AuthoritiesConstants;
-import at.ac.uibk.gitsearch.security.SecurityUtils;
-import at.ac.uibk.gitsearch.service.dto.UserDTO;
-
-import io.github.jhipster.security.RandomUtil;
+import java.time.Instant;
+import java.time.temporal.ChronoUnit;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.Set;
+import java.util.stream.Collectors;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -18,14 +15,21 @@ import org.springframework.cache.CacheManager;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
 import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.security.core.authority.SimpleGrantedAuthority;
 import org.springframework.security.crypto.password.PasswordEncoder;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.time.Instant;
-import java.time.temporal.ChronoUnit;
-import java.util.*;
-import java.util.stream.Collectors;
+import at.ac.uibk.gitsearch.config.Constants;
+import at.ac.uibk.gitsearch.domain.Authority;
+import at.ac.uibk.gitsearch.domain.User;
+import at.ac.uibk.gitsearch.repository.AuthorityRepository;
+import at.ac.uibk.gitsearch.repository.UserRepository;
+import at.ac.uibk.gitsearch.repository.search.UserSearchRepository;
+import at.ac.uibk.gitsearch.security.AuthoritiesConstants;
+import at.ac.uibk.gitsearch.security.SecurityUtils;
+import at.ac.uibk.gitsearch.service.dto.UserDTO;
+import io.github.jhipster.security.RandomUtil;
 
 /**
  * Service class for managing users.
@@ -161,19 +165,30 @@ public class UserService {
         user.setResetDate(Instant.now());
         user.setActivated(true);
         if (userDTO.getAuthorities() != null) {
-            Set<Authority> authorities = userDTO.getAuthorities().stream()
-                .map(authorityRepository::findById)
-                .filter(Optional::isPresent)
-                .map(Optional::get)
-                .collect(Collectors.toSet());
-            user.setAuthorities(authorities);
+            final List<Authority> allAuthorities = authorityRepository.findAll();
+
+            final Set<Authority> userAuthorities = userDTO.getAuthorities().stream().map(Authority::new).collect(Collectors.toSet());
+            // insert new authorities into managedAuthoritiesTable
+            userAuthorities.stream().filter(auth -> !allAuthorities.contains(auth))
+            	.forEach(authorityRepository::save);
+    		user.setAuthorities(userAuthorities);
         }
+
         userRepository.save(user);
         userSearchRepository.save(user);
         this.clearUserCaches(user);
         log.debug("Created Information for User: {}", user);
         return user;
     }
+    
+
+    /**
+     * cleans up unused authorities every day at 4:30
+     */
+    @Scheduled(cron = "0 30 4 * * ?")
+    public void cleanUpUnusedAuthorities() {
+    	authorityRepository.deleteUnusedAuthorities();
+    }
 
     /**
      * Update all information for a specific user, and return the modified user.
@@ -197,13 +212,13 @@ public class UserService {
                 user.setImageUrl(userDTO.getImageUrl());
                 user.setActivated(userDTO.isActivated());
                 user.setLangKey(userDTO.getLangKey());
-                Set<Authority> managedAuthorities = user.getAuthorities();
-                managedAuthorities.clear();
-                userDTO.getAuthorities().stream()
-                    .map(authorityRepository::findById)
-                    .filter(Optional::isPresent)
-                    .map(Optional::get)
-                    .forEach(managedAuthorities::add);
+                final List<Authority> allAuthorities = authorityRepository.findAll();
+                
+                final Set<Authority> userAuthorities = userDTO.getAuthorities().stream().map(authString -> new Authority(authString)).collect(Collectors.toSet());
+                // insert new authorities into managedAuthoritiesTable
+                userAuthorities.stream().filter(auth -> !allAuthorities.contains(auth))
+                	.forEach(auth -> authorityRepository.save(auth));
+				user.setAuthorities(userAuthorities);
                 userSearchRepository.save(user);
                 this.clearUserCaches(user);
                 log.debug("Changed Information for User: {}", user);
@@ -309,7 +324,20 @@ public class UserService {
     public List<String> getAuthorities() {
         return authorityRepository.findAll().stream().map(Authority::getName).collect(Collectors.toList());
     }
+    
+    public void updateLastLogin(Long userId) {
+    	final User user = userRepository.getOne(userId);
+    	user.setLastLogin(Instant.now());
+    	userRepository.save(user);
+    }
 
+    public void updateLastLogin(String userName) {
+    	final Optional<User> userO = userRepository.findOneByLogin(userName);
+    	userO.ifPresent(user -> {
+	    	user.setLastLogin(Instant.now());
+	    	userRepository.save(user);
+    		});
+    }
 
     private void clearUserCaches(User user) {
         Objects.requireNonNull(cacheManager.getCache(UserRepository.USERS_BY_LOGIN_CACHE)).evict(user.getLogin());
@@ -317,4 +345,16 @@ public class UserService {
             Objects.requireNonNull(cacheManager.getCache(UserRepository.USERS_BY_EMAIL_CACHE)).evict(user.getEmail());
         }
     }
+    
+    public org.springframework.security.core.userdetails.User convertToSecurityUser(User u) {
+    	return new org.springframework.security.core.userdetails.User(u.getLogin(), "unusedPassword", 
+    			u.getAuthorities().stream().map(auth -> new SimpleGrantedAuthority(auth.getName())).
+    					collect(Collectors.toList())
+    			);
+    }
+    
+    public Optional<org.springframework.security.core.userdetails.User> convertToSecurityUser(Optional<User> u) {
+    	return u.map(this::convertToSecurityUser);
+    }
+
 }
diff --git a/src/main/java/at/ac/uibk/gitsearch/service/UserWatchListQueryService.java b/src/main/java/at/ac/uibk/gitsearch/service/UserWatchListQueryService.java
index f03c499e02cec2ae76a11ea362ff4bf321a56bd6..4462091776b9ca689825a719b9f655d5452351e6 100644
--- a/src/main/java/at/ac/uibk/gitsearch/service/UserWatchListQueryService.java
+++ b/src/main/java/at/ac/uibk/gitsearch/service/UserWatchListQueryService.java
@@ -94,9 +94,12 @@ public class UserWatchListQueryService extends QueryService<UserWatchList> {
             if (criteria.getName() != null) {
                 specification = specification.and(buildStringSpecification(criteria.getName(), UserWatchList_.name));
             }
-            if (criteria.getUserIdId() != null) {
-                specification = specification.and(buildSpecification(criteria.getUserIdId(),
-                    root -> root.join(UserWatchList_.userId, JoinType.LEFT).get(User_.id)));
+            if (criteria.getCheckFrequency() != null) {
+                specification = specification.and(buildSpecification(criteria.getCheckFrequency(), UserWatchList_.checkFrequency));
+            }
+            if (criteria.getUserId() != null) {
+                specification = specification.and(buildSpecification(criteria.getUserId(),
+                    root -> root.join(UserWatchList_.user, JoinType.LEFT).get(User_.id)));
             }
         }
         return specification;
diff --git a/src/main/java/at/ac/uibk/gitsearch/service/UserWatchListService.java b/src/main/java/at/ac/uibk/gitsearch/service/UserWatchListService.java
index fe3e1f7cd4e59e34faa998c32c0c762540ff5778..74588573941746bef334ea8046d2b2e986d5b9bc 100644
--- a/src/main/java/at/ac/uibk/gitsearch/service/UserWatchListService.java
+++ b/src/main/java/at/ac/uibk/gitsearch/service/UserWatchListService.java
@@ -1,9 +1,13 @@
 package at.ac.uibk.gitsearch.service;
 
+import java.time.Instant;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.Optional;
 import java.util.stream.Collectors;
 
+import org.codeability.sharing.plugins.api.search.SearchResultDTO;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.data.domain.Page;
@@ -15,7 +19,10 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import at.ac.uibk.gitsearch.domain.UserWatchList;
+import at.ac.uibk.gitsearch.domain.WatchListEntry;
+import at.ac.uibk.gitsearch.domain.enumeration.CheckFrequency;
 import at.ac.uibk.gitsearch.repository.UserWatchListRepository;
+import at.ac.uibk.gitsearch.repository.search.MetaDataRepository;
 import at.ac.uibk.gitsearch.security.AuthoritiesConstants.AuthoritiesConstantEnum;
 import at.ac.uibk.gitsearch.security.jwt.TokenProvider;
 import at.ac.uibk.gitsearch.service.dto.UserWatchListDTO;
@@ -36,11 +43,19 @@ public class UserWatchListService {
     private final UserWatchListMapper userWatchListMapper;
 
     private final TokenProvider tokenProvider;
-
-    public UserWatchListService(UserWatchListRepository userWatchListRepository, UserWatchListMapper userWatchListMapper, TokenProvider tokenProvider) {
+    
+    private final UserService userService;
+    
+    private final MetaDataRepository metaDataRepository;
+
+    public UserWatchListService(UserWatchListRepository userWatchListRepository, UserWatchListMapper userWatchListMapper, 
+    		TokenProvider tokenProvider, MetaDataRepository metaDataRepository,
+    		UserService userService) {
         this.userWatchListRepository = userWatchListRepository;
         this.userWatchListMapper = userWatchListMapper;
         this.tokenProvider = tokenProvider;
+        this.metaDataRepository = metaDataRepository;
+        this.userService = userService;
     }
 
     /**
@@ -66,7 +81,7 @@ public class UserWatchListService {
     	}
     	if(!mustExist)
     		return Optional.empty();
-    	final boolean isAccessible = watchListO.get().getUserIdLogin().equals(currentPrincipal.get().getUsername());
+    	final boolean isAccessible = watchListO.get().getUserLogin().equals(currentPrincipal.get().getUsername());
     	if(!isAccessible) {
     		log.warn("watchlist {} does not belong to current user",  watchListO.get().getName());
             throw new IllegalAccessError("watchlist does not belong to current User");
@@ -115,7 +130,7 @@ public class UserWatchListService {
     @Transactional(readOnly = true)
     public List<UserWatchListDTO> findByUserIdIsCurrentUser() {
         log.debug("Request to get all UserWatchLists");
-        return userWatchListRepository.findByUserIdIsCurrentUser().stream()
+        return userWatchListRepository.findByUserIsCurrentUser().stream()
             .map(userWatchListMapper::toDto).collect(Collectors.toList());
     }
 
@@ -174,5 +189,48 @@ public class UserWatchListService {
         return userWatchListRepository.searchForCurrentUser(query, cleanedPageRequest)
             .map(userWatchListMapper::toDto);
     }
-
+    
+    public List<UserWatchList> findByUser(at.ac.uibk.gitsearch.domain.User user) {
+    	return userWatchListRepository.findByUser(user);
+    }
+    
+    /**
+     * find all SearchResultDTO that are watched by some stored Watchlist, and 
+     * @param since
+     * @param user
+     * @return
+     */
+    public Map<SearchResultDTO, UserWatchList> findChangesSince(Instant since, at.ac.uibk.gitsearch.domain.User user) {
+    	Map<SearchResultDTO, UserWatchList> result = new HashMap<>();
+    	findByUser(user).stream()
+ 		  .filter(wl -> wl.getCheckFrequency() != CheckFrequency.NEVER)
+ 		  .forEach(wl -> 
+    	   metaDataRepository.getExercisesById(wl.getWatchListEntries().stream().map( WatchListEntry::getExerciseId ) ,
+    		userService.convertToSecurityUser(Optional.of(user)), 0, 100, since).
+    	   getSearchResult().forEach(
+    			   sr -> {
+    				   UserWatchList previousWatchList = result.get(sr);
+    				   if(     previousWatchList == null ||  // none found or
+    						   previousWatchList.getCheckFrequency().ordinal() > wl.getCheckFrequency().ordinal()) { // earlier
+    					   result.put(sr, wl);
+    				   }
+    			   }
+ 			));
+ 		return result;
+    }
+    
+    /**
+     * not really useful.
+     * @param checkFrequency
+     * @param user
+     * @return
+     */
+    public Map<SearchResultDTO, UserWatchList> findChangesSince(CheckFrequency checkFrequency, at.ac.uibk.gitsearch.domain.User user) {
+    	Map<SearchResultDTO, UserWatchList> changesSince = findChangesSince(checkFrequency.getChangedBefore(), user);
+    	return changesSince.entrySet().stream().
+    			filter(entry -> entry.getValue().getCheckFrequency().ordinal() <= checkFrequency.ordinal())
+    			.collect(Collectors.toMap(x -> x.getKey(), x -> x.getValue()));
+    	
+    }
+    
 }
diff --git a/src/main/java/at/ac/uibk/gitsearch/service/WatchListEntryService.java b/src/main/java/at/ac/uibk/gitsearch/service/WatchListEntryService.java
index 84a6233055a20e42fadb80e4a758614d1642cac8..61b84f9c4abe533a911b79572591a67cfc48ffbf 100644
--- a/src/main/java/at/ac/uibk/gitsearch/service/WatchListEntryService.java
+++ b/src/main/java/at/ac/uibk/gitsearch/service/WatchListEntryService.java
@@ -16,8 +16,6 @@ import org.springframework.transaction.annotation.Transactional;
 
 import java.util.List;
 import java.util.Optional;
-import java.util.stream.Collectors;
-
 import static org.elasticsearch.index.query.QueryBuilders.*;
 
 /**
@@ -30,7 +28,8 @@ public class WatchListEntryService {
     private final Logger log = LoggerFactory.getLogger(WatchListEntryService.class);
 
     private final WatchListEntryRepository watchListEntryRepository;
-    private final UserWatchListRepository userWatchListRepository;
+    @SuppressWarnings("unused")
+	private final UserWatchListRepository userWatchListRepository;
 
     private final WatchListEntryMapper watchListEntryMapper;
 
diff --git a/src/main/java/at/ac/uibk/gitsearch/service/dto/LikesCriteria.java b/src/main/java/at/ac/uibk/gitsearch/service/dto/LikesCriteria.java
new file mode 100644
index 0000000000000000000000000000000000000000..38b561900b49b4501e19fdc345dfd46e9fdad866
--- /dev/null
+++ b/src/main/java/at/ac/uibk/gitsearch/service/dto/LikesCriteria.java
@@ -0,0 +1,121 @@
+package at.ac.uibk.gitsearch.service.dto;
+
+import java.io.Serializable;
+import java.util.Objects;
+import io.github.jhipster.service.Criteria;
+import io.github.jhipster.service.filter.BooleanFilter;
+import io.github.jhipster.service.filter.DoubleFilter;
+import io.github.jhipster.service.filter.Filter;
+import io.github.jhipster.service.filter.FloatFilter;
+import io.github.jhipster.service.filter.IntegerFilter;
+import io.github.jhipster.service.filter.LongFilter;
+import io.github.jhipster.service.filter.StringFilter;
+import io.github.jhipster.service.filter.LocalDateFilter;
+
+/**
+ * Criteria class for the {@link at.ac.uibk.gitsearch.domain.Likes} entity. This class is used
+ * in {@link at.ac.uibk.gitsearch.web.rest.LikesResource} to receive all the possible filtering options from
+ * the Http GET request parameters.
+ * For example the following could be a valid request:
+ * {@code /likes?id.greaterThan=5&attr1.contains=something&attr2.specified=false}
+ * As Spring is unable to properly convert the types, unless specific {@link Filter} class are used, we need to use
+ * fix type specific filters.
+ */
+public class LikesCriteria implements Serializable, Criteria {
+
+    private static final long serialVersionUID = 1L;
+
+    private LongFilter id;
+
+    private LocalDateFilter date;
+
+    private IntegerFilter userID;
+
+    private StringFilter ExerciseID;
+
+    public LikesCriteria() {
+    }
+
+    public LikesCriteria(LikesCriteria other) {
+        this.id = other.id == null ? null : other.id.copy();
+        this.date = other.date == null ? null : other.date.copy();
+        this.userID = other.userID == null ? null : other.userID.copy();
+        this.ExerciseID = other.ExerciseID == null ? null : other.ExerciseID.copy();
+    }
+
+    @Override
+    public LikesCriteria copy() {
+        return new LikesCriteria(this);
+    }
+
+    public LongFilter getId() {
+        return id;
+    }
+
+    public void setId(LongFilter id) {
+        this.id = id;
+    }
+
+    public LocalDateFilter getDate() {
+        return date;
+    }
+
+    public void setDate(LocalDateFilter date) {
+        this.date = date;
+    }
+
+    public IntegerFilter getUserID() {
+        return userID;
+    }
+
+    public void setUserID(IntegerFilter userID) {
+        this.userID = userID;
+    }
+
+    public StringFilter getExerciseID() {
+        return ExerciseID;
+    }
+
+    public void setExerciseID(StringFilter ExerciseID) {
+        this.ExerciseID = ExerciseID;
+    }
+
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (o == null || getClass() != o.getClass()) {
+            return false;
+        }
+        final LikesCriteria that = (LikesCriteria) o;
+        return
+            Objects.equals(id, that.id) &&
+            Objects.equals(date, that.date) &&
+            Objects.equals(userID, that.userID) &&
+            Objects.equals(ExerciseID, that.ExerciseID);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(
+        id,
+        date,
+        userID,
+        ExerciseID
+        );
+    }
+
+    // prettier-ignore
+    @Override
+    public String toString() {
+        return "LikesCriteria{" +
+                (id != null ? "id=" + id + ", " : "") +
+                (date != null ? "date=" + date + ", " : "") +
+                (userID != null ? "userID=" + userID + ", " : "") +
+                (ExerciseID != null ? "ExerciseID=" + ExerciseID + ", " : "") +
+            "}";
+    }
+
+}
diff --git a/src/main/java/at/ac/uibk/gitsearch/service/dto/MessageDTO.java b/src/main/java/at/ac/uibk/gitsearch/service/dto/MessageDTO.java
new file mode 100644
index 0000000000000000000000000000000000000000..6151dc38da36af469d38b123c56ed62e5691d842
--- /dev/null
+++ b/src/main/java/at/ac/uibk/gitsearch/service/dto/MessageDTO.java
@@ -0,0 +1,36 @@
+package at.ac.uibk.gitsearch.service.dto;
+
+/**
+ * just a very simple DTO to transfer a message.
+ * @author Michael Breu
+ *
+ */
+public class MessageDTO {
+	
+	public MessageDTO() {
+	}
+
+	public MessageDTO(String message) {
+		super();
+		this.message = message;
+	}
+
+
+	private String message;
+	
+	
+
+	/**
+	 * @return the message
+	 */
+	public String getMessage() {
+		return message;
+	}
+
+	/**
+	 * @param message the message to set
+	 */
+	public void setMessage(String message) {
+		this.message = message;
+	}
+}
diff --git a/src/main/java/at/ac/uibk/gitsearch/service/dto/SavedSearchesDTO.java b/src/main/java/at/ac/uibk/gitsearch/service/dto/SavedSearchesDTO.java
index 1cc915e03708df0b96c6d9b9327330a3f4a7c08e..c0479e643b840270db2eeb80f926c8166dac64ce 100644
--- a/src/main/java/at/ac/uibk/gitsearch/service/dto/SavedSearchesDTO.java
+++ b/src/main/java/at/ac/uibk/gitsearch/service/dto/SavedSearchesDTO.java
@@ -8,7 +8,12 @@ import java.io.Serializable;
  */
 public class SavedSearchesDTO implements Serializable {
     
-    private Long id;
+    /**
+	 * 
+	 */
+	private static final long serialVersionUID = 2832300167164526635L;
+
+	private Long id;
 
     @NotNull
     @Size(min = 1)
@@ -18,9 +23,9 @@ public class SavedSearchesDTO implements Serializable {
     private String jsonQuery;
 
 
-    private Long userIdId;
+    private Long userId;
 
-    private String userIdLogin;
+    private String userLogin;
     
     public Long getId() {
         return id;
@@ -46,20 +51,20 @@ public class SavedSearchesDTO implements Serializable {
         this.jsonQuery = jsonQuery;
     }
 
-    public Long getUserIdId() {
-        return userIdId;
+    public Long getUserId() {
+        return userId;
     }
 
-    public void setUserIdId(Long userId) {
-        this.userIdId = userId;
+    public void setUserId(Long userId) {
+        this.userId = userId;
     }
 
-    public String getUserIdLogin() {
-        return userIdLogin;
+    public String getUserLogin() {
+        return userLogin;
     }
 
-    public void setUserIdLogin(String userLogin) {
-        this.userIdLogin = userLogin;
+    public void setUserLogin(String userLogin) {
+        this.userLogin = userLogin;
     }
 
     @Override
@@ -86,8 +91,8 @@ public class SavedSearchesDTO implements Serializable {
             "id=" + getId() +
             ", name='" + getName() + "'" +
             ", jsonQuery='" + getJsonQuery() + "'" +
-            ", userIdId=" + getUserIdId() +
-            ", userIdLogin='" + getUserIdLogin() + "'" +
+            ", userId=" + getUserId() +
+            ", userIdLogin='" + getUserLogin() + "'" +
             "}";
     }
 }
diff --git a/src/main/java/at/ac/uibk/gitsearch/service/dto/SearchInputDTO.java b/src/main/java/at/ac/uibk/gitsearch/service/dto/SearchInputDTO.java
deleted file mode 100644
index ee9b1f016212ac740542433d68552799dedd9fdc..0000000000000000000000000000000000000000
--- a/src/main/java/at/ac/uibk/gitsearch/service/dto/SearchInputDTO.java
+++ /dev/null
@@ -1,90 +0,0 @@
-package at.ac.uibk.gitsearch.service.dto;
-
-import java.util.List;
-
-public class SearchInputDTO {
-    private String fulltextQuery;
-    private SearchInputMetadataDTO metadata;
-    private List<String> selectedRepository;
-    private List<String> selectedUniversity;
-    private List<String> selectedFileFormat;
-
-    private int page;
-	public static final int PAGE_SIZE = 10;
-
-    public SearchInputDTO() {
-    	// empty for jackson
-    }
-    public SearchInputDTO(String fulltextQuery, SearchInputMetadataDTO metadata,
-                          List<String> selectedRepository, List<String> selectedUniversity,
-                          List<String> selectedFileFormat, int page) {
-        this.fulltextQuery = fulltextQuery;
-        this.metadata = metadata;
-        this.selectedRepository = selectedRepository;
-        this.selectedUniversity = selectedUniversity;
-        this.selectedFileFormat = selectedFileFormat;
-        this.page = page;
-    }
-
-    public String getFulltextQuery() {
-        return fulltextQuery;
-    }
-
-    public void setFulltextQuery(String fulltextQuery) {
-        this.fulltextQuery = fulltextQuery;
-    }
-
-    public SearchInputMetadataDTO getMetadata() {
-        return metadata;
-    }
-
-    /**
-	 * @param metadata the metadata to set
-	 */
-	public void setMetadata(SearchInputMetadataDTO metadata) {
-		this.metadata = metadata;
-	}
-    public List<String> getSelectedRepository() {
-        return selectedRepository;
-    }
-
-    public void setSelectedRepository(List<String> selectedRepository) {
-        this.selectedRepository = selectedRepository;
-    }
-
-    public List<String> getSelectedUniversity() {
-        return selectedUniversity;
-    }
-
-    public void setSelectedUniversity(List<String> selectedUniversity) {
-        this.selectedUniversity = selectedUniversity;
-    }
-
-    public List<String> getSelectedFileFormat() {
-        return selectedFileFormat;
-    }
-
-    public void setSelectedFileFormat(List<String> selectedFileFormat) {
-        this.selectedFileFormat = selectedFileFormat;
-    }
-
-    public int getPage() {
-        return page;
-    }
-
-    public void setPage(int page) {
-        this.page = page;
-    }
-
-    public boolean hasMetadataInput() {
-        return this.metadata.hasMetadataInput();
-    }
-
-    @Override
-	public String toString() {
-		return "SearchInputDTO [fulltextQuery=" + fulltextQuery + ", selectedRepository=" + selectedRepository + ", selectedUniversity="
-				+ selectedUniversity + ", selectedFileFormat=" + selectedFileFormat + ", page=" + page + ", metadata: {" + metadata + "}]";
-	}
-
-
-}
diff --git a/src/main/java/at/ac/uibk/gitsearch/service/dto/SearchInputMetadataDTO.java b/src/main/java/at/ac/uibk/gitsearch/service/dto/SearchInputMetadataDTO.java
deleted file mode 100644
index 1a9395364a39a2c8065dc64984d3a7e05b42786f..0000000000000000000000000000000000000000
--- a/src/main/java/at/ac/uibk/gitsearch/service/dto/SearchInputMetadataDTO.java
+++ /dev/null
@@ -1,127 +0,0 @@
-package at.ac.uibk.gitsearch.service.dto;
-
-import java.util.List;
-import java.util.stream.Collectors;
-
-import at.ac.uibk.gitsearch.service.dto.UserProvidedMetadataDTO.ExerciseType;
-
-public class SearchInputMetadataDTO {
-    private String programmingLanguage;
-    private String keyword;
-    private List<String> naturalLanguage;
-    private String license;
-    private String author;
-    private List<ExerciseType> types;
-    private String format;
-
-    public SearchInputMetadataDTO() {
-    }
-
-
-    public SearchInputMetadataDTO(String programmingLanguage,
-                                  String keyword,
-                                  List<String> naturalLanguage,
-                                  String license,
-                                  String author,
-                                  String format) {
-        this.programmingLanguage = mapEmptyString(programmingLanguage);
-        this.keyword = mapEmptyString(keyword);
-        this.license = mapEmptyString(license);
-        this.author = mapEmptyString(author);
-        this.naturalLanguage = naturalLanguage;
-        this.format = mapEmptyString(format);
-    }
-
-    private static List<String> mapEmptyString(List<String> str) {
-    	if(str==null) return null;
-    	return str.stream().map(s -> "".equals(s) ? null : s).collect(Collectors.toList());
-    }
-
-    private static String mapEmptyString(String str) {
-        return "".equals(str) ? null : str;
-    }
-
-    public String getFormat() {
-        return format;
-    }
-
-    public void setFormat(String format) {
-        this.format = format;
-    }
-
-    public boolean hasMetadataInput() {
-        return !(programmingLanguage == null
-            && keyword == null
-            && author == null
-            && license == null);
-    }
-
-    public String getProgrammingLanguage() {
-        return programmingLanguage;
-    }
-
-    public void setProgrammingLanguage(String programmingLanguage) {
-        this.programmingLanguage = mapEmptyString(programmingLanguage);
-    }
-
-    public String getKeyword() {
-        return keyword;
-    }
-
-    public void setKeyword(String keyword) {
-        this.keyword = mapEmptyString(keyword);
-    }
-
-    public List<String> getNaturalLanguage() {
-        return naturalLanguage;
-    }
-
-    public String getNaturalLanguagesAsString() {
-    	return naturalLanguage==null?"null":
-    		naturalLanguage.stream().collect(Collectors.joining(", "));
-    }
-
-    public void setNaturalLanguage(List<String> naturalLanguage) {
-        this.naturalLanguage = mapEmptyString(naturalLanguage);
-    }
-
-    public String getLicense() {
-        return license;
-    }
-
-    public void setLicense(String license) {
-        this.license = mapEmptyString(license);
-    }
-
-    public String getAuthor() {
-        return author;
-    }
-
-    public void setAuthor(String author) {
-        this.author = mapEmptyString(author);
-    }
-
-    /**
-	 * @return the types
-	 */
-	public List<ExerciseType> getTypes() {
-		return types;
-	}
-
-	/**
-	 * @param types the types to set
-	 */
-	public void setTypes(List<ExerciseType> types) {
-		this.types = types;
-	}
-
-	@Override
-    public String toString() {
-        return "programmingLanguage: " + this.programmingLanguage
-            + ", keyword: " + this.keyword
-            + ", naturalLanguage: " + getNaturalLanguagesAsString()
-            + ", license: " + this.license
-            + ", author: " + this.author
-            + ", format: " + this.format;
-    }
-}
diff --git a/src/main/java/at/ac/uibk/gitsearch/service/dto/SearchResultDTO.java b/src/main/java/at/ac/uibk/gitsearch/service/dto/SearchResultDTO.java
deleted file mode 100644
index 32e955988a8e81dd03ea32da4b1db9566e89cc95..0000000000000000000000000000000000000000
--- a/src/main/java/at/ac/uibk/gitsearch/service/dto/SearchResultDTO.java
+++ /dev/null
@@ -1,380 +0,0 @@
-package at.ac.uibk.gitsearch.service.dto;
-
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-import java.util.Objects;
-
-public class SearchResultDTO {
-	
-	public static class PluginActionInfo {
-		String plugin;
-		String action;
-		String commandName;
-		
-		public PluginActionInfo(String plugin, String action, String commandName) {
-			super();
-			this.plugin = plugin;
-			this.action = action;
-			this.commandName = commandName;
-		}
-		
-		public PluginActionInfo() {
-			// JSON
-		}
-		/**
-		 * @return the plugin
-		 */
-		public String getPlugin() {
-			return plugin;
-		}
-		/**
-		 * @param plugin the plugin to set
-		 */
-		public void setPlugin(String plugin) {
-			this.plugin = plugin;
-		}
-		/**
-		 * @return the action
-		 */
-		public String getAction() {
-			return action;
-		}
-		/**
-		 * @param action the action to set
-		 */
-		public void setAction(String action) {
-			this.action = action;
-		}
-		/**
-		 * @return the commandName
-		 */
-		public String getCommandName() {
-			return commandName;
-		}
-		/**
-		 * @param commandName the commandName to set
-		 */
-		public void setCommandName(String commandName) {
-			this.commandName = commandName;
-		}
-		
-		
-	}
-
-
-    private GitProject project;
-    private MetadataFile file;
-    private UserProvidedMetadataDTO metadata;
-    
-    private String exerciseId;
-    
-    private int ranking5;
-	private List<PluginActionInfo> supportedActions = new ArrayList<>(2);
-
-	public SearchResultDTO() {
-        // default constructor
-    }
-
-    /**
-     * clone constructor
-     *
-     * @param toClone
-     */
-    public SearchResultDTO(SearchResultDTO toClone) {
-        super();
-        this.project = toClone.project;
-        this.file = toClone.file;
-        this.metadata = toClone.metadata;
-    }
-
-    public GitProject getProject() {
-        return project;
-    }
-
-    public void setProject(GitProject project) {
-        this.project = project;
-    }
-
-    public MetadataFile getFile() {
-        return file;
-    }
-
-    public void setFile(MetadataFile file) {
-        this.file = file;
-    }
-
-    public UserProvidedMetadataDTO getMetadata() {
-        return metadata;
-    }
-
-    public void setMetadata(UserProvidedMetadataDTO metadata) {
-        this.metadata = metadata;
-    }
-
-    @Override
-    public String toString() {
-        return "SearchResultDTO : { project: " + this.project
-            + ", file: " + this.file
-            + ", metadata: " + this.metadata
-            + " }";
-    }
-
-    @Override
-	public final int hashCode() {
-		final int prime = 31;
-		int result = 1;
-		result = prime * result + ((exerciseId == null) ? 0 : exerciseId.hashCode());
-		result = prime * result + ((file == null) ? 0 : file.hashCode());
-		result = prime * result + ((metadata == null) ? 0 : metadata.hashCode());
-		result = prime * result + ((project == null) ? 0 : project.hashCode());
-		return result;
-	}
-
-	@Override
-	public final boolean equals(Object obj) {
-		if (this == obj)
-			return true;
-		if (obj == null)
-			return false;
-		if (!(obj instanceof SearchResultDTO))
-			return false;
-		SearchResultDTO other = (SearchResultDTO) obj;
-		if (exerciseId == null) {
-			if (other.exerciseId != null)
-				return false;
-		} else if (!exerciseId.equals(other.exerciseId))
-			return false;
-		if (file == null) {
-			if (other.file != null)
-				return false;
-		} else if (!file.equals(other.file))
-			return false;
-		if (metadata == null) {
-			if (other.metadata != null)
-				return false;
-		} else if (!metadata.equals(other.metadata))
-			return false;
-		if (project == null) {
-			if (other.project != null)
-				return false;
-		} else if (!project.equals(other.project))
-			return false;
-		return true;
-	}
-
-
-
-	public static class GitProject {
-        private int project_id;
-        private String project_name;
-        private String namespace;
-        private String main_group;
-        private String sub_group;
-        private String url;
-        private Date last_activity_at;
-
-        public int getProject_id() {
-            return project_id;
-        }
-
-        public Date getLast_activity_at() {
-            return last_activity_at;
-        }
-
-        public void setLast_activity_at(Date last_activity_at) {
-            this.last_activity_at = last_activity_at;
-        }
-
-        public void setProject_id(int project_id) {
-            this.project_id = project_id;
-        }
-
-        public String getProject_name() {
-            return project_name;
-        }
-
-        public void setProject_name(String project_name) {
-            this.project_name = project_name;
-        }
-
-        public String getNamespace() {
-            return namespace;
-        }
-
-        public void setNamespace(String namespace) {
-            this.namespace = namespace;
-        }
-
-        public String getMain_group() {
-            return main_group;
-        }
-
-        public void setMain_group(String main_group) {
-            this.main_group = main_group;
-        }
-
-        public String getSub_group() {
-            return sub_group;
-        }
-
-        public void setSub_group(String sub_group) {
-            this.sub_group = sub_group;
-        }
-
-        public String getUrl() {
-            return url;
-        }
-
-        public void setUrl(String url) {
-            this.url = url;
-        }
-
-        public int getProjectId() {
-            return project_id;
-        }
-
-        public void setProjectId(int project_id) {
-            this.project_id = project_id;
-        }
-
-        @Override
-        public final int hashCode() {
-            return Integer.hashCode(project_id);
-        }
-
-        @Override
-        public final boolean equals(Object obj) {
-            if (this == obj) {
-                return true;
-            }
-            if (!(obj instanceof GitProject)) {
-                return false;
-            }
-            GitProject other = (GitProject) obj;
-            return this.project_id == other.project_id;
-        }
-
-        @Override
-        public String toString() {
-            return  "Project: { project_id: " + project_id
-                + ", project_name: " + project_name
-                + ", namespace: " + namespace
-                + ", main_group: " + main_group
-                + ", sub_group: " + sub_group
-                + ", url: " + url
-                + " }";
-        }
-    }
-    
-    /**
-	 * @return the exerciseId
-	 */
-    public String getExerciseId() {
-		return exerciseId;
-	}
-
-	/**
-	 * @param exerciseId the exerciseId to set
-	 */
-	public void setExerciseId(String exerciseId) {
-		this.exerciseId = exerciseId;
-	}
-
-	/**
-	 * @return the ranking5
-	 */
-	public int getRanking5() {
-		return ranking5;
-	}
-
-	/**
-	 * @param ranking5 the ranking5 to set
-	 */
-	public void setRanking5(int ranking5) {
-		this.ranking5 = ranking5;
-	}
-
-	/**
-	 * @return the supportedActions
-	 */
-	public List<PluginActionInfo> getSupportedActions() {
-		return supportedActions;
-	}
-
-	/**
-	 * @param supportedActions the supportedActions to set
-	 */
-	public void setSupportedActions(List<PluginActionInfo> supportedActions) {
-		this.supportedActions = supportedActions;
-	}
-
-    public static class MetadataFile {
-        private String filename;
-        private String path;
-        private String commit_id;
-        private Date indexing_date;
-
-        public String getFilename() {
-            return filename;
-        }
-
-        public void setFilename(String filename) {
-            this.filename = filename;
-        }
-
-        public String getPath() {
-            return path;
-        }
-
-        public void setPath(String path) {
-            this.path = path;
-        }
-
-        public String getCommit_id() {
-            return commit_id;
-        }
-
-        public void setCommit_id(String commit_id) {
-            this.commit_id = commit_id;
-        }
-
-        public Date getIndexing_date() {
-            return indexing_date;
-        }
-
-        public void setIndexing_date(Date indexing_date) {
-            this.indexing_date = indexing_date;
-        }
-        
-        @Override
-        public final int hashCode() {
-            final int prime = 31;
-            int result = this.path.hashCode();
-            result = prime * result + this.commit_id.hashCode();
-            return result;
-        }
-
-        @Override
-        public final boolean equals(Object obj) {
-            if (this == obj) {
-                return true;
-            }
-            if (!(obj instanceof MetadataFile)) {
-                return false;
-            }
-            MetadataFile other = (MetadataFile) obj;
-            return Objects.equals(this.path, other.path)
-                && Objects.equals(this.commit_id, other.commit_id);
-        }
-
-        @Override
-        public String toString() {
-            return "MetadataFile: { filename: " + this.filename
-                + ", path: " + this.path
-                + ", commit_id: " + this.commit_id
-                + ", indexing_date: " + this.indexing_date
-                + " }";
-        }
-    }
-}
diff --git a/src/main/java/at/ac/uibk/gitsearch/service/dto/SearchResultsDTO.java b/src/main/java/at/ac/uibk/gitsearch/service/dto/SearchResultsDTO.java
deleted file mode 100644
index 1ec620a774d4f66e08ee322edefb3699c43af8b3..0000000000000000000000000000000000000000
--- a/src/main/java/at/ac/uibk/gitsearch/service/dto/SearchResultsDTO.java
+++ /dev/null
@@ -1,91 +0,0 @@
-package at.ac.uibk.gitsearch.service.dto;
-
-import java.util.List;
-
-import com.fasterxml.jackson.annotation.JsonValue;
-
-public class SearchResultsDTO {
-
-	public enum GitProjectVisibility {
-		PRIVATE("private"), PUBLIC("public"), INTERNAL("internal");
-		
-		private final String externalName;
-
-		private GitProjectVisibility(String externalName) {
-			this.externalName = externalName;
-		}
-
-		@JsonValue
-		public String getExternalName() {
-			return externalName;
-		}
-
-	}
-
-
-	private List<SearchResultDTO> searchResult;
-
-	/**
-	 *
-	 * @return the list of search results on this page, starting with pageStartIndex
-	 */
-	public List<SearchResultDTO> getSearchResult() {
-		return searchResult;
-	}
-
-	public void setSearchResult(List<SearchResultDTO> searchResult) {
-		this.searchResult = searchResult;
-	}
-
-	long hitCount;
-
-	long pageStartIndex;
-
-	public long getPageStartIndex() {
-		return pageStartIndex;
-	}
-
-	public SearchResultsDTO(List<SearchResultDTO> searchResult, long hitCount, long pageStartIndex) {
-		this.searchResult = searchResult;
-		this.hitCount = hitCount;
-		this.pageStartIndex = pageStartIndex;
-	}
-
-	public SearchResultsDTO() {
-
-	}
-
-	/**
-	 * returns the number of all hits.
-	 *
-	 * @return
-	 */
-	public long getHitCount() {
-		return hitCount;
-	}
-
-	public void setHitCount(long hitCount) {
-		this.hitCount = hitCount;
-	}
-
-	@Override
-	public String toString() {
-		final StringBuilder sb = new StringBuilder();
-		sb.append("SearchResultsDTO:");
-		sb.append(System.lineSeparator());
-		sb.append("hit count: ");
-		sb.append(this.hitCount);
-		sb.append(System.lineSeparator());
-		sb.append("page start index: ");
-		sb.append(this.pageStartIndex);
-		sb.append(System.lineSeparator());
-		sb.append("list of SearchResultsDTOs:");
-		sb.append(System.lineSeparator());
-		for (SearchResultDTO result : this.searchResult) {
-			sb.append(result);
-			sb.append(System.lineSeparator());
-			sb.append(System.lineSeparator());
-		}
-		return sb.toString();
-	}
-}
diff --git a/src/main/java/at/ac/uibk/gitsearch/service/dto/StatisticsDTO.java b/src/main/java/at/ac/uibk/gitsearch/service/dto/StatisticsDTO.java
index c75f66f92216fce0cd45dadfc1706cbaa1817137..cc46ef0e9cb8004985451afe6b922c11bb02c5b5 100644
--- a/src/main/java/at/ac/uibk/gitsearch/service/dto/StatisticsDTO.java
+++ b/src/main/java/at/ac/uibk/gitsearch/service/dto/StatisticsDTO.java
@@ -1,6 +1,5 @@
 package at.ac.uibk.gitsearch.service.dto;
 
-import javax.validation.constraints.*;
 import java.io.Serializable;
 
 /**
@@ -8,13 +7,18 @@ import java.io.Serializable;
  */
 public class StatisticsDTO implements Serializable {
     
-    private Long id;
+    /**
+	 * 
+	 */
+	private static final long serialVersionUID = 1L;
+
+	private Long id;
 
     private Integer views;
 
     private Integer downloads;
 
-    private Long exerciseID;
+    private String exerciseID;
 
     
     public Long getId() {
@@ -41,11 +45,11 @@ public class StatisticsDTO implements Serializable {
         this.downloads = downloads;
     }
 
-    public Long getExerciseID() {
+    public String getExerciseID() {
         return exerciseID;
     }
 
-    public void setExerciseID(Long exerciseID) {
+    public void setExerciseID(String exerciseID) {
         this.exerciseID = exerciseID;
     }
 
diff --git a/src/main/java/at/ac/uibk/gitsearch/service/dto/UserDTO.java b/src/main/java/at/ac/uibk/gitsearch/service/dto/UserDTO.java
index abeae40665cce04880f324dde4422878a6b73a46..4fb28dcef58cefd87567e3275c76c2f4244bca71 100644
--- a/src/main/java/at/ac/uibk/gitsearch/service/dto/UserDTO.java
+++ b/src/main/java/at/ac/uibk/gitsearch/service/dto/UserDTO.java
@@ -50,6 +50,11 @@ public class UserDTO {
 
     private Set<String> authorities;
 
+    private Instant lastLogin;
+
+    private Instant lastMailSent;
+
+
     public UserDTO() {
         // Empty constructor needed for Jackson.
     }
@@ -70,6 +75,8 @@ public class UserDTO {
         this.authorities = user.getAuthorities().stream()
             .map(Authority::getName)
             .collect(Collectors.toSet());
+        this.lastLogin = user.getLastLogin();
+        this.lastMailSent = user.getLastMailSent();
     }
 
     public Long getId() {
@@ -175,6 +182,23 @@ public class UserDTO {
     public void setAuthorities(Set<String> authorities) {
         this.authorities = authorities;
     }
+    
+    public Instant getLastLogin() {
+        return lastLogin;
+    }
+
+    public void setLastLogin(Instant lastLogin) {
+        this.lastLogin = lastLogin;
+    }
+
+    public Instant getLastMailSent() {
+        return lastMailSent;
+    }
+
+    public void setLastMailSent(Instant lastMailSent) {
+        this.lastMailSent = lastMailSent;
+    }
+
 
     // prettier-ignore
     @Override
diff --git a/src/main/java/at/ac/uibk/gitsearch/service/dto/UserProvidedMetadataDTO.java b/src/main/java/at/ac/uibk/gitsearch/service/dto/UserProvidedMetadataDTO.java
deleted file mode 100644
index fe1820b06c7c58660a857bbe71d4029fb6eab996..0000000000000000000000000000000000000000
--- a/src/main/java/at/ac/uibk/gitsearch/service/dto/UserProvidedMetadataDTO.java
+++ /dev/null
@@ -1,471 +0,0 @@
-package at.ac.uibk.gitsearch.service.dto;
-
-import com.fasterxml.jackson.annotation.JsonFormat;
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.fasterxml.jackson.annotation.JsonValue;
-
-import java.util.Arrays;
-import java.util.Objects;
-
-public class UserProvidedMetadataDTO {
-
-    public UserProvidedMetadataDTO() {
-        // default constructor
-    }
-
-    private String metadataVersion; // just for YAML test data reader
-    private String title;
-    private String identifier;
-    private String version;
-    private String structure;
-
-    private String description;
-    private ExerciseType type;
-    private String license;
-    private String[] keyword;
-
-    private String[] format;
-    private String[] programmingLanguage;
-    private String[] language;
-    private String status;
-
-    private String educationLevel;
-
-    @JsonIgnore
-    private String audience;
-
-    private String timeRequired;
-
-    @JsonIgnore
-    private String[] collectionContent;
-
-    private Person[] creator;
-    private Person[] publisher;
-    private Person[] contributor;
-
-    private boolean deprecated;
-
-    private String difficulty;
-    private String[] source;
-
-    private String[] requires;
-    private String image;
-
-    public String getIdentifier() {
-        return identifier;
-    }
-
-    public void setIdentifier(String identifier) {
-        this.identifier = identifier;
-    }
-
-    public String getVersion() {
-        return version;
-    }
-
-    public void setVersion(String version) {
-        this.version = version;
-    }
-
-    public ExerciseType getType() {
-        return type;
-    }
-
-    public void setType(ExerciseType type) {
-        this.type = type;
-    }
-
-    public String[] getLanguage() {
-        return language;
-    }
-
-    public void setLanguage(String[] language) {
-        this.language = language;
-    }
-
-    public String getStatus() {
-        return status;
-    }
-
-    public void setStatus(String status) {
-        this.status = status;
-    }
-
-    public String getEducationLevel() {
-        return educationLevel;
-    }
-
-    public void setEducationLevel(String educationLevel) {
-        this.educationLevel = educationLevel;
-    }
-
-    public String getAudience() {
-        return audience;
-    }
-
-    public void setAudience(String audience) {
-        this.audience = audience;
-    }
-
-    public String getTimeRequired() {
-        return timeRequired;
-    }
-
-    public void setTimeRequired(String timeRequired) {
-        this.timeRequired = timeRequired;
-    }
-
-    public Person[] getCreator() {
-        return creator;
-    }
-
-    public void setCreator(Person[] creator) {
-        this.creator = creator;
-    }
-
-    public Person[] getPublisher() {
-        return publisher;
-    }
-
-    public void setPublisher(Person[] publisher) {
-        this.publisher = publisher;
-    }
-
-    public Person[] getContributor() {
-        return contributor;
-    }
-
-    public void setContributor(Person[] contributor) {
-        this.contributor = contributor;
-    }
-
-    public boolean isDeprecated() {
-        return deprecated;
-    }
-
-    public void setDeprecated(boolean deprecated) {
-        this.deprecated = deprecated;
-    }
-
-    public String getDifficulty() {
-        return difficulty;
-    }
-
-    public void setDifficulty(String difficulty) {
-        this.difficulty = difficulty;
-    }
-
-    public String[] getSource() {
-        return source;
-    }
-
-    public void setSource(String[] source) {
-        this.source = source;
-    }
-
-    public String[] getRequires() {
-        return requires;
-    }
-
-    public void setRequires(String[] requires) {
-        this.requires = requires;
-    }
-
-    public String getImage() {
-        return image;
-    }
-
-    public void setImage(String image) {
-        this.image = image;
-    }
-
-    private String repositoryURL;
-
-    public String getMetadataVersion() {
-        return metadataVersion;
-    }
-
-    public void setMetadataVersion(String metadataVersion) {
-        this.metadataVersion = metadataVersion;
-    }
-
-    public String getTitle() {
-        return title;
-    }
-
-    public void setTitle(String title) {
-        this.title = title;
-    }
-
-    public String getDescription() {
-        return description;
-    }
-
-    public void setDescription(String description) {
-        this.description = description;
-    }
-
-    public String getLicense() {
-        return license;
-    }
-
-    public void setLicense(String license) {
-        this.license = license;
-    }
-
-    public String[] getKeyword() {
-        return keyword;
-    }
-
-    public void setKeyword(String[] keyword) {
-        this.keyword = keyword;
-    }
-
-    public String[] getFormat() {
-        return format;
-    }
-
-    public void setFormat(String[] format) {
-        this.format = format;
-    }
-
-    public String[] getProgrammingLanguage() {
-        return programmingLanguage;
-    }
-
-    public void setProgrammingLanguage(String[] programmingLanguage) {
-        this.programmingLanguage = programmingLanguage;
-    }
-
-    public String getRepositoryURL() {
-        return repositoryURL;
-    }
-
-    public void setRepositoryURL(String repositoryURL) {
-        this.repositoryURL = repositoryURL;
-    }
-
-    public String getStructure() {
-        return structure;
-    }
-
-    public void setStructure(String structure) {
-        this.structure = structure;
-    }
-
-    /**
-     * clone constructor
-     *
-     * @param toClone
-     */
-    public UserProvidedMetadataDTO(UserProvidedMetadataDTO toClone) {
-        super();
-        this.metadataVersion = toClone.metadataVersion;
-        this.title = toClone.title;
-        this.identifier = toClone.identifier;
-        this.version = toClone.version;
-        this.structure = toClone.structure;
-        this.description = toClone.description;
-        this.type = toClone.type;
-        this.license = toClone.license;
-        this.keyword = toClone.keyword;
-        this.format = toClone.format;
-        this.programmingLanguage = toClone.programmingLanguage;
-        this.language = toClone.language;
-        this.status = toClone.status;
-        this.educationLevel = toClone.educationLevel;
-        this.audience = toClone.audience;
-        this.timeRequired = toClone.timeRequired;
-        this.collectionContent = toClone.collectionContent;
-        this.creator = toClone.creator;
-        this.publisher = toClone.publisher;
-        this.contributor = toClone.contributor;
-        this.deprecated = toClone.deprecated;
-        this.difficulty = toClone.difficulty;
-        this.source = toClone.source;
-        this.requires = toClone.requires;
-        this.image = toClone.image;
-        this.repositoryURL = toClone.repositoryURL;
-    }
-
-    @Override
-    public String toString() {
-        return "UserProvidedMetadataDTO { audience: " + audience
-            + ", collectionContent: " + Arrays.toString(collectionContent)
-            + ", contributor: " + Arrays.toString(contributor)
-            + ", creator: " + Arrays.toString(creator)
-            + ", deprecated: " + deprecated
-            + ", description: " + description
-            + ", difficulty: " + difficulty
-            + ", educationLevel: " + educationLevel
-            + ", format: " + Arrays.toString(format)
-            + ", identifier:" + identifier
-            + ", image: " + image
-            + ", keyword: " + Arrays.toString(keyword)
-            + ", language: " + Arrays.toString(language)
-            + ", license: " + license
-            + ", metadataVersion: " + metadataVersion
-            + ", programmingLanguage: " + Arrays.toString(programmingLanguage)
-            + ", publisher: " + Arrays.toString(publisher)
-            + ", repositoryURL: " + repositoryURL
-            + ", requires: " + Arrays.toString(requires)
-            + ", source: " + Arrays.toString(source)
-            + ", status: " + status
-            + ", structure: " + structure
-            + ", timeRequired: " + timeRequired
-            + ", title: " + title
-            + ", type: " + type
-            + ", version: " + version
-            + " }";
-    }
-
-    @Override
-    public final int hashCode() {
-        final int prime = 31;
-        int result = 1;
-        result = prime * result + ((audience == null) ? 0 : audience.hashCode());
-        result = prime * result + Arrays.hashCode(collectionContent);
-        result = prime * result + Arrays.hashCode(contributor);
-        result = prime * result + Arrays.hashCode(creator);
-        result = prime * result + (deprecated ? 1231 : 1237);
-        result = prime * result + ((description == null) ? 0 : description.hashCode());
-        result = prime * result + ((difficulty == null) ? 0 : difficulty.hashCode());
-        result = prime * result + ((educationLevel == null) ? 0 : educationLevel.hashCode());
-        result = prime * result + Arrays.hashCode(format);
-        result = prime * result + ((identifier == null) ? 0 : identifier.hashCode());
-        result = prime * result + ((image == null) ? 0 : image.hashCode());
-        result = prime * result + Arrays.hashCode(keyword);
-        result = prime * result + Arrays.hashCode(language);
-        result = prime * result + ((license == null) ? 0 : license.hashCode());
-        result = prime * result + ((metadataVersion == null) ? 0 : metadataVersion.hashCode());
-        result = prime * result + Arrays.hashCode(programmingLanguage);
-        result = prime * result + Arrays.hashCode(publisher);
-        result = prime * result + ((repositoryURL == null) ? 0 : repositoryURL.hashCode());
-        result = prime * result + Arrays.hashCode(requires);
-        result = prime * result + Arrays.hashCode(source);
-        result = prime * result + ((status == null) ? 0 : status.hashCode());
-        result = prime * result + ((structure == null) ? 0 : structure.hashCode());
-        result = prime * result + ((timeRequired == null) ? 0 : timeRequired.hashCode());
-        result = prime * result + ((title == null) ? 0 : title.hashCode());
-        result = prime * result + ((type == null) ? 0 : type.hashCode());
-        result = prime * result + ((version == null) ? 0 : version.hashCode());
-        return result;
-    }
-
-    @Override
-    public final boolean equals(Object obj) {
-        if (this == obj) {
-            return true;
-        }
-        if (!(obj instanceof UserProvidedMetadataDTO)) {
-            return false;
-        }
-        UserProvidedMetadataDTO other = (UserProvidedMetadataDTO) obj;
-        return Objects.equals(this.audience, other.audience)
-            && Arrays.equals(this.collectionContent, other.collectionContent)
-            && Arrays.equals(this.contributor, other.contributor)
-            && Arrays.equals(this.creator, other.creator)
-            && this.deprecated == other.deprecated
-            && Objects.equals(this.description, other.description)
-            && Objects.equals(this.difficulty, other.difficulty)
-            && Objects.equals(this.educationLevel, other.educationLevel)
-            && Arrays.equals(this.format, other.format)
-            && Objects.equals(this.identifier, other.identifier)
-            && Objects.equals(this.image, other.image)
-            && Arrays.equals(this.keyword, other.keyword)
-            && Arrays.equals(this.language, other.language)
-            && Objects.equals(this.license, other.license)
-            && Objects.equals(this.metadataVersion, other.metadataVersion)
-            && Arrays.equals(this.programmingLanguage, other.programmingLanguage)
-            && Arrays.equals(this.publisher, other.publisher)
-            && Objects.equals(this.repositoryURL, other.repositoryURL)
-            && Arrays.equals(this.requires, other.requires)
-            && Arrays.equals(this.source, other.source)
-            && Objects.equals(this.status, other.status)
-            && Objects.equals(this.structure, other.structure)
-            && Objects.equals(this.timeRequired, other.timeRequired)
-            && Objects.equals(this.title, other.title)
-            && this.type == other.type
-            && Objects.equals(this.version, other.version);
-    }
-
-
-    @JsonFormat(shape = JsonFormat.Shape.OBJECT)
-    public enum ExerciseType {
-        PROGRAMMING_EXERCISE("programming exercise"), EXERCISE("exercise"), COLLECTION("collection"), OTHER("other");
-
-        ExerciseType(String externalName) {
-            this.externalName = externalName;
-        }
-
-        private final String externalName;
-
-        @JsonValue
-        public String getExternalName() {
-            return externalName;
-        }
-    }
-
-    public static class Person {
-        private String name;
-        private String affiliation;
-        private String email;
-
-        public String getName() {
-            return name;
-        }
-
-        public void setName(String name) {
-            this.name = name;
-        }
-
-        public String getAffiliation() {
-            return affiliation;
-        }
-
-        public void setAffiliation(String affiliation) {
-            this.affiliation = affiliation;
-        }
-
-        public String getEmail() {
-            return email;
-        }
-
-        public void setEmail(String email) {
-            this.email = email;
-        }
-
-        @Override
-        public String toString() {
-            return "Person: { name: " + this.name
-                + ", affiliation: " + this.affiliation
-                + ", email: " + this.email
-                + " }";
-        }
-
-        @Override
-        public final int hashCode() {
-            final int prime = 31;
-            int result = 1;
-            result = prime * result + ((affiliation == null) ? 0 : affiliation.hashCode());
-            result = prime * result + ((email == null) ? 0 : email.hashCode());
-            result = prime * result + ((name == null) ? 0 : name.hashCode());
-            return result;
-        }
-
-        @Override
-        public final boolean equals(Object obj) {
-            if (this == obj) {
-                return true;
-            }
-            if (!(obj instanceof Person)) {
-                return false;
-            }
-            Person other = (Person) obj;
-            return Objects.equals(this.affiliation, other.affiliation)
-                && Objects.equals(this.email, other.email)
-                && Objects.equals(this.name, other.name);
-        }
-    }
-}
-
diff --git a/src/main/java/at/ac/uibk/gitsearch/service/dto/UserWatchListCriteria.java b/src/main/java/at/ac/uibk/gitsearch/service/dto/UserWatchListCriteria.java
index 74b9fdc6a01c84e20ec971ead75c25457133ab21..149c96e623943d83e8098b7fea82991cddc43e59 100644
--- a/src/main/java/at/ac/uibk/gitsearch/service/dto/UserWatchListCriteria.java
+++ b/src/main/java/at/ac/uibk/gitsearch/service/dto/UserWatchListCriteria.java
@@ -3,6 +3,7 @@ package at.ac.uibk.gitsearch.service.dto;
 import java.io.Serializable;
 import java.util.Objects;
 
+import at.ac.uibk.gitsearch.domain.enumeration.CheckFrequency;
 import io.github.jhipster.service.Criteria;
 import io.github.jhipster.service.filter.Filter;
 import io.github.jhipster.service.filter.LongFilter;
@@ -18,6 +19,29 @@ import io.github.jhipster.service.filter.StringFilter;
  * fix type specific filters.
  */
 public class UserWatchListCriteria implements Serializable, Criteria {
+    /**
+     * Class for filtering CheckFrequency
+     */
+    public static class CheckFrequencyFilter extends Filter<CheckFrequency> {
+
+        /**
+		 * 
+		 */
+		private static final long serialVersionUID = 1L;
+
+		public CheckFrequencyFilter() {
+        }
+
+        public CheckFrequencyFilter(CheckFrequencyFilter filter) {
+            super(filter);
+        }
+
+        @Override
+        public CheckFrequencyFilter copy() {
+            return new CheckFrequencyFilter(this);
+        }
+
+    }
 
     private static final long serialVersionUID = 1L;
 
@@ -25,7 +49,9 @@ public class UserWatchListCriteria implements Serializable, Criteria {
 
     private StringFilter name;
 
-    private LongFilter userIdId;
+    private CheckFrequencyFilter checkFrequency;
+
+    private LongFilter userId;
 
     public UserWatchListCriteria() {
     }
@@ -33,7 +59,8 @@ public class UserWatchListCriteria implements Serializable, Criteria {
     public UserWatchListCriteria(UserWatchListCriteria other) {
         this.id = other.id == null ? null : other.id.copy();
         this.name = other.name == null ? null : other.name.copy();
-        this.userIdId = other.userIdId == null ? null : other.userIdId.copy();
+        this.checkFrequency = other.checkFrequency == null ? null : other.checkFrequency.copy();
+        this.userId = other.userId == null ? null : other.userId.copy();
     }
 
     @Override
@@ -57,12 +84,20 @@ public class UserWatchListCriteria implements Serializable, Criteria {
         this.name = name;
     }
 
-    public LongFilter getUserIdId() {
-        return userIdId;
+    public CheckFrequencyFilter getCheckFrequency() {
+        return checkFrequency;
+    }
+
+    public void setCheckFrequency(CheckFrequencyFilter checkFrequency) {
+        this.checkFrequency = checkFrequency;
+    }
+
+    public LongFilter getUserId() {
+        return userId;
     }
 
-    public void setUserIdId(LongFilter userIdId) {
-        this.userIdId = userIdId;
+    public void setUserId(LongFilter userId) {
+        this.userId = userId;
     }
 
 
@@ -78,7 +113,8 @@ public class UserWatchListCriteria implements Serializable, Criteria {
         return
             Objects.equals(id, that.id) &&
             Objects.equals(name, that.name) &&
-            Objects.equals(userIdId, that.userIdId);
+            Objects.equals(checkFrequency, that.checkFrequency) &&
+            Objects.equals(userId, that.userId);
     }
 
     @Override
@@ -86,7 +122,8 @@ public class UserWatchListCriteria implements Serializable, Criteria {
         return Objects.hash(
         id,
         name,
-        userIdId
+        checkFrequency,
+        userId
         );
     }
 
@@ -96,7 +133,8 @@ public class UserWatchListCriteria implements Serializable, Criteria {
         return "UserWatchListCriteria{" +
                 (id != null ? "id=" + id + ", " : "") +
                 (name != null ? "name=" + name + ", " : "") +
-                (userIdId != null ? "userIdId=" + userIdId + ", " : "") +
+                (checkFrequency != null ? "checkFrequency=" + checkFrequency + ", " : "") +
+                (userId != null ? "userId=" + userId + ", " : "") +
             "}";
     }
 
diff --git a/src/main/java/at/ac/uibk/gitsearch/service/dto/UserWatchListDTO.java b/src/main/java/at/ac/uibk/gitsearch/service/dto/UserWatchListDTO.java
index 0aaaf0dc7b0fd0ffa7f387c0f6f50c955c016488..bbd65a6557c7e898d5c143c550d1a3d65e61569d 100644
--- a/src/main/java/at/ac/uibk/gitsearch/service/dto/UserWatchListDTO.java
+++ b/src/main/java/at/ac/uibk/gitsearch/service/dto/UserWatchListDTO.java
@@ -2,22 +2,31 @@ package at.ac.uibk.gitsearch.service.dto;
 
 import javax.validation.constraints.*;
 import java.io.Serializable;
+import at.ac.uibk.gitsearch.domain.enumeration.CheckFrequency;
 
 /**
  * A DTO for the {@link at.ac.uibk.gitsearch.domain.UserWatchList} entity.
  */
 public class UserWatchListDTO implements Serializable {
     
+    /**
+	 * 
+	 */
+	private static final long serialVersionUID = 1L;
+
     private Long id;
 
     @NotNull
     @Size(min = 1)
     private String name;
 
+    @NotNull
+    private CheckFrequency checkFrequency;
+
 
-    private Long userIdId;
+    private Long userId;
 
-    private String userIdLogin;
+    private String userLogin;
     
     public Long getId() {
         return id;
@@ -35,20 +44,28 @@ public class UserWatchListDTO implements Serializable {
         this.name = name;
     }
 
-    public Long getUserIdId() {
-        return userIdId;
+    public CheckFrequency getCheckFrequency() {
+        return checkFrequency;
+    }
+
+    public void setCheckFrequency(CheckFrequency checkFrequency) {
+        this.checkFrequency = checkFrequency;
+    }
+
+    public Long getUserId() {
+        return userId;
     }
 
-    public void setUserIdId(Long userId) {
-        this.userIdId = userId;
+    public void setUserId(Long userId) {
+        this.userId = userId;
     }
 
-    public String getUserIdLogin() {
-        return userIdLogin;
+    public String getUserLogin() {
+        return userLogin;
     }
 
-    public void setUserIdLogin(String userLogin) {
-        this.userIdLogin = userLogin;
+    public void setUserLogin(String userLogin) {
+        this.userLogin = userLogin;
     }
 
     @Override
@@ -74,8 +91,9 @@ public class UserWatchListDTO implements Serializable {
         return "UserWatchListDTO{" +
             "id=" + getId() +
             ", name='" + getName() + "'" +
-            ", userIdId=" + getUserIdId() +
-            ", userIdLogin='" + getUserIdLogin() + "'" +
+            ", checkFrequency='" + getCheckFrequency() + "'" +
+            ", userId=" + getUserId() +
+            ", userIdLogin='" + getUserLogin() + "'" +
             "}";
     }
 }
diff --git a/src/main/java/at/ac/uibk/gitsearch/service/dto/WatchListEntryDTO.java b/src/main/java/at/ac/uibk/gitsearch/service/dto/WatchListEntryDTO.java
index d1e168fa8a8756e3a3dfeb387e8c02e00f113cc3..1e15b7526897f7a087711172cb988ac5cad91390 100644
--- a/src/main/java/at/ac/uibk/gitsearch/service/dto/WatchListEntryDTO.java
+++ b/src/main/java/at/ac/uibk/gitsearch/service/dto/WatchListEntryDTO.java
@@ -8,7 +8,12 @@ import java.io.Serializable;
  */
 public class WatchListEntryDTO implements Serializable {
     
-    private Long id;
+    /**
+	 * 
+	 */
+	private static final long serialVersionUID = 1L;
+
+	private Long id;
 
     @NotNull
     private String exerciseId;
diff --git a/src/main/java/at/ac/uibk/gitsearch/service/impl/StatisticsServiceImpl.java b/src/main/java/at/ac/uibk/gitsearch/service/impl/StatisticsServiceImpl.java
index 36d5adfb9173abb0106c8c380c66f7c5eccd4cee..4cb3c332ebf66e768582bc8c67810ba36e399b07 100644
--- a/src/main/java/at/ac/uibk/gitsearch/service/impl/StatisticsServiceImpl.java
+++ b/src/main/java/at/ac/uibk/gitsearch/service/impl/StatisticsServiceImpl.java
@@ -45,7 +45,12 @@ public class StatisticsServiceImpl implements StatisticsService {
         Statistics statistics = statisticsMapper.toEntity(statisticsDTO);
         statistics = statisticsRepository.save(statistics);
         StatisticsDTO result = statisticsMapper.toDto(statistics);
-        statisticsSearchRepository.save(statistics);
+        // TODO temporary fix: statistics has a problem with complex exercise ids (e.g. 10:if1/exercise1) :-)
+        try {
+			statisticsSearchRepository.save(statistics);
+		} catch (Exception e) {
+			log.error("Please fix this problem! ExerciseIds are not numeric any more!", e);
+		}
         return result;
     }
 
@@ -67,7 +72,7 @@ public class StatisticsServiceImpl implements StatisticsService {
     }
 
     @Override
-    public Optional<StatisticsDTO> findOneByExerciseID(Long id) {
+    public Optional<StatisticsDTO> findOneByExerciseID(String id) {
         log.debug("Request to get Statistics by ExerciseId : {}", id);
         return statisticsRepository.findByExerciseID(id)
             .map(statisticsMapper::toDto);
diff --git a/src/main/java/at/ac/uibk/gitsearch/service/mapper/SavedSearchesMapper.java b/src/main/java/at/ac/uibk/gitsearch/service/mapper/SavedSearchesMapper.java
index dcca17a1601b7f18cd776d03e90737d155b326e5..c1f7e9a18a89485f61c4ce2a7f1ec06da186e29d 100644
--- a/src/main/java/at/ac/uibk/gitsearch/service/mapper/SavedSearchesMapper.java
+++ b/src/main/java/at/ac/uibk/gitsearch/service/mapper/SavedSearchesMapper.java
@@ -12,11 +12,11 @@ import org.mapstruct.*;
 @Mapper(componentModel = "spring", uses = {UserMapper.class})
 public interface SavedSearchesMapper extends EntityMapper<SavedSearchesDTO, SavedSearches> {
 
-    @Mapping(source = "userId.id", target = "userIdId")
-    @Mapping(source = "userId.login", target = "userIdLogin")
+    @Mapping(source = "user.id", target = "userId")
+    @Mapping(source = "user.login", target = "userLogin")
     SavedSearchesDTO toDto(SavedSearches savedSearches);
 
-    @Mapping(source = "userIdId", target = "userId")
+    @Mapping(source = "userId", target = "user")
     SavedSearches toEntity(SavedSearchesDTO savedSearchesDTO);
 
     default SavedSearches fromId(Long id) {
diff --git a/src/main/java/at/ac/uibk/gitsearch/service/mapper/UserWatchListMapper.java b/src/main/java/at/ac/uibk/gitsearch/service/mapper/UserWatchListMapper.java
index 86233d6ac5c475eb6ff63d5199085ddc0ee3500b..531e5595aa7c4355994d3f7ef13d45ad3a5e13a8 100644
--- a/src/main/java/at/ac/uibk/gitsearch/service/mapper/UserWatchListMapper.java
+++ b/src/main/java/at/ac/uibk/gitsearch/service/mapper/UserWatchListMapper.java
@@ -12,11 +12,11 @@ import org.mapstruct.*;
 @Mapper(componentModel = "spring", uses = {UserMapper.class})
 public interface UserWatchListMapper extends EntityMapper<UserWatchListDTO, UserWatchList> {
 
-    @Mapping(source = "userId.id", target = "userIdId")
-    @Mapping(source = "userId.login", target = "userIdLogin")
+    @Mapping(source = "user.id", target = "userId")
+    @Mapping(source = "user.login", target = "userLogin")
     UserWatchListDTO toDto(UserWatchList userWatchList);
 
-    @Mapping(source = "userIdId", target = "userId")
+    @Mapping(source = "userId", target = "user")
     UserWatchList toEntity(UserWatchListDTO userWatchListDTO);
 
     default UserWatchList fromId(Long id) {
diff --git a/src/main/java/at/ac/uibk/gitsearch/web/rest/AccountResource.java b/src/main/java/at/ac/uibk/gitsearch/web/rest/AccountResource.java
index 94fef9aebda0a4318ea04b1270eaf87094bf6b1a..41d3142a6b29f82f7693238e530a526ab8921e36 100644
--- a/src/main/java/at/ac/uibk/gitsearch/web/rest/AccountResource.java
+++ b/src/main/java/at/ac/uibk/gitsearch/web/rest/AccountResource.java
@@ -37,13 +37,13 @@ import at.ac.uibk.gitsearch.web.rest.vm.ManagedUserVM;
 @RequestMapping("/api")
 public class AccountResource {
 
-    private static class AccountResourceException extends RuntimeException {
+    public static class AccountResourceException extends RuntimeException {
         /**
 		 * 
 		 */
 		private static final long serialVersionUID = -4660672207242510582L;
 
-		private AccountResourceException(String message) {
+		public AccountResourceException(String message) {
             super(message);
         }
     }
diff --git a/src/main/java/at/ac/uibk/gitsearch/web/rest/CheckResource.java b/src/main/java/at/ac/uibk/gitsearch/web/rest/CheckResource.java
new file mode 100644
index 0000000000000000000000000000000000000000..2c37cf0ffbb682deb123cd24cfc571f11ba3c3ae
--- /dev/null
+++ b/src/main/java/at/ac/uibk/gitsearch/web/rest/CheckResource.java
@@ -0,0 +1,55 @@
+package at.ac.uibk.gitsearch.web.rest;
+
+import java.util.Optional;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import at.ac.uibk.gitsearch.security.jwt.TokenProvider;
+import at.ac.uibk.gitsearch.service.MailService;
+import at.ac.uibk.gitsearch.service.UserService;
+import at.ac.uibk.gitsearch.service.dto.MessageDTO;
+
+/**
+ * REST controller for various tests that can be initiated by the user.
+ */
+@RestController
+@RequestMapping("/api")
+public class CheckResource {
+
+    private final Logger log = LoggerFactory.getLogger(CheckResource.class);
+
+    private final MailService mailService;
+    @SuppressWarnings("unused")
+	private final TokenProvider tokenProvider;
+    private final UserService userService;
+    
+    public CheckResource(MailService mailService,
+    		TokenProvider tokenProvider, UserService userService
+    		) {
+        this.mailService = mailService;
+        this.tokenProvider = tokenProvider;
+        this.userService = userService;
+    }
+
+    /**
+     * {@code Get  /triggerInfoMail} : Triggers the info mail for the current user.
+     */
+    @GetMapping("/triggerInfoMail")
+    public MessageDTO triggerInfoMail()  {
+       
+       Optional<at.ac.uibk.gitsearch.domain.User> uo = userService.getUserWithAuthorities();
+       
+       if(uo.isEmpty())  {
+           log.debug("unknown user for triggerInfoMail");
+           throw new AccountResource.AccountResourceException("User could not be found");
+       }
+       boolean wasSent = mailService.sendInfoMail(uo.get(), true /* even if no content */);
+       return new MessageDTO(wasSent?"Mail successfully sent to " + uo.get().getEmail():"no relevant content found (or potential mailing problems). No Mail sent to " + uo.get().getEmail());
+    }
+
+
+}
diff --git a/src/main/java/at/ac/uibk/gitsearch/web/rest/ExerciseResource.java b/src/main/java/at/ac/uibk/gitsearch/web/rest/ExerciseResource.java
index fde06679e6d52b37ada7a3a5c99832ab59428498..4ed031bbb869ee6a904b6ce837a9d42d1fbcc6d6 100644
--- a/src/main/java/at/ac/uibk/gitsearch/web/rest/ExerciseResource.java
+++ b/src/main/java/at/ac/uibk/gitsearch/web/rest/ExerciseResource.java
@@ -7,12 +7,18 @@ import java.net.URI;
 import java.net.URISyntaxException;
 import java.net.URL;
 import java.util.Optional;
+import java.text.ParseException;
+import java.util.Optional;
 
 import at.ac.uibk.gitsearch.es.model.ArtemisExerciseInfo;
 import at.ac.uibk.gitsearch.security.SecurityUtils;
 import at.ac.uibk.gitsearch.service.ArtemisImportError;
 import at.ac.uibk.gitsearch.service.ExerciseService;
 import org.eclipse.jgit.api.errors.GitAPIException;
+import javax.servlet.http.HttpServletRequest;
+
+import org.codeability.sharing.plugins.api.search.SearchResultDTO;
+import org.codeability.sharing.plugins.api.search.util.ExerciseId;
 import org.gitlab4j.api.GitLabApiException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -23,8 +29,15 @@ import org.springframework.core.io.Resource;
 import org.springframework.http.MediaType;
 import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.*;
+import org.springframework.util.AntPathMatcher;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.servlet.HandlerMapping;
 
 import at.ac.uibk.gitsearch.service.GitlabService;
+import at.ac.uibk.gitsearch.service.SearchService;
 import at.ac.uibk.gitsearch.web.util.HeaderUtil;
 
 import javax.servlet.http.HttpServletRequest;
@@ -39,7 +52,11 @@ import javax.ws.rs.core.Response;
 @RequestMapping("/api")
 public class ExerciseResource {
 
-    private final Logger log = LoggerFactory.getLogger(ExerciseResource.class);
+    private static final String NOT_FOUND = "not found";
+
+	private static final String REPOSITORYFILE = "RepositoryFile";
+
+	private final Logger log = LoggerFactory.getLogger(ExerciseResource.class);
 
     @Value("${application.registeredConnectorsCallBackURL}")
     String baseApiUrl;
@@ -50,24 +67,39 @@ public class ExerciseResource {
     @Autowired
     private ExerciseService exerciseService;
 
+    @Autowired
+    private SearchService searchService;
+
     @Value("${jhipster.clientApp.name}")
     private String applicationName;
 
 
     /**
-     * GET readMe : get problem statement.
+     * GET some file of an exercise.
      *
-     * @param basketToken the basket
-     * @return the ResponseEntity with status 200 (OK) and with body the exercise, or with status 404 (Not Found)
+     * @param filePath the file path
+     * @return the ResponseEntity with status 200 (OK) and with body the exercise file, or with status 404 (Not Found)
      */
-    @GetMapping("/exercise/{exerciseId}")
-    public ResponseEntity<Resource> getRepositoryFile(@PathVariable("exerciseId") String  exerciseId, @RequestParam("filePath") String filePath) throws IOException {
+    @GetMapping("/exerciseFile/**")
+    public ResponseEntity<Resource> getRepositoryFile(HttpServletRequest request, @RequestParam("filePath") String filePath) throws IOException {
+		String pattern = (String) request.getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE);
+
+		String exerciseId = new AntPathMatcher().extractPathWithinPattern(pattern, request.getRequestURI());
+
+		ExerciseId parsedId;
+		try {
+			parsedId = ExerciseId.fromString(exerciseId);
+		} catch (ParseException e) {
+            return ResponseEntity.notFound().headers(HeaderUtil.createFailureAlert(applicationName, true, REPOSITORYFILE, NOT_FOUND,
+                    "There was an error finding your exercise " + exerciseId + ".")).build();
+		}
+
         InputStream repositoryStream = null;
         try {
-            repositoryStream = gitLabService.getRepositoryFile(exerciseId, filePath);
+            repositoryStream = gitLabService.getRepositoryFile(parsedId, filePath);
         } catch (IOException | GitLabApiException e) {
-            log.error("Cannot read file for exercise {} and path {}", exerciseId, filePath, e);
-            return ResponseEntity.notFound().headers(HeaderUtil.createFailureAlert(applicationName, true, "RepositoryFile", "not found",
+            log.warn("Cannot read file for exercise {} and path {}: {}", exerciseId, filePath, e.getMessage());
+            return ResponseEntity.notFound().headers(HeaderUtil.createFailureAlert(applicationName, true, REPOSITORYFILE, NOT_FOUND,
                     "There was an error on the server and the resource file could not be created.")).build();        }
 
         InputStreamResource resource = new InputStreamResource(repositoryStream);
@@ -75,6 +107,36 @@ public class ExerciseResource {
         return ResponseEntity.ok().contentType(MediaType.APPLICATION_OCTET_STREAM).header("filename", filePath).body(resource);
     }
 
+    /**
+     * GET the exercise by Id
+     *
+     * @param request the complete request, in order to parse the exerciseId
+     * @return the ResponseEntity with status 200 (OK) and with the searchresult, or with status 404 (Not Found)
+     */
+    @GetMapping("/exercise/**")
+    public ResponseEntity<SearchResultDTO> getExerciseById(HttpServletRequest request) throws IOException {
+		String pattern = (String) request.getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE);
+
+		String exerciseId = new AntPathMatcher().extractPathWithinPattern(pattern, request.getRequestURI());
+
+		ExerciseId parsedId;
+		try {
+			parsedId = ExerciseId.fromString(exerciseId);
+		} catch (ParseException e) {
+            return ResponseEntity.notFound().headers(HeaderUtil.createFailureAlert(applicationName, true, REPOSITORYFILE, NOT_FOUND,
+                    "There was an error with your requested id " + exerciseId + ".")).build();
+		}
+
+		final Optional<SearchResultDTO> result = searchService.findExerciseById(parsedId);
+
+
+		if(result.isPresent()) {
+			return ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON).body(result.get());
+		} else {
+            return ResponseEntity.notFound().headers(HeaderUtil.createFailureAlert(applicationName, true, REPOSITORYFILE, NOT_FOUND,
+                    "There was an error finding your exercise " + exerciseId + ".")).build();
+		}
+    }
     /**
      * GET /exercise/import : Endpoint listening for request to import exercises.
      * Ex. ArTEMiS calls this endpoint and provides an URL where the exercise can be retrieved
diff --git a/src/main/java/at/ac/uibk/gitsearch/web/rest/LikesResource.java b/src/main/java/at/ac/uibk/gitsearch/web/rest/LikesResource.java
new file mode 100644
index 0000000000000000000000000000000000000000..02765c60069ab6435f569b8ffe4fe8f69a3c487f
--- /dev/null
+++ b/src/main/java/at/ac/uibk/gitsearch/web/rest/LikesResource.java
@@ -0,0 +1,220 @@
+package at.ac.uibk.gitsearch.web.rest;
+
+import at.ac.uibk.gitsearch.domain.Likes;
+import at.ac.uibk.gitsearch.service.LikesService;
+import at.ac.uibk.gitsearch.service.UserService;
+import at.ac.uibk.gitsearch.web.rest.errors.BadRequestAlertException;
+import at.ac.uibk.gitsearch.service.dto.LikesCriteria;
+import at.ac.uibk.gitsearch.service.LikesQueryService;
+
+import io.github.jhipster.web.util.HeaderUtil;
+import io.github.jhipster.web.util.ResponseUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.time.LocalDate;
+import java.util.Date;
+import java.util.List;
+import java.util.Optional;
+import java.util.stream.StreamSupport;
+
+import static org.elasticsearch.index.query.QueryBuilders.*;
+
+/**
+ * REST controller for managing {@link at.ac.uibk.gitsearch.domain.Likes}.
+ */
+@RestController
+@RequestMapping("/api")
+public class LikesResource {
+
+    private final Logger log = LoggerFactory.getLogger(LikesResource.class);
+
+    private static final String ENTITY_NAME = "likes";
+
+    @Value("${jhipster.clientApp.name}")
+    private String applicationName;
+
+    private final LikesService likesService;
+    private final UserService userService;
+
+    private final LikesQueryService likesQueryService;
+
+    public LikesResource(LikesService likesService, LikesQueryService likesQueryService, UserService userService) {
+        this.likesService = likesService;
+        this.likesQueryService = likesQueryService;
+        this.userService = userService;
+    }
+
+    /**
+     * {@code POST  /likes} : Create a new likes.
+     *
+     * @param likes the likes to create.
+     * @return the {@link ResponseEntity} with status {@code 201 (Created)} and with
+     *         body the new likes, or with status {@code 400 (Bad Request)} if the
+     *         likes has already an ID.
+     * @throws URISyntaxException if the Location URI syntax is incorrect.
+     */
+    @PostMapping("/likes")
+    public ResponseEntity<Likes> createLikes(@Valid @RequestBody Likes likes) throws URISyntaxException {
+        log.debug("REST request to save Likes : {}", likes);
+        if (likes.getId() != null) {
+            throw new BadRequestAlertException("A new likes cannot already have an ID", ENTITY_NAME, "idexists");
+        }
+        Likes result = likesService.save(likes);
+        return ResponseEntity
+                .created(new URI("/api/likes/" + result.getId())).headers(HeaderUtil
+                        .createEntityCreationAlert(applicationName, true, ENTITY_NAME, result.getId().toString()))
+                .body(result);
+    }
+
+    /**
+     * {@code PUT  /likes} : Updates an existing likes.
+     *
+     * @param likes the likes to update.
+     * @return the {@link ResponseEntity} with status {@code 200 (OK)} and with body
+     *         the updated likes, or with status {@code 400 (Bad Request)} if the
+     *         likes is not valid, or with status
+     *         {@code 500 (Internal Server Error)} if the likes couldn't be updated.
+     * @throws URISyntaxException if the Location URI syntax is incorrect.
+     */
+    @PutMapping("/likes")
+    public ResponseEntity<Likes> updateLikes(@Valid @RequestBody Likes likes) throws URISyntaxException {
+        log.debug("REST request to update Likes : {}", likes);
+        if (likes.getId() == null) {
+            throw new BadRequestAlertException("Invalid id", ENTITY_NAME, "idnull");
+        }
+        Likes result = likesService.save(likes);
+        return ResponseEntity.ok().headers(
+                HeaderUtil.createEntityUpdateAlert(applicationName, true, ENTITY_NAME, likes.getId().toString()))
+                .body(result);
+    }
+
+    @PutMapping("/likeExercise")
+    public ResponseEntity<Likes> updateLikeWithExerciseID(@RequestBody Likes likes) {
+
+        if (likes.getExerciseID() != null) {
+            Likes like = likesService.findLikesByUserIDandExerciseID(userService.getUserWithAuthorities().get().getId().intValue(), likes.getExerciseID());
+            
+            if(like == null){
+                log.debug("Like not known atm creating new one");
+                like = new Likes();
+                like.setUserID(userService.getUserWithAuthorities().get().getId().intValue());
+                like.setExerciseID(likes.getExerciseID());
+            }
+                like.date(LocalDate.now());
+                log.debug("REST request to update Like by exercise id : {}", likes.getExerciseID());
+
+                Likes result = likesService.save(like);
+
+                return ResponseEntity.ok().headers(
+                        HeaderUtil.createEntityUpdateAlert(applicationName, true, ENTITY_NAME, like.getId().toString()))
+                        .body(result);
+            }
+        return ResponseEntity.badRequest().headers(HeaderUtil.createFailureAlert(applicationName,true,ENTITY_NAME,"internalServerError","The ExerciseID was not set")).body(null);
+
+    }
+
+    @DeleteMapping("/unlikeExercise/{ExerciseID}")
+    public ResponseEntity<Void> deleteLikeWithExerciseID(@PathVariable String ExerciseID) {
+        log.debug("REST request to delete Likes for project : {}", ExerciseID);
+        likesService.deleteByUserIDandExerciseID(userService.getUserWithAuthorities().get().getId().intValue(), ExerciseID);;
+        return ResponseEntity.noContent()
+                .headers(HeaderUtil.createEntityDeletionAlert(applicationName, true, ENTITY_NAME, ExerciseID.toString()))
+                .build();
+    }
+
+    @GetMapping("/numberOfLikes/{ExerciseID}")
+    public ResponseEntity<Integer> getNumberOfLikesForExerciseID(@PathVariable String ExerciseID) {
+        log.debug("REST request to get number of likes for project {}", ExerciseID);
+        Integer n = likesService.findNumberOfLikesByExerciseID(ExerciseID);
+        return ResponseEntity.ok().body(n);
+    }
+
+    @GetMapping("/hasLiked/{ExerciseID}")
+    public ResponseEntity<Boolean> hasLikedProject(@PathVariable String ExerciseID) {
+        log.debug("REST request to see if user has liked project {}", ExerciseID);
+        Boolean bool = false;
+        if(userService.getUserWithAuthorities().isPresent()){
+        Likes like = likesService.findLikesByUserIDandExerciseID(userService.getUserWithAuthorities().get().getId().intValue(), ExerciseID);
+        if(like != null){
+            log.debug("User has liked this project yet");    
+            bool = true;
+        }}
+        return ResponseEntity.ok().body(bool);
+    }
+    
+    /**
+     * {@code GET  /likes} : get all the likes.
+     *
+     * @param criteria the criteria which the requested entities should match.
+     * @return the {@link ResponseEntity} with status {@code 200 (OK)} and the list
+     *         of likes in body.
+     */
+    @GetMapping("/likes")
+    public ResponseEntity<List<Likes>> getAllLikes(LikesCriteria criteria) {
+        log.debug("REST request to get Likes by criteria: {}", criteria);
+        List<Likes> entityList = likesQueryService.findByCriteria(criteria);
+        return ResponseEntity.ok().body(entityList);
+    }
+
+    /**
+     * {@code GET  /likes/count} : count all the likes.
+     *
+     * @param criteria the criteria which the requested entities should match.
+     * @return the {@link ResponseEntity} with status {@code 200 (OK)} and the count
+     *         in body.
+     */
+    @GetMapping("/likes/count")
+    public ResponseEntity<Long> countLikes(LikesCriteria criteria) {
+        log.debug("REST request to count Likes by criteria: {}", criteria);
+        return ResponseEntity.ok().body(likesQueryService.countByCriteria(criteria));
+    }
+
+    /**
+     * {@code GET  /likes/:id} : get the "id" likes.
+     *
+     * @param id the id of the likes to retrieve.
+     * @return the {@link ResponseEntity} with status {@code 200 (OK)} and with body
+     *         the likes, or with status {@code 404 (Not Found)}.
+     */
+    @GetMapping("/likes/{id}")
+    public ResponseEntity<Likes> getLikes(@PathVariable Long id) {
+        log.debug("REST request to get Likes : {}", id);
+        Optional<Likes> likes = likesService.findOne(id);
+        return ResponseUtil.wrapOrNotFound(likes);
+    }
+
+    /**
+     * {@code DELETE  /likes/:id} : delete the "id" likes.
+     *
+     * @param id the id of the likes to delete.
+     * @return the {@link ResponseEntity} with status {@code 204 (NO_CONTENT)}.
+     */
+    @DeleteMapping("/likes/{id}")
+    public ResponseEntity<Void> deleteLikes(@PathVariable Long id) {
+        log.debug("REST request to delete Likes : {}", id);
+        likesService.delete(id);
+        return ResponseEntity.noContent()
+                .headers(HeaderUtil.createEntityDeletionAlert(applicationName, true, ENTITY_NAME, id.toString()))
+                .build();
+    }
+
+    /**
+     * {@code SEARCH  /_search/likes?query=:query} : search for the likes
+     * corresponding to the query.
+     *
+     * @param query the query of the likes search.
+     * @return the result of the search.
+     */
+    @GetMapping("/_search/likes")
+    public List<Likes> searchLikes(@RequestParam String query) {
+        log.debug("REST request to search Likes for query {}", query);
+        return likesService.search(query);
+    }
+}
diff --git a/src/main/java/at/ac/uibk/gitsearch/web/rest/OAuth2ConfigResource.java b/src/main/java/at/ac/uibk/gitsearch/web/rest/OAuth2ConfigResource.java
index 889c6d73281dbd74ae93cac7b960b9f63d9ec96a..84bbe0bd2ce334dfc3a8bc45eeaf70a21012f227 100644
--- a/src/main/java/at/ac/uibk/gitsearch/web/rest/OAuth2ConfigResource.java
+++ b/src/main/java/at/ac/uibk/gitsearch/web/rest/OAuth2ConfigResource.java
@@ -1,7 +1,5 @@
 package at.ac.uibk.gitsearch.web.rest;
 
-import java.util.List;
-
 import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -13,7 +11,7 @@ import at.ac.uibk.gitsearch.service.dto.OAuth2ConfigDTO;
 import at.ac.uibk.gitsearch.service.oauth2.OAuth2ConfigService;
 
 /**
- * Controller to authenticate users.
+ * Controller to to provide  OAuth2 configurations.
  */
 @RestController
 @RequestMapping("/oauth2Config")
diff --git a/src/main/java/at/ac/uibk/gitsearch/web/rest/PluginInterfaceResource.java b/src/main/java/at/ac/uibk/gitsearch/web/rest/PluginInterfaceResource.java
index d585cb9551d42fbcf1835517743e7d8939d6c144..a03a511513250891a7d4a2cf19e99a7829a82c8b 100644
--- a/src/main/java/at/ac/uibk/gitsearch/web/rest/PluginInterfaceResource.java
+++ b/src/main/java/at/ac/uibk/gitsearch/web/rest/PluginInterfaceResource.java
@@ -4,6 +4,7 @@ import java.io.IOException;
 import java.io.InputStream;
 
 import org.codeability.sharing.plugins.api.ShoppingBasket;
+import org.codeability.sharing.plugins.api.search.SearchResultsDTO;
 import org.gitlab4j.api.GitLabApiException;
 import org.mapstruct.Mapper;
 import org.mapstruct.factory.Mappers;
@@ -30,8 +31,6 @@ import at.ac.uibk.gitsearch.service.SearchService;
 import at.ac.uibk.gitsearch.service.ShoppingBasketService;
 import at.ac.uibk.gitsearch.service.ShoppingBasketService.ShoppingBasketInfoDTO;
 import at.ac.uibk.gitsearch.service.ShoppingBasketService.ShoppingBasketRedirectInfoDTO;
-import at.ac.uibk.gitsearch.service.dto.SearchInputDTO;
-import at.ac.uibk.gitsearch.service.dto.SearchResultsDTO;
 
 /**
  * REST controller for managing {@link DocumentInfo}.
@@ -76,26 +75,16 @@ public class PluginInterfaceResource {
      * @return the result of the search.
      */
     @PostMapping("/pluginIF/v0.1/page-details")
-    public org.codeability.sharing.plugins.api.search.SearchResultsDTO
+    public SearchResultsDTO
     searchPageDetails(@RequestBody org.codeability.sharing.plugins.api.search.SearchRequestDTO searchRequest) throws IOException {
     	final Authentication gitLabAuthentication = gitlabService.getGitLabAuthentication(searchRequest.getUserPrincipal().getName(), searchRequest.getUserPrincipal().getGitLabAccessToken());
     	SecurityContext sc = SecurityContextHolder.getContext();
     	sc.setAuthentication(gitLabAuthentication);
         log.debug("REST request to search  {}", searchRequest.getQuery());
-        return SearchResultsDTOMapper.INSTANCE.searchResultsToPlugin(
-        		searchService.searchResultPage(PluginSearchInputDTOMapper.INSTANCE.searchInputFromPlugin(searchRequest.getQuery()), SearchInputDTO.PAGE_SIZE)
-        	);
+        return 		searchService.searchResultPage(searchRequest.getQuery());
     }
 
 
-    @Mapper
-    public static interface PluginSearchInputDTOMapper {
-     
-        PluginSearchInputDTOMapper INSTANCE = Mappers.getMapper( PluginSearchInputDTOMapper.class );
-     
-        SearchInputDTO searchInputFromPlugin(org.codeability.sharing.plugins.api.search.SearchInputDTO searchInput); 
-    }
-    
     @Mapper
     public static interface SearchResultsDTOMapper {
      
diff --git a/src/main/java/at/ac/uibk/gitsearch/web/rest/SearchResource.java b/src/main/java/at/ac/uibk/gitsearch/web/rest/SearchResource.java
index d698fd3db3333bf891e7e6dd22cad139bb436120..6c57646c38460d8286b35d1739ccb1912aacdbb8 100644
--- a/src/main/java/at/ac/uibk/gitsearch/web/rest/SearchResource.java
+++ b/src/main/java/at/ac/uibk/gitsearch/web/rest/SearchResource.java
@@ -7,6 +7,7 @@ import java.io.IOException;
 import java.util.List;
 import java.util.Optional;
 
+import org.codeability.sharing.plugins.api.search.SearchResultsDTO;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.core.io.InputStreamResource;
@@ -17,6 +18,7 @@ import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
@@ -26,8 +28,6 @@ import at.ac.uibk.gitsearch.es.model.DocumentInfo;
 import at.ac.uibk.gitsearch.service.SearchService;
 import at.ac.uibk.gitsearch.service.StatisticsService;
 import at.ac.uibk.gitsearch.service.dto.AutoCompleteEntry;
-import at.ac.uibk.gitsearch.service.dto.SearchInputDTO;
-import at.ac.uibk.gitsearch.service.dto.SearchResultsDTO;
 import at.ac.uibk.gitsearch.service.dto.StatisticsDTO;
 import at.ac.uibk.gitsearch.web.util.HeaderUtil;
 
@@ -65,96 +65,102 @@ public class SearchResource {
      */
     @PostMapping("/search/page-details")
     public SearchResultsDTO
-    searchPageDetails(@RequestBody SearchInputDTO query) throws IOException {
+    searchPageDetails(@RequestBody org.codeability.sharing.plugins.api.search.SearchInputDTO query) throws IOException {
         log.debug("REST request to search  {}", query);
-        return searchService.searchResultPage(query, SearchInputDTO.PAGE_SIZE);
+        return searchService.searchResultPage(query);
     }
 
     /**
      * returns all keyword autocompletes for keyWord
      *
      * @param keyWordPrefix
+     * @param max the maximum number of hits returned
      * @return
      * @throws IOException
      */
     @GetMapping("/search/keywordsAutoComplete")
-    public List<AutoCompleteEntry> getKeywordsAutoComplete(@RequestParam String keyWordPrefix) throws IOException {
-        return searchService.getKeywordsAutoComplete(keyWordPrefix);
+    public List<AutoCompleteEntry> getKeywordsAutoComplete(@RequestParam String keyWordPrefix, @RequestParam(defaultValue = "10") int max) throws IOException {
+        return searchService.getKeywordsAutoComplete(keyWordPrefix, max);
     }
 
         /**
      * returns all keyword autocompletes for keyWord
      *
      * @param formatPrefix
+     * @param max the maximum number of hits returned
      * @return
      * @throws IOException
      */
     @GetMapping("/search/formatsAutoComplete")
-    public List<AutoCompleteEntry> getFormatsAutoComplete(@RequestParam String formatPrefix) throws IOException {
-        return searchService.getFormatsAutoComplete(formatPrefix);
+    public List<AutoCompleteEntry> getFormatsAutoComplete(@RequestParam String formatPrefix, @RequestParam(defaultValue = "10") int max) throws IOException {
+        return searchService.getFormatsAutoComplete(formatPrefix, max);
     }
 
     /**
      * returns all creator autocompletes
      *
      * @param creatorPrefix
+     * @param max the maximum number of hits returned
      * @return
      * @throws IOException
      */
     @GetMapping("/search/creatorAutoComplete")
-    public List<AutoCompleteEntry> getCreatorAutoComplete(@RequestParam String creatorPrefix) throws IOException {
-        return searchService.getCreatorAutoComplete(creatorPrefix);
+    public List<AutoCompleteEntry> getCreatorAutoComplete(@RequestParam String creatorPrefix, @RequestParam(defaultValue = "10") int max) throws IOException {
+        return searchService.getCreatorAutoComplete(creatorPrefix, max);
     }
 
     /**
      * returns all contributor autocompletes
      *
      * @param contributorPrefix
+     * @param max the maximum number of hits returned
      * @return
      * @throws IOException
      */
     @GetMapping("/search/contributorAutoComplete")
-    public List<AutoCompleteEntry> getContributorAutoComplete(@RequestParam String contributorPrefix) throws IOException {
-        return searchService.getContributorAutoComplete(contributorPrefix);
+    public List<AutoCompleteEntry> getContributorAutoComplete(@RequestParam String contributorPrefix, @RequestParam(defaultValue = "10") int max) throws IOException {
+        return searchService.getContributorAutoComplete(contributorPrefix, max);
     }
 
 	/**
 	 * returns all contributor and author autocompletes
 	 *
 	 * @param contributorPrefix
+     * @param max the maximum number of hits returned
 	 * @return
 	 * @throws IOException
 	 */
     @GetMapping("/search/contributorCreatorAutoComplete")
-	public List<AutoCompleteEntry> getContributorCreatorAutoComplete(String contributorPrefix) throws IOException {
-		return searchService.getContributorCreatorAutoComplete(contributorPrefix);
+	public List<AutoCompleteEntry> getContributorCreatorAutoComplete(String contributorPrefix, @RequestParam(defaultValue = "10") int max) throws IOException {
+		return searchService.getContributorCreatorAutoComplete(contributorPrefix, max);
 	}
 
     /**
      * returns all programmingLanguage autocompletes for keyWord
      *
      * @param programmingLanguagePrefix
+     * @param max the maximum number of hits returned
      * @return
      * @throws IOException
      */
     @GetMapping("/search/programmingLanguageAutoComplete")
-    public List<AutoCompleteEntry> getProgrammingLanguageAutoComplete(@RequestParam String programmingLanguagePrefix) throws IOException {
-        return searchService.getProgrammingLanguageAutoComplete(programmingLanguagePrefix);
+    public List<AutoCompleteEntry> getProgrammingLanguageAutoComplete(@RequestParam String programmingLanguagePrefix, @RequestParam(defaultValue = "10") int max) throws IOException {
+        return searchService.getProgrammingLanguageAutoComplete(programmingLanguagePrefix, max);
     }
 
 
     /**
      * POST /programming-exercises/:exerciseId/export-programmingExercise : sends all repositories and details of the programming exercise as zip
-     * TODO projectId and ExerciseId are mixed up here. Please clarify!
+     * TODO move to Exercise Resource, and export is not only for programming-exercises!
      * 
-     * @param projectId the id of the exercise to get the repos from
+     * @param exerciseId the id of the exercise to get the repos from
      * ResponseEntity with status
      * @throws IOException if something during the zip process went wrong
      */
-    @PostMapping("/programming-exercises/{projectId}/export-programming-exercise")
-    public ResponseEntity<Resource> exportProgrammingExercise(@PathVariable long projectId) throws IOException {
+    @PostMapping("/programming-exercises/{exerciseId}/export-programming-exercise")
+    public ResponseEntity<Resource> exportProgrammingExercise(@PathVariable String exerciseId) throws IOException {
 
-        File zipFile = searchService.exportExercise(projectId);
+        File zipFile = searchService.exportExercise(exerciseId);
         
         if (zipFile == null) {
             return ResponseEntity.badRequest().headers(HeaderUtil.createFailureAlert(applicationName, true, ENTITY_NAME, "internalServerError",
@@ -183,21 +189,21 @@ public class SearchResource {
         }
         InputStreamResource resource = new InputStreamResource(new NewFileInputStream(zipFile));
 
-        log.debug("REST request to get Statistics for ExerciseID : {}", projectId);
-        Optional<StatisticsDTO> statisticsDTO = statisticsService.findOneByExerciseID(projectId);
+        log.debug("REST request to get Statistics for ExerciseID : {}", exerciseId);
+        Optional<StatisticsDTO> statisticsDTO = statisticsService.findOneByExerciseID(exerciseId);
         if(statisticsDTO.isPresent()){
             StatisticsDTO newStats = statisticsDTO.get();
             newStats.setDownloads(newStats.getDownloads() + 1);
             statisticsService.save(newStats);
-            log.debug("REST increased number of downloads for ExerciseID : {}", projectId);
+            log.debug("REST increased number of downloads for ExerciseID : {}", exerciseId);
         }
         if(!statisticsDTO.isPresent()){
             StatisticsDTO newStats = new StatisticsDTO();
             newStats.setDownloads(1);
             newStats.setViews(1);
-            newStats.setExerciseID(projectId);
+            newStats.setExerciseID(exerciseId);
             statisticsService.save(newStats);
-            log.debug("Created new statistics entry for exerciseID: {}", projectId);
+            log.debug("Created new statistics entry for exerciseID: {}", exerciseId);
         }
 
         return ResponseEntity.ok().contentLength(zipFile.length()).contentType(MediaType.APPLICATION_OCTET_STREAM).header("filename", zipFile.getName()).body(resource);
diff --git a/src/main/java/at/ac/uibk/gitsearch/web/rest/StatisticsResource.java b/src/main/java/at/ac/uibk/gitsearch/web/rest/StatisticsResource.java
index 5ab32f2464bfe3ad99dbc5fc58e82a805790a22c..53c87366e07df04b9d90e5fedb32c034ebe75a56 100644
--- a/src/main/java/at/ac/uibk/gitsearch/web/rest/StatisticsResource.java
+++ b/src/main/java/at/ac/uibk/gitsearch/web/rest/StatisticsResource.java
@@ -1,37 +1,44 @@
 package at.ac.uibk.gitsearch.web.rest;
 
-import at.ac.uibk.gitsearch.service.GitlabService;
-
-import at.ac.uibk.gitsearch.service.StatisticsService;
-import at.ac.uibk.gitsearch.web.rest.errors.BadRequestAlertException;
-import at.ac.uibk.gitsearch.service.dto.StatisticsDTO;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.text.ParseException;
+import java.util.List;
+import java.util.Optional;
+import java.util.regex.Pattern;
 
-import io.github.jhipster.web.util.HeaderUtil;
-import io.github.jhipster.web.util.PaginationUtil;
-import io.github.jhipster.web.util.ResponseUtil;
+import javax.servlet.http.HttpServletRequest;
+import javax.validation.Valid;
 
-import org.gitlab4j.api.GitLabApiException;
+import org.codeability.sharing.plugins.api.search.util.ExerciseId;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
 import org.springframework.http.HttpHeaders;
-import org.springframework.http.HttpStatus;
-import org.springframework.web.servlet.support.ServletUriComponentsBuilder;
 import org.springframework.http.ResponseEntity;
-import org.springframework.web.bind.annotation.*;
 import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.util.AntPathMatcher;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.servlet.HandlerMapping;
+import org.springframework.web.servlet.support.ServletUriComponentsBuilder;
 
-import javax.validation.Valid;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.util.List;
-import java.util.Optional;
-import java.util.stream.StreamSupport;
-
-import static org.elasticsearch.index.query.QueryBuilders.*;
+import at.ac.uibk.gitsearch.service.GitlabService;
+import at.ac.uibk.gitsearch.service.StatisticsService;
+import at.ac.uibk.gitsearch.service.dto.StatisticsDTO;
+import at.ac.uibk.gitsearch.web.rest.errors.BadRequestAlertException;
+import io.github.jhipster.web.util.HeaderUtil;
+import io.github.jhipster.web.util.PaginationUtil;
+import io.github.jhipster.web.util.ResponseUtil;
 
 /**
  * REST controller for managing {@link at.ac.uibk.gitsearch.domain.Statistics}.
@@ -125,53 +132,65 @@ public class StatisticsResource {
     /**
      * {@code GET  /statistics/:id} : get the "id" statistics.
      *
-     * @param id the id of the statisticsDTO to retrieve.
+     * @param statisticId the id of the statisticsDTO to retrieve.
      * @return the {@link ResponseEntity} with status {@code 200 (OK)} and with body
      *         the statisticsDTO, or with status {@code 404 (Not Found)}.
      */
-    @GetMapping("/statistics/{id}")
+    @GetMapping("/statistics/{statisticId}")
     @PreAuthorize("hasAnyRole('ADMIN')")
-    public ResponseEntity<StatisticsDTO> getStatistics(@PathVariable Long id) {
-        log.debug("REST request to get Statistics : {}", id);
-        Optional<StatisticsDTO> statisticsDTO = statisticsService.findOne(id);
+    public ResponseEntity<StatisticsDTO> getStatistics(@PathVariable Long statisticId) {
+        log.debug("REST request to get Statistics : {}", statisticId);
+        Optional<StatisticsDTO> statisticsDTO = statisticsService.findOne(statisticId);
         return ResponseUtil.wrapOrNotFound(statisticsDTO);
     }
 
+    
+    protected static final Pattern ExerciseIdPattern = Pattern.compile("(\\d+):(.*)");
     /*
     getStatisticsByExerciseId is used to match the exerciseId of a Gitlab project with the database object for the statistics
     If a rest request for an exerciseId comes from the client and there is no object with a fitting exerciseId in the DB the server will create a new db entry with number of views
     as 1 and downloads as 0 
     */
 
-    @GetMapping("/statistics/exercise/{id}")
-    public ResponseEntity<StatisticsDTO> getStatisticsByExerciseId(@PathVariable Long id) {
-
-        log.debug("REST request to get Statistics for ExerciseID : {}", id);
-        Optional<StatisticsDTO> statisticsDTO = statisticsService.findOneByExerciseID(id);
-        Boolean repoExists = gitlabService.repositoryExists(id.toString());
-
-        if (repoExists) {
-            if (statisticsDTO.isPresent()) {
-                StatisticsDTO newStats = statisticsDTO.get();
-                newStats.setViews(newStats.getViews() + 1);
-                statisticsService.save(newStats);
-            }
-            if (!statisticsDTO.isPresent()) {
-                StatisticsDTO newStats = new StatisticsDTO();
-                newStats.setDownloads(0);
-                newStats.setViews(1);
-                newStats.setExerciseID(id);
-                statisticsService.save(newStats);
-                log.debug("Created new statistics entry for exerciseID: {}", id);
-                statisticsDTO = Optional.of(newStats);
-            }
-
-            return ResponseUtil.wrapOrNotFound(statisticsDTO);
-        }
-        else{
-            return ResponseUtil.wrapOrNotFound(statisticsDTO);
-        }
-    }
+	@GetMapping("/statistics/exercise/**")
+	public ResponseEntity<StatisticsDTO> getStatisticsByExerciseId(HttpServletRequest request) {
+
+		String pattern = (String) request.getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE);
+
+		String exerciseId = new AntPathMatcher().extractPathWithinPattern(pattern, request.getRequestURI());
+
+		log.debug("REST request to get Statistics for ExerciseID : {}", exerciseId);
+		Optional<StatisticsDTO> statisticsDTO = statisticsService.findOneByExerciseID(exerciseId);
+
+		ExerciseId parsedId;
+		try {
+			parsedId = ExerciseId.fromString(exerciseId);
+		} catch (ParseException e) {
+			return ResponseUtil.wrapOrNotFound(statisticsDTO);
+		}
+		Boolean repoExists = gitlabService.repositoryExists(parsedId.getProjectId());
+
+		if (repoExists) {
+			if (statisticsDTO.isPresent()) {
+				StatisticsDTO newStats = statisticsDTO.get();
+				newStats.setViews(newStats.getViews() + 1);
+				statisticsService.save(newStats);
+			}
+			if (!statisticsDTO.isPresent()) {
+				StatisticsDTO newStats = new StatisticsDTO();
+				newStats.setDownloads(0);
+				newStats.setViews(1);
+				newStats.setExerciseID(exerciseId);
+				statisticsService.save(newStats);
+				log.debug("Created new statistics entry for exerciseID: {}", exerciseId);
+				statisticsDTO = Optional.of(newStats);
+			}
+
+			return ResponseUtil.wrapOrNotFound(statisticsDTO);
+		} else {
+			return ResponseUtil.wrapOrNotFound(statisticsDTO);
+		}
+	}
 
     /**
      * {@code DELETE  /statistics/:id} : delete the "id" statistics.
diff --git a/src/main/java/at/ac/uibk/gitsearch/web/rest/UserJWTController.java b/src/main/java/at/ac/uibk/gitsearch/web/rest/UserJWTController.java
index 4dbaa4b3b37ccad14129803d8f6731e668b2055e..cc690b1cca2bc8d404036bc5117a93d92c281011 100644
--- a/src/main/java/at/ac/uibk/gitsearch/web/rest/UserJWTController.java
+++ b/src/main/java/at/ac/uibk/gitsearch/web/rest/UserJWTController.java
@@ -1,7 +1,10 @@
 package at.ac.uibk.gitsearch.web.rest;
 
+import at.ac.uibk.gitsearch.domain.User;
+
 import at.ac.uibk.gitsearch.security.jwt.JWTFilter;
 import at.ac.uibk.gitsearch.security.jwt.TokenProvider;
+import at.ac.uibk.gitsearch.service.UserService;
 import at.ac.uibk.gitsearch.web.rest.vm.LoginVM;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
@@ -27,12 +30,17 @@ import javax.validation.Valid;
 public class UserJWTController {
 
     private final TokenProvider tokenProvider;
+    
+    private UserService userService;
 
     private final AuthenticationManagerBuilder authenticationManagerBuilder;
 
-    public UserJWTController(TokenProvider tokenProvider, AuthenticationManagerBuilder authenticationManagerBuilder) {
+    public UserJWTController(TokenProvider tokenProvider,
+    		AuthenticationManagerBuilder authenticationManagerBuilder,
+    		UserService userService) {
         this.tokenProvider = tokenProvider;
         this.authenticationManagerBuilder = authenticationManagerBuilder;
+        this.userService = userService;
     }
 
     @PostMapping("/authenticate")
@@ -42,6 +50,7 @@ public class UserJWTController {
             new UsernamePasswordAuthenticationToken(loginVM.getUsername(), loginVM.getPassword());
 
         Authentication authentication = authenticationManagerBuilder.getObject().authenticate(authenticationToken);
+        updateLastLogin(authentication);
         SecurityContextHolder.getContext().setAuthentication(authentication);
         boolean rememberMe = (loginVM.isRememberMe() == null) ? false : loginVM.isRememberMe();
         String jwt = tokenProvider.createToken(authentication, rememberMe);
@@ -49,6 +58,16 @@ public class UserJWTController {
         httpHeaders.add(JWTFilter.AUTHORIZATION_HEADER, "Bearer " + jwt);
         return new ResponseEntity<>(new JWTToken(jwt), httpHeaders, HttpStatus.OK);
     }
+
+	private void updateLastLogin(Authentication authentication) {
+		if (authentication.getPrincipal() instanceof User) {
+			User user = (User) authentication.getPrincipal();
+			userService.updateLastLogin(user.getId());
+		} else if (authentication.getPrincipal() instanceof org.springframework.security.core.userdetails.User) {
+			org.springframework.security.core.userdetails.User user = (org.springframework.security.core.userdetails.User) authentication.getPrincipal();
+			userService.updateLastLogin(user.getUsername());
+		}
+	}
     
     @PostMapping("/refreshToken")
     public ResponseEntity<JWTToken> refreshToken(@RequestParam("token") String token) {
@@ -61,6 +80,7 @@ public class UserJWTController {
     		 if(!details.containsKey(TokenProvider.PRE_TOKEN_CLAIM)) {
     	    		return new ResponseEntity<>(null, HttpStatus.UNAUTHORIZED);
     		 }
+  	         updateLastLogin(authentication);
    	         SecurityContextHolder.getContext().setAuthentication(authentication);
    	        String jwt = tokenProvider.createToken(authentication, false);
    	        HttpHeaders httpHeaders = new HttpHeaders();
diff --git a/src/main/java/at/ac/uibk/gitsearch/web/rest/UserResource.java b/src/main/java/at/ac/uibk/gitsearch/web/rest/UserResource.java
index 8820cccd5601ecb866fb223cde0f820965ae8538..64c0943e801466d129e96057d88657896475c29c 100644
--- a/src/main/java/at/ac/uibk/gitsearch/web/rest/UserResource.java
+++ b/src/main/java/at/ac/uibk/gitsearch/web/rest/UserResource.java
@@ -18,7 +18,6 @@ import io.github.jhipster.web.util.ResponseUtil;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Value;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
 import org.springframework.http.HttpHeaders;
diff --git a/src/main/java/at/ac/uibk/gitsearch/web/rest/UserWatchListResource.java b/src/main/java/at/ac/uibk/gitsearch/web/rest/UserWatchListResource.java
index 87cf4753821f57ae4d72474b2d5daf312e6f6895..8cfe464e2f70d1989b403bf6e8190e13d9e5bae8 100644
--- a/src/main/java/at/ac/uibk/gitsearch/web/rest/UserWatchListResource.java
+++ b/src/main/java/at/ac/uibk/gitsearch/web/rest/UserWatchListResource.java
@@ -8,6 +8,7 @@ import java.util.Optional;
 
 import javax.validation.Valid;
 
+import org.codeability.sharing.plugins.api.search.SearchResultsDTO;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.data.domain.Page;
@@ -34,8 +35,6 @@ import at.ac.uibk.gitsearch.service.UserService;
 import at.ac.uibk.gitsearch.service.UserWatchListQueryService;
 import at.ac.uibk.gitsearch.service.UserWatchListService;
 import at.ac.uibk.gitsearch.service.WatchListEntryService;
-import at.ac.uibk.gitsearch.service.dto.SearchInputDTO;
-import at.ac.uibk.gitsearch.service.dto.SearchResultsDTO;
 import at.ac.uibk.gitsearch.service.dto.UserWatchListCriteria;
 import at.ac.uibk.gitsearch.service.dto.UserWatchListDTO;
 import at.ac.uibk.gitsearch.service.dto.WatchListEntryDTO;
@@ -96,14 +95,14 @@ public class UserWatchListResource {
            log.debug("unknown user cannot create watchlist {}", userWatchListDTO.getName());
            return ResponseEntity.badRequest().build();
        }
-       if(userWatchListDTO.getUserIdId() == null) {
+       if(userWatchListDTO.getUserId() == null) {
     	   Optional<at.ac.uibk.gitsearch.domain.User> u =  userService.getUserWithAuthoritiesByLogin(SecurityUtils.getCurrentUserLogin().get());
     	   if(u.isEmpty()) {
                log.debug(" user not found, cannot create watchlist {}", userWatchListDTO.getName());
                return ResponseEntity.badRequest().build();
     	   }
-    	   userWatchListDTO.setUserIdId(u.get().getId());
-    	   userWatchListDTO.setUserIdLogin(u.get().getLastName());
+    	   userWatchListDTO.setUserId(u.get().getId());
+    	   userWatchListDTO.setUserLogin(u.get().getLastName());
        }
         if (userWatchListDTO.getId() != null) {
             throw new BadRequestAlertException("A new userWatchList cannot already have an ID", ENTITY_NAME, "idexists");
@@ -138,8 +137,8 @@ public class UserWatchListResource {
         	log.warn("Cannot create a watchlist {} for unknown user", springUser.getUsername());
             throw new BadRequestAlertException("Cannot create a watchlist for unknown user", ENTITY_NAME, "unknownUser");
         }
-        userWatchListDTO.setUserIdLogin(springUser.getUsername());
-		userWatchListDTO.setUserIdId(userWithAuthoritiesByLogin.get().getId());
+        userWatchListDTO.setUserLogin(springUser.getUsername());
+		userWatchListDTO.setUserId(userWithAuthoritiesByLogin.get().getId());
         UserWatchListDTO result = userWatchListService.save(userWatchListDTO);
         return ResponseEntity.created(new URI("/api/user-watch-lists/" + result.getId()))
             .headers(HeaderUtil.createEntityCreationAlert(applicationName, true, ENTITY_NAME, result.getId().toString()))
@@ -207,7 +206,7 @@ public class UserWatchListResource {
         final LongFilter userIdFilter = new LongFilter();
         userIdFilter.setEquals(currentUser.get().getId());
         
-		criteria.setUserIdId(userIdFilter);
+		criteria.setUserId(userIdFilter);
         Page<UserWatchListDTO> page = userWatchListQueryService.findByCriteria(criteria, pageable);
         HttpHeaders headers = PaginationUtil.generatePaginationHttpHeaders(ServletUriComponentsBuilder.fromCurrentRequest(), page);
         return ResponseEntity.ok().headers(headers).body(page.getContent());
@@ -293,7 +292,7 @@ public class UserWatchListResource {
     	if(page == null) page = 0;
     	userWatchListService.checkAccessToWatchList(id, "searchExercisesOnWatchlist", true);
     	final List<WatchListEntryDTO> entriesForWatchlist = watchListEntryService.getEntriesForWatchlist(id);
-        return searchService.watchListResultPage(entriesForWatchlist.stream().map(entry -> entry.getExerciseId()), page, SearchInputDTO.PAGE_SIZE);
+        return searchService.watchListResultPage(entriesForWatchlist.stream().map(entry -> entry.getExerciseId()), page, 10);
     }
 
 }
diff --git a/src/main/java/at/ac/uibk/gitsearch/web/rest/WatchListEntryResource.java b/src/main/java/at/ac/uibk/gitsearch/web/rest/WatchListEntryResource.java
index 9174220ad6b9742d1dd897873d0d913eece03d61..292447140d480da7faec5f600ad6717fabf9208e 100644
--- a/src/main/java/at/ac/uibk/gitsearch/web/rest/WatchListEntryResource.java
+++ b/src/main/java/at/ac/uibk/gitsearch/web/rest/WatchListEntryResource.java
@@ -9,7 +9,6 @@ import javax.validation.Valid;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Value;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
 import org.springframework.http.HttpHeaders;
diff --git a/src/main/resources/.h2.server.properties b/src/main/resources/.h2.server.properties
index 7455568a1343fa12063c9e390b8ce7bee0dfbd3d..c0dd2502f1bedda8800d7dd7c3008fda3cd6c293 100644
--- a/src/main/resources/.h2.server.properties
+++ b/src/main/resources/.h2.server.properties
@@ -1,5 +1,5 @@
 #H2 Server Properties
-#Mon Apr 12 10:02:24 CEST 2021
+#Tue Jun 15 15:37:27 CEST 2021
 0=JHipster H2 (Disk)|org.h2.Driver|jdbc\:h2\:file\:./target/h2db/db/gitsearch|gitsearch
 webSSL=false
 webAllowOthers=true
diff --git a/src/main/resources/config/application-dev.yml b/src/main/resources/config/application-dev.yml
index 6688d7ca2ddb4d3cce219b485e65776d147d6c48..13774184825b2df4dbf1c5c63f316c31acaef997 100644
--- a/src/main/resources/config/application-dev.yml
+++ b/src/main/resources/config/application-dev.yml
@@ -19,11 +19,6 @@ logging:
     io.github.jhipster: DEBUG
     at.ac.uibk.gitsearch: DEBUG
 
-management:
-  health:
-    elasticsearch:
-      enabled: false
-
 spring:
   profiles:
     active: dev
@@ -50,7 +45,7 @@ spring:
       auto-commit: false
   h2:
     console:
-      enabled: false
+      enabled: true
   jpa:
     database-platform: io.github.jhipster.domain.util.FixedH2Dialect
     show-sql: true
@@ -117,7 +112,7 @@ jhipster:
         token-validity-in-seconds: 86400
         token-validity-in-seconds-for-remember-me: 2592000
   mail: # specific JHipster mail property, for standard properties see MailProperties
-    base-url: http://127.0.0.1:8080
+    base-url: http://localhost:8080
   metrics:
     logs: # Reports metrics in the logs
       enabled: false
@@ -143,11 +138,9 @@ jhipster:
 
 application:
   registeredConnectors:
-    -
-      url: "http://localhost:8081/api/sharing/config"
+    - url: 'http://localhost:8081/api/sharing/config'
       accessToken: acdd-erdf-asd2-234f-234d-32eb
-    -
-      url: 'http://localhost:8082/api/sharingPluginConfig'
+    - url: 'http://localhost:8082/api/sharingPluginConfig'
       accessToken: 2c8845a4-b3df-414b-a682-36e2313dc1c0
   registeredConnectorsCallBackURL: http://localhost:8080/api
   installationName: Sharing Plattform (Development)
diff --git a/src/main/resources/config/application-prod.yml b/src/main/resources/config/application-prod.yml
index 83d77ee776736627a0fff9ec30a3765319dab745..57d809b45f10ee9e87873c7efe2f85ab6d58e81a 100644
--- a/src/main/resources/config/application-prod.yml
+++ b/src/main/resources/config/application-prod.yml
@@ -57,10 +57,10 @@ spring:
   liquibase:
     contexts: prod
   mail:
-    host: localhost
+    host: smtp.uibk.ac.at
     port: 25
-    username:
-    password:
+    username: ${MAIL_USERNAME}
+    password: ${MAIL_PASSWORD}
   thymeleaf:
     cache: true
   security:
@@ -127,7 +127,7 @@ jhipster:
         token-validity-in-seconds: 86400
         token-validity-in-seconds-for-remember-me: 2592000
   mail: # specific JHipster mail property, for standard properties see MailProperties
-    base-url: http://my-server-url-to-change # Modify according to your server's URL
+    base-url: https://search.sharing-codeability.uibk.ac.at/ # Modify according to your server's URL
   metrics:
     logs: # Reports metrics in the logs
       enabled: false
@@ -153,12 +153,11 @@ jhipster:
 
 application:
   registeredConnectors:
-    -
-      url: 'https://artemis.codeability.uibk.ac.at/api/sharing/config'
-      accessToken: "notYet"
+    - url: 'https://artemis.codeability.uibk.ac.at/api/sharing/config'
+      accessToken: 'notYet'
   registeredConnectorsCallBackURL: https://search.sharing-codeability.uibk.ac.at//api
   installationName: Sharing Plattform
-#  applicationName: Sharing Plattform
+  #  applicationName: Sharing Plattform
   gitlab:
     url: https://sharing-codeability.uibk.ac.at/
     generalAccessToken: ${APPLICATION_GITLAB_GENERALACCESSTOKEN}
diff --git a/src/main/resources/config/application-staging.yml b/src/main/resources/config/application-staging.yml
index ac9dc1df3d1d65970d2dc897e994496089f63521..0822ce027207a07e7c6ae1b7342ca06d0afd8894 100644
--- a/src/main/resources/config/application-staging.yml
+++ b/src/main/resources/config/application-staging.yml
@@ -57,10 +57,10 @@ spring:
   liquibase:
     contexts: prod
   mail:
-    host: localhost
+    host: smtp.uibk.ac.at
     port: 25
-    username:
-    password:
+    username: ${MAIL_USERNAME}
+    password: ${MAIL_PASSWORD}
   thymeleaf:
     cache: true
   security:
@@ -127,7 +127,7 @@ jhipster:
         token-validity-in-seconds: 86400
         token-validity-in-seconds-for-remember-me: 2592000
   mail: # specific JHipster mail property, for standard properties see MailProperties
-    base-url: http://my-server-url-to-change # Modify according to your server's URL
+    base-url: https://dev-exchange.codeability-austria.uibk.ac.at/ # Modify according to your server's URL
   metrics:
     logs: # Reports metrics in the logs
       enabled: false
@@ -153,11 +153,10 @@ jhipster:
 
 application:
   registeredConnectors:
-   -
-      url: "https://artemis.codeability-austria.uibk.ac.at/api/sharing/config"
-      accessToken: "notYet"
+    - url: 'https://artemis.codeability-austria.uibk.ac.at/api/sharing/config'
+      accessToken: 'notYet'
   registeredConnectorsCallBackURL: https://dev-exchange.codeability-austria.uibk.ac.at/api
-  installationName: Sharing Plattform (Staging)   
+  installationName: Sharing Plattform (Staging)
   gitlab:
     url: https://sharing.codeability-austria.uibk.ac.at/
     generalAccessToken: ${APPLICATION_GITLAB_GENERALACCESSTOKEN}
diff --git a/src/main/resources/config/liquibase/changelog/20210419144670_added_field_UserWatchList.xml b/src/main/resources/config/liquibase/changelog/20210419144670_added_field_UserWatchList.xml
new file mode 100644
index 0000000000000000000000000000000000000000..bd02efc73d8f1ea6eadc04755d540fe1944fa805
--- /dev/null
+++ b/src/main/resources/config/liquibase/changelog/20210419144670_added_field_UserWatchList.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<databaseChangeLog
+    xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
+    xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.9.xsd
+                        http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd">
+
+        <property name="autoIncrement" value="true"/>
+
+    <!--
+        Added the entity UserWatchList.
+    -->
+    <changeSet id="20210419144670-1" author="jhipster">
+        <addColumn  tableName="user_watch_list">
+            <column name="check_frequency" type="int" defaultValueNumeric="0">
+                <constraints nullable="false" />
+            </column>
+        </addColumn>
+    </changeSet>
+
+</databaseChangeLog>
diff --git a/src/main/resources/config/liquibase/changelog/20210613120444_added_entity_Likes.xml b/src/main/resources/config/liquibase/changelog/20210613120444_added_entity_Likes.xml
new file mode 100644
index 0000000000000000000000000000000000000000..67c43aa949741141630edb739b94b380fd80aeb0
--- /dev/null
+++ b/src/main/resources/config/liquibase/changelog/20210613120444_added_entity_Likes.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8"?>
+<databaseChangeLog
+    xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
+    xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.9.xsd
+                        http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd">
+
+        <property name="autoIncrement" value="true"/>
+
+    <!--
+        Added the entity Likes.
+    -->
+    <changeSet id="20210613120444-1" author="jhipster">
+        <createTable tableName="likes">
+            <column name="id" type="bigint" autoIncrement="${autoIncrement}">
+                <constraints primaryKey="true" nullable="false"/>
+            </column>
+            <column name="date" type="date">
+                <constraints nullable="false" />
+            </column>
+            <column name="user_id" type="integer">
+                <constraints nullable="false" />
+            </column>
+            <column name="project_id" type="varchar(255)">
+                <constraints nullable="false" />
+            </column>
+            <!-- jhipster-needle-liquibase-add-column - JHipster will add columns here -->
+        </createTable>
+    </changeSet>
+
+    <changeSet id="20210613120444-1-relations" author="jhipster">
+
+    </changeSet>
+    <!-- jhipster-needle-liquibase-add-changeset - JHipster will add changesets here -->
+
+</databaseChangeLog>
diff --git a/src/main/resources/config/liquibase/changelog/20210618151109_added_fields_User.xml b/src/main/resources/config/liquibase/changelog/20210618151109_added_fields_User.xml
new file mode 100644
index 0000000000000000000000000000000000000000..36c01350bb1ea3820efebaf6220671da73a89496
--- /dev/null
+++ b/src/main/resources/config/liquibase/changelog/20210618151109_added_fields_User.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<databaseChangeLog
+    xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
+    xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.9.xsd
+                        http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd">
+
+        <property name="autoIncrement" value="true"/>
+
+    <!--
+        Added the entity ExtendedUser.
+    -->
+    <changeSet id="20210618151109-1" author="jhipster">
+        <addColumn tableName="jhi_user">
+            <column name="last_login" type="datetime">
+                <constraints nullable="true" />
+            </column>
+            <column name="last_mail_sent" type="datetime">
+                <constraints nullable="true" />
+            </column>
+            <!-- jhipster-needle-liquibase-add-column - JHipster will add columns here -->
+        </addColumn>
+    </changeSet>
+
+    <changeSet id="20210618151109-1-relations" author="jhipster">
+
+    </changeSet>
+    <!-- jhipster-needle-liquibase-add-changeset - JHipster will add changesets here -->
+
+
+</databaseChangeLog>
diff --git a/src/main/resources/config/liquibase/changelog/20210618241110_update_exerciseId_statisticsEtAl.xml b/src/main/resources/config/liquibase/changelog/20210618241110_update_exerciseId_statisticsEtAl.xml
new file mode 100644
index 0000000000000000000000000000000000000000..bb7d59dbdfd09a3f68aeb5c5c16eda3074e2e3b4
--- /dev/null
+++ b/src/main/resources/config/liquibase/changelog/20210618241110_update_exerciseId_statisticsEtAl.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<databaseChangeLog
+    xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
+    xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.9.xsd
+                        http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd">
+
+        <property name="autoIncrement" value="true"/>
+
+    <!--
+        change exercise_id from long to string.
+    -->
+    <changeSet id="20210624151110-1" author="michael breu">
+        <modifyDataType  tableName="statistics" columnName="exercise_id" newDataType="varchar(512)" />
+    </changeSet>
+
+    <!-- 
+      some extra cleanup for weird named fields
+     -->
+    <changeSet id="20210624151110-2" author="michael breu">
+        <renameColumn  tableName="user_watch_list" oldColumnName="user_id_id" columnDataType="bigint" newColumnName="user_id" />
+        <renameColumn  tableName="saved_searches" oldColumnName="user_id_id" columnDataType="bigint" newColumnName="user_id" />
+    </changeSet>
+
+    <!-- jhipster-needle-liquibase-add-changeset - JHipster will add changesets here -->
+
+
+</databaseChangeLog>
diff --git a/src/main/resources/config/liquibase/changelog/20210701160634_changelog.xml b/src/main/resources/config/liquibase/changelog/20210701160634_changelog.xml
new file mode 100644
index 0000000000000000000000000000000000000000..0362f239cf2c426341127b29830e5219e7f12721
--- /dev/null
+++ b/src/main/resources/config/liquibase/changelog/20210701160634_changelog.xml
@@ -0,0 +1,11 @@
+<?xml version="1.1" encoding="UTF-8" standalone="no"?>
+<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:pro="http://www.liquibase.org/xml/ns/pro" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/pro http://www.liquibase.org/xml/ns/pro/liquibase-pro-3.9.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.9.xsd">
+    <changeSet author="root (generated)" id="1625155676503-2">
+        <createIndex indexName="IDXahv9tfju817buqi6so79tecsu" tableName="statistics">
+            <column name="exercise_id"/>
+        </createIndex>
+    </changeSet>
+    <changeSet author="root (generated)" id="1625155676503-1">
+        <dropDefaultValue columnDataType="int" columnName="check_frequency" tableName="user_watch_list"/>
+    </changeSet>
+</databaseChangeLog>
diff --git a/src/main/resources/config/liquibase/changelog/20210702104135_update_projectID_Likes.xml b/src/main/resources/config/liquibase/changelog/20210702104135_update_projectID_Likes.xml
new file mode 100644
index 0000000000000000000000000000000000000000..35c10aa3249e7bb62b50d16be981c15dc011ee6b
--- /dev/null
+++ b/src/main/resources/config/liquibase/changelog/20210702104135_update_projectID_Likes.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<databaseChangeLog
+    xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
+    xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.9.xsd
+                        http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd">
+
+    <!--
+        change project_id to name exercise_id.
+    -->
+    <changeSet id="20210702104135-1" author="eduard frankford">
+        <renameColumn  tableName="likes" oldColumnName="project_id" columnDataType="varchar(255)" newColumnName="exercise_id" />
+    </changeSet>
+
+</databaseChangeLog>
\ No newline at end of file
diff --git a/src/main/resources/config/liquibase/fake-data/likes.csv b/src/main/resources/config/liquibase/fake-data/likes.csv
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/resources/config/liquibase/master.xml b/src/main/resources/config/liquibase/master.xml
index 3f1fe4a58b15625d5c53328fa123857a7578ee03..bd9321aa6bf4ea755346c71b980e52d2b34e935b 100644
--- a/src/main/resources/config/liquibase/master.xml
+++ b/src/main/resources/config/liquibase/master.xml
@@ -1,8 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
-<databaseChangeLog
-    xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.9.xsd">
+<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.9.xsd">
 
     <property name="now" value="now()" dbms="h2"/>
     <property name="now" value="now()" dbms="mysql, mariadb"/>
@@ -18,10 +16,18 @@
     <include file="config/liquibase/changelog/20210414140546_added_entity_UserWatchList.xml" relativeToChangelogFile="false"/>
     <include file="config/liquibase/changelog/20210414141350_added_entity_WatchListEntry.xml" relativeToChangelogFile="false"/>
     <include file="config/liquibase/changelog/20210414150955_added_entity_SavedSearches.xml" relativeToChangelogFile="false"/>
-    <!-- jhipster-needle-liquibase-add-changelog - JHipster will add liquibase changelogs here -->
+    <include file="config/liquibase/changelog/20210618151109_added_fields_User.xml" relativeToChangelogFile="false"/>
     <include file="config/liquibase/changelog/20210414140546_added_entity_constraints_UserWatchList.xml" relativeToChangelogFile="false"/>
     <include file="config/liquibase/changelog/20210414150955_added_entity_constraints_SavedSearches.xml" relativeToChangelogFile="false"/>
     <include file="config/liquibase/changelog/20210419144638_added_entity_constraints_WatchListEntry.xml" relativeToChangelogFile="false"/>
+    <include file="config/liquibase/changelog/20210419144670_added_field_UserWatchList.xml" relativeToChangelogFile="false"/>
+    <include file="config/liquibase/changelog/20210618241110_update_exerciseId_statisticsEtAl.xml" relativeToChangelogFile="false"/>
+    <include file="config/liquibase/changelog/20210613120444_added_entity_Likes.xml" relativeToChangelogFile="false"/>
+    <include file="config/liquibase/changelog/20210701160634_changelog.xml" relativeToChangelogFile="false"/>
+    <include file="config/liquibase/changelog/20210702104135_update_projectID_Likes.xml" relativeToChangelogFile="false"/>
+
+    <!-- jhipster-needle-liquibase-add-changelog - JHipster will add liquibase changelogs here -->
+
     <!-- jhipster-needle-liquibase-add-constraints-changelog - JHipster will add liquibase constraints changelogs here -->
     <!-- jhipster-needle-liquibase-add-incremental-changelog - JHipster will add incremental liquibase changelogs here -->
 </databaseChangeLog>
diff --git a/src/main/resources/i18n/messages_de.properties b/src/main/resources/i18n/messages_de.properties
index e0d17ca2d68b1921ffb5eb21ee76335f9ee836f2..6568db571e17936af5166da25fada3c9f4a840a2 100644
--- a/src/main/resources/i18n/messages_de.properties
+++ b/src/main/resources/i18n/messages_de.properties
@@ -19,3 +19,19 @@ email.reset.title=gitsearch Passwort zurücksetzen
 email.reset.greeting=Liebe(r) {0}
 email.reset.text1=Für Ihren gitsearch Account wurde ein neues Passwort angefordert, bitte klicken Sie unten auf den Link, um das Passwort zurückzusetzen:
 email.reset.text2=Grüße,
+# Info email
+email.info.title=Austausch Plattform: Aktualisierungsinformation
+email.info.greeting=Sehr geehrter Nutzer,
+email.info.textIntro=Diese E-Mail wurde versandt, da sich Inhalte in der Plattform, die Sie beobachten, geändert haben.
+email.info.textWatchlist=Einige Aufgabe auf Ihrer Lesezeichenliste wurden k�rzlich aktualisiert:
+email.info.noChangesOnWatchlist=Es gab keine Änderungen auf Ihren Lesezeichenliste seit dem letzten Email-Versand.
+email.info.textRegards=Mit besten Grüßen,
+email.info.textClosing=Falls Sie diese Mail nicht mehr erhalten wollen, loggen Sie sich bitte auf der Austauschplattform ein und passen Sie Ihre Einstellungen an:
+# Info email
+email.info.title=Austausch Plattform: Aktualisierungsinformation
+email.info.greeting=Sehr geehrter Nutzer,
+email.info.textIntro=Diese E-Mail wurde versandt, da sich Inhalte in der Plattform, die Sie beobachten, geändert haben.
+email.info.textWatchlist=Einige Aufgabe auf Ihrer Lesezeichenliste wurden k�rzlich aktualisiert:
+email.info.noChangesOnWatchlist=Mit dieser E-Mail möchten wir Sie darüber informieren, dass es keine Änderung in Ihren Lesezeichenlisten gab.
+email.info.textRegards=Mit besten Grüßen,
+email.info.textClosing=Falls Sie diese Mail nicht mehr erhalten wollen, loggen Sie sich bitte auf der Austauschplattform ein und passen Sie Ihre Einstellungen an:
diff --git a/src/main/resources/i18n/messages_en.properties b/src/main/resources/i18n/messages_en.properties
index a4c9e6144fc34d3c72f53ce73557862661832177..400c5ba720c012aa89ffda13b76ab727313c490a 100644
--- a/src/main/resources/i18n/messages_en.properties
+++ b/src/main/resources/i18n/messages_en.properties
@@ -9,7 +9,7 @@ email.activation.title=gitsearch account activation
 email.activation.greeting=Dear {0}
 email.activation.text1=Your gitsearch account has been created, please click on the URL below to activate it:
 email.activation.text2=Regards,
-email.signature=gitsearch Team.
+email.signature=Your CodeAbility Sharing Platform Service Team
 
 # Creation email
 email.creation.text1=Your gitsearch account has been created, please click on the URL below to access it:
@@ -19,3 +19,14 @@ email.reset.title=gitsearch password reset
 email.reset.greeting=Dear {0}
 email.reset.text1=For your gitsearch account a password reset was requested, please click on the URL below to reset it:
 email.reset.text2=Regards,
+
+# Info email
+email.info.title=Sharing Platform: Update Mail
+email.info.greeting=Dear {0} {1},
+email.info.textIntro=You get this e-mail, because some of your automatic checks was triggered.
+email.info.textWatchlist=Some exercises on your watchlist were recently updated:
+email.info.noChangesOnWatchlist=With this e-mail we inform you that there were no changes on your watchlists.
+email.info.textRegards=Regards,
+email.info.textClosing=If you are not interested in getting this e-mail, please log in to the CodeAbility Sharing Platform, and reset your update triggers:
+
+
diff --git a/src/main/resources/templates/mail/info/infoEmail.html b/src/main/resources/templates/mail/info/infoEmail.html
new file mode 100644
index 0000000000000000000000000000000000000000..f0eb0fc29f2f9dc5ca41484333390da9b3a7c218
--- /dev/null
+++ b/src/main/resources/templates/mail/info/infoEmail.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<html xmlns:th="http://www.thymeleaf.org" th:lang="${#locale.language}" lang="en">
+    <head>
+        <title th:text="#{email.info.title}">Sharing Platform Info Update</title>
+        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+        <link rel="icon" th:href="@{|${baseUrl}/favicon.ico|}" />
+    </head>
+    <body>
+        <p th:text="#{email.info.greeting(null == ${user.firstName}?'':${user.firstName}, ${user.lastName})}">
+            Dear participant,
+        </p>
+        <p th:if="${#lists.isEmpty(watchListUpdates)}" th:text="#{email.info.noChangesOnWatchlist}">With this E-mail we inform you that there were no changes on your watchlists.</p>
+        <div th:if="${not #lists.isEmpty(watchListUpdates)}">
+	        <p th:text="#{email.info.textIntro}">
+	            you get this e-mail, because one of your automatic checks was triggered.
+	        </p>
+	        <p  th:text="#{email.info.textWatchlist}">
+	            Some exercises on your watchlist were recently updated:
+	        </p>
+	            
+	        <table><caption>Updated Exercises</caption><tr><th scope="col">Exercise Name</th><th scope="col">Watchlist</th></tr>
+	        <tr th:each="wlUpdate: ${watchListUpdates}">
+	            <td><span th:text="${wlUpdate.key.metadata.title}"></span><span th:text="${#temporals.format(wlUpdate.key.project.last_activity_at,'dd MMMM yyyy')}">Exercise title</span></td>
+	            <td th:text="${wlUpdate.value.name}">Exercise title</td>
+	        </tr>
+	        
+	        </table>
+        </div>
+        <p>
+            <span th:text="#{email.info.textRegards}">Regards, </span>
+            <br/>
+            <em th:text="#{email.signature}">Your CodeAbility Sharing Platform Service Team.</em>
+        </p>
+        <br/><br/>
+                <p><span th:text="#{email.info.textClosing}">
+            If you are not interested in getting this e-mail, please log in to the CodeAbility Sharing Platform, and reset your update triggers
+            </span> <a th:with="url=(@{|${baseUrl}|})" th:href="${url}" th:text="${url}">Link to the Sharing Plattform</a>
+        </p>
+        
+    </body>
+</html>
diff --git a/src/main/webapp/app/account/settings/settings.component.html b/src/main/webapp/app/account/settings/settings.component.html
index 3fa2a75c5ed2e0e8adc629362a9402be4c01bb1c..84113dffb14ebe893448fa2551ced2349e67b915 100644
--- a/src/main/webapp/app/account/settings/settings.component.html
+++ b/src/main/webapp/app/account/settings/settings.component.html
@@ -105,4 +105,9 @@
             </form>
         </div>
     </div>
+    <div class="row justify-content-center">
+        <div>
+                <button type="submit" class="btn btn-primary" (click)="triggerInfoMailSending()" jhiTranslate="settings.test.emailSending">Test Mail Sending</button>
+        </div>
+    </div>
 </div>
diff --git a/src/main/webapp/app/account/settings/settings.component.ts b/src/main/webapp/app/account/settings/settings.component.ts
index 26ad250d83dbdfb0a1793cf9fdd95843eff70f77..1db150c15b00e4083b56ec43bbe833e7c4900cb6 100644
--- a/src/main/webapp/app/account/settings/settings.component.ts
+++ b/src/main/webapp/app/account/settings/settings.component.ts
@@ -1,6 +1,7 @@
 import { Component, OnInit } from '@angular/core';
 import { FormBuilder, Validators } from '@angular/forms';
 import { JhiLanguageService } from 'ng-jhipster';
+import { TestService, Message } from 'app/shared/service/test-service';
 
 import { AccountService } from 'app/core/auth/account.service';
 import { Account } from 'app/core/user/account.model';
@@ -21,7 +22,12 @@ export class SettingsComponent implements OnInit {
     langKey: [undefined],
   });
 
-  constructor(private accountService: AccountService, private fb: FormBuilder, private languageService: JhiLanguageService) {}
+  constructor(
+    private accountService: AccountService,
+    private testService: TestService,
+    private fb: FormBuilder,
+    private languageService: JhiLanguageService
+  ) {}
 
   ngOnInit(): void {
     this.accountService.identity().subscribe(account => {
@@ -56,4 +62,13 @@ export class SettingsComponent implements OnInit {
       }
     });
   }
+
+  public triggerInfoMailSending(): void {
+    this.testService.triggerInfoMail().subscribe(
+      (m: Message) => {
+        alert(m.message);
+      },
+      () => alert('Message sending failed!')
+    );
+  }
 }
diff --git a/src/main/webapp/app/admin/user-management/user-management.component.html b/src/main/webapp/app/admin/user-management/user-management.component.html
index 751712b69cf04f98220362f6f5d958b81b0e4d29..277e7fcea83ed9622d8ab37f145fa80f29320c22 100644
--- a/src/main/webapp/app/admin/user-management/user-management.component.html
+++ b/src/main/webapp/app/admin/user-management/user-management.component.html
@@ -24,6 +24,8 @@
                     <th scope="col" jhiSortBy="createdDate"><span jhiTranslate="userManagement.createdDate">Created Date</span> <fa-icon icon="sort"></fa-icon></th>
                     <th scope="col" jhiSortBy="lastModifiedBy"><span jhiTranslate="userManagement.lastModifiedBy">Last Modified By</span> <fa-icon icon="sort"></fa-icon></th>
                     <th scope="col" jhiSortBy="lastModifiedDate"><span jhiTranslate="userManagement.lastModifiedDate">Last Modified Date</span> <fa-icon icon="sort"></fa-icon></th>
+                    <th scope="col" ><span jhiTranslate="userManagement.lastLogin">Last Login</span></th>
+                    <th scope="col" ><span jhiTranslate="userManagement.lastMailSent">Last Mail Sent</span></th>
                     <th scope="col"></th>
                 </tr>
             </thead>
@@ -47,6 +49,8 @@
                     <td>{{ user.createdDate | date:'dd/MM/yy HH:mm' }}</td>
                     <td>{{ user.lastModifiedBy }}</td>
                     <td>{{ user.lastModifiedDate | date:'dd/MM/yy HH:mm' }}</td>
+                    <td>{{ user.lastLogin | date:'medium' }}</td>
+                    <td>{{ user.lastMailSent | date:'medium' }}</td>
                     <td class="text-right">
                         <div class="btn-group">
                             <button type="submit"
diff --git a/src/main/webapp/app/bookmarks/bookmarks-update.component.html b/src/main/webapp/app/bookmarks/bookmarks-update.component.html
index 4d4dc41c5a9c7e8dd08053b9dbd051d260e2cb4d..2aaa9b5be9aeefc4f6234bd8e9badf8f88c0bd2b 100644
--- a/src/main/webapp/app/bookmarks/bookmarks-update.component.html
+++ b/src/main/webapp/app/bookmarks/bookmarks-update.component.html
@@ -26,18 +26,30 @@
                         </small>
                     </div>
                 </div>
-
+                <div class="form-group">
+                    <label class="form-control-label" jhiTranslate="gitsearchApp.userWatchList.checkFrequency" for="field_checkFrequency">Check Frequency</label>
+                    <ng-template #helpFulltext> {{ 'gitsearchApp.userWatchList.help.checkFrequency' | translate}}</ng-template>
+                    <fa-icon style="padding: 10px 0px 0px 10px;" [ngbTooltip]="helpFulltext" container="body" [icon]="questionIcon"></fa-icon>
+                    
+                      <select class="form-control" name="checkFrequency" formControlName="checkFrequency" id="field_checkFrequency">
+                        <option value="NEVER">{{ 'gitsearchApp.CheckFrequency.NEVER' | translate }}</option>
+                        <option value="DAILY">{{ 'gitsearchApp.CheckFrequency.DAILY' | translate }}</option>
+                        <option value="WEEKLY">{{ 'gitsearchApp.CheckFrequency.WEEKLY' | translate }}</option>
+                        <option value="MONTHLY">{{ 'gitsearchApp.CheckFrequency.MONTHLY' | translate }}</option>
+                    </select>
+                </div>
+                
 <!-- 
                 <div class="form-group">
                     <label class="form-control-label" jhiTranslate="gitsearchApp.userWatchList.userId" for="field_userId">User Id</label>
-                    <select class="form-control" id="field_userId" name="userId" formControlName="userIdId">
-                        <option *ngIf="!editForm.get('userIdId')!.value" [ngValue]="null" selected></option>
+                    <select class="form-control" id="field_userId" name="userId" formControlName="userId">
+                        <option *ngIf="!editForm.get('userId')!.value" [ngValue]="null" selected></option>
                         <option [ngValue]="userOption.id" *ngFor="let userOption of users; trackBy: trackById">{{ userOption.login }}</option>
                     </select>
                 </div>
-                <div *ngIf="editForm.get('userIdId')!.invalid && (editForm.get('userIdId')!.dirty || editForm.get('userIdId')!.touched)">
+                <div *ngIf="editForm.get('userId')!.invalid && (editForm.get('userId')!.dirty || editForm.get('userId')!.touched)">
                     <small class="form-text text-danger"
-                           *ngIf="editForm.get('userIdId')?.errors?.required" jhiTranslate="entity.validation.required">
+                           *ngIf="editForm.get('userId')?.errors?.required" jhiTranslate="entity.validation.required">
                         This field is required.
                     </small>
                 </div>
diff --git a/src/main/webapp/app/bookmarks/bookmarks-update.component.ts b/src/main/webapp/app/bookmarks/bookmarks-update.component.ts
index f84f945012761469eabf9ca89174440687cd3275..267654d4de7cac1e61fd25111f52282cc8226edf 100644
--- a/src/main/webapp/app/bookmarks/bookmarks-update.component.ts
+++ b/src/main/webapp/app/bookmarks/bookmarks-update.component.ts
@@ -5,8 +5,10 @@ import { FormBuilder, Validators } from '@angular/forms';
 import { ActivatedRoute } from '@angular/router';
 import { Observable } from 'rxjs';
 import { WatchlistManager } from 'app/shared/watchlist/watchlist-manager';
+import { faQuestion } from '@fortawesome/free-solid-svg-icons';
 
 import { IUserWatchList, UserWatchList } from 'app/shared/model/user-watch-list.model';
+import { CheckFrequency } from 'app/shared/model/enumerations/check-frequency.model';
 import { IUser } from 'app/core/user/user.model';
 import { UserService } from 'app/core/user/user.service';
 
@@ -17,11 +19,13 @@ import { UserService } from 'app/core/user/user.service';
 export class UserWatchListUpdateComponent implements OnInit {
   isSaving = false;
   users: IUser[] = [];
+  questionIcon = faQuestion;
 
   editForm = this.fb.group({
     id: [],
     name: [null, [Validators.required, Validators.minLength(1)]],
-    userIdId: [null],
+    userId: [null],
+    checkFrequency: CheckFrequency.NEVER,
   });
 
   constructor(
@@ -43,7 +47,8 @@ export class UserWatchListUpdateComponent implements OnInit {
     this.editForm.patchValue({
       id: userWatchList.id,
       name: userWatchList.name,
-      userIdId: userWatchList.userIdId,
+      userId: userWatchList.userId,
+      checkFrequency: userWatchList.checkFrequency,
     });
   }
 
@@ -66,7 +71,8 @@ export class UserWatchListUpdateComponent implements OnInit {
       ...new UserWatchList(),
       id: this.editForm.get(['id'])!.value,
       name: this.editForm.get(['name'])!.value,
-      userIdId: this.editForm.get(['userIdId'])!.value,
+      userId: this.editForm.get(['userId'])!.value,
+      checkFrequency: this.editForm.get(['checkFrequency'])!.value,
     };
   }
 
diff --git a/src/main/webapp/app/bookmarks/bookmarks.component.html b/src/main/webapp/app/bookmarks/bookmarks.component.html
index 7d30ed4c6c634ab09239fdd0d137d7f652850af2..1b337e3ed03d972124a52b4866bb0c2324843c28 100644
--- a/src/main/webapp/app/bookmarks/bookmarks.component.html
+++ b/src/main/webapp/app/bookmarks/bookmarks.component.html
@@ -108,4 +108,4 @@
 	</div>
 </div>
 
-<jhi-exercise-details [exercise]="selectedResult"></jhi-exercise-details>
+<jhi-exercise-details [exercise]="selectedResult" (exerciseChangedEvent)="selectExercise($event)"></jhi-exercise-details>
diff --git a/src/main/webapp/app/bookmarks/bookmarks.component.ts b/src/main/webapp/app/bookmarks/bookmarks.component.ts
index 0ad4cb78450ce4d624d843f343f69bb4b7e8b87d..3c69ef4cc2bd9f55cb493e40308f08896802d4b1 100644
--- a/src/main/webapp/app/bookmarks/bookmarks.component.ts
+++ b/src/main/webapp/app/bookmarks/bookmarks.component.ts
@@ -214,6 +214,8 @@ export class BookmarkComponent implements OnInit, OnDestroy {
       originalResult: searchResult,
       views: searchResult.views,
       downloads: searchResult.downloads,
+      numberOfLikes: 0,
+      userHasLiked: false,
     };
   }
 
diff --git a/src/main/webapp/app/core/core.module.ts b/src/main/webapp/app/core/core.module.ts
index 8f76c1e3a12e247244632c8e22340ae739ca3988..bc3389265275703d86055ae8739afe3db16bf8b7 100644
--- a/src/main/webapp/app/core/core.module.ts
+++ b/src/main/webapp/app/core/core.module.ts
@@ -3,6 +3,7 @@ import { DatePipe, registerLocaleData } from '@angular/common';
 import { HttpClient, HttpClientModule, HTTP_INTERCEPTORS } from '@angular/common/http';
 import { Title } from '@angular/platform-browser';
 import { FaIconLibrary } from '@fortawesome/angular-fontawesome';
+// import { far } from '@fortawesome/free-regular-svg-icons';
 import { CookieService } from 'ngx-cookie-service';
 import { TranslateModule, TranslateLoader, MissingTranslationHandler } from '@ngx-translate/core';
 import { NgxWebstorageModule } from 'ngx-webstorage';
@@ -19,6 +20,7 @@ import { ErrorHandlerInterceptor } from 'app/blocks/interceptor/errorhandler.int
 import { NotificationInterceptor } from 'app/blocks/interceptor/notification.interceptor';
 
 import { fontAwesomeIcons } from './icons/font-awesome-icons';
+import { fontAwesomeRegularIcons } from './icons/font-awesome-icons';
 import { fas } from '@fortawesome/free-solid-svg-icons';
 
 @NgModule({
@@ -81,6 +83,7 @@ export class GitSearchV2CoreModule {
     registerLocaleData(locale);
     iconLibrary.addIconPacks(fas);
     iconLibrary.addIcons(...fontAwesomeIcons);
+    iconLibrary.addIcons(...fontAwesomeRegularIcons);
     dpConfig.minDate = { year: moment().year() - 100, month: 1, day: 1 };
     languageService.init();
   }
diff --git a/src/main/webapp/app/core/icons/font-awesome-icons.ts b/src/main/webapp/app/core/icons/font-awesome-icons.ts
index 46617c114e871ef590f14cd64b545c1efe49d70e..e237b1b0fa198c20e60589d5a9bb0eaa8c9863e7 100644
--- a/src/main/webapp/app/core/icons/font-awesome-icons.ts
+++ b/src/main/webapp/app/core/icons/font-awesome-icons.ts
@@ -35,9 +35,12 @@ import {
   faHome,
   faLanguage,
   faDownload,
+  faTree,
   // jhipster-needle-add-icon-import
 } from '@fortawesome/free-solid-svg-icons';
 
+import { faHeart as farHeart } from '@fortawesome/free-regular-svg-icons';
+
 export const fontAwesomeIcons = [
   faUser,
   faSort,
@@ -76,5 +79,11 @@ export const fontAwesomeIcons = [
   faLanguage,
   faBook,
   faDownload,
+  faTree,
+  // jhipster-needle-add-icon-import
+];
+
+export const fontAwesomeRegularIcons = [
+  farHeart,
   // jhipster-needle-add-icon-import
 ];
diff --git a/src/main/webapp/app/core/user/user.model.ts b/src/main/webapp/app/core/user/user.model.ts
index 585f7eddab427954f845492a80c4782a55097da3..418b1015e01f6a58c1ca65da0f857bf33d8d5f3f 100644
--- a/src/main/webapp/app/core/user/user.model.ts
+++ b/src/main/webapp/app/core/user/user.model.ts
@@ -1,3 +1,5 @@
+import { Moment } from 'moment';
+
 export interface IUser {
   id?: any;
   login?: string;
@@ -12,6 +14,8 @@ export interface IUser {
   lastModifiedBy?: string;
   lastModifiedDate?: Date;
   password?: string;
+  lastLogin?: Moment;
+  lastMailSent?: Moment;
 }
 
 export class User implements IUser {
diff --git a/src/main/webapp/app/entities/entity.module.ts b/src/main/webapp/app/entities/entity.module.ts
index 31c2d1f3295b29fc85a6c3c58583404f05b49e74..75a02faacdb0f8045e34a782c3fa915796f19dd5 100644
--- a/src/main/webapp/app/entities/entity.module.ts
+++ b/src/main/webapp/app/entities/entity.module.ts
@@ -20,6 +20,10 @@ import { RouterModule } from '@angular/router';
         path: 'saved-searches',
         loadChildren: () => import('./saved-searches/saved-searches.module').then(m => m.GitsearchSavedSearchesModule),
       },
+      {
+        path: 'likes',
+        loadChildren: () => import('./likes/likes.module').then(m => m.GitsearchLikesModule),
+      },
       /* jhipster-needle-add-entity-route - JHipster will add entity modules routes here */
     ]),
   ],
diff --git a/src/main/webapp/app/entities/likes/likes-delete-dialog.component.html b/src/main/webapp/app/entities/likes/likes-delete-dialog.component.html
new file mode 100644
index 0000000000000000000000000000000000000000..9a21cc29e4cd8e4b27891e4b88bfe1ba5e9b9869
--- /dev/null
+++ b/src/main/webapp/app/entities/likes/likes-delete-dialog.component.html
@@ -0,0 +1,24 @@
+<form *ngIf="likes" name="deleteForm" (ngSubmit)="confirmDelete(likes?.id!)">
+    <div class="modal-header">
+        <h4 class="modal-title" jhiTranslate="entity.delete.title">Confirm delete operation</h4>
+
+        <button type="button" class="close" data-dismiss="modal" aria-hidden="true"
+                (click)="cancel()">&times;</button>
+    </div>
+
+    <div class="modal-body">
+        <jhi-alert-error></jhi-alert-error>
+
+        <p id="jhi-delete-likes-heading" jhiTranslate="gitsearchApp.likes.delete.question" [translateValues]="{ id: likes.id }">Are you sure you want to delete this Likes?</p>
+    </div>
+
+    <div class="modal-footer">
+        <button type="button" class="btn btn-secondary" data-dismiss="modal" (click)="cancel()">
+            <fa-icon icon="ban"></fa-icon>&nbsp;<span jhiTranslate="entity.action.cancel">Cancel</span>
+        </button>
+
+        <button id="jhi-confirm-delete-likes" type="submit" class="btn btn-danger">
+            <fa-icon icon="times"></fa-icon>&nbsp;<span jhiTranslate="entity.action.delete">Delete</span>
+        </button>
+    </div>
+</form>
diff --git a/src/main/webapp/app/entities/likes/likes-delete-dialog.component.ts b/src/main/webapp/app/entities/likes/likes-delete-dialog.component.ts
new file mode 100644
index 0000000000000000000000000000000000000000..fdbd1ec44ac75657d40c8db337e758f31783fda5
--- /dev/null
+++ b/src/main/webapp/app/entities/likes/likes-delete-dialog.component.ts
@@ -0,0 +1,26 @@
+import { Component } from '@angular/core';
+import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';
+import { JhiEventManager } from 'ng-jhipster';
+
+import { ILikes } from 'app/shared/model/likes.model';
+import { LikesService } from './likes.service';
+
+@Component({
+  templateUrl: './likes-delete-dialog.component.html',
+})
+export class LikesDeleteDialogComponent {
+  likes?: ILikes;
+
+  constructor(protected likesService: LikesService, public activeModal: NgbActiveModal, protected eventManager: JhiEventManager) {}
+
+  cancel(): void {
+    this.activeModal.dismiss();
+  }
+
+  confirmDelete(id: number): void {
+    this.likesService.delete(id).subscribe(() => {
+      this.eventManager.broadcast('likesListModification');
+      this.activeModal.close();
+    });
+  }
+}
diff --git a/src/main/webapp/app/entities/likes/likes-detail.component.html b/src/main/webapp/app/entities/likes/likes-detail.component.html
new file mode 100644
index 0000000000000000000000000000000000000000..b10516a120770418f90581b87a0112bd6237d4f4
--- /dev/null
+++ b/src/main/webapp/app/entities/likes/likes-detail.component.html
@@ -0,0 +1,38 @@
+<div class="row justify-content-center">
+    <div class="col-8">
+        <div *ngIf="likes">
+            <h2><span jhiTranslate="gitsearchApp.likes.detail.title">Likes</span> {{ likes.id }}</h2>
+
+            <hr>
+
+            <jhi-alert-error></jhi-alert-error>
+
+            <dl class="row-md jh-entity-details">
+                <dt><span jhiTranslate="gitsearchApp.likes.date">Date</span></dt>
+                <dd>
+                    <span>{{ likes.date }}</span>
+                </dd>
+                <dt><span jhiTranslate="gitsearchApp.likes.userID">User ID</span></dt>
+                <dd>
+                    <span>{{ likes.userID }}</span>
+                </dd>
+                <dt><span jhiTranslate="gitsearchApp.likes.exerciseID">Exercise ID</span></dt>
+                <dd>
+                    <span>{{ likes.exerciseID }}</span>
+                </dd>
+            </dl>
+
+            <button type="submit"
+                    (click)="previousState()"
+                    class="btn btn-info">
+                <fa-icon icon="arrow-left"></fa-icon>&nbsp;<span jhiTranslate="entity.action.back">Back</span>
+            </button>
+
+            <button type="button"
+                    [routerLink]="['/likes', likes.id, 'edit']"
+                    class="btn btn-primary">
+                <fa-icon icon="pencil-alt"></fa-icon>&nbsp;<span jhiTranslate="entity.action.edit">Edit</span>
+            </button>
+        </div>
+    </div>
+</div>
diff --git a/src/main/webapp/app/entities/likes/likes-detail.component.ts b/src/main/webapp/app/entities/likes/likes-detail.component.ts
new file mode 100644
index 0000000000000000000000000000000000000000..dde5d83ca1f12e7aa17ce99dfa06846f434d17d9
--- /dev/null
+++ b/src/main/webapp/app/entities/likes/likes-detail.component.ts
@@ -0,0 +1,22 @@
+import { Component, OnInit } from '@angular/core';
+import { ActivatedRoute } from '@angular/router';
+
+import { ILikes } from 'app/shared/model/likes.model';
+
+@Component({
+  selector: 'jhi-likes-detail',
+  templateUrl: './likes-detail.component.html',
+})
+export class LikesDetailComponent implements OnInit {
+  likes: ILikes | null = null;
+
+  constructor(protected activatedRoute: ActivatedRoute) {}
+
+  ngOnInit(): void {
+    this.activatedRoute.data.subscribe(({ likes }) => (this.likes = likes));
+  }
+
+  previousState(): void {
+    window.history.back();
+  }
+}
diff --git a/src/main/webapp/app/entities/likes/likes-update.component.html b/src/main/webapp/app/entities/likes/likes-update.component.html
new file mode 100644
index 0000000000000000000000000000000000000000..27a70d36c4dcc90d1efb300bceba0c1abedcb261
--- /dev/null
+++ b/src/main/webapp/app/entities/likes/likes-update.component.html
@@ -0,0 +1,74 @@
+<div class="row justify-content-center">
+    <div class="col-8">
+        <form name="editForm" role="form" novalidate (ngSubmit)="save()" [formGroup]="editForm">
+            <h2 id="jhi-likes-heading" jhiTranslate="gitsearchApp.likes.home.createOrEditLabel">Create or edit a Likes</h2>
+
+            <div>
+                <jhi-alert-error></jhi-alert-error>
+
+                <div class="form-group" [hidden]="!editForm.get('id')!.value">
+                    <label for="id" jhiTranslate="global.field.id">ID</label>
+                    <input type="text" class="form-control" id="id" name="id" formControlName="id" readonly />
+                </div>
+
+                <div class="form-group">
+                    <label class="form-control-label" jhiTranslate="gitsearchApp.likes.date" for="field_date">Date</label>
+                    <div class="input-group">
+                        <input id="field_date" type="text" class="form-control" name="date" ngbDatepicker #dateDp="ngbDatepicker" formControlName="date"/>
+                        <span class="input-group-append">
+                            <button type="button" class="btn btn-secondary" (click)="dateDp.toggle()"><fa-icon icon="calendar-alt"></fa-icon></button>
+                        </span>
+                    </div>
+                    <div *ngIf="editForm.get('date')!.invalid && (editForm.get('date')!.dirty || editForm.get('date')!.touched)">
+                        <small class="form-text text-danger"
+                               *ngIf="editForm.get('date')?.errors?.required" jhiTranslate="entity.validation.required">
+                        This field is required.
+                        </small>
+                    </div>
+                </div>
+
+                <div class="form-group">
+                    <label class="form-control-label" jhiTranslate="gitsearchApp.likes.userID" for="field_userID">User ID</label>
+                    <input type="number" class="form-control" name="userID" id="field_userID"
+                           formControlName="userID"/>
+                    <div *ngIf="editForm.get('userID')!.invalid && (editForm.get('userID')!.dirty || editForm.get('userID')!.touched)">
+                        <small class="form-text text-danger"
+                               *ngIf="editForm.get('userID')?.errors?.required" jhiTranslate="entity.validation.required">
+                        This field is required.
+                        </small>
+                        <small class="form-text text-danger"
+                            [hidden]="!editForm.get('userID')?.errors?.number" jhiTranslate="entity.validation.number">
+                            This field should be a number.
+                        </small>
+                    </div>
+                </div>
+
+                <div class="form-group">
+                    <label class="form-control-label" jhiTranslate="gitsearchApp.likes.projectID" for="field_projectID">Project ID</label>
+                    <input type="number" class="form-control" name="projectID" id="field_projectID"
+                           formControlName="projectID"/>
+                    <div *ngIf="editForm.get('projectID')!.invalid && (editForm.get('projectID')!.dirty || editForm.get('projectID')!.touched)">
+                        <small class="form-text text-danger"
+                               *ngIf="editForm.get('projectID')?.errors?.required" jhiTranslate="entity.validation.required">
+                        This field is required.
+                        </small>
+                        <small class="form-text text-danger"
+                            [hidden]="!editForm.get('projectID')?.errors?.number" jhiTranslate="entity.validation.number">
+                            This field should be a number.
+                        </small>
+                    </div>
+                </div>
+            </div>
+
+            <div>
+                <button type="button" id="cancel-save" class="btn btn-secondary" (click)="previousState()">
+                    <fa-icon icon="ban"></fa-icon>&nbsp;<span jhiTranslate="entity.action.cancel">Cancel</span>
+                </button>
+
+                <button type="submit" id="save-entity" [disabled]="editForm.invalid || isSaving" class="btn btn-primary">
+                    <fa-icon icon="save"></fa-icon>&nbsp;<span jhiTranslate="entity.action.save">Save</span>
+                </button>
+            </div>
+        </form>
+    </div>
+</div>
diff --git a/src/main/webapp/app/entities/likes/likes-update.component.ts b/src/main/webapp/app/entities/likes/likes-update.component.ts
new file mode 100644
index 0000000000000000000000000000000000000000..3b8cb050f7fe010ec662ae90d8ab8dca145aaf09
--- /dev/null
+++ b/src/main/webapp/app/entities/likes/likes-update.component.ts
@@ -0,0 +1,82 @@
+import { Component, OnInit } from '@angular/core';
+import { HttpResponse } from '@angular/common/http';
+// eslint-disable-next-line @typescript-eslint/no-unused-vars
+import { FormBuilder, Validators } from '@angular/forms';
+import { ActivatedRoute } from '@angular/router';
+import { Observable } from 'rxjs';
+
+import { ILikes, Likes } from 'app/shared/model/likes.model';
+import { LikesService } from './likes.service';
+
+@Component({
+  selector: 'jhi-likes-update',
+  templateUrl: './likes-update.component.html',
+})
+export class LikesUpdateComponent implements OnInit {
+  isSaving = false;
+  dateDp: any;
+
+  editForm = this.fb.group({
+    id: [],
+    date: [null, [Validators.required]],
+    userID: [null, [Validators.required]],
+    exerciseID: [null, [Validators.required]],
+  });
+
+  constructor(protected likesService: LikesService, protected activatedRoute: ActivatedRoute, private fb: FormBuilder) {}
+
+  ngOnInit(): void {
+    this.activatedRoute.data.subscribe(({ likes }) => {
+      this.updateForm(likes);
+    });
+  }
+
+  updateForm(likes: ILikes): void {
+    this.editForm.patchValue({
+      id: likes.id,
+      date: likes.date,
+      userID: likes.userID,
+      exerciseID: likes.exerciseID,
+    });
+  }
+
+  previousState(): void {
+    window.history.back();
+  }
+
+  save(): void {
+    this.isSaving = true;
+    const likes = this.createFromForm();
+    if (likes.id !== undefined) {
+      this.subscribeToSaveResponse(this.likesService.update(likes));
+    } else {
+      this.subscribeToSaveResponse(this.likesService.create(likes));
+    }
+  }
+
+  private createFromForm(): ILikes {
+    return {
+      ...new Likes(),
+      id: this.editForm.get(['id'])!.value,
+      date: this.editForm.get(['date'])!.value,
+      userID: this.editForm.get(['userID'])!.value,
+      exerciseID: this.editForm.get(['exerciseID'])!.value,
+    };
+  }
+
+  protected subscribeToSaveResponse(result: Observable<HttpResponse<ILikes>>): void {
+    result.subscribe(
+      () => this.onSaveSuccess(),
+      () => this.onSaveError()
+    );
+  }
+
+  protected onSaveSuccess(): void {
+    this.isSaving = false;
+    this.previousState();
+  }
+
+  protected onSaveError(): void {
+    this.isSaving = false;
+  }
+}
diff --git a/src/main/webapp/app/entities/likes/likes.component.html b/src/main/webapp/app/entities/likes/likes.component.html
new file mode 100644
index 0000000000000000000000000000000000000000..cd8d200785783eacab6d833ca514bffed375b199
--- /dev/null
+++ b/src/main/webapp/app/entities/likes/likes.component.html
@@ -0,0 +1,83 @@
+<div>
+    <h2 id="page-heading">
+        <span jhiTranslate="gitsearchApp.likes.home.title">Likes</span>
+
+        <button id="jh-create-entity" class="btn btn-primary float-right jh-create-entity create-likes" [routerLink]="['/likes/new']">
+            <fa-icon icon="plus"></fa-icon>
+            <span class="hidden-sm-down"  jhiTranslate="gitsearchApp.likes.home.createLabel">
+            Create a new Likes
+            </span>
+        </button>
+    </h2>
+
+    <jhi-alert-error></jhi-alert-error>
+
+    <jhi-alert></jhi-alert>
+
+    <div class="row">
+        <div class="col-sm-12">
+            <form name="searchForm" class="form-inline">
+                <div class="input-group w-100 mt-3">
+                    <input type="text" class="form-control" [(ngModel)]="currentSearch" id="currentSearch" name="currentSearch" placeholder="{{ 'gitsearchApp.likes.home.search' | translate }}">
+
+                    <button class="input-group-append btn btn-info" (click)="search(currentSearch)">
+                        <fa-icon icon="search"></fa-icon>
+                    </button>
+
+                    <button class="input-group-append btn btn-danger" (click)="search('')" *ngIf="currentSearch">
+                        <fa-icon icon="trash-alt"></fa-icon>
+                    </button>
+                </div>
+            </form>
+        </div>
+    </div>
+
+    <div class="alert alert-warning" id="no-result" *ngIf="likes?.length === 0">
+        <span jhiTranslate="gitsearchApp.likes.home.notFound">No likes found</span>
+    </div>
+
+    <div class="table-responsive" id="entities" *ngIf="likes && likes.length > 0">
+        <table class="table table-striped" aria-describedby="page-heading">
+            <thead>
+                <tr>
+                    <th scope="col" ><span jhiTranslate="global.field.id">ID</span></th>
+                    <th scope="col" ><span jhiTranslate="gitsearchApp.likes.date">Date</span></th>
+                    <th scope="col" ><span jhiTranslate="gitsearchApp.likes.userID">User ID</span></th>
+                    <th scope="col" ><span jhiTranslate="gitsearchApp.likes.projectID">Project ID</span></th>
+                    <th scope="col"></th>
+                </tr>
+            </thead>
+            <tbody>
+                <tr *ngFor="let likes of likes ;trackBy: trackId">
+                    <td><a [routerLink]="['/likes', likes.id, 'view']">{{ likes.id }}</a></td>
+                    <td>{{ likes.date | date:'mediumDate' }}</td>
+                    <td>{{ likes.userID }}</td>
+                    <td>{{ likes.projectID }}</td>
+                    <td class="text-right">
+                        <div class="btn-group">
+                            <button type="submit"
+                                    [routerLink]="['/likes', likes.id, 'view']"
+                                    class="btn btn-info btn-sm">
+                                <fa-icon icon="eye"></fa-icon>
+                                <span class="d-none d-md-inline" jhiTranslate="entity.action.view">View</span>
+                            </button>
+
+                            <button type="submit"
+                                    [routerLink]="['/likes', likes.id, 'edit']"
+                                    class="btn btn-primary btn-sm">
+                                <fa-icon icon="pencil-alt"></fa-icon>
+                                <span class="d-none d-md-inline" jhiTranslate="entity.action.edit">Edit</span>
+                            </button>
+
+                            <button type="submit" (click)="delete(likes)"
+                                    class="btn btn-danger btn-sm">
+                                <fa-icon icon="times"></fa-icon>
+                                <span class="d-none d-md-inline" jhiTranslate="entity.action.delete">Delete</span>
+                            </button>
+                        </div>
+                    </td>
+                </tr>
+            </tbody>
+        </table>
+    </div>
+</div>
diff --git a/src/main/webapp/app/entities/likes/likes.component.ts b/src/main/webapp/app/entities/likes/likes.component.ts
new file mode 100644
index 0000000000000000000000000000000000000000..a44dabf51b7220acbcaf562e7916a96eef6c88d1
--- /dev/null
+++ b/src/main/webapp/app/entities/likes/likes.component.ts
@@ -0,0 +1,75 @@
+import { Component, OnInit, OnDestroy } from '@angular/core';
+import { HttpResponse } from '@angular/common/http';
+import { ActivatedRoute } from '@angular/router';
+import { Subscription } from 'rxjs';
+import { JhiEventManager } from 'ng-jhipster';
+import { NgbModal } from '@ng-bootstrap/ng-bootstrap';
+
+import { ILikes } from 'app/shared/model/likes.model';
+import { LikesService } from './likes.service';
+import { LikesDeleteDialogComponent } from './likes-delete-dialog.component';
+
+@Component({
+  selector: 'jhi-likes',
+  templateUrl: './likes.component.html',
+})
+export class LikesComponent implements OnInit, OnDestroy {
+  likes?: ILikes[];
+  eventSubscriber?: Subscription;
+  currentSearch: string;
+
+  constructor(
+    protected likesService: LikesService,
+    protected eventManager: JhiEventManager,
+    protected modalService: NgbModal,
+    protected activatedRoute: ActivatedRoute
+  ) {
+    this.currentSearch =
+      this.activatedRoute.snapshot && this.activatedRoute.snapshot.queryParams['search']
+        ? this.activatedRoute.snapshot.queryParams['search']
+        : '';
+  }
+
+  loadAll(): void {
+    if (this.currentSearch) {
+      this.likesService
+        .search({
+          query: this.currentSearch,
+        })
+        .subscribe((res: HttpResponse<ILikes[]>) => (this.likes = res.body || []));
+      return;
+    }
+
+    this.likesService.query().subscribe((res: HttpResponse<ILikes[]>) => (this.likes = res.body || []));
+  }
+
+  search(query: string): void {
+    this.currentSearch = query;
+    this.loadAll();
+  }
+
+  ngOnInit(): void {
+    this.loadAll();
+    this.registerChangeInLikes();
+  }
+
+  ngOnDestroy(): void {
+    if (this.eventSubscriber) {
+      this.eventManager.destroy(this.eventSubscriber);
+    }
+  }
+
+  trackId(index: number, item: ILikes): number {
+    // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
+    return item.id!;
+  }
+
+  registerChangeInLikes(): void {
+    this.eventSubscriber = this.eventManager.subscribe('likesListModification', () => this.loadAll());
+  }
+
+  delete(likes: ILikes): void {
+    const modalRef = this.modalService.open(LikesDeleteDialogComponent, { size: 'lg', backdrop: 'static' });
+    modalRef.componentInstance.likes = likes;
+  }
+}
diff --git a/src/main/webapp/app/entities/likes/likes.module.ts b/src/main/webapp/app/entities/likes/likes.module.ts
new file mode 100644
index 0000000000000000000000000000000000000000..c539ba16a46609473835bf5638255e38a626f102
--- /dev/null
+++ b/src/main/webapp/app/entities/likes/likes.module.ts
@@ -0,0 +1,16 @@
+import { NgModule } from '@angular/core';
+import { RouterModule } from '@angular/router';
+
+import { GitSearchV2SharedModule } from 'app/shared/shared.module';
+import { LikesComponent } from './likes.component';
+import { LikesDetailComponent } from './likes-detail.component';
+import { LikesUpdateComponent } from './likes-update.component';
+import { LikesDeleteDialogComponent } from './likes-delete-dialog.component';
+import { likesRoute } from './likes.route';
+
+@NgModule({
+  imports: [GitSearchV2SharedModule, RouterModule.forChild(likesRoute)],
+  declarations: [LikesComponent, LikesDetailComponent, LikesUpdateComponent, LikesDeleteDialogComponent],
+  entryComponents: [LikesDeleteDialogComponent],
+})
+export class GitsearchLikesModule {}
diff --git a/src/main/webapp/app/entities/likes/likes.route.ts b/src/main/webapp/app/entities/likes/likes.route.ts
new file mode 100644
index 0000000000000000000000000000000000000000..8c781737336e2a19e0dc7217e814a7dfd046d2a2
--- /dev/null
+++ b/src/main/webapp/app/entities/likes/likes.route.ts
@@ -0,0 +1,83 @@
+import { Injectable } from '@angular/core';
+import { HttpResponse } from '@angular/common/http';
+import { Resolve, ActivatedRouteSnapshot, Routes, Router } from '@angular/router';
+import { Observable, of, EMPTY } from 'rxjs';
+import { flatMap } from 'rxjs/operators';
+
+import { Authority } from 'app/shared/constants/authority.constants';
+import { UserRouteAccessService } from 'app/core/auth/user-route-access-service';
+import { ILikes, Likes } from 'app/shared/model/likes.model';
+import { LikesService } from './likes.service';
+import { LikesComponent } from './likes.component';
+import { LikesDetailComponent } from './likes-detail.component';
+import { LikesUpdateComponent } from './likes-update.component';
+
+@Injectable({ providedIn: 'root' })
+export class LikesResolve implements Resolve<ILikes> {
+  constructor(private service: LikesService, private router: Router) {}
+
+  resolve(route: ActivatedRouteSnapshot): Observable<ILikes> | Observable<never> {
+    const id = route.params['id'];
+    if (id) {
+      return this.service.find(id).pipe(
+        flatMap((likes: HttpResponse<Likes>) => {
+          if (likes.body) {
+            return of(likes.body);
+          } else {
+            this.router.navigate(['404']);
+            return EMPTY;
+          }
+        })
+      );
+    }
+    return of(new Likes());
+  }
+}
+
+export const likesRoute: Routes = [
+  {
+    path: '',
+    component: LikesComponent,
+    data: {
+      authorities: [Authority.USER],
+      pageTitle: 'gitsearchApp.likes.home.title',
+    },
+    canActivate: [UserRouteAccessService],
+  },
+  {
+    path: ':id/view',
+    component: LikesDetailComponent,
+    resolve: {
+      likes: LikesResolve,
+    },
+    data: {
+      authorities: [Authority.USER],
+      pageTitle: 'gitsearchApp.likes.home.title',
+    },
+    canActivate: [UserRouteAccessService],
+  },
+  {
+    path: 'new',
+    component: LikesUpdateComponent,
+    resolve: {
+      likes: LikesResolve,
+    },
+    data: {
+      authorities: [Authority.USER],
+      pageTitle: 'gitsearchApp.likes.home.title',
+    },
+    canActivate: [UserRouteAccessService],
+  },
+  {
+    path: ':id/edit',
+    component: LikesUpdateComponent,
+    resolve: {
+      likes: LikesResolve,
+    },
+    data: {
+      authorities: [Authority.USER],
+      pageTitle: 'gitsearchApp.likes.home.title',
+    },
+    canActivate: [UserRouteAccessService],
+  },
+];
diff --git a/src/main/webapp/app/entities/likes/likes.service.ts b/src/main/webapp/app/entities/likes/likes.service.ts
new file mode 100644
index 0000000000000000000000000000000000000000..9d0039d080a35c40f5b0af64be6f3b49976bd967
--- /dev/null
+++ b/src/main/webapp/app/entities/likes/likes.service.ts
@@ -0,0 +1,100 @@
+import { Injectable } from '@angular/core';
+import { HttpClient, HttpResponse } from '@angular/common/http';
+import { Observable } from 'rxjs';
+import { map } from 'rxjs/operators';
+import * as moment from 'moment';
+
+import { DATE_FORMAT } from 'app/shared/constants/input.constants';
+import { SERVER_API_URL } from 'app/app.constants';
+import { createRequestOption, Search } from 'app/shared/util/request-util';
+import { ILikes, Likes } from 'app/shared/model/likes.model';
+
+type EntityResponseType = HttpResponse<ILikes>;
+type EntityArrayResponseType = HttpResponse<ILikes[]>;
+
+@Injectable({ providedIn: 'root' })
+export class LikesService {
+  public resourceUrl = SERVER_API_URL + 'api/likes';
+  public resourceSearchUrl = SERVER_API_URL + 'api/_search/likes';
+
+  constructor(protected http: HttpClient) {}
+
+  create(likes: ILikes): Observable<EntityResponseType> {
+    const copy = this.convertDateFromClient(likes);
+    return this.http
+      .post<ILikes>(this.resourceUrl, copy, { observe: 'response' })
+      .pipe(map((res: EntityResponseType) => this.convertDateFromServer(res)));
+  }
+
+  update(likes: ILikes): Observable<EntityResponseType> {
+    const copy = this.convertDateFromClient(likes);
+    return this.http
+      .put<ILikes>(this.resourceUrl, copy, { observe: 'response' })
+      .pipe(map((res: EntityResponseType) => this.convertDateFromServer(res)));
+  }
+
+  find(id: number): Observable<EntityResponseType> {
+    return this.http
+      .get<ILikes>(`${this.resourceUrl}/${id}`, { observe: 'response' })
+      .pipe(map((res: EntityResponseType) => this.convertDateFromServer(res)));
+  }
+
+  query(req?: any): Observable<EntityArrayResponseType> {
+    const options = createRequestOption(req);
+    return this.http
+      .get<ILikes[]>(this.resourceUrl, { params: options, observe: 'response' })
+      .pipe(map((res: EntityArrayResponseType) => this.convertDateArrayFromServer(res)));
+  }
+
+  delete(id: number): Observable<HttpResponse<{}>> {
+    return this.http.delete(`${this.resourceUrl}/${id}`, { observe: 'response' });
+  }
+
+  search(req: Search): Observable<EntityArrayResponseType> {
+    const options = createRequestOption(req);
+    return this.http
+      .get<ILikes[]>(this.resourceSearchUrl, { params: options, observe: 'response' })
+      .pipe(map((res: EntityArrayResponseType) => this.convertDateArrayFromServer(res)));
+  }
+
+  likeExercise(exerciseID: string): Observable<EntityResponseType> {
+    const like = new Likes();
+    like.exerciseID = exerciseID;
+    return this.http.put<ILikes>(SERVER_API_URL + 'api/likeExercise', like, { observe: 'response' });
+  }
+
+  unlikeExercise(exerciseID: string): Observable<HttpResponse<{}>> {
+    return this.http.delete(SERVER_API_URL + 'api/unlikeExercise/' + exerciseID, { observe: 'response' });
+  }
+
+  getLikesForexerciseID(exerciseID: string): Observable<number> {
+    return this.http.get<number>(SERVER_API_URL + 'api/numberOfLikes/' + exerciseID);
+  }
+
+  hasLiked(exerciseID: string): Observable<boolean> {
+    return this.http.get<boolean>(SERVER_API_URL + 'api/hasLiked/' + exerciseID);
+  }
+
+  protected convertDateFromClient(likes: ILikes): ILikes {
+    const copy: ILikes = Object.assign({}, likes, {
+      date: likes.date && likes.date.isValid() ? likes.date.format(DATE_FORMAT) : undefined,
+    });
+    return copy;
+  }
+
+  protected convertDateFromServer(res: EntityResponseType): EntityResponseType {
+    if (res.body) {
+      res.body.date = res.body.date ? moment(res.body.date) : undefined;
+    }
+    return res;
+  }
+
+  protected convertDateArrayFromServer(res: EntityArrayResponseType): EntityArrayResponseType {
+    if (res.body) {
+      res.body.forEach((likes: ILikes) => {
+        likes.date = likes.date ? moment(likes.date) : undefined;
+      });
+    }
+    return res;
+  }
+}
diff --git a/src/main/webapp/app/entities/saved-searches/saved-searches-detail.component.html b/src/main/webapp/app/entities/saved-searches/saved-searches-detail.component.html
index b244bbf49cb61d13d9d530022e4a0730da28ffa7..de96f38c4cb830cb4e7709082ed799650ce5408a 100644
--- a/src/main/webapp/app/entities/saved-searches/saved-searches-detail.component.html
+++ b/src/main/webapp/app/entities/saved-searches/saved-searches-detail.component.html
@@ -18,7 +18,7 @@
                 </dd>
                 <dt><span jhiTranslate="gitsearchApp.savedSearches.userId">User Id</span></dt>
                 <dd>
-                    {{ savedSearches.userIdLogin }}
+                    {{ savedSearches.userLogin }}
                 </dd>
             </dl>
 
diff --git a/src/main/webapp/app/entities/saved-searches/saved-searches-update.component.html b/src/main/webapp/app/entities/saved-searches/saved-searches-update.component.html
index f98dcf1f9ac1d77472d01c395dce2072dd7a5acf..6c4746b96041fc3ffc4d2d72a30b07cc1619a1a2 100644
--- a/src/main/webapp/app/entities/saved-searches/saved-searches-update.component.html
+++ b/src/main/webapp/app/entities/saved-searches/saved-searches-update.component.html
@@ -41,14 +41,14 @@
 
                 <div class="form-group">
                     <label class="form-control-label" jhiTranslate="gitsearchApp.savedSearches.userId" for="field_userId">User Id</label>
-                    <select class="form-control" id="field_userId" name="userId" formControlName="userIdId">
-                        <option *ngIf="!editForm.get('userIdId')!.value" [ngValue]="null" selected></option>
+                    <select class="form-control" id="field_userId" name="userId" formControlName="userId">
+                        <option *ngIf="!editForm.get('userId')!.value" [ngValue]="null" selected></option>
                         <option [ngValue]="userOption.id" *ngFor="let userOption of users; trackBy: trackById">{{ userOption.login }}</option>
                     </select>
                 </div>
-                <div *ngIf="editForm.get('userIdId')!.invalid && (editForm.get('userIdId')!.dirty || editForm.get('userIdId')!.touched)">
+                <div *ngIf="editForm.get('userId')!.invalid && (editForm.get('userId')!.dirty || editForm.get('userId')!.touched)">
                     <small class="form-text text-danger"
-                           *ngIf="editForm.get('userIdId')?.errors?.required" jhiTranslate="entity.validation.required">
+                           *ngIf="editForm.get('userId')?.errors?.required" jhiTranslate="entity.validation.required">
                         This field is required.
                     </small>
                 </div>
diff --git a/src/main/webapp/app/entities/saved-searches/saved-searches-update.component.ts b/src/main/webapp/app/entities/saved-searches/saved-searches-update.component.ts
index a0616d55c3759a5317414f471dc7b337ffb5c5aa..dd187b7fbc0816dc6b75af3af867dbd3819ef4da 100644
--- a/src/main/webapp/app/entities/saved-searches/saved-searches-update.component.ts
+++ b/src/main/webapp/app/entities/saved-searches/saved-searches-update.component.ts
@@ -22,7 +22,7 @@ export class SavedSearchesUpdateComponent implements OnInit {
     id: [],
     name: [null, [Validators.required, Validators.minLength(1)]],
     jsonQuery: [null, [Validators.required]],
-    userIdId: [null, Validators.required],
+    userId: [null, Validators.required],
   });
 
   constructor(
@@ -45,7 +45,7 @@ export class SavedSearchesUpdateComponent implements OnInit {
       id: savedSearches.id,
       name: savedSearches.name,
       jsonQuery: savedSearches.jsonQuery,
-      userIdId: savedSearches.userIdId,
+      userId: savedSearches.userId,
     });
   }
 
@@ -69,7 +69,7 @@ export class SavedSearchesUpdateComponent implements OnInit {
       id: this.editForm.get(['id'])!.value,
       name: this.editForm.get(['name'])!.value,
       jsonQuery: this.editForm.get(['jsonQuery'])!.value,
-      userIdId: this.editForm.get(['userIdId'])!.value,
+      userId: this.editForm.get(['userId'])!.value,
     };
   }
 
diff --git a/src/main/webapp/app/entities/saved-searches/saved-searches.component.html b/src/main/webapp/app/entities/saved-searches/saved-searches.component.html
index 7ca1f6080ae4bc2bd06b1c6a831667d5951302d4..bfa98a4c5026b84bc1f0f7cc5c37652ad7010158 100644
--- a/src/main/webapp/app/entities/saved-searches/saved-searches.component.html
+++ b/src/main/webapp/app/entities/saved-searches/saved-searches.component.html
@@ -43,7 +43,7 @@
                     <th scope="col"  jhiSortBy="id"><span jhiTranslate="global.field.id">ID</span> <fa-icon icon="sort"></fa-icon></th>
                     <th scope="col"  jhiSortBy="name"><span jhiTranslate="gitsearchApp.savedSearches.name">Name</span> <fa-icon icon="sort"></fa-icon></th>
                     <th scope="col"  jhiSortBy="jsonQuery"><span jhiTranslate="gitsearchApp.savedSearches.jsonQuery">Json Query</span> <fa-icon icon="sort"></fa-icon></th>
-                    <th scope="col"  jhiSortBy="userIdLogin"><span jhiTranslate="gitsearchApp.savedSearches.userId">User Id</span> <fa-icon icon="sort"></fa-icon></th>
+                    <th scope="col"  jhiSortBy="userLogin"><span jhiTranslate="gitsearchApp.savedSearches.userId">User Id</span> <fa-icon icon="sort"></fa-icon></th>
                     <th scope="col"></th>
                 </tr>
             </thead>
@@ -53,7 +53,7 @@
                     <td>{{ savedSearches.name }}</td>
                     <td>{{ savedSearches.jsonQuery }}</td>
                     <td>
-                        {{ savedSearches.userIdLogin }}
+                        {{ savedSearches.userLogin }}
                     </td>
                     <td class="text-right">
                         <div class="btn-group">
diff --git a/src/main/webapp/app/entities/user-watch-list/user-watch-list-detail.component.html b/src/main/webapp/app/entities/user-watch-list/user-watch-list-detail.component.html
index ca5371eddfe826e23df44424b3561afbe13515f8..5efdd0448d4a6b2fb4c517515d7863ebeffbf381 100644
--- a/src/main/webapp/app/entities/user-watch-list/user-watch-list-detail.component.html
+++ b/src/main/webapp/app/entities/user-watch-list/user-watch-list-detail.component.html
@@ -12,9 +12,13 @@
                 <dd>
                     <span>{{ userWatchList.name }}</span>
                 </dd>
+                <dt><span jhiTranslate="gitsearchApp.userWatchList.checkFrequency">Check Frequency</span></dt>
+                <dd>
+                    <span jhiTranslate="{{ 'gitsearchApp.CheckFrequency.' + userWatchList.checkFrequency }}">{{ userWatchList.checkFrequency }}</span>
+                </dd>
                 <dt><span jhiTranslate="gitsearchApp.userWatchList.userId">User Id</span></dt>
                 <dd>
-                    {{ userWatchList.userIdLogin }}
+                    {{ userWatchList.userLogin }}
                 </dd>
             </dl>
 
diff --git a/src/main/webapp/app/entities/user-watch-list/user-watch-list-update.component.html b/src/main/webapp/app/entities/user-watch-list/user-watch-list-update.component.html
index 70aeaa5cbbfe71838e547a4147bc889ac7f2f942..598ef6aba086b352a92a3ca9f8fb0b464b229958 100644
--- a/src/main/webapp/app/entities/user-watch-list/user-watch-list-update.component.html
+++ b/src/main/webapp/app/entities/user-watch-list/user-watch-list-update.component.html
@@ -27,16 +27,32 @@
                     </div>
                 </div>
 
+                <div class="form-group">
+                    <label class="form-control-label" jhiTranslate="gitsearchApp.userWatchList.checkFrequency" for="field_checkFrequency">Check Frequency</label>
+                    <select class="form-control" name="checkFrequency" formControlName="checkFrequency" id="field_checkFrequency">
+                        <option value="NEVER">{{ 'gitsearchApp.CheckFrequency.NEVER' | translate }}</option>
+                        <option value="DAILY">{{ 'gitsearchApp.CheckFrequency.DAILY' | translate }}</option>
+                        <option value="WEEKLY">{{ 'gitsearchApp.CheckFrequency.WEEKLY' | translate }}</option>
+                        <option value="MONTHLY">{{ 'gitsearchApp.CheckFrequency.MONTHLY' | translate }}</option>
+                    </select>
+                    <div *ngIf="editForm.get('checkFrequency')!.invalid && (editForm.get('checkFrequency')!.dirty || editForm.get('checkFrequency')!.touched)">
+                        <small class="form-text text-danger"
+                               *ngIf="editForm.get('checkFrequency')?.errors?.required" jhiTranslate="entity.validation.required">
+                        This field is required.
+                        </small>
+                    </div>
+                </div>
+
                 <div class="form-group">
                     <label class="form-control-label" jhiTranslate="gitsearchApp.userWatchList.userId" for="field_userId">User Id</label>
-                    <select class="form-control" id="field_userId" name="userId" formControlName="userIdId">
-                        <option *ngIf="!editForm.get('userIdId')!.value" [ngValue]="null" selected></option>
+                    <select class="form-control" id="field_userId" name="userId" formControlName="userId">
+                        <option *ngIf="!editForm.get('userId')!.value" [ngValue]="null" selected></option>
                         <option [ngValue]="userOption.id" *ngFor="let userOption of users; trackBy: trackById">{{ userOption.login }}</option>
                     </select>
                 </div>
-                <div *ngIf="editForm.get('userIdId')!.invalid && (editForm.get('userIdId')!.dirty || editForm.get('userIdId')!.touched)">
+                <div *ngIf="editForm.get('userId')!.invalid && (editForm.get('userId')!.dirty || editForm.get('userId')!.touched)">
                     <small class="form-text text-danger"
-                           *ngIf="editForm.get('userIdId')?.errors?.required" jhiTranslate="entity.validation.required">
+                           *ngIf="editForm.get('userId')?.errors?.required" jhiTranslate="entity.validation.required">
                         This field is required.
                     </small>
                 </div>
diff --git a/src/main/webapp/app/entities/user-watch-list/user-watch-list-update.component.ts b/src/main/webapp/app/entities/user-watch-list/user-watch-list-update.component.ts
index 4393a6b9f054f28528338dca1bf70a8814018cfd..5f29223307d03322179a9df73f8c81b3fe753f25 100644
--- a/src/main/webapp/app/entities/user-watch-list/user-watch-list-update.component.ts
+++ b/src/main/webapp/app/entities/user-watch-list/user-watch-list-update.component.ts
@@ -21,7 +21,8 @@ export class UserWatchListUpdateComponent implements OnInit {
   editForm = this.fb.group({
     id: [],
     name: [null, [Validators.required, Validators.minLength(1)]],
-    userIdId: [null, Validators.required],
+    checkFrequency: [null, [Validators.required]],
+    userId: [null, Validators.required],
   });
 
   constructor(
@@ -43,7 +44,8 @@ export class UserWatchListUpdateComponent implements OnInit {
     this.editForm.patchValue({
       id: userWatchList.id,
       name: userWatchList.name,
-      userIdId: userWatchList.userIdId,
+      checkFrequency: userWatchList.checkFrequency,
+      userId: userWatchList.userId,
     });
   }
 
@@ -66,7 +68,8 @@ export class UserWatchListUpdateComponent implements OnInit {
       ...new UserWatchList(),
       id: this.editForm.get(['id'])!.value,
       name: this.editForm.get(['name'])!.value,
-      userIdId: this.editForm.get(['userIdId'])!.value,
+      checkFrequency: this.editForm.get(['checkFrequency'])!.value,
+      userId: this.editForm.get(['userId'])!.value,
     };
   }
 
diff --git a/src/main/webapp/app/entities/user-watch-list/user-watch-list.component.html b/src/main/webapp/app/entities/user-watch-list/user-watch-list.component.html
index 326dbaabdd4589ebdb3878e59b6d80580ec1b59d..de5ea6d899f7e62a9373322584768761d0a4f72c 100644
--- a/src/main/webapp/app/entities/user-watch-list/user-watch-list.component.html
+++ b/src/main/webapp/app/entities/user-watch-list/user-watch-list.component.html
@@ -42,7 +42,8 @@
                 <tr jhiSort [(predicate)]="predicate" [(ascending)]="ascending" [callback]="reset.bind(this)">
                     <th scope="col"  jhiSortBy="id"><span jhiTranslate="global.field.id">ID</span> <fa-icon icon="sort"></fa-icon></th>
                     <th scope="col"  jhiSortBy="name"><span jhiTranslate="gitsearchApp.userWatchList.name">Name</span> <fa-icon icon="sort"></fa-icon></th>
-                    <th scope="col"  jhiSortBy="userIdLogin"><span jhiTranslate="gitsearchApp.userWatchList.userId">User Id</span> <fa-icon icon="sort"></fa-icon></th>
+                    <th scope="col"  jhiSortBy="checkFrequency"><span jhiTranslate="gitsearchApp.userWatchList.checkFrequency">Check Frequency</span> <fa-icon icon="sort"></fa-icon></th>
+                    <th scope="col"  jhiSortBy="userLogin"><span jhiTranslate="gitsearchApp.userWatchList.userId">User Id</span> <fa-icon icon="sort"></fa-icon></th>
                     <th scope="col"></th>
                 </tr>
             </thead>
@@ -50,8 +51,9 @@
                 <tr *ngFor="let userWatchList of userWatchLists ;trackBy: trackId">
                     <td><a [routerLink]="['/user-watch-list', userWatchList.id, 'view']">{{ userWatchList.id }}</a></td>
                     <td>{{ userWatchList.name }}</td>
+                    <td jhiTranslate="{{ 'gitsearchApp.CheckFrequency.' + userWatchList.checkFrequency! }}">{{ userWatchList.checkFrequency }}</td>
                     <td>
-                        {{ userWatchList.userIdLogin }}
+                        {{ userWatchList.userLogin }}
                     </td>
                     <td class="text-right">
                         <div class="btn-group">
diff --git a/src/main/webapp/app/exercise/exercise-card/exercise-card.component.ts b/src/main/webapp/app/exercise/exercise-card/exercise-card.component.ts
index 102c7383013ece2b786591317608884d351e1446..803fe21303a7a1dd460a05f2528ad5e5fa362ea3 100644
--- a/src/main/webapp/app/exercise/exercise-card/exercise-card.component.ts
+++ b/src/main/webapp/app/exercise/exercise-card/exercise-card.component.ts
@@ -3,6 +3,7 @@ import { Exercise } from 'app/shared/model/exercise.model';
 import { SearchService } from 'app/search/service/search-service';
 import { Statistics } from 'app/shared/model/statistics.model';
 import { WatchlistManager } from 'app/shared/watchlist/watchlist-manager';
+import { LikesService } from 'app/entities/likes/likes.service';
 
 @Component({
   selector: 'jhi-exercise-card',
@@ -14,7 +15,7 @@ export class ExerciseCardComponent implements OnInit {
 
   @Output() exerciseSelectionEvent = new EventEmitter<Exercise>();
 
-  constructor(protected searchService: SearchService, private watchlistManager: WatchlistManager) {}
+  constructor(protected searchService: SearchService, private watchlistManager: WatchlistManager, private likesService: LikesService) {}
 
   ngOnInit(): void {}
 
@@ -22,6 +23,21 @@ export class ExerciseCardComponent implements OnInit {
     if (this.exercise !== undefined) {
       this.exercise.views = 0;
       this.exercise.downloads = 0;
+
+      this.likesService.getLikesForexerciseID(this.exercise.originalResult.project.project_id).subscribe(
+        (data: number) => {
+          this.exercise!.numberOfLikes = data;
+        },
+        () => alert('Could not load number of likes')
+      );
+
+      this.likesService.hasLiked(this.exercise.originalResult.project.project_id).subscribe(
+        (data: boolean) => {
+          this.exercise!.userHasLiked = data;
+        },
+        () => alert('Could not load if user has liked or not')
+      );
+
       this.searchService.getStatisticsForExercise(this.exercise.originalResult.exerciseId).subscribe(
         (data: Statistics) => {
           this.exercise!.views = data.views!;
diff --git a/src/main/webapp/app/exercise/exercise-details/exercise-details.component.html b/src/main/webapp/app/exercise/exercise-details/exercise-details.component.html
index 8f5ee5fbff7d196ee2e4761287ed1615a44df768..271bbcb0f8dd184913af8c948f839373c6368719 100644
--- a/src/main/webapp/app/exercise/exercise-details/exercise-details.component.html
+++ b/src/main/webapp/app/exercise/exercise-details/exercise-details.component.html
@@ -7,8 +7,7 @@
                 <!-- Modal Header -->
                 <div class="modal-header">
                     <img class="card-img-top col-3" src="{{exercise.imageURL}}" alt="exercise image"
-                         (error)="correctImageURL($event)"
-                        style="height: auto; float: left;">
+                        (error)="correctImageURL($event)" style="height: auto; float: left;">
                     <h4 class="modal-title">{{exercise.title}}</h4>
                     <button type="button" class="close" data-dismiss="modal">&times;</button>
                 </div>
@@ -38,10 +37,69 @@
                                     </div>
                                 </div> <!-- modal rating end-->
 
+
+
+                                <div *ngIf="!exercise.userHasLiked"
+                                    style="float: left; width: 100%; margin-bottom: 5px; padding-top: 15px;">
+                                    <div style="float: left;">
+                                        <div>
+                                            <button [ngbTooltip]="helpForLike" style="padding: 0%; font-size: 1.2;"
+                                                *ngIf="isAuthenticated()" type="button" class="btn"
+                                                (click)="likeAction()" [disabled]="!isAuthenticated()">
+                                                <!-- <fa-icon icon="heart"></fa-icon> -->
+                                                <fa-icon [icon]="['far', 'heart']"></fa-icon>
+                                            </button>
+                                            <span [ngbTooltip]="helpForLikeNotLoggedIn">
+                                                <button style="padding: 0%; font-size: 1.2;" *ngIf="!isAuthenticated()"
+                                                    type="button" class="btn" (click)="likeAction()" [disabled]="true">
+                                                    <!-- <fa-icon icon="heart"></fa-icon> -->
+                                                    <fa-icon [icon]="['far', 'heart']"></fa-icon>
+                                                </button>
+                                            </span>
+                                        </div>
+                                        <!-- <div class="onhoverIconDisplay"><p class="card-text" jhiTranslate="exercise.details.views"></p></div> -->
+
+                                    </div>
+                                    <div class="star-container">
+                                        <span>
+                                            {{exercise.numberOfLikes}}
+                                        </span>
+                                    </div>
+
+                                    <ng-template #helpForLike> {{ 'exercise.details.like' | translate}}</ng-template>
+                                    <ng-template #helpForLikeNotLoggedIn> {{ 'exercise.details.likeLogin' | translate}}
+                                    </ng-template>
+                                </div> <!-- modal views end-->
+
+                                <div *ngIf="exercise.userHasLiked"
+                                    style="float: left; width: 100%; margin-bottom: 5px; padding-top: 15px;">
+                                    <div style="float: left;">
+                                        <div>
+                                            <button [ngbTooltip]="helpForUnLike" style="padding: 0%; font-size: 1.2;"
+                                                *ngIf="exercise.userHasLiked" type="button" class="btn"
+                                                (click)="unlikeAction()" [disabled]="!isAuthenticated()">
+                                                <!-- <fa-icon icon="heart"></fa-icon> -->
+                                                <fa-icon class="rediconcolor" icon='heart'></fa-icon>
+                                            </button>
+                                        </div>
+
+                                    </div>
+                                    <div class="star-container">
+                                        <span>
+                                            {{exercise.numberOfLikes}}
+                                        </span>
+                                    </div>
+                                    <ng-template #helpForUnLike> {{ 'exercise.details.unlike' | translate}}
+                                    </ng-template>
+
+                                </div>
+
                                 <div *ngIf="exercise.rating"
                                     style="float: left; width: 100%; margin-bottom: 5px; padding-top: 15px;">
                                     <div style="float: left;">
-                                        <div><fa-icon icon="eye"></fa-icon></div>
+                                        <div>
+                                            <fa-icon icon="eye"></fa-icon>
+                                        </div>
                                         <!-- <div class="onhoverIconDisplay"><p class="card-text" jhiTranslate="exercise.details.views"></p></div> -->
 
                                     </div>
@@ -70,25 +128,31 @@
                                     <div style="float: left;">
                                         <p class="card-text" jhiTranslate="exercise.details.bookmark"></p>
                                     </div>
-                                    <div class="form-check" style="float: right; padding-right: 10px;" placement="right">
-                                        <input class="form-check-input" type="checkbox"  [checked]="isOnCurrentWatchlist(exercise)" (change)="handleForCurrentWatchlist(exercise)" value=""
+                                    <div class="form-check" style="float: right; padding-right: 10px;"
+                                        placement="right">
+                                        <input class="form-check-input" type="checkbox"
+                                            [checked]="isOnCurrentWatchlist(exercise)"
+                                            (change)="handleForCurrentWatchlist(exercise)" value=""
                                             id="modal-defaultCheck1">
                                         <label class="form-check-label" for="modal-defaultCheck1"></label>
                                     </div>
                                 </div> <!-- modal bookmark end-->
 
-                                <!-- <button type="button" class="btn btn-outline-secondary"
-                                    style="display: block; margin-bottom: 5px;"
-                                    jhiTranslate="exercise.details.hitDetails">
-                                </button> -->
-                                <div [ngbTooltip]="helpComingSoon" placement="bottom">
-                                <button *ngIf="exercise.type == exerciseType.COLLECTION" type="button" class="btn btn-outline-secondary"
-                                    style="display: block; margin-bottom: 5px;"
-                                    jhiTranslate="exercise.details.allExercises"
-                                    disabled>
-                                    >
-                                </button></div>
+                                <div *ngIf="exercise.originalResult.file.parentId"
+                                    style="float: left; width: 100%; padding-top: 15px; margin-bottom: 25px;">
+                                    <ng-template #helpToParent data-container="body"> {{ 'exercise.help.toParent' |
+                                        translate}}</ng-template>
+                                    <fa-icon style="padding: 5px 0px 0px 5px;float:left;" [ngbTooltip]="helpToParent"
+                                        container="body" [icon]="treeIcon"
+                                        (click)="toParent(exercise.originalResult.file.parentId)"></fa-icon>
+                                </div>
 
+                                <button *ngIf="exercise.type == exerciseType.COLLECTION" type="button"
+                                    class="btn btn-outline-secondary"
+                                    (click)="searchChildren(exercise.originalResult.exerciseId)" data-dismiss="modal"
+                                    style="display: block; margin-bottom: 5px;"
+                                    jhiTranslate="exercise.details.allExercises">
+                                </button>
                                 <button type="button" class="btn btn-outline-secondary" style="display: block;"
                                     (click)="openLink(exercise.gitlabURL)"
                                     jhiTranslate="exercise.details.git">
@@ -105,30 +169,30 @@
 
                             </div>
 
-                            <jhi-exercise-metadata
-                                class="col-12 col-md-8"
-                                [exercise]="exercise">
+                            <jhi-exercise-metadata class="col-12 col-md-8" [exercise]="exercise">
                             </jhi-exercise-metadata>
 
                             <div class="col-6 col-md-4"></div>
                             <div class="col-12 col-md-8">
-                                <p style="text-align: left; margin-top: 20px;"><strong jhiTranslate="exercise.export.export"></strong>
+                                <p style="text-align: left; margin-top: 20px;"><strong
+                                        jhiTranslate="exercise.export.export"></strong>
                                 </p>
                                 <hr>
-                                <a *ngFor="let action of exercise.originalResult.supportedActions" class="btn btn-outline-secondary" role="button" aria-pressed="true"
-                                    style="float: left; margin-right: 5px; margin-top: 5px;" (click)="startAction(action, exercise)"
-                                    >{{action.commandName}}</a>
-                                <div [ngbTooltip]="helpComingSoon" placement="bottom">
-                                <button *ngIf="exercise.type == exerciseType.COLLECTION" type="button" class="btn btn-outline-secondary"
+                                <a *ngFor="let action of exercise.originalResult.supportedActions"
+                                    class="btn btn-outline-secondary" role="button" aria-pressed="true"
                                     style="float: left; margin-right: 5px; margin-top: 5px;"
-                                    jhiTranslate="exercise.export.latex" title="{{ 'exercise.comingSoon' | translate}}"
-                                    disabled >
-                                </button>
+                                    (click)="startAction(action, exercise)">{{action.commandName}}</a>
+                                <div [ngbTooltip]="helpComingSoon" placement="bottom">
+                                    <button *ngIf="exercise.type == exerciseType.COLLECTION" type="button"
+                                        class="btn btn-outline-secondary"
+                                        style="float: left; margin-right: 5px; margin-top: 5px;"
+                                        jhiTranslate="exercise.export.latex"
+                                        title="{{ 'exercise.comingSoon' | translate}}" disabled>
+                                    </button>
                                 </div>
 
                                 <a class="btn btn-outline-secondary" role="button" aria-pressed="true"
-                                    style="float: left; margin-right: 5px; margin-top: 5px;"
-                                    (click)="download()"
+                                    style="float: left; margin-right: 5px; margin-top: 5px;" (click)="download()"
                                     jhiTranslate="exercise.export.download"></a>
                             </div>
                         </div>
@@ -140,9 +204,8 @@
                     <button type="button" class="btn btn-outline-secondary" data-dismiss="modal"
                         jhiTranslate="exercise.close"></button>
                 </div>
-
             </div>
         </div>
     </div>
-<jhi-markdown-viewer [exercise]="exercise"></jhi-markdown-viewer>
-</div>
+    <jhi-markdown-viewer [exercise]="exercise"></jhi-markdown-viewer>
+</div>
\ No newline at end of file
diff --git a/src/main/webapp/app/exercise/exercise-details/exercise-details.component.scss b/src/main/webapp/app/exercise/exercise-details/exercise-details.component.scss
index 4e3112f21acce9b58bdb5b1b3bef120ae30ccdae..3122828b347a8d2116826423489ddf8ff24506d5 100644
--- a/src/main/webapp/app/exercise/exercise-details/exercise-details.component.scss
+++ b/src/main/webapp/app/exercise/exercise-details/exercise-details.component.scss
@@ -40,6 +40,18 @@
   text-align: left;
 }
 
+.like {
+  margin-top: 20px;
+  position: absolute;
+  left: 50%;
+  -ms-transform: translate(-50%, -50%);
+  transform: translate(-50%, -50%);
+}
+
+.like:hover {
+  font-size: 20px;
+}
+
 // .onhoverIcon:hover ~ .onhoverIconDisplay {
 //   visibility: visible;
 // }
@@ -47,3 +59,7 @@
 // .onhoverIconDisplay {
 //   visibility: hidden;
 // }
+
+.rediconcolor {
+  color: red;
+}
diff --git a/src/main/webapp/app/exercise/exercise-details/exercise-details.component.ts b/src/main/webapp/app/exercise/exercise-details/exercise-details.component.ts
index 769eb5fb6d392b901cc3d40ffc3b75ea831f5317..9c8b8808226efd1c6ded0df9a55ab2b70999446f 100644
--- a/src/main/webapp/app/exercise/exercise-details/exercise-details.component.ts
+++ b/src/main/webapp/app/exercise/exercise-details/exercise-details.component.ts
@@ -1,15 +1,20 @@
-import { Component, OnInit, Input, OnDestroy } from '@angular/core';
-import { Exercise, IExerciseType } from 'app/shared/model/exercise.model';
+import { Component, OnInit, Input, Output, OnDestroy, EventEmitter } from '@angular/core';
+import { Exercise, IExerciseType, searchResultToExercise } from 'app/shared/model/exercise.model';
+import { ExerciseService } from 'app/exercise/service/exercise.service';
 import { Subscription } from 'rxjs';
 import { PluginActionInfo } from 'app/shared/model/search/search-result-dto.model';
 import { PluginService } from 'app/shared/service/plugin-service';
 import { ShoppingBasketInfo, ShoppingBasketRedirectInfoDTO } from 'app/shared/model/basket/shopping-basket-info.model';
 import { AccountService } from 'app/core/auth/account.service';
 import { Account } from 'app/core/user/account.model';
-import { SearchService } from 'app/search/service/search-service.ts';
+import { SearchService } from 'app/search/service/search-service';
 import { HttpResponse } from '@angular/common/http';
 import { JhiAlertService } from 'ng-jhipster';
 import { WatchlistManager } from 'app/shared/watchlist/watchlist-manager';
+import { LikesService } from 'app/entities/likes/likes.service';
+import { faFolder } from '@fortawesome/free-solid-svg-icons';
+
+import { Router } from '@angular/router';
 
 @Component({
   selector: 'jhi-exercise-details',
@@ -18,15 +23,24 @@ import { WatchlistManager } from 'app/shared/watchlist/watchlist-manager';
 })
 export class ExerciseDetailsComponent implements OnInit, OnDestroy {
   @Input() exercise: Exercise | undefined;
+  @Output() exerciseChangedEvent = new EventEmitter<Exercise>();
+
   account: Account | null = null;
   authSubscription?: Subscription;
+  hasLiked: Boolean | null = null;
+  likeSubscription?: Subscription;
+  authenticated = false;
+  treeIcon = faFolder;
 
   constructor(
     private accountService: AccountService,
     protected pluginService: PluginService,
     private searchService: SearchService,
+    private likesService: LikesService,
     private jhiAlertService: JhiAlertService,
-    private watchlistManager: WatchlistManager
+    private watchlistManager: WatchlistManager,
+    private exerciseService: ExerciseService,
+    private router: Router
   ) {}
 
   ngOnInit(): void {
@@ -92,6 +106,20 @@ export class ExerciseDetailsComponent implements OnInit, OnDestroy {
     window.open(link);
   }
 
+  searchChildren(parentId: string): void {
+    this.router.navigate(['/search'], { queryParams: { p: parentId } });
+  }
+
+  toParent(parentId: string): void {
+    this.exerciseService.loadExercise(parentId).subscribe(searchResult => {
+      this.exercise = searchResultToExercise(searchResult);
+      this.exerciseChangedEvent.emit(this.exercise);
+    }),
+      () => {
+        alert('parent cannot be loaded');
+      };
+  }
+
   ngOnDestroy(): void {
     if (this.authSubscription) {
       this.authSubscription.unsubscribe();
@@ -107,5 +135,33 @@ export class ExerciseDetailsComponent implements OnInit, OnDestroy {
     }
   }
 
+  likeAction(): void {
+    // to do call like service
+    this.likesService.likeExercise(this.exercise!.originalResult.project.project_id).subscribe(() =>
+      // eslint-disable-next-line no-console
+      console.log('Liked post ' + this.exercise!.originalResult.project.project_id)
+    );
+
+    this.exercise!.numberOfLikes = this.exercise!.numberOfLikes + 1;
+    this.exercise!.userHasLiked = true;
+
+    // eslint-disable-next-line no-console
+    console.log('Reloaded number of likes is ' + this.exercise!.numberOfLikes);
+  }
+
+  unlikeAction(): void {
+    // to do call like service
+    this.likesService.unlikeExercise(this.exercise!.originalResult.project.project_id).subscribe(() =>
+      // eslint-disable-next-line no-console
+      console.log('Unliked post ' + this.exercise!.originalResult.project.project_id)
+    );
+
+    this.exercise!.numberOfLikes = this.exercise!.numberOfLikes - 1;
+    this.exercise!.userHasLiked = false;
+
+    // eslint-disable-next-line no-console
+    console.log('Reloaded number of likes is ' + this.exercise!.numberOfLikes);
+  }
+
   selectREADME(): void {}
 }
diff --git a/src/main/webapp/app/exercise/markDownViewer/markDownViewer.component.ts b/src/main/webapp/app/exercise/markDownViewer/markDownViewer.component.ts
index 6aeb84d43dc5e05a3fbefdc1657d30aebdcbbec1..6a36c72a0b9dd00aebb1e496a1f547f8d531b9ae 100644
--- a/src/main/webapp/app/exercise/markDownViewer/markDownViewer.component.ts
+++ b/src/main/webapp/app/exercise/markDownViewer/markDownViewer.component.ts
@@ -4,6 +4,7 @@ import { ExerciseService } from '../service/exercise.service';
 import { TranslateService } from '@ngx-translate/core';
 import { MarkdownService } from 'ngx-markdown';
 import { KatexOptions, errorKatexNotLoaded } from 'ngx-markdown';
+import { getPathOfExerciseId } from 'app/shared/model/search/search-result-dto.model';
 
 declare let katex: any; // Magic
 
@@ -72,14 +73,18 @@ export class MarkDownViewerComponent implements OnInit, OnChanges {
   // eslint-disable-next-line
   ngOnChanges(changes: SimpleChanges): void {
     if (!this.exercise) return;
-    this.baseURL = this.exercise.originalResult.project.url + '/-/raw/master/README.md';
-    this.exerciseService.loadExerciseFile(this.exercise.originalResult.project.project_id, 'README.md').subscribe(
+    this.baseURL =
+      this.exercise.originalResult.project.url +
+      '/-/raw/master/' +
+      getPathOfExerciseId(this.exercise.originalResult.exerciseId) +
+      '/README.md';
+    this.exerciseService.loadExerciseFile(this.exercise.originalResult.exerciseId, 'README.md').subscribe(
       content => {
         this.content = content;
         this.filename = 'README.md';
       },
       () => {
-        this.exerciseService.loadExerciseFile(this.exercise!.originalResult.project.project_id, 'exercise.md').subscribe(
+        this.exerciseService.loadExerciseFile(this.exercise!.originalResult.exerciseId, 'exercise.md').subscribe(
           content => {
             this.content = content;
             this.filename = 'exercise.md';
diff --git a/src/main/webapp/app/exercise/service/exercise.service.ts b/src/main/webapp/app/exercise/service/exercise.service.ts
index 0b2c1b83ab8635fb2a04a6b267771bc225871eb0..dcefcce578134711102e96ccb48f2f5dd4cf92eb 100644
--- a/src/main/webapp/app/exercise/service/exercise.service.ts
+++ b/src/main/webapp/app/exercise/service/exercise.service.ts
@@ -1,13 +1,15 @@
 import { Injectable } from '@angular/core';
 import { HttpClient, HttpParams, HttpHeaders } from '@angular/common/http';
 import { Observable } from 'rxjs';
+import { SearchResultDTO } from 'app/shared/model/search/search-result-dto.model';
 
 import { SERVER_API_URL } from 'app/app.constants';
 import { ArtemisExerciseInfo } from 'app/shared/model/artemis-exercise-info.model';
 
 @Injectable({ providedIn: 'root' })
 export class ExerciseService {
-  public resourceUrl = SERVER_API_URL + 'api/exercise/';
+  public resourceUrl = SERVER_API_URL + 'api/exerciseFile/';
+  public exerciseUrl = SERVER_API_URL + 'api/exercise/';
 
   constructor(private http: HttpClient) {}
 
@@ -23,6 +25,10 @@ export class ExerciseService {
     });
   }
 
+  public loadExercise(exerciseId: string): Observable<SearchResultDTO> {
+    return this.http.get<SearchResultDTO>(this.exerciseUrl + exerciseId);
+  }
+
   /**
    * Used on init of import page, this function passes the retrieved (from Artemis)
    * exerciseUrl to the server
diff --git a/src/main/webapp/app/layouts/navbar/navbar.component.html b/src/main/webapp/app/layouts/navbar/navbar.component.html
index db7cc3d8821fca4d9186bd424077430af7bb3416..fa03462f539638d766e54302d54e1812058a6676 100644
--- a/src/main/webapp/app/layouts/navbar/navbar.component.html
+++ b/src/main/webapp/app/layouts/navbar/navbar.component.html
@@ -159,6 +159,12 @@
                             <span jhiTranslate="global.menu.entities.statistics">statistics</span>
                         </a>
                     </li>
+                    <li>
+                        <a class="dropdown-item" routerLink="likes" routerLinkActive="active" [routerLinkActiveOptions]="{ exact: true }" (click)="collapseNavbar()">
+                            <fa-icon icon="asterisk" [fixedWidth]="true"></fa-icon>
+                            <span jhiTranslate="global.menu.entities.likes">Likes</span>
+                        </a>
+                    </li>
                     <!-- jhipster-needle-add-entity-to-menu - JHipster will add entities to the menu here --> 
                 </ul>
                 </div>
diff --git a/src/main/webapp/app/search/search-input/search-input.component.html b/src/main/webapp/app/search/search-input/search-input.component.html
index f89a586cdd1051d7b5a8d73e2fcd4728173ec18a..3e3c30c6e5e1febdb3b985b6878fe540dbba6fa2 100644
--- a/src/main/webapp/app/search/search-input/search-input.component.html
+++ b/src/main/webapp/app/search/search-input/search-input.component.html
@@ -50,8 +50,8 @@
                 <div class="input-group w-100 mt-3">
                     <input type="text" class="form-control" queryParamName="author" name="author" [ngbTypeahead]="autoCompleteContributorCreator" 
                            placeholder="{{ 'search.filters.author' | translate }}"/>
-                    <ng-template #helpauthorContritbutors data-container="body"> {{ 'search.help.authorContritbutors' | translate}}</ng-template>
-                    <fa-icon style="padding: 10px 0px 0px 10px;" [ngbTooltip]="helpauthorContritbutors" container="body" [icon]="questionIcon"></fa-icon>
+                    <ng-template #helpauthorContributors data-container="body"> {{ 'search.help.authorContributors' | translate}}</ng-template>
+                    <fa-icon style="padding: 10px 0px 0px 10px;" [ngbTooltip]="helpauthorContributors" container="body" [icon]="questionIcon"></fa-icon>
                 </div>
             </form>
         </div>
@@ -66,6 +66,14 @@
                 </div>
             </form>
         </div>
+        <div *ngIf="searchInput.metadata.parentId">
+            <form name="searchForm" class="form-inline">
+                <div class="input-group w-100 mt-3"><span jhiTranslate="search.filters.parentId"></span>: {{searchInput.metadata.parentId}}
+               <ng-template #helpParent data-container="body"> {{ 'search.help.helpParent' | translate}}</ng-template>
+               <fa-icon style="padding: 5px 0px 0px 5px;float:right;"  [ngbTooltip]="helpParent"  container="body" [icon]="crossIcon" (click)="clearParentId()"></fa-icon>
+                </div>
+            </form>
+        </div>
         <div>
             <form name="searchForm" class="form-inline">
                  <div class="nav-item dropdown">
@@ -74,9 +82,7 @@
                     </a><span *ngFor="let type of getSelectedTypes(), let isLast=last">{{'exercise.metadata.' + type | translate}}{{isLast ? '' : ', '}}</span>
                     <div class="dropdown-menu" style="padding-left: 10px;">
                     <table><tr *ngFor="let type of typeValues"><td>
-                        <input [value]="type" type="checkbox" queryParamName="{{type}}">
-                        </td><td style="text-align: left;">
-                        <label class="form-check-label" style="display: inline-block;align-items: left" for="type">{{'exercise.metadata.' + type | translate}}</label>
+                        <label class="form-check-label" style="display: inline-block;align-items: left"><input [value]="type" type="checkbox" queryParamName="{{type}}"> {{'exercise.metadata.' + type | translate}}</label>
                         </td></table>
                     </div>
                 </div>
@@ -91,9 +97,7 @@
                     </a><span *ngFor="let language of getSelectedLanguages(), let isLast=last">{{'exercise.metadata.' + language | translate}}{{isLast ? '' : ', '}}</span>
                     <div class="dropdown-menu" style="padding-left: 10px;">
                     <table><tr *ngFor="let language of languageValues"><td>
-                        <input [value]="language" type="checkbox" queryParamName="{{language}}">
-                        </td><td style="text-align: left;">
-                        <label class="form-check-label" style="display: inline-block;align-items: left" for="language">{{'exercise.metadata.' + language | translate}}</label>
+                        <label class="form-check-label" style="display: inline-block;align-items: left"><input [value]="language" type="checkbox" queryParamName="{{language}}"> {{'exercise.metadata.' + language | translate}}</label>
                         </td></table>
                     </div>
                 </div>
diff --git a/src/main/webapp/app/search/search-input/search-input.component.scss b/src/main/webapp/app/search/search-input/search-input.component.scss
index cbea52fb2011f05334c80503157fb758a6fdb1a3..441b436159478bdc14399c45913fb90d331e51a4 100644
--- a/src/main/webapp/app/search/search-input/search-input.component.scss
+++ b/src/main/webapp/app/search/search-input/search-input.component.scss
@@ -1,13 +1,7 @@
 .searchform-container {
   padding: 20px;
   position: -webkit-sticky;
-  // position: sticky;
+  position: sticky;
   top: 0;
+  z-index: 1;
 }
-
-// .dropdown-menu {
-//   position: relative;
-//   overflow-y: visible;
-//   background-color: black;
-//   z-index: 100000;
-// }
diff --git a/src/main/webapp/app/search/search-input/search-input.component.ts b/src/main/webapp/app/search/search-input/search-input.component.ts
index 6151034cbc57302a9219d3064d370b00d7b596e0..8c52ddac213a4ec0fba8860a7e4b3dc46d590768 100644
--- a/src/main/webapp/app/search/search-input/search-input.component.ts
+++ b/src/main/webapp/app/search/search-input/search-input.component.ts
@@ -1,11 +1,11 @@
 import { Component, OnDestroy, OnInit, Output, EventEmitter } from '@angular/core';
 import { Subject } from 'rxjs';
-import { ActivatedRoute, Router } from '@angular/router';
+import { ActivatedRoute } from '@angular/router';
 import { QueryParam, QueryParamBuilder, QueryParamGroup } from '@ngqp/core';
 import { takeUntil } from 'rxjs/operators';
 import { SearchInput } from 'app/shared/model/search/search-input.model';
 import { SearchService } from '../service/search-service';
-import { faQuestion } from '@fortawesome/free-solid-svg-icons';
+import { faQuestion, faTrash } from '@fortawesome/free-solid-svg-icons';
 
 import { Observable } from 'rxjs';
 import { debounceTime, distinctUntilChanged, map, switchMap } from 'rxjs/operators';
@@ -31,6 +31,8 @@ export class SearchInputComponent implements OnInit, OnDestroy {
   languageValues = Object.keys(ILanguages);
 
   questionIcon = faQuestion;
+  crossIcon = faTrash;
+
   public paramGroup: QueryParamGroup;
   private componentDestroyed$ = new Subject<void>();
 
@@ -38,12 +40,7 @@ export class SearchInputComponent implements OnInit, OnDestroy {
 
   public showSearchUsage = false;
 
-  constructor(
-    protected activatedRoute: ActivatedRoute,
-    private router: Router,
-    private qpb: QueryParamBuilder,
-    private searchService: SearchService
-  ) {
+  constructor(protected activatedRoute: ActivatedRoute, private qpb: QueryParamBuilder, private searchService: SearchService) {
     this.searchInput = new SearchInput();
 
     const groupDef: LooseObject = {
@@ -74,6 +71,10 @@ export class SearchInputComponent implements OnInit, OnDestroy {
         debounceTime: SearchInputComponent.DEBOUNCE_TIME,
         emptyOn: '',
       }),
+      parentId: qpb.stringParam('p', {
+        debounceTime: SearchInputComponent.DEBOUNCE_TIME,
+        emptyOn: '',
+      }),
     };
 
     // add type checkbox support
@@ -132,6 +133,10 @@ export class SearchInputComponent implements OnInit, OnDestroy {
     this.pageParam.setValue(page);
   }
 
+  public clearParentId(): void {
+    this.searchInput.metadata.parentId = '';
+  }
+
   /*
   public itemSelected(): void {
           this.searchInputEvent.emit(this.searchInput);
@@ -143,7 +148,7 @@ export class SearchInputComponent implements OnInit, OnDestroy {
       distinctUntilChanged(),
       switchMap(searchText => {
         if (searchText.length <= 2) return [];
-        return this.searchService.getContributorCreatorAutoComplete(searchText).pipe(map(ace => ace.map(ac => ac.target)));
+        return this.searchService.getContributorCreatorAutoComplete(searchText, 10).pipe(map(ace => ace.map(ac => ac.target)));
       })
     );
 
@@ -151,7 +156,7 @@ export class SearchInputComponent implements OnInit, OnDestroy {
     text$.pipe(
       debounceTime(200),
       distinctUntilChanged(),
-      switchMap(searchText => this.searchService.getKeywordsAutoComplete(searchText).pipe(map(ace => ace.map(ac => ac.target))))
+      switchMap(searchText => this.searchService.getKeywordsAutoComplete(searchText, 10).pipe(map(ace => ace.map(ac => ac.target))))
     );
 
   autoCompleteFormats = (text$: Observable<string>) =>
diff --git a/src/main/webapp/app/search/search.component.html b/src/main/webapp/app/search/search.component.html
index aeadad21ac5af7b053ec3dfc4432bb27b84d32a5..010ade16548eaa584bbcf81e3049b9c6c9bb80aa 100644
--- a/src/main/webapp/app/search/search.component.html
+++ b/src/main/webapp/app/search/search.component.html
@@ -8,7 +8,7 @@
         class="col-12 col-md-5 col-lg-4 col-xl-3"
         (searchInputEvent)="updateSearchInput($event)">
     </jhi-search-input>
-    <div class="col-12 col-md-7 col-lg-8 col-xl-9">
+    <div class="col-12 col-md-7 col-lg-8 col-xl-9 back">
         <div *ngIf="results.length === 0" >
             <span jhiTranslate="search.noResults">No results found</span>
             <span *ngIf="!accountService.isAuthenticated()" jhiTranslate="search.noResultsAnonymous">Anmelden?</span>
@@ -26,5 +26,5 @@
     </div>
 </div>
 
-<jhi-exercise-details [exercise]="selectedResult"></jhi-exercise-details>
+<jhi-exercise-details [exercise]="selectedResult" (exerciseChangedEvent)="selectExercise($event)"></jhi-exercise-details>
 
diff --git a/src/main/webapp/app/search/search.component.ts b/src/main/webapp/app/search/search.component.ts
index 7d06bacfd9af1092c17ab1c59692313d40d9d8b5..1e520dbf2307ea2507dfe12bcb6e5047df750d27 100644
--- a/src/main/webapp/app/search/search.component.ts
+++ b/src/main/webapp/app/search/search.component.ts
@@ -1,9 +1,8 @@
 import { Component, OnInit } from '@angular/core';
-import { Exercise } from 'app/shared/model/exercise.model';
+import { Exercise, searchResultToExercise } from 'app/shared/model/exercise.model';
 import { SearchInput } from 'app/shared/model/search/search-input.model';
 import { SearchService } from 'app/search/service/search-service';
 import { SearchResultsDTO } from 'app/shared/model/search/search-results-dto.model';
-import { SearchResultDTO } from 'app/shared/model/search/search-result-dto.model';
 import { AccountService } from 'app/core/auth/account.service';
 
 @Component({
@@ -65,40 +64,7 @@ export class SearchComponent implements OnInit {
       // eslint-disable-next-line @typescript-eslint/camelcase
       hit.file.indexing_date = new Date(hit.file.indexing_date);
     });
-    return searchResultsDTO.searchResult.map(this.searchResultToExercise);
-  }
-
-  private searchResultToExercise(searchResult: SearchResultDTO): Exercise {
-    return {
-      title: searchResult.metadata.title,
-      license: searchResult.metadata.license,
-      description: searchResult.metadata.description,
-      programmingLanguages: searchResult.metadata.programmingLanguage,
-      languages: searchResult.metadata.language,
-      creator: searchResult.metadata.creator,
-      contributor: searchResult.metadata.contributor,
-      publisher: searchResult.metadata.publisher,
-      imageURL: searchResult.metadata.image,
-      rating: searchResult.ranking5,
-      lastUpdate: searchResult.project.last_activity_at,
-      timeRequired: searchResult.metadata.timeRequired,
-      requires: searchResult.metadata.requires,
-      deprecated: searchResult.metadata.deprecated,
-      difficulty: searchResult.metadata.difficulty,
-      educationLevel: searchResult.metadata.educationLevel,
-      format: searchResult.metadata.format,
-      keyword: searchResult.metadata.keyword,
-      status: searchResult.metadata.status,
-      type: searchResult.metadata.type,
-      structure: searchResult.metadata.structure,
-      version: searchResult.metadata.version,
-      metadataVersion: searchResult.metadata.metadataVersion,
-
-      gitlabURL: searchResult.project.url,
-      originalResult: searchResult,
-      views: searchResult.views,
-      downloads: searchResult.downloads,
-    };
+    return searchResultsDTO.searchResult.map(searchResultToExercise);
   }
 
   onScroll(): void {
diff --git a/src/main/webapp/app/search/service/search-service.ts b/src/main/webapp/app/search/service/search-service.ts
index 88578f9a60463866f58d4dc02401af3b39bcd47c..d4d4734acec11ea4cf8d184105e1a44aaca08a76 100644
--- a/src/main/webapp/app/search/service/search-service.ts
+++ b/src/main/webapp/app/search/service/search-service.ts
@@ -48,11 +48,10 @@ export class SearchService {
     });
   }
 
-  getKeywordsAutoComplete(prefix: string): Observable<Array<AutoCompletionEntry>> {
-    const options: HttpParams = new HttpParams();
-    options.append('keyWordPrefix', prefix);
+  getKeywordsAutoComplete(prefix: string, maxCount: number): Observable<Array<AutoCompletionEntry>> {
+    const parameters = new HttpParams().set('keyWordPrefix', prefix).set('max', String(maxCount));
     return this.http.get<Array<AutoCompletionEntry>>(this.resourceKeywordsAutoCompleteDetails, {
-      params: new HttpParams().set('keyWordPrefix', prefix),
+      params: parameters,
     });
   }
 
@@ -65,10 +64,9 @@ export class SearchService {
   }
 
   getProgrammingLanguageAutoComplete(prefix: string): Observable<Array<AutoCompletionEntry>> {
-    const options: HttpParams = new HttpParams();
-    options.append('keyWordPrefix', prefix);
+    const options: HttpParams = new HttpParams().set('programmingLanguagePrefix', prefix);
     return this.http.get<Array<AutoCompletionEntry>>(this.resourceProgrammingLanguageAutoCompleteDetails, {
-      params: new HttpParams().set('programmingLanguagePrefix', prefix),
+      params: options,
     });
   }
 
@@ -80,19 +78,17 @@ export class SearchService {
     });
   }
 
-  getContributorCreatorAutoComplete(prefix: string): Observable<Array<AutoCompletionEntry>> {
-    const options: HttpParams = new HttpParams();
-    options.append('keyWordPrefix', prefix);
+  getContributorCreatorAutoComplete(prefix: string, maxCount: number): Observable<Array<AutoCompletionEntry>> {
+    const options: HttpParams = new HttpParams().set('contributorPrefix', prefix).set('max', String(maxCount));
     return this.http.get<Array<AutoCompletionEntry>>(this.resourceContributorCreatorAutoCompleteDetails, {
-      params: new HttpParams().set('contributorPrefix', prefix),
+      params: options,
     });
   }
 
   getCreatorAutoComplete(prefix: string): Observable<Array<AutoCompletionEntry>> {
-    const options: HttpParams = new HttpParams();
-    options.append('keyWordPrefix', prefix);
+    const options: HttpParams = new HttpParams().set('contributorPrefix', prefix);
     return this.http.get<Array<AutoCompletionEntry>>(this.resourceCreatorAutoCompleteDetails, {
-      params: new HttpParams().set('contributorPrefix', prefix),
+      params: options,
     });
   }
 }
diff --git a/src/main/webapp/app/shared/model/enumerations/check-frequency.model.ts b/src/main/webapp/app/shared/model/enumerations/check-frequency.model.ts
new file mode 100644
index 0000000000000000000000000000000000000000..923200fe7ea14f2b186af35190f2b4b970a6166d
--- /dev/null
+++ b/src/main/webapp/app/shared/model/enumerations/check-frequency.model.ts
@@ -0,0 +1,9 @@
+export const enum CheckFrequency {
+  NEVER = 'NEVER',
+
+  DAILY = 'DAILY',
+
+  WEEKLY = 'WEEKLY',
+
+  MONTHLY = 'MONTHLY',
+}
diff --git a/src/main/webapp/app/shared/model/exercise.model.ts b/src/main/webapp/app/shared/model/exercise.model.ts
index f8d554f9d533fbf8123c3a9c02288b76fe19acce..45e9826c92ae84da395bceac69721f85b3b160c3 100644
--- a/src/main/webapp/app/shared/model/exercise.model.ts
+++ b/src/main/webapp/app/shared/model/exercise.model.ts
@@ -24,6 +24,7 @@ export enum ILanguages {
 //     myEnumField: IExerciseType;
 // }
 
+/** @deprecated unnecessary wrapper around exercises. Only causes extra effort. On long term should be replaced by SearchResultDTO  */
 export interface Exercise {
   // from metadata (required)
 
@@ -65,4 +66,42 @@ export interface Exercise {
   // thesis
   views: number;
   downloads: number;
+  numberOfLikes: number;
+  userHasLiked: boolean;
+}
+
+export function searchResultToExercise(searchResult: SearchResultDTO): Exercise {
+  return {
+    title: searchResult.metadata.title,
+    license: searchResult.metadata.license,
+    description: searchResult.metadata.description,
+    programmingLanguages: searchResult.metadata.programmingLanguage,
+    languages: searchResult.metadata.language,
+    creators: searchResult.metadata.creator,
+    contributor: searchResult.metadata.contributor,
+    publisher: searchResult.metadata.publisher,
+    imageURL: searchResult.metadata.image,
+    rating: searchResult.ranking5,
+    lastUpdate: searchResult.project.last_activity_at,
+    timeRequired: searchResult.metadata.timeRequired,
+    requires: searchResult.metadata.requires,
+    deprecated: searchResult.metadata.deprecated,
+    difficulty: searchResult.metadata.difficulty,
+    educationLevel: searchResult.metadata.educationLevel,
+    format: searchResult.metadata.format,
+    keyword: searchResult.metadata.keyword,
+    status: searchResult.metadata.status,
+    type: searchResult.metadata.type,
+    structure: searchResult.metadata.structure,
+    version: searchResult.metadata.version,
+    metadataVersion: searchResult.metadata.metadataVersion,
+
+    gitlabURL: searchResult.project.url,
+    originalResult: searchResult,
+    views: searchResult.views,
+    downloads: searchResult.downloads,
+
+    numberOfLikes: 0,
+    userHasLiked: false,
+  };
 }
diff --git a/src/main/webapp/app/shared/model/likes.model.ts b/src/main/webapp/app/shared/model/likes.model.ts
new file mode 100644
index 0000000000000000000000000000000000000000..5332c26e9607c39de7071c88fdb7e649ae174057
--- /dev/null
+++ b/src/main/webapp/app/shared/model/likes.model.ts
@@ -0,0 +1,12 @@
+import { Moment } from 'moment';
+
+export interface ILikes {
+  id?: number;
+  date?: Moment;
+  userID?: number;
+  exerciseID?: string;
+}
+
+export class Likes implements ILikes {
+  constructor(public id?: number, public date?: Moment, public userID?: number, public exerciseID?: string) {}
+}
diff --git a/src/main/webapp/app/shared/model/saved-searches.model.ts b/src/main/webapp/app/shared/model/saved-searches.model.ts
index 622b498289aa24b452dce3e97ec9bd0af22ff819..ba074950e7febf4f38a7e8c3bb461ab5df3a9e5a 100644
--- a/src/main/webapp/app/shared/model/saved-searches.model.ts
+++ b/src/main/webapp/app/shared/model/saved-searches.model.ts
@@ -2,10 +2,10 @@ export interface ISavedSearches {
   id?: number;
   name?: string;
   jsonQuery?: string;
-  userIdLogin?: string;
-  userIdId?: number;
+  userLogin?: string;
+  userId?: number;
 }
 
 export class SavedSearches implements ISavedSearches {
-  constructor(public id?: number, public name?: string, public jsonQuery?: string, public userIdLogin?: string, public userIdId?: number) {}
+  constructor(public id?: number, public name?: string, public jsonQuery?: string, public userLogin?: string, public userId?: number) {}
 }
diff --git a/src/main/webapp/app/shared/model/search/metadata-file-dto.model.ts b/src/main/webapp/app/shared/model/search/metadata-file-dto.model.ts
index d0cb42bd93e75e93062e4676a9083fbad99acd5b..5453b5c233ac1f6007f5af1c1113f29ae089d87d 100644
--- a/src/main/webapp/app/shared/model/search/metadata-file-dto.model.ts
+++ b/src/main/webapp/app/shared/model/search/metadata-file-dto.model.ts
@@ -3,4 +3,6 @@ export interface MetadataFileDTO {
   path: string;
   commit_id: string;
   indexing_date: Date;
+  parentId: string;
+  children: string[];
 }
diff --git a/src/main/webapp/app/shared/model/search/metadata-search-input.model.ts b/src/main/webapp/app/shared/model/search/metadata-search-input.model.ts
index 023524b0d00cd39de74cd5771b26be083e4878f9..0c6882044c891b5f4253a0c36d00a3ba06b2ebcf 100644
--- a/src/main/webapp/app/shared/model/search/metadata-search-input.model.ts
+++ b/src/main/webapp/app/shared/model/search/metadata-search-input.model.ts
@@ -8,6 +8,7 @@ export class MetadataSearchInput {
   public author: string;
   public types: Array<IExerciseType>;
   public format: string;
+  public parentId: string;
 
   public constructor() {
     this.keyword = '';
@@ -17,5 +18,6 @@ export class MetadataSearchInput {
     this.author = '';
     this.types = [];
     this.format = '';
+    this.parentId = '';
   }
 }
diff --git a/src/main/webapp/app/shared/model/search/search-input.model.ts b/src/main/webapp/app/shared/model/search/search-input.model.ts
index a9b088297d48fff119d9ff3ffb7a2ae164d0ac1d..c112978d3f203ea0e3cc560c18598179fcc9136d 100644
--- a/src/main/webapp/app/shared/model/search/search-input.model.ts
+++ b/src/main/webapp/app/shared/model/search/search-input.model.ts
@@ -20,6 +20,7 @@ export class SearchInput {
     this.metadata.author = value.author;
     this.metadata.license = value.license;
     this.metadata.format = value.format;
+    this.metadata.parentId = value.parentId;
 
     this.metadata.naturalLanguage = [];
     Object.keys(ILanguages).forEach(typeName => {
diff --git a/src/main/webapp/app/shared/model/search/search-result-dto.model.ts b/src/main/webapp/app/shared/model/search/search-result-dto.model.ts
index 8dcecef55af81426a2840495c68d2647189addd5..d252f0715a8d3e7ea4ef99e194410bc7f07728a1 100644
--- a/src/main/webapp/app/shared/model/search/search-result-dto.model.ts
+++ b/src/main/webapp/app/shared/model/search/search-result-dto.model.ts
@@ -13,6 +13,14 @@ export interface SearchResultDTO {
   downloads: number;
 }
 
+export function getPathOfExerciseId(exerciseId: string) {
+  if (exerciseId) {
+    const colonPos = exerciseId.indexOf(':"');
+    if (colonPos >= 0) return exerciseId.slice(colonPos + 1);
+  }
+  return '';
+}
+
 export interface PluginActionInfo {
   plugin: string;
   action: string;
diff --git a/src/main/webapp/app/shared/model/user-watch-list.model.ts b/src/main/webapp/app/shared/model/user-watch-list.model.ts
index 23a97f613ebf88982fc04df6d96be8c76b2c8e91..a3781655cc1e4228053a8eb0ed0a4ac28c0ac0a9 100644
--- a/src/main/webapp/app/shared/model/user-watch-list.model.ts
+++ b/src/main/webapp/app/shared/model/user-watch-list.model.ts
@@ -1,14 +1,21 @@
 import { IWatchListEntry } from './watch-list-entry.model';
-
+import { CheckFrequency } from './enumerations/check-frequency.model';
 export interface IUserWatchList {
   id?: number;
   name?: string;
-  userIdLogin?: string;
-  userIdId?: number;
+  checkFrequency?: CheckFrequency;
+  userLogin?: string;
+  userId?: number;
 }
 
 export class UserWatchList implements IUserWatchList {
-  constructor(public id?: number, public name?: string, public userIdLogin?: string, public userIdId?: number) {}
+  constructor(
+    public id?: number,
+    public name?: string,
+    public checkFrequency?: CheckFrequency,
+    public userLogin?: string,
+    public userId?: number
+  ) {}
 }
 
 export interface UserWatchListWithContent {
diff --git a/src/main/webapp/app/shared/service/test-service.ts b/src/main/webapp/app/shared/service/test-service.ts
new file mode 100644
index 0000000000000000000000000000000000000000..f132696d94a9f131cb552b07ffd4726536eb4ecd
--- /dev/null
+++ b/src/main/webapp/app/shared/service/test-service.ts
@@ -0,0 +1,23 @@
+import { Injectable } from '@angular/core';
+import { HttpClient } from '@angular/common/http';
+import { Observable } from 'rxjs';
+
+import { SERVER_API_URL } from 'app/app.constants';
+
+export interface Message {
+  message: string;
+}
+
+/**
+ provides infrastructure services for Plugins
+ */
+@Injectable({ providedIn: 'root' })
+export class TestService {
+  public triggerInfoMailURL = SERVER_API_URL + 'api/triggerInfoMail';
+
+  constructor(protected http: HttpClient) {}
+
+  public triggerInfoMail(): Observable<Message> {
+    return this.http.get<Message>(this.triggerInfoMailURL);
+  }
+}
diff --git a/src/main/webapp/app/shared/watchlist/watchlist-manager.ts b/src/main/webapp/app/shared/watchlist/watchlist-manager.ts
index 2f8b168634dabca31048fdaa7f1515595e439f6e..d6a7a24248fd2cad49a592ac800e675367440a28 100644
--- a/src/main/webapp/app/shared/watchlist/watchlist-manager.ts
+++ b/src/main/webapp/app/shared/watchlist/watchlist-manager.ts
@@ -5,6 +5,7 @@ import { UserWatchListService } from 'app/entities/user-watch-list/user-watch-li
 import { WatchListEntryService } from 'app/entities/watch-list-entry/watch-list-entry.service';
 import { TranslateService } from '@ngx-translate/core';
 import { IUserWatchList, UserWatchListWithContent } from 'app/shared/model/user-watch-list.model';
+import { CheckFrequency } from 'app/shared/model/enumerations/check-frequency.model';
 import { IWatchListEntry } from 'app/shared/model/watch-list-entry.model';
 import { AccountService } from 'app/core/auth/account.service';
 import { Subscription } from 'rxjs';
@@ -57,8 +58,9 @@ export class WatchlistManager implements OnInit, OnDestroy {
 
                   const userWatchlist: IUserWatchList = {
                     name: this.translate.instant('gitsearchApp.userWatchList.defaultName'),
-                    userIdLogin: this.account!.login,
-                    userIdId: 1, // unused, replaced by correct userId by create service
+                    userLogin: this.account!.login,
+                    userId: 1, // unused, replaced by correct userId by create service
+                    checkFrequency: CheckFrequency.NEVER,
                   };
                   this.watchListService.createForCurrentUser(userWatchlist).subscribe(
                     (wl: HttpResponse<IUserWatchList>) => {
@@ -120,14 +122,14 @@ export class WatchlistManager implements OnInit, OnDestroy {
         };
         // reload watchlist
         this.watchListEntryService.createForCurrentUser(watchListEntry).subscribe((/* wle: HttpResponse<IWatchListEntry> */) => {
-          this.loadCurrentWatchList(this.currentWatchlist!.userWatchList);
+          if (this.currentWatchlist) this.loadCurrentWatchList(this.currentWatchlist.userWatchList);
         });
       } else {
         // delete
         this.watchListEntryService
           .deleteForCurrentUser(this.currentWatchlist.userWatchList.id!, e.originalResult.exerciseId)
           .subscribe(() => {
-            this.loadCurrentWatchList(this.currentWatchlist!.userWatchList);
+            if (this.currentWatchlist) this.loadCurrentWatchList(this.currentWatchlist.userWatchList);
           });
       }
     }
diff --git a/src/main/webapp/app/teaserContent/teaserContent.component.ts b/src/main/webapp/app/teaserContent/teaserContent.component.ts
index 811056039d366e8dab388295d613880863bb0b9c..e90088ea964ce90da16801e18590b075b93bd80b 100644
--- a/src/main/webapp/app/teaserContent/teaserContent.component.ts
+++ b/src/main/webapp/app/teaserContent/teaserContent.component.ts
@@ -29,7 +29,7 @@ export class TeaserContentComponent implements OnInit {
   constructor(private searchService: SearchService, private router: Router) {}
 
   ngOnInit(): void {
-    this.searchService.getKeywordsAutoComplete('').subscribe(
+    this.searchService.getKeywordsAutoComplete('', 20).subscribe(
       (data: Array<AutoCompletionEntry>) => {
         this.keywords = data;
         this.keywordCloudData = [];
@@ -62,7 +62,7 @@ export class TeaserContentComponent implements OnInit {
         alert('Initialization of programming languages failed');
       }
     );
-    this.searchService.getContributorCreatorAutoComplete('').subscribe(
+    this.searchService.getContributorCreatorAutoComplete('', 10).subscribe(
       (data: Array<AutoCompletionEntry>) => {
         this.contributors = data;
         this.contributorCloudData = [];
diff --git a/src/main/webapp/i18n/de/checkFrequency.json b/src/main/webapp/i18n/de/checkFrequency.json
new file mode 100644
index 0000000000000000000000000000000000000000..519b381911db8eabae0569bffeaeeefd16601212
--- /dev/null
+++ b/src/main/webapp/i18n/de/checkFrequency.json
@@ -0,0 +1,11 @@
+{
+  "gitsearchApp": {
+    "CheckFrequency": {
+      "null": "",
+      "NEVER": "Nie",
+      "DAILY": "Täglich",
+      "WEEKLY": "Wöchentlich",
+      "MONTHLY": "Monatlich"
+    }
+  }
+}
diff --git a/src/main/webapp/i18n/de/exercise.json b/src/main/webapp/i18n/de/exercise.json
index 58e1f303317965b12f653266ec276dad19c8abfc..d2689c530fd6014eb9b3fbdfcba77266a6acbc18 100644
--- a/src/main/webapp/i18n/de/exercise.json
+++ b/src/main/webapp/i18n/de/exercise.json
@@ -10,7 +10,14 @@
       "git": "In GitLab öffnen",
       "views": "Anzahl der Aufrufe",
       "downloads": "Anzahl der Downloads",
-      "readmeNotFound": "# Keine README.md Datei (oder Alternative) gefunden!"
+      "readmeNotFound": "# Keine README.md Datei (oder Alternative) gefunden!",
+      "toParent": "zum übergeordneten Objekt",
+      "like": "Wenn Ihnen diese Aufgabe gefällt, dann klicken Sie auf das Herz!",
+      "unlike": "Wenn Ihnen diese Aufgabe nicht mehr gefällt, dann klicken Sie auf das Herz!",
+      "likeLogin": "Melden Sie sich an, um dieser Aufgabe ein like zu geben"
+    },
+    "help": {
+      "toParent": "Diese Aufgabe ist Teil einer Sammlung. Klicken Sie hier, um die Sammlung anzusehen."
     },
     "metadata": {
       "metadata": "Metadaten",
diff --git a/src/main/webapp/i18n/de/global.json b/src/main/webapp/i18n/de/global.json
index 31d485d6d811597e86b5788e6116ec037560cc0b..6e75db48df17c2bdbe12cd207d0df6b99f793417 100644
--- a/src/main/webapp/i18n/de/global.json
+++ b/src/main/webapp/i18n/de/global.json
@@ -8,9 +8,10 @@
       "entities": {
         "main": "Entitäten",
         "statistics": "Statistics",
-        "userWatchList": "Nutzermerkliste",
+        "userWatchList": "Merkliste",
         "watchListEntry": "Watch List Entry",
         "savedSearches": "Saved Searches",
+        "likes": "Likes",
         "jhipster-needle-menu-add-entry": "JHipster will add additional entities here (do not translate!)"
       },
       "account": {
diff --git a/src/main/webapp/i18n/de/likes.json b/src/main/webapp/i18n/de/likes.json
new file mode 100644
index 0000000000000000000000000000000000000000..993d92958493977f6cea67526d84ddee160931fe
--- /dev/null
+++ b/src/main/webapp/i18n/de/likes.json
@@ -0,0 +1,25 @@
+{
+  "gitsearchApp": {
+    "likes": {
+      "home": {
+        "title": "Likes",
+        "createLabel": "Likes erstellen",
+        "createOrEditLabel": "Likes erstellen oder bearbeiten",
+        "search": "Suche nach Likes",
+        "notFound": "No Likes found"
+      },
+      "created": "Likes erstellt mit ID {{ param }}",
+      "updated": "Likes aktualisiert mit ID {{ param }}",
+      "deleted": "Likes gelöscht mit ID {{ param }}",
+      "delete": {
+        "question": "Soll Likes {{ id }} wirklich dauerhaft gelöscht werden?"
+      },
+      "detail": {
+        "title": "Likes"
+      },
+      "date": "Date",
+      "userID": "User ID",
+      "projectID": "Project ID"
+    }
+  }
+}
diff --git a/src/main/webapp/i18n/de/search.json b/src/main/webapp/i18n/de/search.json
index 54d4b20d1118e480b4402aa8731bb039107fac2f..b7004263e3ce8e01c4d0484418342800fdd6c6dd 100644
--- a/src/main/webapp/i18n/de/search.json
+++ b/src/main/webapp/i18n/de/search.json
@@ -7,9 +7,10 @@
       "fulltext": "dieses Feld sucht im Titel, der Beschreibung und den Schlüsselwörtern (Präfixsuche)",
       "programmingLanguage": "Bitte geben die gewünschte Programmiersprache ein (Präfixsuche)",
       "keywords": "Suche nach relevanten Schlüsselwörtern (Präfixsuche)",
-      "authorContritbutors": "Suche nach Autoren (und Beitragenden) (Präfixsuche)",
+      "authorContributors": "Suche nach Autoren (und Beitragenden) (Präfixsuche)",
       "license": "Suche nach Lizenztyp (Präfixsuche)",
-      "formats": "Suche nach dem gewünschten Format (z.B latex, pdf etc.)"
+      "formats": "Suche nach dem gewünschten Format (z.B latex, pdf etc.)",
+      "helpParent": "Einschränkung aufheben"
     },
     "noResults": "Keine Suchergebnisse gefunden.",
     "noResultsAnonymous": "Sie finden vielleicht mehr Resultate, wenn Sie sich anmelden",
@@ -37,7 +38,8 @@
       "keywords": "Schlüsselwörter",
       "formats": "Formate",
       "license": "Lizenz",
-      "author": "AutorInnen"
+      "author": "AutorInnen",
+      "parentId": "Id des übergeordneten Objekts"
     }
   }
 }
diff --git a/src/main/webapp/i18n/de/settings.json b/src/main/webapp/i18n/de/settings.json
index 28cd2b644bc21741cac33851e0795aaf51f10a3a..86d9d874635b50b1f2d2ccdbac510c1df2c3d6ae 100644
--- a/src/main/webapp/i18n/de/settings.json
+++ b/src/main/webapp/i18n/de/settings.json
@@ -9,6 +9,9 @@
       "language": "Sprache",
       "button": "Speichern"
     },
+    "test": {
+      "emailSending": "Teste den Versand der Info E-Mail"
+    },
     "messages": {
       "error": {
         "fail": "<strong>Es ist ein Fehler aufgetreten!</strong> Die Einstellungen konnten nicht gespeichert werden.",
diff --git a/src/main/webapp/i18n/de/user-management.json b/src/main/webapp/i18n/de/user-management.json
index 309add6efcd286460a918012e9dc44fe152ae08b..f94a0c591757dc943ad44acb413a3f44febcb9b1 100644
--- a/src/main/webapp/i18n/de/user-management.json
+++ b/src/main/webapp/i18n/de/user-management.json
@@ -25,6 +25,8 @@
     "createdBy": "Erstellt von",
     "createdDate": "Erstellt am",
     "lastModifiedBy": "Bearbeitet von",
-    "lastModifiedDate": "Zuletzt bearbeitet"
+    "lastModifiedDate": "Zuletzt bearbeitet",
+    "lastLogin": "letzte Anmeldung",
+    "lastMailSent": "Letzter Info-Mail Versand"
   }
 }
diff --git a/src/main/webapp/i18n/de/userWatchList.json b/src/main/webapp/i18n/de/userWatchList.json
index f13c1db209b210608be5d944abb6969896538580..78ac0c2ffdccf12531e50e3d3e2b92b58e5e79c5 100644
--- a/src/main/webapp/i18n/de/userWatchList.json
+++ b/src/main/webapp/i18n/de/userWatchList.json
@@ -19,10 +19,14 @@
       "detail": {
         "title": "Lesezeichenliste"
       },
+      "help": {
+        "checkFrequency": "Wie oft wollen Sie per Mail informiert werden, falls eine neue Version eines Eintrags in dieser Liste vorliegt?"
+      },
       "name": "Name",
       "userId": "User Id",
       "selectedList": "ausgewählte Lesezeichenliste: ",
-      "currentList": "aktuelle Lesezeichenliste: "
+      "currentList": "aktuelle Lesezeichenliste: ",
+      "checkFrequency": "Überprüfungshäufigkeit"
     }
   }
 }
diff --git a/src/main/webapp/i18n/en/checkFrequency.json b/src/main/webapp/i18n/en/checkFrequency.json
new file mode 100644
index 0000000000000000000000000000000000000000..21afca6e31dfbbe7b3ecedb3767942294c1bf646
--- /dev/null
+++ b/src/main/webapp/i18n/en/checkFrequency.json
@@ -0,0 +1,11 @@
+{
+  "gitsearchApp": {
+    "CheckFrequency": {
+      "null": "",
+      "NEVER": "never",
+      "DAILY": "daily",
+      "WEEKLY": "weekly",
+      "MONTHLY": "monthly"
+    }
+  }
+}
diff --git a/src/main/webapp/i18n/en/exercise.json b/src/main/webapp/i18n/en/exercise.json
index 86233a716a85d17759de669462513ea6b8592a00..1da524f0aba8552edeb8279afdba4a793f7abde0 100644
--- a/src/main/webapp/i18n/en/exercise.json
+++ b/src/main/webapp/i18n/en/exercise.json
@@ -10,7 +10,14 @@
       "git": "Open in GitLab",
       "views": "Number of views",
       "downloads": "Number of downloads",
-      "readmeNotFound": "# No README.md (or alternatives) found!"
+      "readmeNotFound": "# No README.md (or alternatives) found!",
+      "toParent": "to parent object",
+      "like": "If you like this exercise, you can click here!",
+      "unlike": "If you don't like this exercise anymore, you can click here!",
+      "likeLogin": "Log-in to be able to click this heart"
+    },
+    "help": {
+      "toParent": "This exercise is contained in a collection. Click here to see the  collection item"
     },
     "metadata": {
       "metadata": "Meta data",
diff --git a/src/main/webapp/i18n/en/global.json b/src/main/webapp/i18n/en/global.json
index 5dbb137f8c0268b619a61d776f2bebb85ce21d82..0c2aa152f1311fb2668715e2230c80ad00d008ac 100644
--- a/src/main/webapp/i18n/en/global.json
+++ b/src/main/webapp/i18n/en/global.json
@@ -11,6 +11,7 @@
         "userWatchList": "User Watch List",
         "watchListEntry": "Watch List Entry",
         "savedSearches": "Saved Searches",
+        "likes": "Likes",
         "jhipster-needle-menu-add-entry": "JHipster will add additional entities here (do not translate!)"
       },
       "account": {
diff --git a/src/main/webapp/i18n/en/likes.json b/src/main/webapp/i18n/en/likes.json
new file mode 100644
index 0000000000000000000000000000000000000000..bd7f01b59295c353130761da101e61976501c2f0
--- /dev/null
+++ b/src/main/webapp/i18n/en/likes.json
@@ -0,0 +1,25 @@
+{
+  "gitsearchApp": {
+    "likes": {
+      "home": {
+        "title": "Likes",
+        "createLabel": "Create a new Likes",
+        "createOrEditLabel": "Create or edit a Likes",
+        "search": "Search for Likes",
+        "notFound": "No Likes found"
+      },
+      "created": "A new Likes is created with identifier {{ param }}",
+      "updated": "A Likes is updated with identifier {{ param }}",
+      "deleted": "A Likes is deleted with identifier {{ param }}",
+      "delete": {
+        "question": "Are you sure you want to delete Likes {{ id }}?"
+      },
+      "detail": {
+        "title": "Likes"
+      },
+      "date": "Date",
+      "userID": "User ID",
+      "projectID": "Project ID"
+    }
+  }
+}
diff --git a/src/main/webapp/i18n/en/search.json b/src/main/webapp/i18n/en/search.json
index 16f3a081e39079270563630badc3195894948cf7..430d5c3c87ddf047d6b6cd688490ba34aa2b291a 100644
--- a/src/main/webapp/i18n/en/search.json
+++ b/src/main/webapp/i18n/en/search.json
@@ -7,9 +7,10 @@
       "fulltext": "this field searches in all the title, the decription, and the keywords (prefix search)",
       "programmingLanguage": "please enter the programming language (prefix search)",
       "keywords": "please enter relevant keywords (prefix search)",
-      "authorContritbutors": "please enter authors or contributors (prefix search)",
+      "authorContributors": "please enter authors or contributors (prefix search)",
       "license": "please enter a license type (prefix search)",
-      "formats": "search for the wanted format (e.g. latex, pdf etc.)"
+      "formats": "search for the wanted format (e.g. latex, pdf etc.)",
+      "helpParent": "reset the parent constraint"
     },
     "noResults": "No results found.",
     "noResultsAnonymous": "You may find more results, if logged in",
@@ -37,7 +38,8 @@
       "keywords": "Keyword(s)",
       "formats": "Format(s)",
       "license": "License",
-      "author": "Author(s)"
+      "author": "Author(s)",
+      "parentId": "id of parent item"
     }
   }
 }
diff --git a/src/main/webapp/i18n/en/settings.json b/src/main/webapp/i18n/en/settings.json
index 508c037c3bce641047f8e5bdcb7c88e71f5f7e94..b727fb6e1b23936b907d76454d420adeabc76cbf 100644
--- a/src/main/webapp/i18n/en/settings.json
+++ b/src/main/webapp/i18n/en/settings.json
@@ -9,6 +9,9 @@
       "language": "Language",
       "button": "Save"
     },
+    "test": {
+      "emailSending": "Test Sending of Info Email"
+    },
     "messages": {
       "error": {
         "fail": "<strong>An error has occurred!</strong> Settings could not be saved.",
diff --git a/src/main/webapp/i18n/en/user-management.json b/src/main/webapp/i18n/en/user-management.json
index 4923c0911836c00adda5086deff7ba83affbb25e..6f587923340b439263031aa564e98ddcffc907e8 100644
--- a/src/main/webapp/i18n/en/user-management.json
+++ b/src/main/webapp/i18n/en/user-management.json
@@ -25,6 +25,8 @@
     "createdBy": "Created by",
     "createdDate": "Created date",
     "lastModifiedBy": "Modified by",
-    "lastModifiedDate": "Modified date"
+    "lastModifiedDate": "Modified date",
+    "lastLogin": "Last login",
+    "lastMailSent": "Last Info-Mail sent"
   }
 }
diff --git a/src/main/webapp/i18n/en/userWatchList.json b/src/main/webapp/i18n/en/userWatchList.json
index 357f40148eb159265a2c5d72cf95cb7ac51598ba..d111f74e5944d2b23e2954947c9a601de80d964a 100644
--- a/src/main/webapp/i18n/en/userWatchList.json
+++ b/src/main/webapp/i18n/en/userWatchList.json
@@ -19,10 +19,14 @@
       "detail": {
         "title": "User Watch List"
       },
+      "help": {
+        "checkFrequency": "How often want you get informed by email, when a new version of an exercise on this list is available?"
+      },
       "name": "Name",
       "userId": "User Id",
       "selectedList": "selected bookmark list: ",
-      "currentList": "current bookmark list: "
+      "currentList": "current bookmark list: ",
+      "checkFrequency": "Check Frequency"
     }
   }
 }
diff --git a/src/test/java/at/ac/uibk/gitsearch/domain/ExerciseIdTest.java b/src/test/java/at/ac/uibk/gitsearch/domain/ExerciseIdTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..564c03202e541dd8182b8111782da77678842d5e
--- /dev/null
+++ b/src/test/java/at/ac/uibk/gitsearch/domain/ExerciseIdTest.java
@@ -0,0 +1,34 @@
+package at.ac.uibk.gitsearch.domain;
+
+import java.text.ParseException;
+
+import org.codeability.sharing.plugins.api.search.util.ExerciseId;
+import org.junit.Assert;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.ValueSource;
+
+public class ExerciseIdTest {
+	
+	@ParameterizedTest
+	@ValueSource(strings = {"3", "3:path", "3:path1/path2"} )
+	public void parseVariousIds(String externalRepresentation) throws ParseException {
+		Assert.assertEquals(externalRepresentation, ExerciseId.fromString(externalRepresentation).toString());
+	}
+	
+	@Test
+	public void parseIdsWithTrailingSlashes() throws ParseException {
+		Assert.assertEquals("30:abc", ExerciseId.fromString("30:/abc").toString());
+		Assert.assertEquals("30:abc", ExerciseId.fromString("30://abc").toString());
+		Assert.assertEquals("30", ExerciseId.fromString("30://").toString());
+		Assert.assertEquals("30:abc/def", ExerciseId.fromString("30:/abc/def").toString());
+	}
+	
+	@ParameterizedTest
+	@ValueSource(strings = {"=", ":path", "3x2", "3x2:/asd", "asdf=asd:30"} )
+	public void parseCorruptIds(String corruptIds) throws ParseException {
+		Assertions.assertThrows(ParseException.class, () -> ExerciseId.fromString(corruptIds));
+	}
+
+}
diff --git a/src/test/java/at/ac/uibk/gitsearch/domain/LikesTest.java b/src/test/java/at/ac/uibk/gitsearch/domain/LikesTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..20f70a7d8d04d7c61aebfb5127fbb4c2c9787db6
--- /dev/null
+++ b/src/test/java/at/ac/uibk/gitsearch/domain/LikesTest.java
@@ -0,0 +1,22 @@
+package at.ac.uibk.gitsearch.domain;
+
+import org.junit.jupiter.api.Test;
+import static org.assertj.core.api.Assertions.assertThat;
+import at.ac.uibk.gitsearch.web.rest.TestUtil;
+
+public class LikesTest {
+
+    @Test
+    public void equalsVerifier() throws Exception {
+        TestUtil.equalsVerifier(Likes.class);
+        Likes likes1 = new Likes();
+        likes1.setId(1L);
+        Likes likes2 = new Likes();
+        likes2.setId(likes1.getId());
+        assertThat(likes1).isEqualTo(likes2);
+        likes2.setId(2L);
+        assertThat(likes1).isNotEqualTo(likes2);
+        likes1.setId(null);
+        assertThat(likes1).isNotEqualTo(likes2);
+    }
+}
diff --git a/src/test/java/at/ac/uibk/gitsearch/repository/search/GitFilesRepositoryImplIT.java b/src/test/java/at/ac/uibk/gitsearch/repository/search/GitFilesRepositoryImplIT.java
index 4640ee2b50f1ca2456ee24f403cdf87d23c941dd..c08035c4959b61e6095bdc137bd1f9906dc0fdc7 100644
--- a/src/test/java/at/ac/uibk/gitsearch/repository/search/GitFilesRepositoryImplIT.java
+++ b/src/test/java/at/ac/uibk/gitsearch/repository/search/GitFilesRepositoryImplIT.java
@@ -4,13 +4,13 @@ import static org.junit.jupiter.api.Assertions.fail;
 
 import java.io.IOException;
 
+import org.codeability.sharing.plugins.api.search.SearchInputDTO;
+import org.codeability.sharing.plugins.api.search.SearchInputMetadataDTO;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
 
 import at.ac.uibk.gitsearch.GitsearchApp;
 import at.ac.uibk.gitsearch.service.dto.GitFilesPageDetailsDTO;
-import at.ac.uibk.gitsearch.service.dto.SearchInputDTO;
-import at.ac.uibk.gitsearch.service.dto.SearchInputMetadataDTO;
 
 
 /**
@@ -29,7 +29,8 @@ class GitFilesRepositoryImplIT {
 	void testPageDetails() throws IOException {
 		final SearchInputMetadataDTO searchMetadata = new SearchInputMetadataDTO(null, "testing", null, null, null,null);
 		SearchInputDTO searchQuery = new SearchInputDTO(null, searchMetadata, null, null, null, 0);
-		GitFilesPageDetailsDTO searchResultPage = gitFilesRepository.pageDetails(searchQuery, SearchInputDTO.PAGE_SIZE);
+		@SuppressWarnings("unused")
+		GitFilesPageDetailsDTO searchResultPage = gitFilesRepository.pageDetails(searchQuery);
 	}
 
 	// @Test
diff --git a/src/test/java/at/ac/uibk/gitsearch/repository/search/LikesSearchRepositoryMockConfiguration.java b/src/test/java/at/ac/uibk/gitsearch/repository/search/LikesSearchRepositoryMockConfiguration.java
new file mode 100644
index 0000000000000000000000000000000000000000..ccf865ef3be47a1d45d909dfb9c5b7aa7589b656
--- /dev/null
+++ b/src/test/java/at/ac/uibk/gitsearch/repository/search/LikesSearchRepositoryMockConfiguration.java
@@ -0,0 +1,16 @@
+package at.ac.uibk.gitsearch.repository.search;
+
+import org.springframework.boot.test.mock.mockito.MockBean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * Configure a Mock version of {@link LikesSearchRepository} to test the
+ * application without starting Elasticsearch.
+ */
+@Configuration
+public class LikesSearchRepositoryMockConfiguration {
+
+    @MockBean
+    private LikesSearchRepository mockLikesSearchRepository;
+
+}
diff --git a/src/test/java/at/ac/uibk/gitsearch/repository/search/MetaDataRepositoryIT.java b/src/test/java/at/ac/uibk/gitsearch/repository/search/MetaDataRepositoryIT.java
index f7d8954bdddf268815fd3901f3decfe722504f78..9c886c3f8f90d6eef6c669ffc04b080dd93bcb46 100644
--- a/src/test/java/at/ac/uibk/gitsearch/repository/search/MetaDataRepositoryIT.java
+++ b/src/test/java/at/ac/uibk/gitsearch/repository/search/MetaDataRepositoryIT.java
@@ -1,17 +1,23 @@
 package at.ac.uibk.gitsearch.repository.search;
 
+import static org.hamcrest.Matchers.contains;
+import static org.hamcrest.Matchers.hasProperty;
+import static org.hamcrest.Matchers.is;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertThat;
+
 import java.io.IOException;
 import java.util.List;
+import java.util.Optional;
 
 import javax.ws.rs.NotFoundException;
 
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
+import org.codeability.sharing.plugins.api.search.SearchResultDTO;
 import org.elasticsearch.client.RestHighLevelClient;
 import org.elasticsearch.node.NodeValidationException;
-import static org.hamcrest.Matchers.*;
-import static org.junit.Assert.*;
-
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.BeforeEach;
@@ -22,7 +28,6 @@ import org.springframework.boot.test.context.SpringBootTest;
 import at.ac.uibk.gitsearch.GitsearchApp;
 import at.ac.uibk.gitsearch.repository.search.testESService.ElasticSearchTestServerConfiguration;
 import at.ac.uibk.gitsearch.service.dto.AutoCompleteEntry;
-import at.ac.uibk.gitsearch.service.dto.SearchResultDTO;
 
 @SpringBootTest(classes = GitsearchApp.class)
 public class MetaDataRepositoryIT {
@@ -47,35 +52,35 @@ public class MetaDataRepositoryIT {
 
 	@Test
 	public void testKeywordAutocompletion() throws IOException {
-		final List<AutoCompleteEntry> keywordsAutoComplete = metaDataRepository.getKeywordsAutoComplete("Jav");
+		final List<AutoCompleteEntry> keywordsAutoComplete = metaDataRepository.getKeywordsAutoComplete("Jav", 10);
 		assertThat(keywordsAutoComplete, contains(hasProperty("target", is("Java"))));
 	}
 
 	@Test
 	public void testCreatorAutocompletion() throws IOException {
-		final List<AutoCompleteEntry> creatorAutoComplete = metaDataRepository.getCreatorAutoComplete("Pod");
+		final List<AutoCompleteEntry> creatorAutoComplete = metaDataRepository.getCreatorAutoComplete("Pod", 10);
 		assertThat(creatorAutoComplete, contains(hasProperty("target", is("Stefan Podlipnig"))));
-		final List<AutoCompleteEntry> creatorAutoComplete2 = metaDataRepository.getCreatorAutoComplete("Po");
+		final List<AutoCompleteEntry> creatorAutoComplete2 = metaDataRepository.getCreatorAutoComplete("Po", 10);
 		assertThat(creatorAutoComplete2, contains(hasProperty("target", is("Stefan Podlipnig"))));
 	}
 
 	@Test
 	public void testContributorAutocompletion() throws IOException {
-		final List<AutoCompleteEntry> contributorAutoComplete = metaDataRepository.getContributorAutoComplete("Bast");
+		final List<AutoCompleteEntry> contributorAutoComplete = metaDataRepository.getContributorAutoComplete("Bast", 10);
 		assertThat(contributorAutoComplete, contains(hasProperty("target", is("Daniel Bastta"))));
 	}
 
 	@Test
 	public void testProgrammingLanguageAutocompletion() throws IOException {
-		final List<AutoCompleteEntry> plAutoComplete = metaDataRepository.getProgrammingLanguageAutoComplete("Ja");
-		assertThat(plAutoComplete, contains(hasProperty("target", is("Java"))));
+		final List<AutoCompleteEntry> plAutoComplete = metaDataRepository.getProgrammingLanguageAutoComplete("Ja", 10);
+		assertThat(plAutoComplete, contains(hasProperty("target", is("JAVA"))));
 	}
 
 	@Test
 	public void getByExerciseId() throws IOException {
-		// This test assumes that the test entries have consecutive ids
-		for (int i : new int[] { 1, 2, 3 }) {
-			final SearchResultDTO exerciseById = metaDataRepository.getExerciseById(i + "");
+		// This test assumes that the test entries are public
+		for (int i : new int[] { 1 }) {
+			final SearchResultDTO exerciseById = metaDataRepository.getExerciseById(i + "", Optional.empty());
 			assertNotNull("should be found:", exerciseById);
 			assertEquals("Id should be the same", i + "", exerciseById.getExerciseId());
 		}
@@ -86,7 +91,7 @@ public class MetaDataRepositoryIT {
 		// This test assumes that the test entries have consecutive ids
 		String exerciseId = "999999"; // should not exist
 		Assertions.assertThrows(NotFoundException.class, () -> {
-			metaDataRepository.getExerciseById(exerciseId);},
+			metaDataRepository.getExerciseById(exerciseId, Optional.empty());},
 				"Exercise for id " + exerciseId + " should not exist:");
 	}
 }
diff --git a/src/test/java/at/ac/uibk/gitsearch/repository/search/testESService/ElasticSearchTestServerConfiguration.java b/src/test/java/at/ac/uibk/gitsearch/repository/search/testESService/ElasticSearchTestServerConfiguration.java
index 16865042fa4cb86441aee54c59db8bedb06066de..a9ba665321f6c0f7bd1a966b0ebecc87afb76d9d 100644
--- a/src/test/java/at/ac/uibk/gitsearch/repository/search/testESService/ElasticSearchTestServerConfiguration.java
+++ b/src/test/java/at/ac/uibk/gitsearch/repository/search/testESService/ElasticSearchTestServerConfiguration.java
@@ -3,15 +3,29 @@ package at.ac.uibk.gitsearch.repository.search.testESService;
 import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
+import java.io.StringWriter;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.net.URLEncoder;
+import java.nio.charset.Charset;
+import java.time.Instant;
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.stream.Collectors;
 
+import org.apache.commons.lang3.StringUtils;
 import org.apache.http.HttpHost;
 import org.apache.http.util.EntityUtils;
 import org.apache.logging.log4j.LogManager;
+import org.codeability.sharing.plugins.api.search.SearchResultDTO;
+import org.codeability.sharing.plugins.api.search.SearchResultDTO.GitProject;
+import org.codeability.sharing.plugins.api.search.SearchResultDTO.MetadataFile;
+import org.codeability.sharing.plugins.api.search.UserProvidedMetadataDTO;
+import org.codeability.sharing.plugins.api.search.util.ExerciseId;
 import org.elasticsearch.action.search.SearchRequest;
 import org.elasticsearch.action.search.SearchResponse;
 import org.elasticsearch.client.RequestOptions;
@@ -32,66 +46,171 @@ import org.springframework.boot.context.event.ApplicationStartingEvent;
 import org.springframework.context.event.ContextStartedEvent;
 import org.springframework.context.event.ContextStoppedEvent;
 import org.springframework.context.event.EventListener;
-import org.springframework.data.elasticsearch.client.NodeClientFactoryBean;
 import org.springframework.http.HttpEntity;
 import org.springframework.http.HttpHeaders;
 import org.springframework.http.MediaType;
+import org.springframework.util.Assert;
 import org.springframework.web.client.RestClientException;
 import org.springframework.web.client.RestTemplate;
 
+import com.fasterxml.jackson.core.JsonGenerationException;
+import com.fasterxml.jackson.core.JsonParseException;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.DeserializationFeature;
 import com.fasterxml.jackson.databind.JsonMappingException;
+import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
+import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
 import com.google.common.base.Charsets;
 import com.google.common.io.ByteSource;
 
+import at.ac.uibk.gitsearch.repository.search.MetaDataRepository;
 import at.ac.uibk.gitsearch.repository.search.SearchRepositoryConstants;
 
-
 /**
- * this class provides test infrastructure for a local elastic search service for local tests.
+ * this class provides test infrastructure for a local elastic search service
+ * for local tests.
+ * 
  * @author Michael Breu
  *
  */
 public class ElasticSearchTestServerConfiguration {
-	
+
+	/**
+	 * just a helper class to store also data that is not exported to the user
+	 * 
+	 * @author Michael Breu
+	 *
+	 */
+	public static class ExtendedGitProject extends GitProject {
+		private String visibility;
+		private boolean archived;
+		private int star_count;
+		private int open_issues_count;
+		private int forks_count;
+		private String description;
+
+		/**
+		 * @return the visibility
+		 */
+		public String getVisibility() {
+			return visibility;
+		}
+
+		/**
+		 * @param visibility the visibility to set
+		 */
+		public void setVisibility(String visibility) {
+			this.visibility = visibility;
+		}
+
+		/**
+		 * @return the archived
+		 */
+		public boolean isArchived() {
+			return archived;
+		}
+
+		/**
+		 * @param archived the archived to set
+		 */
+		public void setArchived(boolean archived) {
+			this.archived = archived;
+		}
+
+		/**
+		 * @return the star_count
+		 */
+		public int getStar_count() {
+			return star_count;
+		}
+
+		/**
+		 * @param star_count the star_count to set
+		 */
+		public void setStar_count(int star_count) {
+			this.star_count = star_count;
+		}
+
+		/**
+		 * @return the open_issues_count
+		 */
+		public int getOpen_issues_count() {
+			return open_issues_count;
+		}
+
+		/**
+		 * @param open_issues_count the open_issues_count to set
+		 */
+		public void setOpen_issues_count(int open_issues_count) {
+			this.open_issues_count = open_issues_count;
+		}
+
+		/**
+		 * @return the forks_count
+		 */
+		public int getForks_count() {
+			return forks_count;
+		}
+
+		/**
+		 * @param forks_count the forks_count to set
+		 */
+		public void setForks_count(int forks_count) {
+			this.forks_count = forks_count;
+		}
+
+		/**
+		 * @return the description
+		 */
+		public String getDescription() {
+			return description;
+		}
+
+		/**
+		 * @param description the description to set
+		 */
+		public void setDescription(String description) {
+			this.description = description;
+		}
+
+	}
+
 	private static final org.slf4j.Logger LOGGER = LoggerFactory.getLogger(ElasticSearchTestServerConfiguration.class);
-    private TestESNode testNode;
-
-    private ElasticSearchTestServerConfiguration()  {
-    }
-    
-    private static ElasticSearchTestServerConfiguration instance = null;
-    
-    public static  ElasticSearchTestServerConfiguration getTestInstance()  {
-    	if (instance==null)
-    		instance = new ElasticSearchTestServerConfiguration();
-    	return instance;
-    	
-    }
+	private TestESNode testNode;
+
+	private ElasticSearchTestServerConfiguration() {
+	}
+
+	private static ElasticSearchTestServerConfiguration instance = null;
+
+	public static ElasticSearchTestServerConfiguration getTestInstance() {
+		if (instance == null)
+			instance = new ElasticSearchTestServerConfiguration();
+		return instance;
+
+	}
 
 	public synchronized void startTestNode() throws IOException, NodeValidationException {
-		if(testNode==null) {
+		if (testNode == null) {
 			LOGGER.info("Starting ES Test Node");
 			try {
-			File f = File.createTempFile("tobedeleted", "txt");
-			Settings s =  Settings.builder().put("http.port", "29200")
-						 .put("transport.port", "29300")
-			             .put("node.name", "esSharingTest")
-	                     .put("transport.type", "netty4")
-		                 .put("http.type", "netty4")
-			             .put("path.home", f.getParent() + File.separator + "esTest").build();
-			f.delete();
-			
-			testNode = new TestESNode(s, Collections.singleton(Netty4Plugin.class)) {
-				
-			}; 
-			testNode.start();
-			
-			setUpMetaDataIndex();
-			setUpContent();
-			LOGGER.info("Started ES Test Node");
+				File f = File.createTempFile("tobedeleted", "txt");
+				Settings s = Settings.builder().put("http.port", "29200").put("transport.port", "29300")
+						.put("node.name", "esSharingTest").put("transport.type", "netty4").put("http.type", "netty4")
+						.put("path.home", f.getParent() + File.separator + "esTest").build();
+				f.delete();
+
+				testNode = new TestESNode(s, Collections.singleton(Netty4Plugin.class)) {
+
+				};
+				testNode.start();
+
+				setUpMetaDataIndex();
+				setUpContent();
+				LOGGER.info("Started ES Test Node");
 			} catch (Throwable t) {
 				LOGGER.info("ES Test Node crashed: ", t);
 			}
@@ -99,114 +218,349 @@ public class ElasticSearchTestServerConfiguration {
 			LOGGER.info("Node already started");
 		}
 	}
-	
+
 	private void setUpMetaDataIndex() throws IOException {
-		
+
 		RestTemplate restTemplate = new RestTemplate();
 		HttpHeaders headers = new HttpHeaders();
-	    headers.setContentType(MediaType.APPLICATION_JSON);
+		headers.setContentType(MediaType.APPLICATION_JSON);
 
-	    try {
-	    	restTemplate.delete("http://localhost:29200/_all");
+		try {
+			restTemplate.delete("http://localhost:29200/_all");
 		} catch (Throwable e) {
 			LOGGER.info("Deletion of previous index failed: {}!", e.getMessage());
 		}
 
-	    
-	    List<String> indices2 = getIndices();
+		List<String> indices2 = getIndices();
 
-	    indices2.forEach((s) -> {
-	    	LOGGER.info("Found index {}", s);
-		    try {
+		indices2.forEach((s) -> {
+			LOGGER.info("Found index {}", s);
+			try {
 				restTemplate.delete("http://localhost:29200/" + s, String.class); // just in case, delete old index
 			} catch (RestClientException e) {
 				LOGGER.info("Deletion of previous index failed: {}!", e.getMessage());
 			}
-	    });
-	    
-	    
-	    
-	    
+		});
+
 //	    GetIndexRequest request2 = new GetIndexRequest();
 //	 
 //	    GetIndexResponse response = client.indices().get(request2, RequestOptions.DEFAULT);
 //	    String[] indices = response.getIndices();
-	    
-	    
-	    
-	    HttpEntity<String> request = 
-	    	      new HttpEntity<String>(getMetaDataConfigDefinition(), headers);
-	    
-	    
-	    
-	    restTemplate.put("http://localhost:29200/idx_metadata_1", request, String.class);
-	    
+
+		HttpEntity<String> request = new HttpEntity<String>(getMetaDataConfigDefinition(), headers);
+
+		restTemplate.put("http://localhost:29200/metadata", request, String.class);
+
 	}
 
+	@SuppressWarnings("deprecation")
 	private List<String> getIndices() throws IOException, JsonProcessingException, JsonMappingException {
 		List<String> indices2 = null;
-	    RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("localhost", 29200)));
+		RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("localhost", 29200)));
 
 		HttpHeaders headers = new HttpHeaders();
-	    headers.setContentType(MediaType.APPLICATION_JSON);
-
-	    
-	    RestClient restClient = client.getLowLevelClient();
-	    Response response2 = null;
-	    try {
-	        response2 = restClient.performRequest("GET", "/_cat/indices?v&format=json");
-	    } catch (IOException e) {
-	        LOGGER.warn(e.toString(), e);
-	    }
-
-	    // parse the JSON response
-	    List<HashMap<String, String>> list = null;
-	    if (response2 != null) {
-	    	ObjectMapper mapper = new ObjectMapper();
-	        String rawBody = EntityUtils.toString(response2.getEntity());
-	        TypeReference<List<HashMap<String, String>>> typeRef = new TypeReference<List<HashMap<String, String>>>() {};
-	        list = mapper.readValue(rawBody, typeRef);
-	    }
-
-	    // get the index names
-	    if (list != null) {
-	        indices2 = list.stream()
-	            .map(x -> x.get("index"))
-	            .collect(Collectors.toList());
-	    }
+		headers.setContentType(MediaType.APPLICATION_JSON);
+
+		RestClient restClient = client.getLowLevelClient();
+		Response response2 = null;
+		try {
+			response2 = restClient.performRequest("GET", "/_cat/indices?v&format=json");
+		} catch (IOException e) {
+			LOGGER.warn(e.toString(), e);
+		}
+
+		// parse the JSON response
+		List<HashMap<String, String>> list = null;
+		if (response2 != null) {
+			ObjectMapper mapper = new ObjectMapper();
+			String rawBody = EntityUtils.toString(response2.getEntity());
+			TypeReference<List<HashMap<String, String>>> typeRef = new TypeReference<List<HashMap<String, String>>>() {
+			};
+			list = mapper.readValue(rawBody, typeRef);
+		}
+
+		// get the index names
+		if (list != null) {
+			indices2 = list.stream().map(x -> x.get("index")).collect(Collectors.toList());
+		}
 		return indices2;
 	}
-	
-	private void setUpContent() throws IOException {
-		
 
+	int contentCount = 0;
+
+	private void setUpContent() throws IOException, URISyntaxException {
+		URL test = this.getClass().getResource("../../../service/testData");
+		File rootData = new File(test.toURI());
+		File metaDataTestDir = new File(rootData, "metaData");
+
+		contentCount = 0;
+		visitSubdirectories(metaDataTestDir, (File metaDataFile, List<SearchResultDTO> children, String relativePath,
+				ExtendedGitProject gitProject) -> {
+			try {
+				final UserProvidedMetadataDTO userMetaData = parseMetaDataFile(metaDataFile);
+
+				SearchResultDTO toIndex = new SearchResultDTO();
+				toIndex.setMetadata(userMetaData);
+
+				final ExerciseId exerciseId = calculateProjectId(relativePath);
+
+				if (gitProject == null) {
+					gitProject = new ExtendedGitProject();
+
+					gitProject.setProjectId(Integer.parseInt(exerciseId.getProjectId()));
+					gitProject.setProject_name("SomeGitProject" + exerciseId.getProjectId());
+					gitProject.setVisibility("public");
+
+				}
+
+				toIndex.setProject(gitProject);
+
+				toIndex.setExerciseId(exerciseId.toString());
+
+				final MetadataFile file = new MetadataFile();
+				file.setFilename(metaDataFile.getName());
+				// path currently starts with project id
+				int slashPos = relativePath.indexOf("/");
+				String projectRelativePath = (slashPos < 0)?metaDataFile.getName():(relativePath.substring(slashPos+1)+"/"+metaDataFile.getName());
+				file.setPath(projectRelativePath);
+				file.setIndexing_date(Instant.now());
+				file.setCommit_id("Unused Commit Id");
+				file.setChildren(children.stream().map(c -> c.getExerciseId()).collect(Collectors.toList())
+						.toArray(new String[] {}));
+				toIndex.setFile(file);
+
+				toIndex.setExerciseId(exerciseId.toString());
+				addContentToIndex(toIndex, exerciseId);
+				ElasticSearchTestServerConfiguration.this.contentCount++;
+				return Collections.singletonList(toIndex);
+			} catch (IOException e) {
+				e.printStackTrace();
+				return null;
+			}
+		}, "", null /* no initial project */
+		);
+//	    
+//	    
+//	    
+//	    while(true) {
+//	    	contentCount++;
+//		    final String content = getContent(contentCount);
+//		    if(content==null) break;
+//	    }
+
+		waitForCleanStartUp(contentCount - 1);
+	}
+
+	private void addContentToIndex(SearchResultDTO content, ExerciseId id)
+			throws JsonGenerationException, JsonMappingException, IOException {
+		ObjectMapper mapper = MetaDataRepository.getSearchResultObjectMapper();
+		StringWriter sw = new StringWriter();
+		mapper.writeValue(sw, content);
+		String contentString = sw.toString();
+		addContentToIndex(contentString, id.toString());
+	}
+
+	private static final Charset UTF8 = Charset.forName("UTF-8");
+
+	private void addContentToIndex(String content, String id) {
 		RestTemplate restTemplate = new RestTemplate();
 		HttpHeaders headers = new HttpHeaders();
-	    headers.setContentType(MediaType.APPLICATION_JSON);
-	    
-	    int contentCount = 0;
-	    
-	    while(true) {
-	    	contentCount++;
-		    final String content = getContent(contentCount);
-		    if(content==null) break;
-			HttpEntity<String> request = 
-		    	      new HttpEntity<String>(content, headers);
-		    restTemplate.put("http://localhost:29200/metadata/_doc/"+contentCount, request, String.class);
-	    }
-	    
-	    waitForCleanStartUp(contentCount-1);
+		headers.setContentType(MediaType.APPLICATION_JSON);
+		HttpEntity<String> request = new HttpEntity<String>(content, headers);
+		String encodedId = URLEncoder.encode(id, UTF8);
+		encodedId = id.replace("/", "%2F");
+		URI uri;
+		try {
+			uri = new URI("http://localhost:29200/metadata/_doc/" + encodedId);
+			restTemplate.put(uri, request);
+		} catch (URISyntaxException e) {
+			LOGGER.warn("Cannot add " + id, e);
+		}
+
+	}
+
+	private ExerciseId calculateProjectId(String relativePath) {
+		int relativePathPos = relativePath.indexOf("/");
+		if (relativePathPos < 0) {
+			int projectId = Integer.parseInt(relativePath);
+			return new ExerciseId(projectId + "", null);
+		} else {
+			int projectId = Integer.parseInt(relativePath.substring(0, relativePathPos));
+			return new ExerciseId(projectId + "", relativePath.substring(relativePathPos + 1));
+		}
+	}
+
+	/**
+	 * parse the mete data file and return a normalized meta data
+	 * @param metaDataFile the meta data file
+	 * @return parsed metadata
+	 * @throws JsonParseException 
+	 * @throws JsonMappingException
+	 * @throws IOException
+	 */
+	private UserProvidedMetadataDTO parseMetaDataFile(File metaDataFile)
+			throws JsonParseException, JsonMappingException, IOException {
+		ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
+		mapper.findAndRegisterModules();
+		UserProvidedMetadataDTO result = mapper.readValue(metaDataFile, UserProvidedMetadataDTO.class);
+		makeUpperCase(result.getProgrammingLanguage());
+		return result;
 	}
 	
+	/**
+	 * make all strings in Array uppercase.
+	 * @param strings
+	 */
+	private void makeUpperCase(String[] strings) {
+		if(strings==null) return;
+		for(int i=0; i<strings.length; i++) {
+			strings[i] = strings[i].toUpperCase();
+		}
+	}
+
+	private ExtendedGitProject parseProjectFile(File projectFile)
+			throws JsonParseException, JsonMappingException, IOException {
+		ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
+		mapper.findAndRegisterModules();
+		ExtendedGitProject result = mapper.readValue(projectFile, ExtendedGitProject.class);
+		return result;
+	}
+
+	/**
+	 * an interface that is invoked on each node of the tree with a metadata
+	 * @author Michael Breu
+	 *
+	 * @param <T> the harvested data type 
+	 */
+	private interface Harvester<T> {
+		/**
+		 * 
+		 * @param f the metaData File
+		 * @param subResults the list of results of the next node level
+		 * @param relativePath the relative path from test root
+		 * @param gitProject the information about the git project.
+		 * @return
+		 */
+		List<T> harvest(File f, List<T> subResults, String relativePath, ExtendedGitProject gitProject);
+	}
+
+	/**
+	 * recursively visits all nodes, collects all children metadata and then calls
+	 * the harvester
+	 * 
+	 * @param <T>          the type the harvester returns
+	 * @param dir          the directory to start harvesting in
+	 * @param harvester    the harvester function
+	 * @param relativePath the relative path to dir
+	 * @param gitProject   the gitProject that may be collected from root.
+	 * @return
+	 */
+	private <T> List<T> visitSubdirectories(File dir, Harvester<T> harvester, String relativePath,
+			ExtendedGitProject gitProject) {
+		Assert.state(dir.exists() && dir.isDirectory(), "must be a directory");
+		List<T> harvestedMetadata = new ArrayList<T>();
+		for (File containedFile : dir.listFiles()) {
+			if (!containedFile.isDirectory() && containedFile.getName().equals("project.yaml")) {
+				if (gitProject != null) {
+					LOGGER.error("A project.yaml should not overwrite an existing project in a subnode! {}",
+							containedFile.getAbsolutePath());
+				}
+				try {
+					gitProject = parseProjectFile(containedFile);
+				} catch (IOException e) {
+					LOGGER.error("Cannot parse project.yaml for " + containedFile.getAbsolutePath(), e);
+				}
+			}
+		}
+		for (File containedFiles : dir.listFiles()) {
+			if (containedFiles.isDirectory())
+				harvestedMetadata.addAll(visitSubdirectories(containedFiles, harvester,
+						(StringUtils.isEmpty(relativePath) ? "" : (relativePath + "/")) + containedFiles.getName(),
+						gitProject));
+		}
+		for (File containedFiles : dir.listFiles()) {
+			if (!containedFiles.isDirectory() && containedFiles.getName().equals("metaData.yaml")) {
+
+				harvestedMetadata
+						.addAll(harvester.harvest(containedFiles, harvestedMetadata, relativePath, gitProject));
+				return harvestedMetadata;
+			}
+		}
+		return harvestedMetadata;
+	}
+
+	/**
+	 * replaces existing metadata by new content
+	 * 
+	 * @param content
+	 * @param id
+	 */
+	public void updateMetadata(String content, int id) {
+		RestTemplate restTemplate = new RestTemplate();
+		HttpHeaders headers = new HttpHeaders();
+		headers.setContentType(MediaType.APPLICATION_JSON);
+		HttpEntity<String> request = new HttpEntity<String>(content, headers);
+		restTemplate.put("http://localhost:29200/metadata/_doc/" + id, request, String.class);
+	}
+
+	public String updateMetadata(SearchResultDTO testExercise, int id)
+			throws JsonGenerationException, JsonMappingException, IOException {
+
+		// first fetch previous content
+		RestTemplate restTemplate = new RestTemplate();
+		String previousContent = restTemplate.getForObject("http://localhost:29200/metadata/_doc/" + id, String.class);
+
+		ObjectMapper objectMapper = new ObjectMapper();
+		final JavaTimeModule javaModule = new JavaTimeModule();
+
+		objectMapper.registerModule(javaModule);
+		objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+		StringWriter sw = new StringWriter();
+		objectMapper.writeValue(sw, testExercise);
+		final String contentString = sw.toString();
+		updateMetadata(contentString, id);
+
+		return previousContent;
+	}
+
+	/**
+	 * sets the content to a raw json string (containing "_source" attribute). Used
+	 * to write back a changed value from updateMetadata(...).
+	 * 
+	 * @param rawInput the json string
+	 * @param id       the id to write to
+	 * @throws JsonGenerationException
+	 * @throws JsonMappingException
+	 * @throws IOException
+	 */
+	public void resetRawMetadata(String rawInput, int id)
+			throws JsonGenerationException, JsonMappingException, IOException {
+
+		ObjectMapper objectMapper = new ObjectMapper();
+		final JavaTimeModule javaModule = new JavaTimeModule();
+
+		objectMapper.registerModule(javaModule);
+		objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+
+		final JsonNode tree = objectMapper.readTree(rawInput);
+		final JsonNode source = tree.at("/_source");
+		StringWriter sw = new StringWriter();
+		objectMapper.writeValue(sw, source);
+		final String contentString = sw.toString();
+		updateMetadata(contentString, id);
+
+	}
+
 	/**
 	 * we have to wait until correct startup of content indexing?
+	 * 
 	 * @param minExpectedHits
 	 */
 	private void waitForCleanStartUp(int minExpectedHits) {
-	    RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("localhost", 29200)));
-	    int tryCount = 0;
-	    while(tryCount < 10) {
-	    	tryCount++;
+		RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("localhost", 29200)));
+		int tryCount = 0;
+		while (tryCount < 10) {
+			tryCount++;
 			SearchRequest searchRequest = new SearchRequest(SearchRepositoryConstants.INDEX_METADATA);
 			BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
 			SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
@@ -214,11 +568,13 @@ public class ElasticSearchTestServerConfiguration {
 			SearchResponse searchResponse;
 			try {
 				searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
-				if(searchResponse.getHits().getTotalHits() >= minExpectedHits) {
-					LOGGER.info("Metadata index is up with {} hits after {} trials", searchResponse.getHits().getTotalHits(), tryCount);
+				if (searchResponse.getHits().getTotalHits() >= minExpectedHits) {
+					LOGGER.info("Metadata index is up with {} hits after {} trials",
+							searchResponse.getHits().getTotalHits(), tryCount);
 					return;
 				} else {
-					LOGGER.warn("Metadata index only {} hits up after {} trials", searchResponse.getHits().getTotalHits(), tryCount);
+					LOGGER.warn("Metadata index only {} hits up after {} trials",
+							searchResponse.getHits().getTotalHits(), tryCount);
 				}
 			} catch (IOException e) {
 				LOGGER.warn("Metadata index startup exception", e);
@@ -228,27 +584,13 @@ public class ElasticSearchTestServerConfiguration {
 			} catch (InterruptedException e) {
 				LOGGER.debug("Never mind: {}", e.getMessage());
 			}
-	    }
+		}
 	}
-	
+
 	private String getMetaDataConfigDefinition() throws IOException {
 		InputStream metaDataStream = this.getClass().getResourceAsStream("../testData/es_metadata.schema.json");
 		ByteSource byteSource = new ByteSource() {
-			
-			@Override
-			public InputStream openStream() throws IOException {
-				return metaDataStream;
-			}
-		};
-		String text = byteSource.asCharSource(Charsets.UTF_8).read();
-		return text;
-	}
-	
-	private String getContent(int i) throws IOException {
-		InputStream metaDataStream = this.getClass().getResourceAsStream("../testData/content"+i+".json");
-		if(metaDataStream==null) return null;
-		ByteSource byteSource = new ByteSource() {
-			
+
 			@Override
 			public InputStream openStream() throws IOException {
 				return metaDataStream;
@@ -258,43 +600,42 @@ public class ElasticSearchTestServerConfiguration {
 		return text;
 	}
 
-    
-    @EventListener
-    public void onApplicationEvent(ApplicationStartingEvent event) {
+	@EventListener
+	public void onApplicationEvent(ApplicationStartingEvent event) {
 		try {
 			startTestNode();
 		} catch (IOException | NodeValidationException e) {
 			LOGGER.error("Cannot startup TestNode", e);
 		}
-    }
+	}
 
 	@EventListener
-    public void onApplicationEvent(ContextStartedEvent event) {
+	public void onApplicationEvent(ContextStartedEvent event) {
 		try {
 			startTestNode();
 		} catch (IOException | NodeValidationException e) {
 			LOGGER.error("Cannot startup TestNode", e);
 		}
-    }
-    
-    @EventListener
-    public void onApplicationEvent(ContextStoppedEvent event) {
+	}
+
+	@EventListener
+	public void onApplicationEvent(ContextStoppedEvent event) {
 		try {
 			testNode.close();
-		} catch (IOException  e) {
+		} catch (IOException e) {
 			LOGGER.error("Cannot startup TestNode", e);
 		}
-    }
+	}
 
-    public static class TestESNode extends Node {
-        public TestESNode(Settings preparedSettings, Collection<Class<? extends Plugin>> classpathPlugins) {
-            super(InternalSettingsPreparer.prepareEnvironment(preparedSettings, null), classpathPlugins, true);
-        }
+	public static class TestESNode extends Node {
+		public TestESNode(Settings preparedSettings, Collection<Class<? extends Plugin>> classpathPlugins) {
+			super(InternalSettingsPreparer.prepareEnvironment(preparedSettings, null), classpathPlugins, true);
+		}
 
 		@Override
 		protected void registerDerivedNodeNameWithLogger(String nodeName) {
 			LogManager.getLogger(nodeName);
 		}
-    }
-    
+	}
+
 }
diff --git a/src/test/java/at/ac/uibk/gitsearch/service/GitLabServiceIT.java b/src/test/java/at/ac/uibk/gitsearch/service/GitLabServiceIT.java
index 955835f1e164cb10154a35ced7eacf3935e8497d..87ca5abe6cf2e31ca257553ef71c780966e85a15 100644
--- a/src/test/java/at/ac/uibk/gitsearch/service/GitLabServiceIT.java
+++ b/src/test/java/at/ac/uibk/gitsearch/service/GitLabServiceIT.java
@@ -6,6 +6,7 @@ import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 
+import org.codeability.sharing.plugins.api.search.util.ExerciseId;
 import org.elasticsearch.node.NodeValidationException;
 import org.gitlab4j.api.GitLabApiException;
 import org.junit.Assert;
@@ -47,7 +48,7 @@ public class GitLabServiceIT {
 	
 	@Test
 	public void getREADMEmd() throws GitLabApiException, IOException {
-		final InputStream repositoryFile = gitlabService.getRepositoryFile("1", "README.md");
+		final InputStream repositoryFile = gitlabService.getRepositoryFile(new ExerciseId("272", null), "README.md");
 		Assert.assertNotNull(repositoryFile);
 		
 		ByteArrayOutputStream baos = new ByteArrayOutputStream();
diff --git a/src/test/java/at/ac/uibk/gitsearch/service/InfoMailServiceIT.java b/src/test/java/at/ac/uibk/gitsearch/service/InfoMailServiceIT.java
new file mode 100644
index 0000000000000000000000000000000000000000..8c49e1a08c09f6c22a4f67a13474844c28c3b2c4
--- /dev/null
+++ b/src/test/java/at/ac/uibk/gitsearch/service/InfoMailServiceIT.java
@@ -0,0 +1,190 @@
+package at.ac.uibk.gitsearch.service;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import java.io.IOException;
+import java.time.Instant;
+import java.time.LocalDateTime;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Optional;
+
+import javax.mail.internet.MimeMessage;
+
+import org.codeability.sharing.plugins.api.search.SearchResultDTO;
+import org.elasticsearch.node.NodeValidationException;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Captor;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.mockito.Spy;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.context.MessageSource;
+import org.springframework.data.auditing.DateTimeProvider;
+import org.springframework.mail.javamail.JavaMailSenderImpl;
+import org.springframework.transaction.annotation.Transactional;
+import org.thymeleaf.spring5.SpringTemplateEngine;
+
+import com.fasterxml.jackson.core.JsonGenerationException;
+import com.fasterxml.jackson.databind.JsonMappingException;
+
+import at.ac.uibk.gitsearch.GitsearchApp;
+import at.ac.uibk.gitsearch.domain.User;
+import at.ac.uibk.gitsearch.domain.UserWatchList;
+import at.ac.uibk.gitsearch.domain.WatchListEntry;
+import at.ac.uibk.gitsearch.domain.enumeration.CheckFrequency;
+import at.ac.uibk.gitsearch.repository.UserRepository;
+import at.ac.uibk.gitsearch.repository.UserWatchListRepository;
+import at.ac.uibk.gitsearch.repository.search.MetaDataRepository;
+import at.ac.uibk.gitsearch.repository.search.testESService.ElasticSearchTestServerConfiguration;
+import at.ac.uibk.gitsearch.service.dto.UserDTO;
+import io.github.jhipster.config.JHipsterProperties;
+
+/**
+ * Integration tests for {@link UserWatchListService}.
+ */
+@SpringBootTest(classes = GitsearchApp.class)
+@Transactional
+public class InfoMailServiceIT {
+
+	private static final String DEFAULT_LOGIN = "TestUser1";
+
+	private static final String DEFAULT_EMAIL = "TestUser1@localhost";
+
+	private static final String DEFAULT_FIRSTNAME = "Test";
+
+	private static final String DEFAULT_LASTNAME = "User1";
+
+	private static final String DEFAULT_IMAGEURL = "http://placehold.it/50x50";
+
+	private static final String DEFAULT_LANGKEY = "en";
+
+	private static final String TEST_EXERCISE_ID = "1";
+
+	@Autowired
+	private JHipsterProperties jHipsterProperties;
+
+	@Autowired
+	private MessageSource messageSource;
+
+	@Autowired
+	private SpringTemplateEngine templateEngine;
+
+	@Autowired
+	private UserRepository userRepository;
+	@Autowired
+	private UserService userService;
+
+	@Autowired
+	private UserWatchListService userWatchListService;
+	@Autowired
+	private UserWatchListRepository userWatchListRepository;
+	@Autowired
+	private MetaDataRepository metaDataRepository;
+
+	@Spy
+	private JavaMailSenderImpl javaMailSender;
+
+	@Captor
+	private ArgumentCaptor<MimeMessage> messageCaptor;
+
+	private MailService mailService;
+	@Mock
+	private DateTimeProvider dateTimeProvider;
+
+	private User user;
+
+	@BeforeAll
+	public static void setUpESServer() throws IOException, NodeValidationException {
+		ElasticSearchTestServerConfiguration.getTestInstance().startTestNode();
+	}
+
+	@BeforeEach
+	public void init() {
+		UserDTO userDTO = new UserDTO();
+		userDTO.setLogin(DEFAULT_LOGIN);
+
+		userDTO.setActivated(true);
+		userDTO.setEmail(DEFAULT_EMAIL);
+		userDTO.setFirstName(DEFAULT_FIRSTNAME);
+		userDTO.setLastName(DEFAULT_LASTNAME);
+		userDTO.setImageUrl(DEFAULT_IMAGEURL);
+		userDTO.setLangKey(DEFAULT_LANGKEY);
+		userDTO.setAuthorities(new HashSet<>());
+		userDTO.getAuthorities().add("sharing");
+
+		when(dateTimeProvider.getNow()).thenReturn(Optional.of(LocalDateTime.now()));
+
+		userDTO.setActivated(false);
+		user = userService.createUser(userDTO);
+
+		UserWatchList wlDAILY = new UserWatchList("someTestWatchList", CheckFrequency.DAILY, user);
+
+		WatchListEntry wle1 = new WatchListEntry();
+		wle1.setExerciseId(TEST_EXERCISE_ID);
+		wle1.setExerciseName("Unused in this test");
+		wlDAILY.getWatchListEntries().add(wle1);
+
+		userWatchListRepository.save(wlDAILY);
+
+		UserWatchList wlMONTHLY = new UserWatchList("someTestWatchList", CheckFrequency.MONTHLY, user);
+
+		WatchListEntry wle2 = new WatchListEntry();
+		wle2.setExerciseId(TEST_EXERCISE_ID);
+		wle2.setExerciseName("Unused in this test");
+		wlMONTHLY.getWatchListEntries().add(wle2);
+
+		userWatchListRepository.save(wlMONTHLY);
+
+	}
+
+	@BeforeEach
+	public void setup() {
+		MockitoAnnotations.initMocks(this);
+		doNothing().when(javaMailSender).send(any(MimeMessage.class));
+		mailService = new MailService(jHipsterProperties, javaMailSender, messageSource, templateEngine, userRepository,
+				userWatchListService);
+	}
+
+	private String original = null;
+
+	@BeforeEach
+	public void setUpChangedExercise() throws JsonGenerationException, JsonMappingException, IOException {
+		final SearchResultDTO testExercise = metaDataRepository.getExerciseById(TEST_EXERCISE_ID, Optional.empty());
+
+		testExercise.getProject().setLast_activity_at(Instant.now());
+
+		original = ElasticSearchTestServerConfiguration.getTestInstance().updateMetadata(testExercise, 3);
+	}
+
+	@Test
+	@Transactional
+	public void testSendInfoMail() throws Exception {
+
+		mailService.sendInfoMails();
+		verify(javaMailSender).send(messageCaptor.capture());
+		List<MimeMessage> messages = messageCaptor.getAllValues();
+		assertThat(messages.size()).isEqualTo(1);
+
+		MimeMessage message = messages.get(0);
+		assertThat(message.getAllRecipients()[0].toString()).isEqualTo(user.getEmail());
+		assertThat(message.getFrom()[0].toString()).isEqualTo(jHipsterProperties.getMail().getFrom());
+		assertThat(message.getContent().toString()).isNotEmpty();
+		assertThat(message.getDataHandler().getContentType()).isEqualTo("text/html;charset=UTF-8");
+	}
+
+	@AfterEach
+	public void resetChangedExercise() throws JsonGenerationException, JsonMappingException, IOException {
+		ElasticSearchTestServerConfiguration.getTestInstance().resetRawMetadata(original, 3);
+	}
+
+}
\ No newline at end of file
diff --git a/src/test/java/at/ac/uibk/gitsearch/service/MailServiceIT.java b/src/test/java/at/ac/uibk/gitsearch/service/MailServiceIT.java
index b26c7e046a3ace8c4b396482d1ebda22b324d565..74575d0410e4106e1e7ea49ebdf02e18f508f1a7 100644
--- a/src/test/java/at/ac/uibk/gitsearch/service/MailServiceIT.java
+++ b/src/test/java/at/ac/uibk/gitsearch/service/MailServiceIT.java
@@ -4,6 +4,7 @@ import at.ac.uibk.gitsearch.config.Constants;
 
 import at.ac.uibk.gitsearch.GitsearchApp;
 import at.ac.uibk.gitsearch.domain.User;
+import at.ac.uibk.gitsearch.repository.UserRepository;
 import io.github.jhipster.config.JHipsterProperties;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
@@ -59,7 +60,12 @@ public class MailServiceIT {
 
     @Autowired
     private SpringTemplateEngine templateEngine;
+    
+    @Autowired
+    private UserRepository userRepository;
 
+    @Autowired
+    private UserWatchListService userWatchListService;
     @Spy
     private JavaMailSenderImpl javaMailSender;
 
@@ -72,7 +78,7 @@ public class MailServiceIT {
     public void setup() {
         MockitoAnnotations.initMocks(this);
         doNothing().when(javaMailSender).send(any(MimeMessage.class));
-        mailService = new MailService(jHipsterProperties, javaMailSender, messageSource, templateEngine);
+        mailService = new MailService(jHipsterProperties, javaMailSender, messageSource, templateEngine, userRepository, userWatchListService);
     }
 
     @Test
diff --git a/src/test/java/at/ac/uibk/gitsearch/service/PluginManagerActionIT.java b/src/test/java/at/ac/uibk/gitsearch/service/PluginManagerActionIT.java
index 147da85ccb9bf12402652a9b1c42293e3424c950..0885ea6ee62f9474ce10a1b4b589d1889dcfbc3f 100644
--- a/src/test/java/at/ac/uibk/gitsearch/service/PluginManagerActionIT.java
+++ b/src/test/java/at/ac/uibk/gitsearch/service/PluginManagerActionIT.java
@@ -5,6 +5,8 @@ import java.io.InputStream;
 
 import org.codeability.sharing.plugins.api.SharingPluginConfig;
 import org.codeability.sharing.plugins.api.SharingPluginConfig.Action;
+import org.codeability.sharing.plugins.api.search.SearchResultDTO;
+import org.codeability.sharing.plugins.api.search.UserProvidedMetadataDTO;
 import org.junit.Assert;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
@@ -21,8 +23,6 @@ import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
 import at.ac.uibk.gitsearch.GitsearchApp;
 import at.ac.uibk.gitsearch.service.PluginManagementService.ConnectorConfigWrapper;
 import at.ac.uibk.gitsearch.service.PluginManagementService.ConnectorConfigWrapper.ActionWrapper;
-import at.ac.uibk.gitsearch.service.dto.SearchResultDTO;
-import at.ac.uibk.gitsearch.service.dto.UserProvidedMetadataDTO;
 
 @SpringBootTest(classes = GitsearchApp.class)
 public class PluginManagerActionIT {
@@ -43,10 +43,12 @@ public class PluginManagerActionIT {
 
 		ActionWrapper actionWrapper = config.getActions().get("someId");
 
-		Assert.assertTrue("metaData1 should be applicable",
-				actionWrapper.isApplicable(readTestResults("metaData1.yaml")));
-		Assert.assertFalse("metaData2 should not be applicable",
-				actionWrapper.isApplicable(readTestResults("metaData2.yaml")));
+		Assert.assertTrue("metaData 1 should be applicable",
+				actionWrapper.isApplicable(readTestResults("metaData/1/metaData.yaml")));
+		Assert.assertTrue("metaData 272 should be applicable",
+				actionWrapper.isApplicable(readTestResults("metaData/272/metaData.yaml")));
+		Assert.assertFalse("metaData 2 should not be applicable",
+				actionWrapper.isApplicable(readTestResults("metaData/2/metaData.yaml")));
 
 	}
 
diff --git a/src/test/java/at/ac/uibk/gitsearch/service/SearchServiceIT.java b/src/test/java/at/ac/uibk/gitsearch/service/SearchServiceIT.java
index 72a0808c1a57ed6d6627178f168e66154507eb29..5039afb07823a77c169b2b0719564cbfadafaaec 100644
--- a/src/test/java/at/ac/uibk/gitsearch/service/SearchServiceIT.java
+++ b/src/test/java/at/ac/uibk/gitsearch/service/SearchServiceIT.java
@@ -1,6 +1,7 @@
 package at.ac.uibk.gitsearch.service;
 
 import static at.ac.uibk.gitsearch.web.rest.AccountResourceIT.TEST_USER_LOGIN;
+import static org.hamcrest.CoreMatchers.containsStringIgnoringCase;
 import static org.hamcrest.Matchers.anyOf;
 import static org.hamcrest.Matchers.contains;
 import static org.hamcrest.Matchers.containsString;
@@ -19,6 +20,10 @@ import java.util.Collections;
 import java.util.List;
 
 import org.codeability.sharing.plugins.api.SharingPluginConfig;
+import org.codeability.sharing.plugins.api.search.SearchInputDTO;
+import org.codeability.sharing.plugins.api.search.SearchInputMetadataDTO;
+import org.codeability.sharing.plugins.api.search.SearchResultsDTO;
+import org.codeability.sharing.plugins.api.search.UserProvidedMetadataDTO.ExerciseType;
 import org.elasticsearch.client.RestHighLevelClient;
 import org.elasticsearch.node.NodeValidationException;
 import org.junit.Assert;
@@ -36,10 +41,6 @@ import at.ac.uibk.gitsearch.GitsearchApp;
 import at.ac.uibk.gitsearch.repository.search.testESService.ElasticSearchTestServerConfiguration;
 import at.ac.uibk.gitsearch.service.PluginManagementService.ConnectorConfigWrapper;
 import at.ac.uibk.gitsearch.service.dto.AutoCompleteEntry;
-import at.ac.uibk.gitsearch.service.dto.SearchInputDTO;
-import at.ac.uibk.gitsearch.service.dto.SearchInputMetadataDTO;
-import at.ac.uibk.gitsearch.service.dto.SearchResultsDTO;
-import at.ac.uibk.gitsearch.service.dto.UserProvidedMetadataDTO.ExerciseType;
 
 @SpringBootTest(classes = GitsearchApp.class)
 @WithMockUser(value = TEST_USER_LOGIN, authorities = "sharing")
@@ -75,7 +76,7 @@ public class SearchServiceIT {
 	public void testAllSearch() throws Exception {
 		final SearchInputMetadataDTO searchMetadata = new SearchInputMetadataDTO(null, null, null, null, null,null);
 		SearchInputDTO searchQuery = new SearchInputDTO(null, searchMetadata, null, null, null, 0);
-		SearchResultsDTO searchResultPage = searchService.searchResultPage(searchQuery, SearchInputDTO.PAGE_SIZE);
+		SearchResultsDTO searchResultPage = searchService.searchResultPage(searchQuery);
 		
 		Assert.assertTrue("At least one hit?", searchResultPage.getSearchResult().size() >= 1);
 		Assert.assertEquals("We start at 0", 0, searchResultPage.getPageStartIndex());
@@ -88,7 +89,7 @@ public class SearchServiceIT {
 		final String WIEN = "Wien";
 		final SearchInputMetadataDTO searchMetadata = new SearchInputMetadataDTO(null, null, null, null, null,null);
 		SearchInputDTO searchQuery = new SearchInputDTO(WIEN, searchMetadata, null, null, null, 0);
-		SearchResultsDTO searchResultPage = searchService.searchResultPage(searchQuery, SearchInputDTO.PAGE_SIZE);
+		SearchResultsDTO searchResultPage = searchService.searchResultPage(searchQuery);
 
 		org.junit.Assert.assertNotNull(searchResultPage.getSearchResult());
 		org.junit.Assert.assertTrue("At least one test hit", searchResultPage.getHitCount() >= 1);
@@ -106,7 +107,7 @@ public class SearchServiceIT {
 		final String PODLIPNIG = "Stefan Podlipnig";
 		final SearchInputMetadataDTO searchMetadata = new SearchInputMetadataDTO(null, null, null, null, PODLIPNIG, null);
 		SearchInputDTO searchQuery = new SearchInputDTO(null, searchMetadata, null, null, null, 0);
-		SearchResultsDTO searchResultPage = searchService.searchResultPage(searchQuery, SearchInputDTO.PAGE_SIZE);
+		SearchResultsDTO searchResultPage = searchService.searchResultPage(searchQuery);
 
 		org.junit.Assert.assertNotNull(searchResultPage.getSearchResult());
 		org.junit.Assert.assertTrue("At least one test hit", searchResultPage.getHitCount() >= 1);
@@ -117,14 +118,14 @@ public class SearchServiceIT {
 
 	@Test
 	public void testProgrammingLanguageSearch() throws Exception {
-		final SearchInputMetadataDTO searchMetadata = new SearchInputMetadataDTO("Java".toLowerCase(), null, null, null, null,null);
+		final SearchInputMetadataDTO searchMetadata = new SearchInputMetadataDTO("JAVA", null, null, null, null,null);
 		SearchInputDTO searchQuery = new SearchInputDTO(null, searchMetadata, null, null, null, 0);
-		SearchResultsDTO searchResultPage = searchService.searchResultPage(searchQuery, SearchInputDTO.PAGE_SIZE);
+		SearchResultsDTO searchResultPage = searchService.searchResultPage(searchQuery);
 
 		assertNotNull(searchResultPage.getSearchResult());
 		assertTrue("At least one test hit", searchResultPage.getHitCount() >= 1);
 		assertThat(searchResultPage.getSearchResult(), everyItem(
-				hasProperty("metadata", hasProperty("programmingLanguage", hasItemInArray(containsString("Java"))))));
+				hasProperty("metadata", hasProperty("programmingLanguage", hasItemInArray(containsStringIgnoringCase("Java"))))));
 
 	}
 
@@ -133,7 +134,7 @@ public class SearchServiceIT {
 
 		final SearchInputMetadataDTO searchMetadata = new SearchInputMetadataDTO(null, null, null, null, "Podlipnig",null);
 		SearchInputDTO searchQuery = new SearchInputDTO(null, searchMetadata, null, null, null, 0);
-		SearchResultsDTO searchResultPage = searchService.searchResultPage(searchQuery, SearchInputDTO.PAGE_SIZE);
+		SearchResultsDTO searchResultPage = searchService.searchResultPage(searchQuery);
 
 		org.junit.Assert.assertNotNull(searchResultPage.getSearchResult());
 		org.junit.Assert.assertTrue("At least one test hit", searchResultPage.getHitCount() >= 1);
@@ -145,8 +146,8 @@ public class SearchServiceIT {
 	@Test
 	public void testKeywordSearch() throws IOException {
 		final SearchInputMetadataDTO searchMetadata = new SearchInputMetadataDTO(null, "latex", null, null, null,null);
-		SearchInputDTO searchQuery = new SearchInputDTO(null, searchMetadata, null, null, null, 0);
-		SearchResultsDTO searchResultPage = searchService.searchResultPage(searchQuery, SearchInputDTO.PAGE_SIZE);
+		org.codeability.sharing.plugins.api.search.SearchInputDTO searchQuery = new SearchInputDTO(null, searchMetadata, null, null, null, 0);
+		SearchResultsDTO searchResultPage = searchService.searchResultPage(searchQuery);
 
 		org.junit.Assert.assertNotNull(searchResultPage.getSearchResult());
 		org.junit.Assert.assertTrue("At least one test hit", searchResultPage.getHitCount() >= 1);
@@ -159,7 +160,7 @@ public class SearchServiceIT {
 	public void testFormatSearch() throws IOException {
 		final SearchInputMetadataDTO searchMetadata = new SearchInputMetadataDTO(null, null, null, null, null,"latex");
 		SearchInputDTO searchQuery = new SearchInputDTO(null, searchMetadata, null, null, null, 0);
-		SearchResultsDTO searchResultPage = searchService.searchResultPage(searchQuery, SearchInputDTO.PAGE_SIZE);
+		SearchResultsDTO searchResultPage = searchService.searchResultPage(searchQuery);
 
 		org.junit.Assert.assertNotNull(searchResultPage.getSearchResult());
 		org.junit.Assert.assertTrue("At least one test hit", searchResultPage.getHitCount() >= 1);
@@ -173,7 +174,7 @@ public class SearchServiceIT {
 		final SearchInputMetadataDTO searchMetadata = new SearchInputMetadataDTO(null, "latex", null, null, null,null);
 		searchMetadata.setTypes(Collections.singletonList(ExerciseType.COLLECTION));
 		SearchInputDTO searchQuery = new SearchInputDTO(null, searchMetadata, null, null, null, 0);
-		SearchResultsDTO searchResultPage = searchService.searchResultPage(searchQuery, SearchInputDTO.PAGE_SIZE);
+		SearchResultsDTO searchResultPage = searchService.searchResultPage(searchQuery);
 
 		org.junit.Assert.assertNotNull(searchResultPage.getSearchResult());
 		org.junit.Assert.assertTrue("At least one test hit", searchResultPage.getHitCount() >= 1);
@@ -187,7 +188,7 @@ public class SearchServiceIT {
 		final SearchInputMetadataDTO searchMetadata = new SearchInputMetadataDTO(null, "latex", null, null, null,null);
 		searchMetadata.setNaturalLanguage(List.of("de"));;
 		SearchInputDTO searchQuery = new SearchInputDTO(null, searchMetadata, null, null, null, 0);
-		SearchResultsDTO searchResultPage = searchService.searchResultPage(searchQuery, SearchInputDTO.PAGE_SIZE);
+		SearchResultsDTO searchResultPage = searchService.searchResultPage(searchQuery);
 
 		org.junit.Assert.assertNotNull(searchResultPage.getSearchResult());
 		org.junit.Assert.assertTrue("At least one test hit", searchResultPage.getHitCount() >= 1);
@@ -201,7 +202,7 @@ public class SearchServiceIT {
 		final SearchInputMetadataDTO searchMetadata = new SearchInputMetadataDTO(null, "latex", null, null, null,null);
 		searchMetadata.setTypes(Collections.singletonList(ExerciseType.OTHER));
 		SearchInputDTO searchQuery = new SearchInputDTO(null, searchMetadata, null, null, null, 0);
-		SearchResultsDTO searchResultPage = searchService.searchResultPage(searchQuery, SearchInputDTO.PAGE_SIZE);
+		SearchResultsDTO searchResultPage = searchService.searchResultPage(searchQuery);
 
 		org.junit.Assert.assertNotNull(searchResultPage.getSearchResult());
 		org.junit.Assert.assertTrue("We expect no hit for \"latex\" and ExerciseType.OTHER", searchResultPage.getHitCount() == 0);
@@ -214,7 +215,7 @@ public class SearchServiceIT {
 		
 		final SearchInputMetadataDTO searchMetadata = new SearchInputMetadataDTO(null, null, null, "MIT", null,null);
 		SearchInputDTO searchQuery = new SearchInputDTO(null, searchMetadata, null, null, null, 0);
-		SearchResultsDTO searchResultPage = searchService.searchResultPage(searchQuery, SearchInputDTO.PAGE_SIZE);
+		SearchResultsDTO searchResultPage = searchService.searchResultPage(searchQuery);
 
 		org.junit.Assert.assertNotNull(searchResultPage.getSearchResult());
 		org.junit.Assert.assertTrue("At least one test hit", searchResultPage.getHitCount() >= 1);
@@ -225,27 +226,27 @@ public class SearchServiceIT {
 	
 	@Test
 	public void testKeywordAutocompletion() throws IOException {
-		final List<AutoCompleteEntry> keywordsAutoComplete = searchService.getKeywordsAutoComplete("Jav");
+		final List<AutoCompleteEntry> keywordsAutoComplete = searchService.getKeywordsAutoComplete("Jav", 10);
 		assertThat(keywordsAutoComplete, contains(hasProperty("target", is("Java"))));
 	}
 
 	@Test
 	public void testCreatorAutocompletion() throws IOException {
-		final List<AutoCompleteEntry> creatorAutoComplete = searchService.getCreatorAutoComplete("Pod");
+		final List<AutoCompleteEntry> creatorAutoComplete = searchService.getCreatorAutoComplete("Pod", 10);
 		assertThat(creatorAutoComplete, contains(hasProperty("target", is("Stefan Podlipnig"))));
-		final List<AutoCompleteEntry> creatorAutoComplete2 = searchService.getCreatorAutoComplete("Po");
+		final List<AutoCompleteEntry> creatorAutoComplete2 = searchService.getCreatorAutoComplete("Po", 10);
 		assertThat(creatorAutoComplete2, contains(hasProperty("target", is("Stefan Podlipnig"))));
 	}
 
 	@Test
 	public void testContributorAutocompletion() throws IOException {
-		final List<AutoCompleteEntry> contributorAutoComplete = searchService.getContributorAutoComplete("Bast");
+		final List<AutoCompleteEntry> contributorAutoComplete = searchService.getContributorAutoComplete("Bast", 10);
 		assertThat(contributorAutoComplete, contains(hasProperty("target", is("Daniel Bastta"))));
 	}
 
 	@Test
 	public void testContributorCreatorAutocompletion() throws IOException {
-		final List<AutoCompleteEntry> contributorAutoComplete = searchService.getContributorCreatorAutoComplete("Bast");
+		final List<AutoCompleteEntry> contributorAutoComplete = searchService.getContributorCreatorAutoComplete("Bast", 10);
 		assertThat(contributorAutoComplete, contains(hasProperty("target", is("Daniel Bastta"))));
 	}
 }
diff --git a/src/test/java/at/ac/uibk/gitsearch/service/ShoppingBasketServiceIT.java b/src/test/java/at/ac/uibk/gitsearch/service/ShoppingBasketServiceIT.java
index 49fb2efc3ef93951ba5aa88f559ccd01f17278d4..67d04ea1568a0f94d545fc67c46b7e404b5c7cc7 100644
--- a/src/test/java/at/ac/uibk/gitsearch/service/ShoppingBasketServiceIT.java
+++ b/src/test/java/at/ac/uibk/gitsearch/service/ShoppingBasketServiceIT.java
@@ -9,13 +9,17 @@ import java.util.regex.Pattern;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipInputStream;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.codeability.sharing.plugins.api.ShoppingBasket;
+import org.codeability.sharing.plugins.api.search.SearchInputDTO;
+import org.codeability.sharing.plugins.api.search.SearchInputMetadataDTO;
+import org.codeability.sharing.plugins.api.search.SearchResultDTO;
+import org.codeability.sharing.plugins.api.search.SearchResultsDTO;
 import org.elasticsearch.node.NodeValidationException;
 import org.junit.Assert;
 import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.security.test.context.support.WithMockUser;
@@ -24,10 +28,6 @@ import at.ac.uibk.gitsearch.GitsearchApp;
 import at.ac.uibk.gitsearch.repository.search.testESService.ElasticSearchTestServerConfiguration;
 import at.ac.uibk.gitsearch.service.ShoppingBasketService.ShoppingBasketInfoDTO;
 import at.ac.uibk.gitsearch.service.ShoppingBasketService.ShoppingBasketRedirectInfoDTO;
-import at.ac.uibk.gitsearch.service.dto.SearchInputDTO;
-import at.ac.uibk.gitsearch.service.dto.SearchInputMetadataDTO;
-import at.ac.uibk.gitsearch.service.dto.SearchResultDTO;
-import at.ac.uibk.gitsearch.service.dto.SearchResultsDTO;
 
 @SpringBootTest(classes = GitsearchApp.class)
 @WithMockUser(value = TEST_USER_LOGIN, authorities = "sharing")
@@ -76,7 +76,7 @@ public class ShoppingBasketServiceIT {
     	// just load everything from index :-)
 		final SearchInputMetadataDTO searchMetadata = new SearchInputMetadataDTO(null, null, null, null, null,null);
 		SearchInputDTO searchQuery = new SearchInputDTO(null, searchMetadata, null, null, null, 0);
-		SearchResultsDTO searchResultPage = searchService.searchResultPage(searchQuery, SearchInputDTO.PAGE_SIZE);
+		SearchResultsDTO searchResultPage = searchService.searchResultPage(searchQuery);
 		Assert.assertTrue("At least one hit?", searchResultPage.getSearchResult().size() >= 1);
     	
     	ShoppingBasketInfoDTO sbi = new ShoppingBasketInfoDTO(searchResultPage.getSearchResult().toArray(new SearchResultDTO[] {}));
diff --git a/src/test/java/at/ac/uibk/gitsearch/service/UserServiceIT.java b/src/test/java/at/ac/uibk/gitsearch/service/UserServiceIT.java
index 85d6254309800c872d109b282d6c76c21b8b04a3..7eb0c2b5415b0a516095e2a30673c1ca6a48f220 100644
--- a/src/test/java/at/ac/uibk/gitsearch/service/UserServiceIT.java
+++ b/src/test/java/at/ac/uibk/gitsearch/service/UserServiceIT.java
@@ -2,11 +2,14 @@ package at.ac.uibk.gitsearch.service;
 
 import at.ac.uibk.gitsearch.GitsearchApp;
 import at.ac.uibk.gitsearch.config.Constants;
+import at.ac.uibk.gitsearch.domain.Authority;
 import at.ac.uibk.gitsearch.domain.User;
 import at.ac.uibk.gitsearch.repository.search.UserSearchRepository;
+import at.ac.uibk.gitsearch.security.AuthoritiesConstants;
+import at.ac.uibk.gitsearch.repository.AuthorityRepository;
 import at.ac.uibk.gitsearch.repository.UserRepository;
 import at.ac.uibk.gitsearch.service.dto.UserDTO;
-
+import at.ac.uibk.gitsearch.service.mapper.UserMapper;
 import io.github.jhipster.security.RandomUtil;
 
 import org.apache.commons.lang3.RandomStringUtils;
@@ -27,6 +30,8 @@ import java.time.LocalDateTime;
 import java.util.List;
 import java.util.Optional;
 
+import javax.persistence.EntityManager;
+
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.never;
@@ -54,9 +59,14 @@ public class UserServiceIT {
 
     @Autowired
     private UserRepository userRepository;
+    @Autowired
+    private UserMapper userMapper;
 
     @Autowired
     private UserService userService;
+    
+    @Autowired
+    private EntityManager entityManager;
 
     /**
      * This repository is mocked in the at.ac.uibk.gitsearch.repository.search test package.
@@ -68,6 +78,9 @@ public class UserServiceIT {
 
     @Autowired
     private AuditingHandler auditingHandler;
+    
+    @Autowired
+    private AuthorityRepository authorityRepository;
 
     @Mock
     private DateTimeProvider dateTimeProvider;
@@ -218,5 +231,37 @@ public class UserServiceIT {
             .noneMatch(user -> Constants.ANONYMOUS_USER.equals(user.getLogin())))
             .isTrue();
     }
+    
+    /**
+     * tests the clean up of unused authorities that are not assigned to any user any more.
+     */
+    @Test
+    @Transactional
+    public void ensureAuthorityCleanUp() {
+    	final Authority usedAuthority = new Authority("sharing");
+    	final Authority unUsedAuthority = new Authority("someUnusedAuthority");
+    	authorityRepository.save(unUsedAuthority);
+    	// the usedAuthority is saved by userService.createUser 
+        user.getAuthorities().add(usedAuthority);
+        UserDTO userDTO = userMapper.userToUserDTO(user);
+        userService.createUser(userDTO);
+        
+        assertThat(authorityRepository.findById(usedAuthority.getName())).isNotEmpty();
+        assertThat(authorityRepository.findById(unUsedAuthority.getName())).isNotEmpty();
+        
+        userService.cleanUpUnusedAuthorities();
+        
+        // unfortunatelly authorities are somehow cached :-(
+        entityManager.clear();
+
+        assertThat(authorityRepository.findById(usedAuthority.getName())).isNotEmpty();
+        assertThat(authorityRepository.findById(unUsedAuthority.getName())).isEmpty();
+        
+        // Standard Roles may not be deleted!
+        assertThat(AuthoritiesConstants.ANONYMOUS).isNotEmpty();
+        assertThat(AuthoritiesConstants.ADMIN).isNotEmpty();
+        assertThat(AuthoritiesConstants.USER).isNotEmpty();
+
+    }
 
 }
diff --git a/src/test/java/at/ac/uibk/gitsearch/service/UserWatchListServiceIT.java b/src/test/java/at/ac/uibk/gitsearch/service/UserWatchListServiceIT.java
new file mode 100644
index 0000000000000000000000000000000000000000..801b6247c39ba70bc615fb3aa49bc237e47e1971
--- /dev/null
+++ b/src/test/java/at/ac/uibk/gitsearch/service/UserWatchListServiceIT.java
@@ -0,0 +1,145 @@
+package at.ac.uibk.gitsearch.service;
+
+import static org.mockito.Mockito.when;
+
+import java.io.IOException;
+import java.time.Instant;
+import java.time.LocalDateTime;
+import java.time.temporal.ChronoUnit;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Optional;
+
+import org.codeability.sharing.plugins.api.search.SearchResultDTO;
+import org.elasticsearch.node.NodeValidationException;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.mockito.Mock;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.data.auditing.DateTimeProvider;
+import org.springframework.transaction.annotation.Transactional;
+
+import at.ac.uibk.gitsearch.GitsearchApp;
+import at.ac.uibk.gitsearch.domain.User;
+import at.ac.uibk.gitsearch.domain.UserWatchList;
+import at.ac.uibk.gitsearch.domain.WatchListEntry;
+import at.ac.uibk.gitsearch.domain.enumeration.CheckFrequency;
+import at.ac.uibk.gitsearch.repository.UserWatchListRepository;
+import at.ac.uibk.gitsearch.repository.search.testESService.ElasticSearchTestServerConfiguration;
+import at.ac.uibk.gitsearch.service.dto.UserDTO;
+
+/**
+ * Integration tests for {@link UserWatchListService}.
+ */
+@SpringBootTest(classes = GitsearchApp.class)
+@Transactional
+public class UserWatchListServiceIT {
+
+    private static final String DEFAULT_LOGIN = "johndoe";
+
+    private static final String DEFAULT_EMAIL = "johndoe@localhost";
+
+    private static final String DEFAULT_FIRSTNAME = "john";
+
+    private static final String DEFAULT_LASTNAME = "doe";
+
+    private static final String DEFAULT_IMAGEURL = "http://placehold.it/50x50";
+
+    private static final String DEFAULT_LANGKEY = "dummy";
+    
+    private static final String TEST_EXERCISE_ID = "1";
+
+    @Autowired
+    private UserService userService;
+
+    @Autowired
+    private UserWatchListService userWatchListService;
+    @Autowired
+    private UserWatchListRepository userWatchListRepository;
+
+    private final static Instant LAST_CHANGE_DATE_OF_EXERCISE3 = Instant.parse("2021-02-17T15:13:27.123Z");
+    @Mock
+    private DateTimeProvider dateTimeProvider;
+
+    private User user;
+
+	@BeforeAll
+	public static void setUpESServer() throws IOException, NodeValidationException {
+		ElasticSearchTestServerConfiguration.getTestInstance().startTestNode();
+	}
+
+
+    @BeforeEach
+    public void init() {
+        UserDTO userDTO = new UserDTO();
+        userDTO.setLogin(DEFAULT_LOGIN);
+
+        userDTO.setActivated(true);
+        userDTO.setEmail(DEFAULT_EMAIL);
+        userDTO.setFirstName(DEFAULT_FIRSTNAME);
+        userDTO.setLastName(DEFAULT_LASTNAME);
+        userDTO.setImageUrl(DEFAULT_IMAGEURL);
+        userDTO.setLangKey(DEFAULT_LANGKEY);
+        userDTO.setAuthorities(new HashSet<>());
+        userDTO.getAuthorities().add("sharing");
+
+        when(dateTimeProvider.getNow()).thenReturn(Optional.of(LocalDateTime.now()));
+        
+        userDTO.setActivated(false);
+        user = userService.createUser(userDTO);
+        
+        UserWatchList wlDAILY = new UserWatchList("someTestWatchList", CheckFrequency.DAILY, user);
+
+        WatchListEntry wle1 = new WatchListEntry();
+		wle1.setExerciseId(TEST_EXERCISE_ID);
+        wle1.setExerciseName("Unused in this test");
+        wlDAILY.getWatchListEntries().add(wle1);
+        
+        userWatchListRepository.save(wlDAILY);
+        
+        UserWatchList wlMONTHLY = new UserWatchList("someTestWatchList", CheckFrequency.MONTHLY, user);
+
+        WatchListEntry wle2 = new WatchListEntry();
+        wle2.setExerciseId(TEST_EXERCISE_ID);
+        wle2.setExerciseName("Unused in this test");
+        wlMONTHLY.getWatchListEntries().add(wle2);
+        
+        userWatchListRepository.save(wlMONTHLY);
+
+    }
+    
+    @Test
+    @Transactional
+    public void testSimpleCheck() {
+    	final Instant since1970 = Instant.ofEpochSecond(0);
+		final Map<SearchResultDTO, UserWatchList> changesSince1970 = userWatchListService.findChangesSince(since1970, user);
+		org.junit.Assert.assertTrue("At least one match, because changed since 1970", !changesSince1970.isEmpty());
+    }
+
+    @Test
+    @Transactional
+    public void testNotChangedAfterCheck() {
+    	final Instant justOneHourAfterChange = LAST_CHANGE_DATE_OF_EXERCISE3.plus(1, ChronoUnit.HOURS);
+		final Map<SearchResultDTO, UserWatchList> changesSinceAnHourLater = userWatchListService.findChangesSince(justOneHourAfterChange, user);
+		org.junit.Assert.assertTrue("At least one match, because changed an hour before", changesSinceAnHourLater.isEmpty());
+    }
+
+    @Test
+    @Transactional
+    public void testChangedBeforeCheck() {
+    	final Instant justOneHourBeforeChange = LAST_CHANGE_DATE_OF_EXERCISE3.minus(1, ChronoUnit.HOURS);
+		final Map<SearchResultDTO, UserWatchList> changesSinceAnHourBefore = userWatchListService.findChangesSince(justOneHourBeforeChange, user);
+		org.junit.Assert.assertTrue("At least one match, because changed an hour later", !changesSinceAnHourBefore.isEmpty());
+    }
+    
+    @Test
+    @Transactional
+    public void testChangedBeforeCheckFrequency() {
+		final Map<SearchResultDTO, UserWatchList> allExercisesAreTooOld = userWatchListService.findChangesSince(CheckFrequency.MONTHLY, user);
+		org.junit.Assert.assertTrue("At least one match, because changed an hour later", allExercisesAreTooOld.isEmpty());
+    }
+    
+
+ }
diff --git a/src/test/java/at/ac/uibk/gitsearch/service/dto/SearchResultDTOTest.java b/src/test/java/at/ac/uibk/gitsearch/service/dto/SearchResultDTOTest.java
index 02212abccebf8d54717b55463dcd0745c06bfd31..16f2199018313f6880744449c28a7bc23d443c51 100644
--- a/src/test/java/at/ac/uibk/gitsearch/service/dto/SearchResultDTOTest.java
+++ b/src/test/java/at/ac/uibk/gitsearch/service/dto/SearchResultDTOTest.java
@@ -1,5 +1,6 @@
 package at.ac.uibk.gitsearch.service.dto;
 
+import org.codeability.sharing.plugins.api.search.SearchResultDTO;
 import org.junit.Assert;
 import org.junit.jupiter.api.Test;
 
diff --git a/src/test/java/at/ac/uibk/gitsearch/service/dto/VariousDTOTest.java b/src/test/java/at/ac/uibk/gitsearch/service/dto/VariousDTOTest.java
index cbe6eb26b42086a4c79b95d1f74d8233a8c46641..daebeeed5b84954b44b475bc8a592fce4f92220a 100644
--- a/src/test/java/at/ac/uibk/gitsearch/service/dto/VariousDTOTest.java
+++ b/src/test/java/at/ac/uibk/gitsearch/service/dto/VariousDTOTest.java
@@ -2,15 +2,18 @@ package at.ac.uibk.gitsearch.service.dto;
 
 import java.lang.reflect.InvocationTargetException;
 
+import org.codeability.sharing.plugins.api.search.SearchResultDTO;
+import org.codeability.sharing.plugins.api.search.SearchResultDTO.GitProject;
+import org.codeability.sharing.plugins.api.search.SearchResultsDTO;
+import org.codeability.sharing.plugins.api.search.SearchResultsDTO.GitProjectVisibility;
+import org.codeability.sharing.plugins.api.search.UserProvidedMetadataDTO;
+import org.codeability.sharing.plugins.api.search.UserProvidedMetadataDTO.ExerciseType;
+import org.codeability.sharing.plugins.api.search.UserProvidedMetadataDTO.Person;
 import org.junit.Assert;
 import org.junit.jupiter.api.Test;
 
 import at.ac.uibk.gitsearch.config.ApplicationProperties.DeploymentInfo;
 import at.ac.uibk.gitsearch.service.MailService;
-import at.ac.uibk.gitsearch.service.dto.SearchResultDTO.GitProject;
-import at.ac.uibk.gitsearch.service.dto.SearchResultsDTO.GitProjectVisibility;
-import at.ac.uibk.gitsearch.service.dto.UserProvidedMetadataDTO.ExerciseType;
-import at.ac.uibk.gitsearch.service.dto.UserProvidedMetadataDTO.Person;
 import at.ac.uibk.gitsearch.testingUtilities.PropertiesTester;
 import nl.jqno.equalsverifier.EqualsVerifier;
 import nl.jqno.equalsverifier.Warning;
@@ -42,6 +45,7 @@ public class VariousDTOTest {
 		propertiesTester.testProperties(GitProject.class);
 		
 		// just for test coverage
+		@SuppressWarnings("unused")
 		SearchResultsDTO srDTO = new SearchResultsDTO(null, 0, 0);
 	}
 	
diff --git a/src/test/java/at/ac/uibk/gitsearch/service/management/PluginHealthCheckRegistryIT.java b/src/test/java/at/ac/uibk/gitsearch/service/management/PluginHealthCheckRegistryIT.java
index e78d0b163b2aa7d1276a8fb7e0a9f058f126a51f..43462c40454165182bb8f0633f778e54c8dabe22 100644
--- a/src/test/java/at/ac/uibk/gitsearch/service/management/PluginHealthCheckRegistryIT.java
+++ b/src/test/java/at/ac/uibk/gitsearch/service/management/PluginHealthCheckRegistryIT.java
@@ -1,6 +1,5 @@
 package at.ac.uibk.gitsearch.service.management;
 
-import static at.ac.uibk.gitsearch.web.rest.AccountResourceIT.TEST_USER_LOGIN;
 import static org.hamcrest.CoreMatchers.anyOf;
 import static org.hamcrest.CoreMatchers.is;
 
@@ -12,7 +11,6 @@ import org.springframework.boot.actuate.health.HealthContributorRegistry;
 import org.springframework.boot.actuate.health.HealthIndicator;
 import org.springframework.boot.actuate.health.Status;
 import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.security.test.context.support.WithMockUser;
 
 import at.ac.uibk.gitsearch.GitsearchApp;
 import at.ac.uibk.gitsearch.config.ApplicationProperties;
@@ -24,15 +22,13 @@ public class PluginHealthCheckRegistryIT {
 	@Autowired
 	private ApplicationProperties applicationProperties;
 	@Autowired
-	private PluginHealthCheckRegistry pluginHealthCheckRegistry;
-	@Autowired
 	private HealthContributorRegistry healthContributorRegistry;
 
 	@Test
 	public void testHealth() {
 		healthContributorRegistry.forEach(
 				contributor -> {
-					if(applicationProperties.getRegisteredConnectors().contains(contributor.getName())) {
+					if(applicationProperties.getRegisteredConnectors().stream().anyMatch(c -> c.getUrl().equals(contributor.getName()))) {
 						Health h = ((HealthIndicator) contributor.getContributor()).health();
 						Assert.assertThat("Health for " + contributor.getName() + " should be either be up or down, but was " + h.getStatus(), 
 								h.getStatus(), anyOf(is(Status.UP), is(Status.DOWN)));
diff --git a/src/test/java/at/ac/uibk/gitsearch/service/mapper/WatchListEntryMapperTest.java b/src/test/java/at/ac/uibk/gitsearch/service/mapper/WatchListEntryMapperTest.java
index 55dc086ec8d16e09931f8308cf7004910756fcaf..70581e51654156b8b3b288cfaced30c087d6fb98 100644
--- a/src/test/java/at/ac/uibk/gitsearch/service/mapper/WatchListEntryMapperTest.java
+++ b/src/test/java/at/ac/uibk/gitsearch/service/mapper/WatchListEntryMapperTest.java
@@ -33,7 +33,7 @@ public class WatchListEntryMapperTest {
     	final long wlId = 25L;
     	final long wleId = 13L;
     	UserWatchList wl = new UserWatchList();
-		wl.setId(wlId); wl.setName("Just testing"); wl.setUserId(new User());
+		wl.setId(wlId); wl.setName("Just testing"); wl.setUser(new User());
     	
     	WatchListEntry wle = new WatchListEntry();
     	
diff --git a/src/test/java/at/ac/uibk/gitsearch/testingUtilities/PropertiesTester.java b/src/test/java/at/ac/uibk/gitsearch/testingUtilities/PropertiesTester.java
index a005d33339e647517b3ca51a87c32c774d689541..7255b9f405dc60b3d16910176e9f14ea3d872dbe 100644
--- a/src/test/java/at/ac/uibk/gitsearch/testingUtilities/PropertiesTester.java
+++ b/src/test/java/at/ac/uibk/gitsearch/testingUtilities/PropertiesTester.java
@@ -5,6 +5,7 @@ import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.lang.reflect.Parameter;
 import java.sql.Timestamp;
+import java.time.Instant;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
@@ -127,7 +128,10 @@ public void testSetters(Class<?> beanClass, Object bean, String... setterExcepti
           }
         } else if(Set.class.isAssignableFrom(type)) {
         	property = Collections.EMPTY_SET;
-        } else if(type.isInterface()) {
+        } else if (Instant.class.isAssignableFrom(type)) {
+        	property = Instant.now();
+        }
+          else if(type.isInterface()) {
         	LOGGER.info("Cannot instantiate interface {} in {} for class {}", type.getName(), setter.getName(), bean.getClass().getName());
         }
         else {
diff --git a/src/test/java/at/ac/uibk/gitsearch/web/rest/ExerciseResourceIT.java b/src/test/java/at/ac/uibk/gitsearch/web/rest/ExerciseResourceIT.java
index 4a75f787766d3cc21e51fab545fd300bd968f329..97bb0c581d2c2cab871cf76524173ccd9febbc11 100644
--- a/src/test/java/at/ac/uibk/gitsearch/web/rest/ExerciseResourceIT.java
+++ b/src/test/java/at/ac/uibk/gitsearch/web/rest/ExerciseResourceIT.java
@@ -3,6 +3,8 @@ package at.ac.uibk.gitsearch.web.rest;
 import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.csrf;
 import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
 import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
 import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
 
 import java.io.IOException;
@@ -43,8 +45,8 @@ public class ExerciseResourceIT {
 
     @Test
     public void getREADME() throws Exception {
-    	String exerciseId = "1"; // warning: this depends on the sequence in the current search index :-(
-    	restExerciseMockMvc.perform(get("/api/exercise/"+exerciseId).param("filePath", "README.md")
+    	String exerciseId = "272"; // warning: this depends on the sequence in the current search index :-(
+    	restExerciseMockMvc.perform(get("/api/exerciseFile/"+exerciseId).param("filePath", "README.md")
             	.with(csrf().asHeader())
             .contentType(MediaType.APPLICATION_JSON))
 //    		.andDo(print())
@@ -57,8 +59,8 @@ public class ExerciseResourceIT {
 
     @Test
     public void getExercisemd() throws Exception {
-    	String exerciseId = "1"; // warning: this depends on the sequence in the current search index :-(
-    	restExerciseMockMvc.perform(get("/api/exercise/"+exerciseId).param("filePath", "exercise.md")
+    	String exerciseId = "272"; // warning: this depends on the sequence in the current search index :-(
+    	restExerciseMockMvc.perform(get("/api/exerciseFile/"+exerciseId).param("filePath", "exercise.md")
             	.with(csrf().asHeader())
             .contentType(MediaType.APPLICATION_JSON))
     		.andDo(print())
@@ -70,8 +72,8 @@ public class ExerciseResourceIT {
     
     @Test
     public void getNestedPath() throws Exception {
-    	String exerciseId = "1"; // warning: this depends on the sequence in the current search index :-(
-    	restExerciseMockMvc.perform(get("/api/exercise/"+exerciseId).param("filePath", "solution/src/at/ac/uibk/ac/artemis/Receiver.java")
+    	String exerciseId = "272"; // warning: this depends on the sequence in the current search index :-(
+    	restExerciseMockMvc.perform(get("/api/exerciseFile/"+exerciseId).param("filePath", "solution/src/at/ac/uibk/ac/artemis/Receiver.java")
             	.with(csrf().asHeader())
             .contentType(MediaType.APPLICATION_JSON))
     		.andDo(print())
@@ -80,16 +82,29 @@ public class ExerciseResourceIT {
             .andExpect(StreamResultMatcher.expectMinimumSize(50));
     }
 
+    @Test
+    public void getSplitPath() throws Exception {
+    	String exerciseId = "272:solution/src/at"; // warning: this depends on the sequence in the current search index :-(
+    	restExerciseMockMvc.perform(get("/api/exerciseFile/"+exerciseId).param("filePath", "ac/uibk/ac/artemis/Receiver.java")
+            	.with(csrf().asHeader())
+            .contentType(MediaType.APPLICATION_JSON))
+    		.andDo(print())
+    		.andExpect(status().is2xxSuccessful())
+            .andExpect(StreamResultMatcher.expectOctetStream())
+            .andExpect(StreamResultMatcher.expectMinimumSize(50));
+    }
+    
     @Test
     public void testNotFound() throws Exception {
     	String exerciseId = "1"; // warning: this depends on the sequence in the current search index :-(
-    	restExerciseMockMvc.perform(get("/api/exercise/"+exerciseId).param("filePath", "fileDoesNotExist.md")
+    	restExerciseMockMvc.perform(get("/api/exerciseFile/"+exerciseId).param("filePath", "fileDoesNotExist.md")
             	.with(csrf().asHeader())
             .contentType(MediaType.APPLICATION_JSON))
     		.andDo(print())
     		.andExpect(status().isNotFound());
 
     }
+    
     public static class StreamResultMatcher {
     	
     	public static ResultMatcher expectMinimumSize(int size) {
@@ -106,5 +121,46 @@ public class ExerciseResourceIT {
     		};
     	}
     }
+    
+    @Test
+    public void getExerciseById1() throws Exception {
+    	String exerciseId = "1"; // warning: this depends on the sequence in the current search index :-(
+    	restExerciseMockMvc.perform(get("/api/exercise/"+exerciseId)
+            	.with(csrf().asHeader())
+            .contentType(MediaType.APPLICATION_JSON))
+    		.andDo(print())
+            .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE))
+            .andExpect(jsonPath("$.project.project_id").value(exerciseId));
+    }
 
+    @Test
+    public void getExerciseBySubId() throws Exception {
+    	String exerciseId = "272:solution/src/at"; // warning: this depends on the sequence in the current search index :-(
+    	restExerciseMockMvc.perform(get("/api/exercise/"+exerciseId)
+            	.with(csrf().asHeader())
+            .contentType(MediaType.APPLICATION_JSON))
+    		.andDo(print())
+            .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE))
+            .andExpect(jsonPath("$.project.project_id").value("272"));
+    }
+    
+    @Test
+    public void getExerciseByNotFound1() throws Exception {
+    	String exerciseId = "272:solution/src/atX"; // warning: this depends on the sequence in the current search index :-(
+    	restExerciseMockMvc.perform(get("/api/exercise/"+exerciseId)
+            	.with(csrf().asHeader())
+            .contentType(MediaType.APPLICATION_JSON))
+    		.andDo(print())
+    		.andExpect(status().isNotFound());
+    }
+
+    @Test
+    public void getExerciseByNotFound2() throws Exception {
+    	String exerciseId = "xxx272:solution/src/atX"; // warning: this depends on the sequence in the current search index :-(
+    	restExerciseMockMvc.perform(get("/api/exercise/"+exerciseId)
+            	.with(csrf().asHeader())
+            .contentType(MediaType.APPLICATION_JSON))
+    		.andDo(print())
+    		.andExpect(status().isNotFound());
+    }
 }
diff --git a/src/test/java/at/ac/uibk/gitsearch/web/rest/LikesResourceIT.java b/src/test/java/at/ac/uibk/gitsearch/web/rest/LikesResourceIT.java
new file mode 100644
index 0000000000000000000000000000000000000000..dbc54e3457fafc4d7d52ffa0b6c1099696613fa3
--- /dev/null
+++ b/src/test/java/at/ac/uibk/gitsearch/web/rest/LikesResourceIT.java
@@ -0,0 +1,652 @@
+package at.ac.uibk.gitsearch.web.rest;
+
+import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.csrf;
+
+import at.ac.uibk.gitsearch.GitsearchApp;
+import at.ac.uibk.gitsearch.domain.Likes;
+import at.ac.uibk.gitsearch.repository.LikesRepository;
+import at.ac.uibk.gitsearch.repository.search.LikesSearchRepository;
+import at.ac.uibk.gitsearch.service.LikesService;
+import at.ac.uibk.gitsearch.service.dto.LikesCriteria;
+import at.ac.uibk.gitsearch.service.LikesQueryService;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.mockito.Mock;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.junit.jupiter.MockitoExtension;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.http.MediaType;
+import org.springframework.security.test.context.support.WithMockUser;
+import org.springframework.test.web.servlet.MockMvc;
+import org.springframework.transaction.annotation.Transactional;
+import javax.persistence.EntityManager;
+import java.time.LocalDate;
+import java.time.ZoneId;
+import java.util.Collections;
+import java.util.List;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.elasticsearch.index.query.QueryBuilders.queryStringQuery;
+import static org.hamcrest.Matchers.hasItem;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.mockito.Mockito.*;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
+
+/**
+ * Integration tests for the {@link LikesResource} REST controller.
+ */
+@SpringBootTest(classes = GitsearchApp.class)
+@ExtendWith(MockitoExtension.class)
+@AutoConfigureMockMvc
+@WithMockUser
+public class LikesResourceIT {
+
+    private static final LocalDate DEFAULT_DATE = LocalDate.ofEpochDay(0L);
+    private static final LocalDate UPDATED_DATE = LocalDate.now(ZoneId.systemDefault());
+    private static final LocalDate SMALLER_DATE = LocalDate.ofEpochDay(-1L);
+
+    private static final Integer DEFAULT_USER_ID = 1;
+    private static final Integer UPDATED_USER_ID = 2;
+    private static final Integer SMALLER_USER_ID = 1 - 1;
+
+    private static final String DEFAULT_EXERCISE_ID = "1";
+    private static final String UPDATED_EXERCISE_ID = "2";
+    private static final String SMALLER_EXERCISE_ID = "0";
+
+    @Autowired
+    private LikesRepository likesRepository;
+
+    @Autowired
+    private LikesService likesService;
+
+    /**
+     * This repository is mocked in the at.ac.uibk.gitsearch.repository.search test
+     * package.
+     *
+     * @see at.ac.uibk.gitsearch.repository.search.LikesSearchRepositoryMockConfiguration
+     */
+    @Autowired
+    private LikesSearchRepository mockLikesSearchRepository;
+
+    @Autowired
+    private LikesQueryService likesQueryService;
+
+    @Autowired
+    private EntityManager em;
+
+    @Autowired
+    private MockMvc restLikesMockMvc;
+
+    private Likes likes;
+
+    /**
+     * Create an entity for this test.
+     *
+     * This is a static method, as tests for other entities might also need it, if
+     * they test an entity which requires the current entity.
+     */
+    public static Likes createEntity(EntityManager em) {
+        Likes likes = new Likes().date(DEFAULT_DATE).userID(DEFAULT_USER_ID).exerciseID(DEFAULT_EXERCISE_ID);
+        return likes;
+    }
+
+    /**
+     * Create an updated entity for this test.
+     *
+     * This is a static method, as tests for other entities might also need it, if
+     * they test an entity which requires the current entity.
+     */
+    public static Likes createUpdatedEntity(EntityManager em) {
+        Likes likes = new Likes().date(UPDATED_DATE).userID(UPDATED_USER_ID).exerciseID(UPDATED_EXERCISE_ID);
+        return likes;
+    }
+
+    @BeforeEach
+    public void initTest() {
+        likes = createEntity(em);
+    }
+
+    @Test
+    @Transactional
+    public void createLikes() throws Exception {
+        int databaseSizeBeforeCreate = likesRepository.findAll().size();
+        // Create the Likes
+        restLikesMockMvc.perform(post("/api/likes").with(csrf().asHeader()).contentType(MediaType.APPLICATION_JSON)
+                .content(TestUtil.convertObjectToJsonBytes(likes))).andExpect(status().isCreated());
+
+        // Validate the Likes in the database
+        List<Likes> likesList = likesRepository.findAll();
+        assertThat(likesList).hasSize(databaseSizeBeforeCreate + 1);
+        Likes testLikes = likesList.get(likesList.size() - 1);
+        assertThat(testLikes.getDate()).isEqualTo(DEFAULT_DATE);
+        assertThat(testLikes.getUserID()).isEqualTo(DEFAULT_USER_ID);
+        assertThat(testLikes.getExerciseID()).isEqualTo(DEFAULT_EXERCISE_ID);
+
+        // Validate the Likes in Elasticsearch
+        verify(mockLikesSearchRepository, times(1)).save(testLikes);
+    }
+
+    @Test
+    @Transactional
+    public void createLikesWithExistingId() throws Exception {
+        int databaseSizeBeforeCreate = likesRepository.findAll().size();
+
+        // Create the Likes with an existing ID
+        likes.setId(1L);
+
+        // An entity with an existing ID cannot be created, so this API call must fail
+        restLikesMockMvc.perform(post("/api/likes").with(csrf().asHeader()).contentType(MediaType.APPLICATION_JSON)
+                .content(TestUtil.convertObjectToJsonBytes(likes))).andExpect(status().isBadRequest());
+
+        // Validate the Likes in the database
+        List<Likes> likesList = likesRepository.findAll();
+        assertThat(likesList).hasSize(databaseSizeBeforeCreate);
+
+        // Validate the Likes in Elasticsearch
+        verify(mockLikesSearchRepository, times(0)).save(likes);
+    }
+
+    @Test
+    @Transactional
+    public void checkDateIsRequired() throws Exception {
+        int databaseSizeBeforeTest = likesRepository.findAll().size();
+        // set the field null
+        likes.setDate(null);
+
+        // Create the Likes, which fails.
+
+        restLikesMockMvc.perform(post("/api/likes").with(csrf().asHeader()).contentType(MediaType.APPLICATION_JSON)
+                .content(TestUtil.convertObjectToJsonBytes(likes))).andExpect(status().isBadRequest());
+
+        List<Likes> likesList = likesRepository.findAll();
+        assertThat(likesList).hasSize(databaseSizeBeforeTest);
+    }
+
+    @Test
+    @Transactional
+    public void checkUserIDIsRequired() throws Exception {
+        int databaseSizeBeforeTest = likesRepository.findAll().size();
+        // set the field null
+        likes.setUserID(null);
+
+        // Create the Likes, which fails.
+
+        restLikesMockMvc.perform(post("/api/likes").with(csrf().asHeader()).contentType(MediaType.APPLICATION_JSON)
+                .content(TestUtil.convertObjectToJsonBytes(likes))).andExpect(status().isBadRequest());
+
+        List<Likes> likesList = likesRepository.findAll();
+        assertThat(likesList).hasSize(databaseSizeBeforeTest);
+    }
+
+    @Test
+    @Transactional
+    public void checkexerciseIDIsRequired() throws Exception {
+        int databaseSizeBeforeTest = likesRepository.findAll().size();
+        // set the field null
+        likes.setExerciseID(null);
+
+        // Create the Likes, which fails.
+
+        restLikesMockMvc.perform(post("/api/likes").with(csrf().asHeader()).contentType(MediaType.APPLICATION_JSON)
+                .content(TestUtil.convertObjectToJsonBytes(likes))).andExpect(status().isBadRequest());
+
+        List<Likes> likesList = likesRepository.findAll();
+        assertThat(likesList).hasSize(databaseSizeBeforeTest);
+    }
+
+    @Test
+    @Transactional
+    public void getAllLikes() throws Exception {
+        // Initialize the database
+        likesRepository.saveAndFlush(likes);
+
+        // Get all the likesList
+        restLikesMockMvc.perform(get("/api/likes?sort=id,desc")).andExpect(status().isOk())
+                .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE))
+                .andExpect(jsonPath("$.[*].id").value(hasItem(likes.getId().intValue())))
+                .andExpect(jsonPath("$.[*].date").value(hasItem(DEFAULT_DATE.toString())))
+                .andExpect(jsonPath("$.[*].userID").value(hasItem(DEFAULT_USER_ID)))
+                .andExpect(jsonPath("$.[*].exerciseID").value(hasItem(DEFAULT_EXERCISE_ID)));
+    }
+
+    @Test
+    @Transactional
+    public void getLikes() throws Exception {
+        // Initialize the database
+        likesRepository.saveAndFlush(likes);
+
+        // Get the likes
+        restLikesMockMvc.perform(get("/api/likes/{id}", likes.getId())).andExpect(status().isOk())
+                .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE))
+                .andExpect(jsonPath("$.id").value(likes.getId().intValue()))
+                .andExpect(jsonPath("$.date").value(DEFAULT_DATE.toString()))
+                .andExpect(jsonPath("$.userID").value(DEFAULT_USER_ID))
+                .andExpect(jsonPath("$.exerciseID").value(DEFAULT_EXERCISE_ID));
+    }
+
+    @Test
+    @Transactional
+    public void getLikesByExerciseID() throws Exception {
+        // Initialize the database
+        likesRepository.saveAndFlush(likes);
+
+        // Get the likes
+        restLikesMockMvc.perform(get("/api/numberOfLikes/", likes.getExerciseID())).andExpect(status().isOk());
+
+        assertEquals(1, likesRepository.findNumberOfLikesByExerciseID(likes.getExerciseID()));
+    }
+
+    @Test
+    @Transactional
+    public void testLikeWorkflowWithAuthorities() throws Exception {
+        // Initialize the database
+        likesRepository.saveAndFlush(likes);
+
+        // generate new like
+        Likes newLike = new Likes();
+        newLike.setExerciseID("1000");
+
+        //user likes a project
+
+        restLikesMockMvc.perform(put("/api/likeExercise").with(csrf().asHeader()).contentType(MediaType.APPLICATION_JSON)
+                .content(TestUtil.convertObjectToJsonBytes(newLike))).andExpect(status().isOk());
+
+        assertEquals(1, likesRepository.findNumberOfLikesByExerciseID("1000"));
+
+        //like again and nothing should happen
+
+        restLikesMockMvc.perform(put("/api/likeExercise").with(csrf().asHeader()).contentType(MediaType.APPLICATION_JSON)
+        .content(TestUtil.convertObjectToJsonBytes(newLike))).andExpect(status().isOk());
+
+        assertEquals(1, likesRepository.findNumberOfLikesByExerciseID("1000"));
+
+        //unlike project 
+
+        restLikesMockMvc.perform(delete("/api/unlikeExercise/{exerciseID}", "1000").with(csrf().asHeader()).accept(MediaType.APPLICATION_JSON))
+        .andExpect(status().isNoContent());
+
+        assertEquals(0, likesRepository.findNumberOfLikesByExerciseID("1000"));
+
+    }
+
+    @Test
+    @Transactional
+    public void testLikeWorkflowWithOutAuthorities() throws Exception {
+        // Initialize the database
+        likesRepository.saveAndFlush(likes);
+
+        // generate new like
+        Likes newLike = new Likes();
+        newLike.setExerciseID("1000");
+
+        //user likes a project and nothing should happen
+
+        restLikesMockMvc.perform(put("/api/likeExercise").contentType(MediaType.APPLICATION_JSON)
+                .content(TestUtil.convertObjectToJsonBytes(newLike))).andExpect(status().isForbidden());
+
+        assertEquals(0, likesRepository.findNumberOfLikesByExerciseID("1000"));
+
+
+        //unlike project 
+
+        restLikesMockMvc.perform(delete("/api/unlikeExercise/{exerciseID}", "1000").accept(MediaType.APPLICATION_JSON))
+        .andExpect(status().isForbidden());
+
+        assertEquals(0, likesRepository.findNumberOfLikesByExerciseID("1000"));
+
+    }
+
+    @Test
+    @Transactional
+    public void getLikesByIdFiltering() throws Exception {
+        // Initialize the database
+        likesRepository.saveAndFlush(likes);
+
+        Long id = likes.getId();
+
+        defaultLikesShouldBeFound("id.equals=" + id);
+        defaultLikesShouldNotBeFound("id.notEquals=" + id);
+
+        defaultLikesShouldBeFound("id.greaterThanOrEqual=" + id);
+        defaultLikesShouldNotBeFound("id.greaterThan=" + id);
+
+        defaultLikesShouldBeFound("id.lessThanOrEqual=" + id);
+        defaultLikesShouldNotBeFound("id.lessThan=" + id);
+    }
+
+    @Test
+    @Transactional
+    public void getAllLikesByDateIsEqualToSomething() throws Exception {
+        // Initialize the database
+        likesRepository.saveAndFlush(likes);
+
+        // Get all the likesList where date equals to DEFAULT_DATE
+        defaultLikesShouldBeFound("date.equals=" + DEFAULT_DATE);
+
+        // Get all the likesList where date equals to UPDATED_DATE
+        defaultLikesShouldNotBeFound("date.equals=" + UPDATED_DATE);
+    }
+
+    @Test
+    @Transactional
+    public void getAllLikesByDateIsNotEqualToSomething() throws Exception {
+        // Initialize the database
+        likesRepository.saveAndFlush(likes);
+
+        // Get all the likesList where date not equals to DEFAULT_DATE
+        defaultLikesShouldNotBeFound("date.notEquals=" + DEFAULT_DATE);
+
+        // Get all the likesList where date not equals to UPDATED_DATE
+        defaultLikesShouldBeFound("date.notEquals=" + UPDATED_DATE);
+    }
+
+    @Test
+    @Transactional
+    public void getAllLikesByDateIsInShouldWork() throws Exception {
+        // Initialize the database
+        likesRepository.saveAndFlush(likes);
+
+        // Get all the likesList where date in DEFAULT_DATE or UPDATED_DATE
+        defaultLikesShouldBeFound("date.in=" + DEFAULT_DATE + "," + UPDATED_DATE);
+
+        // Get all the likesList where date equals to UPDATED_DATE
+        defaultLikesShouldNotBeFound("date.in=" + UPDATED_DATE);
+    }
+
+    @Test
+    @Transactional
+    public void getAllLikesByDateIsNullOrNotNull() throws Exception {
+        // Initialize the database
+        likesRepository.saveAndFlush(likes);
+
+        // Get all the likesList where date is not null
+        defaultLikesShouldBeFound("date.specified=true");
+
+        // Get all the likesList where date is null
+        defaultLikesShouldNotBeFound("date.specified=false");
+    }
+
+    @Test
+    @Transactional
+    public void getAllLikesByDateIsGreaterThanOrEqualToSomething() throws Exception {
+        // Initialize the database
+        likesRepository.saveAndFlush(likes);
+
+        // Get all the likesList where date is greater than or equal to DEFAULT_DATE
+        defaultLikesShouldBeFound("date.greaterThanOrEqual=" + DEFAULT_DATE);
+
+        // Get all the likesList where date is greater than or equal to UPDATED_DATE
+        defaultLikesShouldNotBeFound("date.greaterThanOrEqual=" + UPDATED_DATE);
+    }
+
+    @Test
+    @Transactional
+    public void getAllLikesByDateIsLessThanOrEqualToSomething() throws Exception {
+        // Initialize the database
+        likesRepository.saveAndFlush(likes);
+
+        // Get all the likesList where date is less than or equal to DEFAULT_DATE
+        defaultLikesShouldBeFound("date.lessThanOrEqual=" + DEFAULT_DATE);
+
+        // Get all the likesList where date is less than or equal to SMALLER_DATE
+        defaultLikesShouldNotBeFound("date.lessThanOrEqual=" + SMALLER_DATE);
+    }
+
+    @Test
+    @Transactional
+    public void getAllLikesByDateIsLessThanSomething() throws Exception {
+        // Initialize the database
+        likesRepository.saveAndFlush(likes);
+
+        // Get all the likesList where date is less than DEFAULT_DATE
+        defaultLikesShouldNotBeFound("date.lessThan=" + DEFAULT_DATE);
+
+        // Get all the likesList where date is less than UPDATED_DATE
+        defaultLikesShouldBeFound("date.lessThan=" + UPDATED_DATE);
+    }
+
+    @Test
+    @Transactional
+    public void getAllLikesByDateIsGreaterThanSomething() throws Exception {
+        // Initialize the database
+        likesRepository.saveAndFlush(likes);
+
+        // Get all the likesList where date is greater than DEFAULT_DATE
+        defaultLikesShouldNotBeFound("date.greaterThan=" + DEFAULT_DATE);
+
+        // Get all the likesList where date is greater than SMALLER_DATE
+        defaultLikesShouldBeFound("date.greaterThan=" + SMALLER_DATE);
+    }
+
+    @Test
+    @Transactional
+    public void getAllLikesByUserIDIsEqualToSomething() throws Exception {
+        // Initialize the database
+        likesRepository.saveAndFlush(likes);
+
+        // Get all the likesList where userID equals to DEFAULT_USER_ID
+        defaultLikesShouldBeFound("userID.equals=" + DEFAULT_USER_ID);
+
+        // Get all the likesList where userID equals to UPDATED_USER_ID
+        defaultLikesShouldNotBeFound("userID.equals=" + UPDATED_USER_ID);
+    }
+
+    @Test
+    @Transactional
+    public void getAllLikesByUserIDIsNotEqualToSomething() throws Exception {
+        // Initialize the database
+        likesRepository.saveAndFlush(likes);
+
+        // Get all the likesList where userID not equals to DEFAULT_USER_ID
+        defaultLikesShouldNotBeFound("userID.notEquals=" + DEFAULT_USER_ID);
+
+        // Get all the likesList where userID not equals to UPDATED_USER_ID
+        defaultLikesShouldBeFound("userID.notEquals=" + UPDATED_USER_ID);
+    }
+
+    @Test
+    @Transactional
+    public void getAllLikesByUserIDIsInShouldWork() throws Exception {
+        // Initialize the database
+        likesRepository.saveAndFlush(likes);
+
+        // Get all the likesList where userID in DEFAULT_USER_ID or UPDATED_USER_ID
+        defaultLikesShouldBeFound("userID.in=" + DEFAULT_USER_ID + "," + UPDATED_USER_ID);
+
+        // Get all the likesList where userID equals to UPDATED_USER_ID
+        defaultLikesShouldNotBeFound("userID.in=" + UPDATED_USER_ID);
+    }
+
+    @Test
+    @Transactional
+    public void getAllLikesByUserIDIsNullOrNotNull() throws Exception {
+        // Initialize the database
+        likesRepository.saveAndFlush(likes);
+
+        // Get all the likesList where userID is not null
+        defaultLikesShouldBeFound("userID.specified=true");
+
+        // Get all the likesList where userID is null
+        defaultLikesShouldNotBeFound("userID.specified=false");
+    }
+
+    @Test
+    @Transactional
+    public void getAllLikesByUserIDIsGreaterThanOrEqualToSomething() throws Exception {
+        // Initialize the database
+        likesRepository.saveAndFlush(likes);
+
+        // Get all the likesList where userID is greater than or equal to
+        // DEFAULT_USER_ID
+        defaultLikesShouldBeFound("userID.greaterThanOrEqual=" + DEFAULT_USER_ID);
+
+        // Get all the likesList where userID is greater than or equal to
+        // UPDATED_USER_ID
+        defaultLikesShouldNotBeFound("userID.greaterThanOrEqual=" + UPDATED_USER_ID);
+    }
+
+    @Test
+    @Transactional
+    public void getAllLikesByUserIDIsLessThanOrEqualToSomething() throws Exception {
+        // Initialize the database
+        likesRepository.saveAndFlush(likes);
+
+        // Get all the likesList where userID is less than or equal to DEFAULT_USER_ID
+        defaultLikesShouldBeFound("userID.lessThanOrEqual=" + DEFAULT_USER_ID);
+
+        // Get all the likesList where userID is less than or equal to SMALLER_USER_ID
+        defaultLikesShouldNotBeFound("userID.lessThanOrEqual=" + SMALLER_USER_ID);
+    }
+
+    @Test
+    @Transactional
+    public void getAllLikesByUserIDIsLessThanSomething() throws Exception {
+        // Initialize the database
+        likesRepository.saveAndFlush(likes);
+
+        // Get all the likesList where userID is less than DEFAULT_USER_ID
+        defaultLikesShouldNotBeFound("userID.lessThan=" + DEFAULT_USER_ID);
+
+        // Get all the likesList where userID is less than UPDATED_USER_ID
+        defaultLikesShouldBeFound("userID.lessThan=" + UPDATED_USER_ID);
+    }
+
+    @Test
+    @Transactional
+    public void getAllLikesByUserIDIsGreaterThanSomething() throws Exception {
+        // Initialize the database
+        likesRepository.saveAndFlush(likes);
+
+        // Get all the likesList where userID is greater than DEFAULT_USER_ID
+        defaultLikesShouldNotBeFound("userID.greaterThan=" + DEFAULT_USER_ID);
+
+        // Get all the likesList where userID is greater than SMALLER_USER_ID
+        defaultLikesShouldBeFound("userID.greaterThan=" + SMALLER_USER_ID);
+    }
+
+    /**
+     * Executes the search, and checks that the default entity is returned.
+     */
+    private void defaultLikesShouldBeFound(String filter) throws Exception {
+        restLikesMockMvc.perform(get("/api/likes?sort=id,desc&" + filter)).andExpect(status().isOk())
+                .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE))
+                .andExpect(jsonPath("$.[*].id").value(hasItem(likes.getId().intValue())))
+                .andExpect(jsonPath("$.[*].date").value(hasItem(DEFAULT_DATE.toString())))
+                .andExpect(jsonPath("$.[*].userID").value(hasItem(DEFAULT_USER_ID)))
+                .andExpect(jsonPath("$.[*].exerciseID").value(hasItem(DEFAULT_EXERCISE_ID)));
+
+        // Check, that the count call also returns 1
+        restLikesMockMvc.perform(get("/api/likes/count?sort=id,desc&" + filter)).andExpect(status().isOk())
+                .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)).andExpect(content().string("1"));
+    }
+
+    /**
+     * Executes the search, and checks that the default entity is not returned.
+     */
+    private void defaultLikesShouldNotBeFound(String filter) throws Exception {
+        restLikesMockMvc.perform(get("/api/likes?sort=id,desc&" + filter)).andExpect(status().isOk())
+                .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)).andExpect(jsonPath("$").isArray())
+                .andExpect(jsonPath("$").isEmpty());
+
+        // Check, that the count call also returns 0
+        restLikesMockMvc.perform(get("/api/likes/count?sort=id,desc&" + filter)).andExpect(status().isOk())
+                .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)).andExpect(content().string("0"));
+    }
+
+    @Test
+    @Transactional
+    public void getNonExistingLikes() throws Exception {
+        // Get the likes
+        restLikesMockMvc.perform(get("/api/likes/{id}", Long.MAX_VALUE)).andExpect(status().isNotFound());
+    }
+
+    @Test
+    @Transactional
+    public void updateLikes() throws Exception {
+        // Initialize the database
+        likesService.save(likes);
+
+        int databaseSizeBeforeUpdate = likesRepository.findAll().size();
+
+        // Update the likes
+        Likes updatedLikes = likesRepository.findById(likes.getId()).get();
+        // Disconnect from session so that the updates on updatedLikes are not directly
+        // saved in db
+        em.detach(updatedLikes);
+        updatedLikes.date(UPDATED_DATE).userID(UPDATED_USER_ID).exerciseID(UPDATED_EXERCISE_ID);
+
+        restLikesMockMvc.perform(put("/api/likes").with(csrf().asHeader()).contentType(MediaType.APPLICATION_JSON)
+                .content(TestUtil.convertObjectToJsonBytes(updatedLikes))).andExpect(status().isOk());
+
+        // Validate the Likes in the database
+        List<Likes> likesList = likesRepository.findAll();
+        assertThat(likesList).hasSize(databaseSizeBeforeUpdate);
+        Likes testLikes = likesList.get(likesList.size() - 1);
+        assertThat(testLikes.getDate()).isEqualTo(UPDATED_DATE);
+        assertThat(testLikes.getUserID()).isEqualTo(UPDATED_USER_ID);
+        assertThat(testLikes.getExerciseID()).isEqualTo(UPDATED_EXERCISE_ID);
+
+        // Validate the Likes in Elasticsearch
+        verify(mockLikesSearchRepository, times(2)).save(testLikes);
+    }
+
+    @Test
+    @Transactional
+    public void updateNonExistingLikes() throws Exception {
+        int databaseSizeBeforeUpdate = likesRepository.findAll().size();
+
+        // If the entity doesn't have an ID, it will throw BadRequestAlertException
+        restLikesMockMvc.perform(put("/api/likes").with(csrf().asHeader()).contentType(MediaType.APPLICATION_JSON)
+                .content(TestUtil.convertObjectToJsonBytes(likes))).andExpect(status().isBadRequest());
+
+        // Validate the Likes in the database
+        List<Likes> likesList = likesRepository.findAll();
+        assertThat(likesList).hasSize(databaseSizeBeforeUpdate);
+
+        // Validate the Likes in Elasticsearch
+        verify(mockLikesSearchRepository, times(0)).save(likes);
+    }
+
+    @Test
+    @Transactional
+    public void deleteLikes() throws Exception {
+        // Initialize the database
+        likesService.save(likes);
+
+        int databaseSizeBeforeDelete = likesRepository.findAll().size();
+
+        // Delete the likes
+        restLikesMockMvc.perform(
+                delete("/api/likes/{id}", likes.getId()).with(csrf().asHeader()).accept(MediaType.APPLICATION_JSON))
+                .andExpect(status().isNoContent());
+
+        // Validate the database contains one less item
+        List<Likes> likesList = likesRepository.findAll();
+        assertThat(likesList).hasSize(databaseSizeBeforeDelete - 1);
+
+        // Validate the Likes in Elasticsearch
+        verify(mockLikesSearchRepository, times(1)).deleteById(likes.getId());
+    }
+
+    @Test
+    @Transactional
+    public void searchLikes() throws Exception {
+        // Configure the mock search repository
+        // Initialize the database
+        likesService.save(likes);
+        when(mockLikesSearchRepository.search(queryStringQuery("id:" + likes.getId())))
+                .thenReturn(Collections.singletonList(likes));
+
+        // Search the likes
+        restLikesMockMvc.perform(get("/api/_search/likes?query=id:" + likes.getId())).andExpect(status().isOk())
+                .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE))
+                .andExpect(jsonPath("$.[*].id").value(hasItem(likes.getId().intValue())))
+                .andExpect(jsonPath("$.[*].date").value(hasItem(DEFAULT_DATE.toString())))
+                .andExpect(jsonPath("$.[*].userID").value(hasItem(DEFAULT_USER_ID)))
+                .andExpect(jsonPath("$.[*].exerciseID").value(hasItem(DEFAULT_EXERCISE_ID)));
+    }
+}
diff --git a/src/test/java/at/ac/uibk/gitsearch/web/rest/PluginInterfaceResourceIT.java b/src/test/java/at/ac/uibk/gitsearch/web/rest/PluginInterfaceResourceIT.java
index 31e3e8c4f1087067c752f0982afb349da564d8ac..105a68e13f67df95db533a7583beb857d88a7ead 100644
--- a/src/test/java/at/ac/uibk/gitsearch/web/rest/PluginInterfaceResourceIT.java
+++ b/src/test/java/at/ac/uibk/gitsearch/web/rest/PluginInterfaceResourceIT.java
@@ -9,7 +9,11 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.
 import java.io.IOException;
 
 import org.codeability.sharing.plugins.api.UserPrincipal;
+import org.codeability.sharing.plugins.api.search.SearchInputDTO;
+import org.codeability.sharing.plugins.api.search.SearchInputMetadataDTO;
 import org.codeability.sharing.plugins.api.search.SearchRequestDTO;
+import org.codeability.sharing.plugins.api.search.SearchResultDTO;
+import org.codeability.sharing.plugins.api.search.SearchResultsDTO;
 import org.elasticsearch.node.NodeValidationException;
 import org.junit.Assert;
 import org.junit.jupiter.api.BeforeAll;
@@ -28,13 +32,7 @@ import at.ac.uibk.gitsearch.security.AuthoritiesConstants;
 import at.ac.uibk.gitsearch.service.SearchService;
 import at.ac.uibk.gitsearch.service.ShoppingBasketService.ShoppingBasketInfoDTO;
 import at.ac.uibk.gitsearch.service.ShoppingBasketService.ShoppingBasketRedirectInfoDTO;
-import at.ac.uibk.gitsearch.service.dto.SearchInputDTO;
-import at.ac.uibk.gitsearch.service.dto.SearchInputMetadataDTO;
-import at.ac.uibk.gitsearch.service.dto.SearchResultDTO;
-import at.ac.uibk.gitsearch.service.dto.SearchResultsDTO;
-import at.ac.uibk.gitsearch.web.rest.PluginInterfaceResource.PluginSearchInputDTOMapper;
 import at.ac.uibk.gitsearch.web.rest.PluginInterfaceResource.SearchResultsDTOMapper;
-import io.jsonwebtoken.lang.Collections;
 
 /**
  * Integration tests for the {@link PluginInterfaceResource} REST controller.
@@ -67,7 +65,7 @@ public class PluginInterfaceResourceIT {
     	// just load everything from index :-)
 		final SearchInputMetadataDTO searchMetadata = new SearchInputMetadataDTO(null, null, null, null, null,null);
 		SearchInputDTO searchQuery = new SearchInputDTO(null, searchMetadata, null, null, null, 0);
-		SearchResultsDTO searchResultPage = searchService.searchResultPage(searchQuery, SearchInputDTO.PAGE_SIZE);
+		SearchResultsDTO searchResultPage = searchService.searchResultPage(searchQuery);
 		Assert.assertTrue("At least one hit?", searchResultPage.getSearchResult().size() >= 1);
     	
     	ShoppingBasketInfoDTO sbi = new ShoppingBasketInfoDTO(searchResultPage.getSearchResult().toArray(new SearchResultDTO[] {}));
@@ -93,7 +91,7 @@ public class PluginInterfaceResourceIT {
     	
     	// searches for all :-)
     	
-		final org.codeability.sharing.plugins.api.search.SearchInputMetadataDTO searchMetadata = new org.codeability.sharing.plugins.api.search.SearchInputMetadataDTO(null, null, null, null, null);
+		final org.codeability.sharing.plugins.api.search.SearchInputMetadataDTO searchMetadata = new org.codeability.sharing.plugins.api.search.SearchInputMetadataDTO(null, null, null, null, null, null);
 		final org.codeability.sharing.plugins.api.search.SearchInputDTO searchQuery = new org.codeability.sharing.plugins.api.search.SearchInputDTO(null, searchMetadata, null, null, null, 0);
 
 		// This test may fail, if token is expired!
@@ -117,7 +115,7 @@ public class PluginInterfaceResourceIT {
     	
     	// searches for all :-)
     	
-		final org.codeability.sharing.plugins.api.search.SearchInputMetadataDTO searchMetadata = new org.codeability.sharing.plugins.api.search.SearchInputMetadataDTO(null, null, null, null, null);
+		final org.codeability.sharing.plugins.api.search.SearchInputMetadataDTO searchMetadata = new org.codeability.sharing.plugins.api.search.SearchInputMetadataDTO(null, null, null, null, null, null);
 		final org.codeability.sharing.plugins.api.search.SearchInputDTO searchQuery = new org.codeability.sharing.plugins.api.search.SearchInputDTO(null, searchMetadata, null, null, null, 0);
 
 		// This test may fail, if token is expired!
@@ -132,31 +130,11 @@ public class PluginInterfaceResourceIT {
             .andExpect(TestUtil.testResult(org.codeability.sharing.plugins.api.search.SearchResultsDTO.class, 
             			result -> {
             				// not really a good test :-(
-            				assertTrue("Currently only one public result", result.getSearchResult().size() == 1);
+            				assertTrue("Currently some public result", result.getSearchResult().size() >= 3);
 //            				result.getSearchResult().forEach(r -> r.getProject()..getNamespace());
             			}));
     }
     
-    /**
-     * just a simple test of the input mapper
-     */
-    @Test
-    public void testSearchInputMapper() {
-    	
-    	final PluginSearchInputDTOMapper inputQueryMapper = PluginSearchInputDTOMapper.INSTANCE;
-
-		final org.codeability.sharing.plugins.api.search.SearchInputMetadataDTO searchMetadata = new org.codeability.sharing.plugins.api.search.SearchInputMetadataDTO(null, "testKeyWord1 testKeyword2", null, null, null);
-		@SuppressWarnings("unchecked")
-		org.codeability.sharing.plugins.api.search.SearchInputDTO searchQuery = new org.codeability.sharing.plugins.api.search.SearchInputDTO("fullText", searchMetadata, null, null, Collections.arrayToList(new String[] {"pdf", "txt"}), 25);
-		
-		SearchInputDTO mappedSearchQuery = inputQueryMapper.searchInputFromPlugin(searchQuery);
-		
-		// punktuelle Tests
-		Assert.assertEquals(mappedSearchQuery.getMetadata().getKeyword(), searchQuery.getMetadata().getKeyword());
-		Assert.assertEquals(mappedSearchQuery.getPage(), searchQuery.getPage());
-		Assert.assertEquals(mappedSearchQuery.getFulltextQuery(), searchQuery.getFulltextQuery());
-		Assert.assertEquals(mappedSearchQuery.getSelectedFileFormat(), searchQuery.getSelectedFileFormat());
-    }
 
     /**
      * just a simple test of the results mapper
@@ -169,7 +147,7 @@ public class PluginInterfaceResourceIT {
     	// just load everything from index :-)
 		final SearchInputMetadataDTO searchMetadata = new SearchInputMetadataDTO(null, null, null, null, null,null);
 		SearchInputDTO searchQuery = new SearchInputDTO(null, searchMetadata, null, null, null, 0);
-		SearchResultsDTO results = searchService.searchResultPage(searchQuery, SearchInputDTO.PAGE_SIZE);
+		SearchResultsDTO results = searchService.searchResultPage(searchQuery);
 		Assert.assertTrue("At least one hit?", results.getSearchResult().size() >= 1);
 
 		org.codeability.sharing.plugins.api.search.SearchResultsDTO mappedResults = resultsMapper.searchResultsToPlugin(results);
diff --git a/src/test/java/at/ac/uibk/gitsearch/web/rest/SavedSearchesResourceIT.java b/src/test/java/at/ac/uibk/gitsearch/web/rest/SavedSearchesResourceIT.java
index bd4d3c2c6a569fec7d765d721b43e656e46f3520..b42e17daaa3aa4af37da7774233b4dabbfcb339d 100644
--- a/src/test/java/at/ac/uibk/gitsearch/web/rest/SavedSearchesResourceIT.java
+++ b/src/test/java/at/ac/uibk/gitsearch/web/rest/SavedSearchesResourceIT.java
@@ -12,7 +12,6 @@ import at.ac.uibk.gitsearch.service.mapper.SavedSearchesMapper;
 
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
-import org.mockito.Mock;
 import org.junit.jupiter.api.extension.ExtendWith;
 import org.mockito.junit.jupiter.MockitoExtension;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -57,7 +56,8 @@ public class SavedSearchesResourceIT {
     @Autowired
     private SavedSearchesMapper savedSearchesMapper;
 
-    @Autowired
+    @SuppressWarnings("unused")
+	@Autowired
     private SavedSearchesService savedSearchesService;
 
     /**
@@ -90,7 +90,7 @@ public class SavedSearchesResourceIT {
         User user = UserResourceIT.createEntity(em);
         em.persist(user);
         em.flush();
-        savedSearches.setUserId(user);
+        savedSearches.setUser(user);
         return savedSearches;
     }
     /**
@@ -107,7 +107,7 @@ public class SavedSearchesResourceIT {
         User user = UserResourceIT.createEntity(em);
         em.persist(user);
         em.flush();
-        savedSearches.setUserId(user);
+        savedSearches.setUser(user);
         return savedSearches;
     }
 
diff --git a/src/test/java/at/ac/uibk/gitsearch/web/rest/SearchResourceIT.java b/src/test/java/at/ac/uibk/gitsearch/web/rest/SearchResourceIT.java
index b950879a5a0db44fd24fe4d12b128e8b6df7531a..ab6d1e85ba2bbae9b19af5220e74c89d554bd6f0 100644
--- a/src/test/java/at/ac/uibk/gitsearch/web/rest/SearchResourceIT.java
+++ b/src/test/java/at/ac/uibk/gitsearch/web/rest/SearchResourceIT.java
@@ -32,7 +32,7 @@ import at.ac.uibk.gitsearch.web.rest.ExerciseResourceIT.StreamResultMatcher;
  * Integration tests for the {@link UserResource} REST controller.
  */
 @AutoConfigureMockMvc
-@WithMockUser(authorities = AuthoritiesConstants.USER)
+@WithMockUser(authorities = {AuthoritiesConstants.USER, "sharing"})
 @SpringBootTest(classes = GitsearchApp.class)
 public class SearchResourceIT {
 
@@ -78,14 +78,14 @@ public class SearchResourceIT {
     	   .andExpect(content().contentType(MediaType.APPLICATION_JSON))
             .andExpect(status().isOk())
     		.andExpect(TestUtil.testResult(AutoCompleteEntry[].class, r -> {
-				assertThat(r, Matchers.hasItemInArray(hasProperty("target", is("Java"))));
+				assertThat(r, Matchers.hasItemInArray(hasProperty("target", is("JAVA"))));
     		}));
     }
 
     @Test
     public void getREADME() throws Exception {
-    	String projectId = "3"; // warning: this depends on the sequence in the current search index :-(
-    	restSearchMockMvc.perform(post("/api/programming-exercises/"+projectId+"/export-programming-exercise")
+    	String exerciseId = "3"; // warning: this depends on the sequence in the current search index :-(
+    	restSearchMockMvc.perform(post("/api/programming-exercises/"+exerciseId+"/export-programming-exercise")
             	.with(csrf().asHeader())
             .contentType(MediaType.APPLICATION_JSON))
 //    		.andDo(print())
diff --git a/src/test/java/at/ac/uibk/gitsearch/web/rest/StatisticsResourceIT.java b/src/test/java/at/ac/uibk/gitsearch/web/rest/StatisticsResourceIT.java
index 4332e63f3059db0564df3eac44a826ed31198edd..86068224e7e9829937650a371279eea8b0d54bba 100644
--- a/src/test/java/at/ac/uibk/gitsearch/web/rest/StatisticsResourceIT.java
+++ b/src/test/java/at/ac/uibk/gitsearch/web/rest/StatisticsResourceIT.java
@@ -27,6 +27,8 @@ import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.ValueSource;
 import org.mockito.junit.jupiter.MockitoExtension;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
@@ -63,8 +65,8 @@ public class StatisticsResourceIT {
     private static final Integer DEFAULT_DOWNLOADS = 1;
     private static final Integer UPDATED_DOWNLOADS = 2;
 
-    private static final Long DEFAULT_EXERCISE_ID = (long) 1;
-    private static final Long UPDATED_EXERCISE_ID = (long) 2;
+    private static final String DEFAULT_EXERCISE_ID = "1";
+    private static final String UPDATED_EXERCISE_ID = "2";
     
     final String publicGitLabProjectId = "3";
 
@@ -189,7 +191,7 @@ public class StatisticsResourceIT {
                 .andExpect(jsonPath("$.[*].id").value(hasItem(statistics.getId().intValue())))
                 .andExpect(jsonPath("$.[*].views").value(hasItem(DEFAULT_VIEWS)))
                 .andExpect(jsonPath("$.[*].downloads").value(hasItem((int)(long)DEFAULT_DOWNLOADS)))
-                .andExpect(jsonPath("$.[*].exerciseID").value(hasItem(DEFAULT_EXERCISE_ID.intValue())));
+                .andExpect(jsonPath("$.[*].exerciseID").value(hasItem(DEFAULT_EXERCISE_ID)));
     }
 
     @Test
@@ -307,7 +309,7 @@ public class StatisticsResourceIT {
                 .andExpect(jsonPath("$.[*].id").value(hasItem(statistics.getId().intValue())))
                 .andExpect(jsonPath("$.[*].views").value(hasItem(DEFAULT_VIEWS)))
                 .andExpect(jsonPath("$.[*].downloads").value(hasItem(DEFAULT_DOWNLOADS)))
-                .andExpect(jsonPath("$.[*].exerciseID").value(hasItem(DEFAULT_EXERCISE_ID.intValue())));
+                .andExpect(jsonPath("$.[*].exerciseID").value(hasItem(DEFAULT_EXERCISE_ID)));
     }
 
     @Test
@@ -322,19 +324,20 @@ public class StatisticsResourceIT {
     }
 
 
-    @Test
+    @ParameterizedTest
+    @ValueSource(strings = {"3", "3:with/path"})
     @Transactional
     @WithMockUser(authorities = AuthoritiesConstants.ADMIN)
-    public void createStatisticsByExerciseId() throws Exception {
+    public void createStatisticsByExerciseId(String exerciseId) throws Exception {
         // Initialize the database
         statisticsRepository.saveAndFlush(statistics);
 
-        restStatisticsMockMvc.perform(get("/api/statistics/exercise/{id}", publicGitLabProjectId).with(csrf().asHeader())).andExpect(status().isOk())
+        restStatisticsMockMvc.perform(get("/api/statistics/exercise/{id}", exerciseId).with(csrf().asHeader())).andExpect(status().isOk())
                 .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE))
-                .andExpect(jsonPath("$.exerciseID").value(publicGitLabProjectId));
+                .andExpect(jsonPath("$.exerciseID").value(exerciseId));
         
         // Get the statistics and see if it is found
-        assertEquals(3L,statisticsService.findOneByExerciseID( 3L).get().getExerciseID());
+        assertEquals(exerciseId,statisticsService.findOneByExerciseID(exerciseId).get().getExerciseID());
     }
 
 
diff --git a/src/test/java/at/ac/uibk/gitsearch/web/rest/UserWatchListResourceIT.java b/src/test/java/at/ac/uibk/gitsearch/web/rest/UserWatchListResourceIT.java
index fae6bfb4b6900aaeee5f254182141f1d050a2009..207155da33922c67d94dda42ec8a3c9f7a514c56 100644
--- a/src/test/java/at/ac/uibk/gitsearch/web/rest/UserWatchListResourceIT.java
+++ b/src/test/java/at/ac/uibk/gitsearch/web/rest/UserWatchListResourceIT.java
@@ -24,18 +24,18 @@ import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMock
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.http.MediaType;
 import org.springframework.security.test.context.support.WithMockUser;
+import org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors;
 import org.springframework.test.web.servlet.MockMvc;
 import org.springframework.transaction.annotation.Transactional;
 
 import at.ac.uibk.gitsearch.GitsearchApp;
 import at.ac.uibk.gitsearch.domain.User;
 import at.ac.uibk.gitsearch.domain.UserWatchList;
+import at.ac.uibk.gitsearch.domain.enumeration.CheckFrequency;
 import at.ac.uibk.gitsearch.repository.UserWatchListRepository;
 import at.ac.uibk.gitsearch.security.AuthoritiesConstants;
-import at.ac.uibk.gitsearch.service.UserWatchListService;
 import at.ac.uibk.gitsearch.service.dto.UserWatchListDTO;
 import at.ac.uibk.gitsearch.service.mapper.UserWatchListMapper;
-
 /**
  * Integration tests for the {@link UserWatchListResource} REST controller.
  */
@@ -48,16 +48,15 @@ public class UserWatchListResourceIT {
     private static final String DEFAULT_NAME = "AAAAAAAAAA";
     private static final String UPDATED_NAME = "BBBBBBBBBB";
 
+    private static final CheckFrequency DEFAULT_CHECK_FREQUENCY = CheckFrequency.NEVER;
+    private static final CheckFrequency UPDATED_CHECK_FREQUENCY = CheckFrequency.DAILY;
+
     @Autowired
     private UserWatchListRepository userWatchListRepository;
 
     @Autowired
     private UserWatchListMapper userWatchListMapper;
 
-    @Autowired
-    private UserWatchListService userWatchListService;
-
-
     @Autowired
     private EntityManager em;
 
@@ -74,12 +73,13 @@ public class UserWatchListResourceIT {
      */
     public static UserWatchList createEntity(EntityManager em) {
         UserWatchList userWatchList = new UserWatchList()
-            .name(DEFAULT_NAME);
+            .name(DEFAULT_NAME)
+            .checkFrequency(DEFAULT_CHECK_FREQUENCY);
         // Add required entity
         User user = UserResourceIT.createEntity(em);
         em.persist(user);
         em.flush();
-        userWatchList.setUserId(user);
+        userWatchList.setUser(user);
         return userWatchList;
     }
     /**
@@ -90,12 +90,13 @@ public class UserWatchListResourceIT {
      */
     public static UserWatchList createUpdatedEntity(EntityManager em) {
         UserWatchList userWatchList = new UserWatchList()
-            .name(UPDATED_NAME);
+            .name(UPDATED_NAME)
+            .checkFrequency(UPDATED_CHECK_FREQUENCY);
         // Add required entity
         User user = UserResourceIT.createEntity(em);
         em.persist(user);
         em.flush();
-        userWatchList.setUserId(user);
+        userWatchList.setUser(user);
         return userWatchList;
     }
 
@@ -121,6 +122,7 @@ public class UserWatchListResourceIT {
         assertThat(userWatchListList).hasSize(databaseSizeBeforeCreate + 1);
         UserWatchList testUserWatchList = userWatchListList.get(userWatchListList.size() - 1);
         assertThat(testUserWatchList.getName()).isEqualTo(DEFAULT_NAME);
+        assertThat(testUserWatchList.getCheckFrequency()).isEqualTo(DEFAULT_CHECK_FREQUENCY);
 
     }
 
@@ -168,6 +170,27 @@ public class UserWatchListResourceIT {
         assertThat(userWatchListList).hasSize(databaseSizeBeforeTest);
     }
 
+    @Test
+    @Transactional
+    public void checkCheckFrequencyIsRequired() throws Exception {
+        int databaseSizeBeforeTest = userWatchListRepository.findAll().size();
+        // set the field null
+        userWatchList.setCheckFrequency(null);
+
+        // Create the UserWatchList, which fails.
+        UserWatchListDTO userWatchListDTO = userWatchListMapper.toDto(userWatchList);
+
+
+        restUserWatchListMockMvc.perform(post("/api/user-watch-lists")
+          	.with(csrf().asHeader())
+            .contentType(MediaType.APPLICATION_JSON)
+            .content(TestUtil.convertObjectToJsonBytes(userWatchListDTO)))
+            .andExpect(status().isBadRequest());
+
+        List<UserWatchList> userWatchListList = userWatchListRepository.findAll();
+        assertThat(userWatchListList).hasSize(databaseSizeBeforeTest);
+    }
+
     @Test
     @Transactional
     public void getAllUserWatchLists() throws Exception {
@@ -179,7 +202,8 @@ public class UserWatchListResourceIT {
             .andExpect(status().isOk())
             .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE))
             .andExpect(jsonPath("$.[*].id").value(hasItem(userWatchList.getId().intValue())))
-            .andExpect(jsonPath("$.[*].name").value(hasItem(DEFAULT_NAME)));
+            .andExpect(jsonPath("$.[*].name").value(hasItem(DEFAULT_NAME)))
+            .andExpect(jsonPath("$.[*].checkFrequency").value(hasItem(DEFAULT_CHECK_FREQUENCY.toString())));
     }
     
     @Test
@@ -193,7 +217,8 @@ public class UserWatchListResourceIT {
             .andExpect(status().isOk())
             .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE))
             .andExpect(jsonPath("$.id").value(userWatchList.getId().intValue()))
-            .andExpect(jsonPath("$.name").value(DEFAULT_NAME));
+            .andExpect(jsonPath("$.name").value(DEFAULT_NAME))
+            .andExpect(jsonPath("$.checkFrequency").value(DEFAULT_CHECK_FREQUENCY.toString()));
     }
 
 
@@ -294,33 +319,90 @@ public class UserWatchListResourceIT {
     }
 
 
+    @Test
+    @Transactional
+    public void getAllUserWatchListsByCheckFrequencyIsEqualToSomething() throws Exception {
+        // Initialize the database
+        userWatchListRepository.saveAndFlush(userWatchList);
+
+        // Get all the userWatchListList where checkFrequency equals to DEFAULT_CHECK_FREQUENCY
+        defaultUserWatchListShouldBeFound("checkFrequency.equals=" + DEFAULT_CHECK_FREQUENCY);
+
+        // Get all the userWatchListList where checkFrequency equals to UPDATED_CHECK_FREQUENCY
+        defaultUserWatchListShouldNotBeFound("checkFrequency.equals=" + UPDATED_CHECK_FREQUENCY);
+    }
+
+    @Test
+    @Transactional
+    public void getAllUserWatchListsByCheckFrequencyIsNotEqualToSomething() throws Exception {
+        // Initialize the database
+        userWatchListRepository.saveAndFlush(userWatchList);
+
+        // Get all the userWatchListList where checkFrequency not equals to DEFAULT_CHECK_FREQUENCY
+        defaultUserWatchListShouldNotBeFound("checkFrequency.notEquals=" + DEFAULT_CHECK_FREQUENCY);
+
+        // Get all the userWatchListList where checkFrequency not equals to UPDATED_CHECK_FREQUENCY
+        defaultUserWatchListShouldBeFound("checkFrequency.notEquals=" + UPDATED_CHECK_FREQUENCY);
+    }
+
+    @Test
+    @Transactional
+    public void getAllUserWatchListsByCheckFrequencyIsInShouldWork() throws Exception {
+        // Initialize the database
+        userWatchListRepository.saveAndFlush(userWatchList);
+
+        // Get all the userWatchListList where checkFrequency in DEFAULT_CHECK_FREQUENCY or UPDATED_CHECK_FREQUENCY
+        defaultUserWatchListShouldBeFound("checkFrequency.in=" + DEFAULT_CHECK_FREQUENCY + "," + UPDATED_CHECK_FREQUENCY);
+
+        // Get all the userWatchListList where checkFrequency equals to UPDATED_CHECK_FREQUENCY
+        defaultUserWatchListShouldNotBeFound("checkFrequency.in=" + UPDATED_CHECK_FREQUENCY);
+    }
+
+    @Test
+    @Transactional
+    public void getAllUserWatchListsByCheckFrequencyIsNullOrNotNull() throws Exception {
+        // Initialize the database
+        userWatchListRepository.saveAndFlush(userWatchList);
+
+        // Get all the userWatchListList where checkFrequency is not null
+        defaultUserWatchListShouldBeFound("checkFrequency.specified=true");
+
+        // Get all the userWatchListList where checkFrequency is null
+        defaultUserWatchListShouldNotBeFound("checkFrequency.specified=false");
+    }
+
     @Test
     @Transactional
     public void getAllUserWatchListsByUserIdIsEqualToSomething() throws Exception {
         // Get already existing entity
-        User userId = userWatchList.getUserId();
+        User user = userWatchList.getUser();
         userWatchListRepository.saveAndFlush(userWatchList);
-        Long userIdId = userId.getId();
+        Long userId = user.getId();
 
-        // Get all the userWatchListList where userId equals to userIdId
-        defaultUserWatchListShouldBeFound("userIdId.equals=" + userIdId);
+        // Get all the userWatchListList where userId equals to userId
+        defaultUserWatchListShouldBeFound("userId.equals=" + userId);
 
-        // Get all the userWatchListList where userId equals to userIdId + 1
-        defaultUserWatchListShouldNotBeFound("userIdId.equals=" + (userIdId + 1));
+        // Get all the userWatchListList where userId equals to userId + 1
+        defaultUserWatchListShouldNotBeFound("userId.equals=" + (userId + 1));
     }
 
     /**
      * Executes the search, and checks that the default entity is returned.
      */
     private void defaultUserWatchListShouldBeFound(String filter) throws Exception {
-        restUserWatchListMockMvc.perform(get("/api/user-watch-lists?sort=id,desc&" + filter))
+        restUserWatchListMockMvc.perform(get("/api/user-watch-lists?sort=id,desc&" + filter) 
+        		.with(csrf().asHeader())
+        		)
             .andExpect(status().isOk())
             .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE))
             .andExpect(jsonPath("$.[*].id").value(hasItem(userWatchList.getId().intValue())))
-            .andExpect(jsonPath("$.[*].name").value(hasItem(DEFAULT_NAME)));
+            .andExpect(jsonPath("$.[*].name").value(hasItem(DEFAULT_NAME)))
+            .andExpect(jsonPath("$.[*].checkFrequency").value(hasItem(DEFAULT_CHECK_FREQUENCY.toString())));
 
         // Check, that the count call also returns 1
-        restUserWatchListMockMvc.perform(get("/api/user-watch-lists/count?sort=id,desc&" + filter))
+        restUserWatchListMockMvc.perform(get("/api/user-watch-lists/count?sort=id,desc&" + filter)               	
+        		.with(csrf().asHeader())
+        	)
             .andExpect(status().isOk())
             .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE))
             .andExpect(content().string("1"));
@@ -330,14 +412,18 @@ public class UserWatchListResourceIT {
      * Executes the search, and checks that the default entity is not returned.
      */
     private void defaultUserWatchListShouldNotBeFound(String filter) throws Exception {
-        restUserWatchListMockMvc.perform(get("/api/user-watch-lists?sort=id,desc&" + filter))
+        restUserWatchListMockMvc.perform(get("/api/user-watch-lists?sort=id,desc&" + filter)           	.with(csrf().asHeader())
+               	.with(csrf().asHeader())
+        		)
             .andExpect(status().isOk())
             .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE))
             .andExpect(jsonPath("$").isArray())
             .andExpect(jsonPath("$").isEmpty());
 
         // Check, that the count call also returns 0
-        restUserWatchListMockMvc.perform(get("/api/user-watch-lists/count?sort=id,desc&" + filter))
+        restUserWatchListMockMvc.perform(get("/api/user-watch-lists/count?sort=id,desc&" + filter)
+               	.with(csrf().asHeader())
+)
             .andExpect(status().isOk())
             .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE))
             .andExpect(content().string("0"));
@@ -364,7 +450,8 @@ public class UserWatchListResourceIT {
         // Disconnect from session so that the updates on updatedUserWatchList are not directly saved in db
         em.detach(updatedUserWatchList);
         updatedUserWatchList
-            .name(UPDATED_NAME);
+            .name(UPDATED_NAME)
+            .checkFrequency(UPDATED_CHECK_FREQUENCY);
         UserWatchListDTO userWatchListDTO = userWatchListMapper.toDto(updatedUserWatchList);
 
         restUserWatchListMockMvc.perform(put("/api/user-watch-lists")
@@ -378,7 +465,7 @@ public class UserWatchListResourceIT {
         assertThat(userWatchListList).hasSize(databaseSizeBeforeUpdate);
         UserWatchList testUserWatchList = userWatchListList.get(userWatchListList.size() - 1);
         assertThat(testUserWatchList.getName()).isEqualTo(UPDATED_NAME);
-
+        assertThat(testUserWatchList.getCheckFrequency()).isEqualTo(UPDATED_CHECK_FREQUENCY);
     }
 
     @Test
@@ -405,7 +492,7 @@ public class UserWatchListResourceIT {
 
     @Test
     @Transactional
-    public void updatChangeUserWatchListWithoutId() throws Exception {
+    public void updateChangeUserWatchListWithoutId() throws Exception {
         int databaseSizeBeforeUpdate = userWatchListRepository.findAll().size();
 
         // Create the UserWatchList
@@ -441,6 +528,27 @@ public class UserWatchListResourceIT {
         // Validate the database contains one less item
         List<UserWatchList> userWatchListList = userWatchListRepository.findAll();
         assertThat(userWatchListList).hasSize(databaseSizeBeforeDelete - 1);
+    }
+    
+    @Test
+    @Transactional
+    public void createUserWatchListForCurrentUser() throws Exception {
+    	final UserWatchListDTO userWatchListDTO = userWatchListMapper.toDto(userWatchList);
+
+    	int databaseSizeBeforeCreate = userWatchListRepository.findAll().size();
+        // Delete the userWatchList
+        restUserWatchListMockMvc.perform(post("/api/currentuser-watch-lists", userWatchListDTO)
+        	.with(SecurityMockMvcRequestPostProcessors.user(userWatchList.getUser().getLogin()))
+           	.with(csrf().asHeader())
+            .accept(MediaType.APPLICATION_JSON)
+            .contentType(MediaType.APPLICATION_JSON)
+        	.content(TestUtil.convertObjectToJsonBytes(userWatchListDTO)))
+			.andExpect(status().isCreated());
 
+        // Validate the database contains this watchlist
+        List<UserWatchList> userWatchListList = userWatchListRepository.findAll();
+        
+        assertThat(userWatchListList).hasSize(databaseSizeBeforeCreate + 1);
     }
+
 }
diff --git a/src/test/java/at/ac/uibk/gitsearch/web/rest/WatchListEntryResourceIT.java b/src/test/java/at/ac/uibk/gitsearch/web/rest/WatchListEntryResourceIT.java
index acbe8451f287a949839e2122c8be5f83454d9648..e4f45be189151e79809dbc423239dbe0946df695 100644
--- a/src/test/java/at/ac/uibk/gitsearch/web/rest/WatchListEntryResourceIT.java
+++ b/src/test/java/at/ac/uibk/gitsearch/web/rest/WatchListEntryResourceIT.java
@@ -64,7 +64,8 @@ public class WatchListEntryResourceIT {
     @Autowired
     private WatchListEntryMapper watchListEntryMapper;
 
-    @Autowired
+    @SuppressWarnings("unused")
+	@Autowired
     private WatchListEntryService watchListEntryService;
 
     /**
diff --git a/src/test/java/at/ac/uibk/gitsearch/web/rest/util/HeaderUtil.java b/src/test/java/at/ac/uibk/gitsearch/web/rest/util/HeaderUtil.java
index ea50490db7fe17edea0af0ced365fa20b5c7a0e0..e265c5ec14537ef2f7e4c41464f50d66023d0d26 100644
--- a/src/test/java/at/ac/uibk/gitsearch/web/rest/util/HeaderUtil.java
+++ b/src/test/java/at/ac/uibk/gitsearch/web/rest/util/HeaderUtil.java
@@ -13,7 +13,8 @@ import org.springframework.http.MediaType;
  */
 public final class HeaderUtil {
 
-    private static final Logger log = LoggerFactory.getLogger(HeaderUtil.class);
+    @SuppressWarnings("unused")
+	private static final Logger log = LoggerFactory.getLogger(HeaderUtil.class);
 
     private HeaderUtil() {
     }
@@ -49,7 +50,12 @@ public final class HeaderUtil {
     public static HttpHeaders createAuthorization(String username, String password) {
         HttpHeaders acceptHeaders = new HttpHeaders() {
 
-            {
+            /**
+			 * 
+			 */
+			private static final long serialVersionUID = 1L;
+
+			{
                 set(com.google.common.net.HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON.toString());
                 set(com.google.common.net.HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON.toString());
             }
diff --git a/src/test/javascript/e2e/entities/likes/likes.page-object.ts b/src/test/javascript/e2e/entities/likes/likes.page-object.ts
new file mode 100644
index 0000000000000000000000000000000000000000..761c64aca1137efe518b1cb33d7855652d699777
--- /dev/null
+++ b/src/test/javascript/e2e/entities/likes/likes.page-object.ts
@@ -0,0 +1,88 @@
+import { element, by, ElementFinder } from 'protractor';
+
+export class LikesComponentsPage {
+  createButton = element(by.id('jh-create-entity'));
+  deleteButtons = element.all(by.css('jhi-likes div table .btn-danger'));
+  title = element.all(by.css('jhi-likes div h2#page-heading span')).first();
+  noResult = element(by.id('no-result'));
+  entities = element(by.id('entities'));
+
+  async clickOnCreateButton(): Promise<void> {
+    await this.createButton.click();
+  }
+
+  async clickOnLastDeleteButton(): Promise<void> {
+    await this.deleteButtons.last().click();
+  }
+
+  async countDeleteButtons(): Promise<number> {
+    return this.deleteButtons.count();
+  }
+
+  async getTitle(): Promise<string> {
+    return this.title.getAttribute('jhiTranslate');
+  }
+}
+
+export class LikesUpdatePage {
+  pageTitle = element(by.id('jhi-likes-heading'));
+  saveButton = element(by.id('save-entity'));
+  cancelButton = element(by.id('cancel-save'));
+
+  dateInput = element(by.id('field_date'));
+  userIDInput = element(by.id('field_userID'));
+  projectIDInput = element(by.id('field_projectID'));
+
+  async getPageTitle(): Promise<string> {
+    return this.pageTitle.getAttribute('jhiTranslate');
+  }
+
+  async setDateInput(date: string): Promise<void> {
+    await this.dateInput.sendKeys(date);
+  }
+
+  async getDateInput(): Promise<string> {
+    return await this.dateInput.getAttribute('value');
+  }
+
+  async setUserIDInput(userID: string): Promise<void> {
+    await this.userIDInput.sendKeys(userID);
+  }
+
+  async getUserIDInput(): Promise<string> {
+    return await this.userIDInput.getAttribute('value');
+  }
+
+  async setProjectIDInput(projectID: string): Promise<void> {
+    await this.projectIDInput.sendKeys(projectID);
+  }
+
+  async getProjectIDInput(): Promise<string> {
+    return await this.projectIDInput.getAttribute('value');
+  }
+
+  async save(): Promise<void> {
+    await this.saveButton.click();
+  }
+
+  async cancel(): Promise<void> {
+    await this.cancelButton.click();
+  }
+
+  getSaveButton(): ElementFinder {
+    return this.saveButton;
+  }
+}
+
+export class LikesDeleteDialog {
+  private dialogTitle = element(by.id('jhi-delete-likes-heading'));
+  private confirmButton = element(by.id('jhi-confirm-delete-likes'));
+
+  async getDialogTitle(): Promise<string> {
+    return this.dialogTitle.getAttribute('jhiTranslate');
+  }
+
+  async clickOnConfirmButton(): Promise<void> {
+    await this.confirmButton.click();
+  }
+}
diff --git a/src/test/javascript/e2e/entities/likes/likes.spec.ts b/src/test/javascript/e2e/entities/likes/likes.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..445cf5e1361f0a18f861fcddd441b4d3870460b6
--- /dev/null
+++ b/src/test/javascript/e2e/entities/likes/likes.spec.ts
@@ -0,0 +1,73 @@
+import { browser, ExpectedConditions as ec, promise } from 'protractor';
+import { NavBarPage, SignInPage } from '../../page-objects/jhi-page-objects';
+
+import { LikesComponentsPage, LikesDeleteDialog, LikesUpdatePage } from './likes.page-object';
+
+const expect = chai.expect;
+
+describe('Likes e2e test', () => {
+  let navBarPage: NavBarPage;
+  let signInPage: SignInPage;
+  let likesComponentsPage: LikesComponentsPage;
+  let likesUpdatePage: LikesUpdatePage;
+  let likesDeleteDialog: LikesDeleteDialog;
+
+  before(async () => {
+    await browser.get('/');
+    navBarPage = new NavBarPage();
+    signInPage = await navBarPage.getSignInPage();
+    await signInPage.autoSignInUsing('admin', 'admin');
+    await browser.wait(ec.visibilityOf(navBarPage.entityMenu), 5000);
+  });
+
+  it('should load Likes', async () => {
+    await navBarPage.goToEntity('likes');
+    likesComponentsPage = new LikesComponentsPage();
+    await browser.wait(ec.visibilityOf(likesComponentsPage.title), 5000);
+    expect(await likesComponentsPage.getTitle()).to.eq('gitsearchApp.likes.home.title');
+    await browser.wait(ec.or(ec.visibilityOf(likesComponentsPage.entities), ec.visibilityOf(likesComponentsPage.noResult)), 1000);
+  });
+
+  it('should load create Likes page', async () => {
+    await likesComponentsPage.clickOnCreateButton();
+    likesUpdatePage = new LikesUpdatePage();
+    expect(await likesUpdatePage.getPageTitle()).to.eq('gitsearchApp.likes.home.createOrEditLabel');
+    await likesUpdatePage.cancel();
+  });
+
+  it('should create and save Likes', async () => {
+    const nbButtonsBeforeCreate = await likesComponentsPage.countDeleteButtons();
+
+    await likesComponentsPage.clickOnCreateButton();
+
+    await promise.all([
+      likesUpdatePage.setDateInput('2000-12-31'),
+      likesUpdatePage.setUserIDInput('5'),
+      likesUpdatePage.setProjectIDInput('5'),
+    ]);
+
+    expect(await likesUpdatePage.getDateInput()).to.eq('2000-12-31', 'Expected date value to be equals to 2000-12-31');
+    expect(await likesUpdatePage.getUserIDInput()).to.eq('5', 'Expected userID value to be equals to 5');
+    expect(await likesUpdatePage.getProjectIDInput()).to.eq('5', 'Expected projectID value to be equals to 5');
+
+    await likesUpdatePage.save();
+    expect(await likesUpdatePage.getSaveButton().isPresent(), 'Expected save button disappear').to.be.false;
+
+    expect(await likesComponentsPage.countDeleteButtons()).to.eq(nbButtonsBeforeCreate + 1, 'Expected one more entry in the table');
+  });
+
+  it('should delete last Likes', async () => {
+    const nbButtonsBeforeDelete = await likesComponentsPage.countDeleteButtons();
+    await likesComponentsPage.clickOnLastDeleteButton();
+
+    likesDeleteDialog = new LikesDeleteDialog();
+    expect(await likesDeleteDialog.getDialogTitle()).to.eq('gitsearchApp.likes.delete.question');
+    await likesDeleteDialog.clickOnConfirmButton();
+
+    expect(await likesComponentsPage.countDeleteButtons()).to.eq(nbButtonsBeforeDelete - 1);
+  });
+
+  after(async () => {
+    await navBarPage.autoSignOut();
+  });
+});
diff --git a/src/test/javascript/e2e/entities/user-watch-list/user-watch-list.page-object.ts b/src/test/javascript/e2e/entities/user-watch-list/user-watch-list.page-object.ts
index dccf120c441b5bc4094fd9a10260e5a44c114935..a71640d72dfa0d541123794b18fa04d099896a8c 100644
--- a/src/test/javascript/e2e/entities/user-watch-list/user-watch-list.page-object.ts
+++ b/src/test/javascript/e2e/entities/user-watch-list/user-watch-list.page-object.ts
@@ -30,6 +30,7 @@ export class UserWatchListUpdatePage {
   cancelButton = element(by.id('cancel-save'));
 
   nameInput = element(by.id('field_name'));
+  checkFrequencySelect = element(by.id('field_checkFrequency'));
 
   userIdSelect = element(by.id('field_userId'));
 
@@ -45,6 +46,18 @@ export class UserWatchListUpdatePage {
     return await this.nameInput.getAttribute('value');
   }
 
+  async setCheckFrequencySelect(checkFrequency: string): Promise<void> {
+    await this.checkFrequencySelect.sendKeys(checkFrequency);
+  }
+
+  async getCheckFrequencySelect(): Promise<string> {
+    return await this.checkFrequencySelect.element(by.css('option:checked')).getText();
+  }
+
+  async checkFrequencySelectLastOption(): Promise<void> {
+    await this.checkFrequencySelect.all(by.tagName('option')).last().click();
+  }
+
   async userIdSelectLastOption(): Promise<void> {
     await this.userIdSelect.all(by.tagName('option')).last().click();
   }
diff --git a/src/test/javascript/e2e/entities/user-watch-list/user-watch-list.spec.ts b/src/test/javascript/e2e/entities/user-watch-list/user-watch-list.spec.ts
index 66fb9301b9d604b32d84aadcad0d3da8443f205e..54aefae104677d2d831ef40ee5bd80c88a689c54 100644
--- a/src/test/javascript/e2e/entities/user-watch-list/user-watch-list.spec.ts
+++ b/src/test/javascript/e2e/entities/user-watch-list/user-watch-list.spec.ts
@@ -49,6 +49,7 @@ describe('UserWatchList e2e test', () => {
 
         await promise.all([
             userWatchListUpdatePage.setNameInput('name'),
+            userWatchListUpdatePage.checkFrequencySelectLastOption(),
             userWatchListUpdatePage.userIdSelectLastOption(),
         ]);
 
diff --git a/src/test/javascript/spec/app/entities/likes/likes-delete-dialog.component.spec.ts b/src/test/javascript/spec/app/entities/likes/likes-delete-dialog.component.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e229024b529e1aa7a20d8240c1d943bd2df31220
--- /dev/null
+++ b/src/test/javascript/spec/app/entities/likes/likes-delete-dialog.component.spec.ts
@@ -0,0 +1,65 @@
+import { ComponentFixture, TestBed, inject, fakeAsync, tick } from '@angular/core/testing';
+import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';
+import { of } from 'rxjs';
+import { JhiEventManager } from 'ng-jhipster';
+
+import { GitsearchTestModule } from '../../../test.module';
+import { MockEventManager } from '../../../helpers/mock-event-manager.service';
+import { MockActiveModal } from '../../../helpers/mock-active-modal.service';
+import { LikesDeleteDialogComponent } from 'app/entities/likes/likes-delete-dialog.component';
+import { LikesService } from 'app/entities/likes/likes.service';
+
+describe('Component Tests', () => {
+  describe('Likes Management Delete Component', () => {
+    let comp: LikesDeleteDialogComponent;
+    let fixture: ComponentFixture<LikesDeleteDialogComponent>;
+    let service: LikesService;
+    let mockEventManager: MockEventManager;
+    let mockActiveModal: MockActiveModal;
+
+    beforeEach(() => {
+      TestBed.configureTestingModule({
+        imports: [GitsearchTestModule],
+        declarations: [LikesDeleteDialogComponent],
+      })
+        .overrideTemplate(LikesDeleteDialogComponent, '')
+        .compileComponents();
+      fixture = TestBed.createComponent(LikesDeleteDialogComponent);
+      comp = fixture.componentInstance;
+      service = fixture.debugElement.injector.get(LikesService);
+      mockEventManager = TestBed.get(JhiEventManager);
+      mockActiveModal = TestBed.get(NgbActiveModal);
+    });
+
+    describe('confirmDelete', () => {
+      it('Should call delete service on confirmDelete', inject(
+        [],
+        fakeAsync(() => {
+          // GIVEN
+          spyOn(service, 'delete').and.returnValue(of({}));
+
+          // WHEN
+          comp.confirmDelete(123);
+          tick();
+
+          // THEN
+          expect(service.delete).toHaveBeenCalledWith(123);
+          expect(mockActiveModal.closeSpy).toHaveBeenCalled();
+          expect(mockEventManager.broadcastSpy).toHaveBeenCalled();
+        })
+      ));
+
+      it('Should not call delete service on clear', () => {
+        // GIVEN
+        spyOn(service, 'delete');
+
+        // WHEN
+        comp.cancel();
+
+        // THEN
+        expect(service.delete).not.toHaveBeenCalled();
+        expect(mockActiveModal.dismissSpy).toHaveBeenCalled();
+      });
+    });
+  });
+});
diff --git a/src/test/javascript/spec/app/entities/likes/likes-detail.component.spec.ts b/src/test/javascript/spec/app/entities/likes/likes-detail.component.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..319925a35bdee083881b42ad4fe8f7c82c777b71
--- /dev/null
+++ b/src/test/javascript/spec/app/entities/likes/likes-detail.component.spec.ts
@@ -0,0 +1,37 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+import { ActivatedRoute } from '@angular/router';
+import { of } from 'rxjs';
+
+import { GitsearchTestModule } from '../../../test.module';
+import { LikesDetailComponent } from 'app/entities/likes/likes-detail.component';
+import { Likes } from 'app/shared/model/likes.model';
+
+describe('Component Tests', () => {
+  describe('Likes Management Detail Component', () => {
+    let comp: LikesDetailComponent;
+    let fixture: ComponentFixture<LikesDetailComponent>;
+    const route = ({ data: of({ likes: new Likes(123) }) } as any) as ActivatedRoute;
+
+    beforeEach(() => {
+      TestBed.configureTestingModule({
+        imports: [GitsearchTestModule],
+        declarations: [LikesDetailComponent],
+        providers: [{ provide: ActivatedRoute, useValue: route }],
+      })
+        .overrideTemplate(LikesDetailComponent, '')
+        .compileComponents();
+      fixture = TestBed.createComponent(LikesDetailComponent);
+      comp = fixture.componentInstance;
+    });
+
+    describe('OnInit', () => {
+      it('Should load likes on init', () => {
+        // WHEN
+        comp.ngOnInit();
+
+        // THEN
+        expect(comp.likes).toEqual(jasmine.objectContaining({ id: 123 }));
+      });
+    });
+  });
+});
diff --git a/src/test/javascript/spec/app/entities/likes/likes-update.component.spec.ts b/src/test/javascript/spec/app/entities/likes/likes-update.component.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..1b9e257de3064a7fb4fcda3a66e5e0571cd823cc
--- /dev/null
+++ b/src/test/javascript/spec/app/entities/likes/likes-update.component.spec.ts
@@ -0,0 +1,61 @@
+import { ComponentFixture, TestBed, fakeAsync, tick } from '@angular/core/testing';
+import { HttpResponse } from '@angular/common/http';
+import { FormBuilder } from '@angular/forms';
+import { of } from 'rxjs';
+
+import { GitsearchTestModule } from '../../../test.module';
+import { LikesUpdateComponent } from 'app/entities/likes/likes-update.component';
+import { LikesService } from 'app/entities/likes/likes.service';
+import { Likes } from 'app/shared/model/likes.model';
+
+describe('Component Tests', () => {
+  describe('Likes Management Update Component', () => {
+    let comp: LikesUpdateComponent;
+    let fixture: ComponentFixture<LikesUpdateComponent>;
+    let service: LikesService;
+
+    beforeEach(() => {
+      TestBed.configureTestingModule({
+        imports: [GitsearchTestModule],
+        declarations: [LikesUpdateComponent],
+        providers: [FormBuilder],
+      })
+        .overrideTemplate(LikesUpdateComponent, '')
+        .compileComponents();
+
+      fixture = TestBed.createComponent(LikesUpdateComponent);
+      comp = fixture.componentInstance;
+      service = fixture.debugElement.injector.get(LikesService);
+    });
+
+    describe('save', () => {
+      it('Should call update service on save for existing entity', fakeAsync(() => {
+        // GIVEN
+        const entity = new Likes(123);
+        spyOn(service, 'update').and.returnValue(of(new HttpResponse({ body: entity })));
+        comp.updateForm(entity);
+        // WHEN
+        comp.save();
+        tick(); // simulate async
+
+        // THEN
+        expect(service.update).toHaveBeenCalledWith(entity);
+        expect(comp.isSaving).toEqual(false);
+      }));
+
+      it('Should call create service on save for new entity', fakeAsync(() => {
+        // GIVEN
+        const entity = new Likes();
+        spyOn(service, 'create').and.returnValue(of(new HttpResponse({ body: entity })));
+        comp.updateForm(entity);
+        // WHEN
+        comp.save();
+        tick(); // simulate async
+
+        // THEN
+        expect(service.create).toHaveBeenCalledWith(entity);
+        expect(comp.isSaving).toEqual(false);
+      }));
+    });
+  });
+});
diff --git a/src/test/javascript/spec/app/entities/likes/likes.component.spec.ts b/src/test/javascript/spec/app/entities/likes/likes.component.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..d61bfaeb60630638f24989a287afd92f227aa57f
--- /dev/null
+++ b/src/test/javascript/spec/app/entities/likes/likes.component.spec.ts
@@ -0,0 +1,49 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+import { of } from 'rxjs';
+import { HttpHeaders, HttpResponse } from '@angular/common/http';
+
+import { GitsearchTestModule } from '../../../test.module';
+import { LikesComponent } from 'app/entities/likes/likes.component';
+import { LikesService } from 'app/entities/likes/likes.service';
+import { Likes } from 'app/shared/model/likes.model';
+
+describe('Component Tests', () => {
+  describe('Likes Management Component', () => {
+    let comp: LikesComponent;
+    let fixture: ComponentFixture<LikesComponent>;
+    let service: LikesService;
+
+    beforeEach(() => {
+      TestBed.configureTestingModule({
+        imports: [GitsearchTestModule],
+        declarations: [LikesComponent],
+      })
+        .overrideTemplate(LikesComponent, '')
+        .compileComponents();
+
+      fixture = TestBed.createComponent(LikesComponent);
+      comp = fixture.componentInstance;
+      service = fixture.debugElement.injector.get(LikesService);
+    });
+
+    it('Should call load all on init', () => {
+      // GIVEN
+      const headers = new HttpHeaders().append('link', 'link;link');
+      spyOn(service, 'query').and.returnValue(
+        of(
+          new HttpResponse({
+            body: [new Likes(123)],
+            headers,
+          })
+        )
+      );
+
+      // WHEN
+      comp.ngOnInit();
+
+      // THEN
+      expect(service.query).toHaveBeenCalled();
+      expect(comp.likes && comp.likes[0]).toEqual(jasmine.objectContaining({ id: 123 }));
+    });
+  });
+});
diff --git a/src/test/javascript/spec/app/entities/likes/likes.service.spec.ts b/src/test/javascript/spec/app/entities/likes/likes.service.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..6ba4a166684c3cad569299380dc8bd1d15b7fbb5
--- /dev/null
+++ b/src/test/javascript/spec/app/entities/likes/likes.service.spec.ts
@@ -0,0 +1,131 @@
+import { TestBed, getTestBed } from '@angular/core/testing';
+import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing';
+import * as moment from 'moment';
+import { DATE_FORMAT } from 'app/shared/constants/input.constants';
+import { LikesService } from 'app/entities/likes/likes.service';
+import { ILikes, Likes } from 'app/shared/model/likes.model';
+
+describe('Service Tests', () => {
+  describe('Likes Service', () => {
+    let injector: TestBed;
+    let service: LikesService;
+    let httpMock: HttpTestingController;
+    let elemDefault: ILikes;
+    let expectedResult: ILikes | ILikes[] | boolean | null;
+    let currentDate: moment.Moment;
+
+    beforeEach(() => {
+      TestBed.configureTestingModule({
+        imports: [HttpClientTestingModule],
+      });
+      expectedResult = null;
+      injector = getTestBed();
+      service = injector.get(LikesService);
+      httpMock = injector.get(HttpTestingController);
+      currentDate = moment();
+
+      elemDefault = new Likes(0, currentDate, 0, '0');
+    });
+
+    describe('Service methods', () => {
+      it('should find an element', () => {
+        const returnedFromService = Object.assign(
+          {
+            date: currentDate.format(DATE_FORMAT),
+          },
+          elemDefault
+        );
+
+        service.find(123).subscribe(resp => (expectedResult = resp.body));
+
+        const req = httpMock.expectOne({ method: 'GET' });
+        req.flush(returnedFromService);
+        expect(expectedResult).toMatchObject(elemDefault);
+      });
+
+      it('should create a Likes', () => {
+        const returnedFromService = Object.assign(
+          {
+            id: 0,
+            date: currentDate.format(DATE_FORMAT),
+          },
+          elemDefault
+        );
+
+        const expected = Object.assign(
+          {
+            date: currentDate,
+          },
+          returnedFromService
+        );
+
+        service.create(new Likes()).subscribe(resp => (expectedResult = resp.body));
+
+        const req = httpMock.expectOne({ method: 'POST' });
+        req.flush(returnedFromService);
+        expect(expectedResult).toMatchObject(expected);
+      });
+
+      it('should update a Likes', () => {
+        const returnedFromService = Object.assign(
+          {
+            date: currentDate.format(DATE_FORMAT),
+            userID: 1,
+            projectID: 1,
+          },
+          elemDefault
+        );
+
+        const expected = Object.assign(
+          {
+            date: currentDate,
+          },
+          returnedFromService
+        );
+
+        service.update(expected).subscribe(resp => (expectedResult = resp.body));
+
+        const req = httpMock.expectOne({ method: 'PUT' });
+        req.flush(returnedFromService);
+        expect(expectedResult).toMatchObject(expected);
+      });
+
+      it('should return a list of Likes', () => {
+        const returnedFromService = Object.assign(
+          {
+            date: currentDate.format(DATE_FORMAT),
+            userID: 1,
+            projectID: 1,
+          },
+          elemDefault
+        );
+
+        const expected = Object.assign(
+          {
+            date: currentDate,
+          },
+          returnedFromService
+        );
+
+        service.query().subscribe(resp => (expectedResult = resp.body));
+
+        const req = httpMock.expectOne({ method: 'GET' });
+        req.flush([returnedFromService]);
+        httpMock.verify();
+        expect(expectedResult).toContainEqual(expected);
+      });
+
+      it('should delete a Likes', () => {
+        service.delete(123).subscribe(resp => (expectedResult = resp.ok));
+
+        const req = httpMock.expectOne({ method: 'DELETE' });
+        req.flush({ status: 200 });
+        expect(expectedResult);
+      });
+    });
+
+    afterEach(() => {
+      httpMock.verify();
+    });
+  });
+});
diff --git a/src/test/javascript/spec/app/entities/user-watch-list/user-watch-list.service.spec.ts b/src/test/javascript/spec/app/entities/user-watch-list/user-watch-list.service.spec.ts
index dcd36fd689a35b404c570454d2e497bc84fc8ccc..bde63c23ea0d26af9a87037138a7e0aca3cdef50 100644
--- a/src/test/javascript/spec/app/entities/user-watch-list/user-watch-list.service.spec.ts
+++ b/src/test/javascript/spec/app/entities/user-watch-list/user-watch-list.service.spec.ts
@@ -2,6 +2,7 @@ import { TestBed, getTestBed } from '@angular/core/testing';
 import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing';
 import { UserWatchListService } from 'app/entities/user-watch-list/user-watch-list.service';
 import { IUserWatchList, UserWatchList } from 'app/shared/model/user-watch-list.model';
+import { CheckFrequency } from 'app/shared/model/enumerations/check-frequency.model';
 
 describe('Service Tests', () => {
   describe('UserWatchList Service', () => {
@@ -20,7 +21,7 @@ describe('Service Tests', () => {
       service = injector.get(UserWatchListService);
       httpMock = injector.get(HttpTestingController);
 
-      elemDefault = new UserWatchList(0, 'AAAAAAA');
+      elemDefault = new UserWatchList(0, 'AAAAAAA', CheckFrequency.NEVER);
     });
 
     describe('Service methods', () => {
@@ -55,6 +56,7 @@ describe('Service Tests', () => {
         const returnedFromService = Object.assign(
           {
             name: 'BBBBBB',
+            checkFrequency: 'BBBBBB',
           },
           elemDefault
         );
@@ -72,6 +74,7 @@ describe('Service Tests', () => {
         const returnedFromService = Object.assign(
           {
             name: 'BBBBBB',
+            checkFrequency: 'BBBBBB',
           },
           elemDefault
         );
diff --git a/src/test/resources/at/ac/uibk/gitsearch/repository/search/testData/content1.json b/src/test/resources/at/ac/uibk/gitsearch/repository/search/testData/content1.json
deleted file mode 100644
index 13a37a86744282f28b9c0cd33c8e0e931a03057c..0000000000000000000000000000000000000000
--- a/src/test/resources/at/ac/uibk/gitsearch/repository/search/testData/content1.json
+++ /dev/null
@@ -1,97 +0,0 @@
-{
-          "project" : {
-            "project_id" : 3, "_comment": "This should be an existing public prject",
-            "project_name" : "apitest_76_1613574806194",
-            "namespace" : "sharing/health-check-tests/apitest_76_1613574806194",
-            "main_group" : "sharing",
-            "sub_group" : "health-check-tests",
-            "url" : "https://sharing.codeability-austria.uibk.ac.at/sharing/health-check-tests/apitest_76_1613574806194", "_comment2": "TODO: this url is not correct for project 3",
-            "visibility" : "private",
-            "archived" : false,
-            "star_count" : 0,
-            "open_issues_count" : 0,
-            "forks_count" : 0,
-            "last_activity_at" : "2021-02-17T15:13:27.733Z",
-            "description" : "Automatically generated testapi"
-          },
-          "file" : {
-            "filename" : "metadata.yml",
-            "path" : "metadata.yml",
-            "commit_id" : "679236d0e8722976c285caa3a5391b6cff74b397",
-            "indexing_date" : "2021-03-10T17:02:58.245815"
-          },
-          "metadata" : {
-            "metadataVersion" : "0.2",
-            "type" : "collection",
-            "collectionContent" : [
-              "src/if-001/if-001.yml",
-              "src/if-002/if-002.yml",
-              "src/if-003/if-003.yml"
-            ],
-            "identifier" : "javaCourseTUWienTest",
-            "structure" : "hierarchical",
-            "version" : "1.0",
-            "status" : "final",
-            "title" : "Meta Test Data 76",
-            "description" : "Dies sind Teile des Einführungskurses an der TU Wien. Momentan hier genutzt zum Testen der Metadateninfrastruktur. Version 1.xxx 3. Zeile",
-            "programmingLanguage" : [
-              "Java"
-            ],
-            "language" : [
-              "de"
-            ],
-            "educationLevel" : "Anfänger, (to be detailed)",
-            "audience" : "Anfaenger",
-            "keyword" : [
-              "Java",
-              "IOTest",
-              "latex",
-              "testing76"
-            ],
-            "license" : "MIT",
-            "creator" : [
-              {
-                "name" : "Stefan Podlipnig",
-                "affiliation" : "TU Wien",
-                "email" : "stefan.podlipnig@tuwien.ac.at"
-              }
-            ],
-            "contributor" : [
-              {
-                "name" : "Daniel Bastta",
-                "affiliation" : "TU Wien",
-                "email" : "daniel.bastta@tuwien.ac.at"
-              },
-              {
-                "name" : "Andreas Merckel",
-                "affiliation" : "TU Wien",
-                "email" : "andreas.merkel@tuwien.ac.at"
-              },
-              {
-                "name" : "Kerstin Limbeck",
-                "affiliation" : "TU Wien",
-                "email" : "kerstin.limbeck@tuwien.ac.at"
-              }
-            ],
-            "publisher" : [
-              {
-                "name" : "Andreas Merckel",
-                "affiliation" : "TU Wien",
-                "email" : "andreas.merkel@tuwien.ac.at"
-              }
-            ],
-            "format" : [
-              "latex"
-            ],
-            "deprecated" : false,
-            "difficulty" : "simple",
-            "valid" : {
-              "start" : "2020-01-01",
-              "end" : "2030-12-31"
-            },
-            "requires" : [
-              "Java14"
-            ],
-            "image" : "./courseIcon.png"
-          }
-        }
diff --git a/src/test/resources/at/ac/uibk/gitsearch/repository/search/testData/content2.json b/src/test/resources/at/ac/uibk/gitsearch/repository/search/testData/content2.json
deleted file mode 100644
index a1eb515efe8dc405aa1726541ae4ed11ecdf5028..0000000000000000000000000000000000000000
--- a/src/test/resources/at/ac/uibk/gitsearch/repository/search/testData/content2.json
+++ /dev/null
@@ -1,97 +0,0 @@
-{
-          "project" : {
-            "project_id" : 143,
-            "project_name" : "apitest_76_1613574806194",
-            "namespace" : "sharing/health-check-tests/apitest_76_1613574806194",
-            "main_group" : "sharing",
-            "sub_group" : "health-check-tests",
-            "url" : "https://sharing.codeability-austria.uibk.ac.at/sharing/health-check-tests/apitest_76_1613574806194",
-            "visibility" : "private",
-            "archived" : false,
-            "star_count" : 0,
-            "open_issues_count" : 0,
-            "forks_count" : 0,
-            "last_activity_at" : "2021-02-17T15:13:27.733Z",
-            "description" : "Automatically generated testapi"
-          },
-          "file" : {
-            "filename" : "metadata.yml",
-            "path" : "metadata.yml",
-            "commit_id" : "679236d0e8722976c285caa3a5391b6cff74b397",
-            "indexing_date" : "2021-03-10T17:02:58.245815"
-          },
-          "metadata" : {
-            "metadataVersion" : "0.2",
-            "type" : "collection",
-            "collectionContent" : [
-              "src/if-001/if-001.yml",
-              "src/if-002/if-002.yml",
-              "src/if-003/if-003.yml"
-            ],
-            "identifier" : "javaCourseTUWienTest",
-            "structure" : "hierarchical",
-            "version" : "1.0",
-            "status" : "final",
-            "title" : "Meta Test Data 76",
-            "description" : "Dies sind Teile des Einführungskurses an der TU Wien. Momentan hier genutzt zum Testen der Metadateninfrastruktur. Version 1.xxx 3. Zeile",
-            "programmingLanguage" : [
-              "Java"
-            ],
-            "language" : [
-              "de"
-            ],
-            "educationLevel" : "Anfänger, (to be detailed)",
-            "audience" : "Anfaenger",
-            "keyword" : [
-              "Java",
-              "IOTest",
-              "latex",
-              "testing76"
-            ],
-            "license" : "CC-SA-BY 4.0",
-            "creator" : [
-              {
-                "name" : "Stefan Podlipnig",
-                "affiliation" : "TU Wien",
-                "email" : "stefan.podlipnig@tuwien.ac.at"
-              }
-            ],
-            "contributor" : [
-              {
-                "name" : "Daniel Bastta",
-                "affiliation" : "TU Wien",
-                "email" : "daniel.bastta@tuwien.ac.at"
-              },
-              {
-                "name" : "Andreas Merckel",
-                "affiliation" : "TU Wien",
-                "email" : "andreas.merkel@tuwien.ac.at"
-              },
-              {
-                "name" : "Kerstin Limbeck",
-                "affiliation" : "TU Wien",
-                "email" : "kerstin.limbeck@tuwien.ac.at"
-              }
-            ],
-            "publisher" : [
-              {
-                "name" : "Andreas Merckel",
-                "affiliation" : "TU Wien",
-                "email" : "andreas.merkel@tuwien.ac.at"
-              }
-            ],
-            "format" : [
-              "latex"
-            ],
-            "deprecated" : false,
-            "difficulty" : "simple",
-            "valid" : {
-              "start" : "2020-01-01",
-              "end" : "2030-12-31"
-            },
-            "requires" : [
-              "Java14"
-            ],
-            "image" : "./courseIcon.png"
-          }
-        }
\ No newline at end of file
diff --git a/src/test/resources/at/ac/uibk/gitsearch/repository/search/testData/content3.json b/src/test/resources/at/ac/uibk/gitsearch/repository/search/testData/content3.json
deleted file mode 100644
index 01a2a8b4ca7857a0f052798eb98cb61c79241446..0000000000000000000000000000000000000000
--- a/src/test/resources/at/ac/uibk/gitsearch/repository/search/testData/content3.json
+++ /dev/null
@@ -1,80 +0,0 @@
-{
-  "project": {
-    "project_id": 144,
-    "project_name": "apitest_76_1613574806194",
-    "namespace": "sharing/health-check-tests/apitest_76_1613574806194",
-    "main_group": "sharing",
-    "sub_group": "health-check-tests",
-    "url": "https://sharing.codeability-austria.uibk.ac.at/sharing/health-check-tests/apitest_76_1613574806194",
-    "visibility": "public",
-    "archived": false,
-    "star_count": 0,
-    "open_issues_count": 0,
-    "forks_count": 0,
-    "last_activity_at": "2021-02-17T15:13:27.733Z",
-    "description": "Automatically generated testapi"
-  },
-  "file": {
-    "filename": "metadata.yml",
-    "path": "metadata.yml",
-    "commit_id": "679236d0e8722976c285caa3a5391b6cff74b397",
-    "indexing_date": "2021-03-10T17:02:58.245815"
-  },
-  "metadata": {
-    "metadataVersion": "0.2",
-    "type": "collection",
-    "collectionContent": ["src/if-001/if-001.yml", "src/if-002/if-002.yml", "src/if-003/if-003.yml"],
-    "identifier": "javaCourseTUWienTest",
-    "structure": "hierarchical",
-    "version": "1.0",
-    "status": "final",
-    "title": "Meta Test Data 76",
-    "description": "Dies sind Teile des Einführungskurses an der TU Wien. Momentan hier genutzt zum Testen der Metadateninfrastruktur. Version 1.xxx 3. Zeile",
-    "programmingLanguage": ["Java"],
-    "language": ["de"],
-    "educationLevel": "Anfänger, (to be detailed)",
-    "audience": "Anfaenger",
-    "keyword": ["Java", "IOTest", "latex", "testing76"],
-    "license": "MIT",
-    "creator": [
-      {
-        "name": "Stefan Podlipnig",
-        "affiliation": "TU Wien",
-        "email": "stefan.podlipnig@tuwien.ac.at"
-      }
-    ],
-    "contributor": [
-      {
-        "name": "Daniel Bastta",
-        "affiliation": "TU Wien",
-        "email": "daniel.bastta@tuwien.ac.at"
-      },
-      {
-        "name": "Andreas Merckel",
-        "affiliation": "TU Wien",
-        "email": "andreas.merkel@tuwien.ac.at"
-      },
-      {
-        "name": "Kerstin Limbeck",
-        "affiliation": "TU Wien",
-        "email": "kerstin.limbeck@tuwien.ac.at"
-      }
-    ],
-    "publisher": [
-      {
-        "name": "Andreas Merckel",
-        "affiliation": "TU Wien",
-        "email": "andreas.merkel@tuwien.ac.at"
-      }
-    ],
-    "format": ["latex"],
-    "deprecated": false,
-    "difficulty": "simple",
-    "valid": {
-      "start": "2020-01-01",
-      "end": "2030-12-31"
-    },
-    "requires": ["Java14"],
-    "image": "./courseIcon.png"
-  }
-}
diff --git a/src/test/resources/at/ac/uibk/gitsearch/repository/search/testData/es_metadata.schema.json b/src/test/resources/at/ac/uibk/gitsearch/repository/search/testData/es_metadata.schema.json
index 6922d5b091ccc5ad8f7f3a88720bb657a7cda053..97127b1dd10855e913cc8abdf333656b78a0ecde 100644
--- a/src/test/resources/at/ac/uibk/gitsearch/repository/search/testData/es_metadata.schema.json
+++ b/src/test/resources/at/ac/uibk/gitsearch/repository/search/testData/es_metadata.schema.json
@@ -1,200 +1,209 @@
 {
-  "idx_metadata_1" : {
-    "aliases" : {
-      "metadata" : {
-        "is_write_index" : true
+  "idx_metadata_1": {
+    "aliases": {
+      "metadata": {
+        "is_write_index": true
       }
     },
-    "settings" : {
-      "index.mapping.total_fields.limit" : "2000",
-       "number_of_shards" : "1"
-      }
-    },
-    "mappings" : {
-      "_doc" : {
-
-        "properties" : {
-          "file" : {
-            "properties" : {
-              "commit_id" : {
-                "type" : "keyword"
-              },
-              "filename" : {
-                "type" : "keyword"
-              },
-              "indexing_date" : {
-                "type" : "date",
-                "format" : "dateOptionalTime"
-              },
-              "path" : {
-                "type" : "keyword"
-              }
+    "settings": {
+      "index.mapping.total_fields.limit": "2000",
+      "number_of_shards": "1"
+    }
+  },
+  "mappings": {
+    "_doc": {
+      "properties": {
+        "file": {
+          "properties": {
+            "children": {
+              "type": "keyword"
+            },
+            "commit_id": {
+              "type": "keyword"
+            },
+            "filename": {
+              "type": "keyword"
+            },
+            "indexing_date": {
+              "type": "date",
+              "format": "dateOptionalTime"
+            },
+            "last_activity_at": {
+              "type": "date",
+              "format": "dateOptionalTime"
+            },
+            "parent": {
+              "type": "keyword"
+            },
+            "path": {
+              "type": "keyword"
             }
-          },
-          "metadata" : {
-            "properties" : {
-              "audience" : {
-                "type" : "text"
-              },
-              "collectionContent" : {
-                "type" : "keyword"
-              },
-              "contributor" : {
-                "properties" : {
-                  "affiliation" : {
-                    "type" : "text"
-                  },
-                  "email" : {
-                    "type" : "text"
-                  },
-                  "name" : {
-                    "type" : "text"
-                  }
+          }
+        },
+        "metadata": {
+          "properties": {
+            "audience": {
+              "type": "text"
+            },
+            "collectionContent": {
+              "type": "keyword"
+            },
+            "contributor": {
+              "properties": {
+                "affiliation": {
+                  "type": "text"
+                },
+                "email": {
+                  "type": "text"
+                },
+                "name": {
+                  "type": "text"
                 }
-              },
-              "creator" : {
-                "properties" : {
-                  "affiliation" : {
-                    "type" : "text"
-                  },
-                  "email" : {
-                    "type" : "text"
-                  },
-                  "name" : {
-                    "type" : "text"
-                  }
+              }
+            },
+            "creator": {
+              "properties": {
+                "affiliation": {
+                  "type": "text"
+                },
+                "email": {
+                  "type": "text"
+                },
+                "name": {
+                  "type": "text"
                 }
-              },
-              "deprecated" : {
-                "type" : "boolean"
-              },
-              "description" : {
-                "type" : "text"
-              },
-              "difficulty" : {
-                "type" : "keyword"
-              },
-              "educationLevel" : {
-                "type" : "text"
-              },
-              "format" : {
-                "type" : "keyword"
-              },
-              "identifier" : {
-                "type" : "keyword"
-              },
-              "image" : {
-                "type" : "keyword"
-              },
-              "keyword" : {
-                "type" : "keyword"
-              },
-              "language" : {
-                "type" : "keyword"
-              },
-              "license" : {
-                "type" : "keyword"
-              },
-              "metadataVersion" : {
-                "type" : "keyword"
-              },
-              "programmingLanguage" : {
-                "type" : "keyword"
-              },
-              "publisher" : {
-                "properties" : {
-                  "affiliation" : {
-                    "type" : "text"
-                  },
-                  "email" : {
-                    "type" : "text"
-                  },
-                  "name" : {
-                    "type" : "text"
-                  }
+              }
+            },
+            "deprecated": {
+              "type": "boolean"
+            },
+            "description": {
+              "type": "text"
+            },
+            "difficulty": {
+              "type": "keyword"
+            },
+            "educationLevel": {
+              "type": "text"
+            },
+            "format": {
+              "type": "keyword"
+            },
+            "identifier": {
+              "type": "keyword"
+            },
+            "image": {
+              "type": "keyword"
+            },
+            "keyword": {
+              "type": "keyword"
+            },
+            "language": {
+              "type": "keyword"
+            },
+            "license": {
+              "type": "keyword"
+            },
+            "metadataVersion": {
+              "type": "keyword"
+            },
+            "programmingLanguage": {
+              "type": "keyword"
+            },
+            "publisher": {
+              "properties": {
+                "affiliation": {
+                  "type": "text"
+                },
+                "email": {
+                  "type": "text"
+                },
+                "name": {
+                  "type": "text"
                 }
-              },
-              "requires" : {
-                "type" : "text"
-              },
-              "source" : {
-                "type" : "keyword"
-              },
-              "status" : {
-                "type" : "keyword"
-              },
-              "structure" : {
-                "type" : "keyword"
-              },
-              "timeRequired" : {
-                "type" : "keyword"
-              },
-              "title" : {
-                "type" : "text"
-              },
-              "type" : {
-                "type" : "keyword"
-              },
-              "valid" : {
-                "properties" : {
-                  "end" : {
-                    "type" : "keyword"
-                  },
-                  "start" : {
-                    "type" : "keyword"
-                  }
+              }
+            },
+            "requires": {
+              "type": "text"
+            },
+            "source": {
+              "type": "keyword"
+            },
+            "status": {
+              "type": "keyword"
+            },
+            "structure": {
+              "type": "keyword"
+            },
+            "timeRequired": {
+              "type": "keyword"
+            },
+            "title": {
+              "type": "text"
+            },
+            "type": {
+              "type": "keyword"
+            },
+            "valid": {
+              "properties": {
+                "end": {
+                  "type": "keyword"
+                },
+                "start": {
+                  "type": "keyword"
                 }
-              },
-              "version" : {
-                "type" : "keyword"
               }
+            },
+            "version": {
+              "type": "keyword"
             }
-          },
-          "project" : {
-            "properties" : {
-              "archived" : {
-                "type" : "boolean"
-              },
-              "description" : {
-                "type" : "text"
-              },
-              "forks_count" : {
-                "type" : "integer"
-              },
-              "last_activity_at" : {
-                "type" : "date",
-                "format" : "dateOptionalTime"
-              },
-              "main_group" : {
-                "type" : "keyword"
-              },
-              "namespace" : {
-                "type" : "keyword"
-              },
-              "open_issues_count" : {
-                "type" : "integer"
-              },
-              "project_id" : {
-                "type" : "long"
-              },
-              "project_name" : {
-                "type" : "keyword"
-              },
-              "star_count" : {
-                "type" : "integer"
-              },
-              "sub_group" : {
-                "type" : "keyword"
-              },
-              "url" : {
-                "type" : "keyword"
-              },
-              "visibility" : {
-                "type" : "keyword"
-              }
+          }
+        },
+        "project": {
+          "properties": {
+            "archived": {
+              "type": "boolean"
+            },
+            "description": {
+              "type": "text"
+            },
+            "forks_count": {
+              "type": "integer"
+            },
+            "last_activity_at": {
+              "type": "date",
+              "format": "dateOptionalTime"
+            },
+            "main_group": {
+              "type": "keyword"
+            },
+            "namespace": {
+              "type": "keyword"
+            },
+            "open_issues_count": {
+              "type": "integer"
+            },
+            "project_id": {
+              "type": "long"
+            },
+            "project_name": {
+              "type": "keyword"
+            },
+            "star_count": {
+              "type": "integer"
+            },
+            "sub_group": {
+              "type": "keyword"
+            },
+            "url": {
+              "type": "keyword"
+            },
+            "visibility": {
+              "type": "keyword"
             }
           }
         }
       }
     }
-    }
+  }
+}
diff --git a/src/test/resources/at/ac/uibk/gitsearch/service/testData/metaData1.yaml b/src/test/resources/at/ac/uibk/gitsearch/service/testData/metaData/1/metaData.yaml
similarity index 97%
rename from src/test/resources/at/ac/uibk/gitsearch/service/testData/metaData1.yaml
rename to src/test/resources/at/ac/uibk/gitsearch/service/testData/metaData/1/metaData.yaml
index c6fb5218190ea673e5ae740df484949147226e83..19985a15374cae496297f60508116c9a3007f908 100644
--- a/src/test/resources/at/ac/uibk/gitsearch/service/testData/metaData1.yaml
+++ b/src/test/resources/at/ac/uibk/gitsearch/service/testData/metaData/1/metaData.yaml
@@ -1,7 +1,7 @@
 metadataVersion: 0.2
 type: programming exercise
 # format (not used here)
-identifier: simpleIO
+identifier: collection1
 structure: atomic # one from atomic, networked, hierarchical, linear
 version: "1.0" # just a version tag
 status: final # one fo draft, final, revised, unavailable
diff --git a/src/test/resources/at/ac/uibk/gitsearch/service/testData/metaData/1/project.yaml b/src/test/resources/at/ac/uibk/gitsearch/service/testData/metaData/1/project.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..dc17595a5deb4c2f48e8d3659ad1270679c0b017
--- /dev/null
+++ b/src/test/resources/at/ac/uibk/gitsearch/service/testData/metaData/1/project.yaml
@@ -0,0 +1,13 @@
+project_id: 1
+project_name: es test
+namespace: sharing/vienna-universityof-technology/latex
+main_group: sharing
+sub_group: vienna-universityof-technology
+url: https://sharing.codeability-austria.uibk.ac.at/sharing/vienna-universityof-technology/latex
+visibility: public
+archived: false
+star_count: 0
+open_issues_count: 0
+forks_count: 1
+last_activity_at: 2021-02-17T15:13:27.123Z
+description: 
diff --git a/src/test/resources/at/ac/uibk/gitsearch/service/testData/metaData/143/metaData.yaml b/src/test/resources/at/ac/uibk/gitsearch/service/testData/metaData/143/metaData.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..9e9594ea717807439049dccee8713c3755c18b50
--- /dev/null
+++ b/src/test/resources/at/ac/uibk/gitsearch/service/testData/metaData/143/metaData.yaml
@@ -0,0 +1,35 @@
+metadataVersion: "0.2"
+type: collection
+collectionContent: 
+  - src/if-001/if-001.yml
+  - src/if-002/if-002.yml
+  - src/if-003/if-003.yml
+identifier: javaCourseTUWienTest
+structure: hierarchical # one from atomic, networked, hierarchical, linear
+version: "1.0" # just a version tag
+status: final # one fo draft, final, revised, unavalable
+title: Meta Test Data 76
+description: "Dies sind Teile des Einführungskurses an der TU Wien. 
+   Momentan hier genutzt zum Testen der Metadateninfrastruktur. Version 1.xxx
+   3. Zeile"
+programmingLanguage: 
+  - JAVA
+language: [de]
+educationLevel: "Anfänger, (to be detailed)"
+audience: "Anfaenger"
+keyword: [Java, IOTest, latex, testing76]
+license: MIT # mandatory
+creator: 
+  - {name: "Stefan Podlipnig", affiliation: "TU Wien", email: "stefan.podlipnig@tuwien.ac.at"}
+contributor:
+  - {name: "Daniel Bastta", affiliation: "TU Wien", email: "daniel.bastta@tuwien.ac.at"}
+  - {name: "Andreas Merckel", affiliation: "TU Wien", email: "andreas.merkel@tuwien.ac.at"}
+  - {name: "Kerstin Limbeck", affiliation: "TU Wien", email: "kerstin.limbeck@tuwien.ac.at"}
+publisher:
+  - {name: "Andreas Merckel", affiliation: "TU Wien", email: "andreas.merkel@tuwien.ac.at"}
+
+format: [latex]
+deprecated: false
+difficulty: simple
+requires: [Java14]
+image: ./courseIcon.png
diff --git a/src/test/resources/at/ac/uibk/gitsearch/service/testData/metaData/143/project.yaml b/src/test/resources/at/ac/uibk/gitsearch/service/testData/metaData/143/project.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..dc0b50e606d2afadb1197d09e3a604f90f728369
--- /dev/null
+++ b/src/test/resources/at/ac/uibk/gitsearch/service/testData/metaData/143/project.yaml
@@ -0,0 +1,13 @@
+project_id: 143
+project_name: apiTest_76_1613574806194
+namespace: sharing/health-check-tests/apiTest_76_1613574806194
+main_group: sharing
+sub_group: health-check-tests
+url: https://sharing.codeability-austria.uibk.ac.at/sharing/health-check-tests/apitest_76_1613574806194/
+visibility: public
+archived: false
+star_count: 0
+open_issues_count: 0
+forks_count: 1
+last_activity_at: 2021-04-08T15:13:27.123Z
+description: Just a test project
diff --git a/src/test/resources/at/ac/uibk/gitsearch/service/testData/metaData2.yaml b/src/test/resources/at/ac/uibk/gitsearch/service/testData/metaData/2/metaData.yaml
similarity index 100%
rename from src/test/resources/at/ac/uibk/gitsearch/service/testData/metaData2.yaml
rename to src/test/resources/at/ac/uibk/gitsearch/service/testData/metaData/2/metaData.yaml
diff --git a/src/test/resources/at/ac/uibk/gitsearch/service/testData/metaData/2/project.yaml b/src/test/resources/at/ac/uibk/gitsearch/service/testData/metaData/2/project.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..8586745b307ac1c5d6ea10aeae15a4fc9a0717f0
--- /dev/null
+++ b/src/test/resources/at/ac/uibk/gitsearch/service/testData/metaData/2/project.yaml
@@ -0,0 +1,13 @@
+project_id: 1
+project_name: latex
+namespace: sharing/vienna-universityof-technology/latex
+main_group: sharing
+sub_group: vienna-universityof-technology
+url: https://sharing.codeability-austria.uibk.ac.at/sharing/vienna-universityof-technology/latex
+visibility: private
+archived: false
+star_count: 0
+open_issues_count: 0
+forks_count: 1
+last_activity_at: 2021-02-17T15:13:27.123Z
+description: 
diff --git a/src/test/resources/at/ac/uibk/gitsearch/service/testData/metaData/272/metaData.yaml b/src/test/resources/at/ac/uibk/gitsearch/service/testData/metaData/272/metaData.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..ce289b932310da4fdc382e1b3c7d169639ead680
--- /dev/null
+++ b/src/test/resources/at/ac/uibk/gitsearch/service/testData/metaData/272/metaData.yaml
@@ -0,0 +1,22 @@
+metadataVersion: "0.2"
+type: "programming exercise"
+programmingLanguage: [java]
+language: [de]
+identifier: artemisOriginalCourseAndTitle
+structure: atomic # one from atomic, networked, hierarchical, linear
+version: "0.1.6" # just a version tag
+title: JUnit Quality Tests Exercise2 (cloned)
+format: 
+    - Artemis
+description: "Dies ist ein Beispiel, wie Tests die JUnit Test Coverage testen."
+status: final # one fo draft, final, revised, unavalable
+keyword: ["Example", "JUnit Tests", "JUnit", "Test Coverage Tests"]
+license: CC-SA-BY 4.0
+creator: 
+ - {name: "Michael Breu", affiliation: "Universität Innsbruck", email: "admin@localhost"}
+publisher:
+ - {name: "Michael Breu", affiliation: "Universität Innsbruck", email: "michael.breu@uibk.ac.at"}
+educationLevel: "Fortgeschrittene"
+deprecated: false
+difficulty: medium
+requires: [Java8, JUnit]
diff --git a/src/test/resources/at/ac/uibk/gitsearch/service/testData/metaData/272/project.yaml b/src/test/resources/at/ac/uibk/gitsearch/service/testData/metaData/272/project.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..6cede8fc6ee55d0700d8975525de66078c87d3b6
--- /dev/null
+++ b/src/test/resources/at/ac/uibk/gitsearch/service/testData/metaData/272/project.yaml
@@ -0,0 +1,13 @@
+project_id: 272
+project_name: junit-quality-tests-exercise2
+namespace: sharing/university-innsbruck/java/junit-quality-tests-exercise2
+main_group: sharing
+sub_group: university-innsbruck
+url: https://sharing.codeability-austria.uibk.ac.at/sharing/university-innsbruck/java/junit-quality-tests-exercise2/
+visibility: public
+archived: false
+star_count: 0
+open_issues_count: 0
+forks_count: 1
+last_activity_at: 2021-04-08T15:13:27.123Z
+description: Just a test project
diff --git a/src/test/resources/at/ac/uibk/gitsearch/service/testData/metaData/272/solution/src/at/metaData.yaml b/src/test/resources/at/ac/uibk/gitsearch/service/testData/metaData/272/solution/src/at/metaData.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..9a0d084fd1bebbdef54d48ec786e806d89464558
--- /dev/null
+++ b/src/test/resources/at/ac/uibk/gitsearch/service/testData/metaData/272/solution/src/at/metaData.yaml
@@ -0,0 +1,31 @@
+# metadataVersion: 0.2
+type: programming exercise
+# format (not used here)
+identifier: simpleIO
+structure: atomic # one from atomic, networked, hierarchical, linear
+version: "1.0" # just a version tag
+status: final # one fo draft, final, revised, unavailable
+title: Just another sub exercise Demo
+description: Not a really good structured example.
+programmingLanguage: [JAVA]
+language: [de]
+educationLevel: "high school"  # just for demonstration
+"audience": {
+    "@type": "EducationalAudience",
+    "educationalRole": "student"
+  }
+timeRequired: 0:05:00 # [hh:mm:ss]
+keyword: [Java, IOTest, artemis]
+license: CC-SA-BY 4.0 # mandatory
+creator: 
+  - {name: "Breu Michael", affiliation: "University of Innsbruck", email: "c703257@uibk.ac.at"}
+publisher:
+  - {name: "Breu Michael", affiliation: "University of Innsbruck", email: "c703257@uibk.ac.at"}
+deprecated: false
+difficulty: simple
+source: 
+  - "cf. cunit"
+contributor:
+  - {name: "Manuel Seywald", affiliation: "University of Klagenfurt", email: "maseywald@edu.aau.at"}
+requires: []  # empty, t.b.d. later
+image: 'https://sharing-codeability.uibk.ac.at/static/CodeAbility%20Austria-Dateien/Partner_UIBK.png'
diff --git a/src/test/resources/at/ac/uibk/gitsearch/service/testData/metaData/3/metaData.yaml b/src/test/resources/at/ac/uibk/gitsearch/service/testData/metaData/3/metaData.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..9f3374e95d498b98e073758370e444c7cbd666ab
--- /dev/null
+++ b/src/test/resources/at/ac/uibk/gitsearch/service/testData/metaData/3/metaData.yaml
@@ -0,0 +1,33 @@
+# metadataVersion: 0.2
+type: collection
+# format (not used here)
+identifier: simpleIO
+collectionContent:
+  "solution/src/at/metaData.yaml"
+structure: hierarchical # one from atomic, networked, hierarchical, linear
+version: "1.0" # just a version tag
+status: final # one fo draft, final, revised, unavailable
+title: Simple IO Test
+description: This is a programming exercise to demonstrate a simple IO testing framework.
+programmingLanguage: [JAVA]
+language: [de]
+educationLevel: "high school"  # just for demonstration
+"audience": {
+    "@type": "EducationalAudience",
+    "educationalRole": "student"
+  }
+timeRequired: 0:05:00 # [hh:mm:ss]
+keyword: [Java, IOTest, artemis]
+license: CC-SA-BY 4.0 # mandatory
+creator: 
+  - {name: "Breu Michael", affiliation: "University of Innsbruck", email: "c703257@uibk.ac.at"}
+publisher:
+  - {name: "Breu Michael", affiliation: "University of Innsbruck", email: "c703257@uibk.ac.at"}
+deprecated: false
+difficulty: simple
+source: 
+  - "cf. cunit"
+contributor:
+  - {name: "Manuel Seywald", affiliation: "University of Klagenfurt", email: "maseywald@edu.aau.at"}
+requires: []  # empty, t.b.d. later
+image: 'https://sharing-codeability.uibk.ac.at/static/CodeAbility%20Austria-Dateien/Partner_UIBK.png'
diff --git a/src/test/resources/at/ac/uibk/gitsearch/service/testData/metaData/3/project.yaml b/src/test/resources/at/ac/uibk/gitsearch/service/testData/metaData/3/project.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..0912955f4f63ed5a4409c28214ce0097b4f7ad32
--- /dev/null
+++ b/src/test/resources/at/ac/uibk/gitsearch/service/testData/metaData/3/project.yaml
@@ -0,0 +1,13 @@
+project_id: 272
+project_name: latex
+namespace: sharing/vienna-universityof-technology/latex
+main_group: sharing
+sub_group: vienna-universityof-technology
+url: https://sharing.codeability-austria.uibk.ac.at/sharing/vienna-universityof-technology/latex
+visibility: private
+archived: false
+star_count: 0
+open_issues_count: 0
+forks_count: 1
+last_activity_at: 2021-02-17T15:13:27.123Z
+description: 
diff --git a/src/test/resources/at/ac/uibk/gitsearch/service/testData/metaData3.yaml b/src/test/resources/at/ac/uibk/gitsearch/service/testData/metaData/3/solution/src/at/metaData.yaml
similarity index 90%
rename from src/test/resources/at/ac/uibk/gitsearch/service/testData/metaData3.yaml
rename to src/test/resources/at/ac/uibk/gitsearch/service/testData/metaData/3/solution/src/at/metaData.yaml
index c3086b1db5ce9d8fd5619258dc5802f7dfac4f7d..0b201757d45848ffccc79078e128811734ac1333 100644
--- a/src/test/resources/at/ac/uibk/gitsearch/service/testData/metaData3.yaml
+++ b/src/test/resources/at/ac/uibk/gitsearch/service/testData/metaData/3/solution/src/at/metaData.yaml
@@ -1,11 +1,11 @@
-metadataVersion: 0.2
-type: collection
+# metadataVersion: 0.2
+type: programming exercise
 # format (not used here)
-identifier: collection1
+identifier: simpleIO
 structure: atomic # one from atomic, networked, hierarchical, linear
 version: "1.0" # just a version tag
 status: final # one fo draft, final, revised, unavailable
-title: Simple IO Test
+title: Simple IO Test (inside collection)
 description: This is a programming exercise to demonstrate a simple IO testing framework.
 programmingLanguage: [JAVA]
 language: [de]
diff --git a/src/test/resources/i18n/messages_de.properties b/src/test/resources/i18n/messages_de.properties
index a3c2f82e186821f660f4f3bdd5d451a4b766a475..ad936993214f032d4f5028fbe7a08aa905b8d4dd 100644
--- a/src/test/resources/i18n/messages_de.properties
+++ b/src/test/resources/i18n/messages_de.properties
@@ -1 +1,5 @@
 email.test.title=Aktivierung
+
+# Info email
+email.info.title=Sharing Plattform: E-Mail Update
+
diff --git a/src/test/resources/i18n/messages_en.properties b/src/test/resources/i18n/messages_en.properties
index 73db38e99be55c13abf930cb9592d9a3d575b8ad..fc2c5da9e1279ff0de15585c07cb2fda2fe30f11 100644
--- a/src/test/resources/i18n/messages_en.properties
+++ b/src/test/resources/i18n/messages_en.properties
@@ -2,3 +2,13 @@ email.test.title=test title
 # Value used for English locale unit test in MailServiceIT
 # as this file is loaded instead of real file
 email.activation.title=gitsearch account activation
+
+# Info email
+email.info.title=Sharing Platform: Update Mail
+email.info.greeting=Dear user,
+email.info.textIntro=You get this e-mail, because some of your automatic checks was triggered.
+email.info.textWatchlist=Some exercises on your watchlist were recently updated:
+email.info.noChangesOnWatchlist=There were no changes on your watchlists
+email.info.textRegards=Regards,
+email.info.textClosing=If you are not interested in getting this e-mail, please log in to the CodeAbility Sharing Platform, and reset your update triggers:
+
diff --git a/webpack/webpack.dev.js b/webpack/webpack.dev.js
index 0fb31af50d43a2789920e39392768ef5823e525b..cb3701fc804b2891d9eebe8d339a2abceecc3574 100644
--- a/webpack/webpack.dev.js
+++ b/webpack/webpack.dev.js
@@ -20,6 +20,9 @@ module.exports = (options) => webpackMerge(commonConfig({ env: ENV }), {
         proxy: [{
             context: [
                 '/api',
+                '/oauth2Config',
+                '/oauth2',
+                '/login',
                 '/services',
                 '/management',
                 '/swagger-resources',
diff --git a/yarn.lock b/yarn.lock
new file mode 100644
index 0000000000000000000000000000000000000000..2822fdff1b9349543c8ee3113c9927951430a401
--- /dev/null
+++ b/yarn.lock
@@ -0,0 +1,13964 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@angular-devkit/architect@0.1002.3":
+  "integrity" "sha512-7ainXRNO1njZ6bBbJXGpMzCh0OYrzuIRe/+zRj0ncV1YfEsJb2yWBuiza0+y2Ljco7hdd4wr+7eJm7cfn+NvAw=="
+  "resolved" "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1002.3.tgz"
+  "version" "0.1002.3"
+  dependencies:
+    "@angular-devkit/core" "10.2.3"
+    "rxjs" "6.6.2"
+
+"@angular-devkit/core@10.0.0":
+  "integrity" "sha512-IvX9IMaCjDkN9vDVnYcgWbSBinlUUb7jdFhDGeTtK6rGSnjX1GoLvWneVI2hoccS07fPbnfMoYXBoZLwVxiIxw=="
+  "resolved" "https://registry.npmjs.org/@angular-devkit/core/-/core-10.0.0.tgz"
+  "version" "10.0.0"
+  dependencies:
+    "ajv" "6.12.2"
+    "fast-json-stable-stringify" "2.1.0"
+    "magic-string" "0.25.7"
+    "rxjs" "6.5.5"
+    "source-map" "0.7.3"
+
+"@angular-devkit/core@10.2.3":
+  "integrity" "sha512-pMM1v9Xjqx6YLOQxQYs0D+03H6XPDZLS8cyEtoQX2iYdh8qlKHZVbJa2WsfzwMoIPtgcXfQAXn113VEgrQPLFA=="
+  "resolved" "https://registry.npmjs.org/@angular-devkit/core/-/core-10.2.3.tgz"
+  "version" "10.2.3"
+  dependencies:
+    "ajv" "6.12.4"
+    "fast-json-stable-stringify" "2.1.0"
+    "magic-string" "0.25.7"
+    "rxjs" "6.6.2"
+    "source-map" "0.7.3"
+
+"@angular-devkit/schematics@10.2.3":
+  "integrity" "sha512-uCNeq5qH4QEiftgOud+EhTVvdriYQVBrYmX4f4BjVHkjnFhm73h30nfAgs6YuStIp8oxSI8jUGE9DAy331xvmA=="
+  "resolved" "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-10.2.3.tgz"
+  "version" "10.2.3"
+  dependencies:
+    "@angular-devkit/core" "10.2.3"
+    "ora" "5.0.0"
+    "rxjs" "6.6.2"
+
+"@angular/cli@^10.2.3":
+  "version" "10.2.3"
+  dependencies:
+    "@angular-devkit/architect" "0.1002.3"
+    "@angular-devkit/core" "10.2.3"
+    "@angular-devkit/schematics" "10.2.3"
+    "@schematics/angular" "10.2.3"
+    "@schematics/update" "0.1002.3"
+    "@yarnpkg/lockfile" "1.1.0"
+    "ansi-colors" "4.1.1"
+    "debug" "4.1.1"
+    "ini" "1.3.6"
+    "inquirer" "7.3.3"
+    "npm-package-arg" "8.0.1"
+    "npm-pick-manifest" "6.1.0"
+    "open" "7.2.0"
+    "pacote" "9.5.12"
+    "read-package-tree" "5.3.1"
+    "rimraf" "3.0.2"
+    "semver" "7.3.2"
+    "symbol-observable" "1.2.0"
+    "universal-analytics" "0.4.23"
+    "uuid" "8.3.0"
+
+"@angular/common@^10.0.0", "@angular/common@^10.0.0 || ^11.0.0 || ^12.0.0-0", "@angular/common@^7.2.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0", "@angular/common@^9.0.0", "@angular/common@^9.0.5", "@angular/common@>=7.0.0", "@angular/common@>=9.0.0 <10.0.0", "@angular/common@10.0.0":
+  "integrity" "sha512-zaLHMRQqjZyoIc15tLGrwg5ugcVlggqATiMlMVNo9ddqxwpZ4qHK2fdAvqQy9FfWKaPGi6NpIBSR31RGV0ircw=="
+  "resolved" "https://registry.npmjs.org/@angular/common/-/common-10.0.0.tgz"
+  "version" "10.0.0"
+  dependencies:
+    "tslib" "^2.0.0"
+
+"@angular/compiler-cli@>=10.0.0-next.0 < 11", "@angular/compiler-cli@10.0.0":
+  "integrity" "sha512-KusRkS1NKPrjhj3BXoxRgeejuJVy/ra4dcDV3hpscRmR8FSdim3rs2H+lYK2hZ26ISGsYUvC8cHNaMqP2U3X+g=="
+  "resolved" "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-10.0.0.tgz"
+  "version" "10.0.0"
+  dependencies:
+    "canonical-path" "1.0.0"
+    "chokidar" "^3.0.0"
+    "convert-source-map" "^1.5.1"
+    "dependency-graph" "^0.7.2"
+    "fs-extra" "4.0.2"
+    "magic-string" "^0.25.0"
+    "minimist" "^1.2.0"
+    "reflect-metadata" "^0.1.2"
+    "semver" "^6.3.0"
+    "source-map" "^0.6.1"
+    "sourcemap-codec" "^1.4.8"
+    "tslib" "^2.0.0"
+    "yargs" "15.3.0"
+
+"@angular/compiler@>=2.3.1 <10.0.0 || >9.0.0-beta <10.0.0 || >9.1.0-beta <10.0.0 || >9.2.0-beta <10.0.0", "@angular/compiler@10.0.0":
+  "integrity" "sha512-meyJKPLLhkgjxF4dvdJq/sw7MI7KvpgYADoFt2K/5dt48ExXRj+kDlyQC6FAwm9mbgSea/A+JpDG8HMPU7AK5Q=="
+  "resolved" "https://registry.npmjs.org/@angular/compiler/-/compiler-10.0.0.tgz"
+  "version" "10.0.0"
+  dependencies:
+    "tslib" "^2.0.0"
+
+"@angular/core@^10.0.0", "@angular/core@^10.0.0 || ^11.0.0 || ^12.0.0-0", "@angular/core@^10.2.5", "@angular/core@^7.2.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0", "@angular/core@^9.0.0", "@angular/core@^9.0.5", "@angular/core@>=2.0.0", "@angular/core@>=2.3.1 <10.0.0 || >9.0.0-beta <10.0.0 || >9.1.0-beta <10.0.0 || >9.2.0-beta <10.0.0", "@angular/core@>=8.0.0", "@angular/core@>=9.0.0 <10.0.0", "@angular/core@10.0.0":
+  "integrity" "sha512-krhOKNTj5XE92Rk9ASX5KmgTF72j7qT2PLVxrGEVjuUKjBY2XaK3TV0Kotq9zI3qa9WgeCrP/Njn6jlKQCCAEQ=="
+  "resolved" "https://registry.npmjs.org/@angular/core/-/core-10.2.5.tgz"
+  "version" "10.2.5"
+  dependencies:
+    "tslib" "^2.0.0"
+
+"@angular/forms@^10.0.0", "@angular/forms@^7.2.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0", "@angular/forms@>=9.0.0 <10.0.0", "@angular/forms@10.0.0":
+  "integrity" "sha512-Jaqs6WmF3fcaL1mKmeZt8pcFHkMuFvgLjbgGFqiOKcdz4UdGTcYkI3mE+UqHpqqXGXYTHLusup8A4TqD7s0rxg=="
+  "resolved" "https://registry.npmjs.org/@angular/forms/-/forms-10.0.0.tgz"
+  "version" "10.0.0"
+  dependencies:
+    "tslib" "^2.0.0"
+
+"@angular/localize@^10.0.0", "@angular/localize@10.0.0":
+  "integrity" "sha512-UWuuJYVYDwMGKu8wQuyKH2v0Qbb9HW5n/3tIuw5s0O9yDlhyreueWqCYk42u51p8YDQ7FY7ToZhbMq73G7A8tA=="
+  "resolved" "https://registry.npmjs.org/@angular/localize/-/localize-10.0.0.tgz"
+  "version" "10.0.0"
+  dependencies:
+    "@babel/core" "7.8.3"
+    "glob" "7.1.2"
+    "yargs" "15.3.0"
+
+"@angular/platform-browser-dynamic@>=2.0.0", "@angular/platform-browser-dynamic@10.0.0":
+  "integrity" "sha512-Ol9dMU/UB8PZ1xQkcILmANC+tA1Y/6YeYc8+MYnZUH7uAMXV6kscg9C5fK9JixSldOOS05AQZAdEty9ESjFNNg=="
+  "resolved" "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-10.0.0.tgz"
+  "version" "10.0.0"
+  dependencies:
+    "tslib" "^2.0.0"
+
+"@angular/platform-browser@^10.0.0", "@angular/platform-browser@10.0.0":
+  "integrity" "sha512-2gp53WjGUrL1uReewU21IZJa4KFpbigCyDYB0j/KwTkIGrdwYCOjD0/04oHYjkpazPe/VIu3aN7Gb3PgUa3X/Q=="
+  "resolved" "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-10.0.0.tgz"
+  "version" "10.0.0"
+  dependencies:
+    "tslib" "^2.0.0"
+
+"@angular/router@^10.0.0", "@angular/router@^7.2.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0", "@angular/router@10.0.0":
+  "integrity" "sha512-rx9e0eOwXypV/oWLrGsug3wx9lPnD6NUU3i20/VG9O1uMHgXfpnP8RJLcUHqmEMBZEYTLMo59fDE5LEgM1sIFg=="
+  "resolved" "https://registry.npmjs.org/@angular/router/-/router-10.0.0.tgz"
+  "version" "10.0.0"
+  dependencies:
+    "tslib" "^2.0.0"
+
+"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.5.5", "@babel/code-frame@^7.8.3":
+  "version" "7.10.4"
+  dependencies:
+    "@babel/highlight" "^7.10.4"
+
+"@babel/compat-data@^7.10.4":
+  "version" "7.10.4"
+  dependencies:
+    "browserslist" "^4.12.0"
+    "invariant" "^2.2.4"
+    "semver" "^5.5.0"
+
+"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.1.0", "@babel/core@^7.7.5", "@babel/core@7 || ^7.0.0-rc.2", "@babel/core@7.8.3":
+  "integrity" "sha512-4XFkf8AwyrEG7Ziu3L2L0Cv+WyY47Tcsp70JFmpftbAA1K7YL/sgE9jh9HyNj08Y/U50ItUchpN0w6HxAoX1rA=="
+  "resolved" "https://registry.npmjs.org/@babel/core/-/core-7.8.3.tgz"
+  "version" "7.8.3"
+  dependencies:
+    "@babel/code-frame" "^7.8.3"
+    "@babel/generator" "^7.8.3"
+    "@babel/helpers" "^7.8.3"
+    "@babel/parser" "^7.8.3"
+    "@babel/template" "^7.8.3"
+    "@babel/traverse" "^7.8.3"
+    "@babel/types" "^7.8.3"
+    "convert-source-map" "^1.7.0"
+    "debug" "^4.1.0"
+    "gensync" "^1.0.0-beta.1"
+    "json5" "^2.1.0"
+    "lodash" "^4.17.13"
+    "resolve" "^1.3.2"
+    "semver" "^5.4.1"
+    "source-map" "^0.5.0"
+
+"@babel/core@^7.8.4":
+  "version" "7.12.3"
+  dependencies:
+    "@babel/code-frame" "^7.10.4"
+    "@babel/generator" "^7.12.1"
+    "@babel/helper-module-transforms" "^7.12.1"
+    "@babel/helpers" "^7.12.1"
+    "@babel/parser" "^7.12.3"
+    "@babel/template" "^7.10.4"
+    "@babel/traverse" "^7.12.1"
+    "@babel/types" "^7.12.1"
+    "convert-source-map" "^1.7.0"
+    "debug" "^4.1.0"
+    "gensync" "^1.0.0-beta.1"
+    "json5" "^2.1.2"
+    "lodash" "^4.17.19"
+    "resolve" "^1.3.2"
+    "semver" "^5.4.1"
+    "source-map" "^0.5.0"
+
+"@babel/generator@^7.10.4", "@babel/generator@^7.8.3":
+  "version" "7.10.4"
+  dependencies:
+    "@babel/types" "^7.10.4"
+    "jsesc" "^2.5.1"
+    "lodash" "^4.17.13"
+    "source-map" "^0.5.0"
+
+"@babel/generator@^7.12.1", "@babel/generator@^7.12.5":
+  "version" "7.12.5"
+  dependencies:
+    "@babel/types" "^7.12.5"
+    "jsesc" "^2.5.1"
+    "source-map" "^0.5.0"
+
+"@babel/helper-annotate-as-pure@^7.10.4":
+  "version" "7.10.4"
+  dependencies:
+    "@babel/types" "^7.10.4"
+
+"@babel/helper-builder-binary-assignment-operator-visitor@^7.10.4":
+  "version" "7.10.4"
+  dependencies:
+    "@babel/helper-explode-assignable-expression" "^7.10.4"
+    "@babel/types" "^7.10.4"
+
+"@babel/helper-compilation-targets@^7.10.4":
+  "version" "7.10.4"
+  dependencies:
+    "@babel/compat-data" "^7.10.4"
+    "browserslist" "^4.12.0"
+    "invariant" "^2.2.4"
+    "levenary" "^1.1.1"
+    "semver" "^5.5.0"
+
+"@babel/helper-create-class-features-plugin@^7.10.4":
+  "version" "7.10.4"
+  dependencies:
+    "@babel/helper-function-name" "^7.10.4"
+    "@babel/helper-member-expression-to-functions" "^7.10.4"
+    "@babel/helper-optimise-call-expression" "^7.10.4"
+    "@babel/helper-plugin-utils" "^7.10.4"
+    "@babel/helper-replace-supers" "^7.10.4"
+    "@babel/helper-split-export-declaration" "^7.10.4"
+
+"@babel/helper-create-regexp-features-plugin@^7.10.4":
+  "version" "7.10.4"
+  dependencies:
+    "@babel/helper-annotate-as-pure" "^7.10.4"
+    "@babel/helper-regex" "^7.10.4"
+    "regexpu-core" "^4.7.0"
+
+"@babel/helper-define-map@^7.10.4":
+  "version" "7.10.4"
+  dependencies:
+    "@babel/helper-function-name" "^7.10.4"
+    "@babel/types" "^7.10.4"
+    "lodash" "^4.17.13"
+
+"@babel/helper-explode-assignable-expression@^7.10.4":
+  "version" "7.10.4"
+  dependencies:
+    "@babel/traverse" "^7.10.4"
+    "@babel/types" "^7.10.4"
+
+"@babel/helper-function-name@^7.10.4":
+  "version" "7.10.4"
+  dependencies:
+    "@babel/helper-get-function-arity" "^7.10.4"
+    "@babel/template" "^7.10.4"
+    "@babel/types" "^7.10.4"
+
+"@babel/helper-get-function-arity@^7.10.4":
+  "version" "7.10.4"
+  dependencies:
+    "@babel/types" "^7.10.4"
+
+"@babel/helper-hoist-variables@^7.10.4":
+  "version" "7.10.4"
+  dependencies:
+    "@babel/types" "^7.10.4"
+
+"@babel/helper-member-expression-to-functions@^7.10.4":
+  "version" "7.10.4"
+  dependencies:
+    "@babel/types" "^7.10.4"
+
+"@babel/helper-member-expression-to-functions@^7.12.1":
+  "version" "7.12.1"
+  dependencies:
+    "@babel/types" "^7.12.1"
+
+"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.10.4":
+  "version" "7.10.4"
+  dependencies:
+    "@babel/types" "^7.10.4"
+
+"@babel/helper-module-imports@^7.12.1":
+  "version" "7.12.5"
+  dependencies:
+    "@babel/types" "^7.12.5"
+
+"@babel/helper-module-transforms@^7.10.4":
+  "version" "7.10.4"
+  dependencies:
+    "@babel/helper-module-imports" "^7.10.4"
+    "@babel/helper-replace-supers" "^7.10.4"
+    "@babel/helper-simple-access" "^7.10.4"
+    "@babel/helper-split-export-declaration" "^7.10.4"
+    "@babel/template" "^7.10.4"
+    "@babel/types" "^7.10.4"
+    "lodash" "^4.17.13"
+
+"@babel/helper-module-transforms@^7.12.1":
+  "version" "7.12.1"
+  dependencies:
+    "@babel/helper-module-imports" "^7.12.1"
+    "@babel/helper-replace-supers" "^7.12.1"
+    "@babel/helper-simple-access" "^7.12.1"
+    "@babel/helper-split-export-declaration" "^7.11.0"
+    "@babel/helper-validator-identifier" "^7.10.4"
+    "@babel/template" "^7.10.4"
+    "@babel/traverse" "^7.12.1"
+    "@babel/types" "^7.12.1"
+    "lodash" "^4.17.19"
+
+"@babel/helper-optimise-call-expression@^7.10.4":
+  "version" "7.10.4"
+  dependencies:
+    "@babel/types" "^7.10.4"
+
+"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.8.0":
+  "version" "7.10.4"
+
+"@babel/helper-regex@^7.10.4":
+  "version" "7.10.4"
+  dependencies:
+    "lodash" "^4.17.13"
+
+"@babel/helper-remap-async-to-generator@^7.10.4":
+  "version" "7.10.4"
+  dependencies:
+    "@babel/helper-annotate-as-pure" "^7.10.4"
+    "@babel/helper-wrap-function" "^7.10.4"
+    "@babel/template" "^7.10.4"
+    "@babel/traverse" "^7.10.4"
+    "@babel/types" "^7.10.4"
+
+"@babel/helper-replace-supers@^7.10.4":
+  "version" "7.10.4"
+  dependencies:
+    "@babel/helper-member-expression-to-functions" "^7.10.4"
+    "@babel/helper-optimise-call-expression" "^7.10.4"
+    "@babel/traverse" "^7.10.4"
+    "@babel/types" "^7.10.4"
+
+"@babel/helper-replace-supers@^7.12.1":
+  "version" "7.12.5"
+  dependencies:
+    "@babel/helper-member-expression-to-functions" "^7.12.1"
+    "@babel/helper-optimise-call-expression" "^7.10.4"
+    "@babel/traverse" "^7.12.5"
+    "@babel/types" "^7.12.5"
+
+"@babel/helper-simple-access@^7.10.4":
+  "version" "7.10.4"
+  dependencies:
+    "@babel/template" "^7.10.4"
+    "@babel/types" "^7.10.4"
+
+"@babel/helper-simple-access@^7.12.1":
+  "version" "7.12.1"
+  dependencies:
+    "@babel/types" "^7.12.1"
+
+"@babel/helper-split-export-declaration@^7.10.4":
+  "version" "7.10.4"
+  dependencies:
+    "@babel/types" "^7.10.4"
+
+"@babel/helper-split-export-declaration@^7.11.0":
+  "version" "7.11.0"
+  dependencies:
+    "@babel/types" "^7.11.0"
+
+"@babel/helper-validator-identifier@^7.10.4":
+  "version" "7.10.4"
+
+"@babel/helper-wrap-function@^7.10.4":
+  "version" "7.10.4"
+  dependencies:
+    "@babel/helper-function-name" "^7.10.4"
+    "@babel/template" "^7.10.4"
+    "@babel/traverse" "^7.10.4"
+    "@babel/types" "^7.10.4"
+
+"@babel/helpers@^7.12.1":
+  "version" "7.12.5"
+  dependencies:
+    "@babel/template" "^7.10.4"
+    "@babel/traverse" "^7.12.5"
+    "@babel/types" "^7.12.5"
+
+"@babel/helpers@^7.8.3":
+  "version" "7.10.4"
+  dependencies:
+    "@babel/template" "^7.10.4"
+    "@babel/traverse" "^7.10.4"
+    "@babel/types" "^7.10.4"
+
+"@babel/highlight@^7.10.4":
+  "version" "7.10.4"
+  dependencies:
+    "@babel/helper-validator-identifier" "^7.10.4"
+    "chalk" "^2.0.0"
+    "js-tokens" "^4.0.0"
+
+"@babel/parser@^7.1.0", "@babel/parser@^7.10.4", "@babel/parser@^7.8.3":
+  "version" "7.10.4"
+
+"@babel/parser@^7.12.3", "@babel/parser@^7.12.5":
+  "version" "7.12.5"
+
+"@babel/plugin-proposal-async-generator-functions@^7.10.4":
+  "version" "7.10.4"
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.10.4"
+    "@babel/helper-remap-async-to-generator" "^7.10.4"
+    "@babel/plugin-syntax-async-generators" "^7.8.0"
+
+"@babel/plugin-proposal-class-properties@^7.10.4":
+  "version" "7.10.4"
+  dependencies:
+    "@babel/helper-create-class-features-plugin" "^7.10.4"
+    "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-proposal-dynamic-import@^7.10.4":
+  "version" "7.10.4"
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.10.4"
+    "@babel/plugin-syntax-dynamic-import" "^7.8.0"
+
+"@babel/plugin-proposal-json-strings@^7.10.4":
+  "version" "7.10.4"
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.10.4"
+    "@babel/plugin-syntax-json-strings" "^7.8.0"
+
+"@babel/plugin-proposal-nullish-coalescing-operator@^7.10.4":
+  "version" "7.10.4"
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.10.4"
+    "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0"
+
+"@babel/plugin-proposal-numeric-separator@^7.10.4":
+  "version" "7.10.4"
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.10.4"
+    "@babel/plugin-syntax-numeric-separator" "^7.10.4"
+
+"@babel/plugin-proposal-object-rest-spread@^7.10.4":
+  "version" "7.10.4"
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.10.4"
+    "@babel/plugin-syntax-object-rest-spread" "^7.8.0"
+    "@babel/plugin-transform-parameters" "^7.10.4"
+
+"@babel/plugin-proposal-optional-catch-binding@^7.10.4":
+  "version" "7.10.4"
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.10.4"
+    "@babel/plugin-syntax-optional-catch-binding" "^7.8.0"
+
+"@babel/plugin-proposal-optional-chaining@^7.10.4":
+  "version" "7.10.4"
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.10.4"
+    "@babel/plugin-syntax-optional-chaining" "^7.8.0"
+
+"@babel/plugin-proposal-private-methods@^7.10.4":
+  "version" "7.10.4"
+  dependencies:
+    "@babel/helper-create-class-features-plugin" "^7.10.4"
+    "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-proposal-unicode-property-regex@^7.10.4", "@babel/plugin-proposal-unicode-property-regex@^7.4.4":
+  "version" "7.10.4"
+  dependencies:
+    "@babel/helper-create-regexp-features-plugin" "^7.10.4"
+    "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-syntax-async-generators@^7.8.0", "@babel/plugin-syntax-async-generators@^7.8.4":
+  "integrity" "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw=="
+  "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz"
+  "version" "7.8.4"
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-bigint@^7.8.3":
+  "integrity" "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg=="
+  "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz"
+  "version" "7.8.3"
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-class-properties@^7.10.4", "@babel/plugin-syntax-class-properties@^7.8.3":
+  "version" "7.10.4"
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-syntax-dynamic-import@^7.8.0":
+  "version" "7.8.3"
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-import-meta@^7.8.3":
+  "integrity" "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g=="
+  "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz"
+  "version" "7.10.4"
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-syntax-json-strings@^7.8.0", "@babel/plugin-syntax-json-strings@^7.8.3":
+  "integrity" "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA=="
+  "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz"
+  "version" "7.8.3"
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-logical-assignment-operators@^7.8.3":
+  "integrity" "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig=="
+  "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz"
+  "version" "7.10.4"
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.0", "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3":
+  "integrity" "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ=="
+  "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz"
+  "version" "7.8.3"
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-numeric-separator@^7.10.4", "@babel/plugin-syntax-numeric-separator@^7.8.3":
+  "integrity" "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug=="
+  "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz"
+  "version" "7.10.4"
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-syntax-object-rest-spread@^7.8.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3":
+  "integrity" "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA=="
+  "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz"
+  "version" "7.8.3"
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-optional-catch-binding@^7.8.0", "@babel/plugin-syntax-optional-catch-binding@^7.8.3":
+  "integrity" "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q=="
+  "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz"
+  "version" "7.8.3"
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-optional-chaining@^7.8.0", "@babel/plugin-syntax-optional-chaining@^7.8.3":
+  "integrity" "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg=="
+  "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz"
+  "version" "7.8.3"
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-top-level-await@^7.10.4":
+  "version" "7.10.4"
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-transform-arrow-functions@^7.10.4":
+  "version" "7.10.4"
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-transform-async-to-generator@^7.10.4":
+  "version" "7.10.4"
+  dependencies:
+    "@babel/helper-module-imports" "^7.10.4"
+    "@babel/helper-plugin-utils" "^7.10.4"
+    "@babel/helper-remap-async-to-generator" "^7.10.4"
+
+"@babel/plugin-transform-block-scoped-functions@^7.10.4":
+  "version" "7.10.4"
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-transform-block-scoping@^7.10.4":
+  "version" "7.10.4"
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.10.4"
+    "lodash" "^4.17.13"
+
+"@babel/plugin-transform-classes@^7.10.4":
+  "version" "7.10.4"
+  dependencies:
+    "@babel/helper-annotate-as-pure" "^7.10.4"
+    "@babel/helper-define-map" "^7.10.4"
+    "@babel/helper-function-name" "^7.10.4"
+    "@babel/helper-optimise-call-expression" "^7.10.4"
+    "@babel/helper-plugin-utils" "^7.10.4"
+    "@babel/helper-replace-supers" "^7.10.4"
+    "@babel/helper-split-export-declaration" "^7.10.4"
+    "globals" "^11.1.0"
+
+"@babel/plugin-transform-computed-properties@^7.10.4":
+  "version" "7.10.4"
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-transform-destructuring@^7.10.4":
+  "version" "7.10.4"
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-transform-dotall-regex@^7.10.4", "@babel/plugin-transform-dotall-regex@^7.4.4":
+  "version" "7.10.4"
+  dependencies:
+    "@babel/helper-create-regexp-features-plugin" "^7.10.4"
+    "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-transform-duplicate-keys@^7.10.4":
+  "version" "7.10.4"
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-transform-exponentiation-operator@^7.10.4":
+  "version" "7.10.4"
+  dependencies:
+    "@babel/helper-builder-binary-assignment-operator-visitor" "^7.10.4"
+    "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-transform-for-of@^7.10.4":
+  "version" "7.10.4"
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-transform-function-name@^7.10.4":
+  "version" "7.10.4"
+  dependencies:
+    "@babel/helper-function-name" "^7.10.4"
+    "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-transform-literals@^7.10.4":
+  "version" "7.10.4"
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-transform-member-expression-literals@^7.10.4":
+  "version" "7.10.4"
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-transform-modules-amd@^7.10.4":
+  "version" "7.10.4"
+  dependencies:
+    "@babel/helper-module-transforms" "^7.10.4"
+    "@babel/helper-plugin-utils" "^7.10.4"
+    "babel-plugin-dynamic-import-node" "^2.3.3"
+
+"@babel/plugin-transform-modules-commonjs@^7.10.4":
+  "version" "7.10.4"
+  dependencies:
+    "@babel/helper-module-transforms" "^7.10.4"
+    "@babel/helper-plugin-utils" "^7.10.4"
+    "@babel/helper-simple-access" "^7.10.4"
+    "babel-plugin-dynamic-import-node" "^2.3.3"
+
+"@babel/plugin-transform-modules-systemjs@^7.10.4":
+  "version" "7.10.4"
+  dependencies:
+    "@babel/helper-hoist-variables" "^7.10.4"
+    "@babel/helper-module-transforms" "^7.10.4"
+    "@babel/helper-plugin-utils" "^7.10.4"
+    "babel-plugin-dynamic-import-node" "^2.3.3"
+
+"@babel/plugin-transform-modules-umd@^7.10.4":
+  "version" "7.10.4"
+  dependencies:
+    "@babel/helper-module-transforms" "^7.10.4"
+    "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-transform-named-capturing-groups-regex@^7.10.4":
+  "version" "7.10.4"
+  dependencies:
+    "@babel/helper-create-regexp-features-plugin" "^7.10.4"
+
+"@babel/plugin-transform-new-target@^7.10.4":
+  "version" "7.10.4"
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-transform-object-super@^7.10.4":
+  "version" "7.10.4"
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.10.4"
+    "@babel/helper-replace-supers" "^7.10.4"
+
+"@babel/plugin-transform-parameters@^7.10.4":
+  "version" "7.10.4"
+  dependencies:
+    "@babel/helper-get-function-arity" "^7.10.4"
+    "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-transform-property-literals@^7.10.4":
+  "version" "7.10.4"
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-transform-regenerator@^7.10.4":
+  "version" "7.10.4"
+  dependencies:
+    "regenerator-transform" "^0.14.2"
+
+"@babel/plugin-transform-reserved-words@^7.10.4":
+  "version" "7.10.4"
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-transform-shorthand-properties@^7.10.4":
+  "version" "7.10.4"
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-transform-spread@^7.10.4":
+  "version" "7.10.4"
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-transform-sticky-regex@^7.10.4":
+  "version" "7.10.4"
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.10.4"
+    "@babel/helper-regex" "^7.10.4"
+
+"@babel/plugin-transform-template-literals@^7.10.4":
+  "version" "7.10.4"
+  dependencies:
+    "@babel/helper-annotate-as-pure" "^7.10.4"
+    "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-transform-typeof-symbol@^7.10.4":
+  "version" "7.10.4"
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-transform-unicode-escapes@^7.10.4":
+  "version" "7.10.4"
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-transform-unicode-regex@^7.10.4":
+  "version" "7.10.4"
+  dependencies:
+    "@babel/helper-create-regexp-features-plugin" "^7.10.4"
+    "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/preset-env@^7.8.4":
+  "version" "7.10.4"
+  dependencies:
+    "@babel/compat-data" "^7.10.4"
+    "@babel/helper-compilation-targets" "^7.10.4"
+    "@babel/helper-module-imports" "^7.10.4"
+    "@babel/helper-plugin-utils" "^7.10.4"
+    "@babel/plugin-proposal-async-generator-functions" "^7.10.4"
+    "@babel/plugin-proposal-class-properties" "^7.10.4"
+    "@babel/plugin-proposal-dynamic-import" "^7.10.4"
+    "@babel/plugin-proposal-json-strings" "^7.10.4"
+    "@babel/plugin-proposal-nullish-coalescing-operator" "^7.10.4"
+    "@babel/plugin-proposal-numeric-separator" "^7.10.4"
+    "@babel/plugin-proposal-object-rest-spread" "^7.10.4"
+    "@babel/plugin-proposal-optional-catch-binding" "^7.10.4"
+    "@babel/plugin-proposal-optional-chaining" "^7.10.4"
+    "@babel/plugin-proposal-private-methods" "^7.10.4"
+    "@babel/plugin-proposal-unicode-property-regex" "^7.10.4"
+    "@babel/plugin-syntax-async-generators" "^7.8.0"
+    "@babel/plugin-syntax-class-properties" "^7.10.4"
+    "@babel/plugin-syntax-dynamic-import" "^7.8.0"
+    "@babel/plugin-syntax-json-strings" "^7.8.0"
+    "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0"
+    "@babel/plugin-syntax-numeric-separator" "^7.10.4"
+    "@babel/plugin-syntax-object-rest-spread" "^7.8.0"
+    "@babel/plugin-syntax-optional-catch-binding" "^7.8.0"
+    "@babel/plugin-syntax-optional-chaining" "^7.8.0"
+    "@babel/plugin-syntax-top-level-await" "^7.10.4"
+    "@babel/plugin-transform-arrow-functions" "^7.10.4"
+    "@babel/plugin-transform-async-to-generator" "^7.10.4"
+    "@babel/plugin-transform-block-scoped-functions" "^7.10.4"
+    "@babel/plugin-transform-block-scoping" "^7.10.4"
+    "@babel/plugin-transform-classes" "^7.10.4"
+    "@babel/plugin-transform-computed-properties" "^7.10.4"
+    "@babel/plugin-transform-destructuring" "^7.10.4"
+    "@babel/plugin-transform-dotall-regex" "^7.10.4"
+    "@babel/plugin-transform-duplicate-keys" "^7.10.4"
+    "@babel/plugin-transform-exponentiation-operator" "^7.10.4"
+    "@babel/plugin-transform-for-of" "^7.10.4"
+    "@babel/plugin-transform-function-name" "^7.10.4"
+    "@babel/plugin-transform-literals" "^7.10.4"
+    "@babel/plugin-transform-member-expression-literals" "^7.10.4"
+    "@babel/plugin-transform-modules-amd" "^7.10.4"
+    "@babel/plugin-transform-modules-commonjs" "^7.10.4"
+    "@babel/plugin-transform-modules-systemjs" "^7.10.4"
+    "@babel/plugin-transform-modules-umd" "^7.10.4"
+    "@babel/plugin-transform-named-capturing-groups-regex" "^7.10.4"
+    "@babel/plugin-transform-new-target" "^7.10.4"
+    "@babel/plugin-transform-object-super" "^7.10.4"
+    "@babel/plugin-transform-parameters" "^7.10.4"
+    "@babel/plugin-transform-property-literals" "^7.10.4"
+    "@babel/plugin-transform-regenerator" "^7.10.4"
+    "@babel/plugin-transform-reserved-words" "^7.10.4"
+    "@babel/plugin-transform-shorthand-properties" "^7.10.4"
+    "@babel/plugin-transform-spread" "^7.10.4"
+    "@babel/plugin-transform-sticky-regex" "^7.10.4"
+    "@babel/plugin-transform-template-literals" "^7.10.4"
+    "@babel/plugin-transform-typeof-symbol" "^7.10.4"
+    "@babel/plugin-transform-unicode-escapes" "^7.10.4"
+    "@babel/plugin-transform-unicode-regex" "^7.10.4"
+    "@babel/preset-modules" "^0.1.3"
+    "@babel/types" "^7.10.4"
+    "browserslist" "^4.12.0"
+    "core-js-compat" "^3.6.2"
+    "invariant" "^2.2.2"
+    "levenary" "^1.1.1"
+    "semver" "^5.5.0"
+
+"@babel/preset-modules@^0.1.3":
+  "version" "0.1.3"
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.0.0"
+    "@babel/plugin-proposal-unicode-property-regex" "^7.4.4"
+    "@babel/plugin-transform-dotall-regex" "^7.4.4"
+    "@babel/types" "^7.4.4"
+    "esutils" "^2.0.2"
+
+"@babel/runtime@^7.0.0", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.4":
+  "version" "7.10.4"
+  dependencies:
+    "regenerator-runtime" "^0.13.4"
+
+"@babel/template@^7.10.4", "@babel/template@^7.3.3", "@babel/template@^7.8.3":
+  "version" "7.10.4"
+  dependencies:
+    "@babel/code-frame" "^7.10.4"
+    "@babel/parser" "^7.10.4"
+    "@babel/types" "^7.10.4"
+
+"@babel/traverse@^7.1.0", "@babel/traverse@^7.10.4", "@babel/traverse@^7.8.3":
+  "version" "7.10.4"
+  dependencies:
+    "@babel/code-frame" "^7.10.4"
+    "@babel/generator" "^7.10.4"
+    "@babel/helper-function-name" "^7.10.4"
+    "@babel/helper-split-export-declaration" "^7.10.4"
+    "@babel/parser" "^7.10.4"
+    "@babel/types" "^7.10.4"
+    "debug" "^4.1.0"
+    "globals" "^11.1.0"
+    "lodash" "^4.17.13"
+
+"@babel/traverse@^7.12.1", "@babel/traverse@^7.12.5":
+  "version" "7.12.5"
+  dependencies:
+    "@babel/code-frame" "^7.10.4"
+    "@babel/generator" "^7.12.5"
+    "@babel/helper-function-name" "^7.10.4"
+    "@babel/helper-split-export-declaration" "^7.11.0"
+    "@babel/parser" "^7.12.5"
+    "@babel/types" "^7.12.5"
+    "debug" "^4.1.0"
+    "globals" "^11.1.0"
+    "lodash" "^4.17.19"
+
+"@babel/types@^7.0.0", "@babel/types@^7.10.4", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.8.3":
+  "version" "7.10.4"
+  dependencies:
+    "@babel/helper-validator-identifier" "^7.10.4"
+    "lodash" "^4.17.13"
+    "to-fast-properties" "^2.0.0"
+
+"@babel/types@^7.11.0", "@babel/types@^7.12.1", "@babel/types@^7.12.5":
+  "version" "7.12.6"
+  dependencies:
+    "@babel/helper-validator-identifier" "^7.10.4"
+    "lodash" "^4.17.19"
+    "to-fast-properties" "^2.0.0"
+
+"@bcoe/v8-coverage@^0.2.3":
+  "integrity" "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw=="
+  "resolved" "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz"
+  "version" "0.2.3"
+
+"@cnakazawa/watch@^1.0.3":
+  "integrity" "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ=="
+  "resolved" "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz"
+  "version" "1.0.4"
+  dependencies:
+    "exec-sh" "^0.3.2"
+    "minimist" "^1.2.0"
+
+"@fortawesome/angular-fontawesome@^0.6.1", "@fortawesome/angular-fontawesome@0.6.1":
+  "integrity" "sha512-ARQjtRuT+ZskzJDJKPwuiGO3+7nS0iyNLU/uHVJHfG4LwGJxwVIGldwg1SU957sra0Z0OtWEajHMhiS4vB9LwQ=="
+  "resolved" "https://registry.npmjs.org/@fortawesome/angular-fontawesome/-/angular-fontawesome-0.6.1.tgz"
+  "version" "0.6.1"
+
+"@fortawesome/fontawesome-common-types@^0.2.29", "@fortawesome/fontawesome-common-types@^0.2.35":
+  "integrity" "sha512-IHUfxSEDS9dDGqYwIW7wTN6tn/O8E0n5PcAHz9cAaBoZw6UpG20IG/YM3NNLaGPwPqgjBAFjIURzqoQs3rrtuw=="
+  "resolved" "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.35.tgz"
+  "version" "0.2.35"
+
+"@fortawesome/fontawesome-free@^5.15.3":
+  "integrity" "sha512-rFnSUN/QOtnOAgqFRooTA3H57JLDm0QEG/jPdk+tLQNL/eWd+Aok8g3qCI+Q1xuDPWpGW/i9JySpJVsq8Q0s9w=="
+  "resolved" "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-5.15.3.tgz"
+  "version" "5.15.3"
+
+"@fortawesome/fontawesome-svg-core@^1.2.21", "@fortawesome/fontawesome-svg-core@^1.2.27", "@fortawesome/fontawesome-svg-core@^1.2.29":
+  "version" "1.2.29"
+  dependencies:
+    "@fortawesome/fontawesome-common-types" "^0.2.29"
+
+"@fortawesome/free-regular-svg-icons@^5.15.3":
+  "integrity" "sha512-q4/p8Xehy9qiVTdDWHL4Z+o5PCLRChePGZRTXkl+/Z7erDVL8VcZUuqzJjs6gUz6czss4VIPBRdCz6wP37/zMQ=="
+  "resolved" "https://registry.npmjs.org/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-5.15.3.tgz"
+  "version" "5.15.3"
+  dependencies:
+    "@fortawesome/fontawesome-common-types" "^0.2.35"
+
+"@fortawesome/free-solid-svg-icons@^5.10.1", "@fortawesome/free-solid-svg-icons@5.13.1":
+  "integrity" "sha512-LQH/0L1p4+rqtoSHa9qFYR84hpuRZKqaQ41cfBQx8b68p21zoWSekTAeA54I/2x9VlCHDLFlG74Nmdg4iTPQOg=="
+  "resolved" "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.13.1.tgz"
+  "version" "5.13.1"
+  dependencies:
+    "@fortawesome/fontawesome-common-types" "^0.2.29"
+
+"@hapi/address@2.x.x":
+  "integrity" "sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ=="
+  "resolved" "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz"
+  "version" "2.1.4"
+
+"@hapi/bourne@1.x.x":
+  "integrity" "sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA=="
+  "resolved" "https://registry.npmjs.org/@hapi/bourne/-/bourne-1.3.2.tgz"
+  "version" "1.3.2"
+
+"@hapi/hoek@^8.3.0", "@hapi/hoek@8.x.x":
+  "integrity" "sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow=="
+  "resolved" "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.1.tgz"
+  "version" "8.5.1"
+
+"@hapi/joi@^15.1.0":
+  "integrity" "sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ=="
+  "resolved" "https://registry.npmjs.org/@hapi/joi/-/joi-15.1.1.tgz"
+  "version" "15.1.1"
+  dependencies:
+    "@hapi/address" "2.x.x"
+    "@hapi/bourne" "1.x.x"
+    "@hapi/hoek" "8.x.x"
+    "@hapi/topo" "3.x.x"
+
+"@hapi/topo@3.x.x":
+  "integrity" "sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ=="
+  "resolved" "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.6.tgz"
+  "version" "3.1.6"
+  dependencies:
+    "@hapi/hoek" "^8.3.0"
+
+"@istanbuljs/load-nyc-config@^1.0.0":
+  "integrity" "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ=="
+  "resolved" "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz"
+  "version" "1.1.0"
+  dependencies:
+    "camelcase" "^5.3.1"
+    "find-up" "^4.1.0"
+    "get-package-type" "^0.1.0"
+    "js-yaml" "^3.13.1"
+    "resolve-from" "^5.0.0"
+
+"@istanbuljs/schema@^0.1.2":
+  "version" "0.1.2"
+
+"@jest/console@^26.1.0":
+  "version" "26.1.0"
+  dependencies:
+    "@jest/types" "^26.1.0"
+    "chalk" "^4.0.0"
+    "jest-message-util" "^26.1.0"
+    "jest-util" "^26.1.0"
+    "slash" "^3.0.0"
+
+"@jest/core@^26.1.0":
+  "version" "26.1.0"
+  dependencies:
+    "@jest/console" "^26.1.0"
+    "@jest/reporters" "^26.1.0"
+    "@jest/test-result" "^26.1.0"
+    "@jest/transform" "^26.1.0"
+    "@jest/types" "^26.1.0"
+    "ansi-escapes" "^4.2.1"
+    "chalk" "^4.0.0"
+    "exit" "^0.1.2"
+    "graceful-fs" "^4.2.4"
+    "jest-changed-files" "^26.1.0"
+    "jest-config" "^26.1.0"
+    "jest-haste-map" "^26.1.0"
+    "jest-message-util" "^26.1.0"
+    "jest-regex-util" "^26.0.0"
+    "jest-resolve" "^26.1.0"
+    "jest-resolve-dependencies" "^26.1.0"
+    "jest-runner" "^26.1.0"
+    "jest-runtime" "^26.1.0"
+    "jest-snapshot" "^26.1.0"
+    "jest-util" "^26.1.0"
+    "jest-validate" "^26.1.0"
+    "jest-watcher" "^26.1.0"
+    "micromatch" "^4.0.2"
+    "p-each-series" "^2.1.0"
+    "rimraf" "^3.0.0"
+    "slash" "^3.0.0"
+    "strip-ansi" "^6.0.0"
+
+"@jest/environment@^26.1.0":
+  "version" "26.1.0"
+  dependencies:
+    "@jest/fake-timers" "^26.1.0"
+    "@jest/types" "^26.1.0"
+    "jest-mock" "^26.1.0"
+
+"@jest/fake-timers@^26.1.0":
+  "version" "26.1.0"
+  dependencies:
+    "@jest/types" "^26.1.0"
+    "@sinonjs/fake-timers" "^6.0.1"
+    "jest-message-util" "^26.1.0"
+    "jest-mock" "^26.1.0"
+    "jest-util" "^26.1.0"
+
+"@jest/globals@^26.1.0":
+  "version" "26.1.0"
+  dependencies:
+    "@jest/environment" "^26.1.0"
+    "@jest/types" "^26.1.0"
+    "expect" "^26.1.0"
+
+"@jest/reporters@^26.1.0":
+  "version" "26.1.0"
+  dependencies:
+    "@bcoe/v8-coverage" "^0.2.3"
+    "@jest/console" "^26.1.0"
+    "@jest/test-result" "^26.1.0"
+    "@jest/transform" "^26.1.0"
+    "@jest/types" "^26.1.0"
+    "chalk" "^4.0.0"
+    "collect-v8-coverage" "^1.0.0"
+    "exit" "^0.1.2"
+    "glob" "^7.1.2"
+    "graceful-fs" "^4.2.4"
+    "istanbul-lib-coverage" "^3.0.0"
+    "istanbul-lib-instrument" "^4.0.3"
+    "istanbul-lib-report" "^3.0.0"
+    "istanbul-lib-source-maps" "^4.0.0"
+    "istanbul-reports" "^3.0.2"
+    "jest-haste-map" "^26.1.0"
+    "jest-resolve" "^26.1.0"
+    "jest-util" "^26.1.0"
+    "jest-worker" "^26.1.0"
+    "slash" "^3.0.0"
+    "source-map" "^0.6.0"
+    "string-length" "^4.0.1"
+    "terminal-link" "^2.0.0"
+    "v8-to-istanbul" "^4.1.3"
+  optionalDependencies:
+    "node-notifier" "^7.0.0"
+
+"@jest/source-map@^26.1.0":
+  "version" "26.1.0"
+  dependencies:
+    "callsites" "^3.0.0"
+    "graceful-fs" "^4.2.4"
+    "source-map" "^0.6.0"
+
+"@jest/test-result@^26.1.0":
+  "version" "26.1.0"
+  dependencies:
+    "@jest/console" "^26.1.0"
+    "@jest/types" "^26.1.0"
+    "@types/istanbul-lib-coverage" "^2.0.0"
+    "collect-v8-coverage" "^1.0.0"
+
+"@jest/test-sequencer@^26.1.0":
+  "version" "26.1.0"
+  dependencies:
+    "@jest/test-result" "^26.1.0"
+    "graceful-fs" "^4.2.4"
+    "jest-haste-map" "^26.1.0"
+    "jest-runner" "^26.1.0"
+    "jest-runtime" "^26.1.0"
+
+"@jest/transform@^26.1.0":
+  "version" "26.1.0"
+  dependencies:
+    "@babel/core" "^7.1.0"
+    "@jest/types" "^26.1.0"
+    "babel-plugin-istanbul" "^6.0.0"
+    "chalk" "^4.0.0"
+    "convert-source-map" "^1.4.0"
+    "fast-json-stable-stringify" "^2.0.0"
+    "graceful-fs" "^4.2.4"
+    "jest-haste-map" "^26.1.0"
+    "jest-regex-util" "^26.0.0"
+    "jest-util" "^26.1.0"
+    "micromatch" "^4.0.2"
+    "pirates" "^4.0.1"
+    "slash" "^3.0.0"
+    "source-map" "^0.6.1"
+    "write-file-atomic" "^3.0.0"
+
+"@jest/types@^25.5.0":
+  "integrity" "sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw=="
+  "resolved" "https://registry.npmjs.org/@jest/types/-/types-25.5.0.tgz"
+  "version" "25.5.0"
+  dependencies:
+    "@types/istanbul-lib-coverage" "^2.0.0"
+    "@types/istanbul-reports" "^1.1.1"
+    "@types/yargs" "^15.0.0"
+    "chalk" "^3.0.0"
+
+"@jest/types@^26.1.0":
+  "version" "26.1.0"
+  dependencies:
+    "@types/istanbul-lib-coverage" "^2.0.0"
+    "@types/istanbul-reports" "^1.1.1"
+    "@types/yargs" "^15.0.0"
+    "chalk" "^4.0.0"
+
+"@mrmlnc/readdir-enhanced@^2.2.1":
+  "integrity" "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g=="
+  "resolved" "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz"
+  "version" "2.2.1"
+  dependencies:
+    "call-me-maybe" "^1.0.1"
+    "glob-to-regexp" "^0.3.0"
+
+"@ng-bootstrap/ng-bootstrap@^6.1.0", "@ng-bootstrap/ng-bootstrap@^7.0.0":
+  "integrity" "sha512-SxUaptGWJmCxM0d2Zy1mx7K7p/YBwGZ69NmmBQVY4BE6p5av0hWrVmv9rzzfBz0rhxU7RPZLor2Jpaoq8Xyl4w=="
+  "resolved" "https://registry.npmjs.org/@ng-bootstrap/ng-bootstrap/-/ng-bootstrap-7.0.0.tgz"
+  "version" "7.0.0"
+  dependencies:
+    "tslib" "^2.0.0"
+
+"@ng-select/ng-select@^4.0.4":
+  "version" "4.0.4"
+  dependencies:
+    "tslib" "^1.10.0"
+
+"@ngqp/core@^1.2.0":
+  "version" "1.2.0"
+  dependencies:
+    "tslib" "^2.0.0"
+
+"@ngtools/webpack@10.0.0":
+  "integrity" "sha512-2mnuzkCokn84PrBIiSwUqZImd5uKdsdZcpnuvgABmbxe3bAPxbOgzud/bLxG1/ynLvk/vd/FCNeDcY6HylB8OQ=="
+  "resolved" "https://registry.npmjs.org/@ngtools/webpack/-/webpack-10.0.0.tgz"
+  "version" "10.0.0"
+  dependencies:
+    "@angular-devkit/core" "10.0.0"
+    "enhanced-resolve" "4.1.1"
+    "rxjs" "6.5.5"
+    "webpack-sources" "1.4.3"
+
+"@ngx-translate/core@^12.1.2", "@ngx-translate/core@>=11.0.0", "@ngx-translate/core@12.1.2":
+  "integrity" "sha512-ZudJsqIxTKlLmPoqK8gJY3UpMGujR0Xm7HfXL6AR79yGRS23QqpjAhMfx4v5qUCcHMmQ9/78bW8QJLfp31c7vQ=="
+  "resolved" "https://registry.npmjs.org/@ngx-translate/core/-/core-12.1.2.tgz"
+  "version" "12.1.2"
+
+"@ngx-translate/http-loader@^5.0.0", "@ngx-translate/http-loader@5.0.0":
+  "integrity" "sha512-8+aV7N52qed+6t4LIu4Yru/PkeBX4TR2ioXGwXzQE5syqSLTj/8TgKQIi3i2Z61ZhPxQG1qrGbapUoGQzUDVeg=="
+  "resolved" "https://registry.npmjs.org/@ngx-translate/http-loader/-/http-loader-5.0.0.tgz"
+  "version" "5.0.0"
+
+"@nodelib/fs.scandir@2.1.3":
+  "version" "2.1.3"
+  dependencies:
+    "@nodelib/fs.stat" "2.0.3"
+    "run-parallel" "^1.1.9"
+
+"@nodelib/fs.stat@^1.1.2":
+  "integrity" "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw=="
+  "resolved" "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz"
+  "version" "1.1.3"
+
+"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.3":
+  "version" "2.0.3"
+
+"@nodelib/fs.walk@^1.2.3":
+  "version" "1.2.4"
+  dependencies:
+    "@nodelib/fs.scandir" "2.1.3"
+    "fastq" "^1.6.0"
+
+"@npmcli/move-file@^1.0.1":
+  "version" "1.0.1"
+  dependencies:
+    "mkdirp" "^1.0.4"
+
+"@openapitools/openapi-generator-cli@1.0.13-4.3.1":
+  "integrity" "sha512-hUbSHCXak8vujMpTgH5dDACq0mynya37xgPFD3JbmnwRrPrgrZ4mr3+w7QZJ5aLMCIfb2j3s96d1sWaOZYZzxA=="
+  "resolved" "https://registry.npmjs.org/@openapitools/openapi-generator-cli/-/openapi-generator-cli-1.0.13-4.3.1.tgz"
+  "version" "1.0.13-4.3.1"
+
+"@rollup/plugin-node-resolve@^7.1.1":
+  "integrity" "sha512-RxtSL3XmdTAE2byxekYLnx+98kEUOrPHF/KRVjLH+DEIHy6kjIw7YINQzn+NXiH/NTrQLAwYs0GWB+csWygA9Q=="
+  "resolved" "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-7.1.3.tgz"
+  "version" "7.1.3"
+  dependencies:
+    "@rollup/pluginutils" "^3.0.8"
+    "@types/resolve" "0.0.8"
+    "builtin-modules" "^3.1.0"
+    "is-module" "^1.0.0"
+    "resolve" "^1.14.2"
+
+"@rollup/plugin-replace@^2.3.1":
+  "version" "2.3.3"
+  dependencies:
+    "@rollup/pluginutils" "^3.0.8"
+    "magic-string" "^0.25.5"
+
+"@rollup/pluginutils@^3.0.8":
+  "integrity" "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg=="
+  "resolved" "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz"
+  "version" "3.1.0"
+  dependencies:
+    "@types/estree" "0.0.39"
+    "estree-walker" "^1.0.1"
+    "picomatch" "^2.2.2"
+
+"@samverschueren/stream-to-observable@^0.3.0":
+  "version" "0.3.0"
+  dependencies:
+    "any-observable" "^0.3.0"
+
+"@scarf/scarf@0.1.5":
+  "integrity" "sha512-Fx6atDc7JM1r0WkPCDhNetVZNp+DO21q/HGlomAKBG+k8vb1B8fg8Yige4oCf1P9OWTZWm5tM5i3jlXhrSbNOg=="
+  "resolved" "https://registry.npmjs.org/@scarf/scarf/-/scarf-0.1.5.tgz"
+  "version" "0.1.5"
+
+"@schematics/angular@10.2.3":
+  "integrity" "sha512-xcnfH5XMmGcs33VHm2cu0+4g3rkfSD+qpiKFjfg7KGC4lLoOKSED4ZnjzIYwcQ6QN4gTpAvlZKxI8zO7NkKv0A=="
+  "resolved" "https://registry.npmjs.org/@schematics/angular/-/angular-10.2.3.tgz"
+  "version" "10.2.3"
+  dependencies:
+    "@angular-devkit/core" "10.2.3"
+    "@angular-devkit/schematics" "10.2.3"
+    "jsonc-parser" "2.3.0"
+
+"@schematics/update@0.1002.3":
+  "integrity" "sha512-UnuMgRQtAOp/Pk9rSYW12medajXe9s5mW4a6foixC/B2UCFFlIAVbFBTiFpr69xbalfLlFcFx1MD+8/8njWtbQ=="
+  "resolved" "https://registry.npmjs.org/@schematics/update/-/update-0.1002.3.tgz"
+  "version" "0.1002.3"
+  dependencies:
+    "@angular-devkit/core" "10.2.3"
+    "@angular-devkit/schematics" "10.2.3"
+    "@yarnpkg/lockfile" "1.1.0"
+    "ini" "1.3.6"
+    "npm-package-arg" "^8.0.0"
+    "pacote" "9.5.12"
+    "semver" "7.3.2"
+    "semver-intersect" "1.4.0"
+
+"@sinonjs/commons@^1.7.0":
+  "version" "1.8.0"
+  dependencies:
+    "type-detect" "4.0.8"
+
+"@sinonjs/fake-timers@^6.0.1":
+  "integrity" "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA=="
+  "resolved" "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz"
+  "version" "6.0.1"
+  dependencies:
+    "@sinonjs/commons" "^1.7.0"
+
+"@surma/rollup-plugin-off-main-thread@^1.1.1":
+  "version" "1.4.1"
+  dependencies:
+    "ejs" "^2.6.1"
+    "magic-string" "^0.25.0"
+
+"@types/anymatch@*":
+  "version" "1.3.1"
+
+"@types/babel__core@^7.0.0", "@types/babel__core@^7.1.7":
+  "version" "7.1.9"
+  dependencies:
+    "@babel/parser" "^7.1.0"
+    "@babel/types" "^7.0.0"
+    "@types/babel__generator" "*"
+    "@types/babel__template" "*"
+    "@types/babel__traverse" "*"
+
+"@types/babel__generator@*":
+  "version" "7.6.1"
+  dependencies:
+    "@babel/types" "^7.0.0"
+
+"@types/babel__template@*":
+  "version" "7.0.2"
+  dependencies:
+    "@babel/parser" "^7.1.0"
+    "@babel/types" "^7.0.0"
+
+"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6":
+  "version" "7.0.12"
+  dependencies:
+    "@babel/types" "^7.3.0"
+
+"@types/chai-string@1.4.2":
+  "integrity" "sha512-ld/1hV5qcPRGuwlPdvRfvM3Ka/iofOk2pH4VkasK4b1JJP1LjNmWWn0LsISf6RRzyhVOvs93rb9tM09e+UuF8Q=="
+  "resolved" "https://registry.npmjs.org/@types/chai-string/-/chai-string-1.4.2.tgz"
+  "version" "1.4.2"
+  dependencies:
+    "@types/chai" "*"
+
+"@types/chai@*", "@types/chai@4.2.11":
+  "integrity" "sha512-t7uW6eFafjO+qJ3BIV2gGUyZs27egcNRkUdalkud+Qa3+kg//f129iuOFivHDXQ+vnU3fDXuwgv0cqMCbcE8sw=="
+  "resolved" "https://registry.npmjs.org/@types/chai/-/chai-4.2.11.tgz"
+  "version" "4.2.11"
+
+"@types/color-name@^1.1.1":
+  "version" "1.1.1"
+
+"@types/concat-stream@^1.6.0":
+  "integrity" "sha1-OU2+C7X+5Gs42JZzXoto7yOQ0A0="
+  "resolved" "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.0.tgz"
+  "version" "1.6.0"
+  dependencies:
+    "@types/node" "*"
+
+"@types/eslint-visitor-keys@^1.0.0":
+  "integrity" "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag=="
+  "resolved" "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz"
+  "version" "1.0.0"
+
+"@types/estree@*", "@types/estree@0.0.39":
+  "integrity" "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw=="
+  "resolved" "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz"
+  "version" "0.0.39"
+
+"@types/form-data@0.0.33":
+  "integrity" "sha1-yayFsqX9GENbjIXZ7LUObWyJP/g="
+  "resolved" "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz"
+  "version" "0.0.33"
+  dependencies:
+    "@types/node" "*"
+
+"@types/glob@^7.1.1":
+  "version" "7.1.2"
+  dependencies:
+    "@types/minimatch" "*"
+    "@types/node" "*"
+
+"@types/graceful-fs@^4.1.2":
+  "version" "4.1.3"
+  dependencies:
+    "@types/node" "*"
+
+"@types/html-minifier-terser@^5.0.0":
+  "version" "5.1.0"
+
+"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1":
+  "integrity" "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw=="
+  "resolved" "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz"
+  "version" "2.0.3"
+
+"@types/istanbul-lib-report@*":
+  "integrity" "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg=="
+  "resolved" "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz"
+  "version" "3.0.0"
+  dependencies:
+    "@types/istanbul-lib-coverage" "*"
+
+"@types/istanbul-reports@^1.1.1":
+  "integrity" "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw=="
+  "resolved" "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz"
+  "version" "1.1.2"
+  dependencies:
+    "@types/istanbul-lib-coverage" "*"
+    "@types/istanbul-lib-report" "*"
+
+"@types/jest@26.0.3":
+  "integrity" "sha512-v89ga1clpVL/Y1+YI0eIu1VMW+KU7Xl8PhylVtDKVWaSUHBHYPLXMQGBdrpHewaKoTvlXkksbYqPgz8b4cmRZg=="
+  "resolved" "https://registry.npmjs.org/@types/jest/-/jest-26.0.3.tgz"
+  "version" "26.0.3"
+  dependencies:
+    "jest-diff" "^25.2.1"
+    "pretty-format" "^25.2.1"
+
+"@types/json-schema@^7.0.3", "@types/json-schema@^7.0.4":
+  "version" "7.0.5"
+
+"@types/lodash@^4.14.170":
+  "version" "4.14.170"
+
+"@types/marked@^1.1.0":
+  "integrity" "sha512-wLfw1hnuuDYrFz97IzJja0pdVsC0oedtS4QsKH1/inyW9qkLQbXgMUqEQT0MVtUBx3twjWeInUfjQbhBVLECXw=="
+  "resolved" "https://registry.npmjs.org/@types/marked/-/marked-1.2.2.tgz"
+  "version" "1.2.2"
+
+"@types/minimatch@*", "@types/minimatch@^3.0.3":
+  "version" "3.0.3"
+
+"@types/minimist@^1.2.0":
+  "integrity" "sha512-fZQQafSREFyuZcdWFAExYjBiCL7AUCdgsk80iO0q4yihYYdcIiH28CcuPTGFgLOCC8RlW49GSQxdHwZP+I7CNg=="
+  "resolved" "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.1.tgz"
+  "version" "1.2.1"
+
+"@types/mocha@7.0.2":
+  "integrity" "sha512-ZvO2tAcjmMi8V/5Z3JsyofMe3hasRcaw88cto5etSVMwVQfeivGAlEYmaQgceUSVYFofVjT+ioHsATjdWcFt1w=="
+  "resolved" "https://registry.npmjs.org/@types/mocha/-/mocha-7.0.2.tgz"
+  "version" "7.0.2"
+
+"@types/node@*", "@types/node@^13.13.52":
+  "version" "13.13.52"
+
+"@types/node@^10.0.3":
+  "version" "10.17.44"
+
+"@types/node@^8.0.0":
+  "integrity" "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw=="
+  "resolved" "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz"
+  "version" "8.10.66"
+
+"@types/normalize-package-data@^2.4.0":
+  "integrity" "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA=="
+  "resolved" "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz"
+  "version" "2.4.0"
+
+"@types/parse-json@^4.0.0":
+  "integrity" "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA=="
+  "resolved" "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz"
+  "version" "4.0.0"
+
+"@types/prettier@^2.0.0":
+  "version" "2.0.1"
+
+"@types/prismjs@^1.16.5":
+  "version" "1.16.5"
+
+"@types/q@^0.0.32":
+  "integrity" "sha1-vShOV8hPEyXacCur/IKlMoGQwMU="
+  "resolved" "https://registry.npmjs.org/@types/q/-/q-0.0.32.tgz"
+  "version" "0.0.32"
+
+"@types/q@^1.5.1":
+  "integrity" "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug=="
+  "resolved" "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz"
+  "version" "1.5.4"
+
+"@types/qs@^6.2.31":
+  "version" "6.9.5"
+
+"@types/resolve@0.0.8":
+  "integrity" "sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ=="
+  "resolved" "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.8.tgz"
+  "version" "0.0.8"
+  dependencies:
+    "@types/node" "*"
+
+"@types/selenium-webdriver@^3.0.0":
+  "integrity" "sha512-tGomyEuzSC1H28y2zlW6XPCaDaXFaD6soTdb4GNdmte2qfHtrKqhy0ZFs4r/1hpazCfEZqeTSRLvSasmEx89uw=="
+  "resolved" "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-3.0.17.tgz"
+  "version" "3.0.17"
+
+"@types/selenium-webdriver@4.0.9":
+  "integrity" "sha512-HopIwBE7GUXsscmt/J0DhnFXLSmO04AfxT6b8HAprknwka7pqEWquWDMXxCjd+NUHK9MkCe1SDKKsMiNmCItbQ=="
+  "resolved" "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-4.0.9.tgz"
+  "version" "4.0.9"
+
+"@types/source-list-map@*":
+  "integrity" "sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA=="
+  "resolved" "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz"
+  "version" "0.1.2"
+
+"@types/stack-utils@^1.0.1":
+  "version" "1.0.1"
+
+"@types/tapable@*", "@types/tapable@^1.0.5":
+  "version" "1.0.6"
+
+"@types/uglify-js@*":
+  "version" "3.9.2"
+  dependencies:
+    "source-map" "^0.6.1"
+
+"@types/webpack-sources@*":
+  "version" "1.4.0"
+  dependencies:
+    "@types/node" "*"
+    "@types/source-list-map" "*"
+    "source-map" "^0.7.3"
+
+"@types/webpack@^4.41.8":
+  "version" "4.41.18"
+  dependencies:
+    "@types/anymatch" "*"
+    "@types/node" "*"
+    "@types/tapable" "*"
+    "@types/uglify-js" "*"
+    "@types/webpack-sources" "*"
+    "source-map" "^0.6.0"
+
+"@types/yargs-parser@*":
+  "version" "15.0.0"
+
+"@types/yargs@^15.0.0":
+  "version" "15.0.5"
+  dependencies:
+    "@types/yargs-parser" "*"
+
+"@typescript-eslint/eslint-plugin-tslint@2.30.0":
+  "integrity" "sha512-phARGRY1SyAkG9uVhF7o0yjK1eqmGYCwM7JpNkOo/50d68ZG0V/P9VyYMSKAj+IbRlZ/k2rKFibKZvfLJPcFGw=="
+  "resolved" "https://registry.npmjs.org/@typescript-eslint/eslint-plugin-tslint/-/eslint-plugin-tslint-2.30.0.tgz"
+  "version" "2.30.0"
+  dependencies:
+    "@typescript-eslint/experimental-utils" "2.30.0"
+    "lodash" "^4.17.15"
+
+"@typescript-eslint/eslint-plugin@^2.0.0", "@typescript-eslint/eslint-plugin@2.30.0":
+  "integrity" "sha512-PGejii0qIZ9Q40RB2jIHyUpRWs1GJuHP1pkoCiaeicfwO9z7Fx03NQzupuyzAmv+q9/gFNHu7lo1ByMXe8PNyg=="
+  "resolved" "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.30.0.tgz"
+  "version" "2.30.0"
+  dependencies:
+    "@typescript-eslint/experimental-utils" "2.30.0"
+    "functional-red-black-tree" "^1.0.1"
+    "regexpp" "^3.0.0"
+    "tsutils" "^3.17.1"
+
+"@typescript-eslint/experimental-utils@2.30.0":
+  "integrity" "sha512-L3/tS9t+hAHksy8xuorhOzhdefN0ERPDWmR9CclsIGOUqGKy6tqc/P+SoXeJRye5gazkuPO0cK9MQRnolykzkA=="
+  "resolved" "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.30.0.tgz"
+  "version" "2.30.0"
+  dependencies:
+    "@types/json-schema" "^7.0.3"
+    "@typescript-eslint/typescript-estree" "2.30.0"
+    "eslint-scope" "^5.0.0"
+    "eslint-utils" "^2.0.0"
+
+"@typescript-eslint/parser@^2.0.0", "@typescript-eslint/parser@2.30.0":
+  "integrity" "sha512-9kDOxzp0K85UnpmPJqUzdWaCNorYYgk1yZmf4IKzpeTlSAclnFsrLjfwD9mQExctLoLoGAUXq1co+fbr+3HeFw=="
+  "resolved" "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.30.0.tgz"
+  "version" "2.30.0"
+  dependencies:
+    "@types/eslint-visitor-keys" "^1.0.0"
+    "@typescript-eslint/experimental-utils" "2.30.0"
+    "@typescript-eslint/typescript-estree" "2.30.0"
+    "eslint-visitor-keys" "^1.1.0"
+
+"@typescript-eslint/typescript-estree@2.30.0":
+  "integrity" "sha512-nI5WOechrA0qAhnr+DzqwmqHsx7Ulr/+0H7bWCcClDhhWkSyZR5BmTvnBEyONwJCTWHfc5PAQExX24VD26IAVw=="
+  "resolved" "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.30.0.tgz"
+  "version" "2.30.0"
+  dependencies:
+    "debug" "^4.1.1"
+    "eslint-visitor-keys" "^1.1.0"
+    "glob" "^7.1.6"
+    "is-glob" "^4.0.1"
+    "lodash" "^4.17.15"
+    "semver" "^6.3.0"
+    "tsutils" "^3.17.1"
+
+"@ungap/promise-all-settled@1.1.2":
+  "integrity" "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q=="
+  "resolved" "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz"
+  "version" "1.1.2"
+
+"@webassemblyjs/ast@1.9.0":
+  "integrity" "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA=="
+  "resolved" "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz"
+  "version" "1.9.0"
+  dependencies:
+    "@webassemblyjs/helper-module-context" "1.9.0"
+    "@webassemblyjs/helper-wasm-bytecode" "1.9.0"
+    "@webassemblyjs/wast-parser" "1.9.0"
+
+"@webassemblyjs/floating-point-hex-parser@1.9.0":
+  "integrity" "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA=="
+  "resolved" "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz"
+  "version" "1.9.0"
+
+"@webassemblyjs/helper-api-error@1.9.0":
+  "integrity" "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw=="
+  "resolved" "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz"
+  "version" "1.9.0"
+
+"@webassemblyjs/helper-buffer@1.9.0":
+  "integrity" "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA=="
+  "resolved" "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz"
+  "version" "1.9.0"
+
+"@webassemblyjs/helper-code-frame@1.9.0":
+  "integrity" "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA=="
+  "resolved" "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz"
+  "version" "1.9.0"
+  dependencies:
+    "@webassemblyjs/wast-printer" "1.9.0"
+
+"@webassemblyjs/helper-fsm@1.9.0":
+  "integrity" "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw=="
+  "resolved" "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz"
+  "version" "1.9.0"
+
+"@webassemblyjs/helper-module-context@1.9.0":
+  "integrity" "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g=="
+  "resolved" "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz"
+  "version" "1.9.0"
+  dependencies:
+    "@webassemblyjs/ast" "1.9.0"
+
+"@webassemblyjs/helper-wasm-bytecode@1.9.0":
+  "integrity" "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw=="
+  "resolved" "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz"
+  "version" "1.9.0"
+
+"@webassemblyjs/helper-wasm-section@1.9.0":
+  "integrity" "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw=="
+  "resolved" "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz"
+  "version" "1.9.0"
+  dependencies:
+    "@webassemblyjs/ast" "1.9.0"
+    "@webassemblyjs/helper-buffer" "1.9.0"
+    "@webassemblyjs/helper-wasm-bytecode" "1.9.0"
+    "@webassemblyjs/wasm-gen" "1.9.0"
+
+"@webassemblyjs/ieee754@1.9.0":
+  "integrity" "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg=="
+  "resolved" "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz"
+  "version" "1.9.0"
+  dependencies:
+    "@xtuc/ieee754" "^1.2.0"
+
+"@webassemblyjs/leb128@1.9.0":
+  "integrity" "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw=="
+  "resolved" "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz"
+  "version" "1.9.0"
+  dependencies:
+    "@xtuc/long" "4.2.2"
+
+"@webassemblyjs/utf8@1.9.0":
+  "integrity" "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w=="
+  "resolved" "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz"
+  "version" "1.9.0"
+
+"@webassemblyjs/wasm-edit@1.9.0":
+  "integrity" "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw=="
+  "resolved" "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz"
+  "version" "1.9.0"
+  dependencies:
+    "@webassemblyjs/ast" "1.9.0"
+    "@webassemblyjs/helper-buffer" "1.9.0"
+    "@webassemblyjs/helper-wasm-bytecode" "1.9.0"
+    "@webassemblyjs/helper-wasm-section" "1.9.0"
+    "@webassemblyjs/wasm-gen" "1.9.0"
+    "@webassemblyjs/wasm-opt" "1.9.0"
+    "@webassemblyjs/wasm-parser" "1.9.0"
+    "@webassemblyjs/wast-printer" "1.9.0"
+
+"@webassemblyjs/wasm-gen@1.9.0":
+  "integrity" "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA=="
+  "resolved" "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz"
+  "version" "1.9.0"
+  dependencies:
+    "@webassemblyjs/ast" "1.9.0"
+    "@webassemblyjs/helper-wasm-bytecode" "1.9.0"
+    "@webassemblyjs/ieee754" "1.9.0"
+    "@webassemblyjs/leb128" "1.9.0"
+    "@webassemblyjs/utf8" "1.9.0"
+
+"@webassemblyjs/wasm-opt@1.9.0":
+  "integrity" "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A=="
+  "resolved" "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz"
+  "version" "1.9.0"
+  dependencies:
+    "@webassemblyjs/ast" "1.9.0"
+    "@webassemblyjs/helper-buffer" "1.9.0"
+    "@webassemblyjs/wasm-gen" "1.9.0"
+    "@webassemblyjs/wasm-parser" "1.9.0"
+
+"@webassemblyjs/wasm-parser@1.9.0":
+  "integrity" "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA=="
+  "resolved" "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz"
+  "version" "1.9.0"
+  dependencies:
+    "@webassemblyjs/ast" "1.9.0"
+    "@webassemblyjs/helper-api-error" "1.9.0"
+    "@webassemblyjs/helper-wasm-bytecode" "1.9.0"
+    "@webassemblyjs/ieee754" "1.9.0"
+    "@webassemblyjs/leb128" "1.9.0"
+    "@webassemblyjs/utf8" "1.9.0"
+
+"@webassemblyjs/wast-parser@1.9.0":
+  "integrity" "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw=="
+  "resolved" "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz"
+  "version" "1.9.0"
+  dependencies:
+    "@webassemblyjs/ast" "1.9.0"
+    "@webassemblyjs/floating-point-hex-parser" "1.9.0"
+    "@webassemblyjs/helper-api-error" "1.9.0"
+    "@webassemblyjs/helper-code-frame" "1.9.0"
+    "@webassemblyjs/helper-fsm" "1.9.0"
+    "@xtuc/long" "4.2.2"
+
+"@webassemblyjs/wast-printer@1.9.0":
+  "integrity" "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA=="
+  "resolved" "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz"
+  "version" "1.9.0"
+  dependencies:
+    "@webassemblyjs/ast" "1.9.0"
+    "@webassemblyjs/wast-parser" "1.9.0"
+    "@xtuc/long" "4.2.2"
+
+"@xtuc/ieee754@^1.2.0":
+  "integrity" "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA=="
+  "resolved" "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz"
+  "version" "1.2.0"
+
+"@xtuc/long@4.2.2":
+  "integrity" "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ=="
+  "resolved" "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz"
+  "version" "4.2.2"
+
+"@yarnpkg/lockfile@1.1.0":
+  "integrity" "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ=="
+  "resolved" "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz"
+  "version" "1.1.0"
+
+"abab@^2.0.3":
+  "version" "2.0.3"
+
+"accepts@~1.3.4", "accepts@~1.3.5", "accepts@~1.3.7":
+  "integrity" "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA=="
+  "resolved" "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz"
+  "version" "1.3.7"
+  dependencies:
+    "mime-types" "~2.1.24"
+    "negotiator" "0.6.2"
+
+"acorn-globals@^6.0.0":
+  "integrity" "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg=="
+  "resolved" "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz"
+  "version" "6.0.0"
+  dependencies:
+    "acorn" "^7.1.1"
+    "acorn-walk" "^7.1.1"
+
+"acorn-jsx@^5.2.0":
+  "version" "5.2.0"
+
+"acorn-walk@^7.1.1":
+  "integrity" "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA=="
+  "resolved" "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz"
+  "version" "7.2.0"
+
+"acorn@^6.0.0 || ^7.0.0", "acorn@^7.1.0", "acorn@^7.1.1":
+  "version" "7.3.1"
+
+"acorn@^6.4.1":
+  "version" "6.4.1"
+
+"adm-zip@^0.4.9":
+  "integrity" "sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg=="
+  "resolved" "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz"
+  "version" "0.4.16"
+
+"after@0.8.2":
+  "integrity" "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8="
+  "resolved" "https://registry.npmjs.org/after/-/after-0.8.2.tgz"
+  "version" "0.8.2"
+
+"agent-base@^4.3.0", "agent-base@4":
+  "integrity" "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg=="
+  "resolved" "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz"
+  "version" "4.3.0"
+  dependencies:
+    "es6-promisify" "^5.0.0"
+
+"agent-base@~4.2.1":
+  "integrity" "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg=="
+  "resolved" "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz"
+  "version" "4.2.1"
+  dependencies:
+    "es6-promisify" "^5.0.0"
+
+"agentkeepalive@^3.4.1":
+  "integrity" "sha512-e0L/HNe6qkQ7H19kTlRRqUibEAwDK5AFk6y3PtMsuut2VAH6+Q4xZml1tNDJD7kSAyqmbG/K08K5WEJYtUrSlQ=="
+  "resolved" "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-3.5.2.tgz"
+  "version" "3.5.2"
+  dependencies:
+    "humanize-ms" "^1.2.1"
+
+"aggregate-error@^3.0.0":
+  "version" "3.0.1"
+  dependencies:
+    "clean-stack" "^2.0.0"
+    "indent-string" "^4.0.0"
+
+"ajv-errors@^1.0.0":
+  "integrity" "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ=="
+  "resolved" "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz"
+  "version" "1.0.1"
+
+"ajv-keywords@^3.1.0", "ajv-keywords@^3.4.1":
+  "version" "3.5.0"
+
+"ajv@^6.1.0", "ajv@^6.10.0", "ajv@^6.10.2", "ajv@^6.12.2", "ajv@^6.5.5", "ajv@^6.9.1", "ajv@>=5.0.0", "ajv@6.12.2":
+  "integrity" "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ=="
+  "resolved" "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz"
+  "version" "6.12.2"
+  dependencies:
+    "fast-deep-equal" "^3.1.1"
+    "fast-json-stable-stringify" "^2.0.0"
+    "json-schema-traverse" "^0.4.1"
+    "uri-js" "^4.2.2"
+
+"ajv@6.12.4":
+  "integrity" "sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ=="
+  "resolved" "https://registry.npmjs.org/ajv/-/ajv-6.12.4.tgz"
+  "version" "6.12.4"
+  dependencies:
+    "fast-deep-equal" "^3.1.1"
+    "fast-json-stable-stringify" "^2.0.0"
+    "json-schema-traverse" "^0.4.1"
+    "uri-js" "^4.2.2"
+
+"alphanum-sort@^1.0.0":
+  "integrity" "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM="
+  "resolved" "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz"
+  "version" "1.0.2"
+
+"angular-tag-cloud-module@^5.3.0":
+  "integrity" "sha512-tzaNISF+XgaQPf6zI+WMQKbqQNdQuKPsyUnY39iovxn5htTXj5R6wnejla4iSf9glDBEEkdXozOjIWYkjSxAtQ=="
+  "resolved" "https://registry.npmjs.org/angular-tag-cloud-module/-/angular-tag-cloud-module-5.3.0.tgz"
+  "version" "5.3.0"
+  dependencies:
+    "tslib" "^2.0.0"
+
+"ansi-colors@^1.0.1":
+  "integrity" "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA=="
+  "resolved" "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz"
+  "version" "1.1.0"
+  dependencies:
+    "ansi-wrap" "^0.1.0"
+
+"ansi-colors@^3.0.0":
+  "integrity" "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA=="
+  "resolved" "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz"
+  "version" "3.2.4"
+
+"ansi-colors@4.1.1":
+  "integrity" "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA=="
+  "resolved" "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz"
+  "version" "4.1.1"
+
+"ansi-escapes@^1.1.0":
+  "integrity" "sha1-06ioOzGapneTZisT52HHkRQiMG4="
+  "resolved" "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz"
+  "version" "1.4.0"
+
+"ansi-escapes@^3.0.0":
+  "integrity" "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ=="
+  "resolved" "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz"
+  "version" "3.2.0"
+
+"ansi-escapes@^3.2.0":
+  "integrity" "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ=="
+  "resolved" "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz"
+  "version" "3.2.0"
+
+"ansi-escapes@^4.2.1":
+  "version" "4.3.1"
+  dependencies:
+    "type-fest" "^0.11.0"
+
+"ansi-font@0.0.2":
+  "integrity" "sha1-iQMBvVhBRi/TnAt3Ca/R9SUUMzE="
+  "resolved" "https://registry.npmjs.org/ansi-font/-/ansi-font-0.0.2.tgz"
+  "version" "0.0.2"
+
+"ansi-html@0.0.7":
+  "integrity" "sha1-gTWEAhliqenm/QOflA0S9WynhZ4="
+  "resolved" "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz"
+  "version" "0.0.7"
+
+"ansi-regex@^2.0.0":
+  "integrity" "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
+  "resolved" "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz"
+  "version" "2.1.1"
+
+"ansi-regex@^3.0.0":
+  "integrity" "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg="
+  "resolved" "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz"
+  "version" "3.0.0"
+
+"ansi-regex@^4.1.0":
+  "integrity" "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg=="
+  "resolved" "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz"
+  "version" "4.1.0"
+
+"ansi-regex@^5.0.0":
+  "integrity" "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg=="
+  "resolved" "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz"
+  "version" "5.0.0"
+
+"ansi-styles@^2.2.1":
+  "integrity" "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4="
+  "resolved" "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz"
+  "version" "2.2.1"
+
+"ansi-styles@^3.2.0", "ansi-styles@^3.2.1":
+  "integrity" "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA=="
+  "resolved" "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz"
+  "version" "3.2.1"
+  dependencies:
+    "color-convert" "^1.9.0"
+
+"ansi-styles@^4.0.0":
+  "version" "4.2.1"
+  dependencies:
+    "@types/color-name" "^1.1.1"
+    "color-convert" "^2.0.1"
+
+"ansi-styles@^4.1.0":
+  "integrity" "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="
+  "resolved" "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz"
+  "version" "4.3.0"
+  dependencies:
+    "color-convert" "^2.0.1"
+
+"ansi-wrap@^0.1.0":
+  "integrity" "sha1-qCJQ3bABXponyoLoLqYDu/pF768="
+  "resolved" "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz"
+  "version" "0.1.0"
+
+"ansi@^0.3.0", "ansi@~0.3.1":
+  "integrity" "sha1-DELU+xcWDVqa8eSEus4cZpIsGyE="
+  "resolved" "https://registry.npmjs.org/ansi/-/ansi-0.3.1.tgz"
+  "version" "0.3.1"
+
+"any-observable@^0.3.0":
+  "integrity" "sha512-/FQM1EDkTsf63Ub2C6O7GuYFDsSXUwsaZDurV0np41ocwq0jthUAYCmhBX9f+KwlaCgIuWyr/4WlUQUBfKfZog=="
+  "resolved" "https://registry.npmjs.org/any-observable/-/any-observable-0.3.0.tgz"
+  "version" "0.3.0"
+
+"anymatch@^2.0.0":
+  "integrity" "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw=="
+  "resolved" "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz"
+  "version" "2.0.0"
+  dependencies:
+    "micromatch" "^3.1.4"
+    "normalize-path" "^2.1.1"
+
+"anymatch@^3.0.3", "anymatch@~3.1.1":
+  "version" "3.1.1"
+  dependencies:
+    "normalize-path" "^3.0.0"
+    "picomatch" "^2.0.4"
+
+"app-root-path@^2.2.1":
+  "integrity" "sha512-91IFKeKk7FjfmezPKkwtaRvSpnUc4gDwPAjA1YZ9Gn0q0PPeW+vbeUsZuyDwjI7+QTHhcLen2v25fi/AmhvbJA=="
+  "resolved" "https://registry.npmjs.org/app-root-path/-/app-root-path-2.2.1.tgz"
+  "version" "2.2.1"
+
+"aproba@^1.1.1":
+  "integrity" "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw=="
+  "resolved" "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz"
+  "version" "1.2.0"
+
+"are-we-there-yet@~1.1.2":
+  "integrity" "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w=="
+  "resolved" "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz"
+  "version" "1.1.5"
+  dependencies:
+    "delegates" "^1.0.0"
+    "readable-stream" "^2.0.6"
+
+"arg@^4.1.0":
+  "integrity" "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA=="
+  "resolved" "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz"
+  "version" "4.1.3"
+
+"argparse@^1.0.7":
+  "integrity" "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="
+  "resolved" "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz"
+  "version" "1.0.10"
+  dependencies:
+    "sprintf-js" "~1.0.2"
+
+"argparse@^2.0.1":
+  "integrity" "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="
+  "resolved" "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz"
+  "version" "2.0.1"
+
+"aria-query@^3.0.0":
+  "integrity" "sha1-ZbP8wcoRVajJrmTW7uKX8V1RM8w="
+  "resolved" "https://registry.npmjs.org/aria-query/-/aria-query-3.0.0.tgz"
+  "version" "3.0.0"
+  dependencies:
+    "ast-types-flow" "0.0.7"
+    "commander" "^2.11.0"
+
+"arr-diff@^4.0.0":
+  "integrity" "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA="
+  "resolved" "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz"
+  "version" "4.0.0"
+
+"arr-flatten@^1.1.0":
+  "integrity" "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg=="
+  "resolved" "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz"
+  "version" "1.1.0"
+
+"arr-union@^3.1.0":
+  "integrity" "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ="
+  "resolved" "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz"
+  "version" "3.1.0"
+
+"array-differ@^3.0.0":
+  "integrity" "sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg=="
+  "resolved" "https://registry.npmjs.org/array-differ/-/array-differ-3.0.0.tgz"
+  "version" "3.0.0"
+
+"array-flatten@^2.1.0":
+  "integrity" "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ=="
+  "resolved" "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz"
+  "version" "2.1.2"
+
+"array-flatten@1.1.1":
+  "integrity" "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
+  "resolved" "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz"
+  "version" "1.1.1"
+
+"array-union@^1.0.1":
+  "integrity" "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk="
+  "resolved" "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz"
+  "version" "1.0.2"
+  dependencies:
+    "array-uniq" "^1.0.1"
+
+"array-union@^1.0.2":
+  "integrity" "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk="
+  "resolved" "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz"
+  "version" "1.0.2"
+  dependencies:
+    "array-uniq" "^1.0.1"
+
+"array-union@^2.1.0":
+  "integrity" "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw=="
+  "resolved" "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz"
+  "version" "2.1.0"
+
+"array-uniq@^1.0.1":
+  "integrity" "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY="
+  "resolved" "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz"
+  "version" "1.0.3"
+
+"array-unique@^0.3.2":
+  "integrity" "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg="
+  "resolved" "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz"
+  "version" "0.3.2"
+
+"arraybuffer.slice@~0.0.7":
+  "integrity" "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog=="
+  "resolved" "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz"
+  "version" "0.0.7"
+
+"arrify@^1.0.0":
+  "integrity" "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0="
+  "resolved" "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz"
+  "version" "1.0.1"
+
+"arrify@^1.0.1":
+  "integrity" "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0="
+  "resolved" "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz"
+  "version" "1.0.1"
+
+"arrify@^2.0.1":
+  "integrity" "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug=="
+  "resolved" "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz"
+  "version" "2.0.1"
+
+"asap@^2.0.0", "asap@~2.0.6":
+  "integrity" "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY="
+  "resolved" "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz"
+  "version" "2.0.6"
+
+"asn1.js@^4.0.0":
+  "version" "4.10.1"
+  dependencies:
+    "bn.js" "^4.0.0"
+    "inherits" "^2.0.1"
+    "minimalistic-assert" "^1.0.0"
+
+"asn1@~0.2.3":
+  "integrity" "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg=="
+  "resolved" "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz"
+  "version" "0.2.4"
+  dependencies:
+    "safer-buffer" "~2.1.0"
+
+"assert-plus@^1.0.0", "assert-plus@1.0.0":
+  "integrity" "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
+  "resolved" "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz"
+  "version" "1.0.0"
+
+"assert@^1.1.1":
+  "integrity" "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA=="
+  "resolved" "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz"
+  "version" "1.5.0"
+  dependencies:
+    "object-assign" "^4.1.1"
+    "util" "0.10.3"
+
+"assertion-error@^1.1.0":
+  "integrity" "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw=="
+  "resolved" "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz"
+  "version" "1.1.0"
+
+"assign-symbols@^1.0.0":
+  "integrity" "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c="
+  "resolved" "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz"
+  "version" "1.0.0"
+
+"ast-types-flow@0.0.7":
+  "integrity" "sha1-9wtzXGvKGlycItmCw+Oef+ujva0="
+  "resolved" "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz"
+  "version" "0.0.7"
+
+"astral-regex@^1.0.0":
+  "integrity" "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg=="
+  "resolved" "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz"
+  "version" "1.0.0"
+
+"async-each-series@0.1.1":
+  "integrity" "sha1-dhfBkXQB/Yykooqtzj266Yr+tDI="
+  "resolved" "https://registry.npmjs.org/async-each-series/-/async-each-series-0.1.1.tgz"
+  "version" "0.1.1"
+
+"async-each@^1.0.1":
+  "integrity" "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ=="
+  "resolved" "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz"
+  "version" "1.0.3"
+
+"async-limiter@~1.0.0":
+  "integrity" "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ=="
+  "resolved" "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz"
+  "version" "1.0.1"
+
+"async@^2.6.1":
+  "integrity" "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg=="
+  "resolved" "https://registry.npmjs.org/async/-/async-2.6.3.tgz"
+  "version" "2.6.3"
+  dependencies:
+    "lodash" "^4.17.14"
+
+"async@^2.6.2":
+  "integrity" "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg=="
+  "resolved" "https://registry.npmjs.org/async/-/async-2.6.3.tgz"
+  "version" "2.6.3"
+  dependencies:
+    "lodash" "^4.17.14"
+
+"async@0.9.x":
+  "integrity" "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0="
+  "resolved" "https://registry.npmjs.org/async/-/async-0.9.2.tgz"
+  "version" "0.9.2"
+
+"async@1.5.2":
+  "integrity" "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo="
+  "resolved" "https://registry.npmjs.org/async/-/async-1.5.2.tgz"
+  "version" "1.5.2"
+
+"asynckit@^0.4.0":
+  "integrity" "sha1-x57Zf380y48robyXkLzDZkdLS3k="
+  "resolved" "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz"
+  "version" "0.4.0"
+
+"atob@^2.1.2":
+  "integrity" "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg=="
+  "resolved" "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz"
+  "version" "2.1.2"
+
+"autoprefixer@9.8.4":
+  "integrity" "sha512-84aYfXlpUe45lvmS+HoAWKCkirI/sw4JK0/bTeeqgHYco3dcsOn0NqdejISjptsYwNji/21dnkDri9PsYKk89A=="
+  "resolved" "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.4.tgz"
+  "version" "9.8.4"
+  dependencies:
+    "browserslist" "^4.12.0"
+    "caniuse-lite" "^1.0.30001087"
+    "colorette" "^1.2.0"
+    "normalize-range" "^0.1.2"
+    "num2fraction" "^1.2.2"
+    "postcss" "^7.0.32"
+    "postcss-value-parser" "^4.1.0"
+
+"aws-sdk@2.706.0":
+  "integrity" "sha512-7GT+yrB5Wb/zOReRdv/Pzkb2Qt+hz6B/8FGMVaoysX3NryHvQUdz7EQWi5yhg9CxOjKxdw5lFwYSs69YlSp1KA=="
+  "resolved" "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.706.0.tgz"
+  "version" "2.706.0"
+  dependencies:
+    "buffer" "4.9.2"
+    "events" "1.1.1"
+    "ieee754" "1.1.13"
+    "jmespath" "0.15.0"
+    "querystring" "0.2.0"
+    "sax" "1.2.1"
+    "url" "0.10.3"
+    "uuid" "3.3.2"
+    "xml2js" "0.4.19"
+
+"aws-sign2@~0.7.0":
+  "integrity" "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg="
+  "resolved" "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz"
+  "version" "0.7.0"
+
+"aws4@^1.8.0":
+  "version" "1.10.0"
+
+"axios@^0.21.1", "axios@0.21.1":
+  "integrity" "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA=="
+  "resolved" "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz"
+  "version" "0.21.1"
+  dependencies:
+    "follow-redirects" "^1.10.0"
+
+"axios@0.19.2":
+  "integrity" "sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA=="
+  "resolved" "https://registry.npmjs.org/axios/-/axios-0.19.2.tgz"
+  "version" "0.19.2"
+  dependencies:
+    "follow-redirects" "1.5.10"
+
+"axobject-query@2.0.2":
+  "integrity" "sha512-MCeek8ZH7hKyO1rWUbKNQBbl4l2eY0ntk7OGi+q0RlafrCnfPxC06WZA+uebCfmYp4mNU9jRBP1AhGyf8+W3ww=="
+  "resolved" "https://registry.npmjs.org/axobject-query/-/axobject-query-2.0.2.tgz"
+  "version" "2.0.2"
+  dependencies:
+    "ast-types-flow" "0.0.7"
+
+"babel-extract-comments@^1.0.0":
+  "integrity" "sha512-qWWzi4TlddohA91bFwgt6zO/J0X+io7Qp184Fw0m2JYRSTZnJbFR8+07KmzudHCZgOiKRCrjhylwv9Xd8gfhVQ=="
+  "resolved" "https://registry.npmjs.org/babel-extract-comments/-/babel-extract-comments-1.0.0.tgz"
+  "version" "1.0.0"
+  dependencies:
+    "babylon" "^6.18.0"
+
+"babel-jest@^26.1.0":
+  "version" "26.1.0"
+  dependencies:
+    "@jest/transform" "^26.1.0"
+    "@jest/types" "^26.1.0"
+    "@types/babel__core" "^7.1.7"
+    "babel-plugin-istanbul" "^6.0.0"
+    "babel-preset-jest" "^26.1.0"
+    "chalk" "^4.0.0"
+    "graceful-fs" "^4.2.4"
+    "slash" "^3.0.0"
+
+"babel-plugin-dynamic-import-node@^2.3.3":
+  "integrity" "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ=="
+  "resolved" "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz"
+  "version" "2.3.3"
+  dependencies:
+    "object.assign" "^4.1.0"
+
+"babel-plugin-istanbul@^6.0.0":
+  "integrity" "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ=="
+  "resolved" "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz"
+  "version" "6.0.0"
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.0.0"
+    "@istanbuljs/load-nyc-config" "^1.0.0"
+    "@istanbuljs/schema" "^0.1.2"
+    "istanbul-lib-instrument" "^4.0.0"
+    "test-exclude" "^6.0.0"
+
+"babel-plugin-jest-hoist@^26.1.0":
+  "version" "26.1.0"
+  dependencies:
+    "@babel/template" "^7.3.3"
+    "@babel/types" "^7.3.3"
+    "@types/babel__core" "^7.0.0"
+    "@types/babel__traverse" "^7.0.6"
+
+"babel-plugin-syntax-object-rest-spread@^6.8.0":
+  "integrity" "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U="
+  "resolved" "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz"
+  "version" "6.13.0"
+
+"babel-plugin-transform-object-rest-spread@^6.26.0":
+  "integrity" "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY="
+  "resolved" "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz"
+  "version" "6.26.0"
+  dependencies:
+    "babel-plugin-syntax-object-rest-spread" "^6.8.0"
+    "babel-runtime" "^6.26.0"
+
+"babel-preset-current-node-syntax@^0.1.2":
+  "version" "0.1.3"
+  dependencies:
+    "@babel/plugin-syntax-async-generators" "^7.8.4"
+    "@babel/plugin-syntax-bigint" "^7.8.3"
+    "@babel/plugin-syntax-class-properties" "^7.8.3"
+    "@babel/plugin-syntax-import-meta" "^7.8.3"
+    "@babel/plugin-syntax-json-strings" "^7.8.3"
+    "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3"
+    "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3"
+    "@babel/plugin-syntax-numeric-separator" "^7.8.3"
+    "@babel/plugin-syntax-object-rest-spread" "^7.8.3"
+    "@babel/plugin-syntax-optional-catch-binding" "^7.8.3"
+    "@babel/plugin-syntax-optional-chaining" "^7.8.3"
+
+"babel-preset-jest@^26.1.0":
+  "version" "26.1.0"
+  dependencies:
+    "babel-plugin-jest-hoist" "^26.1.0"
+    "babel-preset-current-node-syntax" "^0.1.2"
+
+"babel-runtime@^6.26.0":
+  "integrity" "sha1-llxwWGaOgrVde/4E/yM3vItWR/4="
+  "resolved" "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz"
+  "version" "6.26.0"
+  dependencies:
+    "core-js" "^2.4.0"
+    "regenerator-runtime" "^0.11.0"
+
+"babylon@^6.18.0":
+  "integrity" "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ=="
+  "resolved" "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz"
+  "version" "6.18.0"
+
+"backo2@1.0.2":
+  "integrity" "sha1-MasayLEpNjRj41s+u2n038+6eUc="
+  "resolved" "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz"
+  "version" "1.0.2"
+
+"balanced-match@^1.0.0":
+  "version" "1.0.0"
+
+"base@^0.11.1":
+  "integrity" "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg=="
+  "resolved" "https://registry.npmjs.org/base/-/base-0.11.2.tgz"
+  "version" "0.11.2"
+  dependencies:
+    "cache-base" "^1.0.1"
+    "class-utils" "^0.3.5"
+    "component-emitter" "^1.2.1"
+    "define-property" "^1.0.0"
+    "isobject" "^3.0.1"
+    "mixin-deep" "^1.2.0"
+    "pascalcase" "^0.1.1"
+
+"base64-arraybuffer@0.1.4":
+  "integrity" "sha1-mBjHngWbE1X5fgQooBfIOOkLqBI="
+  "resolved" "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz"
+  "version" "0.1.4"
+
+"base64-js@^1.0.2":
+  "version" "1.3.1"
+
+"base64id@2.0.0":
+  "integrity" "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog=="
+  "resolved" "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz"
+  "version" "2.0.0"
+
+"batch@0.6.1":
+  "integrity" "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY="
+  "resolved" "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz"
+  "version" "0.6.1"
+
+"bcrypt-pbkdf@^1.0.0":
+  "integrity" "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4="
+  "resolved" "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz"
+  "version" "1.0.2"
+  dependencies:
+    "tweetnacl" "^0.14.3"
+
+"bfj@^6.1.1":
+  "integrity" "sha512-BmBJa4Lip6BPRINSZ0BPEIfB1wUY/9rwbwvIHQA1KjX9om29B6id0wnWXq7m3bn5JrUVjeOTnVuhPT1FiHwPGw=="
+  "resolved" "https://registry.npmjs.org/bfj/-/bfj-6.1.2.tgz"
+  "version" "6.1.2"
+  dependencies:
+    "bluebird" "^3.5.5"
+    "check-types" "^8.0.3"
+    "hoopy" "^0.1.4"
+    "tryer" "^1.0.1"
+
+"big.js@^5.2.2":
+  "integrity" "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ=="
+  "resolved" "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz"
+  "version" "5.2.2"
+
+"binary-extensions@^1.0.0":
+  "integrity" "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw=="
+  "resolved" "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz"
+  "version" "1.13.1"
+
+"binary-extensions@^2.0.0":
+  "version" "2.1.0"
+
+"binaryextensions@^2.1.2":
+  "integrity" "sha512-nAihlQsYGyc5Bwq6+EsubvANYGExeJKHDO3RjnvwU042fawQTQfM3Kxn7IHUXQOz4bzfwsGYYHGSvXyW4zOGLg=="
+  "resolved" "https://registry.npmjs.org/binaryextensions/-/binaryextensions-2.3.0.tgz"
+  "version" "2.3.0"
+
+"bindings@^1.5.0":
+  "integrity" "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ=="
+  "resolved" "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz"
+  "version" "1.5.0"
+  dependencies:
+    "file-uri-to-path" "1.0.0"
+
+"blob@0.0.5":
+  "integrity" "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig=="
+  "resolved" "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz"
+  "version" "0.0.5"
+
+"blocking-proxy@^1.0.0":
+  "integrity" "sha512-KE8NFMZr3mN2E0HcvCgRtX7DjhiIQrwle+nSVJVC/yqFb9+xznHl2ZcoBp2L9qzkI4t4cBFJ1efXF8Dwi132RA=="
+  "resolved" "https://registry.npmjs.org/blocking-proxy/-/blocking-proxy-1.0.1.tgz"
+  "version" "1.0.1"
+  dependencies:
+    "minimist" "^1.2.0"
+
+"bluebird@^3.5.1", "bluebird@^3.5.3", "bluebird@^3.5.5":
+  "integrity" "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg=="
+  "resolved" "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz"
+  "version" "3.7.2"
+
+"bn.js@^4.0.0":
+  "version" "4.11.9"
+
+"bn.js@^4.1.0":
+  "version" "4.11.9"
+
+"bn.js@^4.11.9":
+  "version" "4.11.9"
+
+"bn.js@^5.1.1":
+  "version" "5.1.2"
+
+"body-parser@1.19.0":
+  "integrity" "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw=="
+  "resolved" "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz"
+  "version" "1.19.0"
+  dependencies:
+    "bytes" "3.1.0"
+    "content-type" "~1.0.4"
+    "debug" "2.6.9"
+    "depd" "~1.1.2"
+    "http-errors" "1.7.2"
+    "iconv-lite" "0.4.24"
+    "on-finished" "~2.3.0"
+    "qs" "6.7.0"
+    "raw-body" "2.4.0"
+    "type-is" "~1.6.17"
+
+"bonjour@^3.5.0":
+  "integrity" "sha1-jokKGD2O6aI5OzhExpGkK897yfU="
+  "resolved" "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz"
+  "version" "3.5.0"
+  dependencies:
+    "array-flatten" "^2.1.0"
+    "deep-equal" "^1.0.1"
+    "dns-equal" "^1.0.0"
+    "dns-txt" "^2.0.2"
+    "multicast-dns" "^6.0.1"
+    "multicast-dns-service-types" "^1.1.0"
+
+"boolbase@^1.0.0", "boolbase@~1.0.0":
+  "integrity" "sha1-aN/1++YMUes3cl6p4+0xDcwed24="
+  "resolved" "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz"
+  "version" "1.0.0"
+
+"bootstrap@^4.6.0":
+  "version" "4.6.0"
+
+"brace-expansion@^1.1.7":
+  "integrity" "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA=="
+  "resolved" "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz"
+  "version" "1.1.11"
+  dependencies:
+    "balanced-match" "^1.0.0"
+    "concat-map" "0.0.1"
+
+"braces@^2.3.1":
+  "integrity" "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w=="
+  "resolved" "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz"
+  "version" "2.3.2"
+  dependencies:
+    "arr-flatten" "^1.1.0"
+    "array-unique" "^0.3.2"
+    "extend-shallow" "^2.0.1"
+    "fill-range" "^4.0.0"
+    "isobject" "^3.0.1"
+    "repeat-element" "^1.1.2"
+    "snapdragon" "^0.8.1"
+    "snapdragon-node" "^2.0.1"
+    "split-string" "^3.0.2"
+    "to-regex" "^3.0.1"
+
+"braces@^2.3.2":
+  "integrity" "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w=="
+  "resolved" "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz"
+  "version" "2.3.2"
+  dependencies:
+    "arr-flatten" "^1.1.0"
+    "array-unique" "^0.3.2"
+    "extend-shallow" "^2.0.1"
+    "fill-range" "^4.0.0"
+    "isobject" "^3.0.1"
+    "repeat-element" "^1.1.2"
+    "snapdragon" "^0.8.1"
+    "snapdragon-node" "^2.0.1"
+    "split-string" "^3.0.2"
+    "to-regex" "^3.0.1"
+
+"braces@^3.0.1", "braces@~3.0.2":
+  "integrity" "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A=="
+  "resolved" "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz"
+  "version" "3.0.2"
+  dependencies:
+    "fill-range" "^7.0.1"
+
+"brorand@^1.0.1", "brorand@^1.1.0":
+  "integrity" "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8="
+  "resolved" "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz"
+  "version" "1.1.0"
+
+"browser-process-hrtime@^1.0.0":
+  "integrity" "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow=="
+  "resolved" "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz"
+  "version" "1.0.0"
+
+"browser-stdout@1.3.1":
+  "integrity" "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw=="
+  "resolved" "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz"
+  "version" "1.3.1"
+
+"browser-sync-client@^2.26.14":
+  "integrity" "sha512-be0m1MchmKv/26r/yyyolxXcBi052aYrmaQep5nm8YNMjFcEyzv0ZoOKn/c3WEXNlEB/KeXWaw70fAOJ+/F1zQ=="
+  "resolved" "https://registry.npmjs.org/browser-sync-client/-/browser-sync-client-2.26.14.tgz"
+  "version" "2.26.14"
+  dependencies:
+    "etag" "1.8.1"
+    "fresh" "0.5.2"
+    "mitt" "^1.1.3"
+    "rxjs" "^5.5.6"
+
+"browser-sync-ui@^2.26.14":
+  "integrity" "sha512-6oT1sboM4KVNnWCCJDMGbRIeTBw97toMFQ+srImvwQ6J5t9KMgizaIX8HcKLiemsUMSJkgGM9RVKIpq2UblgOA=="
+  "resolved" "https://registry.npmjs.org/browser-sync-ui/-/browser-sync-ui-2.26.14.tgz"
+  "version" "2.26.14"
+  dependencies:
+    "async-each-series" "0.1.1"
+    "connect-history-api-fallback" "^1"
+    "immutable" "^3"
+    "server-destroy" "1.0.1"
+    "socket.io-client" "^2.4.0"
+    "stream-throttle" "^0.1.3"
+
+"browser-sync-webpack-plugin@2.2.2":
+  "integrity" "sha512-x92kl8LdBi4dp6YVXYqrSoDkOCOLCeBOrYSY0h9Sk1VcCDSoZC1Vc62eae6TfC2ljN4/L+aYlkzE46kirHzbgA=="
+  "resolved" "https://registry.npmjs.org/browser-sync-webpack-plugin/-/browser-sync-webpack-plugin-2.2.2.tgz"
+  "version" "2.2.2"
+  dependencies:
+    "lodash" "^4"
+
+"browser-sync@^2", "browser-sync@^2.26.13":
+  "integrity" "sha512-3TtpsheGolJT6UFtM2CZWEcGJmI4ZEvoCKiKE2bvcDnPxRkhQT4nIGVtfiyPcoHKXGM0LwMOZmYJNWfiNfVXWA=="
+  "resolved" "https://registry.npmjs.org/browser-sync/-/browser-sync-2.26.14.tgz"
+  "version" "2.26.14"
+  dependencies:
+    "browser-sync-client" "^2.26.14"
+    "browser-sync-ui" "^2.26.14"
+    "bs-recipes" "1.3.4"
+    "bs-snippet-injector" "^2.0.1"
+    "chokidar" "^3.5.1"
+    "connect" "3.6.6"
+    "connect-history-api-fallback" "^1"
+    "dev-ip" "^1.0.1"
+    "easy-extender" "^2.3.4"
+    "eazy-logger" "3.1.0"
+    "etag" "^1.8.1"
+    "fresh" "^0.5.2"
+    "fs-extra" "3.0.1"
+    "http-proxy" "^1.18.1"
+    "immutable" "^3"
+    "localtunnel" "^2.0.1"
+    "micromatch" "^4.0.2"
+    "opn" "5.3.0"
+    "portscanner" "2.1.1"
+    "qs" "6.2.3"
+    "raw-body" "^2.3.2"
+    "resp-modifier" "6.0.2"
+    "rx" "4.1.0"
+    "send" "0.16.2"
+    "serve-index" "1.9.1"
+    "serve-static" "1.13.2"
+    "server-destroy" "1.0.1"
+    "socket.io" "2.4.0"
+    "ua-parser-js" "^0.7.18"
+    "yargs" "^15.4.1"
+
+"browserify-aes@^1.0.0", "browserify-aes@^1.0.4":
+  "integrity" "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA=="
+  "resolved" "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz"
+  "version" "1.2.0"
+  dependencies:
+    "buffer-xor" "^1.0.3"
+    "cipher-base" "^1.0.0"
+    "create-hash" "^1.1.0"
+    "evp_bytestokey" "^1.0.3"
+    "inherits" "^2.0.1"
+    "safe-buffer" "^5.0.1"
+
+"browserify-cipher@^1.0.0":
+  "integrity" "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w=="
+  "resolved" "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz"
+  "version" "1.0.1"
+  dependencies:
+    "browserify-aes" "^1.0.4"
+    "browserify-des" "^1.0.0"
+    "evp_bytestokey" "^1.0.0"
+
+"browserify-des@^1.0.0":
+  "integrity" "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A=="
+  "resolved" "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz"
+  "version" "1.0.2"
+  dependencies:
+    "cipher-base" "^1.0.1"
+    "des.js" "^1.0.0"
+    "inherits" "^2.0.1"
+    "safe-buffer" "^5.1.2"
+
+"browserify-rsa@^4.0.0", "browserify-rsa@^4.0.1":
+  "version" "4.0.1"
+  dependencies:
+    "bn.js" "^4.1.0"
+    "randombytes" "^2.0.1"
+
+"browserify-sign@^4.0.0":
+  "version" "4.2.0"
+  dependencies:
+    "bn.js" "^5.1.1"
+    "browserify-rsa" "^4.0.1"
+    "create-hash" "^1.2.0"
+    "create-hmac" "^1.1.7"
+    "elliptic" "^6.5.2"
+    "inherits" "^2.0.4"
+    "parse-asn1" "^5.1.5"
+    "readable-stream" "^3.6.0"
+    "safe-buffer" "^5.2.0"
+
+"browserify-zlib@^0.2.0":
+  "integrity" "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA=="
+  "resolved" "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz"
+  "version" "0.2.0"
+  dependencies:
+    "pako" "~1.0.5"
+
+"browserslist@^4.0.0", "browserslist@^4.12.0", "browserslist@^4.8.5":
+  "integrity" "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ=="
+  "resolved" "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz"
+  "version" "4.16.6"
+  dependencies:
+    "caniuse-lite" "^1.0.30001219"
+    "colorette" "^1.2.2"
+    "electron-to-chromium" "^1.3.723"
+    "escalade" "^3.1.1"
+    "node-releases" "^1.1.71"
+
+"browserstack@^1.5.1":
+  "version" "1.6.0"
+  dependencies:
+    "https-proxy-agent" "^2.2.1"
+
+"bs-logger@0.x":
+  "integrity" "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog=="
+  "resolved" "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz"
+  "version" "0.2.6"
+  dependencies:
+    "fast-json-stable-stringify" "2.x"
+
+"bs-recipes@1.3.4":
+  "integrity" "sha1-DS1NSKcYyMBEdp/cT4lZLci2lYU="
+  "resolved" "https://registry.npmjs.org/bs-recipes/-/bs-recipes-1.3.4.tgz"
+  "version" "1.3.4"
+
+"bs-snippet-injector@^2.0.1":
+  "integrity" "sha1-YbU5PxH1JVntEgaTEANDtu2wTdU="
+  "resolved" "https://registry.npmjs.org/bs-snippet-injector/-/bs-snippet-injector-2.0.1.tgz"
+  "version" "2.0.1"
+
+"bser@2.1.1":
+  "integrity" "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ=="
+  "resolved" "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz"
+  "version" "2.1.1"
+  dependencies:
+    "node-int64" "^0.4.0"
+
+"buffer-from@^1.0.0", "buffer-from@1.x":
+  "integrity" "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A=="
+  "resolved" "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz"
+  "version" "1.1.1"
+
+"buffer-indexof@^1.0.0":
+  "integrity" "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g=="
+  "resolved" "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz"
+  "version" "1.1.1"
+
+"buffer-xor@^1.0.3":
+  "integrity" "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk="
+  "resolved" "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz"
+  "version" "1.0.3"
+
+"buffer@^4.3.0", "buffer@4.9.2":
+  "integrity" "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg=="
+  "resolved" "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz"
+  "version" "4.9.2"
+  dependencies:
+    "base64-js" "^1.0.2"
+    "ieee754" "^1.1.4"
+    "isarray" "^1.0.0"
+
+"builtin-modules@^1.1.1":
+  "integrity" "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8="
+  "resolved" "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz"
+  "version" "1.1.1"
+
+"builtin-modules@^3.1.0":
+  "version" "3.1.0"
+
+"builtin-status-codes@^3.0.0":
+  "integrity" "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug="
+  "resolved" "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz"
+  "version" "3.0.0"
+
+"builtins@^1.0.3":
+  "integrity" "sha1-y5T662HIaWRR2zZTThQi+U8K7og="
+  "resolved" "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz"
+  "version" "1.0.3"
+
+"bytes@3.0.0":
+  "integrity" "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg="
+  "resolved" "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz"
+  "version" "3.0.0"
+
+"bytes@3.1.0":
+  "integrity" "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg=="
+  "resolved" "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz"
+  "version" "3.1.0"
+
+"cacache@^12.0.0", "cacache@^12.0.2":
+  "integrity" "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ=="
+  "resolved" "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz"
+  "version" "12.0.4"
+  dependencies:
+    "bluebird" "^3.5.5"
+    "chownr" "^1.1.1"
+    "figgy-pudding" "^3.5.1"
+    "glob" "^7.1.4"
+    "graceful-fs" "^4.1.15"
+    "infer-owner" "^1.0.3"
+    "lru-cache" "^5.1.1"
+    "mississippi" "^3.0.0"
+    "mkdirp" "^0.5.1"
+    "move-concurrently" "^1.0.1"
+    "promise-inflight" "^1.0.1"
+    "rimraf" "^2.6.3"
+    "ssri" "^6.0.1"
+    "unique-filename" "^1.1.1"
+    "y18n" "^4.0.0"
+
+"cacache@^15.0.4":
+  "version" "15.0.4"
+  dependencies:
+    "@npmcli/move-file" "^1.0.1"
+    "chownr" "^2.0.0"
+    "fs-minipass" "^2.0.0"
+    "glob" "^7.1.4"
+    "infer-owner" "^1.0.4"
+    "lru-cache" "^5.1.1"
+    "minipass" "^3.1.1"
+    "minipass-collect" "^1.0.2"
+    "minipass-flush" "^1.0.5"
+    "minipass-pipeline" "^1.2.2"
+    "mkdirp" "^1.0.3"
+    "p-map" "^4.0.0"
+    "promise-inflight" "^1.0.1"
+    "rimraf" "^3.0.2"
+    "ssri" "^8.0.0"
+    "tar" "^6.0.2"
+    "unique-filename" "^1.1.1"
+
+"cache-base@^1.0.1":
+  "integrity" "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ=="
+  "resolved" "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz"
+  "version" "1.0.1"
+  dependencies:
+    "collection-visit" "^1.0.0"
+    "component-emitter" "^1.2.1"
+    "get-value" "^2.0.6"
+    "has-value" "^1.0.0"
+    "isobject" "^3.0.1"
+    "set-value" "^2.0.0"
+    "to-object-path" "^0.3.0"
+    "union-value" "^1.0.0"
+    "unset-value" "^1.0.0"
+
+"call-bind@^1.0.0", "call-bind@^1.0.2":
+  "integrity" "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA=="
+  "resolved" "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz"
+  "version" "1.0.2"
+  dependencies:
+    "function-bind" "^1.1.1"
+    "get-intrinsic" "^1.0.2"
+
+"call-me-maybe@^1.0.1":
+  "integrity" "sha1-JtII6onje1y95gJQoV8DHBak1ms="
+  "resolved" "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz"
+  "version" "1.0.1"
+
+"caller-callsite@^2.0.0":
+  "integrity" "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ="
+  "resolved" "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz"
+  "version" "2.0.0"
+  dependencies:
+    "callsites" "^2.0.0"
+
+"caller-path@^2.0.0":
+  "integrity" "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ="
+  "resolved" "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz"
+  "version" "2.0.0"
+  dependencies:
+    "caller-callsite" "^2.0.0"
+
+"callsites@^2.0.0":
+  "integrity" "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA="
+  "resolved" "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz"
+  "version" "2.0.0"
+
+"callsites@^3.0.0":
+  "integrity" "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="
+  "resolved" "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz"
+  "version" "3.1.0"
+
+"camel-case@^4.1.1":
+  "version" "4.1.1"
+  dependencies:
+    "pascal-case" "^3.1.1"
+    "tslib" "^1.10.0"
+
+"camelcase-keys@^6.1.1":
+  "integrity" "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg=="
+  "resolved" "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz"
+  "version" "6.2.2"
+  dependencies:
+    "camelcase" "^5.3.1"
+    "map-obj" "^4.0.0"
+    "quick-lru" "^4.0.1"
+
+"camelcase@^5.0.0", "camelcase@^5.3.1":
+  "integrity" "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg=="
+  "resolved" "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz"
+  "version" "5.3.1"
+
+"camelcase@^6.0.0":
+  "version" "6.0.0"
+
+"caniuse-api@^3.0.0":
+  "integrity" "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw=="
+  "resolved" "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz"
+  "version" "3.0.0"
+  dependencies:
+    "browserslist" "^4.0.0"
+    "caniuse-lite" "^1.0.0"
+    "lodash.memoize" "^4.1.2"
+    "lodash.uniq" "^4.5.0"
+
+"caniuse-lite@^1.0.0", "caniuse-lite@^1.0.30001087", "caniuse-lite@^1.0.30001219":
+  "version" "1.0.30001239"
+
+"canonical-path@1.0.0":
+  "integrity" "sha512-feylzsbDxi1gPZ1IjystzIQZagYYLvfKrSuygUCgf7z6x790VEzze5QEkdSV1U58RA7Hi0+v6fv4K54atOzATg=="
+  "resolved" "https://registry.npmjs.org/canonical-path/-/canonical-path-1.0.0.tgz"
+  "version" "1.0.0"
+
+"capture-exit@^2.0.0":
+  "integrity" "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g=="
+  "resolved" "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz"
+  "version" "2.0.0"
+  dependencies:
+    "rsvp" "^4.8.4"
+
+"capture-stack-trace@^1.0.0":
+  "integrity" "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw=="
+  "resolved" "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz"
+  "version" "1.0.1"
+
+"caseless@^0.12.0", "caseless@~0.12.0":
+  "integrity" "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw="
+  "resolved" "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz"
+  "version" "0.12.0"
+
+"chai-as-promised@7.1.1":
+  "integrity" "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA=="
+  "resolved" "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz"
+  "version" "7.1.1"
+  dependencies:
+    "check-error" "^1.0.2"
+
+"chai-string@1.5.0":
+  "integrity" "sha512-sydDC3S3pNAQMYwJrs6dQX0oBQ6KfIPuOZ78n7rocW0eJJlsHPh2t3kwW7xfwYA/1Bf6/arGtSUo16rxR2JFlw=="
+  "resolved" "https://registry.npmjs.org/chai-string/-/chai-string-1.5.0.tgz"
+  "version" "1.5.0"
+
+"chai@^4.1.2", "chai@>= 2.1.2 < 5", "chai@4.2.0":
+  "integrity" "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw=="
+  "resolved" "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz"
+  "version" "4.2.0"
+  dependencies:
+    "assertion-error" "^1.1.0"
+    "check-error" "^1.0.2"
+    "deep-eql" "^3.0.1"
+    "get-func-name" "^2.0.0"
+    "pathval" "^1.1.0"
+    "type-detect" "^4.0.5"
+
+"chalk@^1.0.0", "chalk@^1.1.3":
+  "integrity" "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg="
+  "resolved" "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz"
+  "version" "1.1.3"
+  dependencies:
+    "ansi-styles" "^2.2.1"
+    "escape-string-regexp" "^1.0.2"
+    "has-ansi" "^2.0.0"
+    "strip-ansi" "^3.0.0"
+    "supports-color" "^2.0.0"
+
+"chalk@^1.1.1":
+  "integrity" "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg="
+  "resolved" "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz"
+  "version" "1.1.3"
+  dependencies:
+    "ansi-styles" "^2.2.1"
+    "escape-string-regexp" "^1.0.2"
+    "has-ansi" "^2.0.0"
+    "strip-ansi" "^3.0.0"
+    "supports-color" "^2.0.0"
+
+"chalk@^2.0.0", "chalk@^2.0.1", "chalk@^2.1.0", "chalk@^2.3.0", "chalk@^2.3.1", "chalk@^2.4.0", "chalk@^2.4.1", "chalk@^2.4.2":
+  "integrity" "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ=="
+  "resolved" "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz"
+  "version" "2.4.2"
+  dependencies:
+    "ansi-styles" "^3.2.1"
+    "escape-string-regexp" "^1.0.5"
+    "supports-color" "^5.3.0"
+
+"chalk@^3.0.0":
+  "integrity" "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg=="
+  "resolved" "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz"
+  "version" "3.0.0"
+  dependencies:
+    "ansi-styles" "^4.1.0"
+    "supports-color" "^7.1.0"
+
+"chalk@^4.0.0":
+  "version" "4.1.0"
+  dependencies:
+    "ansi-styles" "^4.1.0"
+    "supports-color" "^7.1.0"
+
+"chalk@^4.1.0":
+  "integrity" "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg=="
+  "resolved" "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz"
+  "version" "4.1.1"
+  dependencies:
+    "ansi-styles" "^4.1.0"
+    "supports-color" "^7.1.0"
+
+"chalk@2.3.x":
+  "integrity" "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ=="
+  "resolved" "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz"
+  "version" "2.3.2"
+  dependencies:
+    "ansi-styles" "^3.2.1"
+    "escape-string-regexp" "^1.0.5"
+    "supports-color" "^5.3.0"
+
+"chalk@4.1.0":
+  "integrity" "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A=="
+  "resolved" "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz"
+  "version" "4.1.0"
+  dependencies:
+    "ansi-styles" "^4.1.0"
+    "supports-color" "^7.1.0"
+
+"char-regex@^1.0.2":
+  "integrity" "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw=="
+  "resolved" "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz"
+  "version" "1.0.2"
+
+"chardet@^0.7.0":
+  "integrity" "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA=="
+  "resolved" "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz"
+  "version" "0.7.0"
+
+"check-error@^1.0.2":
+  "integrity" "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII="
+  "resolved" "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz"
+  "version" "1.0.2"
+
+"check-types@^8.0.3":
+  "integrity" "sha512-YpeKZngUmG65rLudJ4taU7VLkOCTMhNl/u4ctNC56LQS/zJTyNH0Lrtwm1tfTsbLlwvlfsA2d1c8vCf/Kh2KwQ=="
+  "resolved" "https://registry.npmjs.org/check-types/-/check-types-8.0.3.tgz"
+  "version" "8.0.3"
+
+"chevrotain@6.5.0":
+  "integrity" "sha512-BwqQ/AgmKJ8jcMEjaSnfMybnKMgGTrtDKowfTP3pX4jwVy0kNjRsT/AP6h+wC3+3NC+X8X15VWBnTCQlX+wQFg=="
+  "resolved" "https://registry.npmjs.org/chevrotain/-/chevrotain-6.5.0.tgz"
+  "version" "6.5.0"
+  dependencies:
+    "regexp-to-ast" "0.4.0"
+
+"chevrotain@7.0.1":
+  "integrity" "sha512-B/44jrdw5GAzy483LEeVSgXSX0qOYM8lUd3l5+yf6Vl6OQjEUCm2BUiYbHRCIK6xCEvCLAFe1kj8uyV6+zdaVw=="
+  "resolved" "https://registry.npmjs.org/chevrotain/-/chevrotain-7.0.1.tgz"
+  "version" "7.0.1"
+  dependencies:
+    "regexp-to-ast" "0.5.0"
+
+"chokidar@^2.1.8":
+  "integrity" "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg=="
+  "resolved" "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz"
+  "version" "2.1.8"
+  dependencies:
+    "anymatch" "^2.0.0"
+    "async-each" "^1.0.1"
+    "braces" "^2.3.2"
+    "glob-parent" "^3.1.0"
+    "inherits" "^2.0.3"
+    "is-binary-path" "^1.0.0"
+    "is-glob" "^4.0.0"
+    "normalize-path" "^3.0.0"
+    "path-is-absolute" "^1.0.0"
+    "readdirp" "^2.2.1"
+    "upath" "^1.1.1"
+  optionalDependencies:
+    "fsevents" "^1.2.7"
+
+"chokidar@^3.0.0", "chokidar@^3.4.0", "chokidar@^3.5.1", "chokidar@>=2.0.0 <4.0.0", "chokidar@3.5.1":
+  "integrity" "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw=="
+  "resolved" "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz"
+  "version" "3.5.1"
+  dependencies:
+    "anymatch" "~3.1.1"
+    "braces" "~3.0.2"
+    "glob-parent" "~5.1.0"
+    "is-binary-path" "~2.1.0"
+    "is-glob" "~4.0.1"
+    "normalize-path" "~3.0.0"
+    "readdirp" "~3.5.0"
+  optionalDependencies:
+    "fsevents" "~2.3.1"
+
+"chownr@^1.1.1", "chownr@^1.1.2":
+  "integrity" "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg=="
+  "resolved" "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz"
+  "version" "1.1.4"
+
+"chownr@^2.0.0":
+  "integrity" "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ=="
+  "resolved" "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz"
+  "version" "2.0.0"
+
+"chrome-trace-event@^1.0.2":
+  "version" "1.0.2"
+  dependencies:
+    "tslib" "^1.9.0"
+
+"ci-info@^2.0.0":
+  "integrity" "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ=="
+  "resolved" "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz"
+  "version" "2.0.0"
+
+"cipher-base@^1.0.0", "cipher-base@^1.0.1", "cipher-base@^1.0.3":
+  "integrity" "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q=="
+  "resolved" "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz"
+  "version" "1.0.4"
+  dependencies:
+    "inherits" "^2.0.1"
+    "safe-buffer" "^5.0.1"
+
+"class-utils@^0.3.5":
+  "integrity" "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg=="
+  "resolved" "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz"
+  "version" "0.3.6"
+  dependencies:
+    "arr-union" "^3.1.0"
+    "define-property" "^0.2.5"
+    "isobject" "^3.0.0"
+    "static-extend" "^0.1.1"
+
+"clean-css@^4.2.3":
+  "integrity" "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA=="
+  "resolved" "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz"
+  "version" "4.2.3"
+  dependencies:
+    "source-map" "~0.6.0"
+
+"clean-stack@^2.0.0":
+  "integrity" "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A=="
+  "resolved" "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz"
+  "version" "2.2.0"
+
+"cli-cursor@^1.0.1":
+  "integrity" "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc="
+  "resolved" "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz"
+  "version" "1.0.2"
+  dependencies:
+    "restore-cursor" "^1.0.1"
+
+"cli-cursor@^2.0.0":
+  "integrity" "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU="
+  "resolved" "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz"
+  "version" "2.1.0"
+  dependencies:
+    "restore-cursor" "^2.0.0"
+
+"cli-cursor@^2.1.0":
+  "integrity" "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU="
+  "resolved" "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz"
+  "version" "2.1.0"
+  dependencies:
+    "restore-cursor" "^2.0.0"
+
+"cli-cursor@^3.1.0":
+  "integrity" "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw=="
+  "resolved" "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz"
+  "version" "3.1.0"
+  dependencies:
+    "restore-cursor" "^3.1.0"
+
+"cli-spinners@^2.2.0", "cli-spinners@^2.4.0":
+  "integrity" "sha512-t+4/y50K/+4xcCRosKkA7W4gTr1MySvLV0q+PxmG7FJ5g+66ChKurYjxBCjHggHH3HA5Hh9cy+lcUGWDqVH+4Q=="
+  "resolved" "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.0.tgz"
+  "version" "2.6.0"
+
+"cli-table@^0.3.1":
+  "version" "0.3.1"
+  dependencies:
+    "colors" "1.0.3"
+
+"cli-truncate@^0.2.1":
+  "integrity" "sha1-nxXPuwcFAFNpIWxiasfQWrkN1XQ="
+  "resolved" "https://registry.npmjs.org/cli-truncate/-/cli-truncate-0.2.1.tgz"
+  "version" "0.2.1"
+  dependencies:
+    "slice-ansi" "0.0.4"
+    "string-width" "^1.0.1"
+
+"cli-width@^2.0.0":
+  "integrity" "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw=="
+  "resolved" "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz"
+  "version" "2.2.1"
+
+"cli-width@^3.0.0":
+  "integrity" "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw=="
+  "resolved" "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz"
+  "version" "3.0.0"
+
+"clipboard@^2.0.0":
+  "version" "2.0.6"
+  dependencies:
+    "good-listener" "^1.2.2"
+    "select" "^1.1.2"
+    "tiny-emitter" "^2.0.0"
+
+"cliui@^5.0.0":
+  "integrity" "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA=="
+  "resolved" "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz"
+  "version" "5.0.0"
+  dependencies:
+    "string-width" "^3.1.0"
+    "strip-ansi" "^5.2.0"
+    "wrap-ansi" "^5.1.0"
+
+"cliui@^6.0.0":
+  "integrity" "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ=="
+  "resolved" "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz"
+  "version" "6.0.0"
+  dependencies:
+    "string-width" "^4.2.0"
+    "strip-ansi" "^6.0.0"
+    "wrap-ansi" "^6.2.0"
+
+"cliui@^7.0.2":
+  "integrity" "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ=="
+  "resolved" "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz"
+  "version" "7.0.4"
+  dependencies:
+    "string-width" "^4.2.0"
+    "strip-ansi" "^6.0.0"
+    "wrap-ansi" "^7.0.0"
+
+"clone-buffer@^1.0.0":
+  "integrity" "sha1-4+JbIHrE5wGvch4staFnksrD3Fg="
+  "resolved" "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz"
+  "version" "1.0.0"
+
+"clone-deep@^4.0.1":
+  "integrity" "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ=="
+  "resolved" "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz"
+  "version" "4.0.1"
+  dependencies:
+    "is-plain-object" "^2.0.4"
+    "kind-of" "^6.0.2"
+    "shallow-clone" "^3.0.0"
+
+"clone-stats@^1.0.0":
+  "integrity" "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA="
+  "resolved" "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz"
+  "version" "1.0.0"
+
+"clone@^1.0.2":
+  "integrity" "sha1-2jCcwmPfFZlMaIypAheco8fNfH4="
+  "resolved" "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz"
+  "version" "1.0.4"
+
+"clone@^2.1.1":
+  "integrity" "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18="
+  "resolved" "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz"
+  "version" "2.1.2"
+
+"cloneable-readable@^1.0.0":
+  "integrity" "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ=="
+  "resolved" "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz"
+  "version" "1.1.3"
+  dependencies:
+    "inherits" "^2.0.1"
+    "process-nextick-args" "^2.0.0"
+    "readable-stream" "^2.3.5"
+
+"co@^4.6.0":
+  "integrity" "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ="
+  "resolved" "https://registry.npmjs.org/co/-/co-4.6.0.tgz"
+  "version" "4.6.0"
+
+"coa@^2.0.2":
+  "integrity" "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA=="
+  "resolved" "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz"
+  "version" "2.0.2"
+  dependencies:
+    "@types/q" "^1.5.1"
+    "chalk" "^2.4.1"
+    "q" "^1.1.2"
+
+"code-point-at@^1.0.0":
+  "integrity" "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c="
+  "resolved" "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz"
+  "version" "1.1.0"
+
+"codelyzer@5.2.2":
+  "integrity" "sha512-jB4FZ1Sx7kZhvZVdf+N2BaKTdrrNZOL0Bj10RRfrhHrb3zEvXjJvvq298JPMJAiyiCS/v4zs1QlGU0ip7xGqeA=="
+  "resolved" "https://registry.npmjs.org/codelyzer/-/codelyzer-5.2.2.tgz"
+  "version" "5.2.2"
+  dependencies:
+    "app-root-path" "^2.2.1"
+    "aria-query" "^3.0.0"
+    "axobject-query" "2.0.2"
+    "css-selector-tokenizer" "^0.7.1"
+    "cssauron" "^1.4.0"
+    "damerau-levenshtein" "^1.0.4"
+    "semver-dsl" "^1.0.1"
+    "source-map" "^0.5.7"
+    "sprintf-js" "^1.1.2"
+
+"collect-v8-coverage@^1.0.0":
+  "integrity" "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg=="
+  "resolved" "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz"
+  "version" "1.0.1"
+
+"collection-visit@^1.0.0":
+  "integrity" "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA="
+  "resolved" "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz"
+  "version" "1.0.0"
+  dependencies:
+    "map-visit" "^1.0.0"
+    "object-visit" "^1.0.0"
+
+"color-convert@^1.9.0", "color-convert@^1.9.1":
+  "integrity" "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg=="
+  "resolved" "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz"
+  "version" "1.9.3"
+  dependencies:
+    "color-name" "1.1.3"
+
+"color-convert@^2.0.1":
+  "integrity" "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="
+  "resolved" "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz"
+  "version" "2.0.1"
+  dependencies:
+    "color-name" "~1.1.4"
+
+"color-name@^1.0.0", "color-name@1.1.3":
+  "integrity" "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
+  "resolved" "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz"
+  "version" "1.1.3"
+
+"color-name@~1.1.4":
+  "integrity" "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+  "resolved" "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz"
+  "version" "1.1.4"
+
+"color-string@^1.5.2":
+  "version" "1.5.3"
+  dependencies:
+    "color-name" "^1.0.0"
+    "simple-swizzle" "^0.2.2"
+
+"color@^3.0.0", "color@3.0.x":
+  "integrity" "sha512-jCpd5+s0s0t7p3pHQKpnJ0TpQKKdleP71LWcA0aqiljpiuAkOSUFN/dyH8ZwF0hRmFlrIuRhufds1QyEP9EB+w=="
+  "resolved" "https://registry.npmjs.org/color/-/color-3.0.0.tgz"
+  "version" "3.0.0"
+  dependencies:
+    "color-convert" "^1.9.1"
+    "color-string" "^1.5.2"
+
+"colorette@^1.2.0", "colorette@^1.2.2":
+  "integrity" "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w=="
+  "resolved" "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz"
+  "version" "1.2.2"
+
+"colornames@^1.1.1":
+  "integrity" "sha1-+IiQMGhcfE/54qVZ9Qd+t2qBb5Y="
+  "resolved" "https://registry.npmjs.org/colornames/-/colornames-1.1.1.tgz"
+  "version" "1.1.1"
+
+"colors@^1.2.1":
+  "integrity" "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA=="
+  "resolved" "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz"
+  "version" "1.4.0"
+
+"colors@1.0.3":
+  "integrity" "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs="
+  "resolved" "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz"
+  "version" "1.0.3"
+
+"colorspace@1.1.x":
+  "integrity" "sha512-vt+OoIP2d76xLhjwbBaucYlNSpPsrJWPlBTtwCpQKIu6/CSMutyzX93O/Do0qzpH3YoHEes8YEFXyZ797rEhzQ=="
+  "resolved" "https://registry.npmjs.org/colorspace/-/colorspace-1.1.2.tgz"
+  "version" "1.1.2"
+  dependencies:
+    "color" "3.0.x"
+    "text-hex" "1.0.x"
+
+"combined-stream@^1.0.6", "combined-stream@~1.0.6":
+  "integrity" "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg=="
+  "resolved" "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz"
+  "version" "1.0.8"
+  dependencies:
+    "delayed-stream" "~1.0.0"
+
+"commander@^2.11.0", "commander@^2.12.1", "commander@^2.14.1", "commander@^2.18.0", "commander@^2.19.0", "commander@^2.2.0", "commander@^2.20.0", "commander@^2.9.0":
+  "integrity" "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="
+  "resolved" "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz"
+  "version" "2.20.3"
+
+"commander@^4.1.1":
+  "integrity" "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA=="
+  "resolved" "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz"
+  "version" "4.1.1"
+
+"commander@5.1.0":
+  "integrity" "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg=="
+  "resolved" "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz"
+  "version" "5.1.0"
+
+"common-tags@^1.8.0":
+  "integrity" "sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw=="
+  "resolved" "https://registry.npmjs.org/common-tags/-/common-tags-1.8.0.tgz"
+  "version" "1.8.0"
+
+"commondir@^1.0.1":
+  "integrity" "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs="
+  "resolved" "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz"
+  "version" "1.0.1"
+
+"compare-versions@^3.6.0":
+  "integrity" "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA=="
+  "resolved" "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz"
+  "version" "3.6.0"
+
+"component-bind@1.0.0":
+  "integrity" "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E="
+  "resolved" "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz"
+  "version" "1.0.0"
+
+"component-emitter@^1.2.1", "component-emitter@1.2.1":
+  "integrity" "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY="
+  "resolved" "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz"
+  "version" "1.2.1"
+
+"component-emitter@~1.3.0":
+  "integrity" "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg=="
+  "resolved" "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz"
+  "version" "1.3.0"
+
+"component-inherit@0.0.3":
+  "integrity" "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM="
+  "resolved" "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz"
+  "version" "0.0.3"
+
+"compressible@~2.0.16":
+  "integrity" "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg=="
+  "resolved" "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz"
+  "version" "2.0.18"
+  dependencies:
+    "mime-db" ">= 1.43.0 < 2"
+
+"compression@^1.7.4":
+  "integrity" "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ=="
+  "resolved" "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz"
+  "version" "1.7.4"
+  dependencies:
+    "accepts" "~1.3.5"
+    "bytes" "3.0.0"
+    "compressible" "~2.0.16"
+    "debug" "2.6.9"
+    "on-headers" "~1.0.2"
+    "safe-buffer" "5.1.2"
+    "vary" "~1.1.2"
+
+"concat-map@0.0.1":
+  "integrity" "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
+  "resolved" "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz"
+  "version" "0.0.1"
+
+"concat-stream@^1.4.7", "concat-stream@^1.5.0", "concat-stream@^1.6.0", "concat-stream@^1.6.2":
+  "integrity" "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw=="
+  "resolved" "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz"
+  "version" "1.6.2"
+  dependencies:
+    "buffer-from" "^1.0.0"
+    "inherits" "^2.0.3"
+    "readable-stream" "^2.2.2"
+    "typedarray" "^0.0.6"
+
+"conf@^1.4.0":
+  "integrity" "sha512-bzlVWS2THbMetHqXKB8ypsXN4DQ/1qopGwNJi1eYbpwesJcd86FBjFciCQX/YwAhp9bM7NVnPFqZ5LpV7gP0Dg=="
+  "resolved" "https://registry.npmjs.org/conf/-/conf-1.4.0.tgz"
+  "version" "1.4.0"
+  dependencies:
+    "dot-prop" "^4.1.0"
+    "env-paths" "^1.0.0"
+    "make-dir" "^1.0.0"
+    "pkg-up" "^2.0.0"
+    "write-file-atomic" "^2.3.0"
+
+"conf@6.2.4":
+  "integrity" "sha512-GjgyPRLo1qK1LR9RWAdUagqo+DP18f5HWCFk4va7GS+wpxQTOzfuKTwKOvGW2c01/YXNicAyyoyuSddmdkBzZQ=="
+  "resolved" "https://registry.npmjs.org/conf/-/conf-6.2.4.tgz"
+  "version" "6.2.4"
+  dependencies:
+    "ajv" "^6.10.2"
+    "debounce-fn" "^3.0.1"
+    "dot-prop" "^5.0.0"
+    "env-paths" "^2.2.0"
+    "json-schema-typed" "^7.0.1"
+    "make-dir" "^3.0.0"
+    "onetime" "^5.1.0"
+    "pkg-up" "^3.0.1"
+    "semver" "^6.2.0"
+    "write-file-atomic" "^3.0.0"
+
+"connect-history-api-fallback@^1", "connect-history-api-fallback@^1.6.0":
+  "integrity" "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg=="
+  "resolved" "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz"
+  "version" "1.6.0"
+
+"connect@3.6.6":
+  "integrity" "sha1-Ce/2xVr3I24TcTWnJXSFi2eG9SQ="
+  "resolved" "https://registry.npmjs.org/connect/-/connect-3.6.6.tgz"
+  "version" "3.6.6"
+  dependencies:
+    "debug" "2.6.9"
+    "finalhandler" "1.1.0"
+    "parseurl" "~1.3.2"
+    "utils-merge" "1.0.1"
+
+"console-browserify@^1.1.0":
+  "integrity" "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA=="
+  "resolved" "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz"
+  "version" "1.2.0"
+
+"constants-browserify@^1.0.0":
+  "integrity" "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U="
+  "resolved" "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz"
+  "version" "1.0.0"
+
+"content-disposition@0.5.3":
+  "integrity" "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g=="
+  "resolved" "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz"
+  "version" "0.5.3"
+  dependencies:
+    "safe-buffer" "5.1.2"
+
+"content-type@~1.0.4":
+  "integrity" "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA=="
+  "resolved" "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz"
+  "version" "1.0.4"
+
+"convert-source-map@^1.4.0", "convert-source-map@^1.5.1", "convert-source-map@^1.6.0", "convert-source-map@^1.7.0":
+  "integrity" "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA=="
+  "resolved" "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz"
+  "version" "1.7.0"
+  dependencies:
+    "safe-buffer" "~5.1.1"
+
+"cookie-signature@1.0.6":
+  "integrity" "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
+  "resolved" "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz"
+  "version" "1.0.6"
+
+"cookie@~0.4.1":
+  "integrity" "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA=="
+  "resolved" "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz"
+  "version" "0.4.1"
+
+"cookie@0.4.0":
+  "integrity" "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg=="
+  "resolved" "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz"
+  "version" "0.4.0"
+
+"copy-concurrently@^1.0.0":
+  "integrity" "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A=="
+  "resolved" "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz"
+  "version" "1.0.5"
+  dependencies:
+    "aproba" "^1.1.1"
+    "fs-write-stream-atomic" "^1.0.8"
+    "iferr" "^0.1.5"
+    "mkdirp" "^0.5.1"
+    "rimraf" "^2.5.4"
+    "run-queue" "^1.0.0"
+
+"copy-descriptor@^0.1.0":
+  "integrity" "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40="
+  "resolved" "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz"
+  "version" "0.1.1"
+
+"copy-webpack-plugin@6.0.2":
+  "integrity" "sha512-9Gm8X0c6eXlKnmltMPFCBeGOKjtcRIyTt4VaO3k1TkNgVTe5Ov2lYsYVuyLp0kp8DItO3apewflM+1GYgh6V2Q=="
+  "resolved" "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-6.0.2.tgz"
+  "version" "6.0.2"
+  dependencies:
+    "cacache" "^15.0.4"
+    "fast-glob" "^3.2.2"
+    "find-cache-dir" "^3.3.1"
+    "glob-parent" "^5.1.1"
+    "globby" "^11.0.1"
+    "loader-utils" "^2.0.0"
+    "normalize-path" "^3.0.0"
+    "p-limit" "^2.3.0"
+    "schema-utils" "^2.7.0"
+    "serialize-javascript" "^3.1.0"
+    "webpack-sources" "^1.4.3"
+
+"core-js-compat@^3.6.2":
+  "version" "3.6.5"
+  dependencies:
+    "browserslist" "^4.8.5"
+    "semver" "7.0.0"
+
+"core-js@^2.4.0":
+  "version" "2.6.11"
+
+"core-util-is@~1.0.0", "core-util-is@1.0.2":
+  "integrity" "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
+  "resolved" "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz"
+  "version" "1.0.2"
+
+"cosmiconfig@^5.0.0":
+  "integrity" "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA=="
+  "resolved" "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz"
+  "version" "5.2.1"
+  dependencies:
+    "import-fresh" "^2.0.0"
+    "is-directory" "^0.3.1"
+    "js-yaml" "^3.13.1"
+    "parse-json" "^4.0.0"
+
+"cosmiconfig@^5.2.0":
+  "integrity" "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA=="
+  "resolved" "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz"
+  "version" "5.2.1"
+  dependencies:
+    "import-fresh" "^2.0.0"
+    "is-directory" "^0.3.1"
+    "js-yaml" "^3.13.1"
+    "parse-json" "^4.0.0"
+
+"cosmiconfig@^6.0.0":
+  "integrity" "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg=="
+  "resolved" "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz"
+  "version" "6.0.0"
+  dependencies:
+    "@types/parse-json" "^4.0.0"
+    "import-fresh" "^3.1.0"
+    "parse-json" "^5.0.0"
+    "path-type" "^4.0.0"
+    "yaml" "^1.7.2"
+
+"create-ecdh@^4.0.0":
+  "version" "4.0.3"
+  dependencies:
+    "bn.js" "^4.1.0"
+    "elliptic" "^6.0.0"
+
+"create-error-class@^3.0.0":
+  "integrity" "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y="
+  "resolved" "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz"
+  "version" "3.0.2"
+  dependencies:
+    "capture-stack-trace" "^1.0.0"
+
+"create-hash@^1.1.0", "create-hash@^1.1.2", "create-hash@^1.2.0":
+  "integrity" "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg=="
+  "resolved" "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz"
+  "version" "1.2.0"
+  dependencies:
+    "cipher-base" "^1.0.1"
+    "inherits" "^2.0.1"
+    "md5.js" "^1.3.4"
+    "ripemd160" "^2.0.1"
+    "sha.js" "^2.4.0"
+
+"create-hmac@^1.1.0", "create-hmac@^1.1.4", "create-hmac@^1.1.7":
+  "integrity" "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg=="
+  "resolved" "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz"
+  "version" "1.1.7"
+  dependencies:
+    "cipher-base" "^1.0.3"
+    "create-hash" "^1.1.0"
+    "inherits" "^2.0.1"
+    "ripemd160" "^2.0.0"
+    "safe-buffer" "^5.0.1"
+    "sha.js" "^2.4.8"
+
+"cross-spawn@^6.0.0", "cross-spawn@^6.0.5":
+  "integrity" "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ=="
+  "resolved" "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz"
+  "version" "6.0.5"
+  dependencies:
+    "nice-try" "^1.0.4"
+    "path-key" "^2.0.1"
+    "semver" "^5.5.0"
+    "shebang-command" "^1.2.0"
+    "which" "^1.2.9"
+
+"cross-spawn@^7.0.0":
+  "integrity" "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w=="
+  "resolved" "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz"
+  "version" "7.0.3"
+  dependencies:
+    "path-key" "^3.1.0"
+    "shebang-command" "^2.0.0"
+    "which" "^2.0.1"
+
+"crypto-browserify@^3.11.0":
+  "integrity" "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg=="
+  "resolved" "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz"
+  "version" "3.12.0"
+  dependencies:
+    "browserify-cipher" "^1.0.0"
+    "browserify-sign" "^4.0.0"
+    "create-ecdh" "^4.0.0"
+    "create-hash" "^1.1.0"
+    "create-hmac" "^1.1.0"
+    "diffie-hellman" "^5.0.0"
+    "inherits" "^2.0.1"
+    "pbkdf2" "^3.0.3"
+    "public-encrypt" "^4.0.0"
+    "randombytes" "^2.0.0"
+    "randomfill" "^1.0.3"
+
+"crypto-random-string@^1.0.0":
+  "integrity" "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4="
+  "resolved" "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz"
+  "version" "1.0.0"
+
+"css-color-names@^0.0.4", "css-color-names@0.0.4":
+  "integrity" "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA="
+  "resolved" "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz"
+  "version" "0.0.4"
+
+"css-declaration-sorter@^4.0.1":
+  "integrity" "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA=="
+  "resolved" "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz"
+  "version" "4.0.1"
+  dependencies:
+    "postcss" "^7.0.1"
+    "timsort" "^0.3.0"
+
+"css-loader@3.6.0":
+  "integrity" "sha512-M5lSukoWi1If8dhQAUCvj4H8vUt3vOnwbQBH9DdTm/s4Ym2B/3dPMtYZeJmq7Q3S3Pa+I94DcZ7pc9bP14cWIQ=="
+  "resolved" "https://registry.npmjs.org/css-loader/-/css-loader-3.6.0.tgz"
+  "version" "3.6.0"
+  dependencies:
+    "camelcase" "^5.3.1"
+    "cssesc" "^3.0.0"
+    "icss-utils" "^4.1.1"
+    "loader-utils" "^1.2.3"
+    "normalize-path" "^3.0.0"
+    "postcss" "^7.0.32"
+    "postcss-modules-extract-imports" "^2.0.0"
+    "postcss-modules-local-by-default" "^3.0.2"
+    "postcss-modules-scope" "^2.2.0"
+    "postcss-modules-values" "^3.0.0"
+    "postcss-value-parser" "^4.1.0"
+    "schema-utils" "^2.7.0"
+    "semver" "^6.3.0"
+
+"css-select-base-adapter@^0.1.1":
+  "integrity" "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w=="
+  "resolved" "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz"
+  "version" "0.1.1"
+
+"css-select@^2.0.0":
+  "integrity" "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ=="
+  "resolved" "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz"
+  "version" "2.1.0"
+  dependencies:
+    "boolbase" "^1.0.0"
+    "css-what" "^3.2.1"
+    "domutils" "^1.7.0"
+    "nth-check" "^1.0.2"
+
+"css-select@^4.1.3":
+  "version" "4.1.3"
+  dependencies:
+    "boolbase" "^1.0.0"
+    "css-what" "^5.0.0"
+    "domhandler" "^4.2.0"
+    "domutils" "^2.6.0"
+    "nth-check" "^2.0.0"
+
+"css-selector-tokenizer@^0.7.1":
+  "integrity" "sha512-jWQv3oCEL5kMErj4wRnK/OPoBi0D+P1FR2cDCKYPaMeD2eW3/mttav8HT4hT1CKopiJI/psEULjkClhvJo4Lvg=="
+  "resolved" "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.3.tgz"
+  "version" "0.7.3"
+  dependencies:
+    "cssesc" "^3.0.0"
+    "fastparse" "^1.1.2"
+
+"css-tree@^1.1.2":
+  "integrity" "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q=="
+  "resolved" "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz"
+  "version" "1.1.3"
+  dependencies:
+    "mdn-data" "2.0.14"
+    "source-map" "^0.6.1"
+
+"css-tree@1.0.0-alpha.37":
+  "integrity" "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg=="
+  "resolved" "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz"
+  "version" "1.0.0-alpha.37"
+  dependencies:
+    "mdn-data" "2.0.4"
+    "source-map" "^0.6.1"
+
+"css-what@^3.2.1":
+  "integrity" "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ=="
+  "resolved" "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz"
+  "version" "3.4.2"
+
+"css-what@^5.0.0":
+  "version" "5.0.1"
+
+"cssauron@^1.4.0":
+  "integrity" "sha1-pmAt/34EqDBtwNuaVR6S6LVmKtg="
+  "resolved" "https://registry.npmjs.org/cssauron/-/cssauron-1.4.0.tgz"
+  "version" "1.4.0"
+  dependencies:
+    "through" "X.X.X"
+
+"cssesc@^3.0.0":
+  "integrity" "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg=="
+  "resolved" "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz"
+  "version" "3.0.0"
+
+"cssnano-preset-default@^4.0.8":
+  "integrity" "sha512-LdAyHuq+VRyeVREFmuxUZR1TXjQm8QQU/ktoo/x7bz+SdOge1YKc5eMN6pRW7YWBmyq59CqYba1dJ5cUukEjLQ=="
+  "resolved" "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.8.tgz"
+  "version" "4.0.8"
+  dependencies:
+    "css-declaration-sorter" "^4.0.1"
+    "cssnano-util-raw-cache" "^4.0.1"
+    "postcss" "^7.0.0"
+    "postcss-calc" "^7.0.1"
+    "postcss-colormin" "^4.0.3"
+    "postcss-convert-values" "^4.0.1"
+    "postcss-discard-comments" "^4.0.2"
+    "postcss-discard-duplicates" "^4.0.2"
+    "postcss-discard-empty" "^4.0.1"
+    "postcss-discard-overridden" "^4.0.1"
+    "postcss-merge-longhand" "^4.0.11"
+    "postcss-merge-rules" "^4.0.3"
+    "postcss-minify-font-values" "^4.0.2"
+    "postcss-minify-gradients" "^4.0.2"
+    "postcss-minify-params" "^4.0.2"
+    "postcss-minify-selectors" "^4.0.2"
+    "postcss-normalize-charset" "^4.0.1"
+    "postcss-normalize-display-values" "^4.0.2"
+    "postcss-normalize-positions" "^4.0.2"
+    "postcss-normalize-repeat-style" "^4.0.2"
+    "postcss-normalize-string" "^4.0.2"
+    "postcss-normalize-timing-functions" "^4.0.2"
+    "postcss-normalize-unicode" "^4.0.1"
+    "postcss-normalize-url" "^4.0.1"
+    "postcss-normalize-whitespace" "^4.0.2"
+    "postcss-ordered-values" "^4.1.2"
+    "postcss-reduce-initial" "^4.0.3"
+    "postcss-reduce-transforms" "^4.0.2"
+    "postcss-svgo" "^4.0.3"
+    "postcss-unique-selectors" "^4.0.1"
+
+"cssnano-util-get-arguments@^4.0.0":
+  "integrity" "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8="
+  "resolved" "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz"
+  "version" "4.0.0"
+
+"cssnano-util-get-match@^4.0.0":
+  "integrity" "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0="
+  "resolved" "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz"
+  "version" "4.0.0"
+
+"cssnano-util-raw-cache@^4.0.1":
+  "integrity" "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA=="
+  "resolved" "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz"
+  "version" "4.0.1"
+  dependencies:
+    "postcss" "^7.0.0"
+
+"cssnano-util-same-parent@^4.0.0":
+  "integrity" "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q=="
+  "resolved" "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz"
+  "version" "4.0.1"
+
+"cssnano@^4.1.10":
+  "integrity" "sha512-6gZm2htn7xIPJOHY824ERgj8cNPgPxyCSnkXc4v7YvNW+TdVfzgngHcEhy/8D11kUWRUMbke+tC+AUcUsnMz2g=="
+  "resolved" "https://registry.npmjs.org/cssnano/-/cssnano-4.1.11.tgz"
+  "version" "4.1.11"
+  dependencies:
+    "cosmiconfig" "^5.0.0"
+    "cssnano-preset-default" "^4.0.8"
+    "is-resolvable" "^1.0.0"
+    "postcss" "^7.0.0"
+
+"csso@^4.0.2":
+  "integrity" "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA=="
+  "resolved" "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz"
+  "version" "4.2.0"
+  dependencies:
+    "css-tree" "^1.1.2"
+
+"cssom@^0.4.4":
+  "integrity" "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw=="
+  "resolved" "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz"
+  "version" "0.4.4"
+
+"cssom@~0.3.6":
+  "integrity" "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg=="
+  "resolved" "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz"
+  "version" "0.3.8"
+
+"cssstyle@^2.2.0":
+  "version" "2.3.0"
+  dependencies:
+    "cssom" "~0.3.6"
+
+"cyclist@^1.0.1":
+  "integrity" "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk="
+  "resolved" "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz"
+  "version" "1.0.1"
+
+"damerau-levenshtein@^1.0.4":
+  "version" "1.0.6"
+
+"dargs@^6.1.0":
+  "integrity" "sha512-5dVBvpBLBnPwSsYXqfybFyehMmC/EenKEcf23AhCTgTf48JFBbmJKqoZBsERDnjL0FyiVTYWdFsRfTLHxLyKdQ=="
+  "resolved" "https://registry.npmjs.org/dargs/-/dargs-6.1.0.tgz"
+  "version" "6.1.0"
+
+"dashdash@^1.12.0":
+  "integrity" "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA="
+  "resolved" "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz"
+  "version" "1.14.1"
+  dependencies:
+    "assert-plus" "^1.0.0"
+
+"data-urls@^2.0.0":
+  "integrity" "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ=="
+  "resolved" "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz"
+  "version" "2.0.0"
+  dependencies:
+    "abab" "^2.0.3"
+    "whatwg-mimetype" "^2.3.0"
+    "whatwg-url" "^8.0.0"
+
+"date-fns@^1.27.2":
+  "integrity" "sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw=="
+  "resolved" "https://registry.npmjs.org/date-fns/-/date-fns-1.30.1.tgz"
+  "version" "1.30.1"
+
+"dateformat@^3.0.3":
+  "integrity" "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q=="
+  "resolved" "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz"
+  "version" "3.0.3"
+
+"debounce-fn@^3.0.1":
+  "integrity" "sha512-aBoJh5AhpqlRoHZjHmOzZlRx+wz2xVwGL9rjs+Kj0EWUrL4/h4K7OD176thl2Tdoqui/AaA4xhHrNArGLAaI3Q=="
+  "resolved" "https://registry.npmjs.org/debounce-fn/-/debounce-fn-3.0.1.tgz"
+  "version" "3.0.1"
+  dependencies:
+    "mimic-fn" "^2.1.0"
+
+"debug@^2.2.0":
+  "integrity" "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="
+  "resolved" "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz"
+  "version" "2.6.9"
+  dependencies:
+    "ms" "2.0.0"
+
+"debug@^2.3.3":
+  "integrity" "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="
+  "resolved" "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz"
+  "version" "2.6.9"
+  dependencies:
+    "ms" "2.0.0"
+
+"debug@^3.1.0":
+  "version" "3.2.6"
+  dependencies:
+    "ms" "^2.1.1"
+
+"debug@^3.1.1":
+  "version" "3.2.6"
+  dependencies:
+    "ms" "^2.1.1"
+
+"debug@^3.2.5":
+  "version" "3.2.6"
+  dependencies:
+    "ms" "^2.1.1"
+
+"debug@^4.0.1", "debug@^4.1.0", "debug@^4.1.1", "debug@~4.1.0", "debug@4.1.1":
+  "integrity" "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw=="
+  "resolved" "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz"
+  "version" "4.1.1"
+  dependencies:
+    "ms" "^2.1.1"
+
+"debug@=3.1.0":
+  "integrity" "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g=="
+  "resolved" "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz"
+  "version" "3.1.0"
+  dependencies:
+    "ms" "2.0.0"
+
+"debug@~3.1.0":
+  "integrity" "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g=="
+  "resolved" "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz"
+  "version" "3.1.0"
+  dependencies:
+    "ms" "2.0.0"
+
+"debug@2.6.9":
+  "integrity" "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="
+  "resolved" "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz"
+  "version" "2.6.9"
+  dependencies:
+    "ms" "2.0.0"
+
+"debug@3.1.0":
+  "integrity" "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g=="
+  "resolved" "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz"
+  "version" "3.1.0"
+  dependencies:
+    "ms" "2.0.0"
+
+"debug@4.3.1":
+  "integrity" "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ=="
+  "resolved" "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz"
+  "version" "4.3.1"
+  dependencies:
+    "ms" "2.1.2"
+
+"debuglog@^1.0.1":
+  "integrity" "sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI="
+  "resolved" "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz"
+  "version" "1.0.1"
+
+"decamelize-keys@^1.1.0":
+  "integrity" "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk="
+  "resolved" "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz"
+  "version" "1.1.0"
+  dependencies:
+    "decamelize" "^1.1.0"
+    "map-obj" "^1.0.0"
+
+"decamelize@^1.1.0", "decamelize@^1.2.0":
+  "integrity" "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA="
+  "resolved" "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz"
+  "version" "1.2.0"
+
+"decamelize@^4.0.0":
+  "integrity" "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ=="
+  "resolved" "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz"
+  "version" "4.0.0"
+
+"decimal.js@^10.2.0":
+  "version" "10.2.0"
+
+"decode-uri-component@^0.2.0":
+  "integrity" "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU="
+  "resolved" "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz"
+  "version" "0.2.0"
+
+"dedent@^0.7.0":
+  "integrity" "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw="
+  "resolved" "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz"
+  "version" "0.7.0"
+
+"deep-eql@^3.0.1":
+  "integrity" "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw=="
+  "resolved" "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz"
+  "version" "3.0.1"
+  dependencies:
+    "type-detect" "^4.0.0"
+
+"deep-equal@^1.0.1":
+  "integrity" "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g=="
+  "resolved" "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz"
+  "version" "1.1.1"
+  dependencies:
+    "is-arguments" "^1.0.4"
+    "is-date-object" "^1.0.1"
+    "is-regex" "^1.0.4"
+    "object-is" "^1.0.1"
+    "object-keys" "^1.1.1"
+    "regexp.prototype.flags" "^1.2.0"
+
+"deep-extend@^0.6.0":
+  "integrity" "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA=="
+  "resolved" "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz"
+  "version" "0.6.0"
+
+"deep-is@~0.1.3":
+  "integrity" "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ="
+  "resolved" "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz"
+  "version" "0.1.3"
+
+"deepmerge@^4.2.2":
+  "integrity" "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg=="
+  "resolved" "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz"
+  "version" "4.2.2"
+
+"default-gateway@^4.2.0":
+  "integrity" "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA=="
+  "resolved" "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz"
+  "version" "4.2.0"
+  dependencies:
+    "execa" "^1.0.0"
+    "ip-regex" "^2.1.0"
+
+"defaults@^1.0.3":
+  "integrity" "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730="
+  "resolved" "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz"
+  "version" "1.0.3"
+  dependencies:
+    "clone" "^1.0.2"
+
+"define-properties@^1.1.2", "define-properties@^1.1.3":
+  "integrity" "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ=="
+  "resolved" "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz"
+  "version" "1.1.3"
+  dependencies:
+    "object-keys" "^1.0.12"
+
+"define-property@^0.2.5":
+  "integrity" "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY="
+  "resolved" "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz"
+  "version" "0.2.5"
+  dependencies:
+    "is-descriptor" "^0.1.0"
+
+"define-property@^1.0.0":
+  "integrity" "sha1-dp66rz9KY6rTr56NMEybvnm/sOY="
+  "resolved" "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz"
+  "version" "1.0.0"
+  dependencies:
+    "is-descriptor" "^1.0.0"
+
+"define-property@^2.0.2":
+  "integrity" "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ=="
+  "resolved" "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz"
+  "version" "2.0.2"
+  dependencies:
+    "is-descriptor" "^1.0.2"
+    "isobject" "^3.0.1"
+
+"del@^2.2.0":
+  "integrity" "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag="
+  "resolved" "https://registry.npmjs.org/del/-/del-2.2.2.tgz"
+  "version" "2.2.2"
+  dependencies:
+    "globby" "^5.0.0"
+    "is-path-cwd" "^1.0.0"
+    "is-path-in-cwd" "^1.0.0"
+    "object-assign" "^4.0.1"
+    "pify" "^2.0.0"
+    "pinkie-promise" "^2.0.0"
+    "rimraf" "^2.2.8"
+
+"del@^3.0.0":
+  "integrity" "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU="
+  "resolved" "https://registry.npmjs.org/del/-/del-3.0.0.tgz"
+  "version" "3.0.0"
+  dependencies:
+    "globby" "^6.1.0"
+    "is-path-cwd" "^1.0.0"
+    "is-path-in-cwd" "^1.0.0"
+    "p-map" "^1.1.1"
+    "pify" "^3.0.0"
+    "rimraf" "^2.2.8"
+
+"del@^4.1.1":
+  "integrity" "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ=="
+  "resolved" "https://registry.npmjs.org/del/-/del-4.1.1.tgz"
+  "version" "4.1.1"
+  dependencies:
+    "@types/glob" "^7.1.1"
+    "globby" "^6.1.0"
+    "is-path-cwd" "^2.0.0"
+    "is-path-in-cwd" "^2.0.0"
+    "p-map" "^2.0.0"
+    "pify" "^4.0.1"
+    "rimraf" "^2.6.3"
+
+"delayed-stream@~1.0.0":
+  "integrity" "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
+  "resolved" "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz"
+  "version" "1.0.0"
+
+"delegate@^3.1.2":
+  "integrity" "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw=="
+  "resolved" "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz"
+  "version" "3.2.0"
+
+"delegates@^1.0.0":
+  "integrity" "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o="
+  "resolved" "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz"
+  "version" "1.0.0"
+
+"depd@~1.1.2":
+  "integrity" "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
+  "resolved" "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz"
+  "version" "1.1.2"
+
+"dependency-graph@^0.7.2":
+  "integrity" "sha512-KqtH4/EZdtdfWX0p6MGP9jljvxSY6msy/pRUD4jgNwVpv3v1QmNLlsB3LDSSUg79BRVSn7jI1QPRtArGABovAQ=="
+  "resolved" "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.7.2.tgz"
+  "version" "0.7.2"
+
+"des.js@^1.0.0":
+  "integrity" "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA=="
+  "resolved" "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz"
+  "version" "1.0.1"
+  dependencies:
+    "inherits" "^2.0.1"
+    "minimalistic-assert" "^1.0.0"
+
+"destroy@~1.0.4":
+  "integrity" "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
+  "resolved" "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz"
+  "version" "1.0.4"
+
+"detect-file@^1.0.0":
+  "integrity" "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc="
+  "resolved" "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz"
+  "version" "1.0.0"
+
+"detect-newline@^3.0.0":
+  "integrity" "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA=="
+  "resolved" "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz"
+  "version" "3.1.0"
+
+"detect-node@^2.0.4":
+  "version" "2.0.4"
+
+"dev-ip@^1.0.1":
+  "integrity" "sha1-p2o+0YVb56ASu4rBbLgPPADcKPA="
+  "resolved" "https://registry.npmjs.org/dev-ip/-/dev-ip-1.0.1.tgz"
+  "version" "1.0.1"
+
+"dezalgo@^1.0.0":
+  "integrity" "sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY="
+  "resolved" "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.3.tgz"
+  "version" "1.0.3"
+  dependencies:
+    "asap" "^2.0.0"
+    "wrappy" "1"
+
+"diagnostics@^1.1.1":
+  "integrity" "sha512-8wn1PmdunLJ9Tqbx+Fx/ZEuHfJf4NKSN2ZBj7SJC/OWRWha843+WsTjqMe1B5E3p28jqBlp+mJ2fPVxPyNgYKQ=="
+  "resolved" "https://registry.npmjs.org/diagnostics/-/diagnostics-1.1.1.tgz"
+  "version" "1.1.1"
+  dependencies:
+    "colorspace" "1.1.x"
+    "enabled" "1.0.x"
+    "kuler" "1.0.x"
+
+"didyoumean@1.2.1":
+  "integrity" "sha1-6S7f2tplN9SE1zwBcv0eugxJdv8="
+  "resolved" "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.1.tgz"
+  "version" "1.2.1"
+
+"diff-sequences@^25.2.6":
+  "integrity" "sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg=="
+  "resolved" "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.2.6.tgz"
+  "version" "25.2.6"
+
+"diff-sequences@^26.0.0":
+  "version" "26.0.0"
+
+"diff@^3.5.0":
+  "integrity" "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA=="
+  "resolved" "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz"
+  "version" "3.5.0"
+
+"diff@^4.0.1":
+  "integrity" "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A=="
+  "resolved" "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz"
+  "version" "4.0.2"
+
+"diff@5.0.0":
+  "integrity" "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w=="
+  "resolved" "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz"
+  "version" "5.0.0"
+
+"diffie-hellman@^5.0.0":
+  "integrity" "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg=="
+  "resolved" "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz"
+  "version" "5.0.3"
+  dependencies:
+    "bn.js" "^4.1.0"
+    "miller-rabin" "^4.0.0"
+    "randombytes" "^2.0.0"
+
+"dir-glob@^2.2.2":
+  "integrity" "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw=="
+  "resolved" "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz"
+  "version" "2.2.2"
+  dependencies:
+    "path-type" "^3.0.0"
+
+"dir-glob@^3.0.1":
+  "integrity" "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA=="
+  "resolved" "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz"
+  "version" "3.0.1"
+  dependencies:
+    "path-type" "^4.0.0"
+
+"dir-glob@2.0.0":
+  "integrity" "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag=="
+  "resolved" "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz"
+  "version" "2.0.0"
+  dependencies:
+    "arrify" "^1.0.1"
+    "path-type" "^3.0.0"
+
+"dlv@^1.1.3":
+  "integrity" "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA=="
+  "resolved" "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz"
+  "version" "1.1.3"
+
+"dns-equal@^1.0.0":
+  "integrity" "sha1-s55/HabrCnW6nBcySzR1PEfgZU0="
+  "resolved" "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz"
+  "version" "1.0.0"
+
+"dns-packet@^1.3.1":
+  "integrity" "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA=="
+  "resolved" "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz"
+  "version" "1.3.4"
+  dependencies:
+    "ip" "^1.1.0"
+    "safe-buffer" "^5.0.1"
+
+"dns-txt@^2.0.2":
+  "integrity" "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY="
+  "resolved" "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz"
+  "version" "2.0.2"
+  dependencies:
+    "buffer-indexof" "^1.0.0"
+
+"doctrine@^3.0.0":
+  "integrity" "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w=="
+  "resolved" "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz"
+  "version" "3.0.0"
+  dependencies:
+    "esutils" "^2.0.2"
+
+"dom-converter@^0.2.0":
+  "version" "0.2.0"
+  dependencies:
+    "utila" "~0.4"
+
+"dom-serializer@^1.0.1":
+  "integrity" "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig=="
+  "resolved" "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz"
+  "version" "1.3.2"
+  dependencies:
+    "domelementtype" "^2.0.1"
+    "domhandler" "^4.2.0"
+    "entities" "^2.0.0"
+
+"dom-serializer@0":
+  "integrity" "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g=="
+  "resolved" "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz"
+  "version" "0.2.2"
+  dependencies:
+    "domelementtype" "^2.0.1"
+    "entities" "^2.0.0"
+
+"domain-browser@^1.1.1":
+  "integrity" "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA=="
+  "resolved" "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz"
+  "version" "1.2.0"
+
+"domelementtype@^2.0.1", "domelementtype@^2.2.0":
+  "integrity" "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A=="
+  "resolved" "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz"
+  "version" "2.2.0"
+
+"domelementtype@1":
+  "integrity" "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w=="
+  "resolved" "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz"
+  "version" "1.3.1"
+
+"domexception@^2.0.1":
+  "integrity" "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg=="
+  "resolved" "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz"
+  "version" "2.0.1"
+  dependencies:
+    "webidl-conversions" "^5.0.0"
+
+"domhandler@^3.0.0":
+  "version" "3.0.0"
+  dependencies:
+    "domelementtype" "^2.0.1"
+
+"domhandler@^4.0.0":
+  "version" "4.2.0"
+  dependencies:
+    "domelementtype" "^2.2.0"
+
+"domhandler@^4.2.0":
+  "integrity" "sha512-zk7sgt970kzPks2Bf+dwT/PLzghLnsivb9CcxkvR8Mzr66Olr0Ofd8neSbglHJHaHa2MadfoSdNlKYAaafmWfA=="
+  "resolved" "https://registry.npmjs.org/domhandler/-/domhandler-4.2.0.tgz"
+  "version" "4.2.0"
+  dependencies:
+    "domelementtype" "^2.2.0"
+
+"domutils@^1.7.0":
+  "integrity" "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg=="
+  "resolved" "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz"
+  "version" "1.7.0"
+  dependencies:
+    "dom-serializer" "0"
+    "domelementtype" "1"
+
+"domutils@^2.0.0", "domutils@^2.5.2", "domutils@^2.6.0":
+  "version" "2.7.0"
+  dependencies:
+    "dom-serializer" "^1.0.1"
+    "domelementtype" "^2.2.0"
+    "domhandler" "^4.2.0"
+
+"dot-case@^3.0.3":
+  "version" "3.0.3"
+  dependencies:
+    "no-case" "^3.0.3"
+    "tslib" "^1.10.0"
+
+"dot-prop@^4.1.0":
+  "integrity" "sha512-l0p4+mIuJIua0mhxGoh4a+iNL9bmeK5DvnSVQa6T0OhrVmaEa1XScX5Etc673FePCJOArq/4Pa2cLGODUWTPOQ=="
+  "resolved" "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.1.tgz"
+  "version" "4.2.1"
+  dependencies:
+    "is-obj" "^1.0.0"
+
+"dot-prop@^5.0.0", "dot-prop@^5.2.0":
+  "version" "5.2.0"
+  dependencies:
+    "is-obj" "^2.0.0"
+
+"download-stats@^0.3.4":
+  "integrity" "sha512-ic2BigbyUWx7/CBbsfGjf71zUNZB4edBGC3oRliSzsoNmvyVx3Ycfp1w3vp2Y78Ee0eIIkjIEO5KzW0zThDGaA=="
+  "resolved" "https://registry.npmjs.org/download-stats/-/download-stats-0.3.4.tgz"
+  "version" "0.3.4"
+  dependencies:
+    "JSONStream" "^1.2.1"
+    "lazy-cache" "^2.0.1"
+    "moment" "^2.15.1"
+
+"drange@^1.0.2":
+  "integrity" "sha512-pYxfDYpued//QpnLIm4Avk7rsNtAtQkUES2cwAYSvD/wd2pKD71gN2Ebj3e7klzXwjocvE8c5vx/1fxwpqmSxA=="
+  "resolved" "https://registry.npmjs.org/drange/-/drange-1.1.1.tgz"
+  "version" "1.1.1"
+
+"duplexer@^0.1.1":
+  "version" "0.1.1"
+
+"duplexer3@^0.1.4":
+  "integrity" "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI="
+  "resolved" "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz"
+  "version" "0.1.4"
+
+"duplexify@^3.4.2", "duplexify@^3.6.0":
+  "integrity" "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g=="
+  "resolved" "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz"
+  "version" "3.7.1"
+  dependencies:
+    "end-of-stream" "^1.0.0"
+    "inherits" "^2.0.1"
+    "readable-stream" "^2.0.0"
+    "stream-shift" "^1.0.0"
+
+"easy-extender@^2.3.4":
+  "integrity" "sha512-8cAwm6md1YTiPpOvDULYJL4ZS6WfM5/cTeVVh4JsvyYZAoqlRVUpHL9Gr5Fy7HA6xcSZicUia3DeAgO3Us8E+Q=="
+  "resolved" "https://registry.npmjs.org/easy-extender/-/easy-extender-2.3.4.tgz"
+  "version" "2.3.4"
+  dependencies:
+    "lodash" "^4.17.10"
+
+"eazy-logger@3.1.0":
+  "integrity" "sha512-/snsn2JqBtUSSstEl4R0RKjkisGHAhvYj89i7r3ytNUKW12y178KDZwXLXIgwDqLW6E/VRMT9qfld7wvFae8bQ=="
+  "resolved" "https://registry.npmjs.org/eazy-logger/-/eazy-logger-3.1.0.tgz"
+  "version" "3.1.0"
+  dependencies:
+    "tfunk" "^4.0.0"
+
+"ecc-jsbn@~0.1.1":
+  "integrity" "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk="
+  "resolved" "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz"
+  "version" "0.1.2"
+  dependencies:
+    "jsbn" "~0.1.0"
+    "safer-buffer" "^2.1.0"
+
+"editions@^2.2.0":
+  "integrity" "sha512-ptGvkwTvGdGfC0hfhKg0MT+TRLRKGtUiWGBInxOm5pz7ssADezahjCUaYuZ8Dr+C05FW0AECIIPt4WBxVINEhA=="
+  "resolved" "https://registry.npmjs.org/editions/-/editions-2.3.1.tgz"
+  "version" "2.3.1"
+  dependencies:
+    "errlop" "^2.0.0"
+    "semver" "^6.3.0"
+
+"ee-first@1.1.1":
+  "integrity" "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
+  "resolved" "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz"
+  "version" "1.1.1"
+
+"ejs@^2.6.1":
+  "integrity" "sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA=="
+  "resolved" "https://registry.npmjs.org/ejs/-/ejs-2.7.4.tgz"
+  "version" "2.7.4"
+
+"ejs@^3.1.5":
+  "version" "3.1.5"
+  dependencies:
+    "jake" "^10.6.1"
+
+"ejs@3.1.3":
+  "integrity" "sha512-wmtrUGyfSC23GC/B1SMv2ogAUgbQEtDmTIhfqielrG5ExIM9TP4UoYdi90jLF1aTcsWCJNEO0UrgKzP0y3nTSg=="
+  "resolved" "https://registry.npmjs.org/ejs/-/ejs-3.1.3.tgz"
+  "version" "3.1.3"
+  dependencies:
+    "jake" "^10.6.1"
+
+"electron-to-chromium@^1.3.723":
+  "version" "1.3.755"
+
+"elegant-spinner@^1.0.1":
+  "integrity" "sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4="
+  "resolved" "https://registry.npmjs.org/elegant-spinner/-/elegant-spinner-1.0.1.tgz"
+  "version" "1.0.1"
+
+"elliptic@^6.0.0", "elliptic@^6.5.2":
+  "version" "6.5.4"
+  dependencies:
+    "bn.js" "^4.11.9"
+    "brorand" "^1.1.0"
+    "hash.js" "^1.0.0"
+    "hmac-drbg" "^1.0.1"
+    "inherits" "^2.0.4"
+    "minimalistic-assert" "^1.0.1"
+    "minimalistic-crypto-utils" "^1.0.1"
+
+"emoji-regex@^7.0.1":
+  "integrity" "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA=="
+  "resolved" "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz"
+  "version" "7.0.3"
+
+"emoji-regex@^8.0.0":
+  "integrity" "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
+  "resolved" "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz"
+  "version" "8.0.0"
+
+"emoji-toolkit@^6.0.1":
+  "integrity" "sha512-oY5E81cXvRUxXkbVgOI8NxYHKF5FeWfJhFCIYUKhbVfSmdCH8+bmJzgDdhufExa7t1+WEzpUFdHwYxJTXS90vQ=="
+  "resolved" "https://registry.npmjs.org/emoji-toolkit/-/emoji-toolkit-6.5.1.tgz"
+  "version" "6.5.1"
+
+"emojis-list@^3.0.0":
+  "integrity" "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q=="
+  "resolved" "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz"
+  "version" "3.0.0"
+
+"enabled@1.0.x":
+  "integrity" "sha1-ll9lE9LC0cX0ZStkouM5ZGf8L5M="
+  "resolved" "https://registry.npmjs.org/enabled/-/enabled-1.0.2.tgz"
+  "version" "1.0.2"
+  dependencies:
+    "env-variable" "0.0.x"
+
+"encodeurl@~1.0.1", "encodeurl@~1.0.2":
+  "integrity" "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k="
+  "resolved" "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz"
+  "version" "1.0.2"
+
+"encoding@^0.1.11":
+  "integrity" "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A=="
+  "resolved" "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz"
+  "version" "0.1.13"
+  dependencies:
+    "iconv-lite" "^0.6.2"
+
+"end-of-stream@^1.0.0", "end-of-stream@^1.1.0":
+  "integrity" "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q=="
+  "resolved" "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz"
+  "version" "1.4.4"
+  dependencies:
+    "once" "^1.4.0"
+
+"engine.io-client@~3.5.0":
+  "integrity" "sha512-QEqIp+gJ/kMHeUun7f5Vv3bteRHppHH/FMBQX/esFj/fuYfjyUKWGMo3VCvIP/V8bE9KcjHmRZrhIz2Z9oNsDA=="
+  "resolved" "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.5.2.tgz"
+  "version" "3.5.2"
+  dependencies:
+    "component-emitter" "~1.3.0"
+    "component-inherit" "0.0.3"
+    "debug" "~3.1.0"
+    "engine.io-parser" "~2.2.0"
+    "has-cors" "1.1.0"
+    "indexof" "0.0.1"
+    "parseqs" "0.0.6"
+    "parseuri" "0.0.6"
+    "ws" "~7.4.2"
+    "xmlhttprequest-ssl" "~1.6.2"
+    "yeast" "0.1.2"
+
+"engine.io-parser@~2.2.0":
+  "integrity" "sha512-x+dN/fBH8Ro8TFwJ+rkB2AmuVw9Yu2mockR/p3W8f8YtExwFgDvBDi0GWyb4ZLkpahtDGZgtr3zLovanJghPqg=="
+  "resolved" "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.2.1.tgz"
+  "version" "2.2.1"
+  dependencies:
+    "after" "0.8.2"
+    "arraybuffer.slice" "~0.0.7"
+    "base64-arraybuffer" "0.1.4"
+    "blob" "0.0.5"
+    "has-binary2" "~1.0.2"
+
+"engine.io@~3.5.0":
+  "integrity" "sha512-21HlvPUKaitDGE4GXNtQ7PLP0Sz4aWLddMPw2VTyFz1FVZqu/kZsJUO8WNpKuE/OCL7nkfRaOui2ZCJloGznGA=="
+  "resolved" "https://registry.npmjs.org/engine.io/-/engine.io-3.5.0.tgz"
+  "version" "3.5.0"
+  dependencies:
+    "accepts" "~1.3.4"
+    "base64id" "2.0.0"
+    "cookie" "~0.4.1"
+    "debug" "~4.1.0"
+    "engine.io-parser" "~2.2.0"
+    "ws" "~7.4.2"
+
+"enhanced-resolve@^4.0.0", "enhanced-resolve@^4.1.0", "enhanced-resolve@^4.1.1", "enhanced-resolve@4.1.1":
+  "integrity" "sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA=="
+  "resolved" "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz"
+  "version" "4.1.1"
+  dependencies:
+    "graceful-fs" "^4.1.2"
+    "memory-fs" "^0.5.0"
+    "tapable" "^1.0.0"
+
+"entities@^2.0.0":
+  "version" "2.0.3"
+
+"env-paths@^1.0.0":
+  "integrity" "sha1-QWgTO0K7BcOKNbGuQ5fIKYqzaeA="
+  "resolved" "https://registry.npmjs.org/env-paths/-/env-paths-1.0.0.tgz"
+  "version" "1.0.0"
+
+"env-paths@^2.2.0":
+  "version" "2.2.0"
+
+"env-variable@0.0.x":
+  "integrity" "sha512-bHz59NlBbtS0NhftmR8+ExBEekE7br0e01jw+kk0NDro7TtZzBYZ5ScGPs3OmwnpyfHTHOtr1Y6uedCdrIldtg=="
+  "resolved" "https://registry.npmjs.org/env-variable/-/env-variable-0.0.6.tgz"
+  "version" "0.0.6"
+
+"err-code@^1.0.0":
+  "integrity" "sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA="
+  "resolved" "https://registry.npmjs.org/err-code/-/err-code-1.1.2.tgz"
+  "version" "1.1.2"
+
+"errlop@^2.0.0":
+  "integrity" "sha512-e64Qj9+4aZzjzzFpZC7p5kmm/ccCrbLhAJplhsDXQFs87XTsXwOpH4s1Io2s90Tau/8r2j9f4l/thhDevRjzxw=="
+  "resolved" "https://registry.npmjs.org/errlop/-/errlop-2.2.0.tgz"
+  "version" "2.2.0"
+
+"errno@^0.1.3", "errno@~0.1.7":
+  "version" "0.1.7"
+  dependencies:
+    "prr" "~1.0.1"
+
+"error-ex@^1.3.1":
+  "integrity" "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g=="
+  "resolved" "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz"
+  "version" "1.3.2"
+  dependencies:
+    "is-arrayish" "^0.2.1"
+
+"error-stack-parser@^2.0.0":
+  "integrity" "sha512-d51brTeqC+BHlwF0BhPtcYgF5nlzf9ZZ0ZIUQNZpc9ZB9qw5IJ2diTrBY9jlCJkTLITYPjmiX6OWCwH+fuyNgQ=="
+  "resolved" "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.6.tgz"
+  "version" "2.0.6"
+  dependencies:
+    "stackframe" "^1.1.1"
+
+"error@^7.0.2":
+  "integrity" "sha512-fo9HBvWnx3NGUKMvMwB/CBCMMrfEJgbDTVDEkPygA3Bdd3lM1OyCd+rbQ8BwnpF6GdVeOLDNmyL4N5Bg80ZvdA=="
+  "resolved" "https://registry.npmjs.org/error/-/error-7.2.1.tgz"
+  "version" "7.2.1"
+  dependencies:
+    "string-template" "~0.2.1"
+
+"es-abstract@^1.17.0-next.1", "es-abstract@^1.17.5", "es-abstract@^1.18.2":
+  "integrity" "sha512-nQIr12dxV7SSxE6r6f1l3DtAeEYdsGpps13dR0TwJg1S8gyp4ZPgy3FZcHBgbiQqnoqSTb+oC+kO4UQ0C/J8vw=="
+  "resolved" "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.3.tgz"
+  "version" "1.18.3"
+  dependencies:
+    "call-bind" "^1.0.2"
+    "es-to-primitive" "^1.2.1"
+    "function-bind" "^1.1.1"
+    "get-intrinsic" "^1.1.1"
+    "has" "^1.0.3"
+    "has-symbols" "^1.0.2"
+    "is-callable" "^1.2.3"
+    "is-negative-zero" "^2.0.1"
+    "is-regex" "^1.1.3"
+    "is-string" "^1.0.6"
+    "object-inspect" "^1.10.3"
+    "object-keys" "^1.1.1"
+    "object.assign" "^4.1.2"
+    "string.prototype.trimend" "^1.0.4"
+    "string.prototype.trimstart" "^1.0.4"
+    "unbox-primitive" "^1.0.1"
+
+"es-to-primitive@^1.2.1":
+  "integrity" "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA=="
+  "resolved" "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz"
+  "version" "1.2.1"
+  dependencies:
+    "is-callable" "^1.1.4"
+    "is-date-object" "^1.0.1"
+    "is-symbol" "^1.0.2"
+
+"es6-promise@^4.0.3":
+  "integrity" "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w=="
+  "resolved" "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz"
+  "version" "4.2.8"
+
+"es6-promise@4.0.5":
+  "integrity" "sha1-eILzCt3lskDM+n99eMVIMwlRrkI="
+  "resolved" "https://registry.npmjs.org/es6-promise/-/es6-promise-4.0.5.tgz"
+  "version" "4.0.5"
+
+"es6-promisify@^5.0.0":
+  "integrity" "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM="
+  "resolved" "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz"
+  "version" "5.0.0"
+  dependencies:
+    "es6-promise" "^4.0.3"
+
+"escalade@^3.1.1":
+  "integrity" "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw=="
+  "resolved" "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz"
+  "version" "3.1.1"
+
+"escape-html@~1.0.3":
+  "integrity" "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
+  "resolved" "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz"
+  "version" "1.0.3"
+
+"escape-string-regexp@^1.0.2", "escape-string-regexp@^1.0.4", "escape-string-regexp@^1.0.5":
+  "integrity" "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
+  "resolved" "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz"
+  "version" "1.0.5"
+
+"escape-string-regexp@^2.0.0":
+  "integrity" "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w=="
+  "resolved" "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz"
+  "version" "2.0.0"
+
+"escape-string-regexp@4.0.0":
+  "integrity" "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="
+  "resolved" "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz"
+  "version" "4.0.0"
+
+"escodegen@^1.14.1":
+  "version" "1.14.3"
+  dependencies:
+    "esprima" "^4.0.1"
+    "estraverse" "^4.2.0"
+    "esutils" "^2.0.2"
+    "optionator" "^0.8.1"
+  optionalDependencies:
+    "source-map" "~0.6.1"
+
+"eslint-config-jhipster@0.0.1":
+  "integrity" "sha512-E9/05t3+6V2K9YrJwsLmrblGgYnYfw62o/ja+Hr9wz3+AX2nG6gtycMW7LrS4alFuar1SGhbAyT3orTR5ur9MQ=="
+  "resolved" "https://registry.npmjs.org/eslint-config-jhipster/-/eslint-config-jhipster-0.0.1.tgz"
+  "version" "0.0.1"
+
+"eslint-config-prettier@^6.1.0", "eslint-config-prettier@6.11.0":
+  "integrity" "sha512-oB8cpLWSAjOVFEJhhyMZh6NOEOtBVziaqdDQ86+qhDHFbZXoRTM7pNSvFRfW/W/L/LrQ38C99J5CGuRBBzBsdA=="
+  "resolved" "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.11.0.tgz"
+  "version" "6.11.0"
+  dependencies:
+    "get-stdin" "^6.0.0"
+
+"eslint-loader@4.0.2":
+  "integrity" "sha512-EDpXor6lsjtTzZpLUn7KmXs02+nIjGcgees9BYjNkWra3jVq5vVa8IoCKgzT2M7dNNeoMBtaSG83Bd40N3poLw=="
+  "resolved" "https://registry.npmjs.org/eslint-loader/-/eslint-loader-4.0.2.tgz"
+  "version" "4.0.2"
+  dependencies:
+    "find-cache-dir" "^3.3.1"
+    "fs-extra" "^8.1.0"
+    "loader-utils" "^2.0.0"
+    "object-hash" "^2.0.3"
+    "schema-utils" "^2.6.5"
+
+"eslint-scope@^4.0.3":
+  "integrity" "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg=="
+  "resolved" "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz"
+  "version" "4.0.3"
+  dependencies:
+    "esrecurse" "^4.1.0"
+    "estraverse" "^4.1.1"
+
+"eslint-scope@^5.0.0":
+  "version" "5.1.0"
+  dependencies:
+    "esrecurse" "^4.1.0"
+    "estraverse" "^4.1.1"
+
+"eslint-utils@^1.4.3":
+  "integrity" "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q=="
+  "resolved" "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz"
+  "version" "1.4.3"
+  dependencies:
+    "eslint-visitor-keys" "^1.1.0"
+
+"eslint-utils@^2.0.0":
+  "integrity" "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg=="
+  "resolved" "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz"
+  "version" "2.1.0"
+  dependencies:
+    "eslint-visitor-keys" "^1.1.0"
+
+"eslint-visitor-keys@^1.1.0":
+  "integrity" "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ=="
+  "resolved" "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz"
+  "version" "1.3.0"
+
+"eslint@*", "eslint@^5.0.0 || ^6.0.0", "eslint@^6.0.0 || ^7.0.0", "eslint@^6.1.0", "eslint@>=3.14.1", "eslint@6.8.0":
+  "integrity" "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig=="
+  "resolved" "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz"
+  "version" "6.8.0"
+  dependencies:
+    "@babel/code-frame" "^7.0.0"
+    "ajv" "^6.10.0"
+    "chalk" "^2.1.0"
+    "cross-spawn" "^6.0.5"
+    "debug" "^4.0.1"
+    "doctrine" "^3.0.0"
+    "eslint-scope" "^5.0.0"
+    "eslint-utils" "^1.4.3"
+    "eslint-visitor-keys" "^1.1.0"
+    "espree" "^6.1.2"
+    "esquery" "^1.0.1"
+    "esutils" "^2.0.2"
+    "file-entry-cache" "^5.0.1"
+    "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"
+    "inquirer" "^7.0.0"
+    "is-glob" "^4.0.0"
+    "js-yaml" "^3.13.1"
+    "json-stable-stringify-without-jsonify" "^1.0.1"
+    "levn" "^0.3.0"
+    "lodash" "^4.17.14"
+    "minimatch" "^3.0.4"
+    "mkdirp" "^0.5.1"
+    "natural-compare" "^1.4.0"
+    "optionator" "^0.8.3"
+    "progress" "^2.0.0"
+    "regexpp" "^2.0.1"
+    "semver" "^6.1.2"
+    "strip-ansi" "^5.2.0"
+    "strip-json-comments" "^3.0.1"
+    "table" "^5.2.3"
+    "text-table" "^0.2.0"
+    "v8-compile-cache" "^2.0.3"
+
+"espree@^6.1.2":
+  "integrity" "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw=="
+  "resolved" "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz"
+  "version" "6.2.1"
+  dependencies:
+    "acorn" "^7.1.1"
+    "acorn-jsx" "^5.2.0"
+    "eslint-visitor-keys" "^1.1.0"
+
+"esprima@^4.0.0", "esprima@^4.0.1":
+  "integrity" "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="
+  "resolved" "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz"
+  "version" "4.0.1"
+
+"esquery@^1.0.1":
+  "version" "1.3.1"
+  dependencies:
+    "estraverse" "^5.1.0"
+
+"esrecurse@^4.1.0":
+  "version" "4.2.1"
+  dependencies:
+    "estraverse" "^4.1.0"
+
+"estraverse@^4.1.0", "estraverse@^4.1.1", "estraverse@^4.2.0":
+  "integrity" "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw=="
+  "resolved" "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz"
+  "version" "4.3.0"
+
+"estraverse@^5.1.0":
+  "version" "5.1.0"
+
+"estree-walker@^0.6.1":
+  "integrity" "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w=="
+  "resolved" "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz"
+  "version" "0.6.1"
+
+"estree-walker@^1.0.1":
+  "integrity" "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg=="
+  "resolved" "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz"
+  "version" "1.0.1"
+
+"esutils@^2.0.2":
+  "integrity" "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="
+  "resolved" "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz"
+  "version" "2.0.3"
+
+"etag@^1.8.1", "etag@~1.8.1", "etag@1.8.1":
+  "integrity" "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc="
+  "resolved" "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz"
+  "version" "1.8.1"
+
+"eventemitter3@^4.0.0":
+  "integrity" "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw=="
+  "resolved" "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz"
+  "version" "4.0.7"
+
+"events@^3.0.0":
+  "version" "3.1.0"
+
+"events@1.1.1":
+  "integrity" "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ="
+  "resolved" "https://registry.npmjs.org/events/-/events-1.1.1.tgz"
+  "version" "1.1.1"
+
+"eventsource@^1.0.7":
+  "version" "1.0.7"
+  dependencies:
+    "original" "^1.0.0"
+
+"evp_bytestokey@^1.0.0", "evp_bytestokey@^1.0.3":
+  "integrity" "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA=="
+  "resolved" "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz"
+  "version" "1.0.3"
+  dependencies:
+    "md5.js" "^1.3.4"
+    "safe-buffer" "^5.1.1"
+
+"exec-sh@^0.3.2":
+  "version" "0.3.4"
+
+"execa@^1.0.0":
+  "integrity" "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA=="
+  "resolved" "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz"
+  "version" "1.0.0"
+  dependencies:
+    "cross-spawn" "^6.0.0"
+    "get-stream" "^4.0.0"
+    "is-stream" "^1.1.0"
+    "npm-run-path" "^2.0.0"
+    "p-finally" "^1.0.0"
+    "signal-exit" "^3.0.0"
+    "strip-eof" "^1.0.0"
+
+"execa@^4.0.0":
+  "version" "4.0.2"
+  dependencies:
+    "cross-spawn" "^7.0.0"
+    "get-stream" "^5.0.0"
+    "human-signals" "^1.1.1"
+    "is-stream" "^2.0.0"
+    "merge-stream" "^2.0.0"
+    "npm-run-path" "^4.0.0"
+    "onetime" "^5.1.0"
+    "signal-exit" "^3.0.2"
+    "strip-final-newline" "^2.0.0"
+
+"exit-hook@^1.0.0":
+  "integrity" "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g="
+  "resolved" "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz"
+  "version" "1.1.1"
+
+"exit@^0.1.2":
+  "integrity" "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw="
+  "resolved" "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz"
+  "version" "0.1.2"
+
+"expand-brackets@^2.1.4":
+  "integrity" "sha1-t3c14xXOMPa27/D4OwQVGiJEliI="
+  "resolved" "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz"
+  "version" "2.1.4"
+  dependencies:
+    "debug" "^2.3.3"
+    "define-property" "^0.2.5"
+    "extend-shallow" "^2.0.1"
+    "posix-character-classes" "^0.1.0"
+    "regex-not" "^1.0.0"
+    "snapdragon" "^0.8.1"
+    "to-regex" "^3.0.1"
+
+"expand-tilde@^2.0.0", "expand-tilde@^2.0.2":
+  "integrity" "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI="
+  "resolved" "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz"
+  "version" "2.0.2"
+  dependencies:
+    "homedir-polyfill" "^1.0.1"
+
+"expect@^26.1.0":
+  "version" "26.1.0"
+  dependencies:
+    "@jest/types" "^26.1.0"
+    "ansi-styles" "^4.0.0"
+    "jest-get-type" "^26.0.0"
+    "jest-matcher-utils" "^26.1.0"
+    "jest-message-util" "^26.1.0"
+    "jest-regex-util" "^26.0.0"
+
+"express@^4.16.3", "express@^4.17.1":
+  "integrity" "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g=="
+  "resolved" "https://registry.npmjs.org/express/-/express-4.17.1.tgz"
+  "version" "4.17.1"
+  dependencies:
+    "accepts" "~1.3.7"
+    "array-flatten" "1.1.1"
+    "body-parser" "1.19.0"
+    "content-disposition" "0.5.3"
+    "content-type" "~1.0.4"
+    "cookie" "0.4.0"
+    "cookie-signature" "1.0.6"
+    "debug" "2.6.9"
+    "depd" "~1.1.2"
+    "encodeurl" "~1.0.2"
+    "escape-html" "~1.0.3"
+    "etag" "~1.8.1"
+    "finalhandler" "~1.1.2"
+    "fresh" "0.5.2"
+    "merge-descriptors" "1.0.1"
+    "methods" "~1.1.2"
+    "on-finished" "~2.3.0"
+    "parseurl" "~1.3.3"
+    "path-to-regexp" "0.1.7"
+    "proxy-addr" "~2.0.5"
+    "qs" "6.7.0"
+    "range-parser" "~1.2.1"
+    "safe-buffer" "5.1.2"
+    "send" "0.17.1"
+    "serve-static" "1.14.1"
+    "setprototypeof" "1.1.1"
+    "statuses" "~1.5.0"
+    "type-is" "~1.6.18"
+    "utils-merge" "1.0.1"
+    "vary" "~1.1.2"
+
+"extend-shallow@^2.0.1":
+  "integrity" "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8="
+  "resolved" "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz"
+  "version" "2.0.1"
+  dependencies:
+    "is-extendable" "^0.1.0"
+
+"extend-shallow@^3.0.0", "extend-shallow@^3.0.2":
+  "integrity" "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg="
+  "resolved" "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz"
+  "version" "3.0.2"
+  dependencies:
+    "assign-symbols" "^1.0.0"
+    "is-extendable" "^1.0.1"
+
+"extend@^3.0.0", "extend@~3.0.2":
+  "integrity" "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
+  "resolved" "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz"
+  "version" "3.0.2"
+
+"external-editor@^1.1.0":
+  "integrity" "sha1-Etew24UPf/fnCBuvQAVwAGDEYAs="
+  "resolved" "https://registry.npmjs.org/external-editor/-/external-editor-1.1.1.tgz"
+  "version" "1.1.1"
+  dependencies:
+    "extend" "^3.0.0"
+    "spawn-sync" "^1.0.15"
+    "tmp" "^0.0.29"
+
+"external-editor@^3.0.3":
+  "integrity" "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew=="
+  "resolved" "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz"
+  "version" "3.1.0"
+  dependencies:
+    "chardet" "^0.7.0"
+    "iconv-lite" "^0.4.24"
+    "tmp" "^0.0.33"
+
+"extglob@^2.0.4":
+  "integrity" "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw=="
+  "resolved" "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz"
+  "version" "2.0.4"
+  dependencies:
+    "array-unique" "^0.3.2"
+    "define-property" "^1.0.0"
+    "expand-brackets" "^2.1.4"
+    "extend-shallow" "^2.0.1"
+    "fragment-cache" "^0.2.1"
+    "regex-not" "^1.0.0"
+    "snapdragon" "^0.8.1"
+    "to-regex" "^3.0.1"
+
+"extsprintf@^1.2.0", "extsprintf@1.3.0":
+  "integrity" "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU="
+  "resolved" "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz"
+  "version" "1.3.0"
+
+"faker@4.1.0":
+  "integrity" "sha1-HkW7vsxndLPBlfrSg1EJxtdIzD8="
+  "resolved" "https://registry.npmjs.org/faker/-/faker-4.1.0.tgz"
+  "version" "4.1.0"
+
+"fast-deep-equal@^3.1.1":
+  "integrity" "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
+  "resolved" "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz"
+  "version" "3.1.3"
+
+"fast-glob@^2.0.2":
+  "integrity" "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw=="
+  "resolved" "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz"
+  "version" "2.2.7"
+  dependencies:
+    "@mrmlnc/readdir-enhanced" "^2.2.1"
+    "@nodelib/fs.stat" "^1.1.2"
+    "glob-parent" "^3.1.0"
+    "is-glob" "^4.0.0"
+    "merge2" "^1.2.3"
+    "micromatch" "^3.1.10"
+
+"fast-glob@^2.2.6":
+  "integrity" "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw=="
+  "resolved" "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz"
+  "version" "2.2.7"
+  dependencies:
+    "@mrmlnc/readdir-enhanced" "^2.2.1"
+    "@nodelib/fs.stat" "^1.1.2"
+    "glob-parent" "^3.1.0"
+    "is-glob" "^4.0.0"
+    "merge2" "^1.2.3"
+    "micromatch" "^3.1.10"
+
+"fast-glob@^3.1.1", "fast-glob@^3.2.2":
+  "version" "3.2.4"
+  dependencies:
+    "@nodelib/fs.stat" "^2.0.2"
+    "@nodelib/fs.walk" "^1.2.3"
+    "glob-parent" "^5.1.0"
+    "merge2" "^1.3.0"
+    "micromatch" "^4.0.2"
+    "picomatch" "^2.2.1"
+
+"fast-json-stable-stringify@^2.0.0", "fast-json-stable-stringify@^2.1.0", "fast-json-stable-stringify@2.1.0", "fast-json-stable-stringify@2.x":
+  "integrity" "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
+  "resolved" "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz"
+  "version" "2.1.0"
+
+"fast-levenshtein@~2.0.6":
+  "integrity" "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc="
+  "resolved" "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz"
+  "version" "2.0.6"
+
+"fast-safe-stringify@^2.0.4":
+  "integrity" "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA=="
+  "resolved" "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz"
+  "version" "2.0.7"
+
+"fastparse@^1.1.2":
+  "integrity" "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ=="
+  "resolved" "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz"
+  "version" "1.1.2"
+
+"fastq@^1.6.0":
+  "version" "1.8.0"
+  dependencies:
+    "reusify" "^1.0.4"
+
+"faye-websocket@^0.10.0":
+  "integrity" "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ="
+  "resolved" "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz"
+  "version" "0.10.0"
+  dependencies:
+    "websocket-driver" ">=0.5.1"
+
+"faye-websocket@~0.11.1":
+  "version" "0.11.3"
+  dependencies:
+    "websocket-driver" ">=0.5.1"
+
+"fb-watchman@^2.0.0":
+  "integrity" "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg=="
+  "resolved" "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz"
+  "version" "2.0.1"
+  dependencies:
+    "bser" "2.1.1"
+
+"fecha@^4.2.0":
+  "version" "4.2.0"
+
+"figgy-pudding@^3.4.1", "figgy-pudding@^3.5.1":
+  "integrity" "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw=="
+  "resolved" "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz"
+  "version" "3.5.2"
+
+"figures@^1.3.5":
+  "integrity" "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4="
+  "resolved" "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz"
+  "version" "1.7.0"
+  dependencies:
+    "escape-string-regexp" "^1.0.5"
+    "object-assign" "^4.1.0"
+
+"figures@^1.7.0":
+  "integrity" "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4="
+  "resolved" "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz"
+  "version" "1.7.0"
+  dependencies:
+    "escape-string-regexp" "^1.0.5"
+    "object-assign" "^4.1.0"
+
+"figures@^2.0.0":
+  "integrity" "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI="
+  "resolved" "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz"
+  "version" "2.0.0"
+  dependencies:
+    "escape-string-regexp" "^1.0.5"
+
+"figures@^3.0.0":
+  "integrity" "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg=="
+  "resolved" "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz"
+  "version" "3.2.0"
+  dependencies:
+    "escape-string-regexp" "^1.0.5"
+
+"figures@2.0.x":
+  "integrity" "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI="
+  "resolved" "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz"
+  "version" "2.0.0"
+  dependencies:
+    "escape-string-regexp" "^1.0.5"
+
+"file-entry-cache@^5.0.1":
+  "integrity" "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g=="
+  "resolved" "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz"
+  "version" "5.0.1"
+  dependencies:
+    "flat-cache" "^2.0.1"
+
+"file-loader@6.0.0":
+  "integrity" "sha512-/aMOAYEFXDdjG0wytpTL5YQLfZnnTmLNjn+AIrJ/6HVnTfDqLsVKUUwkDf4I4kgex36BvjuXEn/TX9B/1ESyqQ=="
+  "resolved" "https://registry.npmjs.org/file-loader/-/file-loader-6.0.0.tgz"
+  "version" "6.0.0"
+  dependencies:
+    "loader-utils" "^2.0.0"
+    "schema-utils" "^2.6.5"
+
+"file-uri-to-path@1.0.0":
+  "integrity" "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw=="
+  "resolved" "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz"
+  "version" "1.0.0"
+
+"filelist@^1.0.1":
+  "version" "1.0.1"
+  dependencies:
+    "minimatch" "^3.0.4"
+
+"filesize@^3.6.1":
+  "integrity" "sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg=="
+  "resolved" "https://registry.npmjs.org/filesize/-/filesize-3.6.1.tgz"
+  "version" "3.6.1"
+
+"fill-range@^4.0.0":
+  "integrity" "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc="
+  "resolved" "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz"
+  "version" "4.0.0"
+  dependencies:
+    "extend-shallow" "^2.0.1"
+    "is-number" "^3.0.0"
+    "repeat-string" "^1.6.1"
+    "to-regex-range" "^2.1.0"
+
+"fill-range@^7.0.1":
+  "integrity" "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ=="
+  "resolved" "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz"
+  "version" "7.0.1"
+  dependencies:
+    "to-regex-range" "^5.0.1"
+
+"finalhandler@~1.1.2":
+  "integrity" "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA=="
+  "resolved" "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz"
+  "version" "1.1.2"
+  dependencies:
+    "debug" "2.6.9"
+    "encodeurl" "~1.0.2"
+    "escape-html" "~1.0.3"
+    "on-finished" "~2.3.0"
+    "parseurl" "~1.3.3"
+    "statuses" "~1.5.0"
+    "unpipe" "~1.0.0"
+
+"finalhandler@1.1.0":
+  "integrity" "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U="
+  "resolved" "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz"
+  "version" "1.1.0"
+  dependencies:
+    "debug" "2.6.9"
+    "encodeurl" "~1.0.1"
+    "escape-html" "~1.0.3"
+    "on-finished" "~2.3.0"
+    "parseurl" "~1.3.2"
+    "statuses" "~1.3.1"
+    "unpipe" "~1.0.0"
+
+"find-cache-dir@^2.1.0":
+  "integrity" "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ=="
+  "resolved" "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz"
+  "version" "2.1.0"
+  dependencies:
+    "commondir" "^1.0.1"
+    "make-dir" "^2.0.0"
+    "pkg-dir" "^3.0.0"
+
+"find-cache-dir@^3.3.1":
+  "integrity" "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ=="
+  "resolved" "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz"
+  "version" "3.3.1"
+  dependencies:
+    "commondir" "^1.0.1"
+    "make-dir" "^3.0.2"
+    "pkg-dir" "^4.1.0"
+
+"find-up@^2.1.0":
+  "integrity" "sha1-RdG35QbHF93UgndaK3eSCjwMV6c="
+  "resolved" "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz"
+  "version" "2.1.0"
+  dependencies:
+    "locate-path" "^2.0.0"
+
+"find-up@^3.0.0":
+  "integrity" "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg=="
+  "resolved" "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz"
+  "version" "3.0.0"
+  dependencies:
+    "locate-path" "^3.0.0"
+
+"find-up@^4.0.0", "find-up@^4.1.0":
+  "integrity" "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw=="
+  "resolved" "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz"
+  "version" "4.1.0"
+  dependencies:
+    "locate-path" "^5.0.0"
+    "path-exists" "^4.0.0"
+
+"find-up@5.0.0":
+  "integrity" "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng=="
+  "resolved" "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz"
+  "version" "5.0.0"
+  dependencies:
+    "locate-path" "^6.0.0"
+    "path-exists" "^4.0.0"
+
+"find-versions@^3.2.0":
+  "integrity" "sha512-P8WRou2S+oe222TOCHitLy8zj+SIsVJh52VP4lvXkaFVnOFFdoWv1H1Jjvel1aI6NCFOAaeAVm8qrI0odiLcww=="
+  "resolved" "https://registry.npmjs.org/find-versions/-/find-versions-3.2.0.tgz"
+  "version" "3.2.0"
+  dependencies:
+    "semver-regex" "^2.0.0"
+
+"findup-sync@^3.0.0":
+  "integrity" "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg=="
+  "resolved" "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz"
+  "version" "3.0.0"
+  dependencies:
+    "detect-file" "^1.0.0"
+    "is-glob" "^4.0.0"
+    "micromatch" "^3.0.4"
+    "resolve-dir" "^1.0.1"
+
+"first-chunk-stream@^2.0.0":
+  "integrity" "sha1-G97NuOCDwGZLkZRVgVd6Q6nzHXA="
+  "resolved" "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-2.0.0.tgz"
+  "version" "2.0.0"
+  dependencies:
+    "readable-stream" "^2.0.2"
+
+"flat-cache@^2.0.1":
+  "integrity" "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA=="
+  "resolved" "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz"
+  "version" "2.0.1"
+  dependencies:
+    "flatted" "^2.0.0"
+    "rimraf" "2.6.3"
+    "write" "1.0.3"
+
+"flat@^5.0.2":
+  "integrity" "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ=="
+  "resolved" "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz"
+  "version" "5.0.2"
+
+"flatted@^2.0.0":
+  "integrity" "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA=="
+  "resolved" "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz"
+  "version" "2.0.2"
+
+"flush-write-stream@^1.0.0":
+  "integrity" "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w=="
+  "resolved" "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz"
+  "version" "1.1.1"
+  dependencies:
+    "inherits" "^2.0.3"
+    "readable-stream" "^2.3.6"
+
+"fn-name@~2.0.1":
+  "integrity" "sha1-UhTXU3pNBqSjAcDMJi/rhBiAAuc="
+  "resolved" "https://registry.npmjs.org/fn-name/-/fn-name-2.0.1.tgz"
+  "version" "2.0.1"
+
+"follow-redirects@^1.0.0", "follow-redirects@1.5.10":
+  "integrity" "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ=="
+  "resolved" "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz"
+  "version" "1.5.10"
+  dependencies:
+    "debug" "=3.1.0"
+
+"follow-redirects@^1.10.0":
+  "version" "1.13.1"
+
+"for-in@^1.0.2":
+  "integrity" "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA="
+  "resolved" "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz"
+  "version" "1.0.2"
+
+"forever-agent@~0.6.1":
+  "integrity" "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE="
+  "resolved" "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz"
+  "version" "0.6.1"
+
+"form-data@^2.2.0", "form-data@~2.3.2":
+  "integrity" "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ=="
+  "resolved" "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz"
+  "version" "2.3.3"
+  dependencies:
+    "asynckit" "^0.4.0"
+    "combined-stream" "^1.0.6"
+    "mime-types" "^2.1.12"
+
+"forwarded@~0.1.2":
+  "version" "0.1.2"
+
+"fragment-cache@^0.2.1":
+  "integrity" "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk="
+  "resolved" "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz"
+  "version" "0.2.1"
+  dependencies:
+    "map-cache" "^0.2.2"
+
+"fresh@^0.5.2", "fresh@0.5.2":
+  "integrity" "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac="
+  "resolved" "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz"
+  "version" "0.5.2"
+
+"friendly-errors-webpack-plugin@1.7.0":
+  "integrity" "sha512-K27M3VK30wVoOarP651zDmb93R9zF28usW4ocaK3mfQeIEI5BPht/EzZs5E8QLLwbLRJQMwscAjDxYPb1FuNiw=="
+  "resolved" "https://registry.npmjs.org/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.7.0.tgz"
+  "version" "1.7.0"
+  dependencies:
+    "chalk" "^1.1.3"
+    "error-stack-parser" "^2.0.0"
+    "string-width" "^2.0.0"
+
+"from2@^2.1.0":
+  "integrity" "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8="
+  "resolved" "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz"
+  "version" "2.3.0"
+  dependencies:
+    "inherits" "^2.0.1"
+    "readable-stream" "^2.0.0"
+
+"fs-extra@^8.1.0":
+  "integrity" "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g=="
+  "resolved" "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz"
+  "version" "8.1.0"
+  dependencies:
+    "graceful-fs" "^4.2.0"
+    "jsonfile" "^4.0.0"
+    "universalify" "^0.1.0"
+
+"fs-extra@3.0.1":
+  "integrity" "sha1-N5TzeMWLNC6n27sjCVEJxLO2IpE="
+  "resolved" "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz"
+  "version" "3.0.1"
+  dependencies:
+    "graceful-fs" "^4.1.2"
+    "jsonfile" "^3.0.0"
+    "universalify" "^0.1.0"
+
+"fs-extra@4.0.2":
+  "integrity" "sha1-+RcExT0bRh+JNFKwwwfZmXZHq2s="
+  "resolved" "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.2.tgz"
+  "version" "4.0.2"
+  dependencies:
+    "graceful-fs" "^4.1.2"
+    "jsonfile" "^4.0.0"
+    "universalify" "^0.1.0"
+
+"fs-extra@8.1.0":
+  "integrity" "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g=="
+  "resolved" "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz"
+  "version" "8.1.0"
+  dependencies:
+    "graceful-fs" "^4.2.0"
+    "jsonfile" "^4.0.0"
+    "universalify" "^0.1.0"
+
+"fs-minipass@^1.2.5":
+  "integrity" "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA=="
+  "resolved" "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz"
+  "version" "1.2.7"
+  dependencies:
+    "minipass" "^2.6.0"
+
+"fs-minipass@^2.0.0":
+  "integrity" "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg=="
+  "resolved" "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz"
+  "version" "2.1.0"
+  dependencies:
+    "minipass" "^3.0.0"
+
+"fs-write-stream-atomic@^1.0.8":
+  "integrity" "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk="
+  "resolved" "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz"
+  "version" "1.0.10"
+  dependencies:
+    "graceful-fs" "^4.1.2"
+    "iferr" "^0.1.5"
+    "imurmurhash" "^0.1.4"
+    "readable-stream" "1 || 2"
+
+"fs.realpath@^1.0.0":
+  "integrity" "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
+  "resolved" "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz"
+  "version" "1.0.0"
+
+"fs@0.0.2":
+  "integrity" "sha1-4fJE7zkzwbKmS9R5kTYGDQ9ZFPg="
+  "resolved" "https://registry.npmjs.org/fs/-/fs-0.0.2.tgz"
+  "version" "0.0.2"
+
+"fsevents@^1.2.7":
+  "integrity" "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw=="
+  "resolved" "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz"
+  "version" "1.2.13"
+  dependencies:
+    "bindings" "^1.5.0"
+    "nan" "^2.12.1"
+
+"fsevents@^2.1.2":
+  "version" "2.1.3"
+
+"fsevents@~2.3.1":
+  "integrity" "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA=="
+  "resolved" "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz"
+  "version" "2.3.2"
+
+"function-bind@^1.1.1":
+  "integrity" "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
+  "resolved" "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz"
+  "version" "1.1.1"
+
+"functional-red-black-tree@^1.0.1":
+  "integrity" "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc="
+  "resolved" "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz"
+  "version" "1.0.1"
+
+"g-status@^2.0.2":
+  "integrity" "sha512-kQoE9qH+T1AHKgSSD0Hkv98bobE90ILQcXAF4wvGgsr7uFqNvwmh8j+Lq3l0RVt3E3HjSbv2B9biEGcEtpHLCA=="
+  "resolved" "https://registry.npmjs.org/g-status/-/g-status-2.0.2.tgz"
+  "version" "2.0.2"
+  dependencies:
+    "arrify" "^1.0.1"
+    "matcher" "^1.0.0"
+    "simple-git" "^1.85.0"
+
+"gauge@~1.2.5":
+  "integrity" "sha1-6c7FSD09TuDvRLYKfZnkk14TbZM="
+  "resolved" "https://registry.npmjs.org/gauge/-/gauge-1.2.7.tgz"
+  "version" "1.2.7"
+  dependencies:
+    "ansi" "^0.3.0"
+    "has-unicode" "^2.0.0"
+    "lodash.pad" "^4.1.0"
+    "lodash.padend" "^4.1.0"
+    "lodash.padstart" "^4.1.0"
+
+"generator-jhipster@^6.10.5":
+  "integrity" "sha512-5NulSuou7sghjggc1rQuWWWigfJAdlzB0iMB92WQd90nXBC9ZopVFvgkjfLxWpKEgidFPjrwhrt5iWjoA+yo5A=="
+  "resolved" "https://registry.npmjs.org/generator-jhipster/-/generator-jhipster-6.10.5.tgz"
+  "version" "6.10.5"
+  dependencies:
+    "aws-sdk" "2.706.0"
+    "axios" "0.19.2"
+    "chalk" "4.1.0"
+    "commander" "5.1.0"
+    "conf" "6.2.4"
+    "didyoumean" "1.2.1"
+    "ejs" "3.1.3"
+    "faker" "4.1.0"
+    "glob" "7.1.6"
+    "gulp-filter" "6.0.0"
+    "insight" "0.10.3"
+    "jhipster-core" "7.3.4"
+    "js-object-pretty-print" "0.3.0"
+    "js-yaml" "3.14.0"
+    "lodash" "4.17.15"
+    "meow" "6.1.0"
+    "mkdirp" "1.0.4"
+    "normalize-path" "3.0.0"
+    "ora" "4.0.4"
+    "os-locale" "5.0.0"
+    "parse-gitignore" "1.0.1"
+    "pluralize" "8.0.0"
+    "prettier" "2.1.2"
+    "prettier-plugin-java" "0.8.2"
+    "progress" "2.0.3"
+    "randexp" "0.5.3"
+    "semver" "7.3.2"
+    "shelljs" "0.8.4"
+    "tabtab" "2.2.2"
+    "test" "^0.6.0"
+    "then-request" "6.0.2"
+    "through2" "3.0.2"
+    "uuid" "7.0.3"
+    "yeoman-environment" "2.10.3"
+    "yeoman-generator" "4.11.0"
+
+"genfun@^5.0.0":
+  "integrity" "sha512-KGDOARWVga7+rnB3z9Sd2Letx515owfk0hSxHGuqjANb1M+x2bGZGqHLiozPsYMdM2OubeMni/Hpwmjq6qIUhA=="
+  "resolved" "https://registry.npmjs.org/genfun/-/genfun-5.0.0.tgz"
+  "version" "5.0.0"
+
+"gensync@^1.0.0-beta.1":
+  "version" "1.0.0-beta.1"
+
+"get-caller-file@^2.0.1", "get-caller-file@^2.0.5":
+  "integrity" "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="
+  "resolved" "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz"
+  "version" "2.0.5"
+
+"get-func-name@^2.0.0":
+  "integrity" "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE="
+  "resolved" "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz"
+  "version" "2.0.0"
+
+"get-intrinsic@^1.0.2", "get-intrinsic@^1.1.1":
+  "integrity" "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q=="
+  "resolved" "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz"
+  "version" "1.1.1"
+  dependencies:
+    "function-bind" "^1.1.1"
+    "has" "^1.0.3"
+    "has-symbols" "^1.0.1"
+
+"get-own-enumerable-property-symbols@^3.0.0":
+  "integrity" "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g=="
+  "resolved" "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz"
+  "version" "3.0.2"
+
+"get-package-type@^0.1.0":
+  "integrity" "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q=="
+  "resolved" "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz"
+  "version" "0.1.0"
+
+"get-stdin@^6.0.0":
+  "integrity" "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g=="
+  "resolved" "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz"
+  "version" "6.0.0"
+
+"get-stream@^3.0.0":
+  "integrity" "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ="
+  "resolved" "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz"
+  "version" "3.0.0"
+
+"get-stream@^4.0.0", "get-stream@^4.1.0":
+  "integrity" "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w=="
+  "resolved" "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz"
+  "version" "4.1.0"
+  dependencies:
+    "pump" "^3.0.0"
+
+"get-stream@^5.0.0":
+  "version" "5.1.0"
+  dependencies:
+    "pump" "^3.0.0"
+
+"get-value@^2.0.3", "get-value@^2.0.6":
+  "integrity" "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg="
+  "resolved" "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz"
+  "version" "2.0.6"
+
+"getpass@^0.1.1":
+  "integrity" "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo="
+  "resolved" "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz"
+  "version" "0.1.7"
+  dependencies:
+    "assert-plus" "^1.0.0"
+
+"gh-got@^5.0.0":
+  "integrity" "sha1-7pW+NxBv2HSKlvjR20uuqJ4b+oo="
+  "resolved" "https://registry.npmjs.org/gh-got/-/gh-got-5.0.0.tgz"
+  "version" "5.0.0"
+  dependencies:
+    "got" "^6.2.0"
+    "is-plain-obj" "^1.1.0"
+
+"github-username@^3.0.0":
+  "integrity" "sha1-CnciGbMTB0NCnyRW0L3T21Xc57E="
+  "resolved" "https://registry.npmjs.org/github-username/-/github-username-3.0.0.tgz"
+  "version" "3.0.0"
+  dependencies:
+    "gh-got" "^5.0.0"
+
+"glob-parent@^3.1.0":
+  "integrity" "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4="
+  "resolved" "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz"
+  "version" "3.1.0"
+  dependencies:
+    "is-glob" "^3.1.0"
+    "path-dirname" "^1.0.0"
+
+"glob-parent@^5.0.0", "glob-parent@^5.1.0", "glob-parent@^5.1.1", "glob-parent@~5.1.0":
+  "integrity" "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="
+  "resolved" "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz"
+  "version" "5.1.2"
+  dependencies:
+    "is-glob" "^4.0.1"
+
+"glob-to-regexp@^0.3.0":
+  "integrity" "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs="
+  "resolved" "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz"
+  "version" "0.3.0"
+
+"glob@^7.0.0", "glob@^7.0.3", "glob@^7.0.6", "glob@^7.1.1", "glob@^7.1.2", "glob@7.1.2":
+  "integrity" "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ=="
+  "resolved" "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz"
+  "version" "7.1.2"
+  dependencies:
+    "fs.realpath" "^1.0.0"
+    "inflight" "^1.0.4"
+    "inherits" "2"
+    "minimatch" "^3.0.4"
+    "once" "^1.3.0"
+    "path-is-absolute" "^1.0.0"
+
+"glob@^7.1.3", "glob@^7.1.4":
+  "version" "7.1.6"
+  dependencies:
+    "fs.realpath" "^1.0.0"
+    "inflight" "^1.0.4"
+    "inherits" "2"
+    "minimatch" "^3.0.4"
+    "once" "^1.3.0"
+    "path-is-absolute" "^1.0.0"
+
+"glob@^7.1.6":
+  "version" "7.1.6"
+  dependencies:
+    "fs.realpath" "^1.0.0"
+    "inflight" "^1.0.4"
+    "inherits" "2"
+    "minimatch" "^3.0.4"
+    "once" "^1.3.0"
+    "path-is-absolute" "^1.0.0"
+
+"glob@7.1.1":
+  "integrity" "sha1-gFIR3wT6rxxjo2ADBs31reULLsg="
+  "resolved" "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz"
+  "version" "7.1.1"
+  dependencies:
+    "fs.realpath" "^1.0.0"
+    "inflight" "^1.0.4"
+    "inherits" "2"
+    "minimatch" "^3.0.2"
+    "once" "^1.3.0"
+    "path-is-absolute" "^1.0.0"
+
+"glob@7.1.6":
+  "integrity" "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA=="
+  "resolved" "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz"
+  "version" "7.1.6"
+  dependencies:
+    "fs.realpath" "^1.0.0"
+    "inflight" "^1.0.4"
+    "inherits" "2"
+    "minimatch" "^3.0.4"
+    "once" "^1.3.0"
+    "path-is-absolute" "^1.0.0"
+
+"global-modules@^1.0.0":
+  "integrity" "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg=="
+  "resolved" "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz"
+  "version" "1.0.0"
+  dependencies:
+    "global-prefix" "^1.0.1"
+    "is-windows" "^1.0.1"
+    "resolve-dir" "^1.0.0"
+
+"global-modules@^2.0.0":
+  "integrity" "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A=="
+  "resolved" "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz"
+  "version" "2.0.0"
+  dependencies:
+    "global-prefix" "^3.0.0"
+
+"global-prefix@^1.0.1":
+  "integrity" "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4="
+  "resolved" "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz"
+  "version" "1.0.2"
+  dependencies:
+    "expand-tilde" "^2.0.2"
+    "homedir-polyfill" "^1.0.1"
+    "ini" "^1.3.4"
+    "is-windows" "^1.0.1"
+    "which" "^1.2.14"
+
+"global-prefix@^3.0.0":
+  "integrity" "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg=="
+  "resolved" "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz"
+  "version" "3.0.0"
+  dependencies:
+    "ini" "^1.3.5"
+    "kind-of" "^6.0.2"
+    "which" "^1.3.1"
+
+"globals@^11.1.0":
+  "integrity" "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA=="
+  "resolved" "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz"
+  "version" "11.12.0"
+
+"globals@^12.1.0":
+  "integrity" "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg=="
+  "resolved" "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz"
+  "version" "12.4.0"
+  dependencies:
+    "type-fest" "^0.8.1"
+
+"globby@^11.0.1":
+  "version" "11.0.1"
+  dependencies:
+    "array-union" "^2.1.0"
+    "dir-glob" "^3.0.1"
+    "fast-glob" "^3.1.1"
+    "ignore" "^5.1.4"
+    "merge2" "^1.3.0"
+    "slash" "^3.0.0"
+
+"globby@^5.0.0":
+  "integrity" "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0="
+  "resolved" "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz"
+  "version" "5.0.0"
+  dependencies:
+    "array-union" "^1.0.1"
+    "arrify" "^1.0.0"
+    "glob" "^7.0.3"
+    "object-assign" "^4.0.1"
+    "pify" "^2.0.0"
+    "pinkie-promise" "^2.0.0"
+
+"globby@^6.1.0":
+  "integrity" "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw="
+  "resolved" "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz"
+  "version" "6.1.0"
+  dependencies:
+    "array-union" "^1.0.1"
+    "glob" "^7.0.3"
+    "object-assign" "^4.0.1"
+    "pify" "^2.0.0"
+    "pinkie-promise" "^2.0.0"
+
+"globby@^8.0.1":
+  "integrity" "sha512-yTzMmKygLp8RUpG1Ymu2VXPSJQZjNAZPD4ywgYEaG7e4tBJeUQBO8OpXrf1RCNcEs5alsoJYPAMiIHP0cmeC7w=="
+  "resolved" "https://registry.npmjs.org/globby/-/globby-8.0.2.tgz"
+  "version" "8.0.2"
+  dependencies:
+    "array-union" "^1.0.1"
+    "dir-glob" "2.0.0"
+    "fast-glob" "^2.0.2"
+    "glob" "^7.1.2"
+    "ignore" "^3.3.5"
+    "pify" "^3.0.0"
+    "slash" "^1.0.0"
+
+"globby@^9.2.0":
+  "integrity" "sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg=="
+  "resolved" "https://registry.npmjs.org/globby/-/globby-9.2.0.tgz"
+  "version" "9.2.0"
+  dependencies:
+    "@types/glob" "^7.1.1"
+    "array-union" "^1.0.2"
+    "dir-glob" "^2.2.2"
+    "fast-glob" "^2.2.6"
+    "glob" "^7.1.3"
+    "ignore" "^4.0.3"
+    "pify" "^4.0.1"
+    "slash" "^2.0.0"
+
+"good-listener@^1.2.2":
+  "integrity" "sha1-1TswzfkxPf+33JoNR3CWqm0UXFA="
+  "resolved" "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz"
+  "version" "1.2.2"
+  dependencies:
+    "delegate" "^3.1.2"
+
+"got@^6.2.0":
+  "integrity" "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA="
+  "resolved" "https://registry.npmjs.org/got/-/got-6.7.1.tgz"
+  "version" "6.7.1"
+  dependencies:
+    "create-error-class" "^3.0.0"
+    "duplexer3" "^0.1.4"
+    "get-stream" "^3.0.0"
+    "is-redirect" "^1.0.0"
+    "is-retry-allowed" "^1.0.0"
+    "is-stream" "^1.0.0"
+    "lowercase-keys" "^1.0.0"
+    "safe-buffer" "^5.0.1"
+    "timed-out" "^4.0.0"
+    "unzip-response" "^2.0.1"
+    "url-parse-lax" "^1.0.0"
+
+"graceful-fs@^4.1.11", "graceful-fs@^4.1.15", "graceful-fs@^4.1.2", "graceful-fs@^4.1.6", "graceful-fs@^4.2.0", "graceful-fs@^4.2.4":
+  "version" "4.2.4"
+
+"grouped-queue@^1.1.0":
+  "integrity" "sha512-rZOFKfCqLhsu5VqjBjEWiwrYqJR07KxIkH4mLZlNlGDfntbb4FbMyGFP14TlvRPrU9S3Hnn/sgxbC5ZeN0no3Q=="
+  "resolved" "https://registry.npmjs.org/grouped-queue/-/grouped-queue-1.1.0.tgz"
+  "version" "1.1.0"
+  dependencies:
+    "lodash" "^4.17.15"
+
+"growl@1.10.5":
+  "integrity" "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA=="
+  "resolved" "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz"
+  "version" "1.10.5"
+
+"growly@^1.3.0":
+  "integrity" "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE="
+  "resolved" "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz"
+  "version" "1.3.0"
+
+"gulp-filter@6.0.0":
+  "integrity" "sha512-veQFW93kf6jBdWdF/RxMEIlDK2mkjHyPftM381DID2C9ImTVngwYpyyThxm4/EpgcNOT37BLefzMOjEKbyYg0Q=="
+  "resolved" "https://registry.npmjs.org/gulp-filter/-/gulp-filter-6.0.0.tgz"
+  "version" "6.0.0"
+  dependencies:
+    "multimatch" "^4.0.0"
+    "plugin-error" "^1.0.1"
+    "streamfilter" "^3.0.0"
+
+"gzip-size@^5.0.0":
+  "integrity" "sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA=="
+  "resolved" "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz"
+  "version" "5.1.1"
+  dependencies:
+    "duplexer" "^0.1.1"
+    "pify" "^4.0.1"
+
+"handle-thing@^2.0.0":
+  "integrity" "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg=="
+  "resolved" "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz"
+  "version" "2.0.1"
+
+"handlebars@^4.7.6":
+  "integrity" "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA=="
+  "resolved" "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz"
+  "version" "4.7.7"
+  dependencies:
+    "minimist" "^1.2.5"
+    "neo-async" "^2.6.0"
+    "source-map" "^0.6.1"
+    "wordwrap" "^1.0.0"
+  optionalDependencies:
+    "uglify-js" "^3.1.4"
+
+"har-schema@^2.0.0":
+  "integrity" "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI="
+  "resolved" "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz"
+  "version" "2.0.0"
+
+"har-validator@~5.1.3":
+  "version" "5.1.3"
+  dependencies:
+    "ajv" "^6.5.5"
+    "har-schema" "^2.0.0"
+
+"hard-rejection@^2.0.0":
+  "integrity" "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA=="
+  "resolved" "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz"
+  "version" "2.1.0"
+
+"has-ansi@^2.0.0":
+  "integrity" "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE="
+  "resolved" "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz"
+  "version" "2.0.0"
+  dependencies:
+    "ansi-regex" "^2.0.0"
+
+"has-bigints@^1.0.1":
+  "integrity" "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA=="
+  "resolved" "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz"
+  "version" "1.0.1"
+
+"has-binary2@~1.0.2":
+  "integrity" "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw=="
+  "resolved" "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz"
+  "version" "1.0.3"
+  dependencies:
+    "isarray" "2.0.1"
+
+"has-cors@1.1.0":
+  "integrity" "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk="
+  "resolved" "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz"
+  "version" "1.1.0"
+
+"has-flag@^3.0.0":
+  "integrity" "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
+  "resolved" "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz"
+  "version" "3.0.0"
+
+"has-flag@^4.0.0":
+  "integrity" "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+  "resolved" "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz"
+  "version" "4.0.0"
+
+"has-symbols@^1.0.1", "has-symbols@^1.0.2":
+  "integrity" "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw=="
+  "resolved" "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz"
+  "version" "1.0.2"
+
+"has-unicode@^2.0.0":
+  "integrity" "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk="
+  "resolved" "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz"
+  "version" "2.0.1"
+
+"has-value@^0.3.1":
+  "integrity" "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8="
+  "resolved" "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz"
+  "version" "0.3.1"
+  dependencies:
+    "get-value" "^2.0.3"
+    "has-values" "^0.1.4"
+    "isobject" "^2.0.0"
+
+"has-value@^1.0.0":
+  "integrity" "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc="
+  "resolved" "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz"
+  "version" "1.0.0"
+  dependencies:
+    "get-value" "^2.0.6"
+    "has-values" "^1.0.0"
+    "isobject" "^3.0.0"
+
+"has-values@^0.1.4":
+  "integrity" "sha1-bWHeldkd/Km5oCCJrThL/49it3E="
+  "resolved" "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz"
+  "version" "0.1.4"
+
+"has-values@^1.0.0":
+  "integrity" "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8="
+  "resolved" "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz"
+  "version" "1.0.0"
+  dependencies:
+    "is-number" "^3.0.0"
+    "kind-of" "^4.0.0"
+
+"has@^1.0.0", "has@^1.0.3":
+  "integrity" "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw=="
+  "resolved" "https://registry.npmjs.org/has/-/has-1.0.3.tgz"
+  "version" "1.0.3"
+  dependencies:
+    "function-bind" "^1.1.1"
+
+"hash-base@^3.0.0":
+  "integrity" "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA=="
+  "resolved" "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz"
+  "version" "3.1.0"
+  dependencies:
+    "inherits" "^2.0.4"
+    "readable-stream" "^3.6.0"
+    "safe-buffer" "^5.2.0"
+
+"hash.js@^1.0.0", "hash.js@^1.0.3":
+  "integrity" "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA=="
+  "resolved" "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz"
+  "version" "1.1.7"
+  dependencies:
+    "inherits" "^2.0.3"
+    "minimalistic-assert" "^1.0.1"
+
+"he@^1.2.0", "he@1.2.0":
+  "integrity" "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw=="
+  "resolved" "https://registry.npmjs.org/he/-/he-1.2.0.tgz"
+  "version" "1.2.0"
+
+"hex-color-regex@^1.1.0":
+  "integrity" "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ=="
+  "resolved" "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz"
+  "version" "1.1.0"
+
+"hmac-drbg@^1.0.1":
+  "integrity" "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE="
+  "resolved" "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz"
+  "version" "1.0.1"
+  dependencies:
+    "hash.js" "^1.0.3"
+    "minimalistic-assert" "^1.0.0"
+    "minimalistic-crypto-utils" "^1.0.1"
+
+"homedir-polyfill@^1.0.1":
+  "integrity" "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA=="
+  "resolved" "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz"
+  "version" "1.0.3"
+  dependencies:
+    "parse-passwd" "^1.0.0"
+
+"hoopy@^0.1.4":
+  "integrity" "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ=="
+  "resolved" "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz"
+  "version" "0.1.4"
+
+"hosted-git-info@^2.1.4":
+  "integrity" "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw=="
+  "resolved" "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz"
+  "version" "2.8.9"
+
+"hosted-git-info@^2.7.1":
+  "integrity" "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw=="
+  "resolved" "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz"
+  "version" "2.8.9"
+
+"hosted-git-info@^3.0.2":
+  "integrity" "sha512-aXpmwoOhRBrw6X3j0h5RloK4x1OzsxMPyxqIHyNfSe2pypkVTZFpEiRoSipPEPlMrh0HW/XsjkJ5WgnCirpNUw=="
+  "resolved" "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.8.tgz"
+  "version" "3.0.8"
+  dependencies:
+    "lru-cache" "^6.0.0"
+
+"hpack.js@^2.1.6":
+  "integrity" "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI="
+  "resolved" "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz"
+  "version" "2.1.6"
+  dependencies:
+    "inherits" "^2.0.1"
+    "obuf" "^1.0.0"
+    "readable-stream" "^2.0.1"
+    "wbuf" "^1.1.0"
+
+"hsl-regex@^1.0.0":
+  "integrity" "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4="
+  "resolved" "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz"
+  "version" "1.0.0"
+
+"hsla-regex@^1.0.0":
+  "integrity" "sha1-wc56MWjIxmFAM6S194d/OyJfnDg="
+  "resolved" "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz"
+  "version" "1.0.0"
+
+"html-encoding-sniffer@^2.0.1":
+  "integrity" "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ=="
+  "resolved" "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz"
+  "version" "2.0.1"
+  dependencies:
+    "whatwg-encoding" "^1.0.5"
+
+"html-entities@^1.3.1":
+  "version" "1.3.1"
+
+"html-escaper@^2.0.0":
+  "integrity" "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg=="
+  "resolved" "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz"
+  "version" "2.0.2"
+
+"html-loader@1.1.0":
+  "integrity" "sha512-zwLbEgy+i7sgIYTlxI9M7jwkn29IvdsV6f1y7a2aLv/w8l1RigVk0PFijBZLLFsdi2gvL8sf2VJhTjLlfnK8sA=="
+  "resolved" "https://registry.npmjs.org/html-loader/-/html-loader-1.1.0.tgz"
+  "version" "1.1.0"
+  dependencies:
+    "html-minifier-terser" "^5.0.5"
+    "htmlparser2" "^4.1.0"
+    "loader-utils" "^2.0.0"
+    "parse-srcset" "^1.0.2"
+    "schema-utils" "^2.6.5"
+
+"html-minifier-terser@^5.0.1", "html-minifier-terser@^5.0.5":
+  "integrity" "sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg=="
+  "resolved" "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz"
+  "version" "5.1.1"
+  dependencies:
+    "camel-case" "^4.1.1"
+    "clean-css" "^4.2.3"
+    "commander" "^4.1.1"
+    "he" "^1.2.0"
+    "param-case" "^3.0.3"
+    "relateurl" "^0.2.7"
+    "terser" "^4.6.3"
+
+"html-webpack-plugin@4.3.0":
+  "integrity" "sha512-C0fzKN8yQoVLTelcJxZfJCE+aAvQiY2VUf3UuKrR4a9k5UMWYOtpDLsaXwATbcVCnI05hUS7L9ULQHWLZhyi3w=="
+  "resolved" "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-4.3.0.tgz"
+  "version" "4.3.0"
+  dependencies:
+    "@types/html-minifier-terser" "^5.0.0"
+    "@types/tapable" "^1.0.5"
+    "@types/webpack" "^4.41.8"
+    "html-minifier-terser" "^5.0.1"
+    "loader-utils" "^1.2.3"
+    "lodash" "^4.17.15"
+    "pretty-error" "^2.1.1"
+    "tapable" "^1.1.3"
+    "util.promisify" "1.0.0"
+
+"htmlparser2@^4.1.0":
+  "integrity" "sha512-4zDq1a1zhE4gQso/c5LP1OtrhYTncXNSpvJYtWJBtXAETPlMfi3IFNjGuQbYLuVY4ZR0QMqRVvo4Pdy9KLyP8Q=="
+  "resolved" "https://registry.npmjs.org/htmlparser2/-/htmlparser2-4.1.0.tgz"
+  "version" "4.1.0"
+  dependencies:
+    "domelementtype" "^2.0.1"
+    "domhandler" "^3.0.0"
+    "domutils" "^2.0.0"
+    "entities" "^2.0.0"
+
+"htmlparser2@^6.1.0":
+  "version" "6.1.0"
+  dependencies:
+    "domelementtype" "^2.0.1"
+    "domhandler" "^4.0.0"
+    "domutils" "^2.5.2"
+    "entities" "^2.0.0"
+
+"http-basic@^8.1.1":
+  "integrity" "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw=="
+  "resolved" "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz"
+  "version" "8.1.3"
+  dependencies:
+    "caseless" "^0.12.0"
+    "concat-stream" "^1.6.2"
+    "http-response-object" "^3.0.1"
+    "parse-cache-control" "^1.0.1"
+
+"http-cache-semantics@^3.8.1":
+  "integrity" "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w=="
+  "resolved" "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz"
+  "version" "3.8.1"
+
+"http-deceiver@^1.2.7":
+  "integrity" "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc="
+  "resolved" "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz"
+  "version" "1.2.7"
+
+"http-errors@~1.6.2":
+  "integrity" "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0="
+  "resolved" "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz"
+  "version" "1.6.3"
+  dependencies:
+    "depd" "~1.1.2"
+    "inherits" "2.0.3"
+    "setprototypeof" "1.1.0"
+    "statuses" ">= 1.4.0 < 2"
+
+"http-errors@~1.7.2", "http-errors@1.7.3":
+  "integrity" "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw=="
+  "resolved" "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz"
+  "version" "1.7.3"
+  dependencies:
+    "depd" "~1.1.2"
+    "inherits" "2.0.4"
+    "setprototypeof" "1.1.1"
+    "statuses" ">= 1.5.0 < 2"
+    "toidentifier" "1.0.0"
+
+"http-errors@1.7.2":
+  "integrity" "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg=="
+  "resolved" "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz"
+  "version" "1.7.2"
+  dependencies:
+    "depd" "~1.1.2"
+    "inherits" "2.0.3"
+    "setprototypeof" "1.1.1"
+    "statuses" ">= 1.5.0 < 2"
+    "toidentifier" "1.0.0"
+
+"http-proxy-agent@^2.1.0":
+  "integrity" "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg=="
+  "resolved" "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz"
+  "version" "2.1.0"
+  dependencies:
+    "agent-base" "4"
+    "debug" "3.1.0"
+
+"http-proxy-middleware@0.19.1":
+  "integrity" "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q=="
+  "resolved" "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz"
+  "version" "0.19.1"
+  dependencies:
+    "http-proxy" "^1.17.0"
+    "is-glob" "^4.0.0"
+    "lodash" "^4.17.11"
+    "micromatch" "^3.1.10"
+
+"http-proxy@^1.17.0":
+  "integrity" "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ=="
+  "resolved" "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz"
+  "version" "1.18.1"
+  dependencies:
+    "eventemitter3" "^4.0.0"
+    "follow-redirects" "^1.0.0"
+    "requires-port" "^1.0.0"
+
+"http-proxy@^1.18.1":
+  "integrity" "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ=="
+  "resolved" "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz"
+  "version" "1.18.1"
+  dependencies:
+    "eventemitter3" "^4.0.0"
+    "follow-redirects" "^1.0.0"
+    "requires-port" "^1.0.0"
+
+"http-response-object@^3.0.1":
+  "integrity" "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA=="
+  "resolved" "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz"
+  "version" "3.0.2"
+  dependencies:
+    "@types/node" "^10.0.3"
+
+"http-signature@~1.2.0":
+  "integrity" "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE="
+  "resolved" "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz"
+  "version" "1.2.0"
+  dependencies:
+    "assert-plus" "^1.0.0"
+    "jsprim" "^1.2.2"
+    "sshpk" "^1.7.0"
+
+"https-browserify@^1.0.0":
+  "integrity" "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM="
+  "resolved" "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz"
+  "version" "1.0.0"
+
+"https-proxy-agent@^2.2.1", "https-proxy-agent@^2.2.3":
+  "integrity" "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg=="
+  "resolved" "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz"
+  "version" "2.2.4"
+  dependencies:
+    "agent-base" "^4.3.0"
+    "debug" "^3.1.0"
+
+"human-signals@^1.1.1":
+  "integrity" "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw=="
+  "resolved" "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz"
+  "version" "1.1.1"
+
+"humanize-ms@^1.2.1":
+  "integrity" "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0="
+  "resolved" "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz"
+  "version" "1.2.1"
+  dependencies:
+    "ms" "^2.0.0"
+
+"husky@4.2.5":
+  "integrity" "sha512-SYZ95AjKcX7goYVZtVZF2i6XiZcHknw50iXvY7b0MiGoj5RwdgRQNEHdb+gPDPCXKlzwrybjFjkL6FOj8uRhZQ=="
+  "resolved" "https://registry.npmjs.org/husky/-/husky-4.2.5.tgz"
+  "version" "4.2.5"
+  dependencies:
+    "chalk" "^4.0.0"
+    "ci-info" "^2.0.0"
+    "compare-versions" "^3.6.0"
+    "cosmiconfig" "^6.0.0"
+    "find-versions" "^3.2.0"
+    "opencollective-postinstall" "^2.0.2"
+    "pkg-dir" "^4.2.0"
+    "please-upgrade-node" "^3.2.0"
+    "slash" "^3.0.0"
+    "which-pm-runs" "^1.0.0"
+
+"iconv-lite@^0.4.24", "iconv-lite@0.4.24":
+  "integrity" "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA=="
+  "resolved" "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz"
+  "version" "0.4.24"
+  dependencies:
+    "safer-buffer" ">= 2.1.2 < 3"
+
+"iconv-lite@^0.6.2":
+  "integrity" "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw=="
+  "resolved" "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz"
+  "version" "0.6.3"
+  dependencies:
+    "safer-buffer" ">= 2.1.2 < 3.0.0"
+
+"icss-utils@^4.0.0", "icss-utils@^4.1.1":
+  "integrity" "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA=="
+  "resolved" "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz"
+  "version" "4.1.1"
+  dependencies:
+    "postcss" "^7.0.14"
+
+"ieee754@^1.1.4", "ieee754@1.1.13":
+  "integrity" "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg=="
+  "resolved" "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz"
+  "version" "1.1.13"
+
+"iferr@^0.1.5":
+  "integrity" "sha1-xg7taebY/bazEEofy8ocGS3FtQE="
+  "resolved" "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz"
+  "version" "0.1.5"
+
+"ignore-walk@^3.0.1":
+  "integrity" "sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ=="
+  "resolved" "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.4.tgz"
+  "version" "3.0.4"
+  dependencies:
+    "minimatch" "^3.0.4"
+
+"ignore@^3.3.5":
+  "integrity" "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug=="
+  "resolved" "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz"
+  "version" "3.3.10"
+
+"ignore@^4.0.3":
+  "integrity" "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg=="
+  "resolved" "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz"
+  "version" "4.0.6"
+
+"ignore@^4.0.6":
+  "integrity" "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg=="
+  "resolved" "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz"
+  "version" "4.0.6"
+
+"ignore@^5.1.4":
+  "integrity" "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw=="
+  "resolved" "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz"
+  "version" "5.1.8"
+
+"immediate@~3.0.5":
+  "integrity" "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps="
+  "resolved" "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz"
+  "version" "3.0.6"
+
+"immutable@^3":
+  "integrity" "sha1-wkOZUUVbs5kT2vKBN28VMOEErfM="
+  "resolved" "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz"
+  "version" "3.8.2"
+
+"import-cwd@^2.0.0":
+  "integrity" "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk="
+  "resolved" "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz"
+  "version" "2.1.0"
+  dependencies:
+    "import-from" "^2.1.0"
+
+"import-fresh@^2.0.0":
+  "integrity" "sha1-2BNVwVYS04bGH53dOSLUMEgipUY="
+  "resolved" "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz"
+  "version" "2.0.0"
+  dependencies:
+    "caller-path" "^2.0.0"
+    "resolve-from" "^3.0.0"
+
+"import-fresh@^3.0.0", "import-fresh@^3.1.0":
+  "version" "3.2.1"
+  dependencies:
+    "parent-module" "^1.0.0"
+    "resolve-from" "^4.0.0"
+
+"import-from@^2.1.0":
+  "integrity" "sha1-M1238qev/VOqpHHUuAId7ja387E="
+  "resolved" "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz"
+  "version" "2.1.0"
+  dependencies:
+    "resolve-from" "^3.0.0"
+
+"import-local@^2.0.0":
+  "integrity" "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ=="
+  "resolved" "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz"
+  "version" "2.0.0"
+  dependencies:
+    "pkg-dir" "^3.0.0"
+    "resolve-cwd" "^2.0.0"
+
+"import-local@^3.0.2":
+  "integrity" "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA=="
+  "resolved" "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz"
+  "version" "3.0.2"
+  dependencies:
+    "pkg-dir" "^4.2.0"
+    "resolve-cwd" "^3.0.0"
+
+"imurmurhash@^0.1.4":
+  "integrity" "sha1-khi5srkoojixPcT7a21XbyMUU+o="
+  "resolved" "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz"
+  "version" "0.1.4"
+
+"indent-string@^3.0.0":
+  "integrity" "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok="
+  "resolved" "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz"
+  "version" "3.2.0"
+
+"indent-string@^4.0.0":
+  "integrity" "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg=="
+  "resolved" "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz"
+  "version" "4.0.0"
+
+"indexes-of@^1.0.1":
+  "integrity" "sha1-8w9xbI4r00bHtn0985FVZqfAVgc="
+  "resolved" "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz"
+  "version" "1.0.1"
+
+"indexof@0.0.1":
+  "integrity" "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10="
+  "resolved" "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz"
+  "version" "0.0.1"
+
+"infer-owner@^1.0.3", "infer-owner@^1.0.4":
+  "integrity" "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A=="
+  "resolved" "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz"
+  "version" "1.0.4"
+
+"inflight@^1.0.4":
+  "integrity" "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk="
+  "resolved" "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz"
+  "version" "1.0.6"
+  dependencies:
+    "once" "^1.3.0"
+    "wrappy" "1"
+
+"inherits@^2.0.1", "inherits@^2.0.3", "inherits@^2.0.4", "inherits@~2.0.1", "inherits@~2.0.3", "inherits@2", "inherits@2.0.4":
+  "integrity" "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
+  "resolved" "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz"
+  "version" "2.0.4"
+
+"inherits@2.0.1":
+  "integrity" "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE="
+  "resolved" "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz"
+  "version" "2.0.1"
+
+"inherits@2.0.3":
+  "integrity" "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
+  "resolved" "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz"
+  "version" "2.0.3"
+
+"ini@^1.3.4", "ini@^1.3.5":
+  "integrity" "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="
+  "resolved" "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz"
+  "version" "1.3.8"
+
+"ini@1.3.6":
+  "integrity" "sha512-IZUoxEjNjubzrmvzZU4lKP7OnYmX72XRl3sqkfJhBKweKi5rnGi5+IUdlj/H1M+Ip5JQ1WzaDMOBRY90Ajc5jg=="
+  "resolved" "https://registry.npmjs.org/ini/-/ini-1.3.6.tgz"
+  "version" "1.3.6"
+
+"inquirer@^1.0.2":
+  "integrity" "sha1-TexvMvN+97sLLtPx0aXD9UUHSRg="
+  "resolved" "https://registry.npmjs.org/inquirer/-/inquirer-1.2.3.tgz"
+  "version" "1.2.3"
+  dependencies:
+    "ansi-escapes" "^1.1.0"
+    "chalk" "^1.0.0"
+    "cli-cursor" "^1.0.1"
+    "cli-width" "^2.0.0"
+    "external-editor" "^1.1.0"
+    "figures" "^1.3.5"
+    "lodash" "^4.3.0"
+    "mute-stream" "0.0.6"
+    "pinkie-promise" "^2.0.0"
+    "run-async" "^2.2.0"
+    "rx" "^4.1.0"
+    "string-width" "^1.0.1"
+    "strip-ansi" "^3.0.0"
+    "through" "^2.3.6"
+
+"inquirer@^6.3.1":
+  "integrity" "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ=="
+  "resolved" "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz"
+  "version" "6.5.2"
+  dependencies:
+    "ansi-escapes" "^3.2.0"
+    "chalk" "^2.4.2"
+    "cli-cursor" "^2.1.0"
+    "cli-width" "^2.0.0"
+    "external-editor" "^3.0.3"
+    "figures" "^2.0.0"
+    "lodash" "^4.17.12"
+    "mute-stream" "0.0.7"
+    "run-async" "^2.2.0"
+    "rxjs" "^6.4.0"
+    "string-width" "^2.1.0"
+    "strip-ansi" "^5.1.0"
+    "through" "^2.3.6"
+
+"inquirer@^7.0.0", "inquirer@^7.1.0", "inquirer@7.3.3":
+  "integrity" "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA=="
+  "resolved" "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz"
+  "version" "7.3.3"
+  dependencies:
+    "ansi-escapes" "^4.2.1"
+    "chalk" "^4.1.0"
+    "cli-cursor" "^3.1.0"
+    "cli-width" "^3.0.0"
+    "external-editor" "^3.0.3"
+    "figures" "^3.0.0"
+    "lodash" "^4.17.19"
+    "mute-stream" "0.0.8"
+    "run-async" "^2.4.0"
+    "rxjs" "^6.6.0"
+    "string-width" "^4.1.0"
+    "strip-ansi" "^6.0.0"
+    "through" "^2.3.6"
+
+"insight@0.10.3":
+  "integrity" "sha512-YOncxSN6Omh+1Oqxt+OJAvJVMDKw7l6IEG0wT2cTMGxjsTcroOGW4IR926QDzxg/uZHcFZ2cZbckDWdZhc2pZw=="
+  "resolved" "https://registry.npmjs.org/insight/-/insight-0.10.3.tgz"
+  "version" "0.10.3"
+  dependencies:
+    "async" "^2.6.2"
+    "chalk" "^2.4.2"
+    "conf" "^1.4.0"
+    "inquirer" "^6.3.1"
+    "lodash.debounce" "^4.0.8"
+    "os-name" "^3.1.0"
+    "request" "^2.88.0"
+    "tough-cookie" "^3.0.1"
+    "uuid" "^3.3.2"
+
+"internal-ip@^4.3.0":
+  "integrity" "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg=="
+  "resolved" "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz"
+  "version" "4.3.0"
+  dependencies:
+    "default-gateway" "^4.2.0"
+    "ipaddr.js" "^1.9.0"
+
+"interpret@^1.0.0", "interpret@^1.4.0":
+  "integrity" "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA=="
+  "resolved" "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz"
+  "version" "1.4.0"
+
+"invariant@^2.2.2", "invariant@^2.2.4":
+  "version" "2.2.4"
+  dependencies:
+    "loose-envify" "^1.0.0"
+
+"invert-kv@^3.0.0":
+  "integrity" "sha512-CYdFeFexxhv/Bcny+Q0BfOV+ltRlJcd4BBZBYFX/O0u4npJrgZtIcjokegtiSMAvlMTJ+Koq0GBCc//3bueQxw=="
+  "resolved" "https://registry.npmjs.org/invert-kv/-/invert-kv-3.0.1.tgz"
+  "version" "3.0.1"
+
+"ip-regex@^2.1.0":
+  "integrity" "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk="
+  "resolved" "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz"
+  "version" "2.1.0"
+
+"ip@^1.1.0", "ip@^1.1.5", "ip@1.1.5":
+  "integrity" "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo="
+  "resolved" "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz"
+  "version" "1.1.5"
+
+"ipaddr.js@^1.9.0", "ipaddr.js@1.9.1":
+  "integrity" "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="
+  "resolved" "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz"
+  "version" "1.9.1"
+
+"is-absolute-url@^2.0.0":
+  "integrity" "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY="
+  "resolved" "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz"
+  "version" "2.1.0"
+
+"is-absolute-url@^3.0.3":
+  "integrity" "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q=="
+  "resolved" "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz"
+  "version" "3.0.3"
+
+"is-accessor-descriptor@^0.1.6":
+  "integrity" "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY="
+  "resolved" "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz"
+  "version" "0.1.6"
+  dependencies:
+    "kind-of" "^3.0.2"
+
+"is-accessor-descriptor@^1.0.0":
+  "integrity" "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ=="
+  "resolved" "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz"
+  "version" "1.0.0"
+  dependencies:
+    "kind-of" "^6.0.0"
+
+"is-arguments@^1.0.4":
+  "version" "1.0.4"
+
+"is-arrayish@^0.2.1":
+  "integrity" "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0="
+  "resolved" "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz"
+  "version" "0.2.1"
+
+"is-arrayish@^0.3.1":
+  "integrity" "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ=="
+  "resolved" "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz"
+  "version" "0.3.2"
+
+"is-bigint@^1.0.1":
+  "integrity" "sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA=="
+  "resolved" "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.2.tgz"
+  "version" "1.0.2"
+
+"is-binary-path@^1.0.0":
+  "integrity" "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg="
+  "resolved" "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz"
+  "version" "1.0.1"
+  dependencies:
+    "binary-extensions" "^1.0.0"
+
+"is-binary-path@~2.1.0":
+  "integrity" "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw=="
+  "resolved" "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz"
+  "version" "2.1.0"
+  dependencies:
+    "binary-extensions" "^2.0.0"
+
+"is-boolean-object@^1.1.0":
+  "integrity" "sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng=="
+  "resolved" "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.1.tgz"
+  "version" "1.1.1"
+  dependencies:
+    "call-bind" "^1.0.2"
+
+"is-buffer@^1.1.5":
+  "integrity" "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
+  "resolved" "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz"
+  "version" "1.1.6"
+
+"is-callable@^1.1.4", "is-callable@^1.2.3":
+  "integrity" "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ=="
+  "resolved" "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz"
+  "version" "1.2.3"
+
+"is-ci@^2.0.0":
+  "integrity" "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w=="
+  "resolved" "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz"
+  "version" "2.0.0"
+  dependencies:
+    "ci-info" "^2.0.0"
+
+"is-color-stop@^1.0.0":
+  "integrity" "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U="
+  "resolved" "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz"
+  "version" "1.1.0"
+  dependencies:
+    "css-color-names" "^0.0.4"
+    "hex-color-regex" "^1.1.0"
+    "hsl-regex" "^1.0.0"
+    "hsla-regex" "^1.0.0"
+    "rgb-regex" "^1.0.1"
+    "rgba-regex" "^1.0.0"
+
+"is-data-descriptor@^0.1.4":
+  "integrity" "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y="
+  "resolved" "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz"
+  "version" "0.1.4"
+  dependencies:
+    "kind-of" "^3.0.2"
+
+"is-data-descriptor@^1.0.0":
+  "integrity" "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ=="
+  "resolved" "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz"
+  "version" "1.0.0"
+  dependencies:
+    "kind-of" "^6.0.0"
+
+"is-date-object@^1.0.1":
+  "version" "1.0.2"
+
+"is-descriptor@^0.1.0":
+  "integrity" "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg=="
+  "resolved" "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz"
+  "version" "0.1.6"
+  dependencies:
+    "is-accessor-descriptor" "^0.1.6"
+    "is-data-descriptor" "^0.1.4"
+    "kind-of" "^5.0.0"
+
+"is-descriptor@^1.0.0":
+  "integrity" "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg=="
+  "resolved" "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz"
+  "version" "1.0.2"
+  dependencies:
+    "is-accessor-descriptor" "^1.0.0"
+    "is-data-descriptor" "^1.0.0"
+    "kind-of" "^6.0.2"
+
+"is-descriptor@^1.0.2":
+  "integrity" "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg=="
+  "resolved" "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz"
+  "version" "1.0.2"
+  dependencies:
+    "is-accessor-descriptor" "^1.0.0"
+    "is-data-descriptor" "^1.0.0"
+    "kind-of" "^6.0.2"
+
+"is-directory@^0.3.1":
+  "integrity" "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE="
+  "resolved" "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz"
+  "version" "0.3.1"
+
+"is-docker@^2.0.0":
+  "version" "2.0.0"
+
+"is-extendable@^0.1.0", "is-extendable@^0.1.1":
+  "integrity" "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik="
+  "resolved" "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz"
+  "version" "0.1.1"
+
+"is-extendable@^1.0.1":
+  "integrity" "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA=="
+  "resolved" "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz"
+  "version" "1.0.1"
+  dependencies:
+    "is-plain-object" "^2.0.4"
+
+"is-extglob@^2.1.0", "is-extglob@^2.1.1":
+  "integrity" "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI="
+  "resolved" "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz"
+  "version" "2.1.1"
+
+"is-fullwidth-code-point@^1.0.0":
+  "integrity" "sha1-754xOG8DGn8NZDr4L95QxFfvAMs="
+  "resolved" "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz"
+  "version" "1.0.0"
+  dependencies:
+    "number-is-nan" "^1.0.0"
+
+"is-fullwidth-code-point@^2.0.0":
+  "integrity" "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8="
+  "resolved" "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz"
+  "version" "2.0.0"
+
+"is-fullwidth-code-point@^3.0.0":
+  "integrity" "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="
+  "resolved" "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz"
+  "version" "3.0.0"
+
+"is-generator-fn@^2.0.0":
+  "integrity" "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ=="
+  "resolved" "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz"
+  "version" "2.1.0"
+
+"is-glob@^3.1.0":
+  "integrity" "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo="
+  "resolved" "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz"
+  "version" "3.1.0"
+  dependencies:
+    "is-extglob" "^2.1.0"
+
+"is-glob@^4.0.0", "is-glob@^4.0.1", "is-glob@~4.0.1":
+  "integrity" "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg=="
+  "resolved" "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz"
+  "version" "4.0.1"
+  dependencies:
+    "is-extglob" "^2.1.1"
+
+"is-interactive@^1.0.0":
+  "integrity" "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w=="
+  "resolved" "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz"
+  "version" "1.0.0"
+
+"is-module@^1.0.0":
+  "integrity" "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE="
+  "resolved" "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz"
+  "version" "1.0.0"
+
+"is-negative-zero@^2.0.1":
+  "integrity" "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w=="
+  "resolved" "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz"
+  "version" "2.0.1"
+
+"is-number-like@^1.0.3":
+  "integrity" "sha512-6rZi3ezCyFcn5L71ywzz2bS5b2Igl1En3eTlZlvKjpz1n3IZLAYMbKYAIQgFmEu0GENg92ziU/faEOA/aixjbA=="
+  "resolved" "https://registry.npmjs.org/is-number-like/-/is-number-like-1.0.8.tgz"
+  "version" "1.0.8"
+  dependencies:
+    "lodash.isfinite" "^3.3.2"
+
+"is-number-object@^1.0.4":
+  "integrity" "sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw=="
+  "resolved" "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.5.tgz"
+  "version" "1.0.5"
+
+"is-number@^3.0.0":
+  "integrity" "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU="
+  "resolved" "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz"
+  "version" "3.0.0"
+  dependencies:
+    "kind-of" "^3.0.2"
+
+"is-number@^7.0.0":
+  "integrity" "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="
+  "resolved" "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz"
+  "version" "7.0.0"
+
+"is-obj@^1.0.0":
+  "integrity" "sha1-PkcprB9f3gJc19g6iW2rn09n2w8="
+  "resolved" "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz"
+  "version" "1.0.1"
+
+"is-obj@^1.0.1":
+  "integrity" "sha1-PkcprB9f3gJc19g6iW2rn09n2w8="
+  "resolved" "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz"
+  "version" "1.0.1"
+
+"is-obj@^2.0.0":
+  "integrity" "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w=="
+  "resolved" "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz"
+  "version" "2.0.0"
+
+"is-observable@^1.1.0":
+  "integrity" "sha512-NqCa4Sa2d+u7BWc6CukaObG3Fh+CU9bvixbpcXYhy2VvYS7vVGIdAgnIS5Ks3A/cqk4rebLJ9s8zBstT2aKnIA=="
+  "resolved" "https://registry.npmjs.org/is-observable/-/is-observable-1.1.0.tgz"
+  "version" "1.1.0"
+  dependencies:
+    "symbol-observable" "^1.1.0"
+
+"is-path-cwd@^1.0.0":
+  "integrity" "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0="
+  "resolved" "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz"
+  "version" "1.0.0"
+
+"is-path-cwd@^2.0.0":
+  "integrity" "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ=="
+  "resolved" "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz"
+  "version" "2.2.0"
+
+"is-path-in-cwd@^1.0.0":
+  "integrity" "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ=="
+  "resolved" "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz"
+  "version" "1.0.1"
+  dependencies:
+    "is-path-inside" "^1.0.0"
+
+"is-path-in-cwd@^2.0.0":
+  "integrity" "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ=="
+  "resolved" "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz"
+  "version" "2.1.0"
+  dependencies:
+    "is-path-inside" "^2.1.0"
+
+"is-path-inside@^1.0.0":
+  "integrity" "sha1-jvW33lBDej/cprToZe96pVy0gDY="
+  "resolved" "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz"
+  "version" "1.0.1"
+  dependencies:
+    "path-is-inside" "^1.0.1"
+
+"is-path-inside@^2.1.0":
+  "integrity" "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg=="
+  "resolved" "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz"
+  "version" "2.1.0"
+  dependencies:
+    "path-is-inside" "^1.0.2"
+
+"is-plain-obj@^1.0.0", "is-plain-obj@^1.1.0":
+  "integrity" "sha1-caUMhCnfync8kqOQpKA7OfzVHT4="
+  "resolved" "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz"
+  "version" "1.1.0"
+
+"is-plain-obj@^2.1.0":
+  "integrity" "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA=="
+  "resolved" "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz"
+  "version" "2.1.0"
+
+"is-plain-object@^2.0.3", "is-plain-object@^2.0.4":
+  "integrity" "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og=="
+  "resolved" "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz"
+  "version" "2.0.4"
+  dependencies:
+    "isobject" "^3.0.1"
+
+"is-potential-custom-element-name@^1.0.0":
+  "version" "1.0.0"
+
+"is-promise@^2.1.0":
+  "integrity" "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ=="
+  "resolved" "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz"
+  "version" "2.2.2"
+
+"is-redirect@^1.0.0":
+  "integrity" "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ="
+  "resolved" "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz"
+  "version" "1.0.0"
+
+"is-regex@^1.0.4", "is-regex@^1.1.3":
+  "integrity" "sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ=="
+  "resolved" "https://registry.npmjs.org/is-regex/-/is-regex-1.1.3.tgz"
+  "version" "1.1.3"
+  dependencies:
+    "call-bind" "^1.0.2"
+    "has-symbols" "^1.0.2"
+
+"is-regexp@^1.0.0":
+  "integrity" "sha1-/S2INUXEa6xaYz57mgnof6LLUGk="
+  "resolved" "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz"
+  "version" "1.0.0"
+
+"is-resolvable@^1.0.0":
+  "integrity" "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg=="
+  "resolved" "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz"
+  "version" "1.1.0"
+
+"is-retry-allowed@^1.0.0":
+  "integrity" "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg=="
+  "resolved" "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz"
+  "version" "1.2.0"
+
+"is-scoped@^1.0.0":
+  "integrity" "sha1-RJypgpnnEwOCViieyytUDcQ3yzA="
+  "resolved" "https://registry.npmjs.org/is-scoped/-/is-scoped-1.0.0.tgz"
+  "version" "1.0.0"
+  dependencies:
+    "scoped-regex" "^1.0.0"
+
+"is-stream@^1.0.0", "is-stream@^1.1.0":
+  "integrity" "sha1-EtSj3U5o4Lec6428hBc66A2RykQ="
+  "resolved" "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz"
+  "version" "1.1.0"
+
+"is-stream@^2.0.0":
+  "integrity" "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw=="
+  "resolved" "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz"
+  "version" "2.0.0"
+
+"is-string@^1.0.5", "is-string@^1.0.6":
+  "integrity" "sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w=="
+  "resolved" "https://registry.npmjs.org/is-string/-/is-string-1.0.6.tgz"
+  "version" "1.0.6"
+
+"is-symbol@^1.0.2", "is-symbol@^1.0.3":
+  "version" "1.0.3"
+  dependencies:
+    "has-symbols" "^1.0.1"
+
+"is-typedarray@^1.0.0", "is-typedarray@~1.0.0":
+  "integrity" "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo="
+  "resolved" "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz"
+  "version" "1.0.0"
+
+"is-unicode-supported@^0.1.0":
+  "integrity" "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw=="
+  "resolved" "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz"
+  "version" "0.1.0"
+
+"is-utf8@^0.2.0", "is-utf8@^0.2.1":
+  "integrity" "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI="
+  "resolved" "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz"
+  "version" "0.2.1"
+
+"is-windows@^1.0.1", "is-windows@^1.0.2":
+  "integrity" "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA=="
+  "resolved" "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz"
+  "version" "1.0.2"
+
+"is-wsl@^1.1.0":
+  "integrity" "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0="
+  "resolved" "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz"
+  "version" "1.1.0"
+
+"is-wsl@^2.1.1":
+  "integrity" "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww=="
+  "resolved" "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz"
+  "version" "2.2.0"
+  dependencies:
+    "is-docker" "^2.0.0"
+
+"isarray@^1.0.0", "isarray@~1.0.0", "isarray@1.0.0":
+  "integrity" "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
+  "resolved" "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz"
+  "version" "1.0.0"
+
+"isarray@2.0.1":
+  "integrity" "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4="
+  "resolved" "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz"
+  "version" "2.0.1"
+
+"isbinaryfile@^4.0.0":
+  "version" "4.0.6"
+
+"isexe@^2.0.0":
+  "integrity" "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA="
+  "resolved" "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz"
+  "version" "2.0.0"
+
+"isobject@^2.0.0":
+  "integrity" "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk="
+  "resolved" "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz"
+  "version" "2.1.0"
+  dependencies:
+    "isarray" "1.0.0"
+
+"isobject@^3.0.0", "isobject@^3.0.1":
+  "integrity" "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
+  "resolved" "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz"
+  "version" "3.0.1"
+
+"isstream@~0.1.2":
+  "integrity" "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo="
+  "resolved" "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz"
+  "version" "0.1.2"
+
+"istanbul-lib-coverage@^3.0.0":
+  "integrity" "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg=="
+  "resolved" "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz"
+  "version" "3.0.0"
+
+"istanbul-lib-instrument@^4.0.0", "istanbul-lib-instrument@^4.0.3":
+  "integrity" "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ=="
+  "resolved" "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz"
+  "version" "4.0.3"
+  dependencies:
+    "@babel/core" "^7.7.5"
+    "@istanbuljs/schema" "^0.1.2"
+    "istanbul-lib-coverage" "^3.0.0"
+    "semver" "^6.3.0"
+
+"istanbul-lib-report@^3.0.0":
+  "integrity" "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw=="
+  "resolved" "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz"
+  "version" "3.0.0"
+  dependencies:
+    "istanbul-lib-coverage" "^3.0.0"
+    "make-dir" "^3.0.0"
+    "supports-color" "^7.1.0"
+
+"istanbul-lib-source-maps@^4.0.0":
+  "integrity" "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg=="
+  "resolved" "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz"
+  "version" "4.0.0"
+  dependencies:
+    "debug" "^4.1.1"
+    "istanbul-lib-coverage" "^3.0.0"
+    "source-map" "^0.6.1"
+
+"istanbul-reports@^3.0.2":
+  "integrity" "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw=="
+  "resolved" "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz"
+  "version" "3.0.2"
+  dependencies:
+    "html-escaper" "^2.0.0"
+    "istanbul-lib-report" "^3.0.0"
+
+"istextorbinary@^2.5.1":
+  "integrity" "sha512-+XRlFseT8B3L9KyjxxLjfXSLMuErKDsd8DBNrsaxoViABMEZlOSCstwmw0qpoFX3+U6yWU1yhLudAe6/lETGGA=="
+  "resolved" "https://registry.npmjs.org/istextorbinary/-/istextorbinary-2.6.0.tgz"
+  "version" "2.6.0"
+  dependencies:
+    "binaryextensions" "^2.1.2"
+    "editions" "^2.2.0"
+    "textextensions" "^2.5.0"
+
+"jake@^10.6.1":
+  "integrity" "sha512-eLpKyrfG3mzvGE2Du8VoPbeSkRry093+tyNjdYaBbJS9v17knImYGNXQCUV0gLxQtF82m3E8iRb/wdSQZLoq7A=="
+  "resolved" "https://registry.npmjs.org/jake/-/jake-10.8.2.tgz"
+  "version" "10.8.2"
+  dependencies:
+    "async" "0.9.x"
+    "chalk" "^2.4.2"
+    "filelist" "^1.0.1"
+    "minimatch" "^3.0.4"
+
+"jasmine-core@~2.8.0":
+  "integrity" "sha1-vMl5rh+f0FcB5F5S5l06XWPxok4="
+  "resolved" "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.8.0.tgz"
+  "version" "2.8.0"
+
+"jasmine@2.8.0":
+  "integrity" "sha1-awicChFXax8W3xG4AUbZHU6Lij4="
+  "resolved" "https://registry.npmjs.org/jasmine/-/jasmine-2.8.0.tgz"
+  "version" "2.8.0"
+  dependencies:
+    "exit" "^0.1.2"
+    "glob" "^7.0.6"
+    "jasmine-core" "~2.8.0"
+
+"jasminewd2@^2.1.0":
+  "integrity" "sha1-43zwsX8ZnM4jvqcbIDk5Uka07E4="
+  "resolved" "https://registry.npmjs.org/jasminewd2/-/jasminewd2-2.2.0.tgz"
+  "version" "2.2.0"
+
+"java-parser@0.8.2":
+  "integrity" "sha512-YphTEk4zIpWAHqBriAdjlNnTEcEYQ2xBA8KOH5V7QxggNbxjkeEcKJjNYnQvqEue8+O1TLj7vfL0NVG6x5LGMw=="
+  "resolved" "https://registry.npmjs.org/java-parser/-/java-parser-0.8.2.tgz"
+  "version" "0.8.2"
+  dependencies:
+    "chevrotain" "6.5.0"
+    "lodash" "4.17.20"
+
+"jest-changed-files@^26.1.0":
+  "version" "26.1.0"
+  dependencies:
+    "@jest/types" "^26.1.0"
+    "execa" "^4.0.0"
+    "throat" "^5.0.0"
+
+"jest-cli@^26.1.0":
+  "version" "26.1.0"
+  dependencies:
+    "@jest/core" "^26.1.0"
+    "@jest/test-result" "^26.1.0"
+    "@jest/types" "^26.1.0"
+    "chalk" "^4.0.0"
+    "exit" "^0.1.2"
+    "graceful-fs" "^4.2.4"
+    "import-local" "^3.0.2"
+    "is-ci" "^2.0.0"
+    "jest-config" "^26.1.0"
+    "jest-util" "^26.1.0"
+    "jest-validate" "^26.1.0"
+    "prompts" "^2.0.1"
+    "yargs" "^15.3.1"
+
+"jest-config@^26.1.0":
+  "version" "26.1.0"
+  dependencies:
+    "@babel/core" "^7.1.0"
+    "@jest/test-sequencer" "^26.1.0"
+    "@jest/types" "^26.1.0"
+    "babel-jest" "^26.1.0"
+    "chalk" "^4.0.0"
+    "deepmerge" "^4.2.2"
+    "glob" "^7.1.1"
+    "graceful-fs" "^4.2.4"
+    "jest-environment-jsdom" "^26.1.0"
+    "jest-environment-node" "^26.1.0"
+    "jest-get-type" "^26.0.0"
+    "jest-jasmine2" "^26.1.0"
+    "jest-regex-util" "^26.0.0"
+    "jest-resolve" "^26.1.0"
+    "jest-util" "^26.1.0"
+    "jest-validate" "^26.1.0"
+    "micromatch" "^4.0.2"
+    "pretty-format" "^26.1.0"
+
+"jest-date-mock@1.0.8":
+  "integrity" "sha512-0Lyp+z9xvuNmLbK+5N6FOhSiBeux05Lp5bbveFBmYo40Aggl2wwxFoIrZ+rOWC8nDNcLeBoDd2miQdEDSf3iQw=="
+  "resolved" "https://registry.npmjs.org/jest-date-mock/-/jest-date-mock-1.0.8.tgz"
+  "version" "1.0.8"
+
+"jest-diff@^25.2.1":
+  "integrity" "sha512-z1kygetuPiREYdNIumRpAHY6RXiGmp70YHptjdaxTWGmA085W3iCnXNx0DhflK3vwrKmrRWyY1wUpkPMVxMK7A=="
+  "resolved" "https://registry.npmjs.org/jest-diff/-/jest-diff-25.5.0.tgz"
+  "version" "25.5.0"
+  dependencies:
+    "chalk" "^3.0.0"
+    "diff-sequences" "^25.2.6"
+    "jest-get-type" "^25.2.6"
+    "pretty-format" "^25.5.0"
+
+"jest-diff@^26.1.0":
+  "version" "26.1.0"
+  dependencies:
+    "chalk" "^4.0.0"
+    "diff-sequences" "^26.0.0"
+    "jest-get-type" "^26.0.0"
+    "pretty-format" "^26.1.0"
+
+"jest-docblock@^26.0.0":
+  "integrity" "sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w=="
+  "resolved" "https://registry.npmjs.org/jest-docblock/-/jest-docblock-26.0.0.tgz"
+  "version" "26.0.0"
+  dependencies:
+    "detect-newline" "^3.0.0"
+
+"jest-each@^26.1.0":
+  "version" "26.1.0"
+  dependencies:
+    "@jest/types" "^26.1.0"
+    "chalk" "^4.0.0"
+    "jest-get-type" "^26.0.0"
+    "jest-util" "^26.1.0"
+    "pretty-format" "^26.1.0"
+
+"jest-environment-jsdom@^26.1.0":
+  "version" "26.1.0"
+  dependencies:
+    "@jest/environment" "^26.1.0"
+    "@jest/fake-timers" "^26.1.0"
+    "@jest/types" "^26.1.0"
+    "jest-mock" "^26.1.0"
+    "jest-util" "^26.1.0"
+    "jsdom" "^16.2.2"
+
+"jest-environment-node@^26.1.0":
+  "version" "26.1.0"
+  dependencies:
+    "@jest/environment" "^26.1.0"
+    "@jest/fake-timers" "^26.1.0"
+    "@jest/types" "^26.1.0"
+    "jest-mock" "^26.1.0"
+    "jest-util" "^26.1.0"
+
+"jest-get-type@^25.2.6":
+  "integrity" "sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig=="
+  "resolved" "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.6.tgz"
+  "version" "25.2.6"
+
+"jest-get-type@^26.0.0":
+  "version" "26.0.0"
+
+"jest-haste-map@^26.1.0":
+  "version" "26.1.0"
+  dependencies:
+    "@jest/types" "^26.1.0"
+    "@types/graceful-fs" "^4.1.2"
+    "anymatch" "^3.0.3"
+    "fb-watchman" "^2.0.0"
+    "graceful-fs" "^4.2.4"
+    "jest-serializer" "^26.1.0"
+    "jest-util" "^26.1.0"
+    "jest-worker" "^26.1.0"
+    "micromatch" "^4.0.2"
+    "sane" "^4.0.3"
+    "walker" "^1.0.7"
+    "which" "^2.0.2"
+  optionalDependencies:
+    "fsevents" "^2.1.2"
+
+"jest-jasmine2@^26.1.0":
+  "version" "26.1.0"
+  dependencies:
+    "@babel/traverse" "^7.1.0"
+    "@jest/environment" "^26.1.0"
+    "@jest/source-map" "^26.1.0"
+    "@jest/test-result" "^26.1.0"
+    "@jest/types" "^26.1.0"
+    "chalk" "^4.0.0"
+    "co" "^4.6.0"
+    "expect" "^26.1.0"
+    "is-generator-fn" "^2.0.0"
+    "jest-each" "^26.1.0"
+    "jest-matcher-utils" "^26.1.0"
+    "jest-message-util" "^26.1.0"
+    "jest-runtime" "^26.1.0"
+    "jest-snapshot" "^26.1.0"
+    "jest-util" "^26.1.0"
+    "pretty-format" "^26.1.0"
+    "throat" "^5.0.0"
+
+"jest-junit@11.0.1":
+  "integrity" "sha512-stgc0mBoiSg/F9qWd4KkmR3K7Nk2u+M/dc1oup7gxz9mrzGcEaU2YL9/0QscVqqg3IOaA1P5ZXtozG/XR6j6nw=="
+  "resolved" "https://registry.npmjs.org/jest-junit/-/jest-junit-11.0.1.tgz"
+  "version" "11.0.1"
+  dependencies:
+    "mkdirp" "^1.0.4"
+    "strip-ansi" "^5.2.0"
+    "uuid" "^3.3.3"
+    "xml" "^1.0.1"
+
+"jest-leak-detector@^26.1.0":
+  "version" "26.1.0"
+  dependencies:
+    "jest-get-type" "^26.0.0"
+    "pretty-format" "^26.1.0"
+
+"jest-matcher-utils@^26.1.0":
+  "version" "26.1.0"
+  dependencies:
+    "chalk" "^4.0.0"
+    "jest-diff" "^26.1.0"
+    "jest-get-type" "^26.0.0"
+    "pretty-format" "^26.1.0"
+
+"jest-message-util@^26.1.0":
+  "version" "26.1.0"
+  dependencies:
+    "@babel/code-frame" "^7.0.0"
+    "@jest/types" "^26.1.0"
+    "@types/stack-utils" "^1.0.1"
+    "chalk" "^4.0.0"
+    "graceful-fs" "^4.2.4"
+    "micromatch" "^4.0.2"
+    "slash" "^3.0.0"
+    "stack-utils" "^2.0.2"
+
+"jest-mock@^26.1.0":
+  "version" "26.1.0"
+  dependencies:
+    "@jest/types" "^26.1.0"
+
+"jest-pnp-resolver@^1.2.1":
+  "version" "1.2.2"
+
+"jest-preset-angular@8.2.1":
+  "integrity" "sha512-6t7lavnIHnZWz6a03jpZ5L7phMefi6SoBIRZ/GQdyML8YgwMtbJszbhUE+dh5lzmeNbd6AJ1gfleetGy2Rg4cQ=="
+  "resolved" "https://registry.npmjs.org/jest-preset-angular/-/jest-preset-angular-8.2.1.tgz"
+  "version" "8.2.1"
+  dependencies:
+    "pretty-format" "^26.0.0"
+    "ts-jest" "^26.0.0"
+
+"jest-regex-util@^26.0.0":
+  "integrity" "sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A=="
+  "resolved" "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-26.0.0.tgz"
+  "version" "26.0.0"
+
+"jest-resolve-dependencies@^26.1.0":
+  "version" "26.1.0"
+  dependencies:
+    "@jest/types" "^26.1.0"
+    "jest-regex-util" "^26.0.0"
+    "jest-snapshot" "^26.1.0"
+
+"jest-resolve@*", "jest-resolve@^26.1.0":
+  "version" "26.1.0"
+  dependencies:
+    "@jest/types" "^26.1.0"
+    "chalk" "^4.0.0"
+    "graceful-fs" "^4.2.4"
+    "jest-pnp-resolver" "^1.2.1"
+    "jest-util" "^26.1.0"
+    "read-pkg-up" "^7.0.1"
+    "resolve" "^1.17.0"
+    "slash" "^3.0.0"
+
+"jest-runner@^26.1.0":
+  "version" "26.1.0"
+  dependencies:
+    "@jest/console" "^26.1.0"
+    "@jest/environment" "^26.1.0"
+    "@jest/test-result" "^26.1.0"
+    "@jest/types" "^26.1.0"
+    "chalk" "^4.0.0"
+    "exit" "^0.1.2"
+    "graceful-fs" "^4.2.4"
+    "jest-config" "^26.1.0"
+    "jest-docblock" "^26.0.0"
+    "jest-haste-map" "^26.1.0"
+    "jest-jasmine2" "^26.1.0"
+    "jest-leak-detector" "^26.1.0"
+    "jest-message-util" "^26.1.0"
+    "jest-resolve" "^26.1.0"
+    "jest-runtime" "^26.1.0"
+    "jest-util" "^26.1.0"
+    "jest-worker" "^26.1.0"
+    "source-map-support" "^0.5.6"
+    "throat" "^5.0.0"
+
+"jest-runtime@^26.1.0":
+  "version" "26.1.0"
+  dependencies:
+    "@jest/console" "^26.1.0"
+    "@jest/environment" "^26.1.0"
+    "@jest/fake-timers" "^26.1.0"
+    "@jest/globals" "^26.1.0"
+    "@jest/source-map" "^26.1.0"
+    "@jest/test-result" "^26.1.0"
+    "@jest/transform" "^26.1.0"
+    "@jest/types" "^26.1.0"
+    "@types/yargs" "^15.0.0"
+    "chalk" "^4.0.0"
+    "collect-v8-coverage" "^1.0.0"
+    "exit" "^0.1.2"
+    "glob" "^7.1.3"
+    "graceful-fs" "^4.2.4"
+    "jest-config" "^26.1.0"
+    "jest-haste-map" "^26.1.0"
+    "jest-message-util" "^26.1.0"
+    "jest-mock" "^26.1.0"
+    "jest-regex-util" "^26.0.0"
+    "jest-resolve" "^26.1.0"
+    "jest-snapshot" "^26.1.0"
+    "jest-util" "^26.1.0"
+    "jest-validate" "^26.1.0"
+    "slash" "^3.0.0"
+    "strip-bom" "^4.0.0"
+    "yargs" "^15.3.1"
+
+"jest-serializer@^26.1.0":
+  "version" "26.1.0"
+  dependencies:
+    "graceful-fs" "^4.2.4"
+
+"jest-snapshot@^26.1.0":
+  "version" "26.1.0"
+  dependencies:
+    "@babel/types" "^7.0.0"
+    "@jest/types" "^26.1.0"
+    "@types/prettier" "^2.0.0"
+    "chalk" "^4.0.0"
+    "expect" "^26.1.0"
+    "graceful-fs" "^4.2.4"
+    "jest-diff" "^26.1.0"
+    "jest-get-type" "^26.0.0"
+    "jest-haste-map" "^26.1.0"
+    "jest-matcher-utils" "^26.1.0"
+    "jest-message-util" "^26.1.0"
+    "jest-resolve" "^26.1.0"
+    "natural-compare" "^1.4.0"
+    "pretty-format" "^26.1.0"
+    "semver" "^7.3.2"
+
+"jest-sonar-reporter@2.0.0":
+  "integrity" "sha512-ZervDCgEX5gdUbdtWsjdipLN3bKJwpxbvhkYNXTAYvAckCihobSLr9OT/IuyNIRT1EZMDDwR6DroWtrq+IL64w=="
+  "resolved" "https://registry.npmjs.org/jest-sonar-reporter/-/jest-sonar-reporter-2.0.0.tgz"
+  "version" "2.0.0"
+  dependencies:
+    "xml" "^1.0.1"
+
+"jest-util@^26.1.0":
+  "version" "26.1.0"
+  dependencies:
+    "@jest/types" "^26.1.0"
+    "chalk" "^4.0.0"
+    "graceful-fs" "^4.2.4"
+    "is-ci" "^2.0.0"
+    "micromatch" "^4.0.2"
+
+"jest-validate@^26.1.0":
+  "version" "26.1.0"
+  dependencies:
+    "@jest/types" "^26.1.0"
+    "camelcase" "^6.0.0"
+    "chalk" "^4.0.0"
+    "jest-get-type" "^26.0.0"
+    "leven" "^3.1.0"
+    "pretty-format" "^26.1.0"
+
+"jest-watcher@^26.1.0":
+  "version" "26.1.0"
+  dependencies:
+    "@jest/test-result" "^26.1.0"
+    "@jest/types" "^26.1.0"
+    "ansi-escapes" "^4.2.1"
+    "chalk" "^4.0.0"
+    "jest-util" "^26.1.0"
+    "string-length" "^4.0.1"
+
+"jest-worker@^24.9.0":
+  "integrity" "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw=="
+  "resolved" "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz"
+  "version" "24.9.0"
+  dependencies:
+    "merge-stream" "^2.0.0"
+    "supports-color" "^6.1.0"
+
+"jest-worker@^26.0.0", "jest-worker@^26.1.0":
+  "version" "26.1.0"
+  dependencies:
+    "merge-stream" "^2.0.0"
+    "supports-color" "^7.0.0"
+
+"jest@^26.0.0", "jest@>=26 <27", "jest@26.1.0":
+  "integrity" "sha512-LIti8jppw5BcQvmNJe4w2g1N/3V68HUfAv9zDVm7v+VAtQulGhH0LnmmiVkbNE4M4I43Bj2fXPiBGKt26k9tHw=="
+  "resolved" "https://registry.npmjs.org/jest/-/jest-26.1.0.tgz"
+  "version" "26.1.0"
+  dependencies:
+    "@jest/core" "^26.1.0"
+    "import-local" "^3.0.2"
+    "jest-cli" "^26.1.0"
+
+"jhipster-core@7.3.4":
+  "integrity" "sha512-AUhT69kNkqppaJZVfan/xnKG4Gs9Ggj7YLtTZFVe+xg+THrbMb5Ng7PL07PDlDw4KAEA33GMCwuAf65E8EpC4g=="
+  "resolved" "https://registry.npmjs.org/jhipster-core/-/jhipster-core-7.3.4.tgz"
+  "version" "7.3.4"
+  dependencies:
+    "chevrotain" "7.0.1"
+    "fs-extra" "8.1.0"
+    "lodash" "4.17.15"
+    "winston" "3.2.1"
+
+"jmespath@0.15.0":
+  "integrity" "sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc="
+  "resolved" "https://registry.npmjs.org/jmespath/-/jmespath-0.15.0.tgz"
+  "version" "0.15.0"
+
+"jquery@^3.6.0", "jquery@1.9.1 - 3":
+  "version" "3.6.0"
+
+"js-object-pretty-print@0.3.0":
+  "integrity" "sha1-RnDkUAZu4ezPNRdMfRl/WqOLz3Q="
+  "resolved" "https://registry.npmjs.org/js-object-pretty-print/-/js-object-pretty-print-0.3.0.tgz"
+  "version" "0.3.0"
+
+"js-tokens@^3.0.0 || ^4.0.0", "js-tokens@^4.0.0":
+  "integrity" "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
+  "resolved" "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz"
+  "version" "4.0.0"
+
+"js-yaml@^3.13.1", "js-yaml@3.14.0":
+  "integrity" "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A=="
+  "resolved" "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz"
+  "version" "3.14.0"
+  dependencies:
+    "argparse" "^1.0.7"
+    "esprima" "^4.0.0"
+
+"js-yaml@4.0.0":
+  "integrity" "sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q=="
+  "resolved" "https://registry.npmjs.org/js-yaml/-/js-yaml-4.0.0.tgz"
+  "version" "4.0.0"
+  dependencies:
+    "argparse" "^2.0.1"
+
+"jsbn@~0.1.0":
+  "integrity" "sha1-peZUwuWi3rXyAdls77yoDA7y9RM="
+  "resolved" "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz"
+  "version" "0.1.1"
+
+"jsdom@^16.2.2":
+  "version" "16.2.2"
+  dependencies:
+    "abab" "^2.0.3"
+    "acorn" "^7.1.1"
+    "acorn-globals" "^6.0.0"
+    "cssom" "^0.4.4"
+    "cssstyle" "^2.2.0"
+    "data-urls" "^2.0.0"
+    "decimal.js" "^10.2.0"
+    "domexception" "^2.0.1"
+    "escodegen" "^1.14.1"
+    "html-encoding-sniffer" "^2.0.1"
+    "is-potential-custom-element-name" "^1.0.0"
+    "nwsapi" "^2.2.0"
+    "parse5" "5.1.1"
+    "request" "^2.88.2"
+    "request-promise-native" "^1.0.8"
+    "saxes" "^5.0.0"
+    "symbol-tree" "^3.2.4"
+    "tough-cookie" "^3.0.1"
+    "w3c-hr-time" "^1.0.2"
+    "w3c-xmlserializer" "^2.0.0"
+    "webidl-conversions" "^6.0.0"
+    "whatwg-encoding" "^1.0.5"
+    "whatwg-mimetype" "^2.3.0"
+    "whatwg-url" "^8.0.0"
+    "ws" "^7.2.3"
+    "xml-name-validator" "^3.0.0"
+
+"jsesc@^2.5.1":
+  "integrity" "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA=="
+  "resolved" "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz"
+  "version" "2.5.2"
+
+"jsesc@~0.5.0":
+  "integrity" "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0="
+  "resolved" "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz"
+  "version" "0.5.0"
+
+"json-parse-better-errors@^1.0.0", "json-parse-better-errors@^1.0.1", "json-parse-better-errors@^1.0.2":
+  "integrity" "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw=="
+  "resolved" "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz"
+  "version" "1.0.2"
+
+"json-parse-even-better-errors@^2.3.0":
+  "integrity" "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="
+  "resolved" "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz"
+  "version" "2.3.1"
+
+"json-schema-traverse@^0.4.1":
+  "integrity" "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
+  "resolved" "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz"
+  "version" "0.4.1"
+
+"json-schema-typed@^7.0.1":
+  "integrity" "sha512-7DE8mpG+/fVw+dTpjbxnx47TaMnDfOI1jwft9g1VybltZCduyRQPJPvc+zzKY9WPHxhPWczyFuYa6I8Mw4iU5A=="
+  "resolved" "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-7.0.3.tgz"
+  "version" "7.0.3"
+
+"json-schema@0.2.3":
+  "integrity" "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM="
+  "resolved" "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz"
+  "version" "0.2.3"
+
+"json-stable-stringify-without-jsonify@^1.0.1":
+  "integrity" "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE="
+  "resolved" "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz"
+  "version" "1.0.1"
+
+"json-stringify-safe@~5.0.1":
+  "integrity" "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus="
+  "resolved" "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz"
+  "version" "5.0.1"
+
+"json3@^3.3.2":
+  "integrity" "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA=="
+  "resolved" "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz"
+  "version" "3.3.3"
+
+"json5@^1.0.1":
+  "integrity" "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow=="
+  "resolved" "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz"
+  "version" "1.0.1"
+  dependencies:
+    "minimist" "^1.2.0"
+
+"json5@^2.1.0", "json5@^2.1.2", "json5@2.x":
+  "version" "2.1.3"
+  dependencies:
+    "minimist" "^1.2.5"
+
+"jsonc-parser@2.3.0":
+  "integrity" "sha512-b0EBt8SWFNnixVdvoR2ZtEGa9ZqLhbJnOjezn+WP+8kspFm+PFYDN8Z4Bc7pRlDjvuVcADSUkroIuTWWn/YiIA=="
+  "resolved" "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-2.3.0.tgz"
+  "version" "2.3.0"
+
+"jsonfile@^3.0.0":
+  "integrity" "sha1-pezG9l9T9mLEQVx2daAzHQmS7GY="
+  "resolved" "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz"
+  "version" "3.0.1"
+  optionalDependencies:
+    "graceful-fs" "^4.1.6"
+
+"jsonfile@^4.0.0":
+  "integrity" "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss="
+  "resolved" "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz"
+  "version" "4.0.0"
+  optionalDependencies:
+    "graceful-fs" "^4.1.6"
+
+"jsonparse@^1.2.0":
+  "integrity" "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA="
+  "resolved" "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz"
+  "version" "1.3.1"
+
+"JSONStream@^1.2.1", "JSONStream@^1.3.4", "JSONStream@^1.3.5":
+  "integrity" "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ=="
+  "resolved" "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz"
+  "version" "1.3.5"
+  dependencies:
+    "jsonparse" "^1.2.0"
+    "through" ">=2.2.7 <3"
+
+"jsprim@^1.2.2":
+  "integrity" "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI="
+  "resolved" "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz"
+  "version" "1.4.1"
+  dependencies:
+    "assert-plus" "1.0.0"
+    "extsprintf" "1.3.0"
+    "json-schema" "0.2.3"
+    "verror" "1.10.0"
+
+"jszip@^3.1.3":
+  "version" "3.5.0"
+  dependencies:
+    "lie" "~3.3.0"
+    "pako" "~1.0.2"
+    "readable-stream" "~2.3.6"
+    "set-immediate-shim" "~1.0.1"
+
+"katex@^0.12.0":
+  "integrity" "sha512-y+8btoc/CK70XqcHqjxiGWBOeIL8upbS0peTPXTvgrh21n1RiWWcIpSWM+4uXq+IAgNh9YYQWdc7LVDPDAEEAg=="
+  "resolved" "https://registry.npmjs.org/katex/-/katex-0.12.0.tgz"
+  "version" "0.12.0"
+  dependencies:
+    "commander" "^2.19.0"
+
+"killable@^1.0.1":
+  "integrity" "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg=="
+  "resolved" "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz"
+  "version" "1.0.1"
+
+"kind-of@^3.0.2":
+  "integrity" "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ="
+  "resolved" "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz"
+  "version" "3.2.2"
+  dependencies:
+    "is-buffer" "^1.1.5"
+
+"kind-of@^3.0.3":
+  "integrity" "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ="
+  "resolved" "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz"
+  "version" "3.2.2"
+  dependencies:
+    "is-buffer" "^1.1.5"
+
+"kind-of@^3.2.0":
+  "integrity" "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ="
+  "resolved" "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz"
+  "version" "3.2.2"
+  dependencies:
+    "is-buffer" "^1.1.5"
+
+"kind-of@^4.0.0":
+  "integrity" "sha1-IIE989cSkosgc3hpGkUGb65y3Vc="
+  "resolved" "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz"
+  "version" "4.0.0"
+  dependencies:
+    "is-buffer" "^1.1.5"
+
+"kind-of@^5.0.0":
+  "integrity" "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw=="
+  "resolved" "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz"
+  "version" "5.1.0"
+
+"kind-of@^6.0.0", "kind-of@^6.0.2", "kind-of@^6.0.3":
+  "integrity" "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw=="
+  "resolved" "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz"
+  "version" "6.0.3"
+
+"kleur@^3.0.3":
+  "integrity" "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w=="
+  "resolved" "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz"
+  "version" "3.0.3"
+
+"kuler@1.0.x":
+  "integrity" "sha512-J9nVUucG1p/skKul6DU3PUZrhs0LPulNaeUOox0IyXDi8S4CztTHs1gQphhuZmzXG7VOQSf6NJfKuzteQLv9gQ=="
+  "resolved" "https://registry.npmjs.org/kuler/-/kuler-1.0.1.tgz"
+  "version" "1.0.1"
+  dependencies:
+    "colornames" "^1.1.1"
+
+"last-call-webpack-plugin@^3.0.0":
+  "integrity" "sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w=="
+  "resolved" "https://registry.npmjs.org/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz"
+  "version" "3.0.0"
+  dependencies:
+    "lodash" "^4.17.5"
+    "webpack-sources" "^1.1.0"
+
+"lazy-cache@^2.0.1":
+  "integrity" "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ="
+  "resolved" "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz"
+  "version" "2.0.2"
+  dependencies:
+    "set-getter" "^0.1.0"
+
+"lcid@^3.0.0":
+  "integrity" "sha512-M6T051+5QCGLBQb8id3hdvIW8+zeFV2FyBGFS9IEK5H9Wt4MueD4bW1eWikpHgZp+5xR3l5c8pZUkQsIA0BFZg=="
+  "resolved" "https://registry.npmjs.org/lcid/-/lcid-3.1.1.tgz"
+  "version" "3.1.1"
+  dependencies:
+    "invert-kv" "^3.0.0"
+
+"leven@^3.1.0":
+  "integrity" "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A=="
+  "resolved" "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz"
+  "version" "3.1.0"
+
+"levenary@^1.1.1":
+  "version" "1.1.1"
+  dependencies:
+    "leven" "^3.1.0"
+
+"levn@^0.3.0", "levn@~0.3.0":
+  "integrity" "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4="
+  "resolved" "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz"
+  "version" "0.3.0"
+  dependencies:
+    "prelude-ls" "~1.1.2"
+    "type-check" "~0.3.2"
+
+"lie@~3.3.0":
+  "integrity" "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ=="
+  "resolved" "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz"
+  "version" "3.3.0"
+  dependencies:
+    "immediate" "~3.0.5"
+
+"limiter@^1.0.5":
+  "integrity" "sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA=="
+  "resolved" "https://registry.npmjs.org/limiter/-/limiter-1.1.5.tgz"
+  "version" "1.1.5"
+
+"lines-and-columns@^1.1.6":
+  "integrity" "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA="
+  "resolved" "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz"
+  "version" "1.1.6"
+
+"lint-staged@8.2.1":
+  "integrity" "sha512-n0tDGR/rTCgQNwXnUf/eWIpPNddGWxC32ANTNYsj2k02iZb7Cz5ox2tytwBu+2r0zDXMEMKw7Y9OD/qsav561A=="
+  "resolved" "https://registry.npmjs.org/lint-staged/-/lint-staged-8.2.1.tgz"
+  "version" "8.2.1"
+  dependencies:
+    "chalk" "^2.3.1"
+    "commander" "^2.14.1"
+    "cosmiconfig" "^5.2.0"
+    "debug" "^3.1.0"
+    "dedent" "^0.7.0"
+    "del" "^3.0.0"
+    "execa" "^1.0.0"
+    "g-status" "^2.0.2"
+    "is-glob" "^4.0.0"
+    "is-windows" "^1.0.2"
+    "listr" "^0.14.2"
+    "listr-update-renderer" "^0.5.0"
+    "lodash" "^4.17.11"
+    "log-symbols" "^2.2.0"
+    "micromatch" "^3.1.8"
+    "npm-which" "^3.0.1"
+    "p-map" "^1.1.1"
+    "path-is-inside" "^1.0.2"
+    "pify" "^3.0.0"
+    "please-upgrade-node" "^3.0.2"
+    "staged-git-files" "1.1.2"
+    "string-argv" "^0.0.2"
+    "stringify-object" "^3.2.2"
+    "yup" "^0.27.0"
+
+"listr-silent-renderer@^1.1.1":
+  "integrity" "sha1-kktaN1cVN3C/Go4/v3S4u/P5JC4="
+  "resolved" "https://registry.npmjs.org/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz"
+  "version" "1.1.1"
+
+"listr-update-renderer@^0.5.0":
+  "integrity" "sha512-tKRsZpKz8GSGqoI/+caPmfrypiaq+OQCbd+CovEC24uk1h952lVj5sC7SqyFUm+OaJ5HN/a1YLt5cit2FMNsFA=="
+  "resolved" "https://registry.npmjs.org/listr-update-renderer/-/listr-update-renderer-0.5.0.tgz"
+  "version" "0.5.0"
+  dependencies:
+    "chalk" "^1.1.3"
+    "cli-truncate" "^0.2.1"
+    "elegant-spinner" "^1.0.1"
+    "figures" "^1.7.0"
+    "indent-string" "^3.0.0"
+    "log-symbols" "^1.0.2"
+    "log-update" "^2.3.0"
+    "strip-ansi" "^3.0.1"
+
+"listr-verbose-renderer@^0.5.0":
+  "integrity" "sha512-04PDPqSlsqIOaaaGZ+41vq5FejI9auqTInicFRndCBgE3bXG8D6W1I+mWhk+1nqbHmyhla/6BUrd5OSiHwKRXw=="
+  "resolved" "https://registry.npmjs.org/listr-verbose-renderer/-/listr-verbose-renderer-0.5.0.tgz"
+  "version" "0.5.0"
+  dependencies:
+    "chalk" "^2.4.1"
+    "cli-cursor" "^2.1.0"
+    "date-fns" "^1.27.2"
+    "figures" "^2.0.0"
+
+"listr@^0.14.2":
+  "integrity" "sha512-RmAl7su35BFd/xoMamRjpIE4j3v+L28o8CT5YhAXQJm1fD+1l9ngXY8JAQRJ+tFK2i5njvi0iRUKV09vPwA0iA=="
+  "resolved" "https://registry.npmjs.org/listr/-/listr-0.14.3.tgz"
+  "version" "0.14.3"
+  dependencies:
+    "@samverschueren/stream-to-observable" "^0.3.0"
+    "is-observable" "^1.1.0"
+    "is-promise" "^2.1.0"
+    "is-stream" "^1.1.0"
+    "listr-silent-renderer" "^1.1.1"
+    "listr-update-renderer" "^0.5.0"
+    "listr-verbose-renderer" "^0.5.0"
+    "p-map" "^2.0.0"
+    "rxjs" "^6.3.3"
+
+"loader-runner@^2.3.1", "loader-runner@^2.4.0":
+  "integrity" "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw=="
+  "resolved" "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz"
+  "version" "2.4.0"
+
+"loader-utils@^1.0.0":
+  "integrity" "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA=="
+  "resolved" "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz"
+  "version" "1.4.0"
+  dependencies:
+    "big.js" "^5.2.2"
+    "emojis-list" "^3.0.0"
+    "json5" "^1.0.1"
+
+"loader-utils@^1.0.2":
+  "integrity" "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA=="
+  "resolved" "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz"
+  "version" "1.4.0"
+  dependencies:
+    "big.js" "^5.2.2"
+    "emojis-list" "^3.0.0"
+    "json5" "^1.0.1"
+
+"loader-utils@^1.1.0":
+  "integrity" "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA=="
+  "resolved" "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz"
+  "version" "1.4.0"
+  dependencies:
+    "big.js" "^5.2.2"
+    "emojis-list" "^3.0.0"
+    "json5" "^1.0.1"
+
+"loader-utils@^1.2.3":
+  "integrity" "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA=="
+  "resolved" "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz"
+  "version" "1.4.0"
+  dependencies:
+    "big.js" "^5.2.2"
+    "emojis-list" "^3.0.0"
+    "json5" "^1.0.1"
+
+"loader-utils@^1.4.0":
+  "integrity" "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA=="
+  "resolved" "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz"
+  "version" "1.4.0"
+  dependencies:
+    "big.js" "^5.2.2"
+    "emojis-list" "^3.0.0"
+    "json5" "^1.0.1"
+
+"loader-utils@^2.0.0":
+  "integrity" "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ=="
+  "resolved" "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz"
+  "version" "2.0.0"
+  dependencies:
+    "big.js" "^5.2.2"
+    "emojis-list" "^3.0.0"
+    "json5" "^2.1.2"
+
+"localtunnel@^2.0.1":
+  "integrity" "sha512-LiaI5wZdz0xFkIQpXbNI62ZnNn8IMsVhwxHmhA+h4vj8R9JG/07bQHWwQlyy7b95/5fVOCHJfIHv+a5XnkvaJA=="
+  "resolved" "https://registry.npmjs.org/localtunnel/-/localtunnel-2.0.1.tgz"
+  "version" "2.0.1"
+  dependencies:
+    "axios" "0.21.1"
+    "debug" "4.3.1"
+    "openurl" "1.1.1"
+    "yargs" "16.2.0"
+
+"locate-path@^2.0.0":
+  "integrity" "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4="
+  "resolved" "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz"
+  "version" "2.0.0"
+  dependencies:
+    "p-locate" "^2.0.0"
+    "path-exists" "^3.0.0"
+
+"locate-path@^3.0.0":
+  "integrity" "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A=="
+  "resolved" "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz"
+  "version" "3.0.0"
+  dependencies:
+    "p-locate" "^3.0.0"
+    "path-exists" "^3.0.0"
+
+"locate-path@^5.0.0":
+  "integrity" "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g=="
+  "resolved" "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz"
+  "version" "5.0.0"
+  dependencies:
+    "p-locate" "^4.1.0"
+
+"locate-path@^6.0.0":
+  "integrity" "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw=="
+  "resolved" "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz"
+  "version" "6.0.0"
+  dependencies:
+    "p-locate" "^5.0.0"
+
+"lodash._reinterpolate@^3.0.0":
+  "integrity" "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0="
+  "resolved" "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz"
+  "version" "3.0.0"
+
+"lodash.debounce@^4.0.8":
+  "integrity" "sha1-gteb/zCmfEAF/9XiUVMArZyk168="
+  "resolved" "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz"
+  "version" "4.0.8"
+
+"lodash.difference@^4.5.0":
+  "integrity" "sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw="
+  "resolved" "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz"
+  "version" "4.5.0"
+
+"lodash.isfinite@^3.3.2":
+  "integrity" "sha1-+4m2WpqAKBgz8LdHizpRBPiY67M="
+  "resolved" "https://registry.npmjs.org/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz"
+  "version" "3.3.2"
+
+"lodash.memoize@^4.1.2", "lodash.memoize@4.x":
+  "integrity" "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4="
+  "resolved" "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz"
+  "version" "4.1.2"
+
+"lodash.pad@^4.1.0":
+  "integrity" "sha1-QzCUmoM6fI2iLMIPaibE1Z3runA="
+  "resolved" "https://registry.npmjs.org/lodash.pad/-/lodash.pad-4.5.1.tgz"
+  "version" "4.5.1"
+
+"lodash.padend@^4.1.0":
+  "integrity" "sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4="
+  "resolved" "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz"
+  "version" "4.6.1"
+
+"lodash.padstart@^4.1.0":
+  "integrity" "sha1-0uPuv/DZ05rVD1y9G1KnvOa7YRs="
+  "resolved" "https://registry.npmjs.org/lodash.padstart/-/lodash.padstart-4.6.1.tgz"
+  "version" "4.6.1"
+
+"lodash.sortby@^4.7.0":
+  "version" "4.7.0"
+
+"lodash.template@^4.5.0":
+  "integrity" "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A=="
+  "resolved" "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz"
+  "version" "4.5.0"
+  dependencies:
+    "lodash._reinterpolate" "^3.0.0"
+    "lodash.templatesettings" "^4.0.0"
+
+"lodash.templatesettings@^4.0.0":
+  "integrity" "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ=="
+  "resolved" "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz"
+  "version" "4.2.0"
+  dependencies:
+    "lodash._reinterpolate" "^3.0.0"
+
+"lodash.uniq@^4.5.0":
+  "integrity" "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M="
+  "resolved" "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz"
+  "version" "4.5.0"
+
+"lodash@^4", "lodash@^4.17.10", "lodash@^4.17.11", "lodash@^4.17.12", "lodash@^4.17.13", "lodash@^4.17.14", "lodash@^4.17.15", "lodash@^4.17.19", "lodash@^4.17.21", "lodash@^4.17.5", "lodash@^4.3.0":
+  "integrity" "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
+  "resolved" "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz"
+  "version" "4.17.21"
+
+"lodash@4.17.15":
+  "integrity" "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A=="
+  "resolved" "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz"
+  "version" "4.17.15"
+
+"lodash@4.17.20":
+  "integrity" "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA=="
+  "resolved" "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz"
+  "version" "4.17.20"
+
+"log-symbols@^1.0.2":
+  "integrity" "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg="
+  "resolved" "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz"
+  "version" "1.0.2"
+  dependencies:
+    "chalk" "^1.0.0"
+
+"log-symbols@^2.2.0":
+  "integrity" "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg=="
+  "resolved" "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz"
+  "version" "2.2.0"
+  dependencies:
+    "chalk" "^2.0.1"
+
+"log-symbols@^3.0.0":
+  "integrity" "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ=="
+  "resolved" "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz"
+  "version" "3.0.0"
+  dependencies:
+    "chalk" "^2.4.2"
+
+"log-symbols@^4.0.0":
+  "integrity" "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg=="
+  "resolved" "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz"
+  "version" "4.1.0"
+  dependencies:
+    "chalk" "^4.1.0"
+    "is-unicode-supported" "^0.1.0"
+
+"log-symbols@4.0.0":
+  "integrity" "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA=="
+  "resolved" "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz"
+  "version" "4.0.0"
+  dependencies:
+    "chalk" "^4.0.0"
+
+"log-update@^2.3.0", "log-update@2.3.x":
+  "integrity" "sha1-iDKP19HOeTiykoN0bwsbwSayRwg="
+  "resolved" "https://registry.npmjs.org/log-update/-/log-update-2.3.0.tgz"
+  "version" "2.3.0"
+  dependencies:
+    "ansi-escapes" "^3.0.0"
+    "cli-cursor" "^2.0.0"
+    "wrap-ansi" "^3.0.1"
+
+"logform@^2.1.1":
+  "integrity" "sha512-N0qPlqfypFx7UHNn4B3lzS/b0uLqt2hmuoa+PpuXNYgozdJYAyauF5Ky0BWVjrxDlMWiT3qN4zPq3vVAfZy7Yg=="
+  "resolved" "https://registry.npmjs.org/logform/-/logform-2.2.0.tgz"
+  "version" "2.2.0"
+  dependencies:
+    "colors" "^1.2.1"
+    "fast-safe-stringify" "^2.0.4"
+    "fecha" "^4.2.0"
+    "ms" "^2.1.1"
+    "triple-beam" "^1.3.0"
+
+"loglevel@^1.6.8":
+  "version" "1.6.8"
+
+"loose-envify@^1.0.0":
+  "version" "1.4.0"
+  dependencies:
+    "js-tokens" "^3.0.0 || ^4.0.0"
+
+"lower-case@^2.0.1":
+  "version" "2.0.1"
+  dependencies:
+    "tslib" "^1.10.0"
+
+"lowercase-keys@^1.0.0":
+  "integrity" "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA=="
+  "resolved" "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz"
+  "version" "1.0.1"
+
+"lru-cache@^5.1.1":
+  "integrity" "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="
+  "resolved" "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz"
+  "version" "5.1.1"
+  dependencies:
+    "yallist" "^3.0.2"
+
+"lru-cache@^6.0.0":
+  "integrity" "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA=="
+  "resolved" "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz"
+  "version" "6.0.0"
+  dependencies:
+    "yallist" "^4.0.0"
+
+"macos-release@^2.2.0":
+  "integrity" "sha512-H/QHeBIN1fIGJX517pvK8IEK53yQOW7YcEI55oYtgjDdoCQQz7eJS94qt5kNrscReEyuD/JcdFCm2XBEcGOITg=="
+  "resolved" "https://registry.npmjs.org/macos-release/-/macos-release-2.4.1.tgz"
+  "version" "2.4.1"
+
+"magic-string@^0.25.0", "magic-string@^0.25.5", "magic-string@0.25.7":
+  "integrity" "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA=="
+  "resolved" "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz"
+  "version" "0.25.7"
+  dependencies:
+    "sourcemap-codec" "^1.4.4"
+
+"make-dir@^1.0.0":
+  "integrity" "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ=="
+  "resolved" "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz"
+  "version" "1.3.0"
+  dependencies:
+    "pify" "^3.0.0"
+
+"make-dir@^2.0.0":
+  "integrity" "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA=="
+  "resolved" "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz"
+  "version" "2.1.0"
+  dependencies:
+    "pify" "^4.0.1"
+    "semver" "^5.6.0"
+
+"make-dir@^3.0.0", "make-dir@^3.0.2":
+  "integrity" "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw=="
+  "resolved" "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz"
+  "version" "3.1.0"
+  dependencies:
+    "semver" "^6.0.0"
+
+"make-error@^1.1.1", "make-error@1.x":
+  "integrity" "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw=="
+  "resolved" "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz"
+  "version" "1.3.6"
+
+"make-fetch-happen@^5.0.0":
+  "integrity" "sha512-07JHC0r1ykIoruKO8ifMXu+xEU8qOXDFETylktdug6vJDACnP+HKevOu3PXyNPzFyTSlz8vrBYlBO1JZRe8Cag=="
+  "resolved" "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-5.0.2.tgz"
+  "version" "5.0.2"
+  dependencies:
+    "agentkeepalive" "^3.4.1"
+    "cacache" "^12.0.0"
+    "http-cache-semantics" "^3.8.1"
+    "http-proxy-agent" "^2.1.0"
+    "https-proxy-agent" "^2.2.3"
+    "lru-cache" "^5.1.1"
+    "mississippi" "^3.0.0"
+    "node-fetch-npm" "^2.0.2"
+    "promise-retry" "^1.1.1"
+    "socks-proxy-agent" "^4.0.0"
+    "ssri" "^6.0.0"
+
+"makeerror@1.0.x":
+  "integrity" "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw="
+  "resolved" "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz"
+  "version" "1.0.11"
+  dependencies:
+    "tmpl" "1.0.x"
+
+"map-age-cleaner@^0.1.3":
+  "integrity" "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w=="
+  "resolved" "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz"
+  "version" "0.1.3"
+  dependencies:
+    "p-defer" "^1.0.0"
+
+"map-cache@^0.2.2":
+  "integrity" "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8="
+  "resolved" "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz"
+  "version" "0.2.2"
+
+"map-obj@^1.0.0":
+  "integrity" "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0="
+  "resolved" "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz"
+  "version" "1.0.1"
+
+"map-obj@^4.0.0":
+  "version" "4.1.0"
+
+"map-visit@^1.0.0":
+  "integrity" "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48="
+  "resolved" "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz"
+  "version" "1.0.0"
+  dependencies:
+    "object-visit" "^1.0.0"
+
+"marked@^1.1.0":
+  "integrity" "sha512-H8lIX2SvyitGX+TRdtS06m1jHMijKN/XjfH6Ooii9fvxMlh8QdqBfBDkGUpMWH2kQNrtixjzYUa3SH8ROTgRRw=="
+  "resolved" "https://registry.npmjs.org/marked/-/marked-1.2.9.tgz"
+  "version" "1.2.9"
+
+"matcher@^1.0.0":
+  "integrity" "sha512-+BmqxWIubKTRKNWx/ahnCkk3mG8m7OturVlqq6HiojGJTd5hVYbgZm6WzcYPCoB+KBT4Vd6R7WSRG2OADNaCjg=="
+  "resolved" "https://registry.npmjs.org/matcher/-/matcher-1.1.1.tgz"
+  "version" "1.1.1"
+  dependencies:
+    "escape-string-regexp" "^1.0.4"
+
+"md5.js@^1.3.4":
+  "integrity" "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg=="
+  "resolved" "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz"
+  "version" "1.3.5"
+  dependencies:
+    "hash-base" "^3.0.0"
+    "inherits" "^2.0.1"
+    "safe-buffer" "^5.1.2"
+
+"mdn-data@2.0.14":
+  "integrity" "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow=="
+  "resolved" "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz"
+  "version" "2.0.14"
+
+"mdn-data@2.0.4":
+  "integrity" "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA=="
+  "resolved" "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz"
+  "version" "2.0.4"
+
+"media-typer@0.3.0":
+  "integrity" "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g="
+  "resolved" "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz"
+  "version" "0.3.0"
+
+"mem-fs-editor@^6.0.0":
+  "integrity" "sha512-e0WfJAMm8Gv1mP5fEq/Blzy6Lt1VbLg7gNnZmZak7nhrBTibs+c6nQ4SKs/ZyJYHS1mFgDJeopsLAv7Ow0FMFg=="
+  "resolved" "https://registry.npmjs.org/mem-fs-editor/-/mem-fs-editor-6.0.0.tgz"
+  "version" "6.0.0"
+  dependencies:
+    "commondir" "^1.0.1"
+    "deep-extend" "^0.6.0"
+    "ejs" "^2.6.1"
+    "glob" "^7.1.4"
+    "globby" "^9.2.0"
+    "isbinaryfile" "^4.0.0"
+    "mkdirp" "^0.5.0"
+    "multimatch" "^4.0.0"
+    "rimraf" "^2.6.3"
+    "through2" "^3.0.1"
+    "vinyl" "^2.2.0"
+
+"mem-fs-editor@^7.0.1":
+  "integrity" "sha512-BH6QEqCXSqGeX48V7zu+e3cMwHU7x640NB8Zk8VNvVZniz+p4FK60pMx/3yfkzo6miI6G3a8pH6z7FeuIzqrzA=="
+  "resolved" "https://registry.npmjs.org/mem-fs-editor/-/mem-fs-editor-7.1.0.tgz"
+  "version" "7.1.0"
+  dependencies:
+    "commondir" "^1.0.1"
+    "deep-extend" "^0.6.0"
+    "ejs" "^3.1.5"
+    "glob" "^7.1.4"
+    "globby" "^9.2.0"
+    "isbinaryfile" "^4.0.0"
+    "mkdirp" "^1.0.0"
+    "multimatch" "^4.0.0"
+    "rimraf" "^3.0.0"
+    "through2" "^3.0.2"
+    "vinyl" "^2.2.1"
+
+"mem-fs@^1.1.0":
+  "integrity" "sha512-b8g0jWKdl8pM0LqAPdK9i8ERL7nYrzmJfRhxMiWH2uYdfYnb7uXnmwVb0ZGe7xyEl4lj+nLIU3yf4zPUT+XsVQ=="
+  "resolved" "https://registry.npmjs.org/mem-fs/-/mem-fs-1.2.0.tgz"
+  "version" "1.2.0"
+  dependencies:
+    "through2" "^3.0.0"
+    "vinyl" "^2.0.1"
+    "vinyl-file" "^3.0.0"
+
+"mem@^5.0.0":
+  "integrity" "sha512-qvwipnozMohxLXG1pOqoLiZKNkC4r4qqRucSoDwXowsNGDSULiqFTRUF05vcZWnwJSG22qTsynQhxbaMtnX9gw=="
+  "resolved" "https://registry.npmjs.org/mem/-/mem-5.1.1.tgz"
+  "version" "5.1.1"
+  dependencies:
+    "map-age-cleaner" "^0.1.3"
+    "mimic-fn" "^2.1.0"
+    "p-is-promise" "^2.1.0"
+
+"memory-fs@^0.4.1":
+  "integrity" "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI="
+  "resolved" "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz"
+  "version" "0.4.1"
+  dependencies:
+    "errno" "^0.1.3"
+    "readable-stream" "^2.0.1"
+
+"memory-fs@^0.5.0":
+  "integrity" "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA=="
+  "resolved" "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz"
+  "version" "0.5.0"
+  dependencies:
+    "errno" "^0.1.3"
+    "readable-stream" "^2.0.1"
+
+"meow@6.1.0":
+  "integrity" "sha512-iIAoeI01v6pmSfObAAWFoITAA4GgiT45m4SmJgoxtZfvI0fyZwhV4d0lTwiUXvAKIPlma05Feb2Xngl52Mj5Cg=="
+  "resolved" "https://registry.npmjs.org/meow/-/meow-6.1.0.tgz"
+  "version" "6.1.0"
+  dependencies:
+    "@types/minimist" "^1.2.0"
+    "camelcase-keys" "^6.1.1"
+    "decamelize-keys" "^1.1.0"
+    "hard-rejection" "^2.0.0"
+    "minimist-options" "^4.0.1"
+    "normalize-package-data" "^2.5.0"
+    "read-pkg-up" "^7.0.0"
+    "redent" "^3.0.0"
+    "trim-newlines" "^3.0.0"
+    "type-fest" "^0.8.1"
+    "yargs-parser" "^18.1.1"
+
+"merge-descriptors@1.0.1":
+  "integrity" "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E="
+  "resolved" "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz"
+  "version" "1.0.1"
+
+"merge-jsons-webpack-plugin@1.0.21":
+  "integrity" "sha512-5Brw0DBi7tF48gm3BB21hu3qYWUMHuKWHKNqdZYmGTQlZQFTc63VFY/5LgonqusI/b0uvvjkpTdx1WrjInXreQ=="
+  "resolved" "https://registry.npmjs.org/merge-jsons-webpack-plugin/-/merge-jsons-webpack-plugin-1.0.21.tgz"
+  "version" "1.0.21"
+  dependencies:
+    "es6-promise" "4.0.5"
+    "glob" "7.1.1"
+
+"merge-stream@^2.0.0":
+  "integrity" "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="
+  "resolved" "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz"
+  "version" "2.0.0"
+
+"merge2@^1.2.3", "merge2@^1.3.0":
+  "integrity" "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="
+  "resolved" "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz"
+  "version" "1.4.1"
+
+"methods@~1.1.2":
+  "integrity" "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4="
+  "resolved" "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz"
+  "version" "1.1.2"
+
+"micromatch@^3.0.4", "micromatch@^3.1.10", "micromatch@^3.1.4", "micromatch@^3.1.8":
+  "integrity" "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg=="
+  "resolved" "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz"
+  "version" "3.1.10"
+  dependencies:
+    "arr-diff" "^4.0.0"
+    "array-unique" "^0.3.2"
+    "braces" "^2.3.1"
+    "define-property" "^2.0.2"
+    "extend-shallow" "^3.0.2"
+    "extglob" "^2.0.4"
+    "fragment-cache" "^0.2.1"
+    "kind-of" "^6.0.2"
+    "nanomatch" "^1.2.9"
+    "object.pick" "^1.3.0"
+    "regex-not" "^1.0.0"
+    "snapdragon" "^0.8.1"
+    "to-regex" "^3.0.2"
+
+"micromatch@^4.0.0":
+  "version" "4.0.2"
+  dependencies:
+    "braces" "^3.0.1"
+    "picomatch" "^2.0.5"
+
+"micromatch@^4.0.2":
+  "version" "4.0.2"
+  dependencies:
+    "braces" "^3.0.1"
+    "picomatch" "^2.0.5"
+
+"micromatch@4.x":
+  "version" "4.0.2"
+  dependencies:
+    "braces" "^3.0.1"
+    "picomatch" "^2.0.5"
+
+"miller-rabin@^4.0.0":
+  "integrity" "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA=="
+  "resolved" "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz"
+  "version" "4.0.1"
+  dependencies:
+    "bn.js" "^4.0.0"
+    "brorand" "^1.0.1"
+
+"mime-db@>= 1.43.0 < 2", "mime-db@1.44.0":
+  "version" "1.44.0"
+
+"mime-types@^2.1.12", "mime-types@~2.1.17", "mime-types@~2.1.19", "mime-types@~2.1.24":
+  "version" "2.1.27"
+  dependencies:
+    "mime-db" "1.44.0"
+
+"mime@^2.4.4":
+  "version" "2.4.6"
+
+"mime@1.4.1":
+  "integrity" "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ=="
+  "resolved" "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz"
+  "version" "1.4.1"
+
+"mime@1.6.0":
+  "integrity" "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
+  "resolved" "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz"
+  "version" "1.6.0"
+
+"mimic-fn@^1.0.0":
+  "integrity" "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ=="
+  "resolved" "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz"
+  "version" "1.2.0"
+
+"mimic-fn@^2.1.0":
+  "integrity" "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="
+  "resolved" "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz"
+  "version" "2.1.0"
+
+"min-indent@^1.0.0":
+  "integrity" "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg=="
+  "resolved" "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz"
+  "version" "1.0.1"
+
+"mini-css-extract-plugin@0.9.0":
+  "integrity" "sha512-lp3GeY7ygcgAmVIcRPBVhIkf8Us7FZjA+ILpal44qLdSu11wmjKQ3d9k15lfD7pO4esu9eUIAW7qiYIBppv40A=="
+  "resolved" "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.9.0.tgz"
+  "version" "0.9.0"
+  dependencies:
+    "loader-utils" "^1.1.0"
+    "normalize-url" "1.9.1"
+    "schema-utils" "^1.0.0"
+    "webpack-sources" "^1.1.0"
+
+"minimalistic-assert@^1.0.0", "minimalistic-assert@^1.0.1":
+  "integrity" "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A=="
+  "resolved" "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz"
+  "version" "1.0.1"
+
+"minimalistic-crypto-utils@^1.0.1":
+  "integrity" "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo="
+  "resolved" "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz"
+  "version" "1.0.1"
+
+"minimatch@^3.0.2", "minimatch@^3.0.4", "minimatch@3.0.4":
+  "integrity" "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA=="
+  "resolved" "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz"
+  "version" "3.0.4"
+  dependencies:
+    "brace-expansion" "^1.1.7"
+
+"minimist-options@^4.0.1":
+  "integrity" "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A=="
+  "resolved" "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz"
+  "version" "4.1.0"
+  dependencies:
+    "arrify" "^1.0.1"
+    "is-plain-obj" "^1.1.0"
+    "kind-of" "^6.0.3"
+
+"minimist@^1.1.1", "minimist@^1.2.0", "minimist@^1.2.5":
+  "integrity" "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
+  "resolved" "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz"
+  "version" "1.2.5"
+
+"minipass-collect@^1.0.2":
+  "integrity" "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA=="
+  "resolved" "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz"
+  "version" "1.0.2"
+  dependencies:
+    "minipass" "^3.0.0"
+
+"minipass-flush@^1.0.5":
+  "integrity" "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw=="
+  "resolved" "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz"
+  "version" "1.0.5"
+  dependencies:
+    "minipass" "^3.0.0"
+
+"minipass-pipeline@^1.2.2":
+  "version" "1.2.3"
+  dependencies:
+    "minipass" "^3.0.0"
+
+"minipass@^2.3.5", "minipass@^2.6.0", "minipass@^2.8.6", "minipass@^2.9.0":
+  "integrity" "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg=="
+  "resolved" "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz"
+  "version" "2.9.0"
+  dependencies:
+    "safe-buffer" "^5.1.2"
+    "yallist" "^3.0.0"
+
+"minipass@^3.0.0", "minipass@^3.1.1":
+  "integrity" "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg=="
+  "resolved" "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz"
+  "version" "3.1.3"
+  dependencies:
+    "yallist" "^4.0.0"
+
+"minizlib@^1.2.1":
+  "integrity" "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q=="
+  "resolved" "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz"
+  "version" "1.3.3"
+  dependencies:
+    "minipass" "^2.9.0"
+
+"minizlib@^2.1.0":
+  "version" "2.1.0"
+  dependencies:
+    "minipass" "^3.0.0"
+    "yallist" "^4.0.0"
+
+"mississippi@^3.0.0":
+  "integrity" "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA=="
+  "resolved" "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz"
+  "version" "3.0.0"
+  dependencies:
+    "concat-stream" "^1.5.0"
+    "duplexify" "^3.4.2"
+    "end-of-stream" "^1.1.0"
+    "flush-write-stream" "^1.0.0"
+    "from2" "^2.1.0"
+    "parallel-transform" "^1.1.0"
+    "pump" "^3.0.0"
+    "pumpify" "^1.3.3"
+    "stream-each" "^1.1.0"
+    "through2" "^2.0.0"
+
+"mitt@^1.1.3":
+  "integrity" "sha512-r6lj77KlwqLhIUku9UWYes7KJtsczvolZkzp8hbaDPPaE24OmWl5s539Mytlj22siEQKosZ26qCBgda2PKwoJw=="
+  "resolved" "https://registry.npmjs.org/mitt/-/mitt-1.2.0.tgz"
+  "version" "1.2.0"
+
+"mixin-deep@^1.2.0":
+  "integrity" "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA=="
+  "resolved" "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz"
+  "version" "1.3.2"
+  dependencies:
+    "for-in" "^1.0.2"
+    "is-extendable" "^1.0.1"
+
+"mkdirp@^0.5.0", "mkdirp@^0.5.1", "mkdirp@^0.5.3", "mkdirp@~0.5.1":
+  "integrity" "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ=="
+  "resolved" "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz"
+  "version" "0.5.5"
+  dependencies:
+    "minimist" "^1.2.5"
+
+"mkdirp@^1.0.0":
+  "integrity" "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="
+  "resolved" "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz"
+  "version" "1.0.4"
+
+"mkdirp@^1.0.3":
+  "integrity" "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="
+  "resolved" "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz"
+  "version" "1.0.4"
+
+"mkdirp@^1.0.4":
+  "integrity" "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="
+  "resolved" "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz"
+  "version" "1.0.4"
+
+"mkdirp@1.0.4":
+  "integrity" "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="
+  "resolved" "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz"
+  "version" "1.0.4"
+
+"mkdirp@1.x":
+  "integrity" "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="
+  "resolved" "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz"
+  "version" "1.0.4"
+
+"mocha@^8.4.0":
+  "version" "8.4.0"
+  dependencies:
+    "@ungap/promise-all-settled" "1.1.2"
+    "ansi-colors" "4.1.1"
+    "browser-stdout" "1.3.1"
+    "chokidar" "3.5.1"
+    "debug" "4.3.1"
+    "diff" "5.0.0"
+    "escape-string-regexp" "4.0.0"
+    "find-up" "5.0.0"
+    "glob" "7.1.6"
+    "growl" "1.10.5"
+    "he" "1.2.0"
+    "js-yaml" "4.0.0"
+    "log-symbols" "4.0.0"
+    "minimatch" "3.0.4"
+    "ms" "2.1.3"
+    "nanoid" "3.1.20"
+    "serialize-javascript" "5.0.1"
+    "strip-json-comments" "3.1.1"
+    "supports-color" "8.1.1"
+    "which" "2.0.2"
+    "wide-align" "1.1.3"
+    "workerpool" "6.1.0"
+    "yargs" "16.2.0"
+    "yargs-parser" "20.2.4"
+    "yargs-unparser" "2.0.0"
+
+"moment-locales-webpack-plugin@1.2.0":
+  "integrity" "sha512-QAi5v0OlPUP7GXviKMtxnpBAo8WmTHrUNN7iciAhNOEAd9evCOvuN0g1N7ThIg3q11GLCkjY1zQ2saRcf/43nQ=="
+  "resolved" "https://registry.npmjs.org/moment-locales-webpack-plugin/-/moment-locales-webpack-plugin-1.2.0.tgz"
+  "version" "1.2.0"
+  dependencies:
+    "lodash.difference" "^4.5.0"
+
+"moment@^2.15.1", "moment@^2.22.1", "moment@^2.24.0", "moment@^2.8.0", "moment@2.27.0":
+  "integrity" "sha512-al0MUK7cpIcglMv3YF13qSgdAIqxHTO7brRtaz3DlSULbqfazqkc5kEjNrLDOM7fsjshoFIihnU8snrP7zUvhQ=="
+  "resolved" "https://registry.npmjs.org/moment/-/moment-2.27.0.tgz"
+  "version" "2.27.0"
+
+"move-concurrently@^1.0.1":
+  "integrity" "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I="
+  "resolved" "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz"
+  "version" "1.0.1"
+  dependencies:
+    "aproba" "^1.1.1"
+    "copy-concurrently" "^1.0.0"
+    "fs-write-stream-atomic" "^1.0.8"
+    "mkdirp" "^0.5.1"
+    "rimraf" "^2.5.4"
+    "run-queue" "^1.0.3"
+
+"ms@^2.0.0", "ms@^2.1.1", "ms@2.1.2":
+  "integrity" "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+  "resolved" "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz"
+  "version" "2.1.2"
+
+"ms@2.0.0":
+  "integrity" "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+  "resolved" "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz"
+  "version" "2.0.0"
+
+"ms@2.1.1":
+  "integrity" "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg=="
+  "resolved" "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz"
+  "version" "2.1.1"
+
+"ms@2.1.3":
+  "integrity" "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
+  "resolved" "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz"
+  "version" "2.1.3"
+
+"multicast-dns-service-types@^1.1.0":
+  "integrity" "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE="
+  "resolved" "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz"
+  "version" "1.1.0"
+
+"multicast-dns@^6.0.1":
+  "integrity" "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g=="
+  "resolved" "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz"
+  "version" "6.2.3"
+  dependencies:
+    "dns-packet" "^1.3.1"
+    "thunky" "^1.0.2"
+
+"multimatch@^4.0.0":
+  "integrity" "sha512-lDmx79y1z6i7RNx0ZGCPq1bzJ6ZoDDKbvh7jxr9SJcWLkShMzXrHbYVpTdnhNM5MXpDUxCQ4DgqVttVXlBgiBQ=="
+  "resolved" "https://registry.npmjs.org/multimatch/-/multimatch-4.0.0.tgz"
+  "version" "4.0.0"
+  dependencies:
+    "@types/minimatch" "^3.0.3"
+    "array-differ" "^3.0.0"
+    "array-union" "^2.1.0"
+    "arrify" "^2.0.1"
+    "minimatch" "^3.0.4"
+
+"mute-stream@0.0.6":
+  "integrity" "sha1-SJYrGeFp/R38JAs/HnMXYnu8R9s="
+  "resolved" "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.6.tgz"
+  "version" "0.0.6"
+
+"mute-stream@0.0.7":
+  "integrity" "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s="
+  "resolved" "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz"
+  "version" "0.0.7"
+
+"mute-stream@0.0.8":
+  "integrity" "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA=="
+  "resolved" "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz"
+  "version" "0.0.8"
+
+"nan@^2.12.1":
+  "version" "2.14.1"
+
+"nanoid@3.1.20":
+  "integrity" "sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw=="
+  "resolved" "https://registry.npmjs.org/nanoid/-/nanoid-3.1.20.tgz"
+  "version" "3.1.20"
+
+"nanomatch@^1.2.9":
+  "integrity" "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA=="
+  "resolved" "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz"
+  "version" "1.2.13"
+  dependencies:
+    "arr-diff" "^4.0.0"
+    "array-unique" "^0.3.2"
+    "define-property" "^2.0.2"
+    "extend-shallow" "^3.0.2"
+    "fragment-cache" "^0.2.1"
+    "is-windows" "^1.0.2"
+    "kind-of" "^6.0.2"
+    "object.pick" "^1.3.0"
+    "regex-not" "^1.0.0"
+    "snapdragon" "^0.8.1"
+    "to-regex" "^3.0.1"
+
+"natural-compare@^1.4.0":
+  "integrity" "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc="
+  "resolved" "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz"
+  "version" "1.4.0"
+
+"negotiator@0.6.2":
+  "integrity" "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw=="
+  "resolved" "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz"
+  "version" "0.6.2"
+
+"neo-async@^2.5.0", "neo-async@^2.6.0", "neo-async@^2.6.1":
+  "version" "2.6.1"
+
+"ng-jhipster@0.14.0":
+  "integrity" "sha512-f6S8gkGLVOLYcODykhhgGkqY3zTO/VIc2oavvkN8pg7BAqIwj7gkLjrPnYTF4IDH9taSDkkD+Oizp4XLPEEc4A=="
+  "resolved" "https://registry.npmjs.org/ng-jhipster/-/ng-jhipster-0.14.0.tgz"
+  "version" "0.14.0"
+  dependencies:
+    "tslib" "^2.0.0"
+
+"ngx-cookie-service@^3.1.3":
+  "version" "3.1.3"
+  dependencies:
+    "tslib" "^1.10.0"
+
+"ngx-infinite-scroll@9.0.0":
+  "integrity" "sha512-C8JhvrTip/AKv6f8oiB+GJjW+FGE3EPIc3Kk+v3MICGlW0nkOetyJDe/ejXr8tI8zwbNjbfvAKFRKenibDIW6w=="
+  "resolved" "https://registry.npmjs.org/ngx-infinite-scroll/-/ngx-infinite-scroll-9.0.0.tgz"
+  "version" "9.0.0"
+  dependencies:
+    "@scarf/scarf" "0.1.5"
+    "opencollective-postinstall" "^2.0.2"
+
+"ngx-markdown@^10.1.1":
+  "integrity" "sha512-bUVgN6asb35d5U4xM5CNfo7pSpuwqJSdTgK0PhNZzLiaiyPIK2owtLF6sWGhxTThJu+LngJPjj4MQ+AFe/s8XQ=="
+  "resolved" "https://registry.npmjs.org/ngx-markdown/-/ngx-markdown-10.1.1.tgz"
+  "version" "10.1.1"
+  dependencies:
+    "@types/marked" "^1.1.0"
+    "emoji-toolkit" "^6.0.1"
+    "katex" "^0.12.0"
+    "marked" "^1.1.0"
+    "prismjs" "^1.20.0"
+    "tslib" "^2.0.0"
+
+"ngx-webstorage@5.0.0":
+  "integrity" "sha512-m96dBjUgLCpaknLRKfsJMEik393xrSX0EwO3paNSkS5d+xj2/cAendE3NwJeKY/W1D9EkKAhCvSUDX9/bAwCUg=="
+  "resolved" "https://registry.npmjs.org/ngx-webstorage/-/ngx-webstorage-5.0.0.tgz"
+  "version" "5.0.0"
+
+"nice-try@^1.0.4":
+  "integrity" "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ=="
+  "resolved" "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz"
+  "version" "1.0.5"
+
+"no-case@^3.0.3":
+  "version" "3.0.3"
+  dependencies:
+    "lower-case" "^2.0.1"
+    "tslib" "^1.10.0"
+
+"node-fetch-npm@^2.0.2":
+  "integrity" "sha512-iOuIQDWDyjhv9qSDrj9aq/klt6F9z1p2otB3AV7v3zBDcL/x+OfGsvGQZZCcMZbUf4Ujw1xGNQkjvGnVT22cKg=="
+  "resolved" "https://registry.npmjs.org/node-fetch-npm/-/node-fetch-npm-2.0.4.tgz"
+  "version" "2.0.4"
+  dependencies:
+    "encoding" "^0.1.11"
+    "json-parse-better-errors" "^1.0.0"
+    "safe-buffer" "^5.1.1"
+
+"node-forge@^0.10.0":
+  "integrity" "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA=="
+  "resolved" "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz"
+  "version" "0.10.0"
+
+"node-int64@^0.4.0":
+  "integrity" "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs="
+  "resolved" "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz"
+  "version" "0.4.0"
+
+"node-libs-browser@^2.2.1":
+  "integrity" "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q=="
+  "resolved" "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz"
+  "version" "2.2.1"
+  dependencies:
+    "assert" "^1.1.1"
+    "browserify-zlib" "^0.2.0"
+    "buffer" "^4.3.0"
+    "console-browserify" "^1.1.0"
+    "constants-browserify" "^1.0.0"
+    "crypto-browserify" "^3.11.0"
+    "domain-browser" "^1.1.1"
+    "events" "^3.0.0"
+    "https-browserify" "^1.0.0"
+    "os-browserify" "^0.3.0"
+    "path-browserify" "0.0.1"
+    "process" "^0.11.10"
+    "punycode" "^1.2.4"
+    "querystring-es3" "^0.2.0"
+    "readable-stream" "^2.3.3"
+    "stream-browserify" "^2.0.1"
+    "stream-http" "^2.7.2"
+    "string_decoder" "^1.0.0"
+    "timers-browserify" "^2.0.4"
+    "tty-browserify" "0.0.0"
+    "url" "^0.11.0"
+    "util" "^0.11.0"
+    "vm-browserify" "^1.0.1"
+
+"node-modules-regexp@^1.0.0":
+  "integrity" "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA="
+  "resolved" "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz"
+  "version" "1.0.0"
+
+"node-notifier@^5.1.2":
+  "version" "5.4.3"
+  dependencies:
+    "growly" "^1.3.0"
+    "is-wsl" "^1.1.0"
+    "semver" "^5.5.0"
+    "shellwords" "^0.1.1"
+    "which" "^1.3.0"
+
+"node-notifier@^7.0.0":
+  "version" "7.0.1"
+  dependencies:
+    "growly" "^1.3.0"
+    "is-wsl" "^2.1.1"
+    "semver" "^7.2.1"
+    "shellwords" "^0.1.1"
+    "uuid" "^7.0.3"
+    "which" "^2.0.2"
+
+"node-releases@^1.1.71":
+  "version" "1.1.73"
+
+"normalize-package-data@^2.0.0", "normalize-package-data@^2.4.0", "normalize-package-data@^2.5.0":
+  "integrity" "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA=="
+  "resolved" "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz"
+  "version" "2.5.0"
+  dependencies:
+    "hosted-git-info" "^2.1.4"
+    "resolve" "^1.10.0"
+    "semver" "2 || 3 || 4 || 5"
+    "validate-npm-package-license" "^3.0.1"
+
+"normalize-path@^2.1.1":
+  "integrity" "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk="
+  "resolved" "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz"
+  "version" "2.1.1"
+  dependencies:
+    "remove-trailing-separator" "^1.0.1"
+
+"normalize-path@^3.0.0", "normalize-path@~3.0.0", "normalize-path@3.0.0":
+  "integrity" "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="
+  "resolved" "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz"
+  "version" "3.0.0"
+
+"normalize-range@^0.1.2":
+  "integrity" "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI="
+  "resolved" "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz"
+  "version" "0.1.2"
+
+"normalize-url@^3.0.0":
+  "integrity" "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg=="
+  "resolved" "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz"
+  "version" "3.3.0"
+
+"normalize-url@1.9.1":
+  "integrity" "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw="
+  "resolved" "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz"
+  "version" "1.9.1"
+  dependencies:
+    "object-assign" "^4.0.1"
+    "prepend-http" "^1.0.0"
+    "query-string" "^4.1.0"
+    "sort-keys" "^1.0.0"
+
+"npm-api@^1.0.0":
+  "version" "1.0.0"
+  dependencies:
+    "clone-deep" "^4.0.1"
+    "download-stats" "^0.3.4"
+    "JSONStream" "^1.3.5"
+    "moment" "^2.24.0"
+    "paged-request" "^2.0.1"
+    "request" "^2.88.0"
+
+"npm-bundled@^1.0.1":
+  "integrity" "sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ=="
+  "resolved" "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz"
+  "version" "1.1.2"
+  dependencies:
+    "npm-normalize-package-bin" "^1.0.1"
+
+"npm-install-checks@^4.0.0":
+  "integrity" "sha512-09OmyDkNLYwqKPOnbI8exiOZU2GVVmQp7tgez2BPi5OZC8M82elDAps7sxC4l//uSUtotWqoEIDwjRvWH4qz8w=="
+  "resolved" "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-4.0.0.tgz"
+  "version" "4.0.0"
+  dependencies:
+    "semver" "^7.1.1"
+
+"npm-normalize-package-bin@^1.0.0", "npm-normalize-package-bin@^1.0.1":
+  "integrity" "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA=="
+  "resolved" "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz"
+  "version" "1.0.1"
+
+"npm-package-arg@^6.0.0", "npm-package-arg@^6.1.0":
+  "integrity" "sha512-qBpssaL3IOZWi5vEKUKW0cO7kzLeT+EQO9W8RsLOZf76KF9E/K9+wH0C7t06HXPpaH8WH5xF1MExLuCwbTqRUg=="
+  "resolved" "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.1.tgz"
+  "version" "6.1.1"
+  dependencies:
+    "hosted-git-info" "^2.7.1"
+    "osenv" "^0.1.5"
+    "semver" "^5.6.0"
+    "validate-npm-package-name" "^3.0.0"
+
+"npm-package-arg@^8.0.0", "npm-package-arg@8.0.1":
+  "integrity" "sha512-/h5Fm6a/exByzFSTm7jAyHbgOqErl9qSNJDQF32Si/ZzgwT2TERVxRxn3Jurw1wflgyVVAxnFR4fRHPM7y1ClQ=="
+  "resolved" "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-8.0.1.tgz"
+  "version" "8.0.1"
+  dependencies:
+    "hosted-git-info" "^3.0.2"
+    "semver" "^7.0.0"
+    "validate-npm-package-name" "^3.0.0"
+
+"npm-packlist@^1.1.12":
+  "integrity" "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A=="
+  "resolved" "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz"
+  "version" "1.4.8"
+  dependencies:
+    "ignore-walk" "^3.0.1"
+    "npm-bundled" "^1.0.1"
+    "npm-normalize-package-bin" "^1.0.1"
+
+"npm-path@^2.0.2":
+  "integrity" "sha512-IFsj0R9C7ZdR5cP+ET342q77uSRdtWOlWpih5eC+lu29tIDbNEgDbzgVJ5UFvYHWhxDZ5TFkJafFioO0pPQjCw=="
+  "resolved" "https://registry.npmjs.org/npm-path/-/npm-path-2.0.4.tgz"
+  "version" "2.0.4"
+  dependencies:
+    "which" "^1.2.10"
+
+"npm-pick-manifest@^3.0.0":
+  "integrity" "sha512-wNprTNg+X5nf+tDi+hbjdHhM4bX+mKqv6XmPh7B5eG+QY9VARfQPfCEH013H5GqfNj6ee8Ij2fg8yk0mzps1Vw=="
+  "resolved" "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-3.0.2.tgz"
+  "version" "3.0.2"
+  dependencies:
+    "figgy-pudding" "^3.5.1"
+    "npm-package-arg" "^6.0.0"
+    "semver" "^5.4.1"
+
+"npm-pick-manifest@6.1.0":
+  "integrity" "sha512-ygs4k6f54ZxJXrzT0x34NybRlLeZ4+6nECAIbr2i0foTnijtS1TJiyzpqtuUAJOps/hO0tNDr8fRV5g+BtRlTw=="
+  "resolved" "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-6.1.0.tgz"
+  "version" "6.1.0"
+  dependencies:
+    "npm-install-checks" "^4.0.0"
+    "npm-package-arg" "^8.0.0"
+    "semver" "^7.0.0"
+
+"npm-registry-fetch@^4.0.0":
+  "integrity" "sha512-cny9v0+Mq6Tjz+e0erFAB+RYJ/AVGzkjnISiobqP8OWj9c9FLoZZu8/SPSKJWE17F1tk4018wfjV+ZbIbqC7fQ=="
+  "resolved" "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-4.0.7.tgz"
+  "version" "4.0.7"
+  dependencies:
+    "bluebird" "^3.5.1"
+    "figgy-pudding" "^3.4.1"
+    "JSONStream" "^1.3.4"
+    "lru-cache" "^5.1.1"
+    "make-fetch-happen" "^5.0.0"
+    "npm-package-arg" "^6.1.0"
+    "safe-buffer" "^5.2.0"
+
+"npm-run-path@^2.0.0":
+  "integrity" "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8="
+  "resolved" "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz"
+  "version" "2.0.2"
+  dependencies:
+    "path-key" "^2.0.0"
+
+"npm-run-path@^4.0.0":
+  "integrity" "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw=="
+  "resolved" "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz"
+  "version" "4.0.1"
+  dependencies:
+    "path-key" "^3.0.0"
+
+"npm-which@^3.0.1":
+  "integrity" "sha1-kiXybsOihcIJyuZ8OxGmtKtxQKo="
+  "resolved" "https://registry.npmjs.org/npm-which/-/npm-which-3.0.1.tgz"
+  "version" "3.0.1"
+  dependencies:
+    "commander" "^2.9.0"
+    "npm-path" "^2.0.2"
+    "which" "^1.2.10"
+
+"npmlog@^2.0.3":
+  "integrity" "sha1-mLUlMPJRTKkNCexbIsiEZyI3VpI="
+  "resolved" "https://registry.npmjs.org/npmlog/-/npmlog-2.0.4.tgz"
+  "version" "2.0.4"
+  dependencies:
+    "ansi" "~0.3.1"
+    "are-we-there-yet" "~1.1.2"
+    "gauge" "~1.2.5"
+
+"nth-check@^1.0.2":
+  "integrity" "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg=="
+  "resolved" "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz"
+  "version" "1.0.2"
+  dependencies:
+    "boolbase" "~1.0.0"
+
+"nth-check@^2.0.0":
+  "version" "2.0.0"
+  dependencies:
+    "boolbase" "^1.0.0"
+
+"num2fraction@^1.2.2":
+  "integrity" "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4="
+  "resolved" "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz"
+  "version" "1.2.2"
+
+"number-is-nan@^1.0.0":
+  "integrity" "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0="
+  "resolved" "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz"
+  "version" "1.0.1"
+
+"nwsapi@^2.2.0":
+  "integrity" "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ=="
+  "resolved" "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz"
+  "version" "2.2.0"
+
+"oauth-sign@~0.9.0":
+  "integrity" "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ=="
+  "resolved" "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz"
+  "version" "0.9.0"
+
+"object-assign@^4.0.1", "object-assign@^4.1.0", "object-assign@^4.1.1":
+  "integrity" "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
+  "resolved" "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz"
+  "version" "4.1.1"
+
+"object-copy@^0.1.0":
+  "integrity" "sha1-fn2Fi3gb18mRpBupde04EnVOmYw="
+  "resolved" "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz"
+  "version" "0.1.0"
+  dependencies:
+    "copy-descriptor" "^0.1.0"
+    "define-property" "^0.2.5"
+    "kind-of" "^3.0.3"
+
+"object-hash@^2.0.3":
+  "version" "2.0.3"
+
+"object-inspect@^1.10.3":
+  "integrity" "sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw=="
+  "resolved" "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.3.tgz"
+  "version" "1.10.3"
+
+"object-is@^1.0.1":
+  "version" "1.1.2"
+  dependencies:
+    "define-properties" "^1.1.3"
+    "es-abstract" "^1.17.5"
+
+"object-keys@^1.0.12", "object-keys@^1.1.1":
+  "integrity" "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="
+  "resolved" "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz"
+  "version" "1.1.1"
+
+"object-visit@^1.0.0":
+  "integrity" "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs="
+  "resolved" "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz"
+  "version" "1.0.1"
+  dependencies:
+    "isobject" "^3.0.0"
+
+"object.assign@^4.1.0", "object.assign@^4.1.2":
+  "integrity" "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ=="
+  "resolved" "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz"
+  "version" "4.1.2"
+  dependencies:
+    "call-bind" "^1.0.0"
+    "define-properties" "^1.1.3"
+    "has-symbols" "^1.0.1"
+    "object-keys" "^1.1.1"
+
+"object.getownpropertydescriptors@^2.0.3":
+  "version" "2.1.0"
+  dependencies:
+    "define-properties" "^1.1.3"
+    "es-abstract" "^1.17.0-next.1"
+
+"object.pick@^1.3.0":
+  "integrity" "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c="
+  "resolved" "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz"
+  "version" "1.3.0"
+  dependencies:
+    "isobject" "^3.0.1"
+
+"object.values@^1.1.0":
+  "integrity" "sha512-TnGo7j4XSnKQoK3MfvkzqKCi0nVe/D9I9IjwTNYdb/fxYHpjrluHVOgw0AF6jrRFGMPHdfuidR09tIDiIvnaSg=="
+  "resolved" "https://registry.npmjs.org/object.values/-/object.values-1.1.4.tgz"
+  "version" "1.1.4"
+  dependencies:
+    "call-bind" "^1.0.2"
+    "define-properties" "^1.1.3"
+    "es-abstract" "^1.18.2"
+
+"obuf@^1.0.0", "obuf@^1.1.2":
+  "integrity" "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg=="
+  "resolved" "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz"
+  "version" "1.1.2"
+
+"on-finished@~2.3.0":
+  "integrity" "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc="
+  "resolved" "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz"
+  "version" "2.3.0"
+  dependencies:
+    "ee-first" "1.1.1"
+
+"on-headers@~1.0.2":
+  "integrity" "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA=="
+  "resolved" "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz"
+  "version" "1.0.2"
+
+"once@^1.3.0", "once@^1.3.1", "once@^1.4.0":
+  "integrity" "sha1-WDsap3WWHUsROsF9nFC6753Xa9E="
+  "resolved" "https://registry.npmjs.org/once/-/once-1.4.0.tgz"
+  "version" "1.4.0"
+  dependencies:
+    "wrappy" "1"
+
+"one-time@0.0.4":
+  "integrity" "sha1-+M33eISCb+Tf+T46nMN7HkSAdC4="
+  "resolved" "https://registry.npmjs.org/one-time/-/one-time-0.0.4.tgz"
+  "version" "0.0.4"
+
+"onetime@^1.0.0":
+  "integrity" "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k="
+  "resolved" "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz"
+  "version" "1.1.0"
+
+"onetime@^2.0.0":
+  "integrity" "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ="
+  "resolved" "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz"
+  "version" "2.0.1"
+  dependencies:
+    "mimic-fn" "^1.0.0"
+
+"onetime@^5.1.0":
+  "version" "5.1.0"
+  dependencies:
+    "mimic-fn" "^2.1.0"
+
+"open@7.2.0":
+  "integrity" "sha512-4HeyhxCvBTI5uBePsAdi55C5fmqnWZ2e2MlmvWi5KW5tdH5rxoiv/aMtbeVxKZc3eWkT1GymMnLG8XC4Rq4TDQ=="
+  "resolved" "https://registry.npmjs.org/open/-/open-7.2.0.tgz"
+  "version" "7.2.0"
+  dependencies:
+    "is-docker" "^2.0.0"
+    "is-wsl" "^2.1.1"
+
+"opencollective-postinstall@^2.0.2":
+  "integrity" "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q=="
+  "resolved" "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz"
+  "version" "2.0.3"
+
+"opener@^1.5.1":
+  "version" "1.5.1"
+
+"openurl@1.1.1":
+  "integrity" "sha1-OHW0sO96UsFW8NtB1GCduw+Us4c="
+  "resolved" "https://registry.npmjs.org/openurl/-/openurl-1.1.1.tgz"
+  "version" "1.1.1"
+
+"opn@^5.5.0":
+  "integrity" "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA=="
+  "resolved" "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz"
+  "version" "5.5.0"
+  dependencies:
+    "is-wsl" "^1.1.0"
+
+"opn@5.3.0":
+  "integrity" "sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g=="
+  "resolved" "https://registry.npmjs.org/opn/-/opn-5.3.0.tgz"
+  "version" "5.3.0"
+  dependencies:
+    "is-wsl" "^1.1.0"
+
+"optimize-css-assets-webpack-plugin@5.0.3":
+  "integrity" "sha512-q9fbvCRS6EYtUKKSwI87qm2IxlyJK5b4dygW1rKUBT6mMDhdG5e5bZT63v6tnJR9F9FB/H5a0HTmtw+laUBxKA=="
+  "resolved" "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.3.tgz"
+  "version" "5.0.3"
+  dependencies:
+    "cssnano" "^4.1.10"
+    "last-call-webpack-plugin" "^3.0.0"
+
+"optionator@^0.8.1", "optionator@^0.8.3":
+  "integrity" "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA=="
+  "resolved" "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz"
+  "version" "0.8.3"
+  dependencies:
+    "deep-is" "~0.1.3"
+    "fast-levenshtein" "~2.0.6"
+    "levn" "~0.3.0"
+    "prelude-ls" "~1.1.2"
+    "type-check" "~0.3.2"
+    "word-wrap" "~1.2.3"
+
+"ora@4.0.4":
+  "integrity" "sha512-77iGeVU1cIdRhgFzCK8aw1fbtT1B/iZAvWjS+l/o1x0RShMgxHUZaD2yDpWsNCPwXg9z1ZA78Kbdvr8kBmG/Ww=="
+  "resolved" "https://registry.npmjs.org/ora/-/ora-4.0.4.tgz"
+  "version" "4.0.4"
+  dependencies:
+    "chalk" "^3.0.0"
+    "cli-cursor" "^3.1.0"
+    "cli-spinners" "^2.2.0"
+    "is-interactive" "^1.0.0"
+    "log-symbols" "^3.0.0"
+    "mute-stream" "0.0.8"
+    "strip-ansi" "^6.0.0"
+    "wcwidth" "^1.0.1"
+
+"ora@5.0.0":
+  "integrity" "sha512-s26qdWqke2kjN/wC4dy+IQPBIMWBJlSU/0JZhk30ZDBLelW25rv66yutUWARMigpGPzcXHb+Nac5pNhN/WsARw=="
+  "resolved" "https://registry.npmjs.org/ora/-/ora-5.0.0.tgz"
+  "version" "5.0.0"
+  dependencies:
+    "chalk" "^4.1.0"
+    "cli-cursor" "^3.1.0"
+    "cli-spinners" "^2.4.0"
+    "is-interactive" "^1.0.0"
+    "log-symbols" "^4.0.0"
+    "mute-stream" "0.0.8"
+    "strip-ansi" "^6.0.0"
+    "wcwidth" "^1.0.1"
+
+"original@^1.0.0":
+  "integrity" "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg=="
+  "resolved" "https://registry.npmjs.org/original/-/original-1.0.2.tgz"
+  "version" "1.0.2"
+  dependencies:
+    "url-parse" "^1.4.3"
+
+"os-browserify@^0.3.0":
+  "integrity" "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc="
+  "resolved" "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz"
+  "version" "0.3.0"
+
+"os-homedir@^1.0.0":
+  "integrity" "sha1-/7xJiDNuDoM94MFox+8VISGqf7M="
+  "resolved" "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz"
+  "version" "1.0.2"
+
+"os-locale@5.0.0":
+  "integrity" "sha512-tqZcNEDAIZKBEPnHPlVDvKrp7NzgLi7jRmhKiUoa2NUmhl13FtkAGLUVR+ZsYvApBQdBfYm43A4tXXQ4IrYLBA=="
+  "resolved" "https://registry.npmjs.org/os-locale/-/os-locale-5.0.0.tgz"
+  "version" "5.0.0"
+  dependencies:
+    "execa" "^4.0.0"
+    "lcid" "^3.0.0"
+    "mem" "^5.0.0"
+
+"os-name@^3.1.0":
+  "integrity" "sha512-h8L+8aNjNcMpo/mAIBPn5PXCM16iyPGjHNWo6U1YO8sJTMHtEtyczI6QJnLoplswm6goopQkqc7OAnjhWcugVg=="
+  "resolved" "https://registry.npmjs.org/os-name/-/os-name-3.1.0.tgz"
+  "version" "3.1.0"
+  dependencies:
+    "macos-release" "^2.2.0"
+    "windows-release" "^3.1.0"
+
+"os-shim@^0.1.2":
+  "integrity" "sha1-a2LDeRz3kJ6jXtRuF2WLtBfLORc="
+  "resolved" "https://registry.npmjs.org/os-shim/-/os-shim-0.1.3.tgz"
+  "version" "0.1.3"
+
+"os-tmpdir@^1.0.0", "os-tmpdir@~1.0.1", "os-tmpdir@~1.0.2":
+  "integrity" "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ="
+  "resolved" "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz"
+  "version" "1.0.2"
+
+"osenv@^0.1.5":
+  "integrity" "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g=="
+  "resolved" "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz"
+  "version" "0.1.5"
+  dependencies:
+    "os-homedir" "^1.0.0"
+    "os-tmpdir" "^1.0.0"
+
+"p-defer@^1.0.0":
+  "integrity" "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww="
+  "resolved" "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz"
+  "version" "1.0.0"
+
+"p-each-series@^2.1.0":
+  "version" "2.1.0"
+
+"p-finally@^1.0.0":
+  "integrity" "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4="
+  "resolved" "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz"
+  "version" "1.0.0"
+
+"p-is-promise@^2.1.0":
+  "integrity" "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg=="
+  "resolved" "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz"
+  "version" "2.1.0"
+
+"p-limit@^1.1.0":
+  "integrity" "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q=="
+  "resolved" "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz"
+  "version" "1.3.0"
+  dependencies:
+    "p-try" "^1.0.0"
+
+"p-limit@^2.0.0", "p-limit@^2.2.0", "p-limit@^2.3.0":
+  "integrity" "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w=="
+  "resolved" "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz"
+  "version" "2.3.0"
+  dependencies:
+    "p-try" "^2.0.0"
+
+"p-limit@^3.0.1":
+  "version" "3.0.1"
+  dependencies:
+    "p-try" "^2.0.0"
+
+"p-limit@^3.0.2":
+  "integrity" "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="
+  "resolved" "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz"
+  "version" "3.1.0"
+  dependencies:
+    "yocto-queue" "^0.1.0"
+
+"p-locate@^2.0.0":
+  "integrity" "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM="
+  "resolved" "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz"
+  "version" "2.0.0"
+  dependencies:
+    "p-limit" "^1.1.0"
+
+"p-locate@^3.0.0":
+  "integrity" "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ=="
+  "resolved" "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz"
+  "version" "3.0.0"
+  dependencies:
+    "p-limit" "^2.0.0"
+
+"p-locate@^4.1.0":
+  "integrity" "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A=="
+  "resolved" "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz"
+  "version" "4.1.0"
+  dependencies:
+    "p-limit" "^2.2.0"
+
+"p-locate@^5.0.0":
+  "integrity" "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw=="
+  "resolved" "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz"
+  "version" "5.0.0"
+  dependencies:
+    "p-limit" "^3.0.2"
+
+"p-map@^1.1.1":
+  "integrity" "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA=="
+  "resolved" "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz"
+  "version" "1.2.0"
+
+"p-map@^2.0.0":
+  "integrity" "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw=="
+  "resolved" "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz"
+  "version" "2.1.0"
+
+"p-map@^4.0.0":
+  "integrity" "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ=="
+  "resolved" "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz"
+  "version" "4.0.0"
+  dependencies:
+    "aggregate-error" "^3.0.0"
+
+"p-retry@^3.0.1":
+  "integrity" "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w=="
+  "resolved" "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz"
+  "version" "3.0.1"
+  dependencies:
+    "retry" "^0.12.0"
+
+"p-try@^1.0.0":
+  "integrity" "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M="
+  "resolved" "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz"
+  "version" "1.0.0"
+
+"p-try@^2.0.0", "p-try@^2.1.0":
+  "integrity" "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="
+  "resolved" "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz"
+  "version" "2.2.0"
+
+"pacote@9.5.12":
+  "integrity" "sha512-BUIj/4kKbwWg4RtnBncXPJd15piFSVNpTzY0rysSr3VnMowTYgkGKcaHrbReepAkjTr8lH2CVWRi58Spg2CicQ=="
+  "resolved" "https://registry.npmjs.org/pacote/-/pacote-9.5.12.tgz"
+  "version" "9.5.12"
+  dependencies:
+    "bluebird" "^3.5.3"
+    "cacache" "^12.0.2"
+    "chownr" "^1.1.2"
+    "figgy-pudding" "^3.5.1"
+    "get-stream" "^4.1.0"
+    "glob" "^7.1.3"
+    "infer-owner" "^1.0.4"
+    "lru-cache" "^5.1.1"
+    "make-fetch-happen" "^5.0.0"
+    "minimatch" "^3.0.4"
+    "minipass" "^2.3.5"
+    "mississippi" "^3.0.0"
+    "mkdirp" "^0.5.1"
+    "normalize-package-data" "^2.4.0"
+    "npm-normalize-package-bin" "^1.0.0"
+    "npm-package-arg" "^6.1.0"
+    "npm-packlist" "^1.1.12"
+    "npm-pick-manifest" "^3.0.0"
+    "npm-registry-fetch" "^4.0.0"
+    "osenv" "^0.1.5"
+    "promise-inflight" "^1.0.1"
+    "promise-retry" "^1.1.1"
+    "protoduck" "^5.0.1"
+    "rimraf" "^2.6.2"
+    "safe-buffer" "^5.1.2"
+    "semver" "^5.6.0"
+    "ssri" "^6.0.1"
+    "tar" "^4.4.10"
+    "unique-filename" "^1.1.1"
+    "which" "^1.3.1"
+
+"paged-request@^2.0.1":
+  "integrity" "sha512-NWrGqneZImDdcMU/7vMcAOo1bIi5h/pmpJqe7/jdsy85BA/s5MSaU/KlpxwW/IVPmIwBcq2uKPrBWWhEWhtxag=="
+  "resolved" "https://registry.npmjs.org/paged-request/-/paged-request-2.0.2.tgz"
+  "version" "2.0.2"
+  dependencies:
+    "axios" "^0.21.1"
+
+"pako@~1.0.2", "pako@~1.0.5":
+  "integrity" "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="
+  "resolved" "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz"
+  "version" "1.0.11"
+
+"parallel-transform@^1.1.0":
+  "integrity" "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg=="
+  "resolved" "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz"
+  "version" "1.2.0"
+  dependencies:
+    "cyclist" "^1.0.1"
+    "inherits" "^2.0.3"
+    "readable-stream" "^2.1.5"
+
+"param-case@^3.0.3":
+  "version" "3.0.3"
+  dependencies:
+    "dot-case" "^3.0.3"
+    "tslib" "^1.10.0"
+
+"parent-module@^1.0.0":
+  "integrity" "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="
+  "resolved" "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz"
+  "version" "1.0.1"
+  dependencies:
+    "callsites" "^3.0.0"
+
+"parse-asn1@^5.0.0", "parse-asn1@^5.1.5":
+  "version" "5.1.5"
+  dependencies:
+    "asn1.js" "^4.0.0"
+    "browserify-aes" "^1.0.0"
+    "create-hash" "^1.1.0"
+    "evp_bytestokey" "^1.0.0"
+    "pbkdf2" "^3.0.3"
+    "safe-buffer" "^5.1.1"
+
+"parse-cache-control@^1.0.1":
+  "integrity" "sha1-juqz5U+laSD+Fro493+iGqzC104="
+  "resolved" "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz"
+  "version" "1.0.1"
+
+"parse-gitignore@1.0.1":
+  "integrity" "sha512-UGyowyjtx26n65kdAMWhm6/3uy5uSrpcuH7tt+QEVudiBoVS+eqHxD5kbi9oWVRwj7sCzXqwuM+rUGw7earl6A=="
+  "resolved" "https://registry.npmjs.org/parse-gitignore/-/parse-gitignore-1.0.1.tgz"
+  "version" "1.0.1"
+
+"parse-json@^4.0.0":
+  "integrity" "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA="
+  "resolved" "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz"
+  "version" "4.0.0"
+  dependencies:
+    "error-ex" "^1.3.1"
+    "json-parse-better-errors" "^1.0.1"
+
+"parse-json@^5.0.0":
+  "version" "5.1.0"
+  dependencies:
+    "@babel/code-frame" "^7.0.0"
+    "error-ex" "^1.3.1"
+    "json-parse-even-better-errors" "^2.3.0"
+    "lines-and-columns" "^1.1.6"
+
+"parse-passwd@^1.0.0":
+  "integrity" "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY="
+  "resolved" "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz"
+  "version" "1.0.0"
+
+"parse-srcset@^1.0.2":
+  "integrity" "sha1-8r0iH2zJcKk42IVWq8WJyqqiveE="
+  "resolved" "https://registry.npmjs.org/parse-srcset/-/parse-srcset-1.0.2.tgz"
+  "version" "1.0.2"
+
+"parse5@5.1.1":
+  "version" "5.1.1"
+
+"parseqs@0.0.6":
+  "integrity" "sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w=="
+  "resolved" "https://registry.npmjs.org/parseqs/-/parseqs-0.0.6.tgz"
+  "version" "0.0.6"
+
+"parseuri@0.0.6":
+  "integrity" "sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow=="
+  "resolved" "https://registry.npmjs.org/parseuri/-/parseuri-0.0.6.tgz"
+  "version" "0.0.6"
+
+"parseurl@~1.3.2", "parseurl@~1.3.3":
+  "integrity" "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="
+  "resolved" "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz"
+  "version" "1.3.3"
+
+"pascal-case@^3.1.1":
+  "version" "3.1.1"
+  dependencies:
+    "no-case" "^3.0.3"
+    "tslib" "^1.10.0"
+
+"pascalcase@^0.1.1":
+  "integrity" "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ="
+  "resolved" "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz"
+  "version" "0.1.1"
+
+"path-browserify@0.0.1":
+  "integrity" "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ=="
+  "resolved" "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz"
+  "version" "0.0.1"
+
+"path-dirname@^1.0.0":
+  "integrity" "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA="
+  "resolved" "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz"
+  "version" "1.0.2"
+
+"path-exists@^3.0.0":
+  "integrity" "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU="
+  "resolved" "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz"
+  "version" "3.0.0"
+
+"path-exists@^4.0.0":
+  "integrity" "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="
+  "resolved" "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz"
+  "version" "4.0.0"
+
+"path-is-absolute@^1.0.0":
+  "integrity" "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
+  "resolved" "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz"
+  "version" "1.0.1"
+
+"path-is-inside@^1.0.1", "path-is-inside@^1.0.2":
+  "integrity" "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM="
+  "resolved" "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz"
+  "version" "1.0.2"
+
+"path-key@^2.0.0", "path-key@^2.0.1":
+  "integrity" "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A="
+  "resolved" "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz"
+  "version" "2.0.1"
+
+"path-key@^3.0.0", "path-key@^3.1.0":
+  "integrity" "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="
+  "resolved" "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz"
+  "version" "3.1.1"
+
+"path-parse@^1.0.6":
+  "version" "1.0.6"
+
+"path-to-regexp@0.1.7":
+  "integrity" "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w="
+  "resolved" "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz"
+  "version" "0.1.7"
+
+"path-type@^3.0.0":
+  "integrity" "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg=="
+  "resolved" "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz"
+  "version" "3.0.0"
+  dependencies:
+    "pify" "^3.0.0"
+
+"path-type@^4.0.0":
+  "integrity" "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="
+  "resolved" "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz"
+  "version" "4.0.0"
+
+"path@^0.12.7":
+  "integrity" "sha1-1NwqUGxM4hl+tIHr/NWzbAFAsQ8="
+  "resolved" "https://registry.npmjs.org/path/-/path-0.12.7.tgz"
+  "version" "0.12.7"
+  dependencies:
+    "process" "^0.11.1"
+    "util" "^0.10.3"
+
+"pathval@^1.1.0":
+  "version" "1.1.0"
+
+"pbkdf2@^3.0.3":
+  "version" "3.1.1"
+  dependencies:
+    "create-hash" "^1.1.2"
+    "create-hmac" "^1.1.4"
+    "ripemd160" "^2.0.1"
+    "safe-buffer" "^5.0.1"
+    "sha.js" "^2.4.8"
+
+"performance-now@^2.1.0":
+  "integrity" "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns="
+  "resolved" "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz"
+  "version" "2.1.0"
+
+"picomatch@^2.0.4", "picomatch@^2.0.5", "picomatch@^2.2.1", "picomatch@^2.2.2":
+  "version" "2.2.2"
+
+"pify@^2.0.0", "pify@^2.3.0":
+  "integrity" "sha1-7RQaasBDqEnqWISY59yosVMw6Qw="
+  "resolved" "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz"
+  "version" "2.3.0"
+
+"pify@^3.0.0":
+  "integrity" "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY="
+  "resolved" "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz"
+  "version" "3.0.0"
+
+"pify@^4.0.1":
+  "integrity" "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g=="
+  "resolved" "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz"
+  "version" "4.0.1"
+
+"pinkie-promise@^2.0.0":
+  "integrity" "sha1-ITXW36ejWMBprJsXh3YogihFD/o="
+  "resolved" "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz"
+  "version" "2.0.1"
+  dependencies:
+    "pinkie" "^2.0.0"
+
+"pinkie@^2.0.0":
+  "integrity" "sha1-clVrgM+g1IqXToDnckjoDtT3+HA="
+  "resolved" "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz"
+  "version" "2.0.4"
+
+"pirates@^4.0.1":
+  "integrity" "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA=="
+  "resolved" "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz"
+  "version" "4.0.1"
+  dependencies:
+    "node-modules-regexp" "^1.0.0"
+
+"pkg-dir@^3.0.0":
+  "integrity" "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw=="
+  "resolved" "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz"
+  "version" "3.0.0"
+  dependencies:
+    "find-up" "^3.0.0"
+
+"pkg-dir@^4.1.0", "pkg-dir@^4.2.0":
+  "integrity" "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ=="
+  "resolved" "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz"
+  "version" "4.2.0"
+  dependencies:
+    "find-up" "^4.0.0"
+
+"pkg-up@^2.0.0":
+  "integrity" "sha1-yBmscoBZpGHKscOImivjxJoATX8="
+  "resolved" "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz"
+  "version" "2.0.0"
+  dependencies:
+    "find-up" "^2.1.0"
+
+"pkg-up@^3.0.1":
+  "integrity" "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA=="
+  "resolved" "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz"
+  "version" "3.1.0"
+  dependencies:
+    "find-up" "^3.0.0"
+
+"please-upgrade-node@^3.0.2", "please-upgrade-node@^3.2.0":
+  "integrity" "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg=="
+  "resolved" "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz"
+  "version" "3.2.0"
+  dependencies:
+    "semver-compare" "^1.0.0"
+
+"plugin-error@^1.0.1":
+  "integrity" "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA=="
+  "resolved" "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz"
+  "version" "1.0.1"
+  dependencies:
+    "ansi-colors" "^1.0.1"
+    "arr-diff" "^4.0.0"
+    "arr-union" "^3.1.0"
+    "extend-shallow" "^3.0.2"
+
+"pluralize@8.0.0":
+  "integrity" "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA=="
+  "resolved" "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz"
+  "version" "8.0.0"
+
+"portfinder@^1.0.26":
+  "version" "1.0.26"
+  dependencies:
+    "async" "^2.6.2"
+    "debug" "^3.1.1"
+    "mkdirp" "^0.5.1"
+
+"portscanner@2.1.1":
+  "integrity" "sha1-6rtAnk3iSVD1oqUW01rnaTQ/u5Y="
+  "resolved" "https://registry.npmjs.org/portscanner/-/portscanner-2.1.1.tgz"
+  "version" "2.1.1"
+  dependencies:
+    "async" "1.5.2"
+    "is-number-like" "^1.0.3"
+
+"posix-character-classes@^0.1.0":
+  "integrity" "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs="
+  "resolved" "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz"
+  "version" "0.1.1"
+
+"postcss-calc@^7.0.1":
+  "version" "7.0.2"
+  dependencies:
+    "postcss" "^7.0.27"
+    "postcss-selector-parser" "^6.0.2"
+    "postcss-value-parser" "^4.0.2"
+
+"postcss-colormin@^4.0.3":
+  "integrity" "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw=="
+  "resolved" "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz"
+  "version" "4.0.3"
+  dependencies:
+    "browserslist" "^4.0.0"
+    "color" "^3.0.0"
+    "has" "^1.0.0"
+    "postcss" "^7.0.0"
+    "postcss-value-parser" "^3.0.0"
+
+"postcss-convert-values@^4.0.1":
+  "integrity" "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ=="
+  "resolved" "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz"
+  "version" "4.0.1"
+  dependencies:
+    "postcss" "^7.0.0"
+    "postcss-value-parser" "^3.0.0"
+
+"postcss-discard-comments@^4.0.2":
+  "integrity" "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg=="
+  "resolved" "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz"
+  "version" "4.0.2"
+  dependencies:
+    "postcss" "^7.0.0"
+
+"postcss-discard-duplicates@^4.0.2":
+  "integrity" "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ=="
+  "resolved" "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz"
+  "version" "4.0.2"
+  dependencies:
+    "postcss" "^7.0.0"
+
+"postcss-discard-empty@^4.0.1":
+  "integrity" "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w=="
+  "resolved" "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz"
+  "version" "4.0.1"
+  dependencies:
+    "postcss" "^7.0.0"
+
+"postcss-discard-overridden@^4.0.1":
+  "integrity" "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg=="
+  "resolved" "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz"
+  "version" "4.0.1"
+  dependencies:
+    "postcss" "^7.0.0"
+
+"postcss-load-config@^2.0.0":
+  "version" "2.1.0"
+  dependencies:
+    "cosmiconfig" "^5.0.0"
+    "import-cwd" "^2.0.0"
+
+"postcss-loader@3.0.0":
+  "integrity" "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA=="
+  "resolved" "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz"
+  "version" "3.0.0"
+  dependencies:
+    "loader-utils" "^1.1.0"
+    "postcss" "^7.0.0"
+    "postcss-load-config" "^2.0.0"
+    "schema-utils" "^1.0.0"
+
+"postcss-merge-longhand@^4.0.11":
+  "integrity" "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw=="
+  "resolved" "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz"
+  "version" "4.0.11"
+  dependencies:
+    "css-color-names" "0.0.4"
+    "postcss" "^7.0.0"
+    "postcss-value-parser" "^3.0.0"
+    "stylehacks" "^4.0.0"
+
+"postcss-merge-rules@^4.0.3":
+  "integrity" "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ=="
+  "resolved" "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz"
+  "version" "4.0.3"
+  dependencies:
+    "browserslist" "^4.0.0"
+    "caniuse-api" "^3.0.0"
+    "cssnano-util-same-parent" "^4.0.0"
+    "postcss" "^7.0.0"
+    "postcss-selector-parser" "^3.0.0"
+    "vendors" "^1.0.0"
+
+"postcss-minify-font-values@^4.0.2":
+  "integrity" "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg=="
+  "resolved" "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz"
+  "version" "4.0.2"
+  dependencies:
+    "postcss" "^7.0.0"
+    "postcss-value-parser" "^3.0.0"
+
+"postcss-minify-gradients@^4.0.2":
+  "integrity" "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q=="
+  "resolved" "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz"
+  "version" "4.0.2"
+  dependencies:
+    "cssnano-util-get-arguments" "^4.0.0"
+    "is-color-stop" "^1.0.0"
+    "postcss" "^7.0.0"
+    "postcss-value-parser" "^3.0.0"
+
+"postcss-minify-params@^4.0.2":
+  "integrity" "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg=="
+  "resolved" "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz"
+  "version" "4.0.2"
+  dependencies:
+    "alphanum-sort" "^1.0.0"
+    "browserslist" "^4.0.0"
+    "cssnano-util-get-arguments" "^4.0.0"
+    "postcss" "^7.0.0"
+    "postcss-value-parser" "^3.0.0"
+    "uniqs" "^2.0.0"
+
+"postcss-minify-selectors@^4.0.2":
+  "integrity" "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g=="
+  "resolved" "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz"
+  "version" "4.0.2"
+  dependencies:
+    "alphanum-sort" "^1.0.0"
+    "has" "^1.0.0"
+    "postcss" "^7.0.0"
+    "postcss-selector-parser" "^3.0.0"
+
+"postcss-modules-extract-imports@^2.0.0":
+  "integrity" "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ=="
+  "resolved" "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz"
+  "version" "2.0.0"
+  dependencies:
+    "postcss" "^7.0.5"
+
+"postcss-modules-local-by-default@^3.0.2":
+  "version" "3.0.2"
+  dependencies:
+    "icss-utils" "^4.1.1"
+    "postcss" "^7.0.16"
+    "postcss-selector-parser" "^6.0.2"
+    "postcss-value-parser" "^4.0.0"
+
+"postcss-modules-scope@^2.2.0":
+  "integrity" "sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ=="
+  "resolved" "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz"
+  "version" "2.2.0"
+  dependencies:
+    "postcss" "^7.0.6"
+    "postcss-selector-parser" "^6.0.0"
+
+"postcss-modules-values@^3.0.0":
+  "integrity" "sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg=="
+  "resolved" "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz"
+  "version" "3.0.0"
+  dependencies:
+    "icss-utils" "^4.0.0"
+    "postcss" "^7.0.6"
+
+"postcss-normalize-charset@^4.0.1":
+  "integrity" "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g=="
+  "resolved" "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz"
+  "version" "4.0.1"
+  dependencies:
+    "postcss" "^7.0.0"
+
+"postcss-normalize-display-values@^4.0.2":
+  "integrity" "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ=="
+  "resolved" "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz"
+  "version" "4.0.2"
+  dependencies:
+    "cssnano-util-get-match" "^4.0.0"
+    "postcss" "^7.0.0"
+    "postcss-value-parser" "^3.0.0"
+
+"postcss-normalize-positions@^4.0.2":
+  "integrity" "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA=="
+  "resolved" "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz"
+  "version" "4.0.2"
+  dependencies:
+    "cssnano-util-get-arguments" "^4.0.0"
+    "has" "^1.0.0"
+    "postcss" "^7.0.0"
+    "postcss-value-parser" "^3.0.0"
+
+"postcss-normalize-repeat-style@^4.0.2":
+  "integrity" "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q=="
+  "resolved" "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz"
+  "version" "4.0.2"
+  dependencies:
+    "cssnano-util-get-arguments" "^4.0.0"
+    "cssnano-util-get-match" "^4.0.0"
+    "postcss" "^7.0.0"
+    "postcss-value-parser" "^3.0.0"
+
+"postcss-normalize-string@^4.0.2":
+  "integrity" "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA=="
+  "resolved" "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz"
+  "version" "4.0.2"
+  dependencies:
+    "has" "^1.0.0"
+    "postcss" "^7.0.0"
+    "postcss-value-parser" "^3.0.0"
+
+"postcss-normalize-timing-functions@^4.0.2":
+  "integrity" "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A=="
+  "resolved" "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz"
+  "version" "4.0.2"
+  dependencies:
+    "cssnano-util-get-match" "^4.0.0"
+    "postcss" "^7.0.0"
+    "postcss-value-parser" "^3.0.0"
+
+"postcss-normalize-unicode@^4.0.1":
+  "integrity" "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg=="
+  "resolved" "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz"
+  "version" "4.0.1"
+  dependencies:
+    "browserslist" "^4.0.0"
+    "postcss" "^7.0.0"
+    "postcss-value-parser" "^3.0.0"
+
+"postcss-normalize-url@^4.0.1":
+  "integrity" "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA=="
+  "resolved" "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz"
+  "version" "4.0.1"
+  dependencies:
+    "is-absolute-url" "^2.0.0"
+    "normalize-url" "^3.0.0"
+    "postcss" "^7.0.0"
+    "postcss-value-parser" "^3.0.0"
+
+"postcss-normalize-whitespace@^4.0.2":
+  "integrity" "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA=="
+  "resolved" "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz"
+  "version" "4.0.2"
+  dependencies:
+    "postcss" "^7.0.0"
+    "postcss-value-parser" "^3.0.0"
+
+"postcss-ordered-values@^4.1.2":
+  "integrity" "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw=="
+  "resolved" "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz"
+  "version" "4.1.2"
+  dependencies:
+    "cssnano-util-get-arguments" "^4.0.0"
+    "postcss" "^7.0.0"
+    "postcss-value-parser" "^3.0.0"
+
+"postcss-reduce-initial@^4.0.3":
+  "integrity" "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA=="
+  "resolved" "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz"
+  "version" "4.0.3"
+  dependencies:
+    "browserslist" "^4.0.0"
+    "caniuse-api" "^3.0.0"
+    "has" "^1.0.0"
+    "postcss" "^7.0.0"
+
+"postcss-reduce-transforms@^4.0.2":
+  "integrity" "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg=="
+  "resolved" "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz"
+  "version" "4.0.2"
+  dependencies:
+    "cssnano-util-get-match" "^4.0.0"
+    "has" "^1.0.0"
+    "postcss" "^7.0.0"
+    "postcss-value-parser" "^3.0.0"
+
+"postcss-selector-parser@^3.0.0":
+  "integrity" "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA=="
+  "resolved" "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz"
+  "version" "3.1.2"
+  dependencies:
+    "dot-prop" "^5.2.0"
+    "indexes-of" "^1.0.1"
+    "uniq" "^1.0.1"
+
+"postcss-selector-parser@^6.0.0", "postcss-selector-parser@^6.0.2":
+  "version" "6.0.2"
+  dependencies:
+    "cssesc" "^3.0.0"
+    "indexes-of" "^1.0.1"
+    "uniq" "^1.0.1"
+
+"postcss-svgo@^4.0.3":
+  "integrity" "sha512-NoRbrcMWTtUghzuKSoIm6XV+sJdvZ7GZSc3wdBN0W19FTtp2ko8NqLsgoh/m9CzNhU3KLPvQmjIwtaNFkaFTvw=="
+  "resolved" "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.3.tgz"
+  "version" "4.0.3"
+  dependencies:
+    "postcss" "^7.0.0"
+    "postcss-value-parser" "^3.0.0"
+    "svgo" "^1.0.0"
+
+"postcss-unique-selectors@^4.0.1":
+  "integrity" "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg=="
+  "resolved" "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz"
+  "version" "4.0.1"
+  dependencies:
+    "alphanum-sort" "^1.0.0"
+    "postcss" "^7.0.0"
+    "uniqs" "^2.0.0"
+
+"postcss-value-parser@^3.0.0":
+  "integrity" "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ=="
+  "resolved" "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz"
+  "version" "3.3.1"
+
+"postcss-value-parser@^4.0.0", "postcss-value-parser@^4.0.2", "postcss-value-parser@^4.1.0":
+  "integrity" "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ=="
+  "resolved" "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz"
+  "version" "4.1.0"
+
+"postcss@^7.0.0", "postcss@^7.0.1", "postcss@^7.0.14", "postcss@^7.0.16", "postcss@^7.0.27", "postcss@^7.0.32", "postcss@^7.0.5", "postcss@^7.0.6":
+  "version" "7.0.36"
+  dependencies:
+    "chalk" "^2.4.2"
+    "source-map" "^0.6.1"
+    "supports-color" "^6.1.0"
+
+"prelude-ls@~1.1.2":
+  "integrity" "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ="
+  "resolved" "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz"
+  "version" "1.1.2"
+
+"prepend-http@^1.0.0", "prepend-http@^1.0.1":
+  "integrity" "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw="
+  "resolved" "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz"
+  "version" "1.0.4"
+
+"prettier-plugin-java@0.8.2":
+  "integrity" "sha512-G11PMutlfhUjLqmrB0gW9n6hTIvlnXX+lhzgH3Uhc1QSlDQoLBky5lNSRgvdYSDPpSF3DmyYd3/7U3Ez8n0ckg=="
+  "resolved" "https://registry.npmjs.org/prettier-plugin-java/-/prettier-plugin-java-0.8.2.tgz"
+  "version" "0.8.2"
+  dependencies:
+    "java-parser" "0.8.2"
+    "lodash" "4.17.20"
+    "prettier" "2.1.1"
+
+"prettier@2.0.5":
+  "integrity" "sha512-7PtVymN48hGcO4fGjybyBSIWDsLU4H4XlvOHfq91pz9kkGlonzwTfYkaIEwiRg/dAJF9YlbsduBAgtYLi+8cFg=="
+  "resolved" "https://registry.npmjs.org/prettier/-/prettier-2.0.5.tgz"
+  "version" "2.0.5"
+
+"prettier@2.1.1":
+  "integrity" "sha512-9bY+5ZWCfqj3ghYBLxApy2zf6m+NJo5GzmLTpr9FsApsfjriNnS2dahWReHMi7qNPhhHl9SYHJs2cHZLgexNIw=="
+  "resolved" "https://registry.npmjs.org/prettier/-/prettier-2.1.1.tgz"
+  "version" "2.1.1"
+
+"prettier@2.1.2":
+  "integrity" "sha512-16c7K+x4qVlJg9rEbXl7HEGmQyZlG4R9AgP+oHKRMsMsuk8s+ATStlf1NpDqyBI1HpVyfjLOeMhH2LvuNvV5Vg=="
+  "resolved" "https://registry.npmjs.org/prettier/-/prettier-2.1.2.tgz"
+  "version" "2.1.2"
+
+"pretty-bytes@^5.2.0", "pretty-bytes@^5.3.0":
+  "version" "5.3.0"
+
+"pretty-error@^2.1.1":
+  "version" "2.1.1"
+  dependencies:
+    "renderkid" "^2.0.1"
+    "utila" "~0.4"
+
+"pretty-format@^25.2.1", "pretty-format@^25.5.0":
+  "integrity" "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ=="
+  "resolved" "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz"
+  "version" "25.5.0"
+  dependencies:
+    "@jest/types" "^25.5.0"
+    "ansi-regex" "^5.0.0"
+    "ansi-styles" "^4.0.0"
+    "react-is" "^16.12.0"
+
+"pretty-format@^26.0.0":
+  "version" "26.1.0"
+  dependencies:
+    "@jest/types" "^26.1.0"
+    "ansi-regex" "^5.0.0"
+    "ansi-styles" "^4.0.0"
+    "react-is" "^16.12.0"
+
+"pretty-format@^26.1.0":
+  "version" "26.1.0"
+  dependencies:
+    "@jest/types" "^26.1.0"
+    "ansi-regex" "^5.0.0"
+    "ansi-styles" "^4.0.0"
+    "react-is" "^16.12.0"
+
+"prismjs@^1.20.0":
+  "integrity" "sha512-c29LVsqOaLbBHuIbsTxaKENh1N2EQBOHaWv7gkHN4dgRbxSREqDnDbtFJYdpPauS4YCplMSNCABQ6Eeor69bAA=="
+  "resolved" "https://registry.npmjs.org/prismjs/-/prismjs-1.23.0.tgz"
+  "version" "1.23.0"
+  optionalDependencies:
+    "clipboard" "^2.0.0"
+
+"process-nextick-args@^2.0.0", "process-nextick-args@~2.0.0":
+  "integrity" "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
+  "resolved" "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz"
+  "version" "2.0.1"
+
+"process@^0.11.1", "process@^0.11.10":
+  "integrity" "sha1-czIwDoQBYb2j5podHZGn1LwW8YI="
+  "resolved" "https://registry.npmjs.org/process/-/process-0.11.10.tgz"
+  "version" "0.11.10"
+
+"progress@^2.0.0", "progress@2.0.3":
+  "integrity" "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA=="
+  "resolved" "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz"
+  "version" "2.0.3"
+
+"promise-inflight@^1.0.1":
+  "integrity" "sha1-mEcocL8igTL8vdhoEputEsPAKeM="
+  "resolved" "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz"
+  "version" "1.0.1"
+
+"promise-retry@^1.1.1":
+  "integrity" "sha1-ZznpaOMFHaIM5kl/srUPaRHfPW0="
+  "resolved" "https://registry.npmjs.org/promise-retry/-/promise-retry-1.1.1.tgz"
+  "version" "1.1.1"
+  dependencies:
+    "err-code" "^1.0.0"
+    "retry" "^0.10.0"
+
+"promise@^8.0.0":
+  "integrity" "sha512-W04AqnILOL/sPRXziNicCjSNRruLAuIHEOVBazepu0545DDNGYHz7ar9ZgZ1fMU8/MA4mVxp5rkBWRi6OXIy3Q=="
+  "resolved" "https://registry.npmjs.org/promise/-/promise-8.1.0.tgz"
+  "version" "8.1.0"
+  dependencies:
+    "asap" "~2.0.6"
+
+"prompts@^2.0.1":
+  "version" "2.3.2"
+  dependencies:
+    "kleur" "^3.0.3"
+    "sisteransi" "^1.0.4"
+
+"property-expr@^1.5.0":
+  "integrity" "sha512-CGuc0VUTGthpJXL36ydB6jnbyOf/rAHFvmVrJlH+Rg0DqqLFQGAP6hIaxD/G0OAmBJPhXDHuEJigrp0e0wFV6g=="
+  "resolved" "https://registry.npmjs.org/property-expr/-/property-expr-1.5.1.tgz"
+  "version" "1.5.1"
+
+"protoduck@^5.0.1":
+  "integrity" "sha512-WxoCeDCoCBY55BMvj4cAEjdVUFGRWed9ZxPlqTKYyw1nDDTQ4pqmnIMAGfJlg7Dx35uB/M+PHJPTmGOvaCaPTg=="
+  "resolved" "https://registry.npmjs.org/protoduck/-/protoduck-5.0.1.tgz"
+  "version" "5.0.1"
+  dependencies:
+    "genfun" "^5.0.0"
+
+"protractor@7.0.0":
+  "integrity" "sha512-UqkFjivi4GcvUQYzqGYNe0mLzfn5jiLmO8w9nMhQoJRLhy2grJonpga2IWhI6yJO30LibWXJJtA4MOIZD2GgZw=="
+  "resolved" "https://registry.npmjs.org/protractor/-/protractor-7.0.0.tgz"
+  "version" "7.0.0"
+  dependencies:
+    "@types/q" "^0.0.32"
+    "@types/selenium-webdriver" "^3.0.0"
+    "blocking-proxy" "^1.0.0"
+    "browserstack" "^1.5.1"
+    "chalk" "^1.1.3"
+    "glob" "^7.0.3"
+    "jasmine" "2.8.0"
+    "jasminewd2" "^2.1.0"
+    "q" "1.4.1"
+    "saucelabs" "^1.5.0"
+    "selenium-webdriver" "3.6.0"
+    "source-map-support" "~0.4.0"
+    "webdriver-js-extender" "2.1.0"
+    "webdriver-manager" "^12.1.7"
+    "yargs" "^15.3.1"
+
+"proxy-addr@~2.0.5":
+  "version" "2.0.6"
+  dependencies:
+    "forwarded" "~0.1.2"
+    "ipaddr.js" "1.9.1"
+
+"prr@~1.0.1":
+  "integrity" "sha1-0/wRS6BplaRexok/SEzrHXj19HY="
+  "resolved" "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz"
+  "version" "1.0.1"
+
+"psl@^1.1.28":
+  "integrity" "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ=="
+  "resolved" "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz"
+  "version" "1.8.0"
+
+"public-encrypt@^4.0.0":
+  "integrity" "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q=="
+  "resolved" "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz"
+  "version" "4.0.3"
+  dependencies:
+    "bn.js" "^4.1.0"
+    "browserify-rsa" "^4.0.0"
+    "create-hash" "^1.1.0"
+    "parse-asn1" "^5.0.0"
+    "randombytes" "^2.0.1"
+    "safe-buffer" "^5.1.2"
+
+"pump@^2.0.0":
+  "integrity" "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA=="
+  "resolved" "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz"
+  "version" "2.0.1"
+  dependencies:
+    "end-of-stream" "^1.1.0"
+    "once" "^1.3.1"
+
+"pump@^3.0.0":
+  "integrity" "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww=="
+  "resolved" "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz"
+  "version" "3.0.0"
+  dependencies:
+    "end-of-stream" "^1.1.0"
+    "once" "^1.3.1"
+
+"pumpify@^1.3.3":
+  "integrity" "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ=="
+  "resolved" "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz"
+  "version" "1.5.1"
+  dependencies:
+    "duplexify" "^3.6.0"
+    "inherits" "^2.0.3"
+    "pump" "^2.0.0"
+
+"punycode@^1.2.4":
+  "integrity" "sha1-wNWmOycYgArY4esPpSachN1BhF4="
+  "resolved" "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz"
+  "version" "1.4.1"
+
+"punycode@^2.1.0", "punycode@^2.1.1":
+  "integrity" "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
+  "resolved" "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz"
+  "version" "2.1.1"
+
+"punycode@1.3.2":
+  "integrity" "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0="
+  "resolved" "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz"
+  "version" "1.3.2"
+
+"q@^1.1.2", "q@^1.4.1":
+  "integrity" "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc="
+  "resolved" "https://registry.npmjs.org/q/-/q-1.5.1.tgz"
+  "version" "1.5.1"
+
+"q@1.4.1":
+  "integrity" "sha1-VXBbzZPF82c1MMLCy8DCs63cKG4="
+  "resolved" "https://registry.npmjs.org/q/-/q-1.4.1.tgz"
+  "version" "1.4.1"
+
+"qs@^6.4.0", "qs@~6.5.2":
+  "integrity" "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA=="
+  "resolved" "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz"
+  "version" "6.5.2"
+
+"qs@6.2.3":
+  "integrity" "sha1-HPyyXBCpsrSDBT/zn138kjOQjP4="
+  "resolved" "https://registry.npmjs.org/qs/-/qs-6.2.3.tgz"
+  "version" "6.2.3"
+
+"qs@6.7.0":
+  "integrity" "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ=="
+  "resolved" "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz"
+  "version" "6.7.0"
+
+"query-string@^4.1.0":
+  "integrity" "sha1-u7aTucqRXCMlFbIosaArYJBD2+s="
+  "resolved" "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz"
+  "version" "4.3.4"
+  dependencies:
+    "object-assign" "^4.1.0"
+    "strict-uri-encode" "^1.0.0"
+
+"querystring-es3@^0.2.0":
+  "integrity" "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM="
+  "resolved" "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz"
+  "version" "0.2.1"
+
+"querystring@0.2.0":
+  "integrity" "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA="
+  "resolved" "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz"
+  "version" "0.2.0"
+
+"querystringify@^2.1.1":
+  "version" "2.1.1"
+
+"quick-lru@^4.0.1":
+  "integrity" "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g=="
+  "resolved" "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz"
+  "version" "4.0.1"
+
+"randexp@0.5.3":
+  "integrity" "sha512-U+5l2KrcMNOUPYvazA3h5ekF80FHTUG+87SEAmHZmolh1M+i/WyTCxVzmi+tidIa1tM4BSe8g2Y/D3loWDjj+w=="
+  "resolved" "https://registry.npmjs.org/randexp/-/randexp-0.5.3.tgz"
+  "version" "0.5.3"
+  dependencies:
+    "drange" "^1.0.2"
+    "ret" "^0.2.0"
+
+"randombytes@^2.0.0", "randombytes@^2.0.1", "randombytes@^2.0.5", "randombytes@^2.1.0":
+  "integrity" "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ=="
+  "resolved" "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz"
+  "version" "2.1.0"
+  dependencies:
+    "safe-buffer" "^5.1.0"
+
+"randomfill@^1.0.3":
+  "integrity" "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw=="
+  "resolved" "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz"
+  "version" "1.0.4"
+  dependencies:
+    "randombytes" "^2.0.5"
+    "safe-buffer" "^5.1.0"
+
+"range-parser@^1.2.1", "range-parser@~1.2.0", "range-parser@~1.2.1":
+  "integrity" "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="
+  "resolved" "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz"
+  "version" "1.2.1"
+
+"raw-body@^2.3.2":
+  "integrity" "sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA=="
+  "resolved" "https://registry.npmjs.org/raw-body/-/raw-body-2.4.1.tgz"
+  "version" "2.4.1"
+  dependencies:
+    "bytes" "3.1.0"
+    "http-errors" "1.7.3"
+    "iconv-lite" "0.4.24"
+    "unpipe" "1.0.0"
+
+"raw-body@2.4.0":
+  "integrity" "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q=="
+  "resolved" "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz"
+  "version" "2.4.0"
+  dependencies:
+    "bytes" "3.1.0"
+    "http-errors" "1.7.2"
+    "iconv-lite" "0.4.24"
+    "unpipe" "1.0.0"
+
+"react-is@^16.12.0":
+  "integrity" "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
+  "resolved" "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz"
+  "version" "16.13.1"
+
+"read-chunk@^3.2.0":
+  "integrity" "sha512-CEjy9LCzhmD7nUpJ1oVOE6s/hBkejlcJEgLQHVnQznOSilOPb+kpKktlLfFDK3/WP43+F80xkUTM2VOkYoSYvQ=="
+  "resolved" "https://registry.npmjs.org/read-chunk/-/read-chunk-3.2.0.tgz"
+  "version" "3.2.0"
+  dependencies:
+    "pify" "^4.0.1"
+    "with-open-file" "^0.1.6"
+
+"read-package-json@^2.0.0":
+  "integrity" "sha512-D1KmuLQr6ZSJS0tW8hf3WGpRlwszJOXZ3E8Yd/DNRaM5d+1wVRZdHlpGBLAuovjr28LbWvjpWkBHMxpRGGjzNA=="
+  "resolved" "https://registry.npmjs.org/read-package-json/-/read-package-json-2.1.2.tgz"
+  "version" "2.1.2"
+  dependencies:
+    "glob" "^7.1.1"
+    "json-parse-even-better-errors" "^2.3.0"
+    "normalize-package-data" "^2.0.0"
+    "npm-normalize-package-bin" "^1.0.0"
+
+"read-package-tree@5.3.1":
+  "integrity" "sha512-mLUDsD5JVtlZxjSlPPx1RETkNjjvQYuweKwNVt1Sn8kP5Jh44pvYuUHCp6xSVDZWbNxVxG5lyZJ921aJH61sTw=="
+  "resolved" "https://registry.npmjs.org/read-package-tree/-/read-package-tree-5.3.1.tgz"
+  "version" "5.3.1"
+  dependencies:
+    "read-package-json" "^2.0.0"
+    "readdir-scoped-modules" "^1.0.0"
+    "util-promisify" "^2.1.0"
+
+"read-pkg-up@^5.0.0":
+  "integrity" "sha512-XBQjqOBtTzyol2CpsQOw8LHV0XbDZVG7xMMjmXAJomlVY03WOBRmYgDJETlvcg0H63AJvPRwT7GFi5rvOzUOKg=="
+  "resolved" "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-5.0.0.tgz"
+  "version" "5.0.0"
+  dependencies:
+    "find-up" "^3.0.0"
+    "read-pkg" "^5.0.0"
+
+"read-pkg-up@^7.0.0":
+  "integrity" "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg=="
+  "resolved" "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz"
+  "version" "7.0.1"
+  dependencies:
+    "find-up" "^4.1.0"
+    "read-pkg" "^5.2.0"
+    "type-fest" "^0.8.1"
+
+"read-pkg-up@^7.0.1":
+  "integrity" "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg=="
+  "resolved" "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz"
+  "version" "7.0.1"
+  dependencies:
+    "find-up" "^4.1.0"
+    "read-pkg" "^5.2.0"
+    "type-fest" "^0.8.1"
+
+"read-pkg@^5.0.0", "read-pkg@^5.2.0":
+  "integrity" "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg=="
+  "resolved" "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz"
+  "version" "5.2.0"
+  dependencies:
+    "@types/normalize-package-data" "^2.4.0"
+    "normalize-package-data" "^2.5.0"
+    "parse-json" "^5.0.0"
+    "type-fest" "^0.6.0"
+
+"readable-stream@^2.0.0", "readable-stream@^2.0.1", "readable-stream@^2.0.2", "readable-stream@^2.0.6", "readable-stream@^2.1.5", "readable-stream@^2.2.2", "readable-stream@^2.3.3", "readable-stream@^2.3.5", "readable-stream@^2.3.6", "readable-stream@^2.3.7", "readable-stream@~2.3.6", "readable-stream@1 || 2", "readable-stream@2 || 3":
+  "integrity" "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw=="
+  "resolved" "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz"
+  "version" "2.3.7"
+  dependencies:
+    "core-util-is" "~1.0.0"
+    "inherits" "~2.0.3"
+    "isarray" "~1.0.0"
+    "process-nextick-args" "~2.0.0"
+    "safe-buffer" "~5.1.1"
+    "string_decoder" "~1.1.1"
+    "util-deprecate" "~1.0.1"
+
+"readable-stream@^3.0.6":
+  "integrity" "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA=="
+  "resolved" "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz"
+  "version" "3.6.0"
+  dependencies:
+    "inherits" "^2.0.3"
+    "string_decoder" "^1.1.1"
+    "util-deprecate" "^1.0.1"
+
+"readable-stream@^3.1.1":
+  "integrity" "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA=="
+  "resolved" "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz"
+  "version" "3.6.0"
+  dependencies:
+    "inherits" "^2.0.3"
+    "string_decoder" "^1.1.1"
+    "util-deprecate" "^1.0.1"
+
+"readable-stream@^3.6.0":
+  "integrity" "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA=="
+  "resolved" "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz"
+  "version" "3.6.0"
+  dependencies:
+    "inherits" "^2.0.3"
+    "string_decoder" "^1.1.1"
+    "util-deprecate" "^1.0.1"
+
+"readdir-scoped-modules@^1.0.0":
+  "integrity" "sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw=="
+  "resolved" "https://registry.npmjs.org/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz"
+  "version" "1.1.0"
+  dependencies:
+    "debuglog" "^1.0.1"
+    "dezalgo" "^1.0.0"
+    "graceful-fs" "^4.1.2"
+    "once" "^1.3.0"
+
+"readdirp@^2.2.1":
+  "integrity" "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ=="
+  "resolved" "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz"
+  "version" "2.2.1"
+  dependencies:
+    "graceful-fs" "^4.1.11"
+    "micromatch" "^3.1.10"
+    "readable-stream" "^2.0.2"
+
+"readdirp@~3.5.0":
+  "integrity" "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ=="
+  "resolved" "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz"
+  "version" "3.5.0"
+  dependencies:
+    "picomatch" "^2.2.1"
+
+"rechoir@^0.6.2":
+  "integrity" "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q="
+  "resolved" "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz"
+  "version" "0.6.2"
+  dependencies:
+    "resolve" "^1.1.6"
+
+"redent@^3.0.0":
+  "integrity" "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg=="
+  "resolved" "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz"
+  "version" "3.0.0"
+  dependencies:
+    "indent-string" "^4.0.0"
+    "strip-indent" "^3.0.0"
+
+"reflect-metadata@^0.1.2":
+  "integrity" "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg=="
+  "resolved" "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz"
+  "version" "0.1.13"
+
+"regenerate-unicode-properties@^8.2.0":
+  "integrity" "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA=="
+  "resolved" "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz"
+  "version" "8.2.0"
+  dependencies:
+    "regenerate" "^1.4.0"
+
+"regenerate@^1.4.0":
+  "version" "1.4.1"
+
+"regenerator-runtime@^0.11.0":
+  "integrity" "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg=="
+  "resolved" "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz"
+  "version" "0.11.1"
+
+"regenerator-runtime@^0.13.4":
+  "version" "0.13.5"
+
+"regenerator-transform@^0.14.2":
+  "integrity" "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw=="
+  "resolved" "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz"
+  "version" "0.14.5"
+  dependencies:
+    "@babel/runtime" "^7.8.4"
+
+"regex-not@^1.0.0", "regex-not@^1.0.2":
+  "integrity" "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A=="
+  "resolved" "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz"
+  "version" "1.0.2"
+  dependencies:
+    "extend-shallow" "^3.0.2"
+    "safe-regex" "^1.1.0"
+
+"regexp-to-ast@0.4.0":
+  "integrity" "sha512-4qf/7IsIKfSNHQXSwial1IFmfM1Cc/whNBQqRwe0V2stPe7KmN1U0tWQiIx6JiirgSrisjE0eECdNf7Tav1Ntw=="
+  "resolved" "https://registry.npmjs.org/regexp-to-ast/-/regexp-to-ast-0.4.0.tgz"
+  "version" "0.4.0"
+
+"regexp-to-ast@0.5.0":
+  "integrity" "sha512-tlbJqcMHnPKI9zSrystikWKwHkBqu2a/Sgw01h3zFjvYrMxEDYHzzoMZnUrbIfpTFEsoRnnviOXNCzFiSc54Qw=="
+  "resolved" "https://registry.npmjs.org/regexp-to-ast/-/regexp-to-ast-0.5.0.tgz"
+  "version" "0.5.0"
+
+"regexp.prototype.flags@^1.2.0":
+  "version" "1.3.0"
+  dependencies:
+    "define-properties" "^1.1.3"
+    "es-abstract" "^1.17.0-next.1"
+
+"regexpp@^2.0.1":
+  "integrity" "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw=="
+  "resolved" "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz"
+  "version" "2.0.1"
+
+"regexpp@^3.0.0":
+  "integrity" "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q=="
+  "resolved" "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz"
+  "version" "3.1.0"
+
+"regexpu-core@^4.7.0":
+  "version" "4.7.0"
+  dependencies:
+    "regenerate" "^1.4.0"
+    "regenerate-unicode-properties" "^8.2.0"
+    "regjsgen" "^0.5.1"
+    "regjsparser" "^0.6.4"
+    "unicode-match-property-ecmascript" "^1.0.4"
+    "unicode-match-property-value-ecmascript" "^1.2.0"
+
+"regjsgen@^0.5.1":
+  "integrity" "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A=="
+  "resolved" "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz"
+  "version" "0.5.2"
+
+"regjsparser@^0.6.4":
+  "version" "0.6.4"
+  dependencies:
+    "jsesc" "~0.5.0"
+
+"relateurl@^0.2.7":
+  "integrity" "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk="
+  "resolved" "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz"
+  "version" "0.2.7"
+
+"remove-trailing-separator@^1.0.1":
+  "integrity" "sha1-wkvOKig62tW8P1jg1IJJuSN52O8="
+  "resolved" "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz"
+  "version" "1.1.0"
+
+"renderkid@^2.0.1":
+  "version" "2.0.7"
+  dependencies:
+    "css-select" "^4.1.3"
+    "dom-converter" "^0.2.0"
+    "htmlparser2" "^6.1.0"
+    "lodash" "^4.17.21"
+    "strip-ansi" "^3.0.1"
+
+"repeat-element@^1.1.2":
+  "version" "1.1.3"
+
+"repeat-string@^1.6.1":
+  "integrity" "sha1-jcrkcOHIirwtYA//Sndihtp15jc="
+  "resolved" "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz"
+  "version" "1.6.1"
+
+"replace-ext@^1.0.0":
+  "integrity" "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw=="
+  "resolved" "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz"
+  "version" "1.0.1"
+
+"request-promise-core@1.1.3":
+  "version" "1.1.3"
+  dependencies:
+    "lodash" "^4.17.15"
+
+"request-promise-native@^1.0.8":
+  "version" "1.0.8"
+  dependencies:
+    "request-promise-core" "1.1.3"
+    "stealthy-require" "^1.1.1"
+    "tough-cookie" "^2.3.3"
+
+"request@^2.34", "request@^2.87.0", "request@^2.88.0", "request@^2.88.2":
+  "integrity" "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw=="
+  "resolved" "https://registry.npmjs.org/request/-/request-2.88.2.tgz"
+  "version" "2.88.2"
+  dependencies:
+    "aws-sign2" "~0.7.0"
+    "aws4" "^1.8.0"
+    "caseless" "~0.12.0"
+    "combined-stream" "~1.0.6"
+    "extend" "~3.0.2"
+    "forever-agent" "~0.6.1"
+    "form-data" "~2.3.2"
+    "har-validator" "~5.1.3"
+    "http-signature" "~1.2.0"
+    "is-typedarray" "~1.0.0"
+    "isstream" "~0.1.2"
+    "json-stringify-safe" "~5.0.1"
+    "mime-types" "~2.1.19"
+    "oauth-sign" "~0.9.0"
+    "performance-now" "^2.1.0"
+    "qs" "~6.5.2"
+    "safe-buffer" "^5.1.2"
+    "tough-cookie" "~2.5.0"
+    "tunnel-agent" "^0.6.0"
+    "uuid" "^3.3.2"
+
+"require-directory@^2.1.1":
+  "integrity" "sha1-jGStX9MNqxyXbiNE/+f3kqam30I="
+  "resolved" "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz"
+  "version" "2.1.1"
+
+"require-main-filename@^2.0.0":
+  "integrity" "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg=="
+  "resolved" "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz"
+  "version" "2.0.0"
+
+"requires-port@^1.0.0":
+  "integrity" "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8="
+  "resolved" "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz"
+  "version" "1.0.0"
+
+"resolve-cwd@^2.0.0":
+  "integrity" "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo="
+  "resolved" "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz"
+  "version" "2.0.0"
+  dependencies:
+    "resolve-from" "^3.0.0"
+
+"resolve-cwd@^3.0.0":
+  "integrity" "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg=="
+  "resolved" "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz"
+  "version" "3.0.0"
+  dependencies:
+    "resolve-from" "^5.0.0"
+
+"resolve-dir@^1.0.0", "resolve-dir@^1.0.1":
+  "integrity" "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M="
+  "resolved" "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz"
+  "version" "1.0.1"
+  dependencies:
+    "expand-tilde" "^2.0.0"
+    "global-modules" "^1.0.0"
+
+"resolve-from@^3.0.0":
+  "integrity" "sha1-six699nWiBvItuZTM17rywoYh0g="
+  "resolved" "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz"
+  "version" "3.0.0"
+
+"resolve-from@^4.0.0":
+  "integrity" "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="
+  "resolved" "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz"
+  "version" "4.0.0"
+
+"resolve-from@^5.0.0":
+  "integrity" "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw=="
+  "resolved" "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz"
+  "version" "5.0.0"
+
+"resolve-url@^0.2.1":
+  "integrity" "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo="
+  "resolved" "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz"
+  "version" "0.2.1"
+
+"resolve@^1.1.6", "resolve@^1.10.0", "resolve@^1.14.2", "resolve@^1.17.0", "resolve@^1.3.2":
+  "version" "1.17.0"
+  dependencies:
+    "path-parse" "^1.0.6"
+
+"resp-modifier@6.0.2":
+  "integrity" "sha1-sSTeXE+6/LpUH0j/pzlw9KpFa08="
+  "resolved" "https://registry.npmjs.org/resp-modifier/-/resp-modifier-6.0.2.tgz"
+  "version" "6.0.2"
+  dependencies:
+    "debug" "^2.2.0"
+    "minimatch" "^3.0.2"
+
+"restore-cursor@^1.0.1":
+  "integrity" "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE="
+  "resolved" "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz"
+  "version" "1.0.1"
+  dependencies:
+    "exit-hook" "^1.0.0"
+    "onetime" "^1.0.0"
+
+"restore-cursor@^2.0.0":
+  "integrity" "sha1-n37ih/gv0ybU/RYpI9YhKe7g368="
+  "resolved" "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz"
+  "version" "2.0.0"
+  dependencies:
+    "onetime" "^2.0.0"
+    "signal-exit" "^3.0.2"
+
+"restore-cursor@^3.1.0":
+  "integrity" "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA=="
+  "resolved" "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz"
+  "version" "3.1.0"
+  dependencies:
+    "onetime" "^5.1.0"
+    "signal-exit" "^3.0.2"
+
+"ret@^0.2.0":
+  "integrity" "sha512-M0b3YWQs7R3Z917WRQy1HHA7Ba7D8hvZg6UE5mLykJxQVE2ju0IXbGlaHPPlkY+WN7wFP+wUMXmBFA0aV6vYGQ=="
+  "resolved" "https://registry.npmjs.org/ret/-/ret-0.2.2.tgz"
+  "version" "0.2.2"
+
+"ret@~0.1.10":
+  "integrity" "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg=="
+  "resolved" "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz"
+  "version" "0.1.15"
+
+"retry@^0.10.0":
+  "integrity" "sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q="
+  "resolved" "https://registry.npmjs.org/retry/-/retry-0.10.1.tgz"
+  "version" "0.10.1"
+
+"retry@^0.12.0":
+  "integrity" "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs="
+  "resolved" "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz"
+  "version" "0.12.0"
+
+"reusify@^1.0.4":
+  "integrity" "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw=="
+  "resolved" "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz"
+  "version" "1.0.4"
+
+"rgb-regex@^1.0.1":
+  "integrity" "sha1-wODWiC3w4jviVKR16O3UGRX+rrE="
+  "resolved" "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz"
+  "version" "1.0.1"
+
+"rgba-regex@^1.0.0":
+  "integrity" "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM="
+  "resolved" "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz"
+  "version" "1.0.0"
+
+"rimraf@^2.2.8", "rimraf@^2.5.2":
+  "integrity" "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w=="
+  "resolved" "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz"
+  "version" "2.7.1"
+  dependencies:
+    "glob" "^7.1.3"
+
+"rimraf@^2.5.4":
+  "integrity" "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w=="
+  "resolved" "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz"
+  "version" "2.7.1"
+  dependencies:
+    "glob" "^7.1.3"
+
+"rimraf@^2.6.2":
+  "integrity" "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w=="
+  "resolved" "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz"
+  "version" "2.7.1"
+  dependencies:
+    "glob" "^7.1.3"
+
+"rimraf@^2.6.3":
+  "integrity" "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w=="
+  "resolved" "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz"
+  "version" "2.7.1"
+  dependencies:
+    "glob" "^7.1.3"
+
+"rimraf@^3.0.0", "rimraf@^3.0.2", "rimraf@3.0.2":
+  "integrity" "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA=="
+  "resolved" "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz"
+  "version" "3.0.2"
+  dependencies:
+    "glob" "^7.1.3"
+
+"rimraf@2.6.3":
+  "integrity" "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA=="
+  "resolved" "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz"
+  "version" "2.6.3"
+  dependencies:
+    "glob" "^7.1.3"
+
+"ripemd160@^2.0.0", "ripemd160@^2.0.1":
+  "integrity" "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA=="
+  "resolved" "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz"
+  "version" "2.0.2"
+  dependencies:
+    "hash-base" "^3.0.0"
+    "inherits" "^2.0.1"
+
+"rollup-plugin-babel@^4.3.3":
+  "integrity" "sha512-Lek/TYp1+7g7I+uMfJnnSJ7YWoD58ajo6Oarhlex7lvUce+RCKRuGRSgztDO3/MF/PuGKmUL5iTHKf208UNszw=="
+  "resolved" "https://registry.npmjs.org/rollup-plugin-babel/-/rollup-plugin-babel-4.4.0.tgz"
+  "version" "4.4.0"
+  dependencies:
+    "@babel/helper-module-imports" "^7.0.0"
+    "rollup-pluginutils" "^2.8.1"
+
+"rollup-plugin-terser@^5.3.1":
+  "integrity" "sha512-1pkwkervMJQGFYvM9nscrUoncPwiKR/K+bHdjv6PFgRo3cgPHoRT83y2Aa3GvINj4539S15t/tpFPb775TDs6w=="
+  "resolved" "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-5.3.1.tgz"
+  "version" "5.3.1"
+  dependencies:
+    "@babel/code-frame" "^7.5.5"
+    "jest-worker" "^24.9.0"
+    "rollup-pluginutils" "^2.8.2"
+    "serialize-javascript" "^4.0.0"
+    "terser" "^4.6.2"
+
+"rollup-pluginutils@^2.8.1", "rollup-pluginutils@^2.8.2":
+  "integrity" "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ=="
+  "resolved" "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz"
+  "version" "2.8.2"
+  dependencies:
+    "estree-walker" "^0.6.1"
+
+"rollup@^1.20.0 || ^2.0.0", "rollup@^1.20.0||^2.0.0", "rollup@^1.31.1", "rollup@>=0.60.0 <3", "rollup@>=0.66.0 <3":
+  "integrity" "sha512-/2HA0Ec70TvQnXdzynFffkjA6XN+1e2pEv/uKS5Ulca40g2L7KuOE3riasHoNVHOsFD5KKZgDsMk1CP3Tw9s+A=="
+  "resolved" "https://registry.npmjs.org/rollup/-/rollup-1.32.1.tgz"
+  "version" "1.32.1"
+  dependencies:
+    "@types/estree" "*"
+    "@types/node" "*"
+    "acorn" "^7.1.0"
+
+"rsvp@^4.8.4":
+  "integrity" "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA=="
+  "resolved" "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz"
+  "version" "4.8.5"
+
+"run-async@^2.0.0", "run-async@^2.2.0", "run-async@^2.4.0":
+  "integrity" "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ=="
+  "resolved" "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz"
+  "version" "2.4.1"
+
+"run-parallel@^1.1.9":
+  "version" "1.1.9"
+
+"run-queue@^1.0.0", "run-queue@^1.0.3":
+  "integrity" "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec="
+  "resolved" "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz"
+  "version" "1.0.3"
+  dependencies:
+    "aproba" "^1.1.1"
+
+"rx@^4.1.0", "rx@4.1.0":
+  "integrity" "sha1-pfE/957zt0D+MKqAP7CfmIBdR4I="
+  "resolved" "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz"
+  "version" "4.1.0"
+
+"rxjs@^5.5.6":
+  "integrity" "sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw=="
+  "resolved" "https://registry.npmjs.org/rxjs/-/rxjs-5.5.12.tgz"
+  "version" "5.5.12"
+  dependencies:
+    "symbol-observable" "1.0.1"
+
+"rxjs@^6.0.0", "rxjs@^6.3.3", "rxjs@^6.4.0", "rxjs@^6.5.2", "rxjs@^6.5.3", "rxjs@^6.5.5", "rxjs@>=6.3.0", "rxjs@6.5.5":
+  "integrity" "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ=="
+  "resolved" "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz"
+  "version" "6.5.5"
+  dependencies:
+    "tslib" "^1.9.0"
+
+"rxjs@^6.6.0":
+  "integrity" "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ=="
+  "resolved" "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz"
+  "version" "6.6.7"
+  dependencies:
+    "tslib" "^1.9.0"
+
+"rxjs@6.6.2":
+  "integrity" "sha512-BHdBMVoWC2sL26w//BCu3YzKT4s2jip/WhwsGEDmeKYBhKDZeYezVUnHatYB7L85v5xs0BAQmg6BEYJEKxBabg=="
+  "resolved" "https://registry.npmjs.org/rxjs/-/rxjs-6.6.2.tgz"
+  "version" "6.6.2"
+  dependencies:
+    "tslib" "^1.9.0"
+
+"safe-buffer@^5.0.1", "safe-buffer@^5.1.0", "safe-buffer@^5.1.1", "safe-buffer@^5.1.2", "safe-buffer@~5.1.0", "safe-buffer@~5.1.1", "safe-buffer@5.1.2":
+  "integrity" "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+  "resolved" "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz"
+  "version" "5.1.2"
+
+"safe-buffer@^5.2.0":
+  "integrity" "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
+  "resolved" "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz"
+  "version" "5.2.1"
+
+"safe-regex@^1.1.0":
+  "integrity" "sha1-QKNmnzsHfR6UPURinhV91IAjvy4="
+  "resolved" "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz"
+  "version" "1.1.0"
+  dependencies:
+    "ret" "~0.1.10"
+
+"safer-buffer@^2.0.2", "safer-buffer@^2.1.0", "safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", "safer-buffer@~2.1.0":
+  "integrity" "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
+  "resolved" "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz"
+  "version" "2.1.2"
+
+"sane@^4.0.3":
+  "integrity" "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA=="
+  "resolved" "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz"
+  "version" "4.1.0"
+  dependencies:
+    "@cnakazawa/watch" "^1.0.3"
+    "anymatch" "^2.0.0"
+    "capture-exit" "^2.0.0"
+    "exec-sh" "^0.3.2"
+    "execa" "^1.0.0"
+    "fb-watchman" "^2.0.0"
+    "micromatch" "^3.1.4"
+    "minimist" "^1.1.1"
+    "walker" "~1.0.5"
+
+"sass-loader@8.0.2":
+  "integrity" "sha512-7o4dbSK8/Ol2KflEmSco4jTjQoV988bM82P9CZdmo9hR3RLnvNc0ufMNdMrB0caq38JQ/FgF4/7RcbcfKzxoFQ=="
+  "resolved" "https://registry.npmjs.org/sass-loader/-/sass-loader-8.0.2.tgz"
+  "version" "8.0.2"
+  dependencies:
+    "clone-deep" "^4.0.1"
+    "loader-utils" "^1.2.3"
+    "neo-async" "^2.6.1"
+    "schema-utils" "^2.6.1"
+    "semver" "^6.3.0"
+
+"sass@^1.3.0", "sass@1.26.9":
+  "integrity" "sha512-t8AkRVi+xvba4yZiLWkJdgJHBFCB3Dh4johniQkPy9ywkgFHNasXFEFP+RG/F6LhQ+aoE4aX+IorIWQjS0esVw=="
+  "resolved" "https://registry.npmjs.org/sass/-/sass-1.26.9.tgz"
+  "version" "1.26.9"
+  dependencies:
+    "chokidar" ">=2.0.0 <4.0.0"
+
+"saucelabs@^1.5.0":
+  "integrity" "sha512-jlX3FGdWvYf4Q3LFfFWS1QvPg3IGCGWxIc8QBFdPTbpTJnt/v17FHXYVAn7C8sHf1yUXo2c7yIM0isDryfYtHQ=="
+  "resolved" "https://registry.npmjs.org/saucelabs/-/saucelabs-1.5.0.tgz"
+  "version" "1.5.0"
+  dependencies:
+    "https-proxy-agent" "^2.2.1"
+
+"sax@>=0.6.0", "sax@1.2.1":
+  "integrity" "sha1-e45lYZCyKOgaZq6nSEgNgozS03o="
+  "resolved" "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz"
+  "version" "1.2.1"
+
+"sax@~1.2.4":
+  "integrity" "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
+  "resolved" "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz"
+  "version" "1.2.4"
+
+"saxes@^5.0.0":
+  "version" "5.0.1"
+  dependencies:
+    "xmlchars" "^2.2.0"
+
+"schema-utils@^1.0.0":
+  "integrity" "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g=="
+  "resolved" "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz"
+  "version" "1.0.0"
+  dependencies:
+    "ajv" "^6.1.0"
+    "ajv-errors" "^1.0.0"
+    "ajv-keywords" "^3.1.0"
+
+"schema-utils@^2.6.1", "schema-utils@^2.6.5", "schema-utils@^2.6.6", "schema-utils@^2.7.0":
+  "version" "2.7.0"
+  dependencies:
+    "@types/json-schema" "^7.0.4"
+    "ajv" "^6.12.2"
+    "ajv-keywords" "^3.4.1"
+
+"scoped-regex@^1.0.0":
+  "integrity" "sha1-o0a7Gs1CB65wvXwMfKnlZra63bg="
+  "resolved" "https://registry.npmjs.org/scoped-regex/-/scoped-regex-1.0.0.tgz"
+  "version" "1.0.0"
+
+"select-hose@^2.0.0":
+  "integrity" "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo="
+  "resolved" "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz"
+  "version" "2.0.0"
+
+"select@^1.1.2":
+  "integrity" "sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0="
+  "resolved" "https://registry.npmjs.org/select/-/select-1.1.2.tgz"
+  "version" "1.1.2"
+
+"selenium-webdriver@^3.0.1", "selenium-webdriver@3.6.0":
+  "integrity" "sha512-WH7Aldse+2P5bbFBO4Gle/nuQOdVwpHMTL6raL3uuBj/vPG07k6uzt3aiahu352ONBr5xXh0hDlM3LhtXPOC4Q=="
+  "resolved" "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-3.6.0.tgz"
+  "version" "3.6.0"
+  dependencies:
+    "jszip" "^3.1.3"
+    "rimraf" "^2.5.4"
+    "tmp" "0.0.30"
+    "xml2js" "^0.4.17"
+
+"selfsigned@^1.10.7":
+  "version" "1.10.8"
+  dependencies:
+    "node-forge" "^0.10.0"
+
+"semver-compare@^1.0.0":
+  "integrity" "sha1-De4hahyUGrN+nvsXiPavxf9VN/w="
+  "resolved" "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz"
+  "version" "1.0.0"
+
+"semver-dsl@^1.0.1":
+  "integrity" "sha1-02eN5VVeimH2Ke7QJTZq5fJzQKA="
+  "resolved" "https://registry.npmjs.org/semver-dsl/-/semver-dsl-1.0.1.tgz"
+  "version" "1.0.1"
+  dependencies:
+    "semver" "^5.3.0"
+
+"semver-intersect@1.4.0":
+  "integrity" "sha512-d8fvGg5ycKAq0+I6nfWeCx6ffaWJCsBYU0H2Rq56+/zFePYfT8mXkB3tWBSjR5BerkHNZ5eTPIk1/LBYas35xQ=="
+  "resolved" "https://registry.npmjs.org/semver-intersect/-/semver-intersect-1.4.0.tgz"
+  "version" "1.4.0"
+  dependencies:
+    "semver" "^5.0.0"
+
+"semver-regex@^2.0.0":
+  "integrity" "sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw=="
+  "resolved" "https://registry.npmjs.org/semver-regex/-/semver-regex-2.0.0.tgz"
+  "version" "2.0.0"
+
+"semver@^5.0.0", "semver@^5.3.0", "semver@^5.4.1", "semver@^5.5.0", "semver@^5.6.0", "semver@2 || 3 || 4 || 5":
+  "integrity" "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
+  "resolved" "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz"
+  "version" "5.7.1"
+
+"semver@^6.0.0":
+  "integrity" "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
+  "resolved" "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz"
+  "version" "6.3.0"
+
+"semver@^6.1.2":
+  "integrity" "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
+  "resolved" "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz"
+  "version" "6.3.0"
+
+"semver@^6.2.0":
+  "integrity" "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
+  "resolved" "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz"
+  "version" "6.3.0"
+
+"semver@^6.3.0":
+  "integrity" "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
+  "resolved" "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz"
+  "version" "6.3.0"
+
+"semver@^7.0.0":
+  "version" "7.3.4"
+  dependencies:
+    "lru-cache" "^6.0.0"
+
+"semver@^7.1.1":
+  "version" "7.3.4"
+  dependencies:
+    "lru-cache" "^6.0.0"
+
+"semver@^7.1.3":
+  "version" "7.3.2"
+
+"semver@^7.2.1":
+  "version" "7.3.2"
+
+"semver@^7.3.2":
+  "version" "7.3.2"
+
+"semver@7.0.0":
+  "integrity" "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A=="
+  "resolved" "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz"
+  "version" "7.0.0"
+
+"semver@7.3.2":
+  "integrity" "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ=="
+  "resolved" "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz"
+  "version" "7.3.2"
+
+"semver@7.x":
+  "version" "7.3.2"
+
+"send@0.16.2":
+  "integrity" "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw=="
+  "resolved" "https://registry.npmjs.org/send/-/send-0.16.2.tgz"
+  "version" "0.16.2"
+  dependencies:
+    "debug" "2.6.9"
+    "depd" "~1.1.2"
+    "destroy" "~1.0.4"
+    "encodeurl" "~1.0.2"
+    "escape-html" "~1.0.3"
+    "etag" "~1.8.1"
+    "fresh" "0.5.2"
+    "http-errors" "~1.6.2"
+    "mime" "1.4.1"
+    "ms" "2.0.0"
+    "on-finished" "~2.3.0"
+    "range-parser" "~1.2.0"
+    "statuses" "~1.4.0"
+
+"send@0.17.1":
+  "integrity" "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg=="
+  "resolved" "https://registry.npmjs.org/send/-/send-0.17.1.tgz"
+  "version" "0.17.1"
+  dependencies:
+    "debug" "2.6.9"
+    "depd" "~1.1.2"
+    "destroy" "~1.0.4"
+    "encodeurl" "~1.0.2"
+    "escape-html" "~1.0.3"
+    "etag" "~1.8.1"
+    "fresh" "0.5.2"
+    "http-errors" "~1.7.2"
+    "mime" "1.6.0"
+    "ms" "2.1.1"
+    "on-finished" "~2.3.0"
+    "range-parser" "~1.2.1"
+    "statuses" "~1.5.0"
+
+"serialize-javascript@^3.1.0":
+  "integrity" "sha512-JIJT1DGiWmIKhzRsG91aS6Ze4sFUrYbltlkg2onR5OrnNM02Kl/hnY/T4FN2omvyeBbQmMJv+K4cPOpGzOTFBg=="
+  "resolved" "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-3.1.0.tgz"
+  "version" "3.1.0"
+  dependencies:
+    "randombytes" "^2.1.0"
+
+"serialize-javascript@^4.0.0":
+  "integrity" "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw=="
+  "resolved" "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz"
+  "version" "4.0.0"
+  dependencies:
+    "randombytes" "^2.1.0"
+
+"serialize-javascript@5.0.1":
+  "integrity" "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA=="
+  "resolved" "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz"
+  "version" "5.0.1"
+  dependencies:
+    "randombytes" "^2.1.0"
+
+"serve-index@^1.9.1", "serve-index@1.9.1":
+  "integrity" "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk="
+  "resolved" "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz"
+  "version" "1.9.1"
+  dependencies:
+    "accepts" "~1.3.4"
+    "batch" "0.6.1"
+    "debug" "2.6.9"
+    "escape-html" "~1.0.3"
+    "http-errors" "~1.6.2"
+    "mime-types" "~2.1.17"
+    "parseurl" "~1.3.2"
+
+"serve-static@1.13.2":
+  "integrity" "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw=="
+  "resolved" "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz"
+  "version" "1.13.2"
+  dependencies:
+    "encodeurl" "~1.0.2"
+    "escape-html" "~1.0.3"
+    "parseurl" "~1.3.2"
+    "send" "0.16.2"
+
+"serve-static@1.14.1":
+  "integrity" "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg=="
+  "resolved" "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz"
+  "version" "1.14.1"
+  dependencies:
+    "encodeurl" "~1.0.2"
+    "escape-html" "~1.0.3"
+    "parseurl" "~1.3.3"
+    "send" "0.17.1"
+
+"server-destroy@1.0.1":
+  "integrity" "sha1-8Tv5KOQrnD55OD5hzDmYtdFObN0="
+  "resolved" "https://registry.npmjs.org/server-destroy/-/server-destroy-1.0.1.tgz"
+  "version" "1.0.1"
+
+"set-blocking@^2.0.0":
+  "integrity" "sha1-BF+XgtARrppoA93TgrJDkrPYkPc="
+  "resolved" "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz"
+  "version" "2.0.0"
+
+"set-getter@^0.1.0":
+  "version" "0.1.1"
+  dependencies:
+    "to-object-path" "^0.3.0"
+
+"set-immediate-shim@~1.0.1":
+  "integrity" "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E="
+  "resolved" "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz"
+  "version" "1.0.1"
+
+"set-value@^2.0.0", "set-value@^2.0.1":
+  "integrity" "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw=="
+  "resolved" "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz"
+  "version" "2.0.1"
+  dependencies:
+    "extend-shallow" "^2.0.1"
+    "is-extendable" "^0.1.1"
+    "is-plain-object" "^2.0.3"
+    "split-string" "^3.0.1"
+
+"setimmediate@^1.0.4":
+  "integrity" "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU="
+  "resolved" "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz"
+  "version" "1.0.5"
+
+"setprototypeof@1.1.0":
+  "integrity" "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ=="
+  "resolved" "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz"
+  "version" "1.1.0"
+
+"setprototypeof@1.1.1":
+  "integrity" "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw=="
+  "resolved" "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz"
+  "version" "1.1.1"
+
+"sha.js@^2.4.0", "sha.js@^2.4.8":
+  "integrity" "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ=="
+  "resolved" "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz"
+  "version" "2.4.11"
+  dependencies:
+    "inherits" "^2.0.1"
+    "safe-buffer" "^5.0.1"
+
+"shallow-clone@^3.0.0":
+  "integrity" "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA=="
+  "resolved" "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz"
+  "version" "3.0.1"
+  dependencies:
+    "kind-of" "^6.0.2"
+
+"shebang-command@^1.2.0":
+  "integrity" "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo="
+  "resolved" "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz"
+  "version" "1.2.0"
+  dependencies:
+    "shebang-regex" "^1.0.0"
+
+"shebang-command@^2.0.0":
+  "integrity" "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="
+  "resolved" "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz"
+  "version" "2.0.0"
+  dependencies:
+    "shebang-regex" "^3.0.0"
+
+"shebang-regex@^1.0.0":
+  "integrity" "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM="
+  "resolved" "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz"
+  "version" "1.0.0"
+
+"shebang-regex@^3.0.0":
+  "integrity" "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="
+  "resolved" "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz"
+  "version" "3.0.0"
+
+"shelljs@^0.8.3", "shelljs@0.8.4":
+  "integrity" "sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ=="
+  "resolved" "https://registry.npmjs.org/shelljs/-/shelljs-0.8.4.tgz"
+  "version" "0.8.4"
+  dependencies:
+    "glob" "^7.0.0"
+    "interpret" "^1.0.0"
+    "rechoir" "^0.6.2"
+
+"shellwords@^0.1.1":
+  "integrity" "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww=="
+  "resolved" "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz"
+  "version" "0.1.1"
+
+"signal-exit@^3.0.0", "signal-exit@^3.0.2":
+  "integrity" "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA=="
+  "resolved" "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz"
+  "version" "3.0.3"
+
+"simple-git@^1.85.0":
+  "integrity" "sha512-xauHm1YqCTom1sC9eOjfq3/9RKiUA9iPnxBbrY2DdL8l4ADMu0jjM5l5lphQP5YWNqAL2aXC/OeuQ76vHtW5fg=="
+  "resolved" "https://registry.npmjs.org/simple-git/-/simple-git-1.132.0.tgz"
+  "version" "1.132.0"
+  dependencies:
+    "debug" "^4.0.1"
+
+"simple-progress-webpack-plugin@1.1.2":
+  "integrity" "sha512-bNQfb3qSqbtsfxg6d0dGechUUJH2lZqKG5+bj2aoJmEA0rSzcm+2JVfC2YgkDABfuGItZ/O5ttt6BssWZW4SNg=="
+  "resolved" "https://registry.npmjs.org/simple-progress-webpack-plugin/-/simple-progress-webpack-plugin-1.1.2.tgz"
+  "version" "1.1.2"
+  dependencies:
+    "chalk" "2.3.x"
+    "figures" "2.0.x"
+    "log-update" "2.3.x"
+
+"simple-swizzle@^0.2.2":
+  "integrity" "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo="
+  "resolved" "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz"
+  "version" "0.2.2"
+  dependencies:
+    "is-arrayish" "^0.3.1"
+
+"sisteransi@^1.0.4":
+  "version" "1.0.5"
+
+"slash@^1.0.0":
+  "integrity" "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU="
+  "resolved" "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz"
+  "version" "1.0.0"
+
+"slash@^2.0.0":
+  "integrity" "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A=="
+  "resolved" "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz"
+  "version" "2.0.0"
+
+"slash@^3.0.0":
+  "integrity" "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q=="
+  "resolved" "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz"
+  "version" "3.0.0"
+
+"slice-ansi@^2.1.0":
+  "integrity" "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ=="
+  "resolved" "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz"
+  "version" "2.1.0"
+  dependencies:
+    "ansi-styles" "^3.2.0"
+    "astral-regex" "^1.0.0"
+    "is-fullwidth-code-point" "^2.0.0"
+
+"slice-ansi@0.0.4":
+  "integrity" "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU="
+  "resolved" "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz"
+  "version" "0.0.4"
+
+"smart-buffer@^4.1.0":
+  "integrity" "sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw=="
+  "resolved" "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.1.0.tgz"
+  "version" "4.1.0"
+
+"snapdragon-node@^2.0.1":
+  "integrity" "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw=="
+  "resolved" "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz"
+  "version" "2.1.1"
+  dependencies:
+    "define-property" "^1.0.0"
+    "isobject" "^3.0.0"
+    "snapdragon-util" "^3.0.1"
+
+"snapdragon-util@^3.0.1":
+  "integrity" "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ=="
+  "resolved" "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz"
+  "version" "3.0.1"
+  dependencies:
+    "kind-of" "^3.2.0"
+
+"snapdragon@^0.8.1":
+  "integrity" "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg=="
+  "resolved" "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz"
+  "version" "0.8.2"
+  dependencies:
+    "base" "^0.11.1"
+    "debug" "^2.2.0"
+    "define-property" "^0.2.5"
+    "extend-shallow" "^2.0.1"
+    "map-cache" "^0.2.2"
+    "source-map" "^0.5.6"
+    "source-map-resolve" "^0.5.0"
+    "use" "^3.1.0"
+
+"socket.io-adapter@~1.1.0":
+  "integrity" "sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g=="
+  "resolved" "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz"
+  "version" "1.1.2"
+
+"socket.io-client@^2.4.0", "socket.io-client@2.4.0":
+  "integrity" "sha512-M6xhnKQHuuZd4Ba9vltCLT9oa+YvTsP8j9NcEiLElfIg8KeYPyhWOes6x4t+LTAC8enQbE/995AdTem2uNyKKQ=="
+  "resolved" "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.4.0.tgz"
+  "version" "2.4.0"
+  dependencies:
+    "backo2" "1.0.2"
+    "component-bind" "1.0.0"
+    "component-emitter" "~1.3.0"
+    "debug" "~3.1.0"
+    "engine.io-client" "~3.5.0"
+    "has-binary2" "~1.0.2"
+    "indexof" "0.0.1"
+    "parseqs" "0.0.6"
+    "parseuri" "0.0.6"
+    "socket.io-parser" "~3.3.0"
+    "to-array" "0.1.4"
+
+"socket.io-parser@~3.3.0":
+  "integrity" "sha512-FJvDBuOALxdCI9qwRrO/Rfp9yfndRtc1jSgVgV8FDraihmSP/MLGD5PEuJrNfjALvcQ+vMDM/33AWOYP/JSjDg=="
+  "resolved" "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.2.tgz"
+  "version" "3.3.2"
+  dependencies:
+    "component-emitter" "~1.3.0"
+    "debug" "~3.1.0"
+    "isarray" "2.0.1"
+
+"socket.io-parser@~3.4.0":
+  "integrity" "sha512-11hMgzL+WCLWf1uFtHSNvliI++tcRUWdoeYuwIl+Axvwy9z2gQM+7nJyN3STj1tLj5JyIUH8/gpDGxzAlDdi0A=="
+  "resolved" "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.4.1.tgz"
+  "version" "3.4.1"
+  dependencies:
+    "component-emitter" "1.2.1"
+    "debug" "~4.1.0"
+    "isarray" "2.0.1"
+
+"socket.io@2.4.0":
+  "integrity" "sha512-9UPJ1UTvKayuQfVv2IQ3k7tCQC/fboDyIK62i99dAQIyHKaBsNdTpwHLgKJ6guRWxRtC9H+138UwpaGuQO9uWQ=="
+  "resolved" "https://registry.npmjs.org/socket.io/-/socket.io-2.4.0.tgz"
+  "version" "2.4.0"
+  dependencies:
+    "debug" "~4.1.0"
+    "engine.io" "~3.5.0"
+    "has-binary2" "~1.0.2"
+    "socket.io-adapter" "~1.1.0"
+    "socket.io-client" "2.4.0"
+    "socket.io-parser" "~3.4.0"
+
+"sockjs-client@1.4.0":
+  "integrity" "sha512-5zaLyO8/nri5cua0VtOrFXBPK1jbL4+1cebT/mmKA1E1ZXOvJrII75bPu0l0k843G/+iAbhEqzyKr0w/eCCj7g=="
+  "resolved" "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.4.0.tgz"
+  "version" "1.4.0"
+  dependencies:
+    "debug" "^3.2.5"
+    "eventsource" "^1.0.7"
+    "faye-websocket" "~0.11.1"
+    "inherits" "^2.0.3"
+    "json3" "^3.3.2"
+    "url-parse" "^1.4.3"
+
+"sockjs@0.3.20":
+  "integrity" "sha512-SpmVOVpdq0DJc0qArhF3E5xsxvaiqGNb73XfgBpK1y3UD5gs8DSo8aCTsuT5pX8rssdc2NDIzANwP9eCAiSdTA=="
+  "resolved" "https://registry.npmjs.org/sockjs/-/sockjs-0.3.20.tgz"
+  "version" "0.3.20"
+  dependencies:
+    "faye-websocket" "^0.10.0"
+    "uuid" "^3.4.0"
+    "websocket-driver" "0.6.5"
+
+"socks-proxy-agent@^4.0.0":
+  "integrity" "sha512-NT6syHhI9LmuEMSK6Kd2V7gNv5KFZoLE7V5udWmn0de+3Mkj3UMA/AJPLyeNUVmElCurSHtUdM3ETpR3z770Wg=="
+  "resolved" "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-4.0.2.tgz"
+  "version" "4.0.2"
+  dependencies:
+    "agent-base" "~4.2.1"
+    "socks" "~2.3.2"
+
+"socks@~2.3.2":
+  "integrity" "sha512-o5t52PCNtVdiOvzMry7wU4aOqYWL0PeCXRWBEiJow4/i/wr+wpsJQ9awEu1EonLIqsfGd5qSgDdxEOvCdmBEpA=="
+  "resolved" "https://registry.npmjs.org/socks/-/socks-2.3.3.tgz"
+  "version" "2.3.3"
+  dependencies:
+    "ip" "1.1.5"
+    "smart-buffer" "^4.1.0"
+
+"sort-keys@^1.0.0":
+  "integrity" "sha1-RBttTTRnmPG05J6JIK37oOVD+a0="
+  "resolved" "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz"
+  "version" "1.1.2"
+  dependencies:
+    "is-plain-obj" "^1.0.0"
+
+"source-list-map@^2.0.0":
+  "integrity" "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw=="
+  "resolved" "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz"
+  "version" "2.0.1"
+
+"source-map-resolve@^0.5.0":
+  "integrity" "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw=="
+  "resolved" "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz"
+  "version" "0.5.3"
+  dependencies:
+    "atob" "^2.1.2"
+    "decode-uri-component" "^0.2.0"
+    "resolve-url" "^0.2.1"
+    "source-map-url" "^0.4.0"
+    "urix" "^0.1.0"
+
+"source-map-support@^0.5.17", "source-map-support@^0.5.6", "source-map-support@~0.5.12":
+  "integrity" "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw=="
+  "resolved" "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz"
+  "version" "0.5.19"
+  dependencies:
+    "buffer-from" "^1.0.0"
+    "source-map" "^0.6.0"
+
+"source-map-support@~0.4.0":
+  "integrity" "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA=="
+  "resolved" "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz"
+  "version" "0.4.18"
+  dependencies:
+    "source-map" "^0.5.6"
+
+"source-map-url@^0.4.0":
+  "version" "0.4.0"
+
+"source-map@^0.5.0", "source-map@^0.5.6", "source-map@^0.5.7":
+  "integrity" "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
+  "resolved" "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz"
+  "version" "0.5.7"
+
+"source-map@^0.6.0":
+  "integrity" "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
+  "resolved" "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz"
+  "version" "0.6.1"
+
+"source-map@^0.6.1":
+  "integrity" "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
+  "resolved" "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz"
+  "version" "0.6.1"
+
+"source-map@^0.7.3":
+  "integrity" "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ=="
+  "resolved" "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz"
+  "version" "0.7.3"
+
+"source-map@~0.6.0":
+  "integrity" "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
+  "resolved" "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz"
+  "version" "0.6.1"
+
+"source-map@~0.6.1":
+  "integrity" "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
+  "resolved" "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz"
+  "version" "0.6.1"
+
+"source-map@0.7.3":
+  "integrity" "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ=="
+  "resolved" "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz"
+  "version" "0.7.3"
+
+"sourcemap-codec@^1.4.4", "sourcemap-codec@^1.4.8":
+  "integrity" "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA=="
+  "resolved" "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz"
+  "version" "1.4.8"
+
+"spawn-sync@^1.0.15":
+  "integrity" "sha1-sAeZVX63+wyDdsKdROih6mfldHY="
+  "resolved" "https://registry.npmjs.org/spawn-sync/-/spawn-sync-1.0.15.tgz"
+  "version" "1.0.15"
+  dependencies:
+    "concat-stream" "^1.4.7"
+    "os-shim" "^0.1.2"
+
+"spdx-correct@^3.0.0":
+  "integrity" "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w=="
+  "resolved" "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz"
+  "version" "3.1.1"
+  dependencies:
+    "spdx-expression-parse" "^3.0.0"
+    "spdx-license-ids" "^3.0.0"
+
+"spdx-exceptions@^2.1.0":
+  "integrity" "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A=="
+  "resolved" "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz"
+  "version" "2.3.0"
+
+"spdx-expression-parse@^3.0.0":
+  "integrity" "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q=="
+  "resolved" "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz"
+  "version" "3.0.1"
+  dependencies:
+    "spdx-exceptions" "^2.1.0"
+    "spdx-license-ids" "^3.0.0"
+
+"spdx-license-ids@^3.0.0":
+  "version" "3.0.5"
+
+"spdy-transport@^3.0.0":
+  "integrity" "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw=="
+  "resolved" "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz"
+  "version" "3.0.0"
+  dependencies:
+    "debug" "^4.1.0"
+    "detect-node" "^2.0.4"
+    "hpack.js" "^2.1.6"
+    "obuf" "^1.1.2"
+    "readable-stream" "^3.0.6"
+    "wbuf" "^1.7.3"
+
+"spdy@^4.0.2":
+  "integrity" "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA=="
+  "resolved" "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz"
+  "version" "4.0.2"
+  dependencies:
+    "debug" "^4.1.0"
+    "handle-thing" "^2.0.0"
+    "http-deceiver" "^1.2.7"
+    "select-hose" "^2.0.0"
+    "spdy-transport" "^3.0.0"
+
+"split-string@^3.0.1", "split-string@^3.0.2":
+  "integrity" "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw=="
+  "resolved" "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz"
+  "version" "3.1.0"
+  dependencies:
+    "extend-shallow" "^3.0.0"
+
+"sprintf-js@^1.1.2":
+  "integrity" "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug=="
+  "resolved" "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz"
+  "version" "1.1.2"
+
+"sprintf-js@~1.0.2":
+  "integrity" "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw="
+  "resolved" "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz"
+  "version" "1.0.3"
+
+"sshpk@^1.7.0":
+  "integrity" "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg=="
+  "resolved" "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz"
+  "version" "1.16.1"
+  dependencies:
+    "asn1" "~0.2.3"
+    "assert-plus" "^1.0.0"
+    "bcrypt-pbkdf" "^1.0.0"
+    "dashdash" "^1.12.0"
+    "ecc-jsbn" "~0.1.1"
+    "getpass" "^0.1.1"
+    "jsbn" "~0.1.0"
+    "safer-buffer" "^2.0.2"
+    "tweetnacl" "~0.14.0"
+
+"ssri@^6.0.0", "ssri@^6.0.1":
+  "integrity" "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q=="
+  "resolved" "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz"
+  "version" "6.0.2"
+  dependencies:
+    "figgy-pudding" "^3.5.1"
+
+"ssri@^8.0.0":
+  "version" "8.0.1"
+  dependencies:
+    "minipass" "^3.1.1"
+
+"stable@^0.1.8":
+  "integrity" "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w=="
+  "resolved" "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz"
+  "version" "0.1.8"
+
+"stack-trace@0.0.x":
+  "integrity" "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA="
+  "resolved" "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz"
+  "version" "0.0.10"
+
+"stack-utils@^2.0.2":
+  "version" "2.0.2"
+  dependencies:
+    "escape-string-regexp" "^2.0.0"
+
+"stackframe@^1.1.1":
+  "integrity" "sha512-GrdeshiRmS1YLMYgzF16olf2jJ/IzxXY9lhKOskuVziubpTYcYqyOwYeJKzQkwy7uN0fYSsbsC4RQaXf9LCrYA=="
+  "resolved" "https://registry.npmjs.org/stackframe/-/stackframe-1.2.0.tgz"
+  "version" "1.2.0"
+
+"staged-git-files@1.1.2":
+  "integrity" "sha512-0Eyrk6uXW6tg9PYkhi/V/J4zHp33aNyi2hOCmhFLqLTIhbgqWn5jlSzI+IU0VqrZq6+DbHcabQl/WP6P3BG0QA=="
+  "resolved" "https://registry.npmjs.org/staged-git-files/-/staged-git-files-1.1.2.tgz"
+  "version" "1.1.2"
+
+"static-extend@^0.1.1":
+  "integrity" "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY="
+  "resolved" "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz"
+  "version" "0.1.2"
+  dependencies:
+    "define-property" "^0.2.5"
+    "object-copy" "^0.1.0"
+
+"statuses@>= 1.4.0 < 2", "statuses@~1.4.0":
+  "integrity" "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew=="
+  "resolved" "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz"
+  "version" "1.4.0"
+
+"statuses@>= 1.5.0 < 2":
+  "integrity" "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
+  "resolved" "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz"
+  "version" "1.5.0"
+
+"statuses@~1.3.1":
+  "integrity" "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4="
+  "resolved" "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz"
+  "version" "1.3.1"
+
+"statuses@~1.5.0":
+  "integrity" "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
+  "resolved" "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz"
+  "version" "1.5.0"
+
+"stealthy-require@^1.1.1":
+  "version" "1.1.1"
+
+"stream-browserify@^2.0.1":
+  "integrity" "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg=="
+  "resolved" "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz"
+  "version" "2.0.2"
+  dependencies:
+    "inherits" "~2.0.1"
+    "readable-stream" "^2.0.2"
+
+"stream-each@^1.1.0":
+  "integrity" "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw=="
+  "resolved" "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz"
+  "version" "1.2.3"
+  dependencies:
+    "end-of-stream" "^1.1.0"
+    "stream-shift" "^1.0.0"
+
+"stream-http@^2.7.2":
+  "integrity" "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw=="
+  "resolved" "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz"
+  "version" "2.8.3"
+  dependencies:
+    "builtin-status-codes" "^3.0.0"
+    "inherits" "^2.0.1"
+    "readable-stream" "^2.3.6"
+    "to-arraybuffer" "^1.0.0"
+    "xtend" "^4.0.0"
+
+"stream-shift@^1.0.0":
+  "integrity" "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ=="
+  "resolved" "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz"
+  "version" "1.0.1"
+
+"stream-throttle@^0.1.3":
+  "integrity" "sha1-rdV8jXzHOoFjDTHNVdOWHPr7qcM="
+  "resolved" "https://registry.npmjs.org/stream-throttle/-/stream-throttle-0.1.3.tgz"
+  "version" "0.1.3"
+  dependencies:
+    "commander" "^2.2.0"
+    "limiter" "^1.0.5"
+
+"streamfilter@^3.0.0":
+  "integrity" "sha512-kvKNfXCmUyC8lAXSSHCIXBUlo/lhsLcCU/OmzACZYpRUdtKIH68xYhm/+HI15jFJYtNJGYtCgn2wmIiExY1VwA=="
+  "resolved" "https://registry.npmjs.org/streamfilter/-/streamfilter-3.0.0.tgz"
+  "version" "3.0.0"
+  dependencies:
+    "readable-stream" "^3.0.6"
+
+"strict-uri-encode@^1.0.0":
+  "integrity" "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM="
+  "resolved" "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz"
+  "version" "1.1.0"
+
+"string_decoder@^1.0.0", "string_decoder@^1.1.1", "string_decoder@~1.1.1":
+  "integrity" "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="
+  "resolved" "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz"
+  "version" "1.1.1"
+  dependencies:
+    "safe-buffer" "~5.1.0"
+
+"string-argv@^0.0.2":
+  "integrity" "sha1-2sMECGkMIfPDYwo/86BYd73L1zY="
+  "resolved" "https://registry.npmjs.org/string-argv/-/string-argv-0.0.2.tgz"
+  "version" "0.0.2"
+
+"string-length@^4.0.1":
+  "version" "4.0.1"
+  dependencies:
+    "char-regex" "^1.0.2"
+    "strip-ansi" "^6.0.0"
+
+"string-template@~0.2.1":
+  "integrity" "sha1-QpMuWYo1LQH8IuwzZ9nYTuxsmt0="
+  "resolved" "https://registry.npmjs.org/string-template/-/string-template-0.2.1.tgz"
+  "version" "0.2.1"
+
+"string-width@^1.0.1":
+  "integrity" "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M="
+  "resolved" "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz"
+  "version" "1.0.2"
+  dependencies:
+    "code-point-at" "^1.0.0"
+    "is-fullwidth-code-point" "^1.0.0"
+    "strip-ansi" "^3.0.0"
+
+"string-width@^1.0.2 || 2":
+  "integrity" "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw=="
+  "resolved" "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz"
+  "version" "2.1.1"
+  dependencies:
+    "is-fullwidth-code-point" "^2.0.0"
+    "strip-ansi" "^4.0.0"
+
+"string-width@^2.0.0":
+  "integrity" "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw=="
+  "resolved" "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz"
+  "version" "2.1.1"
+  dependencies:
+    "is-fullwidth-code-point" "^2.0.0"
+    "strip-ansi" "^4.0.0"
+
+"string-width@^2.1.0":
+  "integrity" "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw=="
+  "resolved" "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz"
+  "version" "2.1.1"
+  dependencies:
+    "is-fullwidth-code-point" "^2.0.0"
+    "strip-ansi" "^4.0.0"
+
+"string-width@^2.1.1":
+  "integrity" "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw=="
+  "resolved" "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz"
+  "version" "2.1.1"
+  dependencies:
+    "is-fullwidth-code-point" "^2.0.0"
+    "strip-ansi" "^4.0.0"
+
+"string-width@^3.0.0", "string-width@^3.1.0":
+  "integrity" "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w=="
+  "resolved" "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz"
+  "version" "3.1.0"
+  dependencies:
+    "emoji-regex" "^7.0.1"
+    "is-fullwidth-code-point" "^2.0.0"
+    "strip-ansi" "^5.1.0"
+
+"string-width@^4.1.0", "string-width@^4.2.0":
+  "version" "4.2.0"
+  dependencies:
+    "emoji-regex" "^8.0.0"
+    "is-fullwidth-code-point" "^3.0.0"
+    "strip-ansi" "^6.0.0"
+
+"string.prototype.trimend@^1.0.4":
+  "integrity" "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A=="
+  "resolved" "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz"
+  "version" "1.0.4"
+  dependencies:
+    "call-bind" "^1.0.2"
+    "define-properties" "^1.1.3"
+
+"string.prototype.trimstart@^1.0.4":
+  "integrity" "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw=="
+  "resolved" "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz"
+  "version" "1.0.4"
+  dependencies:
+    "call-bind" "^1.0.2"
+    "define-properties" "^1.1.3"
+
+"stringify-object@^3.2.2", "stringify-object@^3.3.0":
+  "integrity" "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw=="
+  "resolved" "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz"
+  "version" "3.3.0"
+  dependencies:
+    "get-own-enumerable-property-symbols" "^3.0.0"
+    "is-obj" "^1.0.1"
+    "is-regexp" "^1.0.0"
+
+"strip-ansi@^3.0.0", "strip-ansi@^3.0.1":
+  "integrity" "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8="
+  "resolved" "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz"
+  "version" "3.0.1"
+  dependencies:
+    "ansi-regex" "^2.0.0"
+
+"strip-ansi@^3.0.1":
+  "integrity" "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8="
+  "resolved" "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz"
+  "version" "3.0.1"
+  dependencies:
+    "ansi-regex" "^2.0.0"
+
+"strip-ansi@^4.0.0":
+  "integrity" "sha1-qEeQIusaw2iocTibY1JixQXuNo8="
+  "resolved" "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz"
+  "version" "4.0.0"
+  dependencies:
+    "ansi-regex" "^3.0.0"
+
+"strip-ansi@^5.0.0", "strip-ansi@^5.1.0", "strip-ansi@^5.2.0":
+  "integrity" "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA=="
+  "resolved" "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz"
+  "version" "5.2.0"
+  dependencies:
+    "ansi-regex" "^4.1.0"
+
+"strip-ansi@^6.0.0":
+  "integrity" "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w=="
+  "resolved" "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz"
+  "version" "6.0.0"
+  dependencies:
+    "ansi-regex" "^5.0.0"
+
+"strip-bom-buf@^1.0.0":
+  "integrity" "sha1-HLRar1dTD0yvhsf3UXnSyaUd1XI="
+  "resolved" "https://registry.npmjs.org/strip-bom-buf/-/strip-bom-buf-1.0.0.tgz"
+  "version" "1.0.0"
+  dependencies:
+    "is-utf8" "^0.2.1"
+
+"strip-bom-stream@^2.0.0":
+  "integrity" "sha1-+H217yYT9paKpUWr/h7HKLaoKco="
+  "resolved" "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-2.0.0.tgz"
+  "version" "2.0.0"
+  dependencies:
+    "first-chunk-stream" "^2.0.0"
+    "strip-bom" "^2.0.0"
+
+"strip-bom@^2.0.0":
+  "integrity" "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4="
+  "resolved" "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz"
+  "version" "2.0.0"
+  dependencies:
+    "is-utf8" "^0.2.0"
+
+"strip-bom@^4.0.0":
+  "integrity" "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w=="
+  "resolved" "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz"
+  "version" "4.0.0"
+
+"strip-comments@^1.0.2":
+  "integrity" "sha512-kL97alc47hoyIQSV165tTt9rG5dn4w1dNnBhOQ3bOU1Nc1hel09jnXANaHJ7vzHLd4Ju8kseDGzlev96pghLFw=="
+  "resolved" "https://registry.npmjs.org/strip-comments/-/strip-comments-1.0.2.tgz"
+  "version" "1.0.2"
+  dependencies:
+    "babel-extract-comments" "^1.0.0"
+    "babel-plugin-transform-object-rest-spread" "^6.26.0"
+
+"strip-eof@^1.0.0":
+  "integrity" "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8="
+  "resolved" "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz"
+  "version" "1.0.0"
+
+"strip-final-newline@^2.0.0":
+  "integrity" "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA=="
+  "resolved" "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz"
+  "version" "2.0.0"
+
+"strip-indent@^3.0.0":
+  "integrity" "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ=="
+  "resolved" "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz"
+  "version" "3.0.0"
+  dependencies:
+    "min-indent" "^1.0.0"
+
+"strip-json-comments@^3.0.1":
+  "version" "3.1.0"
+
+"strip-json-comments@3.1.1":
+  "integrity" "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="
+  "resolved" "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz"
+  "version" "3.1.1"
+
+"style-loader@1.2.1":
+  "integrity" "sha512-ByHSTQvHLkWE9Ir5+lGbVOXhxX10fbprhLvdg96wedFZb4NDekDPxVKv5Fwmio+QcMlkkNfuK+5W1peQ5CUhZg=="
+  "resolved" "https://registry.npmjs.org/style-loader/-/style-loader-1.2.1.tgz"
+  "version" "1.2.1"
+  dependencies:
+    "loader-utils" "^2.0.0"
+    "schema-utils" "^2.6.6"
+
+"stylehacks@^4.0.0":
+  "integrity" "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g=="
+  "resolved" "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz"
+  "version" "4.0.3"
+  dependencies:
+    "browserslist" "^4.0.0"
+    "postcss" "^7.0.0"
+    "postcss-selector-parser" "^3.0.0"
+
+"supports-color@^2.0.0":
+  "integrity" "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc="
+  "resolved" "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz"
+  "version" "2.0.0"
+
+"supports-color@^5.3.0":
+  "integrity" "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow=="
+  "resolved" "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz"
+  "version" "5.5.0"
+  dependencies:
+    "has-flag" "^3.0.0"
+
+"supports-color@^6.1.0":
+  "integrity" "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ=="
+  "resolved" "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz"
+  "version" "6.1.0"
+  dependencies:
+    "has-flag" "^3.0.0"
+
+"supports-color@^7.0.0":
+  "version" "7.1.0"
+  dependencies:
+    "has-flag" "^4.0.0"
+
+"supports-color@^7.1.0":
+  "integrity" "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="
+  "resolved" "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz"
+  "version" "7.2.0"
+  dependencies:
+    "has-flag" "^4.0.0"
+
+"supports-color@8.1.1":
+  "integrity" "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="
+  "resolved" "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz"
+  "version" "8.1.1"
+  dependencies:
+    "has-flag" "^4.0.0"
+
+"supports-hyperlinks@^2.0.0":
+  "version" "2.1.0"
+  dependencies:
+    "has-flag" "^4.0.0"
+    "supports-color" "^7.0.0"
+
+"svgo@^1.0.0":
+  "integrity" "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw=="
+  "resolved" "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz"
+  "version" "1.3.2"
+  dependencies:
+    "chalk" "^2.4.1"
+    "coa" "^2.0.2"
+    "css-select" "^2.0.0"
+    "css-select-base-adapter" "^0.1.1"
+    "css-tree" "1.0.0-alpha.37"
+    "csso" "^4.0.2"
+    "js-yaml" "^3.13.1"
+    "mkdirp" "~0.5.1"
+    "object.values" "^1.1.0"
+    "sax" "~1.2.4"
+    "stable" "^0.1.8"
+    "unquote" "~1.1.1"
+    "util.promisify" "~1.0.0"
+
+"swagger-ts-generator@^1.2.11":
+  "integrity" "sha512-LgRgE4cG84QTvoye/PEhB2czpKO2IazYuyhalYE7HeHFcf3yZfQu/Hz9lj605TnxtOhXBEqkuzwKgnyGhaTyDQ=="
+  "resolved" "https://registry.npmjs.org/swagger-ts-generator/-/swagger-ts-generator-1.2.11.tgz"
+  "version" "1.2.11"
+  dependencies:
+    "chalk" "^4.0.0"
+    "fs" "0.0.2"
+    "handlebars" "^4.7.6"
+    "lodash" "^4.17.15"
+    "moment" "^2.24.0"
+    "path" "^0.12.7"
+
+"swagger-ui-dist@3.25.1":
+  "integrity" "sha512-Sw/K95j1pT9TZtLKiHDEml7YqcXC9thTTQjxrvNgd9j1KzOIxpo/5lhHuUMAN/hxVAHetzmcBcQaBjywRXog8w=="
+  "resolved" "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-3.25.1.tgz"
+  "version" "3.25.1"
+
+"symbol-observable@^1.1.0", "symbol-observable@1.2.0":
+  "integrity" "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ=="
+  "resolved" "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz"
+  "version" "1.2.0"
+
+"symbol-observable@1.0.1":
+  "integrity" "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ="
+  "resolved" "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz"
+  "version" "1.0.1"
+
+"symbol-tree@^3.2.4":
+  "integrity" "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw=="
+  "resolved" "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz"
+  "version" "3.2.4"
+
+"synchronous-promise@^2.0.6":
+  "version" "2.0.13"
+
+"table@^5.2.3":
+  "integrity" "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug=="
+  "resolved" "https://registry.npmjs.org/table/-/table-5.4.6.tgz"
+  "version" "5.4.6"
+  dependencies:
+    "ajv" "^6.10.2"
+    "lodash" "^4.17.14"
+    "slice-ansi" "^2.1.0"
+    "string-width" "^3.0.0"
+
+"tabtab@2.2.2":
+  "integrity" "sha1-egR/FDsBC0y9MfhX6ClhUSy/ThQ="
+  "resolved" "https://registry.npmjs.org/tabtab/-/tabtab-2.2.2.tgz"
+  "version" "2.2.2"
+  dependencies:
+    "debug" "^2.2.0"
+    "inquirer" "^1.0.2"
+    "lodash.difference" "^4.5.0"
+    "lodash.uniq" "^4.5.0"
+    "minimist" "^1.2.0"
+    "mkdirp" "^0.5.1"
+    "npmlog" "^2.0.3"
+    "object-assign" "^4.1.0"
+
+"tapable@^1.0.0", "tapable@^1.1.3":
+  "integrity" "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA=="
+  "resolved" "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz"
+  "version" "1.1.3"
+
+"tar@^4.4.10":
+  "integrity" "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA=="
+  "resolved" "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz"
+  "version" "4.4.13"
+  dependencies:
+    "chownr" "^1.1.1"
+    "fs-minipass" "^1.2.5"
+    "minipass" "^2.8.6"
+    "minizlib" "^1.2.1"
+    "mkdirp" "^0.5.0"
+    "safe-buffer" "^5.1.2"
+    "yallist" "^3.0.3"
+
+"tar@^6.0.2":
+  "version" "6.0.2"
+  dependencies:
+    "chownr" "^2.0.0"
+    "fs-minipass" "^2.0.0"
+    "minipass" "^3.0.0"
+    "minizlib" "^2.1.0"
+    "mkdirp" "^1.0.3"
+    "yallist" "^4.0.0"
+
+"temp-dir@^1.0.0":
+  "integrity" "sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0="
+  "resolved" "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz"
+  "version" "1.0.0"
+
+"tempy@^0.3.0":
+  "integrity" "sha512-WrH/pui8YCwmeiAoxV+lpRH9HpRtgBhSR2ViBPgpGb/wnYDzp21R4MN45fsCGvLROvY67o3byhJRYRONJyImVQ=="
+  "resolved" "https://registry.npmjs.org/tempy/-/tempy-0.3.0.tgz"
+  "version" "0.3.0"
+  dependencies:
+    "temp-dir" "^1.0.0"
+    "type-fest" "^0.3.1"
+    "unique-string" "^1.0.0"
+
+"terminal-link@^2.0.0":
+  "integrity" "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ=="
+  "resolved" "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz"
+  "version" "2.1.1"
+  dependencies:
+    "ansi-escapes" "^4.2.1"
+    "supports-hyperlinks" "^2.0.0"
+
+"terser-webpack-plugin@^1.4.3":
+  "version" "1.4.4"
+  dependencies:
+    "cacache" "^12.0.2"
+    "find-cache-dir" "^2.1.0"
+    "is-wsl" "^1.1.0"
+    "schema-utils" "^1.0.0"
+    "serialize-javascript" "^3.1.0"
+    "source-map" "^0.6.1"
+    "terser" "^4.1.2"
+    "webpack-sources" "^1.4.0"
+    "worker-farm" "^1.7.0"
+
+"terser-webpack-plugin@3.0.6":
+  "integrity" "sha512-z3HLOOPUHkCNGkeEHqqiMAIy1pjpHwS1o+i6Zn0Ws3EAvHJj46737efNNEvJ0Vx9BdDQM83d56qySDJOSORA0A=="
+  "resolved" "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-3.0.6.tgz"
+  "version" "3.0.6"
+  dependencies:
+    "cacache" "^15.0.4"
+    "find-cache-dir" "^3.3.1"
+    "jest-worker" "^26.0.0"
+    "p-limit" "^3.0.1"
+    "schema-utils" "^2.6.6"
+    "serialize-javascript" "^4.0.0"
+    "source-map" "^0.6.1"
+    "terser" "^4.8.0"
+    "webpack-sources" "^1.4.3"
+
+"terser@^4.1.2", "terser@^4.6.2", "terser@^4.6.3", "terser@^4.8.0":
+  "integrity" "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw=="
+  "resolved" "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz"
+  "version" "4.8.0"
+  dependencies:
+    "commander" "^2.20.0"
+    "source-map" "~0.6.1"
+    "source-map-support" "~0.5.12"
+
+"test-exclude@^6.0.0":
+  "integrity" "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w=="
+  "resolved" "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz"
+  "version" "6.0.0"
+  dependencies:
+    "@istanbuljs/schema" "^0.1.2"
+    "glob" "^7.1.4"
+    "minimatch" "^3.0.4"
+
+"test@^0.6.0":
+  "integrity" "sha1-WYasRF7Bd1QyJRLRBLoyyKY+k44="
+  "resolved" "https://registry.npmjs.org/test/-/test-0.6.0.tgz"
+  "version" "0.6.0"
+  dependencies:
+    "ansi-font" "0.0.2"
+
+"text-hex@1.0.x":
+  "integrity" "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg=="
+  "resolved" "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz"
+  "version" "1.0.0"
+
+"text-table@^0.2.0":
+  "integrity" "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ="
+  "resolved" "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz"
+  "version" "0.2.0"
+
+"textextensions@^2.5.0":
+  "integrity" "sha512-49WtAWS+tcsy93dRt6P0P3AMD2m5PvXRhuEA0kaXos5ZLlujtYmpmFsB+QvWUSxE1ZsstmYXfQ7L40+EcQgpAQ=="
+  "resolved" "https://registry.npmjs.org/textextensions/-/textextensions-2.6.0.tgz"
+  "version" "2.6.0"
+
+"tfunk@^4.0.0":
+  "integrity" "sha512-eJQ0dGfDIzWNiFNYFVjJ+Ezl/GmwHaFTBTjrtqNPW0S7cuVDBrZrmzUz6VkMeCR4DZFqhd4YtLwsw3i2wYHswQ=="
+  "resolved" "https://registry.npmjs.org/tfunk/-/tfunk-4.0.0.tgz"
+  "version" "4.0.0"
+  dependencies:
+    "chalk" "^1.1.3"
+    "dlv" "^1.1.3"
+
+"then-request@6.0.2":
+  "integrity" "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA=="
+  "resolved" "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz"
+  "version" "6.0.2"
+  dependencies:
+    "@types/concat-stream" "^1.6.0"
+    "@types/form-data" "0.0.33"
+    "@types/node" "^8.0.0"
+    "@types/qs" "^6.2.31"
+    "caseless" "~0.12.0"
+    "concat-stream" "^1.6.0"
+    "form-data" "^2.2.0"
+    "http-basic" "^8.1.1"
+    "http-response-object" "^3.0.1"
+    "promise" "^8.0.0"
+    "qs" "^6.4.0"
+
+"thread-loader@2.1.3":
+  "integrity" "sha512-wNrVKH2Lcf8ZrWxDF/khdlLlsTMczdcwPA9VEK4c2exlEPynYWxi9op3nPTo5lAnDIkE0rQEB3VBP+4Zncc9Hg=="
+  "resolved" "https://registry.npmjs.org/thread-loader/-/thread-loader-2.1.3.tgz"
+  "version" "2.1.3"
+  dependencies:
+    "loader-runner" "^2.3.1"
+    "loader-utils" "^1.1.0"
+    "neo-async" "^2.6.0"
+
+"throat@^5.0.0":
+  "integrity" "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA=="
+  "resolved" "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz"
+  "version" "5.0.0"
+
+"through@^2.3.6", "through@>=2.2.7 <3", "through@X.X.X":
+  "integrity" "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU="
+  "resolved" "https://registry.npmjs.org/through/-/through-2.3.8.tgz"
+  "version" "2.3.8"
+
+"through2@^2.0.0":
+  "integrity" "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ=="
+  "resolved" "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz"
+  "version" "2.0.5"
+  dependencies:
+    "readable-stream" "~2.3.6"
+    "xtend" "~4.0.1"
+
+"through2@^3.0.0":
+  "integrity" "sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ=="
+  "resolved" "https://registry.npmjs.org/through2/-/through2-3.0.2.tgz"
+  "version" "3.0.2"
+  dependencies:
+    "inherits" "^2.0.4"
+    "readable-stream" "2 || 3"
+
+"through2@^3.0.1", "through2@^3.0.2":
+  "integrity" "sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ=="
+  "resolved" "https://registry.npmjs.org/through2/-/through2-3.0.2.tgz"
+  "version" "3.0.2"
+  dependencies:
+    "inherits" "^2.0.4"
+    "readable-stream" "2 || 3"
+
+"through2@3.0.2":
+  "integrity" "sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ=="
+  "resolved" "https://registry.npmjs.org/through2/-/through2-3.0.2.tgz"
+  "version" "3.0.2"
+  dependencies:
+    "inherits" "^2.0.4"
+    "readable-stream" "2 || 3"
+
+"thunky@^1.0.2":
+  "integrity" "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA=="
+  "resolved" "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz"
+  "version" "1.1.0"
+
+"timed-out@^4.0.0":
+  "integrity" "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8="
+  "resolved" "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz"
+  "version" "4.0.1"
+
+"timers-browserify@^2.0.4":
+  "version" "2.0.11"
+  dependencies:
+    "setimmediate" "^1.0.4"
+
+"timsort@^0.3.0":
+  "integrity" "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q="
+  "resolved" "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz"
+  "version" "0.3.0"
+
+"tiny-emitter@^2.0.0":
+  "integrity" "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q=="
+  "resolved" "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz"
+  "version" "2.1.0"
+
+"tmp@^0.0.29":
+  "integrity" "sha1-8lEl/w3Z2jzLDC3Tce4SiLuRKMA="
+  "resolved" "https://registry.npmjs.org/tmp/-/tmp-0.0.29.tgz"
+  "version" "0.0.29"
+  dependencies:
+    "os-tmpdir" "~1.0.1"
+
+"tmp@^0.0.33":
+  "integrity" "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw=="
+  "resolved" "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz"
+  "version" "0.0.33"
+  dependencies:
+    "os-tmpdir" "~1.0.2"
+
+"tmp@0.0.30":
+  "integrity" "sha1-ckGdSovn1s51FI/YsyTlk6cRwu0="
+  "resolved" "https://registry.npmjs.org/tmp/-/tmp-0.0.30.tgz"
+  "version" "0.0.30"
+  dependencies:
+    "os-tmpdir" "~1.0.1"
+
+"tmpl@1.0.x":
+  "integrity" "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE="
+  "resolved" "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz"
+  "version" "1.0.4"
+
+"to-array@0.1.4":
+  "integrity" "sha1-F+bBH3PdTz10zaek/zI46a2b+JA="
+  "resolved" "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz"
+  "version" "0.1.4"
+
+"to-arraybuffer@^1.0.0":
+  "integrity" "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M="
+  "resolved" "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz"
+  "version" "1.0.1"
+
+"to-fast-properties@^2.0.0":
+  "integrity" "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4="
+  "resolved" "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz"
+  "version" "2.0.0"
+
+"to-object-path@^0.3.0":
+  "integrity" "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68="
+  "resolved" "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz"
+  "version" "0.3.0"
+  dependencies:
+    "kind-of" "^3.0.2"
+
+"to-regex-range@^2.1.0":
+  "integrity" "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg="
+  "resolved" "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz"
+  "version" "2.1.1"
+  dependencies:
+    "is-number" "^3.0.0"
+    "repeat-string" "^1.6.1"
+
+"to-regex-range@^5.0.1":
+  "integrity" "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="
+  "resolved" "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz"
+  "version" "5.0.1"
+  dependencies:
+    "is-number" "^7.0.0"
+
+"to-regex@^3.0.1", "to-regex@^3.0.2":
+  "integrity" "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw=="
+  "resolved" "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz"
+  "version" "3.0.2"
+  dependencies:
+    "define-property" "^2.0.2"
+    "extend-shallow" "^3.0.2"
+    "regex-not" "^1.0.2"
+    "safe-regex" "^1.1.0"
+
+"to-string-loader@1.1.6":
+  "integrity" "sha512-VNg62//PS1WfNwrK3n7t6wtK5Vdtx/qeYLLEioW46VMlYUwAYT6wnfB+OwS2FMTCalIHu0tk79D3RXX8ttmZTQ=="
+  "resolved" "https://registry.npmjs.org/to-string-loader/-/to-string-loader-1.1.6.tgz"
+  "version" "1.1.6"
+  dependencies:
+    "loader-utils" "^1.0.0"
+
+"toidentifier@1.0.0":
+  "integrity" "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw=="
+  "resolved" "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz"
+  "version" "1.0.0"
+
+"toposort@^2.0.2":
+  "integrity" "sha1-riF2gXXRVZ1IvvNUILL0li8JwzA="
+  "resolved" "https://registry.npmjs.org/toposort/-/toposort-2.0.2.tgz"
+  "version" "2.0.2"
+
+"tough-cookie@^2.3.3", "tough-cookie@~2.5.0":
+  "integrity" "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g=="
+  "resolved" "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz"
+  "version" "2.5.0"
+  dependencies:
+    "psl" "^1.1.28"
+    "punycode" "^2.1.1"
+
+"tough-cookie@^3.0.1":
+  "integrity" "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg=="
+  "resolved" "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz"
+  "version" "3.0.1"
+  dependencies:
+    "ip-regex" "^2.1.0"
+    "psl" "^1.1.28"
+    "punycode" "^2.1.1"
+
+"tr46@^2.0.2":
+  "version" "2.0.2"
+  dependencies:
+    "punycode" "^2.1.1"
+
+"trim-newlines@^3.0.0":
+  "integrity" "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw=="
+  "resolved" "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz"
+  "version" "3.0.1"
+
+"triple-beam@^1.2.0", "triple-beam@^1.3.0":
+  "integrity" "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw=="
+  "resolved" "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz"
+  "version" "1.3.0"
+
+"tryer@^1.0.1":
+  "integrity" "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA=="
+  "resolved" "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz"
+  "version" "1.0.1"
+
+"ts-color-class@^0.10.1":
+  "integrity" "sha512-FHqcpjbhHWqTzA81eMW4JvrSQcFrqVo1KhRTMfoR1GAupERAr3T/UT2u1T8ryxQVuZCW/kc4p3mv74mh2pVt+A=="
+  "resolved" "https://registry.npmjs.org/ts-color-class/-/ts-color-class-0.10.1.tgz"
+  "version" "0.10.1"
+
+"ts-jest@^26.0.0":
+  "version" "26.1.1"
+  dependencies:
+    "bs-logger" "0.x"
+    "buffer-from" "1.x"
+    "fast-json-stable-stringify" "2.x"
+    "json5" "2.x"
+    "lodash.memoize" "4.x"
+    "make-error" "1.x"
+    "micromatch" "4.x"
+    "mkdirp" "1.x"
+    "semver" "7.x"
+    "yargs-parser" "18.x"
+
+"ts-loader@7.0.5":
+  "integrity" "sha512-zXypEIT6k3oTc+OZNx/cqElrsbBtYqDknf48OZos0NQ3RTt045fBIU8RRSu+suObBzYB355aIPGOe/3kj9h7Ig=="
+  "resolved" "https://registry.npmjs.org/ts-loader/-/ts-loader-7.0.5.tgz"
+  "version" "7.0.5"
+  dependencies:
+    "chalk" "^2.3.0"
+    "enhanced-resolve" "^4.0.0"
+    "loader-utils" "^1.0.2"
+    "micromatch" "^4.0.0"
+    "semver" "^6.0.0"
+
+"ts-node@8.10.2":
+  "integrity" "sha512-ISJJGgkIpDdBhWVu3jufsWpK3Rzo7bdiIXJjQc0ynKxVOVcg2oIrf2H2cejminGrptVc6q6/uynAHNCuWGbpVA=="
+  "resolved" "https://registry.npmjs.org/ts-node/-/ts-node-8.10.2.tgz"
+  "version" "8.10.2"
+  dependencies:
+    "arg" "^4.1.0"
+    "diff" "^4.0.1"
+    "make-error" "^1.1.1"
+    "source-map-support" "^0.5.17"
+    "yn" "3.1.1"
+
+"tslib@^1.10.0", "tslib@^2.0.0", "tslib@2.0.0":
+  "integrity" "sha512-lTqkx847PI7xEDYJntxZH89L2/aXInsyF2luSafe/+0fHOMjlBNXdH6th7f70qxLDhul7KZK0zC8V5ZIyHl0/g=="
+  "resolved" "https://registry.npmjs.org/tslib/-/tslib-2.0.0.tgz"
+  "version" "2.0.0"
+
+"tslib@^1.8.1":
+  "version" "1.13.0"
+
+"tslib@^1.9.0":
+  "integrity" "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
+  "resolved" "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz"
+  "version" "1.14.1"
+
+"tslint@^5.0.0 || ^6.0.0", "tslint@6.1.2":
+  "integrity" "sha512-UyNrLdK3E0fQG/xWNqAFAC5ugtFyPO4JJR1KyyfQAyzR8W0fTRrC91A8Wej4BntFzcvETdCSDa/4PnNYJQLYiA=="
+  "resolved" "https://registry.npmjs.org/tslint/-/tslint-6.1.2.tgz"
+  "version" "6.1.2"
+  dependencies:
+    "@babel/code-frame" "^7.0.0"
+    "builtin-modules" "^1.1.1"
+    "chalk" "^2.3.0"
+    "commander" "^2.12.1"
+    "diff" "^4.0.1"
+    "glob" "^7.1.1"
+    "js-yaml" "^3.13.1"
+    "minimatch" "^3.0.4"
+    "mkdirp" "^0.5.3"
+    "resolve" "^1.3.2"
+    "semver" "^5.3.0"
+    "tslib" "^1.10.0"
+    "tsutils" "^2.29.0"
+
+"tsutils@^2.29.0":
+  "integrity" "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA=="
+  "resolved" "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz"
+  "version" "2.29.0"
+  dependencies:
+    "tslib" "^1.8.1"
+
+"tsutils@^3.17.1":
+  "version" "3.17.1"
+  dependencies:
+    "tslib" "^1.8.1"
+
+"tty-browserify@0.0.0":
+  "integrity" "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY="
+  "resolved" "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz"
+  "version" "0.0.0"
+
+"tunnel-agent@^0.6.0":
+  "integrity" "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0="
+  "resolved" "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz"
+  "version" "0.6.0"
+  dependencies:
+    "safe-buffer" "^5.0.1"
+
+"tweetnacl@^0.14.3", "tweetnacl@~0.14.0":
+  "integrity" "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q="
+  "resolved" "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz"
+  "version" "0.14.5"
+
+"type-check@~0.3.2":
+  "integrity" "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I="
+  "resolved" "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz"
+  "version" "0.3.2"
+  dependencies:
+    "prelude-ls" "~1.1.2"
+
+"type-detect@^4.0.0", "type-detect@^4.0.5", "type-detect@4.0.8":
+  "integrity" "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g=="
+  "resolved" "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz"
+  "version" "4.0.8"
+
+"type-fest@^0.11.0":
+  "version" "0.11.0"
+
+"type-fest@^0.3.1":
+  "integrity" "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ=="
+  "resolved" "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz"
+  "version" "0.3.1"
+
+"type-fest@^0.6.0":
+  "integrity" "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg=="
+  "resolved" "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz"
+  "version" "0.6.0"
+
+"type-fest@^0.8.1":
+  "integrity" "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA=="
+  "resolved" "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz"
+  "version" "0.8.1"
+
+"type-is@~1.6.17", "type-is@~1.6.18":
+  "integrity" "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g=="
+  "resolved" "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz"
+  "version" "1.6.18"
+  dependencies:
+    "media-typer" "0.3.0"
+    "mime-types" "~2.1.24"
+
+"typedarray-to-buffer@^3.1.5":
+  "integrity" "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q=="
+  "resolved" "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz"
+  "version" "3.1.5"
+  dependencies:
+    "is-typedarray" "^1.0.0"
+
+"typedarray@^0.0.6":
+  "integrity" "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c="
+  "resolved" "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz"
+  "version" "0.0.6"
+
+"typescript@*", "typescript@^3.4.5", "typescript@>=2.1.0 || >=2.1.0-dev || >=2.2.0-dev || >=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >= 3.0.0-dev || >= 3.1.0-dev", "typescript@>=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >=3.0.0-dev || >= 3.1.0-dev || >= 3.2.0-dev", "typescript@>=2.7", "typescript@>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta", "typescript@>=3.8 <4.0", "typescript@>=3.9 < 3.10", "typescript@>=3.9 <4.0", "typescript@3.9.5":
+  "integrity" "sha512-hSAifV3k+i6lEoCJ2k6R2Z/rp/H3+8sdmcn5NrS3/3kE7+RyZXm9aqvxWqjEXHAd8b0pShatpcdMTvEdvAJltQ=="
+  "resolved" "https://registry.npmjs.org/typescript/-/typescript-3.9.5.tgz"
+  "version" "3.9.5"
+
+"ua-parser-js@^0.7.18":
+  "integrity" "sha512-6Gurc1n//gjp9eQNXjD9O3M/sMwVtN5S8Lv9bvOYBfKfDNiIIhqiyi01vMBO45u4zkDE420w/e0se7Vs+sIg+g=="
+  "resolved" "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.28.tgz"
+  "version" "0.7.28"
+
+"uglify-js@^3.1.4":
+  "version" "3.12.6"
+
+"unbox-primitive@^1.0.1":
+  "integrity" "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw=="
+  "resolved" "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz"
+  "version" "1.0.1"
+  dependencies:
+    "function-bind" "^1.1.1"
+    "has-bigints" "^1.0.1"
+    "has-symbols" "^1.0.2"
+    "which-boxed-primitive" "^1.0.2"
+
+"unicode-canonical-property-names-ecmascript@^1.0.4":
+  "integrity" "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ=="
+  "resolved" "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz"
+  "version" "1.0.4"
+
+"unicode-match-property-ecmascript@^1.0.4":
+  "integrity" "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg=="
+  "resolved" "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz"
+  "version" "1.0.4"
+  dependencies:
+    "unicode-canonical-property-names-ecmascript" "^1.0.4"
+    "unicode-property-aliases-ecmascript" "^1.0.4"
+
+"unicode-match-property-value-ecmascript@^1.2.0":
+  "integrity" "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ=="
+  "resolved" "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz"
+  "version" "1.2.0"
+
+"unicode-property-aliases-ecmascript@^1.0.4":
+  "integrity" "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg=="
+  "resolved" "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz"
+  "version" "1.1.0"
+
+"union-value@^1.0.0":
+  "integrity" "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg=="
+  "resolved" "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz"
+  "version" "1.0.1"
+  dependencies:
+    "arr-union" "^3.1.0"
+    "get-value" "^2.0.6"
+    "is-extendable" "^0.1.1"
+    "set-value" "^2.0.1"
+
+"uniq@^1.0.1":
+  "integrity" "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8="
+  "resolved" "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz"
+  "version" "1.0.1"
+
+"uniqs@^2.0.0":
+  "integrity" "sha1-/+3ks2slKQaW5uFl1KWe25mOawI="
+  "resolved" "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz"
+  "version" "2.0.0"
+
+"unique-filename@^1.1.1":
+  "integrity" "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ=="
+  "resolved" "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz"
+  "version" "1.1.1"
+  dependencies:
+    "unique-slug" "^2.0.0"
+
+"unique-slug@^2.0.0":
+  "integrity" "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w=="
+  "resolved" "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz"
+  "version" "2.0.2"
+  dependencies:
+    "imurmurhash" "^0.1.4"
+
+"unique-string@^1.0.0":
+  "integrity" "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo="
+  "resolved" "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz"
+  "version" "1.0.0"
+  dependencies:
+    "crypto-random-string" "^1.0.0"
+
+"universal-analytics@0.4.23":
+  "integrity" "sha512-lgMIH7XBI6OgYn1woDEmxhGdj8yDefMKg7GkWdeATAlQZFrMrNyxSkpDzY57iY0/6fdlzTbBV03OawvvzG+q7A=="
+  "resolved" "https://registry.npmjs.org/universal-analytics/-/universal-analytics-0.4.23.tgz"
+  "version" "0.4.23"
+  dependencies:
+    "debug" "^4.1.1"
+    "request" "^2.88.2"
+    "uuid" "^3.0.0"
+
+"universalify@^0.1.0":
+  "integrity" "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="
+  "resolved" "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz"
+  "version" "0.1.2"
+
+"unpipe@~1.0.0", "unpipe@1.0.0":
+  "integrity" "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw="
+  "resolved" "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz"
+  "version" "1.0.0"
+
+"unquote@~1.1.1":
+  "integrity" "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ="
+  "resolved" "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz"
+  "version" "1.1.1"
+
+"unset-value@^1.0.0":
+  "integrity" "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk="
+  "resolved" "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz"
+  "version" "1.0.0"
+  dependencies:
+    "has-value" "^0.3.1"
+    "isobject" "^3.0.0"
+
+"untildify@^3.0.3":
+  "integrity" "sha512-iSk/J8efr8uPT/Z4eSUywnqyrQU7DSdMfdqK4iWEaUVVmcP5JcnpRqmVMwcwcnmI1ATFNgC5V90u09tBynNFKA=="
+  "resolved" "https://registry.npmjs.org/untildify/-/untildify-3.0.3.tgz"
+  "version" "3.0.3"
+
+"unzip-response@^2.0.1":
+  "integrity" "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c="
+  "resolved" "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz"
+  "version" "2.0.1"
+
+"upath@^1.1.1", "upath@^1.1.2", "upath@^1.2.0":
+  "integrity" "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg=="
+  "resolved" "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz"
+  "version" "1.2.0"
+
+"uri-js@^4.2.2":
+  "version" "4.2.2"
+  dependencies:
+    "punycode" "^2.1.0"
+
+"urix@^0.1.0":
+  "integrity" "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI="
+  "resolved" "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz"
+  "version" "0.1.0"
+
+"url-parse-lax@^1.0.0":
+  "integrity" "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM="
+  "resolved" "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz"
+  "version" "1.0.0"
+  dependencies:
+    "prepend-http" "^1.0.1"
+
+"url-parse@^1.4.3":
+  "integrity" "sha512-HOfCOUJt7iSYzEx/UqgtwKRMC6EU91NFhsCHMv9oM03VJcVo2Qrp8T8kI9D7amFf1cu+/3CEhgb3rF9zL7k85Q=="
+  "resolved" "https://registry.npmjs.org/url-parse/-/url-parse-1.5.1.tgz"
+  "version" "1.5.1"
+  dependencies:
+    "querystringify" "^2.1.1"
+    "requires-port" "^1.0.0"
+
+"url@^0.11.0":
+  "integrity" "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE="
+  "resolved" "https://registry.npmjs.org/url/-/url-0.11.0.tgz"
+  "version" "0.11.0"
+  dependencies:
+    "punycode" "1.3.2"
+    "querystring" "0.2.0"
+
+"url@0.10.3":
+  "integrity" "sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ="
+  "resolved" "https://registry.npmjs.org/url/-/url-0.10.3.tgz"
+  "version" "0.10.3"
+  dependencies:
+    "punycode" "1.3.2"
+    "querystring" "0.2.0"
+
+"use@^3.1.0":
+  "integrity" "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ=="
+  "resolved" "https://registry.npmjs.org/use/-/use-3.1.1.tgz"
+  "version" "3.1.1"
+
+"util-deprecate@^1.0.1", "util-deprecate@~1.0.1":
+  "integrity" "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
+  "resolved" "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz"
+  "version" "1.0.2"
+
+"util-promisify@^2.1.0":
+  "integrity" "sha1-PCI2R2xNMsX/PEcAKt18E7moKlM="
+  "resolved" "https://registry.npmjs.org/util-promisify/-/util-promisify-2.1.0.tgz"
+  "version" "2.1.0"
+  dependencies:
+    "object.getownpropertydescriptors" "^2.0.3"
+
+"util.promisify@~1.0.0", "util.promisify@1.0.0":
+  "integrity" "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA=="
+  "resolved" "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz"
+  "version" "1.0.0"
+  dependencies:
+    "define-properties" "^1.1.2"
+    "object.getownpropertydescriptors" "^2.0.3"
+
+"util@^0.10.3":
+  "integrity" "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A=="
+  "resolved" "https://registry.npmjs.org/util/-/util-0.10.4.tgz"
+  "version" "0.10.4"
+  dependencies:
+    "inherits" "2.0.3"
+
+"util@^0.11.0":
+  "integrity" "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ=="
+  "resolved" "https://registry.npmjs.org/util/-/util-0.11.1.tgz"
+  "version" "0.11.1"
+  dependencies:
+    "inherits" "2.0.3"
+
+"util@0.10.3":
+  "integrity" "sha1-evsa/lCAUkZInj23/g7TeTNqwPk="
+  "resolved" "https://registry.npmjs.org/util/-/util-0.10.3.tgz"
+  "version" "0.10.3"
+  dependencies:
+    "inherits" "2.0.1"
+
+"utila@~0.4":
+  "integrity" "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw="
+  "resolved" "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz"
+  "version" "0.4.0"
+
+"utils-merge@1.0.1":
+  "integrity" "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM="
+  "resolved" "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz"
+  "version" "1.0.1"
+
+"uuid@^3.0.0":
+  "integrity" "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A=="
+  "resolved" "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz"
+  "version" "3.4.0"
+
+"uuid@^3.3.2":
+  "integrity" "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A=="
+  "resolved" "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz"
+  "version" "3.4.0"
+
+"uuid@^3.3.3":
+  "integrity" "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A=="
+  "resolved" "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz"
+  "version" "3.4.0"
+
+"uuid@^3.4.0":
+  "integrity" "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A=="
+  "resolved" "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz"
+  "version" "3.4.0"
+
+"uuid@^7.0.3":
+  "version" "7.0.3"
+
+"uuid@3.3.2":
+  "integrity" "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA=="
+  "resolved" "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz"
+  "version" "3.3.2"
+
+"uuid@7.0.3":
+  "integrity" "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg=="
+  "resolved" "https://registry.npmjs.org/uuid/-/uuid-7.0.3.tgz"
+  "version" "7.0.3"
+
+"uuid@8.3.0":
+  "integrity" "sha512-fX6Z5o4m6XsXBdli9g7DtWgAx+osMsRRZFKma1mIUsLCz6vRvv+pz5VNbyu9UEDzpMWulZfvpgb/cmDXVulYFQ=="
+  "resolved" "https://registry.npmjs.org/uuid/-/uuid-8.3.0.tgz"
+  "version" "8.3.0"
+
+"v8-compile-cache@^2.0.3", "v8-compile-cache@^2.1.1":
+  "version" "2.1.1"
+
+"v8-to-istanbul@^4.1.3":
+  "version" "4.1.4"
+  dependencies:
+    "@types/istanbul-lib-coverage" "^2.0.1"
+    "convert-source-map" "^1.6.0"
+    "source-map" "^0.7.3"
+
+"validate-npm-package-license@^3.0.1":
+  "integrity" "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew=="
+  "resolved" "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz"
+  "version" "3.0.4"
+  dependencies:
+    "spdx-correct" "^3.0.0"
+    "spdx-expression-parse" "^3.0.0"
+
+"validate-npm-package-name@^3.0.0":
+  "integrity" "sha1-X6kS2B630MdK/BQN5zF/DKffQ34="
+  "resolved" "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz"
+  "version" "3.0.0"
+  dependencies:
+    "builtins" "^1.0.3"
+
+"vary@~1.1.2":
+  "integrity" "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
+  "resolved" "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz"
+  "version" "1.1.2"
+
+"vendors@^1.0.0":
+  "integrity" "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w=="
+  "resolved" "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz"
+  "version" "1.0.4"
+
+"verror@1.10.0":
+  "integrity" "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA="
+  "resolved" "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz"
+  "version" "1.10.0"
+  dependencies:
+    "assert-plus" "^1.0.0"
+    "core-util-is" "1.0.2"
+    "extsprintf" "^1.2.0"
+
+"vinyl-file@^3.0.0":
+  "integrity" "sha1-sQTZ5ECf+jJfqt1SBkLQo7SIs2U="
+  "resolved" "https://registry.npmjs.org/vinyl-file/-/vinyl-file-3.0.0.tgz"
+  "version" "3.0.0"
+  dependencies:
+    "graceful-fs" "^4.1.2"
+    "pify" "^2.3.0"
+    "strip-bom-buf" "^1.0.0"
+    "strip-bom-stream" "^2.0.0"
+    "vinyl" "^2.0.1"
+
+"vinyl@^2.0.1", "vinyl@^2.2.0", "vinyl@^2.2.1":
+  "integrity" "sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw=="
+  "resolved" "https://registry.npmjs.org/vinyl/-/vinyl-2.2.1.tgz"
+  "version" "2.2.1"
+  dependencies:
+    "clone" "^2.1.1"
+    "clone-buffer" "^1.0.0"
+    "clone-stats" "^1.0.0"
+    "cloneable-readable" "^1.0.0"
+    "remove-trailing-separator" "^1.0.1"
+    "replace-ext" "^1.0.0"
+
+"vm-browserify@^1.0.1":
+  "integrity" "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ=="
+  "resolved" "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz"
+  "version" "1.1.2"
+
+"w3c-hr-time@^1.0.2":
+  "integrity" "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ=="
+  "resolved" "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz"
+  "version" "1.0.2"
+  dependencies:
+    "browser-process-hrtime" "^1.0.0"
+
+"w3c-xmlserializer@^2.0.0":
+  "integrity" "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA=="
+  "resolved" "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz"
+  "version" "2.0.0"
+  dependencies:
+    "xml-name-validator" "^3.0.0"
+
+"walker@^1.0.7", "walker@~1.0.5":
+  "integrity" "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs="
+  "resolved" "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz"
+  "version" "1.0.7"
+  dependencies:
+    "makeerror" "1.0.x"
+
+"watchpack-chokidar2@^2.0.0":
+  "version" "2.0.1"
+  dependencies:
+    "chokidar" "^2.1.8"
+
+"watchpack@^1.6.1":
+  "version" "1.7.2"
+  dependencies:
+    "graceful-fs" "^4.1.2"
+    "neo-async" "^2.5.0"
+  optionalDependencies:
+    "chokidar" "^3.4.0"
+    "watchpack-chokidar2" "^2.0.0"
+
+"wbuf@^1.1.0", "wbuf@^1.7.3":
+  "integrity" "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA=="
+  "resolved" "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz"
+  "version" "1.7.3"
+  dependencies:
+    "minimalistic-assert" "^1.0.0"
+
+"wcwidth@^1.0.1":
+  "integrity" "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g="
+  "resolved" "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz"
+  "version" "1.0.1"
+  dependencies:
+    "defaults" "^1.0.3"
+
+"webdriver-js-extender@2.1.0":
+  "integrity" "sha512-lcUKrjbBfCK6MNsh7xaY2UAUmZwe+/ib03AjVOpFobX4O7+83BUveSrLfU0Qsyb1DaKJdQRbuU+kM9aZ6QUhiQ=="
+  "resolved" "https://registry.npmjs.org/webdriver-js-extender/-/webdriver-js-extender-2.1.0.tgz"
+  "version" "2.1.0"
+  dependencies:
+    "@types/selenium-webdriver" "^3.0.0"
+    "selenium-webdriver" "^3.0.1"
+
+"webdriver-manager@^12.1.7", "webdriver-manager@12.1.7":
+  "integrity" "sha512-XINj6b8CYuUYC93SG3xPkxlyUc3IJbD6Vvo75CVGuG9uzsefDzWQrhz0Lq8vbPxtb4d63CZdYophF8k8Or/YiA=="
+  "resolved" "https://registry.npmjs.org/webdriver-manager/-/webdriver-manager-12.1.7.tgz"
+  "version" "12.1.7"
+  dependencies:
+    "adm-zip" "^0.4.9"
+    "chalk" "^1.1.1"
+    "del" "^2.2.0"
+    "glob" "^7.0.3"
+    "ini" "^1.3.4"
+    "minimist" "^1.2.0"
+    "q" "^1.4.1"
+    "request" "^2.87.0"
+    "rimraf" "^2.5.2"
+    "semver" "^5.3.0"
+    "xml2js" "^0.4.17"
+
+"webidl-conversions@^5.0.0":
+  "integrity" "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA=="
+  "resolved" "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz"
+  "version" "5.0.0"
+
+"webidl-conversions@^6.0.0":
+  "version" "6.1.0"
+
+"webpack-bundle-analyzer@3.8.0":
+  "integrity" "sha512-PODQhAYVEourCcOuU+NiYI7WdR8QyELZGgPvB1y2tjbUpbmcQOt5Q7jEK+ttd5se0KSBKD9SXHCEozS++Wllmw=="
+  "resolved" "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.8.0.tgz"
+  "version" "3.8.0"
+  dependencies:
+    "acorn" "^7.1.1"
+    "acorn-walk" "^7.1.1"
+    "bfj" "^6.1.1"
+    "chalk" "^2.4.1"
+    "commander" "^2.18.0"
+    "ejs" "^2.6.1"
+    "express" "^4.16.3"
+    "filesize" "^3.6.1"
+    "gzip-size" "^5.0.0"
+    "lodash" "^4.17.15"
+    "mkdirp" "^0.5.1"
+    "opener" "^1.5.1"
+    "ws" "^6.0.0"
+
+"webpack-cli@3.3.12":
+  "integrity" "sha512-NVWBaz9k839ZH/sinurM+HcDvJOTXwSjYp1ku+5XKeOC03z8v5QitnK/x+lAxGXFyhdayoIf/GOpv85z3/xPag=="
+  "resolved" "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.12.tgz"
+  "version" "3.3.12"
+  dependencies:
+    "chalk" "^2.4.2"
+    "cross-spawn" "^6.0.5"
+    "enhanced-resolve" "^4.1.1"
+    "findup-sync" "^3.0.0"
+    "global-modules" "^2.0.0"
+    "import-local" "^2.0.0"
+    "interpret" "^1.4.0"
+    "loader-utils" "^1.4.0"
+    "supports-color" "^6.1.0"
+    "v8-compile-cache" "^2.1.1"
+    "yargs" "^13.3.2"
+
+"webpack-dev-middleware@^3.7.2":
+  "version" "3.7.2"
+  dependencies:
+    "memory-fs" "^0.4.1"
+    "mime" "^2.4.4"
+    "mkdirp" "^0.5.1"
+    "range-parser" "^1.2.1"
+    "webpack-log" "^2.0.0"
+
+"webpack-dev-server@3.11.0":
+  "integrity" "sha512-PUxZ+oSTxogFQgkTtFndEtJIPNmml7ExwufBZ9L2/Xyyd5PnOL5UreWe5ZT7IU25DSdykL9p1MLQzmLh2ljSeg=="
+  "resolved" "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.0.tgz"
+  "version" "3.11.0"
+  dependencies:
+    "ansi-html" "0.0.7"
+    "bonjour" "^3.5.0"
+    "chokidar" "^2.1.8"
+    "compression" "^1.7.4"
+    "connect-history-api-fallback" "^1.6.0"
+    "debug" "^4.1.1"
+    "del" "^4.1.1"
+    "express" "^4.17.1"
+    "html-entities" "^1.3.1"
+    "http-proxy-middleware" "0.19.1"
+    "import-local" "^2.0.0"
+    "internal-ip" "^4.3.0"
+    "ip" "^1.1.5"
+    "is-absolute-url" "^3.0.3"
+    "killable" "^1.0.1"
+    "loglevel" "^1.6.8"
+    "opn" "^5.5.0"
+    "p-retry" "^3.0.1"
+    "portfinder" "^1.0.26"
+    "schema-utils" "^1.0.0"
+    "selfsigned" "^1.10.7"
+    "semver" "^6.3.0"
+    "serve-index" "^1.9.1"
+    "sockjs" "0.3.20"
+    "sockjs-client" "1.4.0"
+    "spdy" "^4.0.2"
+    "strip-ansi" "^3.0.1"
+    "supports-color" "^6.1.0"
+    "url" "^0.11.0"
+    "webpack-dev-middleware" "^3.7.2"
+    "webpack-log" "^2.0.0"
+    "ws" "^6.2.1"
+    "yargs" "^13.3.2"
+
+"webpack-log@^2.0.0":
+  "integrity" "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg=="
+  "resolved" "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz"
+  "version" "2.0.0"
+  dependencies:
+    "ansi-colors" "^3.0.0"
+    "uuid" "^3.3.2"
+
+"webpack-merge@4.2.2":
+  "integrity" "sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g=="
+  "resolved" "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.2.tgz"
+  "version" "4.2.2"
+  dependencies:
+    "lodash" "^4.17.15"
+
+"webpack-notifier@1.8.0":
+  "integrity" "sha512-I6t76NoPe5DZCCm5geELmDV2wlJ89LbU425uN6T2FG8Ywrrt1ZcUMz6g8yWGNg4pttqTPFQJYUPjWAlzUEQ+cQ=="
+  "resolved" "https://registry.npmjs.org/webpack-notifier/-/webpack-notifier-1.8.0.tgz"
+  "version" "1.8.0"
+  dependencies:
+    "node-notifier" "^5.1.2"
+    "object-assign" "^4.1.0"
+    "strip-ansi" "^3.0.1"
+
+"webpack-sources@^1.1.0", "webpack-sources@^1.3.0", "webpack-sources@^1.4.0", "webpack-sources@^1.4.1", "webpack-sources@^1.4.3", "webpack-sources@1.4.3":
+  "integrity" "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ=="
+  "resolved" "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz"
+  "version" "1.4.3"
+  dependencies:
+    "source-list-map" "^2.0.0"
+    "source-map" "~0.6.1"
+
+"webpack@^1 || ^2 || ^3 || ^4", "webpack@^1 || ^2 || ^3 || ^4 || ^5", "webpack@^2.0.0 || ^3.0.0 || ^4.0.0", "webpack@^4.0.0", "webpack@^4.0.0 || ^5.0.0", "webpack@^4.36.0 || ^5.0.0", "webpack@^4.37.0 || ^5.0.0", "webpack@^4.4.0", "webpack@>=2.0.0", "webpack@>=4.0.0 < 6.0.0", "webpack@4.43.0", "webpack@4.x.x":
+  "integrity" "sha512-GW1LjnPipFW2Y78OOab8NJlCflB7EFskMih2AHdvjbpKMeDJqEgSx24cXXXiPS65+WSwVyxtDsJH6jGX2czy+g=="
+  "resolved" "https://registry.npmjs.org/webpack/-/webpack-4.43.0.tgz"
+  "version" "4.43.0"
+  dependencies:
+    "@webassemblyjs/ast" "1.9.0"
+    "@webassemblyjs/helper-module-context" "1.9.0"
+    "@webassemblyjs/wasm-edit" "1.9.0"
+    "@webassemblyjs/wasm-parser" "1.9.0"
+    "acorn" "^6.4.1"
+    "ajv" "^6.10.2"
+    "ajv-keywords" "^3.4.1"
+    "chrome-trace-event" "^1.0.2"
+    "enhanced-resolve" "^4.1.0"
+    "eslint-scope" "^4.0.3"
+    "json-parse-better-errors" "^1.0.2"
+    "loader-runner" "^2.4.0"
+    "loader-utils" "^1.2.3"
+    "memory-fs" "^0.4.1"
+    "micromatch" "^3.1.10"
+    "mkdirp" "^0.5.3"
+    "neo-async" "^2.6.1"
+    "node-libs-browser" "^2.2.1"
+    "schema-utils" "^1.0.0"
+    "tapable" "^1.1.3"
+    "terser-webpack-plugin" "^1.4.3"
+    "watchpack" "^1.6.1"
+    "webpack-sources" "^1.4.1"
+
+"websocket-driver@>=0.5.1", "websocket-driver@0.6.5":
+  "integrity" "sha1-XLJVbOuF9Dc8bYI4qmkchFThOjY="
+  "resolved" "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.6.5.tgz"
+  "version" "0.6.5"
+  dependencies:
+    "websocket-extensions" ">=0.1.1"
+
+"websocket-extensions@>=0.1.1":
+  "integrity" "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg=="
+  "resolved" "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz"
+  "version" "0.1.4"
+
+"whatwg-encoding@^1.0.5":
+  "integrity" "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw=="
+  "resolved" "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz"
+  "version" "1.0.5"
+  dependencies:
+    "iconv-lite" "0.4.24"
+
+"whatwg-mimetype@^2.3.0":
+  "integrity" "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g=="
+  "resolved" "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz"
+  "version" "2.3.0"
+
+"whatwg-url@^8.0.0":
+  "version" "8.1.0"
+  dependencies:
+    "lodash.sortby" "^4.7.0"
+    "tr46" "^2.0.2"
+    "webidl-conversions" "^5.0.0"
+
+"which-boxed-primitive@^1.0.2":
+  "integrity" "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg=="
+  "resolved" "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz"
+  "version" "1.0.2"
+  dependencies:
+    "is-bigint" "^1.0.1"
+    "is-boolean-object" "^1.1.0"
+    "is-number-object" "^1.0.4"
+    "is-string" "^1.0.5"
+    "is-symbol" "^1.0.3"
+
+"which-module@^2.0.0":
+  "integrity" "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho="
+  "resolved" "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz"
+  "version" "2.0.0"
+
+"which-pm-runs@^1.0.0":
+  "integrity" "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs="
+  "resolved" "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz"
+  "version" "1.0.0"
+
+"which@^1.2.10", "which@^1.2.14", "which@^1.2.9", "which@^1.3.0", "which@^1.3.1":
+  "integrity" "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ=="
+  "resolved" "https://registry.npmjs.org/which/-/which-1.3.1.tgz"
+  "version" "1.3.1"
+  dependencies:
+    "isexe" "^2.0.0"
+
+"which@^2.0.1":
+  "integrity" "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="
+  "resolved" "https://registry.npmjs.org/which/-/which-2.0.2.tgz"
+  "version" "2.0.2"
+  dependencies:
+    "isexe" "^2.0.0"
+
+"which@^2.0.2":
+  "integrity" "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="
+  "resolved" "https://registry.npmjs.org/which/-/which-2.0.2.tgz"
+  "version" "2.0.2"
+  dependencies:
+    "isexe" "^2.0.0"
+
+"which@2.0.2":
+  "integrity" "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="
+  "resolved" "https://registry.npmjs.org/which/-/which-2.0.2.tgz"
+  "version" "2.0.2"
+  dependencies:
+    "isexe" "^2.0.0"
+
+"wide-align@1.1.3":
+  "integrity" "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA=="
+  "resolved" "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz"
+  "version" "1.1.3"
+  dependencies:
+    "string-width" "^1.0.2 || 2"
+
+"windows-release@^3.1.0":
+  "integrity" "sha512-OSOGH1QYiW5yVor9TtmXKQvt2vjQqbYS+DqmsZw+r7xDwLXEeT3JGW0ZppFmHx4diyXmxt238KFR3N9jzevBRg=="
+  "resolved" "https://registry.npmjs.org/windows-release/-/windows-release-3.3.3.tgz"
+  "version" "3.3.3"
+  dependencies:
+    "execa" "^1.0.0"
+
+"winston-transport@^4.3.0":
+  "integrity" "sha512-Lc7/p3GtqtqPBYYtS6KCN3c77/2QCev51DvcJKbkFPQNoj1sinkGwLGFDxkXY9J6p9+EPnYs+D90uwbnaiURTw=="
+  "resolved" "https://registry.npmjs.org/winston-transport/-/winston-transport-4.4.0.tgz"
+  "version" "4.4.0"
+  dependencies:
+    "readable-stream" "^2.3.7"
+    "triple-beam" "^1.2.0"
+
+"winston@3.2.1":
+  "integrity" "sha512-zU6vgnS9dAWCEKg/QYigd6cgMVVNwyTzKs81XZtTFuRwJOcDdBg7AU0mXVyNbs7O5RH2zdv+BdNZUlx7mXPuOw=="
+  "resolved" "https://registry.npmjs.org/winston/-/winston-3.2.1.tgz"
+  "version" "3.2.1"
+  dependencies:
+    "async" "^2.6.1"
+    "diagnostics" "^1.1.1"
+    "is-stream" "^1.1.0"
+    "logform" "^2.1.1"
+    "one-time" "0.0.4"
+    "readable-stream" "^3.1.1"
+    "stack-trace" "0.0.x"
+    "triple-beam" "^1.3.0"
+    "winston-transport" "^4.3.0"
+
+"with-open-file@^0.1.6":
+  "integrity" "sha512-ecJS2/oHtESJ1t3ZfMI3B7KIDKyfN0O16miWxdn30zdh66Yd3LsRFebXZXq6GU4xfxLf6nVxp9kIqElb5fqczA=="
+  "resolved" "https://registry.npmjs.org/with-open-file/-/with-open-file-0.1.7.tgz"
+  "version" "0.1.7"
+  dependencies:
+    "p-finally" "^1.0.0"
+    "p-try" "^2.1.0"
+    "pify" "^4.0.1"
+
+"word-wrap@~1.2.3":
+  "integrity" "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ=="
+  "resolved" "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz"
+  "version" "1.2.3"
+
+"wordwrap@^1.0.0":
+  "integrity" "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus="
+  "resolved" "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz"
+  "version" "1.0.0"
+
+"workbox-background-sync@^5.1.4":
+  "integrity" "sha512-AH6x5pYq4vwQvfRDWH+vfOePfPIYQ00nCEB7dJRU1e0n9+9HMRyvI63FlDvtFT2AvXVRsXvUt7DNMEToyJLpSA=="
+  "resolved" "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-5.1.4.tgz"
+  "version" "5.1.4"
+  dependencies:
+    "workbox-core" "^5.1.4"
+
+"workbox-broadcast-update@^5.1.4":
+  "integrity" "sha512-HTyTWkqXvHRuqY73XrwvXPud/FN6x3ROzkfFPsRjtw/kGZuZkPzfeH531qdUGfhtwjmtO/ZzXcWErqVzJNdXaA=="
+  "resolved" "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-5.1.4.tgz"
+  "version" "5.1.4"
+  dependencies:
+    "workbox-core" "^5.1.4"
+
+"workbox-build@^5.1.3":
+  "integrity" "sha512-xUcZn6SYU8usjOlfLb9Y2/f86Gdo+fy1fXgH8tJHjxgpo53VVsqRX0lUDw8/JuyzNmXuo8vXX14pXX2oIm9Bow=="
+  "resolved" "https://registry.npmjs.org/workbox-build/-/workbox-build-5.1.4.tgz"
+  "version" "5.1.4"
+  dependencies:
+    "@babel/core" "^7.8.4"
+    "@babel/preset-env" "^7.8.4"
+    "@babel/runtime" "^7.8.4"
+    "@hapi/joi" "^15.1.0"
+    "@rollup/plugin-node-resolve" "^7.1.1"
+    "@rollup/plugin-replace" "^2.3.1"
+    "@surma/rollup-plugin-off-main-thread" "^1.1.1"
+    "common-tags" "^1.8.0"
+    "fast-json-stable-stringify" "^2.1.0"
+    "fs-extra" "^8.1.0"
+    "glob" "^7.1.6"
+    "lodash.template" "^4.5.0"
+    "pretty-bytes" "^5.3.0"
+    "rollup" "^1.31.1"
+    "rollup-plugin-babel" "^4.3.3"
+    "rollup-plugin-terser" "^5.3.1"
+    "source-map" "^0.7.3"
+    "source-map-url" "^0.4.0"
+    "stringify-object" "^3.3.0"
+    "strip-comments" "^1.0.2"
+    "tempy" "^0.3.0"
+    "upath" "^1.2.0"
+    "workbox-background-sync" "^5.1.4"
+    "workbox-broadcast-update" "^5.1.4"
+    "workbox-cacheable-response" "^5.1.4"
+    "workbox-core" "^5.1.4"
+    "workbox-expiration" "^5.1.4"
+    "workbox-google-analytics" "^5.1.4"
+    "workbox-navigation-preload" "^5.1.4"
+    "workbox-precaching" "^5.1.4"
+    "workbox-range-requests" "^5.1.4"
+    "workbox-routing" "^5.1.4"
+    "workbox-strategies" "^5.1.4"
+    "workbox-streams" "^5.1.4"
+    "workbox-sw" "^5.1.4"
+    "workbox-window" "^5.1.4"
+
+"workbox-cacheable-response@^5.1.4":
+  "integrity" "sha512-0bfvMZs0Of1S5cdswfQK0BXt6ulU5kVD4lwer2CeI+03czHprXR3V4Y8lPTooamn7eHP8Iywi5QjyAMjw0qauA=="
+  "resolved" "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-5.1.4.tgz"
+  "version" "5.1.4"
+  dependencies:
+    "workbox-core" "^5.1.4"
+
+"workbox-core@^5.1.4":
+  "integrity" "sha512-+4iRQan/1D8I81nR2L5vcbaaFskZC2CL17TLbvWVzQ4qiF/ytOGF6XeV54pVxAvKUtkLANhk8TyIUMtiMw2oDg=="
+  "resolved" "https://registry.npmjs.org/workbox-core/-/workbox-core-5.1.4.tgz"
+  "version" "5.1.4"
+
+"workbox-expiration@^5.1.4":
+  "integrity" "sha512-oDO/5iC65h2Eq7jctAv858W2+CeRW5e0jZBMNRXpzp0ZPvuT6GblUiHnAsC5W5lANs1QS9atVOm4ifrBiYY7AQ=="
+  "resolved" "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-5.1.4.tgz"
+  "version" "5.1.4"
+  dependencies:
+    "workbox-core" "^5.1.4"
+
+"workbox-google-analytics@^5.1.4":
+  "integrity" "sha512-0IFhKoEVrreHpKgcOoddV+oIaVXBFKXUzJVBI+nb0bxmcwYuZMdteBTp8AEDJacENtc9xbR0wa9RDCnYsCDLjA=="
+  "resolved" "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-5.1.4.tgz"
+  "version" "5.1.4"
+  dependencies:
+    "workbox-background-sync" "^5.1.4"
+    "workbox-core" "^5.1.4"
+    "workbox-routing" "^5.1.4"
+    "workbox-strategies" "^5.1.4"
+
+"workbox-navigation-preload@^5.1.4":
+  "integrity" "sha512-Wf03osvK0wTflAfKXba//QmWC5BIaIZARU03JIhAEO2wSB2BDROWI8Q/zmianf54kdV7e1eLaIEZhth4K4MyfQ=="
+  "resolved" "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-5.1.4.tgz"
+  "version" "5.1.4"
+  dependencies:
+    "workbox-core" "^5.1.4"
+
+"workbox-precaching@^5.1.4":
+  "integrity" "sha512-gCIFrBXmVQLFwvAzuGLCmkUYGVhBb7D1k/IL7pUJUO5xacjLcFUaLnnsoVepBGAiKw34HU1y/YuqvTKim9qAZA=="
+  "resolved" "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-5.1.4.tgz"
+  "version" "5.1.4"
+  dependencies:
+    "workbox-core" "^5.1.4"
+
+"workbox-range-requests@^5.1.4":
+  "integrity" "sha512-1HSujLjgTeoxHrMR2muDW2dKdxqCGMc1KbeyGcmjZZAizJTFwu7CWLDmLv6O1ceWYrhfuLFJO+umYMddk2XMhw=="
+  "resolved" "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-5.1.4.tgz"
+  "version" "5.1.4"
+  dependencies:
+    "workbox-core" "^5.1.4"
+
+"workbox-routing@^5.1.4":
+  "integrity" "sha512-8ljknRfqE1vEQtnMtzfksL+UXO822jJlHTIR7+BtJuxQ17+WPZfsHqvk1ynR/v0EHik4x2+826Hkwpgh4GKDCw=="
+  "resolved" "https://registry.npmjs.org/workbox-routing/-/workbox-routing-5.1.4.tgz"
+  "version" "5.1.4"
+  dependencies:
+    "workbox-core" "^5.1.4"
+
+"workbox-strategies@^5.1.4":
+  "integrity" "sha512-VVS57LpaJTdjW3RgZvPwX0NlhNmscR7OQ9bP+N/34cYMDzXLyA6kqWffP6QKXSkca1OFo/v6v7hW7zrrguo6EA=="
+  "resolved" "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-5.1.4.tgz"
+  "version" "5.1.4"
+  dependencies:
+    "workbox-core" "^5.1.4"
+    "workbox-routing" "^5.1.4"
+
+"workbox-streams@^5.1.4":
+  "integrity" "sha512-xU8yuF1hI/XcVhJUAfbQLa1guQUhdLMPQJkdT0kn6HP5CwiPOGiXnSFq80rAG4b1kJUChQQIGPrq439FQUNVrw=="
+  "resolved" "https://registry.npmjs.org/workbox-streams/-/workbox-streams-5.1.4.tgz"
+  "version" "5.1.4"
+  dependencies:
+    "workbox-core" "^5.1.4"
+    "workbox-routing" "^5.1.4"
+
+"workbox-sw@^5.1.4":
+  "integrity" "sha512-9xKnKw95aXwSNc8kk8gki4HU0g0W6KXu+xks7wFuC7h0sembFnTrKtckqZxbSod41TDaGh+gWUA5IRXrL0ECRA=="
+  "resolved" "https://registry.npmjs.org/workbox-sw/-/workbox-sw-5.1.4.tgz"
+  "version" "5.1.4"
+
+"workbox-webpack-plugin@5.1.3":
+  "integrity" "sha512-gxSkZ9GFLrMNC/8DGNRjcMhrt8iu+MMXhH/Fpo3wo9rKaSMsI7esGq0klTH/UloP9pNvBizVydysrB52eRhI7w=="
+  "resolved" "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-5.1.3.tgz"
+  "version" "5.1.3"
+  dependencies:
+    "@babel/runtime" "^7.5.5"
+    "fast-json-stable-stringify" "^2.0.0"
+    "source-map-url" "^0.4.0"
+    "upath" "^1.1.2"
+    "webpack-sources" "^1.3.0"
+    "workbox-build" "^5.1.3"
+
+"workbox-window@^5.1.4":
+  "integrity" "sha512-vXQtgTeMCUq/4pBWMfQX8Ee7N2wVC4Q7XYFqLnfbXJ2hqew/cU1uMTD2KqGEgEpE4/30luxIxgE+LkIa8glBYw=="
+  "resolved" "https://registry.npmjs.org/workbox-window/-/workbox-window-5.1.4.tgz"
+  "version" "5.1.4"
+  dependencies:
+    "workbox-core" "^5.1.4"
+
+"worker-farm@^1.7.0":
+  "integrity" "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw=="
+  "resolved" "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz"
+  "version" "1.7.0"
+  dependencies:
+    "errno" "~0.1.7"
+
+"workerpool@6.1.0":
+  "integrity" "sha512-toV7q9rWNYha963Pl/qyeZ6wG+3nnsyvolaNUS8+R5Wtw6qJPTxIlOP1ZSvcGhEJw+l3HMMmtiNo9Gl61G4GVg=="
+  "resolved" "https://registry.npmjs.org/workerpool/-/workerpool-6.1.0.tgz"
+  "version" "6.1.0"
+
+"wrap-ansi@^3.0.1":
+  "integrity" "sha1-KIoE2H7aXChuBg3+jxNc6NAH+Lo="
+  "resolved" "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-3.0.1.tgz"
+  "version" "3.0.1"
+  dependencies:
+    "string-width" "^2.1.1"
+    "strip-ansi" "^4.0.0"
+
+"wrap-ansi@^5.1.0":
+  "integrity" "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q=="
+  "resolved" "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz"
+  "version" "5.1.0"
+  dependencies:
+    "ansi-styles" "^3.2.0"
+    "string-width" "^3.0.0"
+    "strip-ansi" "^5.0.0"
+
+"wrap-ansi@^6.2.0":
+  "integrity" "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA=="
+  "resolved" "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz"
+  "version" "6.2.0"
+  dependencies:
+    "ansi-styles" "^4.0.0"
+    "string-width" "^4.1.0"
+    "strip-ansi" "^6.0.0"
+
+"wrap-ansi@^7.0.0":
+  "integrity" "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="
+  "resolved" "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz"
+  "version" "7.0.0"
+  dependencies:
+    "ansi-styles" "^4.0.0"
+    "string-width" "^4.1.0"
+    "strip-ansi" "^6.0.0"
+
+"wrappy@1":
+  "integrity" "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
+  "resolved" "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz"
+  "version" "1.0.2"
+
+"write-file-atomic@^2.3.0":
+  "integrity" "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ=="
+  "resolved" "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz"
+  "version" "2.4.3"
+  dependencies:
+    "graceful-fs" "^4.1.11"
+    "imurmurhash" "^0.1.4"
+    "signal-exit" "^3.0.2"
+
+"write-file-atomic@^3.0.0":
+  "integrity" "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q=="
+  "resolved" "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz"
+  "version" "3.0.3"
+  dependencies:
+    "imurmurhash" "^0.1.4"
+    "is-typedarray" "^1.0.0"
+    "signal-exit" "^3.0.2"
+    "typedarray-to-buffer" "^3.1.5"
+
+"write-file-webpack-plugin@4.5.1":
+  "integrity" "sha512-AZ7qJUvhTCBiOtG21aFJUcNuLVo2FFM6JMGKvaUGAH+QDqQAp2iG0nq3GcuXmJOFQR2JjpjhyYkyPrbFKhdjNQ=="
+  "resolved" "https://registry.npmjs.org/write-file-webpack-plugin/-/write-file-webpack-plugin-4.5.1.tgz"
+  "version" "4.5.1"
+  dependencies:
+    "chalk" "^2.4.0"
+    "debug" "^3.1.0"
+    "filesize" "^3.6.1"
+    "lodash" "^4.17.13"
+    "mkdirp" "^0.5.1"
+    "moment" "^2.22.1"
+    "write-file-atomic" "^2.3.0"
+
+"write@1.0.3":
+  "integrity" "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig=="
+  "resolved" "https://registry.npmjs.org/write/-/write-1.0.3.tgz"
+  "version" "1.0.3"
+  dependencies:
+    "mkdirp" "^0.5.1"
+
+"ws@^6.0.0", "ws@^6.2.1":
+  "integrity" "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw=="
+  "resolved" "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz"
+  "version" "6.2.2"
+  dependencies:
+    "async-limiter" "~1.0.0"
+
+"ws@^7.2.3":
+  "version" "7.5.0"
+
+"ws@~7.4.2":
+  "integrity" "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A=="
+  "resolved" "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz"
+  "version" "7.4.6"
+
+"xml-name-validator@^3.0.0":
+  "integrity" "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw=="
+  "resolved" "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz"
+  "version" "3.0.0"
+
+"xml@^1.0.1":
+  "integrity" "sha1-eLpyAgApxbyHuKgaPPzXS0ovweU="
+  "resolved" "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz"
+  "version" "1.0.1"
+
+"xml2js@^0.4.17", "xml2js@0.4.19":
+  "integrity" "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q=="
+  "resolved" "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz"
+  "version" "0.4.19"
+  dependencies:
+    "sax" ">=0.6.0"
+    "xmlbuilder" "~9.0.1"
+
+"xmlbuilder@~9.0.1":
+  "integrity" "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0="
+  "resolved" "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz"
+  "version" "9.0.7"
+
+"xmlchars@^2.2.0":
+  "integrity" "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw=="
+  "resolved" "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz"
+  "version" "2.2.0"
+
+"xmlhttprequest-ssl@~1.6.2":
+  "integrity" "sha512-3XfeQE/wNkvrIktn2Kf0869fC0BN6UpydVasGIeSm2B1Llihf7/0UfZM+eCkOw3P7bP4+qPgqhm7ZoxuJtFU0Q=="
+  "resolved" "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.6.3.tgz"
+  "version" "1.6.3"
+
+"xtend@^4.0.0", "xtend@~4.0.1":
+  "integrity" "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="
+  "resolved" "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz"
+  "version" "4.0.2"
+
+"y18n@^4.0.0":
+  "version" "4.0.2"
+
+"y18n@^5.0.5":
+  "version" "5.0.5"
+
+"yallist@^3.0.0", "yallist@^3.0.2", "yallist@^3.0.3":
+  "integrity" "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="
+  "resolved" "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz"
+  "version" "3.1.1"
+
+"yallist@^4.0.0":
+  "integrity" "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+  "resolved" "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz"
+  "version" "4.0.0"
+
+"yaml@^1.7.2":
+  "version" "1.10.0"
+
+"yargs-parser@^13.1.2":
+  "integrity" "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg=="
+  "resolved" "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz"
+  "version" "13.1.2"
+  dependencies:
+    "camelcase" "^5.0.0"
+    "decamelize" "^1.2.0"
+
+"yargs-parser@^18.1.0", "yargs-parser@^18.1.1", "yargs-parser@^18.1.2", "yargs-parser@18.x":
+  "integrity" "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ=="
+  "resolved" "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz"
+  "version" "18.1.3"
+  dependencies:
+    "camelcase" "^5.0.0"
+    "decamelize" "^1.2.0"
+
+"yargs-parser@^20.2.2", "yargs-parser@20.2.4":
+  "integrity" "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA=="
+  "resolved" "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz"
+  "version" "20.2.4"
+
+"yargs-unparser@2.0.0":
+  "integrity" "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA=="
+  "resolved" "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz"
+  "version" "2.0.0"
+  dependencies:
+    "camelcase" "^6.0.0"
+    "decamelize" "^4.0.0"
+    "flat" "^5.0.2"
+    "is-plain-obj" "^2.1.0"
+
+"yargs@^13.3.2":
+  "integrity" "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw=="
+  "resolved" "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz"
+  "version" "13.3.2"
+  dependencies:
+    "cliui" "^5.0.0"
+    "find-up" "^3.0.0"
+    "get-caller-file" "^2.0.1"
+    "require-directory" "^2.1.1"
+    "require-main-filename" "^2.0.0"
+    "set-blocking" "^2.0.0"
+    "string-width" "^3.0.0"
+    "which-module" "^2.0.0"
+    "y18n" "^4.0.0"
+    "yargs-parser" "^13.1.2"
+
+"yargs@^15.3.1":
+  "version" "15.3.1"
+  dependencies:
+    "cliui" "^6.0.0"
+    "decamelize" "^1.2.0"
+    "find-up" "^4.1.0"
+    "get-caller-file" "^2.0.1"
+    "require-directory" "^2.1.1"
+    "require-main-filename" "^2.0.0"
+    "set-blocking" "^2.0.0"
+    "string-width" "^4.2.0"
+    "which-module" "^2.0.0"
+    "y18n" "^4.0.0"
+    "yargs-parser" "^18.1.1"
+
+"yargs@^15.4.1":
+  "integrity" "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A=="
+  "resolved" "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz"
+  "version" "15.4.1"
+  dependencies:
+    "cliui" "^6.0.0"
+    "decamelize" "^1.2.0"
+    "find-up" "^4.1.0"
+    "get-caller-file" "^2.0.1"
+    "require-directory" "^2.1.1"
+    "require-main-filename" "^2.0.0"
+    "set-blocking" "^2.0.0"
+    "string-width" "^4.2.0"
+    "which-module" "^2.0.0"
+    "y18n" "^4.0.0"
+    "yargs-parser" "^18.1.2"
+
+"yargs@15.3.0":
+  "integrity" "sha512-g/QCnmjgOl1YJjGsnUg2SatC7NUYEiLXJqxNOQU9qSpjzGtGXda9b+OKccr1kLTy8BN9yqEyqfq5lxlwdc13TA=="
+  "resolved" "https://registry.npmjs.org/yargs/-/yargs-15.3.0.tgz"
+  "version" "15.3.0"
+  dependencies:
+    "cliui" "^6.0.0"
+    "decamelize" "^1.2.0"
+    "find-up" "^4.1.0"
+    "get-caller-file" "^2.0.1"
+    "require-directory" "^2.1.1"
+    "require-main-filename" "^2.0.0"
+    "set-blocking" "^2.0.0"
+    "string-width" "^4.2.0"
+    "which-module" "^2.0.0"
+    "y18n" "^4.0.0"
+    "yargs-parser" "^18.1.0"
+
+"yargs@16.2.0":
+  "integrity" "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw=="
+  "resolved" "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz"
+  "version" "16.2.0"
+  dependencies:
+    "cliui" "^7.0.2"
+    "escalade" "^3.1.1"
+    "get-caller-file" "^2.0.5"
+    "require-directory" "^2.1.1"
+    "string-width" "^4.2.0"
+    "y18n" "^5.0.5"
+    "yargs-parser" "^20.2.2"
+
+"yeast@0.1.2":
+  "integrity" "sha1-AI4G2AlDIMNy28L47XagymyKxBk="
+  "resolved" "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz"
+  "version" "0.1.2"
+
+"yeoman-environment@^2.9.5", "yeoman-environment@2.10.3":
+  "integrity" "sha512-pLIhhU9z/G+kjOXmJ2bPFm3nejfbH+f1fjYRSOteEXDBrv1EoJE/e+kuHixSXfCYfTkxjYsvRaDX+1QykLCnpQ=="
+  "resolved" "https://registry.npmjs.org/yeoman-environment/-/yeoman-environment-2.10.3.tgz"
+  "version" "2.10.3"
+  dependencies:
+    "chalk" "^2.4.1"
+    "debug" "^3.1.0"
+    "diff" "^3.5.0"
+    "escape-string-regexp" "^1.0.2"
+    "execa" "^4.0.0"
+    "globby" "^8.0.1"
+    "grouped-queue" "^1.1.0"
+    "inquirer" "^7.1.0"
+    "is-scoped" "^1.0.0"
+    "lodash" "^4.17.10"
+    "log-symbols" "^2.2.0"
+    "mem-fs" "^1.1.0"
+    "mem-fs-editor" "^6.0.0"
+    "npm-api" "^1.0.0"
+    "semver" "^7.1.3"
+    "strip-ansi" "^4.0.0"
+    "text-table" "^0.2.0"
+    "untildify" "^3.0.3"
+    "yeoman-generator" "^4.8.2"
+
+"yeoman-generator@^4.8.2", "yeoman-generator@4.11.0":
+  "integrity" "sha512-++t6t2Z6HjL5F1/UM7+uNvGknKmQdF8tstJx8WKzsUSEpB+19kLVtapSfQIh9uWqm0L59fLWDzUui//WXoynPw=="
+  "resolved" "https://registry.npmjs.org/yeoman-generator/-/yeoman-generator-4.11.0.tgz"
+  "version" "4.11.0"
+  dependencies:
+    "async" "^2.6.2"
+    "chalk" "^2.4.2"
+    "cli-table" "^0.3.1"
+    "cross-spawn" "^6.0.5"
+    "dargs" "^6.1.0"
+    "dateformat" "^3.0.3"
+    "debug" "^4.1.1"
+    "diff" "^4.0.1"
+    "error" "^7.0.2"
+    "find-up" "^3.0.0"
+    "github-username" "^3.0.0"
+    "istextorbinary" "^2.5.1"
+    "lodash" "^4.17.11"
+    "make-dir" "^3.0.0"
+    "mem-fs-editor" "^7.0.1"
+    "minimist" "^1.2.5"
+    "pretty-bytes" "^5.2.0"
+    "read-chunk" "^3.2.0"
+    "read-pkg-up" "^5.0.0"
+    "rimraf" "^2.6.3"
+    "run-async" "^2.0.0"
+    "semver" "^7.2.1"
+    "shelljs" "^0.8.3"
+    "text-table" "^0.2.0"
+    "through2" "^3.0.1"
+  optionalDependencies:
+    "grouped-queue" "^1.1.0"
+    "yeoman-environment" "^2.9.5"
+
+"yn@3.1.1":
+  "integrity" "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q=="
+  "resolved" "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz"
+  "version" "3.1.1"
+
+"yocto-queue@^0.1.0":
+  "integrity" "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="
+  "resolved" "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz"
+  "version" "0.1.0"
+
+"yup@^0.27.0":
+  "integrity" "sha512-v1yFnE4+u9za42gG/b/081E7uNW9mUj3qtkmelLbW5YPROZzSH/KUUyJu9Wt8vxFJcT9otL/eZopS0YK1L5yPQ=="
+  "resolved" "https://registry.npmjs.org/yup/-/yup-0.27.0.tgz"
+  "version" "0.27.0"
+  dependencies:
+    "@babel/runtime" "^7.0.0"
+    "fn-name" "~2.0.1"
+    "lodash" "^4.17.11"
+    "property-expr" "^1.5.0"
+    "synchronous-promise" "^2.0.6"
+    "toposort" "^2.0.2"
+
+"zone.js@^0.10.3", "zone.js@~0.10.3", "zone.js@0.10.3":
+  "integrity" "sha512-LXVLVEq0NNOqK/fLJo3d0kfzd4sxwn2/h67/02pjCjfKDxgx1i9QqpvtHD8CrBnSSwMw5+dy11O7FRX5mkO7Cg=="
+  "resolved" "https://registry.npmjs.org/zone.js/-/zone.js-0.10.3.tgz"
+  "version" "0.10.3"