From 24dfbaf6b4757a1c0e89bb1a083944f8b1dd6a46 Mon Sep 17 00:00:00 2001
From: 2bit <i@2bit.jp>
Date: Tue, 25 Apr 2023 21:28:42 +0900
Subject: [PATCH 01/11] too many updates...

---
 frontend/app.js              |   87 +-
 frontend/index.html          |   22 +-
 frontend/index.js            |  516 +++----
 frontend/npm-shrinkwrap.json | 2598 ++++++++++++++--------------------
 frontend/package.json        |   10 +-
 frontend/preload.js          |   17 +
 6 files changed, 1398 insertions(+), 1852 deletions(-)
 create mode 100644 frontend/preload.js

diff --git a/frontend/app.js b/frontend/app.js
index e7aed63a..e7f1d756 100644
--- a/frontend/app.js
+++ b/frontend/app.js
@@ -1,11 +1,8 @@
-"use strict";
 // instead of ipc, maybe?
 // https://github.com/atom/electron/blob/master/docs/api/remote.md
 
-var ipc = require('ipc');
-var path = require('path');
-var fs = require('fs');
-
+const ipc = window.ipc_wrapper;
+const path = ipc.path;
 
 var platforms;
 var templates;
@@ -20,38 +17,37 @@ var templates;
 //     "linuxarmv7l": "Linux ARMv7 (Makefiles)"
 // };
 
-var defaultSettings;
-var addonsInstalled;
-var currentPath;
-var isOfPathGood = false;
-var isFirstTimeSierra = false;
-var bVerbose = false;
-var localAddons = [];
+let defaultSettings;
+let addonsInstalled;
+let isOfPathGood = false;
+let isFirstTimeSierra = false;
+let bVerbose = false;
+let localAddons = [];
 
-var numAddedSrcPaths = 1;
+let numAddedSrcPaths = 1;
 
 //-----------------------------------------------------------------------------------
 // IPC
 //-----------------------------------------------------------------------------------
 
 //-------------------------------------------
-ipc.on('setOfPath', function(arg) {
+ipc.on('setOfPath', function(event, arg) {
     setOFPath(arg);
 });
 
-ipc.on('cwd', function(arg) {
+ipc.on('cwd', function(event, arg) {
 
     console.log(arg);
 });
 
-ipc.on('setUpdatePath', function(arg) {
+ipc.on('setUpdatePath', function(event, arg) {
     var elem = document.getElementById("updateMultiplePath");
     elem.value = arg;
     $("#updateMultiplePath").change();
 
 });
 
-ipc.on('isUpdateMultiplePathOk', function(arg) {
+ipc.on('isUpdateMultiplePathOk', function(event, arg) {
    if (arg == true){
         $("#updateMultipleWrongMessage").hide();
         $("#updateMultipleButton").removeClass("disabled");
@@ -64,13 +60,13 @@ ipc.on('isUpdateMultiplePathOk', function(arg) {
 });
 
 //-------------------------------------------
-ipc.on('setup', function(arg) {
+ipc.on('setup', function(event, arg) {
     setup();
 });
 
 //-----------------------------------------
 // this is called from main when defaults are loaded in:
-ipc.on('setDefaults', function(arg) {
+ipc.on('setDefaults', function(event, arg) {
 
     defaultSettings = arg;
     setOFPath(defaultSettings['defaultOfPath']);
@@ -79,13 +75,13 @@ ipc.on('setDefaults', function(arg) {
 });
 
 //-------------------------------------------
-ipc.on('setStartingProject', function(arg) {
+ipc.on('setStartingProject', function(event, arg) {
     $("#projectPath").val(arg['path']);
     $("#projectName").val(arg['name']);
 });
 
 //-------------------------------------------
-ipc.on('setProjectPath', function(arg) {
+ipc.on('setProjectPath', function(event, arg) {
     $("#projectPath").val(arg);
     //defaultSettings['lastUsedProjectPath'] = arg;
     //saveDefaultSettings();
@@ -93,24 +89,24 @@ ipc.on('setProjectPath', function(arg) {
 });
 
 //-------------------------------------------
-ipc.on('setSourceExtraPath', function(arg, index) {
+ipc.on('setSourceExtraPath', function(event, [arg, index]) { // TODO:
     checkAddSourcePath(index);
     $("#sourceExtra-"+index).val(arg);
 });
 
 //-------------------------------------------
-ipc.on('setGenerateMode', function(arg) {
+ipc.on('setGenerateMode', function(event, arg) {
     switchGenerateMode(arg);
 });
 
 //-------------------------------------------
-ipc.on('importProjectSettings', function(settings) {
+ipc.on('importProjectSettings', function(event, settings) {
     $("#projectPath").val(settings['projectPath']);
     $("#projectName").val(settings['projectName']).trigger('change'); // change triggers addon scanning
 });
 
 //-------------------------------------------
-ipc.on('setAddons', function(arg) {
+ipc.on('setAddons', function(event, arg) {
 
     console.log("got set addons");
     console.log(arg);
@@ -162,7 +158,7 @@ ipc.on('setAddons', function(arg) {
 });
 
 
-ipc.on('setPlatforms', function(arg) {
+ipc.on('setPlatforms', function(event, arg) {
 
     console.log("got set platforms");
     console.log(arg);
@@ -211,7 +207,7 @@ ipc.on('setPlatforms', function(arg) {
 });
 
 
-ipc.on('setTemplates', function(arg) {
+ipc.on('setTemplates', function(event, arg) {
     console.log("----------------");
     console.log("got set templates");
     console.log(arg);
@@ -268,7 +264,7 @@ ipc.on('setTemplates', function(arg) {
 });
 
 
-ipc.on('enableTemplate', function (arg) {
+ipc.on('enableTemplate', function (event, arg) {
 
     console.log('enableTemplate');
     let items = arg.bMulti === false ? $('#templatesDropdown .menu .item') : $('#templatesDropdownMulti .menu .item');
@@ -291,7 +287,7 @@ ipc.on('enableTemplate', function (arg) {
 
 //-------------------------------------------
 // select the list of addons and notify if some aren't installed
-ipc.on('selectAddons', function(arg) {
+ipc.on('selectAddons', function(event, arg) {
 
 
     // todo : DEAL WITH LOCAL ADDONS HERE....
@@ -321,8 +317,9 @@ ipc.on('selectAddons', function(arg) {
 
                 var neededAddonPathRel = path.join($("#projectPath").val(), $("#projectName").val(), arg[i]);
                 console.log(neededAddonPathRel);
-                if (fs.existsSync(neededAddonPathRel) ||
-                    fs.existsSync(neededAddons[i])){
+                if (fs.existsSync(neededAddonPathRel)
+                    || fs.existsSync(neededAddons[i]))
+                {
                     localAddons.push(arg[i]);
                 } else {
                     neededAddons.push(arg[i]);
@@ -379,7 +376,7 @@ ipc.on('selectAddons', function(arg) {
 
 //-------------------------------------------
 // allow main to send UI messages
-ipc.on('sendUIMessage', function(arg) {
+ipc.on('sendUIMessage', function(event, arg) {
 
     // check if it has "success" message:
 
@@ -388,12 +385,12 @@ ipc.on('sendUIMessage', function(arg) {
 });
 
 //-------------------------------------------
-ipc.on('consoleMessage', function(msg) {
+ipc.on('consoleMessage', function(event, msg) {
     consoleMessage(msg);
 });
 
 //-------------------------------------------
-ipc.on('generateCompleted', function(isSuccessful) {
+ipc.on('generateCompleted', function(event, isSuccessful) {
     if (isSuccessful === true) {
         // We want to switch to update mode now
         $("#projectName").trigger('change');
@@ -401,13 +398,13 @@ ipc.on('generateCompleted', function(isSuccessful) {
 });
 
 //-------------------------------------------
-ipc.on('updateCompleted', function(isSuccessful) {
+ipc.on('updateCompleted', function(event, isSuccessful) {
     if (isSuccessful === true) {
         // eventual callback after update completed
     }
 });
 
-ipc.on('setRandomisedSketchName', function(newName) {
+ipc.on('setRandomisedSketchName', function(event, newName) {
     $("#projectName").val(newName);
 });
 
@@ -420,9 +417,9 @@ ipc.on('setRandomisedSketchName', function(newName) {
 //----------------------------------------
 function setOFPath(arg) {
     // get the element:
-    var elem = document.getElementById("ofPath");
+    const elem = document.getElementById("ofPath");
 
-    if (!path.isAbsolute(arg)) {
+    if (arg != null && !path.isAbsolute(arg)) {
 
         // if we are relative, don't do anything...
 
@@ -746,6 +743,7 @@ function setup() {
                 selectedPlatforms: selectedPlatformArray,
                 bMulti: false
             }
+            console.log(arg);
             ipc.send('refreshTemplateList', arg);
         })
         $("#platformsDropdownMulti").on('change', function () {
@@ -886,15 +884,11 @@ function openDragInputModal(e){
 
 //----------------------------------------
 function saveDefaultSettings() {
+    if(!defaultSettings) return;
 
-    var fs = require('fs');
-    fs.writeFile(path.resolve(__dirname, 'settings.json'), JSON.stringify(defaultSettings, null, '\t'), function(err) {
-        if (err) {
-            console.log("Unable to save defaultSettings to settings.json... (Error=" + err.code + ")");
-        } else {
-            console.log("Updated default settings for the PG. (written to settings.json)");
-        }
-    });
+    const defaultSettingsJsonString = JSON.stringify(defaultSettings, null, '\t');
+    const result = ipc.sendSync('saveDefaultSettings', defaultSettingsJsonString);
+    console.log(result);
 }
 
 //----------------------------------------
@@ -1136,6 +1130,7 @@ function browseOfPath() {
 
 function browseProjectPath() {
     var path = $("#projectPath").val();
+    console.log(path);
     if (path === ''){
         path = $("#ofPath").val();
     }
diff --git a/frontend/index.html b/frontend/index.html
index f3526962..3d7322c1 100644
--- a/frontend/index.html
+++ b/frontend/index.html
@@ -9,10 +9,12 @@
 		body {
 			background-color: #ddd;
 			-webkit-user-select: none;
+			user-select: none;
 		}
 		/* enable some text to be selectable */
 		.selectable, .selectable * {
 			-webkit-user-select: text;
+			user-select: text;
 		}
 
 		.draggable {
@@ -39,6 +41,7 @@
 
 		.ui.dimmer > .content {
 			-webkit-user-select: none !important;
+			user-select: none !important;
 		}
 
 		#uiModal {
@@ -54,14 +57,13 @@
 		}
 
 		.fixedElement {
-position: fixed;
-  z-index: 101;
-  margin: 0em;
-  width: 100%;
-
+			position: fixed;
+  			z-index: 101;
+  			margin: 0em;
+  			width: 100%;
 		}
 
-		#fullConsoleOutput textarea{
+		#fullConsoleOutput textarea {
 			border:0px;
 			background-color: #333;
 			width:100%;
@@ -83,9 +85,9 @@
 
 		<div class="draggable" id="df" style="padding:0px; margin:0px; background: linear-gradient(rgba(0,0,0,0.85), rgba(0,0,0,0.85)); height:2.5em">
 		<button class="circular ui secondary mini icon button undraggable" onclick="quit()" style="margin:5px;">
-  <i class="icon remove"></i>
-</button>
-			<<!-- div class="ui container" style="padding:0px; margin:0px;">
+			<i class="icon remove"></i>
+		</button>
+			<!-- <div class="ui container" style="padding:0px; margin:0px;">
 				<a class="item menuItem">
 					<div style="white" onclick="quit()"><i class="remove link icon white" style="color:#fff"></i>
 					</div>
@@ -365,7 +367,7 @@
 				<p>Welcome to the console :)</p>
 			</div>
 		</section>
-		<script type="text/javascript" src="static/js/jquery.min.js" onload="window.$ = window.jQuery = module.exports;"></script>
+		<script type="text/javascript" src="static/js/jquery.min.js"></script>
 		<script type="text/javascript" src="static/js/semantic.min.js"></script>
 		<script type="text/javascript" src="static/js/jquery.dragbetter.js"></script>
 		<script src="app.js"></script>
diff --git a/frontend/index.js b/frontend/index.js
index e09a5da1..4b9186c0 100644
--- a/frontend/index.js
+++ b/frontend/index.js
@@ -1,16 +1,19 @@
-"use strict";
+const fs = require('fs');
+const path = require('path');
+const moniker = require('moniker');
+const process = require('process');
+const os = require("os");
+const exec = require('child_process').exec;
+
+const {
+    app,
+    BrowserWindow,
+    dialog,
+    ipcMain,
+    Menu,
+    crashReporter
+} = require('electron');
 
-var app = require('app'); // Module to control application life.
-var BrowserWindow = require('browser-window'); // Module to create native browser window.
-var dialog = require('dialog');
-var ipc = require('ipc');
-var fs = require('fs');
-var path = require('path');
-var menu = require('menu');
-var moniker = require('moniker');
-var process = require('process');
-var os = require("os");
-var exec = require('child_process').exec;
 
 
 // Debugging: start the Electron PG from the terminal to see the messages from console.log()
@@ -20,18 +23,16 @@ var exec = require('child_process').exec;
 
 
 //--------------------------------------------------------- load settings
-var obj;
+let obj;
 
 
 try {
-    var settings = fs.readFileSync(path.resolve(__dirname, 'settings.json'));
+    const settings = fs.readFileSync(path.resolve(__dirname, 'settings.json'));
     obj = JSON.parse(settings, 'utf8');
     console.log(obj);
 } catch (e) {
-
     // automatic platform detection
-    var os = require("os");
-    var myPlatform = "Unknown";
+    let myPlatform = "Unknown";
     if (/^win/.test(process.platform)) {
         myPlatform = 'vs';
     }
@@ -64,23 +65,38 @@ try {
     };
 }
 
-var hostplatform = "";
-if (/^win/.test(process.platform)) {
-    hostplatform = 'windows';
-} else if (process.platform === "darwin") {
-    hostplatform = 'osx';
-} else if (process.platform === "linux") {
-    hostplatform = 'linux';
+const templateSettings = {
+    "defaultOfPath": "",
+    "advancedMode": false,
+    "defaultPlatform": 'osx',
+    "showConsole": false,
+    "showDeveloperTools": false,
+    "defaultRelativeProjectPath": "apps/myApps",
+    "useDictionaryNameGenerator": false
+};
+
+for(const key in templateSettings) {
+    if(!obj.hasOwnProperty(key)) {
+        obj[key] = templateSettings[key];
+    }
 }
 
-console.log("detected platform: " + hostplatform + " in " + __dirname);
+const hostplatform = (() => {
+    if (/^win/.test(process.platform)) {
+        return 'windows';
+    } else if (process.platform === "darwin") {
+        return 'osx';
+    } else if (process.platform === "linux") {
+        return 'linux';
+    }
+    return 'unknown';
+})();
 
-var defaultOfPath = obj["defaultOfPath"];
-var addons;
+console.log("detected platform: " + hostplatform + " in " + __dirname);
 
 // hide some addons, per https://github.com/openframeworks/projectGenerator/issues/62
 
-var addonsToSkip = [
+const addonsToSkip = [
     "ofxiOS",
     "ofxMultiTouch",
     "ofxEmscripten",
@@ -88,7 +104,7 @@ var addonsToSkip = [
     "ofxAndroid"
 ]
 
-var platforms = {
+const platforms = {
     "osx": "OS X (Xcode)",
     "vs": "Windows (Visual Studio 2017)",
     "msys2": "Windows (msys2/mingw)",
@@ -98,9 +114,10 @@ var platforms = {
     "linuxarmv6l": "Linux ARMv6 (Makefiles)",
     "linuxarmv7l": "Linux ARMv7 (Makefiles)"
 };
-var bUseMoniker = obj["useDictionaryNameGenerator"];
 
-var templates = {
+const bUseMoniker = obj["useDictionaryNameGenerator"];
+
+const templates = {
     "emscripten": "Emscripten",
     "gitignore": "Git Ignore",
     "gles2": "Open GL ES 2",
@@ -123,7 +140,8 @@ var templates = {
     "vscode": "Visual Studio Code",
 };
 
-
+let defaultOfPath = obj["defaultOfPath"];
+let addons;
 
 if (!path.isAbsolute(defaultOfPath)) {
 
@@ -131,29 +149,31 @@ if (!path.isAbsolute(defaultOfPath)) {
     // arturo, this may differ on linux, if putting ../ in settings doesn't work for the default path
     // take a look at this...
 
-    if (hostplatform=="windows" || hostplatform=="linux"){
-    	defaultOfPath = path.resolve(path.join(path.join(__dirname,"../../"), defaultOfPath));
-    } else if(hostplatform=="osx"){
+    if (hostplatform == "windows" || hostplatform == "linux"){
+    	defaultOfPath = path.resolve(path.join(path.join(__dirname, "../../"), defaultOfPath));
+    } else if(hostplatform == "osx"){
     	defaultOfPath = path.resolve(path.join(path.join(__dirname, "../../../../"), defaultOfPath));
     }
 
-    obj["defaultOfPath"] = defaultOfPath;
+    obj["defaultOfPath"] = defaultOfPath || "";
 }
 
 // now, let's look for a folder called mySketch, and keep counting until we find one that doesn't exist
-var startingProject = {};
-startingProject['name'] = "";
-startingProject['path'] = "";
+const startingProject = {
+    'name': '',
+    'path': ''
+};
 getStartingProjectName();
 
 //---------------------------------------------------------
 // Report crashes to our server.
-require('crash-reporter').start();
+// TODO: need to fix?
+// crashReporter.start();
 
 //---------------------------------------------------------
 // Keep a global reference of the window object, if you don't, the window will
 // be closed automatically when the JavaScript object is GCed.
-var mainWindow = null;
+let mainWindow = null;
 
 // Quit when all windows are closed.
 app.on('window-all-closed', function() {
@@ -164,38 +184,21 @@ app.on('window-all-closed', function() {
 
 
 function formatDate(d){
+    //get the year
+    const year = d.getFullYear().toString().substring(2, 4);
     //get the month
-    var month = d.getMonth();
+    const month = (d.getMonth() + 1).toString().padStart(2, '0');
     //get the day
-    var day = d.getDate();
-    //get the year
-    var year = d.getFullYear();
-    //pull the last two digits of the year
-    year = year.toString().substr(2,2);
-    //increment month by 1 since it is 0 indexed
-    month = month + 1;
-    //converts month to a string
-    month = month + "";
-
-    //if month is 1-9 pad right with a 0 for two digits
-    if (month.length == 1){
-        month = "0" + month;
-    }
-    //convert day to string
-    day = day + "";
-    //if day is between 1-9 pad right with a 0 for two digits
-    if (day.length == 1){
-        day = "0" + day;
-    }
+    const day = d.getDate().toString().padStart(2, '0');;
     //return the string "MMddyy"
     return month + day + year;
 }
 
 // wraps over to bb no aa, why?
 function toLetters(num) {
-    var mod = num % 26,
-        pow = num / 26 | 0,
-        out = mod ? String.fromCharCode(96 + (num % 26)) : (--pow, 'z');
+    const mod = num % 26;
+    const pow = (num / 26) | 0;
+    const out = mod ? String.fromCharCode(96 + (num % 26)) : (--pow, 'z');
     return pow ? toLetters(pow) + out : out;
 }
 
@@ -209,15 +212,18 @@ app.on('ready', function() {
     mainWindow = new BrowserWindow({
         width: 500,
         height: 600,
-        resizable: false,
-        frame: false
+        resizable: true, // TODO: fix to false, true for debug
+        frame: false,
+        webPreferences: {
+            preload: path.join(__dirname, 'preload.js')
+        }
     });
 
     // load jquery here:
     // http://stackoverflow.com/questions/30271011/electron-jquery-errors
 
     // and load the index.html of the app.
-    mainWindow.loadUrl('file://' + __dirname + '/index.html');
+    mainWindow.loadFile(path.join(__dirname, 'index.html'));
 
     // Open the devtools.
     if (obj["showDeveloperTools"]) {
@@ -251,7 +257,7 @@ app.on('ready', function() {
         // when you should delete the corresponding element.
     });
 
-    var menuTmpl = [{
+    const menuTmpl = [{
         label: 'Atom Shell',
         submenu: [{
             label: 'Quit',
@@ -305,16 +311,14 @@ app.on('ready', function() {
             selector: 'selectAll:'
         }, ]
     }];
-    var menuV = menu.buildFromTemplate(menuTmpl);
-    menu.setApplicationMenu(menuV);
-
+    const menuV = Menu.buildFromTemplate(menuTmpl);
+    Menu.setApplicationMenu(menuV);
 });
 
 function getStartingProjectName() {
-
-    var defaultPathForProjects = path.join(obj["defaultOfPath"], obj["defaultRelativeProjectPath"]);
-    var foundOne = false;
-    var goodName = getGoodSketchName(defaultPathForProjects);
+    console.log(obj["defaultOfPath"], obj["defaultRelativeProjectPath"]);
+    const defaultPathForProjects = path.join(obj["defaultOfPath"], obj["defaultRelativeProjectPath"]);
+    const goodName = getGoodSketchName(defaultPathForProjects);
     startingProject['path'] = defaultPathForProjects;
     startingProject['name'] = goodName;
 }
@@ -325,11 +329,11 @@ function parseAddonsAndUpdateSelect(arg) {
     addons = getDirectories(arg + "/addons","ofx");
 
     if (addons){
-    if (addons.length > 0){
-        addons = addons.filter( function(addon) {
-            return addonsToSkip.indexOf(addon)==-1;
-        });
-    }
+        if (addons.length > 0){
+            addons = addons.filter( function(addon) {
+                return addonsToSkip.indexOf(addon) == -1;
+            });
+        }
     }
 
     console.log("Reloading the addons folder, these were found:");
@@ -338,19 +342,19 @@ function parseAddonsAndUpdateSelect(arg) {
 }
 
 function parsePlatformsAndUpdateSelect(arg) {
-    var folders = getDirectories(arg + "/scripts/templates");
+    const folders = getDirectories(arg + "/scripts/templates");
     console.log("Reloading the templates folder, these were found:");
     console.log(folders);
 
-    var platformsWeHave = {};
-    var templatesWeHave = {};
+    const platformsWeHave = {};
+    const templatesWeHave = {};
 
     if (folders === undefined || folders === null) {
         //do something
     } else {
         // check all folder name under /scripts/templates
-        for (var id in folders) {
-            var key = folders[id];
+        for (const id in folders) {
+            const key = folders[id];
             if (platforms[key]) {
                 // this folder is for platform
                 console.log("Found platform, key " + key + " has value " + platforms[key]);
@@ -370,7 +374,7 @@ function parsePlatformsAndUpdateSelect(arg) {
         }
     }
     // saninty check...
-    // for(var key in platformsWeHave){
+    // for(const key in platformsWeHave){
     // 	console.log("key " + key + " has value " + platformsWeHave[key]);
     // }
     mainWindow.webContents.send('setPlatforms', platformsWeHave);
@@ -379,23 +383,20 @@ function parsePlatformsAndUpdateSelect(arg) {
 
 }
 
-function getGoodSketchName(arg){
-
-    var currentProjectPath = arg;
-    var foundOne = false;
-    var goodName = "mySketch";
+function getGoodSketchName(currentProjectPath){
+    let foundOne = false;
+    let goodName = "mySketch";
 
     if (bUseMoniker){
 
-        var projectNames = new moniker.Dictionary();
-        var tmpPath = require('path');
-        projectNames.read(  tmpPath.join(__dirname, 'static', 'data', 'sketchAdjectives.txt'));
+        const projectNames = new moniker.Dictionary();
+        projectNames.read(  path.join(__dirname, 'static', 'data', 'sketchAdjectives.txt'));
         goodName = "mySketch";
 
         while (foundOne === false) {
-            if (fs.existsSync(tmpPath.join(currentProjectPath, goodName))) {
+            if (fs.existsSync(path.join(currentProjectPath, goodName))) {
                 console.log("«" + goodName + "» already exists, generating a new name...");
-                var adjective = projectNames.choose();
+                const adjective = projectNames.choose();
                 goodName = "my" + adjective.charAt(0).toUpperCase() + adjective.slice(1) + "Sketch";
             } else {
                 foundOne = true;
@@ -404,12 +405,12 @@ function getGoodSketchName(arg){
 
     } else {
 
-        var date = new Date();
-        var formattedDate = formatDate(date);
+        const date = new Date();
+        const formattedDate = formatDate(date);
         goodName = "sketch_" + formattedDate;
-        var count = 1;
+        let count = 1;
 
-         while (foundOne === false) {
+        while (foundOne === false) {
             if (fs.existsSync(path.join(currentProjectPath, goodName))) {
                 console.log("«" + goodName + "» already exists, generating a new name...");
                 goodName = "sketch_" + formattedDate + toLetters(count);
@@ -432,22 +433,21 @@ function getDirectories(srcpath, acceptedPrefix) {
     // that's why I am making temp ones here.
     // console.log(path);
 
-    var fsTemp = require('fs');
-    var pathTemp = require('path');
-
     try {
 
-        return fsTemp.readdirSync(srcpath).filter(function(file) {
+        return fs.readdirSync(srcpath).filter(function(file) {
 
             //console.log(srcpath);
             //console.log(file);
             try{
-                var joinedPath = pathTemp.join(srcpath, file);
-                if ((acceptedPrefix==null || file.substring(0,acceptedPrefix.length)==acceptedPrefix) && joinedPath !== null) {
+                const joinedPath = path.join(srcpath, file);
+                if ((acceptedPrefix == null || file.substring(0, acceptedPrefix.length) == acceptedPrefix) && joinedPath !== null) {
                     // only accept folders (potential addons)
-                    return fsTemp.statSync(joinedPath).isDirectory();
+                    return fs.statSync(joinedPath).isDirectory();
                 }
-            }catch(e){}
+            } catch(e) {
+
+            }
         });
     } catch (e) {
         console.log(e);
@@ -467,7 +467,7 @@ function getDirectories(srcpath, acceptedPrefix) {
 //       console.error(err);
 //       return cb([]);
 //     }
-//     var iterator = function (file, cb)  {
+//     const iterator = function (file, cb)  {
 //       fs.stat(path.join(srcpath, file), function (err, stats) {
 //         if(err) {
 //           console.error(err);
@@ -480,23 +480,21 @@ function getDirectories(srcpath, acceptedPrefix) {
 //   });
 // }
 
-ipc.on('isOFProjectFolder', function(event, project) {
-    var fsTemp = require('fs');
-    var pathTemp = require('path');
-    var folder;
-    folder = pathTemp.join(project['projectPath'], project['projectName']);
+ipcMain.on('isOFProjectFolder', function(event, project) {
+    let folder;
+    folder = path.join(project['projectPath'], project['projectName']);
 
     try {
 
-        var tmpFiles = fsTemp.readdirSync(folder);
+        const tmpFiles = fs.readdirSync(folder);
         if (!tmpFiles || tmpFiles.length <= 1) {
             return false;
         } // we need at least 2 files/folders within
 
         // todo: also check for config.make & addons.make ?
-        var foundSrcFolder = false;
-        var foundAddons = false;
-        var foundConfig = false;
+        let foundSrcFolder = false;
+        let foundAddons = false;
+        let foundConfig = false;
         tmpFiles.forEach(function(el, i) {
             if (el == 'src') {
                 foundSrcFolder = true;
@@ -513,9 +511,9 @@ ipc.on('isOFProjectFolder', function(event, project) {
             event.sender.send('setGenerateMode', 'updateMode');
 
             if (foundAddons) {
-                var projectAddons = fsTemp.readFileSync(pathTemp.resolve(folder, 'addons.make')).toString().split("\n");
+                let projectAddons = fs.readFileSync(path.resolve(folder, 'addons.make')).toString().split("\n");
 
-                projectAddons = projectAddons.filter(function(el) {
+                projectAddons = projectAddons.filter((el) => {
                     if (el === '' || el === 'addons') {
                         return false;
                     } // eleminates these items
@@ -525,9 +523,7 @@ ipc.on('isOFProjectFolder', function(event, project) {
                 });
 
                 // remove comments
-                projectAddons.forEach(function(element, index) {
-                    this[index] = this[index].split('#')[0];
-                  }, projectAddons);
+                projectAddons = projectAddons.map((element) => element.split('#')[0]);
 
                 // console.log('addons', projectAddons);
 
@@ -537,8 +533,8 @@ ipc.on('isOFProjectFolder', function(event, project) {
             }
             
             if(foundConfig){
-                var projectExtra = fsTemp.readFileSync(pathTemp.resolve(folder, 'config.make')).toString().split("\n");
-                projectExtra = projectExtra.filter(function(el) {
+                let projectExtra = fs.readFileSync(path.resolve(folder, 'config.make')).toString().split("\n");
+                projectExtra = projectExtra.filter((el) => {
                     if (el === '' || el[0] === '#') {
                         return false;
                     } // eleminates these items
@@ -549,26 +545,26 @@ ipc.on('isOFProjectFolder', function(event, project) {
                 });
                 
                 //read the valid lines
-                var extraSrcPathsCount = 0;
+                let extraSrcPathsCount = 0;
                 
-                projectExtra.forEach(function(el, i) {
+                projectExtra.forEach((el, i) => {
                     //remove spaces
-                    var line = el.replace(/ /g, '');
+                    const line = el.replace(/ /g, '');
                     
                     //split either on = or +=
-                    var splitter = "+=";
-                    var n = line.indexOf(splitter);
-                    var macro, value;
+                    let splitter = "+=";
+                    let n = line.indexOf(splitter);
+                    let macro, value;
                     
                     if( n != -1 ){
-                        var macro = line.substr(0, n);
-                        var value = line.substr(n + splitter.length);
-                    }else{
+                        macro = line.substring(0, n);
+                        value = line.substring(n + splitter.length);
+                    } else {
                         splitter = "=";
                         n = line.indexOf(splitter);
                         if( n != -1 ){
-                            macro = line.substr(0, n);
-                            value = line.substr(n + splitter.length);
+                            macro = line.substring(0, n);
+                            value = line.substring(n + splitter.length);
                         }
                     }
                     
@@ -592,7 +588,7 @@ ipc.on('isOFProjectFolder', function(event, project) {
 
         /*if (joinedPath != null){
 		  // only accept folders (potential addons)
-		  return fsTemp.statSync(joinedPath).isDirectory();
+		  return fs.statSync(joinedPath).isDirectory();
 		}*/
     } catch (e) { // error reading dir
         event.sender.send('setGenerateMode', 'createMode');
@@ -609,17 +605,17 @@ ipc.on('isOFProjectFolder', function(event, project) {
 
 //----------------------------------------------------------- ipc
 
-ipc.on('refreshAddonList', function(event, arg) {
+ipcMain.on('refreshAddonList', function(event, arg) {
     console.log("in refresh " + arg)
     parseAddonsAndUpdateSelect(arg);
 });
 
-ipc.on('refreshPlatformList', function(event, arg) {
+ipcMain.on('refreshPlatformList', function(event, arg) {
     parsePlatformsAndUpdateSelect(arg);
 });
 
 
-ipc.on('refreshTemplateList', function (event, arg) {
+ipcMain.on('refreshTemplateList', function (event, arg) {
     console.log("refreshTemplateList");
     let selectedPlatforms = arg.selectedPlatforms;
     let ofPath = arg.ofPath;
@@ -686,27 +682,39 @@ ipc.on('refreshTemplateList', function (event, arg) {
     mainWindow.webContents.send('enableTemplate', returnArg);
 });
 
-ipc.on('getRandomSketchName', function(event, arg) {
-    var goodName = getGoodSketchName(arg);
+ipcMain.on('getRandomSketchName', function(event, arg) {
+    const goodName = getGoodSketchName(arg);
     event.sender.send('setRandomisedSketchName', goodName);
     event.sender.send('setGenerateMode', 'createMode'); // it's a new sketch name, we are in create mode
 });
 
-ipc.on('update', function(event, arg) {
+function getPgPath() {
+    let pgApp = "";
+    if(hostplatform == "linux" || hostplatform == "linux64"){
+        pgApp = path.join(rootPath, "apps/projectGenerator/commandLine/bin/projectGenerator");
+        //pgApp = "projectGenerator";
+    } else {
+        pgApp = path.normalize(path.join(__dirname, "app", "projectGenerator"));
+    }
 
-    var update = arg;
-    var exec = require('child_process').exec;
-    var pathTemp = require('path');
+    if( hostplatform == 'osx' || hostplatform == 'linux' || hostplatform == 'linux64' ){
+        pgApp = pgApp.replace(/ /g, '\\ ');
+    } else {
+        pgApp = pgApp = "\"" + pgApp + "\"";
+    }
+    return pgApp;
+}
 
+ipcMain.on('update', function(event, update) {
     console.log(update);
 
-    var updatePath = "";
-    var pathString = "";
-    var platformString = "";
-    var templateString = "";
-    var recursiveString = "";
-    var verboseString = "";
-    var rootPath = defaultOfPath;
+    let updatePath = "";
+    let pathString = "";
+    let platformString = "";
+    let templateString = "";
+    let recursiveString = "";
+    let verboseString = "";
+    let rootPath = defaultOfPath;
 
     if (update['updatePath'] !== null) {
         updatePath = update['updatePath'];
@@ -734,21 +742,19 @@ ipc.on('update', function(event, arg) {
         verboseString = "-v";
     }
 
-    var pgApp = pathTemp.normalize(pathTemp.join(pathTemp.join(__dirname, "app"), "projectGenerator"));
+    const pgApp = getPgPath();
     
-    if( hostplatform == "linux" || hostplatform == "linux64" ){
-        pgApp = pathTemp.join(rootPath, "apps/projectGenerator/commandLine/bin/projectGenerator");
-    }
-
-    if( arg.platform == 'osx' || arg.platform == 'linux' || arg.platform == 'linux64' ){
-        pgApp = pgApp.replace(/ /g, '\\ ');
-    } else {
-        pgApp = "\"" + pgApp + "\"";
-    }
-
-    var wholeString = pgApp + " " + recursiveString + " " + verboseString + " " + pathString + " " + platformString + " " + templateString + " " + updatePath;
-
-    exec(wholeString, {maxBuffer : Infinity}, function callback(error, stdout, stderr) {
+    const wholeString = [
+        pgApp,
+        recursiveString,
+        verboseString,
+        pathString,
+        platformString,
+        templateString,
+        updatePath
+    ].join(" ");
+
+    exec(wholeString, { maxBuffer : Infinity }, function callback(error, stdout, stderr) {
 
         if (error === null) {
             event.sender.send('consoleMessage', "<strong>" + wholeString + "</strong><br>" + stdout);
@@ -777,24 +783,15 @@ ipc.on('update', function(event, arg) {
 
 });
 
-ipc.on('generate', function(event, arg) {
-
-
-    var generate = arg;
-
-    var exec = require('child_process').exec;
-
-
-    var pathTemp = require('path');
-
-    var projectString = "";
-    var pathString = "";
-    var addonString = "";
-    var platformString = "";
-    var templateString = "";
-    var verboseString = "";
-    var rootPath = defaultOfPath;
-    var sourceExtraString = "";
+ipcMain.on('generate', function(event, generate) {
+    let projectString = "";
+    let pathString = "";
+    let addonString = "";
+    let platformString = "";
+    let templateString = "";
+    let verboseString = "";
+    let rootPath = defaultOfPath;
+    let sourceExtraString = "";
 
     if (generate['platformList'] !== null) {
         platformString = "-p\"" + generate['platformList'].join(",") + "\"";
@@ -826,31 +823,25 @@ ipc.on('generate', function(event, arg) {
 
     if (generate.projectName !== null &&
         generate.projectPath !== null) {
-        projectString = "\"" + pathTemp.join(generate['projectPath'], generate['projectName']) + "\"";
-    }
-
-    var pgApp="";
-    if(hostplatform == "linux" || hostplatform == "linux64"){
-        pgApp = pathTemp.join(rootPath, "apps/projectGenerator/commandLine/bin/projectGenerator");
-        //pgApp = "projectGenerator";
-    }else{
-        pgApp = pathTemp.normalize(pathTemp.join(pathTemp.join(__dirname, "app"), "projectGenerator"));
+        projectString = "\"" + path.join(generate['projectPath'], generate['projectName']) + "\"";
     }
 
-    if( arg.platform == 'osx' || arg.platform == 'linux' || arg.platform == 'linux64' ){
-        pgApp = pgApp.replace(/ /g, '\\ ');
-    } else {
-        pgApp = pgApp = "\"" + pgApp + "\"";
-    }
-
-    var wholeString = pgApp + " " + verboseString + " " + pathString + " " + addonString + " " + platformString + sourceExtraString + " " + templateString + " " + projectString;
-
-    exec(wholeString, {maxBuffer : Infinity}, function callback(error, stdout, stderr) {
-
-        var wasError = false;
-        var text = stdout; //Big text with many line breaks
-        var lines = text.split(os.EOL); //Will return an array of lines on every OS node works
-        for (var i = 0; i < lines.length; i++) {
+    const pgApp = getPgPath();
+    const wholeString = [
+        pgApp,
+        verboseString,
+        pathString,
+        addonString,
+        platformString + sourceExtraString,
+        templateString,
+        projectString
+    ].join(' ');
+
+    exec(wholeString, { maxBuffer : Infinity }, function callback(error, stdout, stderr) {
+        let wasError = false;
+        const text = stdout; //Big text with many line breaks
+        const lines = text.split(os.EOL); //Will return an array of lines on every OS node works
+        for (let i = 0; i < lines.length; i++) {
             if (lines[i].indexOf("Result:") > -1) {
                 if (lines[i].indexOf("error") > -1) {
                     wasError = true;
@@ -861,7 +852,7 @@ ipc.on('generate', function(event, arg) {
         // wasError = did the PG spit out an error (like a bad path, etc)
         // error = did node have an error running this command line app
 
-        var fullPath = pathTemp.join(generate['projectPath'], generate['projectName']);
+        const fullPath = path.join(generate['projectPath'], generate['projectName']);
         if (error === null && wasError === false) {
             event.sender.send('consoleMessage', "<strong>" + wholeString + "</strong><br>" + stdout);
             event.sender.send('sendUIMessage',
@@ -901,62 +892,62 @@ ipc.on('generate', function(event, arg) {
     //console.log(arg);
 });
 
-ipc.on('pickOfPath', function(event, arg) {
-
-    path = dialog.showOpenDialog({
+ipcMain.on('pickOfPath', function(event, arg) {
+    dialog.showOpenDialog({
         title: 'select the root of OF, where you see libs, addons, etc',
         properties: ['openDirectory'],
         filters: [],
         defaultPath: arg
-    }, function(filenames) {
-        if (filenames !== undefined && filenames.length > 0) {
-            defaultOfPath = filenames[0];
-            event.sender.send('setOfPath', filenames[0]);
+    }).then(function(filenames) {
+        if (filenames !== undefined && filenames.filePaths.length > 0) {
+            defaultOfPath = filenames.filePaths[0];
+            console.log('setOfPath: ', defaultOfPath);
+            event.sender.send('setOfPath', defaultOfPath);
         }
     });
 });
 
-ipc.on('pickUpdatePath', function(event, arg) {
-    path = dialog.showOpenDialog({
+ipcMain.on('pickUpdatePath', function(event, arg) {
+    dialog.showOpenDialog({
         title: 'select root folder where you want to update',
         properties: ['openDirectory'],
         filters: [],
         defaultPath: arg
-    }, function(filenames) {
-        if (filenames !== undefined && filenames.length > 0) {
-            defaultOfPath = filenames[0];
-            event.sender.send('setUpdatePath', filenames[0]);
+    }).then(function(filenames) {
+        if (filenames !== undefined && filenames.filePaths.length > 0) {
+            // defaultOfPath = filenames.filePaths[0]; // TODO: IS THIS CORRECT?
+            event.sender.send('setUpdatePath', filenames.filePaths[0]);
         }
     });
 });
 
-ipc.on('pickProjectPath', function(event, arg) {
-    path = dialog.showOpenDialog({
+ipcMain.on('pickProjectPath', function(event, arg) {
+    dialog.showOpenDialog({
         title: 'select parent folder for project, typically apps/myApps',
         properties: ['openDirectory'],
         filters: [],
         defaultPath: arg
-    }, function(filenames) {
-        if (filenames !== undefined && filenames.length > 0) {
-            event.sender.send('setProjectPath', filenames[0]);
+    }).then(function(filenames) {
+        if (filenames !== undefined && filenames.filePaths.length > 0) {
+            event.sender.send('setProjectPath', filenames.filePaths[0]);
         }
     });
 });
 
-ipc.on('pickSourcePath', function(event, arg, index) {
-    path = dialog.showOpenDialog({
+ipcMain.on('pickSourcePath', function(event, arg, index) {
+    dialog.showOpenDialog({
         title: 'select extra source or include folder paths to add to project',
         properties: ['openDirectory'],
         filters: [],
         defaultPath: arg
-    }, function(filenames) {
-        if (filenames !== undefined && filenames.length > 0) {
-            event.sender.send('setSourceExtraPath', filenames[0], index);
+    }).then(function(filenames) {
+        if (filenames !== undefined && filenames.filePaths.length > 0) {
+            event.sender.send('setSourceExtraPath', [filenames.filePaths[0], index]);
         }
     });
 });
 
-ipc.on('checkMultiUpdatePath', function(event, arg) {
+ipcMain.on('checkMultiUpdatePath', function(event, arg) {
 
 
     if (fs.existsSync(arg)) {
@@ -967,25 +958,25 @@ ipc.on('checkMultiUpdatePath', function(event, arg) {
 
 });
 
-var dialogIsOpen = false;
-ipc.on('pickProjectImport', function(event, arg) {
+let dialogIsOpen = false;
+ipcMain.on('pickProjectImport', function(event, arg) {
     if(dialogIsOpen){
         return;
     }
 
     dialogIsOpen = true;
-    path = dialog.showOpenDialog({
+    dialog.showOpenDialog({
         title: 'Select the folder of your project, typically apps/myApps/myGeniusApp',
         properties: ['openDirectory'],
         filters: [],
         defaultPath: arg
-    }, function(filenames) {
-        if (filenames != null) {
+    }).then(function(filenames) {
+        if (filenames != null && filenames.filePaths.length > 0) {
             // gather project information
-            var tmpPath = require('path');
-            var projectSettings = {};
-            projectSettings['projectName'] = tmpPath.basename(filenames[0]);
-            projectSettings['projectPath'] = tmpPath.dirname(filenames[0]);
+            const projectSettings = {
+                'projectName': path.basename(filenames.filePaths[0]),
+                'projectPath': path.dirname(filenames.filePaths[0])
+            };
             event.sender.send('importProjectSettings', projectSettings);
         }
         dialogIsOpen = false;
@@ -993,13 +984,10 @@ ipc.on('pickProjectImport', function(event, arg) {
 });
 
 
-ipc.on('launchProjectinIDE', function(event, arg) {
+ipcMain.on('launchProjectinIDE', function(event, arg) {
+    const fullPath = path.join(arg['projectPath'], arg['projectName']);
 
-    var pathTemp = require('path');
-    var fsTemp = require('fs');
-    var fullPath = pathTemp.join(arg['projectPath'], arg['projectName']);
-
-    if( fsTemp.statSync(fullPath).isDirectory() == false ){
+    if( fs.statSync(fullPath).isDirectory() == false ){
         // project doesn't exist
         event.sender.send('projectLaunchCompleted', false );
         return;
@@ -1008,7 +996,7 @@ ipc.on('launchProjectinIDE', function(event, arg) {
     // // launch xcode
     if( arg.platform == 'osx' ){
         if(hostplatform == 'osx'){
-            var osxPath = pathTemp.join(fullPath, arg['projectName'] + '.xcodeproj');
+            let osxPath = path.join(fullPath, arg['projectName'] + '.xcodeproj');
             console.log( osxPath );
             osxPath = "\"" + osxPath + "\"";
 
@@ -1018,7 +1006,7 @@ ipc.on('launchProjectinIDE', function(event, arg) {
         }
     } else if( arg.platform == 'linux' || arg.platform == 'linux64' ){
         if(hostplatform == 'linux'){
-            var linuxPath = pathTemp.join(fullPath, arg['projectName'] + '.qbs');
+            let linuxPath = path.join(fullPath, arg['projectName'] + '.qbs');
             linuxPath = linuxPath.replace(/ /g, '\\ ');
             console.log( linuxPath );
             exec('xdg-open ' + linuxPath, function callback(error, stdout, stderr){
@@ -1036,7 +1024,7 @@ ipc.on('launchProjectinIDE', function(event, arg) {
             }
         });
     } else if( hostplatform == 'windows'){
-        var windowsPath = pathTemp.join(fullPath, arg['projectName'] + '.sln');
+        let windowsPath = path.join(fullPath, arg['projectName'] + '.sln');
         console.log( windowsPath );
         windowsPath = "\"" + windowsPath + "\"";
         exec('start ' + "\"\"" + " " + windowsPath, function callback(error, stdout, stderr){
@@ -1045,6 +1033,28 @@ ipc.on('launchProjectinIDE', function(event, arg) {
     }
 });
 
-ipc.on('quit', function(event, arg) {
+ipcMain.on('quit', function(event, arg) {
     app.quit();
 });
+
+ipcMain.on('saveDefaultSettings', function(event, defaultSettings) {
+    fs.writeFile(path.resolve(__dirname, 'settings.json'), defaultSettings, function(err) {
+        if (err) {
+            event.returnValue = "Unable to save defaultSettings to settings.json... (Error=" + err.code + ")";
+        } else {
+            event.returnValue = "Updated default settings for the PG. (written to settings.json)";
+        }
+    });
+});
+
+ipcMain.on('path', (event, [ key, args ]) => {
+    console.log('path', key, args);
+    event.returnValue = path[key](... args);
+    return;
+});
+
+ipcMain.on('fs', (event, [ key, args ]) => {
+    console.log('fs', key, args);
+    event.returnValue = fs[key](... args);
+    return;
+});
\ No newline at end of file
diff --git a/frontend/npm-shrinkwrap.json b/frontend/npm-shrinkwrap.json
index 9a40b7ca..b2dc01c7 100644
--- a/frontend/npm-shrinkwrap.json
+++ b/frontend/npm-shrinkwrap.json
@@ -9,723 +9,775 @@
       "version": "0.0.1",
       "license": "MIT",
       "dependencies": {
-        "electron-debug": "^0.1.1",
         "moniker": "^0.1.2",
-        "n-readlines": "^1.0.0",
-        "walk": "^2.3.9"
+        "n-readlines": "^1.0.0"
       },
       "devDependencies": {
-        "electron-packager": "^12.1.0",
-        "electron-prebuilt": "^0.37.8"
+        "electron": "^24.1.2",
+        "electron-packager": "^17.1.1"
       },
       "engines": {
         "node": ">=6.11.0"
       }
     },
-    "node_modules/abbrev": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
-      "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
-      "dev": true
-    },
-    "node_modules/ajv": {
-      "version": "6.12.6",
-      "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
-      "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+    "node_modules/@electron/asar": {
+      "version": "3.2.4",
+      "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.2.4.tgz",
+      "integrity": "sha512-lykfY3TJRRWFeTxccEKdf1I6BLl2Plw81H0bbp4Fc5iEc67foDCa5pjJQULVgo0wF+Dli75f3xVcdb/67FFZ/g==",
       "dev": true,
       "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"
+        "chromium-pickle-js": "^0.2.0",
+        "commander": "^5.0.0",
+        "glob": "^7.1.6",
+        "minimatch": "^3.0.4"
+      },
+      "bin": {
+        "asar": "bin/asar.js"
       },
-      "funding": {
-        "type": "github",
-        "url": "https://github.com/sponsors/epoberezkin"
-      }
-    },
-    "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==",
-      "dev": true,
       "engines": {
-        "node": ">=0.10.0"
+        "node": ">=10.12.0"
       }
     },
-    "node_modules/array-find-index": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz",
-      "integrity": "sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==",
+    "node_modules/@electron/get": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/@electron/get/-/get-2.0.2.tgz",
+      "integrity": "sha512-eFZVFoRXb3GFGd7Ak7W4+6jBl9wBtiZ4AaYOse97ej6mKj5tkyO0dUnUChs1IhJZtx1BENo4/p4WUTXpi6vT+g==",
       "dev": true,
+      "dependencies": {
+        "debug": "^4.1.1",
+        "env-paths": "^2.2.0",
+        "fs-extra": "^8.1.0",
+        "got": "^11.8.5",
+        "progress": "^2.0.3",
+        "semver": "^6.2.0",
+        "sumchecker": "^3.0.1"
+      },
       "engines": {
-        "node": ">=0.10.0"
+        "node": ">=12"
+      },
+      "optionalDependencies": {
+        "global-agent": "^3.0.0"
       }
     },
-    "node_modules/asar": {
-      "version": "0.14.6",
-      "resolved": "https://registry.npmjs.org/asar/-/asar-0.14.6.tgz",
-      "integrity": "sha512-ZqybKcdO5At6y3ge2RHxVImc6Eltb2t3sxT7lk4T4zjZBSFUuIGCIZY6f41dCjlvJSizN5QPRr8YTgMhpgBjLg==",
-      "deprecated": "Please use @electron/asar moving forward.  There is no API change, just a package name change",
+    "node_modules/@electron/get/node_modules/debug": {
+      "version": "4.3.4",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+      "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
       "dev": true,
       "dependencies": {
-        "chromium-pickle-js": "^0.2.0",
-        "commander": "^2.9.0",
-        "cuint": "^0.2.1",
-        "glob": "^6.0.4",
-        "minimatch": "^3.0.3",
-        "mkdirp": "^0.5.0",
-        "mksnapshot": "^0.3.4",
-        "tmp": "0.0.28"
-      },
-      "bin": {
-        "asar": "bin/asar.js"
+        "ms": "2.1.2"
       },
       "engines": {
-        "node": ">=4.6"
+        "node": ">=6.0"
+      },
+      "peerDependenciesMeta": {
+        "supports-color": {
+          "optional": true
+        }
       }
     },
-    "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==",
+    "node_modules/@electron/get/node_modules/fs-extra": {
+      "version": "8.1.0",
+      "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
+      "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
       "dev": true,
       "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==",
-      "dev": true,
+        "graceful-fs": "^4.2.0",
+        "jsonfile": "^4.0.0",
+        "universalify": "^0.1.0"
+      },
       "engines": {
-        "node": ">=0.8"
+        "node": ">=6 <7 || >=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/@electron/get/node_modules/ms": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
       "dev": true
     },
-    "node_modules/author-regex": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/author-regex/-/author-regex-1.0.0.tgz",
-      "integrity": "sha512-KbWgR8wOYRAPekEmMXrYYdc7BRyhn2Ftk7KWfMUnQ43hFdojWEFRxhhRUm3/OFEdPa1r0KAvTTg9YQK57xTe0g==",
+    "node_modules/@electron/get/node_modules/semver": {
+      "version": "6.3.0",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+      "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
       "dev": true,
-      "engines": {
-        "node": ">=0.8"
+      "bin": {
+        "semver": "bin/semver.js"
       }
     },
-    "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==",
+    "node_modules/@electron/notarize": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npmjs.org/@electron/notarize/-/notarize-1.2.3.tgz",
+      "integrity": "sha512-9oRzT56rKh5bspk3KpAVF8lPKHYQrBnRwcgiOeR0hdilVEQmszDaAu0IPCPrwwzJN0ugNs0rRboTreHMt/6mBQ==",
       "dev": true,
+      "dependencies": {
+        "debug": "^4.1.1",
+        "fs-extra": "^9.0.1"
+      },
       "engines": {
-        "node": "*"
+        "node": ">= 10.0.0"
       }
     },
-    "node_modules/aws4": {
-      "version": "1.12.0",
-      "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz",
-      "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==",
-      "dev": true
-    },
-    "node_modules/balanced-match": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
-      "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
-      "dev": true
-    },
-    "node_modules/base64-js": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.0.tgz",
-      "integrity": "sha512-hURVuTTGLOppKhjSe9lZy4NCjnvaIAF/juwazv4WtHwsk5rxKrU1WbxN+XtwKDSvkrNbIIaTBQd9wUsSwruZUg==",
-      "dev": true
-    },
-    "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==",
+    "node_modules/@electron/notarize/node_modules/debug": {
+      "version": "4.3.4",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+      "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
       "dev": true,
       "dependencies": {
-        "tweetnacl": "^0.14.3"
+        "ms": "2.1.2"
+      },
+      "engines": {
+        "node": ">=6.0"
+      },
+      "peerDependenciesMeta": {
+        "supports-color": {
+          "optional": true
+        }
       }
     },
-    "node_modules/binary": {
-      "version": "0.3.0",
-      "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz",
-      "integrity": "sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==",
+    "node_modules/@electron/notarize/node_modules/fs-extra": {
+      "version": "9.1.0",
+      "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
+      "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
       "dev": true,
       "dependencies": {
-        "buffers": "~0.1.1",
-        "chainsaw": "~0.1.0"
+        "at-least-node": "^1.0.0",
+        "graceful-fs": "^4.2.0",
+        "jsonfile": "^6.0.1",
+        "universalify": "^2.0.0"
       },
       "engines": {
-        "node": "*"
+        "node": ">=10"
       }
     },
-    "node_modules/bluebird": {
-      "version": "3.7.2",
-      "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
-      "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==",
+    "node_modules/@electron/notarize/node_modules/jsonfile": {
+      "version": "6.1.0",
+      "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
+      "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
+      "dev": true,
+      "dependencies": {
+        "universalify": "^2.0.0"
+      },
+      "optionalDependencies": {
+        "graceful-fs": "^4.1.6"
+      }
+    },
+    "node_modules/@electron/notarize/node_modules/ms": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
       "dev": true
     },
-    "node_modules/brace-expansion": {
-      "version": "1.1.11",
-      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
-      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+    "node_modules/@electron/notarize/node_modules/universalify": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
+      "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==",
       "dev": true,
-      "dependencies": {
-        "balanced-match": "^1.0.0",
-        "concat-map": "0.0.1"
+      "engines": {
+        "node": ">= 10.0.0"
       }
     },
-    "node_modules/buffer-alloc": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz",
-      "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==",
+    "node_modules/@electron/osx-sign": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/@electron/osx-sign/-/osx-sign-1.0.4.tgz",
+      "integrity": "sha512-xfhdEcIOfAZg7scZ9RQPya1G1lWo8/zMCwUXAulq0SfY7ONIW+b9qGyKdMyuMctNYwllrIS+vmxfijSfjeh97g==",
       "dev": true,
       "dependencies": {
-        "buffer-alloc-unsafe": "^1.1.0",
-        "buffer-fill": "^1.0.0"
+        "compare-version": "^0.1.2",
+        "debug": "^4.3.4",
+        "fs-extra": "^10.0.0",
+        "isbinaryfile": "^4.0.8",
+        "minimist": "^1.2.6",
+        "plist": "^3.0.5"
+      },
+      "bin": {
+        "electron-osx-flat": "bin/electron-osx-flat.js",
+        "electron-osx-sign": "bin/electron-osx-sign.js"
+      },
+      "engines": {
+        "node": ">=12.0.0"
       }
     },
-    "node_modules/buffer-alloc-unsafe": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz",
-      "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==",
-      "dev": true
-    },
-    "node_modules/buffer-crc32": {
-      "version": "0.2.13",
-      "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
-      "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==",
+    "node_modules/@electron/osx-sign/node_modules/debug": {
+      "version": "4.3.4",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+      "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
       "dev": true,
+      "dependencies": {
+        "ms": "2.1.2"
+      },
       "engines": {
-        "node": "*"
+        "node": ">=6.0"
+      },
+      "peerDependenciesMeta": {
+        "supports-color": {
+          "optional": true
+        }
       }
     },
-    "node_modules/buffer-fill": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz",
-      "integrity": "sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==",
-      "dev": true
-    },
-    "node_modules/buffer-from": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
-      "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
+    "node_modules/@electron/osx-sign/node_modules/ms": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
       "dev": true
     },
-    "node_modules/buffers": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz",
-      "integrity": "sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==",
+    "node_modules/@electron/universal": {
+      "version": "1.3.4",
+      "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-1.3.4.tgz",
+      "integrity": "sha512-BdhBgm2ZBnYyYRLRgOjM5VHkyFItsbggJ0MHycOjKWdFGYwK97ZFXH54dTvUWEfha81vfvwr5On6XBjt99uDcg==",
       "dev": true,
+      "dependencies": {
+        "@electron/asar": "^3.2.1",
+        "@malept/cross-spawn-promise": "^1.1.0",
+        "debug": "^4.3.1",
+        "dir-compare": "^3.0.0",
+        "fs-extra": "^9.0.1",
+        "minimatch": "^3.0.4",
+        "plist": "^3.0.4"
+      },
       "engines": {
-        "node": ">=0.2.0"
+        "node": ">=8.6"
       }
     },
-    "node_modules/camelcase": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
-      "integrity": "sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==",
+    "node_modules/@electron/universal/node_modules/debug": {
+      "version": "4.3.4",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+      "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
       "dev": true,
+      "dependencies": {
+        "ms": "2.1.2"
+      },
       "engines": {
-        "node": ">=4"
+        "node": ">=6.0"
+      },
+      "peerDependenciesMeta": {
+        "supports-color": {
+          "optional": true
+        }
       }
     },
-    "node_modules/camelcase-keys": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz",
-      "integrity": "sha512-bA/Z/DERHKqoEOrp+qeGKw1QlvEQkGZSc0XaY6VnTxZr+Kv1G5zFwttpjv8qxZ/sBPT4nthwZaAcsAZTJlSKXQ==",
+    "node_modules/@electron/universal/node_modules/fs-extra": {
+      "version": "9.1.0",
+      "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
+      "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
       "dev": true,
       "dependencies": {
-        "camelcase": "^2.0.0",
-        "map-obj": "^1.0.0"
+        "at-least-node": "^1.0.0",
+        "graceful-fs": "^4.2.0",
+        "jsonfile": "^6.0.1",
+        "universalify": "^2.0.0"
       },
       "engines": {
-        "node": ">=0.10.0"
+        "node": ">=10"
       }
     },
-    "node_modules/camelcase-keys/node_modules/camelcase": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz",
-      "integrity": "sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw==",
+    "node_modules/@electron/universal/node_modules/jsonfile": {
+      "version": "6.1.0",
+      "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
+      "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
       "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
+      "dependencies": {
+        "universalify": "^2.0.0"
+      },
+      "optionalDependencies": {
+        "graceful-fs": "^4.1.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/@electron/universal/node_modules/ms": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
       "dev": true
     },
-    "node_modules/chainsaw": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz",
-      "integrity": "sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==",
+    "node_modules/@electron/universal/node_modules/universalify": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
+      "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==",
+      "dev": true,
+      "engines": {
+        "node": ">= 10.0.0"
+      }
+    },
+    "node_modules/@malept/cross-spawn-promise": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz",
+      "integrity": "sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ==",
       "dev": true,
+      "funding": [
+        {
+          "type": "individual",
+          "url": "https://github.com/sponsors/malept"
+        },
+        {
+          "type": "tidelift",
+          "url": "https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund"
+        }
+      ],
       "dependencies": {
-        "traverse": ">=0.3.0 <0.4"
+        "cross-spawn": "^7.0.1"
       },
       "engines": {
-        "node": "*"
+        "node": ">= 10"
       }
     },
-    "node_modules/chromium-pickle-js": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz",
-      "integrity": "sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw==",
-      "dev": true
-    },
-    "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==",
+    "node_modules/@sindresorhus/is": {
+      "version": "4.6.0",
+      "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz",
+      "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==",
       "dev": true,
       "engines": {
-        "node": ">=0.10.0"
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sindresorhus/is?sponsor=1"
       }
     },
-    "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==",
+    "node_modules/@szmarczak/http-timer": {
+      "version": "4.0.6",
+      "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz",
+      "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==",
       "dev": true,
       "dependencies": {
-        "delayed-stream": "~1.0.0"
+        "defer-to-connect": "^2.0.0"
       },
       "engines": {
-        "node": ">= 0.8"
+        "node": ">=10"
       }
     },
-    "node_modules/commander": {
-      "version": "2.20.3",
-      "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
-      "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
-      "dev": true
-    },
-    "node_modules/compare-version": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/compare-version/-/compare-version-0.1.2.tgz",
-      "integrity": "sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A==",
+    "node_modules/@types/cacheable-request": {
+      "version": "6.0.3",
+      "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz",
+      "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==",
       "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
+      "dependencies": {
+        "@types/http-cache-semantics": "*",
+        "@types/keyv": "^3.1.4",
+        "@types/node": "*",
+        "@types/responselike": "^1.0.0"
       }
     },
-    "node_modules/concat-map": {
-      "version": "0.0.1",
-      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
-      "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+    "node_modules/@types/http-cache-semantics": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz",
+      "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==",
       "dev": true
     },
-    "node_modules/concat-stream": {
-      "version": "1.6.2",
-      "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
-      "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
+    "node_modules/@types/keyv": {
+      "version": "3.1.4",
+      "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz",
+      "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==",
       "dev": true,
-      "engines": [
-        "node >= 0.8"
-      ],
       "dependencies": {
-        "buffer-from": "^1.0.0",
-        "inherits": "^2.0.3",
-        "readable-stream": "^2.2.2",
-        "typedarray": "^0.0.6"
+        "@types/node": "*"
       }
     },
-    "node_modules/core-util-is": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
-      "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
-      "dev": true
-    },
-    "node_modules/cuint": {
-      "version": "0.2.2",
-      "resolved": "https://registry.npmjs.org/cuint/-/cuint-0.2.2.tgz",
-      "integrity": "sha512-d4ZVpCW31eWwCMe1YT3ur7mUDnTXbgwyzaL320DrcRT45rfjYxkt5QWLrmOJ+/UEAI2+fQgKe/fCjR8l4TpRgw==",
+    "node_modules/@types/node": {
+      "version": "18.16.0",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-18.16.0.tgz",
+      "integrity": "sha512-BsAaKhB+7X+H4GnSjGhJG9Qi8Tw+inU9nJDwmD5CgOmBLEI6ArdhikpLX7DjbjDRDTbqZzU2LSQNZg8WGPiSZQ==",
       "dev": true
     },
-    "node_modules/currently-unhandled": {
-      "version": "0.4.1",
-      "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz",
-      "integrity": "sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng==",
+    "node_modules/@types/responselike": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz",
+      "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==",
       "dev": true,
       "dependencies": {
-        "array-find-index": "^1.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
+        "@types/node": "*"
       }
     },
-    "node_modules/dashdash": {
-      "version": "1.14.1",
-      "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
-      "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==",
+    "node_modules/@types/yauzl": {
+      "version": "2.10.0",
+      "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz",
+      "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==",
       "dev": true,
+      "optional": true,
       "dependencies": {
-        "assert-plus": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10"
+        "@types/node": "*"
       }
     },
-    "node_modules/debug": {
-      "version": "3.2.7",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
-      "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+    "node_modules/at-least-node": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz",
+      "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==",
       "dev": true,
-      "dependencies": {
-        "ms": "^2.1.1"
+      "engines": {
+        "node": ">= 4.0.0"
       }
     },
-    "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==",
+    "node_modules/author-regex": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/author-regex/-/author-regex-1.0.0.tgz",
+      "integrity": "sha512-KbWgR8wOYRAPekEmMXrYYdc7BRyhn2Ftk7KWfMUnQ43hFdojWEFRxhhRUm3/OFEdPa1r0KAvTTg9YQK57xTe0g==",
       "dev": true,
       "engines": {
-        "node": ">=0.10.0"
+        "node": ">=0.8"
       }
     },
-    "node_modules/decompress-zip": {
-      "version": "0.3.3",
-      "resolved": "https://registry.npmjs.org/decompress-zip/-/decompress-zip-0.3.3.tgz",
-      "integrity": "sha512-/fy1L4s+4jujqj3kNptWjilFw3E6De8U6XUFvqmh4npN3Vsypm3oT2V0bXcmbBWS+5j5tr4okYaFrOmyZkszEg==",
+    "node_modules/balanced-match": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+      "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+      "dev": true
+    },
+    "node_modules/base64-js": {
+      "version": "1.5.1",
+      "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
+      "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
       "dev": true,
-      "dependencies": {
-        "binary": "^0.3.0",
-        "graceful-fs": "^4.1.3",
-        "mkpath": "^0.1.0",
-        "nopt": "^3.0.1",
-        "q": "^1.1.2",
-        "readable-stream": "^1.1.8",
-        "touch": "0.0.3"
-      },
-      "bin": {
-        "decompress-zip": "bin/decompress-zip"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
+      "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/decompress-zip/node_modules/isarray": {
-      "version": "0.0.1",
-      "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
-      "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==",
+    "node_modules/bluebird": {
+      "version": "3.7.2",
+      "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
+      "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==",
       "dev": true
     },
-    "node_modules/decompress-zip/node_modules/readable-stream": {
-      "version": "1.1.14",
-      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
-      "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==",
+    "node_modules/boolean": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz",
+      "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==",
+      "dev": true,
+      "optional": true
+    },
+    "node_modules/brace-expansion": {
+      "version": "1.1.11",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
       "dev": true,
       "dependencies": {
-        "core-util-is": "~1.0.0",
-        "inherits": "~2.0.1",
-        "isarray": "0.0.1",
-        "string_decoder": "~0.10.x"
+        "balanced-match": "^1.0.0",
+        "concat-map": "0.0.1"
       }
     },
-    "node_modules/decompress-zip/node_modules/string_decoder": {
-      "version": "0.10.31",
-      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
-      "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==",
-      "dev": true
-    },
-    "node_modules/deep-extend": {
-      "version": "0.6.0",
-      "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
-      "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
+    "node_modules/buffer-crc32": {
+      "version": "0.2.13",
+      "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
+      "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==",
       "dev": true,
       "engines": {
-        "node": ">=4.0.0"
+        "node": "*"
       }
     },
-    "node_modules/delayed-stream": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
-      "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+    "node_modules/buffer-equal": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.1.tgz",
+      "integrity": "sha512-QoV3ptgEaQpvVwbXdSO39iqPQTCxSF7A5U99AxbHYqUdCizL/lH2Z0A2y6nbZucxMEOtNyZfG2s6gsVugGpKkg==",
       "dev": true,
       "engines": {
-        "node": ">=0.4.0"
+        "node": ">=0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
       }
     },
-    "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==",
+    "node_modules/cacheable-lookup": {
+      "version": "5.0.4",
+      "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz",
+      "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==",
       "dev": true,
-      "dependencies": {
-        "jsbn": "~0.1.0",
-        "safer-buffer": "^2.1.0"
+      "engines": {
+        "node": ">=10.6.0"
       }
     },
-    "node_modules/electron-debug": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/electron-debug/-/electron-debug-0.1.1.tgz",
-      "integrity": "sha512-Fu5sTlb8Y9fbeu8NFLzTbL24jSIm9dOZDv/c4n1gk5TQTAezAJY2D37vW+k+ltqiVaqGIBZG1nkJBUgU1CZVtw==",
+    "node_modules/cacheable-request": {
+      "version": "7.0.2",
+      "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz",
+      "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==",
+      "dev": true,
+      "dependencies": {
+        "clone-response": "^1.0.2",
+        "get-stream": "^5.1.0",
+        "http-cache-semantics": "^4.0.0",
+        "keyv": "^4.0.0",
+        "lowercase-keys": "^2.0.0",
+        "normalize-url": "^6.0.1",
+        "responselike": "^2.0.0"
+      },
       "engines": {
-        "node": ">=0.12.0"
+        "node": ">=8"
       }
     },
-    "node_modules/electron-download": {
-      "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/electron-download/-/electron-download-4.1.1.tgz",
-      "integrity": "sha512-FjEWG9Jb/ppK/2zToP+U5dds114fM1ZOJqMAR4aXXL5CvyPE9fiqBK/9YcwC9poIFQTEJk/EM/zyRwziziRZrg==",
-      "deprecated": "Please use @electron/get moving forward.",
+    "node_modules/chromium-pickle-js": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz",
+      "integrity": "sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw==",
+      "dev": true
+    },
+    "node_modules/clone-response": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz",
+      "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==",
       "dev": true,
       "dependencies": {
-        "debug": "^3.0.0",
-        "env-paths": "^1.0.0",
-        "fs-extra": "^4.0.1",
-        "minimist": "^1.2.0",
-        "nugget": "^2.0.1",
-        "path-exists": "^3.0.0",
-        "rc": "^1.2.1",
-        "semver": "^5.4.1",
-        "sumchecker": "^2.0.2"
-      },
-      "bin": {
-        "electron-download": "lib/cli.js"
+        "mimic-response": "^1.0.0"
       },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/commander": {
+      "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz",
+      "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==",
+      "dev": true,
       "engines": {
-        "node": ">= 4.0"
+        "node": ">= 6"
       }
     },
-    "node_modules/electron-download/node_modules/fs-extra": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz",
-      "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==",
+    "node_modules/compare-version": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/compare-version/-/compare-version-0.1.2.tgz",
+      "integrity": "sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A==",
       "dev": true,
-      "dependencies": {
-        "graceful-fs": "^4.1.2",
-        "jsonfile": "^4.0.0",
-        "universalify": "^0.1.0"
+      "engines": {
+        "node": ">=0.10.0"
       }
     },
-    "node_modules/electron-osx-sign": {
-      "version": "0.4.17",
-      "resolved": "https://registry.npmjs.org/electron-osx-sign/-/electron-osx-sign-0.4.17.tgz",
-      "integrity": "sha512-wUJPmZJQCs1zgdlQgeIpRcvrf7M5/COQaOV68Va1J/SgmWx5KL2otgg+fAae7luw6qz9R8Gvu/Qpe9tAOu/3xQ==",
-      "deprecated": "Please use @electron/osx-sign moving forward. Be aware the API is slightly different",
+    "node_modules/concat-map": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+      "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+      "dev": true
+    },
+    "node_modules/cross-spawn": {
+      "version": "7.0.3",
+      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+      "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
       "dev": true,
       "dependencies": {
-        "bluebird": "^3.5.0",
-        "compare-version": "^0.1.2",
-        "debug": "^2.6.8",
-        "isbinaryfile": "^3.0.2",
-        "minimist": "^1.2.0",
-        "plist": "^3.0.1"
-      },
-      "bin": {
-        "electron-osx-flat": "bin/electron-osx-flat.js",
-        "electron-osx-sign": "bin/electron-osx-sign.js"
+        "path-key": "^3.1.0",
+        "shebang-command": "^2.0.0",
+        "which": "^2.0.1"
       },
       "engines": {
-        "node": ">=4.0.0"
+        "node": ">= 8"
       }
     },
-    "node_modules/electron-osx-sign/node_modules/base64-js": {
-      "version": "1.5.1",
-      "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
-      "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
+    "node_modules/cross-spawn-windows-exe": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/cross-spawn-windows-exe/-/cross-spawn-windows-exe-1.2.0.tgz",
+      "integrity": "sha512-mkLtJJcYbDCxEG7Js6eUnUNndWjyUZwJ3H7bErmmtOYU/Zb99DyUkpamuIZE0b3bhmJyZ7D90uS6f+CGxRRjOw==",
       "dev": true,
       "funding": [
         {
-          "type": "github",
-          "url": "https://github.com/sponsors/feross"
-        },
-        {
-          "type": "patreon",
-          "url": "https://www.patreon.com/feross"
+          "type": "individual",
+          "url": "https://github.com/sponsors/malept"
         },
         {
-          "type": "consulting",
-          "url": "https://feross.org/support"
+          "type": "tidelift",
+          "url": "https://tidelift.com/subscription/pkg/npm-cross-spawn-windows-exe?utm_medium=referral&utm_source=npm_fund"
         }
-      ]
+      ],
+      "dependencies": {
+        "@malept/cross-spawn-promise": "^1.1.0",
+        "is-wsl": "^2.2.0",
+        "which": "^2.0.2"
+      },
+      "engines": {
+        "node": ">= 10"
+      }
     },
-    "node_modules/electron-osx-sign/node_modules/debug": {
-      "version": "2.6.9",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+    "node_modules/debug": {
+      "version": "3.2.7",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+      "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
       "dev": true,
       "dependencies": {
-        "ms": "2.0.0"
+        "ms": "^2.1.1"
       }
     },
-    "node_modules/electron-osx-sign/node_modules/ms": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-      "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
-      "dev": true
-    },
-    "node_modules/electron-osx-sign/node_modules/plist": {
-      "version": "3.0.6",
-      "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.6.tgz",
-      "integrity": "sha512-WiIVYyrp8TD4w8yCvyeIr+lkmrGRd5u0VbRnU+tP/aRLxP/YadJUYOMZJ/6hIa3oUyVCsycXvtNRgd5XBJIbiA==",
+    "node_modules/decompress-response": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
+      "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
       "dev": true,
       "dependencies": {
-        "base64-js": "^1.5.1",
-        "xmlbuilder": "^15.1.1"
+        "mimic-response": "^3.1.0"
+      },
+      "engines": {
+        "node": ">=10"
       },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/decompress-response/node_modules/mimic-response": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz",
+      "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==",
+      "dev": true,
       "engines": {
-        "node": ">=6"
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/electron-osx-sign/node_modules/xmlbuilder": {
-      "version": "15.1.1",
-      "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz",
-      "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==",
+    "node_modules/defer-to-connect": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz",
+      "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==",
       "dev": true,
       "engines": {
-        "node": ">=8.0"
+        "node": ">=10"
       }
     },
-    "node_modules/electron-packager": {
-      "version": "12.2.0",
-      "resolved": "https://registry.npmjs.org/electron-packager/-/electron-packager-12.2.0.tgz",
-      "integrity": "sha512-T5W/FIK4VXhYIOWxkehmz6zXt2S/sA9JZ3AL+/jeKCicQY6QVQ0K8B7W801L+GPTwbgTPycHjO+iqEf1BhZ+Iw==",
+    "node_modules/define-properties": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz",
+      "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==",
       "dev": true,
+      "optional": true,
       "dependencies": {
-        "asar": "^0.14.0",
-        "debug": "^3.0.0",
-        "electron-download": "^4.1.1",
-        "electron-osx-sign": "^0.4.1",
-        "extract-zip": "^1.0.3",
-        "fs-extra": "^5.0.0",
-        "galactus": "^0.2.1",
-        "get-package-info": "^1.0.0",
-        "nodeify": "^1.0.1",
-        "parse-author": "^2.0.0",
-        "pify": "^3.0.0",
-        "plist": "^2.0.0",
-        "rcedit": "^1.0.0",
-        "resolve": "^1.1.6",
-        "sanitize-filename": "^1.6.0",
-        "semver": "^5.3.0",
-        "yargs-parser": "^10.0.0"
-      },
-      "bin": {
-        "electron-packager": "cli.js"
+        "has-property-descriptors": "^1.0.0",
+        "object-keys": "^1.1.1"
       },
       "engines": {
-        "node": ">= 4.0"
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
       }
     },
-    "node_modules/electron-prebuilt": {
-      "version": "0.37.8",
-      "resolved": "https://registry.npmjs.org/electron-prebuilt/-/electron-prebuilt-0.37.8.tgz",
-      "integrity": "sha512-UACICTYJZ5wzT8rYz2s1UJB7CvoKbZcrQIQvcFntjMD6BDpyvDSbz0eBDHJmw+VcYtPSImtD0nTb8wpoAb8Q+g==",
+    "node_modules/detect-node": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz",
+      "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==",
       "dev": true,
-      "hasInstallScript": true,
-      "dependencies": {
-        "electron-download": "^2.0.0",
-        "extract-zip": "^1.0.3"
-      },
-      "bin": {
-        "electron": "cli.js"
-      }
+      "optional": true
     },
-    "node_modules/electron-prebuilt/node_modules/debug": {
-      "version": "2.6.9",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+    "node_modules/dir-compare": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/dir-compare/-/dir-compare-3.3.0.tgz",
+      "integrity": "sha512-J7/et3WlGUCxjdnD3HAAzQ6nsnc0WL6DD7WcwJb7c39iH1+AWfg+9OqzJNaI6PkBwBvm1mhZNL9iY/nRiZXlPg==",
       "dev": true,
       "dependencies": {
-        "ms": "2.0.0"
+        "buffer-equal": "^1.0.0",
+        "minimatch": "^3.0.4"
       }
     },
-    "node_modules/electron-prebuilt/node_modules/electron-download": {
-      "version": "2.2.1",
-      "resolved": "https://registry.npmjs.org/electron-download/-/electron-download-2.2.1.tgz",
-      "integrity": "sha512-q616zmyExQmm47IxKQfpsXupiK7HPwPM2jGK1dSGTP+xxJqDrsXhotBtymmY70UxAJF+C9mFQGgQ3fypTbpF4A==",
-      "deprecated": "Please use @electron/get moving forward.",
+    "node_modules/electron": {
+      "version": "24.1.2",
+      "resolved": "https://registry.npmjs.org/electron/-/electron-24.1.2.tgz",
+      "integrity": "sha512-V0isWbyLYiXrSCcB4lrSVhS/U56NFGfuqHyc+yEPkyhhvY+h4F85cYGdEiZlXp6XjHT+/CLHmw0ltK54g9lvDw==",
       "dev": true,
+      "hasInstallScript": true,
       "dependencies": {
-        "debug": "^2.2.0",
-        "home-path": "^1.0.1",
-        "minimist": "^1.2.0",
-        "mkdirp": "^0.5.0",
-        "mv": "^2.0.3",
-        "nugget": "^1.5.1",
-        "path-exists": "^1.0.0",
-        "rc": "^1.1.2"
+        "@electron/get": "^2.0.0",
+        "@types/node": "^18.11.18",
+        "extract-zip": "^2.0.1"
       },
       "bin": {
-        "electron-download": "cli.js"
+        "electron": "cli.js"
+      },
+      "engines": {
+        "node": ">= 12.20.55"
       }
     },
-    "node_modules/electron-prebuilt/node_modules/ms": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-      "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
-      "dev": true
-    },
-    "node_modules/electron-prebuilt/node_modules/nugget": {
-      "version": "1.6.2",
-      "resolved": "https://registry.npmjs.org/nugget/-/nugget-1.6.2.tgz",
-      "integrity": "sha512-Lp7BJE8PUn/l1CHwruaednZHUNz/MN2MkxabNfkIHRy49UzcMSHdBg5/TXCUvkPmzYTqYv79H5Jjfco2dTgZVw==",
-      "dev": true,
-      "dependencies": {
-        "debug": "^2.1.3",
-        "minimist": "^1.1.0",
-        "pretty-bytes": "^1.0.2",
-        "progress-stream": "^1.1.0",
-        "request": "^2.45.0",
-        "single-line-log": "^0.4.1",
-        "throttleit": "0.0.2"
+    "node_modules/electron-packager": {
+      "version": "17.1.1",
+      "resolved": "https://registry.npmjs.org/electron-packager/-/electron-packager-17.1.1.tgz",
+      "integrity": "sha512-r1NDtlajsq7gf2EXgjRfblCVPquvD2yeg+6XGErOKblvxOpDi0iulZLVhgYDP4AEF1P5/HgbX/vwjlkEv7PEIQ==",
+      "dev": true,
+      "dependencies": {
+        "@electron/asar": "^3.2.1",
+        "@electron/get": "^2.0.0",
+        "@electron/notarize": "^1.2.3",
+        "@electron/osx-sign": "^1.0.1",
+        "@electron/universal": "^1.3.2",
+        "cross-spawn-windows-exe": "^1.2.0",
+        "debug": "^4.0.1",
+        "extract-zip": "^2.0.0",
+        "filenamify": "^4.1.0",
+        "fs-extra": "^10.1.0",
+        "galactus": "^0.2.1",
+        "get-package-info": "^1.0.0",
+        "junk": "^3.1.0",
+        "parse-author": "^2.0.0",
+        "plist": "^3.0.0",
+        "rcedit": "^3.0.1",
+        "resolve": "^1.1.6",
+        "semver": "^7.1.3",
+        "yargs-parser": "^21.1.1"
       },
       "bin": {
-        "nugget": "bin.js"
+        "electron-packager": "bin/electron-packager.js"
+      },
+      "engines": {
+        "node": ">= 14.17.5"
+      },
+      "funding": {
+        "url": "https://github.com/electron/electron-packager?sponsor=1"
       }
     },
-    "node_modules/electron-prebuilt/node_modules/path-exists": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-1.0.0.tgz",
-      "integrity": "sha512-BD2vrQBPFI3VkVKzTrOmaG2WtPQoduNXu1A5tLYMOW8RN6G9CdhdSkmw+ljxUkJcj4pbXQGw0lzl7MFLnhba9Q==",
+    "node_modules/electron-packager/node_modules/debug": {
+      "version": "4.3.4",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+      "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
       "dev": true,
+      "dependencies": {
+        "ms": "2.1.2"
+      },
       "engines": {
-        "node": ">=0.10.0"
+        "node": ">=6.0"
+      },
+      "peerDependenciesMeta": {
+        "supports-color": {
+          "optional": true
+        }
       }
     },
-    "node_modules/electron-prebuilt/node_modules/pretty-bytes": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-1.0.4.tgz",
-      "integrity": "sha512-LNisJvAjy+hruxp3GV4IkZZscTI34+ISfeM1hesB9V6ezIDfXYrBi9TIXVjjMcEB4QFN7tL+dFDEk4s8jMBMyA==",
+    "node_modules/electron-packager/node_modules/ms": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+      "dev": true
+    },
+    "node_modules/electron-packager/node_modules/semver": {
+      "version": "7.5.0",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz",
+      "integrity": "sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==",
       "dev": true,
       "dependencies": {
-        "get-stdin": "^4.0.1",
-        "meow": "^3.1.0"
+        "lru-cache": "^6.0.0"
       },
       "bin": {
-        "pretty-bytes": "cli.js"
+        "semver": "bin/semver.js"
       },
       "engines": {
-        "node": ">=0.10.0"
+        "node": ">=10"
       }
     },
-    "node_modules/electron-prebuilt/node_modules/single-line-log": {
-      "version": "0.4.1",
-      "resolved": "https://registry.npmjs.org/single-line-log/-/single-line-log-0.4.1.tgz",
-      "integrity": "sha512-L3Y5LepaFaTPgD/ftnTVC0mdLeIL+e7wKFuJrdudiI4S9Bab4KfPDoJTmIWLaffa2HIQCExhvgYOLF7RKKvk5w==",
-      "dev": true
+    "node_modules/end-of-stream": {
+      "version": "1.4.4",
+      "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
+      "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
+      "dev": true,
+      "dependencies": {
+        "once": "^1.4.0"
+      }
     },
     "node_modules/env-paths": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-1.0.0.tgz",
-      "integrity": "sha512-+6r/UAzikJWJPcQZpBQS+bVmjAMz2BkDP/N4n2Uz1zz8lyw1IHWUeVdh/85gs0dp5A+z76LOQhCZkR6F88mlUw==",
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz",
+      "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==",
       "dev": true,
       "engines": {
-        "node": ">=4"
+        "node": ">=6"
       }
     },
     "node_modules/error-ex": {
@@ -737,61 +789,67 @@
         "is-arrayish": "^0.2.1"
       }
     },
-    "node_modules/extend": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
-      "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
-      "dev": true
+    "node_modules/es6-error": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz",
+      "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==",
+      "dev": true,
+      "optional": true
+    },
+    "node_modules/escape-string-regexp": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+      "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+      "dev": true,
+      "optional": true,
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
     },
     "node_modules/extract-zip": {
-      "version": "1.7.0",
-      "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz",
-      "integrity": "sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==",
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz",
+      "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==",
       "dev": true,
       "dependencies": {
-        "concat-stream": "^1.6.2",
-        "debug": "^2.6.9",
-        "mkdirp": "^0.5.4",
+        "debug": "^4.1.1",
+        "get-stream": "^5.1.0",
         "yauzl": "^2.10.0"
       },
       "bin": {
         "extract-zip": "cli.js"
+      },
+      "engines": {
+        "node": ">= 10.17.0"
+      },
+      "optionalDependencies": {
+        "@types/yauzl": "^2.9.1"
       }
     },
     "node_modules/extract-zip/node_modules/debug": {
-      "version": "2.6.9",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+      "version": "4.3.4",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+      "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
       "dev": true,
       "dependencies": {
-        "ms": "2.0.0"
+        "ms": "2.1.2"
+      },
+      "engines": {
+        "node": ">=6.0"
+      },
+      "peerDependenciesMeta": {
+        "supports-color": {
+          "optional": true
+        }
       }
     },
     "node_modules/extract-zip/node_modules/ms": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-      "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
-      "dev": true
-    },
-    "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==",
-      "dev": true,
-      "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==",
-      "dev": true
-    },
-    "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==",
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
       "dev": true
     },
     "node_modules/fd-slicer": {
@@ -803,6 +861,32 @@
         "pend": "~1.2.0"
       }
     },
+    "node_modules/filename-reserved-regex": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz",
+      "integrity": "sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==",
+      "dev": true,
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/filenamify": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-4.3.0.tgz",
+      "integrity": "sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg==",
+      "dev": true,
+      "dependencies": {
+        "filename-reserved-regex": "^2.0.0",
+        "strip-outer": "^1.0.1",
+        "trim-repeated": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
     "node_modules/find-up": {
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
@@ -865,45 +949,47 @@
       "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
       "dev": true
     },
-    "node_modules/foreachasync": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/foreachasync/-/foreachasync-3.0.0.tgz",
-      "integrity": "sha512-J+ler7Ta54FwwNcx6wQRDhTIbNeyDcARMkOcguEqnEdtm0jKvN3Li3PDAb2Du3ubJYEWfYL83XMROXdsXAXycw=="
-    },
-    "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==",
+    "node_modules/fs-extra": {
+      "version": "10.1.0",
+      "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
+      "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
       "dev": true,
+      "dependencies": {
+        "graceful-fs": "^4.2.0",
+        "jsonfile": "^6.0.1",
+        "universalify": "^2.0.0"
+      },
       "engines": {
-        "node": "*"
+        "node": ">=12"
       }
     },
-    "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==",
+    "node_modules/fs-extra/node_modules/jsonfile": {
+      "version": "6.1.0",
+      "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
+      "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
       "dev": true,
       "dependencies": {
-        "asynckit": "^0.4.0",
-        "combined-stream": "^1.0.6",
-        "mime-types": "^2.1.12"
+        "universalify": "^2.0.0"
       },
-      "engines": {
-        "node": ">= 0.12"
+      "optionalDependencies": {
+        "graceful-fs": "^4.1.6"
       }
     },
-    "node_modules/fs-extra": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz",
-      "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==",
+    "node_modules/fs-extra/node_modules/universalify": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
+      "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==",
       "dev": true,
-      "dependencies": {
-        "graceful-fs": "^4.1.2",
-        "jsonfile": "^4.0.0",
-        "universalify": "^0.1.0"
+      "engines": {
+        "node": ">= 10.0.0"
       }
     },
+    "node_modules/fs.realpath": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+      "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
+      "dev": true
+    },
     "node_modules/function-bind": {
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
@@ -932,6 +1018,21 @@
         "universalify": "^0.1.0"
       }
     },
+    "node_modules/get-intrinsic": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz",
+      "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==",
+      "dev": true,
+      "optional": true,
+      "dependencies": {
+        "function-bind": "^1.1.1",
+        "has": "^1.0.3",
+        "has-symbols": "^1.0.3"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
     "node_modules/get-package-info": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/get-package-info/-/get-package-info-1.0.0.tgz",
@@ -962,69 +1063,122 @@
       "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
       "dev": true
     },
-    "node_modules/get-stdin": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz",
-      "integrity": "sha512-F5aQMywwJ2n85s4hJPTT9RPxGmubonuB10MNYo17/xph174n2MIR33HRguhzVag10O/npM7SPk73LMZNP+FaWw==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/getpass": {
-      "version": "0.1.7",
-      "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
-      "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==",
+    "node_modules/get-stream": {
+      "version": "5.2.0",
+      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
+      "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
       "dev": true,
       "dependencies": {
-        "assert-plus": "^1.0.0"
+        "pump": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
     "node_modules/glob": {
-      "version": "6.0.4",
-      "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz",
-      "integrity": "sha512-MKZeRNyYZAVVVG1oZeLaWie1uweH40m9AZwIwxyPbTSX4hHrVYSzLg0Ro5Z5R7XKkIX+Cc6oD1rqeDJnwsB8/A==",
+      "version": "7.2.3",
+      "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+      "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
       "dev": true,
       "dependencies": {
+        "fs.realpath": "^1.0.0",
         "inflight": "^1.0.4",
         "inherits": "2",
-        "minimatch": "2 || 3",
+        "minimatch": "^3.1.1",
         "once": "^1.3.0",
         "path-is-absolute": "^1.0.0"
       },
       "engines": {
         "node": "*"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
       }
     },
-    "node_modules/graceful-fs": {
-      "version": "4.2.11",
-      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
-      "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
-      "dev": true
+    "node_modules/global-agent": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz",
+      "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==",
+      "dev": true,
+      "optional": true,
+      "dependencies": {
+        "boolean": "^3.0.1",
+        "es6-error": "^4.1.1",
+        "matcher": "^3.0.0",
+        "roarr": "^2.15.3",
+        "semver": "^7.3.2",
+        "serialize-error": "^7.0.1"
+      },
+      "engines": {
+        "node": ">=10.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==",
+    "node_modules/global-agent/node_modules/semver": {
+      "version": "7.5.0",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz",
+      "integrity": "sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==",
       "dev": true,
+      "optional": true,
+      "dependencies": {
+        "lru-cache": "^6.0.0"
+      },
+      "bin": {
+        "semver": "bin/semver.js"
+      },
       "engines": {
-        "node": ">=4"
+        "node": ">=10"
       }
     },
-    "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",
+    "node_modules/globalthis": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz",
+      "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==",
       "dev": true,
+      "optional": true,
       "dependencies": {
-        "ajv": "^6.12.3",
-        "har-schema": "^2.0.0"
+        "define-properties": "^1.1.3"
       },
       "engines": {
-        "node": ">=6"
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/got": {
+      "version": "11.8.6",
+      "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz",
+      "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==",
+      "dev": true,
+      "dependencies": {
+        "@sindresorhus/is": "^4.0.0",
+        "@szmarczak/http-timer": "^4.0.5",
+        "@types/cacheable-request": "^6.0.1",
+        "@types/responselike": "^1.0.0",
+        "cacheable-lookup": "^5.0.3",
+        "cacheable-request": "^7.0.2",
+        "decompress-response": "^6.0.0",
+        "http2-wrapper": "^1.0.0-beta.5.2",
+        "lowercase-keys": "^2.0.0",
+        "p-cancelable": "^2.0.0",
+        "responselike": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=10.19.0"
+      },
+      "funding": {
+        "url": "https://github.com/sindresorhus/got?sponsor=1"
       }
     },
+    "node_modules/graceful-fs": {
+      "version": "4.2.11",
+      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+      "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
+      "dev": true
+    },
     "node_modules/has": {
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
@@ -1037,11 +1191,31 @@
         "node": ">= 0.4.0"
       }
     },
-    "node_modules/home-path": {
-      "version": "1.0.7",
-      "resolved": "https://registry.npmjs.org/home-path/-/home-path-1.0.7.tgz",
-      "integrity": "sha512-tM1pVa+u3ZqQwIkXcWfhUlY3HWS3TsnKsfi2OHHvnhkX52s9etyktPyy1rQotkr0euWimChDq+QkQuDe8ngUlQ==",
-      "dev": true
+    "node_modules/has-property-descriptors": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz",
+      "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==",
+      "dev": true,
+      "optional": true,
+      "dependencies": {
+        "get-intrinsic": "^1.1.1"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/has-symbols": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
+      "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
+      "dev": true,
+      "optional": true,
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
     },
     "node_modules/hosted-git-info": {
       "version": "2.8.9",
@@ -1049,31 +1223,23 @@
       "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
       "dev": true
     },
-    "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==",
-      "dev": true,
-      "dependencies": {
-        "assert-plus": "^1.0.0",
-        "jsprim": "^1.2.2",
-        "sshpk": "^1.7.0"
-      },
-      "engines": {
-        "node": ">=0.8",
-        "npm": ">=1.3.7"
-      }
+    "node_modules/http-cache-semantics": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz",
+      "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==",
+      "dev": true
     },
-    "node_modules/indent-string": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz",
-      "integrity": "sha512-aqwDFWSgSgfRaEwao5lg5KEcVd/2a+D1rvoG7NdilmYz0NwRk6StWpWdz/Hpk34MKPpx7s8XxUqimfcQK6gGlg==",
+    "node_modules/http2-wrapper": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz",
+      "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==",
       "dev": true,
       "dependencies": {
-        "repeating": "^2.0.0"
+        "quick-lru": "^5.1.1",
+        "resolve-alpn": "^1.0.0"
       },
       "engines": {
-        "node": ">=0.10.0"
+        "node": ">=10.19.0"
       }
     },
     "node_modules/inflight": {
@@ -1092,12 +1258,6 @@
       "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
       "dev": true
     },
-    "node_modules/ini": {
-      "version": "1.3.8",
-      "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
-      "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
-      "dev": true
-    },
     "node_modules/is-arrayish": {
       "version": "0.2.1",
       "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
@@ -1116,95 +1276,63 @@
         "url": "https://github.com/sponsors/ljharb"
       }
     },
-    "node_modules/is-finite": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz",
-      "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==",
+    "node_modules/is-docker": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz",
+      "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==",
       "dev": true,
+      "bin": {
+        "is-docker": "cli.js"
+      },
       "engines": {
-        "node": ">=0.10.0"
+        "node": ">=8"
       },
       "funding": {
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "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==",
+    "node_modules/is-wsl": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
+      "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
       "dev": true,
       "dependencies": {
-        "number-is-nan": "^1.0.0"
+        "is-docker": "^2.0.0"
       },
       "engines": {
-        "node": ">=0.10.0"
+        "node": ">=8"
       }
     },
-    "node_modules/is-promise": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-1.0.1.tgz",
-      "integrity": "sha512-mjWH5XxnhMA8cFnDchr6qRP9S/kLntKuEfIYku+PaN1CnS8v+OG9O/BKpRCVRJvpIkgAZm0Pf5Is3iSSOILlcg==",
-      "dev": true
-    },
-    "node_modules/is-typedarray": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
-      "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==",
-      "dev": true
-    },
-    "node_modules/is-utf8": {
-      "version": "0.2.1",
-      "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
-      "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==",
-      "dev": true
-    },
-    "node_modules/isarray": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
-      "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
-      "dev": true
-    },
     "node_modules/isbinaryfile": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.3.tgz",
-      "integrity": "sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw==",
+      "version": "4.0.10",
+      "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz",
+      "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==",
       "dev": true,
-      "dependencies": {
-        "buffer-alloc": "^1.2.0"
-      },
       "engines": {
-        "node": ">=0.6.0"
+        "node": ">= 8.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/gjtorikian/"
       }
     },
-    "node_modules/isstream": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
-      "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==",
-      "dev": true
-    },
-    "node_modules/jsbn": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
-      "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==",
-      "dev": true
-    },
-    "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/isexe": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+      "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
       "dev": true
     },
-    "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-buffer": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
+      "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
       "dev": true
     },
     "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==",
-      "dev": true
+      "dev": true,
+      "optional": true
     },
     "node_modules/jsonfile": {
       "version": "4.0.0",
@@ -1215,28 +1343,22 @@
         "graceful-fs": "^4.1.6"
       }
     },
-    "node_modules/jsprim": {
-      "version": "1.4.2",
-      "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz",
-      "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==",
+    "node_modules/junk": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/junk/-/junk-3.1.0.tgz",
+      "integrity": "sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ==",
       "dev": true,
-      "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": ">=8"
       }
     },
-    "node_modules/klaw": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz",
-      "integrity": "sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw==",
+    "node_modules/keyv": {
+      "version": "4.5.2",
+      "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz",
+      "integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==",
       "dev": true,
-      "optionalDependencies": {
-        "graceful-fs": "^4.1.9"
+      "dependencies": {
+        "json-buffer": "3.0.1"
       }
     },
     "node_modules/load-json-file": {
@@ -1282,171 +1404,47 @@
       "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==",
       "dev": true
     },
-    "node_modules/loud-rejection": {
-      "version": "1.6.0",
-      "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz",
-      "integrity": "sha512-RPNliZOFkqFumDhvYqOaNY4Uz9oJM2K9tC6JWsJJsNdhuONW4LQHRBpb0qf4pJApVffI5N39SwzWZJuEhfd7eQ==",
-      "dev": true,
-      "dependencies": {
-        "currently-unhandled": "^0.4.1",
-        "signal-exit": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/map-obj": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
-      "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/meow": {
-      "version": "3.7.0",
-      "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz",
-      "integrity": "sha512-TNdwZs0skRlpPpCUK25StC4VH+tP5GgeY1HQOOGP+lQ2xtdkN2VtT/5tiX9k3IWpkBPV9b3LsAWXn4GGi/PrSA==",
-      "dev": true,
-      "dependencies": {
-        "camelcase-keys": "^2.0.0",
-        "decamelize": "^1.1.2",
-        "loud-rejection": "^1.0.0",
-        "map-obj": "^1.0.1",
-        "minimist": "^1.1.3",
-        "normalize-package-data": "^2.3.4",
-        "object-assign": "^4.0.1",
-        "read-pkg-up": "^1.0.1",
-        "redent": "^1.0.0",
-        "trim-newlines": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/meow/node_modules/find-up": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
-      "integrity": "sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==",
-      "dev": true,
-      "dependencies": {
-        "path-exists": "^2.0.0",
-        "pinkie-promise": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/meow/node_modules/load-json-file": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
-      "integrity": "sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==",
-      "dev": true,
-      "dependencies": {
-        "graceful-fs": "^4.1.2",
-        "parse-json": "^2.2.0",
-        "pify": "^2.0.0",
-        "pinkie-promise": "^2.0.0",
-        "strip-bom": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/meow/node_modules/path-exists": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
-      "integrity": "sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==",
+    "node_modules/lowercase-keys": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz",
+      "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==",
       "dev": true,
-      "dependencies": {
-        "pinkie-promise": "^2.0.0"
-      },
       "engines": {
-        "node": ">=0.10.0"
+        "node": ">=8"
       }
     },
-    "node_modules/meow/node_modules/path-type": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz",
-      "integrity": "sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==",
+    "node_modules/lru-cache": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+      "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
       "dev": true,
       "dependencies": {
-        "graceful-fs": "^4.1.2",
-        "pify": "^2.0.0",
-        "pinkie-promise": "^2.0.0"
+        "yallist": "^4.0.0"
       },
       "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/meow/node_modules/pify": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
-      "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
+        "node": ">=10"
       }
     },
-    "node_modules/meow/node_modules/read-pkg": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
-      "integrity": "sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==",
+    "node_modules/matcher": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz",
+      "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==",
       "dev": true,
+      "optional": true,
       "dependencies": {
-        "load-json-file": "^1.0.0",
-        "normalize-package-data": "^2.3.2",
-        "path-type": "^1.0.0"
+        "escape-string-regexp": "^4.0.0"
       },
       "engines": {
-        "node": ">=0.10.0"
+        "node": ">=10"
       }
     },
-    "node_modules/meow/node_modules/read-pkg-up": {
+    "node_modules/mimic-response": {
       "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz",
-      "integrity": "sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==",
-      "dev": true,
-      "dependencies": {
-        "find-up": "^1.0.0",
-        "read-pkg": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/meow/node_modules/strip-bom": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
-      "integrity": "sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==",
-      "dev": true,
-      "dependencies": {
-        "is-utf8": "^0.2.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "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==",
+      "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz",
+      "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==",
       "dev": true,
       "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==",
-      "dev": true,
-      "dependencies": {
-        "mime-db": "1.52.0"
-      },
-      "engines": {
-        "node": ">= 0.6"
+        "node": ">=4"
       }
     },
     "node_modules/minimatch": {
@@ -1470,57 +1468,6 @@
         "url": "https://github.com/sponsors/ljharb"
       }
     },
-    "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==",
-      "dev": true,
-      "dependencies": {
-        "minimist": "^1.2.6"
-      },
-      "bin": {
-        "mkdirp": "bin/cmd.js"
-      }
-    },
-    "node_modules/mkpath": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/mkpath/-/mkpath-0.1.0.tgz",
-      "integrity": "sha512-bauHShmaxVQiEvlrAPWxSPn8spSL8gDVRl11r8vLT4r/KdnknLqtqwQbToZ2Oa8sJkExYY1z6/d+X7pNiqo4yg==",
-      "dev": true
-    },
-    "node_modules/mksnapshot": {
-      "version": "0.3.5",
-      "resolved": "https://registry.npmjs.org/mksnapshot/-/mksnapshot-0.3.5.tgz",
-      "integrity": "sha512-PSBoZaj9h9myC3uRRW62RxmX8mrN3XbOkMEyURUD7v5CeJgtYTar50XU738t7Q0LtG1pBPtp5n5QwDGggRnEvw==",
-      "dev": true,
-      "dependencies": {
-        "decompress-zip": "0.3.x",
-        "fs-extra": "0.26.7",
-        "request": "2.x"
-      }
-    },
-    "node_modules/mksnapshot/node_modules/fs-extra": {
-      "version": "0.26.7",
-      "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.26.7.tgz",
-      "integrity": "sha512-waKu+1KumRhYv8D8gMRCKJGAMI9pRnPuEb1mvgYD0f7wBscg+h6bW4FDTmEZhB9VKxvoTtxW+Y7bnIlB7zja6Q==",
-      "dev": true,
-      "dependencies": {
-        "graceful-fs": "^4.1.2",
-        "jsonfile": "^2.1.0",
-        "klaw": "^1.0.0",
-        "path-is-absolute": "^1.0.0",
-        "rimraf": "^2.2.8"
-      }
-    },
-    "node_modules/mksnapshot/node_modules/jsonfile": {
-      "version": "2.4.0",
-      "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz",
-      "integrity": "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==",
-      "dev": true,
-      "optionalDependencies": {
-        "graceful-fs": "^4.1.6"
-      }
-    },
     "node_modules/moniker": {
       "version": "0.1.2",
       "resolved": "https://registry.npmjs.org/moniker/-/moniker-0.1.2.tgz",
@@ -1535,20 +1482,6 @@
       "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
       "dev": true
     },
-    "node_modules/mv": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/mv/-/mv-2.1.1.tgz",
-      "integrity": "sha512-at/ZndSy3xEGJ8i0ygALh8ru9qy7gWW1cmkaqBN29JmMlIvM//MEO9y1sk/avxuwnPcfhkejkLsuPxH81BrkSg==",
-      "dev": true,
-      "dependencies": {
-        "mkdirp": "~0.5.1",
-        "ncp": "~2.0.0",
-        "rimraf": "~2.4.0"
-      },
-      "engines": {
-        "node": ">=0.8.0"
-      }
-    },
     "node_modules/n-readlines": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/n-readlines/-/n-readlines-1.0.1.tgz",
@@ -1557,37 +1490,6 @@
         "node": ">=6.x.x"
       }
     },
-    "node_modules/ncp": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz",
-      "integrity": "sha512-zIdGUrPRFTUELUvr3Gmc7KZ2Sw/h1PiVM0Af/oHB6zgnV1ikqSfRk+TOufi79aHYCW3NiOXmr1BP5nWbzojLaA==",
-      "dev": true,
-      "bin": {
-        "ncp": "bin/ncp"
-      }
-    },
-    "node_modules/nodeify": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/nodeify/-/nodeify-1.0.1.tgz",
-      "integrity": "sha512-n7C2NyEze8GCo/z73KdbjRsBiLbv6eBn1FxwYKQ23IqGo7pQY3mhQan61Sv7eEDJCiyUjTVrVkXTzJCo1dW7Aw==",
-      "dev": true,
-      "dependencies": {
-        "is-promise": "~1.0.0",
-        "promise": "~1.3.0"
-      }
-    },
-    "node_modules/nopt": {
-      "version": "3.0.6",
-      "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz",
-      "integrity": "sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==",
-      "dev": true,
-      "dependencies": {
-        "abbrev": "1"
-      },
-      "bin": {
-        "nopt": "bin/nopt.js"
-      }
-    },
     "node_modules/normalize-package-data": {
       "version": "2.5.0",
       "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
@@ -1600,72 +1502,28 @@
         "validate-npm-package-license": "^3.0.1"
       }
     },
-    "node_modules/nugget": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/nugget/-/nugget-2.2.0.tgz",
-      "integrity": "sha512-I4Yt4dRPes82Tx/s7qDn8z1cA2pmZy2bOJiTdcb/BZJ1LJkEYd9GqunQD37unPUPjdmW6dkkVZmxN+8Gxt6Xlg==",
-      "dev": true,
-      "dependencies": {
-        "debug": "^2.1.3",
-        "minimist": "^1.1.0",
-        "pretty-bytes": "^4.0.2",
-        "progress-stream": "^1.1.0",
-        "request": "^2.45.0",
-        "single-line-log": "^1.1.2",
-        "throttleit": "0.0.2"
-      },
-      "bin": {
-        "nugget": "bin.js"
-      }
-    },
-    "node_modules/nugget/node_modules/debug": {
-      "version": "2.6.9",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-      "dev": true,
-      "dependencies": {
-        "ms": "2.0.0"
-      }
-    },
-    "node_modules/nugget/node_modules/ms": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-      "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
-      "dev": true
-    },
-    "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==",
-      "dev": true,
-      "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==",
+    "node_modules/normalize-url": {
+      "version": "6.1.0",
+      "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz",
+      "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==",
       "dev": true,
       "engines": {
-        "node": "*"
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/object-assign": {
-      "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
-      "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
+    "node_modules/object-keys": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+      "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
       "dev": true,
+      "optional": true,
       "engines": {
-        "node": ">=0.10.0"
+        "node": ">= 0.4"
       }
     },
-    "node_modules/object-keys": {
-      "version": "0.4.0",
-      "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz",
-      "integrity": "sha512-ncrLw+X55z7bkl5PnUvHwFK9FcGuFYo9gtjws2XtSzL+aZ8tm830P60WJ0dSmFVaSalWieW5MD7kEdnXda9yJw==",
-      "dev": true
-    },
     "node_modules/once": {
       "version": "1.4.0",
       "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
@@ -1675,13 +1533,13 @@
         "wrappy": "1"
       }
     },
-    "node_modules/os-tmpdir": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
-      "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==",
+    "node_modules/p-cancelable": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz",
+      "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==",
       "dev": true,
       "engines": {
-        "node": ">=0.10.0"
+        "node": ">=8"
       }
     },
     "node_modules/p-limit": {
@@ -1759,6 +1617,15 @@
         "node": ">=0.10.0"
       }
     },
+    "node_modules/path-key": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+      "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+      "dev": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
     "node_modules/path-parse": {
       "version": "1.0.7",
       "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
@@ -1792,142 +1659,62 @@
       "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==",
       "dev": true
     },
-    "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==",
-      "dev": true
-    },
-    "node_modules/pify": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
-      "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/pinkie": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
-      "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/pinkie-promise": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
-      "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==",
-      "dev": true,
-      "dependencies": {
-        "pinkie": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
     "node_modules/plist": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/plist/-/plist-2.1.0.tgz",
-      "integrity": "sha512-yirJ+8SSb8o7pkfyNv+fTzUP0GbK52HMvh0MjMycCxvpL8rHiAfKhXU/3R5znSJnrGakV0WNZhr8yTR4//PjyA==",
-      "dev": true,
-      "dependencies": {
-        "base64-js": "1.2.0",
-        "xmlbuilder": "8.2.2",
-        "xmldom": "0.1.x"
-      }
-    },
-    "node_modules/pretty-bytes": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-4.0.2.tgz",
-      "integrity": "sha512-yJAF+AjbHKlxQ8eezMd/34Mnj/YTQ3i6kLzvVsH4l/BfIFtp444n0wVbnsn66JimZ9uBofv815aRp1zCppxlWw==",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/process-nextick-args": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
-      "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
-      "dev": true
-    },
-    "node_modules/progress-stream": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/progress-stream/-/progress-stream-1.2.0.tgz",
-      "integrity": "sha512-MIBPjZz6oGNSw5rn2mSp+nP9FGoaVo6QsPyPVEaD4puilz5hZNa3kfnrlqRNYFsugslbU3An4mnkLLtZOaWvrA==",
-      "dev": true,
-      "dependencies": {
-        "speedometer": "~0.1.2",
-        "through2": "~0.2.3"
-      }
-    },
-    "node_modules/promise": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/promise/-/promise-1.3.0.tgz",
-      "integrity": "sha512-R9WrbTF3EPkVtWjp7B7umQGVndpsi+rsDAfrR4xAALQpFLa/+2OriecLhawxzvii2gd9+DZFwROWDuUUaqS5yA==",
+      "version": "3.0.6",
+      "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.6.tgz",
+      "integrity": "sha512-WiIVYyrp8TD4w8yCvyeIr+lkmrGRd5u0VbRnU+tP/aRLxP/YadJUYOMZJ/6hIa3oUyVCsycXvtNRgd5XBJIbiA==",
       "dev": true,
       "dependencies": {
-        "is-promise": "~1"
+        "base64-js": "^1.5.1",
+        "xmlbuilder": "^15.1.1"
+      },
+      "engines": {
+        "node": ">=6"
       }
     },
-    "node_modules/psl": {
-      "version": "1.9.0",
-      "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz",
-      "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==",
-      "dev": true
-    },
-    "node_modules/punycode": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz",
-      "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==",
+    "node_modules/progress": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
+      "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
       "dev": true,
       "engines": {
-        "node": ">=6"
+        "node": ">=0.4.0"
       }
     },
-    "node_modules/q": {
-      "version": "1.5.1",
-      "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz",
-      "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==",
+    "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==",
       "dev": true,
-      "engines": {
-        "node": ">=0.6.0",
-        "teleport": ">=0.2.0"
+      "dependencies": {
+        "end-of-stream": "^1.1.0",
+        "once": "^1.3.1"
       }
     },
-    "node_modules/qs": {
-      "version": "6.5.3",
-      "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz",
-      "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==",
+    "node_modules/quick-lru": {
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz",
+      "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==",
       "dev": true,
       "engines": {
-        "node": ">=0.6"
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/rc": {
-      "version": "1.2.8",
-      "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
-      "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
+    "node_modules/rcedit": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/rcedit/-/rcedit-3.0.1.tgz",
+      "integrity": "sha512-XM0Jv40/y4hVAqj/MO70o/IWs4uOsaSoo2mLyk3klFDW+SStLnCtzuQu+1OBTIMGlM8CvaK9ftlYCp6DJ+cMsw==",
       "dev": true,
       "dependencies": {
-        "deep-extend": "^0.6.0",
-        "ini": "~1.3.0",
-        "minimist": "^1.2.0",
-        "strip-json-comments": "~2.0.1"
+        "cross-spawn-windows-exe": "^1.1.0"
       },
-      "bin": {
-        "rc": "cli.js"
+      "engines": {
+        "node": ">= 10.0.0"
       }
     },
-    "node_modules/rcedit": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/rcedit/-/rcedit-1.1.2.tgz",
-      "integrity": "sha512-z2ypB4gbINhI6wVe0JJMmdpmOpmNc4g90sE6/6JSuch5kYnjfz9CxvVPqqhShgR6GIkmtW3W2UlfiXhWljA0Fw==",
-      "dev": true
-    },
     "node_modules/read-pkg": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz",
@@ -1955,78 +1742,6 @@
         "node": ">=4"
       }
     },
-    "node_modules/readable-stream": {
-      "version": "2.3.8",
-      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
-      "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
-      "dev": true,
-      "dependencies": {
-        "core-util-is": "~1.0.0",
-        "inherits": "~2.0.3",
-        "isarray": "~1.0.0",
-        "process-nextick-args": "~2.0.0",
-        "safe-buffer": "~5.1.1",
-        "string_decoder": "~1.1.1",
-        "util-deprecate": "~1.0.1"
-      }
-    },
-    "node_modules/redent": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz",
-      "integrity": "sha512-qtW5hKzGQZqKoh6JNSD+4lfitfPKGz42e6QwiRmPM5mmKtR0N41AbJRYu0xJi7nhOJ4WDgRkKvAk6tw4WIwR4g==",
-      "dev": true,
-      "dependencies": {
-        "indent-string": "^2.1.0",
-        "strip-indent": "^1.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/repeating": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
-      "integrity": "sha512-ZqtSMuVybkISo2OWvqvm7iHSWngvdaW3IpsT9/uP8v4gMi591LY6h35wdOfvQdWCKFWZWm2Y1Opp4kV7vQKT6A==",
-      "dev": true,
-      "dependencies": {
-        "is-finite": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "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",
-      "dev": true,
-      "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/resolve": {
       "version": "1.22.3",
       "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.3.tgz",
@@ -2044,37 +1759,40 @@
         "url": "https://github.com/sponsors/ljharb"
       }
     },
-    "node_modules/rimraf": {
-      "version": "2.4.5",
-      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz",
-      "integrity": "sha512-J5xnxTyqaiw06JjMftq7L9ouA448dw/E7dKghkP9WpKNuwmARNNg+Gk8/u5ryb9N/Yo2+z3MCwuqFK/+qPOPfQ==",
+    "node_modules/resolve-alpn": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz",
+      "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==",
+      "dev": true
+    },
+    "node_modules/responselike": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz",
+      "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==",
       "dev": true,
       "dependencies": {
-        "glob": "^6.0.1"
+        "lowercase-keys": "^2.0.0"
       },
-      "bin": {
-        "rimraf": "bin.js"
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/safe-buffer": {
-      "version": "5.1.2",
-      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
-      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
-      "dev": true
-    },
-    "node_modules/safer-buffer": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
-      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
-      "dev": true
-    },
-    "node_modules/sanitize-filename": {
-      "version": "1.6.3",
-      "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz",
-      "integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==",
+    "node_modules/roarr": {
+      "version": "2.15.4",
+      "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz",
+      "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==",
       "dev": true,
+      "optional": true,
       "dependencies": {
-        "truncate-utf8-bytes": "^1.0.0"
+        "boolean": "^3.0.1",
+        "detect-node": "^2.0.4",
+        "globalthis": "^1.0.1",
+        "json-stringify-safe": "^5.0.1",
+        "semver-compare": "^1.0.0",
+        "sprintf-js": "^1.1.2"
+      },
+      "engines": {
+        "node": ">=8.0"
       }
     },
     "node_modules/semver": {
@@ -2086,19 +1804,48 @@
         "semver": "bin/semver"
       }
     },
-    "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==",
-      "dev": true
+    "node_modules/semver-compare": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz",
+      "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==",
+      "dev": true,
+      "optional": true
     },
-    "node_modules/single-line-log": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/single-line-log/-/single-line-log-1.1.2.tgz",
-      "integrity": "sha512-awzaaIPtYFdexLr6TBpcZSGPB6D1RInNO/qNetgaJloPDF/D0GkVtLvGEp8InfmLV7CyLyQ5fIRP+tVN/JmWQA==",
+    "node_modules/serialize-error": {
+      "version": "7.0.1",
+      "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz",
+      "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==",
+      "dev": true,
+      "optional": true,
+      "dependencies": {
+        "type-fest": "^0.13.1"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/shebang-command": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+      "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
       "dev": true,
       "dependencies": {
-        "string-width": "^1.0.1"
+        "shebang-regex": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/shebang-regex": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+      "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+      "dev": true,
+      "engines": {
+        "node": ">=8"
       }
     },
     "node_modules/spdx-correct": {
@@ -2133,71 +1880,12 @@
       "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==",
       "dev": true
     },
-    "node_modules/speedometer": {
-      "version": "0.1.4",
-      "resolved": "https://registry.npmjs.org/speedometer/-/speedometer-0.1.4.tgz",
-      "integrity": "sha512-phdEoDlA6EUIVtzwq1UiNMXDUogczp204aYF/yfOhjNePWFfIpBJ1k5wLMuXQhEOOMjuTJEcc4vdZa+vuP+n/Q==",
-      "dev": true
-    },
-    "node_modules/sshpk": {
-      "version": "1.17.0",
-      "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz",
-      "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==",
-      "dev": true,
-      "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_decoder": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
-      "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
-      "dev": true,
-      "dependencies": {
-        "safe-buffer": "~5.1.0"
-      }
-    },
-    "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==",
-      "dev": true,
-      "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/strip-ansi": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
-      "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==",
+    "node_modules/sprintf-js": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz",
+      "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==",
       "dev": true,
-      "dependencies": {
-        "ansi-regex": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
+      "optional": true
     },
     "node_modules/strip-bom": {
       "version": "3.0.0",
@@ -2208,55 +1896,60 @@
         "node": ">=4"
       }
     },
-    "node_modules/strip-indent": {
+    "node_modules/strip-outer": {
       "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz",
-      "integrity": "sha512-I5iQq6aFMM62fBEAIB/hXzwJD6EEZ0xEGCX2t7oXqaKPIRgt4WruAQ285BISgdkP+HLGWyeGmNJcpIwFeRYRUA==",
+      "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz",
+      "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==",
       "dev": true,
       "dependencies": {
-        "get-stdin": "^4.0.1"
-      },
-      "bin": {
-        "strip-indent": "cli.js"
+        "escape-string-regexp": "^1.0.2"
       },
       "engines": {
         "node": ">=0.10.0"
       }
     },
-    "node_modules/strip-json-comments": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
-      "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==",
+    "node_modules/strip-outer/node_modules/escape-string-regexp": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+      "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
       "dev": true,
       "engines": {
-        "node": ">=0.10.0"
+        "node": ">=0.8.0"
       }
     },
     "node_modules/sumchecker": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-2.0.2.tgz",
-      "integrity": "sha512-16O54scwFPgX60Of/+QJSufmklGqnHZyBK6uewBvtcp3VxT5RM65c/OnGCeEPnjBF8TJoO5Pf6gHAOXfxIjNpA==",
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz",
+      "integrity": "sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==",
       "dev": true,
       "dependencies": {
-        "debug": "^2.2.0"
+        "debug": "^4.1.0"
       },
       "engines": {
-        "node": ">= 4.0"
+        "node": ">= 8.0"
       }
     },
     "node_modules/sumchecker/node_modules/debug": {
-      "version": "2.6.9",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+      "version": "4.3.4",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+      "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
       "dev": true,
       "dependencies": {
-        "ms": "2.0.0"
+        "ms": "2.1.2"
+      },
+      "engines": {
+        "node": ">=6.0"
+      },
+      "peerDependenciesMeta": {
+        "supports-color": {
+          "optional": true
+        }
       }
     },
     "node_modules/sumchecker/node_modules/ms": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-      "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
       "dev": true
     },
     "node_modules/supports-preserve-symlinks-flag": {
@@ -2271,149 +1964,40 @@
         "url": "https://github.com/sponsors/ljharb"
       }
     },
-    "node_modules/throttleit": {
-      "version": "0.0.2",
-      "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-0.0.2.tgz",
-      "integrity": "sha512-HtlTFeyYs1elDM2txiIGsdXHaq8kffVaZH/QEBRbo95zQqzlsBx5ELKhkPOZVad9OK9oxzwx6UrQN8Vfh/+yag==",
-      "dev": true
-    },
-    "node_modules/through2": {
-      "version": "0.2.3",
-      "resolved": "https://registry.npmjs.org/through2/-/through2-0.2.3.tgz",
-      "integrity": "sha512-mLa8Bn2mZurjyomGKWRu3Bo2mvoQojFks9NvOK8H+k4kDJNkdEqG522KFZsEFBEl6rKkxTgFbE5+OPcgfvPEHA==",
-      "dev": true,
-      "dependencies": {
-        "readable-stream": "~1.1.9",
-        "xtend": "~2.1.1"
-      }
-    },
-    "node_modules/through2/node_modules/isarray": {
-      "version": "0.0.1",
-      "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
-      "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==",
-      "dev": true
-    },
-    "node_modules/through2/node_modules/readable-stream": {
-      "version": "1.1.14",
-      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
-      "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==",
-      "dev": true,
-      "dependencies": {
-        "core-util-is": "~1.0.0",
-        "inherits": "~2.0.1",
-        "isarray": "0.0.1",
-        "string_decoder": "~0.10.x"
-      }
-    },
-    "node_modules/through2/node_modules/string_decoder": {
-      "version": "0.10.31",
-      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
-      "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==",
-      "dev": true
-    },
-    "node_modules/tmp": {
-      "version": "0.0.28",
-      "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.28.tgz",
-      "integrity": "sha512-c2mmfiBmND6SOVxzogm1oda0OJ1HZVIk/5n26N59dDTh80MUeavpiCls4PGAdkX1PFkKokLpcf7prSjCeXLsJg==",
-      "dev": true,
-      "dependencies": {
-        "os-tmpdir": "~1.0.1"
-      },
-      "engines": {
-        "node": ">=0.4.0"
-      }
-    },
-    "node_modules/touch": {
-      "version": "0.0.3",
-      "resolved": "https://registry.npmjs.org/touch/-/touch-0.0.3.tgz",
-      "integrity": "sha512-/LQ54KM9rPf3rGXGo2UPQWx3ol242Zg6Whq27H5DEmZhCJo+pm9N5BzRGepO9vTVhYxpXJdcc1+3uaYt9NyeKg==",
-      "dev": true,
-      "dependencies": {
-        "nopt": "~1.0.10"
-      },
-      "engines": {
-        "node": ">=0.6"
-      }
-    },
-    "node_modules/touch/node_modules/nopt": {
-      "version": "1.0.10",
-      "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz",
-      "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==",
-      "dev": true,
-      "dependencies": {
-        "abbrev": "1"
-      },
-      "bin": {
-        "nopt": "bin/nopt.js"
-      },
-      "engines": {
-        "node": "*"
-      }
-    },
-    "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==",
+    "node_modules/trim-repeated": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz",
+      "integrity": "sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==",
       "dev": true,
       "dependencies": {
-        "psl": "^1.1.28",
-        "punycode": "^2.1.1"
+        "escape-string-regexp": "^1.0.2"
       },
       "engines": {
-        "node": ">=0.8"
+        "node": ">=0.10.0"
       }
     },
-    "node_modules/traverse": {
-      "version": "0.3.9",
-      "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz",
-      "integrity": "sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==",
+    "node_modules/trim-repeated/node_modules/escape-string-regexp": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+      "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
       "dev": true,
       "engines": {
-        "node": "*"
+        "node": ">=0.8.0"
       }
     },
-    "node_modules/trim-newlines": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz",
-      "integrity": "sha512-Nm4cF79FhSTzrLKGDMi3I4utBtFv8qKy4sq1enftf2gMdpqI8oVQTAfySkTz5r49giVzDj88SVZXP4CeYQwjaw==",
+    "node_modules/type-fest": {
+      "version": "0.13.1",
+      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz",
+      "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==",
       "dev": true,
+      "optional": true,
       "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/truncate-utf8-bytes": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz",
-      "integrity": "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==",
-      "dev": true,
-      "dependencies": {
-        "utf8-byte-length": "^1.0.1"
-      }
-    },
-    "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==",
-      "dev": true,
-      "dependencies": {
-        "safe-buffer": "^5.0.1"
+        "node": ">=10"
       },
-      "engines": {
-        "node": "*"
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/tweetnacl": {
-      "version": "0.14.5",
-      "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
-      "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==",
-      "dev": true
-    },
-    "node_modules/typedarray": {
-      "version": "0.0.6",
-      "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
-      "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==",
-      "dev": true
-    },
     "node_modules/universalify": {
       "version": "0.1.2",
       "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
@@ -2423,37 +2007,6 @@
         "node": ">= 4.0.0"
       }
     },
-    "node_modules/uri-js": {
-      "version": "4.4.1",
-      "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
-      "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
-      "dev": true,
-      "dependencies": {
-        "punycode": "^2.1.0"
-      }
-    },
-    "node_modules/utf8-byte-length": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz",
-      "integrity": "sha512-4+wkEYLBbWxqTahEsWrhxepcoVOJ+1z5PGIjPZxRkytcdSUaNjIjBM7Xn8E+pdSuV7SzvWovBFA54FO0JSoqhA==",
-      "dev": true
-    },
-    "node_modules/util-deprecate": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
-      "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
-      "dev": true
-    },
-    "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.",
-      "dev": true,
-      "bin": {
-        "uuid": "bin/uuid"
-      }
-    },
     "node_modules/validate-npm-package-license": {
       "version": "3.0.4",
       "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
@@ -2464,32 +2017,19 @@
         "spdx-expression-parse": "^3.0.0"
       }
     },
-    "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==",
+    "node_modules/which": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+      "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
       "dev": true,
-      "engines": [
-        "node >=0.6.0"
-      ],
-      "dependencies": {
-        "assert-plus": "^1.0.0",
-        "core-util-is": "1.0.2",
-        "extsprintf": "^1.2.0"
-      }
-    },
-    "node_modules/verror/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==",
-      "dev": true
-    },
-    "node_modules/walk": {
-      "version": "2.3.15",
-      "resolved": "https://registry.npmjs.org/walk/-/walk-2.3.15.tgz",
-      "integrity": "sha512-4eRTBZljBfIISK1Vnt69Gvr2w/wc3U6Vtrw7qiN5iqYJPH7LElcYh/iU4XWhdCy2dZqv1ToMyYlybDylfG/5Vg==",
       "dependencies": {
-        "foreachasync": "^3.0.0"
+        "isexe": "^2.0.0"
+      },
+      "bin": {
+        "node-which": "bin/node-which"
+      },
+      "engines": {
+        "node": ">= 8"
       }
     },
     "node_modules/wrappy": {
@@ -2499,43 +2039,27 @@
       "dev": true
     },
     "node_modules/xmlbuilder": {
-      "version": "8.2.2",
-      "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-8.2.2.tgz",
-      "integrity": "sha512-eKRAFz04jghooy8muekqzo8uCSVNeyRedbuJrp0fovbLIi7wlsYtdUn3vBAAPq2Y3/0xMz2WMEUQ8yhVVO9Stw==",
-      "dev": true,
-      "engines": {
-        "node": ">=4.0"
-      }
-    },
-    "node_modules/xmldom": {
-      "version": "0.1.31",
-      "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.31.tgz",
-      "integrity": "sha512-yS2uJflVQs6n+CyjHoaBmVSqIDevTAWrzMmjG1Gc7h1qQ7uVozNhEPJAwZXWyGQ/Gafo3fCwrcaokezLPupVyQ==",
-      "deprecated": "Deprecated due to CVE-2021-21366 resolved in 0.5.0",
+      "version": "15.1.1",
+      "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz",
+      "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==",
       "dev": true,
       "engines": {
-        "node": ">=0.1"
+        "node": ">=8.0"
       }
     },
-    "node_modules/xtend": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz",
-      "integrity": "sha512-vMNKzr2rHP9Dp/e1NQFnLQlwlhp9L/LfvnsVdHxN1f+uggyVI3i08uD14GPvCToPkdsRfyPqIyYGmIk58V98ZQ==",
-      "dev": true,
-      "dependencies": {
-        "object-keys": "~0.4.0"
-      },
-      "engines": {
-        "node": ">=0.4"
-      }
+    "node_modules/yallist": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+      "dev": true
     },
     "node_modules/yargs-parser": {
-      "version": "10.1.0",
-      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz",
-      "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==",
+      "version": "21.1.1",
+      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
+      "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
       "dev": true,
-      "dependencies": {
-        "camelcase": "^4.1.0"
+      "engines": {
+        "node": ">=12"
       }
     },
     "node_modules/yauzl": {
diff --git a/frontend/package.json b/frontend/package.json
index fd0b9e09..8d31abed 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -1,7 +1,7 @@
 {
-  "name": "projectGenerator",
+  "name": "project-generator",
   "productName": "projectGenerator",
-  "version": "0.0.1",
+  "version": "0.1.0",
   "description": "repo for testing a gui using electron for the project generator",
   "license": "MIT",
   "main": "index.js",
@@ -31,13 +31,11 @@
     "electron-app"
   ],
   "dependencies": {
-    "electron-debug": "^0.1.1",
     "moniker": "^0.1.2",
-    "walk": "^2.3.9",
     "n-readlines": "^1.0.0"
   },
   "devDependencies": {
-    "electron-packager": "^12.1.0",
-    "electron-prebuilt": "^0.37.8"
+    "electron": "^24.1.2",
+    "electron-packager": "^17.1.1"
   }
 }
diff --git a/frontend/preload.js b/frontend/preload.js
new file mode 100644
index 00000000..7207df0d
--- /dev/null
+++ b/frontend/preload.js
@@ -0,0 +1,17 @@
+const { contextBridge, ipcRenderer } = require('electron');
+
+// TODO: need fix? (is this insecure?)
+contextBridge.exposeInMainWorld('ipc_wrapper', {
+    send: (event, data) => ipcRenderer.send(event, data),
+    sendSync: (event, data) => ipcRenderer.sendSync(event, data),
+    on: (channel, func) => ipcRenderer.on(channel, func),
+    path: {
+        join: (... args) => ipcRenderer.sendSync('path', ['join', args]),
+        isAbsolute: (p) => ipcRenderer.sendSync('path', ['isAbsolute', [p]]),
+        relative: (from, to) => ipcRenderer.sendSync('path', ['relative', [from, to]]),
+        resolve: (... args) => ipcRenderer.sendSync('path', ['resolve', args]),
+    },
+    fs: {
+        existsSync: (p) => ipcRenderer.sendSync('fs', ['existsSync', [p]]),
+    }
+});

From ed3f27e4c6cb625af64f014ba38530d9de787dfc Mon Sep 17 00:00:00 2001
From: 2bit <i@2bit.jp>
Date: Wed, 26 Apr 2023 12:13:25 +0900
Subject: [PATCH 02/11] clean up

---
 frontend/app.js | 45 ++++++++++++++++++++++++++-------------------
 1 file changed, 26 insertions(+), 19 deletions(-)

diff --git a/frontend/app.js b/frontend/app.js
index e7f1d756..ec079e05 100644
--- a/frontend/app.js
+++ b/frontend/app.js
@@ -1130,7 +1130,6 @@ function browseOfPath() {
 
 function browseProjectPath() {
     var path = $("#projectPath").val();
-    console.log(path);
     if (path === ''){
         path = $("#ofPath").val();
     }
@@ -1163,13 +1162,13 @@ function checkAddSourcePath(index){
 }
 
 function browseSourcePath(index) {
-    var path = $("#ofPath").val();
+    const path = $("#ofPath").val();
     ipc.send('pickSourcePath', path, index); // current path could go here
 }
 
 
 function browseImportProject() {
-    var path = $("#projectPath").val();
+    const path = $("#projectPath").val();
     if (path === ''){
         path = $("#ofPath").val();
     }
@@ -1177,8 +1176,7 @@ function browseImportProject() {
 }
 
 function getUpdatePath() {
-
-    var path = $("#updateMultiplePath").val();
+    const path = $("#updateMultiplePath").val();
     if (path === ''){
         path = $("#ofPath").val();
     }
@@ -1187,31 +1185,40 @@ function getUpdatePath() {
 }
 
 function rescanAddons() {
-    ipc.send('refreshAddonList', $("#ofPath").val());
-    var projectInfo = {};
-    projectInfo['projectName'] = $("#projectName").val();
-    projectInfo['projectPath'] = $("#projectPath").val();
+    ipc.sendSync('refreshAddonList', $("#ofPath").val());
+
+    const projectInfo = {
+        'projectName': $("#projectName").val(),
+        'projectPath': $("#projectPath").val(),
+    };
     ipc.send('isOFProjectFolder', projectInfo);     // <- this forces addon reload
 }
 
 function getRandomSketchName(){
-    var path = $("#projectPath").val();
-    if (path === ''){
+    const path = $("#projectPath").val();
+    if (path === '') {
         $("#projectPath").oneTimeTooltip('Please specify a path first...');
     }
     else {
-        ipc.send('getRandomSketchName', path );
+        const result = ipc.sendSync('getRandomSketchName', path );
+        const {
+            randomisedSketchName,
+            generateMode
+        } = result;
+        $("#projectName").val(randomisedSketchName);
+        switchGenerateMode(generateMode);
     }
 }
 
 function launchInIDE(){
-    var platform = getPlatformList()[0];
-
-    var project = {};
-    project['projectName'] = $("#projectName").val();
-    project['projectPath'] = $("#projectPath").val();
-    project['platform'] = platform;
-    project['ofPath'] = $("#ofPath").val();
+    const platform = getPlatformList()[0];
+
+    const project = {
+        'projectName': $("#projectName").val(),
+        'projectPath': $("#projectPath").val(),
+        'platform': platform,
+        'ofPath': $("#ofPath").val()
+    };
 
     ipc.send('launchProjectinIDE', project );
 }

From cb6896b54fe7b7733c58318ba95fda0ead08bf2f Mon Sep 17 00:00:00 2001
From: 2bit <i@2bit.jp>
Date: Wed, 26 Apr 2023 12:14:01 +0900
Subject: [PATCH 03/11] update some ipc messaging

---
 frontend/index.js | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/frontend/index.js b/frontend/index.js
index 4b9186c0..bf30a1ef 100644
--- a/frontend/index.js
+++ b/frontend/index.js
@@ -397,6 +397,7 @@ function getGoodSketchName(currentProjectPath){
             if (fs.existsSync(path.join(currentProjectPath, goodName))) {
                 console.log("«" + goodName + "» already exists, generating a new name...");
                 const adjective = projectNames.choose();
+                console.log(adjective);
                 goodName = "my" + adjective.charAt(0).toUpperCase() + adjective.slice(1) + "Sketch";
             } else {
                 foundOne = true;
@@ -608,6 +609,7 @@ ipcMain.on('isOFProjectFolder', function(event, project) {
 ipcMain.on('refreshAddonList', function(event, arg) {
     console.log("in refresh " + arg)
     parseAddonsAndUpdateSelect(arg);
+    event.returnValue = true;
 });
 
 ipcMain.on('refreshPlatformList', function(event, arg) {
@@ -684,8 +686,9 @@ ipcMain.on('refreshTemplateList', function (event, arg) {
 
 ipcMain.on('getRandomSketchName', function(event, arg) {
     const goodName = getGoodSketchName(arg);
-    event.sender.send('setRandomisedSketchName', goodName);
-    event.sender.send('setGenerateMode', 'createMode'); // it's a new sketch name, we are in create mode
+    event.returnValue = { randomisedSketchName: goodName, generateMode: 'createMode' };
+    // event.sender.send('setRandomisedSketchName', goodName);
+    // event.sender.send('setGenerateMode', 'createMode'); // it's a new sketch name, we are in create mode
 });
 
 function getPgPath() {

From 3d1642aa89144dd2cb67901226259052e7e68dcb Mon Sep 17 00:00:00 2001
From: 2bit <i@2bit.jp>
Date: Thu, 27 Apr 2023 01:40:12 +0900
Subject: [PATCH 04/11] update electron versions

---
 frontend/package.json | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/frontend/package.json b/frontend/package.json
index 8d31abed..0de0b2a7 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -16,11 +16,11 @@
   },
   "scripts": {
     "start": "electron .",
-    "build": "electron-packager . $npm_package_productName --icon=static/icon/of.icns --out=dist --ignore='dist' --ignore='readme.md' --prune --all --overwrite --electron-version=0.37.8",
-    "build:osx": "electron-packager . $npm_package_productName --icon=static/icon/of.icns --out=dist --ignore='dist' --ignore='readme.md' --prune --overwrite --electron-version=0.37.8 --platform=darwin --arch=x64",
-    "build:linux32": "electron-packager . $npm_package_productName --icon=static/icon/of.icns --out=dist --ignore='dist' --ignore='readme.md' --prune --overwrite --electron-version=0.37.8 --platform=linux --arch=ia32",
-    "build:linux64": "electron-packager . $npm_package_productName --icon=static/icon/of.icns --out=dist --ignore='dist' --ignore='readme.md' --prune --overwrite --electron-version=0.37.8 --platform=linux --arch=x64",
-    "build:vs": "electron-packager . --icon=static/icon/of.ico --out=dist --ignore='dist' --ignore='readme.md' --prune --overwrite --electron-version=0.37.8 --platform=win32 --arch=ia32"
+    "build": "electron-packager . $npm_package_productName --icon=static/icon/of.icns --out=dist --ignore='dist' --ignore='readme.md' --prune --all --overwrite --electron-version=17.1.1",
+    "build:osx": "electron-packager . $npm_package_productName --icon=static/icon/of.icns --out=dist --ignore='dist' --ignore='readme.md' --prune --overwrite --electron-version=17.1.1 --platform=darwin --arch=x64",
+    "build:linux32": "electron-packager . $npm_package_productName --icon=static/icon/of.icns --out=dist --ignore='dist' --ignore='readme.md' --prune --overwrite --electron-version=17.1.1 --platform=linux --arch=ia32",
+    "build:linux64": "electron-packager . $npm_package_productName --icon=static/icon/of.icns --out=dist --ignore='dist' --ignore='readme.md' --prune --overwrite --electron-version=17.1.1 --platform=linux --arch=x64",
+    "build:vs": "electron-packager . --icon=static/icon/of.ico --out=dist --ignore='dist' --ignore='readme.md' --prune --overwrite --electron-version=17.1.1 --platform=win32 --arch=ia32"
   },
   "files": [
     "index.html",

From e4490bddee074530be81bed5fbdeec905b0c81ee Mon Sep 17 00:00:00 2001
From: 2bit <i@2bit.jp>
Date: Thu, 27 Apr 2023 01:42:46 +0900
Subject: [PATCH 05/11] fix about "update multiple"

---
 frontend/app.js | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/frontend/app.js b/frontend/app.js
index ec079e05..28f59b6b 100644
--- a/frontend/app.js
+++ b/frontend/app.js
@@ -1176,12 +1176,12 @@ function browseImportProject() {
 }
 
 function getUpdatePath() {
-    const path = $("#updateMultiplePath").val();
-    if (path === ''){
-        path = $("#ofPath").val();
+    let updateMultiplePath = $("#updateMultiplePath").val();
+    if (updateMultiplePath === ''){
+        updateMultiplePath = $("#ofPath").val();
     }
 
-    ipc.send('pickUpdatePath', path); // current path could go here
+    ipc.send('pickUpdatePath', updateMultiplePath); // current path could go here
 }
 
 function rescanAddons() {

From 2aae0b4c91401367ed73784743e930229d9dc2bf Mon Sep 17 00:00:00 2001
From: 2bit <i@2bit.jp>
Date: Thu, 27 Apr 2023 02:17:36 +0900
Subject: [PATCH 06/11] fix url

---
 frontend/package.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/frontend/package.json b/frontend/package.json
index 0de0b2a7..067d84e5 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -9,7 +9,7 @@
   "author": {
     "name": "zach lieberman",
     "email": "?",
-    "url": "openframeworks.cc"
+    "url": "https://openframeworks.cc"
   },
   "engines": {
     "node": ">=6.11.0"

From cae057a7065acfcf5ba463dbb34042217fa9eda5 Mon Sep 17 00:00:00 2001
From: 2bit <i@2bit.jp>
Date: Thu, 27 Apr 2023 02:17:53 +0900
Subject: [PATCH 07/11] clean up and add TODO

---
 frontend/app.js | 424 ++++++++++++++++++++++--------------------------
 1 file changed, 191 insertions(+), 233 deletions(-)

diff --git a/frontend/app.js b/frontend/app.js
index 28f59b6b..532207ce 100644
--- a/frontend/app.js
+++ b/frontend/app.js
@@ -4,8 +4,8 @@
 const ipc = window.ipc_wrapper;
 const path = ipc.path;
 
-var platforms;
-var templates;
+let platforms;
+let templates;
 
 // var platforms = {
 //     "osx": "OS X (Xcode)",
@@ -36,27 +36,23 @@ ipc.on('setOfPath', function(event, arg) {
 });
 
 ipc.on('cwd', function(event, arg) {
-
     console.log(arg);
 });
 
 ipc.on('setUpdatePath', function(event, arg) {
-    var elem = document.getElementById("updateMultiplePath");
+    const elem = document.getElementById("updateMultiplePath");
     elem.value = arg;
     $("#updateMultiplePath").change();
-
 });
 
 ipc.on('isUpdateMultiplePathOk', function(event, arg) {
-   if (arg == true){
+    if (arg == true){
         $("#updateMultipleWrongMessage").hide();
         $("#updateMultipleButton").removeClass("disabled");
-
-   } else {
+    } else {
         $("#updateMultipleWrongMessage").show();
         $("#updateMultipleButton").addClass("disabled");
-
-   }
+    }
 });
 
 //-------------------------------------------
@@ -67,7 +63,6 @@ ipc.on('setup', function(event, arg) {
 //-----------------------------------------
 // this is called from main when defaults are loaded in:
 ipc.on('setDefaults', function(event, arg) {
-
     defaultSettings = arg;
     setOFPath(defaultSettings['defaultOfPath']);
     enableAdvancedMode(defaultSettings['advancedMode']);
@@ -107,35 +102,30 @@ ipc.on('importProjectSettings', function(event, settings) {
 
 //-------------------------------------------
 ipc.on('setAddons', function(event, arg) {
-
     console.log("got set addons");
     console.log(arg);
 
     addonsInstalled = arg;
 
-    var select = document.getElementById("addonsList");
+    const select = document.getElementById("addonsList");
     select.innerHTML = "";
 
-    if (arg !== null && arg.length > 0) {
+    if (addonsInstalled !== null && addonsInstalled.length > 0) {
         // add:
-        for (var i = 0; i < arg.length; i++) {
-
+        for(let i = 0; i < addonsInstalled.length; i++) {
             $('<div/>', {
                 "class": 'item',
-                "data-value": arg[i]
-            }).html(arg[i]).appendTo(select);
+                "data-value": addonsInstalled[i]
+            }).html(addonsInstalled[i]).appendTo(select);
         }
 
         $("#ofPathSierraMessage").hide();
         $("#ofPathWrongMessage").hide();
         isOfPathGood = true;
-
-
-
     } else {
-        if(isFirstTimeSierra){
+        if(isFirstTimeSierra) {
             $("#ofPathSierraMessage").show();
-        }else{
+        } else {
             $("#ofPathWrongMessage").show();
         }
         isOfPathGood = false;
@@ -143,13 +133,10 @@ ipc.on('setAddons', function(event, arg) {
 
         // bounce to settings
         //$('.main .ui').tab('change tab', 'settings')
-
-
-
     }
 
 
-  $('#addonsDropdown')
+    $('#addonsDropdown')
         .dropdown({
             allowAdditions: false,
             fullTextSearch: 'exact',
@@ -167,11 +154,8 @@ ipc.on('setPlatforms', function(event, arg) {
     platforms = arg;
 
 
-    var select = document.getElementById("platformList");
-    var option, i;
-    for (var i in platforms) {
-        var myClass = 'platform';
-
+    let select = document.getElementById("platformList");
+    for (const i in platforms) {
         $('<div/>', {
             "class": 'item',
             "data-value": i
@@ -179,22 +163,21 @@ ipc.on('setPlatforms', function(event, arg) {
     }
 
     // start the platform drop down.
-    $('#platformsDropdown').dropdown({
+    $('#platformsDropdown')
+        .dropdown({
             allowAdditions: false
         });
 
     // set the platform to default
     $('#platformsDropdown').dropdown('set exactly', defaultSettings['defaultPlatform']);
 
-    var select = document.getElementById("platformListMulti");
-    var option, i;
-    for (var i in platforms) {
-        var myClass = 'platform';
-
+    select = document.getElementById("platformListMulti");
+    for (const i in platforms) {
         $('<div/>', {
             "class": 'item',
             "data-value": i
-        }).html(platforms[i]).appendTo(select);        }
+        }).html(platforms[i]).appendTo(select);
+    }
 
     // start the platform drop down.
     $('#platformsDropdownMulti')
@@ -214,12 +197,9 @@ ipc.on('setTemplates', function(event, arg) {
 
     templates = arg;
 
-    var select = document.getElementById("templateList");
-    var option, i;
-    for (var i in templates) {
+    let select = document.getElementById("templateList");
+    for (const i in templates) {
         console.log(i);
-        var myClass = 'template';
-
         $('<div/>', {
             "class": 'item',
             "data-value": i
@@ -230,22 +210,19 @@ ipc.on('setTemplates', function(event, arg) {
 
     // start the template drop down.
     $('#templatesDropdown')
-    .dropdown({
-        allowAdditions: false,
-        fullTextSearch: 'exact',
-        match: "text",
-        maxSelections: 1
-    });
+        .dropdown({
+            allowAdditions: false,
+            fullTextSearch: 'exact',
+            match: "text",
+            maxSelections: 1
+        });
 
     // // set the template to default
     //$('#templatesDropdown').dropdown('set exactly', defaultSettings['defaultTemplate']);
 
     // Multi
-    var select = document.getElementById("templateListMulti");
-    var option, i;
-    for (var i in templates) {
-        var myClass = 'template';
-
+    select = document.getElementById("templateListMulti");
+    for (const i in templates) {
         $('<div/>', {
             "class": 'item',
             "data-value": i
@@ -288,22 +265,20 @@ ipc.on('enableTemplate', function (event, arg) {
 //-------------------------------------------
 // select the list of addons and notify if some aren't installed
 ipc.on('selectAddons', function(event, arg) {
-
-
     // todo : DEAL WITH LOCAL ADDONS HERE....
 
-    var addonsAlreadyPicked = $("#addonsDropdown").val().split(',');
+    const addonsAlreadyPicked = $("#addonsDropdown").val().split(',');
 
     console.log(addonsAlreadyPicked);
     console.log(arg);
     console.log(addonsInstalled);
 
-    var neededAddons = [];
+    const neededAddons = [];
     localAddons = [];
 
     //haystack.indexOf(needle) >= 0
 
-    for (var i = 0; i < arg.length; i++) {
+    for (let i = 0; i < arg.length; i++) {
         arg[i] = arg[i].trim();
         // first, check if it's already picked, then do nothing
         if (addonsAlreadyPicked.indexOf(arg[i]) >= 0){
@@ -314,8 +289,7 @@ ipc.on('selectAddons', function(event, arg) {
             if (addonsInstalled.indexOf(arg[i]) >= 0){
                 $('#addonsDropdown').dropdown('set selected', arg[i]);
             } else {
-
-                var neededAddonPathRel = path.join($("#projectPath").val(), $("#projectName").val(), arg[i]);
+                const neededAddonPathRel = path.join($("#projectPath").val(), $("#projectName").val(), arg[i]);
                 console.log(neededAddonPathRel);
                 if (fs.existsSync(neededAddonPathRel)
                     || fs.existsSync(neededAddons[i]))
@@ -357,30 +331,24 @@ ipc.on('selectAddons', function(event, arg) {
     }
 
 
-// <div class="ui red message" id="missingAddonMessage" style="display: none">
-//     <p>
-//         <div class="header">
-//             Missing addons
-//         </div>
-//     </p>
-//     <p>you are attempting to update a project that is missing the following addons</p>
-//     <p><div id="missingAddonList"></div></p>
-//     <p>please download the missing addons and put them in your addons folder, then relaunch the project generator.</p>
-//     <p>if you choose to update this project without these addons, you may overwrite the settings on the project.</p>
-// </div>
-
-
-
-
+    // <div class="ui red message" id="missingAddonMessage" style="display: none">
+    //     <p>
+    //         <div class="header">
+    //             Missing addons
+    //         </div>
+    //     </p>
+    //     <p>you are attempting to update a project that is missing the following addons</p>
+    //     <p><div id="missingAddonList"></div></p>
+    //     <p>please download the missing addons and put them in your addons folder, then relaunch the project generator.</p>
+    //     <p>if you choose to update this project without these addons, you may overwrite the settings on the project.</p>
+    // </div>
 });
 
 //-------------------------------------------
 // allow main to send UI messages
 ipc.on('sendUIMessage', function(event, arg) {
-
     // check if it has "success" message:
 
-
     displayModal(arg);
 });
 
@@ -420,16 +388,13 @@ function setOFPath(arg) {
     const elem = document.getElementById("ofPath");
 
     if (arg != null && !path.isAbsolute(arg)) {
-
         // if we are relative, don't do anything...
 
         elem.value = arg;
-
     } else {
-
         // else check settings for how we want this path.... make relative if we need to:
         if (defaultSettings['useRelativePath'] === true) {
-            var relativePath = path.normalize(path.relative(path.resolve(__dirname), arg)) + "/";
+            const relativePath = path.normalize(path.relative(path.resolve(__dirname), arg)) + "/";
             elem.value = relativePath;
         } else {
             elem.value = arg;
@@ -444,43 +409,43 @@ function setOFPath(arg) {
 function setup() {
 
     jQuery.fn.extend({
-      oneTimeTooltip: function(msg) {
-        return this.each(function() {
-            $(this).popup({
-                content : msg,
-                position : 'bottom center',
-                on: 'manual',
-                onVisible: function(e){
-                    // hide on focus / change / onShow (for dropdowns)
-                    $(e).one('focus change click', function(){ $(this).popup('hide');} );
-                    console.log($(e).children('input'));
-                }
-            }).popup('show')
-        });
-      }
+        oneTimeTooltip: function (msg) {
+            return this.each(function () {
+                $(this).popup({
+                    content: msg,
+                    position: 'bottom center',
+                    on: 'manual',
+                    onVisible: function (e) {
+                        // hide on focus / change / onShow (for dropdowns)
+                        $(e).one('focus change click', function () { $(this).popup('hide'); });
+                        console.log($(e).children('input'));
+                    }
+                }).popup('show')
+            });
+        }
     });
 
 
     $(document).ready(function() {
-
-
-        try{
-            var os = require('os');
-
-            var os_release = os.release();
-            var os_major_pos = os_release.indexOf(".");
-            var os_major = os_release.slice(0, os_major_pos);
-
-            var isSierra = (os.platform() === 'darwin' && Number(os_major)>=16);
-            if(isSierra){
-                var ofpath = document.getElementById("ofPath").value;
-                var runningOnVar = false
-                try{
+        try {
+            // TODO: need to fix?
+            const os = require('os');
+
+            const os_release = os.release();
+            const os_major_pos = os_release.indexOf(".");
+            const os_major = os_release.slice(0, os_major_pos);
+
+            const isSierra = (os.platform() === 'darwin' && parseInt(os_major) >= 16);
+            if(isSierra) {
+                const ofpath = document.getElementById("ofPath").value;
+                try {
                     runningOnVar = (ofpath.length >= 8 && ofpath.substring(0,8)==='/private');
-                }catch(e){}
-                isFirstTimeSierra = runningOnVar;
+                    isFirstTimeSierra = runningOnVar;
+                } catch(e) {
+                    isFirstTimeSierra = false;
+                }
             }
-        }catch(e){
+        } catch(e) {
             isFirstTimeSierra = false;
         }
 
@@ -503,7 +468,7 @@ function setup() {
 
         $("#updateMenuButton").tab({
             'onVisible':function(){
-                if (isOfPathGood !== true){
+                if (isOfPathGood !== true) {
                     $('#settingsMenuButton').click();
                      $('#ofPathError').modal({
                         onHide: function () {
@@ -515,7 +480,7 @@ function setup() {
         });
 
         $("#settingsMenuButton").tab({
-            'onVisible':function(){
+            'onVisible': () => {
                 console.log("settings!! ");
                 $('#createMenuButon').removeClass('active');
                 $('#updateMenuButton').removeClass('active');
@@ -537,13 +502,16 @@ function setup() {
 
         // bind external URLs (load it in default browser; not within Electron)
         $('*[data-toggle="external_target"]').click(function (e) {
+            // TODO: need to fix
             e.preventDefault();
-            var shell = require('shell');
+            const shell = require('shell');
             shell.openExternal( $(this).prop('href') );
         });
 
         $("#projectPath").on('change', function () {
-        	if( $(this).is(":focus")===true ){ return; }
+        	if($(this).is(":focus") === true) {
+                 return; 
+            }
 
             $("#projectName").trigger('change'); // checks the project on the new location
         });
@@ -554,15 +522,15 @@ function setup() {
         $("#projectName").on('change', function () {
         	if( $(this).is(":focus")===true ){ return; }
 
-        	var project = {};
-
             // fix "non alpha numeric characters here" as we did in the old PG
-            var currentStr = $("#projectName").val()
-            var stripped = currentStr.replace(/[&\/\\#,+()$~%.'":*?<>{}]/g,'_');
+            const currentStr = $("#projectName").val()
+            const stripped = currentStr.replace(/[&\/\\#,+()$~%.'":*?<>{}]/g, '_');
             $("#projectName").val(stripped)
 
-        	project['projectName'] = $("#projectName").val();
-        	project['projectPath'] = $("#projectPath").val();
+        	const project = {
+                projectName: $("#projectName").val(),
+                projectPath: $("#projectPath").val()
+            };
 
         	// check if project exists
         	ipc.send('isOFProjectFolder', project);
@@ -580,7 +548,7 @@ function setup() {
         });
 
         $("#advancedOptions").checkbox();
-        $("#advancedOptions").on("change", function() {
+        $("#advancedOptions").on("change", () => {
             if ($("#advancedOptions").filter(":checked").length > 0) {
                 enableAdvancedMode(true);
             } else {
@@ -608,13 +576,15 @@ function setup() {
 
 
         $("#ofPath").on("change", function(){
-            var ofpath = $("#ofPath").val();
-            defaultSettings['defaultOfPath'] =  ofpath;
+            const ofpath = $("#ofPath").val();
+            defaultSettings['defaultOfPath'] = ofpath;
             console.log("ofPath val " + ofpath);
-            if(isFirstTimeSierra){
-                //var sys = require('sys')
-                var exec = require('child_process').exec;
-                function puts(error, stdout, stderr) { console.log(stdout + " " + stderr) }
+            if(isFirstTimeSierra) {
+                // TODO: need to fix (move to main process with ipc send sync?)
+                const exec = require('child_process').exec;
+                function puts(error, stdout, stderr) {
+                    console.log(stdout + " " + stderr);
+                }
                 exec("xattr -r -d com.apple.quarantine " + ofpath + "/projectGenerator-osx/projectGenerator.app", puts);
                 $("#projectPath").val(ofpath + "/apps/myApps").trigger('change');
 
@@ -639,18 +609,20 @@ function setup() {
 
         // updates ofPath when the field is manually changed
         $("#ofPath").on('blur', function(e){
-            var ofpath = $(this).val();
+            const ofpath = $(this).val();
             setOFPath(ofpath);
-            if(isFirstTimeSierra){
-                //var sys = require('sys')
-                var exec = require('child_process').exec;
-                function puts(error, stdout, stderr) { console.log(stdout + " " + stderr) }
+            if(isFirstTimeSierra) {
+                // TODO: need to fix (move to main process with ipc send sync?)
+                const exec = require('child_process').exec;
+                function puts(error, stdout, stderr) { 
+                    console.log(stdout + " " + stderr);
+                }
                 exec("xattr -d com.apple.quarantine " + ofpath + "/projectGenerator-osx/projectGenerator.app", puts);
                 $("#projectPath").val(ofpath + "/apps/myApps").trigger('change');
                 //exec("xattr -d com.apple.quarantine " + ofpath + "/projectGenerator-osx/projectGenerator.app", puts);
             }
         }).on('keypress', function(e){
-            if(e.which==13){
+            if(e.which == 13){
                 e.preventDefault();
                 $(this).blur();
             }
@@ -658,9 +630,9 @@ function setup() {
 
 
         /* Stuff for the console setting (removed from UI)
-	$("#consoleToggle").on("change", function () {
-		enableConsole( $(this).is(':checked') );
-	});*/
+        $("#consoleToggle").on("change", function () {
+            enableConsole( $(this).is(':checked') );
+        });*/
         // enable console? (hiddens setting)
         // if(defaultSettings['showConsole']){ $("body").addClass('enableConsole'); }
         // $("#showConsole").on('click', function(){ $('body').addClass('showConsole'); });
@@ -775,15 +747,14 @@ function blockDragEvent(e){
 
 function acceptDraggedFiles( e ){
      // handle file
-    var files = e.originalEvent.dataTransfer.files;
-    var types = e.originalEvent.dataTransfer.types;
+    const files = e.originalEvent.dataTransfer.files;
+    const types = e.originalEvent.dataTransfer.types;
 
     // this first check filters out most files
-    if(files && files.length == 1 && files[0].type==="" && types[0]=="Files"){
-
+    if(files && files.length == 1 && files[0].type == "" && types[0] == "Files"){
         // this folder check is more relayable
-        var file = e.originalEvent.dataTransfer.items[0].webkitGetAsEntry();
-        if( file.isDirectory ){
+        const file = e.originalEvent.dataTransfer.items[0].webkitGetAsEntry();
+        if(file.isDirectory) {
             return true;
         }
     }
@@ -823,11 +794,11 @@ function onDropFile( e ){
             $("updateMenuButton").triggerHandler('click');
         }
         else {
-            var files = e.originalEvent.dataTransfer.files;
+            const files = e.originalEvent.dataTransfer.files;
             // import single project folder
             $("#projectName").val( files[0].name );
-            var projectFullPath = files[0].path;
-            var projectParentPath = path.normalize(projectFullPath+'/..');            
+            const projectFullPath = files[0].path;
+            const projectParentPath = path.normalize(projectFullPath + '/..');
             $("#projectPath").val( projectParentPath ).triggerHandler('change');
 
             $("createMenuButon").triggerHandler('click');
@@ -840,8 +811,8 @@ function onDropFile( e ){
         $("#dropZone").addClass("deny").removeClass("accept");
 
         displayModal(
-                "The file you dropped is not compatible for importing.<br>"+
-                "To import an OpenFrameworks project, drag & drop the whole project folder."
+            `The file you dropped is not compatible for importing.<br>
+            To import an OpenFrameworks project, drag & drop the whole project folder.`
         );
     }
     return false;
@@ -894,48 +865,48 @@ function saveDefaultSettings() {
 //----------------------------------------
 function generate() {
     // let's get all the info:
-    var platformValueArray = getPlatformList();
+    const platformValueArray = getPlatformList();
 
-    var templatePicked = $("#templatesDropdown .active");
-    var templateValueArray = [];
-    for (var i = 0; i < templatePicked.length; i++){
+    const templatePicked = $("#templatesDropdown .active");
+    const templateValueArray = [];
+    for (let i = 0; i < templatePicked.length; i++){
         templateValueArray.push($(templatePicked[i]).attr("data-value"));
     }
 
-    var addonsPicked = $("#addonsDropdown  .active");
-    var addonValueArray = [];
+    const addonsPicked = $("#addonsDropdown  .active");
+    const addonValueArray = [];
 
-    for (var i = 0; i < addonsPicked.length; i++){
+    for(let i = 0; i < addonsPicked.length; i++) {
         addonValueArray.push($(addonsPicked[i]).attr("data-value"));
     }
 
     // add any local addons
-    for (var i = 0; i < localAddons.length; i++){
+    for(let i = 0; i < localAddons.length; i++) {
         addonValueArray.push(localAddons[i]);
     }
 
     // extra source locations
-    var srcExtraArr = "";
-    for(var i = 0; i < numAddedSrcPaths; i++){
-        var srcExtra = $("#sourceExtra-"+i).val();
+    const srcExtraArr = [];
+    for(let i = 0; i < numAddedSrcPaths; i++) {
+        const srcExtra = $("#sourceExtra-" + i).val();
         if( srcExtra != '' ){
-            srcExtraArr += ", " + srcExtra;
+            srcExtraArr.push(srcExtra);
         }
     }
-    
-
-    var lengthOfPlatforms = platformValueArray.length;
-
-    var gen = {};
-
-    gen['projectName'] = $("#projectName").val();
-    gen['projectPath'] = $("#projectPath").val();
-    gen['sourcePath'] = srcExtraArr;
-    gen['platformList'] = platformValueArray;
-    gen['templateList'] = templateValueArray;
-    gen['addonList'] = addonValueArray; //$("#addonsDropdown").val();
-    gen['ofPath'] = $("#ofPath").val();
-    gen['verbose'] = bVerbose;
+    const srcExtraList = srcExtraArr.join(',');
+
+    const lengthOfPlatforms = platformValueArray.length;
+
+    const gen = {
+        projectName: $("#projectName").val(),
+        projectPath: $("#projectPath").val(),
+        sourcePath: srcExtraList,
+        platformList: platformValueArray,
+        templateList: templateValueArray,
+        addonList: addonValueArray,  //$("#addonsDropdown").val();
+        ofPath: $("#ofPath").val(),
+        verbose: bVerbose
+    };
 
     // console.log(gen);
     if (gen['projectName'] === '') {
@@ -947,39 +918,34 @@ function generate() {
     } else {
         ipc.send('generate', gen);
     }
-
 }
 
 
 //----------------------------------------
 function updateRecursive() {
-
     // get the path and the platform list
+    // platformsDropdownMulti
 
-
-    //platformsDropdownMulti
-
-
-
-    var platformsPicked = $("#platformsDropdownMulti  .active");
-    var platformValueArray = [];
-    for (var i = 0; i < platformsPicked.length; i++){
+    const platformsPicked = $("#platformsDropdownMulti  .active");
+    const platformValueArray = [];
+    for (let i = 0; i < platformsPicked.length; i++){
         platformValueArray.push($(platformsPicked[i]).attr("data-value"));
     }
 
-    var templatePicked = $("#templatesDropdownMulti .active");
-    var templateValueArray = [];
-    for (var i = 0; i < templatePicked.length; i++){
+    const templatePicked = $("#templatesDropdownMulti .active");
+    const templateValueArray = [];
+    for (let i = 0; i < templatePicked.length; i++){
         templateValueArray.push($(templatePicked[i]).attr("data-value"));
     }
 
-    var gen = {};
-    gen['updatePath'] = $("#updateMultiplePath").val();
-    gen['platformList'] = platformValueArray;
-    gen['templateList'] = templateValueArray;
-    gen['updateRecursive'] = true;
-    gen['ofPath'] = $("#ofPath").val();
-    gen['verbose'] = bVerbose;
+    const gen = {
+        updatePath: $("#updateMultiplePath").val(),
+        platformList: platformValueArray,
+        templateList: templateValueArray,
+        updateRecursive: true,
+        ofPath: $("#ofPath").val(),
+        verbose: bVerbose
+    };
 
     if (gen['updatePath'] === '') {
         displayModal("Please set update path");
@@ -996,7 +962,6 @@ function switchGenerateMode(mode) {
 
     // switch to update mode
     if (mode == 'updateMode') {
-
         $("#generateButton").hide();
         $("#updateButton").show();
         $("#missingAddonMessage").hide();
@@ -1009,7 +974,6 @@ function switchGenerateMode(mode) {
 
         clearAddonSelection();
         clearExtraSourceList();
-
     }
     // [default]: switch to createMode (generate new projects)
     else {
@@ -1028,17 +992,12 @@ function switchGenerateMode(mode) {
         $("#adons-refresh-icon").hide();
 
         console.log('Switching GenerateMode to Create...');
-
-
-
     }
 }
 
 //----------------------------------------
 function clearAddonSelection() {
-
     $('#addonsDropdown').dropdown('clear');
-
 }
 
 //----------------------------------------
@@ -1050,7 +1009,6 @@ function enableAdvancedMode(isAdvanced) {
         $('#sourceExtraSection').show();
         $('#templateSection').show();
         $('#templateSectionMulti').show();
-
     } else {
         $('#platformsDropdown').addClass("disabled");
         $('#platformsDropdown').dropdown('set exactly', defaultSettings['defaultPlatform']);
@@ -1062,7 +1020,6 @@ function enableAdvancedMode(isAdvanced) {
 
         $("body").removeClass('advanced');
         $('a.updateMultiMenuOption').hide();
-
     }
     defaultSettings['advancedMode'] = isAdvanced;
     saveDefaultSettings();
@@ -1085,9 +1042,9 @@ function enableConsole( showConsole ){
 
 //----------------------------------------
 function getPlatformList() {
-    var platformsPicked = $("#platformsDropdown  .active");
-    var platformValueArray = [];
-    for (var i = 0; i < platformsPicked.length; i++){
+    const platformsPicked = $("#platformsDropdown  .active");
+    const platformValueArray = [];
+    for (let i = 0; i < platformsPicked.length; i++){
         platformValueArray.push($(platformsPicked[i]).attr("data-value"));
     }
     return platformValueArray;
@@ -1097,7 +1054,8 @@ function getPlatformList() {
 function displayModal(message) {
     $("#uiModal .content").html(message).find('*[data-toggle="external_target"]').click(function (e) {
 		e.preventDefault();
-		var shell = require('shell');
+        // TODO: need to fix this
+		const shell = require('shell');
 		shell.openExternal( $(this).prop("href") );
     });
 
@@ -1111,8 +1069,8 @@ function displayModal(message) {
 }
 
 //----------------------------------------
-function consoleMessage(message) {
-    message = (message + '').replace(/([^>\r\n]?)(\r\n|\n\r|\r|\n)/g, '$1' + "<br>\n" + '$2'); // nl2br
+function consoleMessage(orig_message) {
+    const message = (orig_message + '').replace(/([^>\r\n]?)(\r\n|\n\r|\r|\n)/g, '$1' + "<br>\n" + '$2'); // nl2br
     $("#console").append($("<p>").html(message));
     $("#consoleContainer").scrollTop($('#console').offset().top); // scrolls console to bottom
 }
@@ -1129,11 +1087,11 @@ function browseOfPath() {
 }
 
 function browseProjectPath() {
-    var path = $("#projectPath").val();
-    if (path === ''){
-        path = $("#ofPath").val();
+    const projectPath = $("#projectPath").val();
+    if (projectPath === ''){
+        projectPath = $("#ofPath").val();
     }
-    ipc.send('pickProjectPath', path); // current path could go here
+    ipc.send('pickProjectPath', projectPath); // current path could go here
 }
 
 function clearExtraSourceList(){
@@ -1146,15 +1104,15 @@ function clearExtraSourceList(){
 
 function checkAddSourcePath(index){
     //if we don't have another field below us - add one
-    var nextFieldId = '#sourceExtra-'+(index+1);
+    const nextFieldId = '#sourceExtra-' + (index + 1);
     if( $(nextFieldId).length == 0 ){
-        var nextIndex = index+1;
-        var extrafield = '<div class="field"> \
-           <div class="ui icon input fluid"> \
-               <input type="text" placeholder="Extra source path..." id="sourceExtra-'+nextIndex+'"> \
-               <i class="search link icon" onclick="browseSourcePath('+nextIndex+')"></i> \
-           </div> \
-        </div>';
+        const nextIndex = index + 1;
+        const extrafield = `<div class="field">
+           <div class="ui icon input fluid">
+               <input type="text" placeholder="Extra source path..." id="sourceExtra-${nextIndex}"> \
+               <i class="search link icon" onclick="browseSourcePath(${nextIndex})"></i> \
+           </div>
+        </div>`;
 
         $("#sourceExtraSection").append(extrafield);
         numAddedSrcPaths++;
@@ -1162,17 +1120,17 @@ function checkAddSourcePath(index){
 }
 
 function browseSourcePath(index) {
-    const path = $("#ofPath").val();
-    ipc.send('pickSourcePath', path, index); // current path could go here
+    const ofPath = $("#ofPath").val();
+    ipc.send('pickSourcePath', ofPath, index); // current path could go here
 }
 
 
 function browseImportProject() {
-    const path = $("#projectPath").val();
-    if (path === ''){
-        path = $("#ofPath").val();
+    const projectPath = $("#projectPath").val();
+    if (projectPath === ''){
+        projectPath = $("#ofPath").val();
     }
-    ipc.send('pickProjectImport', path);
+    ipc.send('pickProjectImport', projectPath);
 }
 
 function getUpdatePath() {
@@ -1195,12 +1153,12 @@ function rescanAddons() {
 }
 
 function getRandomSketchName(){
-    const path = $("#projectPath").val();
-    if (path === '') {
+    const projectPath = $("#projectPath").val();
+    if (projectPath === '') {
         $("#projectPath").oneTimeTooltip('Please specify a path first...');
     }
     else {
-        const result = ipc.sendSync('getRandomSketchName', path );
+        const result = ipc.sendSync('getRandomSketchName', projectPath);
         const {
             randomisedSketchName,
             generateMode

From 525d6ba9ccf97b0e30acf41b9825ef364cefad23 Mon Sep 17 00:00:00 2001
From: 2bit <i@2bit.jp>
Date: Thu, 27 Apr 2023 02:38:13 +0900
Subject: [PATCH 08/11] move to some features to main process from renderer
 process

---
 frontend/app.js   | 35 ++++++++++-------------------------
 frontend/index.js | 14 +++++++++++++-
 2 files changed, 23 insertions(+), 26 deletions(-)

diff --git a/frontend/app.js b/frontend/app.js
index 532207ce..54946fc9 100644
--- a/frontend/app.js
+++ b/frontend/app.js
@@ -428,14 +428,14 @@ function setup() {
 
     $(document).ready(function() {
         try {
-            // TODO: need to fix?
-            const os = require('os');
-
-            const os_release = os.release();
-            const os_major_pos = os_release.indexOf(".");
+            const {
+                release,
+                platform
+            } = ipc.sendSync('getOSInfo');
+            const os_major_pos = release.indexOf(".");
             const os_major = os_release.slice(0, os_major_pos);
+            const isSierra = (platform === 'darwin' && parseInt(os_major) >= 16);
 
-            const isSierra = (os.platform() === 'darwin' && parseInt(os_major) >= 16);
             if(isSierra) {
                 const ofpath = document.getElementById("ofPath").value;
                 try {
@@ -502,10 +502,8 @@ function setup() {
 
         // bind external URLs (load it in default browser; not within Electron)
         $('*[data-toggle="external_target"]').click(function (e) {
-            // TODO: need to fix
             e.preventDefault();
-            const shell = require('shell');
-            shell.openExternal( $(this).prop('href') );
+            ipc.send('openExternal', $(this).prop('href'));
         });
 
         $("#projectPath").on('change', function () {
@@ -580,14 +578,8 @@ function setup() {
             defaultSettings['defaultOfPath'] = ofpath;
             console.log("ofPath val " + ofpath);
             if(isFirstTimeSierra) {
-                // TODO: need to fix (move to main process with ipc send sync?)
-                const exec = require('child_process').exec;
-                function puts(error, stdout, stderr) {
-                    console.log(stdout + " " + stderr);
-                }
-                exec("xattr -r -d com.apple.quarantine " + ofpath + "/projectGenerator-osx/projectGenerator.app", puts);
+                ipc.sendSync('firstTimeSierra', "xattr -r -d com.apple.quarantine " + ofpath + "/projectGenerator-osx/projectGenerator.app");
                 $("#projectPath").val(ofpath + "/apps/myApps").trigger('change');
-
             }
             saveDefaultSettings();
 
@@ -612,12 +604,7 @@ function setup() {
             const ofpath = $(this).val();
             setOFPath(ofpath);
             if(isFirstTimeSierra) {
-                // TODO: need to fix (move to main process with ipc send sync?)
-                const exec = require('child_process').exec;
-                function puts(error, stdout, stderr) { 
-                    console.log(stdout + " " + stderr);
-                }
-                exec("xattr -d com.apple.quarantine " + ofpath + "/projectGenerator-osx/projectGenerator.app", puts);
+                ipc.sendSync("xattr -d com.apple.quarantine " + ofpath + "/projectGenerator-osx/projectGenerator.app");
                 $("#projectPath").val(ofpath + "/apps/myApps").trigger('change');
                 //exec("xattr -d com.apple.quarantine " + ofpath + "/projectGenerator-osx/projectGenerator.app", puts);
             }
@@ -1054,9 +1041,7 @@ function getPlatformList() {
 function displayModal(message) {
     $("#uiModal .content").html(message).find('*[data-toggle="external_target"]').click(function (e) {
 		e.preventDefault();
-        // TODO: need to fix this
-		const shell = require('shell');
-		shell.openExternal( $(this).prop("href") );
+        ipc.send('openExternal', $(this).prop("href") );
     });
 
     if (message.indexOf("Success!") > -1){
diff --git a/frontend/index.js b/frontend/index.js
index bf30a1ef..3ff102c2 100644
--- a/frontend/index.js
+++ b/frontend/index.js
@@ -11,7 +11,8 @@ const {
     dialog,
     ipcMain,
     Menu,
-    crashReporter
+    crashReporter,
+    shell,
 } = require('electron');
 
 
@@ -1060,4 +1061,15 @@ ipcMain.on('fs', (event, [ key, args ]) => {
     console.log('fs', key, args);
     event.returnValue = fs[key](... args);
     return;
+});
+
+ipcMain.on('getOSInfo', (event) => {
+    event.returnValue = {
+        release: os.release(),
+        platform: os.platform(),
+    };
+});
+
+ipcMain.on('openExternal', (event, [ url ]) => {
+    shell.openExternal(url);
 });
\ No newline at end of file

From 52af21254c24fbbccf07f772deec777705c161f0 Mon Sep 17 00:00:00 2001
From: 2bit <i@2bit.jp>
Date: Thu, 27 Apr 2023 02:40:59 +0900
Subject: [PATCH 09/11] update .gitignore

only check on macos
---
 .gitignore | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/.gitignore b/.gitignore
index 03d557c9..ff69d2b0 100644
--- a/.gitignore
+++ b/.gitignore
@@ -91,4 +91,8 @@ Icon
 .AppleDesktop
 Network Trash Folder
 Temporary Items
-.apdisk
\ No newline at end of file
+.apdisk
+
+commandLine/bin/projectGenerator*
+frontend/app/projectGenerator*
+

From 4998f6cbef58a1c4b7d8b36c3117012c7bff0c24 Mon Sep 17 00:00:00 2001
From: 2bit <i@2bit.jp>
Date: Thu, 27 Apr 2023 02:42:58 +0900
Subject: [PATCH 10/11] omg... forgot to commit

---
 frontend/index.js | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/frontend/index.js b/frontend/index.js
index 3ff102c2..933263b3 100644
--- a/frontend/index.js
+++ b/frontend/index.js
@@ -1072,4 +1072,10 @@ ipcMain.on('getOSInfo', (event) => {
 
 ipcMain.on('openExternal', (event, [ url ]) => {
     shell.openExternal(url);
+});
+
+ipcMain.on('firstTimeSierra', (event, command) => {
+    exec(command, function callback(error, stdout, stderr){
+        console.log(stdout + " " + stderr);
+    });
 });
\ No newline at end of file

From efa90085ada1c2a7c410ab7569af013347edaa30 Mon Sep 17 00:00:00 2001
From: 2bit <i@2bit.jp>
Date: Thu, 27 Apr 2023 07:59:22 +0900
Subject: [PATCH 11/11] fix about extra source path

---
 frontend/app.js   | 12 +++++++-----
 frontend/index.js | 14 ++++++--------
 2 files changed, 13 insertions(+), 13 deletions(-)

diff --git a/frontend/app.js b/frontend/app.js
index 54946fc9..6b8d28a1 100644
--- a/frontend/app.js
+++ b/frontend/app.js
@@ -86,7 +86,7 @@ ipc.on('setProjectPath', function(event, arg) {
 //-------------------------------------------
 ipc.on('setSourceExtraPath', function(event, [arg, index]) { // TODO:
     checkAddSourcePath(index);
-    $("#sourceExtra-"+index).val(arg);
+    $("#sourceExtra-" + index).val(arg);
 });
 
 //-------------------------------------------
@@ -244,7 +244,9 @@ ipc.on('setTemplates', function(event, arg) {
 ipc.on('enableTemplate', function (event, arg) {
 
     console.log('enableTemplate');
-    let items = arg.bMulti === false ? $('#templatesDropdown .menu .item') : $('#templatesDropdownMulti .menu .item');
+    const items = arg.bMulti === false
+                ? $('#templatesDropdown .menu .item')
+                : $('#templatesDropdownMulti .menu .item');
 
     // enable all first
     for (let i = 0; i < items.length; i++) {
@@ -252,7 +254,7 @@ ipc.on('enableTemplate', function (event, arg) {
         item.removeClass("disabled");
     }
 
-    for (let template of arg.invalidTemplateList) {
+    for (const template of arg.invalidTemplateList) {
         for (let i = 0; i < items.length; i++) {
             let item = $(items[i]);
             if (item.attr('data-value') === template) {
@@ -1090,7 +1092,7 @@ function clearExtraSourceList(){
 function checkAddSourcePath(index){
     //if we don't have another field below us - add one
     const nextFieldId = '#sourceExtra-' + (index + 1);
-    if( $(nextFieldId).length == 0 ){
+    if( $(nextFieldId).length == 0 ) {
         const nextIndex = index + 1;
         const extrafield = `<div class="field">
            <div class="ui icon input fluid">
@@ -1106,7 +1108,7 @@ function checkAddSourcePath(index){
 
 function browseSourcePath(index) {
     const ofPath = $("#ofPath").val();
-    ipc.send('pickSourcePath', ofPath, index); // current path could go here
+    ipc.send('pickSourcePath', [ ofPath, index ]); // current path could go here
 }
 
 
diff --git a/frontend/index.js b/frontend/index.js
index 933263b3..c3aeae18 100644
--- a/frontend/index.js
+++ b/frontend/index.js
@@ -483,11 +483,9 @@ function getDirectories(srcpath, acceptedPrefix) {
 // }
 
 ipcMain.on('isOFProjectFolder', function(event, project) {
-    let folder;
-    folder = path.join(project['projectPath'], project['projectName']);
+    const folder = path.join(project['projectPath'], project['projectName']);
 
     try {
-
         const tmpFiles = fs.readdirSync(folder);
         if (!tmpFiles || tmpFiles.length <= 1) {
             return false;
@@ -575,9 +573,9 @@ ipcMain.on('isOFProjectFolder', function(event, project) {
 
                         console.log("Reading config pair. Macro: " + macro + " Value: " + value);
                         
-                        if(macro.startsWith('PROJECT_EXTERNAL_SOURCE_PATHS')){
-                             event.sender.send('setSourceExtraPath', value, extraSrcPathsCount);
-                             extraSrcPathsCount++;
+                        if(macro.startsWith('PROJECT_EXTERNAL_SOURCE_PATHS')) {
+                            event.sender.send('setSourceExtraPath', [value, extraSrcPathsCount]);
+                            extraSrcPathsCount++;
                         }
                     }
                 });
@@ -938,12 +936,12 @@ ipcMain.on('pickProjectPath', function(event, arg) {
     });
 });
 
-ipcMain.on('pickSourcePath', function(event, arg, index) {
+ipcMain.on('pickSourcePath', function(event, [ ofPath, index ]) {
     dialog.showOpenDialog({
         title: 'select extra source or include folder paths to add to project',
         properties: ['openDirectory'],
         filters: [],
-        defaultPath: arg
+        defaultPath: ofPath
     }).then(function(filenames) {
         if (filenames !== undefined && filenames.filePaths.length > 0) {
             event.sender.send('setSourceExtraPath', [filenames.filePaths[0], index]);