1 00:00:02,100 --> 00:00:03,360 Así que logramos 2 00:00:03,390 --> 00:00:05,460 mucho, podemos escribir datos, buscar datos, 3 00:00:05,460 --> 00:00:08,190 usar nuestro token para abarcar datos o para examinar 4 00:00:08,190 --> 00:00:10,950 productos y pedidos a nuestro usuario actualmente conectado, podemos 5 00:00:10,950 --> 00:00:12,610 iniciar sesión y así sucesivamente, 6 00:00:12,620 --> 00:00:14,280 y eso está muy bien. 7 00:00:14,280 --> 00:00:20,130 Una cosa que no estamos haciendo en este momento es que no estamos persistiendo en nuestras 8 00:00:20,130 --> 00:00:23,970 sesiones, por así decirlo. Si recargo, siempre tengo que iniciar 9 00:00:24,030 --> 00:00:25,230 sesión de nuevo 10 00:00:25,230 --> 00:00:31,170 y eso no es realmente lo que quiero, sería bueno si pudiéramos iniciar sesión automáticamente si tenemos un 11 00:00:31,170 --> 00:00:38,310 token válido y para ello necesitamos hacer dos cosas: necesitamos almacenar el token en algún lugar del dispositivo, no en Redux porque Redux 12 00:00:38,310 --> 00:00:43,110 está en la memoria y esto se perderá cada vez que se reinicie la aplicación. 13 00:00:43,110 --> 00:00:45,920 Por lo tanto, debe estar en algún lugar 14 00:00:45,930 --> 00:00:53,480 del disco duro del dispositivo, por ejemplo, y además, debemos verificar ese almacenamiento cada vez que se inicia nuestra aplicación y configurar automáticamente 15 00:00:53,480 --> 00:00:58,080 el token en Redux y redirigir al usuario si encontramos un token válido allí. 16 00:00:59,160 --> 00:01:05,590 Ahora comencemos con el almacenamiento porque es un primer paso lógico. Para almacenar, debemos importar algo aquí 17 00:01:05,590 --> 00:01:10,090 en el creador de acciones de productos, no en el 18 00:01:10,090 --> 00:01:20,810 creador de acciones sino en realidad aquí en el creador de acciones de autenticación, allí debe importar el almacenamiento asíncrono de React Native. 19 00:01:21,930 --> 00:01:23,280 Con eso importado, 20 00:01:23,460 --> 00:01:32,130 podemos usar eso para luego guardar datos en el dispositivo, el almacenamiento asíncrono es una API React Native que al final usa un almacenamiento de 21 00:01:32,130 --> 00:01:38,370 valor clave en el dispositivo que está disponible tanto en iOS como en Android, donde podemos almacenar datos 22 00:01:38,370 --> 00:01:45,150 que persisten en todos los relanzamientos de aplicaciones, por lo que podemos usarlos para guardar datos que no se pierden 23 00:01:45,150 --> 00:01:47,460 cuando la aplicación se inicia o reinicia. 24 00:01:47,460 --> 00:01:52,910 Así que agregaré una nueva función, guardaré datos en el almacenamiento o algo así, y allí 25 00:01:53,040 --> 00:02:00,100 espero obtener mi token y mi ID de usuario, los dos datos que me interesan aquí y ahora podemos usar 26 00:02:00,140 --> 00:02:08,970 el almacenamiento asíncrono para luego establezca un elemento que es cómo guarda los datos y ese elemento que configure debe ser una cadena, pero antes que 27 00:02:08,970 --> 00:02:11,560 nada debe definir una clave y lo 28 00:02:11,580 --> 00:02:14,840 nombraré datos de usuario, pero eso depende de usted, 29 00:02:14,850 --> 00:02:19,260 necesitará esa clave más adelante para recuperar sus datos y el segundo valor 30 00:02:19,330 --> 00:02:21,170 ahora es una cadena, 31 00:02:21,180 --> 00:02:26,310 por lo que la cadena que desea guardar allí y esencialmente debe guardar una cadena. 32 00:02:26,440 --> 00:02:27,340 Ahora 33 00:02:27,340 --> 00:02:33,990 que no hay problema, podemos usar json. stringify para convertir un objeto Javascript en una cadena y el 34 00:02:33,990 --> 00:02:40,200 objeto que quiero convertir es un objeto que contiene mi token que obtengo como argumento aquí y contiene el ID de 35 00:02:40,200 --> 00:02:41,740 usuario que obtengo como argumento. 36 00:02:41,790 --> 00:02:48,980 Entonces, al final, guardamos este objeto como una cadena en el dispositivo. 37 00:02:48,990 --> 00:02:54,590 Ahora solo tenemos que llamar a los datos guardados al almacenamiento cuando hayamos terminado de iniciar sesión o suscribirnos, por lo que aquí, tal vez después de enviar 38 00:02:54,590 --> 00:03:01,080 el inicio de sesión, podemos llamar a los datos guardados al almacenamiento y reenviar resData. idToken 39 00:03:01,140 --> 00:03:08,100 y resData. localId, por lo que utilizamos las mismas cosas en Redux 40 00:03:08,100 --> 00:03:11,610 y definitivamente queremos usarlas allí porque Redux es importante para la 41 00:03:11,850 --> 00:03:18,090 aplicación en ejecución, pero también lo guardo en el dispositivo para cuando queremos cargarlo cuando la aplicación se reinicia. 42 00:03:18,140 --> 00:03:22,810 Ahora, sin embargo, eso por sí solo no funcionará y, por supuesto, también 43 00:03:22,820 --> 00:03:28,340 debemos hacerlo al suscribirnos, pero eso solo no funcionará, necesitaremos una información adicional aquí antes de continuar. 44 00:03:28,430 --> 00:03:35,780 ¿Sabes cual? Necesitamos saber cuánto tiempo es válido el token porque no 45 00:03:36,230 --> 00:03:42,920 debes olvidar que eventualmente caducará, por eso para iniciar sesión y registrarte, obtienes esa clave de expiración en 46 00:03:43,310 --> 00:03:50,510 la respuesta que te indica en segundos cuánto tiempo lleva hasta tu token no es válido y Firebase ya no 47 00:03:50,510 --> 00:03:51,510 lo aceptará. 48 00:03:51,650 --> 00:03:57,590 También necesitamos almacenar esa información porque si luego regresamos, si reiniciamos la aplicación después de tres horas, nuestro 49 00:03:57,590 --> 00:04:01,390 token probablemente no sea válido, por lo que debemos saber cuándo 50 00:04:01,460 --> 00:04:04,370 se invalidará el token para que podamos verificarlo, 51 00:04:04,370 --> 00:04:09,800 cuando el la aplicación se reinicia, cuando verificamos si tenemos un token, sabemos si ese token 52 00:04:09,800 --> 00:04:16,460 que podemos encontrar todavía es relevante o si ya no es válido y, de todos modos, necesitamos un nuevo token, 53 00:04:16,460 --> 00:04:20,120 en cuyo caso no deberíamos iniciar sesión automáticamente en el usuario. 54 00:04:20,480 --> 00:04:23,360 Por lo tanto, quiero almacenar la fecha 55 00:04:23,360 --> 00:04:31,180 de vencimiento y crearé la fecha de vencimiento aquí como una constante, un nuevo objeto de fecha que al final debería 56 00:04:31,180 --> 00:04:35,020 tomar la fecha actual y agregar el tiempo de vencimiento. 57 00:04:37,810 --> 00:04:45,790 Ahora la nueva fecha toma un objeto de fecha, pero con get time, obtenemos la marca de tiempo actual en milisegundos 58 00:04:45,790 --> 00:04:49,590 desde el comienzo de los tiempos, es decir, aquí en 59 00:04:49,780 --> 00:04:51,200 1970 en Javascript. 60 00:04:51,570 --> 00:04:57,630 Entonces eso es una cantidad en milisegundos y a eso, podemos agregar resData. expira en. 61 00:04:58,210 --> 00:05:01,720 Esto es una cantidad de segundos, por lo que necesitamos 62 00:05:01,720 --> 00:05:06,910 convertir esto a milisegundos y también es una cadena, por lo que debemos convertirlo a un número. 63 00:05:06,910 --> 00:05:16,490 Así que aquí agregaré un plus aquí o simplemente parseInt alternativamente para convertir esto en un número entero y luego multiplico esto 64 00:05:16,490 --> 00:05:23,550 con 1000 para convertirlo de segundos a milisegundos porque obtener tiempo también nos da milisegundos. 65 00:05:23,570 --> 00:05:29,690 Ahora, lo que esto me da es una nueva marca de tiempo en el futuro, que es la hora 66 00:05:29,690 --> 00:05:35,990 actual más el tiempo de caducidad y lo envuelvo en otro objeto de fecha para convertirlo de nuevo de un gran 67 00:05:36,110 --> 00:05:44,520 número de milisegundos a un objeto de fecha de marca de tiempo concreto. Esta fecha de vencimiento ahora es lo que también debemos pasar para guardar 68 00:05:44,530 --> 00:05:48,880 los datos en el almacenamiento, por lo que aquí también espero obtener la fecha 69 00:05:48,880 --> 00:05:51,070 de vencimiento y debemos adjuntarla aquí. 70 00:05:51,400 --> 00:05:55,810 Así que aquí puedo nombrar esta fecha de vencimiento tal 71 00:05:55,840 --> 00:06:05,830 vez para mezclar las cosas, esta es mi fecha de vencimiento y allí quiero llamar a este pequeño método toISOString que podemos llamar 72 00:06:05,830 --> 00:06:11,500 a los objetos de fecha porque esto lo convertirá en una cadena en 73 00:06:11,500 --> 00:06:14,240 un formato estandarizado que Quiero ahorrar 74 00:06:14,400 --> 00:06:18,150 Ahora, esto es lo que quiero hacer para registrarme también, así que 75 00:06:18,150 --> 00:06:20,190 esto se puede copiar allí y esto 76 00:06:20,520 --> 00:06:22,120 es lo que quiero 77 00:06:22,170 --> 00:06:26,220 hacer allí también, crear la fecha de vencimiento y guardarla en el almacenamiento. 78 00:06:26,220 --> 00:06:29,220 Ahora estamos guardando eso en el almacenamiento, lo cual es bueno, 79 00:06:29,670 --> 00:06:35,670 pero ahora también tenemos que verificar esto cuando estamos iniciando sesión. Una buena manera de hacerlo es crear una 80 00:06:35,670 --> 00:06:41,040 nueva pantalla y en realidad crearé esto fuera de mis carpetas existentes en la carpeta de pantallas, 81 00:06:41,040 --> 00:06:47,570 pero ni en la tienda ni en el usuario, y nombraré esta pantalla de inicio y puedes nombrarla como quieras desear. 82 00:06:47,610 --> 00:06:54,240 La idea es que muestre esta pantalla mientras mi aplicación se está iniciando y estoy averiguando si el usuario está autenticado o no 83 00:06:54,240 --> 00:06:55,380 y esto será 84 00:06:55,380 --> 00:06:56,770 súper rápido, es probable que 85 00:06:56,790 --> 00:07:02,350 ni siquiera veamos esa pantalla cuando se inicie la aplicación. Ahora aquí, creamos un componente React 86 00:07:02,370 --> 00:07:06,670 regular importando react from react y allí importo cosas de React 87 00:07:06,910 --> 00:07:11,120 Native, para ser precisos, necesito una vista, el indicador de 88 00:07:11,130 --> 00:07:17,310 actividad para mostrar un control de carga mientras la aplicación se inicia y también hoja de 89 00:07:17,310 --> 00:07:23,280 estilo y también almacenamiento asíncrono porque aquí también quiero acceder al almacenamiento asíncrono para saber 90 00:07:23,280 --> 00:07:26,450 si tenemos un token válido o no. 91 00:07:26,460 --> 00:07:33,660 Entonces, aquí, tengo mi componente de pantalla de inicio, que es un componente React normal y el 92 00:07:33,780 --> 00:07:44,570 objeto de hoja de estilo aquí con Stylesheet. crear y, al final, podemos exportar esta pantalla de inicio de esta manera. Ahora en el componente, simplemente presentaré el 93 00:07:44,580 --> 00:07:56,450 indicador de actividad aquí con un tamaño grande y un color de Colores. primaria y para eso necesitas importar esa constante de 94 00:07:56,450 --> 00:08:05,100 colores, por supuesto, y también asignar un pequeño estilo aquí a la 95 00:08:05,100 --> 00:08:13,520 vista y simplemente tomaré estilos. pantalla aquí que ahora podemos agregar a la hoja 96 00:08:13,520 --> 00:08:16,530 de estilo y que debería ser 97 00:08:16,690 --> 00:08:23,690 muy simple, flexionar una, justificar el centro de contenido y alinear el centro de elementos 98 00:08:23,720 --> 00:08:29,870 para un contenido centrado vertical y horizontalmente. Ahora, por supuesto, las cosas realmente importantes suceden por 99 00:08:29,870 --> 00:08:33,520 encima del código jsx, aquí es donde ahora debemos verificar el 100 00:08:33,620 --> 00:08:39,820 almacenamiento asíncrono para obtener un token válido y puedo hacerlo con la ayuda del efecto de uso que 101 00:08:39,820 --> 00:08:42,230 me permite ejecutar algo de lógica 102 00:08:42,250 --> 00:08:51,190 aquí cuando este componente montado y de hecho aquí, no necesitaré ninguna dependencia porque aquí, dentro del efecto de uso, ahora quiero agregar una nueva función 103 00:08:51,190 --> 00:08:58,060 que denominaré intentar registrarse o intentar iniciar sesión es más adecuada y uso la función separada porque aquí quiero usar 104 00:08:58,090 --> 00:09:04,390 async en espera, lo que puedo hacer creando esa función interna que ahora puedo llamar aquí, intente iniciar sesión 105 00:09:04,390 --> 00:09:05,310 porque nuevamente, 106 00:09:05,410 --> 00:09:10,840 async aquí en esta función que pasa para usar el efecto realmente no estaría permitido y 107 00:09:10,840 --> 00:09:14,020 aquí en el inicio de sesión de prueba, el 108 00:09:14,170 --> 00:09:21,460 objetivo ahora es verificar el almacenamiento asíncrono para un token válido. Entonces obtengo mis datos de usuario accediendo a 109 00:09:21,520 --> 00:09:23,030 AsyncStorage. getItem 110 00:09:23,240 --> 00:09:28,750 y luego use la clave que usó para almacenar. 111 00:09:28,960 --> 00:09:35,950 Entonces, en mi caso, se trata de datos de usuario, pero debe usar la clave que haya utilizado en su autenticación. archivo js en la carpeta de 112 00:09:35,950 --> 00:09:43,160 acciones para almacenar sus datos con almacenamiento asíncrono. Así que recuperé esto y ahora lo importante que debo saber 113 00:09:43,160 --> 00:09:49,970 aquí es que get item, como todos los métodos de almacenamiento asíncrono, en realidad es asíncrono, lo que significa que el 114 00:09:50,030 --> 00:09:55,520 nombre sugiere, supongo, lo que significa que tienes una promesa aquí, así que podemos esperar esto 115 00:09:55,520 --> 00:09:58,560 y esto nos devolverá nuestros datos de usuario. 116 00:09:58,570 --> 00:10:05,200 Ahora, estos son los datos como una cadena, para convertirlos en un dato con el 117 00:10:05,230 --> 00:10:14,410 que podamos trabajar, tendré mis datos transformados con JSON. analiza los datos del usuario y esto analiza una cadena 118 00:10:14,410 --> 00:10:24,220 en formato JSON y la convierte en un objeto o matriz Javascript. Ahora, incluso antes de intentarlo, comprobaré si los datos del usuario no son verdaderos, de 119 00:10:24,220 --> 00:10:24,850 modo 120 00:10:24,850 --> 00:10:31,030 que si no están configurados, si no podemos encontrar ningún dato para esa clave porque sé que ciertamente no 121 00:10:31,030 --> 00:10:31,720 hemos iniciado sesión. 122 00:10:31,780 --> 00:10:36,370 Así que aquí quiero regresar y no continuar y hacer una cosa 123 00:10:36,370 --> 00:10:43,810 importante, usaré la navegación de accesorios y navegaré a la pantalla de autenticación porque esta pantalla de inicio debe 124 00:10:43,810 --> 00:10:44,770 agregarse al 125 00:10:45,190 --> 00:10:52,960 navegador, así que aquí podemos importarla, importar la pantalla de inicio desde la carpeta de pantallas, por supuesto, la pantalla 126 00:10:54,070 --> 00:10:57,590 de inicio y la agregamos al navegador principal 127 00:10:57,760 --> 00:11:07,190 aquí, por lo que también tenemos autenticación y compras y allí en la parte superior, agrego inicio y apunto a mi pantalla de inicio. 128 00:11:07,350 --> 00:11:11,490 Esto significa que esto es lo primero que cargo aquí. 129 00:11:11,490 --> 00:11:17,010 Ahora en esta pantalla de inicio, por lo tanto, voy a la pantalla de autenticación si no podemos encontrar un 130 00:11:17,010 --> 00:11:22,230 token, así que gracias al navegador de interruptores, salgo de esa pantalla y voy a la pantalla de autenticación 131 00:11:22,230 --> 00:11:28,810 o a la pila de autenticación porque no encuentro una ficha. Por lo tanto, si lo superamos si se verifica, al menos tenemos algunos datos, pero el token 132 00:11:28,810 --> 00:11:29,950 aún podría no ser válido. 133 00:11:30,370 --> 00:11:39,980 Entonces, por supuesto, tendremos el token, el ID de usuario y la fecha de caducidad que podemos extraer de los datos transformados 134 00:11:40,520 --> 00:11:42,770 después de esta línea, aquí 135 00:11:43,600 --> 00:11:46,860 con esta sintaxis de desestructuración de objetos 136 00:11:46,870 --> 00:11:54,580 y estos son los tres datos con los tres nombres exactamente iguales que almaceno aquí en la 137 00:11:54,580 --> 00:11:56,400 autenticación. archivo js. Así 138 00:11:56,410 --> 00:12:00,700 que aquí tenemos un objeto con un token, ID de usuario y 139 00:12:00,700 --> 00:12:03,000 campo de fecha de vencimiento, eso 140 00:12:03,010 --> 00:12:08,580 es lo que almacenamos en el almacenamiento asíncrono, eso es lo que puedo recuperar aquí. 141 00:12:08,610 --> 00:12:11,360 Ahora tenemos que verificar si el token aún es 142 00:12:11,460 --> 00:12:20,670 válido y para esto, puedo recrear mi fecha de vencimiento usando una nueva fecha y una fecha de vencimiento que en realidad es una cadena en formato ISO y ahora podemos 143 00:12:20,670 --> 00:12:23,220 agregar un control if y ver si fecha 144 00:12:23,220 --> 00:12:27,270 de vencimiento, por lo que la fecha en que el token deja de 145 00:12:27,270 --> 00:12:33,660 ser válido, si es menor o igual que la nueva fecha, que es la marca de tiempo actual, lo que significa que 146 00:12:33,660 --> 00:12:39,570 la fecha de vencimiento está en el pasado y si está en el pasado, entonces nuestro token no es válido. 147 00:12:40,320 --> 00:12:45,300 También es inválido si no podemos encontrar un token o también si no podemos 148 00:12:45,360 --> 00:12:51,900 encontrar un ID de usuario, si alguna de las tres condiciones es verdadera, tenemos un token inválido o un 149 00:12:51,900 --> 00:12:54,550 ID de usuario inválido o algo así. 150 00:12:54,570 --> 00:12:58,700 Entonces, en ese caso, también quiero regresar y, por supuesto, 151 00:12:59,340 --> 00:13:05,640 navegar a la pantalla de autenticación. Si lo hacemos más allá de este check, tenemos 152 00:13:05,700 --> 00:13:10,110 un token, tenemos un ID de usuario y el token sigue siendo válido. 153 00:13:10,110 --> 00:13:17,720 Entonces, si llegas aquí, llamaré accesorios. navegación. navegar por la tienda para ir a la 154 00:13:17,720 --> 00:13:21,020 pantalla de la tienda y también es importante, necesito iniciar sesión con 155 00:13:21,030 --> 00:13:24,230 el usuario y para eso, necesitamos una nueva acción porque no quiero 156 00:13:24,240 --> 00:13:29,900 enviar una solicitud ahora, solo quiero cambiar algunos datos en Redux. Entonces agregaré un nuevo creador de acciones 157 00:13:31,550 --> 00:13:44,200 aquí, exportar autenticación constante, tal vez que tome mi ID de usuario y mi token y que luego se use para cambiar mis datos en Redux y para eso, ahora agregaré un 158 00:13:44,200 --> 00:13:45,250 nuevo identificador 159 00:13:45,250 --> 00:13:54,390 de acción, autenticar con una cadena de autenticar aquí y usar esto aquí como un tipo de autenticación, adjunte mi ID de usuario 160 00:13:55,290 --> 00:14:02,190 que es mi ID de usuario aquí y mi token que es el token que obtengo como 161 00:14:02,190 --> 00:14:08,360 argumento y ahora esta acción de autenticación es lo que quiero enviar aquí en la 162 00:14:08,370 --> 00:14:09,600 pantalla de inicio. 163 00:14:10,730 --> 00:14:15,950 Pero antes de hacerlo, también podemos volver al creador de la acción y al final 164 00:14:15,950 --> 00:14:22,520 del registro, en lugar de enviar mi propia acción de registro personalizada aquí, también podemos enviar la autenticación y 165 00:14:22,550 --> 00:14:23,390 ejecutar esto 166 00:14:23,510 --> 00:14:33,930 aquí, este creador de acción y simplemente reenviar resData. localId como userId y resData. idToken como token y 167 00:14:33,950 --> 00:14:40,040 hacer lo mismo al final del inicio de sesión. 168 00:14:40,040 --> 00:14:45,400 Así que ahora combiné estos dos flujos porque al final sucede lo mismo, así que ahora 169 00:14:45,560 --> 00:14:51,350 en el reductor, en el reductor de autenticación, por supuesto, en lugar de verificar el inicio de sesión 170 00:14:51,350 --> 00:14:57,780 y el registro, simplemente podemos importar autenticar y usar este identificador aquí, deshazte de registrarte y lo comentaré para seguir 171 00:14:57,800 --> 00:15:00,830 viviendo aquí como referencia porque sucede lo mismo. 172 00:15:00,860 --> 00:15:05,980 Así que ahora combinarlo tiene sentido porque también lo necesitamos para este inicio de sesión automático. 173 00:15:06,020 --> 00:15:11,090 Entonces aquí también lo envío aquí para el inicio de sesión manual y el registro 174 00:15:11,090 --> 00:15:17,150 manual y, por supuesto, ahora con eso, si lo desea, también puede deshacerse del inicio de sesión y registrarse 175 00:15:17,150 --> 00:15:20,200 aquí, de estos dos identificadores porque no úsalas más. 176 00:15:20,390 --> 00:15:24,380 Pero con eso, volviendo a la pantalla de inicio, aquí también 177 00:15:24,600 --> 00:15:34,480 podemos enviar esto y para eso solo necesita importar el envío de React Redux e importar la acción, así que importe todo como acciones de autenticación, tal vez 178 00:15:34,490 --> 00:15:41,650 desde la carpeta de la tienda, desde el carpeta de acciones y desde el archivo de autenticación allí y luego aquí 179 00:15:41,650 --> 00:15:43,190 al principio, obtenga acceso 180 00:15:43,270 --> 00:15:49,590 a la función de envío llamando a use dispatch y con eso disponible, aquí podemos agregar el despacho 181 00:15:49,800 --> 00:15:55,230 como una dependencia, pero esto nunca cambiará, por lo que el efecto nunca se volverá 182 00:15:55,240 --> 00:16:01,330 a ejecutar y aquí después de navegar a la tienda, ahora también quiero enviar acciones de autenticación 183 00:16:01,450 --> 00:16:10,510 para autenticar y reenviar el ID de usuario extraído, por lo que este campo aquí y el token extraído, por lo que este campo que obtuve 184 00:16:10,510 --> 00:16:19,150 de mi almacenamiento asíncrono y que ahora debería iniciar sesión automáticamente . Eso fue mucho trabajo, veamos si 185 00:16:19,150 --> 00:16:24,310 eso funciona. Si vuelvo a cargar esto, termino aquí en la pantalla de inicio de 186 00:16:24,340 --> 00:16:27,010 sesión porque en este momento no tengo tokens válidos almacenados en el almacenamiento asíncrono. 187 00:16:27,880 --> 00:16:37,510 Entonces, si intento iniciar sesión aquí, me reenvían, si ahora recargo, termino nuevamente aquí y eso es genial porque ahora 188 00:16:37,510 --> 00:16:43,560 esto significa que esto parece funcionar y que el token está almacenado. 189 00:16:43,730 --> 00:16:48,230 Ahora, por supuesto, sería bueno si también pudiéramos cerrar sesión, porque en este momento, no hay forma 190 00:16:48,230 --> 00:16:49,070 de hacerlo.