This is an automated email from the ASF dual-hosted git repository.

danwatford pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/ofbiz-plugins.git


The following commit(s) were added to refs/heads/trunk by this push:
     new ea24c8ff8 Added: Project plugin retrieve jsgantt module via npm 
(OFBIZ-12804)
ea24c8ff8 is described below

commit ea24c8ff8894a59c2d6de08253e48773c18e8ef8
Author: Daniel Watford <d...@foomoo.co.uk>
AuthorDate: Tue Apr 18 13:29:03 2023 +0100

    Added: Project plugin retrieve jsgantt module via npm (OFBIZ-12804)
    
    An outdated version of jsgantt was previously included in
    ofbiz-framework sources as part of common-theme. These sources have been
    removed from common-theme and the project plugin will now retrieve an
    updated version of jsgantt, jsgantt-improved, from NPM.
    
    The newer version of jsgantt is not completely compatible with the
    previous version used by OFBiz, so some changes in how the gantt chart
    was initialised were necessary.
    
    Common code has been extracted to static javascript file. Data
    representing gantt chart items is rendered to a hidden field on screen
    where it is retrieved by client-side code and used to construct the
    gantt chart.
---
 .gitignore                                         |    3 +-
 projectmgr/.gitignore                              |    1 +
 .../static/projectmgr.css => build.gradle}         |   10 +-
 projectmgr/groovyScripts/GanttChart.groovy         |   72 +-
 projectmgr/template/project/GanttChart.ftl         |   44 +-
 projectmgr/webapp/projectmgr/WEB-INF/web.xml       |    2 +-
 projectmgr/webapp/projectmgr/package-lock.json     | 1939 ++++++++++++++++++++
 projectmgr/webapp/projectmgr/package.json          |    9 +
 projectmgr/webapp/projectmgr/static/projectmgr.css |    9 +-
 .../static/{projectmgr.css => projectmgr.js}       |   24 +-
 projectmgr/widget/ProjectScreens.xml               |    8 +-
 11 files changed, 2042 insertions(+), 79 deletions(-)

diff --git a/.gitignore b/.gitignore
index 766c192b2..19aa9488a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1,3 @@
 .DS_Store
-bin/
\ No newline at end of file
+bin/
+node_modules/
diff --git a/projectmgr/.gitignore b/projectmgr/.gitignore
new file mode 100644
index 000000000..08a55c09b
--- /dev/null
+++ b/projectmgr/.gitignore
@@ -0,0 +1 @@
+.gradle
diff --git a/projectmgr/webapp/projectmgr/static/projectmgr.css 
b/projectmgr/build.gradle
similarity index 82%
copy from projectmgr/webapp/projectmgr/static/projectmgr.css
copy to projectmgr/build.gradle
index ccc7573a3..6e020480f 100644
--- a/projectmgr/webapp/projectmgr/static/projectmgr.css
+++ b/projectmgr/build.gradle
@@ -17,12 +17,10 @@
  * under the License.
  */
 
-/* This CSS file is used for the Project Manager component. */
-
-#GanttChartDIV tr, #GanttChartDIV td {
-    vertical-align: top;
+plugins {
+    id 'ofbiz-node-conventions'
 }
 
-.gheadwkend {
-    background-color: #cfcfcf
+node {
+    nodeProjectDir = file("webapp/projectmgr")
 }
diff --git a/projectmgr/groovyScripts/GanttChart.groovy 
b/projectmgr/groovyScripts/GanttChart.groovy
index 50ffcd8c7..62351046a 100644
--- a/projectmgr/groovyScripts/GanttChart.groovy
+++ b/projectmgr/groovyScripts/GanttChart.groovy
@@ -18,16 +18,18 @@
  */
 
 
+import groovy.json.JsonOutput
 import org.apache.ofbiz.base.util.UtilDateTime
-import org.apache.ofbiz.base.util.UtilValidate
 import org.apache.ofbiz.entity.condition.EntityCondition
 import org.apache.ofbiz.entity.condition.EntityOperator
 
+import java.sql.Timestamp
+
 projectId = parameters.projectId
 userLogin = parameters.userLogin
 
 //project info
-result = runService('getProject', [projectId : projectId, userLogin : 
userLogin])
+result = runService('getProject', [projectId: projectId, userLogin: userLogin])
 project = result.projectInfo
 if (project && project.startDate)
     context.chartStart = project.startDate
@@ -41,7 +43,9 @@ else
 if (project == null) return
 
 ganttList = new LinkedList()
-result = runService('getProjectPhaseList', [userLogin : userLogin , projectId 
: projectId])
+List<Map<String, Object>> ganttItems = []
+
+result = runService('getProjectPhaseList', [userLogin: userLogin, projectId: 
projectId])
 phases = result.phaseList
 if (phases) {
     phases.each { phase ->
@@ -61,15 +65,34 @@ if (phases) {
         }
         newPhase.workEffortTypeId = "PHASE"
         ganttList.add(newPhase)
+
+        ganttItems << [
+                pID       : phase.phaseId as Integer,
+                pName     : phase.phaseSeqNum ? "${phase.phaseSeqNum}. 
${phase.phaseName}" : phase.phaseName,
+                pStart    : '',
+                pEnd      : '',
+                pPlanStart: '',
+                pPlanEnd  : '',
+                pClass    : 'ggroupblack',
+                pLink     : '',
+                pMile     : 0,
+                pRes      : '',
+                pComp     : 0,
+                pGroup    : 1,
+                pParent   : 0,
+                pOpen     : 1,
+                pDepend   : ''
+        ]
+
         cond = EntityCondition.makeCondition(
                 [
-                EntityCondition.makeCondition("currentStatusId", 
EntityOperator.NOT_EQUAL, "PTS_CANCELLED"),
-                EntityCondition.makeCondition("workEffortParentId", 
EntityOperator.EQUALS, phase.phaseId)
+                        EntityCondition.makeCondition("currentStatusId", 
EntityOperator.NOT_EQUAL, "PTS_CANCELLED"),
+                        EntityCondition.makeCondition("workEffortParentId", 
EntityOperator.EQUALS, phase.phaseId)
                 ], EntityOperator.AND)
-        tasks = 
from("WorkEffort").where(cond).orderBy("sequenceNum","workEffortName").queryList()
+        tasks = from("WorkEffort").where(cond).orderBy("sequenceNum", 
"workEffortName").queryList()
         if (tasks) {
             tasks.each { task ->
-                resultTaskInfo = runService('getProjectTask', [userLogin : 
userLogin , taskId : task.workEffortId])
+                resultTaskInfo = runService('getProjectTask', [userLogin: 
userLogin, taskId: task.workEffortId])
                 taskInfo = resultTaskInfo.taskInfo
                 taskInfo.taskNr = task.workEffortId
                 taskInfo.phaseNr = phase.phaseId
@@ -100,13 +123,12 @@ if (phases) {
                 if (!taskInfo.estimatedCompletionDate && !duration) {
                     taskInfo.estimatedCompletionDate = 
UtilDateTime.addDaysToTimestamp(newPhase.estimatedStartDate, 3)
                 } else if (!taskInfo.estimatedCompletionDate && duration) {
-                    taskInfo.estimatedCompletionDate = 
UtilDateTime.addDaysToTimestamp(newPhase.estimatedStartDate, duration/8)
+                    taskInfo.estimatedCompletionDate = 
UtilDateTime.addDaysToTimestamp(newPhase.estimatedStartDate, duration / 8)
                 }
-                taskInfo.estimatedStartDate = 
UtilDateTime.toDateString(taskInfo.estimatedStartDate, "MM/dd/yyyy")
-                taskInfo.estimatedCompletionDate = 
UtilDateTime.toDateString(taskInfo.estimatedCompletionDate, "MM/dd/yyyy")
+
                 taskInfo.workEffortTypeId = task.workEffortTypeId
                 if (security.hasEntityPermission("PROJECTMGR", "_READ", 
session) || security.hasEntityPermission("PROJECTMGR", "_ADMIN", session)) {
-                    taskInfo.url = 
"/projectmgr/control/taskView?workEffortId="+task.workEffortId
+                    taskInfo.url = 
"/projectmgr/control/taskView?workEffortId=" + task.workEffortId
                 } else {
                     taskInfo.url = ""
                 }
@@ -123,13 +145,35 @@ if (phases) {
                     taskInfo.preDecessor = ""
                     for (i in latestTaskIds) {
                         if (count > 0) {
-                            taskInfo.preDecessor = taskInfo.preDecessor +", " 
+ i
+                            taskInfo.preDecessor = taskInfo.preDecessor + ", " 
+ i
                         } else {
                             taskInfo.preDecessor = taskInfo.preDecessor + i
                         }
-                        count ++
+                        count++
                     }
                 }
+
+                ganttItems << [
+                        pID       : taskInfo.taskNr as Integer,
+                        pName     : taskInfo.taskSeqNum ? 
"${taskInfo.taskSeqNum}. ${taskInfo.taskName}" : taskInfo.taskName,
+                        pStart    : 
taskInfo.estimatedStartDate.toLocalDateTime().getDateString(),
+                        pEnd      : (taskInfo.estimatedCompletionDate as 
Timestamp).toLocalDateTime().getDateString(),
+                        pPlanStart: (taskInfo.estimatedStartDate as 
Timestamp).toLocalDateTime().getDateString(),
+                        pPlanEnd  : (taskInfo.estimatedCompletionDate as 
Timestamp).toLocalDateTime().getDateString(),
+                        pClass    : taskInfo.workEffortTypeId == 'MILESTONE' ? 
'gmilestone' : 'gtaskgreen',
+                        pLink     : taskInfo.url,
+                        pMile     : taskInfo.workEffortTypeId == 'MILESTONE' ? 
1 : 0,
+                        pRes      : taskInfo.resource,
+                        pComp     : taskInfo.completion,
+                        pGroup    : 0,
+                        pParent   : taskInfo.phaseNr,
+                        pOpen     : taskInfo.workEffortTypeId == 'MILESTONE' ? 
0 : 1,
+                        pDepend   : taskInfo.preDecessor ?: ''
+                ]
+
+                taskInfo.estimatedStartDate = 
UtilDateTime.toDateString(taskInfo.estimatedStartDate, "MM/dd/yyyy")
+                taskInfo.estimatedCompletionDate = 
UtilDateTime.toDateString(taskInfo.estimatedCompletionDate, "MM/dd/yyyy")
+
                 ganttList.add(taskInfo)
             }
         }
@@ -137,4 +181,4 @@ if (phases) {
 }
 
 context.phaseTaskList = ganttList
-
+context.phaseTaskListJson = JsonOutput.toJson(ganttItems)
diff --git a/projectmgr/template/project/GanttChart.ftl 
b/projectmgr/template/project/GanttChart.ftl
index 8af275c7e..7cbbf0298 100644
--- a/projectmgr/template/project/GanttChart.ftl
+++ b/projectmgr/template/project/GanttChart.ftl
@@ -19,46 +19,8 @@ under the License.
 -->
 
 <div style="position:relative" class="gantt" id="GanttChartDIV"></div>
-<script type="application/javascript">
-var g = new JSGantt.GanttChart('g',document.getElementById('GanttChartDIV'), 
'day');
 
-g.setShowRes(1); // Show/Hide Responsible (0/1)
-g.setShowDur(1); // Show/Hide Duration (0/1)
-g.setShowComp(1); // Show/Hide % Complete(0/1)
-
-// Parameters             (pID, pName,                  pStart,      pEnd,     
   pColor,   pLink,          pMile, pRes,  pComp, pGroup, pParent, pOpen)
-
-<#list phaseTaskList as t>
-    <#if "PHASE" == t.workEffortTypeId>
-        g.AddTaskItem(new JSGantt.TaskItem("${t.phaseNr}", "${t.phaseSeqNum!}. 
${t.phaseName}", "", "", "00ff00", "", 0, "", 0, 1, 0, 1));
-    </#if>
-    <#if "TASK" == t.workEffortTypeId>
-        g.AddTaskItem(new JSGantt.TaskItem("${t.taskNr}","${t.taskSeqNum!}. 
${t.taskName}","${StringUtil.wrapString(t.estimatedStartDate)}", 
"${StringUtil.wrapString(t.estimatedCompletionDate)}","009900", "${t.url}", 0 , 
"${t.resource!}", ${t.completion!} , 0, ${t.phaseNr}, 1<#if t.preDecessor??>, 
"${t.preDecessor}"</#if>));
-    </#if>
-    <#if "MILESTONE" == t.workEffortTypeId>
-        g.AddTaskItem(new 
JSGantt.TaskItem("${t.taskNr}","${t.taskName}","${StringUtil.wrapString(t.estimatedStartDate)}",
 "${StringUtil.wrapString(t.estimatedCompletionDate)}","00ff00", "", 1 , 
"${t.resource!}", ${t.completion!} , 0,${t.phaseNr}, "", "" ));
-    </#if>
-</#list>
-
-<#--
-
-TaskItem(pID, pName, pStart, pEnd, pColor, pLink, pMile, pRes, pComp, pGroup, 
pParent, pOpen, pDepend)
-pID: (required) is a unique ID used to identify each row for parent functions 
and for setting dom id for hiding/showing
-pName: (required) is the task Label
-pStart: (required) the task start date, can enter empty date ('') for groups
-pEnd: (required) the task end date, can enter empty date ('') for groups
-pColor: (required) the html color for this task; e.g. '00ff00'
-pLink: (optional) any http link navigated to when task bar is clicked.
-pMile:(optional) represent a milestone
-pRes: (optional) resource name
-pComp: (required) completion percent
-pGroup: (optional) indicates whether this is a group(parent) - 0=NOT Parent; 
1=IS Parent
-pParent: (required) identifies a parent pID, this causes this task to be a 
child of identified task
-pOpen: UNUSED - in future can be initially set to close folder when chart is 
first drawn
-pDepend: dependency: need previous task finished.
-
--->
-g.Draw();
-g.DrawDependencies();
-</script>
+<input id="ofbizGantItemsJson" type="hidden" value="${phaseTaskListJson}"/>
 
+<script type="application/javascript" 
src="/projectmgr/node_modules/jsgantt-improved/dist/jsgantt.js"></script>
+<script type="application/javascript" 
src="/projectmgr/static/projectmgr.js"></script>
diff --git a/projectmgr/webapp/projectmgr/WEB-INF/web.xml 
b/projectmgr/webapp/projectmgr/WEB-INF/web.xml
index e22483f70..fe92d9791 100644
--- a/projectmgr/webapp/projectmgr/WEB-INF/web.xml
+++ b/projectmgr/webapp/projectmgr/WEB-INF/web.xml
@@ -44,7 +44,7 @@
         
<filter-class>org.apache.ofbiz.webapp.control.ControlFilter</filter-class>
         <init-param>
             <param-name>allowedPaths</param-name>
-            
<param-value>/error:/control:/select:/index.html:/index.jsp:/default.html:/default.jsp:/images:/static:/js</param-value>
+            
<param-value>/error:/control:/select:/index.html:/index.jsp:/default.html:/default.jsp:/images:/static:/js:/node_modules/jsgantt-improved</param-value>
         </init-param>
         <init-param>
             <param-name>redirectPath</param-name>
diff --git a/projectmgr/webapp/projectmgr/package-lock.json 
b/projectmgr/webapp/projectmgr/package-lock.json
new file mode 100644
index 000000000..64c381a0c
--- /dev/null
+++ b/projectmgr/webapp/projectmgr/package-lock.json
@@ -0,0 +1,1939 @@
+{
+    "name": "ofbiz-projectmgr",
+    "lockfileVersion": 2,
+    "requires": true,
+    "packages": {
+        "": {
+            "name": "ofbiz-projectmgr",
+            "license": "Apache-2.0",
+            "dependencies": {
+                "jsgantt-improved": "^2.8.5"
+            }
+        },
+        "node_modules/@types/node": {
+            "version": "12.20.55",
+            "resolved": 
"https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz";,
+            "integrity": 
"sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ=="
+        },
+        "node_modules/adm-zip": {
+            "version": "0.5.10",
+            "resolved": 
"https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.10.tgz";,
+            "integrity": 
"sha512-x0HvcHqVJNTPk/Bw8JbLWlWoo6Wwnsug0fnYYro1HBrjxZ3G7/AZk7Ahv8JwDe1uIcz8eBqvu86FuF1POiG7vQ==",
+            "engines": {
+                "node": ">=6.0"
+            }
+        },
+        "node_modules/ajv": {
+            "version": "6.12.6",
+            "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz";,
+            "integrity": 
"sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+            "dependencies": {
+                "fast-deep-equal": "^3.1.1",
+                "fast-json-stable-stringify": "^2.0.0",
+                "json-schema-traverse": "^0.4.1",
+                "uri-js": "^4.2.2"
+            },
+            "funding": {
+                "type": "github",
+                "url": "https://github.com/sponsors/epoberezkin";
+            }
+        },
+        "node_modules/ansi-regex": {
+            "version": "3.0.1",
+            "resolved": 
"https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz";,
+            "integrity": 
"sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==",
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/asn1": {
+            "version": "0.2.6",
+            "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz";,
+            "integrity": 
"sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==",
+            "dependencies": {
+                "safer-buffer": "~2.1.0"
+            }
+        },
+        "node_modules/assert-plus": {
+            "version": "1.0.0",
+            "resolved": 
"https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz";,
+            "integrity": 
"sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==",
+            "engines": {
+                "node": ">=0.8"
+            }
+        },
+        "node_modules/asynckit": {
+            "version": "0.4.0",
+            "resolved": 
"https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz";,
+            "integrity": 
"sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
+        },
+        "node_modules/aws-sign2": {
+            "version": "0.7.0",
+            "resolved": 
"https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz";,
+            "integrity": 
"sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==",
+            "engines": {
+                "node": "*"
+            }
+        },
+        "node_modules/aws4": {
+            "version": "1.12.0",
+            "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz";,
+            "integrity": 
"sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg=="
+        },
+        "node_modules/bcrypt-pbkdf": {
+            "version": "1.0.2",
+            "resolved": 
"https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz";,
+            "integrity": 
"sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==",
+            "dependencies": {
+                "tweetnacl": "^0.14.3"
+            }
+        },
+        "node_modules/camelcase": {
+            "version": "5.3.1",
+            "resolved": 
"https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz";,
+            "integrity": 
"sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/caseless": {
+            "version": "0.12.0",
+            "resolved": 
"https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz";,
+            "integrity": 
"sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw=="
+        },
+        "node_modules/chownr": {
+            "version": "1.1.4",
+            "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz";,
+            "integrity": 
"sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg=="
+        },
+        "node_modules/cliui": {
+            "version": "4.1.0",
+            "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz";,
+            "integrity": 
"sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==",
+            "dependencies": {
+                "string-width": "^2.1.1",
+                "strip-ansi": "^4.0.0",
+                "wrap-ansi": "^2.0.0"
+            }
+        },
+        "node_modules/code-point-at": {
+            "version": "1.1.0",
+            "resolved": 
"https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz";,
+            "integrity": 
"sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==",
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/combined-stream": {
+            "version": "1.0.8",
+            "resolved": 
"https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz";,
+            "integrity": 
"sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+            "dependencies": {
+                "delayed-stream": "~1.0.0"
+            },
+            "engines": {
+                "node": ">= 0.8"
+            }
+        },
+        "node_modules/core-util-is": {
+            "version": "1.0.2",
+            "resolved": 
"https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz";,
+            "integrity": 
"sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ=="
+        },
+        "node_modules/cross-spawn": {
+            "version": "6.0.5",
+            "resolved": 
"https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz";,
+            "integrity": 
"sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
+            "dependencies": {
+                "nice-try": "^1.0.4",
+                "path-key": "^2.0.1",
+                "semver": "^5.5.0",
+                "shebang-command": "^1.2.0",
+                "which": "^1.2.9"
+            },
+            "engines": {
+                "node": ">=4.8"
+            }
+        },
+        "node_modules/dashdash": {
+            "version": "1.14.1",
+            "resolved": 
"https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz";,
+            "integrity": 
"sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==",
+            "dependencies": {
+                "assert-plus": "^1.0.0"
+            },
+            "engines": {
+                "node": ">=0.10"
+            }
+        },
+        "node_modules/decamelize": {
+            "version": "1.2.0",
+            "resolved": 
"https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz";,
+            "integrity": 
"sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==",
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/delayed-stream": {
+            "version": "1.0.0",
+            "resolved": 
"https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz";,
+            "integrity": 
"sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+            "engines": {
+                "node": ">=0.4.0"
+            }
+        },
+        "node_modules/ecc-jsbn": {
+            "version": "0.1.2",
+            "resolved": 
"https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz";,
+            "integrity": 
"sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==",
+            "dependencies": {
+                "jsbn": "~0.1.0",
+                "safer-buffer": "^2.1.0"
+            }
+        },
+        "node_modules/end-of-stream": {
+            "version": "1.4.4",
+            "resolved": 
"https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz";,
+            "integrity": 
"sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
+            "dependencies": {
+                "once": "^1.4.0"
+            }
+        },
+        "node_modules/execa": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz";,
+            "integrity": 
"sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==",
+            "dependencies": {
+                "cross-spawn": "^6.0.0",
+                "get-stream": "^4.0.0",
+                "is-stream": "^1.1.0",
+                "npm-run-path": "^2.0.0",
+                "p-finally": "^1.0.0",
+                "signal-exit": "^3.0.0",
+                "strip-eof": "^1.0.0"
+            },
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/extend": {
+            "version": "3.0.2",
+            "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz";,
+            "integrity": 
"sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
+        },
+        "node_modules/extsprintf": {
+            "version": "1.3.0",
+            "resolved": 
"https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz";,
+            "integrity": 
"sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==",
+            "engines": [
+                "node >=0.6.0"
+            ]
+        },
+        "node_modules/fast-deep-equal": {
+            "version": "3.1.3",
+            "resolved": 
"https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz";,
+            "integrity": 
"sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
+        },
+        "node_modules/fast-json-stable-stringify": {
+            "version": "2.1.0",
+            "resolved": 
"https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz";,
+            "integrity": 
"sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
+        },
+        "node_modules/find-up": {
+            "version": "3.0.0",
+            "resolved": 
"https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz";,
+            "integrity": 
"sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
+            "dependencies": {
+                "locate-path": "^3.0.0"
+            },
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/forever-agent": {
+            "version": "0.6.1",
+            "resolved": 
"https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz";,
+            "integrity": 
"sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==",
+            "engines": {
+                "node": "*"
+            }
+        },
+        "node_modules/form-data": {
+            "version": "2.3.3",
+            "resolved": 
"https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz";,
+            "integrity": 
"sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
+            "dependencies": {
+                "asynckit": "^0.4.0",
+                "combined-stream": "^1.0.6",
+                "mime-types": "^2.1.12"
+            },
+            "engines": {
+                "node": ">= 0.12"
+            }
+        },
+        "node_modules/fs-minipass": {
+            "version": "1.2.7",
+            "resolved": 
"https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz";,
+            "integrity": 
"sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==",
+            "dependencies": {
+                "minipass": "^2.6.0"
+            }
+        },
+        "node_modules/get-caller-file": {
+            "version": "1.0.3",
+            "resolved": 
"https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz";,
+            "integrity": 
"sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w=="
+        },
+        "node_modules/get-stream": {
+            "version": "4.1.0",
+            "resolved": 
"https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz";,
+            "integrity": 
"sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
+            "dependencies": {
+                "pump": "^3.0.0"
+            },
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/getpass": {
+            "version": "0.1.7",
+            "resolved": 
"https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz";,
+            "integrity": 
"sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==",
+            "dependencies": {
+                "assert-plus": "^1.0.0"
+            }
+        },
+        "node_modules/har-schema": {
+            "version": "2.0.0",
+            "resolved": 
"https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz";,
+            "integrity": 
"sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==",
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/har-validator": {
+            "version": "5.1.5",
+            "resolved": 
"https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz";,
+            "integrity": 
"sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==",
+            "deprecated": "this library is no longer supported",
+            "dependencies": {
+                "ajv": "^6.12.3",
+                "har-schema": "^2.0.0"
+            },
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/http-signature": {
+            "version": "1.2.0",
+            "resolved": 
"https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz";,
+            "integrity": 
"sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==",
+            "dependencies": {
+                "assert-plus": "^1.0.0",
+                "jsprim": "^1.2.2",
+                "sshpk": "^1.7.0"
+            },
+            "engines": {
+                "node": ">=0.8",
+                "npm": ">=1.3.7"
+            }
+        },
+        "node_modules/invert-kv": {
+            "version": "2.0.0",
+            "resolved": 
"https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz";,
+            "integrity": 
"sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==",
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/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": 
"sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==",
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/is-stream": {
+            "version": "1.1.0",
+            "resolved": 
"https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz";,
+            "integrity": 
"sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==",
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/is-typedarray": {
+            "version": "1.0.0",
+            "resolved": 
"https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz";,
+            "integrity": 
"sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA=="
+        },
+        "node_modules/isexe": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz";,
+            "integrity": 
"sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="
+        },
+        "node_modules/isstream": {
+            "version": "0.1.2",
+            "resolved": 
"https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz";,
+            "integrity": 
"sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g=="
+        },
+        "node_modules/jsbn": {
+            "version": "0.1.1",
+            "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz";,
+            "integrity": 
"sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg=="
+        },
+        "node_modules/jsgantt-improved": {
+            "version": "2.8.5",
+            "resolved": 
"https://registry.npmjs.org/jsgantt-improved/-/jsgantt-improved-2.8.5.tgz";,
+            "integrity": 
"sha512-zGBImhvRxqHS0d06JEkbGT6yatlqMLnY8c1nyuiSPVfBNesH00jIx9GYgst6hKcdNMjePItP7hRFwWw427UXPw==",
+            "dependencies": {
+                "@types/node": "^12.0.10",
+                "webdriver-manager": "^13.0.0"
+            }
+        },
+        "node_modules/json-schema": {
+            "version": "0.4.0",
+            "resolved": 
"https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz";,
+            "integrity": 
"sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA=="
+        },
+        "node_modules/json-schema-traverse": {
+            "version": "0.4.1",
+            "resolved": 
"https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz";,
+            "integrity": 
"sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
+        },
+        "node_modules/json-stringify-safe": {
+            "version": "5.0.1",
+            "resolved": 
"https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz";,
+            "integrity": 
"sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA=="
+        },
+        "node_modules/jsprim": {
+            "version": "1.4.2",
+            "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz";,
+            "integrity": 
"sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==",
+            "dependencies": {
+                "assert-plus": "1.0.0",
+                "extsprintf": "1.3.0",
+                "json-schema": "0.4.0",
+                "verror": "1.10.0"
+            },
+            "engines": {
+                "node": ">=0.6.0"
+            }
+        },
+        "node_modules/lcid": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz";,
+            "integrity": 
"sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==",
+            "dependencies": {
+                "invert-kv": "^2.0.0"
+            },
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/locate-path": {
+            "version": "3.0.0",
+            "resolved": 
"https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz";,
+            "integrity": 
"sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
+            "dependencies": {
+                "p-locate": "^3.0.0",
+                "path-exists": "^3.0.0"
+            },
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/loglevel": {
+            "version": "1.8.1",
+            "resolved": 
"https://registry.npmjs.org/loglevel/-/loglevel-1.8.1.tgz";,
+            "integrity": 
"sha512-tCRIJM51SHjAayKwC+QAg8hT8vg6z7GSgLJKGvzuPb1Wc+hLzqtuVLxp6/HzSPOozuK+8ErAhy7U/sVzw8Dgfg==",
+            "engines": {
+                "node": ">= 0.6.0"
+            },
+            "funding": {
+                "type": "tidelift",
+                "url": "https://tidelift.com/funding/github/npm/loglevel";
+            }
+        },
+        "node_modules/map-age-cleaner": {
+            "version": "0.1.3",
+            "resolved": 
"https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz";,
+            "integrity": 
"sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==",
+            "dependencies": {
+                "p-defer": "^1.0.0"
+            },
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/mem": {
+            "version": "4.3.0",
+            "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz";,
+            "integrity": 
"sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==",
+            "dependencies": {
+                "map-age-cleaner": "^0.1.1",
+                "mimic-fn": "^2.0.0",
+                "p-is-promise": "^2.0.0"
+            },
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/mime-db": {
+            "version": "1.52.0",
+            "resolved": 
"https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz";,
+            "integrity": 
"sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+            "engines": {
+                "node": ">= 0.6"
+            }
+        },
+        "node_modules/mime-types": {
+            "version": "2.1.35",
+            "resolved": 
"https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz";,
+            "integrity": 
"sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+            "dependencies": {
+                "mime-db": "1.52.0"
+            },
+            "engines": {
+                "node": ">= 0.6"
+            }
+        },
+        "node_modules/mimic-fn": {
+            "version": "2.1.0",
+            "resolved": 
"https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz";,
+            "integrity": 
"sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/minimist": {
+            "version": "1.2.8",
+            "resolved": 
"https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz";,
+            "integrity": 
"sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
+            "funding": {
+                "url": "https://github.com/sponsors/ljharb";
+            }
+        },
+        "node_modules/minipass": {
+            "version": "2.9.0",
+            "resolved": 
"https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz";,
+            "integrity": 
"sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==",
+            "dependencies": {
+                "safe-buffer": "^5.1.2",
+                "yallist": "^3.0.0"
+            }
+        },
+        "node_modules/minizlib": {
+            "version": "1.3.3",
+            "resolved": 
"https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz";,
+            "integrity": 
"sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==",
+            "dependencies": {
+                "minipass": "^2.9.0"
+            }
+        },
+        "node_modules/mkdirp": {
+            "version": "0.5.6",
+            "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz";,
+            "integrity": 
"sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
+            "dependencies": {
+                "minimist": "^1.2.6"
+            },
+            "bin": {
+                "mkdirp": "bin/cmd.js"
+            }
+        },
+        "node_modules/nice-try": {
+            "version": "1.0.5",
+            "resolved": 
"https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz";,
+            "integrity": 
"sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ=="
+        },
+        "node_modules/npm-run-path": {
+            "version": "2.0.2",
+            "resolved": 
"https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz";,
+            "integrity": 
"sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==",
+            "dependencies": {
+                "path-key": "^2.0.0"
+            },
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/number-is-nan": {
+            "version": "1.0.1",
+            "resolved": 
"https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz";,
+            "integrity": 
"sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==",
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/oauth-sign": {
+            "version": "0.9.0",
+            "resolved": 
"https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz";,
+            "integrity": 
"sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
+            "engines": {
+                "node": "*"
+            }
+        },
+        "node_modules/once": {
+            "version": "1.4.0",
+            "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz";,
+            "integrity": 
"sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+            "dependencies": {
+                "wrappy": "1"
+            }
+        },
+        "node_modules/os-locale": {
+            "version": "3.1.0",
+            "resolved": 
"https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz";,
+            "integrity": 
"sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==",
+            "dependencies": {
+                "execa": "^1.0.0",
+                "lcid": "^2.0.0",
+                "mem": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/p-defer": {
+            "version": "1.0.0",
+            "resolved": 
"https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz";,
+            "integrity": 
"sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==",
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/p-finally": {
+            "version": "1.0.0",
+            "resolved": 
"https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz";,
+            "integrity": 
"sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==",
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/p-is-promise": {
+            "version": "2.1.0",
+            "resolved": 
"https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz";,
+            "integrity": 
"sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==",
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/p-limit": {
+            "version": "2.3.0",
+            "resolved": 
"https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz";,
+            "integrity": 
"sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+            "dependencies": {
+                "p-try": "^2.0.0"
+            },
+            "engines": {
+                "node": ">=6"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus";
+            }
+        },
+        "node_modules/p-locate": {
+            "version": "3.0.0",
+            "resolved": 
"https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz";,
+            "integrity": 
"sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
+            "dependencies": {
+                "p-limit": "^2.0.0"
+            },
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/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==",
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/path-exists": {
+            "version": "3.0.0",
+            "resolved": 
"https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz";,
+            "integrity": 
"sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==",
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/path-key": {
+            "version": "2.0.1",
+            "resolved": 
"https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz";,
+            "integrity": 
"sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==",
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/performance-now": {
+            "version": "2.1.0",
+            "resolved": 
"https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz";,
+            "integrity": 
"sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow=="
+        },
+        "node_modules/psl": {
+            "version": "1.9.0",
+            "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz";,
+            "integrity": 
"sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag=="
+        },
+        "node_modules/pump": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz";,
+            "integrity": 
"sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
+            "dependencies": {
+                "end-of-stream": "^1.1.0",
+                "once": "^1.3.1"
+            }
+        },
+        "node_modules/punycode": {
+            "version": "2.3.0",
+            "resolved": 
"https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz";,
+            "integrity": 
"sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==",
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/qs": {
+            "version": "6.5.3",
+            "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz";,
+            "integrity": 
"sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==",
+            "engines": {
+                "node": ">=0.6"
+            }
+        },
+        "node_modules/request": {
+            "version": "2.88.2",
+            "resolved": 
"https://registry.npmjs.org/request/-/request-2.88.2.tgz";,
+            "integrity": 
"sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
+            "deprecated": "request has been deprecated, see 
https://github.com/request/request/issues/3142";,
+            "dependencies": {
+                "aws-sign2": "~0.7.0",
+                "aws4": "^1.8.0",
+                "caseless": "~0.12.0",
+                "combined-stream": "~1.0.6",
+                "extend": "~3.0.2",
+                "forever-agent": "~0.6.1",
+                "form-data": "~2.3.2",
+                "har-validator": "~5.1.3",
+                "http-signature": "~1.2.0",
+                "is-typedarray": "~1.0.0",
+                "isstream": "~0.1.2",
+                "json-stringify-safe": "~5.0.1",
+                "mime-types": "~2.1.19",
+                "oauth-sign": "~0.9.0",
+                "performance-now": "^2.1.0",
+                "qs": "~6.5.2",
+                "safe-buffer": "^5.1.2",
+                "tough-cookie": "~2.5.0",
+                "tunnel-agent": "^0.6.0",
+                "uuid": "^3.3.2"
+            },
+            "engines": {
+                "node": ">= 6"
+            }
+        },
+        "node_modules/require-directory": {
+            "version": "2.1.1",
+            "resolved": 
"https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz";,
+            "integrity": 
"sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/require-main-filename": {
+            "version": "1.0.1",
+            "resolved": 
"https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz";,
+            "integrity": 
"sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug=="
+        },
+        "node_modules/safe-buffer": {
+            "version": "5.2.1",
+            "resolved": 
"https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz";,
+            "integrity": 
"sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+            "funding": [
+                {
+                    "type": "github",
+                    "url": "https://github.com/sponsors/feross";
+                },
+                {
+                    "type": "patreon",
+                    "url": "https://www.patreon.com/feross";
+                },
+                {
+                    "type": "consulting",
+                    "url": "https://feross.org/support";
+                }
+            ]
+        },
+        "node_modules/safer-buffer": {
+            "version": "2.1.2",
+            "resolved": 
"https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz";,
+            "integrity": 
"sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
+        },
+        "node_modules/sax": {
+            "version": "1.2.4",
+            "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz";,
+            "integrity": 
"sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
+        },
+        "node_modules/semver": {
+            "version": "5.7.1",
+            "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz";,
+            "integrity": 
"sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+            "bin": {
+                "semver": "bin/semver"
+            }
+        },
+        "node_modules/set-blocking": {
+            "version": "2.0.0",
+            "resolved": 
"https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz";,
+            "integrity": 
"sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw=="
+        },
+        "node_modules/shebang-command": {
+            "version": "1.2.0",
+            "resolved": 
"https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz";,
+            "integrity": 
"sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==",
+            "dependencies": {
+                "shebang-regex": "^1.0.0"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/shebang-regex": {
+            "version": "1.0.0",
+            "resolved": 
"https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz";,
+            "integrity": 
"sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==",
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/signal-exit": {
+            "version": "3.0.7",
+            "resolved": 
"https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz";,
+            "integrity": 
"sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="
+        },
+        "node_modules/sshpk": {
+            "version": "1.17.0",
+            "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz";,
+            "integrity": 
"sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==",
+            "dependencies": {
+                "asn1": "~0.2.3",
+                "assert-plus": "^1.0.0",
+                "bcrypt-pbkdf": "^1.0.0",
+                "dashdash": "^1.12.0",
+                "ecc-jsbn": "~0.1.1",
+                "getpass": "^0.1.1",
+                "jsbn": "~0.1.0",
+                "safer-buffer": "^2.0.2",
+                "tweetnacl": "~0.14.0"
+            },
+            "bin": {
+                "sshpk-conv": "bin/sshpk-conv",
+                "sshpk-sign": "bin/sshpk-sign",
+                "sshpk-verify": "bin/sshpk-verify"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/string-width": {
+            "version": "2.1.1",
+            "resolved": 
"https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz";,
+            "integrity": 
"sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
+            "dependencies": {
+                "is-fullwidth-code-point": "^2.0.0",
+                "strip-ansi": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/strip-ansi": {
+            "version": "4.0.0",
+            "resolved": 
"https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz";,
+            "integrity": 
"sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==",
+            "dependencies": {
+                "ansi-regex": "^3.0.0"
+            },
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/strip-eof": {
+            "version": "1.0.0",
+            "resolved": 
"https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz";,
+            "integrity": 
"sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==",
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/tar": {
+            "version": "4.4.19",
+            "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.19.tgz";,
+            "integrity": 
"sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA==",
+            "dependencies": {
+                "chownr": "^1.1.4",
+                "fs-minipass": "^1.2.7",
+                "minipass": "^2.9.0",
+                "minizlib": "^1.3.3",
+                "mkdirp": "^0.5.5",
+                "safe-buffer": "^5.2.1",
+                "yallist": "^3.1.1"
+            },
+            "engines": {
+                "node": ">=4.5"
+            }
+        },
+        "node_modules/tough-cookie": {
+            "version": "2.5.0",
+            "resolved": 
"https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz";,
+            "integrity": 
"sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
+            "dependencies": {
+                "psl": "^1.1.28",
+                "punycode": "^2.1.1"
+            },
+            "engines": {
+                "node": ">=0.8"
+            }
+        },
+        "node_modules/tunnel-agent": {
+            "version": "0.6.0",
+            "resolved": 
"https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz";,
+            "integrity": 
"sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==",
+            "dependencies": {
+                "safe-buffer": "^5.0.1"
+            },
+            "engines": {
+                "node": "*"
+            }
+        },
+        "node_modules/tweetnacl": {
+            "version": "0.14.5",
+            "resolved": 
"https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz";,
+            "integrity": 
"sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA=="
+        },
+        "node_modules/uri-js": {
+            "version": "4.4.1",
+            "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz";,
+            "integrity": 
"sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+            "dependencies": {
+                "punycode": "^2.1.0"
+            }
+        },
+        "node_modules/uuid": {
+            "version": "3.4.0",
+            "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz";,
+            "integrity": 
"sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
+            "deprecated": "Please upgrade  to version 7 or higher.  Older 
versions may use Math.random() in certain circumstances, which is known to be 
problematic.  See https://v8.dev/blog/math-random for details.",
+            "bin": {
+                "uuid": "bin/uuid"
+            }
+        },
+        "node_modules/verror": {
+            "version": "1.10.0",
+            "resolved": 
"https://registry.npmjs.org/verror/-/verror-1.10.0.tgz";,
+            "integrity": 
"sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==",
+            "engines": [
+                "node >=0.6.0"
+            ],
+            "dependencies": {
+                "assert-plus": "^1.0.0",
+                "core-util-is": "1.0.2",
+                "extsprintf": "^1.2.0"
+            }
+        },
+        "node_modules/webdriver-manager": {
+            "version": "13.0.2",
+            "resolved": 
"https://registry.npmjs.org/webdriver-manager/-/webdriver-manager-13.0.2.tgz";,
+            "integrity": 
"sha512-Dv9INmI0ttZ5kgiSRgaNdNh3/wlX7v9bSj2T6AdClxUvHrKFz8rqEBIef7DwXvGzz1MO8JH9NqzIzaf1ptznWA==",
+            "dependencies": {
+                "adm-zip": "^0.5.2",
+                "loglevel": "^1.6.1",
+                "request": "^2.88.0",
+                "semver": "^5.6.0",
+                "tar": "^4.4.8",
+                "xml2js": "^0.4.19",
+                "yargs": "^12.0.5"
+            },
+            "bin": {
+                "webdriver-manager": "bin/webdriver-manager"
+            }
+        },
+        "node_modules/which": {
+            "version": "1.3.1",
+            "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz";,
+            "integrity": 
"sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+            "dependencies": {
+                "isexe": "^2.0.0"
+            },
+            "bin": {
+                "which": "bin/which"
+            }
+        },
+        "node_modules/which-module": {
+            "version": "2.0.0",
+            "resolved": 
"https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz";,
+            "integrity": 
"sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q=="
+        },
+        "node_modules/wrap-ansi": {
+            "version": "2.1.0",
+            "resolved": 
"https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz";,
+            "integrity": 
"sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==",
+            "dependencies": {
+                "string-width": "^1.0.1",
+                "strip-ansi": "^3.0.1"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/wrap-ansi/node_modules/ansi-regex": {
+            "version": "2.1.1",
+            "resolved": 
"https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz";,
+            "integrity": 
"sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==",
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": {
+            "version": "1.0.0",
+            "resolved": 
"https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz";,
+            "integrity": 
"sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==",
+            "dependencies": {
+                "number-is-nan": "^1.0.0"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/wrap-ansi/node_modules/string-width": {
+            "version": "1.0.2",
+            "resolved": 
"https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz";,
+            "integrity": 
"sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==",
+            "dependencies": {
+                "code-point-at": "^1.0.0",
+                "is-fullwidth-code-point": "^1.0.0",
+                "strip-ansi": "^3.0.0"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/wrap-ansi/node_modules/strip-ansi": {
+            "version": "3.0.1",
+            "resolved": 
"https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz";,
+            "integrity": 
"sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==",
+            "dependencies": {
+                "ansi-regex": "^2.0.0"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/wrappy": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz";,
+            "integrity": 
"sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
+        },
+        "node_modules/xml2js": {
+            "version": "0.4.23",
+            "resolved": 
"https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz";,
+            "integrity": 
"sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==",
+            "dependencies": {
+                "sax": ">=0.6.0",
+                "xmlbuilder": "~11.0.0"
+            },
+            "engines": {
+                "node": ">=4.0.0"
+            }
+        },
+        "node_modules/xmlbuilder": {
+            "version": "11.0.1",
+            "resolved": 
"https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz";,
+            "integrity": 
"sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==",
+            "engines": {
+                "node": ">=4.0"
+            }
+        },
+        "node_modules/y18n": {
+            "version": "4.0.3",
+            "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz";,
+            "integrity": 
"sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ=="
+        },
+        "node_modules/yallist": {
+            "version": "3.1.1",
+            "resolved": 
"https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz";,
+            "integrity": 
"sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="
+        },
+        "node_modules/yargs": {
+            "version": "12.0.5",
+            "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz";,
+            "integrity": 
"sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==",
+            "dependencies": {
+                "cliui": "^4.0.0",
+                "decamelize": "^1.2.0",
+                "find-up": "^3.0.0",
+                "get-caller-file": "^1.0.1",
+                "os-locale": "^3.0.0",
+                "require-directory": "^2.1.1",
+                "require-main-filename": "^1.0.1",
+                "set-blocking": "^2.0.0",
+                "string-width": "^2.0.0",
+                "which-module": "^2.0.0",
+                "y18n": "^3.2.1 || ^4.0.0",
+                "yargs-parser": "^11.1.1"
+            }
+        },
+        "node_modules/yargs-parser": {
+            "version": "11.1.1",
+            "resolved": 
"https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz";,
+            "integrity": 
"sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==",
+            "dependencies": {
+                "camelcase": "^5.0.0",
+                "decamelize": "^1.2.0"
+            }
+        }
+    },
+    "dependencies": {
+        "@types/node": {
+            "version": "12.20.55",
+            "resolved": 
"https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz";,
+            "integrity": 
"sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ=="
+        },
+        "adm-zip": {
+            "version": "0.5.10",
+            "resolved": 
"https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.10.tgz";,
+            "integrity": 
"sha512-x0HvcHqVJNTPk/Bw8JbLWlWoo6Wwnsug0fnYYro1HBrjxZ3G7/AZk7Ahv8JwDe1uIcz8eBqvu86FuF1POiG7vQ=="
+        },
+        "ajv": {
+            "version": "6.12.6",
+            "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz";,
+            "integrity": 
"sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+            "requires": {
+                "fast-deep-equal": "^3.1.1",
+                "fast-json-stable-stringify": "^2.0.0",
+                "json-schema-traverse": "^0.4.1",
+                "uri-js": "^4.2.2"
+            }
+        },
+        "ansi-regex": {
+            "version": "3.0.1",
+            "resolved": 
"https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz";,
+            "integrity": 
"sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw=="
+        },
+        "asn1": {
+            "version": "0.2.6",
+            "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz";,
+            "integrity": 
"sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==",
+            "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": 
"sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw=="
+        },
+        "asynckit": {
+            "version": "0.4.0",
+            "resolved": 
"https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz";,
+            "integrity": 
"sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
+        },
+        "aws-sign2": {
+            "version": "0.7.0",
+            "resolved": 
"https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz";,
+            "integrity": 
"sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA=="
+        },
+        "aws4": {
+            "version": "1.12.0",
+            "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz";,
+            "integrity": 
"sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg=="
+        },
+        "bcrypt-pbkdf": {
+            "version": "1.0.2",
+            "resolved": 
"https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz";,
+            "integrity": 
"sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==",
+            "requires": {
+                "tweetnacl": "^0.14.3"
+            }
+        },
+        "camelcase": {
+            "version": "5.3.1",
+            "resolved": 
"https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz";,
+            "integrity": 
"sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg=="
+        },
+        "caseless": {
+            "version": "0.12.0",
+            "resolved": 
"https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz";,
+            "integrity": 
"sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw=="
+        },
+        "chownr": {
+            "version": "1.1.4",
+            "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz";,
+            "integrity": 
"sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg=="
+        },
+        "cliui": {
+            "version": "4.1.0",
+            "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz";,
+            "integrity": 
"sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==",
+            "requires": {
+                "string-width": "^2.1.1",
+                "strip-ansi": "^4.0.0",
+                "wrap-ansi": "^2.0.0"
+            }
+        },
+        "code-point-at": {
+            "version": "1.1.0",
+            "resolved": 
"https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz";,
+            "integrity": 
"sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA=="
+        },
+        "combined-stream": {
+            "version": "1.0.8",
+            "resolved": 
"https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz";,
+            "integrity": 
"sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+            "requires": {
+                "delayed-stream": "~1.0.0"
+            }
+        },
+        "core-util-is": {
+            "version": "1.0.2",
+            "resolved": 
"https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz";,
+            "integrity": 
"sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ=="
+        },
+        "cross-spawn": {
+            "version": "6.0.5",
+            "resolved": 
"https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz";,
+            "integrity": 
"sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
+            "requires": {
+                "nice-try": "^1.0.4",
+                "path-key": "^2.0.1",
+                "semver": "^5.5.0",
+                "shebang-command": "^1.2.0",
+                "which": "^1.2.9"
+            }
+        },
+        "dashdash": {
+            "version": "1.14.1",
+            "resolved": 
"https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz";,
+            "integrity": 
"sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==",
+            "requires": {
+                "assert-plus": "^1.0.0"
+            }
+        },
+        "decamelize": {
+            "version": "1.2.0",
+            "resolved": 
"https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz";,
+            "integrity": 
"sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA=="
+        },
+        "delayed-stream": {
+            "version": "1.0.0",
+            "resolved": 
"https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz";,
+            "integrity": 
"sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="
+        },
+        "ecc-jsbn": {
+            "version": "0.1.2",
+            "resolved": 
"https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz";,
+            "integrity": 
"sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==",
+            "requires": {
+                "jsbn": "~0.1.0",
+                "safer-buffer": "^2.1.0"
+            }
+        },
+        "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"
+            }
+        },
+        "execa": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz";,
+            "integrity": 
"sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==",
+            "requires": {
+                "cross-spawn": "^6.0.0",
+                "get-stream": "^4.0.0",
+                "is-stream": "^1.1.0",
+                "npm-run-path": "^2.0.0",
+                "p-finally": "^1.0.0",
+                "signal-exit": "^3.0.0",
+                "strip-eof": "^1.0.0"
+            }
+        },
+        "extend": {
+            "version": "3.0.2",
+            "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz";,
+            "integrity": 
"sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
+        },
+        "extsprintf": {
+            "version": "1.3.0",
+            "resolved": 
"https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz";,
+            "integrity": 
"sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g=="
+        },
+        "fast-deep-equal": {
+            "version": "3.1.3",
+            "resolved": 
"https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz";,
+            "integrity": 
"sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
+        },
+        "fast-json-stable-stringify": {
+            "version": "2.1.0",
+            "resolved": 
"https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz";,
+            "integrity": 
"sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
+        },
+        "find-up": {
+            "version": "3.0.0",
+            "resolved": 
"https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz";,
+            "integrity": 
"sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
+            "requires": {
+                "locate-path": "^3.0.0"
+            }
+        },
+        "forever-agent": {
+            "version": "0.6.1",
+            "resolved": 
"https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz";,
+            "integrity": 
"sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw=="
+        },
+        "form-data": {
+            "version": "2.3.3",
+            "resolved": 
"https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz";,
+            "integrity": 
"sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
+            "requires": {
+                "asynckit": "^0.4.0",
+                "combined-stream": "^1.0.6",
+                "mime-types": "^2.1.12"
+            }
+        },
+        "fs-minipass": {
+            "version": "1.2.7",
+            "resolved": 
"https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz";,
+            "integrity": 
"sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==",
+            "requires": {
+                "minipass": "^2.6.0"
+            }
+        },
+        "get-caller-file": {
+            "version": "1.0.3",
+            "resolved": 
"https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz";,
+            "integrity": 
"sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w=="
+        },
+        "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": 
"sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==",
+            "requires": {
+                "assert-plus": "^1.0.0"
+            }
+        },
+        "har-schema": {
+            "version": "2.0.0",
+            "resolved": 
"https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz";,
+            "integrity": 
"sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q=="
+        },
+        "har-validator": {
+            "version": "5.1.5",
+            "resolved": 
"https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz";,
+            "integrity": 
"sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==",
+            "requires": {
+                "ajv": "^6.12.3",
+                "har-schema": "^2.0.0"
+            }
+        },
+        "http-signature": {
+            "version": "1.2.0",
+            "resolved": 
"https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz";,
+            "integrity": 
"sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==",
+            "requires": {
+                "assert-plus": "^1.0.0",
+                "jsprim": "^1.2.2",
+                "sshpk": "^1.7.0"
+            }
+        },
+        "invert-kv": {
+            "version": "2.0.0",
+            "resolved": 
"https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz";,
+            "integrity": 
"sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA=="
+        },
+        "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": 
"sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w=="
+        },
+        "is-stream": {
+            "version": "1.1.0",
+            "resolved": 
"https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz";,
+            "integrity": 
"sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ=="
+        },
+        "is-typedarray": {
+            "version": "1.0.0",
+            "resolved": 
"https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz";,
+            "integrity": 
"sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA=="
+        },
+        "isexe": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz";,
+            "integrity": 
"sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="
+        },
+        "isstream": {
+            "version": "0.1.2",
+            "resolved": 
"https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz";,
+            "integrity": 
"sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g=="
+        },
+        "jsbn": {
+            "version": "0.1.1",
+            "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz";,
+            "integrity": 
"sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg=="
+        },
+        "jsgantt-improved": {
+            "version": "2.8.5",
+            "resolved": 
"https://registry.npmjs.org/jsgantt-improved/-/jsgantt-improved-2.8.5.tgz";,
+            "integrity": 
"sha512-zGBImhvRxqHS0d06JEkbGT6yatlqMLnY8c1nyuiSPVfBNesH00jIx9GYgst6hKcdNMjePItP7hRFwWw427UXPw==",
+            "requires": {
+                "@types/node": "^12.0.10",
+                "webdriver-manager": "^13.0.0"
+            }
+        },
+        "json-schema": {
+            "version": "0.4.0",
+            "resolved": 
"https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz";,
+            "integrity": 
"sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA=="
+        },
+        "json-schema-traverse": {
+            "version": "0.4.1",
+            "resolved": 
"https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz";,
+            "integrity": 
"sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
+        },
+        "json-stringify-safe": {
+            "version": "5.0.1",
+            "resolved": 
"https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz";,
+            "integrity": 
"sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA=="
+        },
+        "jsprim": {
+            "version": "1.4.2",
+            "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz";,
+            "integrity": 
"sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==",
+            "requires": {
+                "assert-plus": "1.0.0",
+                "extsprintf": "1.3.0",
+                "json-schema": "0.4.0",
+                "verror": "1.10.0"
+            }
+        },
+        "lcid": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz";,
+            "integrity": 
"sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==",
+            "requires": {
+                "invert-kv": "^2.0.0"
+            }
+        },
+        "locate-path": {
+            "version": "3.0.0",
+            "resolved": 
"https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz";,
+            "integrity": 
"sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
+            "requires": {
+                "p-locate": "^3.0.0",
+                "path-exists": "^3.0.0"
+            }
+        },
+        "loglevel": {
+            "version": "1.8.1",
+            "resolved": 
"https://registry.npmjs.org/loglevel/-/loglevel-1.8.1.tgz";,
+            "integrity": 
"sha512-tCRIJM51SHjAayKwC+QAg8hT8vg6z7GSgLJKGvzuPb1Wc+hLzqtuVLxp6/HzSPOozuK+8ErAhy7U/sVzw8Dgfg=="
+        },
+        "map-age-cleaner": {
+            "version": "0.1.3",
+            "resolved": 
"https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz";,
+            "integrity": 
"sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==",
+            "requires": {
+                "p-defer": "^1.0.0"
+            }
+        },
+        "mem": {
+            "version": "4.3.0",
+            "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz";,
+            "integrity": 
"sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==",
+            "requires": {
+                "map-age-cleaner": "^0.1.1",
+                "mimic-fn": "^2.0.0",
+                "p-is-promise": "^2.0.0"
+            }
+        },
+        "mime-db": {
+            "version": "1.52.0",
+            "resolved": 
"https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz";,
+            "integrity": 
"sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="
+        },
+        "mime-types": {
+            "version": "2.1.35",
+            "resolved": 
"https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz";,
+            "integrity": 
"sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+            "requires": {
+                "mime-db": "1.52.0"
+            }
+        },
+        "mimic-fn": {
+            "version": "2.1.0",
+            "resolved": 
"https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz";,
+            "integrity": 
"sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="
+        },
+        "minimist": {
+            "version": "1.2.8",
+            "resolved": 
"https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz";,
+            "integrity": 
"sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="
+        },
+        "minipass": {
+            "version": "2.9.0",
+            "resolved": 
"https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz";,
+            "integrity": 
"sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==",
+            "requires": {
+                "safe-buffer": "^5.1.2",
+                "yallist": "^3.0.0"
+            }
+        },
+        "minizlib": {
+            "version": "1.3.3",
+            "resolved": 
"https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz";,
+            "integrity": 
"sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==",
+            "requires": {
+                "minipass": "^2.9.0"
+            }
+        },
+        "mkdirp": {
+            "version": "0.5.6",
+            "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz";,
+            "integrity": 
"sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
+            "requires": {
+                "minimist": "^1.2.6"
+            }
+        },
+        "nice-try": {
+            "version": "1.0.5",
+            "resolved": 
"https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz";,
+            "integrity": 
"sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ=="
+        },
+        "npm-run-path": {
+            "version": "2.0.2",
+            "resolved": 
"https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz";,
+            "integrity": 
"sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==",
+            "requires": {
+                "path-key": "^2.0.0"
+            }
+        },
+        "number-is-nan": {
+            "version": "1.0.1",
+            "resolved": 
"https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz";,
+            "integrity": 
"sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ=="
+        },
+        "oauth-sign": {
+            "version": "0.9.0",
+            "resolved": 
"https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz";,
+            "integrity": 
"sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ=="
+        },
+        "once": {
+            "version": "1.4.0",
+            "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz";,
+            "integrity": 
"sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+            "requires": {
+                "wrappy": "1"
+            }
+        },
+        "os-locale": {
+            "version": "3.1.0",
+            "resolved": 
"https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz";,
+            "integrity": 
"sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==",
+            "requires": {
+                "execa": "^1.0.0",
+                "lcid": "^2.0.0",
+                "mem": "^4.0.0"
+            }
+        },
+        "p-defer": {
+            "version": "1.0.0",
+            "resolved": 
"https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz";,
+            "integrity": 
"sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw=="
+        },
+        "p-finally": {
+            "version": "1.0.0",
+            "resolved": 
"https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz";,
+            "integrity": 
"sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow=="
+        },
+        "p-is-promise": {
+            "version": "2.1.0",
+            "resolved": 
"https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz";,
+            "integrity": 
"sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg=="
+        },
+        "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": "3.0.0",
+            "resolved": 
"https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz";,
+            "integrity": 
"sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
+            "requires": {
+                "p-limit": "^2.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=="
+        },
+        "path-exists": {
+            "version": "3.0.0",
+            "resolved": 
"https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz";,
+            "integrity": 
"sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ=="
+        },
+        "path-key": {
+            "version": "2.0.1",
+            "resolved": 
"https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz";,
+            "integrity": 
"sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw=="
+        },
+        "performance-now": {
+            "version": "2.1.0",
+            "resolved": 
"https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz";,
+            "integrity": 
"sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow=="
+        },
+        "psl": {
+            "version": "1.9.0",
+            "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz";,
+            "integrity": 
"sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag=="
+        },
+        "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"
+            }
+        },
+        "punycode": {
+            "version": "2.3.0",
+            "resolved": 
"https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz";,
+            "integrity": 
"sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA=="
+        },
+        "qs": {
+            "version": "6.5.3",
+            "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz";,
+            "integrity": 
"sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA=="
+        },
+        "request": {
+            "version": "2.88.2",
+            "resolved": 
"https://registry.npmjs.org/request/-/request-2.88.2.tgz";,
+            "integrity": 
"sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
+            "requires": {
+                "aws-sign2": "~0.7.0",
+                "aws4": "^1.8.0",
+                "caseless": "~0.12.0",
+                "combined-stream": "~1.0.6",
+                "extend": "~3.0.2",
+                "forever-agent": "~0.6.1",
+                "form-data": "~2.3.2",
+                "har-validator": "~5.1.3",
+                "http-signature": "~1.2.0",
+                "is-typedarray": "~1.0.0",
+                "isstream": "~0.1.2",
+                "json-stringify-safe": "~5.0.1",
+                "mime-types": "~2.1.19",
+                "oauth-sign": "~0.9.0",
+                "performance-now": "^2.1.0",
+                "qs": "~6.5.2",
+                "safe-buffer": "^5.1.2",
+                "tough-cookie": "~2.5.0",
+                "tunnel-agent": "^0.6.0",
+                "uuid": "^3.3.2"
+            }
+        },
+        "require-directory": {
+            "version": "2.1.1",
+            "resolved": 
"https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz";,
+            "integrity": 
"sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="
+        },
+        "require-main-filename": {
+            "version": "1.0.1",
+            "resolved": 
"https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz";,
+            "integrity": 
"sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug=="
+        },
+        "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=="
+        },
+        "sax": {
+            "version": "1.2.4",
+            "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz";,
+            "integrity": 
"sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
+        },
+        "semver": {
+            "version": "5.7.1",
+            "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz";,
+            "integrity": 
"sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
+        },
+        "set-blocking": {
+            "version": "2.0.0",
+            "resolved": 
"https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz";,
+            "integrity": 
"sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw=="
+        },
+        "shebang-command": {
+            "version": "1.2.0",
+            "resolved": 
"https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz";,
+            "integrity": 
"sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==",
+            "requires": {
+                "shebang-regex": "^1.0.0"
+            }
+        },
+        "shebang-regex": {
+            "version": "1.0.0",
+            "resolved": 
"https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz";,
+            "integrity": 
"sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ=="
+        },
+        "signal-exit": {
+            "version": "3.0.7",
+            "resolved": 
"https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz";,
+            "integrity": 
"sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="
+        },
+        "sshpk": {
+            "version": "1.17.0",
+            "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz";,
+            "integrity": 
"sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==",
+            "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": "2.1.1",
+            "resolved": 
"https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz";,
+            "integrity": 
"sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
+            "requires": {
+                "is-fullwidth-code-point": "^2.0.0",
+                "strip-ansi": "^4.0.0"
+            }
+        },
+        "strip-ansi": {
+            "version": "4.0.0",
+            "resolved": 
"https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz";,
+            "integrity": 
"sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==",
+            "requires": {
+                "ansi-regex": "^3.0.0"
+            }
+        },
+        "strip-eof": {
+            "version": "1.0.0",
+            "resolved": 
"https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz";,
+            "integrity": 
"sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q=="
+        },
+        "tar": {
+            "version": "4.4.19",
+            "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.19.tgz";,
+            "integrity": 
"sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA==",
+            "requires": {
+                "chownr": "^1.1.4",
+                "fs-minipass": "^1.2.7",
+                "minipass": "^2.9.0",
+                "minizlib": "^1.3.3",
+                "mkdirp": "^0.5.5",
+                "safe-buffer": "^5.2.1",
+                "yallist": "^3.1.1"
+            }
+        },
+        "tough-cookie": {
+            "version": "2.5.0",
+            "resolved": 
"https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz";,
+            "integrity": 
"sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
+            "requires": {
+                "psl": "^1.1.28",
+                "punycode": "^2.1.1"
+            }
+        },
+        "tunnel-agent": {
+            "version": "0.6.0",
+            "resolved": 
"https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz";,
+            "integrity": 
"sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==",
+            "requires": {
+                "safe-buffer": "^5.0.1"
+            }
+        },
+        "tweetnacl": {
+            "version": "0.14.5",
+            "resolved": 
"https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz";,
+            "integrity": 
"sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA=="
+        },
+        "uri-js": {
+            "version": "4.4.1",
+            "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz";,
+            "integrity": 
"sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+            "requires": {
+                "punycode": "^2.1.0"
+            }
+        },
+        "uuid": {
+            "version": "3.4.0",
+            "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz";,
+            "integrity": 
"sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A=="
+        },
+        "verror": {
+            "version": "1.10.0",
+            "resolved": 
"https://registry.npmjs.org/verror/-/verror-1.10.0.tgz";,
+            "integrity": 
"sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==",
+            "requires": {
+                "assert-plus": "^1.0.0",
+                "core-util-is": "1.0.2",
+                "extsprintf": "^1.2.0"
+            }
+        },
+        "webdriver-manager": {
+            "version": "13.0.2",
+            "resolved": 
"https://registry.npmjs.org/webdriver-manager/-/webdriver-manager-13.0.2.tgz";,
+            "integrity": 
"sha512-Dv9INmI0ttZ5kgiSRgaNdNh3/wlX7v9bSj2T6AdClxUvHrKFz8rqEBIef7DwXvGzz1MO8JH9NqzIzaf1ptznWA==",
+            "requires": {
+                "adm-zip": "^0.5.2",
+                "loglevel": "^1.6.1",
+                "request": "^2.88.0",
+                "semver": "^5.6.0",
+                "tar": "^4.4.8",
+                "xml2js": "^0.4.19",
+                "yargs": "^12.0.5"
+            }
+        },
+        "which": {
+            "version": "1.3.1",
+            "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz";,
+            "integrity": 
"sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+            "requires": {
+                "isexe": "^2.0.0"
+            }
+        },
+        "which-module": {
+            "version": "2.0.0",
+            "resolved": 
"https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz";,
+            "integrity": 
"sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q=="
+        },
+        "wrap-ansi": {
+            "version": "2.1.0",
+            "resolved": 
"https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz";,
+            "integrity": 
"sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==",
+            "requires": {
+                "string-width": "^1.0.1",
+                "strip-ansi": "^3.0.1"
+            },
+            "dependencies": {
+                "ansi-regex": {
+                    "version": "2.1.1",
+                    "resolved": 
"https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz";,
+                    "integrity": 
"sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA=="
+                },
+                "is-fullwidth-code-point": {
+                    "version": "1.0.0",
+                    "resolved": 
"https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz";,
+                    "integrity": 
"sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==",
+                    "requires": {
+                        "number-is-nan": "^1.0.0"
+                    }
+                },
+                "string-width": {
+                    "version": "1.0.2",
+                    "resolved": 
"https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz";,
+                    "integrity": 
"sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==",
+                    "requires": {
+                        "code-point-at": "^1.0.0",
+                        "is-fullwidth-code-point": "^1.0.0",
+                        "strip-ansi": "^3.0.0"
+                    }
+                },
+                "strip-ansi": {
+                    "version": "3.0.1",
+                    "resolved": 
"https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz";,
+                    "integrity": 
"sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==",
+                    "requires": {
+                        "ansi-regex": "^2.0.0"
+                    }
+                }
+            }
+        },
+        "wrappy": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz";,
+            "integrity": 
"sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
+        },
+        "xml2js": {
+            "version": "0.4.23",
+            "resolved": 
"https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz";,
+            "integrity": 
"sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==",
+            "requires": {
+                "sax": ">=0.6.0",
+                "xmlbuilder": "~11.0.0"
+            }
+        },
+        "xmlbuilder": {
+            "version": "11.0.1",
+            "resolved": 
"https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz";,
+            "integrity": 
"sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA=="
+        },
+        "y18n": {
+            "version": "4.0.3",
+            "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz";,
+            "integrity": 
"sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ=="
+        },
+        "yallist": {
+            "version": "3.1.1",
+            "resolved": 
"https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz";,
+            "integrity": 
"sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="
+        },
+        "yargs": {
+            "version": "12.0.5",
+            "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz";,
+            "integrity": 
"sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==",
+            "requires": {
+                "cliui": "^4.0.0",
+                "decamelize": "^1.2.0",
+                "find-up": "^3.0.0",
+                "get-caller-file": "^1.0.1",
+                "os-locale": "^3.0.0",
+                "require-directory": "^2.1.1",
+                "require-main-filename": "^1.0.1",
+                "set-blocking": "^2.0.0",
+                "string-width": "^2.0.0",
+                "which-module": "^2.0.0",
+                "y18n": "^3.2.1 || ^4.0.0",
+                "yargs-parser": "^11.1.1"
+            }
+        },
+        "yargs-parser": {
+            "version": "11.1.1",
+            "resolved": 
"https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz";,
+            "integrity": 
"sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==",
+            "requires": {
+                "camelcase": "^5.0.0",
+                "decamelize": "^1.2.0"
+            }
+        }
+    }
+}
diff --git a/projectmgr/webapp/projectmgr/package.json 
b/projectmgr/webapp/projectmgr/package.json
new file mode 100644
index 000000000..e9812f571
--- /dev/null
+++ b/projectmgr/webapp/projectmgr/package.json
@@ -0,0 +1,9 @@
+{
+    "name": "ofbiz-projectmgr",
+    "description": "ofbiz-plugins projectmgr NPM dependencies configuration",
+    "repository": "https://github.com/apache/ofbiz-plugins";,
+    "license": "Apache-2.0",
+    "dependencies": {
+        "jsgantt-improved": "^2.8.5"
+    }
+}
diff --git a/projectmgr/webapp/projectmgr/static/projectmgr.css 
b/projectmgr/webapp/projectmgr/static/projectmgr.css
index ccc7573a3..ac6061151 100644
--- a/projectmgr/webapp/projectmgr/static/projectmgr.css
+++ b/projectmgr/webapp/projectmgr/static/projectmgr.css
@@ -19,10 +19,7 @@
 
 /* This CSS file is used for the Project Manager component. */
 
-#GanttChartDIV tr, #GanttChartDIV td {
-    vertical-align: top;
-}
-
-.gheadwkend {
-    background-color: #cfcfcf
+/* Remove any margins that my have been set on all divs by the themes, such as 
Rainbowstone */
+.gchartcontainer div {
+    margin: unset
 }
diff --git a/projectmgr/webapp/projectmgr/static/projectmgr.css 
b/projectmgr/webapp/projectmgr/static/projectmgr.js
similarity index 53%
copy from projectmgr/webapp/projectmgr/static/projectmgr.css
copy to projectmgr/webapp/projectmgr/static/projectmgr.js
index ccc7573a3..f506ffd42 100644
--- a/projectmgr/webapp/projectmgr/static/projectmgr.css
+++ b/projectmgr/webapp/projectmgr/static/projectmgr.js
@@ -17,12 +17,24 @@
  * under the License.
  */
 
-/* This CSS file is used for the Project Manager component. */
+const ganttItemsJson = document.getElementById("ofbizGantItemsJson").value;
+const ganttItems = JSON.parse(ganttItemsJson);
 
-#GanttChartDIV tr, #GanttChartDIV td {
-    vertical-align: top;
-}
+const g = new JSGantt.GanttChart(document.getElementById('GanttChartDIV'), 
'day');
+g.setShowRes(1); // Show/Hide Resource (0/1)
+g.setShowDur(1); // Show/Hide Duration (0/1)
+g.setShowComp(1); // Show/Hide % Complete(0/1)
+g.setShowTaskInfoLink(1);
+g.setShowTaskInfoNotes(0)
+
+g.setDateTaskTableDisplayFormat('dd mon yyyy');
+g.setDayMajorDateDisplayFormat('dd mon');
 
-.gheadwkend {
-    background-color: #cfcfcf
+for (t of ganttItems) {
+    g.AddTaskItem(
+        new JSGantt.TaskItem(t.pID, t.pName, t.pStart, t.pEnd, t.pClass, 
t.pLink, t.pMile, t.pRes, t.pComp,
+            t.pGroup, t.pParent, t.pOpen, t.pDepend, "", "", g)
+    );
 }
+
+g.Draw();
diff --git a/projectmgr/widget/ProjectScreens.xml 
b/projectmgr/widget/ProjectScreens.xml
index 69147f618..6c43a941b 100644
--- a/projectmgr/widget/ProjectScreens.xml
+++ b/projectmgr/widget/ProjectScreens.xml
@@ -424,8 +424,8 @@ under the License.
             <actions>
                 <set field="titleProperty" value="ProjectMgrGanttChart"/>
                 <set field="tabButtonItem" value="ganttchart"/>
-                <set field="layoutSettings.javaScripts[]" 
value="/common/js/plugins/jsgantt/jsgantt.js" global="true"/>
-                <set field="layoutSettings.styleSheets[]" 
value="/common/js/plugins/jsgantt/jsgantt.css" global="true"/>
+                <set field="layoutSettings.styleSheets[]" 
value="/projectmgr/node_modules/jsgantt-improved/dist/jsgantt.css" 
global="true"/>
+                <set field="layoutSettings.styleSheets[]" 
value="/projectmgr/static/projectmgr.css" global="true"/>
                 <script 
location="component://projectmgr/groovyScripts/GanttChart.groovy"/>
             </actions>
             <widgets>
@@ -980,8 +980,8 @@ under the License.
         <section>
             <actions>
                 <property-map resource="ProjectMgrUiLabels" 
map-name="uiLabelMap" global="true"/>
-                <set field="layoutSettings.javaScripts[]" 
value="/common/js/plugins/jsgantt/jsgantt.js" global="true"/>
-                <set field="layoutSettings.styleSheets[]" 
value="/common/js/plugins/jsgantt/jsgantt.css" global="true"/>
+                <set field="layoutSettings.styleSheets[]" 
value="/projectmgr/node_modules/jsgantt-improved/dist/jsgantt.css" 
global="true"/>
+                <set field="layoutSettings.styleSheets[]" 
value="/projectmgr/static/projectmgr.css" global="true"/>
                 <entity-condition entity-name="WorkEffortPartyAssignByGroup" 
list="projects" filter-by-date="true">
                     <condition-list combine="and">
                         <condition-expr field-name="partyId" 
from-field="userLogin.partyId"/>

Reply via email to