diff --git a/config/karma.conf.js b/config/karma.conf.js index dedf665..a6927ba 100644 --- a/config/karma.conf.js +++ b/config/karma.conf.js @@ -25,7 +25,7 @@ module.exports = function(config) { ], preprocessors: { - '**/*.coffee': ['coffee'], + // '**/*.coffee': ['coffee'], 'test/*.js': ['browserify'], }, @@ -77,7 +77,7 @@ module.exports = function(config) { singleRun: false, browserify: { - extension: ['.coffee'], + //extension: ['.coffee'], transform: [], // require: ['native-buffer-browserify'], watch: true @@ -86,7 +86,6 @@ module.exports = function(config) { plugins: [ 'karma-chrome-launcher', 'karma-firefox-launcher', - 'karma-phantomjs-launcher', 'karma-browserify', 'karma-mocha' ] diff --git a/grib-cli.js b/grib-cli.js index 5da1acc..1dc7cd3 100644 --- a/grib-cli.js +++ b/grib-cli.js @@ -9,9 +9,10 @@ const grib = require('./index'); program .version('0.0.1') -.option('-o, --out [optional]','outfile (else stdout)') -.option('-i, --input ','input file (else stdin)') -.option('-p, --pretty','pretty print output json') +.option('-c, --convert [optional]', 'convert to grib2json format') +.option('-o, --out [optional]', 'outfile (else stdout)') +.option('-i, --input ', 'input file (else stdin)') +.option('-p, --pretty', 'pretty print output json') .parse(process.argv); // end with parse to parse through the input @@ -25,6 +26,10 @@ jBinary.loadData(program.input, function(err, data) { exit(1); } + if(program.convert) { + msgs_ = grib.convertData(msgs_) + } + if(program.out) { fs.writeFileSync(program.out, program.pretty ? JSON.stringify(msgs_, null, 4) : JSON.stringify(msgs_) ); } @@ -32,4 +37,4 @@ jBinary.loadData(program.input, function(err, data) { console.log(program.pretty ? JSON.stringify(msgs_, null, 4) : JSON.stringify(msgs_)); } }); -}); \ No newline at end of file +}); diff --git a/index.js b/index.js index d13b78f..626dba0 100644 --- a/index.js +++ b/index.js @@ -1,6 +1,6 @@ -var gribParse = require('./lib/parser'); -var tables = require('./lib/tables'); -var jBinary = require('jbinary'); +const gribParse = require('./lib/parser'); +const tables = require('./lib/tables'); +const loadData = require('./load-data'); for(var tableName in tables.tables) { exports[tableName] = tables.tables[tableName]; @@ -8,11 +8,10 @@ for(var tableName in tables.tables) { exports.readData = function(data, cb) { var msgs; - var dataView = new jBinary(data).view; // Write the contents of the buffer catching any parse errors try { - msgs = gribParse.parseDataView(dataView); + msgs = gribParse.parseDataView(data); } catch(e) { return cb(e, null); } @@ -24,8 +23,94 @@ exports.readData = function(data, cb) { } exports.readUrl = function(url, cb) { - jBinary.loadData(url, function(err, data) { + loadData(url, function(err, data) { if(err) return cb(err); exports.readData(data, cb); }); } + +exports.convertData = function(data) { + getGridUnits = function(templateNumber) { + switch (templateNumber) { + case 0: + case 1: + case 2: + case 3: + case 40: + case 41: + case 42: + case 43: + return "degrees"; + + case 10: + case 20: + case 30: + case 31: + return "m"; + + default: + return ""; + } + } + + const msgs_ = [] + for (var msgs of data) { + const header = { + discipline: msgs.fields[0].indicator.discipline.value, + disciplineName: msgs.fields[0].indicator.discipline.name, + gribEdition: msgs.fields[0].indicator.edition, + gribLength: msgs.fields[0].indicator.length, + center: msgs.originatingCenter.value, + centerName: msgs.originatingCenter.name, + subcenter: msgs.originatingSubCenter, + refTime: msgs.referenceTime, + significanceOfRT: msgs.referenceTimeSignificance.value, + significanceOfRTName: msgs.referenceTimeSignificance.value, + productStatus: msgs.productionStatus.value, + productStatusName: msgs.productionStatus.name, + productType: msgs.type.value, + productTypeName: msgs.type.name, + productDefinitionTemplate: msgs.fields[0].product.templateNumber.value, + productDefinitionTemplateName: msgs.fields[0].product.templateNumber.name, + parameterCategory: msgs.fields[0].product.details.category.value, + parameterCategoryName: msgs.fields[0].product.details.category.name, + parameterNumber: msgs.fields[0].product.details.parameter.value, + parameterNumberName: msgs.fields[0].product.details.parameter.name, + parameterUnit: msgs.fields[0].product.details.parameter.unit, + genProcessType: msgs.fields[0].product.details.generatingProcessType.value, + genProcessTypeName: msgs.fields[0].product.details.generatingProcessType.name, + forecastTime: msgs.fields[0].product.details.forecastTime, + surface1Type: msgs.fields[0].product.details.surfaceType.value, + surface1TypeName: msgs.fields[0].product.details.surfaceType.name, + surface1Value: msgs.fields[0].product.details.surfaceTypeValue, + surface2Type: msgs.fields[0].product.details.secondSurfaceType.value, + surface2TypeName: msgs.fields[0].product.details.secondSurfaceType.name, + surface2Value: msgs.fields[0].product.details.secondSurfaceTypeValue, + gridDefinitionTemplate: msgs.fields[0].grid.templateNumber, + gridDefinitionTemplateName: msgs.fields[0].grid.definition.name, + numberPoints: msgs.fields[0].grid.dataPointCount, + shape: msgs.fields[0].grid.definition.earthShape.value, + shapeName: msgs.fields[0].grid.definition.earthShape.name, + gridUnits: getGridUnits(msgs.fields[0].grid.templateNumber), + resolution: msgs.fields[0].grid.definition.resolutionAndComponentFlags, + winds: !!(msgs.fields[0].grid.definition.resolutionAndComponentFlags & (1 << 4)), + scanMode: msgs.fields[0].grid.definition.scanningMode, + nx: msgs.fields[0].grid.definition.ni, + ny: msgs.fields[0].grid.definition.nj, + basicAngle: msgs.fields[0].grid.definition.basicAngle, + lo1: msgs.fields[0].grid.definition.lo1, + la1: msgs.fields[0].grid.definition.la1, + lo2: msgs.fields[0].grid.definition.lo2, + la2: msgs.fields[0].grid.definition.la2, + dx: msgs.fields[0].grid.definition.di, + dy: msgs.fields[0].grid.definition.dj, + } + const gribdata = msgs.fields[0].data + msgs_.push({ + header, + data: gribdata, + }) + } + + return msgs_ +} diff --git a/lib/BinaryDataView.js b/lib/BinaryDataView.js new file mode 100644 index 0000000..a84c7c7 --- /dev/null +++ b/lib/BinaryDataView.js @@ -0,0 +1,145 @@ +class BinaryDataView { + /** + * + * @param {Buffer} buffer + */ + constructor(byteArray) { + if (byteArray instanceof Buffer) { + this.view = new DataView(byteArray.buffer, byteArray.byteOffset, byteArray.byteLength); + } + else { + this.view = new DataView(byteArray); + } + this.view.getUnsigned = this.getUnsigned.bind(this); + this.offset = 0; + this.bOffset = 0; + } + seek(offset) { + this.offset = offset; + } + skip(n) { + this.offset += n; + } + tell() { + return this.offset; + } + incrByte() { + if (this.bOffset > 0) { + this.offset++; + this.bOffset = 0; + } + } + read(type, offset) { + if (offset) { + const current = this.offset; + this.offset = offset; + const val = this[type](); + this.offset = current; + return val; + } + return this[type](); + } + readArray(type, size) { + const val = new Array(size); + for (let i = 0; i < size; i++) { + val[i] = this[type](); + } + return val; + } + readBlob(size) { + const val = this.view.buffer.slice(this.offset, this.offset + size); + this.offset += size; + return val; + } + grib32() { + const raw = this.uint32(); + const sign = raw >>> 31; + const value = raw & 0x7fffffff; + return 1 === sign ? -value : value + } + grib16() { + const raw = this.uint16(); + const sign = raw >>> 15; + const value = raw & 0x7fff; + return 1 === sign ? -value : value + } + grib8() { + const raw = this.uint8(); + const sign = raw >>> 7; + const value = raw & 0x7f; + return 1 === sign ? -value : value + } + int8() { + const val = this.view.getInt8(this.offset); + this.offset++; + return val; + } + int16() { + const val = this.view.getInt16(this.offset); + this.offset += 2; + return val; + } + int32() { + const val = this.view.getInt32(this.offset); + this.offset += 4; + return val; + } + uint8() { + const val = this.view.getUint8(this.offset); + this.offset++; + return val; + + } + uint16() { + const val = this.view.getUint16(this.offset); + this.offset += 2; + return val; + + } + uint32() { + const val = this.view.getUint32(this.offset); + this.offset += 4; + return val; + } + uint64() { + return { + hi: this.uint32(), + lo: this.uint32() + } + } + float32() { + const val = this.view.getFloat32(this.offset); + this.offset += 4; + return val; + } + getUnsigned(n) { + const m = this.bOffset + n; + const bytes = Math.ceil(m / 8); + let val; + switch (bytes) { + case 1: + val = (this.view.getUint8(this.offset) & (0xff >>> this.bOffset)) >>> (8 - m); + break; + case 2: + val = (this.view.getUint16(this.offset) & (0xffff >>> this.bOffset)) >>> (16 - m); + break; + case 3: + case 4: + val = (this.view.getUint32(this.offset) & (0xffffffff >>> this.bOffset)) >>> (32 - m); + break; + case 5: + case 6: + case 7: + case 8: + val = (this.view.getBigUInt64(this.offset) & (0xffffffffffffffffn >> BigInt(this.bOffset))) >> BigInt(64 - m); + break; + default: + console.error("Can't read more than 8 bytes at a time"); + break; + } + this.bOffset = m % 8; + this.offset += Math.floor(m / 8); + return val; + } +} +module.exports = BinaryDataView; \ No newline at end of file diff --git a/lib/parser.js b/lib/parser.js index 063e241..6cf5878 100644 --- a/lib/parser.js +++ b/lib/parser.js @@ -1,9 +1,9 @@ var tables = require('./tables'); -var jBinary = require('jbinary'); +var BinaryDataView = require('./BinaryDataView'); exports.parseDataView = function(dataView) { var msgs = [], offset, - binary = jBinary(dataView, { 'jBinary.littleEndian': false }), + binary = new BinaryDataView(dataView), indicator, sections; // GRIB messages start with 'GRIB' @@ -19,7 +19,7 @@ exports.parseDataView = function(dataView) { } // If we found a message, parse it into sections and add to messages - sections = parseSections(binary); + sections = [indicator, ...parseSections(binary, indicator)]; msgs.push(new Grib2Message(sections)); // Move to last byte of message (the offset++ in the for loop will move us to next one) @@ -75,23 +75,34 @@ var parseIndicator = function(binary) { rv.magic = binary.read('uint32'); if(rv.magic != 0x47524942) { throw new Error('Invalid magic number for indicator: ' + rv.magic); } - rv.reserved = binary.read(['array', 'uint8', 2]); - rv.discipline = binary.read('uint8'); + rv.reserved = binary.readArray('uint8', 2); + rv.discipline = binary.read('uint8') rv.edition = binary.read('uint8'); if(rv.edition != 2) { throw new Error('Unknown GRIB edition: ' + rv.edition); } rv.byteLength = binary.read('uint64'); + // for display + rv.number = 0; + rv.contents = { + length: rv.byteLength.lo, + edition: rv.edition, + discipline: tables.lookup( + tables.tables.Discipline, + rv.discipline + ), + } + return rv; }; // Parse sections until end marker -var parseSections = function(binary) { +var parseSections = function(binary, indicator) { var rv = [], section; // While we're not at a section 8 marker while(binary.read('uint32', binary.tell()) != 0x37373737) { // Parse a section - section = parseSection(binary); + section = parseSection(binary, indicator, rv); rv.push(section); } @@ -102,7 +113,7 @@ var parseSections = function(binary) { } // Parse a single section and advance binary to the section's end -var parseSection = function(binary) { +var parseSection = function(binary, indicator, sections) { var section = {}, startOffset = binary.tell(), sectionParseFunc; @@ -113,10 +124,14 @@ var parseSection = function(binary) { sectionParseFunc = sectionParsers[section.number]; if(!sectionParseFunc) { // ... no, copy bytes verbatim - section.contents = binary.read(['blob', section.byteLength-5]); + section.contents = binary.readBlob(section.byteLength-5); } else { // ... yes, make use of it - section.contents = sectionParseFunc(binary, section.byteLength); + if (7 == section.number) { + section.contents = sectionParseFunc(binary, sections[3]); + } else { + section.contents = sectionParseFunc(binary, section.byteLength, indicator); + } } // Seek to end of section @@ -128,7 +143,10 @@ var parseSection = function(binary) { var sectionParsers = { 1: function(binary) { var rv = {}; - rv.originatingCenter = binary.read('uint16'); + rv.originatingCenter =tables.lookup( + tables.tables.Center, + binary.read('uint16') + ); rv.originatingSubCenter = binary.read('uint16'); rv.masterTablesVersion = binary.read('uint8'); rv.localTablesVersion = binary.read('uint8'); @@ -171,6 +189,24 @@ var sectionParsers = { return rv; }, + 4: function(binary, byteLength, indicator) { // product + var rv = {} + rv.coordinateValues = binary.read('uint16'); + rv.templateNumber = tables.lookup( + tables.tables.ProductDefinition, + binary.read('uint16') + ); + + if (dataProductTemplateParsers[rv.templateNumber.value]) { + rv.details = dataProductTemplateParsers[rv.templateNumber.value](binary, indicator); + } + else + { + // unknown. + rv.data = binary.readBlob(byteLength-5-4-2); + } + return rv; + }, 5: function(binary, byteLength) { // representation var rv = {} rv.dataPointCount = binary.read('uint32'); @@ -184,11 +220,11 @@ var sectionParsers = { else { // unknown. - rv.data = binary.read(['blob', byteLength-5-4-2]); + rv.data = binary.readBlob(byteLength-5-4-2); } return rv; }, - 6: function(binary, byteLength) { // bitMap + 6: function(binary, byteLength, indicator, section5) { // bitMap var rv = {}; rv.indicator = tables.lookup( tables.tables.BitMapIndicator, @@ -198,9 +234,135 @@ var sectionParsers = { rv.data = "NOT IMPLEMENTED. YOUR DATA IS HERE"; // will look something like: ///rv.data = binary.read(['blob', byteLength-5-1]); - + } return rv; + }, + 7: function(binary, section5) { // data + // Complex packing and spatial differencing + if (3 == section5.contents.templateNumber.value) { + // values from section 5 + const mvm = section5.contents.details.missingValueManagementUsed.value + const R = section5.contents.details.referenceValue + const DD = 10**section5.contents.details.decimalScaleFactor + const EE = 2**section5.contents.details.binaryScaleFactor + const ref_val = R / DD + const NG = section5.contents.details.numberOfGroupsOfDataValues + const orderSpatial = section5.contents.details.orderOfSpatialDifferencing.value + const descriptorSpatial = section5.contents.details.numberOfOctetsExtraDescriptors + const nb = section5.contents.details.bitsPerValue + const nbgw = section5.contents.details.numberOfBitsUsedForTheGroupWidths + const nbsgl = section5.contents.details.numberOfBitsForScaledGroupLengths + const len_inc = section5.contents.details.lengthIncrementForTheGroupLengths + const len_last = section5.contents.details.trueLengthOfLastGroup + const totalNPoints = section5.contents.dataPointCount + const referenceGroupWidths = section5.contents.details.referenceForGroupWidths + const referenceGroupLength = section5.contents.details.referenceForGroupLengths + + // [6-ww] 1st values of undifferenced scaled values and minimums + let gribSigned = 'grib8'; + if (2 == descriptorSpatial) { + gribSigned = 'grib16' + } + + const ival1 = binary.read(gribSigned); + const ival2 = binary.read(gribSigned); + const minsd = binary.read(gribSigned); + + // [ww +1]-xx Get reference values for groups (X1's) + let X1 = [] + for (let i = 0; i < NG; i++) { + X1.push(binary.view.getUnsigned(nb)) + } + binary.incrByte(); + + // [xx +1 ]-yy Get number of bits used to encode each group + let NB = [] + for (let i = 0; i < NG; i++) { + NB.push(binary.view.getUnsigned(nbgw)) + } + for (let i = 0; i < NG; i++) { + NB[i] += referenceGroupWidths; + } + binary.incrByte(); + + // [yy +1 ]-zz Get the scaled group lengths using formula + // Ln = ref + Kn * len_inc, where n = 1-NG, + // ref = referenceGroupLength, and len_inc = lengthIncrement + let L = [] + for (let i = 0; i < NG; i++) { + L.push(binary.view.getUnsigned(nbsgl)) + } + binary.incrByte(); + + let totalL = 0; + for (let i = 0; i < NG; i++) { + L[i] = L[i] * len_inc + referenceGroupLength + totalL += L[i]; + } + + totalL -= L[NG - 1]; + totalL += len_last + L[NG - 1] = len_last + + if (totalL != totalNPoints) { + return + } + + // [zz +1 ]-nn get X2 values and calculate the results Y using formula + // formula used to create values, Y * 10**D = R + (X1 + X2) * 2**E + + // Y = (R + (X1 + X2) * (2 ** E) ) / (10 ** D)] + // WHERE: + // Y = THE VALUE WE ARE UNPACKING + // R = THE REFERENCE VALUE (FIRST ORDER MINIMA) + // X1 = THE PACKED VALUE + // X2 = THE SECOND ORDER MINIMA + // E = THE BINARY SCALE FACTOR + // D = THE DECIMAL SCALE FACTOR + let count = 0; + let data = []; + + for (let i = 0; i < NG; i++) { + if (NB[i] != 0) { + for (let j = 0; j < L[i]; j++) { + data[count++] = binary.view.getUnsigned(NB[i]) + X1[i]; + } + } else { + for (let j = 0; j < L[i]; j++) { + data[count++] = X1[i]; + } + } + } // end for i + + binary.incrByte(); + + data[0] = ival1; + data[1] = ival2; + let itemp; + itemp = totalNPoints; + for (let i = 2; i < itemp; i++) { + data[i] += minsd; + data[i] = data[i] + 2 * data[i - 1] - data[i - 2]; + } + + // formula used to create values, Y * 10**D = R + (X1 + X2) * 2**E + + // Y = (R + (X1 + X2) * (2 ** E) ) / (10 ** D)] + // WHERE: + // Y = THE VALUE WE ARE UNPACKING + // R = THE REFERENCE VALUE (FIRST ORDER MINIMA) + // X1 = THE PACKED VALUE + // X2 = THE SECOND ORDER MINIMA + // E = THE BINARY SCALE FACTOR + // D = THE DECIMAL SCALE FACTOR + + for (let i = 0; i < data.length; i++) { + data[i] = (R + (data[i] * EE)) / DD; + } + + return data + } } }; @@ -213,7 +375,7 @@ var parseScaledValue = function(binary) { // Parser for basic angle var parseBasicAngle = function(binary) { var basicAngle = binary.read('uint32'), basicAngleSub = binary.read('uint32'); - + basicAngle = ((basicAngle == 0) || (basicAngle == 0xffffffff)) ? 1 : basicAngle; basicAngleSub = ((basicAngleSub == 0) || (basicAngleSub == 0xffffffff)) ? 1e6 : basicAngleSub; @@ -230,10 +392,120 @@ var dataRepresentationTemplateParsers = { rv.decimalScaleFactor = binary.read('int16'); rv.numberOfBitsUsed = binary.read('uint8'); rv.originalType = binary.read('uint8'); + return rv; + }, + // Grid point data - complex packing + 3 : function(binary) { + var rv = {} + rv.name = "Grid point data - complex packing and spatial differencing"; + rv.referenceValue = binary.read('float32'); + rv.binaryScaleFactor = binary.read('int16'); + rv.decimalScaleFactor = binary.read('int16'); + rv.bitsPerValue = binary.read('uint8'); + rv.typeOfOriginalField = tables.lookup( + tables.tables.DataRepresentationFiedValueType, + binary.read('uint8') + ) + rv.groupSplittingMethodUsed = tables.lookup( + tables.tables.DataRepresentationGroupSplitting, + binary.read('uint8') + ) + rv.missingValueManagementUsed = tables.lookup( + tables.tables.DataRepresentationMissingValueManagement, + binary.read('uint8') + ) + rv.primaryMissingValueSubstitute = binary.read('uint32') + rv.secondaryMissingValueSubstitute = binary.read('uint32') + rv.numberOfGroupsOfDataValues = binary.read('uint32') + rv.referenceForGroupWidths = binary.read('uint8') + rv.numberOfBitsUsedForTheGroupWidths = binary.read('uint8') + rv.referenceForGroupLengths = binary.read('uint32') + rv.lengthIncrementForTheGroupLengths = binary.read('uint8') + rv.trueLengthOfLastGroup = binary.read('uint32') + rv.numberOfBitsForScaledGroupLengths = binary.read('uint8') + rv.orderOfSpatialDifferencing = tables.lookup( + tables.tables.DataRepresentationOrder, + binary.read('uint8') + ) + rv.numberOfOctetsExtraDescriptors = binary.read('uint8') + return rv; } +} +var dataProductTemplateParsers = { + // Analysis or forecast at a horizontal level or in + // a horizontal layer at a point in time + 0 : function(binary, indicator) { + var rv = {} + var category = categoryByDiscipline[indicator.contents.discipline.value]; + if (category) { + rv.category = category(binary); + } + else { + rv.category = { value: binary.read('int8') }; + } + category = parameterByCategory[indicator.contents.discipline.value]; + if (category) { + var parameter = category[rv.category.value]; + if (parameter) { + rv.parameter = parameter(binary) + } + } + if (!rv.hasOwnProperty("parameter")) { + rv.parameter = { value: binary.read('int8') }; + } + rv.generatingProcessType = tables.lookup( + tables.tables.GeneratingProcessType, + binary.read('uint8') + ) + rv.backgroundGeneratingProcess = binary.read('uint8') + rv.generatingProcessIdentified = tables.lookup( + tables.tables.GeneratingProcessOrModelFromCenter7, + binary.read('uint8') + ) + rv.hours = binary.read('uint16') + rv.minutes = binary.read('uint8') + rv.timeRange = tables.lookup( + tables.tables.TimeRange, + binary.read('uint8') + ) + rv.forecastTime = binary.read('uint32') + rv.surfaceType = tables.lookup( + tables.tables.SurfaceType, + binary.read('uint8') + ) + rv.surfaceTypeScale = binary.read('uint8') + rv.surfaceTypeValue = binary.read('uint32') + rv.secondSurfaceType = tables.lookup( + tables.tables.SurfaceType, + binary.read('uint8') + ) + rv.secondSurfaceTypeScale = binary.read('uint8') + rv.secondSurfaceTypeValue = binary.read('uint32') + + return rv; + } +} +const categoryByDiscipline = { + 0 : (binary) => tables.lookup( + tables.tables.MeteorologicalProducts, + binary.read('int8') + ) +} + +const parameterByCategory = { + 0 : { + 2 :(binary) => tables.lookup( + tables.tables.MeteorologicalProductsMomentumParameter, + binary.read('int8') + ), + 6 :(binary) => tables.lookup( + tables.tables.MeteorologicalProductsCloudsCategory, + binary.read('int8') + ), + } } var gridParsers = { @@ -246,9 +518,9 @@ var gridParsers = { rv.minorAxis = parseScaledValue(binary); rv.ni = binary.read('uint32'); rv.nj = binary.read('uint32'); rv.basicAngle = parseBasicAngle(binary); - rv.la1 = binary.read('int32'); rv.lo1 = binary.read('int32'); + rv.la1 = binary.read('grib32'); rv.lo1 = binary.read('grib32'); rv.resolutionAndComponentFlags = binary.read('uint8'); - rv.la2 = binary.read('int32'); rv.lo2 = binary.read('int32'); + rv.la2 = binary.read('grib32'); rv.lo2 = binary.read('grib32'); rv.di = binary.read('int32'); rv.dj = binary.read('int32'); rv.scanningMode = binary.read('uint8'); @@ -259,7 +531,7 @@ var gridParsers = { return rv; }, - // Grid Definition Template 3.10: Mercator + // Grid Definition Template 3.10: Mercator 10: function(binary) { var rv={}; rv.name = 'Mercator'; rv.earthShape = tables.lookup(tables.tables.EarthShape, binary.read('uint8')); @@ -300,7 +572,7 @@ var gridParsers = { rv.lad *= scale; rv.lov *= scale; return rv; }, - // Grid Definition Template 3.30: Lambert conformal + // Grid Definition Template 3.30: Lambert conformal 30: function(binary) { var rv={}; rv.name = 'Polar stereographic projection'; rv.earthShape = tables.lookup(tables.tables.EarthShape, binary.read('uint8')); @@ -346,7 +618,7 @@ var gridParsers = { rv.di *= scale; return rv; }, - // Grid Definition Template 3.90: Space view perspective or orthographic + // Grid Definition Template 3.90: Space view perspective or orthographic // FIXME: implement properly 90: function(binary) { var rv={}; rv.name = 'Space view perspective or orthographic'; diff --git a/lib/tables.js b/lib/tables.js index d0cc249..ac6d2fa 100644 --- a/lib/tables.js +++ b/lib/tables.js @@ -3,73 +3,803 @@ if(Object.freeze === undefined) { Object.freeze = function(x) { return x; } } // Attempt to lookup a value in the specified table. If the optional // throwIfNotFound is truthy throw an error if no match is found otherwise -// return the original value. FIXME: This is needlessly slow! +// return the original value. exports.lookup = function(table, value, throwIfNotFound) { - for(var k in table) { - if(table[k].value === value) { return table[k]; } + const v = table[value]; + if (!v) { + if (throwIfNotFound) throw new Error("Value not found"); + else return { name: "Not found", value }; } - return value; + return v; } exports.tables = { + // Code Table 0.0 + Discipline: Object.freeze({ + 0 : { name: 'Meteorological Products', value: 0 }, + 1 : { name: 'Hydrological Products', value: 1 }, + 2 : { name: 'Land Surface Products', value: 2 }, + 3 : { name: 'Satellite Remote Sensing Products', value: 3 }, + 4 : { name: 'Space Weather Products', value: 4 }, + 10 : { name: 'Oceanographic Products ', value: 10 }, + 255: { name: 'Missing', value: 255 }, + }), + + // Code Table 1.0 + Center: Object.freeze({ + 1 : { name: 'Melbourne (WMC)', value: 1 }, + 2 : { name: 'Melbourne (WMC)', value: 2 }, + 3 : { name: 'Melbourne (WMC)', value: 3 }, + 67 : { name: 'Melbourne (RSMC)', value: 67 }, + 4 : { name: 'Moscow (WMC)', value: 4 }, + 5 : { name: 'Moscow (WMC)', value: 5 }, + 6 : { name: 'Moscow (WMC)', value: 6 }, + 76 : { name: 'Moscow (RSMC/RAFC)', value: 76 }, + 7 : { name: 'US National Weather Service - NCEP (WMC)', value: 7 }, + 8 : { name: 'US National Weather Service - NWSTG (WMC)', value: 8 }, + 9 : { name: 'US National Weather Service - Other (WMC)', value: 9 }, + 10 : { name: 'Cairo (RSMC/RAFC)', value: 10 }, + 11 : { name: 'Cairo (RSMC/RAFC)', value: 11 }, + 12 : { name: 'Dakar (RSMC/RAFC)', value: 12 }, + 13 : { name: 'Dakar (RSMC/RAFC)', value: 13 }, + 14 : { name: 'Nairobi (RSMC/RAFC)', value: 14 }, + 15 : { name: 'Nairobi (RSMC/RAFC)', value: 15 }, + 16 : { name: 'Casablanca (RSMC)', value: 16 }, + 17 : { name: 'Tunis (RSMC)', value: 17 }, + 18 : { name: 'Tunis-Casablanca (RSMC)', value: 18 }, + 19 : { name: 'Tunis-Casablanca (RSMC)', value: 19 }, + 20 : { name: 'Las Palmas (RAFC)', value: 20 }, + 21 : { name: 'Algiers (RSMC)', value: 21 }, + 22 : { name: 'ACMAD', value: 22 }, + 23 : { name: 'Mozambique (NMC)', value: 23 }, + 24 : { name: 'Pretoria (RSMC)', value: 24 }, + 25 : { name: 'La Reunion (RSMC)', value: 25 }, + 26 : { name: 'Khabarovsk (RSMC)', value: 26 }, + 27 : { name: 'Khabarovsk (RSMC)', value: 27 }, + 28 : { name: 'New Delhi (RSMC/RAFC)', value: 28 }, + 29 : { name: 'New Delhi (RSMC/RAFC)', value: 29 }, + 30 : { name: 'Novosibirsk (RSMC)', value: 30 }, + 31 : { name: 'Novosibirsk (RSMC)', value: 31 }, + 32 : { name: 'Tashkent (RSMC)', value: 32 }, + 33 : { name: 'Jeddah (RSMC)', value: 33 }, + 34 : { name: 'Tokyo (RSMC), Japanese Meteorological Agency', value: 34 }, + 35 : { name: 'Tokyo (RSMC), Japanese Meteorological Agency', value: 35 }, + 36 : { name: 'Bankok', value: 36 }, + 37 : { name: 'Ulan Bator', value: 37 }, + 38 : { name: 'Beijing (RSMC)', value: 38 }, + 39 : { name: 'Beijing (RSMC)', value: 39 }, + 40 : { name: 'Seoul', value: 40 }, + 41 : { name: 'Buenos Aires (RSMC/RAFC)', value: 41 }, + 42 : { name: 'Buenos Aires (RSMC/RAFC)', value: 42 }, + 43 : { name: 'Brasilia (RSMC/RAFC)', value: 43 }, + 44 : { name: 'Brasilia (RSMC/RAFC)', value: 44 }, + 45 : { name: 'Santiago', value: 45 }, + 46 : { name: 'Brazilian Space Agency - INPE', value: 46 }, + 47 : { name: 'Columbia (NMC)', value: 47 }, + 48 : { name: 'Ecuador (NMC)', value: 48 }, + 49 : { name: 'Peru (NMC)', value: 49 }, + 50 : { name: 'Venezuela (NMC)', value: 50 }, + 51 : { name: 'Miami (RSMC/RAFC)', value: 51 }, + 52 : { name: 'Miami (RSMC), National Hurricane Center', value: 52 }, + 53 : { name: 'Canadian Meteorological Service - Montreal (RSMC)', value: 53 }, + 54 : { name: 'Canadian Meteorological Service - Montreal (RSMC)', value: 54 }, + 55 : { name: 'San Francisco', value: 55 }, + 56 : { name: 'ARINC Center', value: 56 }, + 57 : { name: 'US Air Force - Air Force Global Weather Center', value: 57 }, + 58 : { name: 'Fleet Numerical Meteorology and Oceanography Center,Monterey,CA,USA', value: 58 }, + 59 : { name: 'The NOAA Forecast Systems Lab, Boulder, CO, USA', value: 59 }, + 60 : { name: 'National Center for Atmospheric Research (NCAR), Boulder, CO', value: 60 }, + 61 : { name: 'Service ARGOS - Landover, MD, USA', value: 61 }, + 62 : { name: 'US Naval Oceanographic Office', value: 62 }, + 63 : { name: 'International Research Institude for Climate and Society', value: 63 }, + 64 : { name: 'Honolulu', value: 64 }, + 65 : { name: 'Darwin (RSMC)', value: 65 }, + 66 : { name: 'Darwin (RSMC)', value: 66 }, + 69 : { name: 'Wellington (RSMC/RAFC)', value: 69 }, + 70 : { name: 'Wellington (RSMC/RAFC)', value: 70 }, + 71 : { name: 'Nadi (RSMC)', value: 71 }, + 72 : { name: 'Singapore', value: 72 }, + 73 : { name: 'Malaysia (NMC)', value: 73 }, + 74 : { name: 'U.K. Met Office - Exeter (RSMC)', value: 74 }, + 75 : { name: 'U.K. Met Office - Exeter (RSMC)', value: 75 }, + 78 : { name: 'Offenbach (RSMC)', value: 78 }, + 79 : { name: 'Offenbach (RSMC)', value: 79 }, + 80 : { name: 'Rome (RSMC)', value: 80 }, + 81 : { name: 'Rome (RSMC)', value: 81 }, + 82 : { name: 'Norrkoping', value: 82 }, + 83 : { name: 'Norrkoping', value: 83 }, + 84 : { name: 'French Weather Service - Toulouse', value: 84 }, + 85 : { name: 'French Weather Service - Toulouse', value: 85 }, + 86 : { name: 'Helsinki', value: 86 }, + 87 : { name: 'Belgrade', value: 87 }, + 88 : { name: 'Oslo', value: 88 }, + 89 : { name: 'Prague', value: 89 }, + 90 : { name: 'Episkopi', value: 90 }, + 91 : { name: 'Ankara', value: 91 }, + 92 : { name: 'Frankfurt/Main (RAFC)', value: 92 }, + 93 : { name: 'London (WAFC)', value: 93 }, + 94 : { name: 'Copenhagen', value: 94 }, + 95 : { name: 'Rota', value: 95 }, + 96 : { name: 'Athens', value: 96 }, + 97 : { name: 'European Space Agency (ESA)', value: 97 }, + 98 : { name: 'European Center for Medium-Range Weather Forecasts (RSMC)', value: 98 }, + 99 : { name: 'De Bilt, Netherlands', value: 99 }, + 100: { name: 'Brazzaville', value: 100 }, + 101: { name: 'Abidjan', value: 101 }, + 102: { name: 'Libyan Arab Jamahiriya (NMC)', value: 102 }, + 103: { name: 'Madagascar (NMC)', value: 103 }, + 104: { name: 'Mauritius (NMC)', value: 104 }, + 105: { name: 'Niger (NMC)', value: 105 }, + 106: { name: 'Seychelles (NMC)', value: 106 }, + 107: { name: 'Uganda (NMC)', value: 107 }, + 108: { name: 'United Republic of Tanzania (NMC)', value: 108 }, + 109: { name: 'Zimbabwe (NMC)', value: 109 }, + 110: { name: 'Hong-Kong', value: 110 }, + 111: { name: 'Afghanistan (NMC)', value: 111 }, + 112: { name: 'Bahrain (NMC)', value: 112 }, + 113: { name: 'Bangladesh (NMC)', value: 113 }, + 114: { name: 'Bhutan (NMC)', value: 114 }, + 115: { name: 'Cambodia (NMC)', value: 115 }, + 116: { name: 'Democratic People\'s Republic of Korea (NMC)', value: 116 }, + 117: { name: 'Islamic Republic of Iran (NMC)', value: 117 }, + 118: { name: 'Iraq (NMC)', value: 118 }, + 119: { name: 'Kazakhstan (NMC)', value: 119 }, + 120: { name: 'Kuwait (NMC)', value: 120 }, + 121: { name: 'Kyrgyz Republic (NMC)', value: 121 }, + 122: { name: 'Lao People\'s Democratic Republic (NMC)', value: 122 }, + 123: { name: 'Macao, China', value: 123 }, + 124: { name: 'Maldives (NMC)', value: 124 }, + 125: { name: 'Myanmar (NMC)', value: 125 }, + 126: { name: 'Nepal (NMC)', value: 126 }, + 127: { name: 'Oman (NMC)', value: 127 }, + 128: { name: 'Pakistan (NMC)', value: 128 }, + 129: { name: 'Qatar (NMC)', value: 129 }, + 130: { name: 'Yemen (NMC)', value: 130 }, + 131: { name: 'Sri Lanka (NMC)', value: 131 }, + 132: { name: 'Tajikistan (NMC)', value: 132 }, + 133: { name: 'Turkmenistan (NMC)', value: 133 }, + 134: { name: 'United Arab Emirates (NMC)', value: 134 }, + 135: { name: 'Uzbekistan (NMC)', value: 135 }, + 136: { name: 'Viet Nam (NMC)', value: 136 }, + 140: { name: 'Bolivia (NMC)', value: 140 }, + 141: { name: 'Guyana (NMC)', value: 141 }, + 142: { name: 'Paraguay (NMC)', value: 142 }, + 143: { name: 'Suriname (NMC)', value: 143 }, + 144: { name: 'Uruguay (NMC)', value: 144 }, + 145: { name: 'French Guyana', value: 145 }, + 146: { name: 'Brazilian Navy Hydrographic Center', value: 146 }, + 147: { name: 'National Commission on Space Activities - Argentina', value: 147 }, + 148: { name: 'Brazilian Department of Airspace Control - DECEA', value: 148 }, + 150: { name: 'Antigua and Barbuda (NMC)', value: 150 }, + 151: { name: 'Bahamas (NMC)', value: 151 }, + 152: { name: 'Barbados (NMC)', value: 152 }, + 153: { name: 'Belize (NMC)', value: 153 }, + 154: { name: 'British Caribbean Territories Center', value: 154 }, + 155: { name: 'San Jose', value: 155 }, + 156: { name: 'Cuba (NMC)', value: 156 }, + 157: { name: 'Dominica (NMC)', value: 157 }, + 158: { name: 'Dominican Republic (NMC)', value: 158 }, + 159: { name: 'El Salvador (NMC)', value: 159 }, + 160: { name: 'US NOAA/NESDIS', value: 160 }, + 161: { name: 'US NOAA Office of Oceanic and Atmospheric Research', value: 161 }, + 162: { name: 'Guatemala (NMC)', value: 162 }, + 163: { name: 'Haiti (NMC)', value: 163 }, + 164: { name: 'Honduras (NMC)', value: 164 }, + 165: { name: 'Jamaica (NMC)', value: 165 }, + 166: { name: 'Mexico City', value: 166 }, + 167: { name: 'Netherlands Antilles and Aruba (NMC)', value: 167 }, + 168: { name: 'Nicaragua (NMC)', value: 168 }, + 169: { name: 'Panama (NMC)', value: 169 }, + 170: { name: 'Saint Lucia (NMC)', value: 170 }, + 171: { name: 'Trinidad and Tobago (NMC)', value: 171 }, + 172: { name: 'French Departments in RA IV', value: 172 }, + 173: { name: 'US National Aeronautics and Space Administration (NASA)', value: 173 }, + 174: { name: 'Integrated System Data Management/Marine Environmental Data Service (ISDM/MEDS) - Canada', value: 174 }, + 176: { name: 'US Cooperative Institude for Meteorological Satellite Studies', value: 176 }, + 190: { name: 'Cook Islands (NMC)', value: 190 }, + 191: { name: 'French Polynesia (NMC)', value: 191 }, + 192: { name: 'Tonga (NMC)', value: 192 }, + 193: { name: 'Vanuatu (NMC)', value: 193 }, + 194: { name: 'Brunei (NMC)', value: 194 }, + 195: { name: 'Indonesia (NMC)', value: 195 }, + 196: { name: 'Kiribati (NMC)', value: 196 }, + 197: { name: 'Federated States of Micronesia (NMC)', value: 197 }, + 198: { name: 'New Caledonia (NMC)', value: 198 }, + 199: { name: 'Niue', value: 199 }, + 200: { name: 'Papua New Guinea (NMC)', value: 200 }, + 201: { name: 'Philippines (NMC)', value: 201 }, + 202: { name: 'Samoa (NMC)', value: 202 }, + 203: { name: 'Solomon Islands (NMC)', value: 203 }, + 204: { name: 'Narional Institude of Water and Atmospheric Research - New Zealand', value: 204 }, + 210: { name: 'Frascati (ESA/ESRIN)', value: 210 }, + 211: { name: 'Lanion', value: 211 }, + 212: { name: 'Lisbon', value: 212 }, + 213: { name: 'Reykjavik', value: 213 }, + 214: { name: 'Madrid', value: 214 }, + 215: { name: 'Zurich', value: 215 }, + 216: { name: 'Service ARGOS - Toulouse', value: 216 }, + 217: { name: 'Bratislava', value: 217 }, + 218: { name: 'Budapest', value: 218 }, + 219: { name: 'Ljubljana', value: 219 }, + 220: { name: 'Warsaw', value: 220 }, + 221: { name: 'Zagreb', value: 221 }, + 222: { name: 'Albania (NMC)', value: 222 }, + 223: { name: 'Armenia (NMC)', value: 223 }, + 224: { name: 'Austria (NMC)', value: 224 }, + 225: { name: 'Azerbaijan (NMC)', value: 225 }, + 226: { name: 'Belarus (NMC)', value: 226 }, + 227: { name: 'Belgium (NMC)', value: 227 }, + 228: { name: 'Bosnia and Herzegovina (NMC)', value: 228 }, + 229: { name: 'Bulgaria (NMC)', value: 229 }, + 230: { name: 'Cyprus (NMC)', value: 230 }, + 231: { name: 'Estonia (NMC)', value: 231 }, + 232: { name: 'Georgia (NMC)', value: 232 }, + 233: { name: 'Dublin', value: 233 }, + 234: { name: 'Israel (NMC)', value: 234 }, + 235: { name: 'Jordan (NMC)', value: 235 }, + 236: { name: 'Latvia (NMC)', value: 236 }, + 237: { name: 'Lebanon (NMC)', value: 237 }, + 238: { name: 'Lithuania (NMC)', value: 238 }, + 239: { name: 'Luxembourg', value: 239 }, + 240: { name: 'Malta (NMC)', value: 240 }, + 241: { name: 'Monaco', value: 241 }, + 242: { name: 'Romania (NMC)', value: 242 }, + 243: { name: 'Syrian Arab Republic (NMC)', value: 243 }, + 244: { name: 'The former Yugoslav Republic of Macedonia (NMC)', value: 244 }, + 245: { name: 'Ukraine (NMC)', value: 245 }, + 246: { name: 'Republic of Moldova (NMC)', value: 246 }, + 247: { name: 'Operational Programme for the Exchange of Weather RAdar Information (OPERA) - EUMETNET', value: 247 }, + 250: { name: 'COnsortium for Small scale MOdelling (COSMO)', value: 250 }, + 254: { name: 'EUMETSAT Operations Center', value: 254 }, + 255: { name: 'Missing Value', value: 255 }, + }), + // Code Table 1.2 ReferenceTimeSignificance: Object.freeze({ - ANALYSIS: { name: 'Analysis', value: 0 }, - START_OF_FORECAST: { name: 'Start of Forecast', value: 1 }, - VERIFICATION: { name: 'Verification time of forecast', value: 2 }, - OBSERVATION: { name: 'Observations time', value: 3 }, - MISSING: { name: 'Missing', value: 255 }, + 0 : { name: 'Analysis', value: 0 }, + 1 : { name: 'Start of Forecast', value: 1 }, + 2 : { name: 'Verification time of forecast', value: 2 }, + 3 : { name: 'Observations time', value: 3 }, + 255: { name: 'Missing', value: 255 }, }), // Code Table 1.3 ProductionStatus: Object.freeze({ - OPERATIONAL: { name: 'Operational products', value: 0 }, - OPERATIONAL_TEST: { name: 'Operational test products', value: 1 }, - RESEARCH: { name: 'Research products', value: 2 }, - REANALYSIS: { name: 'Re-analysis', value: 3 }, - MISSING: { name: 'Missing', value: 255 }, + 0 : { name: 'Operational products', value: 0 }, + 1 : { name: 'Operational test products', value: 1 }, + 2 : { name: 'Research products', value: 2 }, + 3 : { name: 'Re-analysis', value: 3 }, + 255: { name: 'Missing', value: 255 }, }), // Code Table 1.4 Type: Object.freeze({ - ANALYSIS: { name: 'Analysis products', value: 0 }, - FORECAST: { name: 'Forecast products', value: 1 }, - ANALYSIS_AND_FORECAST: { name: 'Analysis and forecast products', value: 2 }, - CONTROL: { name: 'Control forecast products', value: 3 }, - PERTURBED: { name: 'Perturbed forecast products', value: 4 }, - CONTROL_AND_PERTURBED: { name: 'Control and perturbed forecast products', value: 5 }, - SATELLITE: { name: 'Processed satellite observations', value: 6 }, - RADAR: { name: 'Processed radar observations', value: 7 }, - MISSING: { name: 'Missing', value: 255 }, + 0 : { name: 'Analysis products', value: 0 }, + 1 : { name: 'Forecast products', value: 1 }, + 2 : { name: 'Analysis and forecast products', value: 2 }, + 3 : { name: 'Control forecast products', value: 3 }, + 4 : { name: 'Perturbed forecast products', value: 4 }, + 5 : { name: 'Control and perturbed forecast products', value: 5 }, + 6 : { name: 'Processed satellite observations', value: 6 }, + 7 : { name: 'Processed radar observations', value: 7 }, + 255: { name: 'Missing', value: 255 }, }), // Code Table 3.2 EarthShape: Object.freeze({ - STD_SPHERICAL_1: { name: 'Earth assumed spherical with radius = 6,367,470.0 m', value: 0 }, - SPHERICAL: { name: 'Earth assumed spherical with radius specified by data producer', value: 1 }, - IAU_SPHEROID: { name: 'Earth assumed oblate spheroid with size as determined by IAU in 1965 (major axis = 6,378,160.0 m, minor axis = 6,356,775.0 m, f = 1/297.0)', value: 2 }, - SPHEROID: { name: 'Earth assumed oblate spheroid with major and minor axes specified by data producer', value: 3 }, - IAG_SPHEROID: { name: 'Earth assumed oblate spheroid as defined in IAG-GRS80 model (major axis = 6,378,137.0 m, minor axis = 6,356,752.314 m, f = 1/298.257222101)', value: 4 }, - WGS84_SPHEROID: { name: 'Earth assumed represented by WGS84 (as used by ICAO since 1998)', value: 5 }, - STD_SPHERICAL_2: { name: 'Earth assumed spherical with radius of 6,371,229.0 m', value: 6 }, - MISSING: { name: 'Missing', value: 255 }, + 0 : { name: 'Earth assumed spherical with radius = 6,367,470.0 m', value: 0 }, + 1 : { name: 'Earth assumed spherical with radius specified by data producer', value: 1 }, + 2 : { name: 'Earth assumed oblate spheroid with size as determined by IAU in 1965 (major axis = 6,378,160.0 m, minor axis = 6,356,775.0 m, f = 1/297.0)', value: 2 }, + 3 : { name: 'Earth assumed oblate spheroid with major and minor axes specified by data producer', value: 3 }, + 4 : { name: 'Earth assumed oblate spheroid as defined in IAG-GRS80 model (major axis = 6,378,137.0 m, minor axis = 6,356,752.314 m, f = 1/298.257222101)', value: 4 }, + 5 : { name: 'Earth assumed represented by WGS84 (as used by ICAO since 1998)', value: 5 }, + 6 : { name: 'Earth assumed spherical with radius of 6,371,229.0 m', value: 6 }, + 255: { name: 'Missing', value: 255 }, + }), + + // Code Table 4.0 + ProductDefinition: Object.freeze({ + 0 : { name: 'Analysis or forecast at a horizontal level or in a horizontal layer at a point in time.', value: 0 }, + }), + + // Code Table 4.2 Meteorological products + MeteorologicalProducts: Object.freeze({ + 0 : { name: 'Temperature', value: 0 }, + 1 : { name: 'Moisture', value: 1 }, + 2 : { name: 'Momentum', value: 2 }, + 3 : { name: 'Mass', value: 3 }, + 4 : { name: 'Short wave radiation', value: 4 }, + 5 : { name: 'Long wave radiation', value: 5 }, + 6 : { name: 'Cloud', value: 6 }, + 7 : { name: 'Thermodynamic stability indices', value: 7 }, + 13 : { name: 'Aerosols', value: 13 }, + 14 : { name: 'Trace gases (e.g. Ozone, CO2)', value: 14 }, + 15 : { name: 'Radar', value: 15 }, + 16 : { name: 'Forecast Radar Imagery', value: 16 }, + 17 : { name: 'Electrodynamics', value: 17 }, + 18 : { name: 'Nuclear/radiology', value: 18 }, + 19 : { name: ' Physical atmospheric Properties', value: 19 }, + 20 : { name: 'Atmospheric Chemical Constituents', value: 20 }, + 190: { name: 'CCITT IA5 string', value: 190 }, + 191: { name: 'Miscellaneous', value: 191 }, + 192: { name: 'Covariance', value: 192 }, + 255: { name: 'Missing', value: 255 }, + }), + + // Code Table 4.2-0.2 Discipline 0 (Meteorological) Category 2 (Momentum) + MeteorologicalProductsMomentumParameter: Object.freeze({ + 0 : { name: 'Wind Direction (from which blowing)', value: 0, unit: '°', abbrev: 'WDIR' }, + 1 : { name: 'Wind Speed', value: 1, unit: 'm s-1', abbrev: 'WIND' }, + 2 : { name: 'U-Component of Wind', value: 2, unit: 'm s-1', abbrev: 'UGRD' }, + 3 : { name: 'V-Component of Wind', value: 3, unit:'m s-1', abbrev: 'VGRD ' }, + 4 : { name: 'Stream Function', value: 4, unit: 'm2 s-1', abbrev: 'STRM' }, + 5 : { name: 'Velocity Potential', value: 5, unit: 'm2 s-1', abbrev: 'VPOT' }, + 6 : { name: 'Montgomery Stream Function', value: 6, unit:'m2 s-2', abbrev: 'MNTSF ' }, + 7 : { name: 'Sigma Coordinate Vertical Velocity', value: 7, unit: 's-1', abbrev: 'SGCVV' }, + 8 : { name: 'Vertical Velocity (Pressure)', value: 8, unit: 'Pa s-1', abbrev: 'VVEL' }, + 9 : { name: 'Vertical Velocity (Geometric)', value: 9, unit:'m s-1', abbrev: 'DZDT' }, + 10 : { name: 'Absolute Vorticity', value: 10, unit: 's-1', abbrev: 'ABSV' }, + 11 : { name: 'Absolute Divergence', value: 11, unit: 's-1', abbrev: 'ABSD' }, + 12 : { name: 'Relative Vorticity', value: 12, unit: 's-1', abbrev: 'RELV' }, + 13 : { name: 'Relative Divergence', value: 13, unit: 's-1', abbrev: 'RELD' }, + 14 : { name: 'Potential Vorticity', value: 14, unit: 'K m2 kg-1 s-1', abbrev: 'PVORT' }, + 15 : { name: 'Vertical U-Component Shear', value: 15, unit: 's-1', abbrev: 'VUCSH' }, + 16 : { name: 'Vertical V-Component Shear', value: 16, unit: 's-1', abbrev: 'VVCSH' }, + 17 : { name: 'Momentum Flux, U-Component', value: 17, unit:'N m-2', abbrev: 'UFLX' }, + 18 : { name: 'Momentum Flux, V-Component', value: 18, unit:'N m-2', abbrev: 'VFLX' }, + 19 : { name: 'Wind Mixing Energy', value: 19, unit: 'J', abbrev: 'WMIXE' }, + 20 : { name: 'Boundary Layer Dissipation', value: 20, unit: 'W m-2', abbrev: 'BLYDP' }, + 22 : { name: 'Wind Speed (Gust)', value: 22, unit: 'm s-1', abbrev: 'GUST' }, + 23 : { name: 'U-Component of Wind (Gust)', value: 23, unit:'m s-1', abbrev: 'UGUST' }, + 24 : { name: 'V-Component of Wind (Gust)', value: 24, unit:'m s-1', abbrev: 'VGUST' }, + 25 : { name: 'Vertical Speed Shear', value: 25, unit:'s-1', abbrev: 'VWSH' }, + 26 : { name: 'Horizontal Momentum Flux', value: 26, unit:'N m-2', abbrev: 'MFLX' }, + 27 : { name: 'U-Component Storm Motion', value: 27, unit:'m s-1', abbrev: 'USTM' }, + 28 : { name: 'V-Component Storm Motion', value: 28, unit:'m s-1', abbrev: 'VSTM' }, + 29 : { name: 'Drag Coefficient', value: 29, unit:'Numeric', abbrev: 'CD' }, + 30 : { name: 'Frictional Velocity', value: 30, unit:'m s-1', abbrev: 'FRICV' }, + 31 : { name: 'Turbulent Diffusion Coefficient for Momentum', value: 31, unit:'m2 s-1', abbrev: 'TDCMOM' }, + 32 : { name: 'Eta Coordinate Vertical Velocity', value: 32, unit:'s-1', abbrev: 'ETACVV' }, + 33 : { name: 'Wind Fetch', value: 33, unit:'m', abbrev: 'WINDF' }, + 34 : { name: 'Normal Wind Component', value: 34, unit: 'm s-1', abbrev: 'NWIND' }, + 35 : { name: 'Tangential Wind Component', value: 35, unit:'m s-1', abbrev: 'TWIND' }, + 36 : { name: 'Amplitude Function for Rossby Wave Envelope for Meridional Wind', value: 36, unit:'m s-1', abbrev: 'AFRWE' }, + 37 : { name: 'Northward Turbulent Surface Stress', value: 37, unit:'N m-2 s', abbrev: 'NTSS' }, + 38 : { name: 'Eastward Turbulent Surface Stress', value: 38, unit:'N m-2 s', abbrev: 'ETSS' }, + 39 : { name: 'Eastward Wind Tendency Due to Parameterizations', value: 39, unit:'m s-2', abbrev: 'EWTPARM' }, + 40 : { name: 'Northward Wind Tendency Due to Parameterizations', value: 40, unit:'m s-2', abbrev: 'NWTPARM' }, + 41 : { name: 'U-Component of Geostrophic Wind', value: 41, unit:'m s-1', abbrev: 'UGWIND' }, + 42 : { name: 'V-Component of Geostrophic Wind', value: 42, unit:'m s-1', abbrev: 'VGWIND' }, + 43 : { name: 'Geostrophic Wind Direction', value: 43, unit:'°', abbrev: 'GEOWD' }, + 44 : { name: 'Geostrophic Wind Speed', value: 44, unit:'m s-1', abbrev: 'GEOWS' }, + 45 : { name: 'Unbalanced Component of Divergence', value: 45, unit:'s-1', abbrev: 'UNDIV' }, + 46 : { name: 'Vorticity Advection', value: 46, unit:'s-2', abbrev: 'VORTADV' }, + 192: { name: 'Vertical Speed Shear', value: 192, unit:'s-1', abbrev: 'VWSH' }, + 193: { name: 'Horizontal Momentum Flux', value: 193, unit:'N m-2', abbrev: 'MFLX' }, + 194: { name: 'U-Component Storm Motion', value: 194, unit:'m s-1', abbrev: 'USTM' }, + 195: { name: 'V-Component Storm Motion', value: 195, unit:'m s-1', abbrev: 'VSTM' }, + 196: { name: 'Drag Coefficient', value: 196, unit: 'non-dim', abbrev: 'CD' }, + 197: { name: 'Frictional Velocity', value: 197, abbrev: 'm s-1', abbrev: 'FRICV' }, + 198: { name: 'Latitude of U Wind Component of Velocity', value: 198, unit:'deg', abbrev: 'LAUV' }, + 199: { name: 'Longitude of U Wind Component of Velocity', value: 199, unit:'deg', abbrev: 'LOUV' }, + 200: { name: 'Latitude of V Wind Component of Velocity', value: 200, unit:'deg', abbrev: 'LAVV' }, + 201: { name: 'Longitude of V Wind Component of Velocity', value: 201, unit:'deg', abbrev: 'LOVV' }, + 202: { name: 'Latitude of Presure Point', value: 202, unit:'deg', abbrev: 'LAPP' }, + 203: { name: 'Longitude of Presure Point', value: 203, unit:'deg', abbrev: 'LOPP' }, + 204: { name: 'Vertical Eddy Diffusivity Heat exchange', value: 204, unit:'m2 s-1', abbrev: 'VEDH' }, + 205: { name: 'Covariance between Meridional and Zonal Components of the wind.', value: 205, unit:'m2 s-2', abbrev: 'COVMZ' }, + 206: { name: 'Covariance between Temperature and Zonal Components of the wind.', value: 206, unit:'K*m s-1', abbrev: 'COVTZ' }, + 207: { name: 'Covariance between Temperature and Meridional Components of the wind.', value: 207, unit:'K*m s-1', abbrev: 'COVTM' }, + 208: { name: 'Vertical Diffusion Zonal Acceleration', value: 208, unit: 'm s-2', abbrev: 'VDFUA' }, + 209: { name: 'Vertical Diffusion Meridional Acceleration', value: 209, unit: 'm s-2', abbrev: 'VDFVA' }, + 210: { name: 'Gravity wave drag zonal acceleration', value: 210, unit: 'm s-2', abbrev: 'GWDU' }, + 211: { name: 'Gravity wave drag meridional acceleration', value: 211, unit: 'm s-2', abbrev: 'GWDV' }, + 212: { name: 'Convective zonal momentum mixing acceleration', value: 212, unit: 'm s-2', abbrev: 'CNVU' }, + 213: { name: 'Convective meridional momentum mixing acceleration', value: 213, unit: 'm s-2', abbrev: 'CNVV' }, + 214: { name: 'Tendency of vertical velocity', value: 214, unit:'m s-2', abbrev: 'WTEND' }, + 215: { name: 'Omega (Dp/Dt) divide by density', value: 215, unit:'K', abbrev: 'OMGALF' }, + 216: { name: 'Convective Gravity wave drag zonal acceleration', value: 216, unit: 'm s-2', abbrev: 'CNGWDU' }, + 217: { name: 'Convective Gravity wave drag meridional acceleration', value: 217, unit: 'm s-2', abbrev: 'CNGWDV' }, + 218: { name: 'Velocity Point Model Surface', value: 218, abbrev:'LMV' }, + 219: { name: 'Potential Vorticity (Mass-Weighted)', value: 219, unit:'1/s/m', abbrev: 'PVMWW' }, + 220: { name: 'Hourly Maximum of Upward Vertical Velocity in the lowest 400hPa', value: 220, unit:'m s-1', abbrev: 'MAXUVV' }, + 221: { name: 'Hourly Maximum of Downward Vertical Velocity in the lowest 400hPa', value: 221, unit:'m s-1', abbrev: 'MAXDVV' }, + 222: { name: 'U Component of Hourly Maximum 10m Wind Speed', value: 222, unit:'m s-1', abbrev: 'MAXUW' }, + 223: { name: 'V Component of Hourly Maximum 10m Wind Speed', value: 223, unit:'m s-1', abbrev: 'MAXVW' }, + 224: { name: 'Ventilation Rate', value: 224, unit:'m2 s-1', abbrev: 'VRATE' }, + 225: { name: 'Transport Wind Speed', value: 225, unit:'m s-1', abbrev: 'TRWSPD' }, + 226: { name: 'Transport Wind Direction', value: 226, unit:'Deg', abbrev: 'TRWDIR' }, + 227: { name: 'Earliest Reasonable Arrival Time (10% exceedance)', value: 227, unit:'s', abbrev: 'TOA10' }, + 228: { name: 'Most Likely Arrival Time (50% exceedance)', value: 228, unit:'s', abbrev: 'TOA50' }, + 229: { name: 'Most Likely Departure Time (50% exceedance)', value: 229, unit:'s', abbrev: 'TOD50' }, + 230: { name: 'Latest Reasonable Departure Time (90% exceedance)', value: 230, unit:'s', abbrev: 'TOD90' }, + 231: { name: 'Tropical Wind Direction', value: 231, unit:'°', abbrev: 'TPWDIR' }, + 232: { name: 'Tropical Wind Speed', value: 232, unit:'m s-1', abbrev: 'TPWSPD' }, + 255: { name: 'Missing', value: 255 }, + }), + + MeteorologicalProductsCloudsCategory: Object.freeze({ + 0 : { value: 0, name: 'Cloud Ice', unit: 'kg m-2', abbrev: 'CICE' }, + 1 : { value: 1, name: 'Total Cloud Cover', unit: '%', abbrev: 'TCDC' }, + 2 : { value: 2, name: 'Convective Cloud Cover', unit: '%', abbrev: 'CDCON' }, + 3 : { value: 3, name: 'Low Cloud Cover', unit: '%', abbrev: 'LCDC' }, + 4 : { value: 4, name: 'Medium Cloud Cover', unit: '%', abbrev: 'MCDC' }, + 5 : { value: 5, name: 'High Cloud Cover', unit: '%', abbrev: 'HCDC' }, + 6 : { value: 6, name: 'Cloud Water', unit: 'kg m-2', abbrev: 'CWAT' }, + 7 : { value: 7, name: 'Cloud Amount', unit: '%' , abbrev: 'CDCA' }, + 8 : { value: 8, name: 'Cloud Type', unit: 'See Table 4.203', abbrev: 'CDCT' }, + 9 : { value: 9, name: 'Thunderstorm Maximum Tops', unit: 'm', abbrev: 'TMAXT' }, + 10 : { value: 10, name: 'Thunderstorm Coverage', unit: 'See Table 4.204', abbrev: 'THUNC' }, + 11 : { value: 11, name: 'Cloud Base', unit: 'm', abbrev: 'CDCB' }, + 12 : { value: 12, name: 'Cloud Top', unit: 'm', abbrev: 'CDCTOP' }, + 13 : { value: 13, name: 'Ceiling', unit: 'm', abbrev: 'CEIL' }, + 14 : { value: 14, name: 'Non-Convective Cloud Cover', unit: '%', abbrev: 'CDLYR' }, + 15 : { value: 15, name: 'Cloud Work Function', unit: 'J kg-1', abbrev: 'CWORK' }, + 16 : { value: 16, name: 'Convective Cloud Efficiency', unit: 'Proportion', abbrev: 'CUEFI' }, + 17 : { value: 17, name: 'Total Condensate * - Parameter deprecated', unit: 'kg kg-1 ', abbrev: 'TCONDO' }, + 18 : { value: 18, name: 'Total Column-Integrated Cloud Water * - Parameter deprecated', unit: 'kg m-2 ', abbrev: 'TCOLWO' }, + 19 : { value: 19, name: 'Total Column-Integrated Cloud Ice * - Parameter deprecated', unit: 'kg m-2 ', abbrev: 'TCOLIO' }, + 20 : { value: 20, name: 'Total Column-Integrated Condensate * - Parameter deprecated', unit: 'kg m-2 ', abbrev: 'TCOLC' }, + 21 : { value: 21, name: 'Ice fraction of total condensate', unit: 'Proportion ', abbrev: 'FICE' }, + 22 : { value: 22, name: 'Cloud Cover', unit: '%', abbrev: 'CDCC' }, + 23 : { value: 23, name: 'Cloud Ice Mixing Ratio * - Parameter deprecated', unit: 'kg kg-1', abbrev: 'CDCIMR' }, + 24 : { value: 24, name: 'Sunshine Numeric', abbrev: 'SUNS' }, + 25 : { value: 25, name: 'Horizontal Extent of Cumulonimbus (CB)', unit: '%', abbrev: 'CBHE' }, + 26 : { value: 26, name: 'Height of Convective Cloud Base', unit: 'm', abbrev: 'HCONCB' }, + 27 : { value: 27, name: 'Height of Convective Cloud Top', unit: 'm', abbrev: 'HCONCT' }, + 28 : { value: 28, name: 'Number Concentration of Cloud Droplets', unit: 'kg-1', abbrev: 'NCONCD' }, + 29 : { value: 29, name: 'Number Concentration of Cloud Ice', unit: 'kg-1', abbrev: 'NCCICE' }, + 30 : { value: 30, name: 'Number Density of Cloud Droplets', unit: 'm-3', abbrev: 'NDENCD' }, + 31 : { value: 31, name: 'Number Density of Cloud Ice', unit: 'm-3', abbrev: 'NDCICE' }, + 32 : { value: 32, name: 'Fraction of Cloud Cover', unit: 'Numeric', abbrev: 'FRACCC' }, + 33 : { value: 33, name: 'Sunshine Duration', unit: 's', abbrev: 'SUNSD' }, + 34 : { value: 34, name: 'Surface Long Wave Effective Total Cloudiness', unit: 'Numeric', abbrev: 'SLWTC' }, + 35 : { value: 35, name: 'Surface Short Wave Effective Total Cloudiness', unit: 'Numeric', abbrev: 'SSWTC' }, + 36 : { value: 36, name: 'Fraction of Stratiform Precipitation Cover', unit: 'Proportion', abbrev: 'FSTRPC' }, + 37 : { value: 37, name: 'Fraction of Convective Precipitation Cover', unit: 'Proportion', abbrev: 'FCONPC' }, + 38 : { value: 38, name: 'Mass Density of Cloud Droplets', unit: 'kg m-3', abbrev: 'MASSDCD' }, + 39 : { value: 39, name: 'Mass Density of Cloud Ice', unit: 'kg m-3', abbrev: 'MASSDCI' }, + 40 : { value: 40, name: 'Mass Density of Convective Cloud Water Droplets', unit: 'kg m-3', abbrev: 'MDCCWD' }, + 47 : { value: 47, name: 'Volume Fraction of Cloud Water Droplets', unit: 'Numeric', abbrev: 'VFRCWD' }, + 48 : { value: 48, name: 'Volume Fraction of Cloud Ice Particles', unit: 'Numeric', abbrev: 'VFRCICE' }, + 49 : { value: 49, name: 'Volume Fraction of Cloud (Ice and/or Water)', unit: 'Numeric', abbrev: 'VFRCIW' }, + 192: { value: 192, name: 'Non-Convective Cloud Cover', unit: '%', abbrev: 'CDLYR' }, + 193: { value: 193, name: 'Cloud Work Function', unit: 'J kg-1', abbrev: 'CWORK' }, + 194: { value: 194, name: 'Convective Cloud Efficiency', unit: 'non-dim', abbrev: 'CUEFI' }, + 195: { value: 195, name: 'Total Condensate', unit: 'kg kg-1', abbrev: 'TCOND' }, + 196: { value: 196, name: 'Total Column-Integrated Cloud Water', unit: 'kg m-2', abbrev: 'TCOLW' }, + 197: { value: 197, name: 'Total Column-Integrated Cloud Ice', unit: 'kg m-2', abbrev: 'TCOLI' }, + 198: { value: 198, name: 'Total Column-Integrated Condensate', unit: 'kg m-2', abbrev: 'TCOLC' }, + 199: { value: 199, name: 'Ice fraction of total condensate', unit: 'non-dim', abbrev: 'FICE' }, + 200: { value: 200, name: 'Convective Cloud Mass Flux', unit:'Pa s-1', abbrev: 'MFLUX' }, + 201: { value: 201, name: 'Sunshine Duration', unit: 's', abbrev: 'SUNSD' }, + 255: { value: 255, name: 'Missing' } + }), + + // Code Table 4.3 Type of generating process + GeneratingProcessType: Object.freeze({ + 0 : { name: 'Analysis', value: 0 }, + 1 : { name: 'Initialization', value: 1 }, + 2 : { name: 'Forecast', value: 2 }, + 3 : { name: 'Bias Corrected Forecast', value: 3 }, + 4 : { name: 'Ensemble Forecast', value: 4 }, + 5 : { name: 'Probability Forecast', value: 5 }, + 6 : { name: 'Forecast Error', value: 6 }, + 7 : { name: 'Analysis Error', value: 7 }, + 8 : { name: 'Observation', value: 8 }, + 9 : { name: 'Climatological', value: 9 }, + 10 : { name: 'Probability-Weighted Forecast', value: 10 }, + 11 : { name: 'Bias-Corrected Ensemble Forecast', value: 11 }, + 12 : { name: 'Post-processed Analysis ', value: 12 }, + 13 : { name: 'Post-processed Forecast', value: 13 }, + 14 : { name: 'Nowcast', value: 14 }, + 15 : { name: 'Hindcast', value: 15 }, + 16 : { name: 'Physical Retrieval', value: 16 }, + 17 : { name: 'Regression Analysis', value: 17 }, + 18 : { name: 'Difference Between Two Forecasts', value: 18 }, + 192: { name: 'Forecast Confidence Indicator', value: 192 }, + 193: { name: 'Probability-matched Mean', value: 193 }, + 194: { name: 'Neighborhood Probability', value: 194 }, + 195: { name: 'Bias-Corrected and Downscaled Ensemble Forecast', value: 195 }, + 196: { name: 'Perturbed Analysis for Ensemble Initialization', value: 196 }, + 197: { name: 'Ensemble Agreement Scale Probability', value: 197 }, + 198: { name: 'Post-Processed Deterministic-Expert-Weighted Forecast', value: 198 }, + 199: { name: 'Ensemble Forecast Based on Counting', value: 199 }, + 200: { name: 'Local Probability-matched Mean', value: 200 }, + 255: { name: 'Missing', value: 255 }, + }), + + // ON388 Table A (Generating Process or Model from Originating Center 7 (US-NWS, NCEP) + GeneratingProcessOrModelFromCenter7: Object.freeze({ + 2 : { name: 'Ultra Violet Index Model', value: 2 }, + 3 : { name: 'NCEP/ARL Transport and Dispersion Model', value: 3 }, + 4 : { name: 'NCEP/ARL Smoke Model', value: 4 }, + 5 : { name: 'Satellite Derived Precipitation and temperatures, from IR ', value: 5 }, + 6 : { name: 'NCEP/ARL Dust Model', value: 6 }, + 10 : { name: 'Global Wind-Wave Forecast Model', value: 10 }, + 11 : { name: 'Global Multi-Grid Wave Model (Static Grids)', value: 11 }, + 12 : { name: 'Probabilistic Storm Surge (P-Surge)', value: 12 }, + 13 : { name: 'Hurricane Multi-Grid Wave Model', value: 13 }, + 14 : { name: 'Extra-tropical Storm Surge Atlantic Domain', value: 14 }, + 15 : { name: 'Nearshore Wave Prediction System (NWPS)', value: 15 }, + 16 : { name: 'Extra-Tropical Storm Surge (ETSS)', value: 16 }, + 17 : { name: 'Extra-tropical Storm Surge Pacific Domain', value: 17 }, + 18 : { name: 'Probabilistic Extra-Tropical Storm Surge (P-ETSS)', value: 18 }, + 19 : { name: 'Limited-area Fine Mesh (LFM) analysis', value: 19 }, + 20 : { name: 'Extra-tropical Storm Surge Micronesia Domain', value: 20 }, + 25 : { name: 'Snow Cover Analysis', value: 25 }, + 30 : { name: 'Forecaster generated field', value: 30 }, + 31 : { name: 'Value added post processed field', value: 31 }, + 42 : { name: 'Global Optimum Interpolation Analysis (GOI) from GFS model', value: 42 }, + 43 : { name: 'Global Optimum Interpolation Analysis (GOI) from "Final" run ', value: 43 }, + 44 : { name: 'Sea Surface Temperature Analysis', value: 44 }, + 45 : { name: 'Coastal Ocean Circulation Model', value: 45 }, + 46 : { name: 'HYCOM - Global', value: 46 }, + 47 : { name: 'HYCOM - North Pacific basin', value: 47 }, + 48 : { name: 'HYCOM - North Atlantic basin', value: 48 }, + 49 : { name: 'Ozone Analysis from TIROS Observations ', value: 49 }, + 52 : { name: 'Ozone Analysis from Nimbus 7 Observations ', value: 52 }, + 53 : { name: 'LFM-Fourth Order Forecast Model', value: 53 }, + 64 : { name: 'Regional Optimum Interpolation Analysis (ROI)', value: 64 }, + 68 : { name: '80 wave triangular, 18-layer Spectral model from GFS model', value: 68 }, + 69 : { name: '80 wave triangular, 18 layer Spectral model from "Medium Range Forecast" run', value: 69 }, + 70 : { name: 'Quasi-Lagrangian Hurricane Model (QLM)', value: 70 }, + 71 : { name: 'Hurricane Weather Research and Forecasting (HWRF) Model', value: 71 }, + 72 : { name: 'Hurricane Non-Hydrostatic Multiscale Model on the B Grid (HNMMB)', value: 72 }, + 73 : { name: 'Fog Forecast model - Ocean Prod. Center', value: 73 }, + 74 : { name: 'Gulf of Mexico Wind/Wave', value: 74 }, + 75 : { name: 'Gulf of Alaska Wind/Wave', value: 75 }, + 76 : { name: 'Bias corrected Medium Range Forecast', value: 76 }, + 77 : { name: '126 wave triangular, 28 layer Spectral model from GFS model', value: 77 }, + 78 : { name: '126 wave triangular, 28 layer Spectral model from "Medium Range Forecast" run', value: 78 }, + 79 : { name: 'Backup from the previous run', value: 79 }, + 80 : { name: '62 wave triangular, 28 layer Spectral model from "Medium Range Forecast" run', value: 80 }, + 81 : { name: 'Analysis from GFS (Global Forecast System)', value: 81 }, + 82 : { name: 'Analysis from GDAS (Global Data Assimilation System)', value: 82 }, + 83 : { name: 'High Resolution Rapid Refresh (HRRR)', value: 83 }, + 84 : { name: 'MESO NAM Model (currently 12 km)', value: 84 }, + 85 : { name: 'Real Time Ocean Forecast System (RTOFS)', value: 85 }, + 86 : { name: 'Early Hurricane Wind Speed Probability Model', value: 86 }, + 87 : { name: 'CAC Ensemble Forecasts from Spectral (ENSMB)', value: 87 }, + 88 : { name: 'NOAA Wave Watch III (NWW3) Ocean Wave Model', value: 88 }, + 89 : { name: 'Non-hydrostatic Meso Model (NMM) (Currently 8 km)', value: 89 }, + 90 : { name: '62 wave triangular, 28 layer spectral model extension of the "Medium Range Forecast" run', value: 90 }, + 91 : { name: '62 wave triangular, 28 layer spectral model extension of the GFS model', value: 91 }, + 92 : { name: '62 wave triangular, 28 layer spectral model run from the "Medium Range Forecast" final analysis', value: 92 }, + 93 : { name: '62 wave triangular, 28 layer spectral model run from the T62 GDAS analysis of the "Medium Range Forecast" run', value: 93 }, + 94 : { name: 'T170/L42 Global Spectral Model from MRF run', value: 94 }, + 95 : { name: 'T126/L42 Global Spectral Model from MRF run', value: 95 }, + 96 : { name: 'Global Forecast System Model T1534 - Forecast hours 00-384 T574 - Forecast hours 00-192 T190 - Forecast hours 204-384', value: 96 }, + 98 : { name: 'Climate Forecast System Model -- Atmospheric model (GFS) coupled to a multi level ocean model . Currently GFS spectral model at T62, 64 levels coupled to 40 level MOM3 ocean model.', value: 98 }, + 99 : { name: 'Miscellaneous Test ID', value: 99 }, + 100: { name: 'Miscellaneous Test ID', value: 100 }, + 101: { name: 'Conventional Observation Re-Analysis (CORE)', value: 101 }, + 104: { name: 'National Blend GRIB', value: 104 }, + 105: { name: 'Rapid Refresh (RAP)', value: 105 }, + 107: { name: 'Global Ensemble Forecast System (GEFS)', value: 107 }, + 108: { name: 'LAMP', value: 108 }, + 109: { name: 'RTMA (Real Time Mesoscale Analysis)', value: 109 }, + 110: { name: 'NAM Model - 15km version', value: 110 }, + 111: { name: 'NAM model, generic resolution (Used in SREF processing)', value: 111 }, + 112: { name: 'WRF-NMM model, generic resolution (Used in various runs) NMM=Nondydrostatic Mesoscale Model (NCEP)', value: 112 }, + 113: { name: 'Products from NCEP SREF processing', value: 113 }, + 114: { name: 'NAEFS Products from joined NCEP, CMC global ensembles', value: 114 }, + 115: { name: 'Downscaled GFS from NAM eXtension', value: 115 }, + 116: { name: 'WRF-EM model, generic resolution (Used in various runs) EM - Eulerian Mass-core (NCAR - aka Advanced Research WRF)', value: 116 }, + 117: { name: 'NEMS GFS Aerosol Component', value: 117 }, + 118: { name: 'URMA (UnRestricted Mesoscale Analysis)', value: 118 }, + 119: { name: 'WAM (Whole Atmosphere Model)', value: 119 }, + 120: { name: 'Ice Concentration Analysis', value: 120 }, + 121: { name: 'Western North Atlantic Regional Wave Model', value: 121 }, + 122: { name: 'Alaska Waters Regional Wave Model', value: 122 }, + 123: { name: 'North Atlantic Hurricane Wave Model', value: 123 }, + 124: { name: 'Eastern North Pacific Regional Wave Model', value: 124 }, + 125: { name: 'North Pacific Hurricane Wave Model', value: 125 }, + 126: { name: 'Sea Ice Forecast Model', value: 126 }, + 127: { name: 'Lake Ice Forecast Model', value: 127 }, + 128: { name: 'Global Ocean Forecast Model', value: 128 }, + 129: { name: 'Global Ocean Data Analysis System (GODAS)', value: 129 }, + 130: { name: 'Merge of fields from the RUC, NAM, and Spectral Model ', value: 130 }, + 131: { name: 'Great Lakes Wave Model', value: 131 }, + 132: { name: 'High Resolution Ensemble Forecast (HREF)', value: 132 }, + 133: { name: 'Great Lakes Short Range Wave Model', value: 133 }, + 140: { name: 'North American Regional Reanalysis (NARR)', value: 140 }, + 141: { name: 'Land Data Assimilation and Forecast System', value: 141 }, + 150: { name: 'NWS River Forecast System (NWSRFS)', value: 150 }, + 151: { name: 'NWS Flash Flood Guidance System (NWSFFGS)', value: 151 }, + 152: { name: 'WSR-88D Stage II Precipitation Analysis', value: 152 }, + 153: { name: 'WSR-88D Stage III Precipitation Analysis', value: 153 }, + 180: { name: 'Quantitative Precipitation Forecast generated by NCEP', value: 180 }, + 181: { name: 'River Forecast Center Quantitative Precipitation Forecast mosaic generated by NCEP', value: 181 }, + 182: { name: 'River Forecast Center Quantitative Precipitation estimate mosaic generated by NCEP', value: 182 }, + 183: { name: 'NDFD product generated by NCEP/HPC', value: 183 }, + 184: { name: 'Climatological Calibrated Precipitation Analysis - CCPA', value: 184 }, + 190: { name: 'National Convective Weather Diagnostic generated by NCEP/AWC', value: 190 }, + 191: { name: 'Current Icing Potential automated product genterated by NCEP/AWC', value: 191 }, + 192: { name: 'Analysis product from NCEP/AWC', value: 192 }, + 193: { name: 'Forecast product from NCEP/AWC', value: 193 }, + 195: { name: 'Climate Data Assimilation System 2 (CDAS2)', value: 195 }, + 196: { name: 'Climate Data Assimilation System 2 (CDAS2) - used for regeneration runs', value: 196 }, + 197: { name: 'Climate Data Assimilation System (CDAS)', value: 197 }, + 198: { name: 'Climate Data Assimilation System (CDAS) - used for regeneration runs', value: 198 }, + 199: { name: 'Climate Forecast System Reanalysis (CFSR) -- Atmospheric model (GFS) coupled to a multi level ocean, land and seaice model. Currently GFS spectral model at T382, 64 levels coupled to 40 level MOM4 ocean model.', value: 199 }, + 200: { name: 'CPC Manual Forecast Product', value: 200 }, + 201: { name: 'CPC Automated Product', value: 201 }, + 210: { name: 'EPA Air Quality Forecast - Currently North East US domain', value: 210 }, + 211: { name: 'EPA Air Quality Forecast - Currently Eastern US domain', value: 211 }, + 215: { name: 'SPC Manual Forecast Product', value: 215 }, + 220: { name: 'NCEP/OPC automated product', value: 220 }, + 255: { name: 'Missing', value: 255 }, + }), + + // Code Table 4.4 Indicator of unit of time range + TimeRange: Object.freeze({ + 0 : { name: 'Minute', value: 0 }, + 1 : { name: 'Hour', value: 1 }, + 2 : { name: 'Day', value: 2 }, + 3 : { name: 'Month', value: 3 }, + 4 : { name: 'Year', value: 4 }, + 5 : { name: 'Decade (10 Years)', value: 5 }, + 6 : { name: 'Normal (30 Years)', value: 6 }, + 7 : { name: 'Century (100 Years)', value: 7 }, + 10 : { name: '3 Hours', value: 10 }, + 11 : { name: '6 Hours', value: 11 }, + 12 : { name: '12 Hours', value: 12 }, + 13 : { name: 'Second', value: 13 }, + 255: { name: 'Missing', value: 255 }, + }), + + // Code Table 4.5 Fixed surface types and units + SurfaceType: Object.freeze({ + 1 : { value: 1, name: 'Ground or Water Surface' }, + 2 : { value: 2, name: 'Cloud Base Level' }, + 3 : { value: 3, name: 'Level of Cloud Tops' }, + 4 : { value: 4, name: 'Level of 0o C Isotherm' }, + 5 : { value: 5, name: 'Level of Adiabatic Condensation Lifted from the Surface' }, + 6 : { value: 6, name: 'Maximum Wind Level' }, + 7 : { value: 7, name: 'Tropopause' }, + 8 : { value: 8, name: 'Nominal Top of the Atmosphere' }, + 9 : { value: 9, name: 'Sea Bottom' }, + 10 : { value: 10, name: 'Entire Atmosphere' }, + 11 : { value: 11, name: 'Cumulonimbus Base (CB)', unit: 'm' }, + 12 : { value: 12, name: 'Cumulonimbus Top (CT)', unit: 'm' }, + 13 : { value: 13, name: 'Lowest level where vertically integrated cloud cover exceeds the specified percentage (cloud: base for a given percentage cloud cover)' }, + 14 : { value: 14, name: 'Level of free convection (LFC)' }, + 15 : { value: 15, name: 'Convection condensation level (CCL)' }, + 16 : { value: 16, name: 'Level of neutral buoyancy or equilibrium (LNB)' }, + 20 : { value: 20, name: 'Isothermal Level', unit: 'K' }, + 21 : { value: 21, name: 'Lowest level where mass density exceeds the specified value (base for a given threshold of mass density)', unit: 'kg m-3' }, + 22 : { value: 22, name: 'Highest level where mass density exceeds the specified value (top for a given threshold of mass density)', unit: 'kg m-3' }, + 23 : { value: 23, name: 'Lowest level where air concentration exceeds the specified value (base for a given threshold of air concentration)', unit: 'Bq m-3' }, + 24 : { value: 24, name: 'Highest level where air concentration exceeds the specified value (top for a given threshold of air concentration)', unit: 'Bq m-3' }, + 25 : { value: 25, name: 'Highest level where radar reflectivity exceeds the specified value (echo top for a given threshold of reflectivity)', unit: 'dBZ' }, + 100: { value: 100, name: 'Isobaric Surface', unit: 'Pa' }, + 101: { value: 101, name: 'Mean Sea Level' }, + 102: { value: 102, name: 'Specific Altitude Above Mean Sea Level', unit: 'm' }, + 103: { value: 103, name: 'Specified Height Level Above Ground', unit: 'm' }, + 104: { value: 104, name: 'Sigma Level' }, + 105: { value: 105, name: 'Hybrid Level' }, + 106: { value: 106, name: 'Depth Below Land Surface', unit: 'm' }, + 107: { value: 107, name: 'Isentropic (theta) Level', unit: 'K' }, + 108: { value: 108, name: 'Level at Specified Pressure Difference from Ground to Level', unit: 'Pa' }, + 109: { value: 109, name: 'Potential Vorticity Surface', unit: 'K m2 kg-1 s-1' }, + 111: { value: 111, name: 'Eta Level' }, + 113: { value: 113, name: 'Logarithmic Hybrid Level' }, + 114: { value: 114, name: 'Snow Level', unit: 'Numeric' }, + 115: { value: 115, name: 'Sigma height level' }, + 117: { value: 117, name: 'Mixed Layer Depth', unit: 'm' }, + 118: { value: 118, name: 'Hybrid Height Level' }, + 119: { value: 119, name: 'Hybrid Pressure Level' }, + 150: { value: 150, name: 'Generalized Vertical Height Coordinate' }, + 151: { value: 151, name: 'Soil level (See Note 5)', unit: 'Numeric' }, + 160: { value: 160, name: 'Depth Below Sea Level', unit: 'm' }, + 161: { value: 161, name: 'Depth Below Water Surface', unit: 'm' }, + 162: { value: 162, name: 'Lake or River Bottom' }, + 163: { value: 163, name: 'Bottom Of Sediment Layer' }, + 164: { value: 164, name: 'Bottom Of Thermally Active Sediment Layer' }, + 165: { value: 165, name: 'Bottom Of Sediment Layer Penetrated By Thermal Wave' }, + 166: { value: 166, name: 'Mixing Layer' }, + 167: { value: 167, name: 'Bottom of Root Zone' }, + 168: { value: 168, name: 'Ocean Model Level', unit: 'Numeric' }, + 169: { value: 169, name: 'Ocean level defined by water density (sigma-theta) difference from near-surface to level (see Note 7)', unit: 'kg m-3' }, + 170: { value: 170, name: 'Ocean level defined by water potential temperature difference from near-surface to level (see Note 7)', unit: 'K' }, + 174: { value: 174, name: 'Top Surface of Ice on Sea, Lake or River' }, + 175: { value: 175, name: 'Top Surface of Ice, under Snow, on Sea, Lake or River' }, + 176: { value: 176, name: 'Bottom Surface (underside) Ice on Sea, Lake or River' }, + 177: { value: 177, name: 'Deep Soil (of indefinite depth)' }, + 179: { value: 179, name: 'Top Surface of Glacier Ice and Inland Ice' }, + 180: { value: 180, name: 'Deep Inland or Glacier Ice (of indefinite depth)' }, + 181: { value: 181, name: 'Grid Tile Land Fraction as a Model Surface' }, + 182: { value: 182, name: 'Grid Tile Water Fraction as a Model Surface' }, + 183: { value: 183, name: 'Grid Tile Ice Fraction on Sea, Lake or River as a Model Surface' }, + 184: { value: 184, name: 'Grid Tile Glacier Ice and Inland Ice Fraction as a Model Surface' }, + 200: { value: 200, name: 'Entire atmosphere (considered as a single layer)' }, + 201: { value: 201, name: 'Entire ocean (considered as a single layer)' }, + 204: { value: 204, name: 'Highest tropospheric freezing level' }, + 206: { value: 206, name: 'Grid scale cloud bottom level' }, + 207: { value: 207, name: 'Grid scale cloud top level' }, + 209: { value: 209, name: 'Boundary layer cloud bottom level' }, + 210: { value: 210, name: 'Boundary layer cloud top level' }, + 211: { value: 211, name: 'Boundary layer cloud layer' }, + 212: { value: 212, name: 'Low cloud bottom level' }, + 213: { value: 213, name: 'Low cloud top level' }, + 214: { value: 214, name: 'Low cloud layer' }, + 215: { value: 215, name: 'Cloud ceiling' }, + 220: { value: 220, name: 'Planetary Boundary Layer' }, + 221: { value: 221, name: 'Layer Between Two Hybrid Levels' }, + 222: { value: 222, name: 'Middle cloud bottom level' }, + 223: { value: 223, name: 'Middle cloud top level' }, + 224: { value: 224, name: 'Middle cloud layer' }, + 232: { value: 232, name: 'High cloud bottom level' }, + 233: { value: 233, name: 'High cloud top level' }, + 234: { value: 234, name: 'High cloud layer' }, + 235: { value: 235, name: 'Ocean Isotherm Level (1/10 ° C)' }, + 236: { value: 236, name: 'Layer between two depths below ocean surface' }, + 237: { value: 237, name: 'Bottom of Ocean Mixed Layer (m)' }, + 238: { value: 238, name: 'Bottom of Ocean Isothermal Layer (m)' }, + 239: { value: 239, name: 'Layer Ocean Surface and 26C Ocean Isothermal Level' }, + 240: { value: 240, name: 'Ocean Mixed Layer' }, + 241: { value: 241, name: 'Ordered Sequence of Data' }, + 242: { value: 242, name: 'Convective cloud bottom level' }, + 243: { value: 243, name: 'Convective cloud top level' }, + 244: { value: 244, name: 'Convective cloud layer' }, + 245: { value: 245, name: 'Lowest level of the wet bulb zero' }, + 246: { value: 246, name: 'Maximum equivalent potential temperature level' }, + 247: { value: 247, name: 'Equilibrium level' }, + 248: { value: 248, name: 'Shallow convective cloud bottom level' }, + 249: { value: 249, name: 'Shallow convective cloud top level' }, + 251: { value: 251, name: 'Deep convective cloud bottom level' }, + 252: { value: 252, name: 'Deep convective cloud top level' }, + 253: { value: 253, name: 'Lowest bottom level of supercooled liquid water layer' }, + 254: { value: 254, name: 'Highest top level of supercooled liquid water layer' }, + 255: { value: 255, name: 'Missing' }, }), // Code Table 5.0 DataRepresentationTemplateNumber: Object.freeze({ - GRID_SIMPLE: { name: 'Grid point data - simple packing', value: 0 }, - MATRIX_SIMPLE: { name: 'Matrix value - simple packing', value: 1 }, - GRID_COMPLEX: { name: ' Grid point data - complex packing', value: 2 }, - GRID_COMPLEX_SPATIAL_DIFF: { name: 'Grid point data - complex packing and spatial differencing', value: 3 }, - SPECTRAL_SIMPLE: { name: 'Spectral data - simple packing', value: 50 }, - SPHERICAL_COMPLEX: { name: 'Spherical harmonics data - complex packing', value: 51 }, - MISSING: { name: 'Missing', value: 255 }, + 0 : { name: 'Grid point data - simple packing', value: 0 }, + 1 : { name: 'Matrix value - simple packing', value: 1 }, + 2 : { name: ' Grid point data - complex packing', value: 2 }, + 3 : { name: 'Grid point data - complex packing and spatial differencing', value: 3 }, + 50 : { name: 'Spectral data - simple packing', value: 50 }, + 51 : { name: 'Spherical harmonics data - complex packing', value: 51 }, + 255: { name: 'Missing', value: 255 }, + }), + + // Code Table 5.1 Data Representation + DataRepresentationFiedValueType: Object.freeze({ + 0 : { name: 'Floating Point', value: 0 }, + 1 : { name: 'Integer', value: 1 }, + 255: { name: 'Missing', value: 255 }, }), + // Code Table 5.4 Group Splitting Method + DataRepresentationGroupSplitting: Object.freeze({ + 0 : { name: 'Row by Row Splitting', value: 0 }, + 1 : { name: 'General Group Splitting', value: 1 }, + 255: { name: 'Missing', value: 255 }, + }), + + // Code Table 5.5 Missing Value Management + DataRepresentationMissingValueManagement: Object.freeze({ + 0 : { name: 'No explicit missing values included within the data values', value: 0 }, + 1 : { name: 'Primary missing values included within the data values', value: 1 }, + 2 : { name: 'Primary and secondary missing values included within the data values', value: 2 }, + 255: { name: 'Missing', value: 255 }, + }), + + // Code Table 5.6 Order of spatial differencing + DataRepresentationOrder: Object.freeze({ + 1 : { name: 'First-Order Spatial Differencing', value: 1 }, + 2 : { name: 'Second-Order Spatial Differencing', value: 2 }, + 255: { name: 'Missing', value: 255 }, + }), + + // Code Table 6.0 BitMapIndicator: Object.freeze({ - SPECIFIED: { name: 'Use specified bit-map', value: 0 }, - PREVIOUS: { name: 'Use bit-map defined previously', value: 254 }, - MISSING: { name: 'Missing', value: 255 }, + 0 : { name: 'Use specified bit-map', value: 0 }, + 254: { name: 'Use bit-map defined previously', value: 254 }, + 255: { name: 'Missing', value: 255 }, }), } diff --git a/load-data.js b/load-data.js new file mode 100644 index 0000000..dfe837c --- /dev/null +++ b/load-data.js @@ -0,0 +1,8 @@ +const fs = require('fs'); +function get(url, cb) { + fetch(url) + .then(res => res.arrayBuffer()) + .then(buff => cb(null, buff)) + .catch(err => cb(err)); +} +module.exports = (fs && fs.readFile) || get; \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..f8a7eca --- /dev/null +++ b/package-lock.json @@ -0,0 +1,4127 @@ +{ + "name": "grib", + "version": "0.0.1", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "grib", + "version": "0.0.1", + "license": "MIT", + "devDependencies": { + "commander": "^2.11.0", + "karma": "^6.4.2", + "karma-browserify": "^8.1.0", + "karma-chrome-launcher": "^3.2.0", + "karma-firefox-launcher": "^2.1.2", + "karma-mocha": "^2.0.1", + "mocha": "^10.2.0" + } + }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "dev": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@socket.io/component-emitter": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", + "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==", + "dev": true + }, + "node_modules/@types/cors": { + "version": "2.8.18", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.18.tgz", + "integrity": "sha512-nX3d0sxJW41CqQvfOzVG1NCTXfFDrDWIghCZncpHeWlVFd81zxB/DLhg7avFg6eHLCRX7ckBmoIIcqa++upvJA==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/node": { + "version": "22.15.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.24.tgz", + "integrity": "sha512-w9CZGm9RDjzTh/D+hFwlBJ3ziUaVw7oufKA3vOFSOZlzmW9AkZnfjPb+DLnrV6qtgL/LNmP0/2zBNCFHL3F0ng==", + "dev": true, + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "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, + "peer": 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, + "peer": 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, + "peer": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "dev": true, + "peer": true, + "dependencies": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/asn1.js/node_modules/bn.js": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", + "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==", + "dev": true, + "peer": true + }, + "node_modules/assert": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.1.tgz", + "integrity": "sha512-zzw1uCAgLbsKwBfFc8CX78DDg+xZeBksSO3vwVIDDN5i94eOrPsSSyiVhmsSABFDM/OcpE2aagCat9dnWQLG1A==", + "dev": true, + "peer": true, + "dependencies": { + "object.assign": "^4.1.4", + "util": "^0.10.4" + } + }, + "node_modules/assert/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, + "peer": true + }, + "node_modules/assert/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, + "peer": true, + "dependencies": { + "inherits": "2.0.3" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "peer": true, + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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" + } + ], + "peer": true + }, + "node_modules/base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", + "dev": true, + "engines": { + "node": "^4.5.0 || >= 5.9" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bn.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.2.tgz", + "integrity": "sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==", + "dev": true, + "peer": true + }, + "node_modules/body-parser": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.13.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "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/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "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, + "peer": 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, + "peer": 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, + "peer": true, + "dependencies": { + "resolve": "^1.17.0" + } + }, + "node_modules/browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "node_modules/browserify": { + "version": "17.0.1", + "resolved": "https://registry.npmjs.org/browserify/-/browserify-17.0.1.tgz", + "integrity": "sha512-pxhT00W3ylMhCHwG5yfqtZjNnFuX5h2IJdaBfSo4ChaaBsIp9VLrEMQ1bHV+Xr1uLPXuNDDM1GlJkjli0qkRsw==", + "dev": true, + "peer": 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.1", + "domain-browser": "^1.2.0", + "duplexer2": "~0.1.2", + "events": "^3.0.0", + "glob": "^7.1.0", + "hasown": "^2.0.0", + "htmlescape": "^1.1.0", + "https-browserify": "^1.0.0", + "inherits": "~2.0.1", + "insert-module-globals": "^7.2.1", + "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": "^1.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-object": "^1.0.0", + "shell-quote": "^1.6.1", + "stream-browserify": "^3.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.12.0", + "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, + "peer": 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, + "peer": 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, + "peer": 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.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.1.tgz", + "integrity": "sha512-YBjSAiTqM04ZVei6sXighu679a3SqWORA3qZTEqZImnlkDIFtKc6pNutpjyZ8RJTjQtuYfeetkxM11GwoYXMIQ==", + "dev": true, + "peer": true, + "dependencies": { + "bn.js": "^5.2.1", + "randombytes": "^2.1.0", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/browserify-sign": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.3.tgz", + "integrity": "sha512-JWCZW6SKhfhjJxO8Tyiiy+XYB7cqd2S5/+WeYHsKdNKFlCBhKbblba1A/HN/90YwtxKc8tCErjffZl++UNmGiw==", + "dev": true, + "peer": true, + "dependencies": { + "bn.js": "^5.2.1", + "browserify-rsa": "^4.1.0", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.5", + "hash-base": "~3.0", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.7", + "readable-stream": "^2.3.8", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 0.12" + } + }, + "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, + "peer": 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, + "peer": 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, + "peer": 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, + "peer": 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, + "peer": true + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "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, + "peer": true + }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/cipher-base": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.6.tgz", + "integrity": "sha512-3Ek9H3X6pj5TgenXYtNWdaBon1tgYCaebd+XPg0keyjEbEfkD4KkmAxkQ/i1vYvxdcT5nscLBfq9VJRmCBcFSw==", + "dev": true, + "peer": true, + "dependencies": { + "inherits": "^2.0.4", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "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, + "peer": 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/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/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" + ], + "peer": true, + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/connect": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "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, + "peer": 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, + "peer": true + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "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, + "peer": true + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "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, + "peer": true + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dev": true, + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "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, + "peer": true, + "dependencies": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + } + }, + "node_modules/create-ecdh/node_modules/bn.js": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", + "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==", + "dev": true, + "peer": 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, + "peer": 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, + "peer": 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.1", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.1.tgz", + "integrity": "sha512-r4ESw/IlusD17lgQi1O20Fa3qNnsckR126TdUuBgAu7GBYSIPvdNyONd3Zrxh0xCwA4+6w/TDArBPsMvhur+KQ==", + "dev": true, + "peer": true, + "dependencies": { + "browserify-cipher": "^1.0.1", + "browserify-sign": "^4.2.3", + "create-ecdh": "^4.0.4", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "diffie-hellman": "^5.0.3", + "hash-base": "~3.0.4", + "inherits": "^2.0.4", + "pbkdf2": "^3.1.2", + "public-encrypt": "^4.0.3", + "randombytes": "^2.1.0", + "randomfill": "^1.0.4" + }, + "engines": { + "node": ">= 0.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/custom-event": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", + "integrity": "sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg==", + "dev": true + }, + "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, + "peer": true + }, + "node_modules/date-format": { + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.14.tgz", + "integrity": "sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "peer": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "peer": true, + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/defined": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.1.tgz", + "integrity": "sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==", + "dev": true, + "peer": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "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, + "peer": 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.1.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz", + "integrity": "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==", + "dev": true, + "peer": true, + "dependencies": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detective": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.1.tgz", + "integrity": "sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==", + "dev": true, + "peer": 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/di": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", + "integrity": "sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA==", + "dev": true + }, + "node_modules/diff": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", + "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "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, + "peer": 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.2", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", + "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==", + "dev": true, + "peer": true + }, + "node_modules/dom-serialize": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", + "integrity": "sha512-Yra4DbvoW7/Z6LBN560ZwXMjoNOSAN2wRsKFGc4iBeso+mpIA6qj1vfdf9HpMaKAqG6wXTy+1SYEzmNpKXOSsQ==", + "dev": true, + "dependencies": { + "custom-event": "~1.0.0", + "ent": "~2.2.0", + "extend": "^3.0.0", + "void-elements": "^2.0.0" + } + }, + "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, + "peer": true, + "engines": { + "node": ">=0.4", + "npm": ">=1.2" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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, + "peer": true, + "dependencies": { + "readable-stream": "^2.0.2" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true + }, + "node_modules/elliptic": { + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.1.tgz", + "integrity": "sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==", + "dev": true, + "peer": 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.2", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", + "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==", + "dev": true, + "peer": true + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/engine.io": { + "version": "6.6.4", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.6.4.tgz", + "integrity": "sha512-ZCkIjSYNDyGn0R6ewHDtXgns/Zre/NT6Agvq1/WobF7JXgFff4SeDroKiCO3fNJreU9YG429Sc81o4w5ok/W5g==", + "dev": true, + "dependencies": { + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.7.2", + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~5.2.1", + "ws": "~8.17.1" + }, + "engines": { + "node": ">=10.2.0" + } + }, + "node_modules/engine.io-parser": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz", + "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/engine.io/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/engine.io/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/ent": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.2.tgz", + "integrity": "sha512-kKvD1tO6BM+oK9HzCPpUdRb4vKFQY/FPTFmurMvh6LlN68VMrdj77w8yp51/kDbpkFOS9J8w5W6zIzgM2H8/hw==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "punycode": "^1.4.1", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.8.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, + "peer": true, + "dependencies": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "node_modules/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, + "peer": true + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "bin": { + "flat": "cli.js" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true + }, + "node_modules/follow-redirects": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dev": true, + "peer": true, + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "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/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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, + "peer": true + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "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/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "peer": true, + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hash-base": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.5.tgz", + "integrity": "sha512-vXm0l45VbcHEVlTCzs8M+s0VeYsB2lnlAaThoLKGXr3bE/VWDOelNUnycUPEhKEaXARL2TEFjBOyUiM6+55KBg==", + "dev": true, + "peer": true, + "dependencies": { + "inherits": "^2.0.4", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "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, + "peer": true, + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hat": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/hat/-/hat-0.0.3.tgz", + "integrity": "sha512-zpImx2GoKXy42fVDSEad2BPKuSQdLcqsCYa48K3zHSzM/ugWuYjLDr8IXxpVuL7uCLHw56eaiLxCRthhOzf5ug==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" + } + }, + "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, + "peer": 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, + "peer": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-errors/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "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, + "peer": true + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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" + } + ], + "peer": true + }, + "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==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "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.3", + "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.3.tgz", + "integrity": "sha512-1aVsPEsJWMJq/pdMU61CDlm1URcW702MTB4w9/zUjMus6H/Py8o7g68Pr9D4I6QluWGt/KdmswuRhaA05xVR1w==", + "dev": true, + "peer": 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, + "peer": 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-arguments": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz", + "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==", + "dev": true, + "peer": true, + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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, + "peer": true + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "peer": true, + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", + "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", + "dev": true, + "peer": true, + "dependencies": { + "call-bound": "^1.0.3", + "get-proto": "^1.0.0", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dev": true, + "peer": true, + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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, + "peer": true + }, + "node_modules/isbinaryfile": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", + "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", + "dev": true, + "engines": { + "node": ">= 8.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/gjtorikian/" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/js-string-escape": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/js-string-escape/-/js-string-escape-1.0.1.tgz", + "integrity": "sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "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" + ], + "peer": true + }, + "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, + "peer": true, + "dependencies": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + }, + "bin": { + "JSONStream": "bin.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/karma": { + "version": "6.4.4", + "resolved": "https://registry.npmjs.org/karma/-/karma-6.4.4.tgz", + "integrity": "sha512-LrtUxbdvt1gOpo3gxG+VAJlJAEMhbWlM4YrFQgql98FwF7+K8K12LYO4hnDdUkNjeztYrOXEMqgTajSWgmtI/w==", + "dev": true, + "dependencies": { + "@colors/colors": "1.5.0", + "body-parser": "^1.19.0", + "braces": "^3.0.2", + "chokidar": "^3.5.1", + "connect": "^3.7.0", + "di": "^0.0.1", + "dom-serialize": "^2.2.1", + "glob": "^7.1.7", + "graceful-fs": "^4.2.6", + "http-proxy": "^1.18.1", + "isbinaryfile": "^4.0.8", + "lodash": "^4.17.21", + "log4js": "^6.4.1", + "mime": "^2.5.2", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.5", + "qjobs": "^1.2.0", + "range-parser": "^1.2.1", + "rimraf": "^3.0.2", + "socket.io": "^4.7.2", + "source-map": "^0.6.1", + "tmp": "^0.2.1", + "ua-parser-js": "^0.7.30", + "yargs": "^16.1.1" + }, + "bin": { + "karma": "bin/karma" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/karma-browserify": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/karma-browserify/-/karma-browserify-8.1.0.tgz", + "integrity": "sha512-q5OWuCfdXMfyhkRrH8XP5LiixD4lx0uCmlf6yQmGeQNHLH4Hoofur3tBJtSEhOXmY0mOdBe8ek2UUxicjmGqFQ==", + "dev": true, + "dependencies": { + "convert-source-map": "^1.8.0", + "hat": "^0.0.3", + "js-string-escape": "^1.0.0", + "lodash": "^4.17.21", + "minimatch": "^3.0.0", + "os-shim": "^0.1.3" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "browserify": ">=10 <18", + "karma": ">=4.3.0", + "watchify": ">=3 <5" + } + }, + "node_modules/karma-browserify/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "node_modules/karma-chrome-launcher": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.2.0.tgz", + "integrity": "sha512-rE9RkUPI7I9mAxByQWkGJFXfFD6lE4gC5nPuZdobf/QdTEJI6EU4yIay/cfU/xV4ZxlM5JiTv7zWYgA64NpS5Q==", + "dev": true, + "dependencies": { + "which": "^1.2.1" + } + }, + "node_modules/karma-firefox-launcher": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/karma-firefox-launcher/-/karma-firefox-launcher-2.1.3.tgz", + "integrity": "sha512-LMM2bseebLbYjODBOVt7TCPP9OI2vZIXCavIXhkO9m+10Uj5l7u/SKoeRmYx8FYHTVGZSpk6peX+3BMHC1WwNw==", + "dev": true, + "dependencies": { + "is-wsl": "^2.2.0", + "which": "^3.0.0" + } + }, + "node_modules/karma-firefox-launcher/node_modules/which": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", + "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/karma-mocha": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/karma-mocha/-/karma-mocha-2.0.1.tgz", + "integrity": "sha512-Tzd5HBjm8his2OA4bouAsATYEpZrp9vC7z5E5j4C5Of5Rrs1jY67RAwXNcVmd/Bnk1wgvQRou0zGVLey44G4tQ==", + "dev": true, + "dependencies": { + "minimist": "^1.2.3" + } + }, + "node_modules/karma/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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, + "peer": true, + "dependencies": { + "inherits": "^2.0.1", + "stream-splicer": "^2.0.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "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, + "peer": true + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log4js": { + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.9.1.tgz", + "integrity": "sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g==", + "dev": true, + "dependencies": { + "date-format": "^4.0.14", + "debug": "^4.3.4", + "flatted": "^3.2.7", + "rfdc": "^1.3.0", + "streamroller": "^3.1.5" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/log4js/node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/log4js/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "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, + "peer": true, + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "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, + "peer": 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.2", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", + "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==", + "dev": true, + "peer": true + }, + "node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_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, + "peer": 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, + "peer": 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.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/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, + "peer": true + }, + "node_modules/mocha": { + "version": "10.8.2", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.8.2.tgz", + "integrity": "sha512-VZlYo/WE8t1tstuRmqgeyBgCbJc/lEdopaa+axcKzTBJ+UIdlAB9XnmvTCAH4pwR4ElNInaedhEBmZD8iCSVEg==", + "dev": true, + "dependencies": { + "ansi-colors": "^4.1.3", + "browser-stdout": "^1.3.1", + "chokidar": "^3.5.3", + "debug": "^4.3.5", + "diff": "^5.2.0", + "escape-string-regexp": "^4.0.0", + "find-up": "^5.0.0", + "glob": "^8.1.0", + "he": "^1.2.0", + "js-yaml": "^4.1.0", + "log-symbols": "^4.1.0", + "minimatch": "^5.1.6", + "ms": "^2.1.3", + "serialize-javascript": "^6.0.2", + "strip-json-comments": "^3.1.1", + "supports-color": "^8.1.1", + "workerpool": "^6.5.1", + "yargs": "^16.2.0", + "yargs-parser": "^20.2.9", + "yargs-unparser": "^2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha.js" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/mocha/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/mocha/node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/mocha/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/mocha/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mocha/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "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, + "peer": 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/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "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, + "peer": true + }, + "node_modules/os-shim": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/os-shim/-/os-shim-0.1.3.tgz", + "integrity": "sha512-jd0cvB8qQ5uVt0lvCIexBaROw1KyKm5sbulg2fWOHjETisuCzWyt+eTZKEMs8v6HwzoGs8xik26jg7eCM6pS+A==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/outpipe": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/outpipe/-/outpipe-1.1.1.tgz", + "integrity": "sha512-BnNY/RwnDrkmQdUa9U+OfN/Y7AWmKuUPCCd+hbRclZnnANvYpO72zp/a6Q4n829hPbdqEac31XCcsvlEvb+rtA==", + "dev": true, + "peer": true, + "dependencies": { + "shell-quote": "^1.4.2" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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, + "peer": 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, + "peer": true, + "dependencies": { + "path-platform": "~0.11.15" + } + }, + "node_modules/parse-asn1": { + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.7.tgz", + "integrity": "sha512-CTM5kuWR3sx9IFamcl5ErfPl6ea/N8IYwiJ+vpeB2g+1iknv7zBl5uPwbMbRVznRVbrNY6lGuDoE5b30grmbqg==", + "dev": true, + "peer": true, + "dependencies": { + "asn1.js": "^4.10.1", + "browserify-aes": "^1.2.0", + "evp_bytestokey": "^1.0.3", + "hash-base": "~3.0", + "pbkdf2": "^3.1.2", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true, + "peer": true + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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, + "peer": 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, + "peer": 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, + "peer": 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/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 0.4" + } + }, + "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, + "peer": 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, + "peer": 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, + "peer": 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.2", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", + "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==", + "dev": true, + "peer": 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/qjobs": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", + "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", + "dev": true, + "engines": { + "node": ">=0.9" + } + }, + "node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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, + "peer": 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, + "peer": true, + "dependencies": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "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, + "peer": true, + "dependencies": { + "readable-stream": "^2.0.2" + } + }, + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "peer": 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, + "peer": 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, + "peer": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true + }, + "node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "dev": true, + "peer": true, + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "dev": true + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "peer": 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/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "peer": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "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, + "peer": true, + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" + } + }, + "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, + "peer": true, + "dependencies": { + "fast-safe-stringify": "^2.0.7" + } + }, + "node_modules/shell-quote": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.2.tgz", + "integrity": "sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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" + } + ], + "peer": true + }, + "node_modules/socket.io": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.8.1.tgz", + "integrity": "sha512-oZ7iUCxph8WYRHHcjBEc9unw3adt5CmSNlppj/5Q4k2RIrhl8Z5yY2Xr4j9zj0+wzVZ0bxmYoGSzKJnRl6A4yg==", + "dev": true, + "dependencies": { + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "cors": "~2.8.5", + "debug": "~4.3.2", + "engine.io": "~6.6.0", + "socket.io-adapter": "~2.5.2", + "socket.io-parser": "~4.2.4" + }, + "engines": { + "node": ">=10.2.0" + } + }, + "node_modules/socket.io-adapter": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.5.tgz", + "integrity": "sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==", + "dev": true, + "dependencies": { + "debug": "~4.3.4", + "ws": "~8.17.1" + } + }, + "node_modules/socket.io-adapter/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/socket.io-adapter/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/socket.io-parser": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", + "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", + "dev": true, + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-parser/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/socket.io-parser/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/socket.io/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/socket.io/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "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, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/stream-browserify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", + "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", + "dev": true, + "peer": true, + "dependencies": { + "inherits": "~2.0.4", + "readable-stream": "^3.5.0" + } + }, + "node_modules/stream-browserify/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "peer": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "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, + "peer": 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, + "peer": 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.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "peer": 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, + "peer": true, + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.2" + } + }, + "node_modules/streamroller": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.1.5.tgz", + "integrity": "sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==", + "dev": true, + "dependencies": { + "date-format": "^4.0.14", + "debug": "^4.3.4", + "fs-extra": "^8.1.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/streamroller/node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/streamroller/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "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, + "peer": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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, + "peer": true, + "dependencies": { + "minimist": "^1.1.0" + } + }, + "node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "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, + "peer": 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, + "peer": 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, + "peer": 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, + "peer": 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, + "peer": true, + "dependencies": { + "process": "~0.11.0" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/tmp": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", + "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", + "dev": true, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "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, + "peer": true + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "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, + "peer": true + }, + "node_modules/ua-parser-js": { + "version": "0.7.40", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.40.tgz", + "integrity": "sha512-us1E3K+3jJppDBa3Tl0L3MOJiGhe1C6P0+nIvQAFYbxlMAx0h81eOwLmU57xgqToduDDPx3y5QsdjPfDu+FgOQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + }, + { + "type": "github", + "url": "https://github.com/sponsors/faisalman" + } + ], + "bin": { + "ua-parser-js": "script/cli.js" + }, + "engines": { + "node": "*" + } + }, + "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, + "peer": 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, + "peer": 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/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true + }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/url": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.4.tgz", + "integrity": "sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==", + "dev": true, + "peer": true, + "dependencies": { + "punycode": "^1.4.1", + "qs": "^6.12.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "dev": true, + "peer": true, + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, + "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, + "peer": true + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "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, + "peer": true + }, + "node_modules/void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", + "integrity": "sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/watchify/-/watchify-4.0.0.tgz", + "integrity": "sha512-2Z04dxwoOeNxa11qzWumBTgSAohTC0+ScuY7XMenPnH+W2lhTcpEOJP4g2EIG/SWeLadPk47x++Yh+8BqPM/lA==", + "dev": true, + "peer": true, + "dependencies": { + "anymatch": "^3.1.0", + "browserify": "^17.0.0", + "chokidar": "^3.4.0", + "defined": "^1.0.0", + "outpipe": "^1.1.0", + "through2": "^4.0.2", + "xtend": "^4.0.2" + }, + "bin": { + "watchify": "bin/cmd.js" + }, + "engines": { + "node": ">= 8.10.0" + } + }, + "node_modules/watchify/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "peer": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/watchify/node_modules/through2": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", + "dev": true, + "peer": true, + "dependencies": { + "readable-stream": "3" + } + }, + "node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", + "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", + "dev": true, + "peer": true, + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/workerpool": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz", + "integrity": "sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==", + "dev": true + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "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/ws": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": 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, + "peer": true, + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dev": true, + "dependencies": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/package.json b/package.json index 33461a7..16b575e 100644 --- a/package.json +++ b/package.json @@ -1,30 +1,24 @@ { - "name": "grib", - "version": "0.0.1", - "description": "GRIB2 parser", + "name": "grib-js", + "version": "1.0.0", + "description": "Full JavaScript GRIB2 parser", "license": "MIT", "main": "index.js", "repository": { "type": "git", - "url": "git://github.com/rjw57/grib.js.git" - }, - "author": { - "name": "Rich Wareham", - "email": "rich@richwareham.com", - "url": "http://richwareham.com" - }, - "dependencies": { - "jbinary": "~1.6.0" + "url": "git://github.com/gmerciel/grib.js.git" }, + "keywords": ["grib", "forecast", "noaa", "weather", "wind"], "devDependencies": { "commander": "^2.11.0", - "karma": "~0.12.17", - "karma-browserify": "0.2.1", - "karma-mocha": "~0.1.1", - "karma-phantomjs-launcher": "~0.1.1", - "mocha": "~1.14.0" + "karma": "^6.4.2", + "karma-browserify": "^8.1.0", + "karma-chrome-launcher": "^3.2.0", + "karma-firefox-launcher": "^2.1.2", + "karma-mocha": "^2.0.1", + "mocha": "^10.2.0" }, "scripts": { - "test": "mocha -R dot && node_modules/karma/bin/karma start --single-run --browsers Firefox,PhantomJS config/karma.conf.js" + "test": "mocha && karma start --single-run --browsers Firefox,Chrome config/karma.conf.js" } } diff --git a/samples/gfs.t12z.pgrb2.1p00.f000 b/samples/gfs.t12z.pgrb2.1p00.f000 new file mode 100644 index 0000000..88f41bd Binary files /dev/null and b/samples/gfs.t12z.pgrb2.1p00.f000 differ diff --git a/test/fixtureLoading.js b/test/fixtureLoading.js index 2d539ca..94f592c 100644 --- a/test/fixtureLoading.js +++ b/test/fixtureLoading.js @@ -1,15 +1,14 @@ var assert = require('assert'); -var jBinary = require('jbinary'); var files = require('./lib/fixtures').files; var grib = require('../index'); +const loadData = require('../load-data'); var makeTests = function(fileName) { return (function() { var fileData, fileSpec = files[fileName]; var parseErr, msgs, fileData; before(function(done) { - var url = fileSpec.url; - jBinary.loadData(fileSpec.url, function(err, data) { + loadData(fileSpec.url, function(err, data) { if(err) return done(err); fileData = data; grib.readData(fileData, function(err, msgs_) { diff --git a/test/gfs.js b/test/gfs.js index b966fee..6388e86 100644 --- a/test/gfs.js +++ b/test/gfs.js @@ -1,14 +1,14 @@ var assert = require('assert'); var grib = require('../index'); -var jBinary = require('jbinary'); var files = require('./lib/fixtures').files; +const loadData = require('../load-data'); describe('sample file gfs.grb', function() { var msgs = null; beforeEach(function(done) { msgs = null; - jBinary.loadData(files['gfs.grb'].url, function(err, data) { + loadData(files['gfs.grb'].url, function(err, data) { if(err) return done(err); grib.readData(data, function(err, msgs_) { if(err) return done(err); diff --git a/test/jbinary.js b/test/jbinary.js deleted file mode 100644 index b8dd9ed..0000000 --- a/test/jbinary.js +++ /dev/null @@ -1,29 +0,0 @@ -var assert = require('assert'); -var jBinary = require('jbinary'); -var files = require('./lib/fixtures').files; - -describe('jbinary', function() { - var typeSet = { 'jBinary.endian': 'littleEndian', 'jBinary.all': 'string' }; - - it('should be present', function() { - assert.ok(jBinary); - }); - - it('should load fixture URLs with correct length', function(done) { - jBinary.load(files['gfs.grb'].url, typeSet, function(err, data) { - if(err) return done(err); - var all = data.readAll(); - assert.strictEqual(all.length, 3867577); - done(); - }); - }); - - it('should load fixture URLs with correct endianness', function(done) { - jBinary.load(files['gfs.grb'].url, typeSet, function(err, data) { - if(err) return done(err); - var magic = data.read('uint32'); - assert.strictEqual(magic, 0x47524942); // 'GRIB' - done(); - }); - }); -}); diff --git a/test/lib/fixtures.js b/test/lib/fixtures.js index 4bc8a8c..a2ec4f2 100644 --- a/test/lib/fixtures.js +++ b/test/lib/fixtures.js @@ -23,6 +23,11 @@ exports.files = { referenceTimeSignificance: grib.ReferenceTimeSignificance.START_OF_FORECAST, }, 'gfs.t12z.pgrbf120.2p5deg.grib2': { count: 307 }, + 'gfs.t12z.pgrb2.1p00.f000': { + count: 2, + referenceTime: new Date(2023, 5, 1, 12, 0, 0), + referenceTimeSignificance: grib.ReferenceTimeSignificance.START_OF_FORECAST, + }, 'ngm.grb': { count: 5 }, 'reduced_latlon_surface.grib2': { count: 1 }, 'regular_latlon_surface.grib1': { count: null }, diff --git a/test/wind.js b/test/wind.js new file mode 100644 index 0000000..1916e64 --- /dev/null +++ b/test/wind.js @@ -0,0 +1,69 @@ +var assert = require('assert'); +var grib = require('../index'); +var files = require('./lib/fixtures').files; +const loadData = require('../load-data'); + +describe('sample file gfs.t12z.pgrb2.1p00.f000', function() { + var msgs = null; + + beforeEach(function(done) { + msgs = null; + loadData(files['gfs.t12z.pgrb2.1p00.f000'].url, function(err, data) { + if(err) return done(err); + grib.readData(data, function(err, msgs_) { + if(err) return done(err); + msgs = msgs_; + done(); + }); + }); + }); + + it('should have 2 records', function() { assert.strictEqual(msgs.length, 2); }); + + it('should have one field per record', function() { + var msg; + for(var idx in msgs) { + msg = msgs[idx]; + assert.ok(msg.fields.length == 1); + } + }); + + it('should have 65160 points per field', function() { + var msg; + for(var idx in msgs) { + msg = msgs[idx]; + assert.ok(msg.fields[0].data.length == 65160); + } + }); + + it('should have correct unpacked values', function() { + var data = [[ + 1.9095386, + 1.8295386, + 1.7495385, + 1.6795386, + 1.5995386, + 1.5195385, + 1.4395386, + 1.3595386, + 1.2795386, + 1.1995386, + ], [ + -4.3582544, + -4.388254, + -4.4282546, + -4.4582543, + -4.4782543, + -4.5082545, + -4.5382543, + -4.5582542, + -4.5882545, + -4.6082544, + ]]; + for(var idx in msgs) { + for(var i = 0; i < data[idx].length; i++) + assert.ok(msgs[idx].fields[0].data[i].toFixed(5) == data[idx][i].toFixed(5)); + } + }); + +});