From 971b14e5c2839a97154f879272b76ea8bb4c2280 Mon Sep 17 00:00:00 2001
From: Peter Ahlers
Date: Fri, 7 Oct 2022 20:56:22 +0200
Subject: [PATCH 01/20] feat(import/export): use ES and cleanup
---
.gitignore | 1 +
index.js | 4 +-
lib/r820t.js | 637 +++++-----
lib/rtl2832u.js | 403 ++++---
lib/rtlcom.js | 739 ++++++------
lib/rtlsdr.js | 79 +-
lib/web-usb.js | 14 +-
package-lock.json | 2916 +++++++++++++++++++++++++++++++++++++++++++++
8 files changed, 3848 insertions(+), 945 deletions(-)
create mode 100644 package-lock.json
diff --git a/.gitignore b/.gitignore
index ad46b30..235d321 100644
--- a/.gitignore
+++ b/.gitignore
@@ -59,3 +59,4 @@ typings/
# next.js build output
.next
+/.idea/
diff --git a/index.js b/index.js
index 12dc140..20c1a72 100644
--- a/index.js
+++ b/index.js
@@ -1 +1,3 @@
-module.exports = require('./lib/rtlsdr');
+import {RtlSdr} from './lib/rtlsdr'
+
+export {RtlSdr};
diff --git a/lib/r820t.js b/lib/r820t.js
index ae03dc8..d8a46b2 100644
--- a/lib/r820t.js
+++ b/lib/r820t.js
@@ -12,9 +12,9 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-var RtlCom = require('./rtlcom');
+import {RtlCom} from './rtlcom';
-var CMD = RtlCom.CMD;
+const CMD = RtlCom.CMD;
/**
* Operations on the R820T tuner chip.
@@ -22,349 +22,348 @@ var CMD = RtlCom.CMD;
* @param {number} xtalFreq The frequency of the oscillator crystal.
* @constructor
*/
-function R820T(com, xtalFreq) {
+export function R820T(com, xtalFreq) {
- /**
- * Initial values for registers 0x05-0x1f.
- */
- var REGISTERS = [0x83, 0x32, 0x75, 0xc0, 0x40, 0xd6, 0x6c, 0xf5, 0x63, 0x75,
- 0x68, 0x6c, 0x83, 0x80, 0x00, 0x0f, 0x00, 0xc0, 0x30, 0x48,
- 0xcc, 0x60, 0x00, 0x54, 0xae, 0x4a, 0xc0];
+ /**
+ * Initial values for registers 0x05-0x1f.
+ */
+ const REGISTERS = [0x83, 0x32, 0x75, 0xc0, 0x40, 0xd6, 0x6c, 0xf5, 0x63, 0x75,
+ 0x68, 0x6c, 0x83, 0x80, 0x00, 0x0f, 0x00, 0xc0, 0x30, 0x48,
+ 0xcc, 0x60, 0x00, 0x54, 0xae, 0x4a, 0xc0];
- /**
- * Configurations for the multiplexer in different frequency bands.
- */
- var MUX_CFGS = [
- [0, 0x08, 0x02, 0xdf],
- [50, 0x08, 0x02, 0xbe],
- [55, 0x08, 0x02, 0x8b],
- [60, 0x08, 0x02, 0x7b],
- [65, 0x08, 0x02, 0x69],
- [70, 0x08, 0x02, 0x58],
- [75, 0x00, 0x02, 0x44],
- [90, 0x00, 0x02, 0x34],
- [110, 0x00, 0x02, 0x24],
- [140, 0x00, 0x02, 0x14],
- [180, 0x00, 0x02, 0x13],
- [250, 0x00, 0x02, 0x11],
- [280, 0x00, 0x02, 0x00],
- [310, 0x00, 0x41, 0x00],
- [588, 0x00, 0x40, 0x00]
- ];
+ /**
+ * Configurations for the multiplexer in different frequency bands.
+ */
+ const MUX_CFGS = [
+ [0, 0x08, 0x02, 0xdf],
+ [50, 0x08, 0x02, 0xbe],
+ [55, 0x08, 0x02, 0x8b],
+ [60, 0x08, 0x02, 0x7b],
+ [65, 0x08, 0x02, 0x69],
+ [70, 0x08, 0x02, 0x58],
+ [75, 0x00, 0x02, 0x44],
+ [90, 0x00, 0x02, 0x34],
+ [110, 0x00, 0x02, 0x24],
+ [140, 0x00, 0x02, 0x14],
+ [180, 0x00, 0x02, 0x13],
+ [250, 0x00, 0x02, 0x11],
+ [280, 0x00, 0x02, 0x00],
+ [310, 0x00, 0x41, 0x00],
+ [588, 0x00, 0x40, 0x00]
+ ];
- /**
- * A bit mask to reverse the bits in a byte.
- */
- var BIT_REVS = [0x0, 0x8, 0x4, 0xc, 0x2, 0xa, 0x6, 0xe,
- 0x1, 0x9, 0x5, 0xd, 0x3, 0xb, 0x7, 0xf];
+ /**
+ * A bit mask to reverse the bits in a byte.
+ */
+ const BIT_REVS = [0x0, 0x8, 0x4, 0xc, 0x2, 0xa, 0x6, 0xe,
+ 0x1, 0x9, 0x5, 0xd, 0x3, 0xb, 0x7, 0xf];
- /**
- * Whether the PLL in the tuner is locked.
- */
- var hasPllLock = false;
+ /**
+ * Whether the PLL in the tuner is locked.
+ */
+ let hasPllLock = false;
- /**
- * Shadow registers 0x05-0x1f, for setting values using masks.
- */
- var shadowRegs;
+ /**
+ * Shadow registers 0x05-0x1f, for setting values using masks.
+ */
+ let shadowRegs;
- /**
- * Initializes the tuner.
- */
- async function init() {
- await initRegisters(REGISTERS);
- await initElectronics();
- }
-
- /**
- * Sets the tuner's frequency.
- * @param {number} freq The frequency to tune to.
- * @return {number} The actual tuned frequency.
- */
- async function setFrequency(freq) {
- await setMux(freq);
- return await setPll(freq);
- }
-
- /**
- * Stops the tuner.
- */
- async function close() {
- await writeEach([
- [0x06, 0xb1, 0xff],
- [0x05, 0xb3, 0xff],
- [0x07, 0x3a, 0xff],
- [0x08, 0x40, 0xff],
- [0x09, 0xc0, 0xff],
- [0x0a, 0x36, 0xff],
- [0x0c, 0x35, 0xff],
- [0x0f, 0x68, 0xff],
- [0x11, 0x03, 0xff],
- [0x17, 0xf4, 0xff],
- [0x19, 0x0c, 0xff]
- ]);
- }
-
- /**
- * Initializes all the components of the tuner.
- */
- async function initElectronics() {
- await writeEach([
- [0x0c, 0x00, 0x0f],
- [0x13, 49, 0x3f],
- [0x1d, 0x00, 0x38]
- ]);
- var filterCap = await calibrateFilter(true);
- await writeEach([
- [0x0a, 0x10 | filterCap, 0x1f],
- [0x0b, 0x6b, 0xef],
- [0x07, 0x00, 0x80],
- [0x06, 0x10, 0x30],
- [0x1e, 0x40, 0x60],
- [0x05, 0x00, 0x80],
- [0x1f, 0x00, 0x80],
- [0x0f, 0x00, 0x80],
- [0x19, 0x60, 0x60],
- [0x1d, 0xe5, 0xc7],
- [0x1c, 0x24, 0xf8],
- [0x0d, 0x53, 0xff],
- [0x0e, 0x75, 0xff],
- [0x05, 0x00, 0x60],
- [0x06, 0x00, 0x08],
- [0x11, 0x38, 0x08],
- [0x17, 0x30, 0x30],
- [0x0a, 0x40, 0x60],
- [0x1d, 0x00, 0x38],
- [0x1c, 0x00, 0x04],
- [0x06, 0x00, 0x40],
- [0x1a, 0x30, 0x30],
- [0x1d, 0x18, 0x38],
- [0x1c, 0x24, 0x04],
- [0x1e, 0x0d, 0x1f],
- [0x1a, 0x20, 0x30]
- ]);
- }
-
- /**
- * Sets the tuner to automatic gain.
- */
- async function setAutoGain() {
- await writeEach([
- [0x05, 0x00, 0x10],
- [0x07, 0x10, 0x10],
- [0x0c, 0x0b, 0x9f]
- ]);
- }
-
- /**
- * Sets the tuner's manual gain.
- * @param {number} gain The tuner's gain, in dB.
- */
- async function setManualGain(gain) {
- var step = 0;
- if (gain <= 15) {
- step = Math.round(1.36 + gain * (1.1118 + gain * (-0.0786 + gain * 0.0027)));
- } else {
- step = Math.round(1.2068 + gain * (0.6875 + gain * (-0.01011 + gain * 0.0001587)));
+ /**
+ * Initializes the tuner.
+ */
+ async function init() {
+ await initRegisters(REGISTERS);
+ await initElectronics();
}
- if (step < 0) {
- step = 0;
- } else if (step > 30) {
- step = 30;
+
+ /**
+ * Sets the tuner's frequency.
+ * @param {number} freq The frequency to tune to.
+ * @return {number} The actual tuned frequency.
+ */
+ async function setFrequency(freq) {
+ await setMux(freq);
+ return setPll(freq);
}
- var lnaValue = Math.floor(step / 2);
- var mixerValue = Math.floor((step - 1) / 2);
- await writeEach([
- [0x05, 0x10, 0x10],
- [0x07, 0x00, 0x10],
- [0x0c, 0x08, 0x9f],
- [0x05, lnaValue, 0x0f],
- [0x07, mixerValue, 0x0f]
- ]);
- }
- /**
- * Calibrates the filters.
- * @param {boolean} firstTry Whether this is the first try to calibrate.
- */
- async function calibrateFilter(firstTry) {
- await writeEach([
- [0x0b, 0x6b, 0x60],
- [0x0f, 0x04, 0x04],
- [0x10, 0x00, 0x03]
- ]);
- await setPll(56000000);
- if (!hasPllLock) {
- throw new Error("PLL not locked -- cannot tune to the selected frequency.");
- return;
+ /**
+ * Stops the tuner.
+ */
+ async function close() {
+ await writeEach([
+ [0x06, 0xb1, 0xff],
+ [0x05, 0xb3, 0xff],
+ [0x07, 0x3a, 0xff],
+ [0x08, 0x40, 0xff],
+ [0x09, 0xc0, 0xff],
+ [0x0a, 0x36, 0xff],
+ [0x0c, 0x35, 0xff],
+ [0x0f, 0x68, 0xff],
+ [0x11, 0x03, 0xff],
+ [0x17, 0xf4, 0xff],
+ [0x19, 0x0c, 0xff]
+ ]);
}
- await writeEach([
- [0x0b, 0x10, 0x10],
- [0x0b, 0x00, 0x10],
- [0x0f, 0x00, 0x04]
- ]);
- var data = await readRegBuffer(0x00, 5);
- var arr = new Uint8Array(data);
- var filterCap = arr[4] & 0x0f;
- if (filterCap == 0x0f) {
- filterCap = 0;
+
+ /**
+ * Initializes all the components of the tuner.
+ */
+ async function initElectronics() {
+ await writeEach([
+ [0x0c, 0x00, 0x0f],
+ [0x13, 49, 0x3f],
+ [0x1d, 0x00, 0x38]
+ ]);
+ const filterCap = await calibrateFilter(true);
+ await writeEach([
+ [0x0a, 0x10 | filterCap, 0x1f],
+ [0x0b, 0x6b, 0xef],
+ [0x07, 0x00, 0x80],
+ [0x06, 0x10, 0x30],
+ [0x1e, 0x40, 0x60],
+ [0x05, 0x00, 0x80],
+ [0x1f, 0x00, 0x80],
+ [0x0f, 0x00, 0x80],
+ [0x19, 0x60, 0x60],
+ [0x1d, 0xe5, 0xc7],
+ [0x1c, 0x24, 0xf8],
+ [0x0d, 0x53, 0xff],
+ [0x0e, 0x75, 0xff],
+ [0x05, 0x00, 0x60],
+ [0x06, 0x00, 0x08],
+ [0x11, 0x38, 0x08],
+ [0x17, 0x30, 0x30],
+ [0x0a, 0x40, 0x60],
+ [0x1d, 0x00, 0x38],
+ [0x1c, 0x00, 0x04],
+ [0x06, 0x00, 0x40],
+ [0x1a, 0x30, 0x30],
+ [0x1d, 0x18, 0x38],
+ [0x1c, 0x24, 0x04],
+ [0x1e, 0x0d, 0x1f],
+ [0x1a, 0x20, 0x30]
+ ]);
}
- if (filterCap != 0 && firstTry) {
- return await calibrateFilter(false);
- } else {
- return (filterCap);
+
+ /**
+ * Sets the tuner to automatic gain.
+ */
+ async function setAutoGain() {
+ await writeEach([
+ [0x05, 0x00, 0x10],
+ [0x07, 0x10, 0x10],
+ [0x0c, 0x0b, 0x9f]
+ ]);
}
- }
- /**
- * Sets the multiplexer's frequency.
- * @param {number} freq The frequency to set.
- */
- async function setMux(freq) {
- var freqMhz = freq / 1000000;
- for (var i = 0; i < MUX_CFGS.length - 1; ++i) {
- if (freqMhz < MUX_CFGS[i + 1][0]) {
- break;
- }
+ /**
+ * Sets the tuner's manual gain.
+ * @param {number} gain The tuner's gain, in dB.
+ */
+ async function setManualGain(gain) {
+ let step;
+ if (gain <= 15) {
+ step = Math.round(1.36 + gain * (1.1118 + gain * (-0.0786 + gain * 0.0027)));
+ } else {
+ step = Math.round(1.2068 + gain * (0.6875 + gain * (-0.01011 + gain * 0.0001587)));
+ }
+ if (step < 0) {
+ step = 0;
+ } else if (step > 30) {
+ step = 30;
+ }
+ const lnaValue = Math.floor(step / 2);
+ const mixerValue = Math.floor((step - 1) / 2);
+ await writeEach([
+ [0x05, 0x10, 0x10],
+ [0x07, 0x00, 0x10],
+ [0x0c, 0x08, 0x9f],
+ [0x05, lnaValue, 0x0f],
+ [0x07, mixerValue, 0x0f]
+ ]);
}
- var cfg = MUX_CFGS[i];
- await writeEach([
- [0x17, cfg[1], 0x08],
- [0x1a, cfg[2], 0xc3],
- [0x1b, cfg[3], 0xff],
- [0x10, 0x00, 0x0b],
- [0x08, 0x00, 0x3f],
- [0x09, 0x00, 0x3f]
- ]);
- }
- /**
- * Sets the PLL's frequency.
- * @param {number} freq The frequency to set.
- */
- async function setPll(freq) {
- var pllRef = Math.floor(xtalFreq);
- await writeEach([
- [0x10, 0x00, 0x10],
- [0x1a, 0x00, 0x0c],
- [0x12, 0x80, 0xe0]
- ]);
- var divNum = Math.min(6, Math.floor(Math.log(1770000000 / freq) / Math.LN2));
- var mixDiv = 1 << (divNum + 1);
- var data = await readRegBuffer(0x00, 5);
- var arr = new Uint8Array(data);
- var vcoFineTune = (arr[4] & 0x30) >> 4;
- if (vcoFineTune > 2) {
- --divNum;
- } else if (vcoFineTune < 2) {
- ++divNum;
+ /**
+ * Calibrates the filters.
+ * @param {boolean} firstTry Whether this is the first try to calibrate.
+ */
+ async function calibrateFilter(firstTry) {
+ await writeEach([
+ [0x0b, 0x6b, 0x60],
+ [0x0f, 0x04, 0x04],
+ [0x10, 0x00, 0x03]
+ ]);
+ await setPll(56000000);
+ if (!hasPllLock) {
+ throw new Error("PLL not locked -- cannot tune to the selected frequency.");
+ }
+ await writeEach([
+ [0x0b, 0x10, 0x10],
+ [0x0b, 0x00, 0x10],
+ [0x0f, 0x00, 0x04]
+ ]);
+ const data = await readRegBuffer(0x00, 5);
+ const arr = new Uint8Array(data);
+ let filterCap = arr[4] & 0x0f;
+ if (filterCap === 0x0f) {
+ filterCap = 0;
+ }
+ if (filterCap !== 0 && firstTry) {
+ return calibrateFilter(false);
+ } else {
+ return (filterCap);
+ }
}
- await writeRegMask(0x10, divNum << 5, 0xe0);
- var vcoFreq = freq * mixDiv;
- var nint = Math.floor(vcoFreq / (2 * pllRef));
- var vcoFra = vcoFreq % (2 * pllRef);
- if (nint > 63) {
- hasPllLock = false;
- return;
+
+ /**
+ * Sets the multiplexer's frequency.
+ * @param {number} freq The frequency to set.
+ */
+ async function setMux(freq) {
+ const freqMhz = freq / 1000000;
+ let i = 0;
+ for (; i < MUX_CFGS.length - 1; ++i) {
+ if (freqMhz < MUX_CFGS[i + 1][0]) {
+ break;
+ }
+ }
+ const cfg = MUX_CFGS[i];
+ await writeEach([
+ [0x17, cfg[1], 0x08],
+ [0x1a, cfg[2], 0xc3],
+ [0x1b, cfg[3], 0xff],
+ [0x10, 0x00, 0x0b],
+ [0x08, 0x00, 0x3f],
+ [0x09, 0x00, 0x3f]
+ ]);
}
- var ni = Math.floor((nint - 13) / 4);
- var si = (nint - 13) % 4;
- await writeEach([
- [0x14, ni + (si << 6), 0xff],
- [0x12, vcoFra == 0 ? 0x08 : 0x00, 0x08]
- ]);
- var sdm = Math.min(65535, Math.floor(32768 * vcoFra / pllRef));
- await writeEach([
- [0x16, sdm >> 8, 0xff],
- [0x15, sdm & 0xff, 0xff]
- ]);
- await getPllLock(true);
- await writeRegMask(0x1a, 0x08, 0x08);
- var actualFreq = 2 * pllRef * (nint + sdm / 65536) / mixDiv;
- return (actualFreq);
- }
- /**
- * Checks whether the PLL has achieved lock.
- * @param {boolean} firstTry Whether this is the first try to achieve lock.
- */
- async function getPllLock(firstTry) {
- var data = await readRegBuffer(0x00, 3);
- var arr = new Uint8Array(data);
- if (arr[2] & 0x40) {
- hasPllLock = true;
- return;
+ /**
+ * Sets the PLL's frequency.
+ * @param {number} freq The frequency to set.
+ */
+ async function setPll(freq) {
+ const pllRef = Math.floor(xtalFreq);
+ await writeEach([
+ [0x10, 0x00, 0x10],
+ [0x1a, 0x00, 0x0c],
+ [0x12, 0x80, 0xe0]
+ ]);
+ let divNum = Math.min(6, Math.floor(Math.log(1770000000 / freq) / Math.LN2));
+ const mixDiv = 1 << (divNum + 1);
+ const data = await readRegBuffer(0x00, 5);
+ const arr = new Uint8Array(data);
+ const vcoFineTune = (arr[4] & 0x30) >> 4;
+ if (vcoFineTune > 2) {
+ --divNum;
+ } else if (vcoFineTune < 2) {
+ ++divNum;
+ }
+ await writeRegMask(0x10, divNum << 5, 0xe0);
+ const vcoFreq = freq * mixDiv;
+ const nint = Math.floor(vcoFreq / (2 * pllRef));
+ const vcoFra = vcoFreq % (2 * pllRef);
+ if (nint > 63) {
+ hasPllLock = false;
+ return;
+ }
+ const ni = Math.floor((nint - 13) / 4);
+ const si = (nint - 13) % 4;
+ await writeEach([
+ [0x14, ni + (si << 6), 0xff],
+ [0x12, vcoFra === 0 ? 0x08 : 0x00, 0x08]
+ ]);
+ const sdm = Math.min(65535, Math.floor(32768 * vcoFra / pllRef));
+ await writeEach([
+ [0x16, sdm >> 8, 0xff],
+ [0x15, sdm & 0xff, 0xff]
+ ]);
+ await getPllLock(true);
+ await writeRegMask(0x1a, 0x08, 0x08);
+ const actualFreq = 2 * pllRef * (nint + sdm / 65536) / mixDiv;
+ return (actualFreq);
}
- if (firstTry) {
- await writeRegMask(0x12, 0x60, 0xe0);
- return await getPllLock(false);
- } else {
- hasPllLock = false;
- return;
+
+ /**
+ * Checks whether the PLL has achieved lock.
+ * @param {boolean} firstTry Whether this is the first try to achieve lock.
+ */
+ async function getPllLock(firstTry) {
+ const data = await readRegBuffer(0x00, 3);
+ const arr = new Uint8Array(data);
+ if (arr[2] & 0x40) {
+ hasPllLock = true;
+ return;
+ }
+ if (firstTry) {
+ await writeRegMask(0x12, 0x60, 0xe0);
+ return getPllLock(false);
+ } else {
+ hasPllLock = false;
+ }
}
- }
- /**
- * Sets the initial values of the 0x05-0x1f registers.
- * @param {Array.} regs The values for the registers.
- */
- async function initRegisters(regs) {
- shadowRegs = new Uint8Array(regs);
- var cmds = [];
- for (var i = 0; i < regs.length; ++i) {
- cmds.push([CMD.I2CREG, 0x34, i + 5, regs[i]]);
+ /**
+ * Sets the initial values of the 0x05-0x1f registers.
+ * @param {Array.} regs The values for the registers.
+ */
+ async function initRegisters(regs) {
+ shadowRegs = new Uint8Array(regs);
+ const cmds = [];
+ for (let i = 0; i < regs.length; ++i) {
+ cmds.push([CMD.I2CREG, 0x34, i + 5, regs[i]]);
+ }
+ await com.writeEach(cmds);
}
- await com.writeEach(cmds);
- }
- /**
- * Reads a series of registers into a buffer.
- * @param {number} addr The first register's address to read.
- * @param {number} length The number of registers to read.
- * @return {ArrayBuffer} An ArrayBuffer with the data.
- */
- async function readRegBuffer(addr, length) {
- var data = await com.i2c.readRegBuffer(0x34, addr, length);
- var buf = new Uint8Array(data);
- for (var i = 0; i < buf.length; ++i) {
- var b = buf[i];
- buf[i] = (BIT_REVS[b & 0xf] << 4) | BIT_REVS[b >> 4];
+ /**
+ * Reads a series of registers into a buffer.
+ * @param {number} addr The first register's address to read.
+ * @param {number} length The number of registers to read.
+ * @return {ArrayBuffer} An ArrayBuffer with the data.
+ */
+ async function readRegBuffer(addr, length) {
+ const data = await com.i2c.readRegBuffer(0x34, addr, length);
+ const buf = new Uint8Array(data);
+ for (let i = 0; i < buf.length; ++i) {
+ const b = buf[i];
+ buf[i] = (BIT_REVS[b & 0xf] << 4) | BIT_REVS[b >> 4];
+ }
+ return (buf.buffer);
}
- return (buf.buffer);
- }
- /**
- * Writes a masked value into a register.
- * @param {number} addr The address of the register to write into.
- * @param {number} value The value to write.
- * @param {number} mask A mask that specifies which bits to write.
- */
- async function writeRegMask(addr, value, mask) {
- var rc = shadowRegs[addr - 5];
- var val = (rc & ~mask) | (value & mask);
- shadowRegs[addr - 5] = val;
- await com.i2c.writeRegister(0x34, addr, val);
- }
+ /**
+ * Writes a masked value into a register.
+ * @param {number} addr The address of the register to write into.
+ * @param {number} value The value to write.
+ * @param {number} mask A mask that specifies which bits to write.
+ */
+ async function writeRegMask(addr, value, mask) {
+ const rc = shadowRegs[addr - 5];
+ const val = (rc & ~mask) | (value & mask);
+ shadowRegs[addr - 5] = val;
+ await com.i2c.writeRegister(0x34, addr, val);
+ }
- /**
- * Perform the write operations given in the array.
- * @param {Array.>} array The operations.
- */
- async function writeEach(array) {
- for (var index = 0; index < array.length; index++) {
- var line = array[index];
- await writeRegMask(line[0], line[1], line[2]);
+ /**
+ * Perform the write operations given in the array.
+ * @param {Array.>} array The operations.
+ */
+ async function writeEach(array) {
+ for (let i = 0; i < array.length; i++) {
+ const line = array[i];
+ await writeRegMask(line[0], line[1], line[2]);
+ }
}
- }
- return {
- init: init,
- setFrequency: setFrequency,
- setAutoGain: setAutoGain,
- setManualGain: setManualGain,
- close: close
- };
+ return {
+ init: init,
+ setFrequency: setFrequency,
+ setAutoGain: setAutoGain,
+ setManualGain: setManualGain,
+ close: close
+ };
}
/**
@@ -373,8 +372,6 @@ function R820T(com, xtalFreq) {
* @return {boolean} A boolean that tells whether the tuner is present.
*/
R820T.check = async function (com) {
- var data = await com.i2c.readRegister(0x34, 0);
- return (data == 0x69);
+ const data = await com.i2c.readRegister(0x34, 0);
+ return (data === 0x69);
};
-
-module.exports = R820T;
diff --git a/lib/rtl2832u.js b/lib/rtl2832u.js
index a92b3d0..f4dc157 100644
--- a/lib/rtl2832u.js
+++ b/lib/rtl2832u.js
@@ -13,12 +13,12 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-var R820T = require('./r820t');
-var RtlCom = require('./rtlcom');
+import {R820T} from './r820t';
+import {RtlCom} from './rtlcom';
-var CMD = RtlCom.CMD;
-var BLOCK = RtlCom.BLOCK;
-var REG = RtlCom.REG;
+const CMD = RtlCom.CMD;
+const BLOCK = RtlCom.BLOCK;
+const REG = RtlCom.REG;
/**
* Operations on the RTL2832U demodulator.
@@ -27,206 +27,205 @@ var REG = RtlCom.REG;
* @param {number=} opt_gain The optional gain in dB. If unspecified or null, sets auto gain.
* @constructor
*/
-function RTL2832U(conn, ppm, opt_gain) {
-
- /**
- * Frequency of the oscillator crystal.
- */
- var XTAL_FREQ = 28800000;
-
- /**
- * Tuner intermediate frequency.
- */
- var IF_FREQ = 3570000;
-
- /**
- * The number of bytes for each sample.
- */
- var BYTES_PER_SAMPLE = 2;
-
- /**
- * Communications with the demodulator via USB.
- */
- var com = new RtlCom(conn);
-
- /**
- * The tuner used by the dongle.
- */
- var tuner;
-
- /**
- * Initialize the demodulator.
- */
- async function open() {
- await com.writeEach([
- [CMD.REG, BLOCK.USB, REG.SYSCTL, 0x09, 1],
- [CMD.REG, BLOCK.USB, REG.EPA_MAXPKT, 0x0200, 2],
- [CMD.REG, BLOCK.USB, REG.EPA_CTL, 0x0210, 2]
- ]);
- await com.iface.claim();
- await com.writeEach([
- [CMD.REG, BLOCK.SYS, REG.DEMOD_CTL_1, 0x22, 1],
- [CMD.REG, BLOCK.SYS, REG.DEMOD_CTL, 0xe8, 1],
- [CMD.DEMODREG, 1, 0x01, 0x14, 1],
- [CMD.DEMODREG, 1, 0x01, 0x10, 1],
- [CMD.DEMODREG, 1, 0x15, 0x00, 1],
- [CMD.DEMODREG, 1, 0x16, 0x0000, 2],
- [CMD.DEMODREG, 1, 0x16, 0x00, 1],
- [CMD.DEMODREG, 1, 0x17, 0x00, 1],
- [CMD.DEMODREG, 1, 0x18, 0x00, 1],
- [CMD.DEMODREG, 1, 0x19, 0x00, 1],
- [CMD.DEMODREG, 1, 0x1a, 0x00, 1],
- [CMD.DEMODREG, 1, 0x1b, 0x00, 1],
- [CMD.DEMODREG, 1, 0x1c, 0xca, 1],
- [CMD.DEMODREG, 1, 0x1d, 0xdc, 1],
- [CMD.DEMODREG, 1, 0x1e, 0xd7, 1],
- [CMD.DEMODREG, 1, 0x1f, 0xd8, 1],
- [CMD.DEMODREG, 1, 0x20, 0xe0, 1],
- [CMD.DEMODREG, 1, 0x21, 0xf2, 1],
- [CMD.DEMODREG, 1, 0x22, 0x0e, 1],
- [CMD.DEMODREG, 1, 0x23, 0x35, 1],
- [CMD.DEMODREG, 1, 0x24, 0x06, 1],
- [CMD.DEMODREG, 1, 0x25, 0x50, 1],
- [CMD.DEMODREG, 1, 0x26, 0x9c, 1],
- [CMD.DEMODREG, 1, 0x27, 0x0d, 1],
- [CMD.DEMODREG, 1, 0x28, 0x71, 1],
- [CMD.DEMODREG, 1, 0x29, 0x11, 1],
- [CMD.DEMODREG, 1, 0x2a, 0x14, 1],
- [CMD.DEMODREG, 1, 0x2b, 0x71, 1],
- [CMD.DEMODREG, 1, 0x2c, 0x74, 1],
- [CMD.DEMODREG, 1, 0x2d, 0x19, 1],
- [CMD.DEMODREG, 1, 0x2e, 0x41, 1],
- [CMD.DEMODREG, 1, 0x2f, 0xa5, 1],
- [CMD.DEMODREG, 0, 0x19, 0x05, 1],
- [CMD.DEMODREG, 1, 0x93, 0xf0, 1],
- [CMD.DEMODREG, 1, 0x94, 0x0f, 1],
- [CMD.DEMODREG, 1, 0x11, 0x00, 1],
- [CMD.DEMODREG, 1, 0x04, 0x00, 1],
- [CMD.DEMODREG, 0, 0x61, 0x60, 1],
- [CMD.DEMODREG, 0, 0x06, 0x80, 1],
- [CMD.DEMODREG, 1, 0xb1, 0x1b, 1],
- [CMD.DEMODREG, 0, 0x0d, 0x83, 1]
- ]);
-
- var xtalFreq = Math.floor(XTAL_FREQ * (1 + ppm / 1000000));
- await com.i2c.open();
- var found = await R820T.check(com);
- if (found) {
- tuner = new R820T(com, xtalFreq);
+export function RTL2832U(conn, ppm, opt_gain) {
+
+ /**
+ * Frequency of the oscillator crystal.
+ */
+ const XTAL_FREQ = 28800000;
+
+ /**
+ * Tuner intermediate frequency.
+ */
+ const IF_FREQ = 3570000;
+
+ /**
+ * The number of bytes for each sample.
+ */
+ const BYTES_PER_SAMPLE = 2;
+
+ /**
+ * Communications with the demodulator via USB.
+ */
+ const com = new RtlCom(conn);
+
+ /**
+ * The tuner used by the dongle.
+ */
+ let tuner;
+
+ /**
+ * Initialize the demodulator.
+ */
+ async function open() {
+ await com.writeEach([
+ [CMD.REG, BLOCK.USB, REG.SYSCTL, 0x09, 1],
+ [CMD.REG, BLOCK.USB, REG.EPA_MAXPKT, 0x0200, 2],
+ [CMD.REG, BLOCK.USB, REG.EPA_CTL, 0x0210, 2]
+ ]);
+ await com.iface.claim();
+ await com.writeEach([
+ [CMD.REG, BLOCK.SYS, REG.DEMOD_CTL_1, 0x22, 1],
+ [CMD.REG, BLOCK.SYS, REG.DEMOD_CTL, 0xe8, 1],
+ [CMD.DEMODREG, 1, 0x01, 0x14, 1],
+ [CMD.DEMODREG, 1, 0x01, 0x10, 1],
+ [CMD.DEMODREG, 1, 0x15, 0x00, 1],
+ [CMD.DEMODREG, 1, 0x16, 0x0000, 2],
+ [CMD.DEMODREG, 1, 0x16, 0x00, 1],
+ [CMD.DEMODREG, 1, 0x17, 0x00, 1],
+ [CMD.DEMODREG, 1, 0x18, 0x00, 1],
+ [CMD.DEMODREG, 1, 0x19, 0x00, 1],
+ [CMD.DEMODREG, 1, 0x1a, 0x00, 1],
+ [CMD.DEMODREG, 1, 0x1b, 0x00, 1],
+ [CMD.DEMODREG, 1, 0x1c, 0xca, 1],
+ [CMD.DEMODREG, 1, 0x1d, 0xdc, 1],
+ [CMD.DEMODREG, 1, 0x1e, 0xd7, 1],
+ [CMD.DEMODREG, 1, 0x1f, 0xd8, 1],
+ [CMD.DEMODREG, 1, 0x20, 0xe0, 1],
+ [CMD.DEMODREG, 1, 0x21, 0xf2, 1],
+ [CMD.DEMODREG, 1, 0x22, 0x0e, 1],
+ [CMD.DEMODREG, 1, 0x23, 0x35, 1],
+ [CMD.DEMODREG, 1, 0x24, 0x06, 1],
+ [CMD.DEMODREG, 1, 0x25, 0x50, 1],
+ [CMD.DEMODREG, 1, 0x26, 0x9c, 1],
+ [CMD.DEMODREG, 1, 0x27, 0x0d, 1],
+ [CMD.DEMODREG, 1, 0x28, 0x71, 1],
+ [CMD.DEMODREG, 1, 0x29, 0x11, 1],
+ [CMD.DEMODREG, 1, 0x2a, 0x14, 1],
+ [CMD.DEMODREG, 1, 0x2b, 0x71, 1],
+ [CMD.DEMODREG, 1, 0x2c, 0x74, 1],
+ [CMD.DEMODREG, 1, 0x2d, 0x19, 1],
+ [CMD.DEMODREG, 1, 0x2e, 0x41, 1],
+ [CMD.DEMODREG, 1, 0x2f, 0xa5, 1],
+ [CMD.DEMODREG, 0, 0x19, 0x05, 1],
+ [CMD.DEMODREG, 1, 0x93, 0xf0, 1],
+ [CMD.DEMODREG, 1, 0x94, 0x0f, 1],
+ [CMD.DEMODREG, 1, 0x11, 0x00, 1],
+ [CMD.DEMODREG, 1, 0x04, 0x00, 1],
+ [CMD.DEMODREG, 0, 0x61, 0x60, 1],
+ [CMD.DEMODREG, 0, 0x06, 0x80, 1],
+ [CMD.DEMODREG, 1, 0xb1, 0x1b, 1],
+ [CMD.DEMODREG, 0, 0x0d, 0x83, 1]
+ ]);
+
+ const xtalFreq = Math.floor(XTAL_FREQ * (1 + ppm / 1000000));
+ await com.i2c.open();
+ const found = await R820T.check(com);
+ if (found) {
+ tuner = new R820T(com, xtalFreq);
+ }
+ if (!tuner) {
+ throw new Error('Sorry, your USB dongle has an unsupported tuner chip. ' +
+ 'Only the R820T chip is supported.');
+ }
+ const multiplier = -1 * Math.floor(IF_FREQ * (1 << 22) / xtalFreq);
+ await com.writeEach([
+ [CMD.DEMODREG, 1, 0xb1, 0x1a, 1],
+ [CMD.DEMODREG, 0, 0x08, 0x4d, 1],
+ [CMD.DEMODREG, 1, 0x19, (multiplier >> 16) & 0x3f, 1],
+ [CMD.DEMODREG, 1, 0x1a, (multiplier >> 8) & 0xff, 1],
+ [CMD.DEMODREG, 1, 0x1b, multiplier & 0xff, 1],
+ [CMD.DEMODREG, 1, 0x15, 0x01, 1]
+ ])
+ await tuner.init();
+ await setGain(opt_gain);
+ await com.i2c.close();
}
- if (!tuner) {
- throw new Error('Sorry, your USB dongle has an unsupported tuner chip. ' +
- 'Only the R820T chip is supported.');
- return;
+
+ /**
+ * Sets the requested gain.
+ * @param {number|null|undefined} gain The gain in dB, or null/undefined
+ * for automatic gain.
+ */
+ async function setGain(gain) {
+ if (gain == null) {
+ await tuner.setAutoGain();
+ } else {
+ await tuner.setManualGain(gain);
+ }
+ }
+
+ /**
+ * Set the sample rate.
+ * @param {number} rate The sample rate, in samples/sec.
+ * @return {number} The sample rate that was actually set as its first parameter.
+ */
+ async function setSampleRate(rate) {
+ let ratio = Math.floor(XTAL_FREQ * (1 << 22) / rate);
+ ratio &= 0x0ffffffc;
+ const realRate = Math.floor(XTAL_FREQ * (1 << 22) / ratio);
+ const ppmOffset = -1 * Math.floor(ppm * (1 << 24) / 1000000);
+ await com.writeEach([
+ [CMD.DEMODREG, 1, 0x9f, (ratio >> 16) & 0xffff, 2],
+ [CMD.DEMODREG, 1, 0xa1, ratio & 0xffff, 2],
+ [CMD.DEMODREG, 1, 0x3e, (ppmOffset >> 8) & 0x3f, 1],
+ [CMD.DEMODREG, 1, 0x3f, ppmOffset & 0xff, 1]
+ ]);
+ await resetDemodulator();
+ return realRate;
}
- var multiplier = -1 * Math.floor(IF_FREQ * (1<<22) / xtalFreq);
- await com.writeEach([
- [CMD.DEMODREG, 1, 0xb1, 0x1a, 1],
- [CMD.DEMODREG, 0, 0x08, 0x4d, 1],
- [CMD.DEMODREG, 1, 0x19, (multiplier >> 16) & 0x3f, 1],
- [CMD.DEMODREG, 1, 0x1a, (multiplier >> 8) & 0xff, 1],
- [CMD.DEMODREG, 1, 0x1b, multiplier & 0xff, 1],
- [CMD.DEMODREG, 1, 0x15, 0x01, 1]
- ])
- await tuner.init();
- await setGain(opt_gain);
- await com.i2c.close();
- }
-
- /**
- * Sets the requested gain.
- * @param {number|null|undefined} gain The gain in dB, or null/undefined
- * for automatic gain.
- */
- async function setGain(gain) {
- if (gain == null) {
- await tuner.setAutoGain();
- } else {
- await tuner.setManualGain(gain);
+
+ /**
+ * Resets the demodulator.
+ */
+ async function resetDemodulator() {
+ await com.writeEach([
+ [CMD.DEMODREG, 1, 0x01, 0x14, 1],
+ [CMD.DEMODREG, 1, 0x01, 0x10, 1]
+ ]);
}
- }
-
- /**
- * Set the sample rate.
- * @param {number} rate The sample rate, in samples/sec.
- * @return {number} The sample rate that was actually set as its first parameter.
- */
- async function setSampleRate(rate) {
- var ratio = Math.floor(XTAL_FREQ * (1 << 22) / rate);
- ratio &= 0x0ffffffc;
- var realRate = Math.floor(XTAL_FREQ * (1 << 22) / ratio);
- var ppmOffset = -1 * Math.floor(ppm * (1 << 24) / 1000000);
- await com.writeEach([
- [CMD.DEMODREG, 1, 0x9f, (ratio >> 16) & 0xffff, 2],
- [CMD.DEMODREG, 1, 0xa1, ratio & 0xffff, 2],
- [CMD.DEMODREG, 1, 0x3e, (ppmOffset >> 8) & 0x3f, 1],
- [CMD.DEMODREG, 1, 0x3f, ppmOffset & 0xff, 1]
- ]);
- await resetDemodulator();
- return realRate;
- }
-
- /**
- * Resets the demodulator.
- */
- async function resetDemodulator() {
- await com.writeEach([
- [CMD.DEMODREG, 1, 0x01, 0x14, 1],
- [CMD.DEMODREG, 1, 0x01, 0x10, 1]
- ]);
- }
-
- /**
- * Tunes the device to the given frequency.
- * @param {number} freq The frequency to tune to, in Hertz.
- * @return {number} The actual tuned frequency.
- */
- async function setCenterFrequency(freq) {
- await com.i2c.open();
- var actualFreq = await tuner.setFrequency(freq + IF_FREQ);
- await com.i2c.close();
- return (actualFreq - IF_FREQ);
- }
-
- /**
- * Resets the sample buffer. Call this before starting to read samples.
- */
- async function resetBuffer() {
- await com.writeEach([
- [CMD.REG, BLOCK.USB, REG.EPA_CTL, 0x0210, 2],
- [CMD.REG, BLOCK.USB, REG.EPA_CTL, 0x0000, 2]
- ]);
- }
-
- /**
- * Reads a block of samples off the device.
- * @param {number} length The number of samples to read.
- * @return {ArrayBuffer} An ArrayBuffer containing the read samples, which you
- * can interpret as pairs of unsigned 8-bit integers; the first one is
- * the sample's I value, and the second one is its Q value.
- */
- async function readSamples(length) {
- return await com.bulk.readBuffer(length * BYTES_PER_SAMPLE);
- }
-
- /**
- * Stops the demodulator.
- */
- async function close() {
- await com.i2c.open();
- await tuner.close();
- await com.i2c.close();
- await com.iface.release();
- }
-
- return {
- open: open,
- setSampleRate: setSampleRate,
- setCenterFrequency: setCenterFrequency,
- resetBuffer: resetBuffer,
- readSamples: readSamples,
- close: close
- };
+
+ /**
+ * Tunes the device to the given frequency.
+ * @param {number} freq The frequency to tune to, in Hertz.
+ * @return {number} The actual tuned frequency.
+ */
+ async function setCenterFrequency(freq) {
+ await com.i2c.open();
+ const actualFreq = await tuner.setFrequency(freq + IF_FREQ);
+ await com.i2c.close();
+ return (actualFreq - IF_FREQ);
+ }
+
+ /**
+ * Resets the sample buffer. Call this before starting to read samples.
+ */
+ async function resetBuffer() {
+ await com.writeEach([
+ [CMD.REG, BLOCK.USB, REG.EPA_CTL, 0x0210, 2],
+ [CMD.REG, BLOCK.USB, REG.EPA_CTL, 0x0000, 2]
+ ]);
+ }
+
+ /**
+ * Reads a block of samples off the device.
+ * @param {number} length The number of samples to read.
+ * @return {ArrayBuffer} An ArrayBuffer containing the read samples, which you
+ * can interpret as pairs of unsigned 8-bit integers; the first one is
+ * the sample's I value, and the second one is its Q value.
+ */
+ async function readSamples(length) {
+ return com.bulk.readBuffer(length * BYTES_PER_SAMPLE);
+ }
+
+ /**
+ * Stops the demodulator.
+ */
+ async function close() {
+ await com.i2c.open();
+ await tuner.close();
+ await com.i2c.close();
+ await com.iface.release();
+ }
+
+ return {
+ open: open,
+ setSampleRate: setSampleRate,
+ setCenterFrequency: setCenterFrequency,
+ resetBuffer: resetBuffer,
+ readSamples: readSamples,
+ close: close
+ };
}
module.exports = RTL2832U;
diff --git a/lib/rtlcom.js b/lib/rtlcom.js
index 3eae4bf..4e2e001 100644
--- a/lib/rtlcom.js
+++ b/lib/rtlcom.js
@@ -18,399 +18,398 @@
* @param {ConnectionHandle} conn The USB connection handle.
* @constructor
*/
-function RtlCom(conn) {
-
- /**
- * Whether to log all USB transfers.
- */
- var VERBOSE = false;
-
- /**
- * Set in the control messages' index field for write operations.
- */
- var WRITE_FLAG = 0x10;
-
- /**
- * Writes a buffer into a dongle's register.
- * @param {number} block The register's block number.
- * @param {number} reg The register number.
- * @param {ArrayBuffer} buffer The buffer to write.
- */
- async function writeRegBuffer(block, reg, buffer) {
- await writeCtrlMsg(reg, block | WRITE_FLAG, buffer);
- }
-
- /**
- * Reads a buffer from a dongle's register.
- * @param {number} block The register's block number.
- * @param {number} reg The register number.
- * @param {number} length The length in bytes of the buffer to read.
- * @return {ArrayBuffer} The read buffer.
- */
- async function readRegBuffer(block, reg, length) {
- return await readCtrlMsg(reg, block, length);
- }
-
- /**
- * Writes a value into a dongle's register.
- * @param {number} block The register's block number.
- * @param {number} reg The register number.
- * @param {number} value The value to write.
- * @param {number} length The width in bytes of this value.
- */
- async function writeReg(block, reg, value, length) {
- await writeCtrlMsg(reg, block | WRITE_FLAG, numberToBuffer(value, length));
- }
-
- /**
- * Reads a value from a dongle's register.
- * @param {number} block The register's block number.
- * @param {number} reg The register number.
- * @param {number} length The width in bytes of the value to read.
- * @return {number} The decoded value.
- */
- async function readReg(block, reg, length) {
- return bufferToNumber(await readCtrlMsg(reg, block, length));
- }
-
- /**
- * Writes a masked value into a dongle's register.
- * @param {number} block The register's block number.
- * @param {number} reg The register number.
- * @param {number} value The value to write.
- * @param {number} mask The mask for the value to write.
- */
- async function writeRegMask(block, reg, value, mask) {
- if (mask == 0xff) {
- await writeReg(block, reg, value, 1);
- } else {
- var old = await readReg(block, reg, 1);
- value &= mask;
- old &= ~mask;
- value |= old;
- await writeReg(block, reg, value, 1);
+export function RtlCom(conn) {
+
+ /**
+ * Whether to log all USB transfers.
+ */
+ const VERBOSE = false;
+
+ /**
+ * Set in the control messages' index field for write operations.
+ */
+ const WRITE_FLAG = 0x10;
+
+ /**
+ * Writes a buffer into a dongle's register.
+ * @param {number} block The register's block number.
+ * @param {number} reg The register number.
+ * @param {ArrayBuffer} buffer The buffer to write.
+ */
+ async function writeRegBuffer(block, reg, buffer) {
+ await writeCtrlMsg(reg, block | WRITE_FLAG, buffer);
}
- }
-
- /**
- * Reads a value from a demodulator register.
- * @param {number} page The register page number.
- * @param {number} addr The register's address.
- * @return {number} The decoded value.
- */
- async function readDemodReg(page, addr) {
- return await readReg(page, (addr << 8) | 0x20, 1);
- }
-
- /**
- * Writes a value into a demodulator register.
- * @param {number} page The register page number.
- * @param {number} addr The register's address.
- * @param {number} value The value to write.
- * @param {number} len The width in bytes of this value.
- */
- async function writeDemodReg(page, addr, value, len) {
- await writeRegBuffer(page, (addr << 8) | 0x20, numberToBuffer(value, len, true));
- return await readDemodReg(0x0a, 0x01);
- }
-
- /**
- * Opens the I2C repeater.
- */
- async function openI2C() {
- await writeDemodReg(1, 1, 0x18, 1);
- }
-
- /**
- * Closes the I2C repeater.
- */
- async function closeI2C() {
- await writeDemodReg(1, 1, 0x10, 1);
- }
-
- /**
- * Reads a value from an I2C register.
- * @param {number} addr The device's address.
- * @param {number} reg The register number.
- */
- async function readI2CReg(addr, reg) {
- await writeRegBuffer(BLOCK.I2C, addr, new Uint8Array([reg]).buffer);
- return await readReg(BLOCK.I2C, addr, 1);
- }
-
- /**
- * Writes a value to an I2C register.
- * @param {number} addr The device's address.
- * @param {number} reg The register number.
- * @param {number} value The value to write.
- * @param {number} len The width in bytes of this value.
- */
- async function writeI2CReg(addr, reg, value) {
- await writeRegBuffer(BLOCK.I2C, addr, new Uint8Array([reg, value]).buffer);
- }
-
- /**
- * Reads a buffer from an I2C register.
- * @param {number} addr The device's address.
- * @param {number} reg The register number.
- * @param {number} len The number of bytes to read.
- */
- async function readI2CRegBuffer(addr, reg, len) {
- await writeRegBuffer(BLOCK.I2C, addr, new Uint8Array([reg]).buffer);
- return await readRegBuffer(BLOCK.I2C, addr, len);
- }
-
- /**
- * Writes a buffer to an I2C register.
- * @param {number} addr The device's address.
- * @param {number} reg The register number.
- * @param {ArrayBuffer} buffer The buffer to write.
- */
- async function writeI2CRegBuffer(addr, reg, buffer) {
- var data = new Uint8Array(buffer.byteLength + 1);
- data[0] = reg;
- data.set(new Uint8Array(buffer), 1);
- await writeRegBuffer(BLOCK.I2C, addr, data.buffer);
- }
-
- /**
- * Decodes a buffer as a little-endian number.
- * @param {ArrayBuffer} buffer The buffer to decode.
- * @return {number} The decoded number.
- */
- function bufferToNumber(buffer) {
- var len = buffer.byteLength;
- var dv = new DataView(buffer);
- if (len == 0) {
- return null;
- } else if (len == 1) {
- return dv.getUint8(0);
- } else if (len == 2) {
- return dv.getUint16(0, true);
- } else if (len == 4) {
- return dv.getUint32(0, true);
+
+ /**
+ * Reads a buffer from a dongle's register.
+ * @param {number} block The register's block number.
+ * @param {number} reg The register number.
+ * @param {number} length The length in bytes of the buffer to read.
+ * @return {ArrayBuffer} The read buffer.
+ */
+ async function readRegBuffer(block, reg, length) {
+ return readCtrlMsg(reg, block, length);
}
- throw 'Cannot parse ' + len + '-byte number';
- }
-
- /**
- * Encodes a number into a buffer.
- * @param {number} value The number to encode.
- * @param {number} len The number of bytes to encode into.
- * @param {boolean=} opt_bigEndian Whether to use a big-endian encoding.
- */
- function numberToBuffer(value, len, opt_bigEndian) {
- var buffer = new ArrayBuffer(len);
- var dv = new DataView(buffer);
- if (len == 1) {
- dv.setUint8(0, value);
- } else if (len == 2) {
- dv.setUint16(0, value, !opt_bigEndian);
- } else if (len == 4) {
- dv.setUint32(0, value, !opt_bigEndian);
- } else {
- throw 'Cannot write ' + len + '-byte number';
+
+ /**
+ * Writes a value into a dongle's register.
+ * @param {number} block The register's block number.
+ * @param {number} reg The register number.
+ * @param {number} value The value to write.
+ * @param {number} length The width in bytes of this value.
+ */
+ async function writeReg(block, reg, value, length) {
+ await writeCtrlMsg(reg, block | WRITE_FLAG, numberToBuffer(value, length));
}
- return buffer;
- }
-
- /**
- * Sends a USB control message to read from the device.
- * @param {number} value The value field of the control message.
- * @param {number} index The index field of the control message.
- * @param {number} length The number of bytes to read.
- */
- async function readCtrlMsg(value, index, length) {
- var ti = {
- 'requestType': 'vendor',
- 'recipient': 'device',
- 'direction': 'in',
- 'request': 0,
- 'value': value,
- 'index': index,
- 'length': Math.max(8, length)
- };
- try {
- var data = await conn.controlTransfer(ti);
- data = data.slice(0, length);
- if (VERBOSE) {
- console.log('IN value 0x' + value.toString(16) + ' index 0x' +
- index.toString(16));
- console.log(' read -> ' + dumpBuffer(data));
- }
-
- return data;
- } catch (error) {
- var msg = 'USB read failed (value 0x' + value.toString(16) +
- ' index 0x' + index.toString(16) + '), message="' + error.message + '"';
- };
- }
-
- /**
- * Sends a USB control message to write to the device.
- * @param {number} value The value field of the control message.
- * @param {number} index The index field of the control message.
- * @param {ArrayBuffer} buffer The buffer to write to the device.
- */
- async function writeCtrlMsg(value, index, buffer) {
- var ti = {
- 'requestType': 'vendor',
- 'recipient': 'device',
- 'direction': 'out',
- 'request': 0,
- 'value': value,
- 'index': index,
- 'data': buffer
- };
- try {
- await conn.controlTransfer(ti);
- if (VERBOSE) {
- console.log('OUT value 0x' + value.toString(16) + ' index 0x' +
- index.toString(16) + ' data ' + dumpBuffer(buffer));
- }
- } catch (error) {
- var msg = 'USB write failed (value 0x' + value.toString(16) +
- ' index 0x' + index.toString(16) + ' data ' + dumpBuffer(buffer) +
- ') message="' +
- error.message + '"';
- throw msg;
- };
- }
-
- /**
- * Does a bulk transfer from the device.
- * @param {number} length The number of bytes to read.
- * @return {ArrayBuffer} The received buffer.
- */
- async function readBulk(length) {
- var ti = {
- 'direction': 'in',
- 'endpoint': 1,
- 'length': length
- };
- try {
- var data = await conn.bulkTransfer(ti);
- if (VERBOSE) {
- console.log('IN BULK requested ' + length + ' received ' + data.byteLength);
- }
- return data;
- } catch(error) {
- var msg = 'USB bulk read failed (length 0x' + length.toString(16) +
- '), error="' +
- error.message + '"';
- throw msg;
+
+ /**
+ * Reads a value from a dongle's register.
+ * @param {number} block The register's block number.
+ * @param {number} reg The register number.
+ * @param {number} length The width in bytes of the value to read.
+ * @return {number} The decoded value.
+ */
+ async function readReg(block, reg, length) {
+ return bufferToNumber(await readCtrlMsg(reg, block, length));
+ }
+
+ /**
+ * Writes a masked value into a dongle's register.
+ * @param {number} block The register's block number.
+ * @param {number} reg The register number.
+ * @param {number} value The value to write.
+ * @param {number} mask The mask for the value to write.
+ */
+ async function writeRegMask(block, reg, value, mask) {
+ if (mask === 0xff) {
+ await writeReg(block, reg, value, 1);
+ } else {
+ let old = readReg(block, reg, 1);
+ value &= mask;
+ old &= ~mask;
+ value |= old;
+ await writeReg(block, reg, value, 1);
+ }
+ }
+
+ /**
+ * Reads a value from a demodulator register.
+ * @param {number} page The register page number.
+ * @param {number} addr The register's address.
+ * @return {number} The decoded value.
+ */
+ async function readDemodReg(page, addr) {
+ return readReg(page, (addr << 8) | 0x20, 1);
+ }
+
+ /**
+ * Writes a value into a demodulator register.
+ * @param {number} page The register page number.
+ * @param {number} addr The register's address.
+ * @param {number} value The value to write.
+ * @param {number} len The width in bytes of this value.
+ */
+ async function writeDemodReg(page, addr, value, len) {
+ await writeRegBuffer(page, (addr << 8) | 0x20, numberToBuffer(value, len, true));
+ return readDemodReg(0x0a, 0x01);
+ }
+
+ /**
+ * Opens the I2C repeater.
+ */
+ async function openI2C() {
+ await writeDemodReg(1, 1, 0x18, 1);
+ }
+
+ /**
+ * Closes the I2C repeater.
+ */
+ async function closeI2C() {
+ await writeDemodReg(1, 1, 0x10, 1);
+ }
+
+ /**
+ * Reads a value from an I2C register.
+ * @param {number} addr The device's address.
+ * @param {number} reg The register number.
+ */
+ async function readI2CReg(addr, reg) {
+ await writeRegBuffer(BLOCK.I2C, addr, new Uint8Array([reg]).buffer);
+ return readReg(BLOCK.I2C, addr, 1);
+ }
+
+ /**
+ * Writes a value to an I2C register.
+ * @param {number} addr The device's address.
+ * @param {number} reg The register number.
+ * @param {number} value The value to write.
+ */
+ async function writeI2CReg(addr, reg, value) {
+ await writeRegBuffer(BLOCK.I2C, addr, new Uint8Array([reg, value]).buffer);
+ }
+
+ /**
+ * Reads a buffer from an I2C register.
+ * @param {number} addr The device's address.
+ * @param {number} reg The register number.
+ * @param {number} len The number of bytes to read.
+ */
+ async function readI2CRegBuffer(addr, reg, len) {
+ await writeRegBuffer(BLOCK.I2C, addr, new Uint8Array([reg]).buffer);
+ return readRegBuffer(BLOCK.I2C, addr, len);
+ }
+
+ /**
+ * Writes a buffer to an I2C register.
+ * @param {number} addr The device's address.
+ * @param {number} reg The register number.
+ * @param {ArrayBuffer} buffer The buffer to write.
+ */
+ async function writeI2CRegBuffer(addr, reg, buffer) {
+ const data = new Uint8Array(buffer.byteLength + 1);
+ data[0] = reg;
+ data.set(new Uint8Array(buffer), 1);
+ await writeRegBuffer(BLOCK.I2C, addr, data.buffer);
+ }
+
+ /**
+ * Decodes a buffer as a little-endian number.
+ * @param {ArrayBuffer} buffer The buffer to decode.
+ * @return {number} The decoded number.
+ */
+ function bufferToNumber(buffer) {
+ let len = buffer.byteLength;
+ const dv = new DataView(buffer);
+ if (len === 0) {
+ return null;
+ } else if (len === 1) {
+ return dv.getUint8(0);
+ } else if (len === 2) {
+ return dv.getUint16(0, true);
+ } else if (len === 4) {
+ return dv.getUint32(0, true);
+ }
+
+ throw new Error('Cannot parse ' + len + '-byte number');
+ }
+
+ /**
+ * Encodes a number into a buffer.
+ * @param {number} value The number to encode.
+ * @param {number} len The number of bytes to encode into.
+ * @param {boolean=} opt_bigEndian Whether to use a big-endian encoding.
+ */
+ function numberToBuffer(value, len, opt_bigEndian) {
+ const buffer = new ArrayBuffer(len);
+ const dv = new DataView(buffer);
+ if (len === 1) {
+ dv.setUint8(0, value);
+ } else if (len === 2) {
+ dv.setUint16(0, value, !opt_bigEndian);
+ } else if (len === 4) {
+ dv.setUint32(0, value, !opt_bigEndian);
+ } else {
+ throw new Error('Cannot write ' + len + '-byte number');
+ }
+ return buffer;
+ }
+
+ /**
+ * Sends a USB control message to read from the device.
+ * @param {number} value The value field of the control message.
+ * @param {number} index The index field of the control message.
+ * @param {number} length The number of bytes to read.
+ */
+ async function readCtrlMsg(value, index, length) {
+ const ti = {
+ 'requestType': 'vendor',
+ 'recipient': 'device',
+ 'direction': 'in',
+ 'request': 0,
+ 'value': value,
+ 'index': index,
+ 'length': Math.max(8, length)
+ };
+ try {
+ let data = await conn.controlTransfer(ti);
+ data = data.slice(0, length);
+ if (VERBOSE) {
+ console.log('IN value 0x' + value.toString(16) + ' index 0x' +
+ index.toString(16));
+ console.log(' read -> ' + dumpBuffer(data));
+ }
+
+ return data;
+ } catch (error) {
+ const msg = 'USB read failed (value 0x' + value.toString(16) +
+ ' index 0x' + index.toString(16) + '), message="' + error.message + '"';
+ throw new Error(msg);
+ }
}
- }
-
- /**
- * Claims the USB interface.
- */
- async function claimInterface() {
- await conn.claimInterface(0);
- }
-
- /**
- * Releases the USB interface.
- */
- async function releaseInterface() {
- await conn.releaseInterface(0);
- }
-
- /**
- * Performs several write operations as specified in an array.
- * @param {Array.>} array The operations to perform.
- */
- async function writeEach(array) {
- for (var index = 0; index < array.length; index++) {
- var line = array[index];
- if (line[0] == CMD.REG) {
- await writeReg(line[1], line[2], line[3], line[4]);
- } else if (line[0] == CMD.REGMASK) {
- await writeRegMask(line[1], line[2], line[3], line[4]);
- } else if (line[0] == CMD.DEMODREG) {
- await writeDemodReg(line[1], line[2], line[3], line[4]);
- } else if (line[0] == CMD.I2CREG) {
- await writeI2CReg(line[1], line[2], line[3]);
- } else {
- throw 'Unsupported operation [' + line + ']';
- }
+
+ /**
+ * Sends a USB control message to write to the device.
+ * @param {number} value The value field of the control message.
+ * @param {number} index The index field of the control message.
+ * @param {ArrayBuffer} buffer The buffer to write to the device.
+ */
+ async function writeCtrlMsg(value, index, buffer) {
+ const ti = {
+ 'requestType': 'vendor',
+ 'recipient': 'device',
+ 'direction': 'out',
+ 'request': 0,
+ 'value': value,
+ 'index': index,
+ 'data': buffer
+ };
+ try {
+ await conn.controlTransfer(ti);
+ if (VERBOSE) {
+ console.log('OUT value 0x' + value.toString(16) + ' index 0x' +
+ index.toString(16) + ' data ' + dumpBuffer(buffer));
+ }
+ } catch (error) {
+ const msg = 'USB write failed (value 0x' + value.toString(16) +
+ ' index 0x' + index.toString(16) + ' data ' + dumpBuffer(buffer) +
+ ') message="' +
+ error.message + '"';
+ throw new Error(msg);
+ }
}
- }
-
- /**
- * Returns a string representation of a buffer.
- * @param {ArrayBuffer} buffer The buffer to display.
- * @return {string} The string representation of the buffer.
- */
- function dumpBuffer(buffer) {
- var bytes = [];
- var arr = new Uint8Array(buffer);
- for (var i = 0; i < arr.length; ++i) {
- bytes.push('0x' + arr[i].toString(16));
+
+ /**
+ * Does a bulk transfer from the device.
+ * @param {number} length The number of bytes to read.
+ * @return {ArrayBuffer} The received buffer.
+ */
+ async function readBulk(length) {
+ const ti = {
+ 'direction': 'in',
+ 'endpoint': 1,
+ 'length': length
+ };
+ try {
+ const data = await conn.bulkTransfer(ti);
+ if (VERBOSE) {
+ console.log('IN BULK requested ' + length + ' received ' + data.byteLength);
+ }
+ return data;
+ } catch (error) {
+ const msg = 'USB bulk read failed (length 0x' + length.toString(16) +
+ '), error="' +
+ error.message + '"';
+ throw new Error(msg);
+ }
}
- return '[' + bytes + ']';
- }
-
-
- return {
- writeRegister: writeReg,
- readRegister: readReg,
- writeRegMask: writeRegMask,
- demod: {
- readRegister: readDemodReg,
- writeRegister: writeDemodReg
- },
- i2c: {
- open: openI2C,
- close: closeI2C,
- readRegister: readI2CReg,
- writeRegister: writeI2CReg,
- readRegBuffer: readI2CRegBuffer
- },
- bulk: {
- readBuffer: readBulk
- },
- iface: {
- claim: claimInterface,
- release: releaseInterface
- },
- writeEach: writeEach
- };
+
+ /**
+ * Claims the USB interface.
+ */
+ async function claimInterface() {
+ await conn.claimInterface(0);
+ }
+
+ /**
+ * Releases the USB interface.
+ */
+ async function releaseInterface() {
+ await conn.releaseInterface(0);
+ }
+
+ /**
+ * Performs several write operations as specified in an array.
+ * @param {Array.>} array The operations to perform.
+ */
+ async function writeEach(array) {
+ for (const element of array) {
+ const line = element;
+ if (line[0] === CMD.REG) {
+ await writeReg(line[1], line[2], line[3], line[4]);
+ } else if (line[0] === CMD.REGMASK) {
+ await writeRegMask(line[1], line[2], line[3], line[4]);
+ } else if (line[0] === CMD.DEMODREG) {
+ await writeDemodReg(line[1], line[2], line[3], line[4]);
+ } else if (line[0] === CMD.I2CREG) {
+ await writeI2CReg(line[1], line[2], line[3]);
+ } else {
+ throw new Error('Unsupported operation [' + line + ']');
+ }
+ }
+ }
+
+ /**
+ * Returns a string representation of a buffer.
+ * @param {ArrayBuffer} buffer The buffer to display.
+ * @return {string} The string representation of the buffer.
+ */
+ function dumpBuffer(buffer) {
+ const bytes = [];
+ const arr = new Uint8Array(buffer);
+ for (let i = 0; i < arr.length; ++i) {
+ bytes.push('0x' + arr[i].toString(16));
+ }
+ return '[' + bytes + ']';
+ }
+
+
+ return {
+ writeRegister: writeReg,
+ readRegister: readReg,
+ writeRegMask: writeRegMask,
+ demod: {
+ readRegister: readDemodReg,
+ writeRegister: writeDemodReg
+ },
+ i2c: {
+ open: openI2C,
+ close: closeI2C,
+ readRegister: readI2CReg,
+ writeRegister: writeI2CReg,
+ readRegBuffer: readI2CRegBuffer
+ },
+ bulk: {
+ readBuffer: readBulk
+ },
+ iface: {
+ claim: claimInterface,
+ release: releaseInterface
+ },
+ writeEach: writeEach
+ };
}
/**
* Commands for writeEach.
*/
-var CMD = {
- REG: 1,
- REGMASK: 2,
- DEMODREG: 3,
- I2CREG: 4
+const CMD = {
+ REG: 1,
+ REGMASK: 2,
+ DEMODREG: 3,
+ I2CREG: 4
};
/**
* Register blocks.
*/
-var BLOCK = {
- DEMOD: 0x000,
- USB: 0x100,
- SYS: 0x200,
- I2C: 0x600
+const BLOCK = {
+ DEMOD: 0x000,
+ USB: 0x100,
+ SYS: 0x200,
+ I2C: 0x600
};
/**
* Device registers.
*/
-var REG = {
- SYSCTL: 0x2000,
- EPA_CTL: 0x2148,
- EPA_MAXPKT: 0x2158,
- DEMOD_CTL: 0x3000,
- DEMOD_CTL_1: 0x300b
+const REG = {
+ SYSCTL: 0x2000,
+ EPA_CTL: 0x2148,
+ EPA_MAXPKT: 0x2158,
+ DEMOD_CTL: 0x3000,
+ DEMOD_CTL_1: 0x300b
};
RtlCom.CMD = CMD;
RtlCom.BLOCK = BLOCK;
RtlCom.REG = REG;
-
-module.exports = RtlCom;
diff --git a/lib/rtlsdr.js b/lib/rtlsdr.js
index ad3b3a7..3a57ce7 100644
--- a/lib/rtlsdr.js
+++ b/lib/rtlsdr.js
@@ -11,72 +11,63 @@
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
-
-const usb = require('./usb');
-const RTL2832U = require('./rtl2832u');
+import {USB as usb} from './web-usb';
+import {RTL2832U} from './rtl2832u';
const FILTERS = [
- {
- vendorId: 0x0bda,
- productId: 0x2832
- },
- {
- vendorId: 0x0bda,
- productId: 0x2838
- }
+ {
+ vendorId: 0x0bda,
+ productId: 0x2832
+ },
+ {
+ vendorId: 0x0bda,
+ productId: 0x2838
+ }
];
-function RtlSdr(usbDevice) {
- this._usbDevice = usbDevice;
- this._rtl2832u = null;
+export function RtlSdr(usbDevice) {
+ this._usbDevice = usbDevice;
+ this._rtl2832u = null;
}
-RtlSdr.prototype.open = async function(options) {
- await this._usbDevice.open();
- await this._usbDevice.selectConfiguration(1);
+RtlSdr.prototype.open = async function (options) {
+ await this._usbDevice.open();
+ await this._usbDevice.selectConfiguration(1);
- this._rtl2832u = new RTL2832U(this._usbDevice, options.ppm || 0, options.gain || null);
+ this._rtl2832u = new RTL2832U(this._usbDevice, options.ppm || 0, options.gain || null);
- await this._rtl2832u.open();
+ await this._rtl2832u.open();
};
-RtlSdr.prototype.setSampleRate = async function(sampleRate) {
- return await this._rtl2832u.setSampleRate(sampleRate);
+RtlSdr.prototype.setSampleRate = async function (sampleRate) {
+ return this._rtl2832u.setSampleRate(sampleRate);
};
-RtlSdr.prototype.setCenterFrequency = async function(centerFrequency) {
- return await this._rtl2832u.setCenterFrequency(centerFrequency);
+RtlSdr.prototype.setCenterFrequency = async function (centerFrequency) {
+ return this._rtl2832u.setCenterFrequency(centerFrequency);
};
-RtlSdr.prototype.resetBuffer = async function() {
- await this._rtl2832u.resetBuffer();
+RtlSdr.prototype.resetBuffer = async function () {
+ await this._rtl2832u.resetBuffer();
};
-RtlSdr.prototype.readSamples = async function(length) {
- return await this._rtl2832u.readSamples(length);
+RtlSdr.prototype.readSamples = async function (length) {
+ return this._rtl2832u.readSamples(length);
};
-RtlSdr.prototype.close = async function() {
- await this._rtl2832u.close();
- await this._usbDevice.close();
+RtlSdr.prototype.close = async function () {
+ await this._rtl2832u.close();
+ await this._usbDevice.close();
};
-RtlSdr.requestDevice = async function() {
- let usbDevice = await usb.requestDevice(FILTERS);
+RtlSdr.requestDevice = async function () {
+ let usbDevice = await usb.requestDevice(FILTERS);
- return new RtlSdr(usbDevice);
+ return new RtlSdr(usbDevice);
};
-RtlSdr.getDevices = async function() {
- let usbDevices = await usb.getDevices(FILTERS);
-
- const sdrs = [];
+RtlSdr.getDevices = async function () {
+ let usbDevices = await usb.getDevices(FILTERS);
- usbDevices.forEach((usbDevice) => {
- sdrs.push(new RtlSdr(usbDevice));
- });
-
- return sdrs;
+ return usbDevices.map((usbDevice) => new RtlSdr(usbDevice));
};
-
-module.exports = RtlSdr;
diff --git a/lib/web-usb.js b/lib/web-usb.js
index 12d8673..45a33c6 100644
--- a/lib/web-usb.js
+++ b/lib/web-usb.js
@@ -12,7 +12,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-function USB(device) {
+export function USB(device) {
this._device = device;
}
@@ -24,12 +24,12 @@ USB.prototype.selectConfiguration = async function(configuration) {
await this._device.selectConfiguration(configuration);
};
-USB.prototype.claimInterface = async function(interface) {
- await this._device.claimInterface(interface);
+USB.prototype.claimInterface = async function(deviceInterface) {
+ await this._device.claimInterface(deviceInterface);
};
-USB.prototype.releaseInterface = async function(interface) {
- await this._device.releaseInterface(interface);
+USB.prototype.releaseInterface = async function(deviceInterface) {
+ await this._device.releaseInterface(deviceInterface);
};
USB.prototype.controlTransfer = async function(ti) {
@@ -60,7 +60,7 @@ USB.requestDevice = async function(filters) {
return new USB(usbDevice);
};
-USB.getDevices = async function(filters, callback) {
+USB.getDevices = async function(filters) {
const usbDevices = navigator.usb.getDevices();
const devices = [];
@@ -74,5 +74,3 @@ USB.getDevices = async function(filters, callback) {
return devices;
};
-
-module.exports = USB;
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 0000000..7606825
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,2916 @@
+{
+ "name": "rtlsdrjs",
+ "version": "0.0.0",
+ "lockfileVersion": 2,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "rtlsdrjs",
+ "version": "0.0.0",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "usb": "^1.3.1"
+ },
+ "devDependencies": {
+ "browserify": "^16.1.1"
+ }
+ },
+ "node_modules/acorn": {
+ "version": "7.4.1",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
+ "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
+ "dev": true,
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/acorn-node": {
+ "version": "1.8.2",
+ "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz",
+ "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==",
+ "dev": true,
+ "dependencies": {
+ "acorn": "^7.0.0",
+ "acorn-walk": "^7.0.0",
+ "xtend": "^4.0.2"
+ }
+ },
+ "node_modules/acorn-walk": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz",
+ "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/asn1.js": {
+ "version": "5.4.1",
+ "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz",
+ "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==",
+ "dev": true,
+ "dependencies": {
+ "bn.js": "^4.0.0",
+ "inherits": "^2.0.1",
+ "minimalistic-assert": "^1.0.0",
+ "safer-buffer": "^2.1.0"
+ }
+ },
+ "node_modules/asn1.js/node_modules/bn.js": {
+ "version": "4.12.0",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
+ "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
+ "dev": true
+ },
+ "node_modules/assert": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz",
+ "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==",
+ "dev": true,
+ "dependencies": {
+ "object-assign": "^4.1.1",
+ "util": "0.10.3"
+ }
+ },
+ "node_modules/assert/node_modules/inherits": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz",
+ "integrity": "sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA==",
+ "dev": true
+ },
+ "node_modules/assert/node_modules/util": {
+ "version": "0.10.3",
+ "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz",
+ "integrity": "sha512-5KiHfsmkqacuKjkRkdV7SsfDJ2EGiPsK92s2MhNSY0craxjTdKTtqKsJaCWp4LW33ZZ0OPUv1WO/TFvNQRiQxQ==",
+ "dev": true,
+ "dependencies": {
+ "inherits": "2.0.1"
+ }
+ },
+ "node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true
+ },
+ "node_modules/base64-js": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
+ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
+ "dev": true,
+ "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/bn.js": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz",
+ "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==",
+ "dev": true
+ },
+ "node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/brorand": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
+ "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==",
+ "dev": true
+ },
+ "node_modules/browser-pack": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-6.1.0.tgz",
+ "integrity": "sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA==",
+ "dev": true,
+ "dependencies": {
+ "combine-source-map": "~0.8.0",
+ "defined": "^1.0.0",
+ "JSONStream": "^1.0.3",
+ "safe-buffer": "^5.1.1",
+ "through2": "^2.0.0",
+ "umd": "^3.0.0"
+ },
+ "bin": {
+ "browser-pack": "bin/cmd.js"
+ }
+ },
+ "node_modules/browser-resolve": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-2.0.0.tgz",
+ "integrity": "sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ==",
+ "dev": true,
+ "dependencies": {
+ "resolve": "^1.17.0"
+ }
+ },
+ "node_modules/browserify": {
+ "version": "16.5.2",
+ "resolved": "https://registry.npmjs.org/browserify/-/browserify-16.5.2.tgz",
+ "integrity": "sha512-TkOR1cQGdmXU9zW4YukWzWVSJwrxmNdADFbqbE3HFgQWe5wqZmOawqZ7J/8MPCwk/W8yY7Y0h+7mOtcZxLP23g==",
+ "dev": true,
+ "dependencies": {
+ "assert": "^1.4.0",
+ "browser-pack": "^6.0.1",
+ "browser-resolve": "^2.0.0",
+ "browserify-zlib": "~0.2.0",
+ "buffer": "~5.2.1",
+ "cached-path-relative": "^1.0.0",
+ "concat-stream": "^1.6.0",
+ "console-browserify": "^1.1.0",
+ "constants-browserify": "~1.0.0",
+ "crypto-browserify": "^3.0.0",
+ "defined": "^1.0.0",
+ "deps-sort": "^2.0.0",
+ "domain-browser": "^1.2.0",
+ "duplexer2": "~0.1.2",
+ "events": "^2.0.0",
+ "glob": "^7.1.0",
+ "has": "^1.0.0",
+ "htmlescape": "^1.1.0",
+ "https-browserify": "^1.0.0",
+ "inherits": "~2.0.1",
+ "insert-module-globals": "^7.0.0",
+ "JSONStream": "^1.0.3",
+ "labeled-stream-splicer": "^2.0.0",
+ "mkdirp-classic": "^0.5.2",
+ "module-deps": "^6.2.3",
+ "os-browserify": "~0.3.0",
+ "parents": "^1.0.1",
+ "path-browserify": "~0.0.0",
+ "process": "~0.11.0",
+ "punycode": "^1.3.2",
+ "querystring-es3": "~0.2.0",
+ "read-only-stream": "^2.0.0",
+ "readable-stream": "^2.0.2",
+ "resolve": "^1.1.4",
+ "shasum": "^1.0.0",
+ "shell-quote": "^1.6.1",
+ "stream-browserify": "^2.0.0",
+ "stream-http": "^3.0.0",
+ "string_decoder": "^1.1.1",
+ "subarg": "^1.0.0",
+ "syntax-error": "^1.1.1",
+ "through2": "^2.0.0",
+ "timers-browserify": "^1.0.1",
+ "tty-browserify": "0.0.1",
+ "url": "~0.11.0",
+ "util": "~0.10.1",
+ "vm-browserify": "^1.0.0",
+ "xtend": "^4.0.0"
+ },
+ "bin": {
+ "browserify": "bin/cmd.js"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/browserify-aes": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz",
+ "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==",
+ "dev": true,
+ "dependencies": {
+ "buffer-xor": "^1.0.3",
+ "cipher-base": "^1.0.0",
+ "create-hash": "^1.1.0",
+ "evp_bytestokey": "^1.0.3",
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "node_modules/browserify-cipher": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz",
+ "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==",
+ "dev": true,
+ "dependencies": {
+ "browserify-aes": "^1.0.4",
+ "browserify-des": "^1.0.0",
+ "evp_bytestokey": "^1.0.0"
+ }
+ },
+ "node_modules/browserify-des": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz",
+ "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==",
+ "dev": true,
+ "dependencies": {
+ "cipher-base": "^1.0.1",
+ "des.js": "^1.0.0",
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.1.2"
+ }
+ },
+ "node_modules/browserify-rsa": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz",
+ "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==",
+ "dev": true,
+ "dependencies": {
+ "bn.js": "^5.0.0",
+ "randombytes": "^2.0.1"
+ }
+ },
+ "node_modules/browserify-sign": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz",
+ "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==",
+ "dev": true,
+ "dependencies": {
+ "bn.js": "^5.1.1",
+ "browserify-rsa": "^4.0.1",
+ "create-hash": "^1.2.0",
+ "create-hmac": "^1.1.7",
+ "elliptic": "^6.5.3",
+ "inherits": "^2.0.4",
+ "parse-asn1": "^5.1.5",
+ "readable-stream": "^3.6.0",
+ "safe-buffer": "^5.2.0"
+ }
+ },
+ "node_modules/browserify-sign/node_modules/readable-stream": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
+ "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+ "dev": true,
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/browserify-zlib": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz",
+ "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==",
+ "dev": true,
+ "dependencies": {
+ "pako": "~1.0.5"
+ }
+ },
+ "node_modules/buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.2.1.tgz",
+ "integrity": "sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg==",
+ "dev": true,
+ "dependencies": {
+ "base64-js": "^1.0.2",
+ "ieee754": "^1.1.4"
+ }
+ },
+ "node_modules/buffer-from": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
+ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
+ "dev": true
+ },
+ "node_modules/buffer-xor": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz",
+ "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==",
+ "dev": true
+ },
+ "node_modules/builtin-status-codes": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz",
+ "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==",
+ "dev": true
+ },
+ "node_modules/cached-path-relative": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.1.0.tgz",
+ "integrity": "sha512-WF0LihfemtesFcJgO7xfOoOcnWzY/QHR4qeDqV44jPU3HTI54+LnfXK3SA27AVVGCdZFgjjFFaqUA9Jx7dMJZA==",
+ "dev": true
+ },
+ "node_modules/cipher-base": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz",
+ "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==",
+ "dev": true,
+ "dependencies": {
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "node_modules/combine-source-map": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz",
+ "integrity": "sha512-UlxQ9Vw0b/Bt/KYwCFqdEwsQ1eL8d1gibiFb7lxQJFdvTgc2hIZi6ugsg+kyhzhPV+QEpUiEIwInIAIrgoEkrg==",
+ "dev": true,
+ "dependencies": {
+ "convert-source-map": "~1.1.0",
+ "inline-source-map": "~0.6.0",
+ "lodash.memoize": "~3.0.3",
+ "source-map": "~0.5.3"
+ }
+ },
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+ "dev": true
+ },
+ "node_modules/concat-stream": {
+ "version": "1.6.2",
+ "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
+ "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
+ "dev": true,
+ "engines": [
+ "node >= 0.8"
+ ],
+ "dependencies": {
+ "buffer-from": "^1.0.0",
+ "inherits": "^2.0.3",
+ "readable-stream": "^2.2.2",
+ "typedarray": "^0.0.6"
+ }
+ },
+ "node_modules/console-browserify": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz",
+ "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==",
+ "dev": true
+ },
+ "node_modules/constants-browserify": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz",
+ "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==",
+ "dev": true
+ },
+ "node_modules/convert-source-map": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz",
+ "integrity": "sha512-Y8L5rp6jo+g9VEPgvqNfEopjTR4OTYct8lXlS8iVQdmnjDvbdbzYe9rjtFCB9egC86JoNCU61WRY+ScjkZpnIg==",
+ "dev": true
+ },
+ "node_modules/core-util-is": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
+ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
+ "dev": true
+ },
+ "node_modules/create-ecdh": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz",
+ "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==",
+ "dev": true,
+ "dependencies": {
+ "bn.js": "^4.1.0",
+ "elliptic": "^6.5.3"
+ }
+ },
+ "node_modules/create-ecdh/node_modules/bn.js": {
+ "version": "4.12.0",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
+ "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
+ "dev": true
+ },
+ "node_modules/create-hash": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz",
+ "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==",
+ "dev": true,
+ "dependencies": {
+ "cipher-base": "^1.0.1",
+ "inherits": "^2.0.1",
+ "md5.js": "^1.3.4",
+ "ripemd160": "^2.0.1",
+ "sha.js": "^2.4.0"
+ }
+ },
+ "node_modules/create-hmac": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz",
+ "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==",
+ "dev": true,
+ "dependencies": {
+ "cipher-base": "^1.0.3",
+ "create-hash": "^1.1.0",
+ "inherits": "^2.0.1",
+ "ripemd160": "^2.0.0",
+ "safe-buffer": "^5.0.1",
+ "sha.js": "^2.4.8"
+ }
+ },
+ "node_modules/crypto-browserify": {
+ "version": "3.12.0",
+ "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz",
+ "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==",
+ "dev": true,
+ "dependencies": {
+ "browserify-cipher": "^1.0.0",
+ "browserify-sign": "^4.0.0",
+ "create-ecdh": "^4.0.0",
+ "create-hash": "^1.1.0",
+ "create-hmac": "^1.1.0",
+ "diffie-hellman": "^5.0.0",
+ "inherits": "^2.0.1",
+ "pbkdf2": "^3.0.3",
+ "public-encrypt": "^4.0.0",
+ "randombytes": "^2.0.0",
+ "randomfill": "^1.0.3"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/dash-ast": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/dash-ast/-/dash-ast-1.0.0.tgz",
+ "integrity": "sha512-Vy4dx7gquTeMcQR/hDkYLGUnwVil6vk4FOOct+djUnHOUWt+zJPJAaRIXaAFkPXtJjvlY7o3rfRu0/3hpnwoUA==",
+ "dev": true
+ },
+ "node_modules/defined": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz",
+ "integrity": "sha512-Y2caI5+ZwS5c3RiNDJ6u53VhQHv+hHKwhkI1iHvceKUHw9Df6EK2zRLfjejRgMuCuxK7PfSWIMwWecceVvThjQ==",
+ "dev": true
+ },
+ "node_modules/deps-sort": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/deps-sort/-/deps-sort-2.0.1.tgz",
+ "integrity": "sha512-1orqXQr5po+3KI6kQb9A4jnXT1PBwggGl2d7Sq2xsnOeI9GPcE/tGcF9UiSZtZBM7MukY4cAh7MemS6tZYipfw==",
+ "dev": true,
+ "dependencies": {
+ "JSONStream": "^1.0.3",
+ "shasum-object": "^1.0.0",
+ "subarg": "^1.0.0",
+ "through2": "^2.0.0"
+ },
+ "bin": {
+ "deps-sort": "bin/cmd.js"
+ }
+ },
+ "node_modules/des.js": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz",
+ "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==",
+ "dev": true,
+ "dependencies": {
+ "inherits": "^2.0.1",
+ "minimalistic-assert": "^1.0.0"
+ }
+ },
+ "node_modules/detective": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.1.tgz",
+ "integrity": "sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==",
+ "dev": true,
+ "dependencies": {
+ "acorn-node": "^1.8.2",
+ "defined": "^1.0.0",
+ "minimist": "^1.2.6"
+ },
+ "bin": {
+ "detective": "bin/detective.js"
+ },
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/diffie-hellman": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz",
+ "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==",
+ "dev": true,
+ "dependencies": {
+ "bn.js": "^4.1.0",
+ "miller-rabin": "^4.0.0",
+ "randombytes": "^2.0.0"
+ }
+ },
+ "node_modules/diffie-hellman/node_modules/bn.js": {
+ "version": "4.12.0",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
+ "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
+ "dev": true
+ },
+ "node_modules/domain-browser": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz",
+ "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.4",
+ "npm": ">=1.2"
+ }
+ },
+ "node_modules/duplexer2": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz",
+ "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==",
+ "dev": true,
+ "dependencies": {
+ "readable-stream": "^2.0.2"
+ }
+ },
+ "node_modules/elliptic": {
+ "version": "6.5.4",
+ "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz",
+ "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==",
+ "dev": true,
+ "dependencies": {
+ "bn.js": "^4.11.9",
+ "brorand": "^1.1.0",
+ "hash.js": "^1.0.0",
+ "hmac-drbg": "^1.0.1",
+ "inherits": "^2.0.4",
+ "minimalistic-assert": "^1.0.1",
+ "minimalistic-crypto-utils": "^1.0.1"
+ }
+ },
+ "node_modules/elliptic/node_modules/bn.js": {
+ "version": "4.12.0",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
+ "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
+ "dev": true
+ },
+ "node_modules/events": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/events/-/events-2.1.0.tgz",
+ "integrity": "sha512-3Zmiobend8P9DjmKAty0Era4jV8oJ0yGYe2nJJAxgymF9+N8F2m0hhZiMoWtcfepExzNKZumFU3ksdQbInGWCg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.4.x"
+ }
+ },
+ "node_modules/evp_bytestokey": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz",
+ "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==",
+ "dev": true,
+ "dependencies": {
+ "md5.js": "^1.3.4",
+ "safe-buffer": "^5.1.1"
+ }
+ },
+ "node_modules/fast-safe-stringify": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz",
+ "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==",
+ "dev": true
+ },
+ "node_modules/fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
+ "dev": true
+ },
+ "node_modules/function-bind": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
+ "dev": true
+ },
+ "node_modules/get-assigned-identifiers": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz",
+ "integrity": "sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ==",
+ "dev": true
+ },
+ "node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "dev": true,
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/has": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+ "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+ "dev": true,
+ "dependencies": {
+ "function-bind": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4.0"
+ }
+ },
+ "node_modules/hash-base": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz",
+ "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==",
+ "dev": true,
+ "dependencies": {
+ "inherits": "^2.0.4",
+ "readable-stream": "^3.6.0",
+ "safe-buffer": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/hash-base/node_modules/readable-stream": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
+ "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+ "dev": true,
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/hash.js": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz",
+ "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==",
+ "dev": true,
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "minimalistic-assert": "^1.0.1"
+ }
+ },
+ "node_modules/hmac-drbg": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
+ "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==",
+ "dev": true,
+ "dependencies": {
+ "hash.js": "^1.0.3",
+ "minimalistic-assert": "^1.0.0",
+ "minimalistic-crypto-utils": "^1.0.1"
+ }
+ },
+ "node_modules/htmlescape": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz",
+ "integrity": "sha512-eVcrzgbR4tim7c7soKQKtxa/kQM4TzjnlU83rcZ9bHU6t31ehfV7SktN6McWgwPWg+JYMA/O3qpGxBvFq1z2Jg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/https-browserify": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz",
+ "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==",
+ "dev": true
+ },
+ "node_modules/ieee754": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
+ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
+ "dev": true,
+ "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/inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+ "dev": true,
+ "dependencies": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "dev": true
+ },
+ "node_modules/inline-source-map": {
+ "version": "0.6.2",
+ "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz",
+ "integrity": "sha512-0mVWSSbNDvedDWIN4wxLsdPM4a7cIPcpyMxj3QZ406QRwQ6ePGB1YIHxVPjqpcUGbWQ5C+nHTwGNWAGvt7ggVA==",
+ "dev": true,
+ "dependencies": {
+ "source-map": "~0.5.3"
+ }
+ },
+ "node_modules/insert-module-globals": {
+ "version": "7.2.1",
+ "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-7.2.1.tgz",
+ "integrity": "sha512-ufS5Qq9RZN+Bu899eA9QCAYThY+gGW7oRkmb0vC93Vlyu/CFGcH0OYPEjVkDXA5FEbTt1+VWzdoOD3Ny9N+8tg==",
+ "dev": true,
+ "dependencies": {
+ "acorn-node": "^1.5.2",
+ "combine-source-map": "^0.8.0",
+ "concat-stream": "^1.6.1",
+ "is-buffer": "^1.1.0",
+ "JSONStream": "^1.0.3",
+ "path-is-absolute": "^1.0.1",
+ "process": "~0.11.0",
+ "through2": "^2.0.0",
+ "undeclared-identifiers": "^1.1.2",
+ "xtend": "^4.0.0"
+ },
+ "bin": {
+ "insert-module-globals": "bin/cmd.js"
+ }
+ },
+ "node_modules/is-buffer": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
+ "dev": true
+ },
+ "node_modules/is-core-module": {
+ "version": "2.10.0",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz",
+ "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==",
+ "dev": true,
+ "dependencies": {
+ "has": "^1.0.3"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
+ "dev": true
+ },
+ "node_modules/json-stable-stringify": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz",
+ "integrity": "sha512-nKtD/Qxm7tWdZqJoldEC7fF0S41v0mWbeaXG3637stOWfyGxTgWTYE2wtfKmjzpvxv2MA2xzxsXOIiwUpkX6Qw==",
+ "dev": true,
+ "dependencies": {
+ "jsonify": "~0.0.0"
+ }
+ },
+ "node_modules/jsonify": {
+ "version": "0.0.0",
+ "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz",
+ "integrity": "sha512-trvBk1ki43VZptdBI5rIlG4YOzyeH/WefQt5rj1grasPn4iiZWKet8nkgc4GlsAylaztn0qZfUYOiTsASJFdNA==",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/jsonparse": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz",
+ "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==",
+ "dev": true,
+ "engines": [
+ "node >= 0.2.0"
+ ]
+ },
+ "node_modules/JSONStream": {
+ "version": "1.3.5",
+ "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz",
+ "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==",
+ "dev": true,
+ "dependencies": {
+ "jsonparse": "^1.2.0",
+ "through": ">=2.2.7 <3"
+ },
+ "bin": {
+ "JSONStream": "bin.js"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/labeled-stream-splicer": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-2.0.2.tgz",
+ "integrity": "sha512-Ca4LSXFFZUjPScRaqOcFxneA0VpKZr4MMYCljyQr4LIewTLb3Y0IUTIsnBBsVubIeEfxeSZpSjSsRM8APEQaAw==",
+ "dev": true,
+ "dependencies": {
+ "inherits": "^2.0.1",
+ "stream-splicer": "^2.0.0"
+ }
+ },
+ "node_modules/lodash.memoize": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz",
+ "integrity": "sha512-eDn9kqrAmVUC1wmZvlQ6Uhde44n+tXpqPrN8olQJbttgh0oKclk+SF54P47VEGE9CEiMeRwAP8BaM7UHvBkz2A==",
+ "dev": true
+ },
+ "node_modules/md5.js": {
+ "version": "1.3.5",
+ "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz",
+ "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==",
+ "dev": true,
+ "dependencies": {
+ "hash-base": "^3.0.0",
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.1.2"
+ }
+ },
+ "node_modules/miller-rabin": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz",
+ "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==",
+ "dev": true,
+ "dependencies": {
+ "bn.js": "^4.0.0",
+ "brorand": "^1.0.1"
+ },
+ "bin": {
+ "miller-rabin": "bin/miller-rabin"
+ }
+ },
+ "node_modules/miller-rabin/node_modules/bn.js": {
+ "version": "4.12.0",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
+ "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
+ "dev": true
+ },
+ "node_modules/minimalistic-assert": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
+ "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==",
+ "dev": true
+ },
+ "node_modules/minimalistic-crypto-utils": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz",
+ "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==",
+ "dev": true
+ },
+ "node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/minimist": {
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz",
+ "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==",
+ "dev": true
+ },
+ "node_modules/mkdirp-classic": {
+ "version": "0.5.3",
+ "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz",
+ "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==",
+ "dev": true
+ },
+ "node_modules/module-deps": {
+ "version": "6.2.3",
+ "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-6.2.3.tgz",
+ "integrity": "sha512-fg7OZaQBcL4/L+AK5f4iVqf9OMbCclXfy/znXRxTVhJSeW5AIlS9AwheYwDaXM3lVW7OBeaeUEY3gbaC6cLlSA==",
+ "dev": true,
+ "dependencies": {
+ "browser-resolve": "^2.0.0",
+ "cached-path-relative": "^1.0.2",
+ "concat-stream": "~1.6.0",
+ "defined": "^1.0.0",
+ "detective": "^5.2.0",
+ "duplexer2": "^0.1.2",
+ "inherits": "^2.0.1",
+ "JSONStream": "^1.0.3",
+ "parents": "^1.0.0",
+ "readable-stream": "^2.0.2",
+ "resolve": "^1.4.0",
+ "stream-combiner2": "^1.1.1",
+ "subarg": "^1.0.0",
+ "through2": "^2.0.0",
+ "xtend": "^4.0.0"
+ },
+ "bin": {
+ "module-deps": "bin/cmd.js"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "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/node-gyp-build": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.5.0.tgz",
+ "integrity": "sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg==",
+ "bin": {
+ "node-gyp-build": "bin.js",
+ "node-gyp-build-optional": "optional.js",
+ "node-gyp-build-test": "build-test.js"
+ }
+ },
+ "node_modules/object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "dev": true,
+ "dependencies": {
+ "wrappy": "1"
+ }
+ },
+ "node_modules/os-browserify": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz",
+ "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==",
+ "dev": true
+ },
+ "node_modules/pako": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
+ "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==",
+ "dev": true
+ },
+ "node_modules/parents": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz",
+ "integrity": "sha512-mXKF3xkoUt5td2DoxpLmtOmZvko9VfFpwRwkKDHSNvgmpLAeBo18YDhcPbBzJq+QLCHMbGOfzia2cX4U+0v9Mg==",
+ "dev": true,
+ "dependencies": {
+ "path-platform": "~0.11.15"
+ }
+ },
+ "node_modules/parse-asn1": {
+ "version": "5.1.6",
+ "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz",
+ "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==",
+ "dev": true,
+ "dependencies": {
+ "asn1.js": "^5.2.0",
+ "browserify-aes": "^1.0.0",
+ "evp_bytestokey": "^1.0.0",
+ "pbkdf2": "^3.0.3",
+ "safe-buffer": "^5.1.1"
+ }
+ },
+ "node_modules/path-browserify": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz",
+ "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==",
+ "dev": true
+ },
+ "node_modules/path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/path-parse": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+ "dev": true
+ },
+ "node_modules/path-platform": {
+ "version": "0.11.15",
+ "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz",
+ "integrity": "sha512-Y30dB6rab1A/nfEKsZxmr01nUotHX0c/ZiIAsCTatEe1CmS5Pm5He7fZ195bPT7RdquoaL8lLxFCMQi/bS7IJg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/pbkdf2": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz",
+ "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==",
+ "dev": true,
+ "dependencies": {
+ "create-hash": "^1.1.2",
+ "create-hmac": "^1.1.4",
+ "ripemd160": "^2.0.1",
+ "safe-buffer": "^5.0.1",
+ "sha.js": "^2.4.8"
+ },
+ "engines": {
+ "node": ">=0.12"
+ }
+ },
+ "node_modules/process": {
+ "version": "0.11.10",
+ "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
+ "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6.0"
+ }
+ },
+ "node_modules/process-nextick-args": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
+ "dev": true
+ },
+ "node_modules/public-encrypt": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz",
+ "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==",
+ "dev": true,
+ "dependencies": {
+ "bn.js": "^4.1.0",
+ "browserify-rsa": "^4.0.0",
+ "create-hash": "^1.1.0",
+ "parse-asn1": "^5.0.0",
+ "randombytes": "^2.0.1",
+ "safe-buffer": "^5.1.2"
+ }
+ },
+ "node_modules/public-encrypt/node_modules/bn.js": {
+ "version": "4.12.0",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
+ "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
+ "dev": true
+ },
+ "node_modules/punycode": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
+ "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==",
+ "dev": true
+ },
+ "node_modules/querystring": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz",
+ "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==",
+ "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.",
+ "dev": true,
+ "engines": {
+ "node": ">=0.4.x"
+ }
+ },
+ "node_modules/querystring-es3": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz",
+ "integrity": "sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.4.x"
+ }
+ },
+ "node_modules/randombytes": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
+ "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
+ "dev": true,
+ "dependencies": {
+ "safe-buffer": "^5.1.0"
+ }
+ },
+ "node_modules/randomfill": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz",
+ "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==",
+ "dev": true,
+ "dependencies": {
+ "randombytes": "^2.0.5",
+ "safe-buffer": "^5.1.0"
+ }
+ },
+ "node_modules/read-only-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/read-only-stream/-/read-only-stream-2.0.0.tgz",
+ "integrity": "sha512-3ALe0bjBVZtkdWKIcThYpQCLbBMd/+Tbh2CDSrAIDO3UsZ4Xs+tnyjv2MjCOMMgBG+AsUOeuP1cgtY1INISc8w==",
+ "dev": true,
+ "dependencies": {
+ "readable-stream": "^2.0.2"
+ }
+ },
+ "node_modules/readable-stream": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+ "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ "dev": true,
+ "dependencies": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "node_modules/readable-stream/node_modules/safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+ "dev": true
+ },
+ "node_modules/readable-stream/node_modules/string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "dev": true,
+ "dependencies": {
+ "safe-buffer": "~5.1.0"
+ }
+ },
+ "node_modules/resolve": {
+ "version": "1.22.1",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz",
+ "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==",
+ "dev": true,
+ "dependencies": {
+ "is-core-module": "^2.9.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ },
+ "bin": {
+ "resolve": "bin/resolve"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/ripemd160": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz",
+ "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==",
+ "dev": true,
+ "dependencies": {
+ "hash-base": "^3.0.0",
+ "inherits": "^2.0.1"
+ }
+ },
+ "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==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+ "dev": true
+ },
+ "node_modules/sha.js": {
+ "version": "2.4.11",
+ "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz",
+ "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==",
+ "dev": true,
+ "dependencies": {
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.0.1"
+ },
+ "bin": {
+ "sha.js": "bin.js"
+ }
+ },
+ "node_modules/shasum": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/shasum/-/shasum-1.0.2.tgz",
+ "integrity": "sha512-UTzHm/+AzKfO9RgPgRpDIuMSNie1ubXRaljjlhFMNGYoG7z+rm9AHLPMf70R7887xboDH9Q+5YQbWKObFHEAtw==",
+ "dev": true,
+ "dependencies": {
+ "json-stable-stringify": "~0.0.0",
+ "sha.js": "~2.4.4"
+ }
+ },
+ "node_modules/shasum-object": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/shasum-object/-/shasum-object-1.0.0.tgz",
+ "integrity": "sha512-Iqo5rp/3xVi6M4YheapzZhhGPVs0yZwHj7wvwQ1B9z8H6zk+FEnI7y3Teq7qwnekfEhu8WmG2z0z4iWZaxLWVg==",
+ "dev": true,
+ "dependencies": {
+ "fast-safe-stringify": "^2.0.7"
+ }
+ },
+ "node_modules/shell-quote": {
+ "version": "1.7.3",
+ "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.3.tgz",
+ "integrity": "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==",
+ "dev": true
+ },
+ "node_modules/simple-concat": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz",
+ "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==",
+ "dev": true,
+ "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/source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/stream-browserify": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz",
+ "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==",
+ "dev": true,
+ "dependencies": {
+ "inherits": "~2.0.1",
+ "readable-stream": "^2.0.2"
+ }
+ },
+ "node_modules/stream-combiner2": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz",
+ "integrity": "sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==",
+ "dev": true,
+ "dependencies": {
+ "duplexer2": "~0.1.0",
+ "readable-stream": "^2.0.2"
+ }
+ },
+ "node_modules/stream-http": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.2.0.tgz",
+ "integrity": "sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==",
+ "dev": true,
+ "dependencies": {
+ "builtin-status-codes": "^3.0.0",
+ "inherits": "^2.0.4",
+ "readable-stream": "^3.6.0",
+ "xtend": "^4.0.2"
+ }
+ },
+ "node_modules/stream-http/node_modules/readable-stream": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
+ "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+ "dev": true,
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/stream-splicer": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-2.0.1.tgz",
+ "integrity": "sha512-Xizh4/NPuYSyAXyT7g8IvdJ9HJpxIGL9PjyhtywCZvvP0OPIdqyrr4dMikeuvY8xahpdKEBlBTySe583totajg==",
+ "dev": true,
+ "dependencies": {
+ "inherits": "^2.0.1",
+ "readable-stream": "^2.0.2"
+ }
+ },
+ "node_modules/string_decoder": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+ "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+ "dev": true,
+ "dependencies": {
+ "safe-buffer": "~5.2.0"
+ }
+ },
+ "node_modules/subarg": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz",
+ "integrity": "sha512-RIrIdRY0X1xojthNcVtgT9sjpOGagEUKpZdgBUi054OEPFo282yg+zE+t1Rj3+RqKq2xStL7uUHhY+AjbC4BXg==",
+ "dev": true,
+ "dependencies": {
+ "minimist": "^1.1.0"
+ }
+ },
+ "node_modules/supports-preserve-symlinks-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/syntax-error": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.4.0.tgz",
+ "integrity": "sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w==",
+ "dev": true,
+ "dependencies": {
+ "acorn-node": "^1.2.0"
+ }
+ },
+ "node_modules/through": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
+ "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==",
+ "dev": true
+ },
+ "node_modules/through2": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
+ "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
+ "dev": true,
+ "dependencies": {
+ "readable-stream": "~2.3.6",
+ "xtend": "~4.0.1"
+ }
+ },
+ "node_modules/timers-browserify": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz",
+ "integrity": "sha512-PIxwAupJZiYU4JmVZYwXp9FKsHMXb5h0ZEFyuXTAn8WLHOlcij+FEcbrvDsom1o5dr1YggEtFbECvGCW2sT53Q==",
+ "dev": true,
+ "dependencies": {
+ "process": "~0.11.0"
+ },
+ "engines": {
+ "node": ">=0.6.0"
+ }
+ },
+ "node_modules/tty-browserify": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz",
+ "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==",
+ "dev": true
+ },
+ "node_modules/typedarray": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
+ "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==",
+ "dev": true
+ },
+ "node_modules/umd": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/umd/-/umd-3.0.3.tgz",
+ "integrity": "sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow==",
+ "dev": true,
+ "bin": {
+ "umd": "bin/cli.js"
+ }
+ },
+ "node_modules/undeclared-identifiers": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/undeclared-identifiers/-/undeclared-identifiers-1.1.3.tgz",
+ "integrity": "sha512-pJOW4nxjlmfwKApE4zvxLScM/njmwj/DiUBv7EabwE4O8kRUy+HIwxQtZLBPll/jx1LJyBcqNfB3/cpv9EZwOw==",
+ "dev": true,
+ "dependencies": {
+ "acorn-node": "^1.3.0",
+ "dash-ast": "^1.0.0",
+ "get-assigned-identifiers": "^1.2.0",
+ "simple-concat": "^1.0.0",
+ "xtend": "^4.0.1"
+ },
+ "bin": {
+ "undeclared-identifiers": "bin.js"
+ }
+ },
+ "node_modules/url": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz",
+ "integrity": "sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ==",
+ "dev": true,
+ "dependencies": {
+ "punycode": "1.3.2",
+ "querystring": "0.2.0"
+ }
+ },
+ "node_modules/url/node_modules/punycode": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
+ "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==",
+ "dev": true
+ },
+ "node_modules/usb": {
+ "version": "1.9.2",
+ "resolved": "https://registry.npmjs.org/usb/-/usb-1.9.2.tgz",
+ "integrity": "sha512-dryNz030LWBPAf6gj8vyq0Iev3vPbCLHCT8dBw3gQRXRzVNsIdeuU+VjPp3ksmSPkeMAl1k+kQ14Ij0QHyeiAg==",
+ "hasInstallScript": true,
+ "dependencies": {
+ "node-addon-api": "^4.2.0",
+ "node-gyp-build": "^4.3.0"
+ },
+ "engines": {
+ "node": ">=10.16.0"
+ }
+ },
+ "node_modules/util": {
+ "version": "0.10.4",
+ "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz",
+ "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==",
+ "dev": true,
+ "dependencies": {
+ "inherits": "2.0.3"
+ }
+ },
+ "node_modules/util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
+ "dev": true
+ },
+ "node_modules/util/node_modules/inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==",
+ "dev": true
+ },
+ "node_modules/vm-browserify": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz",
+ "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==",
+ "dev": true
+ },
+ "node_modules/wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
+ "dev": true
+ },
+ "node_modules/xtend": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
+ "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.4"
+ }
+ }
+ },
+ "dependencies": {
+ "acorn": {
+ "version": "7.4.1",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
+ "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
+ "dev": true
+ },
+ "acorn-node": {
+ "version": "1.8.2",
+ "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz",
+ "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==",
+ "dev": true,
+ "requires": {
+ "acorn": "^7.0.0",
+ "acorn-walk": "^7.0.0",
+ "xtend": "^4.0.2"
+ }
+ },
+ "acorn-walk": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz",
+ "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==",
+ "dev": true
+ },
+ "asn1.js": {
+ "version": "5.4.1",
+ "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz",
+ "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==",
+ "dev": true,
+ "requires": {
+ "bn.js": "^4.0.0",
+ "inherits": "^2.0.1",
+ "minimalistic-assert": "^1.0.0",
+ "safer-buffer": "^2.1.0"
+ },
+ "dependencies": {
+ "bn.js": {
+ "version": "4.12.0",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
+ "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
+ "dev": true
+ }
+ }
+ },
+ "assert": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz",
+ "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==",
+ "dev": true,
+ "requires": {
+ "object-assign": "^4.1.1",
+ "util": "0.10.3"
+ },
+ "dependencies": {
+ "inherits": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz",
+ "integrity": "sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA==",
+ "dev": true
+ },
+ "util": {
+ "version": "0.10.3",
+ "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz",
+ "integrity": "sha512-5KiHfsmkqacuKjkRkdV7SsfDJ2EGiPsK92s2MhNSY0craxjTdKTtqKsJaCWp4LW33ZZ0OPUv1WO/TFvNQRiQxQ==",
+ "dev": true,
+ "requires": {
+ "inherits": "2.0.1"
+ }
+ }
+ }
+ },
+ "balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true
+ },
+ "base64-js": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
+ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
+ "dev": true
+ },
+ "bn.js": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz",
+ "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==",
+ "dev": true
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "requires": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "brorand": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
+ "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==",
+ "dev": true
+ },
+ "browser-pack": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-6.1.0.tgz",
+ "integrity": "sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA==",
+ "dev": true,
+ "requires": {
+ "combine-source-map": "~0.8.0",
+ "defined": "^1.0.0",
+ "JSONStream": "^1.0.3",
+ "safe-buffer": "^5.1.1",
+ "through2": "^2.0.0",
+ "umd": "^3.0.0"
+ }
+ },
+ "browser-resolve": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-2.0.0.tgz",
+ "integrity": "sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ==",
+ "dev": true,
+ "requires": {
+ "resolve": "^1.17.0"
+ }
+ },
+ "browserify": {
+ "version": "16.5.2",
+ "resolved": "https://registry.npmjs.org/browserify/-/browserify-16.5.2.tgz",
+ "integrity": "sha512-TkOR1cQGdmXU9zW4YukWzWVSJwrxmNdADFbqbE3HFgQWe5wqZmOawqZ7J/8MPCwk/W8yY7Y0h+7mOtcZxLP23g==",
+ "dev": true,
+ "requires": {
+ "assert": "^1.4.0",
+ "browser-pack": "^6.0.1",
+ "browser-resolve": "^2.0.0",
+ "browserify-zlib": "~0.2.0",
+ "buffer": "~5.2.1",
+ "cached-path-relative": "^1.0.0",
+ "concat-stream": "^1.6.0",
+ "console-browserify": "^1.1.0",
+ "constants-browserify": "~1.0.0",
+ "crypto-browserify": "^3.0.0",
+ "defined": "^1.0.0",
+ "deps-sort": "^2.0.0",
+ "domain-browser": "^1.2.0",
+ "duplexer2": "~0.1.2",
+ "events": "^2.0.0",
+ "glob": "^7.1.0",
+ "has": "^1.0.0",
+ "htmlescape": "^1.1.0",
+ "https-browserify": "^1.0.0",
+ "inherits": "~2.0.1",
+ "insert-module-globals": "^7.0.0",
+ "JSONStream": "^1.0.3",
+ "labeled-stream-splicer": "^2.0.0",
+ "mkdirp-classic": "^0.5.2",
+ "module-deps": "^6.2.3",
+ "os-browserify": "~0.3.0",
+ "parents": "^1.0.1",
+ "path-browserify": "~0.0.0",
+ "process": "~0.11.0",
+ "punycode": "^1.3.2",
+ "querystring-es3": "~0.2.0",
+ "read-only-stream": "^2.0.0",
+ "readable-stream": "^2.0.2",
+ "resolve": "^1.1.4",
+ "shasum": "^1.0.0",
+ "shell-quote": "^1.6.1",
+ "stream-browserify": "^2.0.0",
+ "stream-http": "^3.0.0",
+ "string_decoder": "^1.1.1",
+ "subarg": "^1.0.0",
+ "syntax-error": "^1.1.1",
+ "through2": "^2.0.0",
+ "timers-browserify": "^1.0.1",
+ "tty-browserify": "0.0.1",
+ "url": "~0.11.0",
+ "util": "~0.10.1",
+ "vm-browserify": "^1.0.0",
+ "xtend": "^4.0.0"
+ }
+ },
+ "browserify-aes": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz",
+ "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==",
+ "dev": true,
+ "requires": {
+ "buffer-xor": "^1.0.3",
+ "cipher-base": "^1.0.0",
+ "create-hash": "^1.1.0",
+ "evp_bytestokey": "^1.0.3",
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "browserify-cipher": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz",
+ "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==",
+ "dev": true,
+ "requires": {
+ "browserify-aes": "^1.0.4",
+ "browserify-des": "^1.0.0",
+ "evp_bytestokey": "^1.0.0"
+ }
+ },
+ "browserify-des": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz",
+ "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==",
+ "dev": true,
+ "requires": {
+ "cipher-base": "^1.0.1",
+ "des.js": "^1.0.0",
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.1.2"
+ }
+ },
+ "browserify-rsa": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz",
+ "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==",
+ "dev": true,
+ "requires": {
+ "bn.js": "^5.0.0",
+ "randombytes": "^2.0.1"
+ }
+ },
+ "browserify-sign": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz",
+ "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==",
+ "dev": true,
+ "requires": {
+ "bn.js": "^5.1.1",
+ "browserify-rsa": "^4.0.1",
+ "create-hash": "^1.2.0",
+ "create-hmac": "^1.1.7",
+ "elliptic": "^6.5.3",
+ "inherits": "^2.0.4",
+ "parse-asn1": "^5.1.5",
+ "readable-stream": "^3.6.0",
+ "safe-buffer": "^5.2.0"
+ },
+ "dependencies": {
+ "readable-stream": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
+ "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+ "dev": true,
+ "requires": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ }
+ }
+ }
+ },
+ "browserify-zlib": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz",
+ "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==",
+ "dev": true,
+ "requires": {
+ "pako": "~1.0.5"
+ }
+ },
+ "buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.2.1.tgz",
+ "integrity": "sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg==",
+ "dev": true,
+ "requires": {
+ "base64-js": "^1.0.2",
+ "ieee754": "^1.1.4"
+ }
+ },
+ "buffer-from": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
+ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
+ "dev": true
+ },
+ "buffer-xor": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz",
+ "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==",
+ "dev": true
+ },
+ "builtin-status-codes": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz",
+ "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==",
+ "dev": true
+ },
+ "cached-path-relative": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.1.0.tgz",
+ "integrity": "sha512-WF0LihfemtesFcJgO7xfOoOcnWzY/QHR4qeDqV44jPU3HTI54+LnfXK3SA27AVVGCdZFgjjFFaqUA9Jx7dMJZA==",
+ "dev": true
+ },
+ "cipher-base": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz",
+ "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==",
+ "dev": true,
+ "requires": {
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "combine-source-map": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz",
+ "integrity": "sha512-UlxQ9Vw0b/Bt/KYwCFqdEwsQ1eL8d1gibiFb7lxQJFdvTgc2hIZi6ugsg+kyhzhPV+QEpUiEIwInIAIrgoEkrg==",
+ "dev": true,
+ "requires": {
+ "convert-source-map": "~1.1.0",
+ "inline-source-map": "~0.6.0",
+ "lodash.memoize": "~3.0.3",
+ "source-map": "~0.5.3"
+ }
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+ "dev": true
+ },
+ "concat-stream": {
+ "version": "1.6.2",
+ "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
+ "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
+ "dev": true,
+ "requires": {
+ "buffer-from": "^1.0.0",
+ "inherits": "^2.0.3",
+ "readable-stream": "^2.2.2",
+ "typedarray": "^0.0.6"
+ }
+ },
+ "console-browserify": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz",
+ "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==",
+ "dev": true
+ },
+ "constants-browserify": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz",
+ "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==",
+ "dev": true
+ },
+ "convert-source-map": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz",
+ "integrity": "sha512-Y8L5rp6jo+g9VEPgvqNfEopjTR4OTYct8lXlS8iVQdmnjDvbdbzYe9rjtFCB9egC86JoNCU61WRY+ScjkZpnIg==",
+ "dev": true
+ },
+ "core-util-is": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
+ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
+ "dev": true
+ },
+ "create-ecdh": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz",
+ "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==",
+ "dev": true,
+ "requires": {
+ "bn.js": "^4.1.0",
+ "elliptic": "^6.5.3"
+ },
+ "dependencies": {
+ "bn.js": {
+ "version": "4.12.0",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
+ "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
+ "dev": true
+ }
+ }
+ },
+ "create-hash": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz",
+ "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==",
+ "dev": true,
+ "requires": {
+ "cipher-base": "^1.0.1",
+ "inherits": "^2.0.1",
+ "md5.js": "^1.3.4",
+ "ripemd160": "^2.0.1",
+ "sha.js": "^2.4.0"
+ }
+ },
+ "create-hmac": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz",
+ "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==",
+ "dev": true,
+ "requires": {
+ "cipher-base": "^1.0.3",
+ "create-hash": "^1.1.0",
+ "inherits": "^2.0.1",
+ "ripemd160": "^2.0.0",
+ "safe-buffer": "^5.0.1",
+ "sha.js": "^2.4.8"
+ }
+ },
+ "crypto-browserify": {
+ "version": "3.12.0",
+ "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz",
+ "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==",
+ "dev": true,
+ "requires": {
+ "browserify-cipher": "^1.0.0",
+ "browserify-sign": "^4.0.0",
+ "create-ecdh": "^4.0.0",
+ "create-hash": "^1.1.0",
+ "create-hmac": "^1.1.0",
+ "diffie-hellman": "^5.0.0",
+ "inherits": "^2.0.1",
+ "pbkdf2": "^3.0.3",
+ "public-encrypt": "^4.0.0",
+ "randombytes": "^2.0.0",
+ "randomfill": "^1.0.3"
+ }
+ },
+ "dash-ast": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/dash-ast/-/dash-ast-1.0.0.tgz",
+ "integrity": "sha512-Vy4dx7gquTeMcQR/hDkYLGUnwVil6vk4FOOct+djUnHOUWt+zJPJAaRIXaAFkPXtJjvlY7o3rfRu0/3hpnwoUA==",
+ "dev": true
+ },
+ "defined": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz",
+ "integrity": "sha512-Y2caI5+ZwS5c3RiNDJ6u53VhQHv+hHKwhkI1iHvceKUHw9Df6EK2zRLfjejRgMuCuxK7PfSWIMwWecceVvThjQ==",
+ "dev": true
+ },
+ "deps-sort": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/deps-sort/-/deps-sort-2.0.1.tgz",
+ "integrity": "sha512-1orqXQr5po+3KI6kQb9A4jnXT1PBwggGl2d7Sq2xsnOeI9GPcE/tGcF9UiSZtZBM7MukY4cAh7MemS6tZYipfw==",
+ "dev": true,
+ "requires": {
+ "JSONStream": "^1.0.3",
+ "shasum-object": "^1.0.0",
+ "subarg": "^1.0.0",
+ "through2": "^2.0.0"
+ }
+ },
+ "des.js": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz",
+ "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==",
+ "dev": true,
+ "requires": {
+ "inherits": "^2.0.1",
+ "minimalistic-assert": "^1.0.0"
+ }
+ },
+ "detective": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.1.tgz",
+ "integrity": "sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==",
+ "dev": true,
+ "requires": {
+ "acorn-node": "^1.8.2",
+ "defined": "^1.0.0",
+ "minimist": "^1.2.6"
+ }
+ },
+ "diffie-hellman": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz",
+ "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==",
+ "dev": true,
+ "requires": {
+ "bn.js": "^4.1.0",
+ "miller-rabin": "^4.0.0",
+ "randombytes": "^2.0.0"
+ },
+ "dependencies": {
+ "bn.js": {
+ "version": "4.12.0",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
+ "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
+ "dev": true
+ }
+ }
+ },
+ "domain-browser": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz",
+ "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==",
+ "dev": true
+ },
+ "duplexer2": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz",
+ "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==",
+ "dev": true,
+ "requires": {
+ "readable-stream": "^2.0.2"
+ }
+ },
+ "elliptic": {
+ "version": "6.5.4",
+ "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz",
+ "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==",
+ "dev": true,
+ "requires": {
+ "bn.js": "^4.11.9",
+ "brorand": "^1.1.0",
+ "hash.js": "^1.0.0",
+ "hmac-drbg": "^1.0.1",
+ "inherits": "^2.0.4",
+ "minimalistic-assert": "^1.0.1",
+ "minimalistic-crypto-utils": "^1.0.1"
+ },
+ "dependencies": {
+ "bn.js": {
+ "version": "4.12.0",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
+ "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
+ "dev": true
+ }
+ }
+ },
+ "events": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/events/-/events-2.1.0.tgz",
+ "integrity": "sha512-3Zmiobend8P9DjmKAty0Era4jV8oJ0yGYe2nJJAxgymF9+N8F2m0hhZiMoWtcfepExzNKZumFU3ksdQbInGWCg==",
+ "dev": true
+ },
+ "evp_bytestokey": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz",
+ "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==",
+ "dev": true,
+ "requires": {
+ "md5.js": "^1.3.4",
+ "safe-buffer": "^5.1.1"
+ }
+ },
+ "fast-safe-stringify": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz",
+ "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==",
+ "dev": true
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
+ "dev": true
+ },
+ "function-bind": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
+ "dev": true
+ },
+ "get-assigned-identifiers": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz",
+ "integrity": "sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ==",
+ "dev": true
+ },
+ "glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ }
+ },
+ "has": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+ "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+ "dev": true,
+ "requires": {
+ "function-bind": "^1.1.1"
+ }
+ },
+ "hash-base": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz",
+ "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==",
+ "dev": true,
+ "requires": {
+ "inherits": "^2.0.4",
+ "readable-stream": "^3.6.0",
+ "safe-buffer": "^5.2.0"
+ },
+ "dependencies": {
+ "readable-stream": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
+ "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+ "dev": true,
+ "requires": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ }
+ }
+ }
+ },
+ "hash.js": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz",
+ "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==",
+ "dev": true,
+ "requires": {
+ "inherits": "^2.0.3",
+ "minimalistic-assert": "^1.0.1"
+ }
+ },
+ "hmac-drbg": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
+ "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==",
+ "dev": true,
+ "requires": {
+ "hash.js": "^1.0.3",
+ "minimalistic-assert": "^1.0.0",
+ "minimalistic-crypto-utils": "^1.0.1"
+ }
+ },
+ "htmlescape": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz",
+ "integrity": "sha512-eVcrzgbR4tim7c7soKQKtxa/kQM4TzjnlU83rcZ9bHU6t31ehfV7SktN6McWgwPWg+JYMA/O3qpGxBvFq1z2Jg==",
+ "dev": true
+ },
+ "https-browserify": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz",
+ "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==",
+ "dev": true
+ },
+ "ieee754": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
+ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
+ "dev": true
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+ "dev": true,
+ "requires": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "dev": true
+ },
+ "inline-source-map": {
+ "version": "0.6.2",
+ "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz",
+ "integrity": "sha512-0mVWSSbNDvedDWIN4wxLsdPM4a7cIPcpyMxj3QZ406QRwQ6ePGB1YIHxVPjqpcUGbWQ5C+nHTwGNWAGvt7ggVA==",
+ "dev": true,
+ "requires": {
+ "source-map": "~0.5.3"
+ }
+ },
+ "insert-module-globals": {
+ "version": "7.2.1",
+ "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-7.2.1.tgz",
+ "integrity": "sha512-ufS5Qq9RZN+Bu899eA9QCAYThY+gGW7oRkmb0vC93Vlyu/CFGcH0OYPEjVkDXA5FEbTt1+VWzdoOD3Ny9N+8tg==",
+ "dev": true,
+ "requires": {
+ "acorn-node": "^1.5.2",
+ "combine-source-map": "^0.8.0",
+ "concat-stream": "^1.6.1",
+ "is-buffer": "^1.1.0",
+ "JSONStream": "^1.0.3",
+ "path-is-absolute": "^1.0.1",
+ "process": "~0.11.0",
+ "through2": "^2.0.0",
+ "undeclared-identifiers": "^1.1.2",
+ "xtend": "^4.0.0"
+ }
+ },
+ "is-buffer": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
+ "dev": true
+ },
+ "is-core-module": {
+ "version": "2.10.0",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz",
+ "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==",
+ "dev": true,
+ "requires": {
+ "has": "^1.0.3"
+ }
+ },
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
+ "dev": true
+ },
+ "json-stable-stringify": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz",
+ "integrity": "sha512-nKtD/Qxm7tWdZqJoldEC7fF0S41v0mWbeaXG3637stOWfyGxTgWTYE2wtfKmjzpvxv2MA2xzxsXOIiwUpkX6Qw==",
+ "dev": true,
+ "requires": {
+ "jsonify": "~0.0.0"
+ }
+ },
+ "jsonify": {
+ "version": "0.0.0",
+ "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz",
+ "integrity": "sha512-trvBk1ki43VZptdBI5rIlG4YOzyeH/WefQt5rj1grasPn4iiZWKet8nkgc4GlsAylaztn0qZfUYOiTsASJFdNA==",
+ "dev": true
+ },
+ "jsonparse": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz",
+ "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==",
+ "dev": true
+ },
+ "JSONStream": {
+ "version": "1.3.5",
+ "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz",
+ "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==",
+ "dev": true,
+ "requires": {
+ "jsonparse": "^1.2.0",
+ "through": ">=2.2.7 <3"
+ }
+ },
+ "labeled-stream-splicer": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-2.0.2.tgz",
+ "integrity": "sha512-Ca4LSXFFZUjPScRaqOcFxneA0VpKZr4MMYCljyQr4LIewTLb3Y0IUTIsnBBsVubIeEfxeSZpSjSsRM8APEQaAw==",
+ "dev": true,
+ "requires": {
+ "inherits": "^2.0.1",
+ "stream-splicer": "^2.0.0"
+ }
+ },
+ "lodash.memoize": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz",
+ "integrity": "sha512-eDn9kqrAmVUC1wmZvlQ6Uhde44n+tXpqPrN8olQJbttgh0oKclk+SF54P47VEGE9CEiMeRwAP8BaM7UHvBkz2A==",
+ "dev": true
+ },
+ "md5.js": {
+ "version": "1.3.5",
+ "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz",
+ "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==",
+ "dev": true,
+ "requires": {
+ "hash-base": "^3.0.0",
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.1.2"
+ }
+ },
+ "miller-rabin": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz",
+ "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==",
+ "dev": true,
+ "requires": {
+ "bn.js": "^4.0.0",
+ "brorand": "^1.0.1"
+ },
+ "dependencies": {
+ "bn.js": {
+ "version": "4.12.0",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
+ "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
+ "dev": true
+ }
+ }
+ },
+ "minimalistic-assert": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
+ "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==",
+ "dev": true
+ },
+ "minimalistic-crypto-utils": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz",
+ "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==",
+ "dev": true
+ },
+ "minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "^1.1.7"
+ }
+ },
+ "minimist": {
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz",
+ "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==",
+ "dev": true
+ },
+ "mkdirp-classic": {
+ "version": "0.5.3",
+ "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz",
+ "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==",
+ "dev": true
+ },
+ "module-deps": {
+ "version": "6.2.3",
+ "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-6.2.3.tgz",
+ "integrity": "sha512-fg7OZaQBcL4/L+AK5f4iVqf9OMbCclXfy/znXRxTVhJSeW5AIlS9AwheYwDaXM3lVW7OBeaeUEY3gbaC6cLlSA==",
+ "dev": true,
+ "requires": {
+ "browser-resolve": "^2.0.0",
+ "cached-path-relative": "^1.0.2",
+ "concat-stream": "~1.6.0",
+ "defined": "^1.0.0",
+ "detective": "^5.2.0",
+ "duplexer2": "^0.1.2",
+ "inherits": "^2.0.1",
+ "JSONStream": "^1.0.3",
+ "parents": "^1.0.0",
+ "readable-stream": "^2.0.2",
+ "resolve": "^1.4.0",
+ "stream-combiner2": "^1.1.1",
+ "subarg": "^1.0.0",
+ "through2": "^2.0.0",
+ "xtend": "^4.0.0"
+ }
+ },
+ "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-gyp-build": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.5.0.tgz",
+ "integrity": "sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg=="
+ },
+ "object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
+ "dev": true
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "dev": true,
+ "requires": {
+ "wrappy": "1"
+ }
+ },
+ "os-browserify": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz",
+ "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==",
+ "dev": true
+ },
+ "pako": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
+ "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==",
+ "dev": true
+ },
+ "parents": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz",
+ "integrity": "sha512-mXKF3xkoUt5td2DoxpLmtOmZvko9VfFpwRwkKDHSNvgmpLAeBo18YDhcPbBzJq+QLCHMbGOfzia2cX4U+0v9Mg==",
+ "dev": true,
+ "requires": {
+ "path-platform": "~0.11.15"
+ }
+ },
+ "parse-asn1": {
+ "version": "5.1.6",
+ "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz",
+ "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==",
+ "dev": true,
+ "requires": {
+ "asn1.js": "^5.2.0",
+ "browserify-aes": "^1.0.0",
+ "evp_bytestokey": "^1.0.0",
+ "pbkdf2": "^3.0.3",
+ "safe-buffer": "^5.1.1"
+ }
+ },
+ "path-browserify": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz",
+ "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==",
+ "dev": true
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
+ "dev": true
+ },
+ "path-parse": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+ "dev": true
+ },
+ "path-platform": {
+ "version": "0.11.15",
+ "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz",
+ "integrity": "sha512-Y30dB6rab1A/nfEKsZxmr01nUotHX0c/ZiIAsCTatEe1CmS5Pm5He7fZ195bPT7RdquoaL8lLxFCMQi/bS7IJg==",
+ "dev": true
+ },
+ "pbkdf2": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz",
+ "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==",
+ "dev": true,
+ "requires": {
+ "create-hash": "^1.1.2",
+ "create-hmac": "^1.1.4",
+ "ripemd160": "^2.0.1",
+ "safe-buffer": "^5.0.1",
+ "sha.js": "^2.4.8"
+ }
+ },
+ "process": {
+ "version": "0.11.10",
+ "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
+ "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==",
+ "dev": true
+ },
+ "process-nextick-args": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
+ "dev": true
+ },
+ "public-encrypt": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz",
+ "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==",
+ "dev": true,
+ "requires": {
+ "bn.js": "^4.1.0",
+ "browserify-rsa": "^4.0.0",
+ "create-hash": "^1.1.0",
+ "parse-asn1": "^5.0.0",
+ "randombytes": "^2.0.1",
+ "safe-buffer": "^5.1.2"
+ },
+ "dependencies": {
+ "bn.js": {
+ "version": "4.12.0",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
+ "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
+ "dev": true
+ }
+ }
+ },
+ "punycode": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
+ "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==",
+ "dev": true
+ },
+ "querystring": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz",
+ "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==",
+ "dev": true
+ },
+ "querystring-es3": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz",
+ "integrity": "sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==",
+ "dev": true
+ },
+ "randombytes": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
+ "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "^5.1.0"
+ }
+ },
+ "randomfill": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz",
+ "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==",
+ "dev": true,
+ "requires": {
+ "randombytes": "^2.0.5",
+ "safe-buffer": "^5.1.0"
+ }
+ },
+ "read-only-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/read-only-stream/-/read-only-stream-2.0.0.tgz",
+ "integrity": "sha512-3ALe0bjBVZtkdWKIcThYpQCLbBMd/+Tbh2CDSrAIDO3UsZ4Xs+tnyjv2MjCOMMgBG+AsUOeuP1cgtY1INISc8w==",
+ "dev": true,
+ "requires": {
+ "readable-stream": "^2.0.2"
+ }
+ },
+ "readable-stream": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+ "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ "dev": true,
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ },
+ "dependencies": {
+ "safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+ "dev": true
+ },
+ "string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "~5.1.0"
+ }
+ }
+ }
+ },
+ "resolve": {
+ "version": "1.22.1",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz",
+ "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==",
+ "dev": true,
+ "requires": {
+ "is-core-module": "^2.9.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ }
+ },
+ "ripemd160": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz",
+ "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==",
+ "dev": true,
+ "requires": {
+ "hash-base": "^3.0.0",
+ "inherits": "^2.0.1"
+ }
+ },
+ "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==",
+ "dev": true
+ },
+ "safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+ "dev": true
+ },
+ "sha.js": {
+ "version": "2.4.11",
+ "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz",
+ "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==",
+ "dev": true,
+ "requires": {
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "shasum": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/shasum/-/shasum-1.0.2.tgz",
+ "integrity": "sha512-UTzHm/+AzKfO9RgPgRpDIuMSNie1ubXRaljjlhFMNGYoG7z+rm9AHLPMf70R7887xboDH9Q+5YQbWKObFHEAtw==",
+ "dev": true,
+ "requires": {
+ "json-stable-stringify": "~0.0.0",
+ "sha.js": "~2.4.4"
+ }
+ },
+ "shasum-object": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/shasum-object/-/shasum-object-1.0.0.tgz",
+ "integrity": "sha512-Iqo5rp/3xVi6M4YheapzZhhGPVs0yZwHj7wvwQ1B9z8H6zk+FEnI7y3Teq7qwnekfEhu8WmG2z0z4iWZaxLWVg==",
+ "dev": true,
+ "requires": {
+ "fast-safe-stringify": "^2.0.7"
+ }
+ },
+ "shell-quote": {
+ "version": "1.7.3",
+ "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.3.tgz",
+ "integrity": "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==",
+ "dev": true
+ },
+ "simple-concat": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz",
+ "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==",
+ "dev": true
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==",
+ "dev": true
+ },
+ "stream-browserify": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz",
+ "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==",
+ "dev": true,
+ "requires": {
+ "inherits": "~2.0.1",
+ "readable-stream": "^2.0.2"
+ }
+ },
+ "stream-combiner2": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz",
+ "integrity": "sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==",
+ "dev": true,
+ "requires": {
+ "duplexer2": "~0.1.0",
+ "readable-stream": "^2.0.2"
+ }
+ },
+ "stream-http": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.2.0.tgz",
+ "integrity": "sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==",
+ "dev": true,
+ "requires": {
+ "builtin-status-codes": "^3.0.0",
+ "inherits": "^2.0.4",
+ "readable-stream": "^3.6.0",
+ "xtend": "^4.0.2"
+ },
+ "dependencies": {
+ "readable-stream": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
+ "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+ "dev": true,
+ "requires": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ }
+ }
+ }
+ },
+ "stream-splicer": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-2.0.1.tgz",
+ "integrity": "sha512-Xizh4/NPuYSyAXyT7g8IvdJ9HJpxIGL9PjyhtywCZvvP0OPIdqyrr4dMikeuvY8xahpdKEBlBTySe583totajg==",
+ "dev": true,
+ "requires": {
+ "inherits": "^2.0.1",
+ "readable-stream": "^2.0.2"
+ }
+ },
+ "string_decoder": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+ "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "~5.2.0"
+ }
+ },
+ "subarg": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz",
+ "integrity": "sha512-RIrIdRY0X1xojthNcVtgT9sjpOGagEUKpZdgBUi054OEPFo282yg+zE+t1Rj3+RqKq2xStL7uUHhY+AjbC4BXg==",
+ "dev": true,
+ "requires": {
+ "minimist": "^1.1.0"
+ }
+ },
+ "supports-preserve-symlinks-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+ "dev": true
+ },
+ "syntax-error": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.4.0.tgz",
+ "integrity": "sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w==",
+ "dev": true,
+ "requires": {
+ "acorn-node": "^1.2.0"
+ }
+ },
+ "through": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
+ "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==",
+ "dev": true
+ },
+ "through2": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
+ "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
+ "dev": true,
+ "requires": {
+ "readable-stream": "~2.3.6",
+ "xtend": "~4.0.1"
+ }
+ },
+ "timers-browserify": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz",
+ "integrity": "sha512-PIxwAupJZiYU4JmVZYwXp9FKsHMXb5h0ZEFyuXTAn8WLHOlcij+FEcbrvDsom1o5dr1YggEtFbECvGCW2sT53Q==",
+ "dev": true,
+ "requires": {
+ "process": "~0.11.0"
+ }
+ },
+ "tty-browserify": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz",
+ "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==",
+ "dev": true
+ },
+ "typedarray": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
+ "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==",
+ "dev": true
+ },
+ "umd": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/umd/-/umd-3.0.3.tgz",
+ "integrity": "sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow==",
+ "dev": true
+ },
+ "undeclared-identifiers": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/undeclared-identifiers/-/undeclared-identifiers-1.1.3.tgz",
+ "integrity": "sha512-pJOW4nxjlmfwKApE4zvxLScM/njmwj/DiUBv7EabwE4O8kRUy+HIwxQtZLBPll/jx1LJyBcqNfB3/cpv9EZwOw==",
+ "dev": true,
+ "requires": {
+ "acorn-node": "^1.3.0",
+ "dash-ast": "^1.0.0",
+ "get-assigned-identifiers": "^1.2.0",
+ "simple-concat": "^1.0.0",
+ "xtend": "^4.0.1"
+ }
+ },
+ "url": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz",
+ "integrity": "sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ==",
+ "dev": true,
+ "requires": {
+ "punycode": "1.3.2",
+ "querystring": "0.2.0"
+ },
+ "dependencies": {
+ "punycode": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
+ "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==",
+ "dev": true
+ }
+ }
+ },
+ "usb": {
+ "version": "1.9.2",
+ "resolved": "https://registry.npmjs.org/usb/-/usb-1.9.2.tgz",
+ "integrity": "sha512-dryNz030LWBPAf6gj8vyq0Iev3vPbCLHCT8dBw3gQRXRzVNsIdeuU+VjPp3ksmSPkeMAl1k+kQ14Ij0QHyeiAg==",
+ "requires": {
+ "node-addon-api": "^4.2.0",
+ "node-gyp-build": "^4.3.0"
+ }
+ },
+ "util": {
+ "version": "0.10.4",
+ "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz",
+ "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==",
+ "dev": true,
+ "requires": {
+ "inherits": "2.0.3"
+ },
+ "dependencies": {
+ "inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==",
+ "dev": true
+ }
+ }
+ },
+ "util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
+ "dev": true
+ },
+ "vm-browserify": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz",
+ "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==",
+ "dev": true
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
+ "dev": true
+ },
+ "xtend": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
+ "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
+ "dev": true
+ }
+ }
+}
From bc8e5e27594150a33d191942d9e92a756a72c196 Mon Sep 17 00:00:00 2001
From: Peter Ahlers
Date: Fri, 7 Oct 2022 21:02:56 +0200
Subject: [PATCH 02/20] fix(usb): Add await
---
lib/web-usb.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/lib/web-usb.js b/lib/web-usb.js
index 45a33c6..5286a13 100644
--- a/lib/web-usb.js
+++ b/lib/web-usb.js
@@ -61,7 +61,7 @@ USB.requestDevice = async function(filters) {
};
USB.getDevices = async function(filters) {
- const usbDevices = navigator.usb.getDevices();
+ const usbDevices = await navigator.usb.getDevices();
const devices = [];
usbDevices.forEach((usbDevice) => {
From 3e9c386c4de11d99a93e7b158d2acc5b2bc18251 Mon Sep 17 00:00:00 2001
From: Peter Ahlers
Date: Fri, 7 Oct 2022 21:10:52 +0200
Subject: [PATCH 03/20] fix(usb): Add logging and clean up
---
lib/web-usb.js | 17 +++++++----------
1 file changed, 7 insertions(+), 10 deletions(-)
diff --git a/lib/web-usb.js b/lib/web-usb.js
index 5286a13..3c3cb57 100644
--- a/lib/web-usb.js
+++ b/lib/web-usb.js
@@ -60,17 +60,14 @@ USB.requestDevice = async function(filters) {
return new USB(usbDevice);
};
-USB.getDevices = async function(filters) {
+USB.getDevices = async function (filters) {
const usbDevices = await navigator.usb.getDevices();
- const devices = [];
- usbDevices.forEach((usbDevice) => {
- filters.forEach((filter) => {
- if (filter.vendorId === usbDevice.vendorId && filter.productId === usbDevice.productId) {
- devices.push(new USB(usbDevice));
- }
- });
- });
+ console.debug('USB devices', usbDevices);
- return devices;
+ return usbDevices
+ .filter((usbDevice) => {
+ return filters.some(filter => filter.vendorId === usbDevice.vendorId && filter.productId === usbDevice.productId);
+ })
+ .map(usbDevice => new USB(usbDevice));
};
From fdb79dca29e5bacc5d3c4f649581c4c5c167904b Mon Sep 17 00:00:00 2001
From: Peter Ahlers
Date: Fri, 7 Oct 2022 21:17:54 +0200
Subject: [PATCH 04/20] fix(RtlSdr): Return promise in resetBuffer
---
lib/rtlsdr.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/lib/rtlsdr.js b/lib/rtlsdr.js
index 3a57ce7..cfac50b 100644
--- a/lib/rtlsdr.js
+++ b/lib/rtlsdr.js
@@ -48,7 +48,7 @@ RtlSdr.prototype.setCenterFrequency = async function (centerFrequency) {
};
RtlSdr.prototype.resetBuffer = async function () {
- await this._rtl2832u.resetBuffer();
+ return this._rtl2832u.resetBuffer();
};
RtlSdr.prototype.readSamples = async function (length) {
From 6f24a69995281ffee1427a4f4c1f438f47ceff2c Mon Sep 17 00:00:00 2001
From: Peter Ahlers
Date: Fri, 7 Oct 2022 21:34:40 +0200
Subject: [PATCH 05/20] refactor(RTL2832U): Return into class
---
lib/rtl2832u.js | 134 +++++++++++++++++++++++++-----------------------
lib/rtlsdr.js | 2 +-
2 files changed, 70 insertions(+), 66 deletions(-)
diff --git a/lib/rtl2832u.js b/lib/rtl2832u.js
index f4dc157..5524567 100644
--- a/lib/rtl2832u.js
+++ b/lib/rtl2832u.js
@@ -20,51 +20,66 @@ const CMD = RtlCom.CMD;
const BLOCK = RtlCom.BLOCK;
const REG = RtlCom.REG;
-/**
- * Operations on the RTL2832U demodulator.
- * @param {ConnectionHandle} conn The USB connection handle.
- * @param {number} ppm The frequency correction factor, in parts per million.
- * @param {number=} opt_gain The optional gain in dB. If unspecified or null, sets auto gain.
- * @constructor
- */
-export function RTL2832U(conn, ppm, opt_gain) {
-
+export class RTL2832U {
/**
* Frequency of the oscillator crystal.
*/
- const XTAL_FREQ = 28800000;
+ static XTAL_FREQ = 28800000;
/**
* Tuner intermediate frequency.
*/
- const IF_FREQ = 3570000;
+ static IF_FREQ = 3570000;
/**
* The number of bytes for each sample.
*/
- const BYTES_PER_SAMPLE = 2;
+ static BYTES_PER_SAMPLE = 2;
/**
* Communications with the demodulator via USB.
*/
- const com = new RtlCom(conn);
+ #com;
+
+ /**
+ * ppm (?)
+ */
+ #ppm;
+
+ /**
+ * Optional gain
+ */
+ #opt_gain;
/**
* The tuner used by the dongle.
*/
- let tuner;
+ #tuner;
+
+ /**
+ * Operations on the RTL2832U demodulator.
+ * @param {ConnectionHandle} conn The USB connection handle.
+ * @param {number} ppm The frequency correction factor, in parts per million.
+ * @param {number=} opt_gain The optional gain in dB. If unspecified or null, sets auto gain.
+ * @constructor
+ */
+ constructor(conn, ppm = 0, opt_gain = undefined) {
+ this.#com = new RtlCom(conn);
+ this.#ppm = ppm;
+ this.#opt_gain = opt_gain;
+ }
/**
* Initialize the demodulator.
*/
- async function open() {
- await com.writeEach([
+ async open() {
+ await this.#com.writeEach([
[CMD.REG, BLOCK.USB, REG.SYSCTL, 0x09, 1],
[CMD.REG, BLOCK.USB, REG.EPA_MAXPKT, 0x0200, 2],
[CMD.REG, BLOCK.USB, REG.EPA_CTL, 0x0210, 2]
]);
- await com.iface.claim();
- await com.writeEach([
+ await this.#com.iface.claim();
+ await this.#com.writeEach([
[CMD.REG, BLOCK.SYS, REG.DEMOD_CTL_1, 0x22, 1],
[CMD.REG, BLOCK.SYS, REG.DEMOD_CTL, 0xe8, 1],
[CMD.DEMODREG, 1, 0x01, 0x14, 1],
@@ -108,18 +123,18 @@ export function RTL2832U(conn, ppm, opt_gain) {
[CMD.DEMODREG, 0, 0x0d, 0x83, 1]
]);
- const xtalFreq = Math.floor(XTAL_FREQ * (1 + ppm / 1000000));
- await com.i2c.open();
- const found = await R820T.check(com);
+ const xtalFreq = Math.floor(RTL2832U.XTAL_FREQ * (1 + this.#ppm / 1000000));
+ await this.#com.i2c.open();
+ const found = R820T.check(com);
if (found) {
- tuner = new R820T(com, xtalFreq);
+ this.#tuner = new R820T(this.#com, xtalFreq);
}
- if (!tuner) {
+ if (!this.#tuner) {
throw new Error('Sorry, your USB dongle has an unsupported tuner chip. ' +
'Only the R820T chip is supported.');
}
- const multiplier = -1 * Math.floor(IF_FREQ * (1 << 22) / xtalFreq);
- await com.writeEach([
+ const multiplier = -1 * Math.floor(RTL2832U.IF_FREQ * (1 << 22) / xtalFreq);
+ await this.#com.writeEach([
[CMD.DEMODREG, 1, 0xb1, 0x1a, 1],
[CMD.DEMODREG, 0, 0x08, 0x4d, 1],
[CMD.DEMODREG, 1, 0x19, (multiplier >> 16) & 0x3f, 1],
@@ -127,9 +142,9 @@ export function RTL2832U(conn, ppm, opt_gain) {
[CMD.DEMODREG, 1, 0x1b, multiplier & 0xff, 1],
[CMD.DEMODREG, 1, 0x15, 0x01, 1]
])
- await tuner.init();
- await setGain(opt_gain);
- await com.i2c.close();
+ await this.#tuner.init();
+ await this.setGain(this.#opt_gain);
+ await this.#com.i2c.close();
}
/**
@@ -137,11 +152,11 @@ export function RTL2832U(conn, ppm, opt_gain) {
* @param {number|null|undefined} gain The gain in dB, or null/undefined
* for automatic gain.
*/
- async function setGain(gain) {
- if (gain == null) {
- await tuner.setAutoGain();
+ async setGain(gain) {
+ if (gain) {
+ await this.#tuner.setManualGain(gain);
} else {
- await tuner.setManualGain(gain);
+ await this.#tuner.setAutoGain();
}
}
@@ -150,26 +165,26 @@ export function RTL2832U(conn, ppm, opt_gain) {
* @param {number} rate The sample rate, in samples/sec.
* @return {number} The sample rate that was actually set as its first parameter.
*/
- async function setSampleRate(rate) {
- let ratio = Math.floor(XTAL_FREQ * (1 << 22) / rate);
+ async setSampleRate(rate) {
+ let ratio = Math.floor(RTL2832U.XTAL_FREQ * (1 << 22) / rate);
ratio &= 0x0ffffffc;
- const realRate = Math.floor(XTAL_FREQ * (1 << 22) / ratio);
- const ppmOffset = -1 * Math.floor(ppm * (1 << 24) / 1000000);
- await com.writeEach([
+ const realRate = Math.floor(RTL2832U.XTAL_FREQ * (1 << 22) / ratio);
+ const ppmOffset = -1 * Math.floor(this.#ppm * (1 << 24) / 1000000);
+ await this.#com.writeEach([
[CMD.DEMODREG, 1, 0x9f, (ratio >> 16) & 0xffff, 2],
[CMD.DEMODREG, 1, 0xa1, ratio & 0xffff, 2],
[CMD.DEMODREG, 1, 0x3e, (ppmOffset >> 8) & 0x3f, 1],
[CMD.DEMODREG, 1, 0x3f, ppmOffset & 0xff, 1]
]);
- await resetDemodulator();
+ await this.resetDemodulator();
return realRate;
}
/**
* Resets the demodulator.
*/
- async function resetDemodulator() {
- await com.writeEach([
+ async resetDemodulator() {
+ await this.#com.writeEach([
[CMD.DEMODREG, 1, 0x01, 0x14, 1],
[CMD.DEMODREG, 1, 0x01, 0x10, 1]
]);
@@ -180,18 +195,18 @@ export function RTL2832U(conn, ppm, opt_gain) {
* @param {number} freq The frequency to tune to, in Hertz.
* @return {number} The actual tuned frequency.
*/
- async function setCenterFrequency(freq) {
- await com.i2c.open();
- const actualFreq = await tuner.setFrequency(freq + IF_FREQ);
- await com.i2c.close();
- return (actualFreq - IF_FREQ);
+ async setCenterFrequency(freq) {
+ await this.#com.i2c.open();
+ const actualFreq = this.#tuner.setFrequency(freq + IF_FREQ);
+ await this.#com.i2c.close();
+ return (actualFreq - RTL2832U.IF_FREQ);
}
/**
* Resets the sample buffer. Call this before starting to read samples.
*/
- async function resetBuffer() {
- await com.writeEach([
+ async resetBuffer() {
+ await this.#com.writeEach([
[CMD.REG, BLOCK.USB, REG.EPA_CTL, 0x0210, 2],
[CMD.REG, BLOCK.USB, REG.EPA_CTL, 0x0000, 2]
]);
@@ -204,28 +219,17 @@ export function RTL2832U(conn, ppm, opt_gain) {
* can interpret as pairs of unsigned 8-bit integers; the first one is
* the sample's I value, and the second one is its Q value.
*/
- async function readSamples(length) {
- return com.bulk.readBuffer(length * BYTES_PER_SAMPLE);
+ async readSamples(length) {
+ return this.#com.bulk.readBuffer(length * RTL2832U.BYTES_PER_SAMPLE);
}
/**
* Stops the demodulator.
*/
- async function close() {
- await com.i2c.open();
- await tuner.close();
- await com.i2c.close();
- await com.iface.release();
+ async close() {
+ await this.#com.i2c.open();
+ await this.#tuner.close();
+ await this.#com.i2c.close();
+ await this.#com.iface.release();
}
-
- return {
- open: open,
- setSampleRate: setSampleRate,
- setCenterFrequency: setCenterFrequency,
- resetBuffer: resetBuffer,
- readSamples: readSamples,
- close: close
- };
}
-
-module.exports = RTL2832U;
diff --git a/lib/rtlsdr.js b/lib/rtlsdr.js
index cfac50b..b05d860 100644
--- a/lib/rtlsdr.js
+++ b/lib/rtlsdr.js
@@ -34,7 +34,7 @@ RtlSdr.prototype.open = async function (options) {
await this._usbDevice.open();
await this._usbDevice.selectConfiguration(1);
- this._rtl2832u = new RTL2832U(this._usbDevice, options.ppm || 0, options.gain || null);
+ this._rtl2832u = new RTL2832U(this._usbDevice, options.ppm, options.gain);
await this._rtl2832u.open();
};
From c9ccbd413ba248923095f450cfec1a78dd7396c8 Mon Sep 17 00:00:00 2001
From: Peter Ahlers
Date: Fri, 7 Oct 2022 21:56:54 +0200
Subject: [PATCH 06/20] refactor(RTL2832U): Return into class
---
lib/rtl2832u.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/lib/rtl2832u.js b/lib/rtl2832u.js
index 5524567..f4107e2 100644
--- a/lib/rtl2832u.js
+++ b/lib/rtl2832u.js
@@ -125,7 +125,7 @@ export class RTL2832U {
const xtalFreq = Math.floor(RTL2832U.XTAL_FREQ * (1 + this.#ppm / 1000000));
await this.#com.i2c.open();
- const found = R820T.check(com);
+ const found = R820T.check(this.#com);
if (found) {
this.#tuner = new R820T(this.#com, xtalFreq);
}
From 7b22f4cce7082d9ce7d462e466dcf2518d2b1ac7 Mon Sep 17 00:00:00 2001
From: Peter Ahlers
Date: Fri, 7 Oct 2022 21:57:24 +0200
Subject: [PATCH 07/20] refactor(R820T): Return into class
---
lib/r820t.js | 166 ++++++++++++++++++++++++++-------------------------
1 file changed, 86 insertions(+), 80 deletions(-)
diff --git a/lib/r820t.js b/lib/r820t.js
index d8a46b2..79b0bdf 100644
--- a/lib/r820t.js
+++ b/lib/r820t.js
@@ -22,19 +22,19 @@ const CMD = RtlCom.CMD;
* @param {number} xtalFreq The frequency of the oscillator crystal.
* @constructor
*/
-export function R820T(com, xtalFreq) {
+export class R820T {
/**
* Initial values for registers 0x05-0x1f.
*/
- const REGISTERS = [0x83, 0x32, 0x75, 0xc0, 0x40, 0xd6, 0x6c, 0xf5, 0x63, 0x75,
+ static REGISTERS = [0x83, 0x32, 0x75, 0xc0, 0x40, 0xd6, 0x6c, 0xf5, 0x63, 0x75,
0x68, 0x6c, 0x83, 0x80, 0x00, 0x0f, 0x00, 0xc0, 0x30, 0x48,
0xcc, 0x60, 0x00, 0x54, 0xae, 0x4a, 0xc0];
/**
* Configurations for the multiplexer in different frequency bands.
*/
- const MUX_CFGS = [
+ static MUX_CFGS = [
[0, 0x08, 0x02, 0xdf],
[50, 0x08, 0x02, 0xbe],
[55, 0x08, 0x02, 0x8b],
@@ -55,26 +55,50 @@ export function R820T(com, xtalFreq) {
/**
* A bit mask to reverse the bits in a byte.
*/
- const BIT_REVS = [0x0, 0x8, 0x4, 0xc, 0x2, 0xa, 0x6, 0xe,
+ static BIT_REVS = [0x0, 0x8, 0x4, 0xc, 0x2, 0xa, 0x6, 0xe,
0x1, 0x9, 0x5, 0xd, 0x3, 0xb, 0x7, 0xf];
/**
* Whether the PLL in the tuner is locked.
*/
- let hasPllLock = false;
+ #hasPllLock = false;
/**
* Shadow registers 0x05-0x1f, for setting values using masks.
*/
- let shadowRegs;
+ #shadowRegs;
+ /**
+ * Communications with the demodulator via USB.
+ */
+ #com;
+
+ /**
+ * Frequency of the oscillator crystal. (?)
+ */
+ #xtalFreq;
+
+ constructor(com, xtalFreq) {
+ this.#com = com;
+ this.#xtalFreq = xtalFreq;
+ }
+
+ /**
+ * Checks if the R820T tuner is present.
+ * @param {RtlCom} com The RTL communications object.
+ * @return {boolean} A boolean that tells whether the tuner is present.
+ */
+ static async check(com) {
+ const data = await com.i2c.readRegister(0x34, 0);
+ return (data === 0x69);
+ }
/**
* Initializes the tuner.
*/
- async function init() {
- await initRegisters(REGISTERS);
- await initElectronics();
+ async init() {
+ await this.#initRegisters(R820T.REGISTERS);
+ await this.#initElectronics();
}
/**
@@ -82,16 +106,16 @@ export function R820T(com, xtalFreq) {
* @param {number} freq The frequency to tune to.
* @return {number} The actual tuned frequency.
*/
- async function setFrequency(freq) {
- await setMux(freq);
- return setPll(freq);
+ async setFrequency(freq) {
+ await this.#setMux(freq);
+ return this.#setPll(freq);
}
/**
* Stops the tuner.
*/
- async function close() {
- await writeEach([
+ async close() {
+ await this.#writeEach([
[0x06, 0xb1, 0xff],
[0x05, 0xb3, 0xff],
[0x07, 0x3a, 0xff],
@@ -109,14 +133,14 @@ export function R820T(com, xtalFreq) {
/**
* Initializes all the components of the tuner.
*/
- async function initElectronics() {
- await writeEach([
+ async #initElectronics() {
+ await this.#writeEach([
[0x0c, 0x00, 0x0f],
[0x13, 49, 0x3f],
[0x1d, 0x00, 0x38]
]);
- const filterCap = await calibrateFilter(true);
- await writeEach([
+ const filterCap = await this.#calibrateFilter(true);
+ await this.#writeEach([
[0x0a, 0x10 | filterCap, 0x1f],
[0x0b, 0x6b, 0xef],
[0x07, 0x00, 0x80],
@@ -149,8 +173,8 @@ export function R820T(com, xtalFreq) {
/**
* Sets the tuner to automatic gain.
*/
- async function setAutoGain() {
- await writeEach([
+ async setAutoGain() {
+ await this.#writeEach([
[0x05, 0x00, 0x10],
[0x07, 0x10, 0x10],
[0x0c, 0x0b, 0x9f]
@@ -161,7 +185,7 @@ export function R820T(com, xtalFreq) {
* Sets the tuner's manual gain.
* @param {number} gain The tuner's gain, in dB.
*/
- async function setManualGain(gain) {
+ async setManualGain(gain) {
let step;
if (gain <= 15) {
step = Math.round(1.36 + gain * (1.1118 + gain * (-0.0786 + gain * 0.0027)));
@@ -175,7 +199,7 @@ export function R820T(com, xtalFreq) {
}
const lnaValue = Math.floor(step / 2);
const mixerValue = Math.floor((step - 1) / 2);
- await writeEach([
+ await this.#writeEach([
[0x05, 0x10, 0x10],
[0x07, 0x00, 0x10],
[0x0c, 0x08, 0x9f],
@@ -188,29 +212,29 @@ export function R820T(com, xtalFreq) {
* Calibrates the filters.
* @param {boolean} firstTry Whether this is the first try to calibrate.
*/
- async function calibrateFilter(firstTry) {
- await writeEach([
+ async #calibrateFilter(firstTry) {
+ await this.#writeEach([
[0x0b, 0x6b, 0x60],
[0x0f, 0x04, 0x04],
[0x10, 0x00, 0x03]
]);
- await setPll(56000000);
- if (!hasPllLock) {
+ await this.#setPll(56000000);
+ if (!this.#hasPllLock) {
throw new Error("PLL not locked -- cannot tune to the selected frequency.");
}
- await writeEach([
+ await this.#writeEach([
[0x0b, 0x10, 0x10],
[0x0b, 0x00, 0x10],
[0x0f, 0x00, 0x04]
]);
- const data = await readRegBuffer(0x00, 5);
+ const data = await this.#readRegBuffer(0x00, 5);
const arr = new Uint8Array(data);
let filterCap = arr[4] & 0x0f;
if (filterCap === 0x0f) {
filterCap = 0;
}
if (filterCap !== 0 && firstTry) {
- return calibrateFilter(false);
+ return this.#calibrateFilter(false);
} else {
return (filterCap);
}
@@ -220,16 +244,16 @@ export function R820T(com, xtalFreq) {
* Sets the multiplexer's frequency.
* @param {number} freq The frequency to set.
*/
- async function setMux(freq) {
+ async #setMux(freq) {
const freqMhz = freq / 1000000;
let i = 0;
- for (; i < MUX_CFGS.length - 1; ++i) {
- if (freqMhz < MUX_CFGS[i + 1][0]) {
+ for (; i < R820T.MUX_CFGS.length - 1; ++i) {
+ if (freqMhz < R820T.MUX_CFGS[i + 1][0]) {
break;
}
}
- const cfg = MUX_CFGS[i];
- await writeEach([
+ const cfg = R820T.MUX_CFGS[i];
+ await this.#writeEach([
[0x17, cfg[1], 0x08],
[0x1a, cfg[2], 0xc3],
[0x1b, cfg[3], 0xff],
@@ -243,16 +267,16 @@ export function R820T(com, xtalFreq) {
* Sets the PLL's frequency.
* @param {number} freq The frequency to set.
*/
- async function setPll(freq) {
- const pllRef = Math.floor(xtalFreq);
- await writeEach([
+ async #setPll(freq) {
+ const pllRef = Math.floor(this.#xtalFreq);
+ await this.#writeEach([
[0x10, 0x00, 0x10],
[0x1a, 0x00, 0x0c],
[0x12, 0x80, 0xe0]
]);
let divNum = Math.min(6, Math.floor(Math.log(1770000000 / freq) / Math.LN2));
const mixDiv = 1 << (divNum + 1);
- const data = await readRegBuffer(0x00, 5);
+ const data = await this.#readRegBuffer(0x00, 5);
const arr = new Uint8Array(data);
const vcoFineTune = (arr[4] & 0x30) >> 4;
if (vcoFineTune > 2) {
@@ -260,27 +284,27 @@ export function R820T(com, xtalFreq) {
} else if (vcoFineTune < 2) {
++divNum;
}
- await writeRegMask(0x10, divNum << 5, 0xe0);
+ await this.#writeRegMask(0x10, divNum << 5, 0xe0);
const vcoFreq = freq * mixDiv;
const nint = Math.floor(vcoFreq / (2 * pllRef));
const vcoFra = vcoFreq % (2 * pllRef);
if (nint > 63) {
- hasPllLock = false;
+ this.#hasPllLock = false;
return;
}
const ni = Math.floor((nint - 13) / 4);
const si = (nint - 13) % 4;
- await writeEach([
+ await this.#writeEach([
[0x14, ni + (si << 6), 0xff],
[0x12, vcoFra === 0 ? 0x08 : 0x00, 0x08]
]);
const sdm = Math.min(65535, Math.floor(32768 * vcoFra / pllRef));
- await writeEach([
+ await this.#writeEach([
[0x16, sdm >> 8, 0xff],
[0x15, sdm & 0xff, 0xff]
]);
- await getPllLock(true);
- await writeRegMask(0x1a, 0x08, 0x08);
+ await this.#getPllLock(true);
+ await this.#writeRegMask(0x1a, 0x08, 0x08);
const actualFreq = 2 * pllRef * (nint + sdm / 65536) / mixDiv;
return (actualFreq);
}
@@ -289,18 +313,18 @@ export function R820T(com, xtalFreq) {
* Checks whether the PLL has achieved lock.
* @param {boolean} firstTry Whether this is the first try to achieve lock.
*/
- async function getPllLock(firstTry) {
- const data = await readRegBuffer(0x00, 3);
+ async #getPllLock(firstTry) {
+ const data = await this.#readRegBuffer(0x00, 3);
const arr = new Uint8Array(data);
if (arr[2] & 0x40) {
- hasPllLock = true;
+ this.#hasPllLock = true;
return;
}
if (firstTry) {
- await writeRegMask(0x12, 0x60, 0xe0);
- return getPllLock(false);
+ await this.#writeRegMask(0x12, 0x60, 0xe0);
+ return this.#getPllLock(false);
} else {
- hasPllLock = false;
+ this.#hasPllLock = false;
}
}
@@ -308,13 +332,13 @@ export function R820T(com, xtalFreq) {
* Sets the initial values of the 0x05-0x1f registers.
* @param {Array.} regs The values for the registers.
*/
- async function initRegisters(regs) {
- shadowRegs = new Uint8Array(regs);
+ async #initRegisters(regs) {
+ this.#shadowRegs = new Uint8Array(regs);
const cmds = [];
for (let i = 0; i < regs.length; ++i) {
cmds.push([CMD.I2CREG, 0x34, i + 5, regs[i]]);
}
- await com.writeEach(cmds);
+ await this.#com.writeEach(cmds);
}
/**
@@ -323,12 +347,12 @@ export function R820T(com, xtalFreq) {
* @param {number} length The number of registers to read.
* @return {ArrayBuffer} An ArrayBuffer with the data.
*/
- async function readRegBuffer(addr, length) {
- const data = await com.i2c.readRegBuffer(0x34, addr, length);
+ async #readRegBuffer(addr, length) {
+ const data = await this.#com.i2c.readRegBuffer(0x34, addr, length);
const buf = new Uint8Array(data);
for (let i = 0; i < buf.length; ++i) {
const b = buf[i];
- buf[i] = (BIT_REVS[b & 0xf] << 4) | BIT_REVS[b >> 4];
+ buf[i] = (R820T.BIT_REVS[b & 0xf] << 4) | R820T.BIT_REVS[b >> 4];
}
return (buf.buffer);
}
@@ -339,39 +363,21 @@ export function R820T(com, xtalFreq) {
* @param {number} value The value to write.
* @param {number} mask A mask that specifies which bits to write.
*/
- async function writeRegMask(addr, value, mask) {
- const rc = shadowRegs[addr - 5];
+ async #writeRegMask(addr, value, mask) {
+ const rc = this.#shadowRegs[addr - 5];
const val = (rc & ~mask) | (value & mask);
- shadowRegs[addr - 5] = val;
- await com.i2c.writeRegister(0x34, addr, val);
+ this.#shadowRegs[addr - 5] = val;
+ await this.#com.i2c.writeRegister(0x34, addr, val);
}
/**
* Perform the write operations given in the array.
* @param {Array.>} array The operations.
*/
- async function writeEach(array) {
+ async #writeEach(array) {
for (let i = 0; i < array.length; i++) {
const line = array[i];
- await writeRegMask(line[0], line[1], line[2]);
+ await this.#writeRegMask(line[0], line[1], line[2]);
}
}
-
- return {
- init: init,
- setFrequency: setFrequency,
- setAutoGain: setAutoGain,
- setManualGain: setManualGain,
- close: close
- };
}
-
-/**
- * Checks if the R820T tuner is present.
- * @param {RtlCom} com The RTL communications object.
- * @return {boolean} A boolean that tells whether the tuner is present.
- */
-R820T.check = async function (com) {
- const data = await com.i2c.readRegister(0x34, 0);
- return (data === 0x69);
-};
From 957c1d9595985a65cbab4e7e3283e5c79a28f24d Mon Sep 17 00:00:00 2001
From: Peter Ahlers
Date: Fri, 7 Oct 2022 21:59:00 +0200
Subject: [PATCH 08/20] fix(RTL2832U): Change to use static
---
lib/rtl2832u.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/lib/rtl2832u.js b/lib/rtl2832u.js
index f4107e2..e7bfac7 100644
--- a/lib/rtl2832u.js
+++ b/lib/rtl2832u.js
@@ -197,7 +197,7 @@ export class RTL2832U {
*/
async setCenterFrequency(freq) {
await this.#com.i2c.open();
- const actualFreq = this.#tuner.setFrequency(freq + IF_FREQ);
+ const actualFreq = this.#tuner.setFrequency(freq + RTL2832U.IF_FREQ);
await this.#com.i2c.close();
return (actualFreq - RTL2832U.IF_FREQ);
}
From 367cfd1ece59baca8450bffe3fd974af709060f4 Mon Sep 17 00:00:00 2001
From: Peter Ahlers
Date: Fri, 7 Oct 2022 22:29:16 +0200
Subject: [PATCH 09/20] refactor(RtlCom): Return into class
---
lib/rtlcom.js | 253 +++++++++++++++++++++++++-------------------------
1 file changed, 124 insertions(+), 129 deletions(-)
diff --git a/lib/rtlcom.js b/lib/rtlcom.js
index 4e2e001..7351971 100644
--- a/lib/rtlcom.js
+++ b/lib/rtlcom.js
@@ -13,22 +13,78 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-/**
- * Low-level communications with the RTL2832U-based dongle.
- * @param {ConnectionHandle} conn The USB connection handle.
- * @constructor
- */
-export function RtlCom(conn) {
+export class RtlCom {
/**
* Whether to log all USB transfers.
*/
- const VERBOSE = false;
+ static VERBOSE = false;
/**
* Set in the control messages' index field for write operations.
*/
- const WRITE_FLAG = 0x10;
+ static WRITE_FLAG = 0x10;
+
+ /**
+ * Commands for writeEach.
+ */
+ static CMD = {
+ REG: 1,
+ REGMASK: 2,
+ DEMODREG: 3,
+ I2CREG: 4
+ };
+
+ /**
+ * Register blocks.
+ */
+ static BLOCK = {
+ DEMOD: 0x000,
+ USB: 0x100,
+ SYS: 0x200,
+ I2C: 0x600
+ };
+
+ /**
+ * Device registers.
+ */
+ static REG = {
+ SYSCTL: 0x2000,
+ EPA_CTL: 0x2148,
+ EPA_MAXPKT: 0x2158,
+ DEMOD_CTL: 0x3000,
+ DEMOD_CTL_1: 0x300b
+ };
+
+ #conn;
+
+ /**
+ * Low-level communications with the RTL2832U-based dongle.
+ * @param {ConnectionHandle} conn The USB connection handle.
+ * @constructor
+ */
+ constructor(conn) {
+ this.#conn = conn;
+ }
+
+ demod = {
+ readRegister: this.#readDemodReg,
+ writeRegister: this.#writeDemodReg
+ }
+ i2c = {
+ open: this.#openI2C,
+ close: this.#closeI2C,
+ readRegister: this.#readI2CReg,
+ writeRegister: this.#writeI2CReg,
+ readRegBuffer: this.#readI2CRegBuffer
+ }
+ bulk = {
+ readBuffer: this.#readBulk
+ }
+ iface = {
+ claim: this.#claimInterface,
+ release: this.#releaseInterface
+ }
/**
* Writes a buffer into a dongle's register.
@@ -36,8 +92,8 @@ export function RtlCom(conn) {
* @param {number} reg The register number.
* @param {ArrayBuffer} buffer The buffer to write.
*/
- async function writeRegBuffer(block, reg, buffer) {
- await writeCtrlMsg(reg, block | WRITE_FLAG, buffer);
+ async #writeRegBuffer(block, reg, buffer) {
+ await this.#writeCtrlMsg(reg, block | RtlCom.WRITE_FLAG, buffer);
}
/**
@@ -47,8 +103,8 @@ export function RtlCom(conn) {
* @param {number} length The length in bytes of the buffer to read.
* @return {ArrayBuffer} The read buffer.
*/
- async function readRegBuffer(block, reg, length) {
- return readCtrlMsg(reg, block, length);
+ async #readRegBuffer(block, reg, length) {
+ return this.#readCtrlMsg(reg, block, length);
}
/**
@@ -58,8 +114,8 @@ export function RtlCom(conn) {
* @param {number} value The value to write.
* @param {number} length The width in bytes of this value.
*/
- async function writeReg(block, reg, value, length) {
- await writeCtrlMsg(reg, block | WRITE_FLAG, numberToBuffer(value, length));
+ async writeRegister(block, reg, value, length) {
+ await this.#writeCtrlMsg(reg, block | RtlCom.WRITE_FLAG, RtlCom.numberToBuffer(value, length));
}
/**
@@ -69,8 +125,8 @@ export function RtlCom(conn) {
* @param {number} length The width in bytes of the value to read.
* @return {number} The decoded value.
*/
- async function readReg(block, reg, length) {
- return bufferToNumber(await readCtrlMsg(reg, block, length));
+ async readRegister(block, reg, length) {
+ return RtlCom.bufferToNumber(await this.#readCtrlMsg(reg, block, length));
}
/**
@@ -80,15 +136,15 @@ export function RtlCom(conn) {
* @param {number} value The value to write.
* @param {number} mask The mask for the value to write.
*/
- async function writeRegMask(block, reg, value, mask) {
+ async writeRegMask(block, reg, value, mask) {
if (mask === 0xff) {
- await writeReg(block, reg, value, 1);
+ await this.writeRegister(block, reg, value, 1);
} else {
- let old = readReg(block, reg, 1);
+ let old = this.readRegister(block, reg, 1);
value &= mask;
old &= ~mask;
value |= old;
- await writeReg(block, reg, value, 1);
+ await this.writeRegister(block, reg, value, 1);
}
}
@@ -98,8 +154,8 @@ export function RtlCom(conn) {
* @param {number} addr The register's address.
* @return {number} The decoded value.
*/
- async function readDemodReg(page, addr) {
- return readReg(page, (addr << 8) | 0x20, 1);
+ async #readDemodReg(page, addr) {
+ return this.readRegister(page, (addr << 8) | 0x20, 1);
}
/**
@@ -109,23 +165,23 @@ export function RtlCom(conn) {
* @param {number} value The value to write.
* @param {number} len The width in bytes of this value.
*/
- async function writeDemodReg(page, addr, value, len) {
- await writeRegBuffer(page, (addr << 8) | 0x20, numberToBuffer(value, len, true));
- return readDemodReg(0x0a, 0x01);
+ async #writeDemodReg(page, addr, value, len) {
+ await this.#writeRegBuffer(page, (addr << 8) | 0x20, RtlCom.numberToBuffer(value, len, true));
+ return this.#readDemodReg(0x0a, 0x01);
}
/**
* Opens the I2C repeater.
*/
- async function openI2C() {
- await writeDemodReg(1, 1, 0x18, 1);
+ async #openI2C() {
+ await this.#writeDemodReg(1, 1, 0x18, 1);
}
/**
* Closes the I2C repeater.
*/
- async function closeI2C() {
- await writeDemodReg(1, 1, 0x10, 1);
+ async #closeI2C() {
+ await this.#writeDemodReg(1, 1, 0x10, 1);
}
/**
@@ -133,9 +189,9 @@ export function RtlCom(conn) {
* @param {number} addr The device's address.
* @param {number} reg The register number.
*/
- async function readI2CReg(addr, reg) {
- await writeRegBuffer(BLOCK.I2C, addr, new Uint8Array([reg]).buffer);
- return readReg(BLOCK.I2C, addr, 1);
+ async #readI2CReg(addr, reg) {
+ await this.#writeRegBuffer(RtlCom.BLOCK.I2C, addr, new Uint8Array([reg]).buffer);
+ return this.readRegister(RtlCom.BLOCK.I2C, addr, 1);
}
/**
@@ -144,8 +200,8 @@ export function RtlCom(conn) {
* @param {number} reg The register number.
* @param {number} value The value to write.
*/
- async function writeI2CReg(addr, reg, value) {
- await writeRegBuffer(BLOCK.I2C, addr, new Uint8Array([reg, value]).buffer);
+ async #writeI2CReg(addr, reg, value) {
+ await this.#writeRegBuffer(RtlCom.BLOCK.I2C, addr, new Uint8Array([reg, value]).buffer);
}
/**
@@ -154,9 +210,9 @@ export function RtlCom(conn) {
* @param {number} reg The register number.
* @param {number} len The number of bytes to read.
*/
- async function readI2CRegBuffer(addr, reg, len) {
- await writeRegBuffer(BLOCK.I2C, addr, new Uint8Array([reg]).buffer);
- return readRegBuffer(BLOCK.I2C, addr, len);
+ async #readI2CRegBuffer(addr, reg, len) {
+ await this.#writeRegBuffer(RtlCom.BLOCK.I2C, addr, new Uint8Array([reg]).buffer);
+ return this.#readRegBuffer(RtlCom.BLOCK.I2C, addr, len);
}
/**
@@ -165,11 +221,11 @@ export function RtlCom(conn) {
* @param {number} reg The register number.
* @param {ArrayBuffer} buffer The buffer to write.
*/
- async function writeI2CRegBuffer(addr, reg, buffer) {
+ async #writeI2CRegBuffer(addr, reg, buffer) {
const data = new Uint8Array(buffer.byteLength + 1);
data[0] = reg;
data.set(new Uint8Array(buffer), 1);
- await writeRegBuffer(BLOCK.I2C, addr, data.buffer);
+ await this.#writeRegBuffer(RtlCom.BLOCK.I2C, addr, data.buffer);
}
/**
@@ -177,7 +233,7 @@ export function RtlCom(conn) {
* @param {ArrayBuffer} buffer The buffer to decode.
* @return {number} The decoded number.
*/
- function bufferToNumber(buffer) {
+ static bufferToNumber(buffer) {
let len = buffer.byteLength;
const dv = new DataView(buffer);
if (len === 0) {
@@ -199,7 +255,7 @@ export function RtlCom(conn) {
* @param {number} len The number of bytes to encode into.
* @param {boolean=} opt_bigEndian Whether to use a big-endian encoding.
*/
- function numberToBuffer(value, len, opt_bigEndian) {
+ static numberToBuffer(value, len, opt_bigEndian) {
const buffer = new ArrayBuffer(len);
const dv = new DataView(buffer);
if (len === 1) {
@@ -220,7 +276,7 @@ export function RtlCom(conn) {
* @param {number} index The index field of the control message.
* @param {number} length The number of bytes to read.
*/
- async function readCtrlMsg(value, index, length) {
+ async #readCtrlMsg(value, index, length) {
const ti = {
'requestType': 'vendor',
'recipient': 'device',
@@ -231,12 +287,12 @@ export function RtlCom(conn) {
'length': Math.max(8, length)
};
try {
- let data = await conn.controlTransfer(ti);
+ let data = await this.#conn.controlTransfer(ti);
data = data.slice(0, length);
- if (VERBOSE) {
+ if (RtlCom.VERBOSE) {
console.log('IN value 0x' + value.toString(16) + ' index 0x' +
index.toString(16));
- console.log(' read -> ' + dumpBuffer(data));
+ console.log(' read -> ' + this.#dumpBuffer(data));
}
return data;
@@ -253,7 +309,7 @@ export function RtlCom(conn) {
* @param {number} index The index field of the control message.
* @param {ArrayBuffer} buffer The buffer to write to the device.
*/
- async function writeCtrlMsg(value, index, buffer) {
+ async #writeCtrlMsg(value, index, buffer) {
const ti = {
'requestType': 'vendor',
'recipient': 'device',
@@ -264,14 +320,14 @@ export function RtlCom(conn) {
'data': buffer
};
try {
- await conn.controlTransfer(ti);
- if (VERBOSE) {
+ await this.#conn.controlTransfer(ti);
+ if (RtlCom.VERBOSE) {
console.log('OUT value 0x' + value.toString(16) + ' index 0x' +
- index.toString(16) + ' data ' + dumpBuffer(buffer));
+ index.toString(16) + ' data ' + this.#dumpBuffer(buffer));
}
} catch (error) {
const msg = 'USB write failed (value 0x' + value.toString(16) +
- ' index 0x' + index.toString(16) + ' data ' + dumpBuffer(buffer) +
+ ' index 0x' + index.toString(16) + ' data ' + this.#dumpBuffer(buffer) +
') message="' +
error.message + '"';
throw new Error(msg);
@@ -283,15 +339,15 @@ export function RtlCom(conn) {
* @param {number} length The number of bytes to read.
* @return {ArrayBuffer} The received buffer.
*/
- async function readBulk(length) {
+ async #readBulk(length) {
const ti = {
'direction': 'in',
'endpoint': 1,
'length': length
};
try {
- const data = await conn.bulkTransfer(ti);
- if (VERBOSE) {
+ const data = await this.#conn.bulkTransfer(ti);
+ if (RtlCom.VERBOSE) {
console.log('IN BULK requested ' + length + ' received ' + data.byteLength);
}
return data;
@@ -306,32 +362,32 @@ export function RtlCom(conn) {
/**
* Claims the USB interface.
*/
- async function claimInterface() {
- await conn.claimInterface(0);
+ async #claimInterface() {
+ await this.#conn.claimInterface(0);
}
/**
* Releases the USB interface.
*/
- async function releaseInterface() {
- await conn.releaseInterface(0);
+ async #releaseInterface() {
+ await this.#conn.releaseInterface(0);
}
/**
* Performs several write operations as specified in an array.
* @param {Array.>} array The operations to perform.
*/
- async function writeEach(array) {
+ async writeEach(array) {
for (const element of array) {
- const line = element;
- if (line[0] === CMD.REG) {
- await writeReg(line[1], line[2], line[3], line[4]);
- } else if (line[0] === CMD.REGMASK) {
- await writeRegMask(line[1], line[2], line[3], line[4]);
- } else if (line[0] === CMD.DEMODREG) {
- await writeDemodReg(line[1], line[2], line[3], line[4]);
- } else if (line[0] === CMD.I2CREG) {
- await writeI2CReg(line[1], line[2], line[3]);
+ const line = element;
+ if (line[0] === RtlCom.CMD.REG) {
+ await this.writeRegister(line[1], line[2], line[3], line[4]);
+ } else if (line[0] === RtlCom.CMD.REGMASK) {
+ await this.writeRegMask(line[1], line[2], line[3], line[4]);
+ } else if (line[0] === RtlCom.CMD.DEMODREG) {
+ await this.#writeDemodReg(line[1], line[2], line[3], line[4]);
+ } else if (line[0] === RtlCom.CMD.I2CREG) {
+ await this.#writeI2CReg(line[1], line[2], line[3]);
} else {
throw new Error('Unsupported operation [' + line + ']');
}
@@ -343,7 +399,7 @@ export function RtlCom(conn) {
* @param {ArrayBuffer} buffer The buffer to display.
* @return {string} The string representation of the buffer.
*/
- function dumpBuffer(buffer) {
+ #dumpBuffer(buffer) {
const bytes = [];
const arr = new Uint8Array(buffer);
for (let i = 0; i < arr.length; ++i) {
@@ -351,65 +407,4 @@ export function RtlCom(conn) {
}
return '[' + bytes + ']';
}
-
-
- return {
- writeRegister: writeReg,
- readRegister: readReg,
- writeRegMask: writeRegMask,
- demod: {
- readRegister: readDemodReg,
- writeRegister: writeDemodReg
- },
- i2c: {
- open: openI2C,
- close: closeI2C,
- readRegister: readI2CReg,
- writeRegister: writeI2CReg,
- readRegBuffer: readI2CRegBuffer
- },
- bulk: {
- readBuffer: readBulk
- },
- iface: {
- claim: claimInterface,
- release: releaseInterface
- },
- writeEach: writeEach
- };
}
-
-/**
- * Commands for writeEach.
- */
-const CMD = {
- REG: 1,
- REGMASK: 2,
- DEMODREG: 3,
- I2CREG: 4
-};
-
-/**
- * Register blocks.
- */
-const BLOCK = {
- DEMOD: 0x000,
- USB: 0x100,
- SYS: 0x200,
- I2C: 0x600
-};
-
-/**
- * Device registers.
- */
-const REG = {
- SYSCTL: 0x2000,
- EPA_CTL: 0x2148,
- EPA_MAXPKT: 0x2158,
- DEMOD_CTL: 0x3000,
- DEMOD_CTL_1: 0x300b
-};
-
-RtlCom.CMD = CMD;
-RtlCom.BLOCK = BLOCK;
-RtlCom.REG = REG;
From 14aa7c51f07337f9fba42e9b73aa160d6b085470 Mon Sep 17 00:00:00 2001
From: Peter Ahlers
Date: Fri, 7 Oct 2022 22:53:49 +0200
Subject: [PATCH 10/20] fix(RtlCom): Fix sub methods
---
lib/rtlcom.js | 22 +++++++++++-----------
1 file changed, 11 insertions(+), 11 deletions(-)
diff --git a/lib/rtlcom.js b/lib/rtlcom.js
index 7351971..bc425e8 100644
--- a/lib/rtlcom.js
+++ b/lib/rtlcom.js
@@ -68,23 +68,23 @@ export class RtlCom {
}
demod = {
- readRegister: this.#readDemodReg,
- writeRegister: this.#writeDemodReg
+ readRegister: this.#readDemodReg.bind(this),
+ writeRegister: this.#writeDemodReg.bind(this)
}
i2c = {
- open: this.#openI2C,
- close: this.#closeI2C,
- readRegister: this.#readI2CReg,
- writeRegister: this.#writeI2CReg,
- readRegBuffer: this.#readI2CRegBuffer
+ open: this.#openI2C.bind(this),
+ close: this.#closeI2C.bind(this),
+ readRegister: this.#readI2CReg.bind(this),
+ writeRegister: this.#writeI2CReg.bind(this),
+ readRegBuffer: this.#readI2CRegBuffer.bind(this)
}
bulk = {
- readBuffer: this.#readBulk
+ readBuffer: this.#readBulk.bind(this)
}
iface = {
- claim: this.#claimInterface,
- release: this.#releaseInterface
- }
+ claim: this.#claimInterface.bind(this),
+ release: this.#releaseInterface.bind(this)
+ };
/**
* Writes a buffer into a dongle's register.
From 040191870d4be991108b0c7e57c74d11e803e15c Mon Sep 17 00:00:00 2001
From: Peter Ahlers
Date: Fri, 7 Oct 2022 23:15:46 +0200
Subject: [PATCH 11/20] fix(RTL2832U): Fix setCenterFrequency
---
lib/rtl2832u.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/lib/rtl2832u.js b/lib/rtl2832u.js
index e7bfac7..4c709d1 100644
--- a/lib/rtl2832u.js
+++ b/lib/rtl2832u.js
@@ -197,7 +197,7 @@ export class RTL2832U {
*/
async setCenterFrequency(freq) {
await this.#com.i2c.open();
- const actualFreq = this.#tuner.setFrequency(freq + RTL2832U.IF_FREQ);
+ const actualFreq = await this.#tuner.setFrequency(freq + RTL2832U.IF_FREQ);
await this.#com.i2c.close();
return (actualFreq - RTL2832U.IF_FREQ);
}
From d94edc9df75ef63e46bef76126ebc0535890e953 Mon Sep 17 00:00:00 2001
From: Peter Ahlers
Date: Sun, 9 Oct 2022 14:48:34 +0200
Subject: [PATCH 12/20] refactor(RtlSdr): Return into class
---
lib/rtlsdr.js | 103 ++++++++++++++++++++++++++++----------------------
1 file changed, 58 insertions(+), 45 deletions(-)
diff --git a/lib/rtlsdr.js b/lib/rtlsdr.js
index b05d860..31da8c5 100644
--- a/lib/rtlsdr.js
+++ b/lib/rtlsdr.js
@@ -11,63 +11,76 @@
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
-import {USB as usb} from './web-usb';
import {RTL2832U} from './rtl2832u';
-const FILTERS = [
- {
- vendorId: 0x0bda,
- productId: 0x2832
- },
- {
- vendorId: 0x0bda,
- productId: 0x2838
- }
-];
+export class RtlSdr {
+ static FILTERS = [
+ {
+ vendorId: 0x0bda,
+ productId: 0x2832
+ },
+ {
+ vendorId: 0x0bda,
+ productId: 0x2838
+ }
+ ];
-export function RtlSdr(usbDevice) {
- this._usbDevice = usbDevice;
- this._rtl2832u = null;
-}
+ #usbDevice;
+ #rtl2832u = null;
-RtlSdr.prototype.open = async function (options) {
- await this._usbDevice.open();
- await this._usbDevice.selectConfiguration(1);
+ constructor(usbDevice) {
+ this.#usbDevice = usbDevice;
+ }
- this._rtl2832u = new RTL2832U(this._usbDevice, options.ppm, options.gain);
+ /**
+ * Use import {USB} from './web-usb'; or import {USB} from './usb'
+ * @param usb
+ * @returns {Promise<*>}
+ */
+ static requestDevice = async function (usb) {
+ let usbDevice = await usb.requestDevice(RtlSdr.FILTERS);
- await this._rtl2832u.open();
-};
+ return new RtlSdr(usbDevice);
+ };
-RtlSdr.prototype.setSampleRate = async function (sampleRate) {
- return this._rtl2832u.setSampleRate(sampleRate);
-};
+ /**
+ * Use import {USB} from './web-usb'; or import {USB} from './usb'
+ * @param usb
+ * @returns {Promise<*>}
+ */
+ static getDevices = async function (usb) {
+ let usbDevices = await usb.getDevices(RtlSdr.FILTERS);
-RtlSdr.prototype.setCenterFrequency = async function (centerFrequency) {
- return this._rtl2832u.setCenterFrequency(centerFrequency);
-};
+ return usbDevices.map((usbDevice) => new RtlSdr(usbDevice));
+ };
-RtlSdr.prototype.resetBuffer = async function () {
- return this._rtl2832u.resetBuffer();
-};
+ async open({ppm, gain}) {
+ await this.#usbDevice.open();
+ await this.#usbDevice.selectConfiguration(1);
-RtlSdr.prototype.readSamples = async function (length) {
- return this._rtl2832u.readSamples(length);
-};
+ this.#rtl2832u = new RTL2832U(this.#usbDevice, ppm, gain);
-RtlSdr.prototype.close = async function () {
- await this._rtl2832u.close();
- await this._usbDevice.close();
-};
+ await this.#rtl2832u.open();
+ }
-RtlSdr.requestDevice = async function () {
- let usbDevice = await usb.requestDevice(FILTERS);
+ async setSampleRate(sampleRate) {
+ return this.#rtl2832u.setSampleRate(sampleRate);
+ }
- return new RtlSdr(usbDevice);
-};
+ async setCenterFrequency(centerFrequency) {
+ return this.#rtl2832u.setCenterFrequency(centerFrequency);
+ }
-RtlSdr.getDevices = async function () {
- let usbDevices = await usb.getDevices(FILTERS);
+ async resetBuffer() {
+ return this.#rtl2832u.resetBuffer();
+ }
+
+ async readSamples(length) {
+ return this.#rtl2832u.readSamples(length);
+ }
- return usbDevices.map((usbDevice) => new RtlSdr(usbDevice));
-};
+ async close() {
+ await this.#rtl2832u.close();
+ await this.#usbDevice.close();
+ }
+}
From 080a6e606960036944bbe7d7bc7b87af093c01d1 Mon Sep 17 00:00:00 2001
From: Peter Ahlers
Date: Sun, 9 Oct 2022 15:06:04 +0200
Subject: [PATCH 13/20] refactor(RtlSdr): Return into class
---
lib/rtlsdr.js | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/lib/rtlsdr.js b/lib/rtlsdr.js
index 31da8c5..cce1d3b 100644
--- a/lib/rtlsdr.js
+++ b/lib/rtlsdr.js
@@ -37,22 +37,22 @@ export class RtlSdr {
* @param usb
* @returns {Promise<*>}
*/
- static requestDevice = async function (usb) {
+ static async requestDevice (usb) {
let usbDevice = await usb.requestDevice(RtlSdr.FILTERS);
return new RtlSdr(usbDevice);
- };
+ }
/**
* Use import {USB} from './web-usb'; or import {USB} from './usb'
* @param usb
* @returns {Promise<*>}
*/
- static getDevices = async function (usb) {
+ static async getDevices (usb) {
let usbDevices = await usb.getDevices(RtlSdr.FILTERS);
return usbDevices.map((usbDevice) => new RtlSdr(usbDevice));
- };
+ }
async open({ppm, gain}) {
await this.#usbDevice.open();
From e004b49b43473aeec4adabfd8df0425c7d0e86e2 Mon Sep 17 00:00:00 2001
From: Peter Ahlers
Date: Sun, 9 Oct 2022 15:06:50 +0200
Subject: [PATCH 14/20] refactor(RtlCom): Boy scout rule
---
lib/rtlcom.js | 35 ++++++++++++++++++-----------------
1 file changed, 18 insertions(+), 17 deletions(-)
diff --git a/lib/rtlcom.js b/lib/rtlcom.js
index bc425e8..3694ba9 100644
--- a/lib/rtlcom.js
+++ b/lib/rtlcom.js
@@ -278,13 +278,13 @@ export class RtlCom {
*/
async #readCtrlMsg(value, index, length) {
const ti = {
- 'requestType': 'vendor',
- 'recipient': 'device',
- 'direction': 'in',
- 'request': 0,
- 'value': value,
- 'index': index,
- 'length': Math.max(8, length)
+ requestType: 'vendor',
+ recipient: 'device',
+ direction: 'in',
+ request: 0,
+ value,
+ index,
+ length: Math.max(8, length)
};
try {
let data = await this.#conn.controlTransfer(ti);
@@ -311,13 +311,13 @@ export class RtlCom {
*/
async #writeCtrlMsg(value, index, buffer) {
const ti = {
- 'requestType': 'vendor',
- 'recipient': 'device',
- 'direction': 'out',
- 'request': 0,
- 'value': value,
- 'index': index,
- 'data': buffer
+ requestType: 'vendor',
+ recipient: 'device',
+ direction: 'out',
+ request: 0,
+ value,
+ index,
+ data: buffer
};
try {
await this.#conn.controlTransfer(ti);
@@ -341,9 +341,9 @@ export class RtlCom {
*/
async #readBulk(length) {
const ti = {
- 'direction': 'in',
- 'endpoint': 1,
- 'length': length
+ direction: 'in',
+ endpoint: 1,
+ length: length
};
try {
const data = await this.#conn.bulkTransfer(ti);
@@ -351,6 +351,7 @@ export class RtlCom {
console.log('IN BULK requested ' + length + ' received ' + data.byteLength);
}
return data;
+
} catch (error) {
const msg = 'USB bulk read failed (length 0x' + length.toString(16) +
'), error="' +
From bd90dae018ba9afa749ff10727441aa1b0ef5202 Mon Sep 17 00:00:00 2001
From: Peter Ahlers
Date: Sun, 9 Oct 2022 15:07:32 +0200
Subject: [PATCH 15/20] refactor(web-usb): Return into class
---
lib/web-usb.js | 93 ++++++++++++++++++++++++++------------------------
1 file changed, 48 insertions(+), 45 deletions(-)
diff --git a/lib/web-usb.js b/lib/web-usb.js
index 3c3cb57..a309f3f 100644
--- a/lib/web-usb.js
+++ b/lib/web-usb.js
@@ -12,62 +12,65 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-export function USB(device) {
- this._device = device;
-}
+export class USB {
+ #device;
+
+ constructor(device) {
+ this.#device = device;
+ }
-USB.prototype.open = async function() {
- await this._device.open();
-};
+ static async requestDevice(filters) {
+ const usbDevice = await navigator.usb.requestDevice({
+ filters: filters
+ });
-USB.prototype.selectConfiguration = async function(configuration) {
- await this._device.selectConfiguration(configuration);
-};
+ return new USB(usbDevice);
+ }
-USB.prototype.claimInterface = async function(deviceInterface) {
- await this._device.claimInterface(deviceInterface);
-};
+ static async getDevices(filters) {
+ const usbDevices = await navigator.usb.getDevices();
-USB.prototype.releaseInterface = async function(deviceInterface) {
- await this._device.releaseInterface(deviceInterface);
-};
+ return usbDevices
+ .filter((usbDevice) => {
+ return filters.some(filter => filter.vendorId === usbDevice.vendorId && filter.productId === usbDevice.productId);
+ })
+ .map(usbDevice => new USB(usbDevice));
+ }
-USB.prototype.controlTransfer = async function(ti) {
- if (ti.direction === 'out') {
- await this._device.controlTransferOut(ti, ti.data);
- } else if (ti.direction === 'in') {
- const result = await this._device.controlTransferIn(ti, ti.length);
+ async open() {
+ await this.#device.open();
+ }
- return result.data.buffer;
- }
-};
+ async selectConfiguration(configuration) {
+ await this.#device.selectConfiguration(configuration);
+ }
-USB.prototype.bulkTransfer = async function(ti) {
- const result = await this._device.transferIn(ti.endpoint, ti.length);
+ async claimInterface(iface) {
+ await this.#device.claimInterface(iface);
+ }
- return result.data.buffer;
-};
+ async releaseInterface(iface) {
+ await this.#device.releaseInterface(iface);
+ }
-USB.prototype.close = async function() {
- await this._device.close();
-};
+ async controlTransfer(ti) {
+ if (ti.direction === 'out') {
+ await this.#device.controlTransferOut(ti, ti.data);
-USB.requestDevice = async function(filters) {
- const usbDevice = await navigator.usb.requestDevice({
- filters: filters
- });
+ } else if (ti.direction === 'in') {
+ const result = await this.#device.controlTransferIn(ti, ti.length);
- return new USB(usbDevice);
-};
+ return result.data.buffer;
+ }
+ }
-USB.getDevices = async function (filters) {
- const usbDevices = await navigator.usb.getDevices();
+ async bulkTransfer(ti) {
+ const result = await this.#device.transferIn(ti.endpoint, ti.length);
- console.debug('USB devices', usbDevices);
+ return result.data.buffer;
+ }
- return usbDevices
- .filter((usbDevice) => {
- return filters.some(filter => filter.vendorId === usbDevice.vendorId && filter.productId === usbDevice.productId);
- })
- .map(usbDevice => new USB(usbDevice));
-};
+ async close() {
+ await this.#device.close();
+ }
+}
From 33c6137bb64a93f65adbe7a7160ec86b6d35c950 Mon Sep 17 00:00:00 2001
From: Peter Ahlers
Date: Sun, 9 Oct 2022 15:07:54 +0200
Subject: [PATCH 16/20] refactor(usb): Return into class
---
lib/usb.js | 248 +++++++++++++++++++++++++++--------------------------
1 file changed, 125 insertions(+), 123 deletions(-)
diff --git a/lib/usb.js b/lib/usb.js
index 60a5efb..cff882f 100644
--- a/lib/usb.js
+++ b/lib/usb.js
@@ -12,136 +12,138 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-const usb = require('usb');
+import {usb as nodejsUsb} from 'usb';
-function USB(device) {
- this._device = device;
-}
+export class USB {
+ #device;
+ #iface;
+
+ constructor(device) {
+ this.#device = device;
+ }
+
+ static async requestDevice(filters) {
+ return new Promise((resolve, reject) => {
+ for (let i = 0; i < filters.length; i++) {
+ const filter = filters[i];
+
+ const usbDevice = nodejsUsb.findByIds(filter.vendorId, filter.productId);
+
+ if (usbDevice) {
+ return resolve(new USB(usbDevice));
+ }
+ }
+
+ reject(new Error('No devices found!'));
+ });
+ }
+
+ static async getDevices(filters) {
+ return new Promise((resolve) => {
+ const usbDevices = nodejsUsb.getDeviceList();
+
+ const devices = usbDevices
+ .filter((usbDevice) => {
+ return filters.some(filter => filter.vendorId === usbDevice.vendorId && filter.productId === usbDevice.productId);
+ })
+ .map(usbDevice => new USB(usbDevice));
+
+ resolve(devices);
+ });
+ }
+
+ async open() {
+ return new Promise((resolve) => {
+ this.#device.open();
+
+ resolve();
+ });
+ }
+
+ async selectConfiguration(configuration) {
+ return new Promise((resolve, reject) => {
+ this.#device.setConfiguration(configuration, (err) => {
+ if (err) {
+ return reject(err);
+ }
-USB.prototype.open = async function() {
- return new Promise((resolve) => {
- this._device.open();
-
- resolve();
- });
-};
-
-USB.prototype.selectConfiguration = async function(configuration) {
- return new Promise((resolve, reject) => {
- this._device.setConfiguration(configuration, (err) => {
- if (err) {
- return reject(err);
- }
-
- resolve();
- });
- });
-};
-
-USB.prototype.claimInterface = async function(interface) {
- return new Promise((resolve) => {
- this._device.interface(interface).claim();
- this._interface = interface;
-
- resolve();
- });
-};
-
-USB.prototype.releaseInterface = async function(interface) {
- return new Promise((resolve) => {
- this._device.interface(interface).release((error) => {
- if (error) {
- return reject(error);
- }
-
- resolve();
- });
- });
-};
-
-USB.prototype.controlTransfer = async function(ti) {
- return new Promise((resolve, reject) => {
- let requestType = 0;
- let lengthOrData = ti.length ? ti.length : Buffer.from(ti.data);
-
- if (ti.requestType === 'vendor') {
- requestType |= usb.LIBUSB_REQUEST_TYPE_VENDOR;
+ resolve();
+ });
+ });
}
- if (ti.recipient === 'device') {
- requestType |= usb.LIBUSB_RECIPIENT_DEVICE;
+ async claimInterface(iface) {
+ return new Promise((resolve) => {
+ this.#device.iface(iface).claim();
+ this.#iface = iface;
+
+ resolve();
+ });
}
- if (ti.direction === 'out') {
- requestType |= usb.LIBUSB_ENDPOINT_OUT;
- } else if (ti.direction === 'in') {
- requestType |= usb.LIBUSB_ENDPOINT_IN;
+ async releaseInterface(iface) {
+ return new Promise((resolve, reject) => {
+ this.#device.iface(iface)
+ .release((error) => {
+ if (error) {
+ return reject(error);
+ }
+
+ resolve();
+ });
+ });
+ }
+
+ async controlTransfer(ti) {
+ return new Promise((resolve, reject) => {
+ let requestType = 0;
+ let lengthOrData = ti.length ? ti.length : Buffer.from(ti.data);
+
+ if (ti.requestType === 'vendor') {
+ requestType |= nodejsUsb.LIBUSB_REQUEST_TYPE_VENDOR;
+ }
+
+ if (ti.recipient === 'device') {
+ requestType |= nodejsUsb.LIBUSB_RECIPIENT_DEVICE;
+ }
+
+ if (ti.direction === 'out') {
+ requestType |= nodejsUsb.LIBUSB_ENDPOINT_OUT;
+
+ } else if (ti.direction === 'in') {
+ requestType |= nodejsUsb.LIBUSB_ENDPOINT_IN;
+ }
+
+ this.#device.controlTransfer(requestType, ti.request, ti.value, ti.index, lengthOrData, (err, data) => {
+ if (err) {
+ return reject(err);
+ }
+
+ if (data) {
+ return resolve(Uint8Array.from(data).buffer);
+ }
+
+ resolve();
+ });
+ });
}
- this._device.controlTransfer(requestType, ti.request, ti.value, ti.index, lengthOrData, (err, data) => {
- if (err) {
- return reject(err);
- }
-
- if (data) {
- return resolve(Uint8Array.from(data).buffer);
- }
-
- resolve();
- });
- });
-};
-
-USB.prototype.bulkTransfer = async function(ti) {
- return new Promise((resolve, reject) => {
- this._device.interface(this._interface).endpoints[ti.endpoint - 1].transfer(ti.length, (err, data) => {
- if (err) {
- return reject(err);
- }
-
- resolve(data.buffer);
- });
- });
-};
-
-USB.prototype.close = async function() {
- return new Promise((resolve) => {
- this._device.close(resolve);
- });
-};
-
-USB.requestDevice = async function(filters) {
- return new Promise((resolve, reject) => {
- for (let i = 0; i < filters.length; i++) {
- const filter = filters[i];
-
- const usbDevice = usb.findByIds(filter.vendorId, filter.productId);
-
- if (usbDevice) {
- return resolve(new USB(usbDevice));
- }
+ async bulkTransfer(ti) {
+ return new Promise((resolve, reject) => {
+ this.#device.iface(this.#iface).endpoints[ti.endpoint - 1]
+ .transfer(ti.length, (err, data) => {
+ if (err) {
+ return reject(err);
+ }
+
+ resolve(data.buffer);
+ });
+ });
}
- reject(new Error('No devices found!'));
- });
-};
-
-USB.getDevices = async function(filters) {
- return new Promise((resolve) => {
- const usbDevices = usb.getDeviceList();
- const devices = [];
-
- usbDevices.forEach((usbDevice) => {
- filters.forEach((filter) => {
- if (filter.vendorId === usbDevice.deviceDescriptor.idVendor &&
- filter.productId === usbDevice.deviceDescriptor.idProduct) {
- devices.push(new USB(usbDevice));
- }
- });
- });
-
- resolve(devices);
- });
-};
-
-module.exports = USB;
+ async close() {
+ return new Promise((resolve) => {
+ this.#device.close(resolve);
+ });
+ }
+}
From 3add08268c328acc4a506985b9d37d2b94a27031 Mon Sep 17 00:00:00 2001
From: Peter Ahlers
Date: Sun, 9 Oct 2022 15:08:32 +0200
Subject: [PATCH 17/20] refactor(usb): Add usb classes, needed to start the
RtlSdr
---
index.js | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/index.js b/index.js
index 20c1a72..84618b2 100644
--- a/index.js
+++ b/index.js
@@ -1,3 +1,5 @@
-import {RtlSdr} from './lib/rtlsdr'
+import {RtlSdr} from './lib/rtlsdr';
+import {USB as webUsb} from './lib/web-usb';
+import {USB as nodejsUsb} from './lib/usb';
-export {RtlSdr};
+export {RtlSdr, webUsb, nodejsUsb};
From 10402d11e1e7284996c333beed5f4d33f931d0a7 Mon Sep 17 00:00:00 2001
From: Peter Ahlers
Date: Sun, 9 Oct 2022 15:15:27 +0200
Subject: [PATCH 18/20] docs(README): Update setup and usage
---
README.md | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/README.md b/README.md
index 8827e7c..28c88fa 100644
--- a/README.md
+++ b/README.md
@@ -21,17 +21,17 @@ Supports [Node.js](https://nodejs.org/) and [WebUSB](https://wicg.github.io/webu
Install: `npm i rtlsdrjs`
-Require: `const RtlSdr = require('rtlsdrjs');`
+Import: `import {RtlSdr, nodejsUsb} from 'rtlsdrjs';`
### Browser
-Download a `rtlsdr.js` build from a [release](https://github.com/sandeepmistry/rtlsdrjs/releases).
-
-Include `rtlsdr.js` in you HTML page: ``
+Import: `import {RtlSdr, webUsb} from 'rtlsdrjs';`
## Usage
```javascript
+import {RtlSdr, webUsb} from 'rtlsdrjs';
+
let readSamples = true;
async function start() {
@@ -42,7 +42,7 @@ async function start() {
//
// RtlSdr.getDevices() can be used to get a list of all RTL SDR's attached to system
//
- const sdr = await RtlSdr.requestDevice();
+ const sdr = await RtlSdr.requestDevice(usb);
//
// open the device
From d9e2b88902976892a79bb0b8dcb8b4768820b79c Mon Sep 17 00:00:00 2001
From: Peter Ahlers
Date: Sun, 9 Oct 2022 15:19:15 +0200
Subject: [PATCH 19/20] docs(README): Update setup and usage
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index 28c88fa..17aa418 100644
--- a/README.md
+++ b/README.md
@@ -12,7 +12,7 @@ Supports [Node.js](https://nodejs.org/) and [WebUSB](https://wicg.github.io/webu
### Software
-* [Node.js](https://nodejs.org/) 8.x or later + [node-usb requirements](https://github.com/tessel/node-usb#installation)
+* [Node.js](https://nodejs.org/) v14.13.0 or later + [node-usb requirements](https://github.com/tessel/node-usb#installation)
* [Web browser that supports WebUSB](https://caniuse.com/#feat=webusb)
## Setup
From d4b659c63a76ab0531c1ee6220f297c55b4f82f9 Mon Sep 17 00:00:00 2001
From: Peter Ahlers
Date: Sun, 9 Oct 2022 15:20:38 +0200
Subject: [PATCH 20/20] feat(package): Update to version v14
---
package-lock.json | 2906 +--------------------------------------------
package.json | 12 +-
2 files changed, 33 insertions(+), 2885 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index 7606825..437cc38 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,2417 +1,50 @@
{
"name": "rtlsdrjs",
- "version": "0.0.0",
+ "version": "1.0.0",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "rtlsdrjs",
- "version": "0.0.0",
- "license": "Apache-2.0",
- "dependencies": {
- "usb": "^1.3.1"
- },
- "devDependencies": {
- "browserify": "^16.1.1"
- }
- },
- "node_modules/acorn": {
- "version": "7.4.1",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
- "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
- "dev": true,
- "bin": {
- "acorn": "bin/acorn"
- },
- "engines": {
- "node": ">=0.4.0"
- }
- },
- "node_modules/acorn-node": {
- "version": "1.8.2",
- "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz",
- "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==",
- "dev": true,
- "dependencies": {
- "acorn": "^7.0.0",
- "acorn-walk": "^7.0.0",
- "xtend": "^4.0.2"
- }
- },
- "node_modules/acorn-walk": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz",
- "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==",
- "dev": true,
- "engines": {
- "node": ">=0.4.0"
- }
- },
- "node_modules/asn1.js": {
- "version": "5.4.1",
- "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz",
- "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==",
- "dev": true,
- "dependencies": {
- "bn.js": "^4.0.0",
- "inherits": "^2.0.1",
- "minimalistic-assert": "^1.0.0",
- "safer-buffer": "^2.1.0"
- }
- },
- "node_modules/asn1.js/node_modules/bn.js": {
- "version": "4.12.0",
- "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
- "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
- "dev": true
- },
- "node_modules/assert": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz",
- "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==",
- "dev": true,
- "dependencies": {
- "object-assign": "^4.1.1",
- "util": "0.10.3"
- }
- },
- "node_modules/assert/node_modules/inherits": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz",
- "integrity": "sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA==",
- "dev": true
- },
- "node_modules/assert/node_modules/util": {
- "version": "0.10.3",
- "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz",
- "integrity": "sha512-5KiHfsmkqacuKjkRkdV7SsfDJ2EGiPsK92s2MhNSY0craxjTdKTtqKsJaCWp4LW33ZZ0OPUv1WO/TFvNQRiQxQ==",
- "dev": true,
- "dependencies": {
- "inherits": "2.0.1"
- }
- },
- "node_modules/balanced-match": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
- "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
- "dev": true
- },
- "node_modules/base64-js": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
- "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
- "dev": true,
- "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/bn.js": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz",
- "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==",
- "dev": true
- },
- "node_modules/brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
- "dev": true,
- "dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "node_modules/brorand": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
- "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==",
- "dev": true
- },
- "node_modules/browser-pack": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-6.1.0.tgz",
- "integrity": "sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA==",
- "dev": true,
- "dependencies": {
- "combine-source-map": "~0.8.0",
- "defined": "^1.0.0",
- "JSONStream": "^1.0.3",
- "safe-buffer": "^5.1.1",
- "through2": "^2.0.0",
- "umd": "^3.0.0"
- },
- "bin": {
- "browser-pack": "bin/cmd.js"
- }
- },
- "node_modules/browser-resolve": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-2.0.0.tgz",
- "integrity": "sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ==",
- "dev": true,
- "dependencies": {
- "resolve": "^1.17.0"
- }
- },
- "node_modules/browserify": {
- "version": "16.5.2",
- "resolved": "https://registry.npmjs.org/browserify/-/browserify-16.5.2.tgz",
- "integrity": "sha512-TkOR1cQGdmXU9zW4YukWzWVSJwrxmNdADFbqbE3HFgQWe5wqZmOawqZ7J/8MPCwk/W8yY7Y0h+7mOtcZxLP23g==",
- "dev": true,
- "dependencies": {
- "assert": "^1.4.0",
- "browser-pack": "^6.0.1",
- "browser-resolve": "^2.0.0",
- "browserify-zlib": "~0.2.0",
- "buffer": "~5.2.1",
- "cached-path-relative": "^1.0.0",
- "concat-stream": "^1.6.0",
- "console-browserify": "^1.1.0",
- "constants-browserify": "~1.0.0",
- "crypto-browserify": "^3.0.0",
- "defined": "^1.0.0",
- "deps-sort": "^2.0.0",
- "domain-browser": "^1.2.0",
- "duplexer2": "~0.1.2",
- "events": "^2.0.0",
- "glob": "^7.1.0",
- "has": "^1.0.0",
- "htmlescape": "^1.1.0",
- "https-browserify": "^1.0.0",
- "inherits": "~2.0.1",
- "insert-module-globals": "^7.0.0",
- "JSONStream": "^1.0.3",
- "labeled-stream-splicer": "^2.0.0",
- "mkdirp-classic": "^0.5.2",
- "module-deps": "^6.2.3",
- "os-browserify": "~0.3.0",
- "parents": "^1.0.1",
- "path-browserify": "~0.0.0",
- "process": "~0.11.0",
- "punycode": "^1.3.2",
- "querystring-es3": "~0.2.0",
- "read-only-stream": "^2.0.0",
- "readable-stream": "^2.0.2",
- "resolve": "^1.1.4",
- "shasum": "^1.0.0",
- "shell-quote": "^1.6.1",
- "stream-browserify": "^2.0.0",
- "stream-http": "^3.0.0",
- "string_decoder": "^1.1.1",
- "subarg": "^1.0.0",
- "syntax-error": "^1.1.1",
- "through2": "^2.0.0",
- "timers-browserify": "^1.0.1",
- "tty-browserify": "0.0.1",
- "url": "~0.11.0",
- "util": "~0.10.1",
- "vm-browserify": "^1.0.0",
- "xtend": "^4.0.0"
- },
- "bin": {
- "browserify": "bin/cmd.js"
- },
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/browserify-aes": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz",
- "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==",
- "dev": true,
- "dependencies": {
- "buffer-xor": "^1.0.3",
- "cipher-base": "^1.0.0",
- "create-hash": "^1.1.0",
- "evp_bytestokey": "^1.0.3",
- "inherits": "^2.0.1",
- "safe-buffer": "^5.0.1"
- }
- },
- "node_modules/browserify-cipher": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz",
- "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==",
- "dev": true,
- "dependencies": {
- "browserify-aes": "^1.0.4",
- "browserify-des": "^1.0.0",
- "evp_bytestokey": "^1.0.0"
- }
- },
- "node_modules/browserify-des": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz",
- "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==",
- "dev": true,
- "dependencies": {
- "cipher-base": "^1.0.1",
- "des.js": "^1.0.0",
- "inherits": "^2.0.1",
- "safe-buffer": "^5.1.2"
- }
- },
- "node_modules/browserify-rsa": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz",
- "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==",
- "dev": true,
- "dependencies": {
- "bn.js": "^5.0.0",
- "randombytes": "^2.0.1"
- }
- },
- "node_modules/browserify-sign": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz",
- "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==",
- "dev": true,
- "dependencies": {
- "bn.js": "^5.1.1",
- "browserify-rsa": "^4.0.1",
- "create-hash": "^1.2.0",
- "create-hmac": "^1.1.7",
- "elliptic": "^6.5.3",
- "inherits": "^2.0.4",
- "parse-asn1": "^5.1.5",
- "readable-stream": "^3.6.0",
- "safe-buffer": "^5.2.0"
- }
- },
- "node_modules/browserify-sign/node_modules/readable-stream": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
- "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
- "dev": true,
- "dependencies": {
- "inherits": "^2.0.3",
- "string_decoder": "^1.1.1",
- "util-deprecate": "^1.0.1"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/browserify-zlib": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz",
- "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==",
- "dev": true,
- "dependencies": {
- "pako": "~1.0.5"
- }
- },
- "node_modules/buffer": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.2.1.tgz",
- "integrity": "sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg==",
- "dev": true,
- "dependencies": {
- "base64-js": "^1.0.2",
- "ieee754": "^1.1.4"
- }
- },
- "node_modules/buffer-from": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
- "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
- "dev": true
- },
- "node_modules/buffer-xor": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz",
- "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==",
- "dev": true
- },
- "node_modules/builtin-status-codes": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz",
- "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==",
- "dev": true
- },
- "node_modules/cached-path-relative": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.1.0.tgz",
- "integrity": "sha512-WF0LihfemtesFcJgO7xfOoOcnWzY/QHR4qeDqV44jPU3HTI54+LnfXK3SA27AVVGCdZFgjjFFaqUA9Jx7dMJZA==",
- "dev": true
- },
- "node_modules/cipher-base": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz",
- "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==",
- "dev": true,
- "dependencies": {
- "inherits": "^2.0.1",
- "safe-buffer": "^5.0.1"
- }
- },
- "node_modules/combine-source-map": {
- "version": "0.8.0",
- "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz",
- "integrity": "sha512-UlxQ9Vw0b/Bt/KYwCFqdEwsQ1eL8d1gibiFb7lxQJFdvTgc2hIZi6ugsg+kyhzhPV+QEpUiEIwInIAIrgoEkrg==",
- "dev": true,
- "dependencies": {
- "convert-source-map": "~1.1.0",
- "inline-source-map": "~0.6.0",
- "lodash.memoize": "~3.0.3",
- "source-map": "~0.5.3"
- }
- },
- "node_modules/concat-map": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
- "dev": true
- },
- "node_modules/concat-stream": {
- "version": "1.6.2",
- "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
- "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
- "dev": true,
- "engines": [
- "node >= 0.8"
- ],
- "dependencies": {
- "buffer-from": "^1.0.0",
- "inherits": "^2.0.3",
- "readable-stream": "^2.2.2",
- "typedarray": "^0.0.6"
- }
- },
- "node_modules/console-browserify": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz",
- "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==",
- "dev": true
- },
- "node_modules/constants-browserify": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz",
- "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==",
- "dev": true
- },
- "node_modules/convert-source-map": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz",
- "integrity": "sha512-Y8L5rp6jo+g9VEPgvqNfEopjTR4OTYct8lXlS8iVQdmnjDvbdbzYe9rjtFCB9egC86JoNCU61WRY+ScjkZpnIg==",
- "dev": true
- },
- "node_modules/core-util-is": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
- "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
- "dev": true
- },
- "node_modules/create-ecdh": {
- "version": "4.0.4",
- "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz",
- "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==",
- "dev": true,
- "dependencies": {
- "bn.js": "^4.1.0",
- "elliptic": "^6.5.3"
- }
- },
- "node_modules/create-ecdh/node_modules/bn.js": {
- "version": "4.12.0",
- "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
- "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
- "dev": true
- },
- "node_modules/create-hash": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz",
- "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==",
- "dev": true,
- "dependencies": {
- "cipher-base": "^1.0.1",
- "inherits": "^2.0.1",
- "md5.js": "^1.3.4",
- "ripemd160": "^2.0.1",
- "sha.js": "^2.4.0"
- }
- },
- "node_modules/create-hmac": {
- "version": "1.1.7",
- "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz",
- "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==",
- "dev": true,
- "dependencies": {
- "cipher-base": "^1.0.3",
- "create-hash": "^1.1.0",
- "inherits": "^2.0.1",
- "ripemd160": "^2.0.0",
- "safe-buffer": "^5.0.1",
- "sha.js": "^2.4.8"
- }
- },
- "node_modules/crypto-browserify": {
- "version": "3.12.0",
- "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz",
- "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==",
- "dev": true,
- "dependencies": {
- "browserify-cipher": "^1.0.0",
- "browserify-sign": "^4.0.0",
- "create-ecdh": "^4.0.0",
- "create-hash": "^1.1.0",
- "create-hmac": "^1.1.0",
- "diffie-hellman": "^5.0.0",
- "inherits": "^2.0.1",
- "pbkdf2": "^3.0.3",
- "public-encrypt": "^4.0.0",
- "randombytes": "^2.0.0",
- "randomfill": "^1.0.3"
- },
- "engines": {
- "node": "*"
- }
- },
- "node_modules/dash-ast": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/dash-ast/-/dash-ast-1.0.0.tgz",
- "integrity": "sha512-Vy4dx7gquTeMcQR/hDkYLGUnwVil6vk4FOOct+djUnHOUWt+zJPJAaRIXaAFkPXtJjvlY7o3rfRu0/3hpnwoUA==",
- "dev": true
- },
- "node_modules/defined": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz",
- "integrity": "sha512-Y2caI5+ZwS5c3RiNDJ6u53VhQHv+hHKwhkI1iHvceKUHw9Df6EK2zRLfjejRgMuCuxK7PfSWIMwWecceVvThjQ==",
- "dev": true
- },
- "node_modules/deps-sort": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/deps-sort/-/deps-sort-2.0.1.tgz",
- "integrity": "sha512-1orqXQr5po+3KI6kQb9A4jnXT1PBwggGl2d7Sq2xsnOeI9GPcE/tGcF9UiSZtZBM7MukY4cAh7MemS6tZYipfw==",
- "dev": true,
- "dependencies": {
- "JSONStream": "^1.0.3",
- "shasum-object": "^1.0.0",
- "subarg": "^1.0.0",
- "through2": "^2.0.0"
- },
- "bin": {
- "deps-sort": "bin/cmd.js"
- }
- },
- "node_modules/des.js": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz",
- "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==",
- "dev": true,
- "dependencies": {
- "inherits": "^2.0.1",
- "minimalistic-assert": "^1.0.0"
- }
- },
- "node_modules/detective": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.1.tgz",
- "integrity": "sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==",
- "dev": true,
- "dependencies": {
- "acorn-node": "^1.8.2",
- "defined": "^1.0.0",
- "minimist": "^1.2.6"
- },
- "bin": {
- "detective": "bin/detective.js"
- },
- "engines": {
- "node": ">=0.8.0"
- }
- },
- "node_modules/diffie-hellman": {
- "version": "5.0.3",
- "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz",
- "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==",
- "dev": true,
- "dependencies": {
- "bn.js": "^4.1.0",
- "miller-rabin": "^4.0.0",
- "randombytes": "^2.0.0"
- }
- },
- "node_modules/diffie-hellman/node_modules/bn.js": {
- "version": "4.12.0",
- "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
- "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
- "dev": true
- },
- "node_modules/domain-browser": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz",
- "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==",
- "dev": true,
- "engines": {
- "node": ">=0.4",
- "npm": ">=1.2"
- }
- },
- "node_modules/duplexer2": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz",
- "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==",
- "dev": true,
- "dependencies": {
- "readable-stream": "^2.0.2"
- }
- },
- "node_modules/elliptic": {
- "version": "6.5.4",
- "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz",
- "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==",
- "dev": true,
- "dependencies": {
- "bn.js": "^4.11.9",
- "brorand": "^1.1.0",
- "hash.js": "^1.0.0",
- "hmac-drbg": "^1.0.1",
- "inherits": "^2.0.4",
- "minimalistic-assert": "^1.0.1",
- "minimalistic-crypto-utils": "^1.0.1"
- }
- },
- "node_modules/elliptic/node_modules/bn.js": {
- "version": "4.12.0",
- "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
- "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
- "dev": true
- },
- "node_modules/events": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/events/-/events-2.1.0.tgz",
- "integrity": "sha512-3Zmiobend8P9DjmKAty0Era4jV8oJ0yGYe2nJJAxgymF9+N8F2m0hhZiMoWtcfepExzNKZumFU3ksdQbInGWCg==",
- "dev": true,
- "engines": {
- "node": ">=0.4.x"
- }
- },
- "node_modules/evp_bytestokey": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz",
- "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==",
- "dev": true,
- "dependencies": {
- "md5.js": "^1.3.4",
- "safe-buffer": "^5.1.1"
- }
- },
- "node_modules/fast-safe-stringify": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz",
- "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==",
- "dev": true
- },
- "node_modules/fs.realpath": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
- "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
- "dev": true
- },
- "node_modules/function-bind": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
- "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
- "dev": true
- },
- "node_modules/get-assigned-identifiers": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz",
- "integrity": "sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ==",
- "dev": true
- },
- "node_modules/glob": {
- "version": "7.2.3",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
- "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
- "dev": true,
- "dependencies": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.1.1",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- },
- "engines": {
- "node": "*"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/has": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
- "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
- "dev": true,
- "dependencies": {
- "function-bind": "^1.1.1"
- },
- "engines": {
- "node": ">= 0.4.0"
- }
- },
- "node_modules/hash-base": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz",
- "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==",
- "dev": true,
- "dependencies": {
- "inherits": "^2.0.4",
- "readable-stream": "^3.6.0",
- "safe-buffer": "^5.2.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/hash-base/node_modules/readable-stream": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
- "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
- "dev": true,
- "dependencies": {
- "inherits": "^2.0.3",
- "string_decoder": "^1.1.1",
- "util-deprecate": "^1.0.1"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/hash.js": {
- "version": "1.1.7",
- "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz",
- "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==",
- "dev": true,
- "dependencies": {
- "inherits": "^2.0.3",
- "minimalistic-assert": "^1.0.1"
- }
- },
- "node_modules/hmac-drbg": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
- "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==",
- "dev": true,
- "dependencies": {
- "hash.js": "^1.0.3",
- "minimalistic-assert": "^1.0.0",
- "minimalistic-crypto-utils": "^1.0.1"
- }
- },
- "node_modules/htmlescape": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz",
- "integrity": "sha512-eVcrzgbR4tim7c7soKQKtxa/kQM4TzjnlU83rcZ9bHU6t31ehfV7SktN6McWgwPWg+JYMA/O3qpGxBvFq1z2Jg==",
- "dev": true,
- "engines": {
- "node": ">=0.10"
- }
- },
- "node_modules/https-browserify": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz",
- "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==",
- "dev": true
- },
- "node_modules/ieee754": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
- "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
- "dev": true,
- "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/inflight": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
- "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
- "dev": true,
- "dependencies": {
- "once": "^1.3.0",
- "wrappy": "1"
- }
- },
- "node_modules/inherits": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
- "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
- "dev": true
- },
- "node_modules/inline-source-map": {
- "version": "0.6.2",
- "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz",
- "integrity": "sha512-0mVWSSbNDvedDWIN4wxLsdPM4a7cIPcpyMxj3QZ406QRwQ6ePGB1YIHxVPjqpcUGbWQ5C+nHTwGNWAGvt7ggVA==",
- "dev": true,
- "dependencies": {
- "source-map": "~0.5.3"
- }
- },
- "node_modules/insert-module-globals": {
- "version": "7.2.1",
- "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-7.2.1.tgz",
- "integrity": "sha512-ufS5Qq9RZN+Bu899eA9QCAYThY+gGW7oRkmb0vC93Vlyu/CFGcH0OYPEjVkDXA5FEbTt1+VWzdoOD3Ny9N+8tg==",
- "dev": true,
- "dependencies": {
- "acorn-node": "^1.5.2",
- "combine-source-map": "^0.8.0",
- "concat-stream": "^1.6.1",
- "is-buffer": "^1.1.0",
- "JSONStream": "^1.0.3",
- "path-is-absolute": "^1.0.1",
- "process": "~0.11.0",
- "through2": "^2.0.0",
- "undeclared-identifiers": "^1.1.2",
- "xtend": "^4.0.0"
- },
- "bin": {
- "insert-module-globals": "bin/cmd.js"
- }
- },
- "node_modules/is-buffer": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
- "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
- "dev": true
- },
- "node_modules/is-core-module": {
- "version": "2.10.0",
- "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz",
- "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==",
- "dev": true,
- "dependencies": {
- "has": "^1.0.3"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/isarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
- "dev": true
- },
- "node_modules/json-stable-stringify": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz",
- "integrity": "sha512-nKtD/Qxm7tWdZqJoldEC7fF0S41v0mWbeaXG3637stOWfyGxTgWTYE2wtfKmjzpvxv2MA2xzxsXOIiwUpkX6Qw==",
- "dev": true,
- "dependencies": {
- "jsonify": "~0.0.0"
- }
- },
- "node_modules/jsonify": {
- "version": "0.0.0",
- "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz",
- "integrity": "sha512-trvBk1ki43VZptdBI5rIlG4YOzyeH/WefQt5rj1grasPn4iiZWKet8nkgc4GlsAylaztn0qZfUYOiTsASJFdNA==",
- "dev": true,
- "engines": {
- "node": "*"
- }
- },
- "node_modules/jsonparse": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz",
- "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==",
- "dev": true,
- "engines": [
- "node >= 0.2.0"
- ]
- },
- "node_modules/JSONStream": {
- "version": "1.3.5",
- "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz",
- "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==",
- "dev": true,
- "dependencies": {
- "jsonparse": "^1.2.0",
- "through": ">=2.2.7 <3"
- },
- "bin": {
- "JSONStream": "bin.js"
- },
- "engines": {
- "node": "*"
- }
- },
- "node_modules/labeled-stream-splicer": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-2.0.2.tgz",
- "integrity": "sha512-Ca4LSXFFZUjPScRaqOcFxneA0VpKZr4MMYCljyQr4LIewTLb3Y0IUTIsnBBsVubIeEfxeSZpSjSsRM8APEQaAw==",
- "dev": true,
- "dependencies": {
- "inherits": "^2.0.1",
- "stream-splicer": "^2.0.0"
- }
- },
- "node_modules/lodash.memoize": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz",
- "integrity": "sha512-eDn9kqrAmVUC1wmZvlQ6Uhde44n+tXpqPrN8olQJbttgh0oKclk+SF54P47VEGE9CEiMeRwAP8BaM7UHvBkz2A==",
- "dev": true
- },
- "node_modules/md5.js": {
- "version": "1.3.5",
- "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz",
- "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==",
- "dev": true,
- "dependencies": {
- "hash-base": "^3.0.0",
- "inherits": "^2.0.1",
- "safe-buffer": "^5.1.2"
- }
- },
- "node_modules/miller-rabin": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz",
- "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==",
- "dev": true,
- "dependencies": {
- "bn.js": "^4.0.0",
- "brorand": "^1.0.1"
- },
- "bin": {
- "miller-rabin": "bin/miller-rabin"
- }
- },
- "node_modules/miller-rabin/node_modules/bn.js": {
- "version": "4.12.0",
- "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
- "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
- "dev": true
- },
- "node_modules/minimalistic-assert": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
- "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==",
- "dev": true
- },
- "node_modules/minimalistic-crypto-utils": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz",
- "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==",
- "dev": true
- },
- "node_modules/minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
- "dev": true,
- "dependencies": {
- "brace-expansion": "^1.1.7"
- },
- "engines": {
- "node": "*"
- }
- },
- "node_modules/minimist": {
- "version": "1.2.6",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz",
- "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==",
- "dev": true
- },
- "node_modules/mkdirp-classic": {
- "version": "0.5.3",
- "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz",
- "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==",
- "dev": true
- },
- "node_modules/module-deps": {
- "version": "6.2.3",
- "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-6.2.3.tgz",
- "integrity": "sha512-fg7OZaQBcL4/L+AK5f4iVqf9OMbCclXfy/znXRxTVhJSeW5AIlS9AwheYwDaXM3lVW7OBeaeUEY3gbaC6cLlSA==",
- "dev": true,
- "dependencies": {
- "browser-resolve": "^2.0.0",
- "cached-path-relative": "^1.0.2",
- "concat-stream": "~1.6.0",
- "defined": "^1.0.0",
- "detective": "^5.2.0",
- "duplexer2": "^0.1.2",
- "inherits": "^2.0.1",
- "JSONStream": "^1.0.3",
- "parents": "^1.0.0",
- "readable-stream": "^2.0.2",
- "resolve": "^1.4.0",
- "stream-combiner2": "^1.1.1",
- "subarg": "^1.0.0",
- "through2": "^2.0.0",
- "xtend": "^4.0.0"
- },
- "bin": {
- "module-deps": "bin/cmd.js"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "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/node-gyp-build": {
- "version": "4.5.0",
- "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.5.0.tgz",
- "integrity": "sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg==",
- "bin": {
- "node-gyp-build": "bin.js",
- "node-gyp-build-optional": "optional.js",
- "node-gyp-build-test": "build-test.js"
- }
- },
- "node_modules/object-assign": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
- "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/once": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
- "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
- "dev": true,
- "dependencies": {
- "wrappy": "1"
- }
- },
- "node_modules/os-browserify": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz",
- "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==",
- "dev": true
- },
- "node_modules/pako": {
- "version": "1.0.11",
- "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
- "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==",
- "dev": true
- },
- "node_modules/parents": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz",
- "integrity": "sha512-mXKF3xkoUt5td2DoxpLmtOmZvko9VfFpwRwkKDHSNvgmpLAeBo18YDhcPbBzJq+QLCHMbGOfzia2cX4U+0v9Mg==",
- "dev": true,
- "dependencies": {
- "path-platform": "~0.11.15"
- }
- },
- "node_modules/parse-asn1": {
- "version": "5.1.6",
- "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz",
- "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==",
- "dev": true,
- "dependencies": {
- "asn1.js": "^5.2.0",
- "browserify-aes": "^1.0.0",
- "evp_bytestokey": "^1.0.0",
- "pbkdf2": "^3.0.3",
- "safe-buffer": "^5.1.1"
- }
- },
- "node_modules/path-browserify": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz",
- "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==",
- "dev": true
- },
- "node_modules/path-is-absolute": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
- "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/path-parse": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
- "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
- "dev": true
- },
- "node_modules/path-platform": {
- "version": "0.11.15",
- "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz",
- "integrity": "sha512-Y30dB6rab1A/nfEKsZxmr01nUotHX0c/ZiIAsCTatEe1CmS5Pm5He7fZ195bPT7RdquoaL8lLxFCMQi/bS7IJg==",
- "dev": true,
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/pbkdf2": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz",
- "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==",
- "dev": true,
- "dependencies": {
- "create-hash": "^1.1.2",
- "create-hmac": "^1.1.4",
- "ripemd160": "^2.0.1",
- "safe-buffer": "^5.0.1",
- "sha.js": "^2.4.8"
- },
- "engines": {
- "node": ">=0.12"
- }
- },
- "node_modules/process": {
- "version": "0.11.10",
- "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
- "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==",
- "dev": true,
- "engines": {
- "node": ">= 0.6.0"
- }
- },
- "node_modules/process-nextick-args": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
- "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
- "dev": true
- },
- "node_modules/public-encrypt": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz",
- "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==",
- "dev": true,
- "dependencies": {
- "bn.js": "^4.1.0",
- "browserify-rsa": "^4.0.0",
- "create-hash": "^1.1.0",
- "parse-asn1": "^5.0.0",
- "randombytes": "^2.0.1",
- "safe-buffer": "^5.1.2"
- }
- },
- "node_modules/public-encrypt/node_modules/bn.js": {
- "version": "4.12.0",
- "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
- "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
- "dev": true
- },
- "node_modules/punycode": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
- "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==",
- "dev": true
- },
- "node_modules/querystring": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz",
- "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==",
- "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.",
- "dev": true,
- "engines": {
- "node": ">=0.4.x"
- }
- },
- "node_modules/querystring-es3": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz",
- "integrity": "sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==",
- "dev": true,
- "engines": {
- "node": ">=0.4.x"
- }
- },
- "node_modules/randombytes": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
- "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
- "dev": true,
- "dependencies": {
- "safe-buffer": "^5.1.0"
- }
- },
- "node_modules/randomfill": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz",
- "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==",
- "dev": true,
- "dependencies": {
- "randombytes": "^2.0.5",
- "safe-buffer": "^5.1.0"
- }
- },
- "node_modules/read-only-stream": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/read-only-stream/-/read-only-stream-2.0.0.tgz",
- "integrity": "sha512-3ALe0bjBVZtkdWKIcThYpQCLbBMd/+Tbh2CDSrAIDO3UsZ4Xs+tnyjv2MjCOMMgBG+AsUOeuP1cgtY1INISc8w==",
- "dev": true,
- "dependencies": {
- "readable-stream": "^2.0.2"
- }
- },
- "node_modules/readable-stream": {
- "version": "2.3.7",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
- "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
- "dev": true,
- "dependencies": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
- }
- },
- "node_modules/readable-stream/node_modules/safe-buffer": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
- "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
- "dev": true
- },
- "node_modules/readable-stream/node_modules/string_decoder": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
- "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
- "dev": true,
- "dependencies": {
- "safe-buffer": "~5.1.0"
- }
- },
- "node_modules/resolve": {
- "version": "1.22.1",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz",
- "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==",
- "dev": true,
- "dependencies": {
- "is-core-module": "^2.9.0",
- "path-parse": "^1.0.7",
- "supports-preserve-symlinks-flag": "^1.0.0"
- },
- "bin": {
- "resolve": "bin/resolve"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/ripemd160": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz",
- "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==",
- "dev": true,
- "dependencies": {
- "hash-base": "^3.0.0",
- "inherits": "^2.0.1"
- }
- },
- "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==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ]
- },
- "node_modules/safer-buffer": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
- "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
- "dev": true
- },
- "node_modules/sha.js": {
- "version": "2.4.11",
- "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz",
- "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==",
- "dev": true,
- "dependencies": {
- "inherits": "^2.0.1",
- "safe-buffer": "^5.0.1"
- },
- "bin": {
- "sha.js": "bin.js"
- }
- },
- "node_modules/shasum": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/shasum/-/shasum-1.0.2.tgz",
- "integrity": "sha512-UTzHm/+AzKfO9RgPgRpDIuMSNie1ubXRaljjlhFMNGYoG7z+rm9AHLPMf70R7887xboDH9Q+5YQbWKObFHEAtw==",
- "dev": true,
- "dependencies": {
- "json-stable-stringify": "~0.0.0",
- "sha.js": "~2.4.4"
- }
- },
- "node_modules/shasum-object": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/shasum-object/-/shasum-object-1.0.0.tgz",
- "integrity": "sha512-Iqo5rp/3xVi6M4YheapzZhhGPVs0yZwHj7wvwQ1B9z8H6zk+FEnI7y3Teq7qwnekfEhu8WmG2z0z4iWZaxLWVg==",
- "dev": true,
- "dependencies": {
- "fast-safe-stringify": "^2.0.7"
- }
- },
- "node_modules/shell-quote": {
- "version": "1.7.3",
- "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.3.tgz",
- "integrity": "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==",
- "dev": true
- },
- "node_modules/simple-concat": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz",
- "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==",
- "dev": true,
- "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/source-map": {
- "version": "0.5.7",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
- "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/stream-browserify": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz",
- "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==",
- "dev": true,
- "dependencies": {
- "inherits": "~2.0.1",
- "readable-stream": "^2.0.2"
- }
- },
- "node_modules/stream-combiner2": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz",
- "integrity": "sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==",
- "dev": true,
- "dependencies": {
- "duplexer2": "~0.1.0",
- "readable-stream": "^2.0.2"
- }
- },
- "node_modules/stream-http": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.2.0.tgz",
- "integrity": "sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==",
- "dev": true,
- "dependencies": {
- "builtin-status-codes": "^3.0.0",
- "inherits": "^2.0.4",
- "readable-stream": "^3.6.0",
- "xtend": "^4.0.2"
- }
- },
- "node_modules/stream-http/node_modules/readable-stream": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
- "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
- "dev": true,
- "dependencies": {
- "inherits": "^2.0.3",
- "string_decoder": "^1.1.1",
- "util-deprecate": "^1.0.1"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/stream-splicer": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-2.0.1.tgz",
- "integrity": "sha512-Xizh4/NPuYSyAXyT7g8IvdJ9HJpxIGL9PjyhtywCZvvP0OPIdqyrr4dMikeuvY8xahpdKEBlBTySe583totajg==",
- "dev": true,
- "dependencies": {
- "inherits": "^2.0.1",
- "readable-stream": "^2.0.2"
- }
- },
- "node_modules/string_decoder": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
- "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
- "dev": true,
- "dependencies": {
- "safe-buffer": "~5.2.0"
- }
- },
- "node_modules/subarg": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz",
- "integrity": "sha512-RIrIdRY0X1xojthNcVtgT9sjpOGagEUKpZdgBUi054OEPFo282yg+zE+t1Rj3+RqKq2xStL7uUHhY+AjbC4BXg==",
- "dev": true,
- "dependencies": {
- "minimist": "^1.1.0"
- }
- },
- "node_modules/supports-preserve-symlinks-flag": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
- "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
- "dev": true,
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/syntax-error": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.4.0.tgz",
- "integrity": "sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w==",
- "dev": true,
- "dependencies": {
- "acorn-node": "^1.2.0"
- }
- },
- "node_modules/through": {
- "version": "2.3.8",
- "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
- "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==",
- "dev": true
- },
- "node_modules/through2": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
- "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
- "dev": true,
- "dependencies": {
- "readable-stream": "~2.3.6",
- "xtend": "~4.0.1"
- }
- },
- "node_modules/timers-browserify": {
- "version": "1.4.2",
- "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz",
- "integrity": "sha512-PIxwAupJZiYU4JmVZYwXp9FKsHMXb5h0ZEFyuXTAn8WLHOlcij+FEcbrvDsom1o5dr1YggEtFbECvGCW2sT53Q==",
- "dev": true,
- "dependencies": {
- "process": "~0.11.0"
- },
- "engines": {
- "node": ">=0.6.0"
- }
- },
- "node_modules/tty-browserify": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz",
- "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==",
- "dev": true
- },
- "node_modules/typedarray": {
- "version": "0.0.6",
- "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
- "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==",
- "dev": true
- },
- "node_modules/umd": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/umd/-/umd-3.0.3.tgz",
- "integrity": "sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow==",
- "dev": true,
- "bin": {
- "umd": "bin/cli.js"
- }
- },
- "node_modules/undeclared-identifiers": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/undeclared-identifiers/-/undeclared-identifiers-1.1.3.tgz",
- "integrity": "sha512-pJOW4nxjlmfwKApE4zvxLScM/njmwj/DiUBv7EabwE4O8kRUy+HIwxQtZLBPll/jx1LJyBcqNfB3/cpv9EZwOw==",
- "dev": true,
- "dependencies": {
- "acorn-node": "^1.3.0",
- "dash-ast": "^1.0.0",
- "get-assigned-identifiers": "^1.2.0",
- "simple-concat": "^1.0.0",
- "xtend": "^4.0.1"
- },
- "bin": {
- "undeclared-identifiers": "bin.js"
- }
- },
- "node_modules/url": {
- "version": "0.11.0",
- "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz",
- "integrity": "sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ==",
- "dev": true,
- "dependencies": {
- "punycode": "1.3.2",
- "querystring": "0.2.0"
- }
- },
- "node_modules/url/node_modules/punycode": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
- "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==",
- "dev": true
- },
- "node_modules/usb": {
- "version": "1.9.2",
- "resolved": "https://registry.npmjs.org/usb/-/usb-1.9.2.tgz",
- "integrity": "sha512-dryNz030LWBPAf6gj8vyq0Iev3vPbCLHCT8dBw3gQRXRzVNsIdeuU+VjPp3ksmSPkeMAl1k+kQ14Ij0QHyeiAg==",
- "hasInstallScript": true,
- "dependencies": {
- "node-addon-api": "^4.2.0",
- "node-gyp-build": "^4.3.0"
- },
- "engines": {
- "node": ">=10.16.0"
- }
- },
- "node_modules/util": {
- "version": "0.10.4",
- "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz",
- "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==",
- "dev": true,
- "dependencies": {
- "inherits": "2.0.3"
- }
- },
- "node_modules/util-deprecate": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
- "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
- "dev": true
- },
- "node_modules/util/node_modules/inherits": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
- "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==",
- "dev": true
- },
- "node_modules/vm-browserify": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz",
- "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==",
- "dev": true
- },
- "node_modules/wrappy": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
- "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
- "dev": true
- },
- "node_modules/xtend": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
- "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
- "dev": true,
- "engines": {
- "node": ">=0.4"
- }
- }
- },
- "dependencies": {
- "acorn": {
- "version": "7.4.1",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
- "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
- "dev": true
- },
- "acorn-node": {
- "version": "1.8.2",
- "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz",
- "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==",
- "dev": true,
- "requires": {
- "acorn": "^7.0.0",
- "acorn-walk": "^7.0.0",
- "xtend": "^4.0.2"
- }
- },
- "acorn-walk": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz",
- "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==",
- "dev": true
- },
- "asn1.js": {
- "version": "5.4.1",
- "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz",
- "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==",
- "dev": true,
- "requires": {
- "bn.js": "^4.0.0",
- "inherits": "^2.0.1",
- "minimalistic-assert": "^1.0.0",
- "safer-buffer": "^2.1.0"
- },
- "dependencies": {
- "bn.js": {
- "version": "4.12.0",
- "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
- "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
- "dev": true
- }
- }
- },
- "assert": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz",
- "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==",
- "dev": true,
- "requires": {
- "object-assign": "^4.1.1",
- "util": "0.10.3"
- },
- "dependencies": {
- "inherits": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz",
- "integrity": "sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA==",
- "dev": true
- },
- "util": {
- "version": "0.10.3",
- "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz",
- "integrity": "sha512-5KiHfsmkqacuKjkRkdV7SsfDJ2EGiPsK92s2MhNSY0craxjTdKTtqKsJaCWp4LW33ZZ0OPUv1WO/TFvNQRiQxQ==",
- "dev": true,
- "requires": {
- "inherits": "2.0.1"
- }
- }
- }
- },
- "balanced-match": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
- "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
- "dev": true
- },
- "base64-js": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
- "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
- "dev": true
- },
- "bn.js": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz",
- "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==",
- "dev": true
- },
- "brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
- "dev": true,
- "requires": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "brorand": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
- "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==",
- "dev": true
- },
- "browser-pack": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-6.1.0.tgz",
- "integrity": "sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA==",
- "dev": true,
- "requires": {
- "combine-source-map": "~0.8.0",
- "defined": "^1.0.0",
- "JSONStream": "^1.0.3",
- "safe-buffer": "^5.1.1",
- "through2": "^2.0.0",
- "umd": "^3.0.0"
- }
- },
- "browser-resolve": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-2.0.0.tgz",
- "integrity": "sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ==",
- "dev": true,
- "requires": {
- "resolve": "^1.17.0"
- }
- },
- "browserify": {
- "version": "16.5.2",
- "resolved": "https://registry.npmjs.org/browserify/-/browserify-16.5.2.tgz",
- "integrity": "sha512-TkOR1cQGdmXU9zW4YukWzWVSJwrxmNdADFbqbE3HFgQWe5wqZmOawqZ7J/8MPCwk/W8yY7Y0h+7mOtcZxLP23g==",
- "dev": true,
- "requires": {
- "assert": "^1.4.0",
- "browser-pack": "^6.0.1",
- "browser-resolve": "^2.0.0",
- "browserify-zlib": "~0.2.0",
- "buffer": "~5.2.1",
- "cached-path-relative": "^1.0.0",
- "concat-stream": "^1.6.0",
- "console-browserify": "^1.1.0",
- "constants-browserify": "~1.0.0",
- "crypto-browserify": "^3.0.0",
- "defined": "^1.0.0",
- "deps-sort": "^2.0.0",
- "domain-browser": "^1.2.0",
- "duplexer2": "~0.1.2",
- "events": "^2.0.0",
- "glob": "^7.1.0",
- "has": "^1.0.0",
- "htmlescape": "^1.1.0",
- "https-browserify": "^1.0.0",
- "inherits": "~2.0.1",
- "insert-module-globals": "^7.0.0",
- "JSONStream": "^1.0.3",
- "labeled-stream-splicer": "^2.0.0",
- "mkdirp-classic": "^0.5.2",
- "module-deps": "^6.2.3",
- "os-browserify": "~0.3.0",
- "parents": "^1.0.1",
- "path-browserify": "~0.0.0",
- "process": "~0.11.0",
- "punycode": "^1.3.2",
- "querystring-es3": "~0.2.0",
- "read-only-stream": "^2.0.0",
- "readable-stream": "^2.0.2",
- "resolve": "^1.1.4",
- "shasum": "^1.0.0",
- "shell-quote": "^1.6.1",
- "stream-browserify": "^2.0.0",
- "stream-http": "^3.0.0",
- "string_decoder": "^1.1.1",
- "subarg": "^1.0.0",
- "syntax-error": "^1.1.1",
- "through2": "^2.0.0",
- "timers-browserify": "^1.0.1",
- "tty-browserify": "0.0.1",
- "url": "~0.11.0",
- "util": "~0.10.1",
- "vm-browserify": "^1.0.0",
- "xtend": "^4.0.0"
- }
- },
- "browserify-aes": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz",
- "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==",
- "dev": true,
- "requires": {
- "buffer-xor": "^1.0.3",
- "cipher-base": "^1.0.0",
- "create-hash": "^1.1.0",
- "evp_bytestokey": "^1.0.3",
- "inherits": "^2.0.1",
- "safe-buffer": "^5.0.1"
- }
- },
- "browserify-cipher": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz",
- "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==",
- "dev": true,
- "requires": {
- "browserify-aes": "^1.0.4",
- "browserify-des": "^1.0.0",
- "evp_bytestokey": "^1.0.0"
- }
- },
- "browserify-des": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz",
- "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==",
- "dev": true,
- "requires": {
- "cipher-base": "^1.0.1",
- "des.js": "^1.0.0",
- "inherits": "^2.0.1",
- "safe-buffer": "^5.1.2"
- }
- },
- "browserify-rsa": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz",
- "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==",
- "dev": true,
- "requires": {
- "bn.js": "^5.0.0",
- "randombytes": "^2.0.1"
- }
- },
- "browserify-sign": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz",
- "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==",
- "dev": true,
- "requires": {
- "bn.js": "^5.1.1",
- "browserify-rsa": "^4.0.1",
- "create-hash": "^1.2.0",
- "create-hmac": "^1.1.7",
- "elliptic": "^6.5.3",
- "inherits": "^2.0.4",
- "parse-asn1": "^5.1.5",
- "readable-stream": "^3.6.0",
- "safe-buffer": "^5.2.0"
- },
- "dependencies": {
- "readable-stream": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
- "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
- "dev": true,
- "requires": {
- "inherits": "^2.0.3",
- "string_decoder": "^1.1.1",
- "util-deprecate": "^1.0.1"
- }
- }
- }
- },
- "browserify-zlib": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz",
- "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==",
- "dev": true,
- "requires": {
- "pako": "~1.0.5"
- }
- },
- "buffer": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.2.1.tgz",
- "integrity": "sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg==",
- "dev": true,
- "requires": {
- "base64-js": "^1.0.2",
- "ieee754": "^1.1.4"
- }
- },
- "buffer-from": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
- "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
- "dev": true
- },
- "buffer-xor": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz",
- "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==",
- "dev": true
- },
- "builtin-status-codes": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz",
- "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==",
- "dev": true
- },
- "cached-path-relative": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.1.0.tgz",
- "integrity": "sha512-WF0LihfemtesFcJgO7xfOoOcnWzY/QHR4qeDqV44jPU3HTI54+LnfXK3SA27AVVGCdZFgjjFFaqUA9Jx7dMJZA==",
- "dev": true
- },
- "cipher-base": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz",
- "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==",
- "dev": true,
- "requires": {
- "inherits": "^2.0.1",
- "safe-buffer": "^5.0.1"
- }
- },
- "combine-source-map": {
- "version": "0.8.0",
- "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz",
- "integrity": "sha512-UlxQ9Vw0b/Bt/KYwCFqdEwsQ1eL8d1gibiFb7lxQJFdvTgc2hIZi6ugsg+kyhzhPV+QEpUiEIwInIAIrgoEkrg==",
- "dev": true,
- "requires": {
- "convert-source-map": "~1.1.0",
- "inline-source-map": "~0.6.0",
- "lodash.memoize": "~3.0.3",
- "source-map": "~0.5.3"
- }
- },
- "concat-map": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
- "dev": true
- },
- "concat-stream": {
- "version": "1.6.2",
- "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
- "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
- "dev": true,
- "requires": {
- "buffer-from": "^1.0.0",
- "inherits": "^2.0.3",
- "readable-stream": "^2.2.2",
- "typedarray": "^0.0.6"
- }
- },
- "console-browserify": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz",
- "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==",
- "dev": true
- },
- "constants-browserify": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz",
- "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==",
- "dev": true
- },
- "convert-source-map": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz",
- "integrity": "sha512-Y8L5rp6jo+g9VEPgvqNfEopjTR4OTYct8lXlS8iVQdmnjDvbdbzYe9rjtFCB9egC86JoNCU61WRY+ScjkZpnIg==",
- "dev": true
- },
- "core-util-is": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
- "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
- "dev": true
- },
- "create-ecdh": {
- "version": "4.0.4",
- "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz",
- "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==",
- "dev": true,
- "requires": {
- "bn.js": "^4.1.0",
- "elliptic": "^6.5.3"
- },
- "dependencies": {
- "bn.js": {
- "version": "4.12.0",
- "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
- "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
- "dev": true
- }
- }
- },
- "create-hash": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz",
- "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==",
- "dev": true,
- "requires": {
- "cipher-base": "^1.0.1",
- "inherits": "^2.0.1",
- "md5.js": "^1.3.4",
- "ripemd160": "^2.0.1",
- "sha.js": "^2.4.0"
- }
- },
- "create-hmac": {
- "version": "1.1.7",
- "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz",
- "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==",
- "dev": true,
- "requires": {
- "cipher-base": "^1.0.3",
- "create-hash": "^1.1.0",
- "inherits": "^2.0.1",
- "ripemd160": "^2.0.0",
- "safe-buffer": "^5.0.1",
- "sha.js": "^2.4.8"
- }
- },
- "crypto-browserify": {
- "version": "3.12.0",
- "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz",
- "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==",
- "dev": true,
- "requires": {
- "browserify-cipher": "^1.0.0",
- "browserify-sign": "^4.0.0",
- "create-ecdh": "^4.0.0",
- "create-hash": "^1.1.0",
- "create-hmac": "^1.1.0",
- "diffie-hellman": "^5.0.0",
- "inherits": "^2.0.1",
- "pbkdf2": "^3.0.3",
- "public-encrypt": "^4.0.0",
- "randombytes": "^2.0.0",
- "randomfill": "^1.0.3"
- }
- },
- "dash-ast": {
"version": "1.0.0",
- "resolved": "https://registry.npmjs.org/dash-ast/-/dash-ast-1.0.0.tgz",
- "integrity": "sha512-Vy4dx7gquTeMcQR/hDkYLGUnwVil6vk4FOOct+djUnHOUWt+zJPJAaRIXaAFkPXtJjvlY7o3rfRu0/3hpnwoUA==",
- "dev": true
- },
- "defined": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz",
- "integrity": "sha512-Y2caI5+ZwS5c3RiNDJ6u53VhQHv+hHKwhkI1iHvceKUHw9Df6EK2zRLfjejRgMuCuxK7PfSWIMwWecceVvThjQ==",
- "dev": true
- },
- "deps-sort": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/deps-sort/-/deps-sort-2.0.1.tgz",
- "integrity": "sha512-1orqXQr5po+3KI6kQb9A4jnXT1PBwggGl2d7Sq2xsnOeI9GPcE/tGcF9UiSZtZBM7MukY4cAh7MemS6tZYipfw==",
- "dev": true,
- "requires": {
- "JSONStream": "^1.0.3",
- "shasum-object": "^1.0.0",
- "subarg": "^1.0.0",
- "through2": "^2.0.0"
- }
- },
- "des.js": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz",
- "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==",
- "dev": true,
- "requires": {
- "inherits": "^2.0.1",
- "minimalistic-assert": "^1.0.0"
- }
- },
- "detective": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.1.tgz",
- "integrity": "sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==",
- "dev": true,
- "requires": {
- "acorn-node": "^1.8.2",
- "defined": "^1.0.0",
- "minimist": "^1.2.6"
- }
- },
- "diffie-hellman": {
- "version": "5.0.3",
- "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz",
- "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==",
- "dev": true,
- "requires": {
- "bn.js": "^4.1.0",
- "miller-rabin": "^4.0.0",
- "randombytes": "^2.0.0"
- },
+ "license": "Apache-2.0",
"dependencies": {
- "bn.js": {
- "version": "4.12.0",
- "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
- "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
- "dev": true
- }
- }
- },
- "domain-browser": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz",
- "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==",
- "dev": true
- },
- "duplexer2": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz",
- "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==",
- "dev": true,
- "requires": {
- "readable-stream": "^2.0.2"
- }
- },
- "elliptic": {
- "version": "6.5.4",
- "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz",
- "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==",
- "dev": true,
- "requires": {
- "bn.js": "^4.11.9",
- "brorand": "^1.1.0",
- "hash.js": "^1.0.0",
- "hmac-drbg": "^1.0.1",
- "inherits": "^2.0.4",
- "minimalistic-assert": "^1.0.1",
- "minimalistic-crypto-utils": "^1.0.1"
+ "usb": "^1.3.1"
},
- "dependencies": {
- "bn.js": {
- "version": "4.12.0",
- "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
- "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
- "dev": true
- }
- }
- },
- "events": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/events/-/events-2.1.0.tgz",
- "integrity": "sha512-3Zmiobend8P9DjmKAty0Era4jV8oJ0yGYe2nJJAxgymF9+N8F2m0hhZiMoWtcfepExzNKZumFU3ksdQbInGWCg==",
- "dev": true
- },
- "evp_bytestokey": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz",
- "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==",
- "dev": true,
- "requires": {
- "md5.js": "^1.3.4",
- "safe-buffer": "^5.1.1"
+ "engines": {
+ "node": ">=14"
}
},
- "fast-safe-stringify": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz",
- "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==",
- "dev": true
- },
- "fs.realpath": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
- "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
- "dev": true
- },
- "function-bind": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
- "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
- "dev": true
- },
- "get-assigned-identifiers": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz",
- "integrity": "sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ==",
- "dev": true
- },
- "glob": {
- "version": "7.2.3",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
- "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
- "dev": true,
- "requires": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.1.1",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- }
+ "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=="
},
- "has": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
- "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
- "dev": true,
- "requires": {
- "function-bind": "^1.1.1"
+ "node_modules/node-gyp-build": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.5.0.tgz",
+ "integrity": "sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg==",
+ "bin": {
+ "node-gyp-build": "bin.js",
+ "node-gyp-build-optional": "optional.js",
+ "node-gyp-build-test": "build-test.js"
}
},
- "hash-base": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz",
- "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==",
- "dev": true,
- "requires": {
- "inherits": "^2.0.4",
- "readable-stream": "^3.6.0",
- "safe-buffer": "^5.2.0"
- },
+ "node_modules/usb": {
+ "version": "1.9.2",
+ "resolved": "https://registry.npmjs.org/usb/-/usb-1.9.2.tgz",
+ "integrity": "sha512-dryNz030LWBPAf6gj8vyq0Iev3vPbCLHCT8dBw3gQRXRzVNsIdeuU+VjPp3ksmSPkeMAl1k+kQ14Ij0QHyeiAg==",
+ "hasInstallScript": true,
"dependencies": {
- "readable-stream": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
- "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
- "dev": true,
- "requires": {
- "inherits": "^2.0.3",
- "string_decoder": "^1.1.1",
- "util-deprecate": "^1.0.1"
- }
- }
- }
- },
- "hash.js": {
- "version": "1.1.7",
- "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz",
- "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==",
- "dev": true,
- "requires": {
- "inherits": "^2.0.3",
- "minimalistic-assert": "^1.0.1"
- }
- },
- "hmac-drbg": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
- "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==",
- "dev": true,
- "requires": {
- "hash.js": "^1.0.3",
- "minimalistic-assert": "^1.0.0",
- "minimalistic-crypto-utils": "^1.0.1"
- }
- },
- "htmlescape": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz",
- "integrity": "sha512-eVcrzgbR4tim7c7soKQKtxa/kQM4TzjnlU83rcZ9bHU6t31ehfV7SktN6McWgwPWg+JYMA/O3qpGxBvFq1z2Jg==",
- "dev": true
- },
- "https-browserify": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz",
- "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==",
- "dev": true
- },
- "ieee754": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
- "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
- "dev": true
- },
- "inflight": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
- "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
- "dev": true,
- "requires": {
- "once": "^1.3.0",
- "wrappy": "1"
- }
- },
- "inherits": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
- "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
- "dev": true
- },
- "inline-source-map": {
- "version": "0.6.2",
- "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz",
- "integrity": "sha512-0mVWSSbNDvedDWIN4wxLsdPM4a7cIPcpyMxj3QZ406QRwQ6ePGB1YIHxVPjqpcUGbWQ5C+nHTwGNWAGvt7ggVA==",
- "dev": true,
- "requires": {
- "source-map": "~0.5.3"
- }
- },
- "insert-module-globals": {
- "version": "7.2.1",
- "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-7.2.1.tgz",
- "integrity": "sha512-ufS5Qq9RZN+Bu899eA9QCAYThY+gGW7oRkmb0vC93Vlyu/CFGcH0OYPEjVkDXA5FEbTt1+VWzdoOD3Ny9N+8tg==",
- "dev": true,
- "requires": {
- "acorn-node": "^1.5.2",
- "combine-source-map": "^0.8.0",
- "concat-stream": "^1.6.1",
- "is-buffer": "^1.1.0",
- "JSONStream": "^1.0.3",
- "path-is-absolute": "^1.0.1",
- "process": "~0.11.0",
- "through2": "^2.0.0",
- "undeclared-identifiers": "^1.1.2",
- "xtend": "^4.0.0"
- }
- },
- "is-buffer": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
- "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
- "dev": true
- },
- "is-core-module": {
- "version": "2.10.0",
- "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz",
- "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==",
- "dev": true,
- "requires": {
- "has": "^1.0.3"
- }
- },
- "isarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
- "dev": true
- },
- "json-stable-stringify": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz",
- "integrity": "sha512-nKtD/Qxm7tWdZqJoldEC7fF0S41v0mWbeaXG3637stOWfyGxTgWTYE2wtfKmjzpvxv2MA2xzxsXOIiwUpkX6Qw==",
- "dev": true,
- "requires": {
- "jsonify": "~0.0.0"
- }
- },
- "jsonify": {
- "version": "0.0.0",
- "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz",
- "integrity": "sha512-trvBk1ki43VZptdBI5rIlG4YOzyeH/WefQt5rj1grasPn4iiZWKet8nkgc4GlsAylaztn0qZfUYOiTsASJFdNA==",
- "dev": true
- },
- "jsonparse": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz",
- "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==",
- "dev": true
- },
- "JSONStream": {
- "version": "1.3.5",
- "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz",
- "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==",
- "dev": true,
- "requires": {
- "jsonparse": "^1.2.0",
- "through": ">=2.2.7 <3"
- }
- },
- "labeled-stream-splicer": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-2.0.2.tgz",
- "integrity": "sha512-Ca4LSXFFZUjPScRaqOcFxneA0VpKZr4MMYCljyQr4LIewTLb3Y0IUTIsnBBsVubIeEfxeSZpSjSsRM8APEQaAw==",
- "dev": true,
- "requires": {
- "inherits": "^2.0.1",
- "stream-splicer": "^2.0.0"
- }
- },
- "lodash.memoize": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz",
- "integrity": "sha512-eDn9kqrAmVUC1wmZvlQ6Uhde44n+tXpqPrN8olQJbttgh0oKclk+SF54P47VEGE9CEiMeRwAP8BaM7UHvBkz2A==",
- "dev": true
- },
- "md5.js": {
- "version": "1.3.5",
- "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz",
- "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==",
- "dev": true,
- "requires": {
- "hash-base": "^3.0.0",
- "inherits": "^2.0.1",
- "safe-buffer": "^5.1.2"
- }
- },
- "miller-rabin": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz",
- "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==",
- "dev": true,
- "requires": {
- "bn.js": "^4.0.0",
- "brorand": "^1.0.1"
+ "node-addon-api": "^4.2.0",
+ "node-gyp-build": "^4.3.0"
},
- "dependencies": {
- "bn.js": {
- "version": "4.12.0",
- "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
- "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
- "dev": true
- }
- }
- },
- "minimalistic-assert": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
- "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==",
- "dev": true
- },
- "minimalistic-crypto-utils": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz",
- "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==",
- "dev": true
- },
- "minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
- "dev": true,
- "requires": {
- "brace-expansion": "^1.1.7"
- }
- },
- "minimist": {
- "version": "1.2.6",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz",
- "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==",
- "dev": true
- },
- "mkdirp-classic": {
- "version": "0.5.3",
- "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz",
- "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==",
- "dev": true
- },
- "module-deps": {
- "version": "6.2.3",
- "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-6.2.3.tgz",
- "integrity": "sha512-fg7OZaQBcL4/L+AK5f4iVqf9OMbCclXfy/znXRxTVhJSeW5AIlS9AwheYwDaXM3lVW7OBeaeUEY3gbaC6cLlSA==",
- "dev": true,
- "requires": {
- "browser-resolve": "^2.0.0",
- "cached-path-relative": "^1.0.2",
- "concat-stream": "~1.6.0",
- "defined": "^1.0.0",
- "detective": "^5.2.0",
- "duplexer2": "^0.1.2",
- "inherits": "^2.0.1",
- "JSONStream": "^1.0.3",
- "parents": "^1.0.0",
- "readable-stream": "^2.0.2",
- "resolve": "^1.4.0",
- "stream-combiner2": "^1.1.1",
- "subarg": "^1.0.0",
- "through2": "^2.0.0",
- "xtend": "^4.0.0"
+ "engines": {
+ "node": ">=10.16.0"
}
- },
+ }
+ },
+ "dependencies": {
"node-addon-api": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.3.0.tgz",
@@ -2422,446 +55,6 @@
"resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.5.0.tgz",
"integrity": "sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg=="
},
- "object-assign": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
- "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
- "dev": true
- },
- "once": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
- "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
- "dev": true,
- "requires": {
- "wrappy": "1"
- }
- },
- "os-browserify": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz",
- "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==",
- "dev": true
- },
- "pako": {
- "version": "1.0.11",
- "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
- "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==",
- "dev": true
- },
- "parents": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz",
- "integrity": "sha512-mXKF3xkoUt5td2DoxpLmtOmZvko9VfFpwRwkKDHSNvgmpLAeBo18YDhcPbBzJq+QLCHMbGOfzia2cX4U+0v9Mg==",
- "dev": true,
- "requires": {
- "path-platform": "~0.11.15"
- }
- },
- "parse-asn1": {
- "version": "5.1.6",
- "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz",
- "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==",
- "dev": true,
- "requires": {
- "asn1.js": "^5.2.0",
- "browserify-aes": "^1.0.0",
- "evp_bytestokey": "^1.0.0",
- "pbkdf2": "^3.0.3",
- "safe-buffer": "^5.1.1"
- }
- },
- "path-browserify": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz",
- "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==",
- "dev": true
- },
- "path-is-absolute": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
- "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
- "dev": true
- },
- "path-parse": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
- "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
- "dev": true
- },
- "path-platform": {
- "version": "0.11.15",
- "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz",
- "integrity": "sha512-Y30dB6rab1A/nfEKsZxmr01nUotHX0c/ZiIAsCTatEe1CmS5Pm5He7fZ195bPT7RdquoaL8lLxFCMQi/bS7IJg==",
- "dev": true
- },
- "pbkdf2": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz",
- "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==",
- "dev": true,
- "requires": {
- "create-hash": "^1.1.2",
- "create-hmac": "^1.1.4",
- "ripemd160": "^2.0.1",
- "safe-buffer": "^5.0.1",
- "sha.js": "^2.4.8"
- }
- },
- "process": {
- "version": "0.11.10",
- "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
- "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==",
- "dev": true
- },
- "process-nextick-args": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
- "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
- "dev": true
- },
- "public-encrypt": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz",
- "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==",
- "dev": true,
- "requires": {
- "bn.js": "^4.1.0",
- "browserify-rsa": "^4.0.0",
- "create-hash": "^1.1.0",
- "parse-asn1": "^5.0.0",
- "randombytes": "^2.0.1",
- "safe-buffer": "^5.1.2"
- },
- "dependencies": {
- "bn.js": {
- "version": "4.12.0",
- "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
- "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
- "dev": true
- }
- }
- },
- "punycode": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
- "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==",
- "dev": true
- },
- "querystring": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz",
- "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==",
- "dev": true
- },
- "querystring-es3": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz",
- "integrity": "sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==",
- "dev": true
- },
- "randombytes": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
- "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
- "dev": true,
- "requires": {
- "safe-buffer": "^5.1.0"
- }
- },
- "randomfill": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz",
- "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==",
- "dev": true,
- "requires": {
- "randombytes": "^2.0.5",
- "safe-buffer": "^5.1.0"
- }
- },
- "read-only-stream": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/read-only-stream/-/read-only-stream-2.0.0.tgz",
- "integrity": "sha512-3ALe0bjBVZtkdWKIcThYpQCLbBMd/+Tbh2CDSrAIDO3UsZ4Xs+tnyjv2MjCOMMgBG+AsUOeuP1cgtY1INISc8w==",
- "dev": true,
- "requires": {
- "readable-stream": "^2.0.2"
- }
- },
- "readable-stream": {
- "version": "2.3.7",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
- "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
- "dev": true,
- "requires": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
- },
- "dependencies": {
- "safe-buffer": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
- "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
- "dev": true
- },
- "string_decoder": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
- "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
- "dev": true,
- "requires": {
- "safe-buffer": "~5.1.0"
- }
- }
- }
- },
- "resolve": {
- "version": "1.22.1",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz",
- "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==",
- "dev": true,
- "requires": {
- "is-core-module": "^2.9.0",
- "path-parse": "^1.0.7",
- "supports-preserve-symlinks-flag": "^1.0.0"
- }
- },
- "ripemd160": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz",
- "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==",
- "dev": true,
- "requires": {
- "hash-base": "^3.0.0",
- "inherits": "^2.0.1"
- }
- },
- "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==",
- "dev": true
- },
- "safer-buffer": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
- "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
- "dev": true
- },
- "sha.js": {
- "version": "2.4.11",
- "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz",
- "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==",
- "dev": true,
- "requires": {
- "inherits": "^2.0.1",
- "safe-buffer": "^5.0.1"
- }
- },
- "shasum": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/shasum/-/shasum-1.0.2.tgz",
- "integrity": "sha512-UTzHm/+AzKfO9RgPgRpDIuMSNie1ubXRaljjlhFMNGYoG7z+rm9AHLPMf70R7887xboDH9Q+5YQbWKObFHEAtw==",
- "dev": true,
- "requires": {
- "json-stable-stringify": "~0.0.0",
- "sha.js": "~2.4.4"
- }
- },
- "shasum-object": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/shasum-object/-/shasum-object-1.0.0.tgz",
- "integrity": "sha512-Iqo5rp/3xVi6M4YheapzZhhGPVs0yZwHj7wvwQ1B9z8H6zk+FEnI7y3Teq7qwnekfEhu8WmG2z0z4iWZaxLWVg==",
- "dev": true,
- "requires": {
- "fast-safe-stringify": "^2.0.7"
- }
- },
- "shell-quote": {
- "version": "1.7.3",
- "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.3.tgz",
- "integrity": "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==",
- "dev": true
- },
- "simple-concat": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz",
- "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==",
- "dev": true
- },
- "source-map": {
- "version": "0.5.7",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
- "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==",
- "dev": true
- },
- "stream-browserify": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz",
- "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==",
- "dev": true,
- "requires": {
- "inherits": "~2.0.1",
- "readable-stream": "^2.0.2"
- }
- },
- "stream-combiner2": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz",
- "integrity": "sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==",
- "dev": true,
- "requires": {
- "duplexer2": "~0.1.0",
- "readable-stream": "^2.0.2"
- }
- },
- "stream-http": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.2.0.tgz",
- "integrity": "sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==",
- "dev": true,
- "requires": {
- "builtin-status-codes": "^3.0.0",
- "inherits": "^2.0.4",
- "readable-stream": "^3.6.0",
- "xtend": "^4.0.2"
- },
- "dependencies": {
- "readable-stream": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
- "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
- "dev": true,
- "requires": {
- "inherits": "^2.0.3",
- "string_decoder": "^1.1.1",
- "util-deprecate": "^1.0.1"
- }
- }
- }
- },
- "stream-splicer": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-2.0.1.tgz",
- "integrity": "sha512-Xizh4/NPuYSyAXyT7g8IvdJ9HJpxIGL9PjyhtywCZvvP0OPIdqyrr4dMikeuvY8xahpdKEBlBTySe583totajg==",
- "dev": true,
- "requires": {
- "inherits": "^2.0.1",
- "readable-stream": "^2.0.2"
- }
- },
- "string_decoder": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
- "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
- "dev": true,
- "requires": {
- "safe-buffer": "~5.2.0"
- }
- },
- "subarg": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz",
- "integrity": "sha512-RIrIdRY0X1xojthNcVtgT9sjpOGagEUKpZdgBUi054OEPFo282yg+zE+t1Rj3+RqKq2xStL7uUHhY+AjbC4BXg==",
- "dev": true,
- "requires": {
- "minimist": "^1.1.0"
- }
- },
- "supports-preserve-symlinks-flag": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
- "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
- "dev": true
- },
- "syntax-error": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.4.0.tgz",
- "integrity": "sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w==",
- "dev": true,
- "requires": {
- "acorn-node": "^1.2.0"
- }
- },
- "through": {
- "version": "2.3.8",
- "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
- "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==",
- "dev": true
- },
- "through2": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
- "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
- "dev": true,
- "requires": {
- "readable-stream": "~2.3.6",
- "xtend": "~4.0.1"
- }
- },
- "timers-browserify": {
- "version": "1.4.2",
- "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz",
- "integrity": "sha512-PIxwAupJZiYU4JmVZYwXp9FKsHMXb5h0ZEFyuXTAn8WLHOlcij+FEcbrvDsom1o5dr1YggEtFbECvGCW2sT53Q==",
- "dev": true,
- "requires": {
- "process": "~0.11.0"
- }
- },
- "tty-browserify": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz",
- "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==",
- "dev": true
- },
- "typedarray": {
- "version": "0.0.6",
- "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
- "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==",
- "dev": true
- },
- "umd": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/umd/-/umd-3.0.3.tgz",
- "integrity": "sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow==",
- "dev": true
- },
- "undeclared-identifiers": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/undeclared-identifiers/-/undeclared-identifiers-1.1.3.tgz",
- "integrity": "sha512-pJOW4nxjlmfwKApE4zvxLScM/njmwj/DiUBv7EabwE4O8kRUy+HIwxQtZLBPll/jx1LJyBcqNfB3/cpv9EZwOw==",
- "dev": true,
- "requires": {
- "acorn-node": "^1.3.0",
- "dash-ast": "^1.0.0",
- "get-assigned-identifiers": "^1.2.0",
- "simple-concat": "^1.0.0",
- "xtend": "^4.0.1"
- }
- },
- "url": {
- "version": "0.11.0",
- "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz",
- "integrity": "sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ==",
- "dev": true,
- "requires": {
- "punycode": "1.3.2",
- "querystring": "0.2.0"
- },
- "dependencies": {
- "punycode": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
- "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==",
- "dev": true
- }
- }
- },
"usb": {
"version": "1.9.2",
"resolved": "https://registry.npmjs.org/usb/-/usb-1.9.2.tgz",
@@ -2870,47 +63,6 @@
"node-addon-api": "^4.2.0",
"node-gyp-build": "^4.3.0"
}
- },
- "util": {
- "version": "0.10.4",
- "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz",
- "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==",
- "dev": true,
- "requires": {
- "inherits": "2.0.3"
- },
- "dependencies": {
- "inherits": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
- "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==",
- "dev": true
- }
- }
- },
- "util-deprecate": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
- "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
- "dev": true
- },
- "vm-browserify": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz",
- "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==",
- "dev": true
- },
- "wrappy": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
- "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
- "dev": true
- },
- "xtend": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
- "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
- "dev": true
}
}
}
diff --git a/package.json b/package.json
index dcec65c..f852f93 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "rtlsdrjs",
- "version": "0.0.0",
+ "version": "1.0.0",
"description": "Turn your Realtek RTL2832U based device into an SDR receiver using JavaScript",
"main": "index.js",
"directories": {
@@ -9,12 +9,8 @@
"dependencies": {
"usb": "^1.3.1"
},
- "devDependencies": {
- "browserify": "^16.1.1"
- },
"scripts": {
- "test": "echo \"Error: no test specified\" && exit 1",
- "build": "browserify --bare -o build/Release/rtlsdr.js browser.js"
+ "test": "echo \"Error: no test specified\" && exit 1"
},
"repository": {
"type": "git",
@@ -35,7 +31,7 @@
"url": "https://github.com/sandeepmistry/rtlsdrjs/issues"
},
"homepage": "https://github.com/sandeepmistry/rtlsdrjs#readme",
- "browser": {
- "./lib/usb.js": "./lib/web-usb.js"
+ "engines": {
+ "node": ">=14.13.0"
}
}