diff --git a/Ronald/Clase17_NYTimes/booksYYT.js b/Ronald/Clase17_NYTimes/booksYYT.js
index c4fd7062..87274775 100644
--- a/Ronald/Clase17_NYTimes/booksYYT.js
+++ b/Ronald/Clase17_NYTimes/booksYYT.js
@@ -30,9 +30,6 @@ xmlHttp.onreadystatechange = function() {
document.getElementsByTagName("A")[i].setAttribute("href",objeto[i].amazon_product_url);
document.getElementsByTagName("A")[i].innerHTML = "Comprarlo en Amazon";
- //document.getElementById("libros").innerHTML += "
"+objeto[i].title;
- // document.getElementById("libros").innerHTML += "
"+objeto[i].bookimage;
-
}
diff --git a/Ronald/Clase18_NYTimesII/dashboard.js b/Ronald/Clase18_NYTimesII/dashboard.js
index 65e97fe9..4c0393b2 100644
--- a/Ronald/Clase18_NYTimesII/dashboard.js
+++ b/Ronald/Clase18_NYTimesII/dashboard.js
@@ -6,27 +6,17 @@ function bestSeller(url){
})
.then(function(data){
- //console.log(data.results);
var lista = data.results;
for (var i=0; i"+[i+1]+". "+lista[i].list_name //+". "+objeto[i].title+" ( "+objeto[i].author+" )";
- //var direccion = objeto[i].book_image;
- //document.getElementsByTagName("IMG")[i].setAttribute("src",direccion);
+ document.getElementById("libros").appendChild(cajadiv);
+ document.getElementsByTagName("H3")[i].innerHTML += "
"+[i+1]+". "+lista[i].list_name
document.getElementsByTagName("P")[i].innerHTML += "Fecha de la publicación más antigua: " +lista[i].oldest_published_date + "
Fecha de la publicación más reciente: "+lista[i].newest_published_date +"
Frecuencia de actualización: "+lista[i].updated.toLowerCase();
document.getElementsByTagName("A")[i].setAttribute("href","carpeta"+[i]+"/lista"+[i]+".html");
document.getElementsByTagName("A")[i].innerHTML += "Ver lista completa";
diff --git a/Ronald/Clase22_BuenosDiasMadrid/BuenosdiasMadrid.js b/Ronald/Clase22_BuenosDiasMadrid/BuenosdiasMadrid.js
index 3e7a5dbc..7c30c43e 100644
--- a/Ronald/Clase22_BuenosDiasMadrid/BuenosdiasMadrid.js
+++ b/Ronald/Clase22_BuenosDiasMadrid/BuenosdiasMadrid.js
@@ -65,16 +65,7 @@ function tiempo_actual(){
document.getElementById("datos0").innerHTML = data.list[1].main.temp+" ºC
"+"Min "+data.list[1].main.temp_min+" ºC | "+"Max "+data.list[1].main.temp_max+" ºC
"+
"Hum "+data.list[1].main.humidity+"% | "+"Pres "+data.list[1].main.pressure+" psi
"+
"Viento "+data.list[1].wind.deg+"º | "+data.list[1].wind.speed+" Km/h";
- /* console.log(data.list[1].main.temp);
- data.list[1].main.temp_min
- data.list[1].main.temp_max
- data.list[1].main.humidity
- data.list[1].main.pressure
- data.list[1].wind.deg
- data.list[1].wind.speed
- console.log(data.list[1].weather[0].description);
- console.log(data.list[1].weather[0].icon);
- */
+
document.getElementById("icono1").setAttribute("src", "icons/"+data.list[9].weather[0].icon+".png");
document.getElementById("descripcion1").innerHTML = data.list[9].weather[0].description;
@@ -131,8 +122,6 @@ function contaminacion(){
}
}
- //aplicarle un for in
- //document.getElementById("datosContaminacion").innerHTML = data.SO2.parameter+" ("+data.SO2.abrebiation+") :"+data.SO2[12].valor+"µ g Medido por: " +data.SO2.technique;
})
diff --git a/Ronald/Clase30_Enrutado/clase30.js b/Ronald/Clase30_Enrutado/clase30.js
index 17e7733c..9b50eb6e 100644
--- a/Ronald/Clase30_Enrutado/clase30.js
+++ b/Ronald/Clase30_Enrutado/clase30.js
@@ -1,23 +1,23 @@
-var direccion = "http://airemad.com/api/v1/pollution/" //la direccion a la que se hará la peticion fetch
+var direccion = "http://airemad.com/api/v1/pollution/"
//las rutas con la librería de page.js
-page.base('/'); //al cargar el html me lanzará a la pagina inicial directamente, no a una ruta concreta
-page('/', index); //llevaría al index, pagina principal
-page('estaciones', estaciones ); //ruta a todas las estaciones
-page('estaciones/:id', generaEstacion ); //ruta a una estacion concreta que se encontraría dentro de la ruta general de estaciones
-page('efectos', efectos); //ruta a una imagen de los efectos de la contaminacion
-page('*', notfound); //en caso de no dirigirse a una ninguna ruta especificada
-page(); //para que se ejecute las rutas, ya que es una funcion
+page.base('/');
+page('/', index);
+page('estaciones', estaciones );
+page('estaciones/:id', generaEstacion );
+page('efectos', efectos);
+page('*', notfound);
+page();
page("/");
function index() {
document.querySelector('p')
- .textContent = 'Bienvenido!!'; //al cargar la página nos mostraría un saludo.
+ .textContent = 'Bienvenido!!';
}
function estaciones() {
- document.getElementById("datosContaminacion").innerHTML = ""; //limpio el html de cualquier dato previo
- fetch("http://airemad.com/api/v1/pollution") //fetch a una json con todos los nombres de las estaciones de Madrid
+ document.getElementById("datosContaminacion").innerHTML = "";
+ fetch("http://airemad.com/api/v1/pollution")
.then(function(response){
return response.json();
})
@@ -36,8 +36,8 @@ function estaciones() {
})
}
-function generaEstacion(ctx){ //ctx es un parametro que me llegaría cuando el usuario se posiciona encima de cada estacion.
- console.log(ctx.params.id); //paramst.id lo añado para llegar exclusivamente al id de cada estacion y asi añadirlo a la url del fetch y poder traer los datos de una estacion concreta con su id.
+function generaEstacion(ctx){
+ console.log(ctx.params.id);
fetch(direccion+ctx.params.id)
.then(function(response){
@@ -59,7 +59,7 @@ function generaEstacion(ctx){ //ctx es un parametro que me llegaría cuando el u
})
}
-function efectos () { //Esta función me daría mostraría en el dom una foto de los efectos de la contaminacion, retirando previamente el contenido de las otras rutas.
+function efectos () { //foto de los efectos de la contaminacion
document.getElementById("datosContaminacion").innerHTML = "";
let foto = document.createElement("img");
foto.classList.add("efectos");
diff --git a/Ronald/Clase43_BaseDatos/clase43.js b/Ronald/Clase43_BaseDatos/clase43.js
index c556bf65..4e3d10a0 100644
--- a/Ronald/Clase43_BaseDatos/clase43.js
+++ b/Ronald/Clase43_BaseDatos/clase43.js
@@ -1,5 +1,3 @@
-
-// Your web app's Firebase configuration
var firebaseConfig = {
apiKey: "",
authDomain: "peliculas-f276d.firebaseapp.com",
@@ -12,8 +10,8 @@ var firebaseConfig = {
// Initialize Firebase
firebase.initializeApp(firebaseConfig);
let ref = firebase.database().ref();
-ref.on("value", function(snapshot){ //Imprimo en el DOM la peliculas que están ya en la base de datos
- snapshot.forEach(function(childsnapshot){ //el forEach es necesario para que recorra cada objeto y poder meterme en un valor de cada objeto
+ref.on("value", function(snapshot){ //Imprimo en DOM
+ snapshot.forEach(function(childsnapshot){
console.log(childsnapshot.val().Title);
document.getElementById("busquedas").innerHTML += " ";
document.getElementById("busquedas").innerHTML += childsnapshot.val().Title+"
";
@@ -21,26 +19,24 @@ ref.on("value", function(snapshot){ //Imprimo en el DOM la peliculas que está
});
document.getElementById("enviar").addEventListener("click",function(){
- let peticion = document.getElementById("pelicula").value.toLowerCase(); //Cojo el input y lo paso a minusculas para que coincida con la base de datos que lo tendré todo en minusculas
+ let peticion = document.getElementById("pelicula").value.toLowerCase();
let ref = firebase.database().ref(peticion);
let previas = document.getElementById("busquedas").innerText;
- let expresionRegular = new RegExp(peticion, "gi"); //creo una regexp que incluya el input y detecte si coincide con las peliculas que están ya almacenadas en la base de datos
+ let expresionRegular = new RegExp(peticion, "gi");
if(expresionRegular.test(previas)){
console.log("pelicula repetida");
ref.on("value",function(snapshot){
console.log(snapshot.val());
- document.getElementById("contenido").innerText= " "; //Para que me limpie el DOM de alguna busqueda previa
- //document.getElementById("busquedas").innerText= " "; //Para que me limpie el DOM de las anteriores values sino se me añade los nuevos values con los anteriores que ya estaban en el DOM
+ document.getElementById("contenido").innerText= " ";
let data = snapshot.val();
- for (let clave in data){ //recorro el json
- //console.log(typeof(data[clave]));
- if (typeof(data[clave]) === `string` ){ //Para eliminar la escritura de objetos en el dom, y que solo me escriba cadenas string.
+ for (let clave in data){
+ if (typeof(data[clave]) === `string` ){
document.getElementById("contenido").innerHTML += `${clave}:${data[clave]}
`;
}
};
- document.getElementById("poster").setAttribute("src",data.Poster); //saco el poster de la película
+ document.getElementById("poster").setAttribute("src",data.Poster);
});
}else{
@@ -51,21 +47,19 @@ document.getElementById("enviar").addEventListener("click",function(){
return response.json();
})
.then(function(data){
- //console.log(data)
- document.getElementById("contenido").innerText= " "; //Para que me limpie el DOM de alguna busqueda previa
- document.getElementById("busquedas").innerText= " "; //Para que me limpie el DOM de las anteriores values sino se me añade los nuevos values con los anteriores que ya estaban en el DOM
- for (let clave in data){ //recorro el json
- if (typeof(data[clave]) === `string` ){ //Para eliminar la escritura de objetos en el dom, y que solo me escriba cadenas string.
+ document.getElementById("contenido").innerText= " ";
+ document.getElementById("busquedas").innerText= " ";
+ for (let clave in data){
+ if (typeof(data[clave]) === `string` ){
document.getElementById("contenido").innerHTML += `${clave}:${data[clave]}
`;
}
};
- document.getElementById("poster").setAttribute("src",data.Poster); //saco el poster de la película
- //Para prevenir que no se suban a la base de datos, las peliculas que no se encuentran pero que dan igualmente un json de respuesta.
+ document.getElementById("poster").setAttribute("src",data.Poster);
if(data.Response == "False"){
console.log("no se sube esta pelicula");
document.getElementById("busquedas").innerHTML = "Vuelve a probar con otro nombre!!";
}else{
- ref.set(data); //aqui sí se sube la pelicula
+ ref.set(data);
}
})
@@ -77,14 +71,14 @@ document.getElementById("enviar").addEventListener("click",function(){
});
-//Para borrar una pelicula de la base de datos.
+// borrar pelicula
document.getElementById("enviarBorrar").addEventListener("click",function(){
let pelicula = document.getElementById("peliculaBorrar").value.toLowerCase();
let previas = document.getElementById("busquedas").innerText;
- let expresionRegular = new RegExp(pelicula, "gi"); //le paso una expresion regular para que solo pueda leer una pelicula que esté en la base de datos y no cualquier input.
+ let expresionRegular = new RegExp(pelicula, "gi");
if(expresionRegular.test(previas)){
- document.getElementById("busquedas").innerText= " "; //limpia previamente el dom para que no se sobreescriba al generarse el nuevo evento.
- firebase.database().ref(pelicula).remove(); //elimina la pelicula
+ document.getElementById("busquedas").innerText= " ";
+ firebase.database().ref(pelicula).remove();
};
});
\ No newline at end of file
diff --git a/Ronald/Clase44_Autentificacion/clase44.js b/Ronald/Clase44_Autentificacion/clase44.js
index 8839dcf3..cf3cc8f0 100644
--- a/Ronald/Clase44_Autentificacion/clase44.js
+++ b/Ronald/Clase44_Autentificacion/clase44.js
@@ -7,52 +7,50 @@ var firebaseConfig = {
messagingSenderId: "715185555678",
appId: "1:715185555678:web:0e10b0e8e87b6572fd9a4f"
};
- // Initialize Firebase
+// Initialize Firebase
firebase.initializeApp(firebaseConfig);
-//Para mostrar en el DOM los usuarios ya registrados previamente y almacenados en la base de datos
+//Mostrar en el DOM
let ref = firebase.database().ref("usuariosRegistrados");
ref.on("value",function(snapshot){
- document.getElementById("usuariosRegistrados").innerHTML = ""; //Me limpia el DOM de los anteriores datos para que no se escriban dos veces los usurios
- snapshot.forEach(function(childSnapshot){ //recorro los usuarios(los hijos de usuariosRegistrados)
+ document.getElementById("usuariosRegistrados").innerHTML = "";
+ snapshot.forEach(function(childSnapshot){
document.getElementById("usuariosRegistrados").innerHTML += `${childSnapshot.val().name} ${childSnapshot.val().surname}
`
console.log("usuarios registrados en el sistema:",childSnapshot.val());
})
});
-document.getElementById("acceso").style.display = "none"; //Permanece oculto para nuevos usuarios
+document.getElementById("acceso").style.display = "none";
-//Acceso mediante github
+//github
document.getElementById("github").addEventListener("click",function(){
var provider = new firebase.auth.GithubAuthProvider();
firebase.auth().signInWithPopup(provider).then(function(result) {
- var token = result.credential.accessToken;// This gives you a GitHub Access Token. You can use it to access the GitHub API
- var user = result.user;// The signed-in user info.
+ var token = result.credential.accessToken;
+ var user = result.user;
console.log(user);
- }).catch(function(error) { // Handle Errors here.
+ }).catch(function(error) {
var errorCode = error.code;
var errorMessage = error.message;
- var email = error.email;// The email of the user's account used.
- var credential = error.credential;// The firebase.auth.AuthCredential type that was used.
+ var email = error.email;
+ var credential = error.credential;
console.log(errorMessage);
document.getElementById("validacion").innerText = errorCode;
});
});
-//Para ver los usuarios conectados o registrados
+//Para usuarios conectados o registrados
firebase.auth().onAuthStateChanged(function(user) {
if (user) {
- // User is signed in.
console.log(`el ususario ${user.email} está conectado`)
document.getElementById("usuariosOnline").innerText = `${user.email} esta conectado`;
} else {
- // No user is signed in.
console.log(`Ningun usuario logueado`)
}
});
-//Para usuarios ya registrados, despliega el formulario de acceso
+//Para usuarios ya registrados,
document.getElementById("boton").addEventListener("click", accesoRegistrado);
function accesoRegistrado(){
document.getElementById("registro").style.display = "none";
@@ -60,7 +58,7 @@ function accesoRegistrado(){
document.getElementById("boton").style.display = "none";
}
-//Registro de usuario:
+//Registro:
document.getElementById("enviar").addEventListener("click", registro);
function registro(){
let nombre = document.getElementById("nombre").value;
@@ -73,22 +71,21 @@ function registro(){
console.log(errorCode+"("+errorMessage+")");
document.getElementById("validacion").innerText = errorCode;
});
- let ref = firebase.database().ref("usuariosRegistrados/"+nombre); //accedo a la base de datos para registrar el nuevo usuario.
- let datos = { //recopilo los datos del nuevo usuario en un objeto
+ let ref = firebase.database().ref("usuariosRegistrados/"+nombre); //registro el nuevo usuario.
+ let datos = {
name: nombre,
surname: apellido,
email: email
}
- ref.set(datos); //registro el nuevo usuario en la base de datos.
+ ref.set(datos);
}
-//Acceso, log in de usuarios ya registrados.
+// log in
document.getElementById("enviar2").addEventListener("click", acceso);
function acceso(){
let email2 = document.getElementById("correo2").value;
let password2 = document.getElementById("contraseña2").value;
firebase.auth().signInWithEmailAndPassword(email2, password2).catch(function(error) {
- // Handle Errors here.
var errorCode = error.code;
var errorMessage = error.message;
console.log(error.code);
@@ -100,23 +97,23 @@ function acceso(){
});
};
-//Log out de usuarios que se acaban de registrar.
+//Log out
document.getElementById("salir").addEventListener("click", salir);
function salir(){
firebase.auth().signOut().then(function() {
- console.log("Deslogado") // Sign-out successful.
+ console.log("Deslogado")
document.getElementById("usuariosOnline").innerHTML = `Desconectado`;
}).catch(function(error) {
- console.log("Error en el signOut") // An error happened.
+ console.log("Error en el signOut")
});
};
-//Log out de usuarios ya registrados (en la ventana exclusiva de usuarios ya registardos)
+//Log out ( ventana exclusiva de usuarios ya registardos)
document.getElementById("salir2").addEventListener("click", salir2);
function salir2(){
firebase.auth().signOut().then(function() {
- console.log("Deslogado") // Sign-out successful.
+ console.log("Deslogado")
document.getElementById("usuariosOnline").innerHTML = `Desconectado`;
}).catch(function(error) {
- console.log("Error en el SignOut") // An error happened.
+ console.log("Error en el SignOut")
});
};
\ No newline at end of file
diff --git a/Ronald/Clase59_Yeoman/Readme.txt b/Ronald/Clase59_Yeoman/Readme.txt
new file mode 100644
index 00000000..d6e37a32
--- /dev/null
+++ b/Ronald/Clase59_Yeoman/Readme.txt
@@ -0,0 +1,5 @@
+Ejercicio con generadores.
+
+Paginaweb hosteada en github pages:
+
+https://rspineda.github.io/reformasnimboma/
\ No newline at end of file
diff --git a/Ronald/Clase68_MovieFireExpress/.gitignore b/Ronald/Clase68_MovieFireExpress/.gitignore
new file mode 100644
index 00000000..dda8c623
--- /dev/null
+++ b/Ronald/Clase68_MovieFireExpress/.gitignore
@@ -0,0 +1,38 @@
+# Logs
+logs
+*.log
+firebase-debug.log*
+
+# Firebase cache
+.firebase/
+
+# Runtime data
+pids
+*.pid
+*.seed
+*.pid.lock
+
+
+# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
+.grunt
+
+
+# node-waf configuration
+.lock-wscript
+
+
+# Dependency directories
+node_modules/
+
+# Optional npm cache directory
+.npm
+
+# Optional eslint cache
+.eslintcache
+
+# Optional REPL history
+.node_repl_history
+
+
+# dotenv environment variables file
+.env
diff --git a/Ronald/Clase68_MovieFireExpress/config.js b/Ronald/Clase68_MovieFireExpress/config.js
new file mode 100644
index 00000000..16a91b2c
--- /dev/null
+++ b/Ronald/Clase68_MovieFireExpress/config.js
@@ -0,0 +1,16 @@
+dotenv = require('dotenv');
+dotenv.config();
+
+module.exports = {
+ port: process.env.PORT || 3000,
+ apikey: process.env.API_KEY_FILM,
+ firebase : {
+ apiKey: process.env.API_KEY,
+ authDomain: process.env.API_DOMAIN,
+ databaseURL: process.env.API_URL,
+ projectId: process.env.PROJECT_ID,
+ storageBucket: process.env.STORAGE_BUCKET,
+ messagingSenderId: process.env.SENDER_ID,
+ appId: process.env.API_ID
+ }
+}
\ No newline at end of file
diff --git a/Ronald/Clase68_MovieFireExpress/package-lock.json b/Ronald/Clase68_MovieFireExpress/package-lock.json
new file mode 100644
index 00000000..91c14a59
--- /dev/null
+++ b/Ronald/Clase68_MovieFireExpress/package-lock.json
@@ -0,0 +1,1325 @@
+{
+ "name": "clase68peliculas",
+ "version": "1.0.0",
+ "lockfileVersion": 1,
+ "requires": true,
+ "dependencies": {
+ "@babel/helper-validator-identifier": {
+ "version": "7.10.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz",
+ "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw=="
+ },
+ "@babel/parser": {
+ "version": "7.10.1",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.1.tgz",
+ "integrity": "sha512-AUTksaz3FqugBkbTZ1i+lDLG5qy8hIzCaAxEtttU6C0BtZZU9pkNZtWSVAht4EW9kl46YBiyTGMp9xTTGqViNg=="
+ },
+ "@babel/types": {
+ "version": "7.10.1",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.1.tgz",
+ "integrity": "sha512-L2yqUOpf3tzlW9GVuipgLEcZxnO+96SzR6fjXMuxxNkIgFJ5+07mHCZ+HkHqaeZu8+3LKnNJJ1bKbjBETQAsrA==",
+ "requires": {
+ "@babel/helper-validator-identifier": "^7.10.1",
+ "lodash": "^4.17.13",
+ "to-fast-properties": "^2.0.0"
+ }
+ },
+ "@firebase/analytics": {
+ "version": "0.3.5",
+ "resolved": "https://registry.npmjs.org/@firebase/analytics/-/analytics-0.3.5.tgz",
+ "integrity": "sha512-p+h1s9A8EjGWfjAObu8ei46JoN2Ogbtl1RzqW7HjcPuclOIOmPTXKEXXCEXgO79OLxnzzezVeBtHPSx6r6gxJA==",
+ "requires": {
+ "@firebase/analytics-types": "0.3.1",
+ "@firebase/component": "0.1.12",
+ "@firebase/installations": "0.4.10",
+ "@firebase/logger": "0.2.4",
+ "@firebase/util": "0.2.47",
+ "tslib": "1.11.1"
+ }
+ },
+ "@firebase/analytics-types": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/@firebase/analytics-types/-/analytics-types-0.3.1.tgz",
+ "integrity": "sha512-63vVJ5NIBh/JF8l9LuPrQYSzFimk7zYHySQB4Dk9rVdJ8kV/vGQoVTvRu1UW05sEc2Ug5PqtEChtTHU+9hvPcA=="
+ },
+ "@firebase/app": {
+ "version": "0.6.4",
+ "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.6.4.tgz",
+ "integrity": "sha512-E1Zw6yeZYdYYFurMnklKPvE+q/xleHXs7bmcVgyhgAEg3Gv6/qXI4+4GdWh+iF7wmQ3Liesh51xqfdpvHBwAMQ==",
+ "requires": {
+ "@firebase/app-types": "0.6.1",
+ "@firebase/component": "0.1.12",
+ "@firebase/logger": "0.2.4",
+ "@firebase/util": "0.2.47",
+ "dom-storage": "2.1.0",
+ "tslib": "1.11.1",
+ "xmlhttprequest": "1.8.0"
+ }
+ },
+ "@firebase/app-types": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.6.1.tgz",
+ "integrity": "sha512-L/ZnJRAq7F++utfuoTKX4CLBG5YR7tFO3PLzG1/oXXKEezJ0kRL3CMRoueBEmTCzVb/6SIs2Qlaw++uDgi5Xyg=="
+ },
+ "@firebase/auth": {
+ "version": "0.14.6",
+ "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-0.14.6.tgz",
+ "integrity": "sha512-7gaEUWhUubWBGfOXAZvpTpJqBJT9KyG83RXC6VnjSQIfNUaarHZ485WkzERil43A6KvIl+f4kHxfZShE6ZCK3A==",
+ "requires": {
+ "@firebase/auth-types": "0.10.1"
+ }
+ },
+ "@firebase/auth-interop-types": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/@firebase/auth-interop-types/-/auth-interop-types-0.1.5.tgz",
+ "integrity": "sha512-88h74TMQ6wXChPA6h9Q3E1Jg6TkTHep2+k63OWg3s0ozyGVMeY+TTOti7PFPzq5RhszQPQOoCi59es4MaRvgCw=="
+ },
+ "@firebase/auth-types": {
+ "version": "0.10.1",
+ "resolved": "https://registry.npmjs.org/@firebase/auth-types/-/auth-types-0.10.1.tgz",
+ "integrity": "sha512-/+gBHb1O9x/YlG7inXfxff/6X3BPZt4zgBv4kql6HEmdzNQCodIRlEYnI+/da+lN+dha7PjaFH7C7ewMmfV7rw=="
+ },
+ "@firebase/component": {
+ "version": "0.1.12",
+ "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.1.12.tgz",
+ "integrity": "sha512-03w800MxR/EW1m7N0Q46WNcngwdDIHDWpFPHTdbZEI6U/HuLks5RJQlBxWqb1P73nYPkN8YP3U8gTdqrDpqY3Q==",
+ "requires": {
+ "@firebase/util": "0.2.47",
+ "tslib": "1.11.1"
+ }
+ },
+ "@firebase/database": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/@firebase/database/-/database-0.6.3.tgz",
+ "integrity": "sha512-gHoCISHQVLoq+rGu+PorYxMkhsjhXov3ocBxz/0uVdznNhrbKkAZaEKF+dIAsUPDlwSYeZuwWuik7xcV3DtRaw==",
+ "requires": {
+ "@firebase/auth-interop-types": "0.1.5",
+ "@firebase/component": "0.1.12",
+ "@firebase/database-types": "0.5.1",
+ "@firebase/logger": "0.2.4",
+ "@firebase/util": "0.2.47",
+ "faye-websocket": "0.11.3",
+ "tslib": "1.11.1"
+ }
+ },
+ "@firebase/database-types": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-0.5.1.tgz",
+ "integrity": "sha512-onQxom1ZBYBJ648w/VNRzUewovEDAH7lvnrrpCd69ukkyrMk6rGEO/PQ9BcNEbhlNtukpsqRS0oNOFlHs0FaSA==",
+ "requires": {
+ "@firebase/app-types": "0.6.1"
+ }
+ },
+ "@firebase/firestore": {
+ "version": "1.14.5",
+ "resolved": "https://registry.npmjs.org/@firebase/firestore/-/firestore-1.14.5.tgz",
+ "integrity": "sha512-BZD3RqlAEnq15i8Y53VUFsuWkbujslGaQIcuEnt6bOENzlKiLBwESmt/uGKRIsdQjc1krG2qdoPmaSMqULR0dA==",
+ "requires": {
+ "@firebase/component": "0.1.12",
+ "@firebase/firestore-types": "1.10.2",
+ "@firebase/logger": "0.2.4",
+ "@firebase/util": "0.2.47",
+ "@firebase/webchannel-wrapper": "0.2.41",
+ "@grpc/grpc-js": "0.8.1",
+ "@grpc/proto-loader": "^0.5.0",
+ "tslib": "1.11.1"
+ }
+ },
+ "@firebase/firestore-types": {
+ "version": "1.10.2",
+ "resolved": "https://registry.npmjs.org/@firebase/firestore-types/-/firestore-types-1.10.2.tgz",
+ "integrity": "sha512-T1GttZezQ+gUpdDgLeLOvgS3KMeeIuodQ+JBBEd6M11zdilfTHsEHhmli15c6V3g/PfuFzyKDKExe05lPuYe4w=="
+ },
+ "@firebase/functions": {
+ "version": "0.4.44",
+ "resolved": "https://registry.npmjs.org/@firebase/functions/-/functions-0.4.44.tgz",
+ "integrity": "sha512-Nbw+V/jYqfgq7wscsSDidqIzx8TrnmA2wRD1auCFNmf+gSJg8o+gNyCDdNHZI407jvrZcxp3nG1eMbqwmmnp7Q==",
+ "requires": {
+ "@firebase/component": "0.1.12",
+ "@firebase/functions-types": "0.3.17",
+ "@firebase/messaging-types": "0.4.5",
+ "isomorphic-fetch": "2.2.1",
+ "tslib": "1.11.1"
+ }
+ },
+ "@firebase/functions-types": {
+ "version": "0.3.17",
+ "resolved": "https://registry.npmjs.org/@firebase/functions-types/-/functions-types-0.3.17.tgz",
+ "integrity": "sha512-DGR4i3VI55KnYk4IxrIw7+VG7Q3gA65azHnZxo98Il8IvYLr2UTBlSh72dTLlDf25NW51HqvJgYJDKvSaAeyHQ=="
+ },
+ "@firebase/installations": {
+ "version": "0.4.10",
+ "resolved": "https://registry.npmjs.org/@firebase/installations/-/installations-0.4.10.tgz",
+ "integrity": "sha512-Nf7VK9++0eQzjdvBkBNNaOdxPjFiKD0EllLCIQycHozF97BmuFUqb2Ik5L2JaWspWg7vxLNacLHvW48nPGx4Zw==",
+ "requires": {
+ "@firebase/component": "0.1.12",
+ "@firebase/installations-types": "0.3.4",
+ "@firebase/util": "0.2.47",
+ "idb": "3.0.2",
+ "tslib": "1.11.1"
+ }
+ },
+ "@firebase/installations-types": {
+ "version": "0.3.4",
+ "resolved": "https://registry.npmjs.org/@firebase/installations-types/-/installations-types-0.3.4.tgz",
+ "integrity": "sha512-RfePJFovmdIXb6rYwtngyxuEcWnOrzdZd9m7xAW0gRxDIjBT20n3BOhjpmgRWXo/DAxRmS7bRjWAyTHY9cqN7Q=="
+ },
+ "@firebase/logger": {
+ "version": "0.2.4",
+ "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.2.4.tgz",
+ "integrity": "sha512-akHkOU7izYB1okp/B5sxClGjjw6KvZdSHyjNM5pKd67Zg5W6PsbkI/GFNv21+y6LkUkJwDRbdeDgJoYXWT3mMA=="
+ },
+ "@firebase/messaging": {
+ "version": "0.6.16",
+ "resolved": "https://registry.npmjs.org/@firebase/messaging/-/messaging-0.6.16.tgz",
+ "integrity": "sha512-TAPISK5y3xbxUw81HxLDP6YPsRryU6Nl8Z7AjNnem13BoN9LJ2/wCi9RDMfPnQhAn0h0N+mpxy/GB+0IlEARlg==",
+ "requires": {
+ "@firebase/component": "0.1.12",
+ "@firebase/installations": "0.4.10",
+ "@firebase/messaging-types": "0.4.5",
+ "@firebase/util": "0.2.47",
+ "idb": "3.0.2",
+ "tslib": "1.11.1"
+ }
+ },
+ "@firebase/messaging-types": {
+ "version": "0.4.5",
+ "resolved": "https://registry.npmjs.org/@firebase/messaging-types/-/messaging-types-0.4.5.tgz",
+ "integrity": "sha512-sux4fgqr/0KyIxqzHlatI04Ajs5rc3WM+WmtCpxrKP1E5Bke8xu/0M+2oy4lK/sQ7nov9z15n3iltAHCgTRU3Q=="
+ },
+ "@firebase/performance": {
+ "version": "0.3.4",
+ "resolved": "https://registry.npmjs.org/@firebase/performance/-/performance-0.3.4.tgz",
+ "integrity": "sha512-VDoqJSB+2RuXlyyP7oSvBPEmoznG84HmEtb8DQWsAHeVkf+qlec1OTZR8IjktlIv+8Pg8MMuYoB0crx5g7xU5A==",
+ "requires": {
+ "@firebase/component": "0.1.12",
+ "@firebase/installations": "0.4.10",
+ "@firebase/logger": "0.2.4",
+ "@firebase/performance-types": "0.0.13",
+ "@firebase/util": "0.2.47",
+ "tslib": "1.11.1"
+ }
+ },
+ "@firebase/performance-types": {
+ "version": "0.0.13",
+ "resolved": "https://registry.npmjs.org/@firebase/performance-types/-/performance-types-0.0.13.tgz",
+ "integrity": "sha512-6fZfIGjQpwo9S5OzMpPyqgYAUZcFzZxHFqOyNtorDIgNXq33nlldTL/vtaUZA8iT9TT5cJlCrF/jthKU7X21EA=="
+ },
+ "@firebase/polyfill": {
+ "version": "0.3.36",
+ "resolved": "https://registry.npmjs.org/@firebase/polyfill/-/polyfill-0.3.36.tgz",
+ "integrity": "sha512-zMM9oSJgY6cT2jx3Ce9LYqb0eIpDE52meIzd/oe/y70F+v9u1LDqk5kUF5mf16zovGBWMNFmgzlsh6Wj0OsFtg==",
+ "requires": {
+ "core-js": "3.6.5",
+ "promise-polyfill": "8.1.3",
+ "whatwg-fetch": "2.0.4"
+ },
+ "dependencies": {
+ "whatwg-fetch": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz",
+ "integrity": "sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng=="
+ }
+ }
+ },
+ "@firebase/remote-config": {
+ "version": "0.1.21",
+ "resolved": "https://registry.npmjs.org/@firebase/remote-config/-/remote-config-0.1.21.tgz",
+ "integrity": "sha512-EwDNU1mT+8Jn66IUwwNP5SM8AbaI7wmCXjp7djZtTXNrpPoh3xqzSRM1vTgp4Uu/mHffEDfbydsoJAIftADIfQ==",
+ "requires": {
+ "@firebase/component": "0.1.12",
+ "@firebase/installations": "0.4.10",
+ "@firebase/logger": "0.2.4",
+ "@firebase/remote-config-types": "0.1.9",
+ "@firebase/util": "0.2.47",
+ "tslib": "1.11.1"
+ }
+ },
+ "@firebase/remote-config-types": {
+ "version": "0.1.9",
+ "resolved": "https://registry.npmjs.org/@firebase/remote-config-types/-/remote-config-types-0.1.9.tgz",
+ "integrity": "sha512-G96qnF3RYGbZsTRut7NBX0sxyczxt1uyCgXQuH/eAfUCngxjEGcZQnBdy6mvSdqdJh5mC31rWPO4v9/s7HwtzA=="
+ },
+ "@firebase/storage": {
+ "version": "0.3.34",
+ "resolved": "https://registry.npmjs.org/@firebase/storage/-/storage-0.3.34.tgz",
+ "integrity": "sha512-vuR1PpGdaCk25D2dT2trfmZZjpdfOn0rPTksvoqg7TAPLeoVsVoDyT2LgF3Arna/jqx52sAIRx1HLrlvzE1pgA==",
+ "requires": {
+ "@firebase/component": "0.1.12",
+ "@firebase/storage-types": "0.3.12",
+ "@firebase/util": "0.2.47",
+ "tslib": "1.11.1"
+ }
+ },
+ "@firebase/storage-types": {
+ "version": "0.3.12",
+ "resolved": "https://registry.npmjs.org/@firebase/storage-types/-/storage-types-0.3.12.tgz",
+ "integrity": "sha512-DDV6Fs6aYoGw3w/zZZTkqiipxihnsvHf6znbeZYjIIHit3tr1uLJdGPDPiCTfZcTGPpg2ux6ZmvNDvVgJdHALw=="
+ },
+ "@firebase/util": {
+ "version": "0.2.47",
+ "resolved": "https://registry.npmjs.org/@firebase/util/-/util-0.2.47.tgz",
+ "integrity": "sha512-RjcIvcfswyxYhf0OMXod+qeI/933wl9FGLIszf0/O1yMZ/s8moXcse7xnOpMjmQPRLB9vHzCMoxW5X90kKg/bQ==",
+ "requires": {
+ "tslib": "1.11.1"
+ }
+ },
+ "@firebase/webchannel-wrapper": {
+ "version": "0.2.41",
+ "resolved": "https://registry.npmjs.org/@firebase/webchannel-wrapper/-/webchannel-wrapper-0.2.41.tgz",
+ "integrity": "sha512-XcdMT5PSZHiuf7LJIhzKIe+RyYa25S3LHRRvLnZc6iFjwXkrSDJ8J/HWO6VT8d2ZTbawp3VcLEjRF/VN8glCrA=="
+ },
+ "@grpc/grpc-js": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-0.8.1.tgz",
+ "integrity": "sha512-e8gSjRZnOUefsR3obOgxG9RtYW2Mw83hh7ogE2ByCdgRhoX0mdnJwBcZOami3E0l643KCTZvORFwfSEi48KFIQ==",
+ "requires": {
+ "semver": "^6.2.0"
+ }
+ },
+ "@grpc/proto-loader": {
+ "version": "0.5.4",
+ "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.5.4.tgz",
+ "integrity": "sha512-HTM4QpI9B2XFkPz7pjwMyMgZchJ93TVkL3kWPW8GDMDKYxsMnmf4w2TNMJK7+KNiYHS5cJrCEAFlF+AwtXWVPA==",
+ "requires": {
+ "lodash.camelcase": "^4.3.0",
+ "protobufjs": "^6.8.6"
+ }
+ },
+ "@protobufjs/aspromise": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz",
+ "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78="
+ },
+ "@protobufjs/base64": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz",
+ "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg=="
+ },
+ "@protobufjs/codegen": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz",
+ "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg=="
+ },
+ "@protobufjs/eventemitter": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz",
+ "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A="
+ },
+ "@protobufjs/fetch": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz",
+ "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=",
+ "requires": {
+ "@protobufjs/aspromise": "^1.1.1",
+ "@protobufjs/inquire": "^1.1.0"
+ }
+ },
+ "@protobufjs/float": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz",
+ "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E="
+ },
+ "@protobufjs/inquire": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz",
+ "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik="
+ },
+ "@protobufjs/path": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz",
+ "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0="
+ },
+ "@protobufjs/pool": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz",
+ "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q="
+ },
+ "@protobufjs/utf8": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz",
+ "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA="
+ },
+ "@types/long": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz",
+ "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w=="
+ },
+ "@types/node": {
+ "version": "13.13.9",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.9.tgz",
+ "integrity": "sha512-EPZBIGed5gNnfWCiwEIwTE2Jdg4813odnG8iNPMQGrqVxrI+wL68SPtPeCX+ZxGBaA6pKAVc6jaKgP/Q0QzfdQ=="
+ },
+ "accepts": {
+ "version": "1.3.7",
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz",
+ "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==",
+ "requires": {
+ "mime-types": "~2.1.24",
+ "negotiator": "0.6.2"
+ }
+ },
+ "acorn": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.2.0.tgz",
+ "integrity": "sha512-apwXVmYVpQ34m/i71vrApRrRKCWQnZZF1+npOD0WV5xZFfwWOmKGQ2RWlfdy9vWITsenisM8M0Qeq8agcFHNiQ=="
+ },
+ "array-flatten": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
+ "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
+ },
+ "asap": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
+ "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY="
+ },
+ "assert-never": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/assert-never/-/assert-never-1.2.1.tgz",
+ "integrity": "sha512-TaTivMB6pYI1kXwrFlEhLeGfOqoDNdTxjCdwRfFFkEA30Eu+k48W34nlok2EYWJfFFzqaEmichdNM7th6M5HNw=="
+ },
+ "babel-walk": {
+ "version": "3.0.0-canary-5",
+ "resolved": "https://registry.npmjs.org/babel-walk/-/babel-walk-3.0.0-canary-5.tgz",
+ "integrity": "sha512-GAwkz0AihzY5bkwIY5QDR+LvsRQgB/B+1foMPvi0FZPMl5fjD7ICiznUiBdLYMH1QYe6vqu4gWYytZOccLouFw==",
+ "requires": {
+ "@babel/types": "^7.9.6"
+ }
+ },
+ "basic-auth": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz",
+ "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==",
+ "requires": {
+ "safe-buffer": "5.1.2"
+ }
+ },
+ "body-parser": {
+ "version": "1.19.0",
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz",
+ "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==",
+ "requires": {
+ "bytes": "3.1.0",
+ "content-type": "~1.0.4",
+ "debug": "2.6.9",
+ "depd": "~1.1.2",
+ "http-errors": "1.7.2",
+ "iconv-lite": "0.4.24",
+ "on-finished": "~2.3.0",
+ "qs": "6.7.0",
+ "raw-body": "2.4.0",
+ "type-is": "~1.6.17"
+ }
+ },
+ "bowser": {
+ "version": "2.9.0",
+ "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.9.0.tgz",
+ "integrity": "sha512-2ld76tuLBNFekRgmJfT2+3j5MIrP6bFict8WAIT3beq+srz1gcKNAdNKMqHqauQt63NmAa88HfP1/Ypa9Er3HA=="
+ },
+ "bytes": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
+ "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg=="
+ },
+ "camelize": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.0.tgz",
+ "integrity": "sha1-FkpUg+Yw+kMh5a8HAg5TGDGyYJs="
+ },
+ "character-parser": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/character-parser/-/character-parser-2.2.0.tgz",
+ "integrity": "sha1-x84o821LzZdE5f/CxfzeHHMmH8A=",
+ "requires": {
+ "is-regex": "^1.0.3"
+ }
+ },
+ "constantinople": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-4.0.1.tgz",
+ "integrity": "sha512-vCrqcSIq4//Gx74TXXCGnHpulY1dskqLTFGDmhrGxzeXL8lF8kvXv6mpNWlJj1uD4DW23D4ljAqbY4RRaaUZIw==",
+ "requires": {
+ "@babel/parser": "^7.6.0",
+ "@babel/types": "^7.6.1"
+ }
+ },
+ "content-disposition": {
+ "version": "0.5.3",
+ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz",
+ "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==",
+ "requires": {
+ "safe-buffer": "5.1.2"
+ }
+ },
+ "content-security-policy-builder": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/content-security-policy-builder/-/content-security-policy-builder-2.1.0.tgz",
+ "integrity": "sha512-/MtLWhJVvJNkA9dVLAp6fg9LxD2gfI6R2Fi1hPmfjYXSahJJzcfvoeDOxSyp4NvxMuwWv3WMssE9o31DoULHrQ=="
+ },
+ "content-type": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
+ "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA=="
+ },
+ "cookie": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz",
+ "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg=="
+ },
+ "cookie-signature": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
+ "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
+ },
+ "core-js": {
+ "version": "3.6.5",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.5.tgz",
+ "integrity": "sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA=="
+ },
+ "dasherize": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/dasherize/-/dasherize-2.0.0.tgz",
+ "integrity": "sha1-bYCcnNDPe7iVLYD8hPoT1H3bEwg="
+ },
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "depd": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
+ "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
+ },
+ "destroy": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
+ "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
+ },
+ "dns-prefetch-control": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/dns-prefetch-control/-/dns-prefetch-control-0.2.0.tgz",
+ "integrity": "sha512-hvSnros73+qyZXhHFjx2CMLwoj3Fe7eR9EJsFsqmcI1bB2OBWL/+0YzaEaKssCHnj/6crawNnUyw74Gm2EKe+Q=="
+ },
+ "doctypes": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz",
+ "integrity": "sha1-6oCxBqh1OHdOijpKWv4pPeSJ4Kk="
+ },
+ "dom-storage": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/dom-storage/-/dom-storage-2.1.0.tgz",
+ "integrity": "sha512-g6RpyWXzl0RR6OTElHKBl7nwnK87GUyZMYC7JWsB/IA73vpqK2K6LT39x4VepLxlSsWBFrPVLnsSR5Jyty0+2Q=="
+ },
+ "dont-sniff-mimetype": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/dont-sniff-mimetype/-/dont-sniff-mimetype-1.1.0.tgz",
+ "integrity": "sha512-ZjI4zqTaxveH2/tTlzS1wFp+7ncxNZaIEWYg3lzZRHkKf5zPT/MnEG6WL0BhHMJUabkh8GeU5NL5j+rEUCb7Ug=="
+ },
+ "dotenv": {
+ "version": "8.2.0",
+ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz",
+ "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw=="
+ },
+ "ee-first": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
+ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
+ },
+ "encodeurl": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
+ "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k="
+ },
+ "encoding": {
+ "version": "0.1.12",
+ "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz",
+ "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=",
+ "requires": {
+ "iconv-lite": "~0.4.13"
+ }
+ },
+ "escape-html": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
+ "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
+ },
+ "etag": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
+ "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc="
+ },
+ "expect-ct": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/expect-ct/-/expect-ct-0.2.0.tgz",
+ "integrity": "sha512-6SK3MG/Bbhm8MsgyJAylg+ucIOU71/FzyFalcfu5nY19dH8y/z0tBJU0wrNBXD4B27EoQtqPF/9wqH0iYAd04g=="
+ },
+ "express": {
+ "version": "4.17.1",
+ "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz",
+ "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==",
+ "requires": {
+ "accepts": "~1.3.7",
+ "array-flatten": "1.1.1",
+ "body-parser": "1.19.0",
+ "content-disposition": "0.5.3",
+ "content-type": "~1.0.4",
+ "cookie": "0.4.0",
+ "cookie-signature": "1.0.6",
+ "debug": "2.6.9",
+ "depd": "~1.1.2",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "etag": "~1.8.1",
+ "finalhandler": "~1.1.2",
+ "fresh": "0.5.2",
+ "merge-descriptors": "1.0.1",
+ "methods": "~1.1.2",
+ "on-finished": "~2.3.0",
+ "parseurl": "~1.3.3",
+ "path-to-regexp": "0.1.7",
+ "proxy-addr": "~2.0.5",
+ "qs": "6.7.0",
+ "range-parser": "~1.2.1",
+ "safe-buffer": "5.1.2",
+ "send": "0.17.1",
+ "serve-static": "1.14.1",
+ "setprototypeof": "1.1.1",
+ "statuses": "~1.5.0",
+ "type-is": "~1.6.18",
+ "utils-merge": "1.0.1",
+ "vary": "~1.1.2"
+ }
+ },
+ "express-request-id": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/express-request-id/-/express-request-id-1.4.1.tgz",
+ "integrity": "sha512-qpxK6XhDYtdx9FvxwCHkUeZVWtkGbWR87hBAzGECfwYF/QQCPXEwwB2/9NGkOR1tT7/aLs9mma3CT0vjSzuZVw==",
+ "requires": {
+ "uuid": "^3.3.2"
+ }
+ },
+ "faye-websocket": {
+ "version": "0.11.3",
+ "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz",
+ "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==",
+ "requires": {
+ "websocket-driver": ">=0.5.1"
+ }
+ },
+ "feature-policy": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/feature-policy/-/feature-policy-0.3.0.tgz",
+ "integrity": "sha512-ZtijOTFN7TzCujt1fnNhfWPFPSHeZkesff9AXZj+UEjYBynWNUIYpC87Ve4wHzyexQsImicLu7WsC2LHq7/xrQ=="
+ },
+ "finalhandler": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
+ "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
+ "requires": {
+ "debug": "2.6.9",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "on-finished": "~2.3.0",
+ "parseurl": "~1.3.3",
+ "statuses": "~1.5.0",
+ "unpipe": "~1.0.0"
+ }
+ },
+ "firebase": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/firebase/-/firebase-7.14.5.tgz",
+ "integrity": "sha512-1vrC1UZIVhaT7owaElQoEseP81xqRt6tHQmxRJRojn0yI3JNXrdWCFsD+26xA1eQQCwodJuMsYJLzQSScgjHuQ==",
+ "requires": {
+ "@firebase/analytics": "0.3.5",
+ "@firebase/app": "0.6.4",
+ "@firebase/app-types": "0.6.1",
+ "@firebase/auth": "0.14.6",
+ "@firebase/database": "0.6.3",
+ "@firebase/firestore": "1.14.5",
+ "@firebase/functions": "0.4.44",
+ "@firebase/installations": "0.4.10",
+ "@firebase/messaging": "0.6.16",
+ "@firebase/performance": "0.3.4",
+ "@firebase/polyfill": "0.3.36",
+ "@firebase/remote-config": "0.1.21",
+ "@firebase/storage": "0.3.34",
+ "@firebase/util": "0.2.47"
+ }
+ },
+ "forwarded": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
+ "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ="
+ },
+ "frameguard": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/frameguard/-/frameguard-3.1.0.tgz",
+ "integrity": "sha512-TxgSKM+7LTA6sidjOiSZK9wxY0ffMPY3Wta//MqwmX0nZuEHc8QrkV8Fh3ZhMJeiH+Uyh/tcaarImRy8u77O7g=="
+ },
+ "fresh": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
+ "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac="
+ },
+ "function-bind": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
+ },
+ "has": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+ "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+ "requires": {
+ "function-bind": "^1.1.1"
+ }
+ },
+ "helmet": {
+ "version": "3.22.0",
+ "resolved": "https://registry.npmjs.org/helmet/-/helmet-3.22.0.tgz",
+ "integrity": "sha512-Xrqicn2nm1ZIUxP3YGuTBmbDL04neKsIT583Sjh0FkiwKDXYCMUqGqC88w3NUvVXtA75JyR2Jn6jw6ZEMOD+ZA==",
+ "requires": {
+ "depd": "2.0.0",
+ "dns-prefetch-control": "0.2.0",
+ "dont-sniff-mimetype": "1.1.0",
+ "expect-ct": "0.2.0",
+ "feature-policy": "0.3.0",
+ "frameguard": "3.1.0",
+ "helmet-crossdomain": "0.4.0",
+ "helmet-csp": "2.10.0",
+ "hide-powered-by": "1.1.0",
+ "hpkp": "2.0.0",
+ "hsts": "2.2.0",
+ "ienoopen": "1.1.0",
+ "nocache": "2.1.0",
+ "referrer-policy": "1.2.0",
+ "x-xss-protection": "1.3.0"
+ },
+ "dependencies": {
+ "depd": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
+ "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="
+ }
+ }
+ },
+ "helmet-crossdomain": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/helmet-crossdomain/-/helmet-crossdomain-0.4.0.tgz",
+ "integrity": "sha512-AB4DTykRw3HCOxovD1nPR16hllrVImeFp5VBV9/twj66lJ2nU75DP8FPL0/Jp4jj79JhTfG+pFI2MD02kWJ+fA=="
+ },
+ "helmet-csp": {
+ "version": "2.10.0",
+ "resolved": "https://registry.npmjs.org/helmet-csp/-/helmet-csp-2.10.0.tgz",
+ "integrity": "sha512-Rz953ZNEFk8sT2XvewXkYN0Ho4GEZdjAZy4stjiEQV3eN7GDxg1QKmYggH7otDyIA7uGA6XnUMVSgeJwbR5X+w==",
+ "requires": {
+ "bowser": "2.9.0",
+ "camelize": "1.0.0",
+ "content-security-policy-builder": "2.1.0",
+ "dasherize": "2.0.0"
+ }
+ },
+ "hide-powered-by": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/hide-powered-by/-/hide-powered-by-1.1.0.tgz",
+ "integrity": "sha512-Io1zA2yOA1YJslkr+AJlWSf2yWFkKjvkcL9Ni1XSUqnGLr/qRQe2UI3Cn/J9MsJht7yEVCe0SscY1HgVMujbgg=="
+ },
+ "hpkp": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/hpkp/-/hpkp-2.0.0.tgz",
+ "integrity": "sha1-EOFCJk52IVpdMMROxD3mTe5tFnI="
+ },
+ "hsts": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/hsts/-/hsts-2.2.0.tgz",
+ "integrity": "sha512-ToaTnQ2TbJkochoVcdXYm4HOCliNozlviNsg+X2XQLQvZNI/kCHR9rZxVYpJB3UPcHz80PgxRyWQ7PdU1r+VBQ==",
+ "requires": {
+ "depd": "2.0.0"
+ },
+ "dependencies": {
+ "depd": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
+ "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="
+ }
+ }
+ },
+ "http-errors": {
+ "version": "1.7.2",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz",
+ "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==",
+ "requires": {
+ "depd": "~1.1.2",
+ "inherits": "2.0.3",
+ "setprototypeof": "1.1.1",
+ "statuses": ">= 1.5.0 < 2",
+ "toidentifier": "1.0.0"
+ }
+ },
+ "http-parser-js": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.2.tgz",
+ "integrity": "sha512-opCO9ASqg5Wy2FNo7A0sxy71yGbbkJJXLdgMK04Tcypw9jr2MgWbyubb0+WdmDmGnFflO7fRbqbaihh/ENDlRQ=="
+ },
+ "iconv-lite": {
+ "version": "0.4.24",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+ "requires": {
+ "safer-buffer": ">= 2.1.2 < 3"
+ }
+ },
+ "idb": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/idb/-/idb-3.0.2.tgz",
+ "integrity": "sha512-+FLa/0sTXqyux0o6C+i2lOR0VoS60LU/jzUo5xjfY6+7sEEgy4Gz1O7yFBXvjd7N0NyIGWIRg8DcQSLEG+VSPw=="
+ },
+ "ienoopen": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/ienoopen/-/ienoopen-1.1.0.tgz",
+ "integrity": "sha512-MFs36e/ca6ohEKtinTJ5VvAJ6oDRAYFdYXweUnGY9L9vcoqFOU4n2ZhmJ0C4z/cwGZ3YIQRSB3XZ1+ghZkY5NQ=="
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
+ },
+ "ipaddr.js": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
+ "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="
+ },
+ "is-expression": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-expression/-/is-expression-4.0.0.tgz",
+ "integrity": "sha512-zMIXX63sxzG3XrkHkrAPvm/OVZVSCPNkwMHU8oTX7/U3AL78I0QXCEICXUM13BIa8TYGZ68PiTKfQz3yaTNr4A==",
+ "requires": {
+ "acorn": "^7.1.1",
+ "object-assign": "^4.1.1"
+ }
+ },
+ "is-promise": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz",
+ "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ=="
+ },
+ "is-regex": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz",
+ "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==",
+ "requires": {
+ "has": "^1.0.3"
+ }
+ },
+ "is-stream": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
+ "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ="
+ },
+ "isomorphic-fetch": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz",
+ "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=",
+ "requires": {
+ "node-fetch": "^1.0.1",
+ "whatwg-fetch": ">=0.10.0"
+ },
+ "dependencies": {
+ "node-fetch": {
+ "version": "1.7.3",
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz",
+ "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==",
+ "requires": {
+ "encoding": "^0.1.11",
+ "is-stream": "^1.0.1"
+ }
+ }
+ }
+ },
+ "js-stringify": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/js-stringify/-/js-stringify-1.0.2.tgz",
+ "integrity": "sha1-Fzb939lyTyijaCrcYjCufk6Weds="
+ },
+ "jstransformer": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/jstransformer/-/jstransformer-1.0.0.tgz",
+ "integrity": "sha1-7Yvwkh4vPx7U1cGkT2hwntJHIsM=",
+ "requires": {
+ "is-promise": "^2.0.0",
+ "promise": "^7.0.1"
+ }
+ },
+ "lodash": {
+ "version": "4.17.15",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
+ "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A=="
+ },
+ "lodash.camelcase": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
+ "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY="
+ },
+ "long": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz",
+ "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA=="
+ },
+ "media-typer": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
+ "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g="
+ },
+ "merge-descriptors": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
+ "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E="
+ },
+ "methods": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
+ "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4="
+ },
+ "mime": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
+ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
+ },
+ "mime-db": {
+ "version": "1.44.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz",
+ "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg=="
+ },
+ "mime-types": {
+ "version": "2.1.27",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz",
+ "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==",
+ "requires": {
+ "mime-db": "1.44.0"
+ }
+ },
+ "morgan": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz",
+ "integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==",
+ "requires": {
+ "basic-auth": "~2.0.1",
+ "debug": "2.6.9",
+ "depd": "~2.0.0",
+ "on-finished": "~2.3.0",
+ "on-headers": "~1.0.2"
+ },
+ "dependencies": {
+ "depd": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
+ "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="
+ }
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+ },
+ "negotiator": {
+ "version": "0.6.2",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
+ "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw=="
+ },
+ "nocache": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/nocache/-/nocache-2.1.0.tgz",
+ "integrity": "sha512-0L9FvHG3nfnnmaEQPjT9xhfN4ISk0A8/2j4M37Np4mcDesJjHgEUfgPhdCyZuFI954tjokaIj/A3NdpFNdEh4Q=="
+ },
+ "node-fetch": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz",
+ "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA=="
+ },
+ "object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
+ },
+ "on-finished": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
+ "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
+ "requires": {
+ "ee-first": "1.1.1"
+ }
+ },
+ "on-headers": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz",
+ "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA=="
+ },
+ "parseurl": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
+ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="
+ },
+ "path-parse": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
+ "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw=="
+ },
+ "path-to-regexp": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
+ "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w="
+ },
+ "promise": {
+ "version": "7.3.1",
+ "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz",
+ "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==",
+ "requires": {
+ "asap": "~2.0.3"
+ }
+ },
+ "promise-polyfill": {
+ "version": "8.1.3",
+ "resolved": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-8.1.3.tgz",
+ "integrity": "sha512-MG5r82wBzh7pSKDRa9y+vllNHz3e3d4CNj1PQE4BQYxLme0gKYYBm9YENq+UkEikyZ0XbiGWxYlVw3Rl9O/U8g=="
+ },
+ "protobufjs": {
+ "version": "6.9.0",
+ "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.9.0.tgz",
+ "integrity": "sha512-LlGVfEWDXoI/STstRDdZZKb/qusoAWUnmLg9R8OLSO473mBLWHowx8clbX5/+mKDEI+v7GzjoK9tRPZMMcoTrg==",
+ "requires": {
+ "@protobufjs/aspromise": "^1.1.2",
+ "@protobufjs/base64": "^1.1.2",
+ "@protobufjs/codegen": "^2.0.4",
+ "@protobufjs/eventemitter": "^1.1.0",
+ "@protobufjs/fetch": "^1.1.0",
+ "@protobufjs/float": "^1.0.2",
+ "@protobufjs/inquire": "^1.1.0",
+ "@protobufjs/path": "^1.1.2",
+ "@protobufjs/pool": "^1.1.0",
+ "@protobufjs/utf8": "^1.1.0",
+ "@types/long": "^4.0.1",
+ "@types/node": "^13.7.0",
+ "long": "^4.0.0"
+ }
+ },
+ "proxy-addr": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz",
+ "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==",
+ "requires": {
+ "forwarded": "~0.1.2",
+ "ipaddr.js": "1.9.1"
+ }
+ },
+ "pug": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pug/-/pug-3.0.0.tgz",
+ "integrity": "sha512-inmsJyFBSHZaiGLaguoFgJGViX0If6AcfcElimvwj9perqjDpUpw79UIEDZbWFmoGVidh08aoE+e8tVkjVJPCw==",
+ "requires": {
+ "pug-code-gen": "^3.0.0",
+ "pug-filters": "^4.0.0",
+ "pug-lexer": "^5.0.0",
+ "pug-linker": "^4.0.0",
+ "pug-load": "^3.0.0",
+ "pug-parser": "^6.0.0",
+ "pug-runtime": "^3.0.0",
+ "pug-strip-comments": "^2.0.0"
+ }
+ },
+ "pug-attrs": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pug-attrs/-/pug-attrs-3.0.0.tgz",
+ "integrity": "sha512-azINV9dUtzPMFQktvTXciNAfAuVh/L/JCl0vtPCwvOA21uZrC08K/UnmrL+SXGEVc1FwzjW62+xw5S/uaLj6cA==",
+ "requires": {
+ "constantinople": "^4.0.1",
+ "js-stringify": "^1.0.2",
+ "pug-runtime": "^3.0.0"
+ }
+ },
+ "pug-code-gen": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/pug-code-gen/-/pug-code-gen-3.0.1.tgz",
+ "integrity": "sha512-xJIGvmXTQlkJllq6hqxxjRWcay2F9CU69TuAuiVZgHK0afOhG5txrQOcZyaPHBvSWCU/QQOqEp5XCH94rRZpBQ==",
+ "requires": {
+ "constantinople": "^4.0.1",
+ "doctypes": "^1.1.0",
+ "js-stringify": "^1.0.2",
+ "pug-attrs": "^3.0.0",
+ "pug-error": "^2.0.0",
+ "pug-runtime": "^3.0.0",
+ "void-elements": "^3.1.0",
+ "with": "^7.0.0"
+ }
+ },
+ "pug-error": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/pug-error/-/pug-error-2.0.0.tgz",
+ "integrity": "sha512-sjiUsi9M4RAGHktC1drQfCr5C5eriu24Lfbt4s+7SykztEOwVZtbFk1RRq0tzLxcMxMYTBR+zMQaG07J/btayQ=="
+ },
+ "pug-filters": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/pug-filters/-/pug-filters-4.0.0.tgz",
+ "integrity": "sha512-yeNFtq5Yxmfz0f9z2rMXGw/8/4i1cCFecw/Q7+D0V2DdtII5UvqE12VaZ2AY7ri6o5RNXiweGH79OCq+2RQU4A==",
+ "requires": {
+ "constantinople": "^4.0.1",
+ "jstransformer": "1.0.0",
+ "pug-error": "^2.0.0",
+ "pug-walk": "^2.0.0",
+ "resolve": "^1.15.1"
+ }
+ },
+ "pug-lexer": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/pug-lexer/-/pug-lexer-5.0.0.tgz",
+ "integrity": "sha512-52xMk8nNpuyQ/M2wjZBN5gXQLIylaGkAoTk5Y1pBhVqaopaoj8Z0iVzpbFZAqitL4RHNVDZRnJDsqEYe99Ti0A==",
+ "requires": {
+ "character-parser": "^2.2.0",
+ "is-expression": "^4.0.0",
+ "pug-error": "^2.0.0"
+ }
+ },
+ "pug-linker": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/pug-linker/-/pug-linker-4.0.0.tgz",
+ "integrity": "sha512-gjD1yzp0yxbQqnzBAdlhbgoJL5qIFJw78juN1NpTLt/mfPJ5VgC4BvkoD3G23qKzJtIIXBbcCt6FioLSFLOHdw==",
+ "requires": {
+ "pug-error": "^2.0.0",
+ "pug-walk": "^2.0.0"
+ }
+ },
+ "pug-load": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pug-load/-/pug-load-3.0.0.tgz",
+ "integrity": "sha512-OCjTEnhLWZBvS4zni/WUMjH2YSUosnsmjGBB1An7CsKQarYSWQ0GCVyd4eQPMFJqZ8w9xgs01QdiZXKVjk92EQ==",
+ "requires": {
+ "object-assign": "^4.1.1",
+ "pug-walk": "^2.0.0"
+ }
+ },
+ "pug-parser": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/pug-parser/-/pug-parser-6.0.0.tgz",
+ "integrity": "sha512-ukiYM/9cH6Cml+AOl5kETtM9NR3WulyVP2y4HOU45DyMim1IeP/OOiyEWRr6qk5I5klpsBnbuHpwKmTx6WURnw==",
+ "requires": {
+ "pug-error": "^2.0.0",
+ "token-stream": "1.0.0"
+ }
+ },
+ "pug-runtime": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pug-runtime/-/pug-runtime-3.0.0.tgz",
+ "integrity": "sha512-GoEPcmQNnaTsePEdVA05bDpY+Op5VLHKayg08AQiqJBWU/yIaywEYv7TetC5dEQS3fzBBoyb2InDcZEg3mPTIA=="
+ },
+ "pug-strip-comments": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/pug-strip-comments/-/pug-strip-comments-2.0.0.tgz",
+ "integrity": "sha512-zo8DsDpH7eTkPHCXFeAk1xZXJbyoTfdPlNR0bK7rpOMuhBYb0f5qUVCO1xlsitYd3w5FQTK7zpNVKb3rZoUrrQ==",
+ "requires": {
+ "pug-error": "^2.0.0"
+ }
+ },
+ "pug-walk": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/pug-walk/-/pug-walk-2.0.0.tgz",
+ "integrity": "sha512-yYELe9Q5q9IQhuvqsZNwA5hfPkMJ8u92bQLIMcsMxf/VADjNtEYptU+inlufAFYcWdHlwNfZOEnOOQrZrcyJCQ=="
+ },
+ "qs": {
+ "version": "6.7.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
+ "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ=="
+ },
+ "range-parser": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
+ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="
+ },
+ "raw-body": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz",
+ "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==",
+ "requires": {
+ "bytes": "3.1.0",
+ "http-errors": "1.7.2",
+ "iconv-lite": "0.4.24",
+ "unpipe": "1.0.0"
+ }
+ },
+ "referrer-policy": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/referrer-policy/-/referrer-policy-1.2.0.tgz",
+ "integrity": "sha512-LgQJIuS6nAy1Jd88DCQRemyE3mS+ispwlqMk3b0yjZ257fI1v9c+/p6SD5gP5FGyXUIgrNOAfmyioHwZtYv2VA=="
+ },
+ "resolve": {
+ "version": "1.17.0",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz",
+ "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==",
+ "requires": {
+ "path-parse": "^1.0.6"
+ }
+ },
+ "safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+ },
+ "safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
+ },
+ "semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
+ },
+ "send": {
+ "version": "0.17.1",
+ "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz",
+ "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==",
+ "requires": {
+ "debug": "2.6.9",
+ "depd": "~1.1.2",
+ "destroy": "~1.0.4",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "etag": "~1.8.1",
+ "fresh": "0.5.2",
+ "http-errors": "~1.7.2",
+ "mime": "1.6.0",
+ "ms": "2.1.1",
+ "on-finished": "~2.3.0",
+ "range-parser": "~1.2.1",
+ "statuses": "~1.5.0"
+ },
+ "dependencies": {
+ "ms": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
+ "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg=="
+ }
+ }
+ },
+ "serve-static": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz",
+ "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==",
+ "requires": {
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "parseurl": "~1.3.3",
+ "send": "0.17.1"
+ }
+ },
+ "setprototypeof": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
+ "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw=="
+ },
+ "statuses": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
+ "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
+ },
+ "to-fast-properties": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+ "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4="
+ },
+ "toidentifier": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
+ "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw=="
+ },
+ "token-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/token-stream/-/token-stream-1.0.0.tgz",
+ "integrity": "sha1-zCAOqyYT9BZtJ/+a/HylbUnfbrQ="
+ },
+ "tslib": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz",
+ "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA=="
+ },
+ "type-is": {
+ "version": "1.6.18",
+ "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
+ "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
+ "requires": {
+ "media-typer": "0.3.0",
+ "mime-types": "~2.1.24"
+ }
+ },
+ "unpipe": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
+ "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw="
+ },
+ "utils-merge": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
+ "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM="
+ },
+ "uuid": {
+ "version": "3.4.0",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
+ "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A=="
+ },
+ "vary": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
+ "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
+ },
+ "void-elements": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz",
+ "integrity": "sha1-YU9/v42AHwu18GYfWy9XhXUOTwk="
+ },
+ "websocket-driver": {
+ "version": "0.7.4",
+ "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz",
+ "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==",
+ "requires": {
+ "http-parser-js": ">=0.5.1",
+ "safe-buffer": ">=5.1.0",
+ "websocket-extensions": ">=0.1.1"
+ }
+ },
+ "websocket-extensions": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz",
+ "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg=="
+ },
+ "whatwg-fetch": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz",
+ "integrity": "sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q=="
+ },
+ "with": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/with/-/with-7.0.1.tgz",
+ "integrity": "sha512-TpHxhlaRS5mNJbCDXqbDJB4qhyV8zQUPytY3o3cCb6t2m13Qw+vsWFvJCBBIkWILRjNlmlnvd/0AW0dPaO7n/w==",
+ "requires": {
+ "@babel/parser": "^7.9.6",
+ "@babel/types": "^7.9.6",
+ "assert-never": "^1.2.1",
+ "babel-walk": "3.0.0-canary-5"
+ }
+ },
+ "x-xss-protection": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/x-xss-protection/-/x-xss-protection-1.3.0.tgz",
+ "integrity": "sha512-kpyBI9TlVipZO4diReZMAHWtS0MMa/7Kgx8hwG/EuZLiA6sg4Ah/4TRdASHhRRN3boobzcYgFRUFSgHRge6Qhg=="
+ },
+ "xmlhttprequest": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz",
+ "integrity": "sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw="
+ }
+ }
+}
diff --git a/Ronald/Clase68_MovieFireExpress/package.json b/Ronald/Clase68_MovieFireExpress/package.json
new file mode 100644
index 00000000..32ebde91
--- /dev/null
+++ b/Ronald/Clase68_MovieFireExpress/package.json
@@ -0,0 +1,22 @@
+{
+ "name": "clase68peliculas",
+ "version": "1.0.0",
+ "description": "peliculasNode",
+ "main": "server.js",
+ "scripts": {
+ "test": "echo \"Error: no test specified\" && exit 1"
+ },
+ "author": "Ronald Pineda",
+ "license": "ISC",
+ "dependencies": {
+ "body-parser": "^1.19.0",
+ "dotenv": "^8.2.0",
+ "express": "^4.17.1",
+ "express-request-id": "^1.4.1",
+ "firebase": "^7.14.5",
+ "helmet": "^3.22.0",
+ "morgan": "^1.10.0",
+ "node-fetch": "^2.6.0",
+ "pug": "^3.0.0"
+ }
+}
diff --git a/Ronald/Clase68_MovieFireExpress/public/Thumbs.db b/Ronald/Clase68_MovieFireExpress/public/Thumbs.db
new file mode 100644
index 00000000..27c958a7
Binary files /dev/null and b/Ronald/Clase68_MovieFireExpress/public/Thumbs.db differ
diff --git a/Ronald/Clase68_MovieFireExpress/public/script.js b/Ronald/Clase68_MovieFireExpress/public/script.js
new file mode 100644
index 00000000..22f672c8
--- /dev/null
+++ b/Ronald/Clase68_MovieFireExpress/public/script.js
@@ -0,0 +1,15 @@
+// aqui el codigo para la vista cliente
+const buscar = document.getElementById('getFilm');
+buscar.addEventListener('click', ()=>{
+ const name = document.getElementById('nombre').value.toLowerCase();
+ window.location.href = '/create/'+name; //le redirecciono a la ruta del create
+});
+
+
+/*
+const borrar = document.getElementById("delete");
+borrar.addEventListener('click', ()=>{
+ const nameDelete = document.getElementById('nombreEliminar').value;
+ window.location.href = `/film/${nameDelete}/delete`; //le redirecciono a la ruta del delete
+})
+*/
\ No newline at end of file
diff --git a/Ronald/Clase68_MovieFireExpress/public/style.css b/Ronald/Clase68_MovieFireExpress/public/style.css
new file mode 100644
index 00000000..cbad9915
--- /dev/null
+++ b/Ronald/Clase68_MovieFireExpress/public/style.css
@@ -0,0 +1,10 @@
+
+h1{
+ text-align: center;
+}
+body{
+ background-image: url("trainspotting.png");
+ background-repeat: no-repeat;
+ background-position: 50% 17%;
+ font-family: Arial, Helvetica, sans-serif;
+}
\ No newline at end of file
diff --git a/Ronald/Clase68_MovieFireExpress/public/trainspotting.png b/Ronald/Clase68_MovieFireExpress/public/trainspotting.png
new file mode 100644
index 00000000..f8737357
Binary files /dev/null and b/Ronald/Clase68_MovieFireExpress/public/trainspotting.png differ
diff --git a/Ronald/Clase68_MovieFireExpress/routes/films.js b/Ronald/Clase68_MovieFireExpress/routes/films.js
new file mode 100644
index 00000000..78198a3b
--- /dev/null
+++ b/Ronald/Clase68_MovieFireExpress/routes/films.js
@@ -0,0 +1,72 @@
+const config = require('../config'),
+ firebase = require('firebase'),
+ fetch = require('node-fetch')
+
+firebase.initializeApp(config.firebase);
+
+var database = firebase.database().ref('/peliculas')
+
+
+async function getAll(req,res){
+ await database.once("value", (snapshot)=>{
+ const data = snapshot.val();
+ res.render('index.pug', {data});
+ });
+
+}
+exports.getAll = getAll
+
+
+
+exports.get = (req,res)=>{
+ const id = req.params.id;
+ let dataFilm = firebase.database().ref(`peliculas/${id}`)
+
+ dataFilm.on("value",function(snapshot){
+ let filmData = snapshot.val();
+ res.render('details.pug', {filmData});
+
+ });
+}
+
+
+
+exports.create = (req,res)=>{
+ const name = req.params.name;
+ const url = `http://www.omdbapi.com/?t=${name}&apikey=${config.apikey}`;
+ let ref = firebase.database().ref(`peliculas/${name}`)
+
+ fetch(url)
+ .then(res => res.json())
+ .then(data => {
+ if(data.Response == "False"){
+ console.log('pelicula no encontrada');
+ }else{
+ ref.set(data);
+ }
+ return data
+ })
+ .then((data) => {
+ if(data.Response === 'False'){
+ res.render('error.pug');
+ }else{
+ res.redirect(`/film/${name}`);
+ }
+ })
+ .catch(err => res.status(500).render('error.pug', err));
+}
+
+
+exports.delete = (req,res)=>{
+ const nameDelete = req.params.id;
+ let ref = firebase.database().ref(`peliculas/${nameDelete}`);
+ ref.remove();
+ res.send(`borrada la pelicula ${nameDelete}`);
+ res.redirect('/');
+}
+
+exports.update = (req,res)=>{
+ res.send(`actualizada la pelicula ${req.params.id}`)
+}
+
+
diff --git a/Ronald/Clase68_MovieFireExpress/server.js b/Ronald/Clase68_MovieFireExpress/server.js
new file mode 100644
index 00000000..89975337
--- /dev/null
+++ b/Ronald/Clase68_MovieFireExpress/server.js
@@ -0,0 +1,48 @@
+const express = require('express'),
+ bodyParser = require('body-parser'),
+ morgan = require('morgan'),
+ rutas = require('./routes/films'),
+ config = require('./config.js'),
+ helmet = require('helmet'),
+ app = express();
+
+//para Morgan
+const addRequestId = require('express-request-id')();
+app.use(addRequestId);
+
+morgan.token('id', function getId(req) {
+ return req.id
+});
+
+//para servir los logs con Morgan
+var loggerFormat = ':id [:date[web]] ":method :url" :status :response-time';
+
+app.use(morgan(loggerFormat, {
+ skip: function (req, res) {
+ return res.statusCode < 400
+ },
+ stream: process.stderr
+}));
+
+
+app.use(bodyParser.json());
+app.use(bodyParser.urlencoded({ extended: true}));
+app.use(express.static('public'));
+app.set('view-engine', 'pug');
+app.use(helmet())
+
+
+// User
+app.get('/', rutas.getAll);
+app.get('/film/:id', rutas.get);
+app.get('/create/:name', rutas.create);
+
+
+// curl -d -X POST http://localhost:8626/film/titanic/delete
+//es importante que el nombre de la pelicula se haga en minusculas
+app.post('/film/:id/delete', rutas.delete);
+app.post('/film/:id/update', rutas.update);
+
+
+app.listen(config.port)
+console.log(`corriendo en ${config.port}`)
\ No newline at end of file
diff --git a/Ronald/Clase68_MovieFireExpress/views/details.pug b/Ronald/Clase68_MovieFireExpress/views/details.pug
new file mode 100644
index 00000000..2ae04df4
--- /dev/null
+++ b/Ronald/Clase68_MovieFireExpress/views/details.pug
@@ -0,0 +1,7 @@
+img#poster(src=filmData.Poster)
+-
+each value, key in filmData
+ if key!='Ratings'
+ p.contenido= key +' : '+value
+
+a(class='button' , href='/') Volver a página principal
\ No newline at end of file
diff --git a/Ronald/Clase68_MovieFireExpress/views/error.pug b/Ronald/Clase68_MovieFireExpress/views/error.pug
new file mode 100644
index 00000000..f782a6d0
--- /dev/null
+++ b/Ronald/Clase68_MovieFireExpress/views/error.pug
@@ -0,0 +1,3 @@
+p#error pelicula no encontrada! Está bien escrito su nombre?
+
+a(class='button' , href='/') Volver a página principal
\ No newline at end of file
diff --git a/Ronald/Clase68_MovieFireExpress/views/index.pug b/Ronald/Clase68_MovieFireExpress/views/index.pug
new file mode 100644
index 00000000..8265040c
--- /dev/null
+++ b/Ronald/Clase68_MovieFireExpress/views/index.pug
@@ -0,0 +1,28 @@
+doctype html
+html(lang='en')
+ head
+ title Jade
+ body
+ h1 Firebase (peliculas) con Node y Pug
+ h3 Escriba el nombre de una película para poder ver su información:
+ input#nombre(type="text", placeholder="nombre de la pelicula")
+ button#getFilm(type="button") Click here
+
+ h5 Si desa eliminar una pelicula realize un post con esta estructura: /film/pelicula/delete (el nombre de la pelicula en minusculas)
+ br
+ br
+
+ h2 Peliculas visitadas previamente (click para ver su información):
+ h3
+ #container.col
+ ul#lista
+ if data
+ each film, i in data
+ a(href=`/film/${film.Title}`).lista= film.Title
+ br
+
+
+
+
+link(href='./style.css', rel='stylesheet')
+script(src="./script.js")
\ No newline at end of file
diff --git a/Ronald/proyecto2 b/Ronald/proyecto2
new file mode 160000
index 00000000..e7fd1388
--- /dev/null
+++ b/Ronald/proyecto2
@@ -0,0 +1 @@
+Subproject commit e7fd138867c08ddb3a697788ad61032b8f0f6481