From be3cbc5189ec6b1f0ca85d6ba5db623f5be5ff4e Mon Sep 17 00:00:00 2001
From: Diego Francisco Carvajal Flores <diegofcarvajalf@gmail.com>
Date: Wed, 20 Apr 2022 12:26:13 +0200
Subject: [PATCH] Update files

---
 .eslintrc.js      |    5 +
 .gitignore        |    3 +
 Dockerfile        |   21 +
 Logger.ts         |   20 +
 environment.env   |   11 +
 package-lock.json | 3744 +++++++++++++++++++++++++++++++++++++++++++++
 package.json      |   32 +
 script.sh         |   14 +
 test.ts           |   39 +
 trytypes.ts       |   17 +
 tsconfig.json     |   13 +
 upmclient.ts      |  285 ++++
 12 files changed, 4204 insertions(+)
 create mode 100644 .eslintrc.js
 create mode 100644 .gitignore
 create mode 100644 Dockerfile
 create mode 100644 Logger.ts
 create mode 100644 environment.env
 create mode 100644 package-lock.json
 create mode 100644 package.json
 create mode 100644 script.sh
 create mode 100644 test.ts
 create mode 100644 trytypes.ts
 create mode 100644 tsconfig.json
 create mode 100644 upmclient.ts

diff --git a/.eslintrc.js b/.eslintrc.js
new file mode 100644
index 0000000..c40d14c
--- /dev/null
+++ b/.eslintrc.js
@@ -0,0 +1,5 @@
+module.exports = {
+    parserOptions: {
+        ecmaVersion: 8
+    }
+};
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..3c4ae0c
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,3 @@
+/node_modules
+/upmclient.tar
+/*.tar
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000..e0b247d
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,21 @@
+FROM node:10
+
+WORKDIR /usr
+
+COPY package.json ./
+
+COPY . .
+
+# COPY ./client.ts ./
+
+COPY ./upmclient.ts ./
+
+COPY ./Logger.ts ./
+
+RUN npm install
+
+EXPOSE 4005 
+
+RUN npm install -g ts-node
+
+CMD [ "ts-node", "./upmclient.ts" ]
diff --git a/Logger.ts b/Logger.ts
new file mode 100644
index 0000000..d46df98
--- /dev/null
+++ b/Logger.ts
@@ -0,0 +1,20 @@
+export class Logger {
+    loggerSignature="";
+   
+    static log(logLevel:string,logMessage:string) {
+      console.log(`${new Date().toISOString()} - UPMCLIENT - ${logLevel} -> ${logMessage}`); 
+    }
+
+    static failure(message:string){
+        Logger.log('FAILURE',message);
+    }
+    static sucess(message:string){
+        Logger.log('SUCESS',message);
+    }
+    static warn(message:string){
+        Logger.log('WARN',message);
+    }
+    static debug(message:string){
+        Logger.log('DEBUG',message);
+    }
+  }
\ No newline at end of file
diff --git a/environment.env b/environment.env
new file mode 100644
index 0000000..6b5118f
--- /dev/null
+++ b/environment.env
@@ -0,0 +1,11 @@
+LINE_2_URL=opc.tcp://10.100.151.40:4840
+TypeNoCur_NODEID_L2=ns=4;s=DataHandling.TypeNoCur
+BlisterEntry_NODEID_L2=ns=4;s=Station090.BlisterEntry
+
+LINE_5_URL=opc.tcp://192.168.10.90:4840
+TypeNoCur_NODEID_L5=ns=4;s=DataHandling.TypeNoCur
+BlisterEntry_NODEID_L5=ns=4;s=Station090.BlisterEntry
+
+FIWARE_NODE_ID=urn:ngsi-ld:Alert:BOSH:feed-trigger-
+FIWARE_SERVER_URL=http://10.100.147.11:1026
+#FIWARE_RECORD_TYPE=https://uri.fiware.org/ns/data-models%23Alert
\ No newline at end of file
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 0000000..d3bbb0d
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,3744 @@
+{
+  "name": "node-opcua-sample",
+  "version": "0.4.5",
+  "lockfileVersion": 1,
+  "requires": true,
+  "dependencies": {
+    "@nodelib/fs.scandir": {
+      "version": "2.1.3",
+      "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz",
+      "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==",
+      "requires": {
+        "@nodelib/fs.stat": "2.0.3",
+        "run-parallel": "^1.1.9"
+      }
+    },
+    "@nodelib/fs.stat": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz",
+      "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA=="
+    },
+    "@nodelib/fs.walk": {
+      "version": "1.2.4",
+      "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz",
+      "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==",
+      "requires": {
+        "@nodelib/fs.scandir": "2.1.3",
+        "fastq": "^1.6.0"
+      }
+    },
+    "@sindresorhus/is": {
+      "version": "0.14.0",
+      "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz",
+      "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ=="
+    },
+    "@szmarczak/http-timer": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz",
+      "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==",
+      "requires": {
+        "defer-to-connect": "^1.0.1"
+      }
+    },
+    "@types/async": {
+      "version": "3.2.3",
+      "resolved": "https://registry.npmjs.org/@types/async/-/async-3.2.3.tgz",
+      "integrity": "sha512-deXFjLZc1h6SOh3hicVgD+S2EAkhSBGX/vdlD4nTzCjjOFQ+bfNiXocQ21xJjFAUwqaCeyvOQMgrnbg4QEV63A=="
+    },
+    "@types/bonjour": {
+      "version": "3.5.6",
+      "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.6.tgz",
+      "integrity": "sha512-BQvTuANZ2UyBnrAxxdI0ZeJEqelV7oJHLmczwPng0OawCpuMPfPVWTglFWSyRCfaeeSJFdnlPREmoK6BU9xzgA==",
+      "requires": {
+        "@types/node": "*"
+      }
+    },
+    "@types/color-name": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz",
+      "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ=="
+    },
+    "@types/glob": {
+      "version": "7.1.3",
+      "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz",
+      "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==",
+      "requires": {
+        "@types/minimatch": "*",
+        "@types/node": "*"
+      }
+    },
+    "@types/json5": {
+      "version": "0.0.29",
+      "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz",
+      "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=",
+      "dev": true
+    },
+    "@types/lodash": {
+      "version": "4.14.161",
+      "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.161.tgz",
+      "integrity": "sha512-EP6O3Jkr7bXvZZSZYlsgt5DIjiGr0dXP1/jVEwVLTFgg0d+3lWVQkRavYVQszV7dYUwvg0B8R0MBDpcmXg7XIA=="
+    },
+    "@types/minimatch": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
+      "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA=="
+    },
+    "@types/mkdirp": {
+      "version": "0.5.2",
+      "resolved": "https://registry.npmjs.org/@types/mkdirp/-/mkdirp-0.5.2.tgz",
+      "integrity": "sha512-U5icWpv7YnZYGsN4/cmh3WD2onMY0aJIiTE6+51TwJCttdHvtCYmkBNOobHlXwrJRL0nkH9jH4kD+1FAdMN4Tg==",
+      "requires": {
+        "@types/node": "*"
+      }
+    },
+    "@types/node": {
+      "version": "14.11.2",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-14.11.2.tgz",
+      "integrity": "sha512-jiE3QIxJ8JLNcb1Ps6rDbysDhN4xa8DJJvuC9prr6w+1tIh+QAbYyNF3tyiZNLDBIuBCf4KEcV2UvQm/V60xfA=="
+    },
+    "@types/once": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/@types/once/-/once-1.4.0.tgz",
+      "integrity": "sha512-cnEvTAVVRqF6OQg/4SLnbxQ0slZJHqZQDve5BzGhcIQtuMpPv8T5QNS2cBPa/W0jTxciqwn7bmJAIGe/bOJ5Kw=="
+    },
+    "@types/underscore": {
+      "version": "1.10.24",
+      "resolved": "https://registry.npmjs.org/@types/underscore/-/underscore-1.10.24.tgz",
+      "integrity": "sha512-T3NQD8hXNW2sRsSbLNjF/aBo18MyJlbw0lSpQHB/eZZtScPdexN4HSa8cByYwTw9Wy7KuOFr81mlDQcQQaZ79w=="
+    },
+    "aggregate-error": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz",
+      "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==",
+      "requires": {
+        "clean-stack": "^2.0.0",
+        "indent-string": "^4.0.0"
+      }
+    },
+    "ansi-align": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz",
+      "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==",
+      "requires": {
+        "string-width": "^3.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=="
+        },
+        "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==",
+          "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==",
+          "requires": {
+            "ansi-regex": "^4.1.0"
+          }
+        }
+      }
+    },
+    "ansi-regex": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+      "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
+    },
+    "ansi-styles": {
+      "version": "4.2.1",
+      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+      "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+      "requires": {
+        "@types/color-name": "^1.1.1",
+        "color-convert": "^2.0.1"
+      }
+    },
+    "any-promise": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
+      "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8="
+    },
+    "anymatch": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz",
+      "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==",
+      "requires": {
+        "normalize-path": "^3.0.0",
+        "picomatch": "^2.0.4"
+      }
+    },
+    "array-flatten": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz",
+      "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ=="
+    },
+    "array-includes": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.1.tgz",
+      "integrity": "sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==",
+      "dev": true,
+      "requires": {
+        "define-properties": "^1.1.3",
+        "es-abstract": "^1.17.0",
+        "is-string": "^1.0.5"
+      },
+      "dependencies": {
+        "es-abstract": {
+          "version": "1.17.7",
+          "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz",
+          "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==",
+          "dev": true,
+          "requires": {
+            "es-to-primitive": "^1.2.1",
+            "function-bind": "^1.1.1",
+            "has": "^1.0.3",
+            "has-symbols": "^1.0.1",
+            "is-callable": "^1.2.2",
+            "is-regex": "^1.1.1",
+            "object-inspect": "^1.8.0",
+            "object-keys": "^1.1.1",
+            "object.assign": "^4.1.1",
+            "string.prototype.trimend": "^1.0.1",
+            "string.prototype.trimstart": "^1.0.1"
+          }
+        }
+      }
+    },
+    "array-union": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
+      "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw=="
+    },
+    "array.prototype.flat": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz",
+      "integrity": "sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ==",
+      "dev": true,
+      "requires": {
+        "define-properties": "^1.1.3",
+        "es-abstract": "^1.17.0-next.1"
+      },
+      "dependencies": {
+        "es-abstract": {
+          "version": "1.17.7",
+          "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz",
+          "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==",
+          "dev": true,
+          "requires": {
+            "es-to-primitive": "^1.2.1",
+            "function-bind": "^1.1.1",
+            "has": "^1.0.3",
+            "has-symbols": "^1.0.1",
+            "is-callable": "^1.2.2",
+            "is-regex": "^1.1.1",
+            "object-inspect": "^1.8.0",
+            "object-keys": "^1.1.1",
+            "object.assign": "^4.1.1",
+            "string.prototype.trimend": "^1.0.1",
+            "string.prototype.trimstart": "^1.0.1"
+          }
+        }
+      }
+    },
+    "arrify": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
+      "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0="
+    },
+    "asn1": {
+      "version": "0.2.4",
+      "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
+      "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
+      "requires": {
+        "safer-buffer": "~2.1.0"
+      }
+    },
+    "assert-plus": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+      "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
+    },
+    "async": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz",
+      "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw=="
+    },
+    "axios": {
+      "version": "0.21.4",
+      "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz",
+      "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==",
+      "requires": {
+        "follow-redirects": "^1.14.0"
+      }
+    },
+    "backoff": {
+      "version": "2.5.0",
+      "resolved": "https://registry.npmjs.org/backoff/-/backoff-2.5.0.tgz",
+      "integrity": "sha1-9hbtqdPktmuMp/ynn2lXIsX44m8=",
+      "requires": {
+        "precond": "0.2"
+      }
+    },
+    "balanced-match": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+      "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
+    },
+    "bcrypt-pbkdf": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
+      "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
+      "requires": {
+        "tweetnacl": "^0.14.3"
+      }
+    },
+    "better-assert": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz",
+      "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=",
+      "requires": {
+        "callsite": "1.0.0"
+      }
+    },
+    "binary-extensions": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz",
+      "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ=="
+    },
+    "bomstrip": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/bomstrip/-/bomstrip-0.1.4.tgz",
+      "integrity": "sha1-aSNnOCHMVHEatlYtQIhSZVzBGys="
+    },
+    "bonjour": {
+      "version": "3.5.0",
+      "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz",
+      "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=",
+      "requires": {
+        "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": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
+      "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24="
+    },
+    "boxen": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz",
+      "integrity": "sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==",
+      "requires": {
+        "ansi-align": "^3.0.0",
+        "camelcase": "^5.3.1",
+        "chalk": "^3.0.0",
+        "cli-boxes": "^2.2.0",
+        "string-width": "^4.1.0",
+        "term-size": "^2.1.0",
+        "type-fest": "^0.8.1",
+        "widest-line": "^3.1.0"
+      },
+      "dependencies": {
+        "chalk": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
+          "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        }
+      }
+    },
+    "brace-expansion": {
+      "version": "1.1.11",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+      "requires": {
+        "balanced-match": "^1.0.0",
+        "concat-map": "0.0.1"
+      }
+    },
+    "braces": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+      "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+      "requires": {
+        "fill-range": "^7.0.1"
+      }
+    },
+    "browser-process-hrtime": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz",
+      "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow=="
+    },
+    "buffer-crc32": {
+      "version": "0.2.13",
+      "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
+      "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI="
+    },
+    "buffer-indexof": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz",
+      "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g=="
+    },
+    "byline": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/byline/-/byline-5.0.0.tgz",
+      "integrity": "sha1-dBxSFkaOrcRXsDQQEYrXfejB3bE="
+    },
+    "cacheable-request": {
+      "version": "6.1.0",
+      "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz",
+      "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==",
+      "requires": {
+        "clone-response": "^1.0.2",
+        "get-stream": "^5.1.0",
+        "http-cache-semantics": "^4.0.0",
+        "keyv": "^3.0.0",
+        "lowercase-keys": "^2.0.0",
+        "normalize-url": "^4.1.0",
+        "responselike": "^1.0.2"
+      },
+      "dependencies": {
+        "get-stream": {
+          "version": "5.2.0",
+          "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
+          "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
+          "requires": {
+            "pump": "^3.0.0"
+          }
+        },
+        "lowercase-keys": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz",
+          "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA=="
+        }
+      }
+    },
+    "callbackify": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/callbackify/-/callbackify-1.1.0.tgz",
+      "integrity": "sha1-0qNphtKKppcUUmwREgm+65l50x4="
+    },
+    "callsite": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz",
+      "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA="
+    },
+    "camelcase": {
+      "version": "5.3.1",
+      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+      "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg=="
+    },
+    "chalk": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+      "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+      "requires": {
+        "ansi-styles": "^4.1.0",
+        "supports-color": "^7.1.0"
+      }
+    },
+    "chokidar": {
+      "version": "3.4.2",
+      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz",
+      "integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==",
+      "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.4.0"
+      }
+    },
+    "ci-info": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz",
+      "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ=="
+    },
+    "clean-stack": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
+      "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A=="
+    },
+    "cli-boxes": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz",
+      "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw=="
+    },
+    "cli-spinner": {
+      "version": "0.2.10",
+      "resolved": "https://registry.npmjs.org/cli-spinner/-/cli-spinner-0.2.10.tgz",
+      "integrity": "sha512-U0sSQ+JJvSLi1pAYuJykwiA8Dsr15uHEy85iCJ6A+0DjVxivr3d+N2Wjvodeg89uP5K6TswFkKBfAD7B3YSn/Q=="
+    },
+    "cli-table": {
+      "version": "0.3.1",
+      "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.1.tgz",
+      "integrity": "sha1-9TsFJmqLGguTSz0IIebi3FkUriM=",
+      "requires": {
+        "colors": "1.0.3"
+      },
+      "dependencies": {
+        "colors": {
+          "version": "1.0.3",
+          "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz",
+          "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs="
+        }
+      }
+    },
+    "cliui": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz",
+      "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
+      "requires": {
+        "string-width": "^4.2.0",
+        "strip-ansi": "^6.0.0",
+        "wrap-ansi": "^6.2.0"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+          "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg=="
+        },
+        "strip-ansi": {
+          "version": "6.0.0",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
+          "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+          "requires": {
+            "ansi-regex": "^5.0.0"
+          }
+        }
+      }
+    },
+    "clone-response": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz",
+      "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=",
+      "requires": {
+        "mimic-response": "^1.0.0"
+      }
+    },
+    "color-convert": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+      "requires": {
+        "color-name": "~1.1.4"
+      }
+    },
+    "color-name": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+    },
+    "colors": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz",
+      "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA=="
+    },
+    "concat-map": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+      "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
+    },
+    "configstore": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz",
+      "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==",
+      "requires": {
+        "dot-prop": "^5.2.0",
+        "graceful-fs": "^4.1.2",
+        "make-dir": "^3.0.0",
+        "unique-string": "^2.0.0",
+        "write-file-atomic": "^3.0.0",
+        "xdg-basedir": "^4.0.0"
+      }
+    },
+    "contains-path": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz",
+      "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=",
+      "dev": true
+    },
+    "crypto-random-string": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz",
+      "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA=="
+    },
+    "css-select": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz",
+      "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=",
+      "requires": {
+        "boolbase": "~1.0.0",
+        "css-what": "2.1",
+        "domutils": "1.5.1",
+        "nth-check": "~1.0.1"
+      }
+    },
+    "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=="
+    },
+    "dashdash": {
+      "version": "1.14.1",
+      "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
+      "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
+      "requires": {
+        "assert-plus": "^1.0.0"
+      }
+    },
+    "debug": {
+      "version": "2.6.9",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+      "dev": true,
+      "requires": {
+        "ms": "2.0.0"
+      }
+    },
+    "decamelize": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+      "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA="
+    },
+    "decompress-response": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz",
+      "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=",
+      "requires": {
+        "mimic-response": "^1.0.0"
+      }
+    },
+    "deep-equal": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz",
+      "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==",
+      "requires": {
+        "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": {
+      "version": "0.6.0",
+      "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
+      "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA=="
+    },
+    "defer-to-connect": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz",
+      "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ=="
+    },
+    "define-properties": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
+      "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
+      "requires": {
+        "object-keys": "^1.0.12"
+      }
+    },
+    "del": {
+      "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/del/-/del-5.1.0.tgz",
+      "integrity": "sha512-wH9xOVHnczo9jN2IW68BabcecVPxacIA3g/7z6vhSU/4stOKQzeCRK0yD0A24WiAAUJmmVpWqrERcTxnLo3AnA==",
+      "requires": {
+        "globby": "^10.0.1",
+        "graceful-fs": "^4.2.2",
+        "is-glob": "^4.0.1",
+        "is-path-cwd": "^2.2.0",
+        "is-path-inside": "^3.0.1",
+        "p-map": "^3.0.0",
+        "rimraf": "^3.0.0",
+        "slash": "^3.0.0"
+      },
+      "dependencies": {
+        "graceful-fs": {
+          "version": "4.2.4",
+          "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
+          "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw=="
+        }
+      }
+    },
+    "delayed": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/delayed/-/delayed-2.0.0.tgz",
+      "integrity": "sha512-egVMG7oyLvt0hQTCFkk15ly065RcPYr4ePCjxETESVX5UJLe+kh9MGD8TFkDWHOhga/ljNPZE1AEM2/sL0KK0w=="
+    },
+    "dequeue": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/dequeue/-/dequeue-1.0.5.tgz",
+      "integrity": "sha1-EPHO8H4yNLIdyzj0v6LWYDSrZ8c="
+    },
+    "diff": {
+      "version": "3.5.0",
+      "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz",
+      "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA=="
+    },
+    "dir-glob": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
+      "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
+      "requires": {
+        "path-type": "^4.0.0"
+      },
+      "dependencies": {
+        "path-type": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+          "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="
+        }
+      }
+    },
+    "dns-equal": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz",
+      "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0="
+    },
+    "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==",
+      "requires": {
+        "ip": "^1.1.0",
+        "safe-buffer": "^5.0.1"
+      }
+    },
+    "dns-txt": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz",
+      "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=",
+      "requires": {
+        "buffer-indexof": "^1.0.0"
+      }
+    },
+    "doctrine": {
+      "version": "1.5.0",
+      "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz",
+      "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=",
+      "dev": true,
+      "requires": {
+        "esutils": "^2.0.2",
+        "isarray": "^1.0.0"
+      }
+    },
+    "dom-converter": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz",
+      "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==",
+      "requires": {
+        "utila": "~0.4"
+      }
+    },
+    "dom-serializer": {
+      "version": "0.2.2",
+      "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz",
+      "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==",
+      "requires": {
+        "domelementtype": "^2.0.1",
+        "entities": "^2.0.0"
+      },
+      "dependencies": {
+        "domelementtype": {
+          "version": "2.0.2",
+          "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.2.tgz",
+          "integrity": "sha512-wFwTwCVebUrMgGeAwRL/NhZtHAUyT9n9yg4IMDwf10+6iCMxSkVq9MGCVEH+QZWo1nNidy8kNvwmv4zWHDTqvA=="
+        }
+      }
+    },
+    "domelementtype": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz",
+      "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w=="
+    },
+    "domhandler": {
+      "version": "2.4.2",
+      "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz",
+      "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==",
+      "requires": {
+        "domelementtype": "1"
+      }
+    },
+    "domutils": {
+      "version": "1.5.1",
+      "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz",
+      "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=",
+      "requires": {
+        "dom-serializer": "0",
+        "domelementtype": "1"
+      }
+    },
+    "dot-prop": {
+      "version": "5.3.0",
+      "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz",
+      "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==",
+      "requires": {
+        "is-obj": "^2.0.0"
+      }
+    },
+    "duplexer3": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz",
+      "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI="
+    },
+    "ecc-jsbn": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
+      "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
+      "requires": {
+        "jsbn": "~0.1.0",
+        "safer-buffer": "^2.1.0"
+      }
+    },
+    "emoji-regex": {
+      "version": "7.0.3",
+      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
+      "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA=="
+    },
+    "end-of-stream": {
+      "version": "1.4.4",
+      "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
+      "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
+      "requires": {
+        "once": "^1.4.0"
+      }
+    },
+    "entities": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.3.tgz",
+      "integrity": "sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ=="
+    },
+    "env-paths": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.0.tgz",
+      "integrity": "sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA=="
+    },
+    "error-ex": {
+      "version": "1.3.2",
+      "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
+      "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
+      "dev": true,
+      "requires": {
+        "is-arrayish": "^0.2.1"
+      }
+    },
+    "es-abstract": {
+      "version": "1.18.0-next.1",
+      "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz",
+      "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==",
+      "requires": {
+        "es-to-primitive": "^1.2.1",
+        "function-bind": "^1.1.1",
+        "has": "^1.0.3",
+        "has-symbols": "^1.0.1",
+        "is-callable": "^1.2.2",
+        "is-negative-zero": "^2.0.0",
+        "is-regex": "^1.1.1",
+        "object-inspect": "^1.8.0",
+        "object-keys": "^1.1.1",
+        "object.assign": "^4.1.1",
+        "string.prototype.trimend": "^1.0.1",
+        "string.prototype.trimstart": "^1.0.1"
+      }
+    },
+    "es-to-primitive": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
+      "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
+      "requires": {
+        "is-callable": "^1.1.4",
+        "is-date-object": "^1.0.1",
+        "is-symbol": "^1.0.2"
+      }
+    },
+    "escape-goat": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz",
+      "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q=="
+    },
+    "escape-string-regexp": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+      "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
+    },
+    "eslint-config-standard": {
+      "version": "14.1.1",
+      "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-14.1.1.tgz",
+      "integrity": "sha512-Z9B+VR+JIXRxz21udPTL9HpFMyoMUEeX1G251EQ6e05WD9aPVtVBn09XUmZ259wCMlCDmYDSZG62Hhm+ZTJcUg==",
+      "dev": true
+    },
+    "eslint-import-resolver-node": {
+      "version": "0.3.4",
+      "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz",
+      "integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==",
+      "dev": true,
+      "requires": {
+        "debug": "^2.6.9",
+        "resolve": "^1.13.1"
+      }
+    },
+    "eslint-module-utils": {
+      "version": "2.6.0",
+      "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz",
+      "integrity": "sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==",
+      "dev": true,
+      "requires": {
+        "debug": "^2.6.9",
+        "pkg-dir": "^2.0.0"
+      }
+    },
+    "eslint-plugin-es": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz",
+      "integrity": "sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==",
+      "dev": true,
+      "requires": {
+        "eslint-utils": "^2.0.0",
+        "regexpp": "^3.0.0"
+      }
+    },
+    "eslint-plugin-import": {
+      "version": "2.22.1",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz",
+      "integrity": "sha512-8K7JjINHOpH64ozkAhpT3sd+FswIZTfMZTjdx052pnWrgRCVfp8op9tbjpAk3DdUeI/Ba4C8OjdC0r90erHEOw==",
+      "dev": true,
+      "requires": {
+        "array-includes": "^3.1.1",
+        "array.prototype.flat": "^1.2.3",
+        "contains-path": "^0.1.0",
+        "debug": "^2.6.9",
+        "doctrine": "1.5.0",
+        "eslint-import-resolver-node": "^0.3.4",
+        "eslint-module-utils": "^2.6.0",
+        "has": "^1.0.3",
+        "minimatch": "^3.0.4",
+        "object.values": "^1.1.1",
+        "read-pkg-up": "^2.0.0",
+        "resolve": "^1.17.0",
+        "tsconfig-paths": "^3.9.0"
+      }
+    },
+    "eslint-plugin-node": {
+      "version": "11.1.0",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz",
+      "integrity": "sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==",
+      "dev": true,
+      "requires": {
+        "eslint-plugin-es": "^3.0.0",
+        "eslint-utils": "^2.0.0",
+        "ignore": "^5.1.1",
+        "minimatch": "^3.0.4",
+        "resolve": "^1.10.1",
+        "semver": "^6.1.0"
+      },
+      "dependencies": {
+        "semver": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+          "dev": true
+        }
+      }
+    },
+    "eslint-plugin-promise": {
+      "version": "4.2.1",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-4.2.1.tgz",
+      "integrity": "sha512-VoM09vT7bfA7D+upt+FjeBO5eHIJQBUWki1aPvB+vbNiHS3+oGIJGIeyBtKQTME6UPXXy3vV07OL1tHd3ANuDw==",
+      "dev": true
+    },
+    "eslint-plugin-standard": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-4.0.1.tgz",
+      "integrity": "sha512-v/KBnfyaOMPmZc/dmc6ozOdWqekGp7bBGq4jLAecEfPGmfKiWS4sA8sC0LqiV9w5qmXAtXVn4M3p1jSyhY85SQ==",
+      "dev": true
+    },
+    "eslint-utils": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz",
+      "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==",
+      "dev": true,
+      "requires": {
+        "eslint-visitor-keys": "^1.1.0"
+      }
+    },
+    "eslint-visitor-keys": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
+      "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
+      "dev": true
+    },
+    "esutils": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+      "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+      "dev": true
+    },
+    "fast-glob": {
+      "version": "3.2.4",
+      "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz",
+      "integrity": "sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==",
+      "requires": {
+        "@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"
+      }
+    },
+    "fastq": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.8.0.tgz",
+      "integrity": "sha512-SMIZoZdLh/fgofivvIkmknUXyPnvxRE3DhtZ5Me3Mrsk5gyPL42F0xr51TdRXskBxHfMp+07bcYzfsYEsSQA9Q==",
+      "requires": {
+        "reusify": "^1.0.4"
+      }
+    },
+    "fd-slicer": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz",
+      "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=",
+      "requires": {
+        "pend": "~1.2.0"
+      }
+    },
+    "fill-range": {
+      "version": "7.0.1",
+      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+      "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+      "requires": {
+        "to-regex-range": "^5.0.1"
+      }
+    },
+    "find-up": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
+      "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
+      "dev": true,
+      "requires": {
+        "locate-path": "^2.0.0"
+      },
+      "dependencies": {
+        "locate-path": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
+          "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
+          "dev": true,
+          "requires": {
+            "p-locate": "^2.0.0",
+            "path-exists": "^3.0.0"
+          }
+        },
+        "p-limit": {
+          "version": "1.3.0",
+          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
+          "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
+          "dev": true,
+          "requires": {
+            "p-try": "^1.0.0"
+          }
+        },
+        "p-locate": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
+          "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
+          "dev": true,
+          "requires": {
+            "p-limit": "^1.1.0"
+          }
+        },
+        "p-try": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
+          "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
+          "dev": true
+        }
+      }
+    },
+    "follow-redirects": {
+      "version": "1.14.3",
+      "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.3.tgz",
+      "integrity": "sha512-3MkHxknWMUtb23apkgz/83fDoe+y+qr0TdgacGIA7bew+QLBo3vdgEN2xEsuXNivpFy4CyDhBBZnNZOtalmenw=="
+    },
+    "foreachasync": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/foreachasync/-/foreachasync-3.0.0.tgz",
+      "integrity": "sha1-VQKYfchxS+M5IJfzLgBxyd7gfPY="
+    },
+    "fs.realpath": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+      "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
+    },
+    "fsevents": {
+      "version": "2.1.3",
+      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz",
+      "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==",
+      "optional": true
+    },
+    "function-bind": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
+    },
+    "get-caller-file": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+      "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="
+    },
+    "get-stream": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
+      "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
+      "requires": {
+        "pump": "^3.0.0"
+      }
+    },
+    "getpass": {
+      "version": "0.1.7",
+      "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
+      "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
+      "requires": {
+        "assert-plus": "^1.0.0"
+      }
+    },
+    "glob": {
+      "version": "7.1.6",
+      "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
+      "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
+      "requires": {
+        "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-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==",
+      "requires": {
+        "is-glob": "^4.0.1"
+      }
+    },
+    "global-dirs": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.0.1.tgz",
+      "integrity": "sha512-5HqUqdhkEovj2Of/ms3IeS/EekcO54ytHRLV4PEY2rhRwrHXLQjeVEES0Lhka0xwNDtGYn58wyC4s5+MHsOO6A==",
+      "requires": {
+        "ini": "^1.3.5"
+      }
+    },
+    "globby": {
+      "version": "10.0.2",
+      "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz",
+      "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==",
+      "requires": {
+        "@types/glob": "^7.1.1",
+        "array-union": "^2.1.0",
+        "dir-glob": "^3.0.1",
+        "fast-glob": "^3.0.3",
+        "glob": "^7.1.3",
+        "ignore": "^5.1.1",
+        "merge2": "^1.2.3",
+        "slash": "^3.0.0"
+      },
+      "dependencies": {
+        "ignore": {
+          "version": "5.1.8",
+          "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz",
+          "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw=="
+        }
+      }
+    },
+    "got": {
+      "version": "9.6.0",
+      "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz",
+      "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==",
+      "requires": {
+        "@sindresorhus/is": "^0.14.0",
+        "@szmarczak/http-timer": "^1.1.2",
+        "cacheable-request": "^6.0.0",
+        "decompress-response": "^3.3.0",
+        "duplexer3": "^0.1.4",
+        "get-stream": "^4.1.0",
+        "lowercase-keys": "^1.0.1",
+        "mimic-response": "^1.0.1",
+        "p-cancelable": "^1.0.0",
+        "to-readable-stream": "^1.0.0",
+        "url-parse-lax": "^3.0.0"
+      }
+    },
+    "graceful-fs": {
+      "version": "4.1.11",
+      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
+      "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg="
+    },
+    "has": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+      "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+      "requires": {
+        "function-bind": "^1.1.1"
+      }
+    },
+    "has-flag": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+    },
+    "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=="
+    },
+    "has-yarn": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz",
+      "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw=="
+    },
+    "hexy": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/hexy/-/hexy-0.3.0.tgz",
+      "integrity": "sha512-+pMQUQCkl1DQ/Im/Y3wixzIr2j8+o8gRIcB3Dw5n5kcbPwPGEEde9hfX3HzRzR00pS/8NmSohSvYnhBs0jA4hw=="
+    },
+    "homedir-polyfill": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz",
+      "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==",
+      "requires": {
+        "parse-passwd": "^1.0.0"
+      }
+    },
+    "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
+    },
+    "htmlparser2": {
+      "version": "3.10.1",
+      "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz",
+      "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==",
+      "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"
+      },
+      "dependencies": {
+        "entities": {
+          "version": "1.1.2",
+          "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz",
+          "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w=="
+        }
+      }
+    },
+    "http-cache-semantics": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz",
+      "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ=="
+    },
+    "humanize": {
+      "version": "0.0.9",
+      "resolved": "https://registry.npmjs.org/humanize/-/humanize-0.0.9.tgz",
+      "integrity": "sha1-GZT/rs3+nEQe0r2sdFK3u0yeQaQ="
+    },
+    "ignore": {
+      "version": "5.1.8",
+      "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz",
+      "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==",
+      "dev": true
+    },
+    "import-lazy": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz",
+      "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM="
+    },
+    "imurmurhash": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+      "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o="
+    },
+    "indent-string": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
+      "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg=="
+    },
+    "inflight": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+      "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+      "requires": {
+        "once": "^1.3.0",
+        "wrappy": "1"
+      }
+    },
+    "inherits": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
+    },
+    "ini": {
+      "version": "1.3.5",
+      "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
+      "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw=="
+    },
+    "ip": {
+      "version": "1.1.5",
+      "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz",
+      "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo="
+    },
+    "is-arguments": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz",
+      "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA=="
+    },
+    "is-arrayish": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+      "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
+      "dev": true
+    },
+    "is-binary-path": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+      "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+      "requires": {
+        "binary-extensions": "^2.0.0"
+      }
+    },
+    "is-callable": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz",
+      "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA=="
+    },
+    "is-ci": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz",
+      "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==",
+      "requires": {
+        "ci-info": "^2.0.0"
+      }
+    },
+    "is-date-object": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz",
+      "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g=="
+    },
+    "is-extglob": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+      "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI="
+    },
+    "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="
+    },
+    "is-glob": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
+      "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
+      "requires": {
+        "is-extglob": "^2.1.1"
+      }
+    },
+    "is-installed-globally": {
+      "version": "0.3.2",
+      "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz",
+      "integrity": "sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==",
+      "requires": {
+        "global-dirs": "^2.0.1",
+        "is-path-inside": "^3.0.1"
+      }
+    },
+    "is-negative-zero": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.0.tgz",
+      "integrity": "sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE="
+    },
+    "is-npm": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz",
+      "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA=="
+    },
+    "is-number": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+      "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="
+    },
+    "is-obj": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz",
+      "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w=="
+    },
+    "is-path-cwd": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz",
+      "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ=="
+    },
+    "is-path-inside": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.2.tgz",
+      "integrity": "sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg=="
+    },
+    "is-regex": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz",
+      "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==",
+      "requires": {
+        "has-symbols": "^1.0.1"
+      }
+    },
+    "is-string": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz",
+      "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==",
+      "dev": true
+    },
+    "is-symbol": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz",
+      "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==",
+      "requires": {
+        "has-symbols": "^1.0.1"
+      }
+    },
+    "is-typedarray": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
+      "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo="
+    },
+    "is-yarn-global": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz",
+      "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw=="
+    },
+    "isarray": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+      "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+      "dev": true
+    },
+    "jsbn": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
+      "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM="
+    },
+    "json-buffer": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz",
+      "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg="
+    },
+    "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"
+      }
+    },
+    "jsrsasign": {
+      "version": "10.0.0",
+      "resolved": "https://registry.npmjs.org/jsrsasign/-/jsrsasign-10.0.0.tgz",
+      "integrity": "sha512-U1lSbeqaRN8aUOvbsfX7xzFXcjtV1g5zaWI+TrjBwZ46kSH0gZscEquyO9cmaTPTv1U1KAJxoSLUx79dM03Exw=="
+    },
+    "keyv": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz",
+      "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==",
+      "requires": {
+        "json-buffer": "3.0.0"
+      }
+    },
+    "latest-version": {
+      "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz",
+      "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==",
+      "requires": {
+        "package-json": "^6.3.0"
+      }
+    },
+    "load-json-file": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz",
+      "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=",
+      "dev": true,
+      "requires": {
+        "graceful-fs": "^4.1.2",
+        "parse-json": "^2.2.0",
+        "pify": "^2.0.0",
+        "strip-bom": "^3.0.0"
+      }
+    },
+    "locate-path": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+      "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+      "requires": {
+        "p-locate": "^4.1.0"
+      }
+    },
+    "lodash": {
+      "version": "4.17.20",
+      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz",
+      "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA=="
+    },
+    "long": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz",
+      "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA=="
+    },
+    "lowercase-keys": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
+      "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA=="
+    },
+    "ltx": {
+      "version": "2.10.0",
+      "resolved": "https://registry.npmjs.org/ltx/-/ltx-2.10.0.tgz",
+      "integrity": "sha512-RB4zR6Mrp/0wTNS9WxMvpgfht/7u/8QAC9DpPD19opL/4OASPa28uoliFqeDkLUU8pQ4aeAfATBZmz1aSAHkMw==",
+      "requires": {
+        "inherits": "^2.0.4"
+      }
+    },
+    "make-dir": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
+      "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
+      "requires": {
+        "semver": "^6.0.0"
+      },
+      "dependencies": {
+        "semver": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
+        }
+      }
+    },
+    "make-error": {
+      "version": "1.3.6",
+      "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz",
+      "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw=="
+    },
+    "merge2": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+      "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="
+    },
+    "micromatch": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz",
+      "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==",
+      "requires": {
+        "braces": "^3.0.1",
+        "picomatch": "^2.0.5"
+      }
+    },
+    "mimic-response": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz",
+      "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ=="
+    },
+    "minimatch": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+      "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+      "requires": {
+        "brace-expansion": "^1.1.7"
+      }
+    },
+    "minimist": {
+      "version": "1.2.5",
+      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
+      "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
+    },
+    "mkdirp": {
+      "version": "0.5.5",
+      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
+      "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
+      "requires": {
+        "minimist": "^1.2.5"
+      }
+    },
+    "ms": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+      "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+      "dev": true
+    },
+    "multicast-dns": {
+      "version": "6.2.3",
+      "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz",
+      "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==",
+      "requires": {
+        "dns-packet": "^1.3.1",
+        "thunky": "^1.0.2"
+      }
+    },
+    "multicast-dns-service-types": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz",
+      "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE="
+    },
+    "node-opcua": {
+      "version": "2.18.0",
+      "resolved": "https://registry.npmjs.org/node-opcua/-/node-opcua-2.18.0.tgz",
+      "integrity": "sha512-GHLzrsHGUYMgjxxxa6yiNgxsZ71b2P2OlLDXmZY8Mr7Bu/3RYsYpv857alNGq/A+FY/rEXKOnAVKcXx2bL3HiQ==",
+      "requires": {
+        "chalk": "^4.1.0",
+        "node-opcua-address-space": "2.17.0",
+        "node-opcua-address-space-for-conformance-testing": "2.17.0",
+        "node-opcua-aggregates": "2.17.0",
+        "node-opcua-assert": "2.16.0",
+        "node-opcua-basic-types": "2.17.0",
+        "node-opcua-binary-stream": "2.17.0",
+        "node-opcua-certificate-manager": "2.17.0",
+        "node-opcua-client": "2.18.0",
+        "node-opcua-client-crawler": "2.18.0",
+        "node-opcua-client-proxy": "2.18.0",
+        "node-opcua-common": "2.17.0",
+        "node-opcua-constants": "2.16.0",
+        "node-opcua-crypto": "^1.3.7",
+        "node-opcua-data-access": "2.17.0",
+        "node-opcua-data-model": "2.17.0",
+        "node-opcua-data-value": "2.17.0",
+        "node-opcua-debug": "2.17.0",
+        "node-opcua-enum": "2.17.0",
+        "node-opcua-factory": "2.17.0",
+        "node-opcua-hostname": "2.16.0",
+        "node-opcua-nodeid": "2.17.0",
+        "node-opcua-nodesets": "2.13.0",
+        "node-opcua-numeric-range": "2.17.0",
+        "node-opcua-packet-analyzer": "2.17.0",
+        "node-opcua-secure-channel": "2.18.0",
+        "node-opcua-server": "2.18.0",
+        "node-opcua-server-discovery": "2.18.0",
+        "node-opcua-service-browse": "2.17.0",
+        "node-opcua-service-call": "2.17.0",
+        "node-opcua-service-discovery": "2.17.0",
+        "node-opcua-service-endpoints": "2.17.0",
+        "node-opcua-service-filter": "2.17.0",
+        "node-opcua-service-history": "2.17.0",
+        "node-opcua-service-node-management": "2.17.0",
+        "node-opcua-service-query": "2.18.0",
+        "node-opcua-service-read": "2.17.0",
+        "node-opcua-service-register-node": "2.17.0",
+        "node-opcua-service-secure-channel": "2.17.0",
+        "node-opcua-service-session": "2.17.0",
+        "node-opcua-service-subscription": "2.18.0",
+        "node-opcua-service-translate-browse-path": "2.17.0",
+        "node-opcua-service-write": "2.17.0",
+        "node-opcua-status-code": "2.17.0",
+        "node-opcua-transport": "2.18.0",
+        "node-opcua-types": "2.17.0",
+        "node-opcua-utils": "2.17.0",
+        "node-opcua-variant": "2.17.0",
+        "node-opcua-vendor-diagnostic": "2.18.0",
+        "semver": "^7.3.2"
+      }
+    },
+    "node-opcua-address-space": {
+      "version": "2.17.0",
+      "resolved": "https://registry.npmjs.org/node-opcua-address-space/-/node-opcua-address-space-2.17.0.tgz",
+      "integrity": "sha512-R1HETgcn9ACz6B1iqHW9HoC2zacEVM/Oxk3BGmrCKMtopIw3QsFfCtiVbq1hM0w+pjObc5d1xfD0fvGVd6rNOA==",
+      "requires": {
+        "@types/lodash": "4.14.161",
+        "async": "^3.2.0",
+        "chalk": "^4.1.0",
+        "dequeue": "^1.0.5",
+        "lodash": "4.17.20",
+        "node-opcua-assert": "2.16.0",
+        "node-opcua-basic-types": "2.17.0",
+        "node-opcua-client-dynamic-extension-object": "2.17.0",
+        "node-opcua-constants": "2.16.0",
+        "node-opcua-data-access": "2.17.0",
+        "node-opcua-data-model": "2.17.0",
+        "node-opcua-data-value": "2.17.0",
+        "node-opcua-date-time": "2.17.0",
+        "node-opcua-debug": "2.17.0",
+        "node-opcua-enum": "2.17.0",
+        "node-opcua-factory": "2.17.0",
+        "node-opcua-nodeid": "2.17.0",
+        "node-opcua-numeric-range": "2.17.0",
+        "node-opcua-object-registry": "2.17.0",
+        "node-opcua-pseudo-session": "2.17.0",
+        "node-opcua-schemas": "2.17.0",
+        "node-opcua-service-browse": "2.17.0",
+        "node-opcua-service-call": "2.17.0",
+        "node-opcua-service-filter": "2.17.0",
+        "node-opcua-service-history": "2.17.0",
+        "node-opcua-service-translate-browse-path": "2.17.0",
+        "node-opcua-service-write": "2.17.0",
+        "node-opcua-status-code": "2.17.0",
+        "node-opcua-types": "2.17.0",
+        "node-opcua-utils": "2.17.0",
+        "node-opcua-variant": "2.17.0",
+        "node-opcua-xml2json": "2.17.0",
+        "pretty-error": "^2.1.1",
+        "set-prototype-of": "^1.0.0",
+        "thenify": "^3.3.1",
+        "xml-writer": "^1.7.0"
+      }
+    },
+    "node-opcua-address-space-for-conformance-testing": {
+      "version": "2.17.0",
+      "resolved": "https://registry.npmjs.org/node-opcua-address-space-for-conformance-testing/-/node-opcua-address-space-for-conformance-testing-2.17.0.tgz",
+      "integrity": "sha512-WhlLvf0ydL4ykQbaeOoKlkSVWASV/FHkjZcX5RI+uhD4Y9XugskODR1ybzR7mLAOgPC5KWXYv+6QfsR32/qaIQ==",
+      "requires": {
+        "node-opcua-address-space": "2.17.0",
+        "node-opcua-assert": "2.16.0",
+        "node-opcua-basic-types": "2.17.0",
+        "node-opcua-data-access": "2.17.0",
+        "node-opcua-data-model": "2.17.0",
+        "node-opcua-data-value": "2.17.0",
+        "node-opcua-factory": "2.17.0",
+        "node-opcua-nodeid": "2.17.0",
+        "node-opcua-status-code": "2.17.0",
+        "node-opcua-variant": "2.17.0"
+      }
+    },
+    "node-opcua-aggregates": {
+      "version": "2.17.0",
+      "resolved": "https://registry.npmjs.org/node-opcua-aggregates/-/node-opcua-aggregates-2.17.0.tgz",
+      "integrity": "sha512-YKCYWSzuP1/7pY0Tyb5/UUoqQvhL49IaZvhJK1DNjZWOKwa4dru80SHOHeFk6Y9qQskjnzRReMIhUi2VeqqcWw==",
+      "requires": {
+        "@types/async": "^3.2.3",
+        "node-opcua-address-space": "2.17.0",
+        "node-opcua-constants": "2.16.0",
+        "node-opcua-data-model": "2.17.0",
+        "node-opcua-data-value": "2.17.0",
+        "node-opcua-nodeid": "2.17.0",
+        "node-opcua-nodesets": "2.13.0",
+        "node-opcua-numeric-range": "2.17.0",
+        "node-opcua-service-history": "2.17.0",
+        "node-opcua-status-code": "2.17.0",
+        "node-opcua-types": "2.17.0",
+        "node-opcua-utils": "2.17.0",
+        "node-opcua-variant": "2.17.0"
+      }
+    },
+    "node-opcua-assert": {
+      "version": "2.16.0",
+      "resolved": "https://registry.npmjs.org/node-opcua-assert/-/node-opcua-assert-2.16.0.tgz",
+      "integrity": "sha512-+ugJMwbev+oAWRPStdsPZOy6ufq23Xfh5obSBKCLphEqRagMR6Liq+jcBoTy1/WGvyTgC59BWryqiNd0OHi7Yw==",
+      "requires": {
+        "better-assert": "^1.0.2",
+        "chalk": "^4.1.0",
+        "pretty-error": "^2.1.1"
+      }
+    },
+    "node-opcua-basic-types": {
+      "version": "2.17.0",
+      "resolved": "https://registry.npmjs.org/node-opcua-basic-types/-/node-opcua-basic-types-2.17.0.tgz",
+      "integrity": "sha512-KSBlKgr4Zo72moQcjGG/bjzazMeXZrI4as8plk+epXIB/1GO/SODT9u/M9LRPFW/+z5gx9aL719kqyAbjq8sqw==",
+      "requires": {
+        "node-opcua-assert": "2.16.0",
+        "node-opcua-binary-stream": "2.17.0",
+        "node-opcua-buffer-utils": "2.17.0",
+        "node-opcua-date-time": "2.17.0",
+        "node-opcua-enum": "2.17.0",
+        "node-opcua-guid": "2.16.0",
+        "node-opcua-nodeid": "2.17.0",
+        "node-opcua-status-code": "2.17.0",
+        "node-opcua-utils": "2.17.0"
+      }
+    },
+    "node-opcua-binary-stream": {
+      "version": "2.17.0",
+      "resolved": "https://registry.npmjs.org/node-opcua-binary-stream/-/node-opcua-binary-stream-2.17.0.tgz",
+      "integrity": "sha512-hVaqYXXEY4gtT50Xo6uwo8asqdJhpDSH51m+YsKqlpCD2li7Sdghj0LrNNjI2Lqx4PwqjMuxLCeCkcu/i6CHng==",
+      "requires": {
+        "colors": "^1.4.0",
+        "node-opcua-assert": "2.16.0",
+        "node-opcua-buffer-utils": "2.17.0"
+      }
+    },
+    "node-opcua-buffer-utils": {
+      "version": "2.17.0",
+      "resolved": "https://registry.npmjs.org/node-opcua-buffer-utils/-/node-opcua-buffer-utils-2.17.0.tgz",
+      "integrity": "sha512-gdE/7zTQHgpmHONxcLwY17HKCYUEL2zwOuG4hdeG6+Ti6kPDg03yrMheqIsuQpNHF9RWo0bJ1ySpo8tGz27sNA==",
+      "requires": {
+        "node-opcua-assert": "2.16.0"
+      }
+    },
+    "node-opcua-certificate-manager": {
+      "version": "2.17.0",
+      "resolved": "https://registry.npmjs.org/node-opcua-certificate-manager/-/node-opcua-certificate-manager-2.17.0.tgz",
+      "integrity": "sha512-ZO4AL5Ikm2r3T4oErzgj1PjFlLLb0JU9y3rB49LphuTcZ0Xukfl9IoeKinCPV8dKi09/yHP9rCxZwouwMBs3Ag==",
+      "requires": {
+        "@types/mkdirp": "0.5.2",
+        "chalk": "^4.1.0",
+        "delayed": "^2.0.0",
+        "env-paths": "^2.2.0",
+        "mkdirp": "0.5.5",
+        "node-opcua-assert": "2.16.0",
+        "node-opcua-basic-types": "2.17.0",
+        "node-opcua-buffer-utils": "2.17.0",
+        "node-opcua-constants": "2.16.0",
+        "node-opcua-crypto": "^1.3.7",
+        "node-opcua-debug": "2.17.0",
+        "node-opcua-pki": "^2.1.5",
+        "node-opcua-status-code": "2.17.0",
+        "node-opcua-utils": "2.17.0",
+        "once": "^1.4.0",
+        "thenify": "^3.3.1"
+      }
+    },
+    "node-opcua-chunkmanager": {
+      "version": "2.18.0",
+      "resolved": "https://registry.npmjs.org/node-opcua-chunkmanager/-/node-opcua-chunkmanager-2.18.0.tgz",
+      "integrity": "sha512-lSUmdYXyCAc9yKUHdO4WK2a5ZhKOLQLULyTIObKMZ5XhoNCa688WqaB/Fwvl+hv9OX3757rKrVvH6U68tZT9sw==",
+      "requires": {
+        "chalk": "^4.1.0",
+        "node-opcua-assert": "2.16.0",
+        "node-opcua-basic-types": "2.17.0",
+        "node-opcua-binary-stream": "2.17.0",
+        "node-opcua-buffer-utils": "2.17.0",
+        "node-opcua-factory": "2.17.0",
+        "node-opcua-packet-assembler": "2.16.0"
+      }
+    },
+    "node-opcua-client": {
+      "version": "2.18.0",
+      "resolved": "https://registry.npmjs.org/node-opcua-client/-/node-opcua-client-2.18.0.tgz",
+      "integrity": "sha512-jo+ByCH+gqlisLwe0YMicMy0gtMEYipcKdZv5WHvrVXlUm+FP+iziB6pfuazf7EQnnf8nO8AtCuVTPdLDVMTDA==",
+      "requires": {
+        "@types/async": "^3.2.3",
+        "@types/once": "^1.4.0",
+        "@types/underscore": "^1.10.23",
+        "async": "^3.2.0",
+        "callbackify": "^1.1.0",
+        "chalk": "^4.1.0",
+        "delayed": "^2.0.0",
+        "node-opcua-assert": "2.16.0",
+        "node-opcua-basic-types": "2.17.0",
+        "node-opcua-buffer-utils": "2.17.0",
+        "node-opcua-certificate-manager": "2.17.0",
+        "node-opcua-client-dynamic-extension-object": "2.17.0",
+        "node-opcua-common": "2.17.0",
+        "node-opcua-constants": "2.16.0",
+        "node-opcua-crypto": "^1.3.7",
+        "node-opcua-data-model": "2.17.0",
+        "node-opcua-data-value": "2.17.0",
+        "node-opcua-date-time": "2.17.0",
+        "node-opcua-debug": "2.17.0",
+        "node-opcua-extension-object": "2.17.0",
+        "node-opcua-hostname": "2.16.0",
+        "node-opcua-nodeid": "2.17.0",
+        "node-opcua-object-registry": "2.17.0",
+        "node-opcua-pki": "^2.1.5",
+        "node-opcua-pseudo-session": "2.17.0",
+        "node-opcua-schemas": "2.17.0",
+        "node-opcua-secure-channel": "2.18.0",
+        "node-opcua-service-browse": "2.17.0",
+        "node-opcua-service-call": "2.17.0",
+        "node-opcua-service-discovery": "2.17.0",
+        "node-opcua-service-endpoints": "2.17.0",
+        "node-opcua-service-filter": "2.17.0",
+        "node-opcua-service-history": "2.17.0",
+        "node-opcua-service-query": "2.18.0",
+        "node-opcua-service-read": "2.17.0",
+        "node-opcua-service-register-node": "2.17.0",
+        "node-opcua-service-secure-channel": "2.17.0",
+        "node-opcua-service-session": "2.17.0",
+        "node-opcua-service-subscription": "2.18.0",
+        "node-opcua-service-translate-browse-path": "2.17.0",
+        "node-opcua-service-write": "2.17.0",
+        "node-opcua-status-code": "2.17.0",
+        "node-opcua-types": "2.17.0",
+        "node-opcua-utils": "2.17.0",
+        "node-opcua-variant": "2.17.0",
+        "once": "^1.4.0",
+        "thenify": "^3.3.1",
+        "underscore": "^1.11.0"
+      }
+    },
+    "node-opcua-client-crawler": {
+      "version": "2.18.0",
+      "resolved": "https://registry.npmjs.org/node-opcua-client-crawler/-/node-opcua-client-crawler-2.18.0.tgz",
+      "integrity": "sha512-bFHCxWvrQzdrmnKojlgCcBbqIRJQqSZ9JwLZru5ZcMA0mnuHAfd3h0Fy1FcNDOWqe2/FXNGQSnwnn5WZBOHvRQ==",
+      "requires": {
+        "@types/underscore": "^1.10.23",
+        "async": "^3.2.0",
+        "node-opcua-assert": "2.16.0",
+        "node-opcua-constants": "2.16.0",
+        "node-opcua-data-model": "2.17.0",
+        "node-opcua-data-value": "2.17.0",
+        "node-opcua-debug": "2.17.0",
+        "node-opcua-factory": "2.17.0",
+        "node-opcua-nodeid": "2.17.0",
+        "node-opcua-service-browse": "2.17.0",
+        "node-opcua-status-code": "2.17.0",
+        "node-opcua-types": "2.17.0",
+        "node-opcua-utils": "2.17.0",
+        "node-opcua-variant": "2.17.0",
+        "underscore": "^1.11.0"
+      }
+    },
+    "node-opcua-client-dynamic-extension-object": {
+      "version": "2.17.0",
+      "resolved": "https://registry.npmjs.org/node-opcua-client-dynamic-extension-object/-/node-opcua-client-dynamic-extension-object-2.17.0.tgz",
+      "integrity": "sha512-I/grBjiH9Ro+qA757FhcdP4alHaRR+X0X+/Cem0PuKyToC2gd9cFu2XqplRR358qKGbPKJjCIsepDrJtAJTUXA==",
+      "requires": {
+        "chalk": "^4.1.0",
+        "node-opcua-assert": "2.16.0",
+        "node-opcua-binary-stream": "2.17.0",
+        "node-opcua-data-model": "2.17.0",
+        "node-opcua-data-value": "2.17.0",
+        "node-opcua-debug": "2.17.0",
+        "node-opcua-extension-object": "2.17.0",
+        "node-opcua-factory": "2.17.0",
+        "node-opcua-nodeid": "2.17.0",
+        "node-opcua-pseudo-session": "2.17.0",
+        "node-opcua-schemas": "2.17.0",
+        "node-opcua-service-browse": "2.17.0",
+        "node-opcua-service-translate-browse-path": "2.17.0",
+        "node-opcua-status-code": "2.17.0",
+        "node-opcua-types": "2.17.0",
+        "node-opcua-variant": "2.17.0"
+      }
+    },
+    "node-opcua-client-proxy": {
+      "version": "2.18.0",
+      "resolved": "https://registry.npmjs.org/node-opcua-client-proxy/-/node-opcua-client-proxy-2.18.0.tgz",
+      "integrity": "sha512-m1Er4CDRgVu8vu/RyxyQlX5fJhV4VFV+Ljpoij2D3wu4FmrcLj4tlCRWgGRYbwDQiLwgcWPGigotm0M8mPc89w==",
+      "requires": {
+        "async": "^3.2.0",
+        "node-opcua-address-space": "2.17.0",
+        "node-opcua-assert": "2.16.0",
+        "node-opcua-constants": "2.16.0",
+        "node-opcua-data-model": "2.17.0",
+        "node-opcua-data-value": "2.17.0",
+        "node-opcua-nodeid": "2.17.0",
+        "node-opcua-pseudo-session": "2.17.0",
+        "node-opcua-service-browse": "2.17.0",
+        "node-opcua-service-call": "2.17.0",
+        "node-opcua-service-read": "2.17.0",
+        "node-opcua-service-subscription": "2.18.0",
+        "node-opcua-service-write": "2.17.0",
+        "node-opcua-status-code": "2.17.0",
+        "node-opcua-utils": "2.17.0",
+        "node-opcua-variant": "2.17.0"
+      }
+    },
+    "node-opcua-common": {
+      "version": "2.17.0",
+      "resolved": "https://registry.npmjs.org/node-opcua-common/-/node-opcua-common-2.17.0.tgz",
+      "integrity": "sha512-v+79nTd4Gmf5tXUYKr3RZ3NPLN9EryCIS77/mlwpChSy1YAWukSyJWDo/1/afxWmL2ENPKVaRKXIfL64cdGvhw==",
+      "requires": {
+        "node-opcua-assert": "2.16.0",
+        "node-opcua-basic-types": "2.17.0",
+        "node-opcua-crypto": "^1.3.7",
+        "node-opcua-data-model": "2.17.0",
+        "node-opcua-factory": "2.17.0",
+        "node-opcua-nodeid": "2.17.0",
+        "node-opcua-service-endpoints": "2.17.0",
+        "node-opcua-service-secure-channel": "2.17.0",
+        "node-opcua-types": "2.17.0"
+      }
+    },
+    "node-opcua-constants": {
+      "version": "2.16.0",
+      "resolved": "https://registry.npmjs.org/node-opcua-constants/-/node-opcua-constants-2.16.0.tgz",
+      "integrity": "sha512-yZtDYpbKogX545rWNpPD6gKQ+t4PFD5aWvZ0lKZmvUu+A1HCiKcVG2H2YUrk4I423k8lCzFUn7/JRjDzASdXxw=="
+    },
+    "node-opcua-crypto": {
+      "version": "1.3.8",
+      "resolved": "https://registry.npmjs.org/node-opcua-crypto/-/node-opcua-crypto-1.3.8.tgz",
+      "integrity": "sha512-yDN/1W2JG2QNxuInN5K47ldkP53HCKnkve74XzH4wY3METahwt1+Ml0GXvitzwq+1HE5xeLteWHC58qFbEtU1A==",
+      "requires": {
+        "better-assert": "^1.0.2",
+        "chalk": "^4.1.0",
+        "hexy": "^0.3.0",
+        "jsrsasign": "^10.0.0",
+        "sshpk": "^1.16.1"
+      }
+    },
+    "node-opcua-data-access": {
+      "version": "2.17.0",
+      "resolved": "https://registry.npmjs.org/node-opcua-data-access/-/node-opcua-data-access-2.17.0.tgz",
+      "integrity": "sha512-TgboxFPFdhhlHaCQtf43Pb6JIyUpacjyORKP9/oSfvS/lN10t7Hpm5ItOTYcAvDCaRp+UCcBRJ6Noo1InHgdCA==",
+      "requires": {
+        "node-opcua-assert": "2.16.0",
+        "node-opcua-basic-types": "2.17.0",
+        "node-opcua-binary-stream": "2.17.0",
+        "node-opcua-data-model": "2.17.0",
+        "node-opcua-factory": "2.17.0",
+        "node-opcua-nodeid": "2.17.0",
+        "node-opcua-types": "2.17.0"
+      }
+    },
+    "node-opcua-data-model": {
+      "version": "2.17.0",
+      "resolved": "https://registry.npmjs.org/node-opcua-data-model/-/node-opcua-data-model-2.17.0.tgz",
+      "integrity": "sha512-lhYBu1h2WPMEKpvxsU9LC4NnCsmt7lOrznQZxPdST7SgNBDGYZVcB2vOkkR7h2/Wy2NQA+w/krFqLDJM9AUodw==",
+      "requires": {
+        "node-opcua-assert": "2.16.0",
+        "node-opcua-basic-types": "2.17.0",
+        "node-opcua-binary-stream": "2.17.0",
+        "node-opcua-enum": "2.17.0",
+        "node-opcua-factory": "2.17.0",
+        "node-opcua-nodeid": "2.17.0",
+        "node-opcua-status-code": "2.17.0",
+        "node-opcua-utils": "2.17.0"
+      }
+    },
+    "node-opcua-data-value": {
+      "version": "2.17.0",
+      "resolved": "https://registry.npmjs.org/node-opcua-data-value/-/node-opcua-data-value-2.17.0.tgz",
+      "integrity": "sha512-3l1cUU8KNBOq6Vu2fLK4l6CZ/5wIFybYbPdvCDL0sQSwPGTkchRjZzMIo9/C9AThLSxW4hlBy80NPzgBq+v0/w==",
+      "requires": {
+        "node-opcua-assert": "2.16.0",
+        "node-opcua-basic-types": "2.17.0",
+        "node-opcua-binary-stream": "2.17.0",
+        "node-opcua-data-model": "2.17.0",
+        "node-opcua-date-time": "2.17.0",
+        "node-opcua-enum": "2.17.0",
+        "node-opcua-extension-object": "2.17.0",
+        "node-opcua-factory": "2.17.0",
+        "node-opcua-nodeid": "2.17.0",
+        "node-opcua-status-code": "2.17.0",
+        "node-opcua-utils": "2.17.0",
+        "node-opcua-variant": "2.17.0"
+      }
+    },
+    "node-opcua-date-time": {
+      "version": "2.17.0",
+      "resolved": "https://registry.npmjs.org/node-opcua-date-time/-/node-opcua-date-time-2.17.0.tgz",
+      "integrity": "sha512-mm3ZNAfhvqDC9PoDCAH+K2uOWlWU1eeht3pKqBO4w+ocN29LQ+Nuo+GcarpZeJal5/mI4lyffpkSZcqXYUDVTQ==",
+      "requires": {
+        "browser-process-hrtime": "^1.0.0",
+        "long": "^4.0.0",
+        "node-opcua-assert": "2.16.0"
+      }
+    },
+    "node-opcua-debug": {
+      "version": "2.17.0",
+      "resolved": "https://registry.npmjs.org/node-opcua-debug/-/node-opcua-debug-2.17.0.tgz",
+      "integrity": "sha512-N4XcUX1iMissyThye8eGGh9rfWc4wGvDGtSKU5FH60KfIsBO3lZZu3R9JUGwOJopfUyaCI1X+tc5PLFic7EAtA==",
+      "requires": {
+        "chalk": "^4.1.0",
+        "hexy": "^0.3.0",
+        "node-opcua-assert": "2.16.0",
+        "node-opcua-buffer-utils": "2.17.0"
+      }
+    },
+    "node-opcua-enum": {
+      "version": "2.17.0",
+      "resolved": "https://registry.npmjs.org/node-opcua-enum/-/node-opcua-enum-2.17.0.tgz",
+      "integrity": "sha512-xwRgPCvuAF8TwTILpVvVi/Rf196+FQ3via3w5G+OxM5XkjYh34NWFXuuhkzvuE4lHHRkaWLgxAg0sLs9qtfsXA==",
+      "requires": {
+        "node-opcua-assert": "2.16.0"
+      }
+    },
+    "node-opcua-extension-object": {
+      "version": "2.17.0",
+      "resolved": "https://registry.npmjs.org/node-opcua-extension-object/-/node-opcua-extension-object-2.17.0.tgz",
+      "integrity": "sha512-uCM1gIJDGcH+xyVoRQ1gEqc66Xg5ztBN8Ek4In0xUWCOWB2VfOgFQLLX1yg/82rhCqT8D4N5Cmdw3ZltNmBsng==",
+      "requires": {
+        "chalk": "^4.1.0",
+        "node-opcua-assert": "2.16.0",
+        "node-opcua-basic-types": "2.17.0",
+        "node-opcua-binary-stream": "2.17.0",
+        "node-opcua-debug": "2.17.0",
+        "node-opcua-factory": "2.17.0",
+        "node-opcua-nodeid": "2.17.0"
+      }
+    },
+    "node-opcua-factory": {
+      "version": "2.17.0",
+      "resolved": "https://registry.npmjs.org/node-opcua-factory/-/node-opcua-factory-2.17.0.tgz",
+      "integrity": "sha512-224Gg99MAzZPozZ86Qv3DqwP1XTFHbhjzGnlThzPazuejkKa3K6DwOriX2+d4YqimcaxrCupyXrO4HLa1TQ7MA==",
+      "requires": {
+        "chalk": "^4.1.0",
+        "node-opcua-assert": "2.16.0",
+        "node-opcua-basic-types": "2.17.0",
+        "node-opcua-binary-stream": "2.17.0",
+        "node-opcua-debug": "2.17.0",
+        "node-opcua-enum": "2.17.0",
+        "node-opcua-guid": "2.16.0",
+        "node-opcua-nodeid": "2.17.0",
+        "node-opcua-status-code": "2.17.0",
+        "node-opcua-utils": "2.17.0"
+      }
+    },
+    "node-opcua-generator": {
+      "version": "2.17.0",
+      "resolved": "https://registry.npmjs.org/node-opcua-generator/-/node-opcua-generator-2.17.0.tgz",
+      "integrity": "sha512-jTrx69wn6YQHSiAufMOLhWN726xTahaFdSeHQDb29SgTiRF/l0kv4YvtL3wBVdWjRHtJ3S9BXWfMeMQIvVboDA==",
+      "requires": {
+        "chalk": "^4.1.0",
+        "node-opcua-assert": "2.16.0",
+        "node-opcua-basic-types": "2.17.0",
+        "node-opcua-buffer-utils": "2.17.0",
+        "node-opcua-constants": "2.16.0",
+        "node-opcua-date-time": "2.17.0",
+        "node-opcua-debug": "2.17.0",
+        "node-opcua-enum": "2.17.0",
+        "node-opcua-factory": "2.17.0",
+        "node-opcua-guid": "2.16.0",
+        "node-opcua-nodeid": "2.17.0",
+        "node-opcua-numeric-range": "2.17.0",
+        "node-opcua-schemas": "2.17.0",
+        "node-opcua-status-code": "2.17.0",
+        "node-opcua-utils": "2.17.0",
+        "node-opcua-xml2json": "2.17.0",
+        "typescript": "^4.0.3",
+        "underscore": "^1.11.0"
+      }
+    },
+    "node-opcua-guid": {
+      "version": "2.16.0",
+      "resolved": "https://registry.npmjs.org/node-opcua-guid/-/node-opcua-guid-2.16.0.tgz",
+      "integrity": "sha512-ZwC15UY4if91mNBWroLM84Gto4MS8wu6QBjb/HzmeIEUPurus680XQYDF/14HxOfkast0uY4Ffl66576h9MEwQ==",
+      "requires": {
+        "node-opcua-assert": "2.16.0"
+      }
+    },
+    "node-opcua-hostname": {
+      "version": "2.16.0",
+      "resolved": "https://registry.npmjs.org/node-opcua-hostname/-/node-opcua-hostname-2.16.0.tgz",
+      "integrity": "sha512-1dsbUuVZ5+rgTYqHUfr/QI/FDmVl11wAHcqHZ4plnUGnbhQJD/AlR3Hq0fh3Kg4xAW6HPbirXwTPf5ZhcS0hTA==",
+      "requires": {
+        "node-opcua-assert": "2.16.0"
+      }
+    },
+    "node-opcua-nodeid": {
+      "version": "2.17.0",
+      "resolved": "https://registry.npmjs.org/node-opcua-nodeid/-/node-opcua-nodeid-2.17.0.tgz",
+      "integrity": "sha512-MHlf1aGaXaukK6DfxOLB9I4qswv06jCK9dpfjjT/q7GWSpVSf+P2duv+JJxHsSkl+7WFB9GHwyoqkRbfnDy2Tw==",
+      "requires": {
+        "@types/lodash": "4.14.161",
+        "chalk": "^4.1.0",
+        "lodash": "4.17.20",
+        "node-opcua-assert": "2.16.0",
+        "node-opcua-constants": "2.16.0",
+        "node-opcua-enum": "2.17.0",
+        "node-opcua-guid": "2.16.0"
+      }
+    },
+    "node-opcua-nodesets": {
+      "version": "2.13.0",
+      "resolved": "https://registry.npmjs.org/node-opcua-nodesets/-/node-opcua-nodesets-2.13.0.tgz",
+      "integrity": "sha512-qAJjGPHFjAMo4KomhA0Pm2U2zoVvNJ3Q78D4bdryoQmfwu7s2sFveWbkTM0M/NbslE59rm1gOIgftL9iDpLQcQ=="
+    },
+    "node-opcua-numeric-range": {
+      "version": "2.17.0",
+      "resolved": "https://registry.npmjs.org/node-opcua-numeric-range/-/node-opcua-numeric-range-2.17.0.tgz",
+      "integrity": "sha512-04HhKrUpWnPLLHuvpuQBSHI85bZljT6s5pwOfFl6PfQxzp87z/+z6821RGr6xZ0n4qYWnwFe32zKkEjfTWFhig==",
+      "requires": {
+        "node-opcua-assert": "2.16.0",
+        "node-opcua-basic-types": "2.17.0",
+        "node-opcua-binary-stream": "2.17.0",
+        "node-opcua-factory": "2.17.0",
+        "node-opcua-status-code": "2.17.0"
+      }
+    },
+    "node-opcua-object-registry": {
+      "version": "2.17.0",
+      "resolved": "https://registry.npmjs.org/node-opcua-object-registry/-/node-opcua-object-registry-2.17.0.tgz",
+      "integrity": "sha512-X9ZmfS3xGo6o5hvW3h55UY8bGb/k1NhJ0p1dKXkMtFcOiOgVmz7v9g7sFP7h3gwe3ErOnVM8GL8Uwv1c1nWN7w==",
+      "requires": {
+        "node-opcua-assert": "2.16.0",
+        "node-opcua-debug": "2.17.0"
+      }
+    },
+    "node-opcua-packet-analyzer": {
+      "version": "2.17.0",
+      "resolved": "https://registry.npmjs.org/node-opcua-packet-analyzer/-/node-opcua-packet-analyzer-2.17.0.tgz",
+      "integrity": "sha512-Ed+QstFWYzmob2eD3e0BqCp+gSGH0v0n/4fjNtoADu7KJv5j+syerMKkKQbGWfqwBxEJzyeExsFhWXtBCV46xg==",
+      "requires": {
+        "chalk": "^4.1.0",
+        "node-opcua-assert": "2.16.0",
+        "node-opcua-basic-types": "2.17.0",
+        "node-opcua-binary-stream": "2.17.0",
+        "node-opcua-debug": "2.17.0",
+        "node-opcua-factory": "2.17.0",
+        "node-opcua-utils": "2.17.0"
+      }
+    },
+    "node-opcua-packet-assembler": {
+      "version": "2.16.0",
+      "resolved": "https://registry.npmjs.org/node-opcua-packet-assembler/-/node-opcua-packet-assembler-2.16.0.tgz",
+      "integrity": "sha512-RZEGdejqoQTgEZWEOLAS+TlB2Cd+nZ6sQFyCfYhvHhWl5LOV9lUL+VrIsz2q9U+VOgTD0ECSGGRomR3XoVvZJA==",
+      "requires": {
+        "node-opcua-assert": "2.16.0"
+      }
+    },
+    "node-opcua-pki": {
+      "version": "2.1.6",
+      "resolved": "https://registry.npmjs.org/node-opcua-pki/-/node-opcua-pki-2.1.6.tgz",
+      "integrity": "sha512-CjYSkFnpk/kdjO6OPOiOyHGerUezcs7mIIaPvSzLEik4k0Ysn+hkoUoUwzbp1aTsCk1It+AWUsQF7OW2Ef22Iw==",
+      "requires": {
+        "async": "^3.2.0",
+        "better-assert": "^1.0.2",
+        "byline": "^5.0.0",
+        "chalk": "^4.1.0",
+        "chokidar": "^3.4.2",
+        "cli-spinner": "^0.2.10",
+        "cli-table": "^0.3.1",
+        "del": "5.1.0",
+        "node-opcua-crypto": "^1.3.8",
+        "progress": "^2.0.3",
+        "rimraf": "^3.0.2",
+        "thenify": "^3.3.1",
+        "update-notifier": "^5.0.0",
+        "walk": "^2.3.14",
+        "wget-improved": "^3.2.1",
+        "yargs": "15.4.1",
+        "yauzl": "^2.10.0"
+      }
+    },
+    "node-opcua-pseudo-session": {
+      "version": "2.17.0",
+      "resolved": "https://registry.npmjs.org/node-opcua-pseudo-session/-/node-opcua-pseudo-session-2.17.0.tgz",
+      "integrity": "sha512-N6uGHuxeoiKYZPJtpIOZkAnsYy+rnNZEOWkJbA5upcxEvrqKsBCpujqtixr1I/VcCBCUgZUoZ3Ta35ujsdrIQw==",
+      "requires": {
+        "node-opcua-data-model": "2.17.0",
+        "node-opcua-data-value": "2.17.0",
+        "node-opcua-nodeid": "2.17.0",
+        "node-opcua-service-browse": "2.17.0",
+        "node-opcua-service-call": "2.17.0",
+        "node-opcua-service-read": "2.17.0",
+        "node-opcua-service-translate-browse-path": "2.17.0",
+        "node-opcua-service-write": "2.17.0",
+        "node-opcua-status-code": "2.17.0",
+        "node-opcua-utils": "2.17.0",
+        "node-opcua-variant": "2.17.0"
+      }
+    },
+    "node-opcua-schemas": {
+      "version": "2.17.0",
+      "resolved": "https://registry.npmjs.org/node-opcua-schemas/-/node-opcua-schemas-2.17.0.tgz",
+      "integrity": "sha512-NHZJ4FCs1gHNf/H5LGsz1ImZqrhTSz4cgmCziSk/w5TGvTfSZxLEG6+hNVP8prONC4b8exGbR31KP1qTGkyujw==",
+      "requires": {
+        "node-opcua-assert": "2.16.0",
+        "node-opcua-binary-stream": "2.17.0",
+        "node-opcua-data-model": "2.17.0",
+        "node-opcua-debug": "2.17.0",
+        "node-opcua-enum": "2.17.0",
+        "node-opcua-extension-object": "2.17.0",
+        "node-opcua-factory": "2.17.0",
+        "node-opcua-nodeid": "2.17.0",
+        "node-opcua-utils": "2.17.0",
+        "node-opcua-variant": "2.17.0",
+        "node-opcua-xml2json": "2.17.0",
+        "thenify": "^3.3.1"
+      }
+    },
+    "node-opcua-secure-channel": {
+      "version": "2.18.0",
+      "resolved": "https://registry.npmjs.org/node-opcua-secure-channel/-/node-opcua-secure-channel-2.18.0.tgz",
+      "integrity": "sha512-VFgi91scQr+cIbQ09cXhduubyCxMpj+AuVHG09PJMbut8uUnY+LXL7xi+mxdkNdK38hDRTW4RkaN7MhLXqTBaA==",
+      "requires": {
+        "@types/underscore": "^1.10.23",
+        "backoff": "^2.5.0",
+        "chalk": "^4.1.0",
+        "node-opcua-assert": "2.16.0",
+        "node-opcua-basic-types": "2.17.0",
+        "node-opcua-binary-stream": "2.17.0",
+        "node-opcua-certificate-manager": "2.17.0",
+        "node-opcua-chunkmanager": "2.18.0",
+        "node-opcua-common": "2.17.0",
+        "node-opcua-crypto": "^1.3.7",
+        "node-opcua-debug": "2.17.0",
+        "node-opcua-enum": "2.17.0",
+        "node-opcua-factory": "2.17.0",
+        "node-opcua-nodeid": "2.17.0",
+        "node-opcua-object-registry": "2.17.0",
+        "node-opcua-packet-analyzer": "2.17.0",
+        "node-opcua-service-secure-channel": "2.17.0",
+        "node-opcua-status-code": "2.17.0",
+        "node-opcua-transport": "2.18.0",
+        "node-opcua-types": "2.17.0",
+        "node-opcua-utils": "2.17.0",
+        "underscore": "^1.11.0"
+      }
+    },
+    "node-opcua-server": {
+      "version": "2.18.0",
+      "resolved": "https://registry.npmjs.org/node-opcua-server/-/node-opcua-server-2.18.0.tgz",
+      "integrity": "sha512-qFSnuF6guAeXD4cHuY/JtGozVTpz7/8dnnY6eTch72HHrl4cCvDOY5BPR811GH1ZwaJGh5LaC12mEAAst6HaIg==",
+      "requires": {
+        "@types/underscore": "^1.10.23",
+        "async": "^3.2.0",
+        "bonjour": "^3.5.0",
+        "browser-process-hrtime": "^1.0.0",
+        "colors": "^1.4.0",
+        "dequeue": "^1.0.5",
+        "node-opcua-address-space": "2.17.0",
+        "node-opcua-assert": "2.16.0",
+        "node-opcua-basic-types": "2.17.0",
+        "node-opcua-certificate-manager": "2.17.0",
+        "node-opcua-client": "2.18.0",
+        "node-opcua-client-dynamic-extension-object": "2.17.0",
+        "node-opcua-common": "2.17.0",
+        "node-opcua-constants": "2.16.0",
+        "node-opcua-crypto": "^1.3.7",
+        "node-opcua-data-model": "2.17.0",
+        "node-opcua-data-value": "2.17.0",
+        "node-opcua-date-time": "2.17.0",
+        "node-opcua-debug": "2.17.0",
+        "node-opcua-enum": "2.17.0",
+        "node-opcua-extension-object": "2.17.0",
+        "node-opcua-factory": "2.17.0",
+        "node-opcua-hostname": "2.16.0",
+        "node-opcua-nodeid": "2.17.0",
+        "node-opcua-nodesets": "2.13.0",
+        "node-opcua-numeric-range": "2.17.0",
+        "node-opcua-object-registry": "2.17.0",
+        "node-opcua-pki": "^2.1.5",
+        "node-opcua-secure-channel": "2.18.0",
+        "node-opcua-service-browse": "2.17.0",
+        "node-opcua-service-call": "2.17.0",
+        "node-opcua-service-discovery": "2.17.0",
+        "node-opcua-service-endpoints": "2.17.0",
+        "node-opcua-service-filter": "2.17.0",
+        "node-opcua-service-history": "2.17.0",
+        "node-opcua-service-node-management": "2.17.0",
+        "node-opcua-service-query": "2.18.0",
+        "node-opcua-service-read": "2.17.0",
+        "node-opcua-service-register-node": "2.17.0",
+        "node-opcua-service-secure-channel": "2.17.0",
+        "node-opcua-service-session": "2.17.0",
+        "node-opcua-service-subscription": "2.18.0",
+        "node-opcua-service-translate-browse-path": "2.17.0",
+        "node-opcua-service-write": "2.17.0",
+        "node-opcua-status-code": "2.17.0",
+        "node-opcua-types": "2.17.0",
+        "node-opcua-utils": "2.17.0",
+        "node-opcua-variant": "2.17.0",
+        "underscore": "^1.11.0"
+      }
+    },
+    "node-opcua-server-discovery": {
+      "version": "2.18.0",
+      "resolved": "https://registry.npmjs.org/node-opcua-server-discovery/-/node-opcua-server-discovery-2.18.0.tgz",
+      "integrity": "sha512-cwJX3F3+5ruR81aI3f35IopspDPQzN+A0COCBGOsZCtfEerpTvhlFyEQe6pc2CUxK3g1nfEu237BYq8+u55McQ==",
+      "requires": {
+        "@types/bonjour": "^3.5.6",
+        "bonjour": "^3.5.0",
+        "node-opcua-assert": "2.16.0",
+        "node-opcua-basic-types": "2.17.0",
+        "node-opcua-certificate-manager": "2.17.0",
+        "node-opcua-common": "2.17.0",
+        "node-opcua-debug": "2.17.0",
+        "node-opcua-hostname": "2.16.0",
+        "node-opcua-pki": "^2.1.5",
+        "node-opcua-secure-channel": "2.18.0",
+        "node-opcua-server": "2.18.0",
+        "node-opcua-service-discovery": "2.17.0",
+        "node-opcua-service-endpoints": "2.17.0",
+        "node-opcua-status-code": "2.17.0"
+      }
+    },
+    "node-opcua-service-browse": {
+      "version": "2.17.0",
+      "resolved": "https://registry.npmjs.org/node-opcua-service-browse/-/node-opcua-service-browse-2.17.0.tgz",
+      "integrity": "sha512-SijBXgxrWI2ApSSgTqPB8VGTkGEqGyTUZD2YjzFrZsJR4q8ne1In+7LNaYiwo85XIul7l21iT4nJG/BiLR8QwA==",
+      "requires": {
+        "node-opcua-assert": "2.16.0",
+        "node-opcua-basic-types": "2.17.0",
+        "node-opcua-binary-stream": "2.17.0",
+        "node-opcua-data-model": "2.17.0",
+        "node-opcua-factory": "2.17.0",
+        "node-opcua-nodeid": "2.17.0",
+        "node-opcua-service-secure-channel": "2.17.0",
+        "node-opcua-types": "2.17.0"
+      }
+    },
+    "node-opcua-service-call": {
+      "version": "2.17.0",
+      "resolved": "https://registry.npmjs.org/node-opcua-service-call/-/node-opcua-service-call-2.17.0.tgz",
+      "integrity": "sha512-0wug9pNBMk857OTOAQMgdsNAl5OTClHiqZFNvVONFDr3M0CJLvwyXhBf0TwOA/KLqFAvFljvEO1FZPYmSgGxOg==",
+      "requires": {
+        "node-opcua-assert": "2.16.0",
+        "node-opcua-basic-types": "2.17.0",
+        "node-opcua-binary-stream": "2.17.0",
+        "node-opcua-factory": "2.17.0",
+        "node-opcua-nodeid": "2.17.0",
+        "node-opcua-service-secure-channel": "2.17.0",
+        "node-opcua-types": "2.17.0",
+        "node-opcua-variant": "2.17.0"
+      }
+    },
+    "node-opcua-service-discovery": {
+      "version": "2.17.0",
+      "resolved": "https://registry.npmjs.org/node-opcua-service-discovery/-/node-opcua-service-discovery-2.17.0.tgz",
+      "integrity": "sha512-Zd4M42XUYI9QEFtbnT07GbXAvq7QamCho6DtjaCu0lX3idl/iRX6MNGpVmPvEI06rKBTT4E01o7f5nzBof19eA==",
+      "requires": {
+        "@types/bonjour": "^3.5.6",
+        "bonjour": "^3.5.0",
+        "node-opcua-assert": "2.16.0",
+        "node-opcua-basic-types": "2.17.0",
+        "node-opcua-binary-stream": "2.17.0",
+        "node-opcua-data-model": "2.17.0",
+        "node-opcua-debug": "2.17.0",
+        "node-opcua-factory": "2.17.0",
+        "node-opcua-nodeid": "2.17.0",
+        "node-opcua-service-endpoints": "2.17.0",
+        "node-opcua-service-secure-channel": "2.17.0",
+        "node-opcua-types": "2.17.0"
+      }
+    },
+    "node-opcua-service-endpoints": {
+      "version": "2.17.0",
+      "resolved": "https://registry.npmjs.org/node-opcua-service-endpoints/-/node-opcua-service-endpoints-2.17.0.tgz",
+      "integrity": "sha512-w9GlwDF3qxkADGAWebBxBLdAbO78E61fSVAgGUeymsJy0PGlPm/aelrfaHf5b+Ntll/zDKNZsAid64E6oJR56w==",
+      "requires": {
+        "node-opcua-assert": "2.16.0",
+        "node-opcua-basic-types": "2.17.0",
+        "node-opcua-binary-stream": "2.17.0",
+        "node-opcua-data-model": "2.17.0",
+        "node-opcua-factory": "2.17.0",
+        "node-opcua-nodeid": "2.17.0",
+        "node-opcua-service-secure-channel": "2.17.0",
+        "node-opcua-types": "2.17.0"
+      }
+    },
+    "node-opcua-service-filter": {
+      "version": "2.17.0",
+      "resolved": "https://registry.npmjs.org/node-opcua-service-filter/-/node-opcua-service-filter-2.17.0.tgz",
+      "integrity": "sha512-vnpKc3wcx8dpIy+dyYzq2Tv3b2mhk0Dio01h9j0WU1fpidPwHEHL+npQBKSGzcC6PfMr95JKYz3f8u0heeLomw==",
+      "requires": {
+        "node-opcua-assert": "2.16.0",
+        "node-opcua-basic-types": "2.17.0",
+        "node-opcua-binary-stream": "2.17.0",
+        "node-opcua-constants": "2.16.0",
+        "node-opcua-data-model": "2.17.0",
+        "node-opcua-debug": "2.17.0",
+        "node-opcua-factory": "2.17.0",
+        "node-opcua-nodeid": "2.17.0",
+        "node-opcua-numeric-range": "2.17.0",
+        "node-opcua-service-translate-browse-path": "2.17.0",
+        "node-opcua-status-code": "2.17.0",
+        "node-opcua-types": "2.17.0",
+        "node-opcua-variant": "2.17.0"
+      }
+    },
+    "node-opcua-service-history": {
+      "version": "2.17.0",
+      "resolved": "https://registry.npmjs.org/node-opcua-service-history/-/node-opcua-service-history-2.17.0.tgz",
+      "integrity": "sha512-ckdXRhReBMbFFOmUX1MlNnMsYtUktOGCDd2SdWFUdNJWh3exzzEvJ8X9Bcy1LBLAeQI80VSojMetr4Js4fj8Og==",
+      "requires": {
+        "node-opcua-assert": "2.16.0",
+        "node-opcua-basic-types": "2.17.0",
+        "node-opcua-binary-stream": "2.17.0",
+        "node-opcua-data-model": "2.17.0",
+        "node-opcua-data-value": "2.17.0",
+        "node-opcua-extension-object": "2.17.0",
+        "node-opcua-factory": "2.17.0",
+        "node-opcua-nodeid": "2.17.0",
+        "node-opcua-service-filter": "2.17.0",
+        "node-opcua-service-secure-channel": "2.17.0",
+        "node-opcua-types": "2.17.0"
+      }
+    },
+    "node-opcua-service-node-management": {
+      "version": "2.17.0",
+      "resolved": "https://registry.npmjs.org/node-opcua-service-node-management/-/node-opcua-service-node-management-2.17.0.tgz",
+      "integrity": "sha512-VoPuZA0r+LkWqOqZaBM4eLCE83i9p+SCeDfpcmypix+S2GoUyh7okL9oqv1aBMYD/GxjTAaYw0KCoF4m2y/IXA==",
+      "requires": {
+        "node-opcua-assert": "2.16.0",
+        "node-opcua-basic-types": "2.17.0",
+        "node-opcua-binary-stream": "2.17.0",
+        "node-opcua-data-model": "2.17.0",
+        "node-opcua-extension-object": "2.17.0",
+        "node-opcua-factory": "2.17.0",
+        "node-opcua-nodeid": "2.17.0",
+        "node-opcua-service-secure-channel": "2.17.0",
+        "node-opcua-types": "2.17.0"
+      }
+    },
+    "node-opcua-service-query": {
+      "version": "2.18.0",
+      "resolved": "https://registry.npmjs.org/node-opcua-service-query/-/node-opcua-service-query-2.18.0.tgz",
+      "integrity": "sha512-geYHuuiYfv9er80ZlyScmRESQRLKOJwA/tSSjOYnoaKOQkz3yyoQXy/hqmhR347cgxcZ6TwHWJzqCRbs3zUhzw==",
+      "requires": {
+        "node-opcua-assert": "2.16.0",
+        "node-opcua-basic-types": "2.17.0",
+        "node-opcua-binary-stream": "2.17.0",
+        "node-opcua-data-model": "2.17.0",
+        "node-opcua-factory": "2.17.0",
+        "node-opcua-nodeid": "2.17.0",
+        "node-opcua-numeric-range": "2.17.0",
+        "node-opcua-service-browse": "2.17.0",
+        "node-opcua-service-filter": "2.17.0",
+        "node-opcua-service-secure-channel": "2.17.0",
+        "node-opcua-service-subscription": "2.18.0",
+        "node-opcua-service-translate-browse-path": "2.17.0",
+        "node-opcua-types": "2.17.0"
+      }
+    },
+    "node-opcua-service-read": {
+      "version": "2.17.0",
+      "resolved": "https://registry.npmjs.org/node-opcua-service-read/-/node-opcua-service-read-2.17.0.tgz",
+      "integrity": "sha512-5V2VK5icJki0Og9rOLm/gqMCtl+GZr8Eeq6ibrLoVqSDy45HnwbTJPw77HFli7VviszdjpdYixo4tT5q7BRIdA==",
+      "requires": {
+        "node-opcua-assert": "2.16.0",
+        "node-opcua-basic-types": "2.17.0",
+        "node-opcua-binary-stream": "2.17.0",
+        "node-opcua-data-model": "2.17.0",
+        "node-opcua-data-value": "2.17.0",
+        "node-opcua-factory": "2.17.0",
+        "node-opcua-nodeid": "2.17.0",
+        "node-opcua-numeric-range": "2.17.0",
+        "node-opcua-service-secure-channel": "2.17.0",
+        "node-opcua-types": "2.17.0"
+      }
+    },
+    "node-opcua-service-register-node": {
+      "version": "2.17.0",
+      "resolved": "https://registry.npmjs.org/node-opcua-service-register-node/-/node-opcua-service-register-node-2.17.0.tgz",
+      "integrity": "sha512-J1UhqRkheNaMyeZReJZ0b+qqYyOeaJwKjj4beD6T5J6mmqPRtDGYtDugPpDPTSecZ8994y//mSJ8P1YlVGas5A==",
+      "requires": {
+        "node-opcua-assert": "2.16.0",
+        "node-opcua-basic-types": "2.17.0",
+        "node-opcua-binary-stream": "2.17.0",
+        "node-opcua-factory": "2.17.0",
+        "node-opcua-nodeid": "2.17.0",
+        "node-opcua-service-secure-channel": "2.17.0",
+        "node-opcua-types": "2.17.0"
+      }
+    },
+    "node-opcua-service-secure-channel": {
+      "version": "2.17.0",
+      "resolved": "https://registry.npmjs.org/node-opcua-service-secure-channel/-/node-opcua-service-secure-channel-2.17.0.tgz",
+      "integrity": "sha512-mAJc8NIHTqXE8st2VaaMj3UV8SgGc9x5vSscJ0gVSbsezwzpj7SJHwf0YwNsoovcQB/SKX5JeKXy2S6fBlKTeg==",
+      "requires": {
+        "node-opcua-assert": "2.16.0",
+        "node-opcua-basic-types": "2.17.0",
+        "node-opcua-binary-stream": "2.17.0",
+        "node-opcua-data-model": "2.17.0",
+        "node-opcua-extension-object": "2.17.0",
+        "node-opcua-factory": "2.17.0",
+        "node-opcua-nodeid": "2.17.0",
+        "node-opcua-types": "2.17.0"
+      }
+    },
+    "node-opcua-service-session": {
+      "version": "2.17.0",
+      "resolved": "https://registry.npmjs.org/node-opcua-service-session/-/node-opcua-service-session-2.17.0.tgz",
+      "integrity": "sha512-c+rmZTj/APGXa2qluoETHirn/Z1qI+wyIg0lWHHZUc7u3U+RGzoUg05T4zauv+wvjHWvXtwvSq485XjRty8aLQ==",
+      "requires": {
+        "node-opcua-assert": "2.16.0",
+        "node-opcua-basic-types": "2.17.0",
+        "node-opcua-binary-stream": "2.17.0",
+        "node-opcua-extension-object": "2.17.0",
+        "node-opcua-factory": "2.17.0",
+        "node-opcua-nodeid": "2.17.0",
+        "node-opcua-service-endpoints": "2.17.0",
+        "node-opcua-service-secure-channel": "2.17.0",
+        "node-opcua-types": "2.17.0"
+      }
+    },
+    "node-opcua-service-subscription": {
+      "version": "2.18.0",
+      "resolved": "https://registry.npmjs.org/node-opcua-service-subscription/-/node-opcua-service-subscription-2.18.0.tgz",
+      "integrity": "sha512-pHVdrENZaDxwUtdZ2OASlo5EoufUUC+aoFNPUYEBnqBfKdCeJ3nb6Hamavo7j1TvOXmETmCCHpWZ7g7JGisQ7g==",
+      "requires": {
+        "node-opcua-assert": "2.16.0",
+        "node-opcua-basic-types": "2.17.0",
+        "node-opcua-binary-stream": "2.17.0",
+        "node-opcua-data-value": "2.17.0",
+        "node-opcua-extension-object": "2.17.0",
+        "node-opcua-factory": "2.17.0",
+        "node-opcua-nodeid": "2.17.0",
+        "node-opcua-service-filter": "2.17.0",
+        "node-opcua-service-read": "2.17.0",
+        "node-opcua-service-secure-channel": "2.17.0",
+        "node-opcua-types": "2.17.0",
+        "node-opcua-variant": "2.17.0"
+      }
+    },
+    "node-opcua-service-translate-browse-path": {
+      "version": "2.17.0",
+      "resolved": "https://registry.npmjs.org/node-opcua-service-translate-browse-path/-/node-opcua-service-translate-browse-path-2.17.0.tgz",
+      "integrity": "sha512-GPZ+rlZYEwqDNMKWVJo+C6iKdhxdQ5hIODM+zKimFGsArw75x1b8DBBJE15jZwq1Ajb3LKmGzb6kOO5/9u77JA==",
+      "requires": {
+        "node-opcua-assert": "2.16.0",
+        "node-opcua-basic-types": "2.17.0",
+        "node-opcua-binary-stream": "2.17.0",
+        "node-opcua-constants": "2.16.0",
+        "node-opcua-data-model": "2.17.0",
+        "node-opcua-factory": "2.17.0",
+        "node-opcua-nodeid": "2.17.0",
+        "node-opcua-service-secure-channel": "2.17.0",
+        "node-opcua-types": "2.17.0"
+      }
+    },
+    "node-opcua-service-write": {
+      "version": "2.17.0",
+      "resolved": "https://registry.npmjs.org/node-opcua-service-write/-/node-opcua-service-write-2.17.0.tgz",
+      "integrity": "sha512-o6j7g5gaZIOX/OSmi/ZjRkir+32uLGm+ylOfA5MO34EYHgLF4EYjrTHfZR22/yOoxaHsCl27jqKZRGtP9jb9pA==",
+      "requires": {
+        "node-opcua-assert": "2.16.0",
+        "node-opcua-basic-types": "2.17.0",
+        "node-opcua-binary-stream": "2.17.0",
+        "node-opcua-data-value": "2.17.0",
+        "node-opcua-factory": "2.17.0",
+        "node-opcua-nodeid": "2.17.0",
+        "node-opcua-numeric-range": "2.17.0",
+        "node-opcua-service-secure-channel": "2.17.0",
+        "node-opcua-types": "2.17.0"
+      }
+    },
+    "node-opcua-status-code": {
+      "version": "2.17.0",
+      "resolved": "https://registry.npmjs.org/node-opcua-status-code/-/node-opcua-status-code-2.17.0.tgz",
+      "integrity": "sha512-mfQafweqdD1LW9F1S/FpSEjT/ZS3y49JnB+YHmhycalTbTLpAHpYvDFlu55oYZ3a4j9qJCXedmkIPhqQQUMz8Q==",
+      "requires": {
+        "node-opcua-assert": "2.16.0",
+        "node-opcua-constants": "2.16.0"
+      }
+    },
+    "node-opcua-transport": {
+      "version": "2.18.0",
+      "resolved": "https://registry.npmjs.org/node-opcua-transport/-/node-opcua-transport-2.18.0.tgz",
+      "integrity": "sha512-rK//WwnHoShKotDDF+c3gyXarjqfClx/fYG6HVW7Z8EP1ZzTs54KCgFP4jKcKfiMlqE85hPqE+c7puBr/nbWnA==",
+      "requires": {
+        "chalk": "^4.1.0",
+        "node-opcua-assert": "2.16.0",
+        "node-opcua-basic-types": "2.17.0",
+        "node-opcua-binary-stream": "2.17.0",
+        "node-opcua-buffer-utils": "2.17.0",
+        "node-opcua-chunkmanager": "2.18.0",
+        "node-opcua-debug": "2.17.0",
+        "node-opcua-factory": "2.17.0",
+        "node-opcua-nodeid": "2.17.0",
+        "node-opcua-object-registry": "2.17.0",
+        "node-opcua-packet-assembler": "2.16.0",
+        "node-opcua-status-code": "2.17.0",
+        "node-opcua-types": "2.17.0",
+        "node-opcua-utils": "2.17.0"
+      }
+    },
+    "node-opcua-types": {
+      "version": "2.17.0",
+      "resolved": "https://registry.npmjs.org/node-opcua-types/-/node-opcua-types-2.17.0.tgz",
+      "integrity": "sha512-0DmLv0FexVUZoHPsc1SCkFX9ogYUXR97baVkIZA3z7Arh+0qhs//nO2QOcwnmydMFaf1WJiz+sdqCyMd+w1zAw==",
+      "requires": {
+        "node-opcua-assert": "2.16.0",
+        "node-opcua-basic-types": "2.17.0",
+        "node-opcua-binary-stream": "2.17.0",
+        "node-opcua-buffer-utils": "2.17.0",
+        "node-opcua-data-model": "2.17.0",
+        "node-opcua-data-value": "2.17.0",
+        "node-opcua-date-time": "2.17.0",
+        "node-opcua-debug": "2.17.0",
+        "node-opcua-enum": "2.17.0",
+        "node-opcua-extension-object": "2.17.0",
+        "node-opcua-factory": "2.17.0",
+        "node-opcua-generator": "2.17.0",
+        "node-opcua-guid": "2.16.0",
+        "node-opcua-nodeid": "2.17.0",
+        "node-opcua-numeric-range": "2.17.0",
+        "node-opcua-packet-analyzer": "2.17.0",
+        "node-opcua-schemas": "2.17.0",
+        "node-opcua-status-code": "2.17.0",
+        "node-opcua-utils": "2.17.0",
+        "node-opcua-variant": "2.17.0"
+      }
+    },
+    "node-opcua-utils": {
+      "version": "2.17.0",
+      "resolved": "https://registry.npmjs.org/node-opcua-utils/-/node-opcua-utils-2.17.0.tgz",
+      "integrity": "sha512-Gj0z8NM4lB9YvZWdjEzcGyNYDB40qy7jXouGhADiUVjipkWQFv2sM+Pk5oWSdNI7wf4/HZHE5bgnCRohXKFyBg==",
+      "requires": {
+        "browser-process-hrtime": "^1.0.0",
+        "node-opcua-assert": "2.16.0"
+      }
+    },
+    "node-opcua-variant": {
+      "version": "2.17.0",
+      "resolved": "https://registry.npmjs.org/node-opcua-variant/-/node-opcua-variant-2.17.0.tgz",
+      "integrity": "sha512-v8GRBFTNnIBooJFA183DiULL8UxM/SMJF6EAmb7R+jTM6rPO/X6cthjMa3/hjgX/eSdhqnejVUVDz6vgTr8Tnw==",
+      "requires": {
+        "node-opcua-assert": "2.16.0",
+        "node-opcua-basic-types": "2.17.0",
+        "node-opcua-data-model": "2.17.0",
+        "node-opcua-enum": "2.17.0",
+        "node-opcua-extension-object": "2.17.0",
+        "node-opcua-factory": "2.17.0",
+        "node-opcua-nodeid": "2.17.0",
+        "node-opcua-utils": "2.17.0"
+      }
+    },
+    "node-opcua-vendor-diagnostic": {
+      "version": "2.18.0",
+      "resolved": "https://registry.npmjs.org/node-opcua-vendor-diagnostic/-/node-opcua-vendor-diagnostic-2.18.0.tgz",
+      "integrity": "sha512-hMbDiyMlYBq5AEm7VCfufONRQNGquWc0PY7Wn8tEHZXdr7V7YUYQ1H2pKaHAeF5fzzUe9pnE9YEiUoAO0GwbSQ==",
+      "requires": {
+        "humanize": "0.0.9",
+        "node-opcua-address-space": "2.17.0",
+        "node-opcua-assert": "2.16.0",
+        "node-opcua-constants": "2.16.0",
+        "node-opcua-server": "2.18.0",
+        "node-opcua-status-code": "2.17.0",
+        "node-opcua-variant": "2.17.0"
+      }
+    },
+    "node-opcua-xml2json": {
+      "version": "2.17.0",
+      "resolved": "https://registry.npmjs.org/node-opcua-xml2json/-/node-opcua-xml2json-2.17.0.tgz",
+      "integrity": "sha512-GLQRC1jLsqsALXCOkLHAhRcp0wZpvB846pZA5SSyHHLNBCjN4cXW1iINNJXuUFJYCKM/xlYkrIZXmIUHjpVv6w==",
+      "requires": {
+        "bomstrip": "^0.1.4",
+        "ltx": "^2.10.0",
+        "node-opcua-assert": "2.16.0",
+        "node-opcua-debug": "2.17.0",
+        "node-opcua-utils": "2.17.0",
+        "xml-writer": "^1.7.0"
+      }
+    },
+    "normalize-package-data": {
+      "version": "2.5.0",
+      "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
+      "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
+      "dev": true,
+      "requires": {
+        "hosted-git-info": "^2.1.4",
+        "resolve": "^1.10.0",
+        "semver": "2 || 3 || 4 || 5",
+        "validate-npm-package-license": "^3.0.1"
+      },
+      "dependencies": {
+        "semver": {
+          "version": "5.7.1",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+          "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+          "dev": true
+        }
+      }
+    },
+    "normalize-path": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+      "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="
+    },
+    "normalize-url": {
+      "version": "4.5.0",
+      "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz",
+      "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ=="
+    },
+    "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==",
+      "requires": {
+        "boolbase": "~1.0.0"
+      }
+    },
+    "object-inspect": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz",
+      "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA=="
+    },
+    "object-is": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.3.tgz",
+      "integrity": "sha512-teyqLvFWzLkq5B9ki8FVWA902UER2qkxmdA4nLf+wjOLAWgxzCWZNCxpDq9MvE8MmhWNr+I8w3BN49Vx36Y6Xg==",
+      "requires": {
+        "define-properties": "^1.1.3",
+        "es-abstract": "^1.18.0-next.1"
+      }
+    },
+    "object-keys": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+      "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="
+    },
+    "object.assign": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.1.tgz",
+      "integrity": "sha512-VT/cxmx5yaoHSOTSyrCygIDFco+RsibY2NM0a4RdEeY/4KgqezwFtK1yr3U67xYhqJSlASm2pKhLVzPj2lr4bA==",
+      "requires": {
+        "define-properties": "^1.1.3",
+        "es-abstract": "^1.18.0-next.0",
+        "has-symbols": "^1.0.1",
+        "object-keys": "^1.1.1"
+      }
+    },
+    "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==",
+      "dev": true,
+      "requires": {
+        "define-properties": "^1.1.3",
+        "es-abstract": "^1.17.0-next.1",
+        "function-bind": "^1.1.1",
+        "has": "^1.0.3"
+      },
+      "dependencies": {
+        "es-abstract": {
+          "version": "1.17.7",
+          "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz",
+          "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==",
+          "dev": true,
+          "requires": {
+            "es-to-primitive": "^1.2.1",
+            "function-bind": "^1.1.1",
+            "has": "^1.0.3",
+            "has-symbols": "^1.0.1",
+            "is-callable": "^1.2.2",
+            "is-regex": "^1.1.1",
+            "object-inspect": "^1.8.0",
+            "object-keys": "^1.1.1",
+            "object.assign": "^4.1.1",
+            "string.prototype.trimend": "^1.0.1",
+            "string.prototype.trimstart": "^1.0.1"
+          }
+        }
+      }
+    },
+    "once": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+      "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+      "requires": {
+        "wrappy": "1"
+      }
+    },
+    "p-cancelable": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz",
+      "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw=="
+    },
+    "p-limit": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+      "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+      "requires": {
+        "p-try": "^2.0.0"
+      }
+    },
+    "p-locate": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+      "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+      "requires": {
+        "p-limit": "^2.2.0"
+      }
+    },
+    "p-map": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz",
+      "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==",
+      "requires": {
+        "aggregate-error": "^3.0.0"
+      }
+    },
+    "p-try": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+      "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="
+    },
+    "package-json": {
+      "version": "6.5.0",
+      "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz",
+      "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==",
+      "requires": {
+        "got": "^9.6.0",
+        "registry-auth-token": "^4.0.0",
+        "registry-url": "^5.0.0",
+        "semver": "^6.2.0"
+      },
+      "dependencies": {
+        "semver": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
+        }
+      }
+    },
+    "parse-json": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
+      "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
+      "dev": true,
+      "requires": {
+        "error-ex": "^1.2.0"
+      }
+    },
+    "parse-passwd": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz",
+      "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY="
+    },
+    "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
+    },
+    "path-is-absolute": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+      "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
+    },
+    "path-parse": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
+      "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
+      "dev": true
+    },
+    "path-type": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz",
+      "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=",
+      "dev": true,
+      "requires": {
+        "pify": "^2.0.0"
+      }
+    },
+    "pend": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
+      "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA="
+    },
+    "picomatch": {
+      "version": "2.2.2",
+      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
+      "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg=="
+    },
+    "pify": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+      "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+      "dev": true
+    },
+    "pkg-dir": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz",
+      "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=",
+      "dev": true,
+      "requires": {
+        "find-up": "^2.1.0"
+      }
+    },
+    "precond": {
+      "version": "0.2.3",
+      "resolved": "https://registry.npmjs.org/precond/-/precond-0.2.3.tgz",
+      "integrity": "sha1-qpWRvKokkj8eD0hJ0kD0fvwQdaw="
+    },
+    "prepend-http": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz",
+      "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc="
+    },
+    "pretty-error": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz",
+      "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=",
+      "requires": {
+        "renderkid": "^2.0.1",
+        "utila": "~0.4"
+      }
+    },
+    "progress": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
+      "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA=="
+    },
+    "pump": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
+      "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
+      "requires": {
+        "end-of-stream": "^1.1.0",
+        "once": "^1.3.1"
+      }
+    },
+    "pupa": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.0.1.tgz",
+      "integrity": "sha512-hEJH0s8PXLY/cdXh66tNEQGndDrIKNqNC5xmrysZy3i5C3oEoLna7YAOad+7u125+zH1HNXUmGEkrhb3c2VriA==",
+      "requires": {
+        "escape-goat": "^2.0.0"
+      }
+    },
+    "rc": {
+      "version": "1.2.8",
+      "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
+      "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
+      "requires": {
+        "deep-extend": "^0.6.0",
+        "ini": "~1.3.0",
+        "minimist": "^1.2.0",
+        "strip-json-comments": "~2.0.1"
+      }
+    },
+    "read-pkg": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz",
+      "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=",
+      "dev": true,
+      "requires": {
+        "load-json-file": "^2.0.0",
+        "normalize-package-data": "^2.3.2",
+        "path-type": "^2.0.0"
+      }
+    },
+    "read-pkg-up": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz",
+      "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=",
+      "dev": true,
+      "requires": {
+        "find-up": "^2.0.0",
+        "read-pkg": "^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==",
+      "requires": {
+        "inherits": "^2.0.3",
+        "string_decoder": "^1.1.1",
+        "util-deprecate": "^1.0.1"
+      }
+    },
+    "readdirp": {
+      "version": "3.4.0",
+      "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz",
+      "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==",
+      "requires": {
+        "picomatch": "^2.2.1"
+      }
+    },
+    "regexp.prototype.flags": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz",
+      "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==",
+      "requires": {
+        "define-properties": "^1.1.3",
+        "es-abstract": "^1.17.0-next.1"
+      },
+      "dependencies": {
+        "es-abstract": {
+          "version": "1.17.7",
+          "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz",
+          "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==",
+          "requires": {
+            "es-to-primitive": "^1.2.1",
+            "function-bind": "^1.1.1",
+            "has": "^1.0.3",
+            "has-symbols": "^1.0.1",
+            "is-callable": "^1.2.2",
+            "is-regex": "^1.1.1",
+            "object-inspect": "^1.8.0",
+            "object-keys": "^1.1.1",
+            "object.assign": "^4.1.1",
+            "string.prototype.trimend": "^1.0.1",
+            "string.prototype.trimstart": "^1.0.1"
+          }
+        }
+      }
+    },
+    "regexpp": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz",
+      "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==",
+      "dev": true
+    },
+    "registry-auth-token": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.0.tgz",
+      "integrity": "sha512-P+lWzPrsgfN+UEpDS3U8AQKg/UjZX6mQSJueZj3EK+vNESoqBSpBUD3gmu4sF9lOsjXWjF11dQKUqemf3veq1w==",
+      "requires": {
+        "rc": "^1.2.8"
+      }
+    },
+    "registry-url": {
+      "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz",
+      "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==",
+      "requires": {
+        "rc": "^1.2.8"
+      }
+    },
+    "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==",
+      "requires": {
+        "css-select": "^1.1.0",
+        "dom-converter": "^0.2",
+        "htmlparser2": "^3.3.0",
+        "strip-ansi": "^3.0.0",
+        "utila": "^0.4.0"
+      }
+    },
+    "require-directory": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+      "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I="
+    },
+    "require-main-filename": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
+      "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg=="
+    },
+    "resolve": {
+      "version": "1.17.0",
+      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz",
+      "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==",
+      "dev": true,
+      "requires": {
+        "path-parse": "^1.0.6"
+      }
+    },
+    "responselike": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz",
+      "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=",
+      "requires": {
+        "lowercase-keys": "^1.0.0"
+      }
+    },
+    "reusify": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
+      "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw=="
+    },
+    "rimraf": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+      "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+      "requires": {
+        "glob": "^7.1.3"
+      }
+    },
+    "run-parallel": {
+      "version": "1.1.9",
+      "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz",
+      "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q=="
+    },
+    "safe-buffer": {
+      "version": "5.2.1",
+      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+      "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
+    },
+    "safer-buffer": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
+    },
+    "semver": {
+      "version": "7.3.2",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
+      "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ=="
+    },
+    "semver-diff": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz",
+      "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==",
+      "requires": {
+        "semver": "^6.3.0"
+      },
+      "dependencies": {
+        "semver": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
+        }
+      }
+    },
+    "set-blocking": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
+      "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc="
+    },
+    "set-prototype-of": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/set-prototype-of/-/set-prototype-of-1.0.0.tgz",
+      "integrity": "sha1-gCIdbaDsaFEd3HQ5CXV60UT8Hf0="
+    },
+    "signal-exit": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
+      "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA=="
+    },
+    "slash": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+      "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q=="
+    },
+    "source-map": {
+      "version": "0.5.7",
+      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+      "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
+    },
+    "source-map-support": {
+      "version": "0.4.18",
+      "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz",
+      "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==",
+      "requires": {
+        "source-map": "^0.5.6"
+      }
+    },
+    "spdx-correct": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz",
+      "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==",
+      "dev": true,
+      "requires": {
+        "spdx-expression-parse": "^3.0.0",
+        "spdx-license-ids": "^3.0.0"
+      }
+    },
+    "spdx-exceptions": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz",
+      "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==",
+      "dev": true
+    },
+    "spdx-expression-parse": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
+      "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
+      "dev": true,
+      "requires": {
+        "spdx-exceptions": "^2.1.0",
+        "spdx-license-ids": "^3.0.0"
+      }
+    },
+    "spdx-license-ids": {
+      "version": "3.0.6",
+      "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.6.tgz",
+      "integrity": "sha512-+orQK83kyMva3WyPf59k1+Y525csj5JejicWut55zeTWANuN17qSiSLUXWtzHeNWORSvT7GLDJ/E/XiIWoXBTw==",
+      "dev": true
+    },
+    "sshpk": {
+      "version": "1.16.1",
+      "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz",
+      "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==",
+      "requires": {
+        "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"
+      }
+    },
+    "string-width": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
+      "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
+      "requires": {
+        "emoji-regex": "^8.0.0",
+        "is-fullwidth-code-point": "^3.0.0",
+        "strip-ansi": "^6.0.0"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+          "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg=="
+        },
+        "emoji-regex": {
+          "version": "8.0.0",
+          "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+          "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
+        },
+        "is-fullwidth-code-point": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+          "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="
+        },
+        "strip-ansi": {
+          "version": "6.0.0",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
+          "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+          "requires": {
+            "ansi-regex": "^5.0.0"
+          }
+        }
+      }
+    },
+    "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==",
+      "requires": {
+        "define-properties": "^1.1.3",
+        "es-abstract": "^1.17.5"
+      },
+      "dependencies": {
+        "es-abstract": {
+          "version": "1.17.7",
+          "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz",
+          "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==",
+          "requires": {
+            "es-to-primitive": "^1.2.1",
+            "function-bind": "^1.1.1",
+            "has": "^1.0.3",
+            "has-symbols": "^1.0.1",
+            "is-callable": "^1.2.2",
+            "is-regex": "^1.1.1",
+            "object-inspect": "^1.8.0",
+            "object-keys": "^1.1.1",
+            "object.assign": "^4.1.1",
+            "string.prototype.trimend": "^1.0.1",
+            "string.prototype.trimstart": "^1.0.1"
+          }
+        }
+      }
+    },
+    "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==",
+      "requires": {
+        "define-properties": "^1.1.3",
+        "es-abstract": "^1.17.5"
+      },
+      "dependencies": {
+        "es-abstract": {
+          "version": "1.17.7",
+          "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz",
+          "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==",
+          "requires": {
+            "es-to-primitive": "^1.2.1",
+            "function-bind": "^1.1.1",
+            "has": "^1.0.3",
+            "has-symbols": "^1.0.1",
+            "is-callable": "^1.2.2",
+            "is-regex": "^1.1.1",
+            "object-inspect": "^1.8.0",
+            "object-keys": "^1.1.1",
+            "object.assign": "^4.1.1",
+            "string.prototype.trimend": "^1.0.1",
+            "string.prototype.trimstart": "^1.0.1"
+          }
+        }
+      }
+    },
+    "string_decoder": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+      "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+      "requires": {
+        "safe-buffer": "~5.2.0"
+      }
+    },
+    "strip-ansi": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+      "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+      "requires": {
+        "ansi-regex": "^2.0.0"
+      }
+    },
+    "strip-bom": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+      "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM="
+    },
+    "strip-json-comments": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
+      "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo="
+    },
+    "supports-color": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+      "requires": {
+        "has-flag": "^4.0.0"
+      }
+    },
+    "term-size": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.0.tgz",
+      "integrity": "sha512-a6sumDlzyHVJWb8+YofY4TW112G6p2FCPEAFk+59gIYHv3XHRhm9ltVQ9kli4hNWeQBwSpe8cRN25x0ROunMOw=="
+    },
+    "thenify": {
+      "version": "3.3.1",
+      "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
+      "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==",
+      "requires": {
+        "any-promise": "^1.0.0"
+      }
+    },
+    "thunky": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz",
+      "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA=="
+    },
+    "to-readable-stream": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz",
+      "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q=="
+    },
+    "to-regex-range": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+      "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+      "requires": {
+        "is-number": "^7.0.0"
+      }
+    },
+    "ts-node": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-3.3.0.tgz",
+      "integrity": "sha1-wTxqMCTjC+EYDdUwOPwgkonUv2k=",
+      "requires": {
+        "arrify": "^1.0.0",
+        "chalk": "^2.0.0",
+        "diff": "^3.1.0",
+        "make-error": "^1.1.1",
+        "minimist": "^1.2.0",
+        "mkdirp": "^0.5.1",
+        "source-map-support": "^0.4.0",
+        "tsconfig": "^6.0.0",
+        "v8flags": "^3.0.0",
+        "yn": "^2.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==",
+          "requires": {
+            "color-convert": "^1.9.0"
+          }
+        },
+        "chalk": {
+          "version": "2.4.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+          "requires": {
+            "ansi-styles": "^3.2.1",
+            "escape-string-regexp": "^1.0.5",
+            "supports-color": "^5.3.0"
+          }
+        },
+        "color-convert": {
+          "version": "1.9.3",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+          "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+          "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="
+        },
+        "has-flag": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+          "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
+        },
+        "supports-color": {
+          "version": "5.5.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+          "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
+        }
+      }
+    },
+    "tsconfig": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-6.0.0.tgz",
+      "integrity": "sha1-aw6DdgA9evGGT434+J3QBZ/80DI=",
+      "requires": {
+        "strip-bom": "^3.0.0",
+        "strip-json-comments": "^2.0.0"
+      }
+    },
+    "tsconfig-paths": {
+      "version": "3.9.0",
+      "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz",
+      "integrity": "sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==",
+      "dev": true,
+      "requires": {
+        "@types/json5": "^0.0.29",
+        "json5": "^1.0.1",
+        "minimist": "^1.2.0",
+        "strip-bom": "^3.0.0"
+      }
+    },
+    "tunnel": {
+      "version": "0.0.6",
+      "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz",
+      "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg=="
+    },
+    "tweetnacl": {
+      "version": "0.14.5",
+      "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
+      "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q="
+    },
+    "type-fest": {
+      "version": "0.8.1",
+      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
+      "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA=="
+    },
+    "typedarray-to-buffer": {
+      "version": "3.1.5",
+      "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
+      "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
+      "requires": {
+        "is-typedarray": "^1.0.0"
+      }
+    },
+    "typescript": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.3.tgz",
+      "integrity": "sha512-tEu6DGxGgRJPb/mVPIZ48e69xCn2yRmCgYmDugAVwmJ6o+0u1RI18eO7E7WBTLYLaEVVOhwQmcdhQHweux/WPg=="
+    },
+    "underscore": {
+      "version": "1.11.0",
+      "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.11.0.tgz",
+      "integrity": "sha512-xY96SsN3NA461qIRKZ/+qox37YXPtSBswMGfiNptr+wrt6ds4HaMw23TP612fEyGekRE6LNRiLYr/aqbHXNedw=="
+    },
+    "unique-string": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz",
+      "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==",
+      "requires": {
+        "crypto-random-string": "^2.0.0"
+      }
+    },
+    "update-notifier": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.0.0.tgz",
+      "integrity": "sha512-8tqsiVrMv7aZsKNSjqA6DdBLKJpZG1hRpkj1RbOJu1PgyP69OX+EInAnP1EK/ShX5YdPFgwWdk19oquZ0HTM8g==",
+      "requires": {
+        "boxen": "^4.2.0",
+        "chalk": "^4.1.0",
+        "configstore": "^5.0.1",
+        "has-yarn": "^2.1.0",
+        "import-lazy": "^2.1.0",
+        "is-ci": "^2.0.0",
+        "is-installed-globally": "^0.3.1",
+        "is-npm": "^5.0.0",
+        "is-yarn-global": "^0.3.0",
+        "latest-version": "^5.0.0",
+        "pupa": "^2.0.1",
+        "semver": "^7.3.2",
+        "semver-diff": "^3.1.1",
+        "xdg-basedir": "^4.0.0"
+      }
+    },
+    "url-parse-lax": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz",
+      "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=",
+      "requires": {
+        "prepend-http": "^2.0.0"
+      }
+    },
+    "util-deprecate": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+      "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
+    },
+    "utila": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz",
+      "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw="
+    },
+    "v8flags": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz",
+      "integrity": "sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==",
+      "requires": {
+        "homedir-polyfill": "^1.0.1"
+      }
+    },
+    "validate-npm-package-license": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
+      "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
+      "dev": true,
+      "requires": {
+        "spdx-correct": "^3.0.0",
+        "spdx-expression-parse": "^3.0.0"
+      }
+    },
+    "walk": {
+      "version": "2.3.14",
+      "resolved": "https://registry.npmjs.org/walk/-/walk-2.3.14.tgz",
+      "integrity": "sha512-5skcWAUmySj6hkBdH6B6+3ddMjVQYH5Qy9QGbPmN8kVmLteXk+yVXg+yfk1nbX30EYakahLrr8iPcCxJQSCBeg==",
+      "requires": {
+        "foreachasync": "^3.0.0"
+      }
+    },
+    "wget-improved": {
+      "version": "3.2.1",
+      "resolved": "https://registry.npmjs.org/wget-improved/-/wget-improved-3.2.1.tgz",
+      "integrity": "sha512-bZmRufYav/OFRdS8LerCbzP3b/L8tjRwqap6NhqcvEAfZrBMFwqjtFzbVk2gutEWdG78WKJgIn9yveI+ENQSlA==",
+      "requires": {
+        "minimist": "1.2.5",
+        "tunnel": "0.0.6"
+      }
+    },
+    "which-module": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
+      "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho="
+    },
+    "widest-line": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz",
+      "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==",
+      "requires": {
+        "string-width": "^4.0.0"
+      }
+    },
+    "wrap-ansi": {
+      "version": "6.2.0",
+      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
+      "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
+      "requires": {
+        "ansi-styles": "^4.0.0",
+        "string-width": "^4.1.0",
+        "strip-ansi": "^6.0.0"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+          "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg=="
+        },
+        "strip-ansi": {
+          "version": "6.0.0",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
+          "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+          "requires": {
+            "ansi-regex": "^5.0.0"
+          }
+        }
+      }
+    },
+    "wrappy": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+      "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
+    },
+    "write-file-atomic": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz",
+      "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==",
+      "requires": {
+        "imurmurhash": "^0.1.4",
+        "is-typedarray": "^1.0.0",
+        "signal-exit": "^3.0.2",
+        "typedarray-to-buffer": "^3.1.5"
+      }
+    },
+    "xdg-basedir": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz",
+      "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q=="
+    },
+    "xml-writer": {
+      "version": "1.7.0",
+      "resolved": "https://registry.npmjs.org/xml-writer/-/xml-writer-1.7.0.tgz",
+      "integrity": "sha1-t28dWRwWomNOvbcDx729D9aBkGU="
+    },
+    "y18n": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz",
+      "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w=="
+    },
+    "yargs": {
+      "version": "15.4.1",
+      "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz",
+      "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==",
+      "requires": {
+        "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"
+      },
+      "dependencies": {
+        "find-up": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+          "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+          "requires": {
+            "locate-path": "^5.0.0",
+            "path-exists": "^4.0.0"
+          }
+        },
+        "path-exists": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+          "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="
+        }
+      }
+    },
+    "yargs-parser": {
+      "version": "18.1.3",
+      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
+      "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
+      "requires": {
+        "camelcase": "^5.0.0",
+        "decamelize": "^1.2.0"
+      }
+    },
+    "yauzl": {
+      "version": "2.10.0",
+      "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz",
+      "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=",
+      "requires": {
+        "buffer-crc32": "~0.2.3",
+        "fd-slicer": "~1.1.0"
+      }
+    },
+    "yn": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz",
+      "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo="
+    }
+  }
+}
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..8708369
--- /dev/null
+++ b/package.json
@@ -0,0 +1,32 @@
+{
+  "name": "node-opcua-sample",
+  "version": "0.4.5",
+  "description": "Simple OPCUA  client using node-opcua",
+  "main": "simple_client.js",
+  "scripts": {
+    "test": "echo \"Error: no test specified\" && exit 1"
+  },
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/erossignon/node-opcua-sample.git"
+  },
+  "keywords": [
+    "opcua"
+  ],
+  "author": "Etienne Rossignon",
+  "license": "MIT",
+  "dependencies": {
+    "@types/node": "^14.11.2",
+    "async": "~3.2.0",
+    "axios": "^0.21.4",
+    "node-opcua": "~2.18.0",
+    "ts-node": "^3.0.4"
+  },
+  "devDependencies": {
+    "eslint-config-standard": "^14.1.1",
+    "eslint-plugin-import": "^2.22.1",
+    "eslint-plugin-node": "^11.1.0",
+    "eslint-plugin-promise": "^4.2.1",
+    "eslint-plugin-standard": "^4.0.1"
+  }
+}
diff --git a/script.sh b/script.sh
new file mode 100644
index 0000000..e1981a1
--- /dev/null
+++ b/script.sh
@@ -0,0 +1,14 @@
+#!/bin/bash
+
+#stopping upm client container
+docker container stop upmclient
+#removing upm client container
+docker container rm upmclient
+#removing upm client image
+docker image rm upmclient
+#building upm client image
+docker build -t upmclient .
+#saving upm client image to upmclient.tar in current directory
+docekr save -o upmclient.tar upmclient
+#creating upm client container
+docker run -d --env-file ./environment.env -t OPCUAClient
\ No newline at end of file
diff --git a/test.ts b/test.ts
new file mode 100644
index 0000000..8d6afcd
--- /dev/null
+++ b/test.ts
@@ -0,0 +1,39 @@
+const data=[
+    {
+        "@context": "https://uri.etsi.org/ngsi-ld/v1/ngsi-ld-core-context.jsonld",
+        "id": "urn:ngsi-ld:Alert:BOSH:feed-trigger-2",
+        "type": "https://uri.fiware.org/ns/data-models#Alert"
+    },
+    {
+        "@context": "https://uri.etsi.org/ngsi-ld/v1/ngsi-ld-core-context.jsonld",
+        "id": "urn:ngsi-ld:Alert:BOSH:feed-trigger-3",
+        "type": "https://uri.fiware.org/ns/data-models#Alert"
+    },
+    {
+        "@context": "https://uri.etsi.org/ngsi-ld/v1/ngsi-ld-core-context.jsonld",
+        "id": "urn:ngsi-ld:Alert:BOSH:feed-trigger-2321",
+        "type": "https://uri.fiware.org/ns/data-models#Alert"
+    },
+    {
+        "@context": "https://uri.etsi.org/ngsi-ld/v1/ngsi-ld-core-context.jsonld",
+        "id": "urn:ngsi-ld:Alert:BOSH:feed-trigger-12",
+        "type": "https://uri.fiware.org/ns/data-models#Alert"
+    },
+    {
+        "@context": "https://uri.etsi.org/ngsi-ld/v1/ngsi-ld-core-context.jsonld",
+        "id": "urn:ngsi-ld:Alert:BOSH:feed-trigger-45552",
+        "type": "https://uri.fiware.org/ns/data-models#Alert"
+    },
+    {
+        "@context": "https://uri.etsi.org/ngsi-ld/v1/ngsi-ld-core-context.jsonld",
+        "id": "urn:ngsi-ld:Alert:BOSH:feed-trigger-4",
+        "type": "https://uri.fiware.org/ns/data-models#Alert"
+    },
+]
+
+const restult = data.map(o=>o.id.split('-')
+                    .slice(-1)[0])
+                    .map(l=>parseInt(l)).sort( (a,b) =>a - b )
+                    .slice(-1)[0]
+                    
+console.log(restult);
\ No newline at end of file
diff --git a/trytypes.ts b/trytypes.ts
new file mode 100644
index 0000000..7895121
--- /dev/null
+++ b/trytypes.ts
@@ -0,0 +1,17 @@
+export const trytypes={
+    TypeA: ["0285009006", "0285009016","0285009018","0285009024","0285009072","0285009107",
+        "0285009121","0285009123"],
+    TypeB: ["0285009002","0285009017","0285009020","0285009028","0285009035","0285009048",
+        "0285009063","0285009065","0285009088","0285009091"],
+    TypeC: ["0285009008","0285009010","0285009012","0285009022","0285009026","0285009032",
+        "0285009042","0285009050","0285009052","0285009057","0285009074","0285009078",
+        "0285009080","0285009082","0285009086","0285009092","0285009093","0285009094",
+        "0285009095","0285009097","0285009105","0285009108","0285009109","0285009115",
+        "0285009116","0285009117","0285009122","0285009124","0285009125","0285009126",
+        "0285009132","0285009133","0285009137","0285009138","0285009139","0285009140",
+        "0285009141","0285009144","0285009145","0285009146","0285009147","0285009149",
+        "0285009150","0285009151","0285009152","0285009153","0285009154","0285009160",
+        "0285009163","0285009164","0285009168","0285009170","0285009171","0285009172",
+        "0285009173","0285009176","0285009177","0285009178","0285009202","0285009203",
+        "0285009209","0285009210","0285009211"]
+}
\ No newline at end of file
diff --git a/tsconfig.json b/tsconfig.json
new file mode 100644
index 0000000..a5e15f1
--- /dev/null
+++ b/tsconfig.json
@@ -0,0 +1,13 @@
+{
+  "compilerOptions": {
+    "target": "es5",
+    "moduleResolution": "node",
+    "module": "commonjs",
+    "declaration": false,
+    "outDir": "./dist",
+    "strict": false,
+    "lib": ["es2015","es2015.promise"],
+    "sourceMap": true,
+    "noImplicitAny": true
+  }
+}
diff --git a/upmclient.ts b/upmclient.ts
new file mode 100644
index 0000000..f1848fa
--- /dev/null
+++ b/upmclient.ts
@@ -0,0 +1,285 @@
+
+import { AttributeIds,OPCUAClient,DataValue,TimestampsToReturn,SecurityPolicy, NotificationMessage} from "node-opcua";
+import { Logger } from './Logger'
+import { trytypes } from './trytypes'
+
+var trayType="NA";
+var default_index = 0
+// const nodeId_TypeNoCur = "ns=4;s=\"DataHandling\".\"TypeNoCur\"";
+const dateIssued ="https://smart-data-models.github.io/data-models/terms.jsonld#/definitions/dateIssued"
+var axios= require("axios")
+//Fiware Configuration
+const fiware_url=process.env.FIWARE_SERVER_URL || undefined
+const fiware_node_id=process.env.FIWARE_NODE_ID || undefined
+
+//Line 2 configuration
+const LINE_2_URL=process.env.LINE_2_URL || undefined
+const TypeNoCur_plc_nodeid_L2=process.env.TypeNoCur_NODEID_L2 || undefined
+const BlisterEntry_plc_nodeid_L2=process.env.BlisterEntry_NODEID_L2  || undefined
+
+//Line 5 configuration
+const LINE_5_URL=process.env.LINE_5_URL || undefined
+const TypeNoCur_plc_nodeid_L5=process.env.TypeNoCur_NODEID_L5 || undefined
+const BlisterEntry_plc_nodeid_L5=process.env.BlisterEntry_NODEID_L5|| undefined
+
+// interval of subscription checks
+const publishing_interval = 1000
+
+
+var notification_body ={
+    id: '',
+    type: "Alert",
+    category:{
+        type: "Property",
+        value: "feeding-trigger"
+    },
+    description: {
+        type: "Property",
+        value: '',
+                 },
+    dateIssued: {
+        type: "Property",
+        value: {
+            "@type": "DateTime",
+            "@value": new Date().toISOString()
+        }
+                },
+            
+      alertSource: {
+        type: "Relationship",
+        object: "urn:ngsi-ld:Asset:BOS:LS2"
+    },
+    "@context": [
+       "https://smartdatamodels.org/context.jsonld",
+       "https://raw.githubusercontent.com/shop4cf/data-models/master/docs/shop4cfcontext.jsonld"
+
+    ]       
+
+    }
+
+const connectionStrategy={
+    maxRetry: 2,
+    initialDelay: 2000,
+    maxDelay: 10 * 1000
+}
+const requestedParameter= {
+    samplingInterval: 500,
+    discardOldest: true,
+    queueSize: 10
+}
+const serverConnectionConfiguration={
+    endpoint_must_exist: false,
+    securityPolicy: SecurityPolicy.None,
+    applicationName: "WoT-IL",
+    connectionStrategy: connectionStrategy
+}
+
+
+async function init(){
+
+    if(fiware_node_id == undefined){
+        Logger.failure(`undefined fiware_node_id. Actual value =${fiware_node_id}. Check environment configuration`)
+        throw new Error();
+    }
+    if(fiware_url == undefined){
+        const message=`undefined fiware_url. Actual value =${fiware_url}. Check environment configuration`
+        Logger.failure(message)
+        throw new Error(message);
+    }
+    if(LINE_2_URL == undefined){
+        const message=`undefined LINE_2_URL. Actual value =${LINE_2_URL}. Check environment configuration`
+        Logger.failure(message)
+        throw new Error(message);
+    }
+    if(LINE_5_URL == undefined){
+        const message=`undefined LINE_5_URL. Actual value =${LINE_5_URL}. Check environment configuration`
+        Logger.failure(message)
+        throw new Error(message);
+    }
+    if(TypeNoCur_plc_nodeid_L2 == undefined){
+        const message=`undefined TypeNoCur_plc_nodeid_L2. Actual value =${TypeNoCur_plc_nodeid_L2}. Check environment configuration`
+        Logger.failure(message)
+        throw new Error(message);
+    }
+    if(BlisterEntry_plc_nodeid_L2 == undefined){
+        const message=`undefined BlisterEntry_plc_nodeid_L2. Actual value =${BlisterEntry_plc_nodeid_L2}. Check environment configuration`
+        Logger.failure(message)
+        throw new Error(message);
+    }
+
+    if(TypeNoCur_plc_nodeid_L5 == undefined){
+        const message=`undefined TypeNoCur_plc_nodeid_L5. Actual value =${TypeNoCur_plc_nodeid_L5}. Check environment configuration`
+        Logger.failure(message)
+        throw new Error(message);
+    }
+    if(BlisterEntry_plc_nodeid_L5 == undefined){
+        const message=`undefined BlisterEntry_plc_nodeid_L5. Actual value =${BlisterEntry_plc_nodeid_L5}. Check environment configuration`
+        Logger.failure(message)
+        throw new Error(message);
+    }
+    
+    const entity_id = await getLastRecordOfType("https://uri.fiware.org/ns/data-models%23Alert")
+    if(entity_id > 0){
+        default_index = 0
+    }
+
+    //Line 2 setup
+    const l2_client = await connectoToPLC(LINE_2_URL)
+    const TypeNoCur_subscription_L2 = await createSubscription(l2_client,TypeNoCur_plc_nodeid_L2)
+    const BlisterEntry_subscription_L2 = await createSubscription(l2_client,BlisterEntry_plc_nodeid_L2)
+
+    TypeNoCur_subscription_L2.on("changed",  async (dataValue_TypeNoCur: DataValue) => {
+        Logger.debug(`Monitoring TypeNoCur on line 2. Current value = ${dataValue_TypeNoCur.value.value.toString()}`)
+        if(trytypes.TypeA.indexOf(dataValue_TypeNoCur.value.value.toString()) != -1){
+            trayType = 'A'
+        }else if(trytypes.TypeB.indexOf(dataValue_TypeNoCur.value.value.toString()) == -1){
+            trayType = 'B'
+        }else if(trytypes.TypeC.indexOf(dataValue_TypeNoCur.value.value.toString()) == -1){
+            trayType = 'C'
+        }else{
+            Logger.warn(`L2 - try type not defined. Given ${dataValue_TypeNoCur.value.value.toString()}`)
+        }       
+    });
+    
+    BlisterEntry_subscription_L2.on("changed",  async (dataValue_BlisterEntry: DataValue) => {
+        Logger.debug(`Monitoring BlisterEntry on line 2. Current value = ${dataValue_BlisterEntry.value.value.toString()}`)
+        if(dataValue_BlisterEntry.value.value.toString() == "false"){
+            default_index=default_index+1;
+            notification_body.id=`${fiware_node_id}${default_index}`
+            notification_body.description.value=trayType
+            notification_body.alertSource.object='urn:ngsi-ld:Asset:BOS:LS2'
+            postRecord(notification_body)
+           }else{
+            Logger.debug("BlisterEntry at line L2 is not needed")
+        }         
+    });
+    //Line 5 setup
+    const l5_client = await connectoToPLC(LINE_5_URL)
+    const TypeNoCur_subscription_L5 = await createSubscription(l5_client,TypeNoCur_plc_nodeid_L5)
+    const BlisterEntry_subscription_L5 = await createSubscription(l5_client,BlisterEntry_plc_nodeid_L5)
+
+    TypeNoCur_subscription_L5.on("changed",  async (dataValue_TypeNoCur: DataValue) => {
+        Logger.debug(`Monitoring TypeNoCur on line 5. Current value = ${dataValue_TypeNoCur.value.value.toString()}`)
+        if(trytypes.TypeA.indexOf(dataValue_TypeNoCur.value.value.toString()) != -1){
+            trayType = 'A'
+        }else if(trytypes.TypeB.indexOf(dataValue_TypeNoCur.value.value.toString()) == -1){
+            trayType = 'B'
+        }else if(trytypes.TypeC.indexOf(dataValue_TypeNoCur.value.value.toString()) == -1){
+            trayType = 'C'
+        }else{
+            Logger.warn(`L5 - try type not defined. Given ${dataValue_TypeNoCur.value.value.toString()}`)
+        }       
+    });
+    
+    BlisterEntry_subscription_L5.on("changed",  async (dataValue_BlisterEntry: DataValue) => {
+        Logger.debug(`Monitoring BlisterEntry on line 5. Current value = ${dataValue_BlisterEntry.value.value.toString()}`)
+        if(dataValue_BlisterEntry.value.value.toString() == "false"){
+            default_index=default_index+1;
+            notification_body.id=`${fiware_node_id}${default_index}`
+            notification_body.description.value=trayType
+            notification_body.alertSource.object='urn:ngsi-ld:Asset:BOS:LS5'
+            postRecord(notification_body)
+           }else{
+            Logger.debug("BlisterEntry at line L5 is not needed")
+        }         
+    });
+
+}
+
+async function connectoToPLC(url:any){
+    Logger.debug(`Connecting to PLC ${url}...`)
+    const client = OPCUAClient.create(serverConnectionConfiguration);
+    try {
+        await  client.connect(url)
+        return client
+    } catch (error) {
+        Logger.failure(`Cant connect to PLC ${url} --- ${JSON.stringify(error)}`)
+    }
+}
+
+async function getLastRecordOfType(record_type:any){
+    Logger.debug(`finding record of type ${record_type}`)
+    try {
+        var result = await axios.get(`${fiware_url}/ngsi-ld/v1/entities?type=${record_type}`).then((response:any)=>response.data)
+    if(result.length != 0 ){
+        let idStartNumber = result.map((o:any)=>o.id.split('-')
+            .slice(-1)[0])
+            .map((l:string)=>parseInt(l)).sort( (a: number,b: number) =>a - b )
+            .slice(-1)[0]
+
+    Logger.debug(`last notification id was  ${idStartNumber}`)
+      return parseInt(idStartNumber)
+    }else{
+        Logger.debug(`there is no entity matching with ${record_type}`)
+        return 0
+    } 
+    } catch (error) {
+        Logger.failure(`EXCEPTION GIVEN - cant get getLastRecordOfType  ${record_type } - ${JSON.stringify(error)}`)
+        return 0
+    }
+}
+
+async function createSubscription(client:any,node_id:any) {
+    Logger.debug(`creating subscription for ${node_id}...`);
+    const session = await client.createSession();
+    const subscription = await  session.createSubscription2({
+        requestedPublishingInterval: 1000,
+        requestedLifetimeCount: 100,
+        requestedMaxKeepAliveCount: 20,
+        maxNotificationsPerPublish: 10,
+        publishingEnabled: true,
+        priority: 10
+    });
+
+    subscription
+        .on("started", () => console.log("subscription started - subscriptionId=", subscription.subscriptionId))
+        .on("keepalive", () => Logger.debug(`keep alive ${node_id}`))
+        .on("terminated", () => console.log("subscription terminated"));
+    const itemToMonitor={
+        nodeId:node_id,
+        attributeId: AttributeIds.Value
+    }
+    const monitoredItem = await subscription.monitor(
+        itemToMonitor,
+        requestedParameter,
+        TimestampsToReturn.Both);
+return monitoredItem
+}
+
+async function readVariable(client:any,node:any){
+    const session = await client.createSession();
+    const maxAge = 0;
+    const nodeToRead = {
+      nodeId: node,
+    };
+    const dataValue =  await session.read(nodeToRead, maxAge);
+    console.log(" value " , dataValue.toString());
+}
+
+async function browse(client:any){
+   
+    const session = await client.createSession();
+    const browseResult = await session.browse("RootFolder");
+    // const browsePath = makeBrowsePath("RootFolder", "/Objects/Server.ServerStatus.BuildInfo");
+    // const result = await session.translateBrowsePath(browsePath);
+    console.log(JSON.stringify(browseResult));
+    
+    // const productNameNodeId = result.targets[0].targetId;
+    // console.log(" Product Name nodeId = ", productNameNodeId.toString());
+}
+
+function postRecord(body:any){
+    const headers={
+        'Content-Type': 'application/ld+json',
+        }
+    Logger.debug(`body id = ${body.id}`)
+    axios.post(`${fiware_url}/ngsi-ld/v1/entities`,body,{headers:headers}).then((response:any)=>{
+        Logger.debug(JSON.stringify({response:response.status,statusText:response.statusText}))
+    },(error:any)=>{
+        Logger.failure(JSON.stringify(error))
+    }).catch((r:any)=>{
+        Logger.failure(JSON.stringify(r))
+    })
+
+}
+init()
-- 
GitLab