diff --git a/languages/en_CA.json b/languages/en_CA.json index cf67e0d0..dc5e5bca 100644 --- a/languages/en_CA.json +++ b/languages/en_CA.json @@ -441,6 +441,7 @@ "Endpoint Address": "Endpoint Address", "Custom Endpoint": "Custom Endpoint", "Bucket": "Bucket", + "Bucket ID": "Bucket ID", "Region": "Region", "Use Global Amazon S3 Video Storage": "Use Global Amazon S3 Video Storage", "Use Global Wasabi Hot Cloud Storage Video Storage": "Use Global Wasabi Hot Cloud Storage Video Storage", diff --git a/libs/database/migrate/2022-12-18.js b/libs/database/migrate/2022-12-18.js index 1030baa0..9665465a 100644 --- a/libs/database/migrate/2022-12-18.js +++ b/libs/database/migrate/2022-12-18.js @@ -6,4 +6,11 @@ module.exports = async function(s,config){ await addColumn('Monitors',[ {name: 'tags', length: 500, type: 'string'}, ]) + await addColumn('Cloud Videos',[ + {name: 'type', type: 'string', length: 15, defaultTo: 's3'}, + {name: 'ext', type: 'string', length: 10, defaultTo: 'mp4'}, + ]) + await addColumn('Cloud Timelapse Frames',[ + {name: 'type', type: 'string', length: 15, defaultTo: 's3'}, + ]) } diff --git a/libs/timelapse.js b/libs/timelapse.js index 99538238..394b58bb 100644 --- a/libs/timelapse.js +++ b/libs/timelapse.js @@ -95,12 +95,12 @@ module.exports = function(s,config,lang,app,io){ }) } } - s.deleteTimelapseFrameFromCloud = function(e){ + s.deleteTimelapseFrameFromCloud = function(e,cloudType){ // e = video object - s.checkDetails(e) var frameSelector = { ke: e.ke, mid: e.id, + type: cloudType, time: new Date(e.time), } s.knexQuery({ @@ -118,7 +118,7 @@ module.exports = function(s,config,lang,app,io){ where: frameSelector, limit: 1 },function(){ - s.onDeleteTimelapseFrameFromCloudExtensionsRunner(e,r) + s.onDeleteTimelapseFrameFromCloudExtensionsRunner(e,details.type || r.type || 's3',r) }) }else{ // console.log('Delete Failed',e) diff --git a/libs/uploaders/amazonS3.js b/libs/uploaders/amazonS3.js index e8e68b93..c9f02149 100644 --- a/libs/uploaders/amazonS3.js +++ b/libs/uploaders/amazonS3.js @@ -1,6 +1,30 @@ -var fs = require('fs'); +// https://us-east-1.console.aws.amazon.com/iamv2/home#/users + +const fs = require('fs'); +const { S3Client, PutObjectCommand, DeleteObjectCommand, GetObjectCommand } = require("@aws-sdk/client-s3"); + module.exports = function(s,config,lang){ - //Amazon S3 + const genericRequest = async (groupKey,requestOptions) => { + const response = {ok: true} + try { + await s.group[groupKey].aws_s3.send(requestOptions); + } catch (err) { + console.error('AMZ genericRequest',groupKey,requestOptions) + response.ok = false + response.err = err + } + return response; + }; + const deleteObject = async (groupKey,options) => { + return await genericRequest(groupKey,new DeleteObjectCommand(options)) + }; + const uploadObject = async (groupKey,options) => { + return await genericRequest(groupKey,new PutObjectCommand(options)) + }; + const getObject = async (groupKey,options) => { + // returns createReadStream + return await s.group[groupKey].aws_s3.send(new GetObjectCommand(options)) + }; function beforeAccountSave(d){ //d = save event d.formDetails.aws_use_global=d.d.aws_use_global @@ -29,7 +53,7 @@ module.exports = function(s,config,lang){ userDetails = Object.assign(userDetails,config.cloudUploaders.AmazonS3) } //Amazon S3 - if(!s.group[e.ke].aws && + if( !s.group[e.ke].aws_s3 && userDetails.aws_s3 !== '0' && userDetails.aws_accessKeyId !== ''&& @@ -45,17 +69,16 @@ module.exports = function(s,config,lang){ if(userDetails.aws_s3_dir !== ''){ userDetails.aws_s3_dir = s.checkCorrectPathEnding(userDetails.aws_s3_dir) } - s.group[e.ke].aws = new require("aws-sdk") - s.group[e.ke].aws.config = new s.group[e.ke].aws.Config({ - accessKeyId: userDetails.aws_accessKeyId, - secretAccessKey: userDetails.aws_secretAccessKey, + s.group[e.ke].aws_s3 = new S3Client({ + credentials: { + accessKeyId: userDetails.aws_accessKeyId, + secretAccessKey: userDetails.aws_secretAccessKey, + }, region: userDetails.aws_region - }) - s.group[e.ke].aws_s3 = new s.group[e.ke].aws.S3(); + }); } } function unloadGroupApp(user){ - s.group[user.ke].aws = null s.group[user.ke].aws_s3 = null } function deleteVideo(e,video,callback){ @@ -68,55 +91,55 @@ module.exports = function(s,config,lang){ if(!videoDetails.location){ videoDetails.location = video.href.split('.amazonaws.com')[1] } - if(videoDetails.type !== 's3'){ + if(video.type !== 's3'){ + callback() return } - try{ - s.group[video.ke].aws_s3.deleteObject({ - Bucket: s.group[video.ke].init.aws_s3_bucket, - Key: videoDetails.location, - }, function(err, data) { - if (err) console.log(err); - callback() - }); - }catch(err){ - console.log('Amazon S3 DELETE Error',err) + deleteObject(video.ke,{ + Bucket: s.group[video.ke].init.aws_s3_bucket, + Key: videoDetails.location, + }).then((response) => { + if (response.err){ + console.error('Amazon S3 DELETE Error') + console.error(err); + } callback() - } + }); } - function uploadVideo(e,k){ + function uploadVideo(e,k,insertQuery){ //e = video object //k = temporary values if(!k)k={}; //cloud saver - amazon s3 - if(s.group[e.ke].aws_s3 && s.group[e.ke].init.use_aws_s3 !== '0' && s.group[e.ke].init.aws_s3_save === '1'){ - var ext = k.filename.split('.') - ext = ext[ext.length - 1] - var fileStream = fs.createReadStream(k.dir+k.filename); + const groupKey = insertQuery.ke + if(s.group[groupKey].aws_s3 && s.group[groupKey].init.use_aws_s3 !== '0' && s.group[groupKey].init.aws_s3_save === '1'){ + const filename = `${s.formattedTime(insertQuery.time)}.${insertQuery.ext}` + var fileStream = fs.createReadStream(k.dir+filename); fileStream.on('error', function (err) { console.error(err) }) - var saveLocation = s.group[e.ke].init.aws_s3_dir+e.ke+'/'+e.mid+'/'+k.filename - s.group[e.ke].aws_s3.upload({ - Bucket: s.group[e.ke].init.aws_s3_bucket, + var saveLocation = s.group[groupKey].init.aws_s3_dir+groupKey+'/'+e.mid+'/'+filename + uploadObject(groupKey,{ + Bucket: s.group[groupKey].init.aws_s3_bucket, Key: saveLocation, Body: fileStream, - ContentType: 'video/'+ext - },function(err,data){ - if(err){ - s.userLog(e,{type:lang['Amazon S3 Upload Error'],msg:err}) + ContentType: 'video/'+e.ext + }).then((response) => { + if(response.err){ + s.userLog(e,{type:lang['Amazon S3 Upload Error'],msg:response.err}) } - if(s.group[e.ke].init.aws_s3_log === '1' && data && data.Location){ + if(s.group[groupKey].init.aws_s3_log === '1' && response.ok){ s.knexQuery({ action: "insert", table: "Cloud Videos", insert: { mid: e.mid, - ke: e.ke, - time: k.startTime, + ke: groupKey, + ext: insertQuery.ext, + time: insertQuery.time, status: 1, + type : 's3', details: s.s({ - type : 's3', location : saveLocation }), size: k.filesize, @@ -124,13 +147,13 @@ module.exports = function(s,config,lang){ href: '' } }) - s.setCloudDiskUsedForGroup(e.ke,{ + s.setCloudDiskUsedForGroup(groupKey,{ amount: k.filesizeMB, storageType: 's3' }) s.purgeCloudDiskForGroup(e,'s3') } - }) + }); } } function onInsertTimelapseFrame(monitorObject,queryInfo,filePath){ @@ -141,17 +164,16 @@ module.exports = function(s,config,lang){ console.error(err) }) var saveLocation = s.group[e.ke].init.aws_s3_dir + e.ke + '/' + e.mid + '_timelapse/' + queryInfo.filename - s.group[e.ke].aws_s3.upload({ + uploadObject(e.ke,{ Bucket: s.group[e.ke].init.aws_s3_bucket, Key: saveLocation, Body: fileStream, - ACL:'public-read', ContentType:'image/jpeg' - },function(err,data){ - if(err){ - s.userLog(e,{type:lang['Wasabi Hot Cloud Storage Upload Error'],msg:err}) + }).then((response) => { + if(response.err){ + s.userLog(e,{type:lang['Wasabi Hot Cloud Storage Upload Error'],msg:response.err}) } - if(s.group[e.ke].init.aws_s3_log === '1' && data && data.Location){ + if(s.group[e.ke].init.aws_s3_log === '1' && response.ok){ s.knexQuery({ action: "insert", table: "Cloud Timelapse Frames", @@ -160,12 +182,12 @@ module.exports = function(s,config,lang){ ke: queryInfo.ke, time: queryInfo.time, filename: queryInfo.filename, + type : 's3', details: s.s({ - type : 's3', location : saveLocation }), size: queryInfo.size, - href: data.Location + href: '' } }) s.setCloudDiskUsedForGroup(e.ke,{ @@ -184,30 +206,32 @@ module.exports = function(s,config,lang){ }catch(err){ var frameDetails = frame.details } - if(frameDetails.type !== 's3'){ + if(video.type !== 's3'){ + callback() return } if(!frameDetails.location){ frameDetails.location = frame.href.split(locationUrl)[1] } - s.group[e.ke].aws_s3.deleteObject({ + deleteObject(e.ke,{ Bucket: s.group[e.ke].init.aws_s3_bucket, Key: frameDetails.location, - }, function(err, data) { - if (err) console.log(err); + }).then((response) => { + if (response.err){ + console.error('Amazon S3 DELETE Error') + console.error(err); + } callback() }); } - function onGetVideoData(video){ + async function onGetVideoData(video){ const videoDetails = s.parseJSON(video.details) - return new Promise((resolve, reject) => { - const saveLocation = videoDetails.location - var fileStream = s.group[video.ke].aws_s3.getObject({ - Bucket: s.group[video.ke].init.aws_s3_bucket, - Key: saveLocation, - }).createReadStream(); - resolve(fileStream) - }) + const saveLocation = videoDetails.location + var fileStream = await getObject(video.ke,{ + Bucket: s.group[video.ke].init.aws_s3_bucket, + Key: saveLocation, + }); + return fileStream.Body } //amazon s3 s.addCloudUploader({ @@ -219,8 +243,8 @@ module.exports = function(s,config,lang){ cloudDiskUseStartupExtensions: cloudDiskUseStartup, beforeAccountSave: beforeAccountSave, onAccountSave: cloudDiskUseStartup, - onInsertTimelapseFrame: onInsertTimelapseFrame, - onDeleteTimelapseFrameFromCloud: onDeleteTimelapseFrameFromCloud, + onInsertTimelapseFrame: (() => {}) || onInsertTimelapseFrame, + onDeleteTimelapseFrameFromCloud: (() => {}) || onDeleteTimelapseFrameFromCloud, onGetVideoData }) //return fields that will appear in settings diff --git a/libs/uploaders/backblazeB2.js b/libs/uploaders/backblazeB2.js index f5e27c23..c28b0d90 100644 --- a/libs/uploaders/backblazeB2.js +++ b/libs/uploaders/backblazeB2.js @@ -1,5 +1,6 @@ const fs = require('fs'); const { Readable } = require('stream'); +const B2 = require('backblaze-b2') module.exports = function(s,config,lang){ //Backblaze B2 var beforeAccountSaveForBackblazeB2 = function(d){ @@ -37,7 +38,6 @@ module.exports = function(s,config,lang){ userDetails.bb_b2_bucket !== '' && userDetails.bb_b2_save === '1' ){ - var B2 = require('backblaze-b2') if(!userDetails.bb_b2_dir || userDetails.bb_b2_dir === '/'){ userDetails.bb_b2_dir = '' } @@ -48,37 +48,21 @@ module.exports = function(s,config,lang){ // console.log(err) s.userLog({mid:'$USER',ke:e.ke},{type:lang['Backblaze Error'],msg:err.stack || err.data || err}) } - var createB2Connection = function(){ - var b2 = new B2({ + async function createB2Connection(){ + const b2 = new B2({ accountId: userDetails.bb_b2_accountId, applicationKey: userDetails.bb_b2_applicationKey - }) - b2.authorize().then(function(resp){ - s.group[e.ke].bb_b2_downloadUrl = resp.downloadUrl - b2.listBuckets().then(function(resp){ - var buckets = resp.buckets - var bucketN = -2 - if(!buckets){ - s.userLog({mid:'$USER',ke:e.ke},{type: lang['Backblaze Error'],msg: lang['Not Authorized']}) - return - } - buckets.forEach(function(item,n){ - if(item.bucketName === userDetails.bb_b2_bucket){ - bucketN = n - } - }) - if(bucketN > -1){ - s.group[e.ke].bb_b2_bucketId = buckets[bucketN].bucketId - }else{ - b2.createBucket( - userDetails.bb_b2_bucket, - 'allPublic' - ).then(function(resp){ - s.group[e.ke].bb_b2_bucketId = resp.bucketId - }).catch(backblazeErr) - } - }).catch(backblazeErr) - }).catch(backblazeErr) + }); + const bucketName = userDetails.bb_b2_bucket + try{ + const authResponse = await b2.authorize(); + const getBucketResponse = await b2.getBucket({bucketName: bucketName}) + const bucketId = getBucketResponse.data.buckets[0].bucketId + s.group[e.ke].bb_b2_bucketId = bucketId + }catch(err){ + console.error('b2.authorize',err) + backblazeErr(err) + } s.group[e.ke].bb_b2 = b2 } createB2Connection() @@ -99,13 +83,19 @@ module.exports = function(s,config,lang){ }catch(err){ var videoDetails = video.details } + if(video.type !== 'b2'){ + callback() + return + } s.group[e.ke].bb_b2.deleteFileVersion({ fileId: videoDetails.fileId, fileName: videoDetails.fileName }).then(function(resp){ // console.log('deleteFileVersion',resp) + callback() }).catch(function(err){ console.log('deleteFileVersion',err) + callback() }) } var uploadVideoToBackblazeB2 = function(e,k){ @@ -113,28 +103,31 @@ module.exports = function(s,config,lang){ //k = temporary values if(!k)k={}; //cloud saver - Backblaze B2 - if(s.group[e.ke].bb_b2 && s.group[e.ke].init.use_bb_b2 !== '0' && s.group[e.ke].init.bb_b2_save === '1'){ - var backblazeErr = function(err){ - // console.log(err) - s.userLog({mid:'$USER',ke:e.ke},{type:lang['Backblaze Error'],msg:err.data}) + const theGroup = s.group[e.ke] + if(theGroup.bb_b2 && theGroup.init.use_bb_b2 !== '0' && theGroup.init.bb_b2_save === '1'){ + function backblazeErr(err){ + s.userLog({mid:'$USER',ke:e.ke},{type:lang['Backblaze Error'],msg:err}) + s.debugLog(err) } fs.readFile(k.dir+k.filename,function(err,data){ - var backblazeSavePath = s.group[e.ke].init.bb_b2_dir+e.ke+'/'+e.mid+'/'+k.filename + var backblazeSavePath = theGroup.init.bb_b2_dir+e.ke+'/'+e.mid+'/'+k.filename var getUploadUrl = function(bucketId,callback){ - s.group[e.ke].bb_b2.getUploadUrl(bucketId).then(function(resp){ + theGroup.bb_b2.getUploadUrl(bucketId).then(function(resp){ callback(resp) }).catch(backblazeErr) } - getUploadUrl(s.group[e.ke].bb_b2_bucketId,function(req){ - s.group[e.ke].bb_b2.uploadFile({ - uploadUrl: req.uploadUrl, - uploadAuthToken: req.authorizationToken, + getUploadUrl(theGroup.bb_b2_bucketId,function(req){ + const uploadUrl = req.data.uploadUrl + const authorizationToken = req.data.authorizationToken + theGroup.bb_b2.uploadFile({ + uploadUrl: uploadUrl, + uploadAuthToken: authorizationToken, filename: backblazeSavePath, data: data, onUploadProgress: null }).then(function(resp){ - if(s.group[e.ke].init.bb_b2_log === '1' && resp.fileId){ - var backblazeDownloadUrl = s.group[e.ke].bb_b2_downloadUrl + '/file/' + s.group[e.ke].init.bb_b2_bucket + '/' + backblazeSavePath + const uploadResponse = resp.data + if(theGroup.init.bb_b2_log === '1' && uploadResponse.fileId){ s.knexQuery({ action: "insert", table: "Cloud Videos", @@ -143,11 +136,11 @@ module.exports = function(s,config,lang){ ke: e.ke, time: k.startTime, status: 1, + type : 'b2', details: s.s({ - type : 'b2', - bucketId : resp.bucketId, - fileId : resp.fileId, - fileName : resp.fileName + bucketId : uploadResponse.bucketId, + fileId : uploadResponse.fileId, + fileName : uploadResponse.fileName }), size: k.filesize, end: k.endTime, @@ -183,6 +176,7 @@ module.exports = function(s,config,lang){ const fileStream = Readable.from(response.data); resolve(fileStream) }).catch((err) => { + s.debugLog(err) reject(err) }); }) @@ -225,7 +219,7 @@ module.exports = function(s,config,lang){ }, { "hidden": true, - "field": lang.Bucket, + "field": lang['Bucket ID'], "name": "detail=bb_b2_bucket", "placeholder": "Example : slippery-seal", "form-group-class": "autosave_bb_b2_input autosave_bb_b2_1", diff --git a/libs/uploaders/googleDrive.js b/libs/uploaders/googleDrive.js index 9822f6da..1fac318b 100644 --- a/libs/uploaders/googleDrive.js +++ b/libs/uploaders/googleDrive.js @@ -115,10 +115,12 @@ module.exports = (s,config,lang,app,io) => { s.group[user.ke].googleDrive = null s.group[user.ke].googleDriveOAuth2Client = null } - var deleteVideoFromGoogleDrive = function(groupKey,video,callback){ + var deleteVideoFromGoogleDrive = function(e,video,callback){ // e = user + const groupKey = e.ke var videoDetails = s.parseJSON(video.details) - if(videoDetails.type !== 'googd'){ + if(video.type !== 'googd'){ + callback() return } s.group[groupKey].googleDrive.files.delete({ @@ -168,8 +170,8 @@ module.exports = (s,config,lang,app,io) => { ke: e.ke, time: k.startTime, status: 1, + type: 'googd', details: s.s({ - type: 'googd', id: data.id }), size: k.filesize, @@ -221,8 +223,8 @@ module.exports = (s,config,lang,app,io) => { mid: queryInfo.mid, ke: queryInfo.ke, time: queryInfo.time, + type : 'googd', details: s.s({ - type : 'googd', id : data.id, }), size: queryInfo.size, @@ -241,7 +243,7 @@ module.exports = (s,config,lang,app,io) => { var onDeleteTimelapseFrameFromCloud = function(e,frame,callback){ // e = user var frameDetails = s.parseJSON(frame.details) - if(frameDetails.type !== 'googd'){ + if(frame.type !== 'googd'){ return } s.group[e.ke].googleDrive.files.delete({ @@ -255,9 +257,6 @@ module.exports = (s,config,lang,app,io) => { // e = user var videoDetails = s.parseJSON(video.details) const fileId = videoDetails.id - if(videoDetails.type !== 'googd'){ - return - } return new Promise((resolve, reject) => { s.group[video.ke].googleDrive.files .get({fileId, alt: 'media'}, {responseType: 'stream'}) @@ -296,8 +295,8 @@ module.exports = (s,config,lang,app,io) => { cloudDiskUseStartupExtensions: cloudDiskUseStartupForGoogleDrive, beforeAccountSave: beforeAccountSaveForGoogleDrive, onAccountSave: cloudDiskUseStartupForGoogleDrive, - onInsertTimelapseFrame: onInsertTimelapseFrame, - onDeleteTimelapseFrameFromCloud: onDeleteTimelapseFrameFromCloud, + onInsertTimelapseFrame: (() => {}) || onInsertTimelapseFrame, + onDeleteTimelapseFrameFromCloud: (() => {}) || onDeleteTimelapseFrameFromCloud, onGetVideoData: onGetVideoData }) return { diff --git a/libs/uploaders/s3based.js b/libs/uploaders/s3based.js index 2ff81825..e15bc8e2 100644 --- a/libs/uploaders/s3based.js +++ b/libs/uploaders/s3based.js @@ -1,15 +1,37 @@ -var fs = require('fs'); +// https://us-east-1.console.aws.amazon.com/iamv2/home#/users + +const fs = require('fs'); +const { S3Client, PutObjectCommand, DeleteObjectCommand, GetObjectCommand } = require("@aws-sdk/client-s3"); + module.exports = function(s,config,lang){ - //Wasabi Hot Cloud Storage - var beforeAccountSaveForWasabiHotCloudStorage = function(d){ + const genericRequest = async (groupKey,requestOptions) => { + const response = {ok: true} + try { + await s.group[groupKey].whcs.send(requestOptions); + } catch (err) { + console.error('AMZ genericRequest',groupKey,requestOptions) + response.ok = false + response.err = err + } + return response; + }; + const deleteObject = async (groupKey,options) => { + return await genericRequest(groupKey,new DeleteObjectCommand(options)) + }; + const uploadObject = async (groupKey,options) => { + return await genericRequest(groupKey,new PutObjectCommand(options)) + }; + const getObject = async (groupKey,options) => { + // returns createReadStream + return await s.group[groupKey].whcs.send(new GetObjectCommand(options)) + }; + function beforeAccountSave(d){ //d = save event d.formDetails.whcs_use_global=d.d.whcs_use_global d.formDetails.use_whcs=d.d.use_whcs } - var cloudDiskUseStartupForWasabiHotCloudStorage = function(group,userDetails){ - group.cloudDiskUse = group.cloudDiskUse || {} - group.cloudDiskUse['whcs'] = group.cloudDiskUse['whcs'] || {} - group.cloudDiskUse['whcs'].name = 'Wasabi Hot Cloud Storage' + function cloudDiskUseStartup(group,userDetails){ + group.cloudDiskUse['whcs'].name = 'S3-Based Network Storage' group.cloudDiskUse['whcs'].sizeLimitCheck = (userDetails.use_whcs_size_limit === '1') if(!userDetails.whcs_size_limit || userDetails.whcs_size_limit === ''){ group.cloudDiskUse['whcs'].sizeLimit = 10000 @@ -17,9 +39,9 @@ module.exports = function(s,config,lang){ group.cloudDiskUse['whcs'].sizeLimit = parseFloat(userDetails.whcs_size_limit) } } - var loadWasabiHotCloudStorageForUser = function(e){ + function loadGroupApp(e){ // e = user - var userDetails = s.parseJSON(e.details) + var userDetails = JSON.parse(e.details) if(userDetails.whcs_use_global === '1' && config.cloudUploaders && config.cloudUploaders.WasabiHotCloudStorage){ // { // whcs_accessKeyId: "", @@ -30,8 +52,9 @@ module.exports = function(s,config,lang){ // } userDetails = Object.assign(userDetails,config.cloudUploaders.WasabiHotCloudStorage) } - //Wasabi Hot Cloud Storage - if(!s.group[e.ke].whcs && + //S3-Based Network Storage + if( + !s.group[e.ke].whcs && userDetails.whcs !== '0' && userDetails.whcs_accessKeyId !== ''&& userDetails.whcs_secretAccessKey && @@ -41,119 +64,98 @@ module.exports = function(s,config,lang){ if(!userDetails.whcs_dir || userDetails.whcs_dir === '/'){ userDetails.whcs_dir = '' } - if(userDetails.whcs_dir !== ''){ + if(userDetails.whcs_dir){ userDetails.whcs_dir = s.checkCorrectPathEnding(userDetails.whcs_dir) } - if(userDetails.use_whcs_endpoint_select && userDetails.use_whcs_endpoint_select !== ''){ - userDetails.whcs_endpoint = userDetails.use_whcs_endpoint_select - } - if(!userDetails.whcs_endpoint || userDetails.whcs_endpoint === ''){ + if(!userDetails.whcs_endpoint ){ userDetails.whcs_endpoint = 's3.wasabisys.com' } - var whcs_region = null - if(userDetails.whcs_region && userDetails.whcs_region !== ''){ - whcs_region = userDetails.whcs_region - } - var endpointSplit = userDetails.whcs_endpoint.split('.') - if(endpointSplit.length > 2){ - endpointSplit.shift() - } - var locationUrl = endpointSplit.join('.') - var AWS = new require("aws-sdk") - s.group[e.ke].whcs = AWS - var wasabiEndpoint = new AWS.Endpoint(userDetails.whcs_endpoint) - s.group[e.ke].whcs.config = new s.group[e.ke].whcs.Config({ - endpoint: wasabiEndpoint, - accessKeyId: userDetails.whcs_accessKeyId, - secretAccessKey: userDetails.whcs_secretAccessKey, - region: whcs_region - }) - s.group[e.ke].whcs = new s.group[e.ke].whcs.S3(); + s.group[e.ke].whcs = new S3Client({ + endpoint: userDetails.whcs_endpoint, + credentials: { + accessKeyId: userDetails.whcs_accessKeyId, + secretAccessKey: userDetails.whcs_secretAccessKey, + }, + region: userDetails.whcs_region || null + }); } } - var unloadWasabiHotCloudStorageForUser = function(user){ + function unloadGroupApp(user){ s.group[user.ke].whcs = null } - var deleteVideoFromWasabiHotCloudStorage = function(e,video,callback){ + function deleteVideo(e,video,callback){ // e = user try{ var videoDetails = JSON.parse(video.details) }catch(err){ var videoDetails = video.details } - if(!videoDetails.location){ - videoDetails.location = video.href.split(locationUrl)[1] - } - if(videoDetails.type !== 'whcs'){ + if(video.type !== 'whcs'){ + callback() return } - s.group[e.ke].whcs.deleteObject({ - Bucket: s.group[e.ke].init.whcs_bucket, + deleteObject(video.ke,{ + Bucket: s.group[video.ke].init.whcs_bucket, Key: videoDetails.location, - }, function(err, data) { - if (err) console.log(err); + }).then((response) => { + if (response.err){ + console.error('S3-Based Network Storage DELETE Error') + console.error(err); + } callback() }); } - var uploadVideoToWasabiHotCloudStorage = function(e,k){ + function uploadVideo(e,k,insertQuery){ //e = video object //k = temporary values if(!k)k={}; - //cloud saver - Wasabi Hot Cloud Storage - if(s.group[e.ke].whcs && s.group[e.ke].init.use_whcs !== '0' && s.group[e.ke].init.whcs_save === '1'){ - var ext = k.filename.split('.') - ext = ext[ext.length - 1] - var fileStream = fs.createReadStream(k.dir+k.filename); + //cloud saver - S3-Based Network Storage + const groupKey = insertQuery.ke + if(s.group[groupKey].whcs && s.group[groupKey].init.use_whcs !== '0' && s.group[groupKey].init.whcs_save === '1'){ + const filename = `${s.formattedTime(insertQuery.time)}.${insertQuery.ext}` + var fileStream = fs.createReadStream(k.dir+filename); fileStream.on('error', function (err) { console.error(err) }) - var bucketName = s.group[e.ke].init.whcs_bucket - var saveLocation = s.group[e.ke].init.whcs_dir+e.ke+'/'+e.mid+'/'+k.filename - // gcp does not support multipart. Set queueSize to 1 and a big enough partSize - var options = s.group[e.ke].whcs.endpoint.href.includes("https://storage.googleapis.com") ? { - queueSize: 1, - partSize: 300 * 1024 * 1024 - } : {} - s.group[e.ke].whcs.upload({ - Bucket: bucketName, + var saveLocation = s.group[groupKey].init.whcs_dir+groupKey+'/'+e.mid+'/'+filename + uploadObject(groupKey,{ + Bucket: s.group[groupKey].init.whcs_bucket, Key: saveLocation, Body: fileStream, - ContentType: 'video/'+ext - },options,function(err,data){ - if(err){ - console.error(err) - s.userLog(e,{type:lang['Wasabi Hot Cloud Storage Upload Error'],msg:err}) + ContentType: 'video/'+e.ext + }).then((response) => { + if(response.err){ + s.userLog(e,{type:lang['S3-Based Network Storage Upload Error'],msg:response.err}) } - if(s.group[e.ke].init.whcs_log === '1' && data && data.Location){ - var cloudLink = data.Location - cloudLink = fixCloudianUrl(e,cloudLink) + if(s.group[groupKey].init.whcs_log === '1' && response.ok){ s.knexQuery({ action: "insert", table: "Cloud Videos", insert: { mid: e.mid, - ke: e.ke, - time: k.startTime, + ke: groupKey, + ext: insertQuery.ext, + time: insertQuery.time, status: 1, + type : 'whcs', details: s.s({ - type : 'whcs', location : saveLocation }), size: k.filesize, end: k.endTime, - href: cloudLink + href: '' } }) - s.setCloudDiskUsedForGroup(e.ke,{ - amount : k.filesizeMB, - storageType : 'whcs' + s.setCloudDiskUsedForGroup(groupKey,{ + amount: k.filesizeMB, + storageType: 'whcs' }) s.purgeCloudDiskForGroup(e,'whcs') } - }) + }); } } - var onInsertTimelapseFrame = function(monitorObject,queryInfo,filePath){ + function onInsertTimelapseFrame(monitorObject,queryInfo,filePath){ var e = monitorObject if(s.group[e.ke].whcs && s.group[e.ke].init.use_whcs !== '0' && s.group[e.ke].init.whcs_save === '1'){ var fileStream = fs.createReadStream(filePath) @@ -161,17 +163,16 @@ module.exports = function(s,config,lang){ console.error(err) }) var saveLocation = s.group[e.ke].init.whcs_dir + e.ke + '/' + e.mid + '_timelapse/' + queryInfo.filename - s.group[e.ke].whcs.upload({ + uploadObject(e.ke,{ Bucket: s.group[e.ke].init.whcs_bucket, Key: saveLocation, Body: fileStream, - ACL:'public-read', ContentType:'image/jpeg' - },function(err,data){ - if(err){ - s.userLog(e,{type:lang['Wasabi Hot Cloud Storage Upload Error'],msg:err}) + }).then((response) => { + if(response.err){ + s.userLog(e,{type:lang['Wasabi Hot Cloud Storage Upload Error'],msg:response.err}) } - if(s.group[e.ke].init.whcs_log === '1' && data && data.Location){ + if(s.group[e.ke].init.whcs_log === '1' && response.ok){ s.knexQuery({ action: "insert", table: "Cloud Timelapse Frames", @@ -179,13 +180,13 @@ module.exports = function(s,config,lang){ mid: queryInfo.mid, ke: queryInfo.ke, time: queryInfo.time, - filename: queryInfo.filename, + filename: queryInfo.filename, + type : 'whcs', details: s.s({ - type : 'whcs', location : saveLocation }), size: queryInfo.size, - href: data.Location + href: '' } }) s.setCloudDiskUsedForGroup(e.ke,{ @@ -197,68 +198,55 @@ module.exports = function(s,config,lang){ }) } } - var onDeleteTimelapseFrameFromCloud = function(e,frame,callback){ + function onDeleteTimelapseFrameFromCloud(e,frame,callback){ // e = user try{ var frameDetails = JSON.parse(frame.details) }catch(err){ var frameDetails = frame.details } - if(frameDetails.type !== 'whcs'){ + if(video.type !== 'whcs'){ + callback() return } if(!frameDetails.location){ frameDetails.location = frame.href.split(locationUrl)[1] } - s.group[e.ke].whcs.deleteObject({ + deleteObject(e.ke,{ Bucket: s.group[e.ke].init.whcs_bucket, Key: frameDetails.location, - }, function(err, data) { - if (err) console.log(err); + }).then((response) => { + if (response.err){ + console.error('S3-Based Network Storage DELETE Error') + console.error(err); + } callback() }); } - var fixCloudianUrl = function(e,cloudLink){ - if(cloudLink.indexOf('http') === -1){ - var bucketName = s.group[e.ke].init.whcs_bucket - var endPointSplit = s.group[e.ke].init.whcs_endpoint.split('://') - endPoint = endPointSplit[1] || endPointSplit[0] - var protocol = `https` - if(endPointSplit[1])protocol = endPointSplit[0] - var cloudLinkPrefix = `${protocol}://${bucketName}.${endPoint}` - var truncatedLink = cloudLink.substring(0, bucketName.length + 3) - if(truncatedLink.indexOf(`${bucketName}/`) > -1){ - cloudLink = cloudLink.replace(`${bucketName}/`,'') - } - cloudLink = s.checkCorrectPathEnding(cloudLinkPrefix) + cloudLink - } - return cloudLink - } - function onGetVideoData(video){ + async function onGetVideoData(video){ const videoDetails = s.parseJSON(video.details) - return new Promise((resolve, reject) => { - const saveLocation = videoDetails.location - var fileStream = s.group[video.ke].whcs.getObject({ - Bucket: s.group[video.ke].init.whcs_bucket, - Key: saveLocation, - }).createReadStream(); - resolve(fileStream) - }) + const saveLocation = videoDetails.location + var fileStream = await getObject(video.ke,{ + Bucket: s.group[video.ke].init.whcs_bucket, + Key: saveLocation, + }); + return fileStream.Body } - //wasabi + //S3-Based Network Storage s.addCloudUploader({ name: 'whcs', - loadGroupAppExtender: loadWasabiHotCloudStorageForUser, - unloadGroupAppExtender: unloadWasabiHotCloudStorageForUser, - insertCompletedVideoExtender: uploadVideoToWasabiHotCloudStorage, - deleteVideoFromCloudExtensions: deleteVideoFromWasabiHotCloudStorage, - cloudDiskUseStartupExtensions: cloudDiskUseStartupForWasabiHotCloudStorage, - beforeAccountSave: beforeAccountSaveForWasabiHotCloudStorage, - onAccountSave: cloudDiskUseStartupForWasabiHotCloudStorage, - onInsertTimelapseFrame: onInsertTimelapseFrame, - onDeleteTimelapseFrameFromCloud: onDeleteTimelapseFrameFromCloud, + loadGroupAppExtender: loadGroupApp, + unloadGroupAppExtender: unloadGroupApp, + insertCompletedVideoExtender: uploadVideo, + deleteVideoFromCloudExtensions: deleteVideo, + cloudDiskUseStartupExtensions: cloudDiskUseStartup, + beforeAccountSave: beforeAccountSave, + onAccountSave: cloudDiskUseStartup, + onInsertTimelapseFrame: (() => {}) || onInsertTimelapseFrame, + onDeleteTimelapseFrameFromCloud: (() => {}) || onDeleteTimelapseFrameFromCloud, onGetVideoData }) + //return fields that will appear in settings return { "evaluation": "details.use_whcs !== '0'", "name": lang["S3-Based Network Storage"], @@ -285,35 +273,11 @@ module.exports = function(s,config,lang){ }, { "hidden": true, - "name": "detail=use_whcs_endpoint_select", - "selector":"h_whcs_endpoint", - "field": lang.Endpoint, - "description": "", - "default": "", - "example": "", - "fieldType": "select", - "possible": [ - { - "name": "Custom Endpoint", - "value": "" - }, - { - "name": lang['Wasabi Hot Cloud Storage'], - "value": "s3.wasabisys.com" - } - ] - }, - { - "hidden": true, - "field": lang['Endpoint Address'], - "name": "detail=whcs_endpoint", - "placeholder": "s3.wasabisys.com", - "form-group-class": "autosave_whcs_input autosave_whcs_1", - "form-group-class-pre-layer":"h_whcs_endpoint_input h_whcs_endpoint_", - "description": "", - "default": "", - "example": "", - "possible": "" + "field": lang['Endpoint Address'], + "name": "detail=whcs_endpoint", + "placeholder": "s3.wasabisys.com", + "form-group-class": "autosave_whcs_input autosave_whcs_1", + "form-group-class-pre-layer":"h_whcs_endpoint_input h_whcs_endpoint_" }, { "hidden": true, @@ -357,7 +321,7 @@ module.exports = function(s,config,lang){ "description": "", "default": "", "example": "", - "possible": [ + "possible": [ { "name": lang['No Region'], "value": "" @@ -434,7 +398,7 @@ module.exports = function(s,config,lang){ "name": "South America 1", "value": "sa-east-1" } - ] + ] }, { "hidden": true, diff --git a/libs/uploaders/webdav.js b/libs/uploaders/webdav.js index 35eef577..84b626c6 100644 --- a/libs/uploaders/webdav.js +++ b/libs/uploaders/webdav.js @@ -57,6 +57,10 @@ module.exports = function(s,config,lang){ }catch(err){ var videoDetails = video.details } + if(video.type !== 'webdav'){ + callback() + return + } if(!videoDetails.location){ var prefix = s.addUserPassToUrl(s.checkCorrectPathEnding(s.group[groupKey].init.webdav_url),s.group[groupKey].init.webdav_user,s.group[groupKey].init.webdav_pass) videoDetails.location = video.href.replace(prefix,'') @@ -88,8 +92,8 @@ module.exports = function(s,config,lang){ ke: e.ke, time: k.startTime, status: 1, + type : 'webdav', details: s.s({ - type : 'webdav', location : webdavUploadDir + k.filename }), size: k.filesize, @@ -172,8 +176,8 @@ module.exports = function(s,config,lang){ ke: queryInfo.ke, time: queryInfo.time, filename: queryInfo.filename, + type : 'webdav', details: s.s({ - type : 'webdav', location : saveLocation }), size: queryInfo.size, @@ -195,7 +199,8 @@ module.exports = function(s,config,lang){ }catch(err){ var frameDetails = frame.details } - if(frameDetails.type !== 'webdav'){ + if(frame.type !== 'webdav'){ + callback() return } if(!frameDetails.location){ @@ -223,8 +228,8 @@ module.exports = function(s,config,lang){ cloudDiskUseStartupExtensions: cloudDiskUseStartupForWebDav, beforeAccountSave: beforeAccountSaveForWebDav, onAccountSave: cloudDiskUseStartupForWebDav, - onInsertTimelapseFrame, - onDeleteTimelapseFrameFromCloud, + onInsertTimelapseFrame: () => {}, + onDeleteTimelapseFrameFromCloud: () => {}, onGetVideoData }) return { diff --git a/libs/videos.js b/libs/videos.js index a063c07e..8bb9fede 100644 --- a/libs/videos.js +++ b/libs/videos.js @@ -331,22 +331,18 @@ module.exports = function(s,config,lang){ } if(s.deleteVideoFromCloudExtensions[storageType]){ s.deleteVideoFromCloudExtensions[storageType](e,video,function(){ - s.tx({ + s.tx(Object.assign({ f: 'video_delete_cloud', - mid: e.mid, - ke: e.ke, - time: e.time, - end: e.end - },'GRP_'+e.ke); + },video),'GRP_'+e.ke); }) } } - s.deleteVideoFromCloud = function(e){ + s.deleteVideoFromCloud = function(e,cloudType){ // e = video object - s.checkDetails(e) const whereQuery = { ke: e.ke, mid: e.mid, + type: cloudType, time: new Date(e.time), } s.knexQuery({ @@ -363,7 +359,7 @@ module.exports = function(s,config,lang){ table: "Cloud Videos", where: whereQuery },(err) => { - s.deleteVideoFromCloudExtensionsRunner(e,details.type || 's3',r) + s.deleteVideoFromCloudExtensionsRunner(e,details.type || r.type || 's3',r) }) }else{ // console.log('Delete Failed',e) diff --git a/libs/webServerPaths.js b/libs/webServerPaths.js index 914aa1ad..ae61c6ad 100644 --- a/libs/webServerPaths.js +++ b/libs/webServerPaths.js @@ -1379,6 +1379,7 @@ module.exports = function(s,config,lang,app,io){ where: [ ['ke','=',groupKey], ['mid','=',req.params.id], + ['type','=', s.getPostData(req,'type') || 's3'], ['time','=',time] ], limit: 1 @@ -1386,7 +1387,7 @@ module.exports = function(s,config,lang,app,io){ if(r&&r[0]){ r = r[0] const videoDetails = JSON.parse(r.details) - const storageType = videoDetails.type + const storageType = r.type || videoDetails.type const onGetVideoData = s.cloudDiskUseOnGetVideoDataExtensions[storageType] if(onGetVideoData){ onGetVideoData(r).then((dataPipe) => { @@ -1803,15 +1804,17 @@ module.exports = function(s,config,lang,app,io){ videoSet = 'Cloud Videos' break; } + const whereQuery = [ + ['ke','=',groupKey], + ['mid','=',req.params.id], + ['time','=',time] + ] + if(videoParam === 'cloudVideos')whereQuery.push(['type','=',s.getPostData(req,'type') || 's3']); s.knexQuery({ action: "select", columns: "*", table: videoSet, - where: [ - ['ke','=',groupKey], - ['mid','=',req.params.id], - ['time','=',time] - ], + where: whereQuery, limit: 1 },async (err,r) => { if(r && r[0]){ @@ -1884,7 +1887,7 @@ module.exports = function(s,config,lang,app,io){ response.ok = true; switch(videoParam){ case'cloudVideos': - s.deleteVideoFromCloud(r,details.type || 's3') + s.deleteVideoFromCloud(r,details.type || r.type || 's3') break; default: s.deleteVideo(r) diff --git a/package-lock.json b/package-lock.json index 5e17420e..bf2b493b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,8 +8,8 @@ "name": "shinobi", "version": "2.0.0", "dependencies": { + "@aws-sdk/client-s3": "^3.226.0", "async": "^3.2.2", - "aws-sdk": "^2.1030.0", "backblaze-b2": "^0.9.12", "body-parser": "^1.19.0", "bson": "^4.6.1", @@ -59,6 +59,1331 @@ "shinobi": "camera.js" } }, + "node_modules/@aws-crypto/crc32": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-2.0.0.tgz", + "integrity": "sha512-TvE1r2CUueyXOuHdEigYjIZVesInd9KN+K/TFFNfkkxRThiNxO6i4ZqqAVMoEjAamZZ1AA8WXJkjCz7YShHPQA==", + "dependencies": { + "@aws-crypto/util": "^2.0.0", + "@aws-sdk/types": "^3.1.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/crc32/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-crypto/crc32c": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/crc32c/-/crc32c-2.0.0.tgz", + "integrity": "sha512-vF0eMdMHx3O3MoOXUfBZry8Y4ZDtcuskjjKgJz8YfIDjLStxTZrYXk+kZqtl6A0uCmmiN/Eb/JbC/CndTV1MHg==", + "dependencies": { + "@aws-crypto/util": "^2.0.0", + "@aws-sdk/types": "^3.1.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/crc32c/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-crypto/ie11-detection": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-2.0.2.tgz", + "integrity": "sha512-5XDMQY98gMAf/WRTic5G++jfmS/VLM0rwpiOpaainKi4L0nqWMSB1SzsrEG5rjFZGYN6ZAefO+/Yta2dFM0kMw==", + "dependencies": { + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/ie11-detection/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-crypto/sha1-browser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha1-browser/-/sha1-browser-2.0.0.tgz", + "integrity": "sha512-3fIVRjPFY8EG5HWXR+ZJZMdWNRpwbxGzJ9IH9q93FpbgCH8u8GHRi46mZXp3cYD7gealmyqpm3ThZwLKJjWJhA==", + "dependencies": { + "@aws-crypto/ie11-detection": "^2.0.0", + "@aws-crypto/supports-web-crypto": "^2.0.0", + "@aws-sdk/types": "^3.1.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/sha1-browser/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-crypto/sha256-browser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-2.0.0.tgz", + "integrity": "sha512-rYXOQ8BFOaqMEHJrLHul/25ckWH6GTJtdLSajhlqGMx0PmSueAuvboCuZCTqEKlxR8CQOwRarxYMZZSYlhRA1A==", + "dependencies": { + "@aws-crypto/ie11-detection": "^2.0.0", + "@aws-crypto/sha256-js": "^2.0.0", + "@aws-crypto/supports-web-crypto": "^2.0.0", + "@aws-crypto/util": "^2.0.0", + "@aws-sdk/types": "^3.1.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/sha256-browser/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-crypto/sha256-js": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-2.0.0.tgz", + "integrity": "sha512-VZY+mCY4Nmrs5WGfitmNqXzaE873fcIZDu54cbaDaaamsaTOP1DBImV9F4pICc3EHjQXujyE8jig+PFCaew9ig==", + "dependencies": { + "@aws-crypto/util": "^2.0.0", + "@aws-sdk/types": "^3.1.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/sha256-js/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-crypto/supports-web-crypto": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-2.0.2.tgz", + "integrity": "sha512-6mbSsLHwZ99CTOOswvCRP3C+VCWnzBf+1SnbWxzzJ9lR0mA0JnY2JEAhp8rqmTE0GPFy88rrM27ffgp62oErMQ==", + "dependencies": { + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/supports-web-crypto/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-crypto/util": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-2.0.2.tgz", + "integrity": "sha512-Lgu5v/0e/BcrZ5m/IWqzPUf3UYFTy/PpeED+uc9SWUR1iZQL8XXbGQg10UfllwwBryO3hFF5dizK+78aoXC1eA==", + "dependencies": { + "@aws-sdk/types": "^3.110.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/util/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-sdk/abort-controller": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/abort-controller/-/abort-controller-3.226.0.tgz", + "integrity": "sha512-cJVzr1xxPBd08voknXvR0RLgtZKGKt6WyDpH/BaPCu3rfSqWCDZKzwqe940eqosjmKrxC6pUZNKASIqHOQ8xxQ==", + "dependencies": { + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/chunked-blob-reader": { + "version": "3.188.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/chunked-blob-reader/-/chunked-blob-reader-3.188.0.tgz", + "integrity": "sha512-zkPRFZZPL3eH+kH86LDYYXImiClA1/sW60zYOjse9Pgka+eDJlvBN6hcYxwDEKjcwATYiSRR1aVQHcfCinlGXg==", + "dependencies": { + "tslib": "^2.3.1" + } + }, + "node_modules/@aws-sdk/chunked-blob-reader-native": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/chunked-blob-reader-native/-/chunked-blob-reader-native-3.208.0.tgz", + "integrity": "sha512-JeOZ95PW+fJ6bbuqPySYqLqHk1n4+4ueEEraJsiUrPBV0S1ZtyvOGHcnGztKUjr2PYNaiexmpWuvUve9K12HRA==", + "dependencies": { + "@aws-sdk/util-base64": "3.208.0", + "tslib": "^2.3.1" + } + }, + "node_modules/@aws-sdk/client-s3": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.226.0.tgz", + "integrity": "sha512-N8S0i5txBqlTY30IHaWgi15HUPzdWpQVX01zfYoHU80HmxKBRhqrefIrmCbn/121br0B+MysgpgdfiSfhyHkLw==", + "dependencies": { + "@aws-crypto/sha1-browser": "2.0.0", + "@aws-crypto/sha256-browser": "2.0.0", + "@aws-crypto/sha256-js": "2.0.0", + "@aws-sdk/client-sts": "3.226.0", + "@aws-sdk/config-resolver": "3.226.0", + "@aws-sdk/credential-provider-node": "3.226.0", + "@aws-sdk/eventstream-serde-browser": "3.226.0", + "@aws-sdk/eventstream-serde-config-resolver": "3.226.0", + "@aws-sdk/eventstream-serde-node": "3.226.0", + "@aws-sdk/fetch-http-handler": "3.226.0", + "@aws-sdk/hash-blob-browser": "3.226.0", + "@aws-sdk/hash-node": "3.226.0", + "@aws-sdk/hash-stream-node": "3.226.0", + "@aws-sdk/invalid-dependency": "3.226.0", + "@aws-sdk/md5-js": "3.226.0", + "@aws-sdk/middleware-bucket-endpoint": "3.226.0", + "@aws-sdk/middleware-content-length": "3.226.0", + "@aws-sdk/middleware-endpoint": "3.226.0", + "@aws-sdk/middleware-expect-continue": "3.226.0", + "@aws-sdk/middleware-flexible-checksums": "3.226.0", + "@aws-sdk/middleware-host-header": "3.226.0", + "@aws-sdk/middleware-location-constraint": "3.226.0", + "@aws-sdk/middleware-logger": "3.226.0", + "@aws-sdk/middleware-recursion-detection": "3.226.0", + "@aws-sdk/middleware-retry": "3.226.0", + "@aws-sdk/middleware-sdk-s3": "3.226.0", + "@aws-sdk/middleware-serde": "3.226.0", + "@aws-sdk/middleware-signing": "3.226.0", + "@aws-sdk/middleware-ssec": "3.226.0", + "@aws-sdk/middleware-stack": "3.226.0", + "@aws-sdk/middleware-user-agent": "3.226.0", + "@aws-sdk/node-config-provider": "3.226.0", + "@aws-sdk/node-http-handler": "3.226.0", + "@aws-sdk/protocol-http": "3.226.0", + "@aws-sdk/signature-v4-multi-region": "3.226.0", + "@aws-sdk/smithy-client": "3.226.0", + "@aws-sdk/types": "3.226.0", + "@aws-sdk/url-parser": "3.226.0", + "@aws-sdk/util-base64": "3.208.0", + "@aws-sdk/util-body-length-browser": "3.188.0", + "@aws-sdk/util-body-length-node": "3.208.0", + "@aws-sdk/util-defaults-mode-browser": "3.226.0", + "@aws-sdk/util-defaults-mode-node": "3.226.0", + "@aws-sdk/util-endpoints": "3.226.0", + "@aws-sdk/util-stream-browser": "3.226.0", + "@aws-sdk/util-stream-node": "3.226.0", + "@aws-sdk/util-user-agent-browser": "3.226.0", + "@aws-sdk/util-user-agent-node": "3.226.0", + "@aws-sdk/util-utf8-browser": "3.188.0", + "@aws-sdk/util-utf8-node": "3.208.0", + "@aws-sdk/util-waiter": "3.226.0", + "@aws-sdk/xml-builder": "3.201.0", + "fast-xml-parser": "4.0.11", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-s3/node_modules/fast-xml-parser": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.0.11.tgz", + "integrity": "sha512-4aUg3aNRR/WjQAcpceODG1C3x3lFANXRo8+1biqfieHmg9pyMt7qB4lQV/Ta6sJCTbA5vfD8fnA8S54JATiFUA==", + "dependencies": { + "strnum": "^1.0.5" + }, + "bin": { + "fxparser": "src/cli/cli.js" + }, + "funding": { + "type": "paypal", + "url": "https://paypal.me/naturalintelligence" + } + }, + "node_modules/@aws-sdk/client-sso": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.226.0.tgz", + "integrity": "sha512-+Hl1YSLKrxPnQLijhWryI6uV8eKZIsUhvWlzFKx75kjxzjsC/jyk5zV59jnCu0SCCepXB8DKyLVa2WpH7iAHew==", + "dependencies": { + "@aws-crypto/sha256-browser": "2.0.0", + "@aws-crypto/sha256-js": "2.0.0", + "@aws-sdk/config-resolver": "3.226.0", + "@aws-sdk/fetch-http-handler": "3.226.0", + "@aws-sdk/hash-node": "3.226.0", + "@aws-sdk/invalid-dependency": "3.226.0", + "@aws-sdk/middleware-content-length": "3.226.0", + "@aws-sdk/middleware-endpoint": "3.226.0", + "@aws-sdk/middleware-host-header": "3.226.0", + "@aws-sdk/middleware-logger": "3.226.0", + "@aws-sdk/middleware-recursion-detection": "3.226.0", + "@aws-sdk/middleware-retry": "3.226.0", + "@aws-sdk/middleware-serde": "3.226.0", + "@aws-sdk/middleware-stack": "3.226.0", + "@aws-sdk/middleware-user-agent": "3.226.0", + "@aws-sdk/node-config-provider": "3.226.0", + "@aws-sdk/node-http-handler": "3.226.0", + "@aws-sdk/protocol-http": "3.226.0", + "@aws-sdk/smithy-client": "3.226.0", + "@aws-sdk/types": "3.226.0", + "@aws-sdk/url-parser": "3.226.0", + "@aws-sdk/util-base64": "3.208.0", + "@aws-sdk/util-body-length-browser": "3.188.0", + "@aws-sdk/util-body-length-node": "3.208.0", + "@aws-sdk/util-defaults-mode-browser": "3.226.0", + "@aws-sdk/util-defaults-mode-node": "3.226.0", + "@aws-sdk/util-endpoints": "3.226.0", + "@aws-sdk/util-user-agent-browser": "3.226.0", + "@aws-sdk/util-user-agent-node": "3.226.0", + "@aws-sdk/util-utf8-browser": "3.188.0", + "@aws-sdk/util-utf8-node": "3.208.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.226.0.tgz", + "integrity": "sha512-IKzAhL6RoPs7IZ/rJvekjedQ4oesazCO+Aqh9l2Xct+XY0MFBdh4amgg4t/8fjksfIzmJH48BZoNv5gVak6yRw==", + "dependencies": { + "@aws-crypto/sha256-browser": "2.0.0", + "@aws-crypto/sha256-js": "2.0.0", + "@aws-sdk/config-resolver": "3.226.0", + "@aws-sdk/fetch-http-handler": "3.226.0", + "@aws-sdk/hash-node": "3.226.0", + "@aws-sdk/invalid-dependency": "3.226.0", + "@aws-sdk/middleware-content-length": "3.226.0", + "@aws-sdk/middleware-endpoint": "3.226.0", + "@aws-sdk/middleware-host-header": "3.226.0", + "@aws-sdk/middleware-logger": "3.226.0", + "@aws-sdk/middleware-recursion-detection": "3.226.0", + "@aws-sdk/middleware-retry": "3.226.0", + "@aws-sdk/middleware-serde": "3.226.0", + "@aws-sdk/middleware-stack": "3.226.0", + "@aws-sdk/middleware-user-agent": "3.226.0", + "@aws-sdk/node-config-provider": "3.226.0", + "@aws-sdk/node-http-handler": "3.226.0", + "@aws-sdk/protocol-http": "3.226.0", + "@aws-sdk/smithy-client": "3.226.0", + "@aws-sdk/types": "3.226.0", + "@aws-sdk/url-parser": "3.226.0", + "@aws-sdk/util-base64": "3.208.0", + "@aws-sdk/util-body-length-browser": "3.188.0", + "@aws-sdk/util-body-length-node": "3.208.0", + "@aws-sdk/util-defaults-mode-browser": "3.226.0", + "@aws-sdk/util-defaults-mode-node": "3.226.0", + "@aws-sdk/util-endpoints": "3.226.0", + "@aws-sdk/util-user-agent-browser": "3.226.0", + "@aws-sdk/util-user-agent-node": "3.226.0", + "@aws-sdk/util-utf8-browser": "3.188.0", + "@aws-sdk/util-utf8-node": "3.208.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sts": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.226.0.tgz", + "integrity": "sha512-ZBlqRVbnHvvbkN5g56+mXltNybHNzgV69+2ARubQ8ge9U2qF/LweCmGqZnZLWqdGXwaB9IOvz5ZW2npyJh1X/A==", + "dependencies": { + "@aws-crypto/sha256-browser": "2.0.0", + "@aws-crypto/sha256-js": "2.0.0", + "@aws-sdk/config-resolver": "3.226.0", + "@aws-sdk/credential-provider-node": "3.226.0", + "@aws-sdk/fetch-http-handler": "3.226.0", + "@aws-sdk/hash-node": "3.226.0", + "@aws-sdk/invalid-dependency": "3.226.0", + "@aws-sdk/middleware-content-length": "3.226.0", + "@aws-sdk/middleware-endpoint": "3.226.0", + "@aws-sdk/middleware-host-header": "3.226.0", + "@aws-sdk/middleware-logger": "3.226.0", + "@aws-sdk/middleware-recursion-detection": "3.226.0", + "@aws-sdk/middleware-retry": "3.226.0", + "@aws-sdk/middleware-sdk-sts": "3.226.0", + "@aws-sdk/middleware-serde": "3.226.0", + "@aws-sdk/middleware-signing": "3.226.0", + "@aws-sdk/middleware-stack": "3.226.0", + "@aws-sdk/middleware-user-agent": "3.226.0", + "@aws-sdk/node-config-provider": "3.226.0", + "@aws-sdk/node-http-handler": "3.226.0", + "@aws-sdk/protocol-http": "3.226.0", + "@aws-sdk/smithy-client": "3.226.0", + "@aws-sdk/types": "3.226.0", + "@aws-sdk/url-parser": "3.226.0", + "@aws-sdk/util-base64": "3.208.0", + "@aws-sdk/util-body-length-browser": "3.188.0", + "@aws-sdk/util-body-length-node": "3.208.0", + "@aws-sdk/util-defaults-mode-browser": "3.226.0", + "@aws-sdk/util-defaults-mode-node": "3.226.0", + "@aws-sdk/util-endpoints": "3.226.0", + "@aws-sdk/util-user-agent-browser": "3.226.0", + "@aws-sdk/util-user-agent-node": "3.226.0", + "@aws-sdk/util-utf8-browser": "3.188.0", + "@aws-sdk/util-utf8-node": "3.208.0", + "fast-xml-parser": "4.0.11", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sts/node_modules/fast-xml-parser": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.0.11.tgz", + "integrity": "sha512-4aUg3aNRR/WjQAcpceODG1C3x3lFANXRo8+1biqfieHmg9pyMt7qB4lQV/Ta6sJCTbA5vfD8fnA8S54JATiFUA==", + "dependencies": { + "strnum": "^1.0.5" + }, + "bin": { + "fxparser": "src/cli/cli.js" + }, + "funding": { + "type": "paypal", + "url": "https://paypal.me/naturalintelligence" + } + }, + "node_modules/@aws-sdk/config-resolver": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.226.0.tgz", + "integrity": "sha512-0UWXtfnTT0OtnRP8jJodc8V7xAnWSqsh4RCRyV5uu3Z2Tv+xyW91GKxO+gOXoUP0hHu0lvBM9lYiMJcJWZYLYw==", + "dependencies": { + "@aws-sdk/signature-v4": "3.226.0", + "@aws-sdk/types": "3.226.0", + "@aws-sdk/util-config-provider": "3.208.0", + "@aws-sdk/util-middleware": "3.226.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-env": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.226.0.tgz", + "integrity": "sha512-sd8uK1ojbXxaZXlthzw/VXZwCPUtU3PjObOfr3Evj7MPIM2IH8h29foOlggx939MdLQGboJf9gKvLlvKDWtJRA==", + "dependencies": { + "@aws-sdk/property-provider": "3.226.0", + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-imds": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.226.0.tgz", + "integrity": "sha512-//z/COQm2AjYFI1Lb0wKHTQSrvLFTyuKLFQGPJsKS7DPoxGOCKB7hmYerlbl01IDoCxTdyL//TyyPxbZEOQD5Q==", + "dependencies": { + "@aws-sdk/node-config-provider": "3.226.0", + "@aws-sdk/property-provider": "3.226.0", + "@aws-sdk/types": "3.226.0", + "@aws-sdk/url-parser": "3.226.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.226.0.tgz", + "integrity": "sha512-Sj7SGl53qmKkD7wvgU0MSTyj8ho6A3tKVbadTHljVz60jiauTEM97Z1DIai6U3oPFVteaKqx7npc8ozeK6mKNg==", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.226.0", + "@aws-sdk/credential-provider-imds": "3.226.0", + "@aws-sdk/credential-provider-sso": "3.226.0", + "@aws-sdk/credential-provider-web-identity": "3.226.0", + "@aws-sdk/property-provider": "3.226.0", + "@aws-sdk/shared-ini-file-loader": "3.226.0", + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-node": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.226.0.tgz", + "integrity": "sha512-kuOeiVmlhSyMC1Eix0pqHmb4EmpbMHrTw+9ObZbQ2bRXy05Q9fLA6SVBcI01bI1KVh7Qqz9i8ojOY3A2zscjyA==", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.226.0", + "@aws-sdk/credential-provider-imds": "3.226.0", + "@aws-sdk/credential-provider-ini": "3.226.0", + "@aws-sdk/credential-provider-process": "3.226.0", + "@aws-sdk/credential-provider-sso": "3.226.0", + "@aws-sdk/credential-provider-web-identity": "3.226.0", + "@aws-sdk/property-provider": "3.226.0", + "@aws-sdk/shared-ini-file-loader": "3.226.0", + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-process": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.226.0.tgz", + "integrity": "sha512-iUDMdnrTvbvaCFhWwqyXrhvQ9+ojPqPqXhwZtY1X/Qaz+73S9gXBPJHZaZb2Ke0yKE1Ql3bJbKvmmxC/qLQMng==", + "dependencies": { + "@aws-sdk/property-provider": "3.226.0", + "@aws-sdk/shared-ini-file-loader": "3.226.0", + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.226.0.tgz", + "integrity": "sha512-QSBeyOIAus4/8u/DeAstE8w/zw+F7PQohdB8JFP/BPaCfc8uKue4UkqqvQWRfm4VSEnHeXt037MDopmCpd98Iw==", + "dependencies": { + "@aws-sdk/client-sso": "3.226.0", + "@aws-sdk/property-provider": "3.226.0", + "@aws-sdk/shared-ini-file-loader": "3.226.0", + "@aws-sdk/token-providers": "3.226.0", + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.226.0.tgz", + "integrity": "sha512-CCpv847rLB0SFOHz2igvUMFAzeT2fD3YnY4C8jltuJoEkn0ITn1Hlgt13nTJ5BUuvyti2mvyXZHmNzhMIMrIlw==", + "dependencies": { + "@aws-sdk/property-provider": "3.226.0", + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/eventstream-codec": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-codec/-/eventstream-codec-3.226.0.tgz", + "integrity": "sha512-6uPtR8vSwz3fqoZk9hrb6qBYdp3PJ22+JxV5Wimdesvow4kJXSgDQXIxEkxbv6SxB9tNRB4uJHD84RetHEi15Q==", + "dependencies": { + "@aws-crypto/crc32": "2.0.0", + "@aws-sdk/types": "3.226.0", + "@aws-sdk/util-hex-encoding": "3.201.0", + "tslib": "^2.3.1" + } + }, + "node_modules/@aws-sdk/eventstream-serde-browser": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-serde-browser/-/eventstream-serde-browser-3.226.0.tgz", + "integrity": "sha512-otYC5aZE9eJUqAlKpy8w0rPDQ1eKGvZPtgxWXmFYSO2lDVGfI1nBBNmdZ4MdHqNuQ7ucsKMQYF8BFJ65K2tYPA==", + "dependencies": { + "@aws-sdk/eventstream-serde-universal": "3.226.0", + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/eventstream-serde-config-resolver": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-3.226.0.tgz", + "integrity": "sha512-A56Gypg+lyEfA5cna+EUH9XTrj0SvRG1gwNW7lrUzviN36SeA/LFTUIOEjxVML3Lowy+EPAcrSZ67h6aepoAig==", + "dependencies": { + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/eventstream-serde-node": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-serde-node/-/eventstream-serde-node-3.226.0.tgz", + "integrity": "sha512-KWLnKkKDzI9RNkiK6OiSYpG/XjZfue6Bsp/vRG+H5z3fbXdHv4X2+iW+Efu2Kvn7jsUyUv82TCl57DyJ/HKYhQ==", + "dependencies": { + "@aws-sdk/eventstream-serde-universal": "3.226.0", + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/eventstream-serde-universal": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-serde-universal/-/eventstream-serde-universal-3.226.0.tgz", + "integrity": "sha512-Q8viYM1Sv90/yIUqyWNeG1GEvyVlAI3GIrInQcCMC+xT59jS+IKGy2y7ojCvSWXnhf5/HMXKcmG092QsqeKy0Q==", + "dependencies": { + "@aws-sdk/eventstream-codec": "3.226.0", + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/fetch-http-handler": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.226.0.tgz", + "integrity": "sha512-JewZPMNEBXfi1xVnRa7pVtK/zgZD8/lQ/YnD8pq79WuMa2cwyhDtr8oqCoqsPW+WJT5ScXoMtuHxN78l8eKWgg==", + "dependencies": { + "@aws-sdk/protocol-http": "3.226.0", + "@aws-sdk/querystring-builder": "3.226.0", + "@aws-sdk/types": "3.226.0", + "@aws-sdk/util-base64": "3.208.0", + "tslib": "^2.3.1" + } + }, + "node_modules/@aws-sdk/hash-blob-browser": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/hash-blob-browser/-/hash-blob-browser-3.226.0.tgz", + "integrity": "sha512-5DCvWE6L4xGoViEHyjcPFuUe1G2EtNx8TqswWaoaKgyasP/yuRm4H99Ra7rqIrjCcSTAGD9NVsUQvVVw1bGt9w==", + "dependencies": { + "@aws-sdk/chunked-blob-reader": "3.188.0", + "@aws-sdk/chunked-blob-reader-native": "3.208.0", + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + } + }, + "node_modules/@aws-sdk/hash-node": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/hash-node/-/hash-node-3.226.0.tgz", + "integrity": "sha512-MdlJhJ9/Espwd0+gUXdZRsHuostB2WxEVAszWxobP0FTT9PnicqnfK7ExmW+DUAc0ywxtEbR3e0UND65rlSTVw==", + "dependencies": { + "@aws-sdk/types": "3.226.0", + "@aws-sdk/util-buffer-from": "3.208.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/hash-stream-node": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/hash-stream-node/-/hash-stream-node-3.226.0.tgz", + "integrity": "sha512-cgNTGlF8SdHaQXtjEmuLXz2U8SLM2JDKtIVPku/lHTMsUsEn+fuv2C+h1f/hvd4aNw5t1zggym7sO1/h/rv56Q==", + "dependencies": { + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/invalid-dependency": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/invalid-dependency/-/invalid-dependency-3.226.0.tgz", + "integrity": "sha512-QXOYFmap8g9QzRjumcRCIo2GEZkdCwd7ePQW0OABWPhKHzlJ74vvBxywjU3s39EEBEluWXtZ7Iufg6GxZM4ifw==", + "dependencies": { + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + } + }, + "node_modules/@aws-sdk/is-array-buffer": { + "version": "3.201.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/is-array-buffer/-/is-array-buffer-3.201.0.tgz", + "integrity": "sha512-UPez5qLh3dNgt0DYnPD/q0mVJY84rA17QE26hVNOW3fAji8W2wrwrxdacWOxyXvlxWsVRcKmr+lay1MDqpAMfg==", + "dependencies": { + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/md5-js": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/md5-js/-/md5-js-3.226.0.tgz", + "integrity": "sha512-ENigJRNudqyh6xsch166SZ4gggHd3XzZJ8gkCU4CWPne04HcR3BkWSO774IuWooCHt8zkaEHKecPurRz6qR+Vw==", + "dependencies": { + "@aws-sdk/types": "3.226.0", + "@aws-sdk/util-utf8-browser": "3.188.0", + "@aws-sdk/util-utf8-node": "3.208.0", + "tslib": "^2.3.1" + } + }, + "node_modules/@aws-sdk/middleware-bucket-endpoint": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.226.0.tgz", + "integrity": "sha512-A1Vq5W2X7jgTfjqcKPmjoHohF0poP+9fxwL97fQMvzcwmjhtoCV3bLEpo6CGYx0pKPiSlRJXZkRwRPj2hDHDmA==", + "dependencies": { + "@aws-sdk/protocol-http": "3.226.0", + "@aws-sdk/types": "3.226.0", + "@aws-sdk/util-arn-parser": "3.208.0", + "@aws-sdk/util-config-provider": "3.208.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-content-length": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-3.226.0.tgz", + "integrity": "sha512-ksUzlHJN2JMuyavjA46a4sctvnrnITqt2tbGGWWrAuXY1mel2j+VbgnmJUiwHKUO6bTFBBeft5Vd1TSOb4JmiA==", + "dependencies": { + "@aws-sdk/protocol-http": "3.226.0", + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-endpoint": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint/-/middleware-endpoint-3.226.0.tgz", + "integrity": "sha512-EvLFafjtUxTT0AC9p3aBQu1/fjhWdIeK58jIXaNFONfZ3F8QbEYUPuF/SqZvJM6cWfOO9qwYKkRDbCSTYhprIg==", + "dependencies": { + "@aws-sdk/middleware-serde": "3.226.0", + "@aws-sdk/protocol-http": "3.226.0", + "@aws-sdk/signature-v4": "3.226.0", + "@aws-sdk/types": "3.226.0", + "@aws-sdk/url-parser": "3.226.0", + "@aws-sdk/util-config-provider": "3.208.0", + "@aws-sdk/util-middleware": "3.226.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-expect-continue": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.226.0.tgz", + "integrity": "sha512-YxvQKTV/eA9P8AgW0hXOgj5Qa+TSnNFfyOkfeP089aP3f6p92b1cESf33TEOKsddive2mHT5LRCN6MuPcgWWrA==", + "dependencies": { + "@aws-sdk/protocol-http": "3.226.0", + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-flexible-checksums": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.226.0.tgz", + "integrity": "sha512-8A9Ot9A7794UP5tMGl2MnfTW/UM/jYy1wRWF9YkR/hPIcPb7OmE0hmlwIQGzb/7grxpYw66ETKf0WeH/41YfeQ==", + "dependencies": { + "@aws-crypto/crc32": "2.0.0", + "@aws-crypto/crc32c": "2.0.0", + "@aws-sdk/is-array-buffer": "3.201.0", + "@aws-sdk/protocol-http": "3.226.0", + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-host-header": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.226.0.tgz", + "integrity": "sha512-haVkWVh6BUPwKgWwkL6sDvTkcZWvJjv8AgC8jiQuSl8GLZdzHTB8Qhi3IsfFta9HAuoLjxheWBE5Z/L0UrfhLA==", + "dependencies": { + "@aws-sdk/protocol-http": "3.226.0", + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-location-constraint": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.226.0.tgz", + "integrity": "sha512-qHiYaBYPc2R37KxG2uqsUUwh4usrQMHfGkrpTUnx5d4rGzM3mC+muPsTpSHnAL63K2/yJOHQJFjss3GGwV4SSA==", + "dependencies": { + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-logger": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.226.0.tgz", + "integrity": "sha512-m9gtLrrYnpN6yckcQ09rV7ExWOLMuq8mMPF/K3DbL/YL0TuILu9i2T1W+JuxSX+K9FMG2HrLAKivE/kMLr55xA==", + "dependencies": { + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.226.0.tgz", + "integrity": "sha512-mwRbdKEUeuNH5TEkyZ5FWxp6bL2UC1WbY+LDv6YjHxmSMKpAoOueEdtU34PqDOLrpXXxIGHDFmjeGeMfktyEcA==", + "dependencies": { + "@aws-sdk/protocol-http": "3.226.0", + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-retry": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.226.0.tgz", + "integrity": "sha512-uMn4dSkv9Na2uvt6K3HgTnVrCRAlGv1MBAtUDLXONqUv1L/Z1fp3CkFkLKQHKylfBwBhe6dXfYEo87i8LZFoqg==", + "dependencies": { + "@aws-sdk/protocol-http": "3.226.0", + "@aws-sdk/service-error-classification": "3.226.0", + "@aws-sdk/types": "3.226.0", + "@aws-sdk/util-middleware": "3.226.0", + "tslib": "^2.3.1", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-retry/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@aws-sdk/middleware-sdk-s3": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.226.0.tgz", + "integrity": "sha512-sOFLFCnlN3kPgSI8C9mq/X3o6Oy4lIk4jz5kuB11zfvsm+YlIlxL4s06FkYqHsGDBH9hmh8dEuOxQ+YktyyeoA==", + "dependencies": { + "@aws-sdk/middleware-bucket-endpoint": "3.226.0", + "@aws-sdk/protocol-http": "3.226.0", + "@aws-sdk/types": "3.226.0", + "@aws-sdk/util-arn-parser": "3.208.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-sdk-sts": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.226.0.tgz", + "integrity": "sha512-NN9T/qoSD1kZvAT+VLny3NnlqgylYQcsgV3rvi/8lYzw/G/2s8VS6sm/VTWGGZhx08wZRv20MWzYu3bftcyqUg==", + "dependencies": { + "@aws-sdk/middleware-signing": "3.226.0", + "@aws-sdk/property-provider": "3.226.0", + "@aws-sdk/protocol-http": "3.226.0", + "@aws-sdk/signature-v4": "3.226.0", + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-serde": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-serde/-/middleware-serde-3.226.0.tgz", + "integrity": "sha512-nPuOOAkSfx9TxzdKFx0X2bDlinOxGrqD7iof926K/AEflxGD1DBdcaDdjlYlPDW2CVE8LV/rAgbYuLxh/E/1VA==", + "dependencies": { + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-signing": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.226.0.tgz", + "integrity": "sha512-E6HmtPcl+IjYDDzi1xI2HpCbBq2avNWcjvCriMZWuTAtRVpnA6XDDGW5GY85IfS3A8G8vuWqEVPr8JcYUcjfew==", + "dependencies": { + "@aws-sdk/property-provider": "3.226.0", + "@aws-sdk/protocol-http": "3.226.0", + "@aws-sdk/signature-v4": "3.226.0", + "@aws-sdk/types": "3.226.0", + "@aws-sdk/util-middleware": "3.226.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-ssec": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.226.0.tgz", + "integrity": "sha512-DR97oWoLHiMdaUP/wu99HtzG7/ijvCrjZGDH37WBO1rxFtEti6L7T09wgHzwxMN8gtL8FJA7dU8IrffGSC9VmA==", + "dependencies": { + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-stack": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-stack/-/middleware-stack-3.226.0.tgz", + "integrity": "sha512-85wF29LvPvpoed60fZGDYLwv1Zpd/cM0C22WSSFPw1SSJeqO4gtFYyCg2squfT3KI6kF43IIkOCJ+L7GtryPug==", + "dependencies": { + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.226.0.tgz", + "integrity": "sha512-N1WnfzCW1Y5yWhVAphf8OPGTe8Df3vmV7/LdsoQfmpkCZgLZeK2o0xITkUQhRj1mbw7yp8tVFLFV3R2lMurdAQ==", + "dependencies": { + "@aws-sdk/protocol-http": "3.226.0", + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/node-config-provider": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/node-config-provider/-/node-config-provider-3.226.0.tgz", + "integrity": "sha512-B8lQDqiRk7X5izFEUMXmi8CZLOKCTWQJU9HQf3ako+sF0gexo4nHN3jhoRWyLtcgC5S3on/2jxpAcqtm7kuY3w==", + "dependencies": { + "@aws-sdk/property-provider": "3.226.0", + "@aws-sdk/shared-ini-file-loader": "3.226.0", + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/node-http-handler": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-3.226.0.tgz", + "integrity": "sha512-xQCddnZNMiPmjr3W7HYM+f5ir4VfxgJh37eqZwX6EZmyItFpNNeVzKUgA920ka1VPz/ZUYB+2OFGiX3LCLkkaA==", + "dependencies": { + "@aws-sdk/abort-controller": "3.226.0", + "@aws-sdk/protocol-http": "3.226.0", + "@aws-sdk/querystring-builder": "3.226.0", + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/property-provider": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/property-provider/-/property-provider-3.226.0.tgz", + "integrity": "sha512-TsljjG+Sg0LmdgfiAlWohluWKnxB/k8xenjeozZfzOr5bHmNHtdbWv6BtNvD/R83hw7SFXxbJHlD5H4u9p2NFg==", + "dependencies": { + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/protocol-http": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.226.0.tgz", + "integrity": "sha512-zWkVqiTA9RXL6y0hhfZc9bcU4DX2NI6Hw9IhQmSPeM59mdbPjJlY4bLlMr5YxywqO3yQ/ylNoAfrEzrDjlOSRg==", + "dependencies": { + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/querystring-builder": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-builder/-/querystring-builder-3.226.0.tgz", + "integrity": "sha512-LVurypuNeotO4lmirKXRC4NYrZRAyMJXuwO0f2a5ZAUJCjauwYrifKue6yCfU7bls7gut7nfcR6B99WBYpHs3g==", + "dependencies": { + "@aws-sdk/types": "3.226.0", + "@aws-sdk/util-uri-escape": "3.201.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/querystring-parser": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-3.226.0.tgz", + "integrity": "sha512-FzB+VrQ47KAFxiPt2YXrKZ8AOLZQqGTLCKHzx4bjxGmwgsjV8yIbtJiJhZLMcUQV4LtGeIY9ixIqQhGvnZHE4A==", + "dependencies": { + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/service-error-classification": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/service-error-classification/-/service-error-classification-3.226.0.tgz", + "integrity": "sha512-9R01dBpE8JILe2CTft7YN2tMufT2mMWMTqxmHwPSmOpsxHTj8hEII7GTfvpb95ThHwW7XMNhg7pbHLbrTJZCVA==", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/shared-ini-file-loader": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.226.0.tgz", + "integrity": "sha512-661VQefsARxVyyV2FX9V61V+nNgImk7aN2hYlFKla6BCwZfMng+dEtD0xVGyg1PfRw0qvEv5LQyxMVgHcUSevA==", + "dependencies": { + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/signature-v4": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.226.0.tgz", + "integrity": "sha512-/R5q5agdPd7HJB68XMzpxrNPk158EHUvkFkuRu5Qf3kkkHebEzWEBlWoVpUe6ss4rP9Tqcue6xPuaftEmhjpYw==", + "dependencies": { + "@aws-sdk/is-array-buffer": "3.201.0", + "@aws-sdk/types": "3.226.0", + "@aws-sdk/util-hex-encoding": "3.201.0", + "@aws-sdk/util-middleware": "3.226.0", + "@aws-sdk/util-uri-escape": "3.201.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/signature-v4-multi-region": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.226.0.tgz", + "integrity": "sha512-QHxNuf9ynK208v7Y3imdsa3Cz8ynYV7ZOf3sBJdItuEtHN6uy/KxaOrtvpF8I5Hyn48Hc8z5miTSMujFKT7GEw==", + "dependencies": { + "@aws-sdk/protocol-http": "3.226.0", + "@aws-sdk/signature-v4": "3.226.0", + "@aws-sdk/types": "3.226.0", + "@aws-sdk/util-arn-parser": "3.208.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "@aws-sdk/signature-v4-crt": "^3.118.0" + }, + "peerDependenciesMeta": { + "@aws-sdk/signature-v4-crt": { + "optional": true + } + } + }, + "node_modules/@aws-sdk/smithy-client": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.226.0.tgz", + "integrity": "sha512-BWr1FhWSUhkSBp0TLzliD5AQBjA2Jmo9FlOOt+cBwd9BKkSGlGj+HgATYJ83Sjjg2+J6qvEZBxB78LKVHhorBw==", + "dependencies": { + "@aws-sdk/middleware-stack": "3.226.0", + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/token-providers": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.226.0.tgz", + "integrity": "sha512-3ouRt2i3ve8ivg54PxPhtOTcipzf6BoQsMw0EiO23yYKujhyeFH2IkxV4EYC687xFrUjheqJf8FWU/DD8EQ/ow==", + "dependencies": { + "@aws-sdk/client-sso-oidc": "3.226.0", + "@aws-sdk/property-provider": "3.226.0", + "@aws-sdk/shared-ini-file-loader": "3.226.0", + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/types": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.226.0.tgz", + "integrity": "sha512-MmmNHrWeO4man7wpOwrAhXlevqtOV9ZLcH4RhnG5LmRce0RFOApx24HoKENfFCcOyCm5LQBlsXCqi0dZWDWU0A==", + "dependencies": { + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/url-parser": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/url-parser/-/url-parser-3.226.0.tgz", + "integrity": "sha512-p5RLE0QWyP0OcTOLmFcLdVgUcUEzmEfmdrnOxyNzomcYb0p3vUagA5zfa1HVK2azsQJFBv28GfvMnba9bGhObg==", + "dependencies": { + "@aws-sdk/querystring-parser": "3.226.0", + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + } + }, + "node_modules/@aws-sdk/util-arn-parser": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.208.0.tgz", + "integrity": "sha512-QV4af+kscova9dv4VuHOgH8wEr/IIYHDGcnyVtkUEqahCejWr1Kuk+SBK0xMwnZY5LSycOtQ8aeqHOn9qOjZtA==", + "dependencies": { + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-base64": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64/-/util-base64-3.208.0.tgz", + "integrity": "sha512-PQniZph5A6N7uuEOQi+1hnMz/FSOK/8kMFyFO+4DgA1dZ5pcKcn5wiFwHkcTb/BsgVqQa3Jx0VHNnvhlS8JyTg==", + "dependencies": { + "@aws-sdk/util-buffer-from": "3.208.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-body-length-browser": { + "version": "3.188.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-browser/-/util-body-length-browser-3.188.0.tgz", + "integrity": "sha512-8VpnwFWXhnZ/iRSl9mTf+VKOX9wDE8QtN4bj9pBfxwf90H1X7E8T6NkiZD3k+HubYf2J94e7DbeHs7fuCPW5Qg==", + "dependencies": { + "tslib": "^2.3.1" + } + }, + "node_modules/@aws-sdk/util-body-length-node": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-node/-/util-body-length-node-3.208.0.tgz", + "integrity": "sha512-3zj50e5g7t/MQf53SsuuSf0hEELzMtD8RX8C76f12OSRo2Bca4FLLYHe0TZbxcfQHom8/hOaeZEyTyMogMglqg==", + "dependencies": { + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-buffer-from": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-buffer-from/-/util-buffer-from-3.208.0.tgz", + "integrity": "sha512-7L0XUixNEFcLUGPeBF35enCvB9Xl+K6SQsmbrPk1P3mlV9mguWSDQqbOBwY1Ir0OVbD6H/ZOQU7hI/9RtRI0Zw==", + "dependencies": { + "@aws-sdk/is-array-buffer": "3.201.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-config-provider": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-config-provider/-/util-config-provider-3.208.0.tgz", + "integrity": "sha512-DSRqwrERUsT34ug+anlMBIFooBEGwM8GejC7q00Y/9IPrQy50KnG5PW2NiTjuLKNi7pdEOlwTSEocJE15eDZIg==", + "dependencies": { + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-defaults-mode-browser": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.226.0.tgz", + "integrity": "sha512-chLx+6AeMSjuPsCVbI1B4Pg3jftjjcsuTsJucjo0DKBb1VSWqPCitmOILQVvKiA2Km8TSs3VcbUuOCyDExkzAg==", + "dependencies": { + "@aws-sdk/property-provider": "3.226.0", + "@aws-sdk/types": "3.226.0", + "bowser": "^2.11.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/util-defaults-mode-node": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.226.0.tgz", + "integrity": "sha512-Zr0AEj6g8gqiOhr31Pa2tdOFdPQciaAUCg3Uj/eH0znNBdVoptCj67oCW/I5v4pY4ZLZtGhr3uuoxDJH2MB3yg==", + "dependencies": { + "@aws-sdk/config-resolver": "3.226.0", + "@aws-sdk/credential-provider-imds": "3.226.0", + "@aws-sdk/node-config-provider": "3.226.0", + "@aws-sdk/property-provider": "3.226.0", + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/util-endpoints": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.226.0.tgz", + "integrity": "sha512-iqOkac/zLmyPBUJd7SLN0PeZMkOmlGgD5PHmmekTClOkce2eUjK9SNX1PzL73aXPoPTyhg9QGLH8uEZEQ8YUzg==", + "dependencies": { + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-hex-encoding": { + "version": "3.201.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.201.0.tgz", + "integrity": "sha512-7t1vR1pVxKx0motd3X9rI3m/xNp78p3sHtP5yo4NP4ARpxyJ0fokBomY8ScaH2D/B+U5o9ARxldJUdMqyBlJcA==", + "dependencies": { + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-locate-window": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.208.0.tgz", + "integrity": "sha512-iua1A2+P7JJEDHVgvXrRJSvsnzG7stYSGQnBVphIUlemwl6nN5D+QrgbjECtrbxRz8asYFHSzhdhECqN+tFiBg==", + "dependencies": { + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-middleware": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-middleware/-/util-middleware-3.226.0.tgz", + "integrity": "sha512-B96CQnwX4gRvQdaQkdUtqvDPkrptV5+va6FVeJOocU/DbSYMAScLxtR3peMS8cnlOT6nL1Eoa42OI9AfZz1VwQ==", + "dependencies": { + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-stream-browser": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-stream-browser/-/util-stream-browser-3.226.0.tgz", + "integrity": "sha512-ZvjlA1ySaLd0DqUWTKmL7LsxfPhroAONpzsinaHmw9aZVL40s2cADU9eWgBdHTuAOeFklL7NP0cc6UiTFHKe8g==", + "dependencies": { + "@aws-sdk/fetch-http-handler": "3.226.0", + "@aws-sdk/types": "3.226.0", + "@aws-sdk/util-base64": "3.208.0", + "@aws-sdk/util-hex-encoding": "3.201.0", + "@aws-sdk/util-utf8-browser": "3.188.0", + "tslib": "^2.3.1" + } + }, + "node_modules/@aws-sdk/util-stream-node": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-stream-node/-/util-stream-node-3.226.0.tgz", + "integrity": "sha512-HADXiIgDGoXcCLSKuPnjCLENf0iC0lzqqnymZu9H2FoACZhJB7DvJ9LnP51Pvw9lfCu+yvLzbMqSPdbXtMbRWg==", + "dependencies": { + "@aws-sdk/node-http-handler": "3.226.0", + "@aws-sdk/types": "3.226.0", + "@aws-sdk/util-buffer-from": "3.208.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-uri-escape": { + "version": "3.201.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-uri-escape/-/util-uri-escape-3.201.0.tgz", + "integrity": "sha512-TeTWbGx4LU2c5rx0obHeDFeO9HvwYwQtMh1yniBz00pQb6Qt6YVOETVQikRZ+XRQwEyCg/dA375UplIpiy54mA==", + "dependencies": { + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.226.0.tgz", + "integrity": "sha512-PhBIu2h6sPJPcv2I7ELfFizdl5pNiL4LfxrasMCYXQkJvVnoXztHA1x+CQbXIdtZOIlpjC+6BjDcE0uhnpvfcA==", + "dependencies": { + "@aws-sdk/types": "3.226.0", + "bowser": "^2.11.0", + "tslib": "^2.3.1" + } + }, + "node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.226.0.tgz", + "integrity": "sha512-othPc5Dz/pkYkxH+nZPhc1Al0HndQT8zHD4e9h+EZ+8lkd8n+IsnLfTS/mSJWrfiC6UlNRVw55cItstmJyMe/A==", + "dependencies": { + "@aws-sdk/node-config-provider": "3.226.0", + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } + } + }, + "node_modules/@aws-sdk/util-utf8-browser": { + "version": "3.188.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.188.0.tgz", + "integrity": "sha512-jt627x0+jE+Ydr9NwkFstg3cUvgWh56qdaqAMDsqgRlKD21md/6G226z/Qxl7lb1VEW2LlmCx43ai/37Qwcj2Q==", + "dependencies": { + "tslib": "^2.3.1" + } + }, + "node_modules/@aws-sdk/util-utf8-node": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-node/-/util-utf8-node-3.208.0.tgz", + "integrity": "sha512-jKY87Acv0yWBdFxx6bveagy5FYjz+dtV8IPT7ay1E2WPWH1czoIdMAkc8tSInK31T6CRnHWkLZ1qYwCbgRfERQ==", + "dependencies": { + "@aws-sdk/util-buffer-from": "3.208.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-waiter": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-waiter/-/util-waiter-3.226.0.tgz", + "integrity": "sha512-qYQMRxnu5k8qQihJXoIWMkBOj0+XkHHj/drLdbRnwL6ni6NcG8++cs9M3DSjIcxmxgF/7SLpDjn1H3sC7cYo4g==", + "dependencies": { + "@aws-sdk/abort-controller": "3.226.0", + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/xml-builder": { + "version": "3.201.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.201.0.tgz", + "integrity": "sha512-brRdB1wwMgjWEnOQsv7zSUhIQuh7DEicrfslAqHop4S4FtSI3GQAShpQqgOpMTNFYcpaWKmE/Y1MJmNY7xLCnw==", + "dependencies": { + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/@discordjs/collection": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-0.1.6.tgz", @@ -348,25 +1673,6 @@ "node": ">= 4.5.0" } }, - "node_modules/aws-sdk": { - "version": "2.1030.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1030.0.tgz", - "integrity": "sha512-to0STOb8DsSGuSsUb/WCbg/UFnMGfIYavnJH5ZlRCHzvCFjTyR+vfE8ku+qIZvfFM4+5MNTQC/Oxfun2X/TuyA==", - "dependencies": { - "buffer": "4.9.2", - "events": "1.1.1", - "ieee754": "1.1.13", - "jmespath": "0.15.0", - "querystring": "0.2.0", - "sax": "1.2.1", - "url": "0.10.3", - "uuid": "3.3.2", - "xml2js": "0.4.19" - }, - "engines": { - "node": ">= 10.0.0" - } - }, "node_modules/aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", @@ -592,6 +1898,11 @@ "node": ">= 0.8" } }, + "node_modules/bowser": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", + "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==" + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -674,16 +1985,6 @@ "ieee754": "^1.1.13" } }, - "node_modules/buffer": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", - "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", - "dependencies": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - } - }, "node_modules/buffer-equal-constant-time": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", @@ -1725,14 +3026,6 @@ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" }, - "node_modules/events": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", - "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", - "engines": { - "node": ">=0.4.x" - } - }, "node_modules/expand-brackets": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", @@ -3177,14 +4470,6 @@ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" }, - "node_modules/jmespath": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.15.0.tgz", - "integrity": "sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc=", - "engines": { - "node": ">= 0.6.0" - } - }, "node_modules/js-sdsl": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-2.1.4.tgz", @@ -4571,15 +5856,6 @@ "node": ">=0.6" } }, - "node_modules/querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", - "engines": { - "node": ">=0.4.x" - } - }, "node_modules/querystringify": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", @@ -5772,6 +7048,11 @@ "tree-kill": "cli.js" } }, + "node_modules/tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" + }, "node_modules/tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -5985,15 +7266,6 @@ "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", "deprecated": "Please see https://github.com/lydell/urix#deprecated" }, - "node_modules/url": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", - "integrity": "sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ=", - "dependencies": { - "punycode": "1.3.2", - "querystring": "0.2.0" - } - }, "node_modules/url-join": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", @@ -6013,11 +7285,6 @@ "resolved": "https://registry.npmjs.org/url-template/-/url-template-2.0.8.tgz", "integrity": "sha1-/FZaPMy/93MMd19WQflVV5FDnyE=" }, - "node_modules/url/node_modules/punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" - }, "node_modules/use": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", @@ -6466,6 +7733,1119 @@ } }, "dependencies": { + "@aws-crypto/crc32": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-2.0.0.tgz", + "integrity": "sha512-TvE1r2CUueyXOuHdEigYjIZVesInd9KN+K/TFFNfkkxRThiNxO6i4ZqqAVMoEjAamZZ1AA8WXJkjCz7YShHPQA==", + "requires": { + "@aws-crypto/util": "^2.0.0", + "@aws-sdk/types": "^3.1.0", + "tslib": "^1.11.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "@aws-crypto/crc32c": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/crc32c/-/crc32c-2.0.0.tgz", + "integrity": "sha512-vF0eMdMHx3O3MoOXUfBZry8Y4ZDtcuskjjKgJz8YfIDjLStxTZrYXk+kZqtl6A0uCmmiN/Eb/JbC/CndTV1MHg==", + "requires": { + "@aws-crypto/util": "^2.0.0", + "@aws-sdk/types": "^3.1.0", + "tslib": "^1.11.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "@aws-crypto/ie11-detection": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-2.0.2.tgz", + "integrity": "sha512-5XDMQY98gMAf/WRTic5G++jfmS/VLM0rwpiOpaainKi4L0nqWMSB1SzsrEG5rjFZGYN6ZAefO+/Yta2dFM0kMw==", + "requires": { + "tslib": "^1.11.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "@aws-crypto/sha1-browser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha1-browser/-/sha1-browser-2.0.0.tgz", + "integrity": "sha512-3fIVRjPFY8EG5HWXR+ZJZMdWNRpwbxGzJ9IH9q93FpbgCH8u8GHRi46mZXp3cYD7gealmyqpm3ThZwLKJjWJhA==", + "requires": { + "@aws-crypto/ie11-detection": "^2.0.0", + "@aws-crypto/supports-web-crypto": "^2.0.0", + "@aws-sdk/types": "^3.1.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "@aws-crypto/sha256-browser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-2.0.0.tgz", + "integrity": "sha512-rYXOQ8BFOaqMEHJrLHul/25ckWH6GTJtdLSajhlqGMx0PmSueAuvboCuZCTqEKlxR8CQOwRarxYMZZSYlhRA1A==", + "requires": { + "@aws-crypto/ie11-detection": "^2.0.0", + "@aws-crypto/sha256-js": "^2.0.0", + "@aws-crypto/supports-web-crypto": "^2.0.0", + "@aws-crypto/util": "^2.0.0", + "@aws-sdk/types": "^3.1.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "@aws-crypto/sha256-js": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-2.0.0.tgz", + "integrity": "sha512-VZY+mCY4Nmrs5WGfitmNqXzaE873fcIZDu54cbaDaaamsaTOP1DBImV9F4pICc3EHjQXujyE8jig+PFCaew9ig==", + "requires": { + "@aws-crypto/util": "^2.0.0", + "@aws-sdk/types": "^3.1.0", + "tslib": "^1.11.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "@aws-crypto/supports-web-crypto": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-2.0.2.tgz", + "integrity": "sha512-6mbSsLHwZ99CTOOswvCRP3C+VCWnzBf+1SnbWxzzJ9lR0mA0JnY2JEAhp8rqmTE0GPFy88rrM27ffgp62oErMQ==", + "requires": { + "tslib": "^1.11.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "@aws-crypto/util": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-2.0.2.tgz", + "integrity": "sha512-Lgu5v/0e/BcrZ5m/IWqzPUf3UYFTy/PpeED+uc9SWUR1iZQL8XXbGQg10UfllwwBryO3hFF5dizK+78aoXC1eA==", + "requires": { + "@aws-sdk/types": "^3.110.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "@aws-sdk/abort-controller": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/abort-controller/-/abort-controller-3.226.0.tgz", + "integrity": "sha512-cJVzr1xxPBd08voknXvR0RLgtZKGKt6WyDpH/BaPCu3rfSqWCDZKzwqe940eqosjmKrxC6pUZNKASIqHOQ8xxQ==", + "requires": { + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/chunked-blob-reader": { + "version": "3.188.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/chunked-blob-reader/-/chunked-blob-reader-3.188.0.tgz", + "integrity": "sha512-zkPRFZZPL3eH+kH86LDYYXImiClA1/sW60zYOjse9Pgka+eDJlvBN6hcYxwDEKjcwATYiSRR1aVQHcfCinlGXg==", + "requires": { + "tslib": "^2.3.1" + } + }, + "@aws-sdk/chunked-blob-reader-native": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/chunked-blob-reader-native/-/chunked-blob-reader-native-3.208.0.tgz", + "integrity": "sha512-JeOZ95PW+fJ6bbuqPySYqLqHk1n4+4ueEEraJsiUrPBV0S1ZtyvOGHcnGztKUjr2PYNaiexmpWuvUve9K12HRA==", + "requires": { + "@aws-sdk/util-base64": "3.208.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/client-s3": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.226.0.tgz", + "integrity": "sha512-N8S0i5txBqlTY30IHaWgi15HUPzdWpQVX01zfYoHU80HmxKBRhqrefIrmCbn/121br0B+MysgpgdfiSfhyHkLw==", + "requires": { + "@aws-crypto/sha1-browser": "2.0.0", + "@aws-crypto/sha256-browser": "2.0.0", + "@aws-crypto/sha256-js": "2.0.0", + "@aws-sdk/client-sts": "3.226.0", + "@aws-sdk/config-resolver": "3.226.0", + "@aws-sdk/credential-provider-node": "3.226.0", + "@aws-sdk/eventstream-serde-browser": "3.226.0", + "@aws-sdk/eventstream-serde-config-resolver": "3.226.0", + "@aws-sdk/eventstream-serde-node": "3.226.0", + "@aws-sdk/fetch-http-handler": "3.226.0", + "@aws-sdk/hash-blob-browser": "3.226.0", + "@aws-sdk/hash-node": "3.226.0", + "@aws-sdk/hash-stream-node": "3.226.0", + "@aws-sdk/invalid-dependency": "3.226.0", + "@aws-sdk/md5-js": "3.226.0", + "@aws-sdk/middleware-bucket-endpoint": "3.226.0", + "@aws-sdk/middleware-content-length": "3.226.0", + "@aws-sdk/middleware-endpoint": "3.226.0", + "@aws-sdk/middleware-expect-continue": "3.226.0", + "@aws-sdk/middleware-flexible-checksums": "3.226.0", + "@aws-sdk/middleware-host-header": "3.226.0", + "@aws-sdk/middleware-location-constraint": "3.226.0", + "@aws-sdk/middleware-logger": "3.226.0", + "@aws-sdk/middleware-recursion-detection": "3.226.0", + "@aws-sdk/middleware-retry": "3.226.0", + "@aws-sdk/middleware-sdk-s3": "3.226.0", + "@aws-sdk/middleware-serde": "3.226.0", + "@aws-sdk/middleware-signing": "3.226.0", + "@aws-sdk/middleware-ssec": "3.226.0", + "@aws-sdk/middleware-stack": "3.226.0", + "@aws-sdk/middleware-user-agent": "3.226.0", + "@aws-sdk/node-config-provider": "3.226.0", + "@aws-sdk/node-http-handler": "3.226.0", + "@aws-sdk/protocol-http": "3.226.0", + "@aws-sdk/signature-v4-multi-region": "3.226.0", + "@aws-sdk/smithy-client": "3.226.0", + "@aws-sdk/types": "3.226.0", + "@aws-sdk/url-parser": "3.226.0", + "@aws-sdk/util-base64": "3.208.0", + "@aws-sdk/util-body-length-browser": "3.188.0", + "@aws-sdk/util-body-length-node": "3.208.0", + "@aws-sdk/util-defaults-mode-browser": "3.226.0", + "@aws-sdk/util-defaults-mode-node": "3.226.0", + "@aws-sdk/util-endpoints": "3.226.0", + "@aws-sdk/util-stream-browser": "3.226.0", + "@aws-sdk/util-stream-node": "3.226.0", + "@aws-sdk/util-user-agent-browser": "3.226.0", + "@aws-sdk/util-user-agent-node": "3.226.0", + "@aws-sdk/util-utf8-browser": "3.188.0", + "@aws-sdk/util-utf8-node": "3.208.0", + "@aws-sdk/util-waiter": "3.226.0", + "@aws-sdk/xml-builder": "3.201.0", + "fast-xml-parser": "4.0.11", + "tslib": "^2.3.1" + }, + "dependencies": { + "fast-xml-parser": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.0.11.tgz", + "integrity": "sha512-4aUg3aNRR/WjQAcpceODG1C3x3lFANXRo8+1biqfieHmg9pyMt7qB4lQV/Ta6sJCTbA5vfD8fnA8S54JATiFUA==", + "requires": { + "strnum": "^1.0.5" + } + } + } + }, + "@aws-sdk/client-sso": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.226.0.tgz", + "integrity": "sha512-+Hl1YSLKrxPnQLijhWryI6uV8eKZIsUhvWlzFKx75kjxzjsC/jyk5zV59jnCu0SCCepXB8DKyLVa2WpH7iAHew==", + "requires": { + "@aws-crypto/sha256-browser": "2.0.0", + "@aws-crypto/sha256-js": "2.0.0", + "@aws-sdk/config-resolver": "3.226.0", + "@aws-sdk/fetch-http-handler": "3.226.0", + "@aws-sdk/hash-node": "3.226.0", + "@aws-sdk/invalid-dependency": "3.226.0", + "@aws-sdk/middleware-content-length": "3.226.0", + "@aws-sdk/middleware-endpoint": "3.226.0", + "@aws-sdk/middleware-host-header": "3.226.0", + "@aws-sdk/middleware-logger": "3.226.0", + "@aws-sdk/middleware-recursion-detection": "3.226.0", + "@aws-sdk/middleware-retry": "3.226.0", + "@aws-sdk/middleware-serde": "3.226.0", + "@aws-sdk/middleware-stack": "3.226.0", + "@aws-sdk/middleware-user-agent": "3.226.0", + "@aws-sdk/node-config-provider": "3.226.0", + "@aws-sdk/node-http-handler": "3.226.0", + "@aws-sdk/protocol-http": "3.226.0", + "@aws-sdk/smithy-client": "3.226.0", + "@aws-sdk/types": "3.226.0", + "@aws-sdk/url-parser": "3.226.0", + "@aws-sdk/util-base64": "3.208.0", + "@aws-sdk/util-body-length-browser": "3.188.0", + "@aws-sdk/util-body-length-node": "3.208.0", + "@aws-sdk/util-defaults-mode-browser": "3.226.0", + "@aws-sdk/util-defaults-mode-node": "3.226.0", + "@aws-sdk/util-endpoints": "3.226.0", + "@aws-sdk/util-user-agent-browser": "3.226.0", + "@aws-sdk/util-user-agent-node": "3.226.0", + "@aws-sdk/util-utf8-browser": "3.188.0", + "@aws-sdk/util-utf8-node": "3.208.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/client-sso-oidc": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.226.0.tgz", + "integrity": "sha512-IKzAhL6RoPs7IZ/rJvekjedQ4oesazCO+Aqh9l2Xct+XY0MFBdh4amgg4t/8fjksfIzmJH48BZoNv5gVak6yRw==", + "requires": { + "@aws-crypto/sha256-browser": "2.0.0", + "@aws-crypto/sha256-js": "2.0.0", + "@aws-sdk/config-resolver": "3.226.0", + "@aws-sdk/fetch-http-handler": "3.226.0", + "@aws-sdk/hash-node": "3.226.0", + "@aws-sdk/invalid-dependency": "3.226.0", + "@aws-sdk/middleware-content-length": "3.226.0", + "@aws-sdk/middleware-endpoint": "3.226.0", + "@aws-sdk/middleware-host-header": "3.226.0", + "@aws-sdk/middleware-logger": "3.226.0", + "@aws-sdk/middleware-recursion-detection": "3.226.0", + "@aws-sdk/middleware-retry": "3.226.0", + "@aws-sdk/middleware-serde": "3.226.0", + "@aws-sdk/middleware-stack": "3.226.0", + "@aws-sdk/middleware-user-agent": "3.226.0", + "@aws-sdk/node-config-provider": "3.226.0", + "@aws-sdk/node-http-handler": "3.226.0", + "@aws-sdk/protocol-http": "3.226.0", + "@aws-sdk/smithy-client": "3.226.0", + "@aws-sdk/types": "3.226.0", + "@aws-sdk/url-parser": "3.226.0", + "@aws-sdk/util-base64": "3.208.0", + "@aws-sdk/util-body-length-browser": "3.188.0", + "@aws-sdk/util-body-length-node": "3.208.0", + "@aws-sdk/util-defaults-mode-browser": "3.226.0", + "@aws-sdk/util-defaults-mode-node": "3.226.0", + "@aws-sdk/util-endpoints": "3.226.0", + "@aws-sdk/util-user-agent-browser": "3.226.0", + "@aws-sdk/util-user-agent-node": "3.226.0", + "@aws-sdk/util-utf8-browser": "3.188.0", + "@aws-sdk/util-utf8-node": "3.208.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/client-sts": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.226.0.tgz", + "integrity": "sha512-ZBlqRVbnHvvbkN5g56+mXltNybHNzgV69+2ARubQ8ge9U2qF/LweCmGqZnZLWqdGXwaB9IOvz5ZW2npyJh1X/A==", + "requires": { + "@aws-crypto/sha256-browser": "2.0.0", + "@aws-crypto/sha256-js": "2.0.0", + "@aws-sdk/config-resolver": "3.226.0", + "@aws-sdk/credential-provider-node": "3.226.0", + "@aws-sdk/fetch-http-handler": "3.226.0", + "@aws-sdk/hash-node": "3.226.0", + "@aws-sdk/invalid-dependency": "3.226.0", + "@aws-sdk/middleware-content-length": "3.226.0", + "@aws-sdk/middleware-endpoint": "3.226.0", + "@aws-sdk/middleware-host-header": "3.226.0", + "@aws-sdk/middleware-logger": "3.226.0", + "@aws-sdk/middleware-recursion-detection": "3.226.0", + "@aws-sdk/middleware-retry": "3.226.0", + "@aws-sdk/middleware-sdk-sts": "3.226.0", + "@aws-sdk/middleware-serde": "3.226.0", + "@aws-sdk/middleware-signing": "3.226.0", + "@aws-sdk/middleware-stack": "3.226.0", + "@aws-sdk/middleware-user-agent": "3.226.0", + "@aws-sdk/node-config-provider": "3.226.0", + "@aws-sdk/node-http-handler": "3.226.0", + "@aws-sdk/protocol-http": "3.226.0", + "@aws-sdk/smithy-client": "3.226.0", + "@aws-sdk/types": "3.226.0", + "@aws-sdk/url-parser": "3.226.0", + "@aws-sdk/util-base64": "3.208.0", + "@aws-sdk/util-body-length-browser": "3.188.0", + "@aws-sdk/util-body-length-node": "3.208.0", + "@aws-sdk/util-defaults-mode-browser": "3.226.0", + "@aws-sdk/util-defaults-mode-node": "3.226.0", + "@aws-sdk/util-endpoints": "3.226.0", + "@aws-sdk/util-user-agent-browser": "3.226.0", + "@aws-sdk/util-user-agent-node": "3.226.0", + "@aws-sdk/util-utf8-browser": "3.188.0", + "@aws-sdk/util-utf8-node": "3.208.0", + "fast-xml-parser": "4.0.11", + "tslib": "^2.3.1" + }, + "dependencies": { + "fast-xml-parser": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.0.11.tgz", + "integrity": "sha512-4aUg3aNRR/WjQAcpceODG1C3x3lFANXRo8+1biqfieHmg9pyMt7qB4lQV/Ta6sJCTbA5vfD8fnA8S54JATiFUA==", + "requires": { + "strnum": "^1.0.5" + } + } + } + }, + "@aws-sdk/config-resolver": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.226.0.tgz", + "integrity": "sha512-0UWXtfnTT0OtnRP8jJodc8V7xAnWSqsh4RCRyV5uu3Z2Tv+xyW91GKxO+gOXoUP0hHu0lvBM9lYiMJcJWZYLYw==", + "requires": { + "@aws-sdk/signature-v4": "3.226.0", + "@aws-sdk/types": "3.226.0", + "@aws-sdk/util-config-provider": "3.208.0", + "@aws-sdk/util-middleware": "3.226.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/credential-provider-env": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.226.0.tgz", + "integrity": "sha512-sd8uK1ojbXxaZXlthzw/VXZwCPUtU3PjObOfr3Evj7MPIM2IH8h29foOlggx939MdLQGboJf9gKvLlvKDWtJRA==", + "requires": { + "@aws-sdk/property-provider": "3.226.0", + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/credential-provider-imds": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.226.0.tgz", + "integrity": "sha512-//z/COQm2AjYFI1Lb0wKHTQSrvLFTyuKLFQGPJsKS7DPoxGOCKB7hmYerlbl01IDoCxTdyL//TyyPxbZEOQD5Q==", + "requires": { + "@aws-sdk/node-config-provider": "3.226.0", + "@aws-sdk/property-provider": "3.226.0", + "@aws-sdk/types": "3.226.0", + "@aws-sdk/url-parser": "3.226.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/credential-provider-ini": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.226.0.tgz", + "integrity": "sha512-Sj7SGl53qmKkD7wvgU0MSTyj8ho6A3tKVbadTHljVz60jiauTEM97Z1DIai6U3oPFVteaKqx7npc8ozeK6mKNg==", + "requires": { + "@aws-sdk/credential-provider-env": "3.226.0", + "@aws-sdk/credential-provider-imds": "3.226.0", + "@aws-sdk/credential-provider-sso": "3.226.0", + "@aws-sdk/credential-provider-web-identity": "3.226.0", + "@aws-sdk/property-provider": "3.226.0", + "@aws-sdk/shared-ini-file-loader": "3.226.0", + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/credential-provider-node": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.226.0.tgz", + "integrity": "sha512-kuOeiVmlhSyMC1Eix0pqHmb4EmpbMHrTw+9ObZbQ2bRXy05Q9fLA6SVBcI01bI1KVh7Qqz9i8ojOY3A2zscjyA==", + "requires": { + "@aws-sdk/credential-provider-env": "3.226.0", + "@aws-sdk/credential-provider-imds": "3.226.0", + "@aws-sdk/credential-provider-ini": "3.226.0", + "@aws-sdk/credential-provider-process": "3.226.0", + "@aws-sdk/credential-provider-sso": "3.226.0", + "@aws-sdk/credential-provider-web-identity": "3.226.0", + "@aws-sdk/property-provider": "3.226.0", + "@aws-sdk/shared-ini-file-loader": "3.226.0", + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/credential-provider-process": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.226.0.tgz", + "integrity": "sha512-iUDMdnrTvbvaCFhWwqyXrhvQ9+ojPqPqXhwZtY1X/Qaz+73S9gXBPJHZaZb2Ke0yKE1Ql3bJbKvmmxC/qLQMng==", + "requires": { + "@aws-sdk/property-provider": "3.226.0", + "@aws-sdk/shared-ini-file-loader": "3.226.0", + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/credential-provider-sso": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.226.0.tgz", + "integrity": "sha512-QSBeyOIAus4/8u/DeAstE8w/zw+F7PQohdB8JFP/BPaCfc8uKue4UkqqvQWRfm4VSEnHeXt037MDopmCpd98Iw==", + "requires": { + "@aws-sdk/client-sso": "3.226.0", + "@aws-sdk/property-provider": "3.226.0", + "@aws-sdk/shared-ini-file-loader": "3.226.0", + "@aws-sdk/token-providers": "3.226.0", + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/credential-provider-web-identity": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.226.0.tgz", + "integrity": "sha512-CCpv847rLB0SFOHz2igvUMFAzeT2fD3YnY4C8jltuJoEkn0ITn1Hlgt13nTJ5BUuvyti2mvyXZHmNzhMIMrIlw==", + "requires": { + "@aws-sdk/property-provider": "3.226.0", + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/eventstream-codec": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-codec/-/eventstream-codec-3.226.0.tgz", + "integrity": "sha512-6uPtR8vSwz3fqoZk9hrb6qBYdp3PJ22+JxV5Wimdesvow4kJXSgDQXIxEkxbv6SxB9tNRB4uJHD84RetHEi15Q==", + "requires": { + "@aws-crypto/crc32": "2.0.0", + "@aws-sdk/types": "3.226.0", + "@aws-sdk/util-hex-encoding": "3.201.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/eventstream-serde-browser": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-serde-browser/-/eventstream-serde-browser-3.226.0.tgz", + "integrity": "sha512-otYC5aZE9eJUqAlKpy8w0rPDQ1eKGvZPtgxWXmFYSO2lDVGfI1nBBNmdZ4MdHqNuQ7ucsKMQYF8BFJ65K2tYPA==", + "requires": { + "@aws-sdk/eventstream-serde-universal": "3.226.0", + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/eventstream-serde-config-resolver": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-3.226.0.tgz", + "integrity": "sha512-A56Gypg+lyEfA5cna+EUH9XTrj0SvRG1gwNW7lrUzviN36SeA/LFTUIOEjxVML3Lowy+EPAcrSZ67h6aepoAig==", + "requires": { + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/eventstream-serde-node": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-serde-node/-/eventstream-serde-node-3.226.0.tgz", + "integrity": "sha512-KWLnKkKDzI9RNkiK6OiSYpG/XjZfue6Bsp/vRG+H5z3fbXdHv4X2+iW+Efu2Kvn7jsUyUv82TCl57DyJ/HKYhQ==", + "requires": { + "@aws-sdk/eventstream-serde-universal": "3.226.0", + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/eventstream-serde-universal": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-serde-universal/-/eventstream-serde-universal-3.226.0.tgz", + "integrity": "sha512-Q8viYM1Sv90/yIUqyWNeG1GEvyVlAI3GIrInQcCMC+xT59jS+IKGy2y7ojCvSWXnhf5/HMXKcmG092QsqeKy0Q==", + "requires": { + "@aws-sdk/eventstream-codec": "3.226.0", + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/fetch-http-handler": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.226.0.tgz", + "integrity": "sha512-JewZPMNEBXfi1xVnRa7pVtK/zgZD8/lQ/YnD8pq79WuMa2cwyhDtr8oqCoqsPW+WJT5ScXoMtuHxN78l8eKWgg==", + "requires": { + "@aws-sdk/protocol-http": "3.226.0", + "@aws-sdk/querystring-builder": "3.226.0", + "@aws-sdk/types": "3.226.0", + "@aws-sdk/util-base64": "3.208.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/hash-blob-browser": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/hash-blob-browser/-/hash-blob-browser-3.226.0.tgz", + "integrity": "sha512-5DCvWE6L4xGoViEHyjcPFuUe1G2EtNx8TqswWaoaKgyasP/yuRm4H99Ra7rqIrjCcSTAGD9NVsUQvVVw1bGt9w==", + "requires": { + "@aws-sdk/chunked-blob-reader": "3.188.0", + "@aws-sdk/chunked-blob-reader-native": "3.208.0", + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/hash-node": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/hash-node/-/hash-node-3.226.0.tgz", + "integrity": "sha512-MdlJhJ9/Espwd0+gUXdZRsHuostB2WxEVAszWxobP0FTT9PnicqnfK7ExmW+DUAc0ywxtEbR3e0UND65rlSTVw==", + "requires": { + "@aws-sdk/types": "3.226.0", + "@aws-sdk/util-buffer-from": "3.208.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/hash-stream-node": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/hash-stream-node/-/hash-stream-node-3.226.0.tgz", + "integrity": "sha512-cgNTGlF8SdHaQXtjEmuLXz2U8SLM2JDKtIVPku/lHTMsUsEn+fuv2C+h1f/hvd4aNw5t1zggym7sO1/h/rv56Q==", + "requires": { + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/invalid-dependency": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/invalid-dependency/-/invalid-dependency-3.226.0.tgz", + "integrity": "sha512-QXOYFmap8g9QzRjumcRCIo2GEZkdCwd7ePQW0OABWPhKHzlJ74vvBxywjU3s39EEBEluWXtZ7Iufg6GxZM4ifw==", + "requires": { + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/is-array-buffer": { + "version": "3.201.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/is-array-buffer/-/is-array-buffer-3.201.0.tgz", + "integrity": "sha512-UPez5qLh3dNgt0DYnPD/q0mVJY84rA17QE26hVNOW3fAji8W2wrwrxdacWOxyXvlxWsVRcKmr+lay1MDqpAMfg==", + "requires": { + "tslib": "^2.3.1" + } + }, + "@aws-sdk/md5-js": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/md5-js/-/md5-js-3.226.0.tgz", + "integrity": "sha512-ENigJRNudqyh6xsch166SZ4gggHd3XzZJ8gkCU4CWPne04HcR3BkWSO774IuWooCHt8zkaEHKecPurRz6qR+Vw==", + "requires": { + "@aws-sdk/types": "3.226.0", + "@aws-sdk/util-utf8-browser": "3.188.0", + "@aws-sdk/util-utf8-node": "3.208.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/middleware-bucket-endpoint": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.226.0.tgz", + "integrity": "sha512-A1Vq5W2X7jgTfjqcKPmjoHohF0poP+9fxwL97fQMvzcwmjhtoCV3bLEpo6CGYx0pKPiSlRJXZkRwRPj2hDHDmA==", + "requires": { + "@aws-sdk/protocol-http": "3.226.0", + "@aws-sdk/types": "3.226.0", + "@aws-sdk/util-arn-parser": "3.208.0", + "@aws-sdk/util-config-provider": "3.208.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/middleware-content-length": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-3.226.0.tgz", + "integrity": "sha512-ksUzlHJN2JMuyavjA46a4sctvnrnITqt2tbGGWWrAuXY1mel2j+VbgnmJUiwHKUO6bTFBBeft5Vd1TSOb4JmiA==", + "requires": { + "@aws-sdk/protocol-http": "3.226.0", + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/middleware-endpoint": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint/-/middleware-endpoint-3.226.0.tgz", + "integrity": "sha512-EvLFafjtUxTT0AC9p3aBQu1/fjhWdIeK58jIXaNFONfZ3F8QbEYUPuF/SqZvJM6cWfOO9qwYKkRDbCSTYhprIg==", + "requires": { + "@aws-sdk/middleware-serde": "3.226.0", + "@aws-sdk/protocol-http": "3.226.0", + "@aws-sdk/signature-v4": "3.226.0", + "@aws-sdk/types": "3.226.0", + "@aws-sdk/url-parser": "3.226.0", + "@aws-sdk/util-config-provider": "3.208.0", + "@aws-sdk/util-middleware": "3.226.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/middleware-expect-continue": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.226.0.tgz", + "integrity": "sha512-YxvQKTV/eA9P8AgW0hXOgj5Qa+TSnNFfyOkfeP089aP3f6p92b1cESf33TEOKsddive2mHT5LRCN6MuPcgWWrA==", + "requires": { + "@aws-sdk/protocol-http": "3.226.0", + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/middleware-flexible-checksums": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.226.0.tgz", + "integrity": "sha512-8A9Ot9A7794UP5tMGl2MnfTW/UM/jYy1wRWF9YkR/hPIcPb7OmE0hmlwIQGzb/7grxpYw66ETKf0WeH/41YfeQ==", + "requires": { + "@aws-crypto/crc32": "2.0.0", + "@aws-crypto/crc32c": "2.0.0", + "@aws-sdk/is-array-buffer": "3.201.0", + "@aws-sdk/protocol-http": "3.226.0", + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/middleware-host-header": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.226.0.tgz", + "integrity": "sha512-haVkWVh6BUPwKgWwkL6sDvTkcZWvJjv8AgC8jiQuSl8GLZdzHTB8Qhi3IsfFta9HAuoLjxheWBE5Z/L0UrfhLA==", + "requires": { + "@aws-sdk/protocol-http": "3.226.0", + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/middleware-location-constraint": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.226.0.tgz", + "integrity": "sha512-qHiYaBYPc2R37KxG2uqsUUwh4usrQMHfGkrpTUnx5d4rGzM3mC+muPsTpSHnAL63K2/yJOHQJFjss3GGwV4SSA==", + "requires": { + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/middleware-logger": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.226.0.tgz", + "integrity": "sha512-m9gtLrrYnpN6yckcQ09rV7ExWOLMuq8mMPF/K3DbL/YL0TuILu9i2T1W+JuxSX+K9FMG2HrLAKivE/kMLr55xA==", + "requires": { + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/middleware-recursion-detection": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.226.0.tgz", + "integrity": "sha512-mwRbdKEUeuNH5TEkyZ5FWxp6bL2UC1WbY+LDv6YjHxmSMKpAoOueEdtU34PqDOLrpXXxIGHDFmjeGeMfktyEcA==", + "requires": { + "@aws-sdk/protocol-http": "3.226.0", + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/middleware-retry": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.226.0.tgz", + "integrity": "sha512-uMn4dSkv9Na2uvt6K3HgTnVrCRAlGv1MBAtUDLXONqUv1L/Z1fp3CkFkLKQHKylfBwBhe6dXfYEo87i8LZFoqg==", + "requires": { + "@aws-sdk/protocol-http": "3.226.0", + "@aws-sdk/service-error-classification": "3.226.0", + "@aws-sdk/types": "3.226.0", + "@aws-sdk/util-middleware": "3.226.0", + "tslib": "^2.3.1", + "uuid": "^8.3.2" + }, + "dependencies": { + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" + } + } + }, + "@aws-sdk/middleware-sdk-s3": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.226.0.tgz", + "integrity": "sha512-sOFLFCnlN3kPgSI8C9mq/X3o6Oy4lIk4jz5kuB11zfvsm+YlIlxL4s06FkYqHsGDBH9hmh8dEuOxQ+YktyyeoA==", + "requires": { + "@aws-sdk/middleware-bucket-endpoint": "3.226.0", + "@aws-sdk/protocol-http": "3.226.0", + "@aws-sdk/types": "3.226.0", + "@aws-sdk/util-arn-parser": "3.208.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/middleware-sdk-sts": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.226.0.tgz", + "integrity": "sha512-NN9T/qoSD1kZvAT+VLny3NnlqgylYQcsgV3rvi/8lYzw/G/2s8VS6sm/VTWGGZhx08wZRv20MWzYu3bftcyqUg==", + "requires": { + "@aws-sdk/middleware-signing": "3.226.0", + "@aws-sdk/property-provider": "3.226.0", + "@aws-sdk/protocol-http": "3.226.0", + "@aws-sdk/signature-v4": "3.226.0", + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/middleware-serde": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-serde/-/middleware-serde-3.226.0.tgz", + "integrity": "sha512-nPuOOAkSfx9TxzdKFx0X2bDlinOxGrqD7iof926K/AEflxGD1DBdcaDdjlYlPDW2CVE8LV/rAgbYuLxh/E/1VA==", + "requires": { + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/middleware-signing": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.226.0.tgz", + "integrity": "sha512-E6HmtPcl+IjYDDzi1xI2HpCbBq2avNWcjvCriMZWuTAtRVpnA6XDDGW5GY85IfS3A8G8vuWqEVPr8JcYUcjfew==", + "requires": { + "@aws-sdk/property-provider": "3.226.0", + "@aws-sdk/protocol-http": "3.226.0", + "@aws-sdk/signature-v4": "3.226.0", + "@aws-sdk/types": "3.226.0", + "@aws-sdk/util-middleware": "3.226.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/middleware-ssec": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.226.0.tgz", + "integrity": "sha512-DR97oWoLHiMdaUP/wu99HtzG7/ijvCrjZGDH37WBO1rxFtEti6L7T09wgHzwxMN8gtL8FJA7dU8IrffGSC9VmA==", + "requires": { + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/middleware-stack": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-stack/-/middleware-stack-3.226.0.tgz", + "integrity": "sha512-85wF29LvPvpoed60fZGDYLwv1Zpd/cM0C22WSSFPw1SSJeqO4gtFYyCg2squfT3KI6kF43IIkOCJ+L7GtryPug==", + "requires": { + "tslib": "^2.3.1" + } + }, + "@aws-sdk/middleware-user-agent": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.226.0.tgz", + "integrity": "sha512-N1WnfzCW1Y5yWhVAphf8OPGTe8Df3vmV7/LdsoQfmpkCZgLZeK2o0xITkUQhRj1mbw7yp8tVFLFV3R2lMurdAQ==", + "requires": { + "@aws-sdk/protocol-http": "3.226.0", + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/node-config-provider": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/node-config-provider/-/node-config-provider-3.226.0.tgz", + "integrity": "sha512-B8lQDqiRk7X5izFEUMXmi8CZLOKCTWQJU9HQf3ako+sF0gexo4nHN3jhoRWyLtcgC5S3on/2jxpAcqtm7kuY3w==", + "requires": { + "@aws-sdk/property-provider": "3.226.0", + "@aws-sdk/shared-ini-file-loader": "3.226.0", + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/node-http-handler": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-3.226.0.tgz", + "integrity": "sha512-xQCddnZNMiPmjr3W7HYM+f5ir4VfxgJh37eqZwX6EZmyItFpNNeVzKUgA920ka1VPz/ZUYB+2OFGiX3LCLkkaA==", + "requires": { + "@aws-sdk/abort-controller": "3.226.0", + "@aws-sdk/protocol-http": "3.226.0", + "@aws-sdk/querystring-builder": "3.226.0", + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/property-provider": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/property-provider/-/property-provider-3.226.0.tgz", + "integrity": "sha512-TsljjG+Sg0LmdgfiAlWohluWKnxB/k8xenjeozZfzOr5bHmNHtdbWv6BtNvD/R83hw7SFXxbJHlD5H4u9p2NFg==", + "requires": { + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/protocol-http": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.226.0.tgz", + "integrity": "sha512-zWkVqiTA9RXL6y0hhfZc9bcU4DX2NI6Hw9IhQmSPeM59mdbPjJlY4bLlMr5YxywqO3yQ/ylNoAfrEzrDjlOSRg==", + "requires": { + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/querystring-builder": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-builder/-/querystring-builder-3.226.0.tgz", + "integrity": "sha512-LVurypuNeotO4lmirKXRC4NYrZRAyMJXuwO0f2a5ZAUJCjauwYrifKue6yCfU7bls7gut7nfcR6B99WBYpHs3g==", + "requires": { + "@aws-sdk/types": "3.226.0", + "@aws-sdk/util-uri-escape": "3.201.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/querystring-parser": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-3.226.0.tgz", + "integrity": "sha512-FzB+VrQ47KAFxiPt2YXrKZ8AOLZQqGTLCKHzx4bjxGmwgsjV8yIbtJiJhZLMcUQV4LtGeIY9ixIqQhGvnZHE4A==", + "requires": { + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/service-error-classification": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/service-error-classification/-/service-error-classification-3.226.0.tgz", + "integrity": "sha512-9R01dBpE8JILe2CTft7YN2tMufT2mMWMTqxmHwPSmOpsxHTj8hEII7GTfvpb95ThHwW7XMNhg7pbHLbrTJZCVA==" + }, + "@aws-sdk/shared-ini-file-loader": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.226.0.tgz", + "integrity": "sha512-661VQefsARxVyyV2FX9V61V+nNgImk7aN2hYlFKla6BCwZfMng+dEtD0xVGyg1PfRw0qvEv5LQyxMVgHcUSevA==", + "requires": { + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/signature-v4": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.226.0.tgz", + "integrity": "sha512-/R5q5agdPd7HJB68XMzpxrNPk158EHUvkFkuRu5Qf3kkkHebEzWEBlWoVpUe6ss4rP9Tqcue6xPuaftEmhjpYw==", + "requires": { + "@aws-sdk/is-array-buffer": "3.201.0", + "@aws-sdk/types": "3.226.0", + "@aws-sdk/util-hex-encoding": "3.201.0", + "@aws-sdk/util-middleware": "3.226.0", + "@aws-sdk/util-uri-escape": "3.201.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/signature-v4-multi-region": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.226.0.tgz", + "integrity": "sha512-QHxNuf9ynK208v7Y3imdsa3Cz8ynYV7ZOf3sBJdItuEtHN6uy/KxaOrtvpF8I5Hyn48Hc8z5miTSMujFKT7GEw==", + "requires": { + "@aws-sdk/protocol-http": "3.226.0", + "@aws-sdk/signature-v4": "3.226.0", + "@aws-sdk/types": "3.226.0", + "@aws-sdk/util-arn-parser": "3.208.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/smithy-client": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.226.0.tgz", + "integrity": "sha512-BWr1FhWSUhkSBp0TLzliD5AQBjA2Jmo9FlOOt+cBwd9BKkSGlGj+HgATYJ83Sjjg2+J6qvEZBxB78LKVHhorBw==", + "requires": { + "@aws-sdk/middleware-stack": "3.226.0", + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/token-providers": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.226.0.tgz", + "integrity": "sha512-3ouRt2i3ve8ivg54PxPhtOTcipzf6BoQsMw0EiO23yYKujhyeFH2IkxV4EYC687xFrUjheqJf8FWU/DD8EQ/ow==", + "requires": { + "@aws-sdk/client-sso-oidc": "3.226.0", + "@aws-sdk/property-provider": "3.226.0", + "@aws-sdk/shared-ini-file-loader": "3.226.0", + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/types": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.226.0.tgz", + "integrity": "sha512-MmmNHrWeO4man7wpOwrAhXlevqtOV9ZLcH4RhnG5LmRce0RFOApx24HoKENfFCcOyCm5LQBlsXCqi0dZWDWU0A==", + "requires": { + "tslib": "^2.3.1" + } + }, + "@aws-sdk/url-parser": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/url-parser/-/url-parser-3.226.0.tgz", + "integrity": "sha512-p5RLE0QWyP0OcTOLmFcLdVgUcUEzmEfmdrnOxyNzomcYb0p3vUagA5zfa1HVK2azsQJFBv28GfvMnba9bGhObg==", + "requires": { + "@aws-sdk/querystring-parser": "3.226.0", + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/util-arn-parser": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.208.0.tgz", + "integrity": "sha512-QV4af+kscova9dv4VuHOgH8wEr/IIYHDGcnyVtkUEqahCejWr1Kuk+SBK0xMwnZY5LSycOtQ8aeqHOn9qOjZtA==", + "requires": { + "tslib": "^2.3.1" + } + }, + "@aws-sdk/util-base64": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64/-/util-base64-3.208.0.tgz", + "integrity": "sha512-PQniZph5A6N7uuEOQi+1hnMz/FSOK/8kMFyFO+4DgA1dZ5pcKcn5wiFwHkcTb/BsgVqQa3Jx0VHNnvhlS8JyTg==", + "requires": { + "@aws-sdk/util-buffer-from": "3.208.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/util-body-length-browser": { + "version": "3.188.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-browser/-/util-body-length-browser-3.188.0.tgz", + "integrity": "sha512-8VpnwFWXhnZ/iRSl9mTf+VKOX9wDE8QtN4bj9pBfxwf90H1X7E8T6NkiZD3k+HubYf2J94e7DbeHs7fuCPW5Qg==", + "requires": { + "tslib": "^2.3.1" + } + }, + "@aws-sdk/util-body-length-node": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-node/-/util-body-length-node-3.208.0.tgz", + "integrity": "sha512-3zj50e5g7t/MQf53SsuuSf0hEELzMtD8RX8C76f12OSRo2Bca4FLLYHe0TZbxcfQHom8/hOaeZEyTyMogMglqg==", + "requires": { + "tslib": "^2.3.1" + } + }, + "@aws-sdk/util-buffer-from": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-buffer-from/-/util-buffer-from-3.208.0.tgz", + "integrity": "sha512-7L0XUixNEFcLUGPeBF35enCvB9Xl+K6SQsmbrPk1P3mlV9mguWSDQqbOBwY1Ir0OVbD6H/ZOQU7hI/9RtRI0Zw==", + "requires": { + "@aws-sdk/is-array-buffer": "3.201.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/util-config-provider": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-config-provider/-/util-config-provider-3.208.0.tgz", + "integrity": "sha512-DSRqwrERUsT34ug+anlMBIFooBEGwM8GejC7q00Y/9IPrQy50KnG5PW2NiTjuLKNi7pdEOlwTSEocJE15eDZIg==", + "requires": { + "tslib": "^2.3.1" + } + }, + "@aws-sdk/util-defaults-mode-browser": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.226.0.tgz", + "integrity": "sha512-chLx+6AeMSjuPsCVbI1B4Pg3jftjjcsuTsJucjo0DKBb1VSWqPCitmOILQVvKiA2Km8TSs3VcbUuOCyDExkzAg==", + "requires": { + "@aws-sdk/property-provider": "3.226.0", + "@aws-sdk/types": "3.226.0", + "bowser": "^2.11.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/util-defaults-mode-node": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.226.0.tgz", + "integrity": "sha512-Zr0AEj6g8gqiOhr31Pa2tdOFdPQciaAUCg3Uj/eH0znNBdVoptCj67oCW/I5v4pY4ZLZtGhr3uuoxDJH2MB3yg==", + "requires": { + "@aws-sdk/config-resolver": "3.226.0", + "@aws-sdk/credential-provider-imds": "3.226.0", + "@aws-sdk/node-config-provider": "3.226.0", + "@aws-sdk/property-provider": "3.226.0", + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/util-endpoints": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.226.0.tgz", + "integrity": "sha512-iqOkac/zLmyPBUJd7SLN0PeZMkOmlGgD5PHmmekTClOkce2eUjK9SNX1PzL73aXPoPTyhg9QGLH8uEZEQ8YUzg==", + "requires": { + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/util-hex-encoding": { + "version": "3.201.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.201.0.tgz", + "integrity": "sha512-7t1vR1pVxKx0motd3X9rI3m/xNp78p3sHtP5yo4NP4ARpxyJ0fokBomY8ScaH2D/B+U5o9ARxldJUdMqyBlJcA==", + "requires": { + "tslib": "^2.3.1" + } + }, + "@aws-sdk/util-locate-window": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.208.0.tgz", + "integrity": "sha512-iua1A2+P7JJEDHVgvXrRJSvsnzG7stYSGQnBVphIUlemwl6nN5D+QrgbjECtrbxRz8asYFHSzhdhECqN+tFiBg==", + "requires": { + "tslib": "^2.3.1" + } + }, + "@aws-sdk/util-middleware": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-middleware/-/util-middleware-3.226.0.tgz", + "integrity": "sha512-B96CQnwX4gRvQdaQkdUtqvDPkrptV5+va6FVeJOocU/DbSYMAScLxtR3peMS8cnlOT6nL1Eoa42OI9AfZz1VwQ==", + "requires": { + "tslib": "^2.3.1" + } + }, + "@aws-sdk/util-stream-browser": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-stream-browser/-/util-stream-browser-3.226.0.tgz", + "integrity": "sha512-ZvjlA1ySaLd0DqUWTKmL7LsxfPhroAONpzsinaHmw9aZVL40s2cADU9eWgBdHTuAOeFklL7NP0cc6UiTFHKe8g==", + "requires": { + "@aws-sdk/fetch-http-handler": "3.226.0", + "@aws-sdk/types": "3.226.0", + "@aws-sdk/util-base64": "3.208.0", + "@aws-sdk/util-hex-encoding": "3.201.0", + "@aws-sdk/util-utf8-browser": "3.188.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/util-stream-node": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-stream-node/-/util-stream-node-3.226.0.tgz", + "integrity": "sha512-HADXiIgDGoXcCLSKuPnjCLENf0iC0lzqqnymZu9H2FoACZhJB7DvJ9LnP51Pvw9lfCu+yvLzbMqSPdbXtMbRWg==", + "requires": { + "@aws-sdk/node-http-handler": "3.226.0", + "@aws-sdk/types": "3.226.0", + "@aws-sdk/util-buffer-from": "3.208.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/util-uri-escape": { + "version": "3.201.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-uri-escape/-/util-uri-escape-3.201.0.tgz", + "integrity": "sha512-TeTWbGx4LU2c5rx0obHeDFeO9HvwYwQtMh1yniBz00pQb6Qt6YVOETVQikRZ+XRQwEyCg/dA375UplIpiy54mA==", + "requires": { + "tslib": "^2.3.1" + } + }, + "@aws-sdk/util-user-agent-browser": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.226.0.tgz", + "integrity": "sha512-PhBIu2h6sPJPcv2I7ELfFizdl5pNiL4LfxrasMCYXQkJvVnoXztHA1x+CQbXIdtZOIlpjC+6BjDcE0uhnpvfcA==", + "requires": { + "@aws-sdk/types": "3.226.0", + "bowser": "^2.11.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/util-user-agent-node": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.226.0.tgz", + "integrity": "sha512-othPc5Dz/pkYkxH+nZPhc1Al0HndQT8zHD4e9h+EZ+8lkd8n+IsnLfTS/mSJWrfiC6UlNRVw55cItstmJyMe/A==", + "requires": { + "@aws-sdk/node-config-provider": "3.226.0", + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/util-utf8-browser": { + "version": "3.188.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.188.0.tgz", + "integrity": "sha512-jt627x0+jE+Ydr9NwkFstg3cUvgWh56qdaqAMDsqgRlKD21md/6G226z/Qxl7lb1VEW2LlmCx43ai/37Qwcj2Q==", + "requires": { + "tslib": "^2.3.1" + } + }, + "@aws-sdk/util-utf8-node": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-node/-/util-utf8-node-3.208.0.tgz", + "integrity": "sha512-jKY87Acv0yWBdFxx6bveagy5FYjz+dtV8IPT7ay1E2WPWH1czoIdMAkc8tSInK31T6CRnHWkLZ1qYwCbgRfERQ==", + "requires": { + "@aws-sdk/util-buffer-from": "3.208.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/util-waiter": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-waiter/-/util-waiter-3.226.0.tgz", + "integrity": "sha512-qYQMRxnu5k8qQihJXoIWMkBOj0+XkHHj/drLdbRnwL6ni6NcG8++cs9M3DSjIcxmxgF/7SLpDjn1H3sC7cYo4g==", + "requires": { + "@aws-sdk/abort-controller": "3.226.0", + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/xml-builder": { + "version": "3.201.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.201.0.tgz", + "integrity": "sha512-brRdB1wwMgjWEnOQsv7zSUhIQuh7DEicrfslAqHop4S4FtSI3GQAShpQqgOpMTNFYcpaWKmE/Y1MJmNY7xLCnw==", + "requires": { + "tslib": "^2.3.1" + } + }, "@discordjs/collection": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-0.1.6.tgz", @@ -6680,22 +9060,6 @@ "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" }, - "aws-sdk": { - "version": "2.1030.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1030.0.tgz", - "integrity": "sha512-to0STOb8DsSGuSsUb/WCbg/UFnMGfIYavnJH5ZlRCHzvCFjTyR+vfE8ku+qIZvfFM4+5MNTQC/Oxfun2X/TuyA==", - "requires": { - "buffer": "4.9.2", - "events": "1.1.1", - "ieee754": "1.1.13", - "jmespath": "0.15.0", - "querystring": "0.2.0", - "sax": "1.2.1", - "url": "0.10.3", - "uuid": "3.3.2", - "xml2js": "0.4.19" - } - }, "aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", @@ -6869,6 +9233,11 @@ "type-is": "~1.6.17" } }, + "bowser": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", + "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==" + }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -6929,16 +9298,6 @@ } } }, - "buffer": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", - "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - } - }, "buffer-equal-constant-time": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", @@ -7732,11 +10091,6 @@ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" }, - "events": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", - "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=" - }, "expand-brackets": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", @@ -8815,11 +11169,6 @@ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" }, - "jmespath": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.15.0.tgz", - "integrity": "sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc=" - }, "js-sdsl": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-2.1.4.tgz", @@ -9866,11 +12215,6 @@ "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" - }, "querystringify": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", @@ -10804,6 +13148,11 @@ "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==" }, + "tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" + }, "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -10985,22 +13334,6 @@ "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" }, - "url": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", - "integrity": "sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ=", - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - }, - "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" - } - } - }, "url-join": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", diff --git a/package.json b/package.json index ac3707f2..9c654a03 100644 --- a/package.json +++ b/package.json @@ -14,8 +14,8 @@ }, "homepage": "https://gitlab.com/Shinobi-Systems/Shinobi#readme", "dependencies": { + "@aws-sdk/client-s3": "^3.226.0", "async": "^3.2.2", - "aws-sdk": "^2.1030.0", "backblaze-b2": "^0.9.12", "body-parser": "^1.19.0", "bson": "^4.6.1", diff --git a/web/assets/js/bs5.calendar.js b/web/assets/js/bs5.calendar.js index f9cc0b7e..88fd7e8c 100644 --- a/web/assets/js/bs5.calendar.js +++ b/web/assets/js/bs5.calendar.js @@ -26,7 +26,7 @@ $(document).ready(function(e){ $.getJSON(apiURL + '?' + queryString.join('&'),function(data){ $.each(data.videos,function(n,v){ if(v.status !== 0){ - loadedVideosInMemory[`${v.mid}${v.time}`] = Object.assign({},v) + loadedVideosInMemory[`${v.mid}${v.time}${v.type}`] = Object.assign({},v) var loadedMonitor = loadedMonitors[v.mid] if(loadedMonitor){ v.title = loadedMonitor.name+' - '+(parseInt(v.size)/1048576).toFixed(2)+'mb'; @@ -53,7 +53,7 @@ $(document).ready(function(e){ eventLimit: true, events: calendarData, eventClick: function(v){ - var video = loadedVideosInMemory[`${v.mid}${v.time}`] + var video = loadedVideosInMemory[`${v.mid}${v.time}${v.type}`] var href = video.href createVideoPlayerTab(Object.assign({},video,{href: href})) $(this).css('border-color', 'red'); diff --git a/web/assets/js/bs5.liveGrid.js b/web/assets/js/bs5.liveGrid.js index cadf9799..3fd70f7b 100644 --- a/web/assets/js/bs5.liveGrid.js +++ b/web/assets/js/bs5.liveGrid.js @@ -1067,7 +1067,7 @@ $(document).ready(function(e){ d.mid = d.id || d.mid var monitorId = d.mid var videoTime = d.time - loadedVideosInMemory[`${monitorId}${videoTime}`] = d + loadedVideosInMemory[`${monitorId}${videoTime}${d.type}`] = d if(liveGridElements[monitorId] && liveGridElements[monitorId].streamElement)drawVideoCardToMiniList(monitorId,createVideoLinks(d),false) break; case'monitor_watch_off':case'monitor_stopping': diff --git a/web/assets/js/bs5.studio.js b/web/assets/js/bs5.studio.js index d4991c46..5898bcdd 100644 --- a/web/assets/js/bs5.studio.js +++ b/web/assets/js/bs5.studio.js @@ -250,7 +250,7 @@ $(document).ready(function(){ var el = $(this).parents('[data-mid]') var monitorId = el.attr('data-mid') var videoTime = el.attr('data-time') - var video = loadedVideosInMemory[`${monitorId}${videoTime}`] + var video = loadedVideosInMemory[`${monitorId}${videoTime}${undefined}`] openTab('studio') loadVideoIntoSlicer(video) return false; diff --git a/web/assets/js/bs5.videoPlayer.js b/web/assets/js/bs5.videoPlayer.js index 5b9eb456..53532c2a 100644 --- a/web/assets/js/bs5.videoPlayer.js +++ b/web/assets/js/bs5.videoPlayer.js @@ -34,7 +34,7 @@ $(document).ready(function(){ }) eventMatrixHtml += `` } - var baseHtml = `
+ var baseHtml = `
${tabLabel}
diff --git a/web/assets/js/bs5.videos.js b/web/assets/js/bs5.videos.js index d4beb722..7ec4c8d8 100644 --- a/web/assets/js/bs5.videos.js +++ b/web/assets/js/bs5.videos.js @@ -278,7 +278,7 @@ function createVideoRow(row,classOverride){ } var videoEndpoint = getApiPrefix(`videos`) + '/' + row.mid + '/' + row.filename return ` -
+
@@ -441,7 +441,7 @@ function drawVideoRowsToList(targetElement,rows){ function loadVideosData(newVideos){ $.each(newVideos,function(n,video){ delete(video.f) - loadedVideosInMemory[`${video.mid}${video.time}`] = video + loadedVideosInMemory[`${video.mid}${video.time}${video.type}`] = video }) } function loadEventsData(videoEvents){ @@ -486,7 +486,10 @@ function getVideos(options,callback){ $.getJSON(`${getApiPrefix(`events`)}${monitorId ? `/${monitorId}` : ''}?${requestQueries.concat([`limit=${limit}`]).join('&')}`,function(eventData){ var theEvents = eventData.events || eventData; var newVideos = applyDataListToVideos(videos,theEvents) - newVideos = applyTimelapseFramesListToVideos(newVideos,timelapseFrames.frames || timelapseFrames,'timelapseFrames',true) + newVideos = applyTimelapseFramesListToVideos(newVideos,timelapseFrames.frames || timelapseFrames,'timelapseFrames',true).map((video) => { + video.videoSet = customVideoSet + return video + }) loadEventsData(theEvents) loadVideosData(newVideos) if(callback)callback({videos: newVideos, frames: timelapseFrames}); @@ -634,16 +637,16 @@ async function unarchiveVideos(videos){ } } function buildDefaultVideoMenuItems(file,options){ - var href = file.href + var isLocalVideo = !file.videoSet || file.videoSet === 'videos' + var href = file.href + `${!isLocalVideo ? `?type=${file.type}` : ''}` options = options ? options : {play: true} return `
  • ${lang.Download}
  • ${options.play ? `
  • ${lang.Play}
  • ` : ``} - ${options.play ? `
  • ${lang.Play}
  • ` : ``}
  • - ${permissionCheck('video_delete',file.mid) ? `
  • ${lang.Slice}
  • ` : ``} + ${isLocalVideo && permissionCheck('video_delete',file.mid) ? `
  • ${lang.Slice}
  • ` : ``} ${permissionCheck('video_delete',file.mid) ? `
  • ${lang.Delete}
  • ` : ``} - ${permissionCheck('video_delete',file.mid) ? `
  • ${lang.Compress}
  • ` : ``} + ${isLocalVideo && permissionCheck('video_delete',file.mid) ? `
  • ${lang.Compress}
  • ` : ``} ` } function setVideoStatus(video,toStatus){ @@ -659,10 +662,10 @@ function setVideoStatus(video,toStatus){ onWebSocketEvent(function(d){ switch(d.f){ case'video_edit':case'video_archive': - var video = loadedVideosInMemory[`${d.mid}${d.time}`] + var video = loadedVideosInMemory[`${d.mid}${d.time}${d.type}`] if(video){ let filename = `${formattedTimeForFilename(convertTZ(d.time),false,`YYYY-MM-DDTHH-mm-ss`)}.${video.ext || 'mp4'}` - loadedVideosInMemory[`${d.mid}${d.time}`].status = d.status + loadedVideosInMemory[`${d.mid}${d.time}${d.type}`].status = d.status $(`[data-mid="${d.mid}"][data-filename="${filename}"]`).attr('data-status',d.status); } break; @@ -685,7 +688,7 @@ $(document).ready(function(){ var el = $(this).parents('[data-mid]') var monitorId = el.attr('data-mid') var videoTime = el.attr('data-time') - var video = loadedVideosInMemory[`${monitorId}${videoTime}`] + var video = loadedVideosInMemory[`${monitorId}${videoTime}${undefined}`] createVideoPlayerTab(video) setVideoStatus(video) return false; @@ -695,7 +698,7 @@ $(document).ready(function(){ var monitorId = el.attr('data-mid') var videoTime = el.attr('video-time-seeked-video-position') var timeInward = (parseInt(el.attr('video-slice-seeked')) / 1000) - 2 - var video = loadedVideosInMemory[`${monitorId}${videoTime}`] + var video = loadedVideosInMemory[`${monitorId}${videoTime}${undefined}`] timeInward = timeInward < 0 ? 0 : timeInward createVideoPlayerTab(video,timeInward) }) @@ -704,23 +707,27 @@ $(document).ready(function(){ var el = $(this).parents('[data-mid]') var monitorId = el.attr('data-mid') var videoTime = el.attr('data-time') - var video = loadedVideosInMemory[`${monitorId}${videoTime}`] + var type = el.attr('data-type') + var video = loadedVideosInMemory[`${monitorId}${videoTime}${type}`] + var videoSet = video.videoSet var ext = video.filename.split('.') ext = ext[ext.length - 1] - var videoEndpoint = getApiPrefix(`videos`) + '/' + video.mid + '/' + video.filename + var isCloudVideo = videoSet === 'cloudVideos' + var videoEndpoint = getApiPrefix(videoSet || 'videos') + '/' + video.mid + '/' + video.filename + var endpointType = isCloudVideo ? `?type=${video.type}` : '' $.confirm.create({ title: lang["Delete Video"] + ' : ' + video.filename, - body: `${lang.DeleteVideoMsg}

    `, + body: `${lang.DeleteVideoMsg}

    `, clickOptions: { title: ' ' + lang.Delete, class: 'btn-danger btn-sm' }, clickCallback: function(){ - $.getJSON(videoEndpoint + '/delete',function(data){ + $.getJSON(videoEndpoint + '/delete' + endpointType,function(data){ if(data.ok){ console.log('Video Deleted') }else{ - console.log('Video Not Deleted',data,videoEndpoint) + console.log('Video Not Deleted',data,videoEndpoint + endpointType) } }) } @@ -732,7 +739,7 @@ $(document).ready(function(){ var el = $(this).parents('[data-mid]') var monitorId = el.attr('data-mid') var videoTime = el.attr('data-time') - var video = loadedVideosInMemory[`${monitorId}${videoTime}`] + var video = loadedVideosInMemory[`${monitorId}${videoTime}${undefined}`] var ext = video.filename.split('.') ext = ext[ext.length - 1] var videoEndpoint = getApiPrefix(`videos`) + '/' + video.mid + '/' + video.filename @@ -755,7 +762,7 @@ $(document).ready(function(){ var monitorId = el.attr('data-mid') var videoTime = el.attr('data-time') var unarchive = $(this).hasClass('status-archived') - var video = loadedVideosInMemory[`${monitorId}${videoTime}`] + var video = loadedVideosInMemory[`${monitorId}${videoTime}${undefined}`] var ext = video.filename.split('.') ext = ext[ext.length - 1] var videoEndpoint = getApiPrefix(`videos`) + '/' + video.mid + '/' + video.filename @@ -781,7 +788,7 @@ $(document).ready(function(){ var el = $(this).parents('[data-mid]') var monitorId = el.attr('data-mid') var videoTime = el.attr('data-time') - var video = loadedVideosInMemory[`${monitorId}${videoTime}`] + var video = loadedVideosInMemory[`${monitorId}${videoTime}${undefined}`] var ext = video.filename.split('.') ext = ext[ext.length - 1] var videoEndpoint = getApiPrefix(`videos`) + '/' + video.mid + '/' + video.filename diff --git a/web/assets/js/bs5.videosTable.js b/web/assets/js/bs5.videosTable.js index 2ff69285..0929c53c 100644 --- a/web/assets/js/bs5.videosTable.js +++ b/web/assets/js/bs5.videosTable.js @@ -61,6 +61,7 @@ $(document).ready(function(e){ var endDate = dateRange.endDate var monitorId = monitorsList.val() var wantsArchivedVideo = getVideoSetSelected() === 'archive' + var wantCloudVideo = wantCloudVideos() var frameIconsHtml = '' if(!usePreloadedData){ loadedVideosTable = (await getVideos({ @@ -69,10 +70,10 @@ $(document).ready(function(e){ endDate, searchQuery, archived: wantsArchivedVideo, - customVideoSet: wantCloudVideos() ? 'cloudVideos' : null, + customVideoSet: wantCloudVideo ? 'cloudVideos' : null, })).videos; $.each(loadedVideosTable,function(n,v){ - loadedVideosInMemory[`${monitorId}${v.time}`] + loadedVideosInMemory[`${monitorId}${v.time}${v.type}`] }) } // for (let i = 0; i < loadedVideosTable.length; i++) { @@ -131,7 +132,8 @@ $(document).ready(function(e){ } ], data: loadedVideosTable.map((file) => { - var href = file.href + var isLocalVideo = !wantCloudVideo + var href = file.href + `${!isLocalVideo ? `?type=${file.type}` : ''}` var loadedMonitor = loadedMonitors[file.mid] return { image: `
    @@ -154,12 +156,13 @@ $(document).ready(function(e){ objects: file.objects, tags: ` ${file.ext ? `${file.ext}` : ''} + ${!isLocalVideo ? `${file.type}` : ''} `, size: convertKbToHumanSize(file.size), buttons: ` -
    +
    - ${permissionCheck('video_delete',file.mid) ? `` : ''} + ${isLocalVideo && permissionCheck('video_delete',file.mid) ? `` : ''}