├── .vscode └── settings.json ├── package.json ├── util.js ├── README.md ├── .gitignore ├── index.js ├── local-debugger.js └── yarn.lock /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "cSpell.words": ["alexa", "chatgpt", "joao", "OPENAI"] 3 | } 4 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "alexa-chatgpt", 3 | "version": "1.0.0", 4 | "description": "Lambda function for Alexa Skill for Bot with GPT-3", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "dependencies": { 10 | "ask-sdk-core": "2.7.0", 11 | "ask-sdk-model": "1.19.0", 12 | "aws-sdk": "2.326.0", 13 | "axios": "1.3.2" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /util.js: -------------------------------------------------------------------------------- 1 | const AWS = require('aws-sdk'); 2 | 3 | const s3SigV4Client = new AWS.S3({ 4 | signatureVersion: 'v4', 5 | region: process.env.S3_PERSISTENCE_REGION 6 | }); 7 | 8 | module.exports.getS3PreSignedUrl = function getS3PreSignedUrl(s3ObjectKey) { 9 | 10 | const bucketName = process.env.S3_PERSISTENCE_BUCKET; 11 | const s3PreSignedUrl = s3SigV4Client.getSignedUrl('getObject', { 12 | Bucket: bucketName, 13 | Key: s3ObjectKey, 14 | Expires: 60*1 // the Expires is capped for 1 minute 15 | }); 16 | console.log(`Util.s3PreSignedUrl: ${s3ObjectKey} URL ${s3PreSignedUrl}`); 17 | return s3PreSignedUrl; 18 | 19 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Alexa Skill with ChatGPT 2 | 3 | This repository contains an example of how to use OpenAI's ChatGPT language model to create an Alexa Skill. 4 | 5 | ## How it works 6 | 7 | This code connects to the OpenAI ChatGPT API and sends Alexa's questions to the model, which processes them and returns the answers. Then, these responses are transmitted back to Alexa and presented to the user. 8 | 9 | ## Configuration 10 | 11 | You will need to obtain an API key from OpenAI to use the ChatGPT model. More information on how to do this can be found in the OpenAI API documentation. 12 | 13 | Once you have your API key, simply insert it into the index.js file in the designated location. 14 | 15 | ## Running the example 16 | 17 | This example was developed using Amazon's ASK CLI. To run it, you will need to install the ASK CLI and configure your Amazon Developer account. 18 | 19 | Once configured, simply run the following commands in the terminal: 20 | 21 | ``` 22 | ask init 23 | ask deploy 24 | ``` 25 | 26 | This will deploy your Skill to your Amazon Developer account and make it available for use with Alexa. 27 | 28 | ## Final considerations 29 | 30 | This is just a basic example of how to use ChatGPT with Alexa. You can expand this implementation to create more complex and personalized skills. Enjoy! 31 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Created by https://www.toptal.com/developers/gitignore/api/node 2 | # Edit at https://www.toptal.com/developers/gitignore?templates=node 3 | 4 | ### Node ### 5 | # Logs 6 | logs 7 | *.log 8 | npm-debug.log* 9 | yarn-debug.log* 10 | yarn-error.log* 11 | lerna-debug.log* 12 | .pnpm-debug.log* 13 | 14 | # Diagnostic reports (https://nodejs.org/api/report.html) 15 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 16 | 17 | # Runtime data 18 | pids 19 | *.pid 20 | *.seed 21 | *.pid.lock 22 | 23 | # Directory for instrumented libs generated by jscoverage/JSCover 24 | lib-cov 25 | 26 | # Coverage directory used by tools like istanbul 27 | coverage 28 | *.lcov 29 | 30 | # nyc test coverage 31 | .nyc_output 32 | 33 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 34 | .grunt 35 | 36 | # Bower dependency directory (https://bower.io/) 37 | bower_components 38 | 39 | # node-waf configuration 40 | .lock-wscript 41 | 42 | # Compiled binary addons (https://nodejs.org/api/addons.html) 43 | build/Release 44 | 45 | # Dependency directories 46 | node_modules/ 47 | jspm_packages/ 48 | 49 | # Snowpack dependency directory (https://snowpack.dev/) 50 | web_modules/ 51 | 52 | # TypeScript cache 53 | *.tsbuildinfo 54 | 55 | # Optional npm cache directory 56 | .npm 57 | 58 | # Optional eslint cache 59 | .eslintcache 60 | 61 | # Optional stylelint cache 62 | .stylelintcache 63 | 64 | # Microbundle cache 65 | .rpt2_cache/ 66 | .rts2_cache_cjs/ 67 | .rts2_cache_es/ 68 | .rts2_cache_umd/ 69 | 70 | # Optional REPL history 71 | .node_repl_history 72 | 73 | # Output of 'npm pack' 74 | *.tgz 75 | 76 | # Yarn Integrity file 77 | .yarn-integrity 78 | 79 | # dotenv environment variable files 80 | .env 81 | .env.development.local 82 | .env.test.local 83 | .env.production.local 84 | .env.local 85 | 86 | # parcel-bundler cache (https://parceljs.org/) 87 | .cache 88 | .parcel-cache 89 | 90 | # Next.js build output 91 | .next 92 | out 93 | 94 | # Nuxt.js build / generate output 95 | .nuxt 96 | dist 97 | 98 | # Gatsby files 99 | .cache/ 100 | # Comment in the public line in if your project uses Gatsby and not Next.js 101 | # https://nextjs.org/blog/next-9-1#public-directory-support 102 | # public 103 | 104 | # vuepress build output 105 | .vuepress/dist 106 | 107 | # vuepress v2.x temp and cache directory 108 | .temp 109 | 110 | # Docusaurus cache and generated files 111 | .docusaurus 112 | 113 | # Serverless directories 114 | .serverless/ 115 | 116 | # FuseBox cache 117 | .fusebox/ 118 | 119 | # DynamoDB Local files 120 | .dynamodb/ 121 | 122 | # TernJS port file 123 | .tern-port 124 | 125 | # Stores VSCode versions used for testing VSCode extensions 126 | .vscode-test 127 | 128 | # yarn v2 129 | .yarn/cache 130 | .yarn/unplugged 131 | .yarn/build-state.yml 132 | .yarn/install-state.gz 133 | .pnp.* 134 | 135 | ### Node Patch ### 136 | # Serverless Webpack directories 137 | .webpack/ 138 | 139 | # Optional stylelint cache 140 | 141 | # SvelteKit build / generate output 142 | .svelte-kit 143 | 144 | # End of https://www.toptal.com/developers/gitignore/api/node -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | const Alexa = require("ask-sdk-core"); 2 | const axios = require("axios"); 3 | 4 | async function askToGPT(prompt) { 5 | const response = await axios.post( 6 | "https://api.openai.com/v1/engines/text-davinci-003/completions", 7 | { 8 | prompt, 9 | max_tokens: 100, 10 | n: 1, 11 | temperature: 0.5, 12 | stop: ".", 13 | top_p: 1, 14 | }, 15 | { 16 | headers: { 17 | "Content-Type": "application/json", 18 | Authorization: `Bearer ${process.env.OPENAI_API_KEY}}`, 19 | }, 20 | } 21 | ); 22 | 23 | return response.data.choices[0].text; 24 | } 25 | 26 | function formatString(text) { 27 | return text.replace(/\n+/g, " "); 28 | } 29 | 30 | const LaunchRequestHandler = { 31 | canHandle(handlerInput) { 32 | return ( 33 | Alexa.getRequestType(handlerInput.requestEnvelope) === "LaunchRequest" 34 | ); 35 | }, 36 | async handle(handlerInput) { 37 | const response = 38 | 'Seja bem-vindo ao GPT-3. Você pode perguntar algo como "chat, qual a capital da França?"'; 39 | 40 | return handlerInput.responseBuilder.speak(response).getResponse(); 41 | }, 42 | }; 43 | 44 | const HelloWorldIntentHandler = { 45 | canHandle(handlerInput) { 46 | return ( 47 | Alexa.getRequestType(handlerInput.requestEnvelope) === "IntentRequest" && 48 | Alexa.getIntentName(handlerInput.requestEnvelope) === "AskToGPTIntent" 49 | ); 50 | }, 51 | async handle(handlerInput) { 52 | const question = Alexa.getSlotValue( 53 | handlerInput.requestEnvelope, 54 | "question" 55 | ); 56 | 57 | const responseFromGPT = await askToGPT(question); 58 | 59 | const formattedResponse = formatString(responseFromGPT); 60 | 61 | return handlerInput.responseBuilder.speak(formattedResponse).getResponse(); 62 | }, 63 | }; 64 | 65 | const HelpIntentHandler = { 66 | canHandle(handlerInput) { 67 | return ( 68 | Alexa.getRequestType(handlerInput.requestEnvelope) === "IntentRequest" && 69 | Alexa.getIntentName(handlerInput.requestEnvelope) === "AMAZON.HelpIntent" 70 | ); 71 | }, 72 | handle(handlerInput) { 73 | const speakOutput = 74 | "Você pode perguntar algo como 'chat, ideia de nome para bebês'"; 75 | 76 | return handlerInput.responseBuilder.speak(speakOutput).getResponse(); 77 | }, 78 | }; 79 | 80 | const CancelAndStopIntentHandler = { 81 | canHandle(handlerInput) { 82 | return ( 83 | Alexa.getRequestType(handlerInput.requestEnvelope) === "IntentRequest" && 84 | (Alexa.getIntentName(handlerInput.requestEnvelope) === 85 | "AMAZON.CancelIntent" || 86 | Alexa.getIntentName(handlerInput.requestEnvelope) === 87 | "AMAZON.StopIntent") 88 | ); 89 | }, 90 | handle(handlerInput) { 91 | const speakOutput = "Até mais!"; 92 | 93 | return handlerInput.responseBuilder.speak(speakOutput).getResponse(); 94 | }, 95 | }; 96 | 97 | const FallbackIntentHandler = { 98 | canHandle(handlerInput) { 99 | return ( 100 | Alexa.getRequestType(handlerInput.requestEnvelope) === "IntentRequest" && 101 | Alexa.getIntentName(handlerInput.requestEnvelope) === 102 | "AMAZON.FallbackIntent" 103 | ); 104 | }, 105 | handle(handlerInput) { 106 | const speakOutput = 107 | "Desculpe, não tenho conhecimento sobre isso. Por favor, tente novamente."; 108 | 109 | return handlerInput.responseBuilder.speak(speakOutput).getResponse(); 110 | }, 111 | }; 112 | 113 | const SessionEndedRequestHandler = { 114 | canHandle(handlerInput) { 115 | return ( 116 | Alexa.getRequestType(handlerInput.requestEnvelope) === 117 | "SessionEndedRequest" 118 | ); 119 | }, 120 | handle(handlerInput) { 121 | return handlerInput.responseBuilder.getResponse(); 122 | }, 123 | }; 124 | 125 | const IntentReflectorHandler = { 126 | canHandle(handlerInput) { 127 | return ( 128 | Alexa.getRequestType(handlerInput.requestEnvelope) === "IntentRequest" 129 | ); 130 | }, 131 | handle(handlerInput) { 132 | const speakOutput = `Que tal me perguntar algo como 'quanto está o dólar hoje?'`; 133 | 134 | return handlerInput.responseBuilder.speak(speakOutput).getResponse(); 135 | }, 136 | }; 137 | 138 | const ErrorHandler = { 139 | canHandle() { 140 | return true; 141 | }, 142 | handle(handlerInput) { 143 | const speakOutput = 144 | "Desculpe, parece que tivemos um problema aqui! Acesse github.com/joao208/alexa-chatgpt para mais informações."; 145 | 146 | return handlerInput.responseBuilder.speak(speakOutput).getResponse(); 147 | }, 148 | }; 149 | 150 | exports.handler = Alexa.SkillBuilders.custom() 151 | .addRequestHandlers( 152 | LaunchRequestHandler, 153 | HelloWorldIntentHandler, 154 | HelpIntentHandler, 155 | CancelAndStopIntentHandler, 156 | FallbackIntentHandler, 157 | SessionEndedRequestHandler, 158 | IntentReflectorHandler 159 | ) 160 | .addErrorHandlers(ErrorHandler) 161 | .lambda(); 162 | -------------------------------------------------------------------------------- /local-debugger.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * Licensed under the Apache License, Version 2.0 (the "License"). 4 | * You may not use this file except in compliance with the License. 5 | * A copy of the License is located at 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * or in the "license" file accompanying this file. This file is distributed 9 | * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 10 | * express or implied. See the License for the specific language governing 11 | * permissions and limitations under the License. 12 | */ 13 | 14 | /* ## DEPRECATION NOTICE 15 | 16 | This script has been deprecated and is no longer supported. 17 | Please use the [ASK Toolkit for VS Code] 18 | (https://marketplace.visualstudio.com/items?itemName=ask-toolkit.alexa-skills-kit-toolkit), 19 | which provides a more end-to-end integration with Visual Studio Code. If you 20 | use another editor/IDE, please check out the [ASK SDK Local Debug package at npm] 21 | (https://www.npmjs.com/package/ask-sdk-local-debug). 22 | 23 | */ 24 | 25 | const net = require('net'); 26 | const fs = require('fs'); 27 | 28 | const localDebugger = net.createServer(); 29 | 30 | const httpHeaderDelimeter = '\r\n'; 31 | const httpBodyDelimeter = '\r\n\r\n'; 32 | const defaultHandlerName = 'handler'; 33 | const host = 'localhost'; 34 | const defaultPort = 0; 35 | 36 | /** 37 | * Resolves the skill invoker class dependency from the user provided 38 | * skill entry file. 39 | */ 40 | 41 | // eslint-disable-next-line import/no-dynamic-require 42 | const skillInvoker = require(getAndValidateSkillInvokerFile()); 43 | const portNumber = getAndValidatePortNumber(); 44 | const lambdaHandlerName = getLambdaHandlerName(); 45 | 46 | /** 47 | * Starts listening on the port for incoming skill requests. 48 | */ 49 | 50 | localDebugger.listen(portNumber, host, () => { 51 | console.log(`Starting server on port: ${localDebugger.address().port}.`); 52 | }); 53 | 54 | /** 55 | * For a new incoming skill request a new socket connection is established. 56 | * From the data received on the socket the request body is extracted, parsed into 57 | * JSON and passed to the skill invoker's lambda handler. 58 | * The response from the lambda handler is parsed as a HTTP 200 message format as specified 59 | * here - https://developer.amazon.com/docs/custom-skills/request-and-response-json-reference.html#http-header-1 60 | * The response is written onto the socket connection. 61 | */ 62 | 63 | localDebugger.on('connection', (socket) => { 64 | console.log(`Connection from: ${socket.remoteAddress}:${socket.remotePort}`); 65 | socket.on('data', (data) => { 66 | const body = JSON.parse(data.toString().split(httpBodyDelimeter).pop()); 67 | console.log(`Request envelope: ${JSON.stringify(body)}`); 68 | skillInvoker[lambdaHandlerName](body, null, (_invokeErr, response) => { 69 | response = JSON.stringify(response); 70 | console.log(`Response envelope: ${response}`); 71 | socket.write(`HTTP/1.1 200 OK${httpHeaderDelimeter}Content-Type: application/json;charset=UTF-8${httpHeaderDelimeter}Content-Length: ${response.length}${httpBodyDelimeter}${response}`); 72 | }); 73 | }); 74 | }); 75 | 76 | /** 77 | * Validates user specified port number is in legal range [0, 65535]. 78 | * Defaults to 0. 79 | */ 80 | 81 | function getAndValidatePortNumber() { 82 | const portNumberArgument = Number(getArgument('portNumber', defaultPort)); 83 | if (!Number.isInteger(portNumberArgument)) { 84 | throw new Error(`Port number has to be an integer - ${portNumberArgument}.`); 85 | } 86 | if (portNumberArgument < 0 || portNumberArgument > 65535) { 87 | throw new Error(`Port out of legal range: ${portNumberArgument}. The port number should be in the range [0, 65535]`); 88 | } 89 | if (portNumberArgument === 0) { 90 | console.log('The TCP server will listen on a port that is free.' 91 | + 'Check logs to find out what port number is being used'); 92 | } 93 | return portNumberArgument; 94 | } 95 | 96 | /** 97 | * Gets the lambda handler name. 98 | * Defaults to "handler". 99 | */ 100 | 101 | function getLambdaHandlerName() { 102 | return getArgument('lambdaHandler', defaultHandlerName); 103 | } 104 | 105 | /** 106 | * Validates that the skill entry file exists on the path specified. 107 | * This is a required field. 108 | */ 109 | 110 | // eslint-disable-next-line consistent-return 111 | function getAndValidateSkillInvokerFile() { 112 | const fileNameArgument = getArgument('skillEntryFile'); 113 | if (!fs.existsSync(fileNameArgument)) { 114 | throw new Error(`File not found: ${fileNameArgument}`); 115 | } 116 | return fileNameArgument; 117 | } 118 | 119 | /** 120 | * Helper function to fetch the value for a given argument 121 | * @param {argumentName} argumentName name of the argument for which the value needs to be fetched 122 | * @param {defaultValue} defaultValue default value of the argument that is returned if the value doesn't exist 123 | */ 124 | 125 | function getArgument(argumentName, defaultValue) { 126 | const index = process.argv.indexOf(`--${argumentName}`); 127 | if (index === -1 || typeof process.argv[index + 1] === 'undefined') { 128 | if (defaultValue === undefined) { 129 | throw new Error(`Required argument - ${argumentName} not provided.`); 130 | } else { 131 | return defaultValue; 132 | } 133 | } 134 | return process.argv[index + 1]; 135 | } 136 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | ask-sdk-core@^2.7.0: 6 | version "2.12.1" 7 | resolved "https://registry.yarnpkg.com/ask-sdk-core/-/ask-sdk-core-2.12.1.tgz#ac09877a904b9b7d86a9fc6948cd1af49fad8750" 8 | integrity sha512-2fT7XkHfuI0I6g12Y4mztgzmz7SwrKli8Z2p+eut1dVk8t5BHxWVXZCOVI5GVhW0DJbWwhjPSfOTAZX+zPoKEA== 9 | dependencies: 10 | ask-sdk-runtime "^2.12.0" 11 | 12 | ask-sdk-model@^1.19.0: 13 | version "1.44.0" 14 | resolved "https://registry.yarnpkg.com/ask-sdk-model/-/ask-sdk-model-1.44.0.tgz#10b3023074227b7b36062d84e39716e6f43165a6" 15 | integrity sha512-3PqyxpMVx+9Ej/t9kREU5ZQNVKM8Ph0h2ThcVxQoZFjuSDopaC9kDKd7tktQeD9WBbWLqK/oiDCKHMZ0hRXueg== 16 | 17 | ask-sdk-runtime@^2.12.0: 18 | version "2.12.0" 19 | resolved "https://registry.yarnpkg.com/ask-sdk-runtime/-/ask-sdk-runtime-2.12.0.tgz#e4b06467a2545ad9fec07379027184374030df38" 20 | integrity sha512-5vNTQCjWVnT74Aa39gqBAm3Gvwald0Uu4B1IU4mPTCbBzqEM1XkXkhIc8CWXQOuK7S2SsebjAHEBinrZo+T6lQ== 21 | 22 | asynckit@^0.4.0: 23 | version "0.4.0" 24 | resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" 25 | integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== 26 | 27 | available-typed-arrays@^1.0.5: 28 | version "1.0.5" 29 | resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" 30 | integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== 31 | 32 | aws-sdk@^2.326.0: 33 | version "2.1309.0" 34 | resolved "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.1309.0.tgz#2bc6e25af6da39a6c9c48080a43b35596a58a2c5" 35 | integrity sha512-EC/EtDDWDoJnovvmNlJqvojNJMbFZ78HESzgFiond5vzPS+FIWnWgGJ1ZVvIWU9O4X5I8cEMckwHCTfVYNcZxA== 36 | dependencies: 37 | buffer "4.9.2" 38 | events "1.1.1" 39 | ieee754 "1.1.13" 40 | jmespath "0.16.0" 41 | querystring "0.2.0" 42 | sax "1.2.1" 43 | url "0.10.3" 44 | util "^0.12.4" 45 | uuid "8.0.0" 46 | xml2js "0.4.19" 47 | 48 | axios@1.3.2: 49 | version "1.3.2" 50 | resolved "https://registry.yarnpkg.com/axios/-/axios-1.3.2.tgz#7ac517f0fa3ec46e0e636223fd973713a09c72b3" 51 | integrity sha512-1M3O703bYqYuPhbHeya5bnhpYVsDDRyQSabNja04mZtboLNSuZ4YrltestrLXfHgmzua4TpUqRiVKbiQuo2epw== 52 | dependencies: 53 | follow-redirects "^1.15.0" 54 | form-data "^4.0.0" 55 | proxy-from-env "^1.1.0" 56 | 57 | base64-js@^1.0.2: 58 | version "1.5.1" 59 | resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" 60 | integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== 61 | 62 | buffer@4.9.2: 63 | version "4.9.2" 64 | resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8" 65 | integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== 66 | dependencies: 67 | base64-js "^1.0.2" 68 | ieee754 "^1.1.4" 69 | isarray "^1.0.0" 70 | 71 | call-bind@^1.0.2: 72 | version "1.0.2" 73 | resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" 74 | integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== 75 | dependencies: 76 | function-bind "^1.1.1" 77 | get-intrinsic "^1.0.2" 78 | 79 | combined-stream@^1.0.8: 80 | version "1.0.8" 81 | resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" 82 | integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== 83 | dependencies: 84 | delayed-stream "~1.0.0" 85 | 86 | delayed-stream@~1.0.0: 87 | version "1.0.0" 88 | resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" 89 | integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== 90 | 91 | events@1.1.1: 92 | version "1.1.1" 93 | resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" 94 | integrity sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw== 95 | 96 | follow-redirects@^1.15.0: 97 | version "1.15.2" 98 | resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" 99 | integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== 100 | 101 | for-each@^0.3.3: 102 | version "0.3.3" 103 | resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" 104 | integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== 105 | dependencies: 106 | is-callable "^1.1.3" 107 | 108 | form-data@^4.0.0: 109 | version "4.0.0" 110 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" 111 | integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== 112 | dependencies: 113 | asynckit "^0.4.0" 114 | combined-stream "^1.0.8" 115 | mime-types "^2.1.12" 116 | 117 | function-bind@^1.1.1: 118 | version "1.1.1" 119 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 120 | integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== 121 | 122 | get-intrinsic@^1.0.2, get-intrinsic@^1.1.3: 123 | version "1.2.0" 124 | resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.0.tgz#7ad1dc0535f3a2904bba075772763e5051f6d05f" 125 | integrity sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q== 126 | dependencies: 127 | function-bind "^1.1.1" 128 | has "^1.0.3" 129 | has-symbols "^1.0.3" 130 | 131 | gopd@^1.0.1: 132 | version "1.0.1" 133 | resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" 134 | integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== 135 | dependencies: 136 | get-intrinsic "^1.1.3" 137 | 138 | has-symbols@^1.0.2, has-symbols@^1.0.3: 139 | version "1.0.3" 140 | resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" 141 | integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== 142 | 143 | has-tostringtag@^1.0.0: 144 | version "1.0.0" 145 | resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" 146 | integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== 147 | dependencies: 148 | has-symbols "^1.0.2" 149 | 150 | has@^1.0.3: 151 | version "1.0.3" 152 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" 153 | integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== 154 | dependencies: 155 | function-bind "^1.1.1" 156 | 157 | ieee754@1.1.13: 158 | version "1.1.13" 159 | resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" 160 | integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== 161 | 162 | ieee754@^1.1.4: 163 | version "1.2.1" 164 | resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" 165 | integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== 166 | 167 | inherits@^2.0.3: 168 | version "2.0.4" 169 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 170 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 171 | 172 | is-arguments@^1.0.4: 173 | version "1.1.1" 174 | resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" 175 | integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== 176 | dependencies: 177 | call-bind "^1.0.2" 178 | has-tostringtag "^1.0.0" 179 | 180 | is-callable@^1.1.3: 181 | version "1.2.7" 182 | resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" 183 | integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== 184 | 185 | is-generator-function@^1.0.7: 186 | version "1.0.10" 187 | resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" 188 | integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== 189 | dependencies: 190 | has-tostringtag "^1.0.0" 191 | 192 | is-typed-array@^1.1.10, is-typed-array@^1.1.3: 193 | version "1.1.10" 194 | resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.10.tgz#36a5b5cb4189b575d1a3e4b08536bfb485801e3f" 195 | integrity sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A== 196 | dependencies: 197 | available-typed-arrays "^1.0.5" 198 | call-bind "^1.0.2" 199 | for-each "^0.3.3" 200 | gopd "^1.0.1" 201 | has-tostringtag "^1.0.0" 202 | 203 | isarray@^1.0.0: 204 | version "1.0.0" 205 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 206 | integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== 207 | 208 | jmespath@0.16.0: 209 | version "0.16.0" 210 | resolved "https://registry.yarnpkg.com/jmespath/-/jmespath-0.16.0.tgz#b15b0a85dfd4d930d43e69ed605943c802785076" 211 | integrity sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw== 212 | 213 | mime-db@1.52.0: 214 | version "1.52.0" 215 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" 216 | integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== 217 | 218 | mime-types@^2.1.12: 219 | version "2.1.35" 220 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" 221 | integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== 222 | dependencies: 223 | mime-db "1.52.0" 224 | 225 | proxy-from-env@^1.1.0: 226 | version "1.1.0" 227 | resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" 228 | integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== 229 | 230 | punycode@1.3.2: 231 | version "1.3.2" 232 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" 233 | integrity sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw== 234 | 235 | querystring@0.2.0: 236 | version "0.2.0" 237 | resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" 238 | integrity sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g== 239 | 240 | sax@1.2.1: 241 | version "1.2.1" 242 | resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.1.tgz#7b8e656190b228e81a66aea748480d828cd2d37a" 243 | integrity sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA== 244 | 245 | sax@>=0.6.0: 246 | version "1.2.4" 247 | resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" 248 | integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== 249 | 250 | url@0.10.3: 251 | version "0.10.3" 252 | resolved "https://registry.yarnpkg.com/url/-/url-0.10.3.tgz#021e4d9c7705f21bbf37d03ceb58767402774c64" 253 | integrity sha512-hzSUW2q06EqL1gKM/a+obYHLIO6ct2hwPuviqTTOcfFVc61UbfJ2Q32+uGL/HCPxKqrdGB5QUwIe7UqlDgwsOQ== 254 | dependencies: 255 | punycode "1.3.2" 256 | querystring "0.2.0" 257 | 258 | util@^0.12.4: 259 | version "0.12.5" 260 | resolved "https://registry.yarnpkg.com/util/-/util-0.12.5.tgz#5f17a6059b73db61a875668781a1c2b136bd6fbc" 261 | integrity sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA== 262 | dependencies: 263 | inherits "^2.0.3" 264 | is-arguments "^1.0.4" 265 | is-generator-function "^1.0.7" 266 | is-typed-array "^1.1.3" 267 | which-typed-array "^1.1.2" 268 | 269 | uuid@8.0.0: 270 | version "8.0.0" 271 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.0.0.tgz#bc6ccf91b5ff0ac07bbcdbf1c7c4e150db4dbb6c" 272 | integrity sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw== 273 | 274 | which-typed-array@^1.1.2: 275 | version "1.1.9" 276 | resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.9.tgz#307cf898025848cf995e795e8423c7f337efbde6" 277 | integrity sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA== 278 | dependencies: 279 | available-typed-arrays "^1.0.5" 280 | call-bind "^1.0.2" 281 | for-each "^0.3.3" 282 | gopd "^1.0.1" 283 | has-tostringtag "^1.0.0" 284 | is-typed-array "^1.1.10" 285 | 286 | xml2js@0.4.19: 287 | version "0.4.19" 288 | resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.19.tgz#686c20f213209e94abf0d1bcf1efaa291c7827a7" 289 | integrity sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q== 290 | dependencies: 291 | sax ">=0.6.0" 292 | xmlbuilder "~9.0.1" 293 | 294 | xmlbuilder@~9.0.1: 295 | version "9.0.7" 296 | resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d" 297 | integrity sha512-7YXTQc3P2l9+0rjaUbLwMKRhtmwg1M1eDf6nag7urC7pIPYLD9W/jmzQ4ptRSUbodw5S0jfoGTflLemQibSpeQ== 298 | --------------------------------------------------------------------------------