diff --git a/leversc/src/MATLAB/@leversc/leversc.m b/leversc/src/MATLAB/@leversc/leversc.m
index 35ed034c9eb5ccf9bf815a7c9882ac72089aefe9..73a002abf3a6bcba691c3a09746de4fc5178f51a 100644
--- a/leversc/src/MATLAB/@leversc/leversc.m
+++ b/leversc/src/MATLAB/@leversc/leversc.m
@@ -30,6 +30,7 @@ classdef leversc <handle
                 optional_figNumber=1;
             end
             [im,imD,figNumber]=parseArgs(optional_im,optional_imD,optional_figNumber);
+            im = imPad4(im);
             obj.figNumber=figNumber;
             if isfield(imD,'imageData')
                 CONSTANTS=imD;
@@ -122,3 +123,19 @@ end
 
 end
 
+function im = imPad4(im)
+
+pad = [0,0,0];
+for d = 1:3
+    if 0~=mod(size(im,d),4)
+        pad(d) = size(im,d) + 4-mod(size(im,d),4);
+    end
+end
+if any(pad)
+    sz = size(im);
+    sz = sz(1:3);
+    pad = max(pad,sz);
+    im(pad(1),pad(2),pad(3),:) = 0;
+end
+
+end
\ No newline at end of file
diff --git a/matlab/+Batch/batchProc.m b/matlab/+Batch/batchProc.m
index 9bdb4cf09f4a35430284d67d58cbbd5f2432b523..a2ddcb3fbf776dcac79f64bdbe8184999aca1497 100644
--- a/matlab/+Batch/batchProc.m
+++ b/matlab/+Batch/batchProc.m
@@ -1,7 +1,7 @@
 
 function batchProc(ROOT,nproc,nthread)
 
-parpool(nproc)
+ljsStartParallel(nproc);
 
 flist = dir(fullfile(ROOT,'*.LEVER'));
 parfor ff=1:length(flist)
diff --git a/matlab/+Batch/processMovie.m b/matlab/+Batch/processMovie.m
index 745d9486ad33326ee494fc607326f98798bd8711..8bbce04fe7dfb4215df267d69c2cc6739b83af35 100644
--- a/matlab/+Batch/processMovie.m
+++ b/matlab/+Batch/processMovie.m
@@ -49,7 +49,8 @@ processInfo.tPatch=getElapsed(tx);
 
 tx=tic();
 % nMerged = Smooth.Merge.goMerge(conn,CONSTANTS,segParams,nProcessors);
-nMerged = Smooth.Merge.goMerge2(conn, CONSTANTS, segParams);
+% nMerged = Smooth.Merge.goMerge2(conn, CONSTANTS, segParams);
+nMerged = -1;
 processInfo.tMerge=getElapsed(tx);
 
 tx=tic();
diff --git a/matlab/+DenoiseCache/denoiseFolder.m b/matlab/+DenoiseCache/denoiseFolder.m
index 72f1770409af637c8e40a6a986c344bf8126f0f0..0d12c85aa0b395a4fd28c82d2aeb6201361ec179 100644
--- a/matlab/+DenoiseCache/denoiseFolder.m
+++ b/matlab/+DenoiseCache/denoiseFolder.m
@@ -8,7 +8,7 @@ if 2==length(nProcessors)
     nProcessors=nProcessors(2);
 end
 
-nProcessors = min(nProcessors,16);
+nProcessors = min(nProcessors,8);
 
 flist=dir(fullfile(folderName,'*.h5'));
 if 0==length(flist)
diff --git a/matlab/+Helpers/cellEccentricity.m b/matlab/+Helpers/cellEccentricity.m
new file mode 100644
index 0000000000000000000000000000000000000000..0f76c5e048e30167a23d4dcded626b238925212d
--- /dev/null
+++ b/matlab/+Helpers/cellEccentricity.m
@@ -0,0 +1,4 @@
+function ecc = cellEccentricity(cx)
+
+evals = eig(cov(cx.pts));
+ecc = min(evals)/max(evals);
\ No newline at end of file
diff --git a/matlab/+Lineage/eraseLineage.m b/matlab/+Lineage/eraseLineage.m
new file mode 100644
index 0000000000000000000000000000000000000000..79116adb6bbfe7c6db1479c2034302740ac3621f
--- /dev/null
+++ b/matlab/+Lineage/eraseLineage.m
@@ -0,0 +1,9 @@
+function eraseLineage(conn)
+
+exec(conn,'delete from tblFamilies;delete from uiExtFamilies');
+strDB = conn.DataSource;
+Batch.batchTrack(strDB);
+Smooth.Patch.patch11(conn);
+Smooth.Patch.patch12(conn);
+Smooth.Patch.patch21(conn);
+Smooth.Patch.patchOcclusion(conn);
\ No newline at end of file
diff --git a/matlab/+MovieMaker/ssfMovie_erk.m b/matlab/+MovieMaker/ssfMovie_erk.m
index 4d68eb566b48208882be651f8709f9f70f809b07..7b850a4a63f18275100ecfa88c7c70371e62c495 100644
--- a/matlab/+MovieMaker/ssfMovie_erk.m
+++ b/matlab/+MovieMaker/ssfMovie_erk.m
@@ -5,8 +5,6 @@ function ssfMovie1(strDB)
 bPreview = true
 
 
-
-
 bwx = bwLoG_pos;
 bwx(:,:,:,2) = bwLoG_neg;
 imd = MicroscopeData.MakeMetadataFromImage(bwx);
diff --git a/matlab/+Read/findImageFolder.m b/matlab/+Read/findImageFolder.m
index 02e7b12f4efa03f96eb6a04b0e0799cf7e717b85..0e381a5925076bc2d1cd104fae5600b84ab92646 100644
--- a/matlab/+Read/findImageFolder.m
+++ b/matlab/+Read/findImageFolder.m
@@ -42,7 +42,7 @@ if ~exist(ljs,'file')
 end
 [fid,message]=fopen(fullfile(leverFolder,'lever.json'));
 if (fid<=0)
-    fprintf(1,'ERROR -- getConstants.m -- image path invalid and no lever.json ROOT override (message=%s)\n',message);
+    fprintf(1,'ERROR %s -- getConstants.m -- image path invalid and no lever.json ROOT override (message=%s)\n',CONSTANTS.imageData.DatasetName,message);
     return;
 end
 
diff --git a/matlab/+Read/getCell.m b/matlab/+Read/getCell.m
index ce9a54819e278d227a15574b77d7f295c2ca632f..72e20413e3ab5dbb8e7d1d5f55b96588ec07e52c 100644
--- a/matlab/+Read/getCell.m
+++ b/matlab/+Read/getCell.m
@@ -1,18 +1,22 @@
 function Cell=getCell(conn,cellID,CONSTANTS)
 
 Cell=[];
-
+qTable=fetch(conn,'pragma table_info(tblCells)');
+bLoG = any(cellfun(@length,(strfind(qTable.name,'LoG'))));
 try
-    cmd=['SELECT cellID,time,trackID,centroid,u16pixels,maxRadius,channel,area,surface,segCC '...
-        ' FROM tblCells WHERE cellID=' num2str(cellID)];
+    cmd=['SELECT cellID,time,trackID,centroid,u16pixels,maxRadius,channel,area,surface,segCC '];
+    if bLoG
+        cmd = [cmd ' ,LoG '];
+    end
+    cmd =[cmd ' FROM tblCells WHERE cellID=' num2str(cellID)];
     Q=ljsFetch(conn,cmd);
 catch
     try
         Cell=Read.getCell3D(conn,cellID);
     catch
         fprintf(2,'unable to read cell from %s\n',CONSTANTS.imageData.DatasetName);
-        return
     end
+    return
 end
 if isempty(Q)
     return
@@ -32,6 +36,9 @@ Cell.area=Q{8};
 Cell.surface=jsondecode(Q{9});
 Cell.segCC=Q{10};
 
+if bLoG
+    Cell.LoG = Q{11};
+end
 if exist('CONSTANTS','var')
     Cell = Read.setCellsIdxPts(Cell,CONSTANTS);
 end
diff --git a/matlab/+Read/getCell3D.m b/matlab/+Read/getCell3D.m
index 59bff1b43d28bf6f6fe88c902c08ea9a4c587770..7ade71dea7999ec240c7d9df7a07f64cb5fd3126 100644
--- a/matlab/+Read/getCell3D.m
+++ b/matlab/+Read/getCell3D.m
@@ -2,7 +2,14 @@ function Cell=getCell3D(conn,cellID,CONSTANTS)
 
 Cell=[];
 
-cmd=['SELECT time,trackID,centroid,channel,area,maxRadius,verts,faces,edges,normals,u16pixels FROM tblCells WHERE cellID=' num2str(cellID)];
+qTable=fetch(conn,'pragma table_info(tblCells)');
+bLoG = any(cellfun(@length,(strfind(qTable.name,'LoG'))));
+
+cmd=['SELECT time,trackID,centroid,channel,area,maxRadius,verts,faces,edges,normals,u16pixels '];
+if bLoG
+    cmd = [cmd ',LoG '];
+end
+cmd = [cmd ' FROM tblCells WHERE cellID=' num2str(cellID)];
 Q=ljsFetch(conn,cmd);
 % cellid time trackID centroid channel area, maxRadius,
 % verts,edges,normals,faces,u16pixels
diff --git a/matlab/+SSF/catKymographs.m b/matlab/+SSF/catKymographs.m
new file mode 100644
index 0000000000000000000000000000000000000000..dbc4f2d70f775cd11f7a9f6532e2595af19f3ca5
--- /dev/null
+++ b/matlab/+SSF/catKymographs.m
@@ -0,0 +1,26 @@
+% pads time between images
+function i12 = catKymographs(i1,i2,dim)
+[i1,i2] = padIm(i1,i2);
+i12 = cat(dim,i1,i2);
+4;
+
+function [i1,i2] = padIm(i1,i2)
+
+if size(i1,3)>size(i2,3)
+    i2(:,:,end:size(i1,3),:)=0;
+else
+    i1(:,:,end:size(i2,3),:)=0;
+end
+
+if size(i1,2)>size(i2,2)
+    i2(:,end:size(i1,2),:,:)=0;
+else
+    i1(:,end:size(i2,2),:,:)=0;
+end
+
+if size(i1,1)>size(i2,1)
+    i2(end:size(i1,1),:,:,:)=0;
+else
+    i1(end:size(i2,1),:,:,:)=0;
+end
+
diff --git a/matlab/+SSF/cropKymo.m b/matlab/+SSF/cropKymo.m
new file mode 100644
index 0000000000000000000000000000000000000000..c86c14812892d6bd762924e73d6f8b84ce784d1e
--- /dev/null
+++ b/matlab/+SSF/cropKymo.m
@@ -0,0 +1,22 @@
+function im_crop = cropKymo(imSrc,idxPixels)
+
+% first copy over target pixels
+im = 0 * imSrc;
+im(idxPixels) = imSrc(idxPixels);
+
+[r,c,z]=ind2sub(size(im),idxPixels);
+
+r = cropDim(r,size(im,1));
+c = cropDim(c,size(im,2));
+z = cropDim(z,size(im,3));
+
+im_crop = im(min(r):max(r),min(c):max(c),min(z):max(z),:);
+
+
+function y = cropDim(x,sz)
+
+y = [min(x)-1:max(x)+1];
+y = min(y,sz);
+y = max(y,1);
+
+
diff --git a/matlab/+SSF/drawMitoticSSFtracks.m b/matlab/+SSF/drawMitoticSSFtracks.m
new file mode 100644
index 0000000000000000000000000000000000000000..d852790910a56a878784506820612d26d6e40fd7
--- /dev/null
+++ b/matlab/+SSF/drawMitoticSSFtracks.m
@@ -0,0 +1,57 @@
+% erk1D = Y(:,1);
+% [~,idxSort] = sort(erk1D);
+% qMitoSorted = qMitotic(idxSort,:);
+% 
+function imx = drawMitoticSSFtracks(qMitotic,erkClipLimits,bDraw)
+
+if ~exist('bDraw','var')
+    bDraw = false;
+end
+
+for i = 1:height(qMitotic)
+    if ~isa(qMitotic.erk{i},'uint8')
+        qMitotic.erk{i} = SSF.quantize8(qMitotic.erk{i},erkClipLimits);
+    end
+end
+
+tmax = max(cellfun(@length,qMitotic.erk));
+imx = zeros(2*height(qMitotic),tmax);
+for i = 1:height(qMitotic)
+    erk_i = qMitotic.erk{i};
+    imx(2*i,end-length(erk_i)+1:end) = erk_i;
+end
+
+if ~bDraw
+    return
+end
+
+
+cmPos = colormap('parula');
+cmNeg = colormap('cool');
+cm = [cmNeg(1:2:end,:);cmPos(1:2:end,:)];
+cm(1,:) = [1,1,1];
+
+
+figure;imagesc(imx);colormap(cm);
+c = colorbar();
+clim = [min(c.Ticks),max(c.Ticks)];
+cticks = [clim(1), mean([clim(1),mean(clim)]), mean(clim), mean([clim(2),mean(clim)]),clim(2)];
+c.Ticks = cticks;
+c.TickLabels = {'BG','-0.5','0','0.5','1'}
+c.Label.String = 'Erk SSF';
+
+% close all
+
+% cm = colormap('parula');
+% cm(1:13,:)=repmat([1,1,1],13,1);
+% % c = colorbar('ticks',round(linspace(double(erkLimits(1)),double(erkLimits(2)),10)));
+% c = colorbar
+% c.Label.String = 'Erk SSF (8 bit, clipped to 95%)'
+% 
+% xx = round(linspace(50,size(imx,2),5));
+% set(gca,'XTickLabel',arrayfun(@(y) num2str((y-308),xx,'UniformOutput',false))
+% xlabel('frames before mitosis');
+% ylabel('mitotic parent track sorted by NCD principal component')
+% yy = yticks();
+% set(gca,'YTickLabel',arrayfun(@(y) num2str(y/2),yticks()))
+% 4;
diff --git a/matlab/+SSF/drawSSFclusters.m b/matlab/+SSF/drawSSFclusters.m
new file mode 100644
index 0000000000000000000000000000000000000000..2e71a714a664dab1a0852ce74a93214d0ab0a191
--- /dev/null
+++ b/matlab/+SSF/drawSSFclusters.m
@@ -0,0 +1,68 @@
+% erk1D = Y(:,1);
+% [~,idxSort] = sort(erk1D);
+% qMitoSorted = qMitotic(idxSort,:);
+% 
+% function imx = drawSSFtracks(qMitotic,idx,bDraw)
+
+% if ~exist('bDraw','var')
+%     bDraw = false;
+% end
+tmax = max(cellfun(@length,qMitotic.erk));
+imx = [];
+imxH = 1;
+clusterPts = [];
+for k = 1:max(idx)
+    idxk = find(idx==k);
+    qk = qMitotic(idxk,:);
+    qk.yk = Y(idxk,1);
+    qk = sortrows(qk,'yk');
+    for i = 1:height(qk)
+        erk_i = qk.erk{i};
+        imx(imxH,tmax-length(erk_i)+1:tmax) = erk_i;
+        imxH = imxH+2;
+    end
+    imxH = imxH + 2;
+    clusterPts=[clusterPts,imxH];
+    imxH = imxH + 4;
+
+end
+
+
+
+% if ~bDraw
+%     return
+% end
+
+
+close all
+
+cm = colormap('parula');
+cm(1,:) = [1,1,1];
+
+figure;imagesc(imx);colormap(cm);hold on
+c = colorbar('ticks',[2,64,128,192,255], 'ticklabels',{'-1.0','-0.5','0','0.5','1'});
+c.Label.String = 'Erk SSF';
+for p = 1:length(clusterPts)
+    plot([1,size(imx,2)],[clusterPts(p),clusterPts(p)],'-..k')
+end
+
+% 
+
+% cm = colormap('parula');
+% cm(1:13,:)=repmat([1,1,1],13,1);
+% % c = colorbar('ticks',round(linspace(double(erkLimits(1)),double(erkLimits(2)),10)));
+% c = colorbar
+% c.Label.String = 'Erk SSF (8 bit, clipped to 95%)'
+% 
+xx = round(linspace(50,size(imx,2),5));
+set(gca,'XTick',xx);
+set(gca,'XTickLabel',arrayfun(@(y) num2str(y-308),xx,'UniformOutput',false))
+xlabel('frames before mitosis');
+ylabel('mitotic parent track sorted by cluster and NCD principal component')
+yy = yticks();
+set(gca,'YTickLabel',arrayfun(@(y) num2str(y/2),yticks(),'uniformOutput',false))
+% h=gca; h.YAxis.TickLength = [0 0];
+yticks([])
+% 4;
+set(gcf,'color','w')
+% exportgraphics(gcf,'erk ssf heat map tracks NCD sorted cluster FLIF1d.pdf','Resolution',600,'contenttype','image')
diff --git a/matlab/+SSF/drawSSFtracks.m b/matlab/+SSF/drawSSFtracks.m
new file mode 100644
index 0000000000000000000000000000000000000000..1578eb1ffe731c9d7b4c7fdc167cf34188d461c4
--- /dev/null
+++ b/matlab/+SSF/drawSSFtracks.m
@@ -0,0 +1,85 @@
+% strDB = '/g/leverjs/Olivier/Agne/march_2023_20x/2022-04-05_steady_state_48h_deprived_13_ori.LEVER';
+
+function drawSSFtracks(ROOT,cache, kymo_channel, channel_description,fnames)
+
+[~,dsName,ext] = fileparts(ROOT);
+if ~exist('fnames','var')
+    fnames = [];
+end
+
+outfile = [dsName ' ' channel_description ' SSF projection_y_t.pdf'];
+if isempty(ext)
+    flist = dir(fullfile(ROOT,'*.LEVER'));
+else
+    flist = dir(ROOT);
+end
+f=figure(1);
+f.WindowState = 'maximized';
+pause(1)
+
+kymoPixels = {};
+for ff=1:length(flist)
+    strDB = fullfile(flist(ff).folder,flist(ff).name);
+    [ROOT,lf] = fileparts(strDB);
+    strKymoDB = fullfile(ROOT,cache,[lf '.LEVER_ssf_cache.LEVER']);
+    if ~exist(strKymoDB,'file')
+        continue
+    end
+    imKymo = SSF.loadImage(strKymoDB,kymo_channel);
+    kymoPixels{ff} = imKymo(find(imKymo));
+end 
+kymoPixels = vertcat(kymoPixels{:});
+erkClipLimits = [prctile(kymoPixels,2.5),prctile(kymoPixels,97.5)];
+
+for ff = 1:length(flist)
+    strDB = fullfile(flist(ff).folder,flist(ff).name);
+    [ROOT,lf] = fileparts(strDB);
+    strKymoDB = fullfile(ROOT,cache,[lf '.LEVER_ssf_cache.LEVER']);
+    if ~exist(strKymoDB,'file')
+        continue
+    end
+    imKymo = SSF.loadImage(strKymoDB,kymo_channel);
+    % 
+    imp = squeeze(max(imKymo,[],2));
+    imn = squeeze(min(imKymo,[],2));
+    imn = abs(imn);
+    idx = find(imn>imp);
+    imp(idx) = -1 .* imn(idx);
+%     imp(imp<-0.5) = 0;
+    impq = SSF.quantize8(imp,erkClipLimits);
+%     impq(imp==0 & imn==0) = 0;
+    
+%     % keep just [0,1] SSF
+%     imp = squeeze(max(imKymo,[],2));
+%     erkClipLimits = [0,prctile(kymoPixels,99.9)];
+%     impq = SSF.quantize8(imp,erkClipLimits);
+%     impq(imp==0) = 0; % set the background
+%     
+    
+    clf;imagesc(impq)
+    cm = colormap('parula');
+    cm(1,:) = [1,1,1]; % make the background white!
+    colormap(cm)
+    c = colorbar();
+    clim = [min(impq(:)),max(impq(:))];
+    cticks = [clim(1)+1, mean([clim(1),mean(clim)]), mean(clim), mean([clim(2),mean(clim)]),clim(2)];
+    c.Ticks = cticks;
+    % c.TickLabels = {'-1','-0.5','0','0.5','1'}
+
+    ticksSSF = linspace(erkClipLimits(1),erkClipLimits(2),5);
+    ticksSSF = arrayfun(@(x) num2str(x,2),ticksSSF,'UniformOutput',false);
+    c.TickLabels = ticksSSF;
+    c.Label.String = [channel_description ' SSF (dataset reference)'];
+    if ~isempty(fnames)
+        lf = fnames{ff};
+    end
+    hold on
+    yl = ylim();
+    plot([62,62],[yl(1),yl(2)],'--r','linewidth',2)
+    title([lf ' ' channel_description ' SSF projection to (Y/2,time)'],'interpreter','none')
+    xlabel('time (frames)')
+    ylabel('Y (max intensity projection along X)')
+    bAppend = ff>1;
+    exportgraphics(gcf,outfile,'Resolution',600,'contenttype','image','append',bAppend);
+    
+end
\ No newline at end of file
diff --git a/matlab/+SSF/draw_ssf_ncd.m b/matlab/+SSF/draw_ssf_ncd.m
index a52d16003b60ab31a9fa81d0a0984bb60ff5072d..4c4acb5b8ef8caf077c51efbc45355a800b9dbcc 100644
--- a/matlab/+SSF/draw_ssf_ncd.m
+++ b/matlab/+SSF/draw_ssf_ncd.m
@@ -1,12 +1,12 @@
 % load('agne_72_8bpp.mat')
 flist = dir(fullfile(ROOT,'*.LEVER'));
 
-className = {};
-for ff=1:length(flist)
-    cn = regexp(flist(ff).name,'(\d+-\d+-\d+)_.*(\d\d)_ori*','tokens');
-    cn = [cn{1}{1} '_' cn{1}{2}];
-    className{ff} = classMap(cn);
-end
+% className = {};
+% for ff=1:length(flist)
+%     cn = regexp(flist(ff).name,'(\d+-\d+-\d+)_.*(\d\d)_ori*','tokens');
+%     cn = [cn{1}{1} '_' cn{1}{2}];
+%     className{ff} = classMap(cn);
+% end
 % targetClass = {'AKT1_E17K','WT','PIK3CA_E545K'}
 % idx = find(cellfun(@(x) ~isempty(find(strcmp(targetClass,x))),className));
 % A=d(idx,idx);
@@ -28,7 +28,7 @@ clf;hold off;
 sym = {'ko','cv','m^','r*','gx','<k','b>','gs','bd'};
 
 
-classList = unique(classMap.values);
+classList = unique(className);
 hx = zeros(size(classList));
 hold on
 
diff --git a/matlab/+SSF/draw_ssf_tracks.m b/matlab/+SSF/draw_ssf_tracks.m
deleted file mode 100644
index d677a8a056c95fcb91a10802c52e2cb2636b5499..0000000000000000000000000000000000000000
--- a/matlab/+SSF/draw_ssf_tracks.m
+++ /dev/null
@@ -1,41 +0,0 @@
-close all
-classList = unique(classMap.values);
-for ff = 1:length(flist)
-    strDB = fullfile(flist(ff).folder,flist(ff).name);
-    [conn,CONSTANTS,segParams]=openDB(strDB);
-
-    cmd = 'select trackID from tblCells inner join tblFamilies on cellID = cellID_parent';
-    q = fetch(conn,cmd);
-    close(conn);
-
-    erk_tracks = movie_tracks{ff};
-    class = classMap(flist(ff).name(1:13));
-    id = find(cellfun(@length,strfind(classList,class)));
-    figure(id) ; hold on
-
-    tids = erk_tracks.keys;
-    tids = [tids{:}];
-    tids = intersect(tids,q.trackID);
-    for i = 1:length(tids)        
-        ssf = erk_tracks(tids(i));
-        if size(ssf,2) <= 10 || all(0==ssf(1,:))
-            continue
-        end
-        plot(5*ssf(2,:),ssf(1,:),'-');
-    end
-end
-
-for i = 1:length(classList)
-    figure(i)
-    set(gcf,'color','w')
-    title(classList{i},'Interpreter','none')
-    xlabel('time (minutes)')
-    ylabel('SSF')
-    fname = ['erk_tracks_' classList{i} '.tif'];
-    print(fname,'-dtiffn');
-end
-
-cx={}
-for ff = 1:length(flist)
-        cx{ff} = classMap(flist(ff).name(1:13))
-end
\ No newline at end of file
diff --git a/matlab/+SSF/gen_SSF_kymo.m b/matlab/+SSF/gen_SSF_kymo.m
index 24b4e020818f2c901a74e5b8927865f0f9428d08..130871e45a57944087497af420d4619e9c97716e 100644
--- a/matlab/+SSF/gen_SSF_kymo.m
+++ b/matlab/+SSF/gen_SSF_kymo.m
@@ -1,36 +1,56 @@
 
+% BE CAREFUL HERE! BE DRAGONS! GET THESE target names & numbers RIGHT OR PERISH
+% targetChannelNames = {'Erk SSF'; 'Akt SSF' ; 'DHB SSF'; 'H2B SSF'; 'velocity SSF'}; % channel names in the kymo
+% targetChannelNames = {'Erk SSF'; 'Oct4 SSF' ;  'H2B SSF'; 'velocity SSF'}; % channel names in the kymo
+% targetChannelNumbers = [2, 3, -1]; % maps image channel names to kymo channel names
+function gen_SSF_kymo(strDB,targetChannelNames,targetChannelNumbers,outfolder,bDownscale, startFrame)
 
-function gen_SSF_kymo(ROOT)
-targetChannelNames = {'Erk SSF'; 'Akt SSF' ; 'DHB SSF'; 'H2B SSF'; 'velocity SSF'}; % channel names in the kymo
-targetChannelNumbers = [-2, -3, 1, -4]; % maps image channel names to kymo channel names
+if ~exist('bDownscale','var')
+    bDownscale = false;
+end
+if ~exist('startFrame','var')
+    startFrame = 1;
+end
 
-cacheFolder = fullfile(ROOT,'kymoV2');
-if ~exist(cacheFolder,'dir')
-    mkdir(cacheFolder);
+[fx,nx,ext]=fileparts(strDB);
+if strcmp(ext,'.LEVER')
+    flist = dir(strDB);
+    ROOT = fx;
+else
+    ROOT = strDB;
+    flist = dir(fullfile(strDB,'*.LEVER'));
 end
-flist = dir(fullfile(ROOT,'*.LEVER'));
 L = length(flist);
 
+
+if ~exist(outfolder,'dir')
+    mkdir(outfolder);
+end
+
 imd={};
+p = ljsStartParallel(16);
+
 parfor ff=1:L
+% for ff=1:L    
     str_ff = fullfile(flist(ff).folder,flist(ff).name);     
-    if exist(fullfile(cacheFolder,[flist(ff).name '_ssf_cache.json']),'file')
+    if exist(fullfile(outfolder,[flist(ff).name '_ssf_cache.json']),'file')
         fprintf(1,'genKymo skipping %s kymo exists\n',str_ff);
         continue
     end
     t0 = tic();
-    imVolume = SSF.ssf_volume(str_ff,targetChannelNumbers);
+    imVolume = SSF.ssf_volume(str_ff,targetChannelNumbers, bDownscale);
     if isempty(imVolume)
         continue
     end
-    imVolume(:,:,:,5) = SSF.velocity_kymo(str_ff);
-    imVolume = imVolume(:,:,31:end,:); % trim off first 30 frames
+%     imVolume(:,:,:,length(targetChannelNumbers)+1) = SSF.velocity_kymo(str_ff);
+    imVolume = imVolume(:,:,startFrame:end,:); % trim off first 30 frames
     imd{ff}=MicroscopeData.MakeMetadataFromImage(imVolume);
     imd{ff}.DatasetName=[flist(ff).name '_ssf_cache'];
-    imd{ff}.imageDir = cacheFolder;
+    imd{ff}.imageDir = outfolder;
     imd{ff}.ChannelNames = targetChannelNames;
-    MicroscopeData.WriterH5(imVolume,'imageData',imd{ff},'path',cacheFolder);    
+    MicroscopeData.WriterH5(imVolume,'imageData',imd{ff},'path',outfolder);  
+
     tElapsed = toc(t0);
     fprintf(1,'ssf_volume %d tElapsed=%0.2f\n',ff,tElapsed);
 end
-Import.leverImport('',cacheFolder);
\ No newline at end of file
+Import.leverImport('',outfolder);
\ No newline at end of file
diff --git a/matlab/+SSF/goErkCN.m b/matlab/+SSF/goErkCN.m
new file mode 100644
index 0000000000000000000000000000000000000000..1c7ae124eb937c61971f4571c2c873fe3c298117
--- /dev/null
+++ b/matlab/+SSF/goErkCN.m
@@ -0,0 +1,42 @@
+% strDB = '/f/leverjs/Olivier/Yannick/20210924/20210924_pos3.LEVER';
+% tblCN = goErkCN(strDB,174279)
+% tblCN = goErkCN(strDB,224589)
+function tblCN = goErkCN(strDB,targetTrack)
+
+[conn,CONSTANTS,segParams]=openDB(strDB);
+[ROOT,lf] = fileparts(strDB);
+strKymo = fullfile(ROOT,'kymoV',[lf '.LEVER_ssf_cache.LEVER']);
+imKymo = leversc.loadImage(strKymo,1,1);
+
+cmd = ['select cellID,trackID,centroid,time,LoG from tblCells where trackID = '...
+    num2str(targetTrack)];
+q=fetch(conn,cmd);
+
+erkSSF = [];
+for i = 1:height(q)
+    centroid = jsondecode(q.centroid{i});
+    centroid = [round(centroid(1:2))', q.time(i)];
+    sample_value = SSF.ssf_sample(imKymo,centroid);
+    erkSSF(i) = sample_value;
+end
+
+featureParams.channel = 2;
+featureParams.name='CytoToNuclearRatio';
+featureParams.color="#00ffff";
+tblCN = table();
+for i = 1:height(q)
+    t = q.time(i);
+    cellList = Read.getCellsTime(conn,t,segParams.channels(1),CONSTANTS);
+    nt = SSF.cytoToNuclearRatio(cellList,q.cellID(i),t,CONSTANTS,featureParams,segParams);
+    nt.erkSSF = erkSSF(i);
+    tblCN = [tblCN;nt]
+end
+ee = imKymo(find(imKymo));
+erkClipLimits = [prctile(ee,2.5), prctile(ee,97.5)];
+
+erk = tblCN.erkSSF;
+erk = SSF.quantize8(erk,erkClipLimits);
+erk = 2 * (double(erk) / 255) -1;
+figure;plot(erk)
+hold on
+plot(tblCN.cnRatio)
\ No newline at end of file
diff --git a/matlab/+SSF/goTrackSSFkymo.m b/matlab/+SSF/goTrackSSFkymo.m
new file mode 100644
index 0000000000000000000000000000000000000000..6461c99111f6b7e7ace956edf4da2fbd94be7224
--- /dev/null
+++ b/matlab/+SSF/goTrackSSFkymo.m
@@ -0,0 +1,117 @@
+
+ROOT = '/f/leverjs/Olivier/Yannick/20210924/';
+flist = dir(fullfile(ROOT,'*.LEVER'));
+
+cxKymo = {};
+qMitotic = {};
+
+for ff = 1:length(flist)
+    strDB = fullfile(flist(ff).folder,flist(ff).name);
+    [ROOT,lf] = fileparts(strDB);
+    strKymoDB = fullfile(ROOT,'kymoV',[lf '.LEVER_ssf_cache.LEVER']);
+    cxKymo{ff} = SSF.loadImage(strKymoDB,1);
+    [conn,CONSTANTS,segParams]=openDB(strDB);    
+    imErk = cxKymo{ff}(:,:,:,1);
+    qm = fetch(conn,'select * from (select cellID,trackID,count(time) as nt from tblCells where trackID in (select trackID from tblCells inner join tblFamilies on cellID_parent=cellID) group by trackID) where nt>23');
+    for i = 1:length(qm.trackID)
+        qcx = fetch(conn,['select centroid,time from tblCells where trackID = ' num2str(qm.trackID(i))]);
+        centroids = cellfun(@jsondecode,qcx.centroid,'UniformOutput',false);
+        centroids = reshape(vertcat(centroids{:}),3,[])';
+        centroids = round(centroids);  
+        qm.centroids{i} = [centroids(:,1:2),qcx.time];
+        qm.idxCentroids{i} = sub2ind(size(cxKymo{ff}),centroids(:,2),centroids(:,1),qcx.time);        
+        qm.movieID(i) = ff;
+        qm.erk{i} = SSF.ssf_sample_idx(imErk,qm.idxCentroids{i});
+        qm.isEmpty(i) = all(0==qm.erk{i});       
+    end
+    qm(qm.isEmpty,:)=[];
+    qMitotic = [qMitotic;qm];
+end
+% qMitotic.erk is the signal. quantize it to 8 bit now
+erkCombined =[qMitotic.erk{:}]' ;
+erkClipLimits = [prctile(erkCombined,2.5), prctile(erkCombined,97.5)];
+for c = 1:length(cxKymo)
+    cxKymo{c} = SSF.quantize8(cxKymo{c},erkClipLimits);
+end
+% % a bit slow, but steady. find distancefrom each mitotis
+for i = 1:height(qMitotic)
+
+    strDB = fullfile(flist(qMitotic.movieID(i)).folder,flist(qMitotic.movieID(i)).name);
+    [conn,CONSTANTS,segParams]=openDB(strDB);
+    q1 = fetch(conn,['select centroid,time from tblCells where cellID = ' num2str(qMitotic.cellID(i))]);
+    colony = Read.getCellsTime(conn,q1.time,4,CONSTANTS);
+    for c = 1:length(colony)
+        bw = zeros(CONSTANTS.imageData.Dimensions(2),CONSTANTS.imageData.Dimensions(1));
+        bw(colony(c).idxPts) = 1;
+        centroid1 = round(jsondecode(q1.centroid{1}));
+        if ~bw(centroid1(2),centroid1(1))
+            continue
+        end
+        bwd = bwdist(~bw);
+        bwd = bwd./max(bwd(:));
+        qMitotic.dNormalized(i) = bwd(centroid1(2),centroid1(1));
+        qMitotic.time(i) = q1.time;
+    end
+end
+
+
+
+for i = 1:height(qMitotic)    
+    erk_i = medfilt1(qMitotic.erk{i}, 5);
+    erk_i = SSF.quantize8(erk_i, erkClipLimits);
+    qMitotic.erk{i} = erk_i;
+end
+
+d = [];
+L = height(qMitotic);
+parfor i = 1:L
+%     im_i = SSF.cropKymo(cxKymo{qMitotic.movieID(i)},qMitotic.idxCentroids{i});
+    for j = 1:L
+%         im_j = SSF.cropKymo(cxKymo{qMitotic.movieID(j)},qMitotic.idxCentroids{j});
+        erk_j = medfilt1(qMitotic.erk{j},5)
+        im_j = SSF.quantize8(erk_j,erkClipLimits);
+        d(i,j) = SSF.ncd_ssf_volume(im_i,im_j);
+    end
+end
+
+% for i = 1:length(d)
+%     for j = 1 : length(d)
+%         d(i,j)=max(d(i,j),d(j,i));
+%     end
+%     d(i,i) = max(d(i,i),0);
+% end
+
+close all
+A = d;
+K=3;
+[idx,Y] = Cluster.SpectralCluster(A,K);
+% Y(:,3) = [erkMitotic.d];
+figure;hold on
+hred = [];
+hgreen = [];
+for i = 1 : height(qMitotic)    
+    if qMitotic.dNormalized(i)<.2929
+        hred = [hred,plot3(Y(i,1),Y(i,2),Y(i,3),'.r')];        
+    else
+        hgreen = [hgreen,plot3(Y(i,1),Y(i,2),Y(i,3),'.g')];        
+    end
+end
+xlabel('u1')
+ylabel('u2')
+zlabel('u3')
+legend([hred(1),hgreen(1)],'d_{normalized} < 0.29','d_{normalized} \geq .2929')
+
+set(gcf,'color','w')
+figure;hold on
+for i = 1 : height(qMitotic)
+    if qMitotic.dNormalized(i)<.2929
+        plot(Y(i,1),Y(i,2),'.r');
+    else
+        plot(Y(i,1),Y(i,2),'.g');
+    end
+end
+xlabel('u1')
+ylabel('u2')
+legend({'d_{normalized}>.2929','d_{normalized}<.2929'})
+set(gcf,'color','w')
+% exportgraphics(gcf,'erkMitoticParentTracksEmbedding_medfilt.pdf','Resolution',300,'contenttype','image')
\ No newline at end of file
diff --git a/matlab/+SSF/go_ssf_ncd.m b/matlab/+SSF/go_ssf_ncd.m
index b7d9c45067d13b448c75d69a808003aa2eec3ce6..f79c51b3104637c29891d5a0b65e7457aaa11ab3 100644
--- a/matlab/+SSF/go_ssf_ncd.m
+++ b/matlab/+SSF/go_ssf_ncd.m
@@ -4,40 +4,86 @@
 % AKT_CHANNEL = 2;
 % H2B_CHANNEL = 3;
 % targetChannels = [ERK_CHANNEL,AKT_CHANNEL];
-function d=go_ssf_ncd(ROOT,targetChannels)
+function d=go_ssf_ncd(kROOT,targetChannels)
 
-flist = dir(fullfile(ROOT,'*.LEVER'));
+tStart = tic();
+
+flist = dir(fullfile(kROOT,'*.LEVER'));
 d = zeros(length(flist));
-L = length(flist);
-imList = {};
+kymoPixels = {};
+ 
+p = ljsStartParallel(32);
 
-tStart = tic();
-% 
-parfor ff=1:L
+parfor ff=1:length(flist)
     strDB_ff = fullfile(flist(ff).folder,flist(ff).name);
-    im_ff = SSF.loadImage(strDB_ff,targetChannels);    
-    for gg=1:L
-        if gg<ff 
+    im_ff = SSF.loadImage(strDB_ff,targetChannels);
+    kp = im_ff(find(im_ff));
+    kymoPixels{ff} = kp;
+end 
+kymoPixels = vertcat(kymoPixels{:});
+erkClipLimits = [prctile(kymoPixels,2.5),prctile(kymoPixels,97.5)]
+% erkClipLimits = [0,prctile(kymoPixels,99)];
+
+%
+cmdList = NCD.dParallelCommandList(ones(length(flist)),p.NumWorkers);
+W = size(cmdList,2); % for slicing j in parfor
+H = size(cmdList,1);
+dxx = zeros(H,W);
+parfor i=1:H
+    str_ff_prev = '';
+    im_ff = [];
+
+    for j = 1:W
+        t0 = tic();
+        ff = cmdList(i,j,2); % ff is the row var -- repeats
+        gg = cmdList(i,j,1);
+        if 0 == ff || 0 == gg
             continue
         end
-        t0 = tic();
+        strDB_ff = fullfile(flist(ff).folder,flist(ff).name);
+        if ~strcmp(strDB_ff,str_ff_prev)
+            im_ff = SSF.loadImage(strDB_ff,targetChannels);
+            im_ff = SSF.quantize8(im_ff,erkClipLimits);
+            str_ff_prev = strDB_ff;
+        end
+
         if ff == gg
-            d(ff,gg) = SSF.ncd_ssf_volume(im_ff,im_ff);
+            d1 = SSF.ncd_ssf_volume(im_ff,im_ff);
+            dxx(i,j) = d1;
         else
             strDB_gg = fullfile(flist(gg).folder,flist(gg).name);
-            im_gg = SSF.loadImage(strDB_gg,targetChannels);   
+            im_gg = SSF.loadImage(strDB_gg,targetChannels);
+            im_gg = SSF.quantize8(im_gg,erkClipLimits);
+
             d1 = SSF.ncd_ssf_volume(im_ff,im_gg);
             d2 = SSF.ncd_ssf_volume(im_gg,im_ff);
-            d(ff,gg) = min(d1,d2);
+
+
+            dxx(i,j) = min(d1,d2);
         end
         tElapsed = toc(t0);
-        fprintf('%s tElapsed = %0.2f\n',mat2str([ff,gg,d(ff,gg)]),tElapsed);
+        fprintf('%s tElapsed = %0.2f\n',mat2str([ff,gg,dxx(i,j)]),tElapsed);
     end
 end
-for i=1:L
-    for j=1:i-1
-        d(i,j) = d(j,i);
+% convert dxx to distance matrix d
+d = [];
+for i = 1 : size(dxx,1)
+    for j = 1 : size(dxx,2)
+        c = cmdList(i,j,1);
+        r = cmdList(i,j,2);
+        if 0 == r || 0 == c
+            continue
+        end
+        d(r,c) = dxx(i,j);
+    end
+end
+
+for i = 1 : size(d,1)
+    for j = 1 : size(d,2)
+        if 0 == d(i,j)
+            d(i,j) = d(j,i);
+        end
     end
 end
 tElapsed = toc(tStart);
-fprintf('total time tElapsed = %0.2f\n',tElapsed);
\ No newline at end of file
+fprintf('total time tElapsed = %0.2f\n',tElapsed);
diff --git a/matlab/+SSF/loadImage.m b/matlab/+SSF/loadImage.m
index 289d75927ec2977fabfc149f0d4121d51e64d728..9e149c8d140985dc9473b36273bbf4483b2c4841 100644
--- a/matlab/+SSF/loadImage.m
+++ b/matlab/+SSF/loadImage.m
@@ -1,10 +1,11 @@
+
 function im = loadImage(strDB,channelList)
 
+if ~exist('bDouble','var')
+    bDouble = false;
+end
 im = [];
+time = 1; % kymo is single time point
 for c=1:length(channelList)
-    im(:,:,:,c) = leversc.loadImage(strDB,1,channelList(c));    
-end
-if 2 == length(channelList)
-    im(:,:,:,3) = 0 * im(:,:,:,1);
+    im(:,:,:,c) = leversc.loadImage(strDB,time,channelList(c));  
 end
-im = im2uint8(im);
diff --git a/matlab/+SSF/ncd_ssf_volume.m b/matlab/+SSF/ncd_ssf_volume.m
index 7126fcde848816060cdfea112f13cf02eeec1bb3..0c3427a496154cf7e7ca3f8e62c3e5f32c32eb74 100644
--- a/matlab/+SSF/ncd_ssf_volume.m
+++ b/matlab/+SSF/ncd_ssf_volume.m
@@ -3,11 +3,11 @@
 % package to cell array by t and then pass to in memory FLI%F compressor
 function ncd = ncd_ssf_volume(i1,i2)
 
-im12 = padcat1(i1,i2);
+im12 = SSF.catKymographs(i1,i2,1);
 im12 = squeeze(num2cell(im12,[1,2,4]));
 s12 = NCD.flifPress(im12);
 
-im21 = padcat2(i1,i2);
+im21 = SSF.catKymographs(i1,i2,2);
 im21 = squeeze(num2cell(im21,[1,2,4]));
 s21 = NCD.flifPress(im21);
 
@@ -22,22 +22,3 @@ s2 = NCD.flifPress(i2);
 ncd = ( s12-min(s1,s2)) / (max(s1,s2));
 
 4;
-
-% pads time between images
-function i12 = padcat1(i1,i2)
-if size(i1,3)>size(i2,3)
-    i2(:,:,end:size(i1,3),:)=0;
-else
-    i1(:,:,end:size(i2,3),:)=0;
-end
-i12 = cat(1,i1,i2);
-4;
-
-function i12 = padcat2(i1,i2)
-if size(i1,3)>size(i2,3)
-    i2(:,:,end:size(i1,3),:)=0;
-else
-    i1(:,:,end:size(i2,3),:)=0;
-end
-i12 = cat(2,i1,i2);
-4;
\ No newline at end of file
diff --git a/matlab/+SSF/quantize8.m b/matlab/+SSF/quantize8.m
new file mode 100644
index 0000000000000000000000000000000000000000..1a2a0f119da3e86867c2433fc4da199bb0480fd6
--- /dev/null
+++ b/matlab/+SSF/quantize8.m
@@ -0,0 +1,14 @@
+% clipLimits = [minVal,maxVal];
+function im = quantize8(im,clipLimits)
+
+if isa(im,'uint8')
+    return
+end
+im = max(im,clipLimits(1));
+im = min(im,clipLimits(2));
+
+im = (im - clipLimits(1)) ./ (clipLimits(2) - clipLimits(1));
+
+im = im2uint8(im);
+im = max(im,1); % exclude 0 -- only for background
+im(1,1) = 0; % make sure at least 1 pixel hits background
\ No newline at end of file
diff --git a/matlab/+SSF/ssf_channel.m b/matlab/+SSF/ssf_channel.m
index 49d18d232bdf8c7bf3a02f28df711376122622c1..ce62430a5ea41136d52ce539b19924d432999714 100644
--- a/matlab/+SSF/ssf_channel.m
+++ b/matlab/+SSF/ssf_channel.m
@@ -1,11 +1,12 @@
-function imSSF = ssf_channel(cellList,CONSTANTS,channel,t,refMax,segParams,centroidMap)
+function imSSF = ssf_channel(cellList,CONSTANTS,channel,t,refMax,segParams,centroidMap,bDownscale)
 
-if ~exist('bTube','var')
-    bTube = false;
-end
 im = MicroscopeData.Reader('imageData',CONSTANTS.imageData, 'chanList',abs(channel),'timeRange',[t t], 'outType','uint16','prompt',false);
 im = Segment.denoise(im,segParams,false);
 im = double(im)./2^16;
+% scale refMax by actual image statistics. median estimates background,
+% 99.99% represents max foreground intensity.
+refMax = refMax * ( prctile(im(:),99.99) -  median(im(:)));
+
 [imLoG, imp, imn] = LoG.getCompositeLoG(im,CONSTANTS,segParams);
 
 bw = logical(0*imp);
@@ -16,7 +17,11 @@ d = bwdist(~bw);
 imp(d<3)=0;
 imn(d<3)=0;
 
-imSSF = zeros(size(imp,1),size(imp,2));
+szim = ceil(size(imp));
+if bDownscale
+    szim = szim ./ 2;
+end
+imSSF = zeros(szim(1),szim(2));
 for i=1:length(cellList)
     if is3D(CONSTANTS)
         cx = centroidMap(cellList(i).cellID);        
@@ -24,15 +29,18 @@ for i=1:length(cellList)
         cx = round(cellList(i).centroid);
         cx = [cx(2),cx(1)]; % [y,x]
     end
+    if bDownscale
+        cx = round(cx/2);
+    end
     val_Pos = max(imp(cellList(i).idxPts));
     val_Neg = max(imn(cellList(i).idxPts));
     if val_Pos > val_Neg
-        % bright nucleus, dark cytoplasm
+        % dark nucleus, bright cytoplasm
         % ssf sign is in direction of intensity gradient
-        val = -1 * val_Pos;
+        val = val_Pos;
     else
-        % dark nucleus, bright cytoplasm
-        val = val_Neg;
+        % bright nucleus, dark cytoplasm
+        val = -1 * val_Neg;
     end
     ratio = val./refMax;
     ratio  = min(ratio,1);
@@ -41,4 +49,16 @@ for i=1:length(cellList)
     imSSF(cx(1),cx(2)) = ratio;
 
 end
+
+% if channel < 0
+%     % negative channel, keep negative LoG response
+%     imSSF(imSSF>0) = 0;
+%     imSSF = abs(imSSF);
+% else
+%     % positive channel, keep positive LoG response
+%     imSSF(imSSF<0) = 0;
+% end
+
+% imSSF = max(imSSF,0);
+% imSSF = min(imSSF,1);
 4;
diff --git a/matlab/+SSF/ssf_sample.m b/matlab/+SSF/ssf_sample.m
new file mode 100644
index 0000000000000000000000000000000000000000..d39f114804581513bda4597295cc072da8592ca4
--- /dev/null
+++ b/matlab/+SSF/ssf_sample.m
@@ -0,0 +1,10 @@
+% check the neighborhood around centeroid in imkymo. used to eliminate
+% round off errors in kymo / cell centroid
+function sample_value = ssf_sample(imKymo,centroid,idxCentroid)
+
+sample_value = imKymo(centroid(1)-1:centroid(1)+1,centroid(2)-1:centroid(2)+1,centroid(3));
+if length(find(sample_value))>1
+    fprintf(2,'ack SSF kymo ack more than one ssf sample found at centroid. send help.\n');
+end
+sample_value = sample_value(find(sample_value));
+sample_value = sample_value(1);
\ No newline at end of file
diff --git a/matlab/+SSF/ssf_sample_idx.m b/matlab/+SSF/ssf_sample_idx.m
new file mode 100644
index 0000000000000000000000000000000000000000..0d3d500c518a55f21dd3e67f132852220bbd33af
--- /dev/null
+++ b/matlab/+SSF/ssf_sample_idx.m
@@ -0,0 +1,17 @@
+% check the neighborhood around centeroid in imkymo. used to eliminate
+% round off errors in kymo / cell centroid
+function sampleList = ssf_sample_idx(imKymo,idxCentroid)
+sampleList = [];
+for i = 1:length(idxCentroid)
+    [centroid(1),centroid(2),centroid(3)] = ind2sub(size(imKymo),idxCentroid(i));
+    sv = imKymo(centroid(1)-1:centroid(1)+1,centroid(2)-1:centroid(2)+1,centroid(3));
+    if length(find(sv))>1
+        fprintf(2,'ack SSF kymo ack more than one ssf sample found at centroid. send help.\n');
+    end
+    sv = sv(find(sv));
+    if isempty(sv)
+        sv = 0;
+    end
+    sv = sv(1);
+    sampleList(i) = sv;
+end
\ No newline at end of file
diff --git a/matlab/+SSF/ssf_volume.m b/matlab/+SSF/ssf_volume.m
index 7e778db02da9b4e38465ce731aea390daf31f557..7e2927ea01a46987baed927ab1d189cf7dd9c757 100644
--- a/matlab/+SSF/ssf_volume.m
+++ b/matlab/+SSF/ssf_volume.m
@@ -1,4 +1,4 @@
-function im_ssf = ssf_volume(strDB,targetChannelNumbers)
+function im_ssf = ssf_volume(strDB,targetChannelNumbers, bDownscale)
 
 refMax = 0.7; % from cacheReferenceLoG
 
@@ -20,6 +20,9 @@ xyzct_size = Helpers.volumeSize(CONSTANTS);
 % FUN NOTE :: if you compute kymo_size wrong here, then when we iterate
 % below you will propagate that mistake exponentially and run out of memory
 kymo_size = [xyzct_size(1:2) xyzct_size(5) xyzct_size(4) 1];
+if bDownscale
+    kymo_size(1:2) = ceil(kymo_size(1:2) ./ 2);
+end
 if is3D(CONSTANTS)
     centroidMap = SSF.mapCentroids(connx,CONSTANTS);
 else
@@ -33,7 +36,7 @@ for t=1:CONSTANTS.imageData.NumberOfFrames
     cellList = Read.getCellsTime(connx,t,segParams.channels(1),CONSTANTS);
     for c=1:length(targetChannelNumbers)
         % 5-D x,y,1,c,t -> 3-D x,y,t(z),c
-        im_ssf(:,:,t,c) = SSF.ssf_channel(cellList,CONSTANTS,targetChannelNumbers(c),t,refMax,segParams,centroidMap); 
+        im_ssf(:,:,t,c) = SSF.ssf_channel(cellList,CONSTANTS,targetChannelNumbers(c),t,refMax,segParams,centroidMap,bDownscale); 
     end
 end
 close(connx);
\ No newline at end of file
diff --git a/matlab/+SSF/trackDistance.m b/matlab/+SSF/trackDistance.m
new file mode 100644
index 0000000000000000000000000000000000000000..4f018e942bae2444aafe3a2dc62234220edd76fd
--- /dev/null
+++ b/matlab/+SSF/trackDistance.m
@@ -0,0 +1,18 @@
+function d = trackDistance(ci,cj)
+tOverlap = intersect(ci(:,3),cj(:,3));
+if isempty(tOverlap)
+    d = Inf;
+    return
+end
+idxDel = find(arrayfun(@(x) isempty(intersect(x,tOverlap)),ci(:,3)));
+ci(idxDel,:) = [];
+idxDel = find(arrayfun(@(x) isempty(intersect(x,tOverlap)),cj(:,3)));
+cj(idxDel,:) = [];
+
+
+if isempty(ci) || isempty(cj)
+    d = Inf;
+    return
+end
+dx = sqrt( (ci(:,1) - cj(:,1)).^2 + (ci(:,2)-cj(:,2)).^2);
+d = median(dx);
\ No newline at end of file
diff --git a/matlab/+Segment/frameSegment.m b/matlab/+Segment/frameSegment.m
index 4b314b8fca358923f76c27286d84f096b39cddd2..58756230a73dbb0f87c25dd2734cd0cc6728d7bf 100644
--- a/matlab/+Segment/frameSegment.m
+++ b/matlab/+Segment/frameSegment.m
@@ -130,7 +130,7 @@ for n=1:max(L(:))
         end
     end
     newCell.idxPts = idx;
-   
+    newCell.n = n;
     segL=unique(L2(idx));
     segL(0==segL)=[];
     if length(segL)>1
@@ -141,27 +141,35 @@ for n=1:max(L(:))
         newCell=Ensemble.setCellFeatures(newCell,rp,n,segParams);
     end
     newCell.LoG = LoG.sampleCell(newCell,CONSTANTS,imLoG);
-    if is3D(imLoG)
-        threshLoG = -1e-2;
-    else
-        threshLoG = -1e-3;
-    end
-    if (newCell.LoG >threshLoG) 
-        % disallow segmentation based on centroid LoG thresholding
+
+    % check ecc
+    v = eig(cov(newCell.pts));
+    ecc = max(v)/min(v);
+    if ecc>50 
         continue
     end
+%     if is3D(imLoG)
+%         threshLoG = -1e-2;
+%     else
+%         threshLoG = -1e-3;
+%     end
+%     if (newCell.LoG >threshLoG) 
+%         % disallow segmentation based on centroid LoG thresholding
+%         continue
+%     end
 
     Cells=[Cells newCell];
 end
-
-threshLoG = mean([Cells.LoG])/10;
-idx = find([Cells.LoG]>threshLoG); % use > since LoG is negative on nuclear channel
-Cells(idx) = [];
-% % on ensembleSeg
-if 1 || bEnsemble         
-    Cells=Ensemble.setCellEfficiency(Cells,CONSTANTS,im,imLoG,segParams,medianMask);   
-%     Cells = Ensemble.set_LoG_score(Cells,CONSTANTS,im,imLoG,segParams);
-end 
+if ~isempty(Cells)
+    threshLoG = mean([Cells.LoG])/10;
+    idx = find([Cells.LoG]>threshLoG); % use > since LoG is negative on nuclear channel
+%     Cells(idx) = [];
+    % % on ensembleSeg
+    if 1 || bEnsemble         
+        Cells=Ensemble.setCellEfficiency(Cells,CONSTANTS,im,imLoG,segParams,medianMask);   
+    %     Cells = Ensemble.set_LoG_score(Cells,CONSTANTS,im,imLoG,segParams);
+    end 
+end
 
 if DRAW && ~is3D(im)
     for i=1:length(Cells)
diff --git a/matlab/+Segment/segReduce.m b/matlab/+Segment/segReduce.m
index 08e5a1789f212d7de83aa79da308eedcf730d721..654da8f96e0c52d15a57230ffb19fe0c7e64a27a 100644
--- a/matlab/+Segment/segReduce.m
+++ b/matlab/+Segment/segReduce.m
@@ -2,7 +2,8 @@
 function L = segReduce(bw,imn,min_area_pixels)
 % use the LoG image instead of distance for watershed xform
 % empirical maxima surpression with first watershed
-L = watershed(-1 * imhmax(imn,0.01));
+hmax = 0.01;
+L = watershed(-1 * imhmax(imn,hmax));
 % % L=watershed(-1 * imn);
 L(~bw)=0;
 
diff --git a/matlab/+Segment/thresholdLoG_negative.m b/matlab/+Segment/thresholdLoG_negative.m
index e0b043bd7ef6746b40a2495612231d74833e906c..29aa79124ee71827f938a801a954a8c2f6038a11 100644
--- a/matlab/+Segment/thresholdLoG_negative.m
+++ b/matlab/+Segment/thresholdLoG_negative.m
@@ -10,6 +10,9 @@ else
     sensitivity = segParams.sensitivity;
 end
 
+% ACK! hardcode! ACK!
+sensitivity = 0;
+
 imn = imLoG;
 imn(imn>0)=0;
 imn=abs(imn);
diff --git a/matlab/+Smooth/+Classify/getMitosisFeatures.m b/matlab/+Smooth/+Classify/getMitosisFeatures.m
index e47ce7446ca54d136c91d425ae6eaa42a7548f73..204e9fcbc8cbe172bb28c634aa14dbced2fd37b5 100644
--- a/matlab/+Smooth/+Classify/getMitosisFeatures.m
+++ b/matlab/+Smooth/+Classify/getMitosisFeatures.m
@@ -44,15 +44,12 @@ centroids=cellfun(@jsondecode,q(:,3),'uniformoutput',false);
 centroids=reshape(cell2mat(centroids),3,[])';
 parentCandidates=[cell2mat(q(:,1:2)) centroids];
 
-d1=Read.getCell(conn,d1CellID);
+d1=Read.getCell(conn,d1CellID,CONSTANTS);
 costs=findD2Candidates(conn,parentCandidates,time,d1);
 if isempty(costs)
     return
 end
-[~,idx]=min([costs.ratioD1D2]);
-if costs(idx).ratioD1D2>25
-    return
-end
+[~,idx]=min(abs(1-[costs.ratioD1D2]));
 mitosisNode.ratioD1D2=costs(idx).ratioD1D2;
 
 % make sure daughter is not already in family tree. if density is high
@@ -70,20 +67,20 @@ end
 cmd=['select max(time) from tblCells where trackID IN(' num2str(costs(idx).parentDaughterTID(2)), ',' num2str(costs(idx).parentDaughterCID(2))  ') '];
 q=ljsFetch(conn,cmd);
 t1=q{1};
-if (t1-time)<5 && ~bDebug
-    return
-end
+% if (t1-time)<5 && ~bDebug
+%     return
+% end
 
 mitosisNode.parentCellID=costs(idx).parentDaughterCID(1);
 mitosisNode.siblingCellID=costs(idx).parentDaughterCID(2);
 mitosisNode.parentDaughterTID=costs(idx).parentDaughterTID;
 
-d2=Read.getCell(conn,mitosisNode.siblingCellID);
-p=Read.getCell(conn,mitosisNode.parentCellID);
+d2=Read.getCell(conn,mitosisNode.siblingCellID,CONSTANTS);
+p=Read.getCell(conn,mitosisNode.parentCellID,CONSTANTS);
 
-% for parent area, select max over last 3 frames
+% for parent area, select max over last 2 frames
 cmd=['select area from tblCells where trackID=' num2str(mitosisNode.parentDaughterTID(1))...
-    ' and time<' num2str(d1.time) ' and time>=' num2str(p.time-3)];
+    ' and time<' num2str(d1.time) ' and time>=' num2str(d1.time-2)];
 q=ljsFetch(conn,cmd);
 aparent=cell2mat(q);
 
@@ -95,40 +92,43 @@ else
     areaRatio=ar2;
 end
 mitosisNode.areaRatio=areaRatio;
-if areaRatio<minAreaRatio || areaRatio>2.5
-    return
-end
+
 
 bOcclusionEdge1=Mitosis.checkOcclusionEdge(conn,d1);
 bOcclusionEdge2=Mitosis.checkOcclusionEdge(conn,d2);
 if bOcclusionEdge1 || bOcclusionEdge2
+    % ???
+    mitosisNode.areaRatio = Inf;
     return
 end
 
 mitosisNode.sibAreaRatio=max([d1.area,d2.area])/min([d1.area,d2.area]);
 
+% parent LoG
+cmd=['select LoG from tblCells where trackID=' num2str(p.trackID)...
+    ' and time<' num2str(d1.time) ' and time>=' num2str(p.time-3)];
+q=ljsFetch(conn,cmd);
+parentLoG = min(cell2mat(q));
+% d1 LoG
+cmd=['select LoG from tblCells where trackID=' num2str(d1.trackID)...
+    ' and time>=' num2str(d1.time) ' and time<' num2str(d1.time+3)];
+q=ljsFetch(conn,cmd);
+d1LoG = min(cell2mat(q));
 
-segParams=Read.getSegmentationParams(conn);
-imCache=Mitosis.getImageCache(conn,CONSTANTS,time,segParams);
-if isempty(imCache)
-    return;
-end
+% d1 LoG
+cmd=['select LoG from tblCells where trackID=' num2str(d2.trackID)...
+    ' and time>=' num2str(d1.time) ' and time<' num2str(d2.time+3)];
+q=ljsFetch(conn,cmd);
+d2LoG = min(cell2mat(q));
 
-d1br=brightShape(d1,imCache.im);
-d2br=brightShape(d2,imCache.im);
-d1t1=getNextDaughter(conn,d1);
-if ~isempty(d1t1)
-    d1br=max([d1br,brightShape(d1t1,imCache.imP1)]);
-end
-d2t1=getNextDaughter(conn,d2);
-if ~isempty(d2t1)
-    d2br=max([d2br,brightShape(d2t1,imCache.imP1)]);
-end
+mitosisNode.pd1d2LoG = [parentLoG,d1LoG,d2LoG];
 
-pbr=getParentBR(conn,CONSTANTS,p,imCache);
-mitosisNode.brightRatio=[d1br,d2br,pbr];
-eccParent=getParentECC(conn,imCache,p);
-mitosisNode.eccParent=eccParent;
+mitosisNode.pd1d2Ecc = [Helpers.cellEccentricity(p),Helpers.cellEccentricity(d1),...
+    Helpers.cellEccentricity(d2)];
+
+o1 = length(intersect(p.idxPts,d1.idxPts))/min(length(p.idxPts),length(d1.idxPts));
+o2 = length(intersect(p.idxPts,d2.idxPts))/min(length(p.idxPts),length(d2.idxPts));
+mitosisNode.pd1d2overlap = [o1,o2];
 
 4;
 % end of find family
@@ -140,113 +140,41 @@ for i=1:size(parentCandidates,1)
     
 %     % target sibling 2 is the cell parent candidate tracked 2
     % parentCandidates are [cellID,trackID,centroid]  
-    [d2TrackID,d2CellID,d2Centroid]=getDaughter2(conn,parentCandidates(i,:),time,d1);
-    if isempty(d2TrackID)
+    d2 = getDaughter2(conn,parentCandidates(i,:),time,d1);
+    if isempty(d2)
         continue
     end
-    if d2CellID==d1.cellID
+    if d2.cellID==d1.cellID
         % need to come in via the other sibling!
         return
     end
-    
+    d1d2LoG = abs([d1.LoG,d2.LoG]);
+    d1d2LoG = min(d1d2LoG)/max(d1d2LoG);
+%     if  d1d2LoG < 0.5
+%         continue
+%     end
     pCentroid=parentCandidates(i,3:5);
     
     % midpoint of line between daughters -- this is where we'd like to see
     % the parent
-    pmid=(d2Centroid+d1.centroid)/2;
+    pmid=(d2.centroid+d1.centroid)/2;
     
     nc=[];
-    nc.parentDaughterCID=[parentCandidates(i,1),d2CellID,];
+    nc.parentDaughterCID=[parentCandidates(i,1),d2.cellID,];
     nc.parentToDaughterMidpoint=norm(pCentroid-pmid);
     nc.dParentD1=Mitosis.cellDistance(conn,d1.cellID,parentCandidates(i,1));
-    nc.dParentD2=Mitosis.cellDistance(conn,d2CellID,parentCandidates(i,1));
-    nc.parentDaughterTID=[parentCandidates(i,2),d2TrackID];
+    nc.dParentD2=Mitosis.cellDistance(conn,d2.cellID,parentCandidates(i,1));
+    nc.parentDaughterTID=[parentCandidates(i,2),d2.trackID];
+
+    ratioD1D2 = min(nc.dParentD1,nc.dParentD2) / max(nc.dParentD1,nc.dParentD2);
     nc.ratioD1D2=nc.dParentD1/nc.dParentD2;
+    nc.d1d2LoG = d1d2LoG;
     costs=[costs nc];
 end
 
-function eccParent=getParentECC(conn,imCache,p)
-eccParent=getEcc(size(imCache.im),p);
-cmd=['select cellID from tblCells where time=' num2str(p.time-1) ' and '...
-    ' trackID= ' num2str(p.trackID)];
-q=ljsFetch(conn,cmd);
-if isempty(q)
-    return
-end
-p1=Read.getCell(conn,q{1});
-eccParent1=getEcc(size(imCache.im),p1);
-eccParent=min([eccParent,eccParent1]);
-
-
-function pbr=getParentBR(conn,CONSTANTS,p,imCache)
-
-% parent needs to be in frame t-1
-pbr=brightShape(p,imCache.imM1);
-cmd=['select cellID from tblCells where time=' num2str(p.time-1) ' and '...
-    ' trackID= ' num2str(p.trackID)];
-q=ljsFetch(conn,cmd);
-if isempty(q)
-    return
-end
-p1=Read.getCell(conn,q{1});
-pbr1=brightShape(p1,imCache.imM2);
-pbr=max([pbr,pbr1]);
-
-function d=getNextDaughter(conn,cell)
-
-cmd=['select cellID from tblCells where trackID=' num2str(cell.trackID) ' and time=' num2str(cell.time)];
-q=ljsFetch(conn,cmd);
-if isempty(q)
-    d=[];
-    return;
-end
-nextID=q{1};
-d=Read.getCell(conn,nextID);
-
-% mse between distance transform and intensity profile
-function br=brightShape(cell,im)
-
-if isempty(im)
-    br=0;
-    return;
-end
-imx=0*im;
-if (size(im,3))>1
-    idx=sub2ind(size(im),cell.pts(:,2),cell.pts(:,1),cell.pts(:,3));
-else
-    idx=sub2ind(size(im),cell.pts(:,2),cell.pts(:,1));
-end
-imx(idx)=im(idx);
-if (0==max(imx(:)))
-    br=0;
-    return
-end
-
-bwd=bwdist(~imx);
-imx=imx.*max(bwd(:))/max(imx(:));
-br=sum(bwd(:)-imx(:))/length(find(bwd));
-
-function ecc=getEcc(szImage,cell)
-
-if length(szImage)>2 && szImage(3)>1
-    ecc=0;
-    return;
-end
-imx=zeros(szImage);
-idx=sub2ind(szImage,cell.pts(:,2),cell.pts(:,1));
-imx(idx)=1;
-if (0==max(imx(:)))
-    ecc=1;
-    return
-end
-rp=regionprops(imx,'Eccentricity');
-ecc=rp.Eccentricity;
-
-function [d2TrackID,d2CellID,d2Centroid]=getDaughter2(conn,parentCandidate,time,d1)
+function d2 = getDaughter2(conn,parentCandidate,time,d1)
 
-d2TrackID=[];
-d2CellID=[];
-d2Centroid=[];
+d2 = [];
 
 itid=parentCandidate(2); % trackID for parent/daughter 2
 % try to use parent trackID in time t-1 to find daughter in time t
@@ -257,9 +185,7 @@ if size(q,1)>1
     fprintf(2,'rut roh! duplicate track entries conn=%s time=%d\n',conn.DataSource,time);
 end
 if ~isempty(q)
-    d2TrackID=itid;
-    d2CellID=q{1};
-    d2Centroid=jsondecode(q{1,2})';
+    d2 = Read.getCell(conn,q{1});
 else
     % parent did not track to a d2
     % so, there first choice is still out there and is not d1 (since d1 is 
@@ -272,26 +198,24 @@ else
     %  to find a daughter that the parent wanted, but later the parent may
     %  get the track they actually wanted. pfad.
     %  for now, no go
-    return;
-    
-    cmd=['select * from tblDistCC where cellID_src=' num2str(parentCandidate(1)) ...
-        ' and cellID_dst in (select cellID  from (select cellID,trackID,min(time) ' ...
-        ' as tStart from tblCells group by trackID)) and cellID_dst<>' num2str(d1.cellID)];
-    q=fetch(conn,cmd);
-    if ~isempty(q)
-        % make sure d2 is not already in table
-        cmd=['select * from tblFamilies where cellID_child1=' num2str(q.cellID_dst(1))];
-        qfamily=fetch(conn,cmd);
-        if isempty(qfamily)
-            d2=Read.getCell(conn,q.cellID_dst(1));
-            if d2.time~=d1.time
-                return
-            end
-            d2TrackID=d2.trackID;
-            d2CellID=d2.cellID;
-            d2Centroid=d2.centroid;
+    cmd = ['select * from tblDistCC where cellID_src = ' num2str(parentCandidate(1)) ' order by cost asc'];
+    qp = fetch(conn,cmd);
+    cmd = ['select cellID,LoG from tblCells where cellID in ' Helpers.sqlEncodeVector(qp.cellID_dst)];
+    qd = fetch(conn,cmd);
+    qd(qd.LoG>-0.1,:) = [];
+    qd(qd.cellID == d1.cellID,:) = [];
+    i = 1;
+    while i <= length(qp.cellID_dst)
+        if isempty(intersect(qp.cellID_dst(i),qd.cellID))
+            qp(i,:) = [];
+        else
+            i = i+1;
         end
     end
+    if ~isempty(qp)
+        d2 = Read.getCell(conn,qp.cellID_dst(1));
+    end
+
 end
    
 
diff --git a/matlab/+Smooth/+Classify/goClassifyMitosis.m b/matlab/+Smooth/+Classify/goClassifyMitosis.m
index b1dd86c29e34ff999064fa38a9d0c29304627025..b2542ead4a500033e82d7f29cd2991f149e144cb 100644
--- a/matlab/+Smooth/+Classify/goClassifyMitosis.m
+++ b/matlab/+Smooth/+Classify/goClassifyMitosis.m
@@ -13,43 +13,23 @@ end
 if ~exist('nProcessors','var') || isempty(nProcessors)
     nProcessors=ljsNProcs();
 end
-p=ljsStartParallel(nProcessors);
+% p=ljsStartParallel(nProcessors);
 
 mParams=Read.getMitosisParams(conn);
+segParams = Read.getSegmentationParams(conn);
 targetTracks=Smooth.getTargetTracks(conn,5);
-strDB=conn.DataSource;
 
-mnode=Smooth.Classify.newMitosisNode(-1);
-cxComp=Composite();
-spmd
-    cxComp=openDB(strDB);
-end
-mnode=[];
-for i=1:ceil(size(targetTracks,1)/p.NumWorkers)
-    mx=[];
-    spmd
-        idx = ((i - 1) * numlabs) + labindex;
-        if idx<=size(targetTracks,1)
-            if targetTracks.t0(idx)==1
-                mx=Smooth.Classify.newMitosisNode(targetTracks.trackID(idx));
-            else            
-                mx=Smooth.Classify.getMitosisFeatures(cxComp,CONSTANTS,mParams,targetTracks.trackID(idx));
-            end
-        end
-    end
-    mres=[mx{:}]';
-    mnode=[mnode;mres];
-end
-spmd
-    close(cxComp);
-end
+mnode = [];
+
+for i = 1:length(targetTracks.trackID)
+    mn = Smooth.Classify.getMitosisFeatures(conn,CONSTANTS,mParams,targetTracks.trackID(i))  ;
 
-for i=1:length(mnode)
-    if Smooth.Classify.isValidMitosis(mnode(i),mParams)
-        c1=Read.getCell(conn,mnode(i).d1CellID);
-        c2=Read.getCell(conn,mnode(i).siblingCellID);
-        p=Read.getCell(conn,mnode(i).parentCellID);        
-        ljsLog('resegMitosis: adding new mitosis at child = %d\n',mnode(i).d1CellID);
-        Mitosis.addMitosis(conn,p,c1,c2);    
+    if Smooth.Classify.isValidMitosis(mn,mParams)
+        c1=Read.getCell(conn,mn.d1CellID);
+        c2=Read.getCell(conn,mn.siblingCellID);
+        p=Read.getCell(conn,mn.parentCellID);
+%         drawMitosis(conn.DataSource,p,c1,c2,segParams,mn);
+        ljsLog('resegMitosis: adding new mitosis at child = %d\n',mn.d1CellID);
+        Mitosis.addMitosis(conn,p,c1,c2);
     end
 end
\ No newline at end of file
diff --git a/matlab/+Smooth/+Classify/isValidMitosis.m b/matlab/+Smooth/+Classify/isValidMitosis.m
index 154d6d3b13ab94d8a7fbe3c12077310e11b74470..f2eb47765e065a8865d969c1263e9832354a48c9 100644
--- a/matlab/+Smooth/+Classify/isValidMitosis.m
+++ b/matlab/+Smooth/+Classify/isValidMitosis.m
@@ -3,19 +3,27 @@ bValid=false;
 if mnode.parentCellID<0
     return;
 end
-if any(isinf(mnode.brightRatio))
+threshLoG = [-0.05,-0.1,-0.35];
+if any(mnode.pd1d2LoG > threshLoG(1)) 
     return;
 end
-if ~isinf(mParams.brightThreshold)
-    if any(mnode.brightRatio<mParams.brightThreshold)
-        return;
-    end
+if any(mnode.pd1d2LoG < threshLoG(3)) 
+    return;
 end
-if ~isinf(mParams.eccentricityThreshold)
-    if mnode.eccParent>mParams.eccentricityThreshold
-        return;
+if ~any(mnode.pd1d2LoG < threshLoG(2))
+    return
+end
+if any(mnode.pd1d2overlap>0.25)
+    if ~all(mnode.pd1d2LoG<threshLoG(2))
+        return
     end
 end
+
+daughterLoG = abs(mnode.pd1d2LoG(2:3));
+dRatio = min(daughterLoG)/max(daughterLoG);
+if dRatio < 0.5
+    return
+end
 if ~isinf(mParams.parentDaughterAreaRatio)
     if mnode.areaRatio<mParams.parentDaughterAreaRatio
         return;
diff --git a/matlab/+Smooth/+Classify/newMitosisNode.m b/matlab/+Smooth/+Classify/newMitosisNode.m
index 599f7716a7fdeecf93f26e268363d45682122f7e..7ee0e1dc4030806221d5d86245ac6781cfd5e702 100644
--- a/matlab/+Smooth/+Classify/newMitosisNode.m
+++ b/matlab/+Smooth/+Classify/newMitosisNode.m
@@ -6,7 +6,8 @@ mitosisNode.parentCellID=-1;
 mitosisNode.siblingCellID=-1;
 mitosisNode.parentDaughterTID=[-1,d1CellID];
 mitosisNode.areaRatio=0;
-mitosisNode.brightRatio=[-Inf,-Inf,-Inf];
+mitosisNode.pd1d2LoG=[-Inf,-Inf,-Inf];
 mitosisNode.sibAreaRatio=0;
-mitosisNode.eccParent=2;
+mitosisNode.pd1d2Ecc=[-Inf,-Inf,-Inf];
 mitosisNode.d1CellID=d1CellID;
+mitosisNode.pd1d2overlap = [-Inf,-Inf];
diff --git a/matlab/+Smooth/getTargetTracks.m b/matlab/+Smooth/getTargetTracks.m
index de010390f3c6b8a40e1f160880e1af4167d26e5c..bbdf4640e4bd55b9017c81420f127b1910fea5e7 100644
--- a/matlab/+Smooth/getTargetTracks.m
+++ b/matlab/+Smooth/getTargetTracks.m
@@ -1,9 +1,16 @@
 
 function targetTracks=getTargetTracks(conn,nFrames)
 
-cmd=['select * from (select trackID,min(time) as t0,max(time) as t1,count(time) as lifespan '...
-    ' from tblCells group by trackID) where lifespan>' num2str(nFrames)];    
-targetTracks=fetch(conn,cmd);
+% cmd=['select * from (select trackID,min(time) as t0,max(time) as t1,count(time) as lifespan '...
+%     ' from tblCells group by trackID) where lifespan>' num2str(nFrames)];    
+% targetTracks=fetch(conn,cmd);
 
+cmd = ['select tblCells.trackID,tblCells.time,tblCells.LoG from tblCells '...
+    ' inner join (select trackID,count(time) as nt '...
+    ' from tblCells group by trackID) as qx on tblCells.trackID = qx.trackID '...
+    ' where nt>5 and tblCells.cellID=tblCells.trackID and tblCells.time>1 and '...
+    ' tblCells.LoG<-0.05 order by tblCells.LoG asc'];
+
+targetTracks = fetch(conn,cmd);
 
 
diff --git a/matlab/+Write/CreateCells.m b/matlab/+Write/CreateCells.m
index 94eb5644662538dbb3ae71a2599b22514b4b37c0..221f409341693f376d3d21df6a5baba3d2049a5a 100644
--- a/matlab/+Write/CreateCells.m
+++ b/matlab/+Write/CreateCells.m
@@ -9,16 +9,27 @@ if isempty(Cells)
 end
 
 [~,tblFields]=Write.prepareCell([],Cells(1));
+qTable=fetch(conn,'pragma table_info(tblCells)');
 if isfield(Cells,'nest')
-    tblFields.iNest=max(tblFields{1,:})+1;
-    q=fetch(conn,'pragma table_info(tblCells)');
-    if ~any(cellfun(@length,(strfind(q.name,'iNest'))))
+    tblFields.iNest=max(tblFields{1,:})+1;    
+    if ~any(cellfun(@length,(strfind(qTable.name,'iNest'))))
         cmd = ['ALTER TABLE tblCells ADD COLUMN iNest INTEGER default -1'];
         exec(conn,cmd);
         cmd = ['ALTER TABLE tblZombies ADD COLUMN iNest INTEGER'];
         exec(conn,cmd);
     end
 end
+
+if isfield(Cells,'LoG')
+    tblFields.LoG=max(tblFields{1,:})+1;    
+    if ~any(cellfun(@length,(strfind(qTable.name,'LoG'))))
+        cmd = ['ALTER TABLE tblCells ADD COLUMN LoG REAL'];
+        exec(conn,cmd);
+        cmd = ['ALTER TABLE tblZombies ADD COLUMN LoG REAL'];
+        exec(conn,cmd);
+    end
+end
+
 cmd=Write.buildPreparedStatement(tblFields,'tblCells');
 insertCells = conn.handle.prepareStatement(cmd);
 
@@ -33,6 +44,11 @@ for i=1:length(Cells)
             insertCells.setInt(tblFields.iNest,-1);
         end
     end
+    if isfield(Cells,'LoG')
+        if ~isempty(Cells(i).nest)
+            insertCells.setDouble(tblFields.LoG,Cells(i).LoG);
+        end
+    end
     Write.tryUpdateDB(insertCells);
 end
 
diff --git a/package-lock.json b/package-lock.json
index e74e8f153bf0b91378a862079eea664272ebce5c..37d82ac109c3a80e999b30b9dfa7eb3ac1d4ca33 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -21,7 +21,7 @@
         "minimist": "^1.2.5",
         "multer": "^1.4.3",
         "semver": "^6.3.0",
-        "sqlite3": "^4.1.1",
+        "sqlite3": "^5.1.6",
         "xlsx": "^0.15.6"
       },
       "devDependencies": {
@@ -130,6 +130,12 @@
         "node": ">= 10.0.0"
       }
     },
+    "node_modules/@gar/promisify": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz",
+      "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==",
+      "optional": true
+    },
     "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",
@@ -226,6 +232,109 @@
         "node": ">= 10.0.0"
       }
     },
+    "node_modules/@mapbox/node-pre-gyp": {
+      "version": "1.0.10",
+      "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.10.tgz",
+      "integrity": "sha512-4ySo4CjzStuprMwk35H5pPbkymjv1SF3jGLj6rAHp/xT/RF7TL7bd9CTm1xDY49K2qF7jmR/g7k+SkLETP6opA==",
+      "dependencies": {
+        "detect-libc": "^2.0.0",
+        "https-proxy-agent": "^5.0.0",
+        "make-dir": "^3.1.0",
+        "node-fetch": "^2.6.7",
+        "nopt": "^5.0.0",
+        "npmlog": "^5.0.1",
+        "rimraf": "^3.0.2",
+        "semver": "^7.3.5",
+        "tar": "^6.1.11"
+      },
+      "bin": {
+        "node-pre-gyp": "bin/node-pre-gyp"
+      }
+    },
+    "node_modules/@mapbox/node-pre-gyp/node_modules/node-fetch": {
+      "version": "2.6.11",
+      "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.11.tgz",
+      "integrity": "sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w==",
+      "dependencies": {
+        "whatwg-url": "^5.0.0"
+      },
+      "engines": {
+        "node": "4.x || >=6.0.0"
+      },
+      "peerDependencies": {
+        "encoding": "^0.1.0"
+      },
+      "peerDependenciesMeta": {
+        "encoding": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@mapbox/node-pre-gyp/node_modules/semver": {
+      "version": "7.5.1",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz",
+      "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==",
+      "dependencies": {
+        "lru-cache": "^6.0.0"
+      },
+      "bin": {
+        "semver": "bin/semver.js"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/@npmcli/fs": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz",
+      "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==",
+      "optional": true,
+      "dependencies": {
+        "@gar/promisify": "^1.0.1",
+        "semver": "^7.3.5"
+      }
+    },
+    "node_modules/@npmcli/fs/node_modules/semver": {
+      "version": "7.5.1",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz",
+      "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==",
+      "optional": true,
+      "dependencies": {
+        "lru-cache": "^6.0.0"
+      },
+      "bin": {
+        "semver": "bin/semver.js"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/@npmcli/move-file": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz",
+      "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==",
+      "deprecated": "This functionality has been moved to @npmcli/fs",
+      "optional": true,
+      "dependencies": {
+        "mkdirp": "^1.0.4",
+        "rimraf": "^3.0.2"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/@npmcli/move-file/node_modules/mkdirp": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+      "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+      "optional": true,
+      "bin": {
+        "mkdirp": "bin/cmd.js"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
     "node_modules/@sindresorhus/is": {
       "version": "0.14.0",
       "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz",
@@ -489,6 +598,74 @@
       "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
       "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
     },
+    "node_modules/agentkeepalive": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.3.0.tgz",
+      "integrity": "sha512-7Epl1Blf4Sy37j4v9f9FjICCh4+KAQOyXgHEwlyBiAQLbhKdq/i2QQU3amQalS/wPhdPzDXPL5DMR5bkn+YeWg==",
+      "optional": true,
+      "dependencies": {
+        "debug": "^4.1.0",
+        "depd": "^2.0.0",
+        "humanize-ms": "^1.2.1"
+      },
+      "engines": {
+        "node": ">= 8.0.0"
+      }
+    },
+    "node_modules/agentkeepalive/node_modules/debug": {
+      "version": "4.3.4",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+      "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+      "optional": true,
+      "dependencies": {
+        "ms": "2.1.2"
+      },
+      "engines": {
+        "node": ">=6.0"
+      },
+      "peerDependenciesMeta": {
+        "supports-color": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/agentkeepalive/node_modules/depd": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
+      "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
+      "optional": true,
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/agentkeepalive/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==",
+      "optional": true
+    },
+    "node_modules/aggregate-error": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz",
+      "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==",
+      "optional": true,
+      "dependencies": {
+        "clean-stack": "^2.0.0",
+        "indent-string": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/aggregate-error/node_modules/indent-string": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
+      "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
+      "optional": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
     "node_modules/ajv": {
       "version": "6.12.6",
       "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
@@ -736,17 +913,33 @@
       "integrity": "sha1-HjRA6RXwsSA9I3SOeO3XubW0PlY="
     },
     "node_modules/aproba": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
-      "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw=="
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz",
+      "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ=="
     },
     "node_modules/are-we-there-yet": {
-      "version": "1.1.5",
-      "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz",
-      "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==",
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz",
+      "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==",
       "dependencies": {
         "delegates": "^1.0.0",
-        "readable-stream": "^2.0.6"
+        "readable-stream": "^3.6.0"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/are-we-there-yet/node_modules/readable-stream": {
+      "version": "3.6.2",
+      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
+      "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
+      "dependencies": {
+        "inherits": "^2.0.3",
+        "string_decoder": "^1.1.1",
+        "util-deprecate": "^1.0.1"
+      },
+      "engines": {
+        "node": ">= 6"
       }
     },
     "node_modules/argparse": {
@@ -1407,6 +1600,47 @@
         "node": ">= 0.8"
       }
     },
+    "node_modules/cacache": {
+      "version": "15.3.0",
+      "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz",
+      "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==",
+      "optional": true,
+      "dependencies": {
+        "@npmcli/fs": "^1.0.0",
+        "@npmcli/move-file": "^1.0.1",
+        "chownr": "^2.0.0",
+        "fs-minipass": "^2.0.0",
+        "glob": "^7.1.4",
+        "infer-owner": "^1.0.4",
+        "lru-cache": "^6.0.0",
+        "minipass": "^3.1.1",
+        "minipass-collect": "^1.0.2",
+        "minipass-flush": "^1.0.5",
+        "minipass-pipeline": "^1.2.2",
+        "mkdirp": "^1.0.3",
+        "p-map": "^4.0.0",
+        "promise-inflight": "^1.0.1",
+        "rimraf": "^3.0.2",
+        "ssri": "^8.0.1",
+        "tar": "^6.0.2",
+        "unique-filename": "^1.1.1"
+      },
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/cacache/node_modules/mkdirp": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+      "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+      "optional": true,
+      "bin": {
+        "mkdirp": "bin/cmd.js"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
     "node_modules/cacheable-request": {
       "version": "6.1.0",
       "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz",
@@ -1519,9 +1753,12 @@
       }
     },
     "node_modules/chownr": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
-      "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg=="
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
+      "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
+      "engines": {
+        "node": ">=10"
+      }
     },
     "node_modules/chromium-pickle-js": {
       "version": "0.2.0",
@@ -1540,6 +1777,15 @@
       "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.1.tgz",
       "integrity": "sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA=="
     },
+    "node_modules/clean-stack": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
+      "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==",
+      "optional": true,
+      "engines": {
+        "node": ">=6"
+      }
+    },
     "node_modules/cli-boxes": {
       "version": "2.2.1",
       "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz",
@@ -1740,6 +1986,14 @@
       "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
       "dev": true
     },
+    "node_modules/color-support": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz",
+      "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==",
+      "bin": {
+        "color-support": "bin.js"
+      }
+    },
     "node_modules/colors": {
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz",
@@ -1818,7 +2072,7 @@
     "node_modules/console-control-strings": {
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
-      "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4="
+      "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ=="
     },
     "node_modules/content-disposition": {
       "version": "0.5.3",
@@ -1964,6 +2218,7 @@
       "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
       "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
       "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)",
+      "dev": true,
       "dependencies": {
         "ms": "^2.1.1"
       }
@@ -1971,7 +2226,8 @@
     "node_modules/debug/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=="
+      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+      "dev": true
     },
     "node_modules/decamelize": {
       "version": "1.2.0",
@@ -1998,6 +2254,7 @@
       "version": "0.6.0",
       "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
       "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
+      "dev": true,
       "engines": {
         "node": ">=4.0.0"
       }
@@ -2019,7 +2276,7 @@
     "node_modules/delegates": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
-      "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o="
+      "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ=="
     },
     "node_modules/depd": {
       "version": "1.1.2",
@@ -2035,14 +2292,11 @@
       "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
     },
     "node_modules/detect-libc": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz",
-      "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=",
-      "bin": {
-        "detect-libc": "bin/detect-libc.js"
-      },
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz",
+      "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==",
       "engines": {
-        "node": ">=0.10"
+        "node": ">=8"
       }
     },
     "node_modules/dicer": {
@@ -2727,6 +2981,12 @@
         "node": ">=4"
       }
     },
+    "node_modules/err-code": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz",
+      "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==",
+      "optional": true
+    },
     "node_modules/error-ex": {
       "version": "1.3.2",
       "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
@@ -3114,11 +3374,14 @@
       }
     },
     "node_modules/fs-minipass": {
-      "version": "1.2.7",
-      "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz",
-      "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==",
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
+      "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
       "dependencies": {
-        "minipass": "^2.6.0"
+        "minipass": "^3.0.0"
+      },
+      "engines": {
+        "node": ">= 8"
       }
     },
     "node_modules/fs.realpath": {
@@ -3132,18 +3395,67 @@
       "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
     },
     "node_modules/gauge": {
-      "version": "2.7.4",
-      "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz",
-      "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=",
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz",
+      "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==",
       "dependencies": {
-        "aproba": "^1.0.3",
+        "aproba": "^1.0.3 || ^2.0.0",
+        "color-support": "^1.1.2",
         "console-control-strings": "^1.0.0",
-        "has-unicode": "^2.0.0",
-        "object-assign": "^4.1.0",
+        "has-unicode": "^2.0.1",
+        "object-assign": "^4.1.1",
         "signal-exit": "^3.0.0",
-        "string-width": "^1.0.1",
-        "strip-ansi": "^3.0.1",
-        "wide-align": "^1.1.0"
+        "string-width": "^4.2.3",
+        "strip-ansi": "^6.0.1",
+        "wide-align": "^1.1.2"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/gauge/node_modules/ansi-regex": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+      "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/gauge/node_modules/emoji-regex": {
+      "version": "8.0.0",
+      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
+    },
+    "node_modules/gauge/node_modules/is-fullwidth-code-point": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+      "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/gauge/node_modules/string-width": {
+      "version": "4.2.3",
+      "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+      "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+      "dependencies": {
+        "emoji-regex": "^8.0.0",
+        "is-fullwidth-code-point": "^3.0.0",
+        "strip-ansi": "^6.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/gauge/node_modules/strip-ansi": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+      "dependencies": {
+        "ansi-regex": "^5.0.1"
+      },
+      "engines": {
+        "node": ">=8"
       }
     },
     "node_modules/get-caller-file": {
@@ -3264,9 +3576,9 @@
       }
     },
     "node_modules/graceful-fs": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.0.tgz",
-      "integrity": "sha512-jpSvDPV4Cq/bgtpndIWbI5hmYxhQGHPC4d4cqBPb4DLniCfhJokdXhwhaDuLBGLQdvvRum/UiX6ECVIPvDXqdg=="
+      "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=="
     },
     "node_modules/graceful-readlink": {
       "version": "1.0.1",
@@ -3331,7 +3643,7 @@
     "node_modules/has-unicode": {
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
-      "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk="
+      "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ=="
     },
     "node_modules/has-yarn": {
       "version": "2.1.0",
@@ -3352,7 +3664,7 @@
       "version": "4.1.0",
       "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz",
       "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==",
-      "dev": true
+      "devOptional": true
     },
     "node_modules/http-errors": {
       "version": "1.7.2",
@@ -3459,6 +3771,15 @@
       "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
       "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
     },
+    "node_modules/humanize-ms": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz",
+      "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==",
+      "optional": true,
+      "dependencies": {
+        "ms": "^2.0.0"
+      }
+    },
     "node_modules/iconv-corefoundation": {
       "version": "1.1.7",
       "resolved": "https://registry.npmjs.org/iconv-corefoundation/-/iconv-corefoundation-1.1.7.tgz",
@@ -3526,14 +3847,6 @@
       ],
       "optional": true
     },
-    "node_modules/ignore-walk": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz",
-      "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==",
-      "dependencies": {
-        "minimatch": "^3.0.4"
-      }
-    },
     "node_modules/immutable": {
       "version": "3.8.2",
       "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz",
@@ -3555,7 +3868,7 @@
       "version": "0.1.4",
       "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
       "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
-      "dev": true,
+      "devOptional": true,
       "engines": {
         "node": ">=0.8.19"
       }
@@ -3572,6 +3885,12 @@
         "node": ">=0.10.0"
       }
     },
+    "node_modules/infer-owner": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz",
+      "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==",
+      "optional": true
+    },
     "node_modules/inflight": {
       "version": "1.0.6",
       "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
@@ -3591,10 +3910,17 @@
       "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
       "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==",
       "deprecated": "Please update to ini >=1.3.6 to avoid a prototype pollution issue",
+      "dev": true,
       "engines": {
         "node": "*"
       }
     },
+    "node_modules/ip": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz",
+      "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==",
+      "optional": true
+    },
     "node_modules/ipaddr.js": {
       "version": "1.9.0",
       "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz",
@@ -3660,6 +3986,12 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
+    "node_modules/is-lambda": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz",
+      "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==",
+      "optional": true
+    },
     "node_modules/is-npm": {
       "version": "5.0.0",
       "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz",
@@ -3737,7 +4069,7 @@
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
       "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
-      "dev": true
+      "devOptional": true
     },
     "node_modules/isomorphic-fetch": {
       "version": "2.2.1",
@@ -4160,7 +4492,6 @@
       "version": "3.1.0",
       "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
       "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
-      "dev": true,
       "dependencies": {
         "semver": "^6.0.0"
       },
@@ -4171,6 +4502,33 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
+    "node_modules/make-fetch-happen": {
+      "version": "9.1.0",
+      "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz",
+      "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==",
+      "optional": true,
+      "dependencies": {
+        "agentkeepalive": "^4.1.3",
+        "cacache": "^15.2.0",
+        "http-cache-semantics": "^4.1.0",
+        "http-proxy-agent": "^4.0.1",
+        "https-proxy-agent": "^5.0.0",
+        "is-lambda": "^1.0.1",
+        "lru-cache": "^6.0.0",
+        "minipass": "^3.1.3",
+        "minipass-collect": "^1.0.2",
+        "minipass-fetch": "^1.3.2",
+        "minipass-flush": "^1.0.5",
+        "minipass-pipeline": "^1.2.4",
+        "negotiator": "^0.6.2",
+        "promise-retry": "^2.0.1",
+        "socks-proxy-agent": "^6.0.0",
+        "ssri": "^8.0.0"
+      },
+      "engines": {
+        "node": ">= 10"
+      }
+    },
     "node_modules/map-obj": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
@@ -4278,44 +4636,91 @@
       "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q=="
     },
     "node_modules/minipass": {
-      "version": "2.9.0",
-      "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz",
-      "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==",
+      "version": "3.3.6",
+      "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+      "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
       "dependencies": {
-        "safe-buffer": "^5.1.2",
-        "yallist": "^3.0.0"
+        "yallist": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
       }
     },
-    "node_modules/minipass/node_modules/safe-buffer": {
-      "version": "5.2.1",
-      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
-      "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
-      "funding": [
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/feross"
-        },
-        {
-          "type": "patreon",
-          "url": "https://www.patreon.com/feross"
-        },
-        {
-          "type": "consulting",
-          "url": "https://feross.org/support"
-        }
-      ]
+    "node_modules/minipass-collect": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz",
+      "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==",
+      "optional": true,
+      "dependencies": {
+        "minipass": "^3.0.0"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
     },
-    "node_modules/minipass/node_modules/yallist": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
-      "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="
+    "node_modules/minipass-fetch": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz",
+      "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==",
+      "optional": true,
+      "dependencies": {
+        "minipass": "^3.1.0",
+        "minipass-sized": "^1.0.3",
+        "minizlib": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      },
+      "optionalDependencies": {
+        "encoding": "^0.1.12"
+      }
+    },
+    "node_modules/minipass-flush": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz",
+      "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==",
+      "optional": true,
+      "dependencies": {
+        "minipass": "^3.0.0"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/minipass-pipeline": {
+      "version": "1.2.4",
+      "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz",
+      "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==",
+      "optional": true,
+      "dependencies": {
+        "minipass": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/minipass-sized": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz",
+      "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==",
+      "optional": true,
+      "dependencies": {
+        "minipass": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
     },
     "node_modules/minizlib": {
-      "version": "1.3.3",
-      "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz",
-      "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==",
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz",
+      "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==",
       "dependencies": {
-        "minipass": "^2.9.0"
+        "minipass": "^3.0.0",
+        "yallist": "^4.0.0"
+      },
+      "engines": {
+        "node": ">= 8"
       }
     },
     "node_modules/mkdirp": {
@@ -4361,27 +4766,6 @@
         "node": ">=0.4"
       }
     },
-    "node_modules/nan": {
-      "version": "2.14.2",
-      "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz",
-      "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ=="
-    },
-    "node_modules/needle": {
-      "version": "2.6.0",
-      "resolved": "https://registry.npmjs.org/needle/-/needle-2.6.0.tgz",
-      "integrity": "sha512-KKYdza4heMsEfSWD7VPUIz3zX2XDwOyX2d+geb4vrERZMT5RMU6ujjaD+I5Yr54uZxQ2w6XRTAhHBbSCyovZBg==",
-      "dependencies": {
-        "debug": "^3.2.6",
-        "iconv-lite": "^0.4.4",
-        "sax": "^1.2.4"
-      },
-      "bin": {
-        "needle": "bin/needle"
-      },
-      "engines": {
-        "node": ">= 4.4.x"
-      }
-    },
     "node_modules/negotiator": {
       "version": "0.6.2",
       "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
@@ -4406,54 +4790,186 @@
         "is-stream": "^1.0.1"
       }
     },
-    "node_modules/node-jsxml": {
-      "version": "0.9.0",
-      "resolved": "https://registry.npmjs.org/node-jsxml/-/node-jsxml-0.9.0.tgz",
-      "integrity": "sha1-Ca5p+9YJnfuGAoHaZv8nkPoAmVQ=",
-      "dev": true,
+    "node_modules/node-gyp": {
+      "version": "8.4.1",
+      "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-8.4.1.tgz",
+      "integrity": "sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==",
+      "optional": true,
+      "dependencies": {
+        "env-paths": "^2.2.0",
+        "glob": "^7.1.4",
+        "graceful-fs": "^4.2.6",
+        "make-fetch-happen": "^9.1.0",
+        "nopt": "^5.0.0",
+        "npmlog": "^6.0.0",
+        "rimraf": "^3.0.2",
+        "semver": "^7.3.5",
+        "tar": "^6.1.2",
+        "which": "^2.0.2"
+      },
+      "bin": {
+        "node-gyp": "bin/node-gyp.js"
+      },
       "engines": {
-        "node": ">=0.1.9"
+        "node": ">= 10.12.0"
       }
     },
-    "node_modules/node-pre-gyp": {
-      "version": "0.11.0",
-      "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.11.0.tgz",
-      "integrity": "sha512-TwWAOZb0j7e9eGaf9esRx3ZcLaE5tQ2lvYy1pb5IAaG1a2e2Kv5Lms1Y4hpj+ciXJRofIxxlt5haeQ/2ANeE0Q==",
-      "deprecated": "Please upgrade to @mapbox/node-pre-gyp: the non-scoped node-pre-gyp package is deprecated and only the @mapbox scoped package will recieve updates in the future",
+    "node_modules/node-gyp/node_modules/ansi-regex": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+      "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+      "optional": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/node-gyp/node_modules/are-we-there-yet": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz",
+      "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==",
+      "optional": true,
       "dependencies": {
-        "detect-libc": "^1.0.2",
-        "mkdirp": "^0.5.1",
-        "needle": "^2.2.1",
-        "nopt": "^4.0.1",
-        "npm-packlist": "^1.1.6",
-        "npmlog": "^4.0.2",
-        "rc": "^1.2.7",
-        "rimraf": "^2.6.1",
-        "semver": "^5.3.0",
-        "tar": "^4"
+        "delegates": "^1.0.0",
+        "readable-stream": "^3.6.0"
       },
-      "bin": {
-        "node-pre-gyp": "bin/node-pre-gyp"
+      "engines": {
+        "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
       }
     },
-    "node_modules/node-pre-gyp/node_modules/semver": {
-      "version": "5.7.1",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
-      "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+    "node_modules/node-gyp/node_modules/emoji-regex": {
+      "version": "8.0.0",
+      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+      "optional": true
+    },
+    "node_modules/node-gyp/node_modules/env-paths": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz",
+      "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==",
+      "optional": true,
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/node-gyp/node_modules/gauge": {
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz",
+      "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==",
+      "optional": true,
+      "dependencies": {
+        "aproba": "^1.0.3 || ^2.0.0",
+        "color-support": "^1.1.3",
+        "console-control-strings": "^1.1.0",
+        "has-unicode": "^2.0.1",
+        "signal-exit": "^3.0.7",
+        "string-width": "^4.2.3",
+        "strip-ansi": "^6.0.1",
+        "wide-align": "^1.1.5"
+      },
+      "engines": {
+        "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
+      }
+    },
+    "node_modules/node-gyp/node_modules/is-fullwidth-code-point": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+      "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+      "optional": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/node-gyp/node_modules/npmlog": {
+      "version": "6.0.2",
+      "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz",
+      "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==",
+      "optional": true,
+      "dependencies": {
+        "are-we-there-yet": "^3.0.0",
+        "console-control-strings": "^1.1.0",
+        "gauge": "^4.0.3",
+        "set-blocking": "^2.0.0"
+      },
+      "engines": {
+        "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
+      }
+    },
+    "node_modules/node-gyp/node_modules/readable-stream": {
+      "version": "3.6.2",
+      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
+      "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
+      "optional": true,
+      "dependencies": {
+        "inherits": "^2.0.3",
+        "string_decoder": "^1.1.1",
+        "util-deprecate": "^1.0.1"
+      },
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/node-gyp/node_modules/semver": {
+      "version": "7.5.1",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz",
+      "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==",
+      "optional": true,
+      "dependencies": {
+        "lru-cache": "^6.0.0"
+      },
       "bin": {
-        "semver": "bin/semver"
+        "semver": "bin/semver.js"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/node-gyp/node_modules/string-width": {
+      "version": "4.2.3",
+      "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+      "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+      "optional": true,
+      "dependencies": {
+        "emoji-regex": "^8.0.0",
+        "is-fullwidth-code-point": "^3.0.0",
+        "strip-ansi": "^6.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/node-gyp/node_modules/strip-ansi": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+      "optional": true,
+      "dependencies": {
+        "ansi-regex": "^5.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/node-jsxml": {
+      "version": "0.9.0",
+      "resolved": "https://registry.npmjs.org/node-jsxml/-/node-jsxml-0.9.0.tgz",
+      "integrity": "sha1-Ca5p+9YJnfuGAoHaZv8nkPoAmVQ=",
+      "dev": true,
+      "engines": {
+        "node": ">=0.1.9"
       }
     },
     "node_modules/nopt": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz",
-      "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==",
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz",
+      "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==",
       "dependencies": {
-        "abbrev": "1",
-        "osenv": "^0.1.4"
+        "abbrev": "1"
       },
       "bin": {
         "nopt": "bin/nopt.js"
+      },
+      "engines": {
+        "node": ">=6"
       }
     },
     "node_modules/normalize-package-data": {
@@ -4486,38 +5002,15 @@
         "node": ">=8"
       }
     },
-    "node_modules/npm-bundled": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz",
-      "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==",
-      "dependencies": {
-        "npm-normalize-package-bin": "^1.0.1"
-      }
-    },
-    "node_modules/npm-normalize-package-bin": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz",
-      "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA=="
-    },
-    "node_modules/npm-packlist": {
-      "version": "1.4.8",
-      "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz",
-      "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==",
-      "dependencies": {
-        "ignore-walk": "^3.0.1",
-        "npm-bundled": "^1.0.1",
-        "npm-normalize-package-bin": "^1.0.1"
-      }
-    },
     "node_modules/npmlog": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz",
-      "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==",
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz",
+      "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==",
       "dependencies": {
-        "are-we-there-yet": "~1.1.2",
-        "console-control-strings": "~1.1.0",
-        "gauge": "~2.7.3",
-        "set-blocking": "~2.0.0"
+        "are-we-there-yet": "^2.0.0",
+        "console-control-strings": "^1.1.0",
+        "gauge": "^3.0.0",
+        "set-blocking": "^2.0.0"
       }
     },
     "node_modules/nugget": {
@@ -4605,31 +5098,6 @@
         "wrappy": "1"
       }
     },
-    "node_modules/os-homedir": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
-      "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/os-tmpdir": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
-      "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/osenv": {
-      "version": "0.1.5",
-      "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz",
-      "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==",
-      "dependencies": {
-        "os-homedir": "^1.0.0",
-        "os-tmpdir": "^1.0.0"
-      }
-    },
     "node_modules/p-cancelable": {
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz",
@@ -4639,6 +5107,21 @@
         "node": ">=6"
       }
     },
+    "node_modules/p-map": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz",
+      "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==",
+      "optional": true,
+      "dependencies": {
+        "aggregate-error": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
     "node_modules/package-json": {
       "version": "6.5.0",
       "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz",
@@ -4853,6 +5336,25 @@
         "asap": "~2.0.3"
       }
     },
+    "node_modules/promise-inflight": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz",
+      "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==",
+      "optional": true
+    },
+    "node_modules/promise-retry": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz",
+      "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==",
+      "optional": true,
+      "dependencies": {
+        "err-code": "^2.0.2",
+        "retry": "^0.12.0"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
     "node_modules/prop-types": {
       "version": "15.8.1",
       "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
@@ -4962,6 +5464,7 @@
       "version": "1.2.8",
       "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
       "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
+      "dev": true,
       "dependencies": {
         "deep-extend": "^0.6.0",
         "ini": "~1.3.0",
@@ -5239,15 +5742,27 @@
         "lowercase-keys": "^1.0.0"
       }
     },
+    "node_modules/retry": {
+      "version": "0.12.0",
+      "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz",
+      "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==",
+      "optional": true,
+      "engines": {
+        "node": ">= 4"
+      }
+    },
     "node_modules/rimraf": {
-      "version": "2.7.1",
-      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
-      "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+      "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
       "dependencies": {
         "glob": "^7.1.3"
       },
       "bin": {
         "rimraf": "bin.js"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
       }
     },
     "node_modules/safe-buffer": {
@@ -5352,7 +5867,7 @@
     "node_modules/set-blocking": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
-      "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc="
+      "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw=="
     },
     "node_modules/setimmediate": {
       "version": "1.0.5",
@@ -5399,9 +5914,9 @@
       }
     },
     "node_modules/signal-exit": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
-      "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0="
+      "version": "3.0.7",
+      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+      "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="
     },
     "node_modules/single-line-log": {
       "version": "1.1.2",
@@ -5441,13 +5956,63 @@
       "version": "4.2.0",
       "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz",
       "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==",
-      "dev": true,
       "optional": true,
       "engines": {
         "node": ">= 6.0.0",
         "npm": ">= 3.0.0"
       }
     },
+    "node_modules/socks": {
+      "version": "2.7.1",
+      "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz",
+      "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==",
+      "optional": true,
+      "dependencies": {
+        "ip": "^2.0.0",
+        "smart-buffer": "^4.2.0"
+      },
+      "engines": {
+        "node": ">= 10.13.0",
+        "npm": ">= 3.0.0"
+      }
+    },
+    "node_modules/socks-proxy-agent": {
+      "version": "6.2.1",
+      "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz",
+      "integrity": "sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==",
+      "optional": true,
+      "dependencies": {
+        "agent-base": "^6.0.2",
+        "debug": "^4.3.3",
+        "socks": "^2.6.2"
+      },
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/socks-proxy-agent/node_modules/debug": {
+      "version": "4.3.4",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+      "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+      "optional": true,
+      "dependencies": {
+        "ms": "2.1.2"
+      },
+      "engines": {
+        "node": ">=6.0"
+      },
+      "peerDependenciesMeta": {
+        "supports-color": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/socks-proxy-agent/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==",
+      "optional": true
+    },
     "node_modules/source-map": {
       "version": "0.6.1",
       "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
@@ -5506,15 +6071,32 @@
       "dev": true
     },
     "node_modules/sqlite3": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-4.2.0.tgz",
-      "integrity": "sha512-roEOz41hxui2Q7uYnWsjMOTry6TcNUNmp8audCx18gF10P2NknwdpF+E+HKvz/F2NvPKGGBF4NGc+ZPQ+AABwg==",
+      "version": "5.1.6",
+      "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-5.1.6.tgz",
+      "integrity": "sha512-olYkWoKFVNSSSQNvxVUfjiVbz3YtBwTJj+mfV5zpHmqW3sELx2Cf4QCdirMelhM5Zh+KDVaKgQHqCxrqiWHybw==",
       "hasInstallScript": true,
       "dependencies": {
-        "nan": "^2.12.1",
-        "node-pre-gyp": "^0.11.0"
+        "@mapbox/node-pre-gyp": "^1.0.0",
+        "node-addon-api": "^4.2.0",
+        "tar": "^6.1.11"
+      },
+      "optionalDependencies": {
+        "node-gyp": "8.x"
+      },
+      "peerDependencies": {
+        "node-gyp": "8.x"
+      },
+      "peerDependenciesMeta": {
+        "node-gyp": {
+          "optional": true
+        }
       }
     },
+    "node_modules/sqlite3/node_modules/node-addon-api": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.3.0.tgz",
+      "integrity": "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ=="
+    },
     "node_modules/ssf": {
       "version": "0.10.3",
       "resolved": "https://registry.npmjs.org/ssf/-/ssf-0.10.3.tgz",
@@ -5560,6 +6142,18 @@
       "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
       "dev": true
     },
+    "node_modules/ssri": {
+      "version": "8.0.1",
+      "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz",
+      "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==",
+      "optional": true,
+      "dependencies": {
+        "minipass": "^3.1.1"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
     "node_modules/stat-mode": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-1.0.0.tgz",
@@ -5648,6 +6242,7 @@
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
       "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
+      "dev": true,
       "engines": {
         "node": ">=0.10.0"
       }
@@ -5795,45 +6390,39 @@
       }
     },
     "node_modules/tar": {
-      "version": "4.4.13",
-      "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz",
-      "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==",
-      "dependencies": {
-        "chownr": "^1.1.1",
-        "fs-minipass": "^1.2.5",
-        "minipass": "^2.8.6",
-        "minizlib": "^1.2.1",
-        "mkdirp": "^0.5.0",
-        "safe-buffer": "^5.1.2",
-        "yallist": "^3.0.3"
+      "version": "6.1.15",
+      "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz",
+      "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==",
+      "dependencies": {
+        "chownr": "^2.0.0",
+        "fs-minipass": "^2.0.0",
+        "minipass": "^5.0.0",
+        "minizlib": "^2.1.1",
+        "mkdirp": "^1.0.3",
+        "yallist": "^4.0.0"
       },
       "engines": {
-        "node": ">=4.5"
+        "node": ">=10"
       }
     },
-    "node_modules/tar/node_modules/safe-buffer": {
-      "version": "5.2.1",
-      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
-      "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
-      "funding": [
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/feross"
-        },
-        {
-          "type": "patreon",
-          "url": "https://www.patreon.com/feross"
-        },
-        {
-          "type": "consulting",
-          "url": "https://feross.org/support"
-        }
-      ]
+    "node_modules/tar/node_modules/minipass": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz",
+      "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==",
+      "engines": {
+        "node": ">=8"
+      }
     },
-    "node_modules/tar/node_modules/yallist": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
-      "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="
+    "node_modules/tar/node_modules/mkdirp": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+      "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+      "bin": {
+        "mkdirp": "bin/cmd.js"
+      },
+      "engines": {
+        "node": ">=10"
+      }
     },
     "node_modules/temp-file": {
       "version": "3.4.0",
@@ -5941,21 +6530,6 @@
         "tmp": "^0.2.0"
       }
     },
-    "node_modules/tmp/node_modules/rimraf": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
-      "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
-      "dev": true,
-      "dependencies": {
-        "glob": "^7.1.3"
-      },
-      "bin": {
-        "rimraf": "bin.js"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/isaacs"
-      }
-    },
     "node_modules/to-readable-stream": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz",
@@ -6093,6 +6667,24 @@
       "resolved": "https://registry.npmjs.org/unfetch/-/unfetch-4.2.0.tgz",
       "integrity": "sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA=="
     },
+    "node_modules/unique-filename": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz",
+      "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==",
+      "optional": true,
+      "dependencies": {
+        "unique-slug": "^2.0.0"
+      }
+    },
+    "node_modules/unique-slug": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz",
+      "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==",
+      "optional": true,
+      "dependencies": {
+        "imurmurhash": "^0.1.4"
+      }
+    },
     "node_modules/unique-string": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz",
@@ -6310,7 +6902,7 @@
       "version": "2.0.2",
       "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
       "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
-      "dev": true,
+      "devOptional": true,
       "dependencies": {
         "isexe": "^2.0.0"
       },
@@ -6322,11 +6914,11 @@
       }
     },
     "node_modules/wide-align": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz",
-      "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==",
+      "version": "1.1.5",
+      "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz",
+      "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==",
       "dependencies": {
-        "string-width": "^1.0.2 || 2"
+        "string-width": "^1.0.2 || 2 || 3 || 4"
       }
     },
     "node_modules/widest-line": {
@@ -6719,6 +7311,12 @@
         }
       }
     },
+    "@gar/promisify": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz",
+      "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==",
+      "optional": true
+    },
     "@malept/cross-spawn-promise": {
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz",
@@ -6785,6 +7383,79 @@
         }
       }
     },
+    "@mapbox/node-pre-gyp": {
+      "version": "1.0.10",
+      "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.10.tgz",
+      "integrity": "sha512-4ySo4CjzStuprMwk35H5pPbkymjv1SF3jGLj6rAHp/xT/RF7TL7bd9CTm1xDY49K2qF7jmR/g7k+SkLETP6opA==",
+      "requires": {
+        "detect-libc": "^2.0.0",
+        "https-proxy-agent": "^5.0.0",
+        "make-dir": "^3.1.0",
+        "node-fetch": "^2.6.7",
+        "nopt": "^5.0.0",
+        "npmlog": "^5.0.1",
+        "rimraf": "^3.0.2",
+        "semver": "^7.3.5",
+        "tar": "^6.1.11"
+      },
+      "dependencies": {
+        "node-fetch": {
+          "version": "2.6.11",
+          "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.11.tgz",
+          "integrity": "sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w==",
+          "requires": {
+            "whatwg-url": "^5.0.0"
+          }
+        },
+        "semver": {
+          "version": "7.5.1",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz",
+          "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==",
+          "requires": {
+            "lru-cache": "^6.0.0"
+          }
+        }
+      }
+    },
+    "@npmcli/fs": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz",
+      "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==",
+      "optional": true,
+      "requires": {
+        "@gar/promisify": "^1.0.1",
+        "semver": "^7.3.5"
+      },
+      "dependencies": {
+        "semver": {
+          "version": "7.5.1",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz",
+          "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==",
+          "optional": true,
+          "requires": {
+            "lru-cache": "^6.0.0"
+          }
+        }
+      }
+    },
+    "@npmcli/move-file": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz",
+      "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==",
+      "optional": true,
+      "requires": {
+        "mkdirp": "^1.0.4",
+        "rimraf": "^3.0.2"
+      },
+      "dependencies": {
+        "mkdirp": {
+          "version": "1.0.4",
+          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+          "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+          "optional": true
+        }
+      }
+    },
     "@sindresorhus/is": {
       "version": "0.14.0",
       "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz",
@@ -7021,6 +7692,58 @@
         }
       }
     },
+    "agentkeepalive": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.3.0.tgz",
+      "integrity": "sha512-7Epl1Blf4Sy37j4v9f9FjICCh4+KAQOyXgHEwlyBiAQLbhKdq/i2QQU3amQalS/wPhdPzDXPL5DMR5bkn+YeWg==",
+      "optional": true,
+      "requires": {
+        "debug": "^4.1.0",
+        "depd": "^2.0.0",
+        "humanize-ms": "^1.2.1"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "4.3.4",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+          "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+          "optional": true,
+          "requires": {
+            "ms": "2.1.2"
+          }
+        },
+        "depd": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
+          "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
+          "optional": true
+        },
+        "ms": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+          "optional": true
+        }
+      }
+    },
+    "aggregate-error": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz",
+      "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==",
+      "optional": true,
+      "requires": {
+        "clean-stack": "^2.0.0",
+        "indent-string": "^4.0.0"
+      },
+      "dependencies": {
+        "indent-string": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
+          "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
+          "optional": true
+        }
+      }
+    },
     "ajv": {
       "version": "6.12.6",
       "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
@@ -7214,17 +7937,29 @@
       "integrity": "sha1-HjRA6RXwsSA9I3SOeO3XubW0PlY="
     },
     "aproba": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
-      "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw=="
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz",
+      "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ=="
     },
     "are-we-there-yet": {
-      "version": "1.1.5",
-      "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz",
-      "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==",
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz",
+      "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==",
       "requires": {
         "delegates": "^1.0.0",
-        "readable-stream": "^2.0.6"
+        "readable-stream": "^3.6.0"
+      },
+      "dependencies": {
+        "readable-stream": {
+          "version": "3.6.2",
+          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
+          "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
+          "requires": {
+            "inherits": "^2.0.3",
+            "string_decoder": "^1.1.1",
+            "util-deprecate": "^1.0.1"
+          }
+        }
       }
     },
     "argparse": {
@@ -7755,6 +8490,40 @@
       "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
       "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg=="
     },
+    "cacache": {
+      "version": "15.3.0",
+      "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz",
+      "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==",
+      "optional": true,
+      "requires": {
+        "@npmcli/fs": "^1.0.0",
+        "@npmcli/move-file": "^1.0.1",
+        "chownr": "^2.0.0",
+        "fs-minipass": "^2.0.0",
+        "glob": "^7.1.4",
+        "infer-owner": "^1.0.4",
+        "lru-cache": "^6.0.0",
+        "minipass": "^3.1.1",
+        "minipass-collect": "^1.0.2",
+        "minipass-flush": "^1.0.5",
+        "minipass-pipeline": "^1.2.2",
+        "mkdirp": "^1.0.3",
+        "p-map": "^4.0.0",
+        "promise-inflight": "^1.0.1",
+        "rimraf": "^3.0.2",
+        "ssri": "^8.0.1",
+        "tar": "^6.0.2",
+        "unique-filename": "^1.1.1"
+      },
+      "dependencies": {
+        "mkdirp": {
+          "version": "1.0.4",
+          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+          "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+          "optional": true
+        }
+      }
+    },
     "cacheable-request": {
       "version": "6.1.0",
       "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz",
@@ -7839,9 +8608,9 @@
       }
     },
     "chownr": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
-      "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg=="
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
+      "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ=="
     },
     "chromium-pickle-js": {
       "version": "0.2.0",
@@ -7860,6 +8629,12 @@
       "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.1.tgz",
       "integrity": "sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA=="
     },
+    "clean-stack": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
+      "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==",
+      "optional": true
+    },
     "cli-boxes": {
       "version": "2.2.1",
       "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz",
@@ -8018,6 +8793,11 @@
       "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
       "dev": true
     },
+    "color-support": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz",
+      "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg=="
+    },
     "colors": {
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz",
@@ -8081,7 +8861,7 @@
     "console-control-strings": {
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
-      "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4="
+      "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ=="
     },
     "content-disposition": {
       "version": "0.5.3",
@@ -8200,6 +8980,7 @@
       "version": "3.2.6",
       "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
       "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
+      "dev": true,
       "requires": {
         "ms": "^2.1.1"
       },
@@ -8207,7 +8988,8 @@
         "ms": {
           "version": "2.1.2",
           "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+          "dev": true
         }
       }
     },
@@ -8229,7 +9011,8 @@
     "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=="
+      "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
+      "dev": true
     },
     "defer-to-connect": {
       "version": "1.1.3",
@@ -8245,7 +9028,7 @@
     "delegates": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
-      "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o="
+      "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ=="
     },
     "depd": {
       "version": "1.1.2",
@@ -8258,9 +9041,9 @@
       "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
     },
     "detect-libc": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz",
-      "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups="
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz",
+      "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w=="
     },
     "dicer": {
       "version": "0.2.5",
@@ -8809,6 +9592,12 @@
       "integrity": "sha1-QWgTO0K7BcOKNbGuQ5fIKYqzaeA=",
       "dev": true
     },
+    "err-code": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz",
+      "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==",
+      "optional": true
+    },
     "error-ex": {
       "version": "1.3.2",
       "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
@@ -9134,11 +9923,11 @@
       }
     },
     "fs-minipass": {
-      "version": "1.2.7",
-      "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz",
-      "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==",
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
+      "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
       "requires": {
-        "minipass": "^2.6.0"
+        "minipass": "^3.0.0"
       }
     },
     "fs.realpath": {
@@ -9152,18 +9941,54 @@
       "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
     },
     "gauge": {
-      "version": "2.7.4",
-      "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz",
-      "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=",
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz",
+      "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==",
       "requires": {
-        "aproba": "^1.0.3",
+        "aproba": "^1.0.3 || ^2.0.0",
+        "color-support": "^1.1.2",
         "console-control-strings": "^1.0.0",
-        "has-unicode": "^2.0.0",
-        "object-assign": "^4.1.0",
+        "has-unicode": "^2.0.1",
+        "object-assign": "^4.1.1",
         "signal-exit": "^3.0.0",
-        "string-width": "^1.0.1",
-        "strip-ansi": "^3.0.1",
-        "wide-align": "^1.1.0"
+        "string-width": "^4.2.3",
+        "strip-ansi": "^6.0.1",
+        "wide-align": "^1.1.2"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "5.0.1",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+          "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="
+        },
+        "emoji-regex": {
+          "version": "8.0.0",
+          "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+          "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
+        },
+        "is-fullwidth-code-point": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+          "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="
+        },
+        "string-width": {
+          "version": "4.2.3",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+          "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+          "requires": {
+            "emoji-regex": "^8.0.0",
+            "is-fullwidth-code-point": "^3.0.0",
+            "strip-ansi": "^6.0.1"
+          }
+        },
+        "strip-ansi": {
+          "version": "6.0.1",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+          "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+          "requires": {
+            "ansi-regex": "^5.0.1"
+          }
+        }
       }
     },
     "get-caller-file": {
@@ -9256,9 +10081,9 @@
       }
     },
     "graceful-fs": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.0.tgz",
-      "integrity": "sha512-jpSvDPV4Cq/bgtpndIWbI5hmYxhQGHPC4d4cqBPb4DLniCfhJokdXhwhaDuLBGLQdvvRum/UiX6ECVIPvDXqdg=="
+      "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=="
     },
     "graceful-readlink": {
       "version": "1.0.1",
@@ -9304,7 +10129,7 @@
     "has-unicode": {
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
-      "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk="
+      "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ=="
     },
     "has-yarn": {
       "version": "2.1.0",
@@ -9322,7 +10147,7 @@
       "version": "4.1.0",
       "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz",
       "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==",
-      "dev": true
+      "devOptional": true
     },
     "http-errors": {
       "version": "1.7.2",
@@ -9404,6 +10229,15 @@
         }
       }
     },
+    "humanize-ms": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz",
+      "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==",
+      "optional": true,
+      "requires": {
+        "ms": "^2.0.0"
+      }
+    },
     "iconv-corefoundation": {
       "version": "1.1.7",
       "resolved": "https://registry.npmjs.org/iconv-corefoundation/-/iconv-corefoundation-1.1.7.tgz",
@@ -9446,17 +10280,9 @@
     "ieee754": {
       "version": "1.2.1",
       "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
-      "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
-      "dev": true,
-      "optional": true
-    },
-    "ignore-walk": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz",
-      "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==",
-      "requires": {
-        "minimatch": "^3.0.4"
-      }
+      "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
+      "dev": true,
+      "optional": true
     },
     "immutable": {
       "version": "3.8.2",
@@ -9473,7 +10299,7 @@
       "version": "0.1.4",
       "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
       "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
-      "dev": true
+      "devOptional": true
     },
     "indent-string": {
       "version": "2.1.0",
@@ -9484,6 +10310,12 @@
         "repeating": "^2.0.0"
       }
     },
+    "infer-owner": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz",
+      "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==",
+      "optional": true
+    },
     "inflight": {
       "version": "1.0.6",
       "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
@@ -9501,7 +10333,14 @@
     "ini": {
       "version": "1.3.5",
       "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
-      "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw=="
+      "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==",
+      "dev": true
+    },
+    "ip": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz",
+      "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==",
+      "optional": true
     },
     "ipaddr.js": {
       "version": "1.9.0",
@@ -9547,6 +10386,12 @@
         "is-path-inside": "^3.0.2"
       }
     },
+    "is-lambda": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz",
+      "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==",
+      "optional": true
+    },
     "is-npm": {
       "version": "5.0.0",
       "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz",
@@ -9603,7 +10448,7 @@
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
       "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
-      "dev": true
+      "devOptional": true
     },
     "isomorphic-fetch": {
       "version": "2.2.1",
@@ -9987,11 +10832,34 @@
       "version": "3.1.0",
       "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
       "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
-      "dev": true,
       "requires": {
         "semver": "^6.0.0"
       }
     },
+    "make-fetch-happen": {
+      "version": "9.1.0",
+      "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz",
+      "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==",
+      "optional": true,
+      "requires": {
+        "agentkeepalive": "^4.1.3",
+        "cacache": "^15.2.0",
+        "http-cache-semantics": "^4.1.0",
+        "http-proxy-agent": "^4.0.1",
+        "https-proxy-agent": "^5.0.0",
+        "is-lambda": "^1.0.1",
+        "lru-cache": "^6.0.0",
+        "minipass": "^3.1.3",
+        "minipass-collect": "^1.0.2",
+        "minipass-fetch": "^1.3.2",
+        "minipass-flush": "^1.0.5",
+        "minipass-pipeline": "^1.2.4",
+        "negotiator": "^0.6.2",
+        "promise-retry": "^2.0.1",
+        "socks-proxy-agent": "^6.0.0",
+        "ssri": "^8.0.0"
+      }
+    },
     "map-obj": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
@@ -10069,32 +10937,68 @@
       "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q=="
     },
     "minipass": {
-      "version": "2.9.0",
-      "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz",
-      "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==",
+      "version": "3.3.6",
+      "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+      "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
       "requires": {
-        "safe-buffer": "^5.1.2",
-        "yallist": "^3.0.0"
-      },
-      "dependencies": {
-        "safe-buffer": {
-          "version": "5.2.1",
-          "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
-          "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
-        },
-        "yallist": {
-          "version": "3.1.1",
-          "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
-          "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="
-        }
+        "yallist": "^4.0.0"
+      }
+    },
+    "minipass-collect": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz",
+      "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==",
+      "optional": true,
+      "requires": {
+        "minipass": "^3.0.0"
+      }
+    },
+    "minipass-fetch": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz",
+      "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==",
+      "optional": true,
+      "requires": {
+        "encoding": "^0.1.12",
+        "minipass": "^3.1.0",
+        "minipass-sized": "^1.0.3",
+        "minizlib": "^2.0.0"
+      }
+    },
+    "minipass-flush": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz",
+      "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==",
+      "optional": true,
+      "requires": {
+        "minipass": "^3.0.0"
+      }
+    },
+    "minipass-pipeline": {
+      "version": "1.2.4",
+      "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz",
+      "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==",
+      "optional": true,
+      "requires": {
+        "minipass": "^3.0.0"
+      }
+    },
+    "minipass-sized": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz",
+      "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==",
+      "optional": true,
+      "requires": {
+        "minipass": "^3.0.0"
       }
     },
     "minizlib": {
-      "version": "1.3.3",
-      "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz",
-      "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==",
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz",
+      "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==",
       "requires": {
-        "minipass": "^2.9.0"
+        "minipass": "^3.0.0",
+        "yallist": "^4.0.0"
       }
     },
     "mkdirp": {
@@ -10132,21 +11036,6 @@
         }
       }
     },
-    "nan": {
-      "version": "2.14.2",
-      "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz",
-      "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ=="
-    },
-    "needle": {
-      "version": "2.6.0",
-      "resolved": "https://registry.npmjs.org/needle/-/needle-2.6.0.tgz",
-      "integrity": "sha512-KKYdza4heMsEfSWD7VPUIz3zX2XDwOyX2d+geb4vrERZMT5RMU6ujjaD+I5Yr54uZxQ2w6XRTAhHBbSCyovZBg==",
-      "requires": {
-        "debug": "^3.2.6",
-        "iconv-lite": "^0.4.4",
-        "sax": "^1.2.4"
-      }
-    },
     "negotiator": {
       "version": "0.6.2",
       "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
@@ -10168,43 +11057,140 @@
         "is-stream": "^1.0.1"
       }
     },
-    "node-jsxml": {
-      "version": "0.9.0",
-      "resolved": "https://registry.npmjs.org/node-jsxml/-/node-jsxml-0.9.0.tgz",
-      "integrity": "sha1-Ca5p+9YJnfuGAoHaZv8nkPoAmVQ=",
-      "dev": true
-    },
-    "node-pre-gyp": {
-      "version": "0.11.0",
-      "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.11.0.tgz",
-      "integrity": "sha512-TwWAOZb0j7e9eGaf9esRx3ZcLaE5tQ2lvYy1pb5IAaG1a2e2Kv5Lms1Y4hpj+ciXJRofIxxlt5haeQ/2ANeE0Q==",
+    "node-gyp": {
+      "version": "8.4.1",
+      "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-8.4.1.tgz",
+      "integrity": "sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==",
+      "optional": true,
       "requires": {
-        "detect-libc": "^1.0.2",
-        "mkdirp": "^0.5.1",
-        "needle": "^2.2.1",
-        "nopt": "^4.0.1",
-        "npm-packlist": "^1.1.6",
-        "npmlog": "^4.0.2",
-        "rc": "^1.2.7",
-        "rimraf": "^2.6.1",
-        "semver": "^5.3.0",
-        "tar": "^4"
+        "env-paths": "^2.2.0",
+        "glob": "^7.1.4",
+        "graceful-fs": "^4.2.6",
+        "make-fetch-happen": "^9.1.0",
+        "nopt": "^5.0.0",
+        "npmlog": "^6.0.0",
+        "rimraf": "^3.0.2",
+        "semver": "^7.3.5",
+        "tar": "^6.1.2",
+        "which": "^2.0.2"
       },
       "dependencies": {
+        "ansi-regex": {
+          "version": "5.0.1",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+          "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+          "optional": true
+        },
+        "are-we-there-yet": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz",
+          "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==",
+          "optional": true,
+          "requires": {
+            "delegates": "^1.0.0",
+            "readable-stream": "^3.6.0"
+          }
+        },
+        "emoji-regex": {
+          "version": "8.0.0",
+          "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+          "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+          "optional": true
+        },
+        "env-paths": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz",
+          "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==",
+          "optional": true
+        },
+        "gauge": {
+          "version": "4.0.4",
+          "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz",
+          "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==",
+          "optional": true,
+          "requires": {
+            "aproba": "^1.0.3 || ^2.0.0",
+            "color-support": "^1.1.3",
+            "console-control-strings": "^1.1.0",
+            "has-unicode": "^2.0.1",
+            "signal-exit": "^3.0.7",
+            "string-width": "^4.2.3",
+            "strip-ansi": "^6.0.1",
+            "wide-align": "^1.1.5"
+          }
+        },
+        "is-fullwidth-code-point": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+          "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+          "optional": true
+        },
+        "npmlog": {
+          "version": "6.0.2",
+          "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz",
+          "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==",
+          "optional": true,
+          "requires": {
+            "are-we-there-yet": "^3.0.0",
+            "console-control-strings": "^1.1.0",
+            "gauge": "^4.0.3",
+            "set-blocking": "^2.0.0"
+          }
+        },
+        "readable-stream": {
+          "version": "3.6.2",
+          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
+          "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
+          "optional": true,
+          "requires": {
+            "inherits": "^2.0.3",
+            "string_decoder": "^1.1.1",
+            "util-deprecate": "^1.0.1"
+          }
+        },
         "semver": {
-          "version": "5.7.1",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
-          "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
+          "version": "7.5.1",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz",
+          "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==",
+          "optional": true,
+          "requires": {
+            "lru-cache": "^6.0.0"
+          }
+        },
+        "string-width": {
+          "version": "4.2.3",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+          "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+          "optional": true,
+          "requires": {
+            "emoji-regex": "^8.0.0",
+            "is-fullwidth-code-point": "^3.0.0",
+            "strip-ansi": "^6.0.1"
+          }
+        },
+        "strip-ansi": {
+          "version": "6.0.1",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+          "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+          "optional": true,
+          "requires": {
+            "ansi-regex": "^5.0.1"
+          }
         }
       }
     },
+    "node-jsxml": {
+      "version": "0.9.0",
+      "resolved": "https://registry.npmjs.org/node-jsxml/-/node-jsxml-0.9.0.tgz",
+      "integrity": "sha1-Ca5p+9YJnfuGAoHaZv8nkPoAmVQ=",
+      "dev": true
+    },
     "nopt": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz",
-      "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==",
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz",
+      "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==",
       "requires": {
-        "abbrev": "1",
-        "osenv": "^0.1.4"
+        "abbrev": "1"
       }
     },
     "normalize-package-data": {
@@ -10233,38 +11219,15 @@
       "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==",
       "dev": true
     },
-    "npm-bundled": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz",
-      "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==",
-      "requires": {
-        "npm-normalize-package-bin": "^1.0.1"
-      }
-    },
-    "npm-normalize-package-bin": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz",
-      "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA=="
-    },
-    "npm-packlist": {
-      "version": "1.4.8",
-      "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz",
-      "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==",
-      "requires": {
-        "ignore-walk": "^3.0.1",
-        "npm-bundled": "^1.0.1",
-        "npm-normalize-package-bin": "^1.0.1"
-      }
-    },
     "npmlog": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz",
-      "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==",
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz",
+      "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==",
       "requires": {
-        "are-we-there-yet": "~1.1.2",
-        "console-control-strings": "~1.1.0",
-        "gauge": "~2.7.3",
-        "set-blocking": "~2.0.0"
+        "are-we-there-yet": "^2.0.0",
+        "console-control-strings": "^1.1.0",
+        "gauge": "^3.0.0",
+        "set-blocking": "^2.0.0"
       }
     },
     "nugget": {
@@ -10336,31 +11299,21 @@
         "wrappy": "1"
       }
     },
-    "os-homedir": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
-      "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M="
-    },
-    "os-tmpdir": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
-      "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ="
-    },
-    "osenv": {
-      "version": "0.1.5",
-      "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz",
-      "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==",
-      "requires": {
-        "os-homedir": "^1.0.0",
-        "os-tmpdir": "^1.0.0"
-      }
-    },
     "p-cancelable": {
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz",
       "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==",
       "dev": true
     },
+    "p-map": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz",
+      "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==",
+      "optional": true,
+      "requires": {
+        "aggregate-error": "^3.0.0"
+      }
+    },
     "package-json": {
       "version": "6.5.0",
       "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz",
@@ -10526,6 +11479,22 @@
         "asap": "~2.0.3"
       }
     },
+    "promise-inflight": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz",
+      "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==",
+      "optional": true
+    },
+    "promise-retry": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz",
+      "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==",
+      "optional": true,
+      "requires": {
+        "err-code": "^2.0.2",
+        "retry": "^0.12.0"
+      }
+    },
     "prop-types": {
       "version": "15.8.1",
       "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
@@ -10614,6 +11583,7 @@
       "version": "1.2.8",
       "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
       "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
+      "dev": true,
       "requires": {
         "deep-extend": "^0.6.0",
         "ini": "~1.3.0",
@@ -10832,10 +11802,16 @@
         "lowercase-keys": "^1.0.0"
       }
     },
+    "retry": {
+      "version": "0.12.0",
+      "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz",
+      "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==",
+      "optional": true
+    },
     "rimraf": {
-      "version": "2.7.1",
-      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
-      "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+      "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
       "requires": {
         "glob": "^7.1.3"
       }
@@ -10934,7 +11910,7 @@
     "set-blocking": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
-      "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc="
+      "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw=="
     },
     "setimmediate": {
       "version": "1.0.5",
@@ -10972,9 +11948,9 @@
       }
     },
     "signal-exit": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
-      "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0="
+      "version": "3.0.7",
+      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+      "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="
     },
     "single-line-log": {
       "version": "1.1.2",
@@ -11010,9 +11986,46 @@
       "version": "4.2.0",
       "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz",
       "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==",
-      "dev": true,
       "optional": true
     },
+    "socks": {
+      "version": "2.7.1",
+      "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz",
+      "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==",
+      "optional": true,
+      "requires": {
+        "ip": "^2.0.0",
+        "smart-buffer": "^4.2.0"
+      }
+    },
+    "socks-proxy-agent": {
+      "version": "6.2.1",
+      "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz",
+      "integrity": "sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==",
+      "optional": true,
+      "requires": {
+        "agent-base": "^6.0.2",
+        "debug": "^4.3.3",
+        "socks": "^2.6.2"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "4.3.4",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+          "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+          "optional": true,
+          "requires": {
+            "ms": "2.1.2"
+          }
+        },
+        "ms": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+          "optional": true
+        }
+      }
+    },
     "source-map": {
       "version": "0.6.1",
       "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
@@ -11068,12 +12081,21 @@
       "dev": true
     },
     "sqlite3": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-4.2.0.tgz",
-      "integrity": "sha512-roEOz41hxui2Q7uYnWsjMOTry6TcNUNmp8audCx18gF10P2NknwdpF+E+HKvz/F2NvPKGGBF4NGc+ZPQ+AABwg==",
+      "version": "5.1.6",
+      "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-5.1.6.tgz",
+      "integrity": "sha512-olYkWoKFVNSSSQNvxVUfjiVbz3YtBwTJj+mfV5zpHmqW3sELx2Cf4QCdirMelhM5Zh+KDVaKgQHqCxrqiWHybw==",
       "requires": {
-        "nan": "^2.12.1",
-        "node-pre-gyp": "^0.11.0"
+        "@mapbox/node-pre-gyp": "^1.0.0",
+        "node-addon-api": "^4.2.0",
+        "node-gyp": "8.x",
+        "tar": "^6.1.11"
+      },
+      "dependencies": {
+        "node-addon-api": {
+          "version": "4.3.0",
+          "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.3.0.tgz",
+          "integrity": "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ=="
+        }
       }
     },
     "ssf": {
@@ -11109,6 +12131,15 @@
         }
       }
     },
+    "ssri": {
+      "version": "8.0.1",
+      "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz",
+      "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==",
+      "optional": true,
+      "requires": {
+        "minipass": "^3.1.1"
+      }
+    },
     "stat-mode": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-1.0.0.tgz",
@@ -11172,7 +12203,8 @@
     "strip-json-comments": {
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
-      "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo="
+      "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
+      "dev": true
     },
     "sumchecker": {
       "version": "2.0.2",
@@ -11279,28 +12311,27 @@
       }
     },
     "tar": {
-      "version": "4.4.13",
-      "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz",
-      "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==",
-      "requires": {
-        "chownr": "^1.1.1",
-        "fs-minipass": "^1.2.5",
-        "minipass": "^2.8.6",
-        "minizlib": "^1.2.1",
-        "mkdirp": "^0.5.0",
-        "safe-buffer": "^5.1.2",
-        "yallist": "^3.0.3"
+      "version": "6.1.15",
+      "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz",
+      "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==",
+      "requires": {
+        "chownr": "^2.0.0",
+        "fs-minipass": "^2.0.0",
+        "minipass": "^5.0.0",
+        "minizlib": "^2.1.1",
+        "mkdirp": "^1.0.3",
+        "yallist": "^4.0.0"
       },
       "dependencies": {
-        "safe-buffer": {
-          "version": "5.2.1",
-          "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
-          "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
+        "minipass": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz",
+          "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ=="
         },
-        "yallist": {
-          "version": "3.1.1",
-          "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
-          "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="
+        "mkdirp": {
+          "version": "1.0.4",
+          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+          "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="
         }
       }
     },
@@ -11392,17 +12423,6 @@
       "dev": true,
       "requires": {
         "rimraf": "^3.0.0"
-      },
-      "dependencies": {
-        "rimraf": {
-          "version": "3.0.2",
-          "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
-          "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
-          "dev": true,
-          "requires": {
-            "glob": "^7.1.3"
-          }
-        }
       }
     },
     "tmp-promise": {
@@ -11514,6 +12534,24 @@
       "resolved": "https://registry.npmjs.org/unfetch/-/unfetch-4.2.0.tgz",
       "integrity": "sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA=="
     },
+    "unique-filename": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz",
+      "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==",
+      "optional": true,
+      "requires": {
+        "unique-slug": "^2.0.0"
+      }
+    },
+    "unique-slug": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz",
+      "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==",
+      "optional": true,
+      "requires": {
+        "imurmurhash": "^0.1.4"
+      }
+    },
     "unique-string": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz",
@@ -11689,17 +12727,17 @@
       "version": "2.0.2",
       "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
       "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
-      "dev": true,
+      "devOptional": true,
       "requires": {
         "isexe": "^2.0.0"
       }
     },
     "wide-align": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz",
-      "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==",
+      "version": "1.1.5",
+      "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz",
+      "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==",
       "requires": {
-        "string-width": "^1.0.2 || 2"
+        "string-width": "^1.0.2 || 2 || 3 || 4"
       }
     },
     "widest-line": {
diff --git a/package.json b/package.json
index 59d64bdd0d9d59fec0eb08c05532f40c2fa587e2..f5e43ff94b0bda9740506e31e107f45816e47de0 100644
--- a/package.json
+++ b/package.json
@@ -29,7 +29,7 @@
     "minimist": "^1.2.5",
     "multer": "^1.4.3",
     "semver": "^6.3.0",
-    "sqlite3": "^4.1.1",
+    "sqlite3": "^5.1.6",
     "xlsx": "^0.15.6"
   },
   "devDependencies": {