diff --git a/.env.template b/.env.template new file mode 100644 index 00000000..c42edccd --- /dev/null +++ b/.env.template @@ -0,0 +1 @@ +openaiToken= \ No newline at end of file diff --git a/.firebase/hosting.YnVpbGQvd2Vi.cache b/.firebase/hosting.YnVpbGQvd2Vi.cache index 613c6d57..e4f64439 100644 --- a/.firebase/hosting.YnVpbGQvd2Vi.cache +++ b/.firebase/hosting.YnVpbGQvd2Vi.cache @@ -1,844 +1,986 @@ -404.html,1625600705923,b7bab6b83fa074653ff28c8d2a64135d3434575f70a12ab3d3ba8080461b9537 -favicon.png,1628702437632,bc61d7b6fb147376de227725039076a3b96af9b4ab6445e645dc61fad99d22d9 -manifest.json,1628702437628,98af39cff44477c2928f9ef6a0c50b90bb7f7574115fb55a3c02de1c3a9194a2 -version.json,1628702437360,eb6db468ee9d27770066266409bd46a4130653a5baee93b117941f7a0da0d657 -assets/FontManifest.json,1628702437628,d802c5900d0fe04223c6d000a5d108ffb0d39938a55b188dfd3ecc879f04cd2a -index.html,1628702437632,82a7adcebeead37270e0860d6aebcde81ce410df7df521693f3601dcbb85b72e -assets/assets/3%20people.svg,1628702437624,5df6782ad59775d66d56074ecd69629a21044ef3822189b63a5d9fe91e70dab3 -assets/assets/Group%20671.png,1628702437624,aaae91e09068aab3f5764943f69e0389fce71c9ded4c372025b7b976862d6503 -assets/assets/Group%20706.svg,1628702437624,e33977cc4f956c5a2cc71168ac9229f0e5fd11f9cb0fa5e3831914e9ce752d40 -assets/assets/Group%20728.svg,1628702437624,dee4b43cc478e778c084d2d519818b7da2dd17454f3b0e1bea241d09a2d373a2 -assets/assets/Group%20729.svg,1628702437624,01ef5f38888a36b911bc83cdfc9e66758bf5b54bff3d4c83d15989003f440730 -assets/assets/Group%20727.svg,1628702437624,e94233ee667509deee6828360ba2678928409f3d084f59408dc06d5e91dbc060 -assets/assets/Group%20731.svg,1628702437624,5b2cca8b92c8c57e6620dee973175ebb1cdc6673adb53e01e82863ab50ead605 -assets/assets/Group%20731@2x.svg,1628702437624,5b2cca8b92c8c57e6620dee973175ebb1cdc6673adb53e01e82863ab50ead605 -assets/assets/Group%20732.svg,1628702437624,6fe11508db4c93f6bc83e5f3537b60d2dd5f88fb92cebbeba9d804d8b6f809c5 -assets/assets/Group%20730.svg,1628702437624,1fcdc98ee76fa697ccc29e4a8d84d0f51ced9ff3575dc8f0344c71adc51f780f -assets/assets/frases.json,1628702437624,3c11d851df9353e337e102c1274e0ead0f6642914b3041e3ec23dd33b370a53e -assets/assets/Group%20732_.svg,1628702437624,050f7ce9db7dc36b7cd8a7f3160ddcc444192c7d982070371dd02386877f7bf0 -assets/assets/imgs/a.webp,1628702437584,55954034f8274933390ba847c8ccb15efa0d582b65ee57d3ffbf33e50ad6a0a5 -assets/AssetManifest.json,1628702437628,85d2f48f5a361782b23c57fefeb52317637a95bff8d314f0a92d8b5bf58147ab -assets/assets/wheelchair%20girl.svg,1628702437624,3389f69ea49358e645d61e0fc924441461d51c31781412220fc426263b642ad6 -assets/assets/imgs/abrir.webp,1628702437568,e0289b9237bae7fddf7d657e01a89e181c298a298ff47baf0f0441fee1e1ce5d -assets/assets/imgs/aceite.webp,1628702437600,532ea4a922c70375ea0dd71440c5711568565645c20a70bd6e81c83cd269859d -assets/assets/imgs/agregar_picto_transp.webp,1628702437580,313cc46c8745ffcc8ef5827d135f766d26eb5c44841f9b1d2e223f541d4813dd -assets/assets/imgs/agua.webp,1628702437576,0a39e2b9bf9e73c9ce77e87415de3c64dc3fcf83df6ee61038d8c618b897e7c8 -assets/assets/imgs/almohada.webp,1628702437580,425a3aa192f996c8d207a41bf0a4ab4b21314e2a70b76d023fdb136f0744a9e2 -assets/assets/imgs/amar.webp,1628702437572,af8b7846d8bb3a35121c9b3195d31d1663765226a267ee11246ecaeb2f05af0b -assets/assets/imgs/ante.webp,1628702437568,6247eeac95044cac64341c9c316801c439693cd47a3cfb9ff396f8a9bf2b28dc -assets/assets/imgs/abrigos.webp,1628702437568,32ee8b48d75f7a3fc632562eb97408c8d31894511b4de220dc25b2990dcf9960 -assets/assets/imgs/abrazar.webp,1628702437588,a3c2025641bb7c46078cdcb715ac8decf9c655bcd3b4c2e049fa9feeebce75ac -assets/assets/imgs/abrochar.webp,1628702437568,36348b35a3d3a83c8d0750c377022825c62a06c58a2128cad24a61d961a1eae9 -assets/assets/imgs/abeja.webp,1628702437596,c360e2e437550675ba6f3f709fd59d96fae86e8541946e36b069917acafa46bf -assets/assets/imgs/acelga.webp,1628702437568,b8a710cbf8f30caba39501632bd802a26fd037de02c03438b353f0bac4f1b1e5 -assets/assets/imgs/acido.webp,1628702437568,f6b930a89671d09004b6962546f7c6044dfacf55a9840ba79b135eb4b27ffa18 -assets/assets/imgs/aeropuerto.webp,1628702437620,1ae54ece9f3bd86be63b1a2f427e91edd5f7d2df59bcf4c599e0b7a7480e426e -assets/assets/imgs/alcachofa.webp,1628702437576,d2ee95e2b0688938e1f33b8310bbbc106baf8899e13a124bef14fdd49af40e5d -assets/assets/pictos_originales.json,1628702437624,ccc3d8873200ffb5cbea106517a6c76f56852531ac38e1ea3f458083eded4045 -assets/assets/pictos.json,1628702437624,75f6a4cde320e529e3098682e0f45463515c80950d1163a817da452615f0e00f -assets/assets/imgs/alto.webp,1628702437608,addd5ce3a73b256cba7949f723357a7be4b4aa5423078c9cf171e7f70512e238 -assets/assets/imgs/almendras.webp,1628702437624,42d6aa3cde144f28ef98281b411a9fa9992ef88c32daba876a66e65a2bdb3a21 -assets/assets/imgs/antes.webp,1628702437608,6663dd8b33d47d523fe15c0127d6da7e69afc9cedb621858ce1f56e0f096b5ee -assets/assets/imgs/ansioso.webp,1628702437584,9a3caea3582f3b1b03ebcac52a94f79d7707f1bf5bccb66733a34fbe0be5b890 -assets/assets/imgs/antipatico.webp,1628702437592,f3d66da2858f2eab95cd9629f3f17cd20f842513692408d4f7b386c041fde736 -flutter_service_worker.js,1628702438136,0aa5bd0a4764e467c029c19387c90acb5244bd5d01838596488d6f1ca811ef5e -assets/assets/imgs/ajedrez.webp,1628702437580,7a72cdb48f0797317a6ec4c4138d0892fc1cb99c203d8208714140ff2857bd95 -assets/assets/imgs/animales.webp,1628702437612,a9f2ae0f791adb331e5ceadcabcba94c0951f3f1da3e2e3178f10cbe89f898d1 -assets/assets/imgs/amistad.webp,1628702437564,8d66a0b58c5f57c765acd8fbc8fcc7f2b24936cdf9ce7d02ac4e4f54bab5f8c2 -assets/assets/grupos.json,1628702437624,44906f5f13ff4c00775d30ba56f05dcc1fca9defd5ce37da8094da5e2c1d9122 -assets/assets/imgs/arasaac.webp,1628702437576,8bff66f742f1e52671f86b54dc94d71eb52402a3c34711eb32057db12febcb16 -assets/assets/imgs/apenado.webp,1628702437584,ff9916a0857c7a41dc44291850565e581318b34003ca9358349d75bcd50678b3 -assets/assets/imgs/asustado.webp,1628702437576,86195f54163b8e4a2a32bc596f0fa8057e0bf5b2b1248c435cf7794181f41b93 -assets/assets/imgs/asno.webp,1628702437584,db5a3d9e34caa8f822a005f680586fea74c721b7e4c5965a3b11f66ffb8e37b2 -assets/assets/imgs/aunque.webp,1628702437568,3ccf4e624d260fb2d923918e0ab62130751453077a4aa3be41a313abaec56619 -assets/assets/imgs/ausente.webp,1628702437620,6c9556836f807d871f8b1e3c8d1507ceac030648efc89113ed168b709fc95c5b -assets/assets/imgs/autobus.webp,1628702437584,a90c1482027319adf07f782c78a08b5e481287b14364881c6dbf606132c543a5 -assets/assets/imgs/ayer.webp,1628702437584,d1d7fd91582e6f2ae521351d80303bdcb85686e68ea477f092d3c0288d09f4f0 -assets/assets/imgs/azucar.webp,1628702437608,09a3ef3a85f08e82b5e8a52cd3d749eab5271ba9c2afc34a749473e71e058c11 -assets/assets/imgs/bajo_prep.webp,1628702437600,428843c736cf985ac541cea8e88dbc49233adaf0f109abee79a5b64b248923d0 -assets/assets/imgs/ballena.webp,1628702437592,b4bb496176440967bdf0bd64c81da1bf4c571a4d51e03dc8f29b0828e380b425 -assets/assets/imgs/base.webp,1628702437608,669bcce43ec699dba3fea5ba654a0741d8d09d1e728c7590e92e2693224491bf -assets/assets/imgs/barriga.webp,1628702437580,5007bc54220043265dc0eb3a1c3fcc4e4051a9472cc7bcd6dda55e28afd3f83c -assets/assets/imgs/beber.webp,1628702437608,e36666a63e3f8769e23af30e0b3a82b728e29e2ca43c8dbf3dc1c947137ea065 -assets/assets/imgs/bikinis.webp,1628702437580,1547907a99f8a9788d759fa396499e53a33ac7ada670a9492bee1af49fe53953 -assets/assets/imgs/blanca.webp,1628702437568,7f0412ce859307567c8e473455f8ba9400937f34e2850230d2fba84ffb9b61c3 -assets/assets/imgs/arreglado.webp,1628702437572,c5a114eedaabf1fe4f3c5282c682178f5f70496a54fdf3595f33d4a133b138e5 -assets/assets/imgs/atun.webp,1628702437612,9fb7ec91ab009b01cb76ccdaeb64a21eb2999de90f7a28279794eab7e2350cee -assets/assets/imgs/avion.webp,1628702437568,31fd9c4567f261294ea2bf04736b26167df6b1584f33a7b8da60b14e3e42fc76 -assets/assets/imgs/ayuda.webp,1628702437588,3c2182b19c1c5518f25623d293bd248394cd8254f47ce34400b7de1b7ae4b5b2 -assets/assets/imgs/bajo.webp,1628702437576,4dfc19dea49c2f7e4ba713225de71a8a78d8e44a1bed0c36de956c15b3b665b1 -assets/assets/imgs/banana.webp,1628702437600,d53c4c702f0a4950642267677ecc31015facf88535d6dda3f4d98536c3fe8d43 -assets/assets/imgs/bocadillo.webp,1628702437608,ec474f292d441821e3cbbd69878abb72e2fc1223614e7cb2936b8e825ee4ec75 -assets/assets/imgs/barato.webp,1628702437576,16cfa79885b1ab0a6150308a79fd65757079e4ad5d453dda7ab02804a4369cb3 -assets/assets/imgs/borde.webp,1628702437568,9cf31af06ea574fd5b8a43770336049a96c2849bd43a9b74635f8c819257f349 -assets/assets/imgs/bota.webp,1628702437600,5f7c854c8c8d2ec1f42edab4b41497f2b34566070fa1b407ea7a9a88f46100db -assets/assets/imgs/borracho.webp,1628702437592,27a19c95accc658747b608bf10d053610c2264bf4d3b5b1b9d91d5a64cb3fd6c -assets/assets/imgs/brazo.webp,1628702437592,125cb32808cc2ffed62c8407913fd1346e76c2dd5161ec277e340e0f629dbf3c -assets/assets/imgs/bebida.webp,1628702437612,f6239693708acd821500ccbe3d29e520369418a018f0241ae73975f67db4e170 -assets/assets/imgs/bueno.webp,1628702437576,1fb20e58c75e43875fa785ec3f4328bcb597c5a58b4105486cbedfa7d1f2ab76 -assets/assets/imgs/anana.webp,1628702437608,b89894eeef47ab6ae10f4b5d9cea3d2c4c0a666be4369bb4dcfc8ddee5a35ed1 -assets/assets/imgs/bufandas.webp,1628702437604,ff8a7a0575da9a0c8828bd5bebb1fd0dcf3e3eb2a13202a441e1bf36e7dbcb3d -assets/assets/imgs/bajar.webp,1628702437568,a46d4ff5a1a3f7dad615bba05901f7e210ee1a75b44feba6ac8af542ebf60edf -assets/assets/imgs/blando.webp,1628702437576,a9209d7d1f2139a2db36dc40ea62570f97939e4c8102138f7ebc3aed5e19aac8 -assets/assets/imgs/boca.webp,1628702437612,ec9045636c496e11734f8d07abbffb210dfa51cb0c96be8756fc9ea35d9cd390 -assets/assets/imgs/bolsa.webp,1628702437608,905b219d7087779d039cde0b04611e53d59913042ee018e0bfdbde7fd6291145 -assets/assets/imgs/botones.webp,1628702437580,4862de114951ffff8c704711710ba72c50b80c426a404a243c56b9df02fa6a57 -assets/assets/imgs/besar.webp,1628702437580,294f4eaa060134f5de45077ba567af0cd6909c46c256241cedcf6fa33e9e784f -assets/assets/imgs/buena.webp,1628702437568,fe1edd65de006ecdfa1ecc3bba7ce6da1417de6b531a09bfa70de40165d8d38a -assets/assets/imgs/buey.webp,1628702437584,7c99b76da170cd97bc473183e636d86fc4454b414b242c14ea8969c6eee13fad -assets/assets/imgs/bar.webp,1628702437608,5aa260cdbac4562967dadb4fe5b2e52719cda9cde5d89d8bf5f149f953e9c973 -assets/assets/imgs/bolsos.webp,1628702437576,de80e9fbe3ae3077be7ade3b211a000386866b1c12758c9c1fe52bf008758ef2 -assets/assets/imgs/cafe.webp,1628702437620,6d3a09370fed278c18b88d5cf6b9921dc25324d4efef55cc13cda9c26efe2e72 -assets/assets/imgs/calcetin.webp,1628702437608,5016d52f3d46c79720b20bb96b90a2f878d014f3912c1661f8f69eac383aa224 -assets/assets/imgs/caballo.webp,1628702437612,2205541e3a3957730615d67dbd2b911b2f1b8c26c1227f2a2382d2065953945d -assets/assets/imgs/caluroso.webp,1628702437576,75d517ebfc38607eab05fadd3b4d21678e4ec49dd55379cd6b4e87a132eea8bd -assets/assets/imgs/camisas.webp,1628702437572,5ea16940536747529ea3a4ba2ee363503299235a3ff8b8ccadf938bd0d21eb91 -assets/assets/imgs/canario.webp,1628702437580,644a453e003b04a7ea157368194584ed871d66eabe515219114a837d51d6851c -assets/assets/imgs/cajon.webp,1628702437572,fcbdb7b9466601450a1644fae3d427f6ad0f2e1197d4d31862ae34dfc2a99fbf -assets/assets/imgs/btn_mas_pictos.webp,1628702437624,516dc0c17f3d9aaa9bdbd36843edc29f5fb4ec427573f86dfc12dd6d498ab972 -assets/assets/imgs/calabaza.webp,1628702437568,3a16ae3bd1d2da0d1553bbcc919dd64398133eab440a7949ceee5b0fa1c234c6 -assets/assets/imgs/cabra.webp,1628702437572,0b08e21eb5cf4fdd97e0c50298f058082c8f9654c34738f54fd86d5b0b9fe830 -assets/assets/imgs/cabalgar.webp,1628702437580,cf7f102e1d9583d88be3741fff5513dbb4de173c40132e60ad647e19b3394367 -assets/assets/imgs/caliente.webp,1628702437600,21f081ee415fab6c39ddfac4f86199e1179369c106c95fc76f5a7c83b271170e -assets/assets/imgs/caliente_cosa.webp,1628702437584,ee3235725518d0edad919838c6839d47d2b121757df9d81bda4f80900bab48ce -assets/assets/imgs/caracol.webp,1628702437576,2624019b69ffef2f784bae527b9f3093ebc3c75a5d38c0a7e394b1ab8d32735e -assets/assets/imgs/camello.webp,1628702437580,7bcd98540ee90d47a1ba5b88d6af3e017e3c842c519e4be7fe14202ef0ff8627 -assets/assets/imgs/camion_de_juguete.webp,1628702437576,33e94c15519b6bdaf2296e3d33462d6e3826699355105a64fb9ce8f2674c1fcf -assets/assets/imgs/camiseta_de_manga_larga.webp,1628702437592,9f8f52006674255e87ed31690a9969780089c647fe3ef4c46f7978984a5697f0 -assets/assets/imgs/cerezas.webp,1628702437568,871c09b59b2250ce17768bf83f674764e915b8d45903f82ae0124740fa9c7c6f -assets/assets/imgs/cancha.webp,1628702437608,3b56ead4a93a9f99f096489ac8947ee6ed8089eb3c947670c068d83339440ec5 -assets/assets/imgs/cero.webp,1628702437568,79b40b93681816129eff9ad993fdd477a3293e36b78efe011de01b2549d5695a -assets/assets/imgs/capuchas.webp,1628702437568,fca86393fc41dc4b61ed649668e0f86e27d91ba5dc8378eaed5be559e9524b3b -assets/assets/imgs/cerrar.webp,1628702437608,af92fb2537a42f249bcdd4ab4f4220823d87899523475b5165b082f0aa86a987 -assets/assets/imgs/carniceria.webp,1628702437612,9da545f0e8c85dd3fff7cd2b1ffead5ab916797e38f95c7ac4bcd7f55435ae82 -assets/assets/imgs/checkjuego.webp,1628702437592,488d7e2bf039b5c6fa99bad0de1608552a06cb32aa4f946bd7caebe07f8c1018 -assets/assets/imgs/caer.webp,1628702437568,8a9241c5d207b46627b91942f75711b3f821457eacd0ca4b9184c52f1111fcd9 -assets/assets/imgs/calzado.webp,1628702437600,2b43478d3c6c64de310e364136936965db8bc621eedeacdf4df252907750e186 -assets/assets/imgs/carnicerias.webp,1628702437612,06788d0e06f3322f0b3d495a97bef78352a83d1aa38e52fca07ff2f6729e9751 -assets/assets/imgs/castanas.webp,1628702437608,c2bc5c62e9c42b37458d6cb5fe7a28ee0fc690ebb280b39197d9eed03004bd9d -assets/assets/imgs/campera.webp,1628702437584,51ed1759e19feccd6b80af90f28610942a3dd9e2ccc0e0d8b44f8dbcabf2b63d -assets/assets/imgs/cebolla.webp,1628702437608,36b327baf2eb4ca2512c6fc22c91793fbc2ac2bcea6e060c59a0510e22eca3cb -assets/assets/imgs/chupetin.webp,1628702437608,33ab510599f3ee3ad98e593dcca66d48c71cf86bf7a4133a15aa8af70197128d -assets/assets/imgs/cinco.webp,1628702437596,d4050ade6d93adb211346f8fc9d147f4153ac4045bb4224bebd2652eeaef40b1 -assets/assets/imgs/cerdo.webp,1628702437568,2621c709b378fcd75be85086c6acbe2c2901c897a74f480be421000b59f76517 -assets/assets/imgs/btn_galeria.webp,1628702437608,a901b6a7dc9bd01e7e50d9175cfd174c010a0b4a10c4067ac1c3e116a230dc52 -assets/assets/imgs/cangrejo.webp,1628702437588,03edc6a2eb23631b1b1ede901a8ea32676b1d0bf12972a2dcffc40a21f6537d5 -assets/assets/imgs/capuchino.webp,1628702437564,ce8d4fbd5f286006e3f077f96593576d8c1178ca2c03333b4b192c0b0b4f5b2f -assets/assets/imgs/cerveza.webp,1628702437620,b888a05035881c61c7c0b46c7c5170a564bc27bcebaf7e42fa29c7467f5dc70d -assets/assets/imgs/chimpance.webp,1628702437592,79e8a653bba894a1756683dd72d6e33840e5b6dfb00869306e65c4a911aba15b -assets/assets/imgs/chocolate.webp,1628702437596,b9e3402c6d57dcd8cc12b8cf7e0c0a663c5edce99e215816215953e58da25d78 -assets/assets/imgs/carnicero.webp,1628702437584,8b9bd07e5c061cec56b2f5fb303e5050a631698a5ac6074f1913d524ca0e7b76 -assets/assets/imgs/chorizo.webp,1628702437580,0331b8f24bf2e1d33735f75d8b1a532ced8cb3ddbde9646846a8aa6745c02b22 -assets/assets/imgs/claros.webp,1628702437596,fe37fde8d62f7c5d9d170f0d0be42483679468f0e2e07867afb86849f1ce7101 -assets/assets/imgs/ciudad.webp,1628702437572,8c2a4c32f2d060462891744b639251584c0da63a76410a010cd7d70956d23cd6 -assets/assets/imgs/clase_plastica.webp,1628702437568,27cc9d8b878b9f3d6e4253c5601602aba0392fd0e6ffc2db83804cf8c4e10f3c -assets/assets/imgs/celebracion.webp,1628702437600,7bf1a5d5cad3c9102152b8b882b2ddc9a169e5b2b3219806864b1c252638b160 -assets/assets/imgs/clase_musica.webp,1628702437588,7602b8564e87a780a4dc9d8c9043ad520512642c2b1950337f3091055936f3f0 -assets/assets/imgs/canelones.webp,1628702437612,bb3554f773b2e67d5dcac8dc9d8f9a0f465442946886cf20c758565295e9f064 -assets/assets/imgs/cocacola.webp,1628702437608,77b7980bc6cb40955bb23f6fbe66eb91cb5e5f0ad256466b188bee68da317009 -assets/assets/imgs/cinta_de_pelo.webp,1628702437580,7471bb5593bb471cb6d4f1753877f5df14f42860b4193502ab85643e3bd7dacf -assets/assets/imgs/ciruela.webp,1628702437568,e501c347f039ed74d726af5259068cb68a70e3d9b7f974b00034b95fafd31622 -assets/assets/imgs/coche_de_bomberos.webp,1628702437620,5dc48a0101ca070ecdcfeb40f0392ec3122e140cbac7324bb75d9eb76ca8ae63 -assets/assets/imgs/coche_de_juguete.webp,1628702437592,94df6270458577c3983e3f8ef1ad55ceea9a4bac9ffeeab7016ee5912f77b64e -assets/assets/imgs/cocinero.webp,1628702437592,5bedcff5094297673eed0dbc2f47794063d887600ef52ec8f99e062a60ae25bd -assets/assets/imgs/cocinita.webp,1628702437580,9ff155c860cdda79759fb362392bc351f742958aff34bc26093d3328bb8b9c50 -assets/assets/imgs/codo.webp,1628702437608,5cbbee302ed78f67ac9787242a71a430962078da25ecd2c99130ee8a389b54df -assets/assets/imgs/cine.webp,1628702437584,aca73cbf10d5703f522cf16067aa079c69669a0bac1ade3c4d2feab4793137c0 -assets/assets/imgs/coger.webp,1628702437592,cfafb9edfea7cfe1d86a01fa03a2c7d8bb437b42e49e71b598ac32a4c89c629c -assets/assets/imgs/color_pregunta.webp,1628702437608,fcec6d1fbc629f74edf3f82d1b834869fab31b86355b9fe930ccdbebe42a9745 -assets/assets/imgs/comer.webp,1628702437584,f5ee997c0762c110baf229f487ff918a04ef2cde92fd7e9048c7c3f3501f81c0 -assets/assets/imgs/coche.webp,1628702437572,a217176b2685043540fb7fd6368cc512d0e8b6100123a9b9ad5cda42a03be868 -assets/assets/imgs/cometa.webp,1628702437620,87b3942d4b5a326e2780a6dfb6d20bcb53152bc1d26d641f0d6831fa33f90114 -assets/assets/imgs/coche_de_carreras.webp,1628702437588,1a25643872ee6e077fd76f75395383af84e07c92df0ef1c6b9c587ebcae285dc -assets/assets/imgs/cocina.webp,1628702437596,b78e31ffd66b7fad65de1931b0df98c7a6d28f27444a215477d598cc2d2d7e70 -assets/assets/imgs/cocinar.webp,1628702437564,5645f48735449a09276df24ebb4d04ef08d8fd06014b1f9e51018da9023b978b -assets/assets/imgs/como.webp,1628702437580,a11fea830aa0b8e5c82fbde5e22fd62c1cd1d29b1770cd7c43e6e409fa2c1f7d -assets/assets/imgs/con_prep.webp,1628702437620,9a5c61f9eb4fbeb42846eb9f33acceb48e2361451f6f00626e6d50bba98d0ca9 -assets/assets/imgs/conejo.webp,1628702437572,42fba96abba36c8893b3570c5d5887366dc868b2a44d341b8d094ca21eaabb4d -assets/assets/imgs/contra.webp,1628702437600,5c9a2626ac8076a336093c2d3b7d4b85e82b883865ef9fdd4ccc658ccab2387f -assets/assets/imgs/conjunciones.webp,1628702437592,e1d85da3e1a08c5ad504b477c15080100b5e7d02015c71b9af560492e9da757c -assets/assets/imgs/cordero.webp,1628702437600,b7df81e466b9a10607ea3b6e2f19fed509b31f2a097e78d01d6ee25c2344e873 -assets/assets/imgs/caro.webp,1628702437568,cb15113855332029f491765eb893462ee5866e82a1d1a936f8d6c1944cd95723 -assets/assets/imgs/comida.webp,1628702437592,cf9c1b8b5b3d2da94c8982765fd44b1809e516f5b42daae1273e595d934ae359 -assets/assets/imgs/comidas.webp,1628702437612,29ff611651e653c3f2d8a9cd733ed4d9040a602b1529d144bf5aadb6b299291b -assets/assets/imgs/cual.webp,1628702437588,e5ad3cfe0bb52bc49fe6b1cd7efa4304f13234ca41498d32dc351ee4798df0df -assets/assets/imgs/cualquier.webp,1628702437568,594d58a76873ed59db7a8bc58178c962a1249ee91ffd481c1dd3976c1b8b253a -assets/assets/imgs/cuantos.webp,1628702437600,a0e769a15d189a0ad9a19c6ca5c1892c585f9a07560edfd477412b8664f92525 -assets/assets/imgs/comodo.webp,1628702437588,a7872b4b7af26824223c12330c7a736f2f2b3427d78ad71c8dd2c61171fa5386 -assets/assets/imgs/cuarto.webp,1628702437576,15f3b54f8dc8eaa0bba13f3f9e96306882286e8b23d2db58fc9e2cbcf8337069 -assets/assets/imgs/condimentos.webp,1628702437620,2c3c8489ca60a16627ed20a4098dd10749bc6320a7a4aabd1fd9f8fe32a9bed6 -assets/assets/imgs/cuatro.webp,1628702437608,9d92a58e6dcd26c2da1a8d51cb1712d6fedfed013de0bd0191304cc535e6368d -assets/assets/imgs/comer_un_bocadillo.webp,1628702437572,3173542be5e142a513129366c717e27d15f71ff24f846b0be5a00e376bd1b33f -assets/assets/imgs/cortar.webp,1628702437572,c4f3c99ba71a7614502d41dbf6279e8dd3029eced9428710649643d77bb4c859 -assets/assets/imgs/cubos_apilables.webp,1628702437620,f939f7ad295445299dc19e7ee98383617584915c2af822ae215c36eebc4c867a -assets/assets/imgs/coro.webp,1628702437608,f40a3be0bf1df3e7d04872f5b0d632a573f7bdcc65a92226e931c01c1d47f04e -assets/assets/imgs/cuchara.webp,1628702437564,143fc8151f6bd41a04ec32ebc004651d3a5a1ccc66f4d405126c6e47ae682a9c -assets/assets/imgs/cuchillo.webp,1628702437608,3361b4962a28f08e6a89e13a89d2dfccba372df2443910bb4c478e1e337aa722 -assets/assets/imgs/cuello.webp,1628702437592,b5225209169612cef573df9d8e62d9eb608e18886bfd7ba91a2b51d372b42757 -assets/assets/imgs/damasco.webp,1628702437576,1c0a403e327cd9832aab10fb0813cd93a891137452b1357abab63c54f8879599 -assets/assets/imgs/de.webp,1628702437576,91d6692557c2dd9b1cb9f6a2dabe540f8efb27ce2e96f64f101530ff02712a10 -assets/assets/imgs/comidas2.webp,1628702437572,c38e82db90392c259beec8ccb6eac228d281c5bce4652c332832e9c36e7b5dd5 -assets/assets/imgs/cuando.webp,1628702437592,804fd952635557fb9593ee0b334513659de95a623d941a9d8fc6e3c970178435 -assets/assets/imgs/del.webp,1628702437608,7190f0d1c23333153e2b58bea5b9fcddf0d9742a806588c1a8bee3d265306603 -assets/assets/imgs/conceptos.webp,1628702437584,f6cef250b0cd9440b1d938897bf4585b134a6f4ab6c86966d4f495549d950200 -assets/assets/imgs/desconocida.webp,1628702437572,66e1955dd361a2fc60c4055c97e4d6a57b5f9cd73edfbac676368da41eee3764 -assets/assets/imgs/cumplimiento.webp,1628702437624,64f13bb687d3390829358fbdc286cf2ffa89ee00785f232938f2393e78c5c31d -assets/assets/imgs/cuento.webp,1628702437608,95b38e37153a9115f733de58e4a8d46b5558d35ae00b5cb5d4f00191df88fcfc -assets/assets/imgs/desde.webp,1628702437568,8c345a29a2bb9bf682e047b4d5ba3171923e92b7996f567c71812e4c0a26ced7 -assets/assets/imgs/curar.webp,1628702437568,b18ffae05172d81034a836717aa9a3f580aba5f2977ad642403fc9afeff5fde7 -assets/assets/imgs/divertido.webp,1628702437580,61410336db56e4e415574660c3c17d3a9ae6f2b9ded9879d5dbf0f77d986f078 -assets/assets/imgs/dedos.webp,1628702437620,4035a5b3ac04b3ee1c2ee03bd27a783699a791d98f7530b6ec305f0cfe2b8eff -assets/assets/imgs/donde.webp,1628702437584,ea5611e4b15b9599ac4e87d08e0f6eed6f4bef4e9bdc32e5d4eb28f7fbbfb2a2 -assets/assets/imgs/descripcion.webp,1628702437584,49f4b23544dc1a136acd5243a3c7bddfe8ab4b30e8a7bec6b421fb47c7c90eb0 -assets/assets/imgs/dos.webp,1628702437612,4b3bafba7ece91badc9e963cc5bad67dd9768d6a2a6b0be71d8412e6da55ff9d -assets/assets/imgs/durante.webp,1628702437612,335a49930d152d25a46e4eb8ad45a607b2aabdf7d5678e0d2906677c30309d9b -assets/assets/imgs/duro.webp,1628702437580,9d5797e2a98b02ec8824bbdc43390e735039d55469927d58972f41fdbfa9831e -assets/assets/imgs/diez.webp,1628702437608,6e829b7954752f65f35f8e19597d82b422a72a0a170ec66235de45eb7f42b0f2 -assets/assets/imgs/despues.webp,1628702437564,41371d12891e51c1b5ebeebd283b93afde69fd77dc6453c04c8b8957deb52ef2 -assets/assets/imgs/e.webp,1628702437568,33e5e3b9cc90360b5173d7e237159f69476df8bff37289ab010f29b7998d8013 -assets/assets/imgs/en.webp,1628702437608,8662703c7ce365542784139008aa2368f1f8d0cd62435b54d431d5682ce3a15e -assets/assets/imgs/el.webp,1628702437620,e2ac779cba9c08454f4e3dfdca0a4f7e00fa04aa1220afb05aa8f2f85114c4cb -assets/assets/imgs/encender_la_television.webp,1628702437592,b984b5878145ca9d18acdf65574d58e46de24c0a7be5da66011efe858fb2845a -assets/assets/imgs/dorado.webp,1628702437588,4fb7abf689ff69ff76f13e2f0c1978015cc542fe9321f99322e8ece1bf329939 -assets/NOTICES,1628702437628,6c9876c1bfe0e490daf6bf3a0edafa582fd0f3ef7827625f7c74c6c28bec09bb -assets/assets/imgs/entero.webp,1628702437576,12133d27781c0807e547a71734d1a1e2d93d7179bd8b61ef1b10611273301817 -assets/assets/imgs/entre.webp,1628702437600,398bc89a51597817c73e8b7f17cb7dd065ddd2b47c0be81ed49ff066bef8deb3 -assets/assets/imgs/despeinada.webp,1628702437568,e8084a0c57e06d4ca9f9cc76468ec02eed8581a26b75d39952ef91b7192c9590 -assets/assets/imgs/despeinado.webp,1628702437600,c95967e034bb644714a7ab977011e5b5bd9272d004c47998a5dc05e9405f870b -assets/assets/imgs/dolores.webp,1628702437612,a152c941d89dd7dc930981068739eaa82e7e7eb667846a77cb8f124a2752c93e -assets/assets/imgs/factura.webp,1628702437600,5fd9adc3d530c49d05bd0f015f7dbc18913d98d10d7832d04cbcd500faa4f56d -assets/assets/imgs/feliz.webp,1628702437588,157d0a00e8ee928698540e78a9b68486aacb534fcd7e745f451aa8c44328f5e8 -assets/assets/imgs/filete.webp,1628702437568,ec87ec43c16677a24ecb0b6ad14eed33be2fea6a3af400a89a7e6eee9b084fca -assets/assets/imgs/correr.webp,1628702437620,20b431d87fa270281c13c7bf6e5fb5e37ab86f8f0c9205e4748185ae3f62ab60 -assets/assets/imgs/fresa.webp,1628702437580,8867bf57014bf427ca75d777d548f97b10d509073fb1e4f997b1696831a391b0 -assets/assets/imgs/frio.webp,1628702437572,4dab5ee19e075135610f774f75633398e099c4a2fce84f5e54d4e7877796c99c -assets/assets/imgs/entrar.webp,1628702437584,3de4ce8901dd761a3536c986a5d58839248353fa0c15b71a564f5cd772d835c5 -assets/assets/imgs/esperar.webp,1628702437584,d55eca25d89872b7d60ac3e79afc4a6d9156c781980ee817226396140b47fe68 -assets/assets/imgs/discoteca.webp,1628702437576,2527f5463fbb79e9f79ad81aed1710ac8527723d2b5984cbec145b5455421775 -assets/assets/imgs/estrenimiento.webp,1628702437564,f954032c33fd83b4dc32b8be98324b56e22565994f60a7aff0d7205d3e43c6ff -assets/assets/imgs/estadio_de_futbol.webp,1628702437600,32d08d97981bdd5373928228bf9a446488f530409a2eb7db433a8366c3c9ac74 -assets/assets/imgs/enamorado.webp,1628702437580,3bde4b2c8c160f28442b2c05e9457cc935d9e309d4c8d5398a3e2fa054666dfd -assets/assets/imgs/enamorados.webp,1628702437568,c33aed8251b0198765e26a03b779433526290a783b1a8dc4a841b313a4435698 -assets/assets/imgs/feo.webp,1628702437568,12743baab7f24fac6cc198fc67cc8a90e37c471fbe33fbea5442cc818a89439e -assets/assets/imgs/gato.webp,1628702437588,6e50e07ec5a15cf7d80effa842e14b53a7a534b810eaf21738407ed79a6648d3 -assets/assets/imgs/flan.webp,1628702437584,23e9af5a87053465c41ce3f43a46e2076aaff226d6afaff1a534608dcac80ddf -assets/assets/imgs/globos.webp,1628702437584,d874ec632eb910353d8cabcb01d4568e26827a56730c251ea337ca8a5d8a6b56 -assets/assets/imgs/gorro.webp,1628702437608,885157ad3eafe459af533d842ef47bb65a4f7f79d45a789361d801151b1e945f -assets/assets/imgs/grupo_fondo.webp,1628702437584,cc7f9fff28110b537f7eb314a544afda0bdf59034df3051b19259e02178f1507 -assets/assets/imgs/frio_cosa.webp,1628702437608,166dd127ab1fd3dc8079189e07dfe422a3286858208cca56f4b2db93d66a4138 -assets/assets/imgs/grillo.webp,1628702437612,6af02ce6d3d55f87be8d9a9be9473e462ffe44f36ba42c22d39a60c80ebb6f27 -assets/assets/imgs/galletas.webp,1628702437584,b426bd31d7de07bff36ad545df53585640f6fb6c8bf24749cc1a389da5468e11 -assets/assets/imgs/equipaje.webp,1628702437568,ba39ae993f347eb7bdad5f8363eeccb56ce4c3841b338caf66edd96c57997286 -assets/assets/imgs/fila.webp,1628702437588,afd409fa2f00627891e158fda1edcb6a7fd4b3a030b5fc534d2c64e8c7e3aa04 -assets/assets/imgs/gracioso.webp,1628702437600,99ef1745c77b453310988f41482a3015f38292b0819cbb5b2d66e480783f54c9 -assets/assets/imgs/hacia.webp,1628702437572,dcfaa0b66875da950d1829c2a72001382377fc4c68a12904719ff55dbbc87037 -assets/assets/imgs/hasta.webp,1628702437620,341b7768d8caa3bb19f5982542f8bc03e63df9e278ad6de33ec195fccee70404 -assets/assets/imgs/frio_bebida.webp,1628702437572,010fa508919bd1c5f40a2585c552db03ca050e2f330880b8e2fa19db8bec1a61 -assets/assets/imgs/hola_palito.webp,1628702437608,c669ca0b800bf6c3dece43f255b4d30f7c097d2b7f4b62f7db5cce9e71e33261 -assets/assets/imgs/gallo.webp,1628702437576,02c231e898ca9243f4b95b34308c95c4510ba87062e0915c61972a7d9cec6029 -assets/assets/imgs/guitarra.webp,1628702437576,cd6dfb0ba17aded76661bda3179348cdf78643e1b76bbbc1df04734b7ef6c1b0 -assets/assets/imgs/hombre.webp,1628702437568,052998213acbb73c3b8bae7b247265d7a78727cfd65121ca4db9c8971b49a604 -assets/assets/imgs/hombro.webp,1628702437604,6c13ca5bf037bfd0c919a4d27a4a456366d3c44adfc8b490964056ad8c1019af -assets/assets/imgs/horno.webp,1628702437576,5aa6e28b836f62f1521f71e22eb72e8f724150d91f5d13098c17af946b8269ba -assets/assets/imgs/frambuesas.webp,1628702437600,57cd8543ab3697f72cd488edc6300d7c7f3067cf4f42a7b7c869f4f725fd1e89 -assets/assets/imgs/hamburguesa.webp,1628702437600,3b8923af5c06caa9920d8cba74524ae495a07fe64f66f1ed31896fd00fc0301c -assets/assets/imgs/huesos.webp,1628702437608,e27773bac910d8cfda432673b8eab7ca26e5586bef87bdbd4b95c4c096c12abf -assets/assets/imgs/huevo_duro.webp,1628702437576,aae5d39cbf3b97e2bef1e1cfb04217c15dadb41e5682ec3b3592d6e960b1ee48 -assets/assets/imgs/hermana.webp,1628702437608,f228f6262ff8c7b6436017e73d541d776e6442e2535d51ac08a3ba619f0ea1d7 -assets/assets/imgs/huevo_frito.webp,1628702437588,f958bc6cc7226082a98caddd7b5f3a6d642bc7362ec002c6da58025dd79a0c27 -assets/assets/imgs/ic_aca.webp,1628702437584,62d0bfd2f868dd88c98a720785f7e6cee31f3fa866beb066ec95c51d076fa5bf -assets/assets/imgs/ic_aburrido.webp,1628702437580,14413151c06b2eb7fd9a75e83abc2aa9855ff9e0932adf45f5ba58cdefe1efbf -assets/assets/imgs/gustar.webp,1628702437584,4bafade56d98404eb7f94b7f2e500f5881d469653b8f448259c77d42b3acf8da -assets/assets/imgs/ic_acciones_futbol.webp,1628702437608,50e4c67a8a27bab7c3b2b8480eedeed638edf37248e1fc8d5695992776619838 -assets/assets/imgs/hospital.webp,1628702437592,680255c51c4df040a2da02b61d49a52c4736541cb39697e82fe65e8941c035e5 -assets/assets/imgs/gelatina.webp,1628702437568,3f33f04748135ea71f63d825f23777cef1e091aceb2d54cc9c1cd69446e37fac -assets/assets/imgs/enfermo.webp,1628702437584,187a2a3b329b8b9a814219455d60695e324235989c077b21c912a55b1e2c941d -assets/assets/imgs/ic_action_borrar.webp,1628702437608,6b6c14c36a818a7ddc089c35bd9e01c6b0a29a7b922d7de373c0b883a5e80c51 -assets/assets/imgs/hamburgueseria.webp,1628702437588,382aeca349f800e8d3fe068ec829e28d4e0b65e279a0cc2bf7d7ed21816076ec -assets/assets/imgs/ic_action_overflow.webp,1628702437576,2d4caf1cb131de24b5e1e34b41ed2cef2d5a754c94c488dd6318af554686f4b3 -assets/assets/imgs/ic_action_previous.webp,1628702437584,54bf6905e3067a0b05ca670da1cbd63b71bc15cab94b6027261c6abaab247e61 -assets/assets/imgs/ic_action_refresh.webp,1628702437576,603446a447e8bc52b71f27afe6f720fb7a4ba5528b777e7e0e16274d303d33d3 -assets/assets/imgs/ic_action_share.webp,1628702437584,a3669f1d60765390fae5cc13f2638dcea0bcf40451c50527ffbbbf829b009240 -assets/assets/imgs/ic_action_volume_muted.webp,1628702437592,96887c976c3ec5c92bb272cdbcbf2fd2985de4ce3ee6accb3ccbe718b3d233a2 -assets/assets/imgs/ic_agenda.webp,1628702437624,d63c0e7cd2e230f749c3c5a93722910deebb6719f14e57112a9ca1bddc1a5d11 -assets/assets/imgs/ic_abuelo.webp,1628702437576,444818029eac4ec1c68000a2f5a740b5144b06a1dcab9205c73e380837f8e8c0 -assets/assets/imgs/ic_agregar.webp,1628702437584,e55db373b0c2e9761751ae30451f0b00a550b971feba590ad6b728759e9502f5 -assets/assets/imgs/ic_agregar_nuevo.webp,1628702437564,4db64570ce99320c5474256831a8bf17d1206d77a6abb32797c86abb03f1209b -assets/assets/imgs/ic_agregar_viejo.webp,1628702437608,bec5c3644c373d162e94e43873481a38550bda42e5790c0d4960346c6209f1e7 -assets/assets/imgs/hotel.webp,1628702437608,b02dc3029ed9b04960855d8c2c7206da7b04fb4497eadb91c79be662e4f842d3 -assets/assets/imgs/hacer_el_amor.webp,1628702437580,2fade187c3758e2c9e2d8444ddd2c17d4ee197d716bfcaef6b87abbdb18cca2f -assets/assets/imgs/ic_alla.webp,1628702437584,8c0a092a16d802c61942b6176a920a2d726fdd38830b8b4ded211adad49ab024 -assets/assets/imgs/ic_amarillo.webp,1628702437608,7a0175fb8ffb69baf222f87fe6752e6d733dc1febdd22c69c1f10fdf75bdde50 -assets/assets/imgs/ic_adios.webp,1628702437572,7a446ff8d44e6efc7a2b04da55b9068fae753b8c53352b7ca53359aa4bba0ac9 -assets/assets/imgs/ic_actividad.webp,1628702437580,20ca35cd888260762f255fc2c0b798916753e4e7f0de7d67a2e7aed2e62d53a3 -assets/assets/imgs/ic_apagar_television.webp,1628702437624,cedf446de62f4b0b7428290f580c10c631fda0b80a58a2f9d0ed63209d7f1833 -assets/assets/imgs/husmear.webp,1628702437576,8236c5748d59846ddd51f8600dfaee35828b29ed820e5d5ba349ff5a86579fca -assets/assets/imgs/ic_atrasblanco.webp,1628702437592,59f56780c5c470a27780c4912a4795d123a70e9a79d5719fd79ae2f8bd81efe3 -assets/assets/imgs/ic_audio.webp,1628702437608,5e0bc2e5328c82fd247e5b403b7fecff4900e1d888066254e2e4146ab78e4dba -assets/assets/imgs/ic_acompanar.webp,1628702437588,bb01f59ec6c6cfd7def7ea10e7c5a1b01c58363731b7320c7c1f114aaeae4cb5 -assets/assets/imgs/ic_azul.webp,1628702437576,d6039df4654ccb4e8b80494b6441d6b0cc7a02c96387e7a7c2b4c006accb7c02 -assets/assets/imgs/ic_almuerzo.webp,1628702437588,9f85451fdfb8cd94ad38b3c18176a11fe303c33b3c598c160278820f2dd7f888 -assets/assets/imgs/ic_balanza.webp,1628702437580,de27b25bafe3de9fb5ea5b9d51bb475004b636d95a62917475772a03a2233ba2 -assets/assets/imgs/ic_bien.webp,1628702437564,88bbe62b8fa4441c6665ebb3b41995f75e88697e253e6821631db81a7808b60d -assets/assets/imgs/ic_blanco.webp,1628702437600,acbea83bf0533e66dc8a83059d83125c64b2cfe5967ee81114d148d29c07dbd8 -assets/assets/imgs/ic_buenas_noches.webp,1628702437580,46d9fa824d723b53888e29405f671a00cc7d52ea13ade360432e36b35968d751 -assets/assets/imgs/ic_buenas_tardes.webp,1628702437608,0a9864198a903ec098617c7c181c624ba906dd7e3ffb6daa68597370a4183cef -assets/assets/imgs/ic_buenos_dias.webp,1628702437572,b74cf75ee529b5a51924cc3a41627bc8b32c8a384d01905dae81e52752e82663 -assets/assets/imgs/ic_ayuda.webp,1628702437568,e405849e22f47d98916ac0c00aa9e39f8ed8b2cf9c4dd6a133aa432ef171bb51 -assets/assets/imgs/ic_album_fotografico.webp,1628702437576,ac8aa74adb0cc6c119ab3cae80d1ed9521f620c7f28b7923f9288e8349d969ef -assets/assets/imgs/ic_calor.webp,1628702437612,75d517ebfc38607eab05fadd3b4d21678e4ec49dd55379cd6b4e87a132eea8bd -assets/assets/imgs/ic_amigos.webp,1628702437592,015f4603921b30ff43b60762c0f719660e213d8715a9ad779cc9c2f6aace60f3 -assets/assets/imgs/ic_caluroso.webp,1628702437600,75d517ebfc38607eab05fadd3b4d21678e4ec49dd55379cd6b4e87a132eea8bd -assets/assets/imgs/ic_bebida.webp,1628702437572,411ba5dd86f7df8be6e738fff9a23f7f9359a7612ada739e8d43debbb716b7be -assets/assets/imgs/higiene_personal.webp,1628702437596,ae2d1ea97537a3ea070d9baac1692e2dc213b729ab2b4d4cf5f071a035daa62a -assets/assets/imgs/ic_billetera.webp,1628702437600,03001afc59993d40e4249d7702e8718fd61a5e95665aff703c8ab4bf3eea7d1b -assets/assets/imgs/ic_cambiarropa.webp,1628702437584,44903402838dbb675b6dc344a06dde6ba7376918917302256afc606c7c89d320 -assets/assets/imgs/ic_borrar.webp,1628702437588,7be3809439557b1552dd3dac60fb0d14b704d1d34ff02f672e7155e0ee222121 -assets/assets/imgs/ic_asearme.webp,1628702437568,f8d0af3e971dd4731fe6618fb0719cfe447f388627bce0b4bfc189acc50f32b6 -assets/assets/imgs/ic_cansado.webp,1628702437612,ea75192d9cdc965ef1a8dbc8cb2edf79c01799def7e0227495a20117fa7c5279 -assets/assets/imgs/ic_cantar.webp,1628702437564,1de7beaebeed1cea426bf9c38686a25a47fcb68d2e66aba70142bcf9816a78dd -assets/assets/imgs/ic_casa.webp,1628702437612,ccb11c68f61d9a6f717128d430bea6a923d35f205cc66a8f3cad19a03ddedb4e -assets/assets/imgs/ic_cambiar.webp,1628702437600,ba61fa8ec1ee294ed0560efbe92ab5713d5b47a01d23b3e48db6b9a207d01a9f -assets/assets/imgs/ic_cepillar.webp,1628702437592,b239dc2a06f279978f3eb25e8c9fdaa7d79bd258e8a8ed2efd8b4b87b37c89f1 -assets/assets/imgs/ic_cambiar_canal.webp,1628702437612,797ffdafbbe560297c4237e105991514f3ea73d7871d22e8aa5f144adfeb444c -assets/assets/imgs/ic_canal_deportes.webp,1628702437608,1613dc55f507f0a11fa4d697ca38bceba8f0057e7c383927968e66de1135f957 -assets/assets/imgs/ic_clases.webp,1628702437580,20ab8bf91fffad45e86df709afd3dcf10fd023f59533dfde6cf5066fab2b5110 -assets/assets/imgs/ic_canal_noticiero.webp,1628702437600,b2ac01e84e52240371c214220473cf0bd242432901ce71a1f1750995abe1ada2 -assets/assets/imgs/ic_cloud_download_black_24dp.webp,1628702437568,23089a65edbdf6b434de2cc32ed0bbcced7107580ed3680af6eef746814577e2 -assets/assets/imgs/ic_colores.webp,1628702437608,3dd42563aae6db0189b9cfc05d1a482d06a474be9889a5e1595ce22e80676619 -assets/assets/imgs/ic_comedor.webp,1628702437580,346d3883676a2927454d4fcc2c235be43a1f68fa81dfd3ebef47471d9f4d49a2 -assets/assets/imgs/ic_cantidad.webp,1628702437576,36042f280d7afed18160c25bbacb993299005322eff0b7a64df58b6bde5fe3a4 -assets/assets/imgs/ic_buscar.webp,1628702437612,dcf7fcc634a3a1d547958ac3ab58e4a1a7955ccef6f2fe1ccb93e6e7e557d995 -assets/assets/imgs/ic_cena.webp,1628702437608,f58b395ef4795444f674274e5fd2188ee828b336b03e382cd67576a20b9f8b75 -assets/assets/imgs/ic_champu.webp,1628702437580,9b4f9dbc15201197cdbefbbedf3b0dd342351f851aff443a3a8f58bd66c61715 -assets/assets/imgs/equipo.webp,1628702437612,7fb3fbda51c6dcfbe53bffa0b0ccd8bad5922e45ce14ce5300b5c3278663eb89 -assets/assets/imgs/ic_corner.webp,1628702437564,0cd9b18c7da531ce28c122f9c0840bed81976c14d6b0e32186a1551d92dae8d6 -assets/assets/imgs/ic_cambiarpanal.webp,1628702437576,94e380ba6e55b0da63945fdc9643d749e5dc5e7c6c91b0c222c15cb0f2409db1 -assets/assets/imgs/ic_canal_dibujos_animados.webp,1628702437588,6982263b6df783ff9bccbf44a438166fd1a60b5ff96a3a8439a3de7032652d32 -assets/assets/imgs/ic_cuaderno.webp,1628702437572,0901ae5a1bff9688f7f66405dfb1caa8d9353d2a0bc0e20dc8872f17a39b1c19 -assets/assets/imgs/ic_como_estas.webp,1628702437584,a0b3fbd72b513a4dc43527fb4dd8ae10886f259adbf5cf60e93a39d59c8a1e84 -assets/assets/imgs/ic_cartuchera.webp,1628702437608,57151ce2a6fef4b2348ba7730b5e80a420b922f6f3da96d9650ef8670f952ccb -assets/assets/imgs/ic_comprar.webp,1628702437584,a771743b6cf0d26092f2470a4269a22b21bc3bea0645d3836841184382dbe764 -assets/assets/imgs/ic_chicos.webp,1628702437608,1ec6da670ae1ca18d33103f5c8b5c95396ef6c7501aac1c918f1c1972113ed49 -assets/assets/imgs/ic_de_nuevo.webp,1628702437608,cf939040b180bb81c903f068489e3754946f366a8541d604eab2c5574ab1af62 -assets/assets/imgs/ic_delete_white_24dp.webp,1628702437592,b00ca7a5baa6bc771db1ce8f2c03721100a8d6fb06cb044bb9c41d28a0e61357 -assets/assets/imgs/ic_cine.webp,1628702437564,aca73cbf10d5703f522cf16067aa079c69669a0bac1ade3c4d2feab4793137c0 -assets/assets/imgs/ic_control_remoto.webp,1628702437572,08a7301b6284ff09619c3075b874d86b1ff52c178790d803e9adfebe33e673d0 -assets/assets/imgs/ic_controlar_television.webp,1628702437608,95eef7320dfbc81bccf7c44c887574ff02564841234bcda89ad3d93a875c0f26 -assets/assets/imgs/ic_canales.webp,1628702437608,43984337250cf008df01c4bdb0acb04ab1d51b36f0cf2ebd08649b11540d74c0 -assets/assets/imgs/ic_domingo.webp,1628702437576,a2e0179b2578e8f9b0c2ab3e991d274101818641750602967b033ffb0d6161f1 -assets/assets/imgs/ic_done_black_24dp.webp,1628702437572,ec996c7af432362fbd2294d418fba1c3b43ec3651dbfdf4c6ae07cc4a52325b7 -assets/assets/imgs/ic_done_white_24dp.webp,1628702437608,4c0e1208b1527c47e9242263b0fbc3195e9e7670292da488aabbde2a4b326f7f -assets/assets/imgs/ic_cuarto.webp,1628702437580,e40df14a03eaefe7991c01f53a77c786e8504edfd772d2eb6c6fcb89f3b640c4 -assets/assets/imgs/ic_comida.webp,1628702437600,063ecf29a67aa0107aa4b5c881ee98f347dfc4eea8d7aebd097c4ee0dc6cde79 -assets/assets/imgs/ic_dar.webp,1628702437576,46c34f9fee1cfd108d8ee4e94e6edfd448a0647fd79e3015be8d9244a1eb750b -assets/assets/imgs/ic_computadora.webp,1628702437620,8bf605979f73464ddb20b8afae91aa39990bdb1ebc5422b6fe4920feeb2c0120 -assets/assets/imgs/ic_emocion1.webp,1628702437580,157d0a00e8ee928698540e78a9b68486aacb534fcd7e745f451aa8c44328f5e8 -assets/assets/imgs/ic_emocion2.webp,1628702437620,e7a7b72002cebb9774b4e9a4990bd7dfccf7c92f0b39e8f4fd9414ee9ed00179 -assets/assets/imgs/ic_dibujar.webp,1628702437576,1e0b307a8b7a4ff8c0c4bb403c6884106661ee5c6ced51df6f0917372cf8e84a -assets/assets/imgs/ic_enojado.webp,1628702437588,4f01bcc64749323825efc1c387e0e88a76dab34fcaf1f15b17564bf5558300af -assets/assets/imgs/ic_cosmeticos.webp,1628702437576,6da1023e7e11dcb64b6353ba23d70e0ae959cbed84624b56de95ef1291f5141b -assets/assets/imgs/ic_disculpa.webp,1628702437596,da238c1ff742d4e896e0571fb0604663a16c2f89cfb9d488fe387be92fea6628 -assets/assets/imgs/ic_escribir.webp,1628702437584,6ac84a8f2fc747e91cabcfd87e64f14e3a2426e667befa064b5a7a8282ee4b94 -assets/assets/imgs/ic_dulces.webp,1628702437588,2e33795d8c36e4730edffcc307936c34949d4d030e6c5aaaafc6a6d46f1438b8 -assets/assets/imgs/ic_emocion.webp,1628702437592,add811205249e46ef4f02cda922041887cd96cb2e173396d07b377f9d0bef663 -assets/assets/imgs/ic_esta_nevando.webp,1628702437568,5ed64bd5889b8fb637827645e239a38d2b9d48dfef17fba21f41f59d46247981 -assets/assets/imgs/ic_desayuno.webp,1628702437588,974246213caa42589542e0ad87eb40f2656266eef90ec290445d4973aa0f5920 -assets/assets/imgs/ic_dibujos_animados.webp,1628702437568,6982263b6df783ff9bccbf44a438166fd1a60b5ff96a3a8439a3de7032652d32 -assets/assets/imgs/ic_esta_nublado.webp,1628702437580,3bdfa2696678a93592247ef8b43f1efbce2df8770b8a6f8ff22debb31457c087 -assets/assets/imgs/ic_emocion_futbol.webp,1628702437608,e99d6650133a083c539f710909998db8ffb009ab8366a3b7ce935f2e279b1a90 -assets/assets/imgs/ic_esta_soleado.webp,1628702437596,1a6fc0d0ae973b9f46c4ef4d0be2681fb37038dcefabc86ec4cec25a17d6502c -assets/assets/imgs/ic_entrada.webp,1628702437580,6b37e56471cf062d63ad1355ff722b7adceac2b04ada18c55a7c886699269c5d -assets/assets/imgs/ic_estoy.webp,1628702437600,48e25ea67f6de95557dc5daf57fc5c6762d3305b963e27e79d5514efd268db4a -assets/assets/imgs/ic_estoy_masomenos.webp,1628702437592,4690e35643b1e51a3ec137a3d1f820a4eef4c5c438aff4dae80f62b017485151 -assets/assets/imgs/ic_escuchar.webp,1628702437600,88eac393ab0742ef87365f458a3c48880625527e467d3eafc6a5f8b0af7e1654 -assets/assets/imgs/ic_escuchar_musica.webp,1628702437624,e8478786053541ac3211a92166d006f9efef2111f8adbb280a5923a1cc747597 -assets/assets/imgs/ic_favoritos.webp,1628702437608,c790baaefa5c5071fe20ba38a79a11765e4986a9414aeec9ee008a2dadc77ce6 -assets/assets/imgs/ic_feliz.webp,1628702437588,157d0a00e8ee928698540e78a9b68486aacb534fcd7e745f451aa8c44328f5e8 -assets/assets/imgs/ic_fondoactionbar.webp,1628702437620,1d9dc4ee1b16e758e6a99baa226e64f555953dddd58471f7d630804d64d9f2e2 -assets/assets/imgs/ic_flauta.webp,1628702437608,3317f2d7530bc06dcad31bd8a08d3c3035c2328cc5f87370deeacf325cdd39f7 -assets/assets/imgs/ic_fondomaterial.webp,1628702437608,66326ee1f0b7bdd2f08e8f4eeb2efcc09119606e57e54671892f3caae0e5dbe1 -assets/assets/imgs/ic_estoy_bien.webp,1628702437600,9782ac901d45eec5acf9f13fb87e0df8968d5c7efa51af53ae02eb4c6a005d6e -assets/assets/imgs/ic_estoy_mal.webp,1628702437612,6c079053de570fff8ecbcbdefef423971b3eb36aa73043aa7283d08fd8dad2e9 -assets/assets/imgs/ic_fotos.webp,1628702437600,bff813d4cde60ef314f57f18e943f61ebb1fef2a54c96193237103957431d3cd -assets/assets/imgs/ic_entrenador.webp,1628702437580,ca9000b7d19e726c1ced087f0a7d9be6c94c82ab59863303972d5929746b8aeb -assets/assets/imgs/ic_frio.webp,1628702437620,4dab5ee19e075135610f774f75633398e099c4a2fce84f5e54d4e7877796c99c -assets/assets/imgs/ic_ganar.webp,1628702437608,7f1de39c58f03cc6f61710b69f0d299235c07b5952127e837fc709ff028c87aa -assets/assets/imgs/ic_escuela.webp,1628702437608,ec4bcd679a18b4d7460963bb98bae50a936222a17cdf988d962feaf3bb639ed4 -assets/assets/imgs/ic_espejo.webp,1628702437608,206d1abf879bef0cf8ee9eac3ceb78d5719ae8fe0025c3d28f19eb0a50e3cd3e -assets/assets/imgs/ic_farmacia.webp,1628702437588,44ca3c252ca243085fc134e3db114dbe3ceafd67ac9906c0267976741ebb9dd5 -assets/assets/imgs/ic_goma.webp,1628702437572,b33e42ecd49e632a3f24ee50524e3270da8347f6744717a90814c2979e08482c -assets/assets/imgs/ic_estado.webp,1628702437572,7487c23737a845908776509a8dfb2f38a1a19c31920619b7472fec6f7bb36f69 -assets/assets/imgs/ic_grande.webp,1628702437576,c15f1e5045bf4f83de54786d9f2c657050e204d7b081d51c348345e7dca0b65b -assets/assets/imgs/ic_grupos.webp,1628702437568,31b6516df8961967bc97361b0429c5b2140503cd44657a232f3c6312c66d30bb -assets/assets/imgs/ic_gris.webp,1628702437584,cd6ea76fb8947c71a847cbd0317f1df60c6f7a38a15fec16d7f1f161bdd3f4d8 -assets/assets/imgs/ic_futbolista.webp,1628702437584,07eaa08eb6f291ca4b332da2aa1d5c318f91f8ea49bbbe9808f79daa348301eb -assets/assets/imgs/ic_genial.webp,1628702437576,8c55dce31c08729f66ab44497660ae0dd78d071aee656df845c2ae39af03d3f7 -assets/assets/imgs/ic_gol.webp,1628702437620,dddb64e51b7a9869935c5b46fe45f0c0d5808146e5059e1a94ea5d78b8f9e354 -assets/assets/imgs/ic_familia.webp,1628702437612,93945fcf2fafd0a6bdf65f59775cd18bd628c298c2202210768f46aebd41a3b1 -assets/assets/imgs/ic_hambre.webp,1628702437568,0b35a82806e00bbda2dca65cffa23557b7e52c5d22c8c8774435728dbee6ceb3 -assets/assets/imgs/ic_help_outline_white_24dp.webp,1628702437620,01527425fed9b99e193a4d10570803f42a2c7d1bc8b2b2fc9c686d815164f6ab -assets/assets/imgs/ic_gracias.webp,1628702437608,2dd7c2bee04c0cd96f11a7db9591b602113559b7baef4165154a8f6878fb3b36 -assets/assets/imgs/ic_dinero.webp,1628702437568,803c5dc8f611f180884a9514cb53f8a33e2e88909baec4a92f4fca29e26734cd -assets/assets/imgs/ic_guitarra.webp,1628702437612,cd6dfb0ba17aded76661bda3179348cdf78643e1b76bbbc1df04734b7ef6c1b0 -assets/assets/imgs/ic_hablar.webp,1628702437572,651c2a1be77a3bbbcb26084573342f4b7429486fcdb096a1e7b8da4efc7d5919 -assets/assets/imgs/ic_futbol.webp,1628702437608,00395d9ebc383809f41a107147e53466fb45a919f1ac1ecfc8ee062258422b92 -assets/assets/imgs/ic_hombre.webp,1628702437568,052998213acbb73c3b8bae7b247265d7a78727cfd65121ca4db9c8971b49a604 -assets/assets/imgs/ic_haciendo.webp,1628702437568,4f40c9a3b35c21526f71bbd22dacf00d5bc1423b2e918351f1380cdaa88ebeb8 -assets/assets/imgs/ic_jabon.webp,1628702437580,a78e892c1a1b21f6d2f3f375eea216423e000e6ae6fcefad3f2b7418525e40d0 -assets/assets/imgs/ic_jueves.webp,1628702437576,b898a1fd67ba027c9468f9773643b9a25083ce8f04f82ce71758bc44f0aa67a2 -assets/assets/imgs/ic_jueguete.webp,1628702437612,94df6270458577c3983e3f8ef1ad55ceea9a4bac9ffeeab7016ee5912f77b64e -assets/assets/imgs/ic_hermano.webp,1628702437568,8243c4b386a70225a0448c5905d74c76a3b5272036cfc1d375a489faee56ef07 -assets/assets/imgs/ic_hija.webp,1628702437576,3c693817602749fe038743254500d99590499c2b05b7f19af34744a2c0e92be8 -assets/assets/imgs/ic_hijo.webp,1628702437608,efe40a3aad6cc2327b30d87c567576542dc90abee2226f71e168f2af86f6417b -assets/assets/imgs/ic_hacer_fotos.webp,1628702437620,274e8f176715ad138ac9b11470d400edd38a9090a1a8ab4f55a67a02f8b8f518 -assets/assets/imgs/ic_llueve.webp,1628702437584,b34d5afda1e96ed3c2d670fe6bdb5141efe9655e41ff59b03738784f4d9915e3 -assets/assets/imgs/ic_hola.webp,1628702437580,a3a64f4c6f2ac8e204a6cffabbb65603ff9f4af9709ea6438c32cf05594e7cf6 -assets/assets/imgs/ic_loco.webp,1628702437592,3149145f9d2b37c42227606fea696c545eb51e096f76d8b4eb49374bd041deb8 -assets/assets/imgs/ic_hacerpis.webp,1628702437580,0bbaf67013943330bbf73978688616c25ac105f76ddda2ed4b37a82b15b1ea84 -assets/assets/imgs/ic_lugarbanio.webp,1628702437600,36d1c4169c14c5a2e761257589b1804bf46d5966f974e25c86ee172c392cf739 -assets/assets/imgs/ic_lunes.webp,1628702437584,da9a4822f39207ad21e634b75caaa606ac3e4731d73a63e52209c5e56e769ef8 -assets/assets/imgs/ic_jugar.webp,1628702437564,1370575c080feb680810439b827cf54453cf16227a369a2b44057af1a9764451 -assets/assets/imgs/ic_medicamentos.webp,1628702437568,f61f27bd17de546264aa58f40f3aafaac7021e0ef69c17f6b1b4cd7664a037ec -assets/assets/imgs/ic_mal.webp,1628702437608,b8a9f8b9e106373c70a78665b97beb14dc78bb2c1ddd238c8e46a00fb0a89586 -assets/assets/imgs/ic_maquillaje.webp,1628702437568,25900fe65ad480e40e31b30e22462e1613cb8420047d28292c6673e56b83bc0b -assets/assets/imgs/ic_martes.webp,1628702437564,e2b5cd3aef0ab9a04e1118ef19a5e19df7f34eb855419a11fe5dcb5a5e06d0f3 -assets/assets/imgs/ic_llamaralguien.webp,1628702437568,f8a618b717f14dc8f88e5c7192a3f56fde3161692b61666376755c8c7c19baf5 -assets/assets/imgs/ic_lavamano.webp,1628702437580,82455c2e3f59ea1b90a4299bad1747fe7edd7fde2859e2d09bf295c039adce31 -assets/assets/imgs/ic_mas_pictogramas.webp,1628702437620,cae70dceecf3c8dc3632d52810c2a8f46f3d9c7819258b294dc8d92186bf3a4b -assets/assets/imgs/ic_mas_pictos.webp,1628702437568,f9eb88eadaba2cb9640cb1951ad2e125c57e13186e44df768aae69a13f6a6ae9 -assets/assets/imgs/ic_mediano.webp,1628702437564,a976ff32d5446f03a34483bfcd833ad6c4d9f9f4c273852f786c491767bfaae8 -assets/assets/imgs/ic_medico.webp,1628702437572,a615e35795702c008c0a920d70fc7d8118ca49c377c22b903fce08081eb13d90 -assets/assets/imgs/ic_merendar.webp,1628702437584,fbfc099bbde386dc9eeb944606eca33aa0d0ee22e4b645bf9310540d67a4da6c -assets/assets/imgs/ic_mama.webp,1628702437624,d3d4194adfe6582db0d71f84b571f7e9e93ccc8fac6cdf70e3192b491679a34a -assets/assets/imgs/ic_maracas.webp,1628702437572,bcc9bd4c24f755a5eb8cd1875f1a05ec53862b43a83425f381784ef180f7ba5a -assets/assets/imgs/ic_miercoles.webp,1628702437572,b8c665657dde243325cac3cbf7afcab0ce15c84c951a3e030a5aa6f23a004bb8 -assets/assets/imgs/ic_modifiers.webp,1628702437576,9ec434f7e3f6e87d4a7ba8870ac66b29e8c405b5cb4d99c8121091e92596300e -assets/assets/imgs/ic_more_vert_white_24dp.webp,1628702437580,e83163534055254ad3e983be298a952a0e7b9562a33ccb50370fbb601f1617ef -assets/assets/imgs/ic_instrumento.webp,1628702437600,56ee6e04f0705816faaa8e8e50126f65552f179a35611c30d614ba029c6fc9ea -assets/assets/imgs/ic_musica_id.webp,1628702437612,8823c7c13c63c28752558b1e836e81948d9db17ab7a2dafdac92a4abbe1f3456 -assets/assets/imgs/ic_medicamento.webp,1628702437580,baa8fe53944586136e928135a98110f968256a774d38e8f9e6eb2a8abefa83f6 -assets/assets/imgs/ic_lugarpropio.webp,1628702437612,14ef897a967a6371ba4e17a813d1588fa487cb5a7d824d96fcf47a83b6cd8b59 -assets/assets/imgs/ic_naranja.webp,1628702437608,8cbae0aba10a1d89b1a5b831453c9982ad84cbd550091ac68bc62aca2ee6b78c -assets/assets/imgs/ic_negro.webp,1628702437572,f8c6d9736f88ab709d01116bd97a69cab305a0ddce2764ff2fc0667ff06e77f3 -assets/assets/imgs/ic_merienda.webp,1628702437572,caad395bc24680cf2365185f3ea33a9be3d1588be1b64ac8ed2fa11276de84ad -assets/assets/imgs/ic_launcher_web.webp,1628702437588,ce66b8e09a9ab78fb13618de157a2941d0e54853c9a9b89eaccc089cf1d9ada1 -assets/assets/imgs/ic_no.webp,1628702437608,e6e29fac4733f6b8a53a701bdf61200f08f95a8ef605b0b46cbf4b40abaaff6b -assets/assets/imgs/ic_mas_canales.webp,1628702437572,799e2fef7f61f70dab9cff3c5ab381f6d1f7553d00de089b445e3027796e3c62 -assets/assets/imgs/ic_papel.webp,1628702437580,684b03aaaf8681e2456cb7a56c0ad66e8f2b89a74c6baf57e214281b827d397e -assets/assets/imgs/ic_mujer.webp,1628702437608,7407714bb0cbc6b87cb73434df4c7fa3133e005d8e8f49b32e3f2768459f146b -assets/assets/imgs/ic_patio.webp,1628702437608,ef40ac6a8c5e010d6f9389964977af332ff8304640bc45ba7f5b09650f54456a -assets/assets/imgs/ic_nervioso.webp,1628702437564,18a8d7ec87e8b1750d4f95fec1927d066cb21a3c0a4e7b6c696dc5c547c4c4dc -assets/assets/imgs/ic_maestra.webp,1628702437600,0bf6f71fe0b7c4da99bb23e9e39f7527106676a8b9edbb65c156c31c42600cf4 -assets/assets/imgs/ic_pegamento.webp,1628702437564,d3d46c7aefd0f53d8ee8e726b980e7092fd0574541e489d36aff350431ddb5dc -assets/assets/imgs/ic_nieto.webp,1628702437592,0a4ba4a943f77a7b4eeaf925e72c62d7bdc6cea112668c87a4d1a47c5be04d7e -assets/assets/imgs/ic_pelotas.webp,1628702437584,36c36c4c386ef5e473aeef0d4a491de8e4c6a6c3c93d09f04a9e0ee880c87b3c -assets/assets/imgs/ic_perder.webp,1628702437576,7ff30cf598ed8cf47fc1428ff45ad02714557518588aa0880771fb3b2ba48082 -assets/assets/imgs/ic_mi_familia.webp,1628702437608,93945fcf2fafd0a6bdf65f59775cd18bd628c298c2202210768f46aebd41a3b1 -assets/assets/imgs/ic_perro.webp,1628702437584,0daeab0fbaa31357dd3cd8843b1106fcc021387554ed32ee9e77761ad0dc5786 -assets/assets/imgs/ic_papa.webp,1628702437608,945a1fa24f86ac3f53d42ee666380787bbcf77065fd8f5277940149401d5933e -assets/assets/imgs/ic_palomitas.webp,1628702437580,0e46ddfc21ebb1aa370a84b286c8ee1a47ce8f067bf15826746b4796257f87c2 -assets/assets/imgs/ic_pincel.webp,1628702437612,bc752e07c82889201f588ceb11751c7f2a82cc344f80c24c2eddb754995343ca -assets/assets/imgs/ic_partido.webp,1628702437592,b8b0ebe04e49244cf9a3038188695bb254c50ca6b83bf1b9333944882969b5e1 -assets/assets/imgs/ic_pasear.webp,1628702437572,ccc6fe735b3981ef788f9a3288811a2e317d9dda2d84e0c7bc97a2914aa7ba75 -assets/assets/imgs/ic_pinturas_de_colores.webp,1628702437568,0c6f4ff6041cebd04712107cf60faf6a0c570515fcbc3205dd0a9b2b8e57bf89 -assets/assets/imgs/ic_pizarron.webp,1628702437600,ec268b669f75f04397db2af21f07f390d7debae495b49c8bc395b0f040ef5e7f -assets/assets/imgs/ic_peinar.webp,1628702437572,e92d541bc28b5e1e340e1e2d8a7f6931cd0f2329dd4453662b92afa03e568d21 -assets/assets/imgs/ic_queue.webp,1628702437608,97b63a3be83bba4ce92df60df9049ec9a7fbf9ecb13c36f6c37c9855b57ce66a -assets/assets/imgs/ic_perfume.webp,1628702437572,ae2b918ce48abb6f295dad02461d2c8a42bbdb39a6beaf53a7bf1095058c3aba -assets/assets/imgs/ic_presentar.webp,1628702437608,1b9cf1c52d55fcf9ded0a770fcbecedcbecfcd0b9b34a59f8d34f0c554ce2616 -assets/assets/imgs/ic_piano.webp,1628702437592,85fd4445648bb891d4b6126b602cc9b079d5e9541bd0b3081bee1abebd16cf81 -assets/assets/imgs/ic_pintar.webp,1628702437580,3bb26119936a5715d339cfd9ba5ebb3ef7dc328ed8f4dfd6b64916f71a96f5c5 -assets/assets/imgs/ic_quiero.webp,1628702437620,ec36c4cdb8ceb2e06a55160196f4e2ca43cb560b8f361c228b9df93647bff2d6 -assets/assets/imgs/ic_refresh_white_24dp.webp,1628702437588,c2b97f9cf213ed94f26995905c5125d53612223b37ba4b1a124b988ebd0b45c0 -assets/assets/imgs/ic_plastica.webp,1628702437600,539da338415fde2f46bfac0eecdb90c1e27f943fa9962bc534840c7921bd4ee5 -assets/assets/imgs/ic_portero.webp,1628702437600,9ef2fbf4d4305c5e36b356ee4bd1400fce80d970210daf85cadd4687f4f72e7e -assets/assets/imgs/ic_lapices_de_colores.webp,1628702437620,835799b399ab02c585ef882cd1d8745287cbdf4a9a474d151f95f26f8102ce5c -assets/assets/imgs/ic_precio.webp,1628702437580,11c26b109bde21bad5c0fbf97a096b69028e26140f176943dc099e50e8c1cc42 -assets/assets/imgs/ic_reset.webp,1628702437572,3510f24555933337fb2601e3e854d413387cb151ebd0c0df50995f79c6d0f20e -assets/assets/imgs/ic_digestivo.webp,1628702437580,6c8cd3d09c9a861eb9b95b96c067b20daf70c62ffc3cef5c2dd5329740d01ec8 -assets/assets/imgs/ic_personas.webp,1628702437592,1b07dd680d4861ac5378d1cc8639029055c68f3d8646c45c3475d6dc63c597a7 -assets/assets/imgs/ic_rojo.webp,1628702437584,2eabb955faf83890a1636a8776a5c1356fba8d1a98798cdb9ab3bea603af4796 -assets/assets/imgs/ic_rosa.webp,1628702437584,7a4068331def9c702bd171161d9a01667c7b9b451b4e1520c2ccecfdbb2785b8 -assets/assets/imgs/ic_sabado.webp,1628702437568,67e2ec38c40bcc7884f8db60f1b5a21049e91f9aba0f9a2b08fbfa310283c123 -assets/assets/imgs/ic_recortar.webp,1628702437588,a3cf62402358c62d79d4b38afc30415559f79a15ccebed5a674d6ab71aeba8c2 -assets/assets/imgs/ic_search.webp,1628702437612,c3449d511348527793a78d55b0dd7c1c08153839742bfddc54735d48613193fd -assets/assets/imgs/ic_si.webp,1628702437584,3e0e7cfe7f22d88e932cc4bbe40598e797193466f40944c3f5af1218a40282ee -assets/assets/imgs/ic_sort_alfabetico.webp,1628702437600,4e65f83d3358055bab0d46c21b73891e59f4b4294a3b415fa7ac5bf7c0154546 -assets/assets/imgs/ic_posicion.webp,1628702437568,58e0f9857bd926ff4d4b189fe1862e2376dad950c378861223d20e1b3a7a42f3 -assets/assets/imgs/ic_sort_decendente.webp,1628702437608,fdec7ddf30dc9f7b97e1072d7842113f898d827560a578fb16f2fc6a473db9af -assets/assets/imgs/ic_starred.webp,1628702437624,4b96e5b6ff00318b4d5e45fd28e9fbc28f35bf477c7d9e3a19fc137fee7ea534 -assets/assets/imgs/ic_responder.webp,1628702437564,b77d62be97105789fbe63e7fc1e1405581baf069222853b3ee0fbcd9710bb222 -assets/assets/imgs/ic_tamanios.webp,1628702437564,cbc04bd6380da0c4a004cbfb0bca9ef07d8182d094ccd1edcd5fc257c18b3a0d -assets/assets/imgs/ic_televisor.webp,1628702437572,9b57399640f51faa1fa86719f831053310b30beb90854482b9b468e4d9091907 -assets/assets/imgs/ic_rechazar.webp,1628702437584,226f0f5ceb9ed72c2ccb93e1d7d6197784270caf0a2e450a31b5041be3e7ec93 -assets/assets/imgs/ic_tengo.webp,1628702437584,272313247acc4e4572d4fdf95ffa43d656d234cd632fa55212c471f000dd8680 -assets/assets/imgs/ic_triste.webp,1628702437620,e7a7b72002cebb9774b4e9a4990bd7dfccf7c92f0b39e8f4fd9414ee9ed00179 -assets/assets/imgs/ic_tu.webp,1628702437576,b244b61c8f9cb886819bef0f3f8591a26b61ab211da711ae11f0d19a42d35720 -assets/assets/imgs/ic_undo_white_24dp.webp,1628702437580,534b1a328635fb3ce783a28d2da528286ebc6b947c801dfec022fdbb897878df -assets/assets/imgs/ic_ver.webp,1628702437600,70f76feb2bcebdbe6037a3e10adcc72272d98abd7f2918dcf639e4716adf4c28 -assets/assets/imgs/ic_verde.webp,1628702437572,d95a37cb7793c7447c25f48a514b9231e60f076862701415666b0287da0a2e45 -assets/assets/imgs/ic_suerte.webp,1628702437584,4ac22d433e354cf4bd2e5bb7f5b6b9fdbd3a63ea77bc936d7340406bbd2106b0 -assets/assets/imgs/ic_viernes.webp,1628702437576,86b9c6eb52e1fa2259fcd4c00f7a9ed7c98942ae8f659ef09b06b5ff09f00d42 -assets/assets/imgs/ic_violeta.webp,1628702437580,5b82f16e2d63cf93626ca3f774c3e1991b970e55635f30ca57295c854024a263 -assets/assets/imgs/ic_volume_off_white_24dp.webp,1628702437608,72b500fe7904f37b829420308241853a37f4491ff9ec7c952d2501224a8dd46f -assets/assets/imgs/ic_volume_up_white_24dp.webp,1628702437568,f5f5259569e301351a478fff839a10cfedbe856294db7159af6adee0dbcb6dcb -assets/assets/imgs/ic_salon_de_actos.webp,1628702437580,dbfd0ce2ff3ecdc1f8e135b337cb23d6577e6299633904c6a146dec99e238b02 -assets/assets/imgs/ic_tablet.webp,1628702437564,5738331a95c439dd84b7d76547678160ba0997466dfd3d29e419fcfd0ce7ef45 -assets/assets/imgs/ic_tarjeta.webp,1628702437620,3bac06f8c07b36e047877a1d8b24e0aba1319a8585693d8c63a2773449a0fca6 -assets/assets/imgs/ic_pictogramas.webp,1628702437592,71ddceea0d6fab7994ce5f2be93c8b4d2070b5142fcb597040521b67d619572f -assets/assets/imgs/ic_volumen_menos.webp,1628702437568,06d07752354cbe6272775087cf7e5cc8e755b0235f5a5dbe3547cfdda7ebeb1c -assets/assets/imgs/ic_yo.webp,1628702437572,1ec876befc321a1c71bf3684c37eb4e4c8b4851346d70ad63ebee3c2a852b3e7 -assets/assets/imgs/ic_situacion.webp,1628702437584,85673d2e910a2f72e196a845c1f05ac5c96ee74420bdc5096067704a0966a7cd -assets/assets/imgs/ico_numbers_1.webp,1628702437580,7375af8e467daad74a3b59350f5fc488fa92c7f3deb29af2768465975ee4a602 -assets/assets/imgs/ico_numbers_2.webp,1628702437584,ed865eec66875e3e5d7edeec12169f96af919cb6a715e3f5bbed6f5d4bd4f5b2 -assets/assets/imgs/ico_numbers_3.webp,1628702437576,af5072a6e5b54b4b87885d44c3e85e8652632c70a940fefb9126672dab444297 -assets/assets/imgs/ico_numbers_4.webp,1628702437580,5934021f8965a4cb96afff139d3408648f0e6ebdf0345146aac13f0c591b780b -assets/assets/imgs/ico_numbers_5.webp,1628702437564,efbea38302a21ebad6cb5381fb9bbaafd63cdd81efd167cddd59d4b0fb43c94c -assets/assets/imgs/ico_numbers_6.webp,1628702437600,725556b381b4122bfc820d1996a1db589f6d95f7bd74f177ccbde0d556eabbec -assets/assets/imgs/icono_blanco.webp,1628702437584,ed9ffa0446fadbcef9a193413bf2d4fb791d33431a56ae2e7d07233e4aa6d6a5 -assets/assets/imgs/icono_blanco1.webp,1628702437620,9e500d0a5e7b5e4f573d6a95e8cf2256789b1fbcee90ed41f17218e1ee4df9a4 -assets/assets/imgs/icono_blanco2.webp,1628702437572,c79c99e4eb31edc73c3e57af0d1798fe8c620a5a96d8880dfa7b3a52016d94e6 -assets/assets/imgs/icono_ottaa.webp,1628702437584,ffaa46bd257819777cdbb3d973bf44c57465a52c936abb81bab39fbbaadb65a5 -assets/assets/imgs/ir.webp,1628702437572,baa74489d0261f649cebdc15417f25d7749182eacc1406279cabce9c4fe1e1f4 -assets/assets/imgs/ic_ver_television.webp,1628702437624,65ec584104c49521673541c035781a1d0a5afea3795cf62a24e2e80fba3c7b4d -assets/assets/imgs/ic_ver_pelicula.webp,1628702437568,a06bce437cc57c81a660a41bf840761d88eb1b5bb6d0eb24b7cde44d4308f7d8 -assets/assets/imgs/irritado.webp,1628702437564,4f01bcc64749323825efc1c387e0e88a76dab34fcaf1f15b17564bf5558300af -assets/assets/imgs/ic_revistas.webp,1628702437620,c53c59688bf9833e7309b05db65efc9bf45439ee9c319c5be3bfe19817715ed6 -assets/assets/imgs/jamon.webp,1628702437596,706635732f71aa73802e6442ca34fd81c1c2f471ad8311f6df697063747ce2af -assets/assets/imgs/jarabe.webp,1628702437568,d5a9d26f2a7216e5b9e64532833945bdde581d01b35ee5fa892ca627e8044a74 -assets/assets/imgs/jamon_de_york.webp,1628702437624,24a7b02fcd82be331d0146dd1500e02e3b860a6d3d84f80669a33bcc5cba5522 -assets/assets/imgs/jean.webp,1628702437588,4d5fc22dace5cbfc23d7e64f5120cd31c48755ae652e326bbdcfe8fab5e97ede -assets/assets/imgs/lateral.webp,1628702437600,467d9ed2fe3b1729d834f52de22f14646d9ee5740dd81271693590b2d5b4accb -assets/assets/imgs/jirafa.webp,1628702437568,369223b063d9027b82c1a5e559bbca6289d4b1f2bf45b54518b18c57d7ca6819 -assets/assets/imgs/joven.webp,1628702437592,730fdaec3d7a91fa68917cc04c3a515428576ded9e2ca8280c6726d4eba4d989 -assets/assets/imgs/leche_con_cacao.webp,1628702437564,bcbad80191defc1bb3a97fdec43a7bc8560e3f97d450b6a3d571fb710751152a -assets/assets/imgs/jugar_con_la_tablet.webp,1628702437576,a8d543b8020f0cc763f93616dbc237ed1ff6416ef01f269c3740220cde9f631d -assets/assets/imgs/ketchup.webp,1628702437572,920b9a2d49f8e9b1d5eb75944023f4867c8f2d18d7a19790a0f2b7a3e8c0a30f -assets/assets/imgs/investigar.webp,1628702437608,d96a097765345d9b3b28069c2b08e196cdff2cabb2edb0025ea320574111d8d5 -assets/assets/imgs/libro.webp,1628702437584,cb60c5eb511e4bb7cd46bb9be746160fd5a29cd63fa1b02faddb27595a7d7fef -assets/assets/imgs/ladron.webp,1628702437576,37892e1c51d67f6517e4f04153845dbe417112062fcc3ec1a52552d71ca40c12 -assets/assets/imgs/libro_clases.webp,1628702437608,c13ff70766ee4b966267535158ba94ba281a7bcdc27968b9cdef49c01fe5bd54 -assets/assets/imgs/lanzarse_al_agua.webp,1628702437588,104f5b9ab5259a1f2dbb1f110c3d87f1411aa164af7feb666b90873606dcec4b -assets/assets/imgs/leche.webp,1628702437612,13a18a86360da187cd37e6054616c99d9eeec940f419d313a90eb46cab70f584 -assets/assets/imgs/leche_y_galletas.webp,1628702437608,cb09305fa99cf0541c5043047d0f120f5d60b4af31776637b5e8968a7725d7ef -assets/assets/imgs/licencia_accesibilidad.webp,1628702437576,517bdda8e3c1c943e33afa60025ff6a07355d2fb17d38b1cbcafd6ce83b69523 -assets/assets/imgs/juguetes.webp,1628702437608,4b3c06380518f2888449064e9186a9baf730d4ba61d34fede1c79841c7827047 -assets/assets/imgs/licencia_games.webp,1628702437608,e4412d86f9b27cf1aa378d9d5b59267903eedf37acf52f810c22d3e46a06a5ac -assets/assets/imgs/leer.webp,1628702437588,b4cc64571a8773feb8a7d3da91ee6dc559927731093364015a40b6a6aeb625ea -assets/assets/imgs/lechuga.webp,1628702437608,c22106bf22b0cc4be6bf05fb7124a7ac9e064c96810930e474779ed8bde716be -assets/assets/imgs/instrumentos.webp,1628702437580,56ee6e04f0705816faaa8e8e50126f65552f179a35611c30d614ba029c6fc9ea -assets/assets/imgs/licencia_informe.webp,1628702437600,3d5e4de5aa7e0e2d0bf7dc5ff73952cabf3eea3a157f37d93f130eee77141b33 -assets/assets/imgs/lengua.webp,1628702437608,d26acbc97b02754a37119a591eb546279488f772e06f76d46d64572f4f6ef2ec -assets/assets/imgs/licencia_ubicacion.webp,1628702437580,d531f0c800280b59a7c2d94db273fed1dcdcdfe211f527e59b84a0e3b8a92c98 -assets/assets/imgs/libro_comedor.webp,1628702437564,4cf51b77176be882d5045ae139767975f839aa46541603c02a85e0d9e62eb60b -assets/assets/imgs/libro_almacen.webp,1628702437624,6c110f374fc84086765e5f74078e905f8a0b0eb02f7af2c93f7b7b273e85a3cd -assets/assets/imgs/libro_carnicero.webp,1628702437620,0ccfe315c5edad1638d243b7473ddac353687f1dfa2e5df0a2598e1b36f99e54 -assets/assets/imgs/lila.webp,1628702437592,14e1df83ca36112aff216e3951bec239f63ccab6c6cc4138d370631712577f22 -assets/assets/imgs/limpio.webp,1628702437572,9d842e83d93554eca783693abbd051aa62c0cf604aa518925a1fdcdc81556a97 -assets/assets/imgs/lata_de_sardinas.webp,1628702437612,06658ee1228c9f7a3875d76494cb60d16c4b75029309f6ef59328b74fb7c0a48 -assets/assets/imgs/locked.webp,1628702437568,0ceec9a5e876c6e879f7fd6c9a8695c75f8945b413d0f78b9e074b604e6c4c5c -assets/assets/imgs/logo_ottaa_dev.webp,1628702437564,ed9ffa0446fadbcef9a193413bf2d4fb791d33431a56ae2e7d07233e4aa6d6a5 -assets/assets/imgs/leon.webp,1628702437608,0b04dc69875c51f8c3869645db2f8c35901e48b77b051fbb42cc3dc657dd776b -assets/assets/imgs/libro_ocio_1.webp,1628702437592,d8ed0bde3ffc1adb3da0c5998d98911d322c4e148023ddf598aa5c1f60ea478c -assets/assets/imgs/lindo.webp,1628702437572,af3c63d566d27cac379a0ffd44a672c4d6f78c4d22fc2827d266ad25da6128c9 -assets/assets/imgs/libro_verduleria.webp,1628702437584,7a5cb39558eea851c4290d54de4f2215ecc09925a0d08024bf276c0e778fbb6f -assets/assets/imgs/libro_ocio_2.webp,1628702437600,bef5796571bed7efee0a5370ce3d01c04c8c8c1917501e9851c0271f5aaca7e1 -assets/assets/imgs/libro_viaje.webp,1628702437588,c66b69b69cccfbbdfa4b93e07d58c5e664cc839086eadc9197b3869f3d0f8438 -assets/assets/imgs/logo_ottaa.webp,1628702437584,afc4ccf4dfc00321b7ec0cd09948a24505a39a67ca04514a27e1d47108a415c1 -assets/assets/imgs/malo.webp,1628702437584,a58caeac76f1e618bb8fcfa715778ae30facb3c48278e939839bb44dbfedd73c -assets/assets/imgs/lugares.webp,1628702437612,70786b0ee4b65809d0933e54cc459df3ff1cfa0e9fea2b105492f70d82d50f38 -assets/assets/imgs/maniana.webp,1628702437612,42e7310515b740fbd8e16759e91019e2c4a36afd833daaae7d5bb92dd7bc0d53 -assets/assets/imgs/limpiar.webp,1628702437576,47f87f9e5bbb97eb6be83874e2f5d02178ce0cf76689be711408576a09abc305 -assets/assets/imgs/manzana.webp,1628702437568,51423f349dab34470d531ac4b4a0f76fbcb6abe6e19f8fd51a6a8cad05214146 -assets/assets/imgs/libro_tiendas.webp,1628702437572,a2d9ab4687607a7c336c88b2513cf641c68132fa315a8d27c90c06bc595d9768 -assets/assets/imgs/maestro.webp,1628702437600,12d87bfe80f71a98e15e4479d9b8d66f91af3b8974b2f766921c54431b102b71 -assets/assets/imgs/me_molesta_el_ruido.webp,1628702437584,d9d1527a6fe653990eb97fcf55051489316229e4bbd5319502f4aeb52addd22c -assets/assets/imgs/media.webp,1628702437624,7a572946c9e5a7fa3d373af219d0782c9cc3edd20a8f51fdab748342a1fd24b8 -assets/assets/imgs/libro_salud.webp,1628702437592,9280be49576db931d7de17fd52710802c90d2736e05c99ec19d91248da0ea80b -assets/assets/imgs/melocoton.webp,1628702437576,d1a205d41da5f181554a9ebdc65f0b9419aaab326f115dd73b7b73168ecb8ba0 -assets/assets/imgs/maltrato_fisico.webp,1628702437600,66af5970ae16e3b2ee5b6fb2200b9daadc8ee969fd81b7bef79c2bf950e76c38 -assets/assets/imgs/mano.webp,1628702437572,76eefe740dbda48d4b16c73a24495b01f2d1d8629e38fa0526a58084034549ab -assets/assets/imgs/mesa.webp,1628702437576,a892ca03fef115536d768f87b7ea74ae2ff99e2fb7f03a52e347d1d2b5e1ca2d -assets/assets/imgs/maltrato_verbal.webp,1628702437584,b1b97334e9b213f1b525da4cfa17345fd75305bdf3804a454920e54658dc9aa1 -assets/assets/imgs/jardin.webp,1628702437572,ec8eaecaa34aa619af57958994c9616e135d89b76698d4fdf1ec623efc865516 -assets/assets/imgs/manteca.webp,1628702437588,f0787ae08e5b5db0d6750f0e65717ca5d116c988b13a6efb1a3c6e8dc7aada44 -assets/assets/imgs/lata_de_atun.webp,1628702437612,5d1acaf5f01f1c6c243ab020f4c4ac7e3ef3dd80dc82d43da31c83ae5f50c2d1 -assets/assets/imgs/mismo.webp,1628702437612,4bbe610c9a23ed10ff28653c054e2576dcca6e3408a70fdb3ed3edfafa19a1a2 -assets/assets/imgs/moco.webp,1628702437600,06c2f8aa41624f7507addda8a5fb8723c0d378b9ce9c8ea6fd8e0471aa68bb2c -assets/assets/imgs/mayonesa.webp,1628702437588,1ad3781858c412c1758750b56914b90babd7f981a5cb90caa7eabd16945d56e9 -assets/assets/imgs/molesto.webp,1628702437576,d9d1527a6fe653990eb97fcf55051489316229e4bbd5319502f4aeb52addd22c -assets/assets/imgs/mono.webp,1628702437608,caaac3bb33d711e1b82abb3cb01056adb6757eb8ce8cbc71d2f08f8dc0a1c4e7 -assets/assets/imgs/maiz.webp,1628702437600,57f7345cacb156c2d18d3b367efce25028ba4960e4e34176e3e66de5855a33a5 -assets/assets/imgs/muneco.webp,1628702437568,4a6a4ab01cc7681bc6fbd0e4a07cb9242f7185cc3aab7f65bafcc9641283e4ae -assets/assets/imgs/muslo_de_pollo.webp,1628702437608,30a9f8787e09ac97a17aa69453116f5267eabf1b9f240cebbe6dc72f8418f722 -assets/assets/imgs/munieca.webp,1628702437584,8619acbafbc7cd4650b0877487f2b720e06135503eb60439eb8c0fcc3bdea8d1 -assets/assets/imgs/nalgas.webp,1628702437600,d2d96438387299cb2a8de5918c90b32f0cb259631d42dd882c165b37bb2532c3 -assets/assets/imgs/naranja.webp,1628702437592,819c4263148cae19a236d4731d0f1bc83b537b050cadf233cb2014541e7cd775 -assets/assets/imgs/nariz.webp,1628702437588,62ccf9bdb75a07b5b68ac01745eede0ae5af3a8b546d6449d1a18e54ca380804 -assets/assets/imgs/natacion.webp,1628702437584,640e0705e1317bf22a8f2f1c93b68c300ef42c5cf12071723955cf33ff94975a -assets/assets/imgs/mariposa.webp,1628702437600,c94b782add4994c8a73049c03a2c2a6d3562c24e3b2b67ae2f3f8916ebd710be -assets/assets/imgs/metro.webp,1628702437608,a1bb293f2b4a1cf15e9c3939a43ece5c7a47e2a92bdf671208358c7d207e67a2 -assets/assets/imgs/mirar.webp,1628702437572,e5b301331df5c1eb68fa6cc00cc95f388edf12d8eda4aead767a7726e19036cc -assets/assets/imgs/mucha.webp,1628702437592,b0877b41afc9229b205d51e6d1321d7e2392bc74e12f4630396928b8a66204b6 -assets/assets/imgs/mucho.webp,1628702437584,b0877b41afc9229b205d51e6d1321d7e2392bc74e12f4630396928b8a66204b6 -assets/assets/imgs/mujer.webp,1628702437596,7407714bb0cbc6b87cb73434df4c7fa3133e005d8e8f49b32e3f2768459f146b -assets/assets/imgs/nebulizador.webp,1628702437612,56fdcd73348fd7d00da4fb665ee1bfb86ef0759a6ae4a59bb593a46b1393904b -assets/assets/imgs/nadie.webp,1628702437592,086184f1aa1f9c2b26445d3d84a0ea204d45f25029a3d83da89417dc423ed07b -assets/assets/imgs/ic_remedio4.webp,1628702437572,6c8cd3d09c9a861eb9b95b96c067b20daf70c62ffc3cef5c2dd5329740d01ec8 -assets/assets/imgs/ni.webp,1628702437568,84256dcf4359dcfcd4036ec18eea59351db1a31f8e61b2c8db897f0a12cbf597 -assets/assets/imgs/mercado.webp,1628702437580,cbcc1cdd139f8327d7e2c0cf9177423bbe8a5fdbf7e9261c8d140b4bddcc7a9e -assets/assets/imgs/ninguno.webp,1628702437612,ec1549075c1809ad517f6a96e7e58a7e5567f1206d1106b9b6c924dda343226e -assets/assets/imgs/mas_picto.webp,1628702437588,a331c4409ba9c9fa0f00c69b7632c6479ce2bc345e1b1d63e1448ba468d6c675 -assets/assets/imgs/ninja.webp,1628702437584,0709a8c5fdca7466f1687315c58e643d41c317716f48d3e9f578b51a78ee280a -assets/assets/imgs/nervioso.webp,1628702437612,18a8d7ec87e8b1750d4f95fec1927d066cb21a3c0a4e7b6c696dc5c547c4c4dc -assets/assets/imgs/nevera.webp,1628702437588,fff51a66e91808020e2aeef21fb0f8cbd545d290cc2b464365cfec9268e57953 -assets/assets/imgs/nina.webp,1628702437600,3b299324561a4b4d7d6deaa72ed904cb7ac2c508eb51d0f29db76a9ecb03690e -assets/assets/imgs/numeros.webp,1628702437576,564b36284fa5b7876370b8855920d9ea9412ec7a44a412cd0b266d266d505d74 -assets/assets/imgs/o.webp,1628702437588,87d4ed3976bf3bbd6cff915a9924e5964a706d09e6f59c086834b6d5cf6d5fe1 -assets/assets/imgs/ningunos.webp,1628702437580,3085ea8fff0ef4cd6ba8fa8599f21a1933d8b8f1740f5f3ea85ae26f8e7981b2 -assets/assets/imgs/ocre.webp,1628702437608,083263cf569601f865f652fe0caa6027cef1f8e202a538b37e618fad5964b539 -assets/assets/imgs/ombligo.webp,1628702437576,0a87b2906eddba8a347aa91a55de65019ecd922a919ad960bcac18c2ed668c8b -assets/assets/imgs/nino.webp,1628702437576,80c96bae996cfa711d541ee564c5bea6580f020fc1087b122b573dfb1b0f3436 -assets/assets/imgs/ordenador.webp,1628702437584,171e58bf4f8d0d59df96ac9bab4d6f2ee50a3c48d54fdbb45ff13cc7a606041d -assets/assets/imgs/oso.webp,1628702437620,10c9ae1fc3163956e17a6f756df0e7d713194c18ba16b36d106e85c33328ec45 -assets/assets/imgs/nadar.webp,1628702437580,6763bcc82a9f58037b4ca3b0f1e0b808aa12faf4c5e61034f62dff88d3f9d9cb -assets/assets/imgs/otonio.webp,1628702437572,b34453294dda2a4a2b9e6c1eecd54a94274787961552d4bbc83c8effe7d92aea -assets/assets/imgs/oveja.webp,1628702437580,b7df81e466b9a10607ea3b6e2f19fed509b31f2a097e78d01d6ee25c2344e873 -assets/assets/imgs/nublado.webp,1628702437588,46e82873f40f075f1c2f0d13cad0bd38c7152e1f475c01ad705c2f19b32afb57 -assets/assets/imgs/nueve.webp,1628702437576,f25d3fa4fd33545228ee93388f28f051bf028032eadd31cc9e9d4d144ac8acbb -assets/assets/imgs/pajarito.webp,1628702437576,16250fca307b6b3758b97c50e537db2ed78daf977da702dd981c97e1db60fd0d -assets/assets/imgs/pan_blanco.webp,1628702437612,d3a17f4bfa899be9f2defd328265f0d85b26912a615c49ef0e07a06de156ef00 -assets/assets/imgs/ocho.webp,1628702437608,48c4f417d934c9b92e05abada9d01f159f0408b2a722b2b7b525d228d1c7231e -assets/assets/imgs/para.webp,1628702437608,189e33f136733dc292e439e6bb9bf818e7798aeb9b9d349ff0aea4e3948320b9 -assets/assets/imgs/ojos.webp,1628702437580,d8ea6b13044e6b648c15c97155a0873ce9bea01d2285d79461f81e5d343bc800 -assets/assets/imgs/oreja.webp,1628702437568,18c7d7e9dd9e338d7f6061e9788c2d7a5c3434a562a3bc33a21cde30aea31928 -assets/assets/imgs/no_gustar.webp,1628702437588,bfbedcaaf73f813904241953fedd7c283d8e5dc9a93ca9fac149f7a3e7d7f1a4 -assets/assets/imgs/paloma.webp,1628702437580,b466d357f4f97f9244cb35a479ebaf480f0822e0121310a5e51ddb98c4aa176b -assets/assets/imgs/pajaro.webp,1628702437620,62ac6333c90975198c85ec27173e7be4427c88af26f792e2d60836be37810c8d -assets/assets/imgs/pelota.webp,1628702437600,8d212e69cacfb1856c808a5774d49dc1699bb775b8e9a1668e52df6f4f976658 -assets/assets/imgs/pelota_de_futbol.webp,1628702437624,501c8df02cbff679b51c5861f8a0145370c10af21fca2c35be055d9ebc12a650 -assets/assets/imgs/pera.webp,1628702437584,6cc07d2d7ec00550e88143cdb9cdeff23c40a39533a4bacbb51b15375f4f64cd -assets/assets/imgs/pantalon.webp,1628702437576,bc58ec160f2011921cfb7f733df75571a2323df2d4e48b33a6e8eb5e2adf3fcc -assets/assets/imgs/pantalones_cortos.webp,1628702437612,740e451dd839af80508a3b87cc4f9c5dbc730f5e6cbe508b1deaff20c1a6e65a -assets/assets/imgs/perro.webp,1628702437620,39e94bcf6bd81843c35efc4538ab759ba82990e15a6ea99e9d680297c20f39ec -assets/assets/imgs/partes_del_cuerpo.webp,1628702437584,d91ea273df45819c129c26c0f7c41ad8142c377f410edb971e277406cb629b9f -assets/assets/imgs/pasear.webp,1628702437608,539146bcad26484b7b9492e25fb81c22b94cf44084d588179ac01d7aece78640 -assets/assets/imgs/patalear.webp,1628702437588,cf427a757ace9ce87d1a00522eef3e5f542b0f3af53fed4d033e3c07d1f40992 -assets/assets/imgs/picto_grupo.webp,1628702437608,07c37c2e37791fca41961d85e24e006144861fb9e3634d13a8976b4706a6558e -assets/assets/imgs/pie.webp,1628702437576,b2955552a205139df4e91bc93fd337a0b8f00123e370048a950ca36d56f446fc -assets/assets/imgs/pecho.webp,1628702437584,8a374adc3cf9acdcbce7a871f4a6fdb3b49b68a42063409b01b08b2390ba22e9 -assets/assets/imgs/pan_negro.webp,1628702437580,625e0fdcc0e4eee6ebe97efbacdfadc07e3a38816d74313518d1c43228e262cd -assets/assets/imgs/paseo.webp,1628702437568,bef2db16ac98ecb2fab0b344ea24486ba1980ad2a87145ba18c61cb7d95feb52 -assets/assets/imgs/organos.webp,1628702437568,7078b054182a856c9a66cbb059d95e9319b0a3b35827f57f7162fea005270c6d -assets/assets/imgs/pescadilla.webp,1628702437580,8c7abae2c54b3f22eed3549ebd9077a05763db668f2fa5fd433148f693a30efe -assets/assets/imgs/piano.webp,1628702437584,85fd4445648bb891d4b6126b602cc9b079d5e9541bd0b3081bee1abebd16cf81 -assets/assets/imgs/pastillas.webp,1628702437600,31a9500b9a21f12b1def7c8854fb262cd3dd886500400a9d76d3dc75fefdd2e8 -assets/assets/imgs/plateado.webp,1628702437592,69ae793e829a400605204eaf550920c9a67cb2d3e501ad2ab11bcae98c73d773 -assets/assets/imgs/pato.webp,1628702437584,354f8d71ea1b7b730aa3f973f16eaf2c7a9f540cdacc185743287063e6e51649 -assets/assets/imgs/peces.webp,1628702437580,6d2621f979a2a2bb7a247e38a9e165a508f1e29b9126182f6668fb88a27c3172 -assets/assets/imgs/plugandplay.webp,1628702437608,3107b55d518fed6ed8240c3f6bf587465593aff9022addee1825ef33d376612d -assets/assets/imgs/pimiento_rojo.webp,1628702437584,8fe3ceac4b4d933bbb3e13d345bc10a448b359302d2b6aad4116b3852340f22d -assets/assets/imgs/plurales.webp,1628702437612,f61ebaafcee7a1711379f6347826efa932915d9f5e4a1ad1886a92d8b58b9185 -assets/assets/imgs/poco.webp,1628702437568,f305d8761a247062d58494da426fb9651facbfebec49f904dfdd803140cb8797 -assets/assets/imgs/pelicula.webp,1628702437568,a06bce437cc57c81a660a41bf840761d88eb1b5bb6d0eb24b7cde44d4308f7d8 -assets/assets/imgs/pocos.webp,1628702437608,a8c91b8651c3e464041a88b6c2b32914dfa3b4365f81ae854ebf8c2d7c7b7bfe -assets/assets/imgs/pimiento_verde.webp,1628702437568,f7de856155719d8b513f0b57a8c71475e4f079b8cf227b9f8b83c716e98f270b -assets/assets/imgs/polleria.webp,1628702437620,944b25cdb8eb1676e071bfe5318d751c26bb48ceb8c2831b7dfc9f5b164fbaae -assets/assets/imgs/poner.webp,1628702437576,eab4734b71be48140fe0dbd631bd32c2edf00e13d7d6fdd91ef4918da7f399f7 -assets/assets/imgs/por.webp,1628702437580,a7e14e0a1fdf58a97bd211b20a57399c0462f635ec0e115005c16683cafe7726 -assets/assets/imgs/pincho.webp,1628702437584,a64b32ea39da3d4b3991aa98f9c66aa81499e13a57c8484bbf5083c4c5fa3d73 -assets/assets/imgs/predictor.webp,1628702437596,22914dc9593d20e5a3b356903bcc06262fece676ed9e8cca98c926ed46402c2e -assets/assets/imgs/plato.webp,1628702437608,633b456170c2719115881cdb7cc4581b2db15f8b1af333609bb5f0501d9a4364 -assets/assets/imgs/peinada.webp,1628702437600,2f2ba861f37f46ca97fb01ee5569472abb37cfbb1704c56ce112587d95cda0f2 -assets/assets/imgs/plaza.webp,1628702437572,1c19a4100a2c62262875b5ee39d89d0b0f31f1426e3fcc8261c6cdc695b1b12e -assets/assets/imgs/preposiciones.webp,1628702437620,e496c44b7ec5c44587f7d302c8dd73b4554f3339cf4e41ad9df2d308ba30131b -assets/assets/imgs/policia.webp,1628702437572,aa8d181f61d75ad63d27c015a0032fb147951178f1482ec4e8859d19966f9993 -assets/assets/imgs/primavera.webp,1628702437612,106e8ba0e3d576c1a45e7c5c3b36ff3e980494714b969684d96f7bdadcdbf273 -assets/assets/imgs/personas.webp,1628702437588,077e1b18a11bef01afd4c11f7ed93ac30a4d3bd6562373d69b5c61c5da4e0bb3 -assets/assets/imgs/por_favor.webp,1628702437620,083c0df67244660b69c4ce99dfce31e4eef5d35bd47272a81d565c007dcce13f -assets/assets/imgs/pizzeria.webp,1628702437624,642d7b8722860d9039711edcd46cd5ac795011943ca531fdd7daf3f64e1ffd83 -assets/assets/imgs/puzzle.webp,1628702437592,0b0ae1b5afb53f11a8bcfaee4cefc36323320bc591bd5fd3bdbe7cdbd6d17df5 -assets/assets/imgs/que.webp,1628702437608,e9c50c6207dd59feba892a61a75edf02296d70728f493ff3fee2354988db799c -assets/assets/imgs/quien.webp,1628702437588,3bcbc70f3a0139a323ecd78cda186c5f1cb7ad3c91a1aaea8bc9b7ea0f905a8f -assets/assets/imgs/pomelo.webp,1628702437608,ec1970e4da89886ec54b17c5c01962b785556bfa37a12ae4862cdc1416a5f4c1 -assets/assets/imgs/quien_es.webp,1628702437580,b0bac262710c55e525709c1467c101ee10a59570175488272458aa1b5de9a449 -assets/assets/imgs/princesa.webp,1628702437612,69ca94a0579ce4e135ba91cda5b0e4cc77c1ffaa4ad4de2dc3f175effd9d4e65 -assets/assets/imgs/postre.webp,1628702437592,c965893f2f73e77e56a6d93ef88891223bdacc95e41e4fc7f47f390606612cc8 -assets/assets/imgs/pintar.webp,1628702437608,1213453fd5bd276edbfc136aa9deeeb01874cfee603ba9f0bcc78edc076034fd -assets/assets/imgs/pronombres.webp,1628702437624,3afc1510ca21d1f6002870cff978ffdd3e0fefac7fce75e7aa88aec037838723 -assets/assets/imgs/pure.webp,1628702437588,568a78321f1aa5939928957ef3ad3aa68102a0370d502c59917bc850d8684894 -assets/assets/imgs/preocupada.webp,1628702437620,2031b9a6d8aa9aa2d50c67051ef4b790408eaaf5f2da3eeb434461e1df2b17e9 -assets/assets/imgs/que_pregunta.webp,1628702437592,8b16c30e92e7b5de99a55f4ca36d333a5d3dac2ef5c111f86548ca15cfa0c63e -assets/assets/imgs/que_hora_es.webp,1628702437584,82eaee10207f66a716b6bdf378ebfa457fa526d5eaac887433664069359b3759 -assets/assets/imgs/queso.webp,1628702437572,0a30d9b28822b85de2ae10f4f5608199f34069bc12d8764f8e5f0769fb6c32c6 -assets/assets/imgs/quienes.webp,1628702437564,d682582065e79d4c6eea90b9982feeed8d44fb80f08ca5a9d275d6d291a83767 -assets/assets/imgs/programa_de_cocina.webp,1628702437576,f249a5460f22ae2f938552a44aee3d11cdb23763dd6edd5b6bfa3eb09b080592 -assets/assets/imgs/pulmones.webp,1628702437592,0fff310126c4edb5b1bd56d1ce5214c4fd8c00737c41355a31a61e8ecb62c83d -assets/assets/imgs/preparado.webp,1628702437608,0379e9b3369359a93727d1025f2ab68181bf22da96136bac2b2a7801c362a621 -assets/assets/imgs/rinoceronte.webp,1628702437568,fae343578e49bf563604d7e96479e9e73bf540eba45d6e30339e0acc0247882b -assets/assets/imgs/rodilla.webp,1628702437592,a3b3da7167d7179718e8ea5e1cad85cf5301bd598087192e7738b871773fbc54 -assets/assets/imgs/rata.webp,1628702437588,f30e10cdf4466f8343724ebeaa21cda24bdfae70bb21be512b99159b2e2bed9e -assets/assets/imgs/rechazar.webp,1628702437576,af08816d6fabc3ef64f04c7931769983f070af2b57aa92cff43f4ab8e15453d2 -assets/assets/imgs/reina.webp,1628702437604,8a6fcc2bb2139c73a80b72751e865076930f005ab2aad871c401aaf4c51bfc82 -assets/assets/imgs/reir.webp,1628702437580,0178ad86ffddfd08fb8d0263724509ec7f3a483ed16134ca0e484333a0dc37b5 -assets/assets/imgs/sacar.webp,1628702437600,3c72aa64bb1f68cc36c1b44631c95fa663772fe216dfaef9d0211795884531b7 -assets/assets/imgs/sal.webp,1628702437572,a436289b91b15c9afd63d8e28f7873831d1c634c30086d6aa7bea966042565fc -assets/assets/imgs/respirar_bajo_el_agua.webp,1628702437580,321608f90e97b1d78020de466d3e7859a64672d9cbd827853e137a2374d5567a -assets/assets/imgs/salchichas.webp,1628702437580,2f26d5c06f020df4215f9b1c0df0ce9b37db5f5640aeb64f973517f4f7f30496 -assets/assets/imgs/prueba1.webp,1628702437580,a1bb6e2a10e2f4900c5c815eb4a22d05b70ba8e25d5cb76498a550b9ac42d4a5 -assets/assets/imgs/restaurante.webp,1628702437580,be2dddfa97ce275fe27c060980559caca0a716c0d380e217b2dfb51278ca1d50 -assets/assets/imgs/responsable.webp,1628702437608,5ff948da8fa3bca84ef4e5b6bd9325352dc33f51e866cac82d41ff92d858d5dd -assets/assets/imgs/rey.webp,1628702437608,d128a542c39b9e4589fd2b37770f236b9513fe723991f97a77516d4aa1259907 -assets/assets/imgs/robusto.webp,1628702437584,e528fe981c923fc26409b550794ce650a14a1be0d1274e0d891ec040a4bf5ffb -assets/assets/imgs/rollizo.webp,1628702437576,b33019eccd025f2e398216eef339290b36ea4fb29415407f9502b43d743711b6 -assets/assets/imgs/ropa.webp,1628702437588,89d18cb0b9936424334643136375a535505c67b788957b871a928d7b5f29e6bd -assets/assets/imgs/repetir.webp,1628702437580,27f58a2349e26ecb582b935432b682b8542b860787399a6a07500a6640cbd18c -assets/assets/imgs/salado.webp,1628702437624,85328ced15c754c032dccf32d84d2208816e52bd26dcbf91f290c44227c6ed1e -assets/assets/imgs/reptiles.webp,1628702437568,37af4eaefc7c2cce479a06bfac17b146b04ac63d199c44c61b086e06011a8478 -assets/assets/imgs/sed.webp,1628702437608,f9ff8ca58b93c3247ebbaa99d7fc9b5b6f4ccafd3c9cfda5e6099788cc158bbd -assets/assets/imgs/salir.webp,1628702437580,3340c6e56f688b981ce355223ba9c727cfdd5ef757e7e87ea7aa7e8e2d045862 -assets/assets/imgs/radio_cd.webp,1628702437592,2d23df2edd5e5ae3d6005466e330d6051c6c9578c38d87c8b0741654c41c99be -assets/assets/imgs/segun.webp,1628702437592,60b524d8266b8cedd84be8d981e021a163a4c13ba6d3986ffff6dfa15c05e52f -assets/assets/imgs/saltamontes.webp,1628702437612,e1e63b261d8beda8125f6f4bfd160f1594b407addec1063b79b186732af56e85 -assets/assets/imgs/sangre.webp,1628702437612,04a204e736bbb284697dd7691ede37a14c789ecd168d3534143841ab9426110d -assets/assets/imgs/rana.webp,1628702437612,955dd7318375f8aaab0c4ee8dc97eef7cb3662dcefb56c05ab7cf7028d4c7999 -assets/assets/imgs/semaforo.webp,1628702437572,5d6b7a89aa66129054729735f84ac9e5e0a4556fd734e82dc0bdb0a17beb2690 -assets/assets/imgs/sandwich.webp,1628702437608,bb9b686ffa9a13bd09f56b3cc12d235177588858d1651888e4755338013c5441 -assets/assets/imgs/rehabilitacion.webp,1628702437580,af4b8d7bab40cfc0f7bfe7f4dd064ab33f8a7e3667e7b9230a1a1463189bdaaa -assets/assets/imgs/sentar.webp,1628702437572,2d4a2790e1e2f1f7449bf941eb4d9eae51a80c6e91293d3f939ef0604e9d4418 -assets/assets/imgs/sentimientos.webp,1628702437620,02b0c89e516685a1b61e062be3642acac446f37fd89e4678ba36fe86208f092b -assets/assets/imgs/serie.webp,1628702437568,1b0b4e7bc15adb7c6cacdebc0244534f478fe21a0e4be0aa71b4ecdec444aac2 -assets/assets/imgs/servilleta.webp,1628702437592,47cd56b4dae0b9be3ab7b3653610577209f6d5c04281db3576176780b2f461fb -assets/assets/imgs/share_audio.webp,1628702437576,f8f7400be3b30456afe8aeebb460ab1487fe59106986bb7a608b45c54f5b9813 -assets/assets/imgs/share_image.webp,1628702437608,1833216cb3cd9abc596cb331a7cc884e3ad78b25a320c3fbdbb30cfcba5cc780 -assets/assets/imgs/secar.webp,1628702437568,17ebebc9523af171544024bdf9a9eab2745aa93da111a5a0110bd45e12f8c901 -assets/assets/imgs/sin.webp,1628702437568,cf0c2101983187f76c232362d9533a8bc5db84ef64b1f5f0ce811094a7a3b255 -assets/assets/imgs/saliva.webp,1628702437576,f05f52ac3c8aad1b77274b7802db3215c298947780c64d0f2918f74c82e0d577 -assets/assets/imgs/sobacos.webp,1628702437572,b5953063a70e5d3ef060f0d7447623d7234705a6c4a7a68023406b527f1ee66c -assets/assets/imgs/seis.webp,1628702437584,73822866705cf51aa88e35c7c05efa9a468ed6ca29d4320921f206c2b19da840 -assets/assets/imgs/rompecabezas.webp,1628702437572,e18de4e7239838b8dfbfe87eaa3f867112fe4b6001e1792e08b68b7c48060490 -assets/assets/imgs/sociales.webp,1628702437564,4a3fbb1c545eb6965303906e0e93ba7afaab10f0b9c5e925eda20f128a8c6112 -assets/assets/imgs/sofa.webp,1628702437568,ee664c1ae0ea88210df9affd37d1f58182ab504766dd4efa845614209ffbc38f -assets/assets/imgs/siete.webp,1628702437608,574a99273bf26e6e6ea12a8d0112a9373b2e779e3189fcc8a2c5146b74fb9dad -assets/assets/imgs/soleado.webp,1628702437572,d7e7b965201a131954f8da89577f98a6008690aa8497c555e23be9dab530402e -assets/assets/imgs/tag_horario_white.webp,1628702437572,de606783749d84c20bedaa01de55c8357e79b03d4016e36679ab8a79ad6aecdd -assets/assets/imgs/sano.webp,1628702437580,ed2a2678a19862bd1bf9c46f7d22e3650b89b03d3f04effacf422301d9e65f99 -assets/assets/imgs/sopa.webp,1628702437576,7b59cf7eaf0b39f5e27365dba8ef40cb50e400b4f6817148cac66903a92814f2 -assets/assets/imgs/rica.webp,1628702437592,786b29b568988547801caad3dd0a6e8eb5f681032c34ecff12925808667ff7a6 -assets/assets/imgs/sosten.webp,1628702437584,f1499e37fb2fddda686161ea7aecb46eea4457f9ab0548b382f8046dd2625028 -assets/assets/imgs/soplar_las_velas.webp,1628702437568,b556dd8845028baaa645d816a242da36bb6232487f4ff2d5d50ebff8d0ef3f04 -assets/assets/imgs/sorpresa.webp,1628702437620,7b4b50a577e6eafe60ed1d7f5dca28eb763ea117a830eaa734da99de07b39771 -assets/assets/imgs/spiderman.webp,1628702437608,a6f57ec2660be9899cc828ebf7ea88a339fd07d2a534527911aa2a0975d37ff8 -assets/assets/imgs/sucio.webp,1628702437572,d932e1714e542e124cb9f8ef7876d050e8ab92724fb1eac4b116896aac7e3dad -assets/assets/imgs/tenedor.webp,1628702437576,6c50d6e38137c9968cd7ec9c00d9bb49108c45ab6c6938acb7658bdd3ff2cc42 -assets/assets/imgs/sweater.webp,1628702437592,2eb10a176bc78ac28035f0b710ba92f48eabbf2d00429cfa96b6b9033246dad2 -assets/assets/imgs/suyos.webp,1628702437608,7baa9af3ad7033cf35adc3f16d5fbc82191dca32918ae205280065f60954d3ca -assets/assets/imgs/tetas.webp,1628702437592,17706e07ddf581849f927164f15699d43b456df2fd4fe5b34e2e2654c49236ca -assets/assets/imgs/sonarse_los_mocos.webp,1628702437580,a4507ef4946009513d0433e4609545536e93dc046c82565d4a7fdfb25e018a62 -assets/assets/imgs/tiempos.webp,1628702437588,dedaef87582ce713f06c54bd4fc58930519ac6764998a03ee2a5c389c2deac30 -assets/assets/imgs/taxi.webp,1628702437584,5908586cf9e8a440da7d059c68d5883815aec985ab011a3f9da041926a487af6 -assets/assets/imgs/tobillo.webp,1628702437620,eabdbe928607c9b35189ba99b4ec9ab6099a40709623ac5662c04020b2f36603 -assets/assets/imgs/tocar.webp,1628702437592,4be83fc1ffebb62131261e0344662993e2ee047f7d1e2be2aebf1fc37ccf701c -assets/assets/imgs/tomate.webp,1628702437600,f4cc588ed5d48df03933109c0f8ea161d953f9dfcb65ff5c2aca0642f515b947 -assets/assets/imgs/tomar.webp,1628702437604,e36666a63e3f8769e23af30e0b3a82b728e29e2ca43c8dbf3dc1c947137ea065 -assets/assets/imgs/todos.webp,1628702437600,5ec46b72ec33d8b7f4c1f4093ed10b11ce318325686bcb14e76aa35479654d5a -assets/assets/imgs/templada.webp,1628702437584,e3e2735bde59887f185eb39f1d109049de108c89c9fd621ebcbce67c096eba0d -assets/assets/imgs/subir.webp,1628702437588,a523fda8bcbf649f92d41647a8628dd485787a6dd71991ac26fa2b314f24df17 -assets/assets/imgs/ternera.webp,1628702437600,cd34f659a0469ec72d029c5f0da7a29f8bc6a6339e65989897d2c89ec49e6e8c -assets/assets/imgs/tostada.webp,1628702437588,206eeb31be5c70ef36e650a9e530766088782702f3140c9984ceb7527dfd08f5 -assets/assets/imgs/supermercado.webp,1628702437572,cbcc1cdd139f8327d7e2c0cf9177423bbe8a5fdbf7e9261c8d140b4bddcc7a9e -assets/assets/imgs/tablero_de_comunicacion.webp,1628702437568,9ada25e95dda344b92191663e72318fccd3386efb450653275848a45da0a3be9 -assets/assets/imgs/tambor.webp,1628702437572,b894bd4449a6a7266a0400177a6999dc053d29ba285866adaab70a29a91b35ae -assets/assets/imgs/tres.webp,1628702437584,413f0b49b531abf11235ac274f40e366878fa14ddc7f28930c6e8b5eb60b4c52 -assets/assets/imgs/tarta.webp,1628702437608,c977c78ecbba07341a8a1bae5a7768acfd91428916ea21e8eb7919906c03a79a -assets/assets/imgs/triangulo.webp,1628702437612,6b5a8641cef13609014aa1fef6fbfd0403dc626708f9df265cb4bcb571b93831 -assets/assets/imgs/tigre.webp,1628702437564,89c04fe5be77df3b86de18b3629e1eb697e0f92b4eb5e4e1e99668571718998a -assets/assets/imgs/taxista.webp,1628702437568,f24e653eff44b8f75ff0f75f95233de8c42332d3639e1e1af7ab1941f95d2f2d -assets/assets/imgs/toalla.webp,1628702437572,a39682a77735a64d31e11218ce07ddb3d6de815ebedb96459a35455f5c7e8e38 -assets/assets/imgs/todas.webp,1628702437572,fd329d3c7c574c7aa68933015807e14e37b022f9e0a05d1ed28dbc98c8dc2a65 -assets/assets/imgs/splashscreen.webp,1628702437564,41e266283acdaf95f1a2ea9315f18f236750f9aa4b9e4f3b13baba3e96b49375 -assets/assets/imgs/te.webp,1628702437568,96a5a93f8a235fd0e40e0cee1568a86570d8ac71dcf1d67ce7b34a2a7d62e42b -assets/assets/imgs/tuya.webp,1628702437568,27493a4aff28fbf2a489be238feb2569d3f30648b88c514fe1a93249559866b4 -assets/assets/imgs/transportes.webp,1628702437608,b1c3a955424528d525c98bbcd47cea35866298b6eb0910d543f6de6e5569566d -assets/assets/imgs/tienda_de_bicicletas.webp,1628702437592,1e25fae775e9647c6ddaa226fa08e384d0e8130d34329a3bcfd6fa9c056c0116 -assets/assets/imgs/trompeta.webp,1628702437572,4efcf9793a73d5f5f7c33943ee5ff3686907f4b1a64cdd3cefe04a32b78ab9f9 -assets/assets/imgs/tirita.webp,1628702437612,e885dcdd8cf07213688d62fcfd3b1b564416849e76ef2e35bb56cefa130f702f -assets/assets/imgs/unia.webp,1628702437564,4763df5d46757e318c743c0a2c8dcd8b62ca64c5e44c399de849340d9a39f251 -assets/assets/imgs/uno.webp,1628702437576,db6ea6c7dbac66f4817ba5c669ed469490fb4dca7aebb72192d16c3976222428 -assets/assets/imgs/tortuga.webp,1628702437612,ba1b2a2026022937dce5062d697baaf99cae6f76a3bcc43db71149bf84d4c7be -assets/assets/imgs/vaca.webp,1628702437576,a13e6ac22b8c0a531d8345aa4db7468c0d2e4434c67a11c82e0ba48fb5a784db -assets/assets/imgs/vaso.webp,1628702437576,6440322177227850efa76295019c6460533b5a860cb88200fbe680e2fe9d4e78 -assets/assets/imgs/verano.webp,1628702437620,7a69a8866a520c96851667113088f5845d13c93233e8dc7ecd9be29758ac1239 -assets/assets/imgs/verde_claro.webp,1628702437596,b668d3cde3848929a1f2636b26a30c10442e08e6b91fcecf8e6405567e114a0a -assets/assets/imgs/tienda_de_informatica.webp,1628702437568,ca61fd41d4362da287502ed9d492b2a0946d53c95cb875e317cb648f554f31b5 -assets/assets/imgs/vergonzante.webp,1628702437588,f73a1b214a55ef83c3e2b7201423cb8fc8f7d0b09924f1e680881599072a249f -assets/assets/imgs/vestido.webp,1628702437568,1c77c1859e47314c687f510e60972b3d6a0ecc66622548c48d34018563d6bd41 -assets/assets/imgs/vibora.webp,1628702437576,d17a1d0db965576401a320f4214bb65b7a6264b8618d2a416febfd3d4570ac82 -assets/assets/imgs/venda.webp,1628702437588,018a8c2c5c5eb995de8c4e2e4a721448c21cd319e3ae08fa925349e1e353c969 -assets/assets/imgs/transexual.webp,1628702437600,b599ce6946ce6a48ccfc694e412baff672517e7ebfeb5ec6021a6de0c1d8e388 -assets/assets/imgs/viejo_cosa.webp,1628702437592,f7edc385af8c4b311dc1f5bdc5c07424b2f5e180ab6989f865f554fc4334277d -assets/assets/imgs/vino.webp,1628702437576,66e2840a15f27839b3db7efcb39c8584129120d1b94fa9b22a339b1c7fdad487 -assets/assets/imgs/y.webp,1628702437584,33e5e3b9cc90360b5173d7e237159f69476df8bff37289ab010f29b7998d8013 -assets/assets/imgs/verguenza.webp,1628702437620,a9e7eddb7e3c8cb04dce51b41e0ea9ac204eb07f41167a8b78dcda5528998251 -assets/assets/imgs/viajar.webp,1628702437576,65d7dec44da3a662617c76ca4e2ce11e0b97f4f05709c98cfd0948bba113a2ae -assets/assets/imgs/zic_add_circle_outline_white_24dp.webp,1628702437608,e8ceba5d32f1a071ff48f16c15e772b0429488ad3dde9de6deec1f31ea21c3e3 -assets/assets/imgs/zic_v1_perdonar.webp,1628702437612,ba75a2c6a3a3251112cb8f4b662d6afa059e294f31770767f9e11ed1285f4a21 -assets/assets/imgs/viajar_en_auto.webp,1628702437600,d971aaf5146270236c6cf3e326468ebd246a3aff0f0ff959af919c8edc3c0af8 -assets/assets/imgs/zid_carne.webp,1628702437612,ec87ec43c16677a24ecb0b6ad14eed33be2fea6a3af400a89a7e6eee9b084fca -assets/assets/imgs/vida.webp,1628702437608,83d12bd077b4aaff640c649ea8c8cf9db828b3cd7f9e926c0f6a0a4635d767b4 -assets/assets/imgs/viejo.webp,1628702437568,56f4168cf90658afc5c2312bafa60055ad7b5313b985da3dba58dc5540d34483 -assets/assets/imgs/verbos.webp,1628702437580,c977bad301e03e96683e3da75f26796e0f414fd977f708bcd04a81d7ed2ec179 -assets/assets/imgs/violin.webp,1628702437600,dbf217f7ef1a981d9daffe558bd9a79e7b7a30d877200e3c0b065b890677eaba -assets/assets/imgs/visita.webp,1628702437608,0abe81d8b41c28f2ebc7655fdf7afb420ec7c56412534cd1cc386e5346b65f28 -assets/assets/imgs/zapatilla_de_deporte.webp,1628702437568,e381a6bf1ad5b26f2467868f43f3e53a39f2caf0d7e2aeddd82dbd36d7ec7e4c -assets/assets/imgs/zapato.webp,1628702437568,daddaca0e40d8ef1e2dd2934c7fbb70c288392da1bf3efe587ab1f2b5be92a43 -assets/assets/imgs/zid_arroz.webp,1628702437564,f1b8c3a7381e54377e80fd974af1812b84f94ac4a1fad0239f96b3dd08142a09 -assets/assets/imgs/zid_dolor.webp,1628702437588,f20a2ab4077daa192b8d16f8d3fb100319ca267188f7ac50698cd3ce879286ea -assets/assets/imgs/zid_diarrea.webp,1628702437588,b4fddcc210f421660a2173f0ebd49e00d0b92ae58e1bf717be89a717113f9c22 -assets/assets/imgs/zid_dolor_de_muela.webp,1628702437608,8ae0f010650d450d0de685bc2d2acf5f824a8ab7d9ba4ec6ccfa59a08a730cb8 -assets/assets/imgs/zid_huevo.webp,1628702437576,fa85b4680102a1a524733949ad7788b0dd56f07b0f1b6985842407ac2525104f -assets/assets/imgs/verduleria.webp,1628702437576,6836ecfe253688d63f58fbeeffcb262ea1e316211622d85145ff27d7d28d8a61 -assets/assets/imgs/zid_ensalada.webp,1628702437608,ed723f449cf56d3a85dd153898c63f9554efd2ff14032235ba0d2e874b6be38d -assets/assets/imgs/zid_pollo.webp,1628702437608,280dc38ccab2056cda5505a229cebef458f442a30140ece51a2649820961f170 -assets/assets/imgs/zid_fruta.webp,1628702437580,69ef27e937d55b22684eaf6828ee2a71cba772e4a5127e4799dd1b8febbc9763 -assets/assets/imgs/zid_gripe.webp,1628702437584,1a25881650397ca025592b45c135510479fcc0a74563934226c008c6ae8ff0f5 -assets/assets/imgs/zid_yogurt.webp,1628702437608,267f5f2970d17ea71983d2234e9f0975457176bcdce5162da01156f76ef37b2f -assets/assets/imgs/zid_dolor_de_espalda.webp,1628702437608,39a149c568010383adc967bd38d2033af13fdbd081dc33ad2b94a6686ea1182a -assets/assets/imgs/zid_helado.webp,1628702437592,737f022b9909c8f8295bfd64571bcd55b38d9e8a83f0aeb4d56f458eecdda087 -assets/assets/imgs/zid_dolor_de_garganta.webp,1628702437580,eb09258992abdb87abbe82535dee386b18d93f6745729ad42331b09b7055d85e -assets/assets/imgs/zid_dolor_de_oido.webp,1628702437620,a803886ff019db13e392b58c26313e23a4c87abd017b7166755091e3f3130481 -assets/assets/imgs/zid_dolor_de_pecho.webp,1628702437580,13864a6b70baea0ac4fc24231f6463d6ccb5203f2c35da356a77851932bff4eb -assets/assets/imgs/zid_dolor_de_panza.webp,1628702437592,224075be0e8e6325b7f5ac983f221669761b0df3b6c397dd95569716b0d68ecc -assets/assets/imgs/zumo_de_melocoton.webp,1628702437572,29e93bfe7e6988bdcfb9330e2c18a8912533222de1551515776775eee80a1e83 -assets/assets/imgs/zid_pescado.webp,1628702437576,8a0b24e0f4821f564ef73115a880f42f6fd8ad6f65339dca2fa45912d81c1ac2 -assets/assets/imgs/zid_resfriado.webp,1628702437564,19de4f049b02c159ed757834993034e9db0914a721e207277b4cefa6ec5b2be8 -assets/assets/imgs/zid_dolor_de_cabeza.webp,1628702437568,6a7225116b823f0b8c27c1e206495794ca9ac64666bb1f45475511860439139b -assets/assets/imgs/zid_hamburguesa_y_patatas_fritas.webp,1628702437620,c3e74e067b6616b03930bdd2a634d45df4ab3132c95b9fb5bd1d3eaaa36dd2cf -assets/assets/imgs/zumo_de_manzana.webp,1628702437576,e31d488c3177aad3451fe5e4a3785e04b85f0ddfc2377e1ebdb77ebf3b0f04f1 -assets/packages/flutter_signin_button/assets/logos/facebook_new.png,1628702437624,b1aeff59d59de073e2789952d431e6c6f62bc5fb11eba42fb306b3f5b4a8a00c -assets/packages/flutter_signin_button/assets/logos/google_dark.png,1628702437624,1b4876c9390964ad58bab3a65ebf886be9c8a5b48150bca6cf393a814cfd2b50 -assets/packages/flutter_signin_button/assets/logos/google_light.png,1628702437624,5bfe4fb6f18ac766c7fdad295efd6ea2219d20cf99776f74265170ac83612b20 -assets/packages/flutter_signin_button/assets/logos/2.0x/facebook_new.png,1628702437624,bbce65ea25b70a592cb80b58fda62c0917e81d350069b9ee0f6285456df44bed -assets/packages/flutter_signin_button/assets/logos/2.0x/google_dark.png,1628702437624,4dd4e141946e4e9a6b4332693a2847165139e368ce5b3be8d54154a7b1ea713e -assets/packages/flutter_signin_button/assets/logos/2.0x/google_light.png,1628702437624,4787758c88c55981215526cbb987e6bb917753d12022fd655e41035b79c80f36 -assets/assets/imgs/zid_pasta.webp,1628702437592,38142109953af73d722278d3f480c9d1b7406c46f20c0e23f252e72a312bb151 -assets/packages/flutter_signin_button/assets/logos/3.0x/facebook_new.png,1628702437624,53ace88da120eb71a1f7ba77e5afeabbf2ad7ac7176320d435819d385bccd795 -assets/packages/flutter_signin_button/assets/logos/3.0x/google_dark.png,1628702437624,861e8426b48b8464b731740ce7fcb732838835933f3c32c375677a4c1df4177b -assets/assets/imgs/zumo_de_naranja.webp,1628702437608,e4976bb675ee728b2f5e1cd733b7291ac86412316a9928524b76a2b506e837d8 -assets/packages/flutter_signin_button/assets/logos/3.0x/google_light.png,1628702437624,1e7a5bf94bc148c2b58174a3a0040d4311fca5122869ec3703e9b12012aaf934 -assets/assets/imgs/zumo_de_uva.webp,1628702437608,289bbe12963ad47637c31088ea41d7810e656ed7c730550c01835febc921616a -assets/assets/imgs/zid_tarta.webp,1628702437568,c977c78ecbba07341a8a1bae5a7768acfd91428916ea21e8eb7919906c03a79a -assets/assets/imgs/tutocontrol.webp,1628702437600,adea3e53fbf1b8da8c27610a360d2c3e404c590eea4a14bcbaaff1b660f5baee -assets/assets/imgs/videoclub.webp,1628702437568,2bccf9fcb14101ce75c25c5163af8a22ddcd831eac644e99d5e85b3e61457791 -assets/packages/font_awesome_flutter/lib/fonts/fa-regular-400.ttf,1628702437624,8b95cecb65a0f4113578224ffa66e7f3374f8277990d9500464aac56f732cd01 -icons/Icon-192.png,1628702437632,0966c457950641eb1185ae6829206e371c35e4e9c081f515fa055f65726139e4 -icons/Icon-512.png,1628702437632,15ba6f76fbf68941784b974bb22328be9f3a7121861307c4d0c83ade6da3cb8a -assets/assets/imgs/tocaboton.webp,1628702437572,eb83069184265cd696d0e7a55e3943956d08e0eba2fdabc1c25463752e8d4035 -assets/assets/imgs/zid_verduras.webp,1628702437608,dc7f0db2a648d4f9a51ed4abdbce1bfe949618cbcb02da79e91aa439e2189780 -assets/assets/imgs/unboton.webp,1628702437620,d7c9704c1218442f873ba42d0b1682b40d489602dfdb52cdb4e20a0d3f16b030 -assets/packages/font_awesome_flutter/lib/fonts/fa-brands-400.ttf,1628702437624,81b1fd5a809f21475b78d10bf4fa2fea6873e252f26efd845fa0043939778d1c -assets/packages/font_awesome_flutter/lib/fonts/fa-solid-900.ttf,1628702437624,8e04c2bbe62ed867678faf8f7056489e7fca5488cd7a3252ad604f3ca6c6ca81 -assets/packages/cupertino_icons/assets/CupertinoIcons.ttf,1628702437624,a77c8ca7f82c41df974e64528dfac4de5332a92a90dd861a44d5619a74b73b2e -main.dart.js,1628702437356,d16234b3d94b6a5f6da409d11c83587bc2ec405f5380f184fdd180e4e79145fc -assets/fonts/MaterialIcons-Regular.otf,1628702437624,8c402bdc0a798536fe39a200382c990415bf07cc4e46a658789c96a3c412efb9 +.last_build_id,1682444681984,8098e387f658de3d7b87c505de0ed5ce26b79b1cc565973709df1c0eaa3a28d0 +apple-touch-icon.png,1682444681164,7506d8f7c4dada58f1b51ed3ac7b2070b3fb6cd68672aed61a028324dbe603cf +favicon.ico,1682444681164,16699d4127a13b28062213bf78ab98a61b03f6179fd8735f2dc798dd35d0287b +favicon.png,1682444681164,bc61d7b6fb147376de227725039076a3b96af9b4ab6445e645dc61fad99d22d9 +firebase-messaging-sw.js,1682444681164,95d775bda766dc151eca6ecbf49ab0a843edd27391781b094284c220c54db228 +flutter_service_worker.js,1682444681952,ed74aaba282881d373980f40469815ab8c74a8592db4a6299ebcc660df7eaf9b +icon-192-maskable.png,1682444681164,31128615105e7af419f85285b8ed5c7b357f956ceda3978295c0280242db9fb4 +icon-192.png,1682444681164,5a3ebcac31167a5edf4352aab694e4e9e28a4d7a94724d41831d6bfb111ee822 +icon-512-maskable.png,1682444681164,a3d57f4a692af1c60a33e5f2fbb042a2c98f1989ba581c5498708dfed028e86c +icon-512.png,1682444681164,ce69969673e2d771c30cfce63425c6658cbfe26e170be81dc2302a00385da11a +index.html,1682444681164,1f5ff434073f130d3abf87cb94ac4cf88a517a4db9fc2e545d58d41d66b4f4b6 +main.dart.js,1682444680904,9bc8d4323647caf9e4cb9e19816c2c38155083d901b767ff00184e667b599bcd +manifest.json,1682444681164,a8bb6f18b328adbd6ecd1db8a93884f479ab3e25055ba621580d175cd53c9ab0 +version.json,1682444680912,1fcfa6ebe43b44d4ba9e1c79c376b45d4473a918295175cf8be2831dc9a06760 +assets/.env,1682444681104,cd87d3ab99b4324599ab0bdb8cc21133ceb8c6a1770a1199daf7e746af073fb8 +assets/AssetManifest.json,1682444681160,0fe2ed3d23547ff1a4ce3770be34f30e0574073d6f522fb96e82929c8ab296c7 +assets/FontManifest.json,1682444681160,ecc2fdd5f58bc7db04baf7fdc5022963998d0af1e69b53d8c05cf151e5293b2e +assets/NOTICES,1682444681160,e643555b70382ad0d978c4d982976b7f97e55c9e3a66d3046e39f21d620786a3 +assets/assets/3%20people.png,1682444681144,8e96fe39fc7d6cd5e2a42093ab00ed0212c7633a6894beb51876bc0d3e4fee4e +assets/assets/Buscar-Orange.png,1682444681144,4ffc183a12763143f21491093db1ccc3688b2b49b2bc2e6d3853853a38822700 +assets/assets/Buscar.png,1682444681144,041c772cef5cafa0ee810b3ed1f368517e0c5b7e8419f8b4077353133735b053 +assets/assets/Delete-orange.png,1682444681144,75042ab5ecc641571c027f384b3e95767ef4227754e84909c490351c388ed609 +assets/assets/Delete.png,1682444681144,6373334c07d88bbec3588328a42b8e4ed65743f8c1c6fd72c174b67394072cb3 +assets/assets/Group%20671.png,1682444681144,aaae91e09068aab3f5764943f69e0389fce71c9ded4c372025b7b976862d6503 +assets/assets/Group%20704.png,1682444681144,40cd049adb5c668e83c7237a76a37c8a414ab19d491b1c92c366693bb24aa031 +assets/assets/Group%20706.png,1682444681144,3abcee8d38eececa1389b6e536ab1bb1a419ae49d2f435f65ceaabec27bea61c +assets/assets/Group%20727.png,1682444681144,acf25b9a9ce3c0c25ef72ca8eeaf6712739f90e05a7c14d7fa13fc22a4f94ea3 +assets/assets/Group%20728.png,1682444681144,bd97f70767f840b65a1ff0fb651776549a7fa4e0ce75acede98cc7749295e216 +assets/assets/Group%20729.png,1682444681144,3b0d3327580c889857a0ec58751a7e3c479074471d422a0ddccab43ce1ca9799 +assets/assets/Group%20730.png,1682444681144,20823d2ee00077a9a63181ce2d2c1b82427708d2a496dc59b933786c95a0d716 +assets/assets/Ottaa-orange.png,1682444681144,7a315112d25751bde5b1b62200d2f1084b4a50eeb7351437155b11963a99a9fa +assets/assets/Ottaa.png,1682444681144,fa0c967e1ca768ca6cbf2f69bb12cd967e15064a2ec15e6d092f4aa1474d5d1d +assets/assets/camera.png,1682444681144,52f8a6f456323abe6b64191501e987a186b2d993087dddebb6956d7c8d600d32 +assets/assets/download_from_arasaac.png,1682444681144,38a9adf7a5b13cb1b420acf2d406581b14b5f4efb6e78b572448a8e7968a5eed +assets/assets/fIcon.png,1682444681144,a2658e8df03981f04f953e6da4cf16816a6b95314c2c3a2aa0f671afb86344c3 +assets/assets/gIcon.png,1682444681144,40df2362f9b85bad54c4079ce311b46a76097bbf45fda95e36d2a19e0dc84a02 +assets/assets/gallery.png,1682444681144,ab904712a26dfcfca0ba4f940db04efc687c6f2eb759610a618bbaf87082d7ce +assets/assets/google_icon.ico,1682444681144,9f22b7fe999813e983008effa23d6ac8580bf79ab2fa2d8f22c7bebb83e8a50f +assets/assets/grupos.json,1682444681144,c4632ef5059fa1747ad15ff0542633c8eb69d2f2436f0c715fe77bac9c97a054 +assets/assets/ic_mancha_gris.PNG,1682444681144,f0584617f89be9f15ca1b2a38a8fe8b1fdd20f2b0905dd3085067157b00345d8 +assets/assets/icono_ottaa.png,1682444681144,13be42ac0e7e0cda5b8f8b36fb27ef4ae233f2574aff63ea3e5874e9fa16954e +assets/assets/icono_ottaa.webp,1682444681144,ffaa46bd257819777cdbb3d973bf44c57465a52c936abb81bab39fbbaadb65a5 +assets/assets/old_grupos.json,1682444681144,cc46f12a27e696c3b1d6fdcc8563412acf292fa9c1e2e75634f0bf3c8d387d0a +assets/assets/old_pictos.json,1682444681144,f10f48fbead30e1caeeeee781ed0da600947688fa8d420cb7605428f37d6104f +assets/assets/otta_drawer_logo.png,1682444681144,f9530ee7420449a8f701e0d0ec28d746970ffdd95696184af37ef8822bc3f59b +assets/assets/ottaa_tablet.png,1682444681144,40cd049adb5c668e83c7237a76a37c8a414ab19d491b1c92c366693bb24aa031 +assets/assets/pictos.json,1682444681144,267bad426a7a602faa892f56021cb75aaed7da1204d4e45cdf1fc3d3a5ca8748 +assets/assets/pictos_originales.json,1682444681144,94483bb2e16f58751812b21ab5d93cc4754b0824e03a962e9df670ab6146ad2f +assets/assets/refresh-Orange.png,1682444681144,26420f9e81c5599cb11981c46e41b2312ac8d7ea6c37a6fc9364f7a415af48d2 +assets/assets/refresh.png,1682444681144,e6f5c5f8b5371c1daedd767eb1e9d8a591cffae7407de4ede3ce5f18182656a3 +assets/assets/wheelchair%20girl.png,1682444681144,6e1b3b9ad4695fd2426c1700621fc3e3575f510e368852c7aac268869c8f5cfe +assets/assets/audios/funckygroove.mp3,1682444681156,f86bedfd113f0dc3680ebabbbc5503339c4a7ee6f7c9c16c91bd5f653cbe2079 +assets/assets/audios/navidad.mp3,1682444681152,6420497207561fff25ee6c2cfa1e585e5cb7dac00835b16394e1adb80ba60cae +assets/assets/audios/ohoh.mp3,1682444681152,9c09fe40ded24a4af841be69984d9bf98bba3af39beaf4339ec98107eae16df3 +assets/assets/audios/tada.mp3,1682444681152,f1bda51e0302ed06197cf849ef5c0f25ab7c7b76fc2b8f4ab206c72b516697df +assets/assets/audios/wrong.mp3,1682444681152,12088808aca40fad3ae45c772368a8fba920d3f3d6e7c6de3428472385e9e5ba +assets/assets/audios/yay.mp3,1682444681152,568b0c996251cfe4f069bb0244f9aac79cddca3d1f7449f768b11546c6a5ab7d +assets/assets/audios/you_win.mp3,1682444681152,3a46daecd29ae0940b76babd9217d8389aeb54bddc79a9494b5644010401802e +assets/assets/audios/yupi_1.mp3,1682444681152,64cf9873e8b89526146011d25df50c2fac2698c1cfa76d0a65ee275500399790 +assets/assets/audios/yupi_2.mp3,1682444681152,6316ee5a92aee033f09169c23e32478bb0f1de745de968454e9b49c97be73e70 +assets/assets/board/board_edit_image_1.png,1682444681144,64c323659c903c80a8246c6b2551f654cbd50bb9634b1e1517db3dbda90c268a +assets/assets/board/board_edit_image_2.png,1682444681144,10cab0f443652e71d075fa9aa5bf77a3da6e800ddc3c6727f71c941a0d386096 +assets/assets/board/customize_wait_icon.png,1682444681144,c5cf25e0d45343e6de1536543b00045a35e1ead0f3c86e7cf52b27f3657ab117 +assets/assets/board/icons/icons_not_selected/camara.png,1682444681144,5414448e36de6c40e213cd23582fca5b50f38e5e696cd3c7cb9d07e324434742 +assets/assets/board/icons/icons_not_selected/delete.png,1682444681144,d90397e433f6a863833e2252c20505502be3bd7c70307b473c125543d161ee2e +assets/assets/board/icons/icons_not_selected/dice.png,1682444681144,3866b163bd6104dd0bbdfca7830d4d3a6cbf9c530e84262b6f3eb2a19e579447 +assets/assets/board/icons/icons_not_selected/favourite.png,1682444681144,a395ef04d6fdf8353f0132283f3762ae105d8c2b51af2c41cabdc354517a1cfe +assets/assets/board/icons/icons_not_selected/history.png,1682444681144,6df34ba7bba6a43ed7c3c5129ac6588526aa37e7e84f133c1d729e04ab3a0f61 +assets/assets/board/icons/icons_not_selected/image.png,1682444681144,79f64b243a59cfc3ed5acece3a31f259d8a112990231d02ff0b3328985b23f72 +assets/assets/board/icons/icons_not_selected/no.png,1682444681144,f42bc8660a16a8981f551177eec65dbe354c442ad46cdf3e085a825dd73e4508 +assets/assets/board/icons/icons_not_selected/ottaa.png,1682444681144,c13bd7a1065a3b85ffb5678f11c2f05f8461fc730012599f5f4ca3bcb1bd51e1 +assets/assets/board/icons/icons_not_selected/refresh.png,1682444681144,8ae0e1618a301a652555e41d0ebb17473d4ed599c5a21980bcb9c764486ccfc7 +assets/assets/board/icons/icons_not_selected/search.png,1682444681144,c9e3aac222475cd7802ff81f21f70204cdb318fa3af8e34bfa67bf9ec84a76aa +assets/assets/board/icons/icons_not_selected/share.png,1682444681144,cdc4a6fa898c098b7a49aea567684a5b353dad95bdfdd07f831306d65d41b616 +assets/assets/board/icons/icons_not_selected/yes.png,1682444681144,c613fa02c498898c0bb47d67892c82ade1de8228a9f60feeff3bc29edc10a640 +assets/assets/board/icons/icons_selected/camara.png,1682444681144,6277f3b9d0e26f4c709b2055a2cde36efa4efb338b27bf3613cfce7c2f58eece +assets/assets/board/icons/icons_selected/delete.png,1682444681152,d444fb66d8ea8051b0ecadf6ad21d315f58a24322b652e154f3ea89fdedefcd3 +assets/assets/board/icons/icons_selected/dice.png,1682444681152,2fbf2254f4da4f7f422acbab9c6e60c29c7a90d225301dfddc842941f2a03783 +assets/assets/board/icons/icons_selected/favourite.png,1682444681144,a72706f362f705d7da5346aa0dc07ca83eaff7d331e1ab7bebfdbbbfbd7f1c0f +assets/assets/board/icons/icons_selected/history.png,1682444681144,8f6c4354a76f6b6c60b1b24c1ab064261cc218e12ecd73a5cea750c409a7a436 +assets/assets/board/icons/icons_selected/image.png,1682444681152,07b9c89b59508f276ca3bac03f364f3dd7a1b64a44dcfd263fbb24d4e62d09eb +assets/assets/board/icons/icons_selected/no.png,1682444681144,1a878ef0d163f48ff85a21800c28c8373f19e6b833462967bb523e88041a6a9f +assets/assets/board/icons/icons_selected/ottaa.png,1682444681152,d1a1860c69d8ee8bd3abb17b3eac51c23b3d89e27412646dbfb6c5e2fe771323 +assets/assets/board/icons/icons_selected/refresh.png,1682444681144,7dad90484441d8dce8ec291c6b3cb33e2ae4f12841fa6b22b98712c779cdbfda +assets/assets/board/icons/icons_selected/search.png,1682444681152,a7d42037c9fc02abc1dfa56b73d35a8240222d7413844a6b3afa261362dbc2b7 +assets/assets/board/icons/icons_selected/share.png,1682444681152,d29b04c5de8df865fea51391d36c0f56891dd30b5d421cec7ce9f9f4f9e191d8 +assets/assets/board/icons/icons_selected/yes.png,1682444681152,7c02a2541be1e60adbde5b5c1747b6206e839e5bbfd1d5a90dbbd0af3bd81519 +assets/assets/custom_icons/Ottaa_project_custom_icons.ttf,1682444681156,061895c3b6694cc010c6a49345bebb66369f2f84185f2a9521ab269c1ff6de7c +assets/assets/edit/picto/delete_picto_icon.png,1682444681144,f13ad78531f2bb31bcc2c5c797c47345df195e74a90e37e17b0b32a5d566e509 +assets/assets/edit/picto/picto_edit_icon.png,1682444681144,89f759d0982a4f24b263a269274eda9a6e3ecc1c297ca415dc0a6a060f067186 +assets/assets/fonts/Roboto-Bold.ttf,1682444681156,e1ae2ec78a329d508620451e41f7eafc5350cec7fa12cfba0fc14002c196fd86 +assets/assets/fonts/Roboto-BoldItalic.ttf,1682444681156,6535b6924060ab1705c783af8cd6bcc8be6bd66ab2395094b3c3b6e540d01b1a +assets/assets/fonts/Roboto-Italic.ttf,1682444681156,514595624690c754f2523b5506ad3f2fb1291fad749531fb69ae8799bdc42734 +assets/assets/fonts/Roboto-Light.ttf,1682444681156,a724d206f485777c4691889fbbb06dd23c61dc22bd594cab7ddecb987c10387b +assets/assets/fonts/Roboto-LightItalic.ttf,1682444681156,6296870f1d289687016f62e5b906c27233217b9c8c7a53a0f9bf3fae54ba33a9 +assets/assets/fonts/Roboto-Medium.ttf,1682444681156,c5a7c65be4919ddfde373268d2be2ed7f63bfba42faa9e83df80d213c36085e3 +assets/assets/fonts/Roboto-MediumItalic.ttf,1682444681156,b039a0bc777d6be4546a5ab915f28b682b36fc47859152212bdd085bdeb8085a +assets/assets/fonts/Roboto-Regular.ttf,1682444681156,8f11467b058b37951297c0b3bbfd70bc27d80384398752d3aa36df4f93070b3e +assets/assets/fonts/Roboto-Thin.ttf,1682444681156,2b772fe6258fb4576d8a9470993cac7599e00b4282ed1fca32fe444827b7e7d3 +assets/assets/fonts/Roboto-ThinItalic.ttf,1682444681156,f13bfa880dfb8ddc20e37ffb431084a39b0c8f2c3b87f58f1e3b58afc3ebf189 +assets/assets/games_images/game_icon.png,1682444681152,248aec75d4e44a60ba4d86eefc12433dcdb59c1c1bed47fb63030ef5c34bbca2 +assets/assets/games_images/game_search.png,1682444681152,d164a364765e473f6b8cd3393eada0775a3d040d37d020095218524288e453c7 +assets/assets/games_images/game_select_photo_0.png,1682444681152,d74de680d69482dd098262583ba4d335c1920e21d6b466b6dc37da4f3ee1f188 +assets/assets/games_images/game_select_photo_1.png,1682444681152,2e2e0a800301c97888645bad455ae7b9b06bd03dc17395dcb7eaad98ef59f0f6 +assets/assets/games_images/game_select_photo_2.png,1682444681152,7fa3055f61d65b2967de5e79f38314988f5cbc026b62b75132787e72fe71b8c5 +assets/assets/games_images/mark.png,1682444681152,4d7a13a87e71b38ef42e3531912eb60a8880f6162e8db1d5dede24405daaa7a1 +assets/assets/games_images/match_picto.png,1682444681152,aa2106eddd9c24a6244873ad0c9279020a76583b27414b5aec2be20a6b6cb9e0 +assets/assets/games_images/memory_game.png,1682444681152,0d77d62df4b1b059aefe5602515eba14f35fb349a15a80fc6837b58683cdffe0 +assets/assets/games_images/trophy.png,1682444681152,31b78c61e28aec58639b8f28a230b32699f7256eb22e9382a98d619539587f0c +assets/assets/games_images/whats_picto.png,1682444681152,7d4ce01da51ea8d5fad68fefc31986aebc2030e27e0436707095e0f92ca3bd7c +assets/assets/gender_based/grupos/grupos_es_female.json,1682444681152,df9193e7bd52549c0605723b9f7dbd599d86a15a182d319af4acecbdd2bbbed0 +assets/assets/gender_based/grupos/grupos_es_male.json,1682444681152,e999bcf6a98df274dfb9d7bab9b70ca47f161a4772cafe7085158ad8182e057c +assets/assets/gender_based/pictos/pictos_es_female.json,1682444681152,d90eb923a1a0b861898c350413d1ee71ddc63cc7679a258b34288548e59aa1f4 +assets/assets/gender_based/pictos/pictos_es_male.json,1682444681152,82b119e83cd339e560465b43c3db500865f2062ef64dce816a12b7d780076809 +assets/assets/i18n/ca_ES.json,1682444681152,0718f2b25a3f53e66837c69daf07f4371bbfefec2805414decb92e626fe9af42 +assets/assets/i18n/en_US.json,1682444681152,45eb0a19ced99ea749a38d9b9695d2c91c10d0aa711ac8200f4d9cd6ef1b6966 +assets/assets/i18n/es_AR.json,1682444681152,07ff93ca5a75add270d76ed75e10f5aad91a953649f54d272fedc11e6d3b078a +assets/assets/i18n/es_CL.json,1682444681156,15ccec12dd17a6814519fd340c78b5b3be061aea74dd090a004cf06ef1ae00fd +assets/assets/i18n/es_CO.json,1682444681156,15ccec12dd17a6814519fd340c78b5b3be061aea74dd090a004cf06ef1ae00fd +assets/assets/i18n/es_ES.json,1682444681152,15ccec12dd17a6814519fd340c78b5b3be061aea74dd090a004cf06ef1ae00fd +assets/assets/i18n/it_IT.json,1682444681152,3cd69b5faf56fe3c5bad8b835ae5ffa1ec72c33a3e43f06a053a2f1cd00436ea +assets/assets/i18n/pt_BR.json,1682444681152,3fc9f41f8b11dd84be15a6208093269f698fa40dbab66257726d73db3f71bba2 +assets/assets/i18n/ur_PK.json,1682444681152,be4e63e6d45504c683363962cac8fb6e8a684aab6fcc0f4a4bc4f61bb3f7dae8 +assets/assets/imgs/a.webp,1682444681116,55954034f8274933390ba847c8ccb15efa0d582b65ee57d3ffbf33e50ad6a0a5 +assets/assets/imgs/abeja.webp,1682444681116,c360e2e437550675ba6f3f709fd59d96fae86e8541946e36b069917acafa46bf +assets/assets/imgs/abrazar.webp,1682444681104,a3c2025641bb7c46078cdcb715ac8decf9c655bcd3b4c2e049fa9feeebce75ac +assets/assets/imgs/abrigos.webp,1682444681132,32ee8b48d75f7a3fc632562eb97408c8d31894511b4de220dc25b2990dcf9960 +assets/assets/imgs/abrir.webp,1682444681108,e0289b9237bae7fddf7d657e01a89e181c298a298ff47baf0f0441fee1e1ce5d +assets/assets/imgs/abrochar.webp,1682444681116,36348b35a3d3a83c8d0750c377022825c62a06c58a2128cad24a61d961a1eae9 +assets/assets/imgs/aceite.webp,1682444681108,532ea4a922c70375ea0dd71440c5711568565645c20a70bd6e81c83cd269859d +assets/assets/imgs/acelga.webp,1682444681104,b8a710cbf8f30caba39501632bd802a26fd037de02c03438b353f0bac4f1b1e5 +assets/assets/imgs/acido.webp,1682444681116,f6b930a89671d09004b6962546f7c6044dfacf55a9840ba79b135eb4b27ffa18 +assets/assets/imgs/aeropuerto.webp,1682444681108,1ae54ece9f3bd86be63b1a2f427e91edd5f7d2df59bcf4c599e0b7a7480e426e +assets/assets/imgs/agregar_picto_transp.webp,1682444681124,313cc46c8745ffcc8ef5827d135f766d26eb5c44841f9b1d2e223f541d4813dd +assets/assets/imgs/agua.webp,1682444681124,0a39e2b9bf9e73c9ce77e87415de3c64dc3fcf83df6ee61038d8c618b897e7c8 +assets/assets/imgs/ajedrez.webp,1682444681140,7a72cdb48f0797317a6ec4c4138d0892fc1cb99c203d8208714140ff2857bd95 +assets/assets/imgs/alcachofa.webp,1682444681132,d2ee95e2b0688938e1f33b8310bbbc106baf8899e13a124bef14fdd49af40e5d +assets/assets/imgs/almendras.webp,1682444681108,42d6aa3cde144f28ef98281b411a9fa9992ef88c32daba876a66e65a2bdb3a21 +assets/assets/imgs/almohada.webp,1682444681108,425a3aa192f996c8d207a41bf0a4ab4b21314e2a70b76d023fdb136f0744a9e2 +assets/assets/imgs/alto.webp,1682444681132,addd5ce3a73b256cba7949f723357a7be4b4aa5423078c9cf171e7f70512e238 +assets/assets/imgs/amar.webp,1682444681108,af8b7846d8bb3a35121c9b3195d31d1663765226a267ee11246ecaeb2f05af0b +assets/assets/imgs/amistad.webp,1682444681108,8d66a0b58c5f57c765acd8fbc8fcc7f2b24936cdf9ce7d02ac4e4f54bab5f8c2 +assets/assets/imgs/anana.webp,1682444681132,b89894eeef47ab6ae10f4b5d9cea3d2c4c0a666be4369bb4dcfc8ddee5a35ed1 +assets/assets/imgs/animales.webp,1682444681144,a9f2ae0f791adb331e5ceadcabcba94c0951f3f1da3e2e3178f10cbe89f898d1 +assets/assets/imgs/ansioso.webp,1682444681124,9a3caea3582f3b1b03ebcac52a94f79d7707f1bf5bccb66733a34fbe0be5b890 +assets/assets/imgs/ante.webp,1682444681132,6247eeac95044cac64341c9c316801c439693cd47a3cfb9ff396f8a9bf2b28dc +assets/assets/imgs/antes.webp,1682444681140,6663dd8b33d47d523fe15c0127d6da7e69afc9cedb621858ce1f56e0f096b5ee +assets/assets/imgs/antipatico.webp,1682444681124,f3d66da2858f2eab95cd9629f3f17cd20f842513692408d4f7b386c041fde736 +assets/assets/imgs/apenado.webp,1682444681116,ff9916a0857c7a41dc44291850565e581318b34003ca9358349d75bcd50678b3 +assets/assets/imgs/arasaac.webp,1682444681132,8bff66f742f1e52671f86b54dc94d71eb52402a3c34711eb32057db12febcb16 +assets/assets/imgs/arreglado.webp,1682444681104,c5a114eedaabf1fe4f3c5282c682178f5f70496a54fdf3595f33d4a133b138e5 +assets/assets/imgs/asno.webp,1682444681124,db5a3d9e34caa8f822a005f680586fea74c721b7e4c5965a3b11f66ffb8e37b2 +assets/assets/imgs/asustado.webp,1682444681116,86195f54163b8e4a2a32bc596f0fa8057e0bf5b2b1248c435cf7794181f41b93 +assets/assets/imgs/atun.webp,1682444681116,9fb7ec91ab009b01cb76ccdaeb64a21eb2999de90f7a28279794eab7e2350cee +assets/assets/imgs/aunque.webp,1682444681104,3ccf4e624d260fb2d923918e0ab62130751453077a4aa3be41a313abaec56619 +assets/assets/imgs/ausente.webp,1682444681124,6c9556836f807d871f8b1e3c8d1507ceac030648efc89113ed168b709fc95c5b +assets/assets/imgs/autobus.webp,1682444681140,a90c1482027319adf07f782c78a08b5e481287b14364881c6dbf606132c543a5 +assets/assets/imgs/avion.webp,1682444681108,31fd9c4567f261294ea2bf04736b26167df6b1584f33a7b8da60b14e3e42fc76 +assets/assets/imgs/ayer.webp,1682444681124,d1d7fd91582e6f2ae521351d80303bdcb85686e68ea477f092d3c0288d09f4f0 +assets/assets/imgs/ayuda.webp,1682444681124,3c2182b19c1c5518f25623d293bd248394cd8254f47ce34400b7de1b7ae4b5b2 +assets/assets/imgs/azucar.webp,1682444681132,09a3ef3a85f08e82b5e8a52cd3d749eab5271ba9c2afc34a749473e71e058c11 +assets/assets/imgs/bajar.webp,1682444681144,a46d4ff5a1a3f7dad615bba05901f7e210ee1a75b44feba6ac8af542ebf60edf +assets/assets/imgs/bajo.webp,1682444681116,4dfc19dea49c2f7e4ba713225de71a8a78d8e44a1bed0c36de956c15b3b665b1 +assets/assets/imgs/bajo_prep.webp,1682444681108,428843c736cf985ac541cea8e88dbc49233adaf0f109abee79a5b64b248923d0 +assets/assets/imgs/ballena.webp,1682444681104,b4bb496176440967bdf0bd64c81da1bf4c571a4d51e03dc8f29b0828e380b425 +assets/assets/imgs/banana.webp,1682444681116,d53c4c702f0a4950642267677ecc31015facf88535d6dda3f4d98536c3fe8d43 +assets/assets/imgs/bar.webp,1682444681124,5aa260cdbac4562967dadb4fe5b2e52719cda9cde5d89d8bf5f149f953e9c973 +assets/assets/imgs/barato.webp,1682444681116,16cfa79885b1ab0a6150308a79fd65757079e4ad5d453dda7ab02804a4369cb3 +assets/assets/imgs/barriga.webp,1682444681140,5007bc54220043265dc0eb3a1c3fcc4e4051a9472cc7bcd6dda55e28afd3f83c +assets/assets/imgs/base.webp,1682444681108,669bcce43ec699dba3fea5ba654a0741d8d09d1e728c7590e92e2693224491bf +assets/assets/imgs/beber.webp,1682444681132,e36666a63e3f8769e23af30e0b3a82b728e29e2ca43c8dbf3dc1c947137ea065 +assets/assets/imgs/bebida.webp,1682444681144,f6239693708acd821500ccbe3d29e520369418a018f0241ae73975f67db4e170 +assets/assets/imgs/besar.webp,1682444681108,294f4eaa060134f5de45077ba567af0cd6909c46c256241cedcf6fa33e9e784f +assets/assets/imgs/bikinis.webp,1682444681144,1547907a99f8a9788d759fa396499e53a33ac7ada670a9492bee1af49fe53953 +assets/assets/imgs/blanca.webp,1682444681132,7f0412ce859307567c8e473455f8ba9400937f34e2850230d2fba84ffb9b61c3 +assets/assets/imgs/blando.webp,1682444681132,a9209d7d1f2139a2db36dc40ea62570f97939e4c8102138f7ebc3aed5e19aac8 +assets/assets/imgs/boca.webp,1682444681108,ec9045636c496e11734f8d07abbffb210dfa51cb0c96be8756fc9ea35d9cd390 +assets/assets/imgs/bocadillo.webp,1682444681116,ec474f292d441821e3cbbd69878abb72e2fc1223614e7cb2936b8e825ee4ec75 +assets/assets/imgs/bolsa.webp,1682444681140,905b219d7087779d039cde0b04611e53d59913042ee018e0bfdbde7fd6291145 +assets/assets/imgs/bolsos.webp,1682444681140,de80e9fbe3ae3077be7ade3b211a000386866b1c12758c9c1fe52bf008758ef2 +assets/assets/imgs/borde.webp,1682444681108,9cf31af06ea574fd5b8a43770336049a96c2849bd43a9b74635f8c819257f349 +assets/assets/imgs/borracho.webp,1682444681104,27a19c95accc658747b608bf10d053610c2264bf4d3b5b1b9d91d5a64cb3fd6c +assets/assets/imgs/bota.webp,1682444681144,5f7c854c8c8d2ec1f42edab4b41497f2b34566070fa1b407ea7a9a88f46100db +assets/assets/imgs/botones.webp,1682444681116,4862de114951ffff8c704711710ba72c50b80c426a404a243c56b9df02fa6a57 +assets/assets/imgs/brazo.webp,1682444681124,125cb32808cc2ffed62c8407913fd1346e76c2dd5161ec277e340e0f629dbf3c +assets/assets/imgs/btn_galeria.webp,1682444681132,a901b6a7dc9bd01e7e50d9175cfd174c010a0b4a10c4067ac1c3e116a230dc52 +assets/assets/imgs/btn_mas_pictos.webp,1682444681124,516dc0c17f3d9aaa9bdbd36843edc29f5fb4ec427573f86dfc12dd6d498ab972 +assets/assets/imgs/buena.webp,1682444681132,fe1edd65de006ecdfa1ecc3bba7ce6da1417de6b531a09bfa70de40165d8d38a +assets/assets/imgs/bueno.webp,1682444681116,1fb20e58c75e43875fa785ec3f4328bcb597c5a58b4105486cbedfa7d1f2ab76 +assets/assets/imgs/buey.webp,1682444681116,7c99b76da170cd97bc473183e636d86fc4454b414b242c14ea8969c6eee13fad +assets/assets/imgs/bufandas.webp,1682444681104,ff8a7a0575da9a0c8828bd5bebb1fd0dcf3e3eb2a13202a441e1bf36e7dbcb3d +assets/assets/imgs/cabalgar.webp,1682444681132,cf7f102e1d9583d88be3741fff5513dbb4de173c40132e60ad647e19b3394367 +assets/assets/imgs/caballo.webp,1682444681124,2205541e3a3957730615d67dbd2b911b2f1b8c26c1227f2a2382d2065953945d +assets/assets/imgs/cabra.webp,1682444681124,0b08e21eb5cf4fdd97e0c50298f058082c8f9654c34738f54fd86d5b0b9fe830 +assets/assets/imgs/caer.webp,1682444681104,8a9241c5d207b46627b91942f75711b3f821457eacd0ca4b9184c52f1111fcd9 +assets/assets/imgs/cafe.webp,1682444681116,6d3a09370fed278c18b88d5cf6b9921dc25324d4efef55cc13cda9c26efe2e72 +assets/assets/imgs/cajon.webp,1682444681124,fcbdb7b9466601450a1644fae3d427f6ad0f2e1197d4d31862ae34dfc2a99fbf +assets/assets/imgs/calabaza.webp,1682444681124,3a16ae3bd1d2da0d1553bbcc919dd64398133eab440a7949ceee5b0fa1c234c6 +assets/assets/imgs/calcetin.webp,1682444681108,5016d52f3d46c79720b20bb96b90a2f878d014f3912c1661f8f69eac383aa224 +assets/assets/imgs/caliente.webp,1682444681104,21f081ee415fab6c39ddfac4f86199e1179369c106c95fc76f5a7c83b271170e +assets/assets/imgs/caliente_cosa.webp,1682444681116,ee3235725518d0edad919838c6839d47d2b121757df9d81bda4f80900bab48ce +assets/assets/imgs/caluroso.webp,1682444681124,75d517ebfc38607eab05fadd3b4d21678e4ec49dd55379cd6b4e87a132eea8bd +assets/assets/imgs/calzado.webp,1682444681132,2b43478d3c6c64de310e364136936965db8bc621eedeacdf4df252907750e186 +assets/assets/imgs/camello.webp,1682444681108,7bcd98540ee90d47a1ba5b88d6af3e017e3c842c519e4be7fe14202ef0ff8627 +assets/assets/imgs/camion_de_juguete.webp,1682444681124,33e94c15519b6bdaf2296e3d33462d6e3826699355105a64fb9ce8f2674c1fcf +assets/assets/imgs/camisas.webp,1682444681140,5ea16940536747529ea3a4ba2ee363503299235a3ff8b8ccadf938bd0d21eb91 +assets/assets/imgs/camiseta_de_manga_larga.webp,1682444681116,9f8f52006674255e87ed31690a9969780089c647fe3ef4c46f7978984a5697f0 +assets/assets/imgs/campera.webp,1682444681124,51ed1759e19feccd6b80af90f28610942a3dd9e2ccc0e0d8b44f8dbcabf2b63d +assets/assets/imgs/canario.webp,1682444681132,644a453e003b04a7ea157368194584ed871d66eabe515219114a837d51d6851c +assets/assets/imgs/cancha.webp,1682444681132,3b56ead4a93a9f99f096489ac8947ee6ed8089eb3c947670c068d83339440ec5 +assets/assets/imgs/canelones.webp,1682444681132,bb3554f773b2e67d5dcac8dc9d8f9a0f465442946886cf20c758565295e9f064 +assets/assets/imgs/cangrejo.webp,1682444681132,03edc6a2eb23631b1b1ede901a8ea32676b1d0bf12972a2dcffc40a21f6537d5 +assets/assets/imgs/capuchas.webp,1682444681108,fca86393fc41dc4b61ed649668e0f86e27d91ba5dc8378eaed5be559e9524b3b +assets/assets/imgs/capuchino.webp,1682444681104,ce8d4fbd5f286006e3f077f96593576d8c1178ca2c03333b4b192c0b0b4f5b2f +assets/assets/imgs/caracol.webp,1682444681124,2624019b69ffef2f784bae527b9f3093ebc3c75a5d38c0a7e394b1ab8d32735e +assets/assets/imgs/carniceria.webp,1682444681108,9da545f0e8c85dd3fff7cd2b1ffead5ab916797e38f95c7ac4bcd7f55435ae82 +assets/assets/imgs/carnicerias.webp,1682444681144,06788d0e06f3322f0b3d495a97bef78352a83d1aa38e52fca07ff2f6729e9751 +assets/assets/imgs/carnicero.webp,1682444681104,8b9bd07e5c061cec56b2f5fb303e5050a631698a5ac6074f1913d524ca0e7b76 +assets/assets/imgs/caro.webp,1682444681132,cb15113855332029f491765eb893462ee5866e82a1d1a936f8d6c1944cd95723 +assets/assets/imgs/castanas.webp,1682444681140,c2bc5c62e9c42b37458d6cb5fe7a28ee0fc690ebb280b39197d9eed03004bd9d +assets/assets/imgs/cebolla.webp,1682444681144,36b327baf2eb4ca2512c6fc22c91793fbc2ac2bcea6e060c59a0510e22eca3cb +assets/assets/imgs/celebracion.webp,1682444681144,7bf1a5d5cad3c9102152b8b882b2ddc9a169e5b2b3219806864b1c252638b160 +assets/assets/imgs/cerdo.webp,1682444681116,2621c709b378fcd75be85086c6acbe2c2901c897a74f480be421000b59f76517 +assets/assets/imgs/cerezas.webp,1682444681132,871c09b59b2250ce17768bf83f674764e915b8d45903f82ae0124740fa9c7c6f +assets/assets/imgs/cero.webp,1682444681144,79b40b93681816129eff9ad993fdd477a3293e36b78efe011de01b2549d5695a +assets/assets/imgs/cerrar.webp,1682444681132,af92fb2537a42f249bcdd4ab4f4220823d87899523475b5165b082f0aa86a987 +assets/assets/imgs/cerveza.webp,1682444681132,b888a05035881c61c7c0b46c7c5170a564bc27bcebaf7e42fa29c7467f5dc70d +assets/assets/imgs/checkjuego.webp,1682444681116,488d7e2bf039b5c6fa99bad0de1608552a06cb32aa4f946bd7caebe07f8c1018 +assets/assets/imgs/chimpance.webp,1682444681124,79e8a653bba894a1756683dd72d6e33840e5b6dfb00869306e65c4a911aba15b +assets/assets/imgs/chocolate.webp,1682444681108,b9e3402c6d57dcd8cc12b8cf7e0c0a663c5edce99e215816215953e58da25d78 +assets/assets/imgs/chorizo.webp,1682444681116,0331b8f24bf2e1d33735f75d8b1a532ced8cb3ddbde9646846a8aa6745c02b22 +assets/assets/imgs/chupetin.webp,1682444681108,33ab510599f3ee3ad98e593dcca66d48c71cf86bf7a4133a15aa8af70197128d +assets/assets/imgs/cinco.webp,1682444681116,d4050ade6d93adb211346f8fc9d147f4153ac4045bb4224bebd2652eeaef40b1 +assets/assets/imgs/cine.webp,1682444681108,aca73cbf10d5703f522cf16067aa079c69669a0bac1ade3c4d2feab4793137c0 +assets/assets/imgs/cinta_de_pelo.webp,1682444681124,7471bb5593bb471cb6d4f1753877f5df14f42860b4193502ab85643e3bd7dacf +assets/assets/imgs/ciruela.webp,1682444681124,e501c347f039ed74d726af5259068cb68a70e3d9b7f974b00034b95fafd31622 +assets/assets/imgs/ciudad.webp,1682444681108,8c2a4c32f2d060462891744b639251584c0da63a76410a010cd7d70956d23cd6 +assets/assets/imgs/claros.webp,1682444681132,fe37fde8d62f7c5d9d170f0d0be42483679468f0e2e07867afb86849f1ce7101 +assets/assets/imgs/clase_musica.webp,1682444681116,7602b8564e87a780a4dc9d8c9043ad520512642c2b1950337f3091055936f3f0 +assets/assets/imgs/clase_plastica.webp,1682444681144,27cc9d8b878b9f3d6e4253c5601602aba0392fd0e6ffc2db83804cf8c4e10f3c +assets/assets/imgs/cocacola.webp,1682444681108,77b7980bc6cb40955bb23f6fbe66eb91cb5e5f0ad256466b188bee68da317009 +assets/assets/imgs/coche.webp,1682444681108,a217176b2685043540fb7fd6368cc512d0e8b6100123a9b9ad5cda42a03be868 +assets/assets/imgs/coche_de_bomberos.webp,1682444681132,5dc48a0101ca070ecdcfeb40f0392ec3122e140cbac7324bb75d9eb76ca8ae63 +assets/assets/imgs/coche_de_carreras.webp,1682444681108,1a25643872ee6e077fd76f75395383af84e07c92df0ef1c6b9c587ebcae285dc +assets/assets/imgs/coche_de_juguete.webp,1682444681116,94df6270458577c3983e3f8ef1ad55ceea9a4bac9ffeeab7016ee5912f77b64e +assets/assets/imgs/cocina.webp,1682444681124,b78e31ffd66b7fad65de1931b0df98c7a6d28f27444a215477d598cc2d2d7e70 +assets/assets/imgs/cocinar.webp,1682444681116,5645f48735449a09276df24ebb4d04ef08d8fd06014b1f9e51018da9023b978b +assets/assets/imgs/cocinero.webp,1682444681132,5bedcff5094297673eed0dbc2f47794063d887600ef52ec8f99e062a60ae25bd +assets/assets/imgs/cocinita.webp,1682444681124,9ff155c860cdda79759fb362392bc351f742958aff34bc26093d3328bb8b9c50 +assets/assets/imgs/codo.webp,1682444681108,5cbbee302ed78f67ac9787242a71a430962078da25ecd2c99130ee8a389b54df +assets/assets/imgs/coger.webp,1682444681132,cfafb9edfea7cfe1d86a01fa03a2c7d8bb437b42e49e71b598ac32a4c89c629c +assets/assets/imgs/color_pregunta.webp,1682444681116,fcec6d1fbc629f74edf3f82d1b834869fab31b86355b9fe930ccdbebe42a9745 +assets/assets/imgs/comer.webp,1682444681132,f5ee997c0762c110baf229f487ff918a04ef2cde92fd7e9048c7c3f3501f81c0 +assets/assets/imgs/comer_un_bocadillo.webp,1682444681124,3173542be5e142a513129366c717e27d15f71ff24f846b0be5a00e376bd1b33f +assets/assets/imgs/cometa.webp,1682444681124,87b3942d4b5a326e2780a6dfb6d20bcb53152bc1d26d641f0d6831fa33f90114 +assets/assets/imgs/comida.webp,1682444681104,cf9c1b8b5b3d2da94c8982765fd44b1809e516f5b42daae1273e595d934ae359 +assets/assets/imgs/comidas.webp,1682444681108,29ff611651e653c3f2d8a9cd733ed4d9040a602b1529d144bf5aadb6b299291b +assets/assets/imgs/comidas2.webp,1682444681116,c38e82db90392c259beec8ccb6eac228d281c5bce4652c332832e9c36e7b5dd5 +assets/assets/imgs/como.webp,1682444681116,a11fea830aa0b8e5c82fbde5e22fd62c1cd1d29b1770cd7c43e6e409fa2c1f7d +assets/assets/imgs/comodo.webp,1682444681132,a7872b4b7af26824223c12330c7a736f2f2b3427d78ad71c8dd2c61171fa5386 +assets/assets/imgs/con_prep.webp,1682444681140,9a5c61f9eb4fbeb42846eb9f33acceb48e2361451f6f00626e6d50bba98d0ca9 +assets/assets/imgs/conceptos.webp,1682444681144,f6cef250b0cd9440b1d938897bf4585b134a6f4ab6c86966d4f495549d950200 +assets/assets/imgs/condimentos.webp,1682444681144,2c3c8489ca60a16627ed20a4098dd10749bc6320a7a4aabd1fd9f8fe32a9bed6 +assets/assets/imgs/conejo.webp,1682444681124,42fba96abba36c8893b3570c5d5887366dc868b2a44d341b8d094ca21eaabb4d +assets/assets/imgs/conjunciones.webp,1682444681132,e1d85da3e1a08c5ad504b477c15080100b5e7d02015c71b9af560492e9da757c +assets/assets/imgs/contra.webp,1682444681132,5c9a2626ac8076a336093c2d3b7d4b85e82b883865ef9fdd4ccc658ccab2387f +assets/assets/imgs/cordero.webp,1682444681140,b7df81e466b9a10607ea3b6e2f19fed509b31f2a097e78d01d6ee25c2344e873 +assets/assets/imgs/coro.webp,1682444681116,f40a3be0bf1df3e7d04872f5b0d632a573f7bdcc65a92226e931c01c1d47f04e +assets/assets/imgs/correr.webp,1682444681140,20b431d87fa270281c13c7bf6e5fb5e37ab86f8f0c9205e4748185ae3f62ab60 +assets/assets/imgs/cortar.webp,1682444681104,c4f3c99ba71a7614502d41dbf6279e8dd3029eced9428710649643d77bb4c859 +assets/assets/imgs/cual.webp,1682444681124,e5ad3cfe0bb52bc49fe6b1cd7efa4304f13234ca41498d32dc351ee4798df0df +assets/assets/imgs/cualquier.webp,1682444681124,594d58a76873ed59db7a8bc58178c962a1249ee91ffd481c1dd3976c1b8b253a +assets/assets/imgs/cuando.webp,1682444681124,804fd952635557fb9593ee0b334513659de95a623d941a9d8fc6e3c970178435 +assets/assets/imgs/cuantos.webp,1682444681108,a0e769a15d189a0ad9a19c6ca5c1892c585f9a07560edfd477412b8664f92525 +assets/assets/imgs/cuarto.webp,1682444681132,15f3b54f8dc8eaa0bba13f3f9e96306882286e8b23d2db58fc9e2cbcf8337069 +assets/assets/imgs/cuatro.webp,1682444681108,9d92a58e6dcd26c2da1a8d51cb1712d6fedfed013de0bd0191304cc535e6368d +assets/assets/imgs/cubos_apilables.webp,1682444681124,f939f7ad295445299dc19e7ee98383617584915c2af822ae215c36eebc4c867a +assets/assets/imgs/cuchara.webp,1682444681132,143fc8151f6bd41a04ec32ebc004651d3a5a1ccc66f4d405126c6e47ae682a9c +assets/assets/imgs/cuchillo.webp,1682444681108,3361b4962a28f08e6a89e13a89d2dfccba372df2443910bb4c478e1e337aa722 +assets/assets/imgs/cuello.webp,1682444681132,b5225209169612cef573df9d8e62d9eb608e18886bfd7ba91a2b51d372b42757 +assets/assets/imgs/cuento.webp,1682444681132,95b38e37153a9115f733de58e4a8d46b5558d35ae00b5cb5d4f00191df88fcfc +assets/assets/imgs/cumplimiento.webp,1682444681104,64f13bb687d3390829358fbdc286cf2ffa89ee00785f232938f2393e78c5c31d +assets/assets/imgs/curar.webp,1682444681124,b18ffae05172d81034a836717aa9a3f580aba5f2977ad642403fc9afeff5fde7 +assets/assets/imgs/damasco.webp,1682444681116,1c0a403e327cd9832aab10fb0813cd93a891137452b1357abab63c54f8879599 +assets/assets/imgs/de.webp,1682444681108,91d6692557c2dd9b1cb9f6a2dabe540f8efb27ce2e96f64f101530ff02712a10 +assets/assets/imgs/dedos.webp,1682444681144,4035a5b3ac04b3ee1c2ee03bd27a783699a791d98f7530b6ec305f0cfe2b8eff +assets/assets/imgs/del.webp,1682444681116,7190f0d1c23333153e2b58bea5b9fcddf0d9742a806588c1a8bee3d265306603 +assets/assets/imgs/desconocida.webp,1682444681124,66e1955dd361a2fc60c4055c97e4d6a57b5f9cd73edfbac676368da41eee3764 +assets/assets/imgs/descripcion.webp,1682444681140,49f4b23544dc1a136acd5243a3c7bddfe8ab4b30e8a7bec6b421fb47c7c90eb0 +assets/assets/imgs/desde.webp,1682444681124,8c345a29a2bb9bf682e047b4d5ba3171923e92b7996f567c71812e4c0a26ced7 +assets/assets/imgs/despeinada.webp,1682444681140,e8084a0c57e06d4ca9f9cc76468ec02eed8581a26b75d39952ef91b7192c9590 +assets/assets/imgs/despeinado.webp,1682444681108,c95967e034bb644714a7ab977011e5b5bd9272d004c47998a5dc05e9405f870b +assets/assets/imgs/despues.webp,1682444681124,41371d12891e51c1b5ebeebd283b93afde69fd77dc6453c04c8b8957deb52ef2 +assets/assets/imgs/diez.webp,1682444681132,6e829b7954752f65f35f8e19597d82b422a72a0a170ec66235de45eb7f42b0f2 +assets/assets/imgs/discoteca.webp,1682444681108,2527f5463fbb79e9f79ad81aed1710ac8527723d2b5984cbec145b5455421775 +assets/assets/imgs/divertido.webp,1682444681116,61410336db56e4e415574660c3c17d3a9ae6f2b9ded9879d5dbf0f77d986f078 +assets/assets/imgs/dolores.webp,1682444681124,a152c941d89dd7dc930981068739eaa82e7e7eb667846a77cb8f124a2752c93e +assets/assets/imgs/donde.webp,1682444681144,ea5611e4b15b9599ac4e87d08e0f6eed6f4bef4e9bdc32e5d4eb28f7fbbfb2a2 +assets/assets/imgs/dorado.webp,1682444681116,4fb7abf689ff69ff76f13e2f0c1978015cc542fe9321f99322e8ece1bf329939 +assets/assets/imgs/dos.webp,1682444681144,4b3bafba7ece91badc9e963cc5bad67dd9768d6a2a6b0be71d8412e6da55ff9d +assets/assets/imgs/durante.webp,1682444681132,335a49930d152d25a46e4eb8ad45a607b2aabdf7d5678e0d2906677c30309d9b +assets/assets/imgs/duro.webp,1682444681104,9d5797e2a98b02ec8824bbdc43390e735039d55469927d58972f41fdbfa9831e +assets/assets/imgs/e.webp,1682444681140,33e5e3b9cc90360b5173d7e237159f69476df8bff37289ab010f29b7998d8013 +assets/assets/imgs/el.webp,1682444681144,e2ac779cba9c08454f4e3dfdca0a4f7e00fa04aa1220afb05aa8f2f85114c4cb +assets/assets/imgs/en.webp,1682444681132,8662703c7ce365542784139008aa2368f1f8d0cd62435b54d431d5682ce3a15e +assets/assets/imgs/enamorado.webp,1682444681124,3bde4b2c8c160f28442b2c05e9457cc935d9e309d4c8d5398a3e2fa054666dfd +assets/assets/imgs/enamorados.webp,1682444681104,c33aed8251b0198765e26a03b779433526290a783b1a8dc4a841b313a4435698 +assets/assets/imgs/encender_la_television.webp,1682444681108,b984b5878145ca9d18acdf65574d58e46de24c0a7be5da66011efe858fb2845a +assets/assets/imgs/enfermo.webp,1682444681124,187a2a3b329b8b9a814219455d60695e324235989c077b21c912a55b1e2c941d +assets/assets/imgs/entero.webp,1682444681108,12133d27781c0807e547a71734d1a1e2d93d7179bd8b61ef1b10611273301817 +assets/assets/imgs/entrar.webp,1682444681116,3de4ce8901dd761a3536c986a5d58839248353fa0c15b71a564f5cd772d835c5 +assets/assets/imgs/entre.webp,1682444681116,398bc89a51597817c73e8b7f17cb7dd065ddd2b47c0be81ed49ff066bef8deb3 +assets/assets/imgs/equipaje.webp,1682444681104,ba39ae993f347eb7bdad5f8363eeccb56ce4c3841b338caf66edd96c57997286 +assets/assets/imgs/equipo.webp,1682444681116,7fb3fbda51c6dcfbe53bffa0b0ccd8bad5922e45ce14ce5300b5c3278663eb89 +assets/assets/imgs/esperar.webp,1682444681124,d55eca25d89872b7d60ac3e79afc4a6d9156c781980ee817226396140b47fe68 +assets/assets/imgs/estadio_de_futbol.webp,1682444681104,32d08d97981bdd5373928228bf9a446488f530409a2eb7db433a8366c3c9ac74 +assets/assets/imgs/estrenimiento.webp,1682444681116,f954032c33fd83b4dc32b8be98324b56e22565994f60a7aff0d7205d3e43c6ff +assets/assets/imgs/factura.webp,1682444681108,5fd9adc3d530c49d05bd0f015f7dbc18913d98d10d7832d04cbcd500faa4f56d +assets/assets/imgs/feliz.webp,1682444681132,157d0a00e8ee928698540e78a9b68486aacb534fcd7e745f451aa8c44328f5e8 +assets/assets/imgs/feo.webp,1682444681116,12743baab7f24fac6cc198fc67cc8a90e37c471fbe33fbea5442cc818a89439e +assets/assets/imgs/fila.webp,1682444681124,afd409fa2f00627891e158fda1edcb6a7fd4b3a030b5fc534d2c64e8c7e3aa04 +assets/assets/imgs/filete.webp,1682444681132,ec87ec43c16677a24ecb0b6ad14eed33be2fea6a3af400a89a7e6eee9b084fca +assets/assets/imgs/flan.webp,1682444681132,23e9af5a87053465c41ce3f43a46e2076aaff226d6afaff1a534608dcac80ddf +assets/assets/imgs/frambuesas.webp,1682444681108,57cd8543ab3697f72cd488edc6300d7c7f3067cf4f42a7b7c869f4f725fd1e89 +assets/assets/imgs/fresa.webp,1682444681116,8867bf57014bf427ca75d777d548f97b10d509073fb1e4f997b1696831a391b0 +assets/assets/imgs/frio.webp,1682444681124,4dab5ee19e075135610f774f75633398e099c4a2fce84f5e54d4e7877796c99c +assets/assets/imgs/frio_bebida.webp,1682444681132,010fa508919bd1c5f40a2585c552db03ca050e2f330880b8e2fa19db8bec1a61 +assets/assets/imgs/frio_cosa.webp,1682444681104,166dd127ab1fd3dc8079189e07dfe422a3286858208cca56f4b2db93d66a4138 +assets/assets/imgs/galletas.webp,1682444681116,b426bd31d7de07bff36ad545df53585640f6fb6c8bf24749cc1a389da5468e11 +assets/assets/imgs/gallo.webp,1682444681132,02c231e898ca9243f4b95b34308c95c4510ba87062e0915c61972a7d9cec6029 +assets/assets/imgs/gato.webp,1682444681132,6e50e07ec5a15cf7d80effa842e14b53a7a534b810eaf21738407ed79a6648d3 +assets/assets/imgs/gelatina.webp,1682444681124,3f33f04748135ea71f63d825f23777cef1e091aceb2d54cc9c1cd69446e37fac +assets/assets/imgs/globos.webp,1682444681104,d874ec632eb910353d8cabcb01d4568e26827a56730c251ea337ca8a5d8a6b56 +assets/assets/imgs/gorro.webp,1682444681116,885157ad3eafe459af533d842ef47bb65a4f7f79d45a789361d801151b1e945f +assets/assets/imgs/gracioso.webp,1682444681140,99ef1745c77b453310988f41482a3015f38292b0819cbb5b2d66e480783f54c9 +assets/assets/imgs/grillo.webp,1682444681132,6af02ce6d3d55f87be8d9a9be9473e462ffe44f36ba42c22d39a60c80ebb6f27 +assets/assets/imgs/grupo_fondo.webp,1682444681104,cc7f9fff28110b537f7eb314a544afda0bdf59034df3051b19259e02178f1507 +assets/assets/imgs/guitarra.webp,1682444681132,cd6dfb0ba17aded76661bda3179348cdf78643e1b76bbbc1df04734b7ef6c1b0 +assets/assets/imgs/gustar.webp,1682444681132,4bafade56d98404eb7f94b7f2e500f5881d469653b8f448259c77d42b3acf8da +assets/assets/imgs/hacer_el_amor.webp,1682444681132,2fade187c3758e2c9e2d8444ddd2c17d4ee197d716bfcaef6b87abbdb18cca2f +assets/assets/imgs/hacia.webp,1682444681132,dcfaa0b66875da950d1829c2a72001382377fc4c68a12904719ff55dbbc87037 +assets/assets/imgs/hamburguesa.webp,1682444681116,3b8923af5c06caa9920d8cba74524ae495a07fe64f66f1ed31896fd00fc0301c +assets/assets/imgs/hamburgueseria.webp,1682444681124,382aeca349f800e8d3fe068ec829e28d4e0b65e279a0cc2bf7d7ed21816076ec +assets/assets/imgs/hasta.webp,1682444681108,341b7768d8caa3bb19f5982542f8bc03e63df9e278ad6de33ec195fccee70404 +assets/assets/imgs/hermana.webp,1682444681108,f228f6262ff8c7b6436017e73d541d776e6442e2535d51ac08a3ba619f0ea1d7 +assets/assets/imgs/higiene_personal.webp,1682444681132,ae2d1ea97537a3ea070d9baac1692e2dc213b729ab2b4d4cf5f071a035daa62a +assets/assets/imgs/hola_palito.webp,1682444681108,c669ca0b800bf6c3dece43f255b4d30f7c097d2b7f4b62f7db5cce9e71e33261 +assets/assets/imgs/hombre.webp,1682444681116,052998213acbb73c3b8bae7b247265d7a78727cfd65121ca4db9c8971b49a604 +assets/assets/imgs/hombro.webp,1682444681140,6c13ca5bf037bfd0c919a4d27a4a456366d3c44adfc8b490964056ad8c1019af +assets/assets/imgs/horno.webp,1682444681132,5aa6e28b836f62f1521f71e22eb72e8f724150d91f5d13098c17af946b8269ba +assets/assets/imgs/hospital.webp,1682444681124,680255c51c4df040a2da02b61d49a52c4736541cb39697e82fe65e8941c035e5 +assets/assets/imgs/hotel.webp,1682444681104,b02dc3029ed9b04960855d8c2c7206da7b04fb4497eadb91c79be662e4f842d3 +assets/assets/imgs/huesos.webp,1682444681116,e27773bac910d8cfda432673b8eab7ca26e5586bef87bdbd4b95c4c096c12abf +assets/assets/imgs/huevo_duro.webp,1682444681108,aae5d39cbf3b97e2bef1e1cfb04217c15dadb41e5682ec3b3592d6e960b1ee48 +assets/assets/imgs/huevo_frito.webp,1682444681108,f958bc6cc7226082a98caddd7b5f3a6d642bc7362ec002c6da58025dd79a0c27 +assets/assets/imgs/husmear.webp,1682444681116,8236c5748d59846ddd51f8600dfaee35828b29ed820e5d5ba349ff5a86579fca +assets/assets/imgs/ic_abuelo.webp,1682444681108,444818029eac4ec1c68000a2f5a740b5144b06a1dcab9205c73e380837f8e8c0 +assets/assets/imgs/ic_aburrido.webp,1682444681144,14413151c06b2eb7fd9a75e83abc2aa9855ff9e0932adf45f5ba58cdefe1efbf +assets/assets/imgs/ic_aca.webp,1682444681124,62d0bfd2f868dd88c98a720785f7e6cee31f3fa866beb066ec95c51d076fa5bf +assets/assets/imgs/ic_acciones_futbol.webp,1682444681140,50e4c67a8a27bab7c3b2b8480eedeed638edf37248e1fc8d5695992776619838 +assets/assets/imgs/ic_acompanar.webp,1682444681108,bb01f59ec6c6cfd7def7ea10e7c5a1b01c58363731b7320c7c1f114aaeae4cb5 +assets/assets/imgs/ic_action_borrar.webp,1682444681124,6b6c14c36a818a7ddc089c35bd9e01c6b0a29a7b922d7de373c0b883a5e80c51 +assets/assets/imgs/ic_action_overflow.webp,1682444681132,2d4caf1cb131de24b5e1e34b41ed2cef2d5a754c94c488dd6318af554686f4b3 +assets/assets/imgs/ic_action_previous.webp,1682444681144,54bf6905e3067a0b05ca670da1cbd63b71bc15cab94b6027261c6abaab247e61 +assets/assets/imgs/ic_action_refresh.webp,1682444681116,603446a447e8bc52b71f27afe6f720fb7a4ba5528b777e7e0e16274d303d33d3 +assets/assets/imgs/ic_action_share.webp,1682444681144,a3669f1d60765390fae5cc13f2638dcea0bcf40451c50527ffbbbf829b009240 +assets/assets/imgs/ic_action_volume_muted.webp,1682444681116,96887c976c3ec5c92bb272cdbcbf2fd2985de4ce3ee6accb3ccbe718b3d233a2 +assets/assets/imgs/ic_actividad.webp,1682444681104,20ca35cd888260762f255fc2c0b798916753e4e7f0de7d67a2e7aed2e62d53a3 +assets/assets/imgs/ic_adios.webp,1682444681108,7a446ff8d44e6efc7a2b04da55b9068fae753b8c53352b7ca53359aa4bba0ac9 +assets/assets/imgs/ic_agenda.webp,1682444681132,d63c0e7cd2e230f749c3c5a93722910deebb6719f14e57112a9ca1bddc1a5d11 +assets/assets/imgs/ic_agregar.webp,1682444681124,e55db373b0c2e9761751ae30451f0b00a550b971feba590ad6b728759e9502f5 +assets/assets/imgs/ic_agregar_nuevo.webp,1682444681124,4db64570ce99320c5474256831a8bf17d1206d77a6abb32797c86abb03f1209b +assets/assets/imgs/ic_agregar_viejo.webp,1682444681104,bec5c3644c373d162e94e43873481a38550bda42e5790c0d4960346c6209f1e7 +assets/assets/imgs/ic_album_fotografico.webp,1682444681108,ac8aa74adb0cc6c119ab3cae80d1ed9521f620c7f28b7923f9288e8349d969ef +assets/assets/imgs/ic_alla.webp,1682444681108,8c0a092a16d802c61942b6176a920a2d726fdd38830b8b4ded211adad49ab024 +assets/assets/imgs/ic_almuerzo.webp,1682444681116,9f85451fdfb8cd94ad38b3c18176a11fe303c33b3c598c160278820f2dd7f888 +assets/assets/imgs/ic_amarillo.webp,1682444681116,7a0175fb8ffb69baf222f87fe6752e6d733dc1febdd22c69c1f10fdf75bdde50 +assets/assets/imgs/ic_amigos.webp,1682444681108,015f4603921b30ff43b60762c0f719660e213d8715a9ad779cc9c2f6aace60f3 +assets/assets/imgs/ic_apagar_television.webp,1682444681124,cedf446de62f4b0b7428290f580c10c631fda0b80a58a2f9d0ed63209d7f1833 +assets/assets/imgs/ic_asearme.webp,1682444681124,f8d0af3e971dd4731fe6618fb0719cfe447f388627bce0b4bfc189acc50f32b6 +assets/assets/imgs/ic_atrasblanco.webp,1682444681108,59f56780c5c470a27780c4912a4795d123a70e9a79d5719fd79ae2f8bd81efe3 +assets/assets/imgs/ic_audio.webp,1682444681108,5e0bc2e5328c82fd247e5b403b7fecff4900e1d888066254e2e4146ab78e4dba +assets/assets/imgs/ic_ayuda.webp,1682444681116,e405849e22f47d98916ac0c00aa9e39f8ed8b2cf9c4dd6a133aa432ef171bb51 +assets/assets/imgs/ic_azul.webp,1682444681140,d6039df4654ccb4e8b80494b6441d6b0cc7a02c96387e7a7c2b4c006accb7c02 +assets/assets/imgs/ic_balanza.webp,1682444681132,de27b25bafe3de9fb5ea5b9d51bb475004b636d95a62917475772a03a2233ba2 +assets/assets/imgs/ic_bebida.webp,1682444681108,411ba5dd86f7df8be6e738fff9a23f7f9359a7612ada739e8d43debbb716b7be +assets/assets/imgs/ic_bien.webp,1682444681124,88bbe62b8fa4441c6665ebb3b41995f75e88697e253e6821631db81a7808b60d +assets/assets/imgs/ic_billetera.webp,1682444681132,03001afc59993d40e4249d7702e8718fd61a5e95665aff703c8ab4bf3eea7d1b +assets/assets/imgs/ic_blanco.webp,1682444681140,acbea83bf0533e66dc8a83059d83125c64b2cfe5967ee81114d148d29c07dbd8 +assets/assets/imgs/ic_borrar.webp,1682444681116,7be3809439557b1552dd3dac60fb0d14b704d1d34ff02f672e7155e0ee222121 +assets/assets/imgs/ic_buenas_noches.webp,1682444681132,46d9fa824d723b53888e29405f671a00cc7d52ea13ade360432e36b35968d751 +assets/assets/imgs/ic_buenas_tardes.webp,1682444681132,0a9864198a903ec098617c7c181c624ba906dd7e3ffb6daa68597370a4183cef +assets/assets/imgs/ic_buenos_dias.webp,1682444681132,b74cf75ee529b5a51924cc3a41627bc8b32c8a384d01905dae81e52752e82663 +assets/assets/imgs/ic_buscar.webp,1682444681104,dcf7fcc634a3a1d547958ac3ab58e4a1a7955ccef6f2fe1ccb93e6e7e557d995 +assets/assets/imgs/ic_calor.webp,1682444681132,75d517ebfc38607eab05fadd3b4d21678e4ec49dd55379cd6b4e87a132eea8bd +assets/assets/imgs/ic_caluroso.webp,1682444681116,75d517ebfc38607eab05fadd3b4d21678e4ec49dd55379cd6b4e87a132eea8bd +assets/assets/imgs/ic_cambiar.webp,1682444681108,ba61fa8ec1ee294ed0560efbe92ab5713d5b47a01d23b3e48db6b9a207d01a9f +assets/assets/imgs/ic_cambiar_canal.webp,1682444681104,797ffdafbbe560297c4237e105991514f3ea73d7871d22e8aa5f144adfeb444c +assets/assets/imgs/ic_cambiarpanal.webp,1682444681108,94e380ba6e55b0da63945fdc9643d749e5dc5e7c6c91b0c222c15cb0f2409db1 +assets/assets/imgs/ic_cambiarropa.webp,1682444681144,44903402838dbb675b6dc344a06dde6ba7376918917302256afc606c7c89d320 +assets/assets/imgs/ic_canal_deportes.webp,1682444681132,1613dc55f507f0a11fa4d697ca38bceba8f0057e7c383927968e66de1135f957 +assets/assets/imgs/ic_canal_dibujos_animados.webp,1682444681124,6982263b6df783ff9bccbf44a438166fd1a60b5ff96a3a8439a3de7032652d32 +assets/assets/imgs/ic_canal_noticiero.webp,1682444681116,b2ac01e84e52240371c214220473cf0bd242432901ce71a1f1750995abe1ada2 +assets/assets/imgs/ic_canales.webp,1682444681140,43984337250cf008df01c4bdb0acb04ab1d51b36f0cf2ebd08649b11540d74c0 +assets/assets/imgs/ic_cansado.webp,1682444681124,ea75192d9cdc965ef1a8dbc8cb2edf79c01799def7e0227495a20117fa7c5279 +assets/assets/imgs/ic_cantar.webp,1682444681132,1de7beaebeed1cea426bf9c38686a25a47fcb68d2e66aba70142bcf9816a78dd +assets/assets/imgs/ic_cantidad.webp,1682444681124,36042f280d7afed18160c25bbacb993299005322eff0b7a64df58b6bde5fe3a4 +assets/assets/imgs/ic_cartuchera.webp,1682444681124,57151ce2a6fef4b2348ba7730b5e80a420b922f6f3da96d9650ef8670f952ccb +assets/assets/imgs/ic_casa.webp,1682444681140,ccb11c68f61d9a6f717128d430bea6a923d35f205cc66a8f3cad19a03ddedb4e +assets/assets/imgs/ic_cena.webp,1682444681104,f58b395ef4795444f674274e5fd2188ee828b336b03e382cd67576a20b9f8b75 +assets/assets/imgs/ic_cepillar.webp,1682444681116,b239dc2a06f279978f3eb25e8c9fdaa7d79bd258e8a8ed2efd8b4b87b37c89f1 +assets/assets/imgs/ic_champu.webp,1682444681124,9b4f9dbc15201197cdbefbbedf3b0dd342351f851aff443a3a8f58bd66c61715 +assets/assets/imgs/ic_chicos.webp,1682444681132,1ec6da670ae1ca18d33103f5c8b5c95396ef6c7501aac1c918f1c1972113ed49 +assets/assets/imgs/ic_cine.webp,1682444681116,aca73cbf10d5703f522cf16067aa079c69669a0bac1ade3c4d2feab4793137c0 +assets/assets/imgs/ic_clases.webp,1682444681124,20ab8bf91fffad45e86df709afd3dcf10fd023f59533dfde6cf5066fab2b5110 +assets/assets/imgs/ic_cloud_download_black_24dp.webp,1682444681116,23089a65edbdf6b434de2cc32ed0bbcced7107580ed3680af6eef746814577e2 +assets/assets/imgs/ic_colores.webp,1682444681108,3dd42563aae6db0189b9cfc05d1a482d06a474be9889a5e1595ce22e80676619 +assets/assets/imgs/ic_comedor.webp,1682444681116,346d3883676a2927454d4fcc2c235be43a1f68fa81dfd3ebef47471d9f4d49a2 +assets/assets/imgs/ic_comida.webp,1682444681124,063ecf29a67aa0107aa4b5c881ee98f347dfc4eea8d7aebd097c4ee0dc6cde79 +assets/assets/imgs/ic_como_estas.webp,1682444681132,a0b3fbd72b513a4dc43527fb4dd8ae10886f259adbf5cf60e93a39d59c8a1e84 +assets/assets/imgs/ic_comprar.webp,1682444681144,a771743b6cf0d26092f2470a4269a22b21bc3bea0645d3836841184382dbe764 +assets/assets/imgs/ic_computadora.webp,1682444681132,8bf605979f73464ddb20b8afae91aa39990bdb1ebc5422b6fe4920feeb2c0120 +assets/assets/imgs/ic_control_remoto.webp,1682444681124,08a7301b6284ff09619c3075b874d86b1ff52c178790d803e9adfebe33e673d0 +assets/assets/imgs/ic_controlar_television.webp,1682444681140,95eef7320dfbc81bccf7c44c887574ff02564841234bcda89ad3d93a875c0f26 +assets/assets/imgs/ic_corner.webp,1682444681132,0cd9b18c7da531ce28c122f9c0840bed81976c14d6b0e32186a1551d92dae8d6 +assets/assets/imgs/ic_cosmeticos.webp,1682444681108,6da1023e7e11dcb64b6353ba23d70e0ae959cbed84624b56de95ef1291f5141b +assets/assets/imgs/ic_cuaderno.webp,1682444681116,0901ae5a1bff9688f7f66405dfb1caa8d9353d2a0bc0e20dc8872f17a39b1c19 +assets/assets/imgs/ic_cuarto.webp,1682444681116,e40df14a03eaefe7991c01f53a77c786e8504edfd772d2eb6c6fcb89f3b640c4 +assets/assets/imgs/ic_dar.webp,1682444681140,46c34f9fee1cfd108d8ee4e94e6edfd448a0647fd79e3015be8d9244a1eb750b +assets/assets/imgs/ic_de_nuevo.webp,1682444681108,cf939040b180bb81c903f068489e3754946f366a8541d604eab2c5574ab1af62 +assets/assets/imgs/ic_delete_white_24dp.webp,1682444681116,b00ca7a5baa6bc771db1ce8f2c03721100a8d6fb06cb044bb9c41d28a0e61357 +assets/assets/imgs/ic_desayuno.webp,1682444681132,974246213caa42589542e0ad87eb40f2656266eef90ec290445d4973aa0f5920 +assets/assets/imgs/ic_dibujar.webp,1682444681108,1e0b307a8b7a4ff8c0c4bb403c6884106661ee5c6ced51df6f0917372cf8e84a +assets/assets/imgs/ic_dibujos_animados.webp,1682444681116,6982263b6df783ff9bccbf44a438166fd1a60b5ff96a3a8439a3de7032652d32 +assets/assets/imgs/ic_digestivo.webp,1682444681116,6c8cd3d09c9a861eb9b95b96c067b20daf70c62ffc3cef5c2dd5329740d01ec8 +assets/assets/imgs/ic_dinero.webp,1682444681124,803c5dc8f611f180884a9514cb53f8a33e2e88909baec4a92f4fca29e26734cd +assets/assets/imgs/ic_disculpa.webp,1682444681104,da238c1ff742d4e896e0571fb0604663a16c2f89cfb9d488fe387be92fea6628 +assets/assets/imgs/ic_domingo.webp,1682444681140,a2e0179b2578e8f9b0c2ab3e991d274101818641750602967b033ffb0d6161f1 +assets/assets/imgs/ic_done_black_24dp.webp,1682444681124,ec996c7af432362fbd2294d418fba1c3b43ec3651dbfdf4c6ae07cc4a52325b7 +assets/assets/imgs/ic_done_white_24dp.webp,1682444681132,4c0e1208b1527c47e9242263b0fbc3195e9e7670292da488aabbde2a4b326f7f +assets/assets/imgs/ic_dulces.webp,1682444681104,2e33795d8c36e4730edffcc307936c34949d4d030e6c5aaaafc6a6d46f1438b8 +assets/assets/imgs/ic_emocion.webp,1682444681104,add811205249e46ef4f02cda922041887cd96cb2e173396d07b377f9d0bef663 +assets/assets/imgs/ic_emocion1.webp,1682444681132,157d0a00e8ee928698540e78a9b68486aacb534fcd7e745f451aa8c44328f5e8 +assets/assets/imgs/ic_emocion2.webp,1682444681132,e7a7b72002cebb9774b4e9a4990bd7dfccf7c92f0b39e8f4fd9414ee9ed00179 +assets/assets/imgs/ic_emocion_futbol.webp,1682444681132,e99d6650133a083c539f710909998db8ffb009ab8366a3b7ce935f2e279b1a90 +assets/assets/imgs/ic_enojado.webp,1682444681144,4f01bcc64749323825efc1c387e0e88a76dab34fcaf1f15b17564bf5558300af +assets/assets/imgs/ic_entrada.webp,1682444681140,6b37e56471cf062d63ad1355ff722b7adceac2b04ada18c55a7c886699269c5d +assets/assets/imgs/ic_entrenador.webp,1682444681108,ca9000b7d19e726c1ced087f0a7d9be6c94c82ab59863303972d5929746b8aeb +assets/assets/imgs/ic_escribir.webp,1682444681116,6ac84a8f2fc747e91cabcfd87e64f14e3a2426e667befa064b5a7a8282ee4b94 +assets/assets/imgs/ic_escuchar.webp,1682444681140,88eac393ab0742ef87365f458a3c48880625527e467d3eafc6a5f8b0af7e1654 +assets/assets/imgs/ic_escuchar_musica.webp,1682444681132,e8478786053541ac3211a92166d006f9efef2111f8adbb280a5923a1cc747597 +assets/assets/imgs/ic_escuela.webp,1682444681132,ec4bcd679a18b4d7460963bb98bae50a936222a17cdf988d962feaf3bb639ed4 +assets/assets/imgs/ic_espejo.webp,1682444681140,206d1abf879bef0cf8ee9eac3ceb78d5719ae8fe0025c3d28f19eb0a50e3cd3e +assets/assets/imgs/ic_esta_nevando.webp,1682444681124,5ed64bd5889b8fb637827645e239a38d2b9d48dfef17fba21f41f59d46247981 +assets/assets/imgs/ic_esta_nublado.webp,1682444681144,3bdfa2696678a93592247ef8b43f1efbce2df8770b8a6f8ff22debb31457c087 +assets/assets/imgs/ic_esta_soleado.webp,1682444681144,1a6fc0d0ae973b9f46c4ef4d0be2681fb37038dcefabc86ec4cec25a17d6502c +assets/assets/imgs/ic_estado.webp,1682444681140,7487c23737a845908776509a8dfb2f38a1a19c31920619b7472fec6f7bb36f69 +assets/assets/imgs/ic_estoy.webp,1682444681132,48e25ea67f6de95557dc5daf57fc5c6762d3305b963e27e79d5514efd268db4a +assets/assets/imgs/ic_estoy_bien.webp,1682444681124,9782ac901d45eec5acf9f13fb87e0df8968d5c7efa51af53ae02eb4c6a005d6e +assets/assets/imgs/ic_estoy_mal.webp,1682444681124,6c079053de570fff8ecbcbdefef423971b3eb36aa73043aa7283d08fd8dad2e9 +assets/assets/imgs/ic_estoy_masomenos.webp,1682444681124,4690e35643b1e51a3ec137a3d1f820a4eef4c5c438aff4dae80f62b017485151 +assets/assets/imgs/ic_familia.webp,1682444681132,93945fcf2fafd0a6bdf65f59775cd18bd628c298c2202210768f46aebd41a3b1 +assets/assets/imgs/ic_farmacia.webp,1682444681132,44ca3c252ca243085fc134e3db114dbe3ceafd67ac9906c0267976741ebb9dd5 +assets/assets/imgs/ic_favoritos.webp,1682444681144,c790baaefa5c5071fe20ba38a79a11765e4986a9414aeec9ee008a2dadc77ce6 +assets/assets/imgs/ic_feliz.webp,1682444681124,157d0a00e8ee928698540e78a9b68486aacb534fcd7e745f451aa8c44328f5e8 +assets/assets/imgs/ic_flauta.webp,1682444681140,3317f2d7530bc06dcad31bd8a08d3c3035c2328cc5f87370deeacf325cdd39f7 +assets/assets/imgs/ic_fondoactionbar.webp,1682444681144,1d9dc4ee1b16e758e6a99baa226e64f555953dddd58471f7d630804d64d9f2e2 +assets/assets/imgs/ic_fondomaterial.webp,1682444681140,66326ee1f0b7bdd2f08e8f4eeb2efcc09119606e57e54671892f3caae0e5dbe1 +assets/assets/imgs/ic_fotos.webp,1682444681104,bff813d4cde60ef314f57f18e943f61ebb1fef2a54c96193237103957431d3cd +assets/assets/imgs/ic_frio.webp,1682444681144,4dab5ee19e075135610f774f75633398e099c4a2fce84f5e54d4e7877796c99c +assets/assets/imgs/ic_futbol.webp,1682444681124,00395d9ebc383809f41a107147e53466fb45a919f1ac1ecfc8ee062258422b92 +assets/assets/imgs/ic_futbolista.webp,1682444681124,07eaa08eb6f291ca4b332da2aa1d5c318f91f8ea49bbbe9808f79daa348301eb +assets/assets/imgs/ic_ganar.webp,1682444681124,7f1de39c58f03cc6f61710b69f0d299235c07b5952127e837fc709ff028c87aa +assets/assets/imgs/ic_genial.webp,1682444681132,8c55dce31c08729f66ab44497660ae0dd78d071aee656df845c2ae39af03d3f7 +assets/assets/imgs/ic_gol.webp,1682444681140,dddb64e51b7a9869935c5b46fe45f0c0d5808146e5059e1a94ea5d78b8f9e354 +assets/assets/imgs/ic_goma.webp,1682444681104,b33e42ecd49e632a3f24ee50524e3270da8347f6744717a90814c2979e08482c +assets/assets/imgs/ic_gracias.webp,1682444681144,2dd7c2bee04c0cd96f11a7db9591b602113559b7baef4165154a8f6878fb3b36 +assets/assets/imgs/ic_grande.webp,1682444681124,c15f1e5045bf4f83de54786d9f2c657050e204d7b081d51c348345e7dca0b65b +assets/assets/imgs/ic_gris.webp,1682444681108,cd6ea76fb8947c71a847cbd0317f1df60c6f7a38a15fec16d7f1f161bdd3f4d8 +assets/assets/imgs/ic_grupos.webp,1682444681144,31b6516df8961967bc97361b0429c5b2140503cd44657a232f3c6312c66d30bb +assets/assets/imgs/ic_guitarra.webp,1682444681124,cd6dfb0ba17aded76661bda3179348cdf78643e1b76bbbc1df04734b7ef6c1b0 +assets/assets/imgs/ic_hablar.webp,1682444681104,651c2a1be77a3bbbcb26084573342f4b7429486fcdb096a1e7b8da4efc7d5919 +assets/assets/imgs/ic_hacer_fotos.webp,1682444681116,274e8f176715ad138ac9b11470d400edd38a9090a1a8ab4f55a67a02f8b8f518 +assets/assets/imgs/ic_hacerpis.webp,1682444681144,0bbaf67013943330bbf73978688616c25ac105f76ddda2ed4b37a82b15b1ea84 +assets/assets/imgs/ic_haciendo.webp,1682444681144,4f40c9a3b35c21526f71bbd22dacf00d5bc1423b2e918351f1380cdaa88ebeb8 +assets/assets/imgs/ic_hambre.webp,1682444681116,0b35a82806e00bbda2dca65cffa23557b7e52c5d22c8c8774435728dbee6ceb3 +assets/assets/imgs/ic_help_outline_white_24dp.webp,1682444681108,01527425fed9b99e193a4d10570803f42a2c7d1bc8b2b2fc9c686d815164f6ab +assets/assets/imgs/ic_hermano.webp,1682444681116,8243c4b386a70225a0448c5905d74c76a3b5272036cfc1d375a489faee56ef07 +assets/assets/imgs/ic_hija.webp,1682444681144,3c693817602749fe038743254500d99590499c2b05b7f19af34744a2c0e92be8 +assets/assets/imgs/ic_hijo.webp,1682444681132,efe40a3aad6cc2327b30d87c567576542dc90abee2226f71e168f2af86f6417b +assets/assets/imgs/ic_hola.webp,1682444681144,a3a64f4c6f2ac8e204a6cffabbb65603ff9f4af9709ea6438c32cf05594e7cf6 +assets/assets/imgs/ic_hombre.webp,1682444681140,052998213acbb73c3b8bae7b247265d7a78727cfd65121ca4db9c8971b49a604 +assets/assets/imgs/ic_instrumento.webp,1682444681132,56ee6e04f0705816faaa8e8e50126f65552f179a35611c30d614ba029c6fc9ea +assets/assets/imgs/ic_jabon.webp,1682444681132,a78e892c1a1b21f6d2f3f375eea216423e000e6ae6fcefad3f2b7418525e40d0 +assets/assets/imgs/ic_jueves.webp,1682444681116,b898a1fd67ba027c9468f9773643b9a25083ce8f04f82ce71758bc44f0aa67a2 +assets/assets/imgs/ic_jugar.webp,1682444681116,1370575c080feb680810439b827cf54453cf16227a369a2b44057af1a9764451 +assets/assets/imgs/ic_lapices_de_colores.webp,1682444681124,835799b399ab02c585ef882cd1d8745287cbdf4a9a474d151f95f26f8102ce5c +assets/assets/imgs/ic_launcher_web.webp,1682444681132,ce66b8e09a9ab78fb13618de157a2941d0e54853c9a9b89eaccc089cf1d9ada1 +assets/assets/imgs/ic_lavamano.webp,1682444681104,82455c2e3f59ea1b90a4299bad1747fe7edd7fde2859e2d09bf295c039adce31 +assets/assets/imgs/ic_llamaralguien.webp,1682444681124,f8a618b717f14dc8f88e5c7192a3f56fde3161692b61666376755c8c7c19baf5 +assets/assets/imgs/ic_llueve.webp,1682444681144,b34d5afda1e96ed3c2d670fe6bdb5141efe9655e41ff59b03738784f4d9915e3 +assets/assets/imgs/ic_loco.webp,1682444681132,3149145f9d2b37c42227606fea696c545eb51e096f76d8b4eb49374bd041deb8 +assets/assets/imgs/ic_lugarbanio.webp,1682444681144,36d1c4169c14c5a2e761257589b1804bf46d5966f974e25c86ee172c392cf739 +assets/assets/imgs/ic_lugarpropio.webp,1682444681104,14ef897a967a6371ba4e17a813d1588fa487cb5a7d824d96fcf47a83b6cd8b59 +assets/assets/imgs/ic_lunes.webp,1682444681104,da9a4822f39207ad21e634b75caaa606ac3e4731d73a63e52209c5e56e769ef8 +assets/assets/imgs/ic_maestra.webp,1682444681144,0bf6f71fe0b7c4da99bb23e9e39f7527106676a8b9edbb65c156c31c42600cf4 +assets/assets/imgs/ic_mal.webp,1682444681132,b8a9f8b9e106373c70a78665b97beb14dc78bb2c1ddd238c8e46a00fb0a89586 +assets/assets/imgs/ic_mama.webp,1682444681108,d3d4194adfe6582db0d71f84b571f7e9e93ccc8fac6cdf70e3192b491679a34a +assets/assets/imgs/ic_maquillaje.webp,1682444681116,25900fe65ad480e40e31b30e22462e1613cb8420047d28292c6673e56b83bc0b +assets/assets/imgs/ic_maracas.webp,1682444681116,bcc9bd4c24f755a5eb8cd1875f1a05ec53862b43a83425f381784ef180f7ba5a +assets/assets/imgs/ic_martes.webp,1682444681144,e2b5cd3aef0ab9a04e1118ef19a5e19df7f34eb855419a11fe5dcb5a5e06d0f3 +assets/assets/imgs/ic_mas_canales.webp,1682444681116,799e2fef7f61f70dab9cff3c5ab381f6d1f7553d00de089b445e3027796e3c62 +assets/assets/imgs/ic_mas_pictogramas.webp,1682444681116,cae70dceecf3c8dc3632d52810c2a8f46f3d9c7819258b294dc8d92186bf3a4b +assets/assets/imgs/ic_mas_pictos.webp,1682444681124,f9eb88eadaba2cb9640cb1951ad2e125c57e13186e44df768aae69a13f6a6ae9 +assets/assets/imgs/ic_mediano.webp,1682444681144,a976ff32d5446f03a34483bfcd833ad6c4d9f9f4c273852f786c491767bfaae8 +assets/assets/imgs/ic_medicamento.webp,1682444681140,baa8fe53944586136e928135a98110f968256a774d38e8f9e6eb2a8abefa83f6 +assets/assets/imgs/ic_medicamentos.webp,1682444681116,f61f27bd17de546264aa58f40f3aafaac7021e0ef69c17f6b1b4cd7664a037ec +assets/assets/imgs/ic_medico.webp,1682444681124,a615e35795702c008c0a920d70fc7d8118ca49c377c22b903fce08081eb13d90 +assets/assets/imgs/ic_merendar.webp,1682444681132,fbfc099bbde386dc9eeb944606eca33aa0d0ee22e4b645bf9310540d67a4da6c +assets/assets/imgs/ic_merienda.webp,1682444681124,caad395bc24680cf2365185f3ea33a9be3d1588be1b64ac8ed2fa11276de84ad +assets/assets/imgs/ic_mi_familia.webp,1682444681144,93945fcf2fafd0a6bdf65f59775cd18bd628c298c2202210768f46aebd41a3b1 +assets/assets/imgs/ic_miercoles.webp,1682444681132,b8c665657dde243325cac3cbf7afcab0ce15c84c951a3e030a5aa6f23a004bb8 +assets/assets/imgs/ic_modifiers.webp,1682444681108,9ec434f7e3f6e87d4a7ba8870ac66b29e8c405b5cb4d99c8121091e92596300e +assets/assets/imgs/ic_more_vert_white_24dp.webp,1682444681108,e83163534055254ad3e983be298a952a0e7b9562a33ccb50370fbb601f1617ef +assets/assets/imgs/ic_mujer.webp,1682444681108,7407714bb0cbc6b87cb73434df4c7fa3133e005d8e8f49b32e3f2768459f146b +assets/assets/imgs/ic_musica_id.webp,1682444681104,8823c7c13c63c28752558b1e836e81948d9db17ab7a2dafdac92a4abbe1f3456 +assets/assets/imgs/ic_naranja.webp,1682444681116,8cbae0aba10a1d89b1a5b831453c9982ad84cbd550091ac68bc62aca2ee6b78c +assets/assets/imgs/ic_negro.webp,1682444681132,f8c6d9736f88ab709d01116bd97a69cab305a0ddce2764ff2fc0667ff06e77f3 +assets/assets/imgs/ic_nervioso.webp,1682444681132,18a8d7ec87e8b1750d4f95fec1927d066cb21a3c0a4e7b6c696dc5c547c4c4dc +assets/assets/imgs/ic_nieto.webp,1682444681132,0a4ba4a943f77a7b4eeaf925e72c62d7bdc6cea112668c87a4d1a47c5be04d7e +assets/assets/imgs/ic_no.webp,1682444681108,e6e29fac4733f6b8a53a701bdf61200f08f95a8ef605b0b46cbf4b40abaaff6b +assets/assets/imgs/ic_palomitas.webp,1682444681104,0e46ddfc21ebb1aa370a84b286c8ee1a47ce8f067bf15826746b4796257f87c2 +assets/assets/imgs/ic_papa.webp,1682444681108,945a1fa24f86ac3f53d42ee666380787bbcf77065fd8f5277940149401d5933e +assets/assets/imgs/ic_papel.webp,1682444681116,684b03aaaf8681e2456cb7a56c0ad66e8f2b89a74c6baf57e214281b827d397e +assets/assets/imgs/ic_partido.webp,1682444681104,b8b0ebe04e49244cf9a3038188695bb254c50ca6b83bf1b9333944882969b5e1 +assets/assets/imgs/ic_pasear.webp,1682444681108,ccc6fe735b3981ef788f9a3288811a2e317d9dda2d84e0c7bc97a2914aa7ba75 +assets/assets/imgs/ic_patio.webp,1682444681140,ef40ac6a8c5e010d6f9389964977af332ff8304640bc45ba7f5b09650f54456a +assets/assets/imgs/ic_pegamento.webp,1682444681108,d3d46c7aefd0f53d8ee8e726b980e7092fd0574541e489d36aff350431ddb5dc +assets/assets/imgs/ic_peinar.webp,1682444681132,e92d541bc28b5e1e340e1e2d8a7f6931cd0f2329dd4453662b92afa03e568d21 +assets/assets/imgs/ic_pelotas.webp,1682444681140,36c36c4c386ef5e473aeef0d4a491de8e4c6a6c3c93d09f04a9e0ee880c87b3c +assets/assets/imgs/ic_perder.webp,1682444681132,7ff30cf598ed8cf47fc1428ff45ad02714557518588aa0880771fb3b2ba48082 +assets/assets/imgs/ic_perfume.webp,1682444681116,ae2b918ce48abb6f295dad02461d2c8a42bbdb39a6beaf53a7bf1095058c3aba +assets/assets/imgs/ic_perro.webp,1682444681116,0daeab0fbaa31357dd3cd8843b1106fcc021387554ed32ee9e77761ad0dc5786 +assets/assets/imgs/ic_personas.webp,1682444681140,1b07dd680d4861ac5378d1cc8639029055c68f3d8646c45c3475d6dc63c597a7 +assets/assets/imgs/ic_piano.webp,1682444681124,85fd4445648bb891d4b6126b602cc9b079d5e9541bd0b3081bee1abebd16cf81 +assets/assets/imgs/ic_pictogramas.webp,1682444681140,71ddceea0d6fab7994ce5f2be93c8b4d2070b5142fcb597040521b67d619572f +assets/assets/imgs/ic_pincel.webp,1682444681116,bc752e07c82889201f588ceb11751c7f2a82cc344f80c24c2eddb754995343ca +assets/assets/imgs/ic_pintar.webp,1682444681108,3bb26119936a5715d339cfd9ba5ebb3ef7dc328ed8f4dfd6b64916f71a96f5c5 +assets/assets/imgs/ic_pinturas_de_colores.webp,1682444681124,0c6f4ff6041cebd04712107cf60faf6a0c570515fcbc3205dd0a9b2b8e57bf89 +assets/assets/imgs/ic_pizarron.webp,1682444681132,ec268b669f75f04397db2af21f07f390d7debae495b49c8bc395b0f040ef5e7f +assets/assets/imgs/ic_plastica.webp,1682444681140,539da338415fde2f46bfac0eecdb90c1e27f943fa9962bc534840c7921bd4ee5 +assets/assets/imgs/ic_portero.webp,1682444681144,9ef2fbf4d4305c5e36b356ee4bd1400fce80d970210daf85cadd4687f4f72e7e +assets/assets/imgs/ic_posicion.webp,1682444681108,58e0f9857bd926ff4d4b189fe1862e2376dad950c378861223d20e1b3a7a42f3 +assets/assets/imgs/ic_precio.webp,1682444681116,11c26b109bde21bad5c0fbf97a096b69028e26140f176943dc099e50e8c1cc42 +assets/assets/imgs/ic_presentar.webp,1682444681116,1b9cf1c52d55fcf9ded0a770fcbecedcbecfcd0b9b34a59f8d34f0c554ce2616 +assets/assets/imgs/ic_queue.webp,1682444681132,97b63a3be83bba4ce92df60df9049ec9a7fbf9ecb13c36f6c37c9855b57ce66a +assets/assets/imgs/ic_quiero.webp,1682444681132,ec36c4cdb8ceb2e06a55160196f4e2ca43cb560b8f361c228b9df93647bff2d6 +assets/assets/imgs/ic_rechazar.webp,1682444681132,226f0f5ceb9ed72c2ccb93e1d7d6197784270caf0a2e450a31b5041be3e7ec93 +assets/assets/imgs/ic_recortar.webp,1682444681124,a3cf62402358c62d79d4b38afc30415559f79a15ccebed5a674d6ab71aeba8c2 +assets/assets/imgs/ic_refresh_white_24dp.webp,1682444681124,c2b97f9cf213ed94f26995905c5125d53612223b37ba4b1a124b988ebd0b45c0 +assets/assets/imgs/ic_remedio4.webp,1682444681104,6c8cd3d09c9a861eb9b95b96c067b20daf70c62ffc3cef5c2dd5329740d01ec8 +assets/assets/imgs/ic_reset.webp,1682444681104,3510f24555933337fb2601e3e854d413387cb151ebd0c0df50995f79c6d0f20e +assets/assets/imgs/ic_responder.webp,1682444681132,b77d62be97105789fbe63e7fc1e1405581baf069222853b3ee0fbcd9710bb222 +assets/assets/imgs/ic_revistas.webp,1682444681132,c53c59688bf9833e7309b05db65efc9bf45439ee9c319c5be3bfe19817715ed6 +assets/assets/imgs/ic_rojo.webp,1682444681132,2eabb955faf83890a1636a8776a5c1356fba8d1a98798cdb9ab3bea603af4796 +assets/assets/imgs/ic_rosa.webp,1682444681140,7a4068331def9c702bd171161d9a01667c7b9b451b4e1520c2ccecfdbb2785b8 +assets/assets/imgs/ic_sabado.webp,1682444681144,67e2ec38c40bcc7884f8db60f1b5a21049e91f9aba0f9a2b08fbfa310283c123 +assets/assets/imgs/ic_salon_de_actos.webp,1682444681116,dbfd0ce2ff3ecdc1f8e135b337cb23d6577e6299633904c6a146dec99e238b02 +assets/assets/imgs/ic_search.webp,1682444681108,c3449d511348527793a78d55b0dd7c1c08153839742bfddc54735d48613193fd +assets/assets/imgs/ic_si.webp,1682444681132,3e0e7cfe7f22d88e932cc4bbe40598e797193466f40944c3f5af1218a40282ee +assets/assets/imgs/ic_situacion.webp,1682444681116,85673d2e910a2f72e196a845c1f05ac5c96ee74420bdc5096067704a0966a7cd +assets/assets/imgs/ic_sort_alfabetico.webp,1682444681124,4e65f83d3358055bab0d46c21b73891e59f4b4294a3b415fa7ac5bf7c0154546 +assets/assets/imgs/ic_sort_decendente.webp,1682444681140,fdec7ddf30dc9f7b97e1072d7842113f898d827560a578fb16f2fc6a473db9af +assets/assets/imgs/ic_starred.webp,1682444681124,4b96e5b6ff00318b4d5e45fd28e9fbc28f35bf477c7d9e3a19fc137fee7ea534 +assets/assets/imgs/ic_suerte.webp,1682444681124,4ac22d433e354cf4bd2e5bb7f5b6b9fdbd3a63ea77bc936d7340406bbd2106b0 +assets/assets/imgs/ic_tablet.webp,1682444681132,5738331a95c439dd84b7d76547678160ba0997466dfd3d29e419fcfd0ce7ef45 +assets/assets/imgs/ic_tamanios.webp,1682444681132,cbc04bd6380da0c4a004cbfb0bca9ef07d8182d094ccd1edcd5fc257c18b3a0d +assets/assets/imgs/ic_tarjeta.webp,1682444681124,3bac06f8c07b36e047877a1d8b24e0aba1319a8585693d8c63a2773449a0fca6 +assets/assets/imgs/ic_televisor.webp,1682444681132,9b57399640f51faa1fa86719f831053310b30beb90854482b9b468e4d9091907 +assets/assets/imgs/ic_tengo.webp,1682444681116,272313247acc4e4572d4fdf95ffa43d656d234cd632fa55212c471f000dd8680 +assets/assets/imgs/ic_triste.webp,1682444681116,e7a7b72002cebb9774b4e9a4990bd7dfccf7c92f0b39e8f4fd9414ee9ed00179 +assets/assets/imgs/ic_tu.webp,1682444681124,b244b61c8f9cb886819bef0f3f8591a26b61ab211da711ae11f0d19a42d35720 +assets/assets/imgs/ic_undo_white_24dp.webp,1682444681104,534b1a328635fb3ce783a28d2da528286ebc6b947c801dfec022fdbb897878df +assets/assets/imgs/ic_ver.webp,1682444681140,70f76feb2bcebdbe6037a3e10adcc72272d98abd7f2918dcf639e4716adf4c28 +assets/assets/imgs/ic_ver_pelicula.webp,1682444681116,a06bce437cc57c81a660a41bf840761d88eb1b5bb6d0eb24b7cde44d4308f7d8 +assets/assets/imgs/ic_ver_television.webp,1682444681108,65ec584104c49521673541c035781a1d0a5afea3795cf62a24e2e80fba3c7b4d +assets/assets/imgs/ic_verde.webp,1682444681144,d95a37cb7793c7447c25f48a514b9231e60f076862701415666b0287da0a2e45 +assets/assets/imgs/ic_viernes.webp,1682444681132,86b9c6eb52e1fa2259fcd4c00f7a9ed7c98942ae8f659ef09b06b5ff09f00d42 +assets/assets/imgs/ic_violeta.webp,1682444681132,5b82f16e2d63cf93626ca3f774c3e1991b970e55635f30ca57295c854024a263 +assets/assets/imgs/ic_volume_off_white_24dp.webp,1682444681132,72b500fe7904f37b829420308241853a37f4491ff9ec7c952d2501224a8dd46f +assets/assets/imgs/ic_volume_up_white_24dp.webp,1682444681124,f5f5259569e301351a478fff839a10cfedbe856294db7159af6adee0dbcb6dcb +assets/assets/imgs/ic_volumen_menos.webp,1682444681104,06d07752354cbe6272775087cf7e5cc8e755b0235f5a5dbe3547cfdda7ebeb1c +assets/assets/imgs/ic_yo.webp,1682444681144,1ec876befc321a1c71bf3684c37eb4e4c8b4851346d70ad63ebee3c2a852b3e7 +assets/assets/imgs/ico_numbers_1.webp,1682444681140,7375af8e467daad74a3b59350f5fc488fa92c7f3deb29af2768465975ee4a602 +assets/assets/imgs/ico_numbers_2.webp,1682444681116,ed865eec66875e3e5d7edeec12169f96af919cb6a715e3f5bbed6f5d4bd4f5b2 +assets/assets/imgs/ico_numbers_3.webp,1682444681124,af5072a6e5b54b4b87885d44c3e85e8652632c70a940fefb9126672dab444297 +assets/assets/imgs/ico_numbers_4.webp,1682444681116,5934021f8965a4cb96afff139d3408648f0e6ebdf0345146aac13f0c591b780b +assets/assets/imgs/ico_numbers_5.webp,1682444681144,efbea38302a21ebad6cb5381fb9bbaafd63cdd81efd167cddd59d4b0fb43c94c +assets/assets/imgs/ico_numbers_6.webp,1682444681140,725556b381b4122bfc820d1996a1db589f6d95f7bd74f177ccbde0d556eabbec +assets/assets/imgs/icono_blanco.webp,1682444681108,ed9ffa0446fadbcef9a193413bf2d4fb791d33431a56ae2e7d07233e4aa6d6a5 +assets/assets/imgs/icono_blanco1.webp,1682444681116,9e500d0a5e7b5e4f573d6a95e8cf2256789b1fbcee90ed41f17218e1ee4df9a4 +assets/assets/imgs/icono_blanco2.webp,1682444681124,c79c99e4eb31edc73c3e57af0d1798fe8c620a5a96d8880dfa7b3a52016d94e6 +assets/assets/imgs/icono_ottaa.webp,1682444681124,ffaa46bd257819777cdbb3d973bf44c57465a52c936abb81bab39fbbaadb65a5 +assets/assets/imgs/instrumentos.webp,1682444681116,56ee6e04f0705816faaa8e8e50126f65552f179a35611c30d614ba029c6fc9ea +assets/assets/imgs/investigar.webp,1682444681144,d96a097765345d9b3b28069c2b08e196cdff2cabb2edb0025ea320574111d8d5 +assets/assets/imgs/ir.webp,1682444681108,baa74489d0261f649cebdc15417f25d7749182eacc1406279cabce9c4fe1e1f4 +assets/assets/imgs/irritado.webp,1682444681132,4f01bcc64749323825efc1c387e0e88a76dab34fcaf1f15b17564bf5558300af +assets/assets/imgs/jamon.webp,1682444681124,706635732f71aa73802e6442ca34fd81c1c2f471ad8311f6df697063747ce2af +assets/assets/imgs/jamon_de_york.webp,1682444681132,24a7b02fcd82be331d0146dd1500e02e3b860a6d3d84f80669a33bcc5cba5522 +assets/assets/imgs/jarabe.webp,1682444681132,d5a9d26f2a7216e5b9e64532833945bdde581d01b35ee5fa892ca627e8044a74 +assets/assets/imgs/jardin.webp,1682444681116,ec8eaecaa34aa619af57958994c9616e135d89b76698d4fdf1ec623efc865516 +assets/assets/imgs/jean.webp,1682444681116,4d5fc22dace5cbfc23d7e64f5120cd31c48755ae652e326bbdcfe8fab5e97ede +assets/assets/imgs/jirafa.webp,1682444681108,369223b063d9027b82c1a5e559bbca6289d4b1f2bf45b54518b18c57d7ca6819 +assets/assets/imgs/joven.webp,1682444681108,730fdaec3d7a91fa68917cc04c3a515428576ded9e2ca8280c6726d4eba4d989 +assets/assets/imgs/jugar_con_la_tablet.webp,1682444681124,a8d543b8020f0cc763f93616dbc237ed1ff6416ef01f269c3740220cde9f631d +assets/assets/imgs/juguetes.webp,1682444681104,4b3c06380518f2888449064e9186a9baf730d4ba61d34fede1c79841c7827047 +assets/assets/imgs/ketchup.webp,1682444681124,920b9a2d49f8e9b1d5eb75944023f4867c8f2d18d7a19790a0f2b7a3e8c0a30f +assets/assets/imgs/ladron.webp,1682444681140,37892e1c51d67f6517e4f04153845dbe417112062fcc3ec1a52552d71ca40c12 +assets/assets/imgs/lanzarse_al_agua.webp,1682444681132,104f5b9ab5259a1f2dbb1f110c3d87f1411aa164af7feb666b90873606dcec4b +assets/assets/imgs/lata_de_atun.webp,1682444681116,5d1acaf5f01f1c6c243ab020f4c4ac7e3ef3dd80dc82d43da31c83ae5f50c2d1 +assets/assets/imgs/lata_de_sardinas.webp,1682444681132,06658ee1228c9f7a3875d76494cb60d16c4b75029309f6ef59328b74fb7c0a48 +assets/assets/imgs/lateral.webp,1682444681116,467d9ed2fe3b1729d834f52de22f14646d9ee5740dd81271693590b2d5b4accb +assets/assets/imgs/leche.webp,1682444681140,13a18a86360da187cd37e6054616c99d9eeec940f419d313a90eb46cab70f584 +assets/assets/imgs/leche_con_cacao.webp,1682444681140,bcbad80191defc1bb3a97fdec43a7bc8560e3f97d450b6a3d571fb710751152a +assets/assets/imgs/leche_y_galletas.webp,1682444681108,cb09305fa99cf0541c5043047d0f120f5d60b4af31776637b5e8968a7725d7ef +assets/assets/imgs/lechuga.webp,1682444681116,c22106bf22b0cc4be6bf05fb7124a7ac9e064c96810930e474779ed8bde716be +assets/assets/imgs/leer.webp,1682444681108,b4cc64571a8773feb8a7d3da91ee6dc559927731093364015a40b6a6aeb625ea +assets/assets/imgs/lengua.webp,1682444681132,d26acbc97b02754a37119a591eb546279488f772e06f76d46d64572f4f6ef2ec +assets/assets/imgs/leon.webp,1682444681124,0b04dc69875c51f8c3869645db2f8c35901e48b77b051fbb42cc3dc657dd776b +assets/assets/imgs/libro.webp,1682444681124,cb60c5eb511e4bb7cd46bb9be746160fd5a29cd63fa1b02faddb27595a7d7fef +assets/assets/imgs/libro_almacen.webp,1682444681140,6c110f374fc84086765e5f74078e905f8a0b0eb02f7af2c93f7b7b273e85a3cd +assets/assets/imgs/libro_carnicero.webp,1682444681116,0ccfe315c5edad1638d243b7473ddac353687f1dfa2e5df0a2598e1b36f99e54 +assets/assets/imgs/libro_clases.webp,1682444681108,c13ff70766ee4b966267535158ba94ba281a7bcdc27968b9cdef49c01fe5bd54 +assets/assets/imgs/libro_comedor.webp,1682444681108,4cf51b77176be882d5045ae139767975f839aa46541603c02a85e0d9e62eb60b +assets/assets/imgs/libro_ocio_1.webp,1682444681124,d8ed0bde3ffc1adb3da0c5998d98911d322c4e148023ddf598aa5c1f60ea478c +assets/assets/imgs/libro_ocio_2.webp,1682444681144,bef5796571bed7efee0a5370ce3d01c04c8c8c1917501e9851c0271f5aaca7e1 +assets/assets/imgs/libro_salud.webp,1682444681108,9280be49576db931d7de17fd52710802c90d2736e05c99ec19d91248da0ea80b +assets/assets/imgs/libro_tiendas.webp,1682444681124,a2d9ab4687607a7c336c88b2513cf641c68132fa315a8d27c90c06bc595d9768 +assets/assets/imgs/libro_verduleria.webp,1682444681116,7a5cb39558eea851c4290d54de4f2215ecc09925a0d08024bf276c0e778fbb6f +assets/assets/imgs/libro_viaje.webp,1682444681140,c66b69b69cccfbbdfa4b93e07d58c5e664cc839086eadc9197b3869f3d0f8438 +assets/assets/imgs/licencia_accesibilidad.webp,1682444681140,517bdda8e3c1c943e33afa60025ff6a07355d2fb17d38b1cbcafd6ce83b69523 +assets/assets/imgs/licencia_games.webp,1682444681132,e4412d86f9b27cf1aa378d9d5b59267903eedf37acf52f810c22d3e46a06a5ac +assets/assets/imgs/licencia_informe.webp,1682444681144,3d5e4de5aa7e0e2d0bf7dc5ff73952cabf3eea3a157f37d93f130eee77141b33 +assets/assets/imgs/licencia_ubicacion.webp,1682444681104,d531f0c800280b59a7c2d94db273fed1dcdcdfe211f527e59b84a0e3b8a92c98 +assets/assets/imgs/lila.webp,1682444681116,14e1df83ca36112aff216e3951bec239f63ccab6c6cc4138d370631712577f22 +assets/assets/imgs/limpiar.webp,1682444681116,47f87f9e5bbb97eb6be83874e2f5d02178ce0cf76689be711408576a09abc305 +assets/assets/imgs/limpio.webp,1682444681116,9d842e83d93554eca783693abbd051aa62c0cf604aa518925a1fdcdc81556a97 +assets/assets/imgs/lindo.webp,1682444681124,af3c63d566d27cac379a0ffd44a672c4d6f78c4d22fc2827d266ad25da6128c9 +assets/assets/imgs/locked.webp,1682444681124,0ceec9a5e876c6e879f7fd6c9a8695c75f8945b413d0f78b9e074b604e6c4c5c +assets/assets/imgs/logo_ottaa.webp,1682444681108,afc4ccf4dfc00321b7ec0cd09948a24505a39a67ca04514a27e1d47108a415c1 +assets/assets/imgs/logo_ottaa_dev.webp,1682444681108,ed9ffa0446fadbcef9a193413bf2d4fb791d33431a56ae2e7d07233e4aa6d6a5 +assets/assets/imgs/lugares.webp,1682444681124,70786b0ee4b65809d0933e54cc459df3ff1cfa0e9fea2b105492f70d82d50f38 +assets/assets/imgs/maestro.webp,1682444681124,12d87bfe80f71a98e15e4479d9b8d66f91af3b8974b2f766921c54431b102b71 +assets/assets/imgs/maiz.webp,1682444681116,57f7345cacb156c2d18d3b367efce25028ba4960e4e34176e3e66de5855a33a5 +assets/assets/imgs/malo.webp,1682444681108,a58caeac76f1e618bb8fcfa715778ae30facb3c48278e939839bb44dbfedd73c +assets/assets/imgs/maltrato_fisico.webp,1682444681144,66af5970ae16e3b2ee5b6fb2200b9daadc8ee969fd81b7bef79c2bf950e76c38 +assets/assets/imgs/maltrato_verbal.webp,1682444681116,b1b97334e9b213f1b525da4cfa17345fd75305bdf3804a454920e54658dc9aa1 +assets/assets/imgs/maniana.webp,1682444681104,42e7310515b740fbd8e16759e91019e2c4a36afd833daaae7d5bb92dd7bc0d53 +assets/assets/imgs/mano.webp,1682444681124,76eefe740dbda48d4b16c73a24495b01f2d1d8629e38fa0526a58084034549ab +assets/assets/imgs/manteca.webp,1682444681124,f0787ae08e5b5db0d6750f0e65717ca5d116c988b13a6efb1a3c6e8dc7aada44 +assets/assets/imgs/manzana.webp,1682444681132,51423f349dab34470d531ac4b4a0f76fbcb6abe6e19f8fd51a6a8cad05214146 +assets/assets/imgs/mariposa.webp,1682444681116,c94b782add4994c8a73049c03a2c2a6d3562c24e3b2b67ae2f3f8916ebd710be +assets/assets/imgs/mas_picto.webp,1682444681140,a331c4409ba9c9fa0f00c69b7632c6479ce2bc345e1b1d63e1448ba468d6c675 +assets/assets/imgs/mayonesa.webp,1682444681124,1ad3781858c412c1758750b56914b90babd7f981a5cb90caa7eabd16945d56e9 +assets/assets/imgs/me_molesta_el_ruido.webp,1682444681116,d9d1527a6fe653990eb97fcf55051489316229e4bbd5319502f4aeb52addd22c +assets/assets/imgs/media.webp,1682444681132,7a572946c9e5a7fa3d373af219d0782c9cc3edd20a8f51fdab748342a1fd24b8 +assets/assets/imgs/melocoton.webp,1682444681132,d1a205d41da5f181554a9ebdc65f0b9419aaab326f115dd73b7b73168ecb8ba0 +assets/assets/imgs/mercado.webp,1682444681108,cbcc1cdd139f8327d7e2c0cf9177423bbe8a5fdbf7e9261c8d140b4bddcc7a9e +assets/assets/imgs/mesa.webp,1682444681116,a892ca03fef115536d768f87b7ea74ae2ff99e2fb7f03a52e347d1d2b5e1ca2d +assets/assets/imgs/metro.webp,1682444681144,a1bb293f2b4a1cf15e9c3939a43ece5c7a47e2a92bdf671208358c7d207e67a2 +assets/assets/imgs/mirar.webp,1682444681108,e5b301331df5c1eb68fa6cc00cc95f388edf12d8eda4aead767a7726e19036cc +assets/assets/imgs/mismo.webp,1682444681144,4bbe610c9a23ed10ff28653c054e2576dcca6e3408a70fdb3ed3edfafa19a1a2 +assets/assets/imgs/moco.webp,1682444681144,06c2f8aa41624f7507addda8a5fb8723c0d378b9ce9c8ea6fd8e0471aa68bb2c +assets/assets/imgs/molesto.webp,1682444681116,d9d1527a6fe653990eb97fcf55051489316229e4bbd5319502f4aeb52addd22c +assets/assets/imgs/mono.webp,1682444681140,caaac3bb33d711e1b82abb3cb01056adb6757eb8ce8cbc71d2f08f8dc0a1c4e7 +assets/assets/imgs/mucha.webp,1682444681140,b0877b41afc9229b205d51e6d1321d7e2392bc74e12f4630396928b8a66204b6 +assets/assets/imgs/mucho.webp,1682444681108,b0877b41afc9229b205d51e6d1321d7e2392bc74e12f4630396928b8a66204b6 +assets/assets/imgs/mujer.webp,1682444681144,7407714bb0cbc6b87cb73434df4c7fa3133e005d8e8f49b32e3f2768459f146b +assets/assets/imgs/muneco.webp,1682444681116,4a6a4ab01cc7681bc6fbd0e4a07cb9242f7185cc3aab7f65bafcc9641283e4ae +assets/assets/imgs/munieca.webp,1682444681108,8619acbafbc7cd4650b0877487f2b720e06135503eb60439eb8c0fcc3bdea8d1 +assets/assets/imgs/muslo_de_pollo.webp,1682444681132,30a9f8787e09ac97a17aa69453116f5267eabf1b9f240cebbe6dc72f8418f722 +assets/assets/imgs/nadar.webp,1682444681116,6763bcc82a9f58037b4ca3b0f1e0b808aa12faf4c5e61034f62dff88d3f9d9cb +assets/assets/imgs/nadie.webp,1682444681132,086184f1aa1f9c2b26445d3d84a0ea204d45f25029a3d83da89417dc423ed07b +assets/assets/imgs/nalgas.webp,1682444681124,d2d96438387299cb2a8de5918c90b32f0cb259631d42dd882c165b37bb2532c3 +assets/assets/imgs/naranja.webp,1682444681104,819c4263148cae19a236d4731d0f1bc83b537b050cadf233cb2014541e7cd775 +assets/assets/imgs/nariz.webp,1682444681104,62ccf9bdb75a07b5b68ac01745eede0ae5af3a8b546d6449d1a18e54ca380804 +assets/assets/imgs/natacion.webp,1682444681132,640e0705e1317bf22a8f2f1c93b68c300ef42c5cf12071723955cf33ff94975a +assets/assets/imgs/nebulizador.webp,1682444681144,56fdcd73348fd7d00da4fb665ee1bfb86ef0759a6ae4a59bb593a46b1393904b +assets/assets/imgs/nervioso.webp,1682444681108,18a8d7ec87e8b1750d4f95fec1927d066cb21a3c0a4e7b6c696dc5c547c4c4dc +assets/assets/imgs/nevera.webp,1682444681124,fff51a66e91808020e2aeef21fb0f8cbd545d290cc2b464365cfec9268e57953 +assets/assets/imgs/ni.webp,1682444681132,84256dcf4359dcfcd4036ec18eea59351db1a31f8e61b2c8db897f0a12cbf597 +assets/assets/imgs/nina.webp,1682444681132,3b299324561a4b4d7d6deaa72ed904cb7ac2c508eb51d0f29db76a9ecb03690e +assets/assets/imgs/ninguno.webp,1682444681116,ec1549075c1809ad517f6a96e7e58a7e5567f1206d1106b9b6c924dda343226e +assets/assets/imgs/ningunos.webp,1682444681132,3085ea8fff0ef4cd6ba8fa8599f21a1933d8b8f1740f5f3ea85ae26f8e7981b2 +assets/assets/imgs/ninja.webp,1682444681116,0709a8c5fdca7466f1687315c58e643d41c317716f48d3e9f578b51a78ee280a +assets/assets/imgs/nino.webp,1682444681108,80c96bae996cfa711d541ee564c5bea6580f020fc1087b122b573dfb1b0f3436 +assets/assets/imgs/no_gustar.webp,1682444681108,bfbedcaaf73f813904241953fedd7c283d8e5dc9a93ca9fac149f7a3e7d7f1a4 +assets/assets/imgs/nublado.webp,1682444681108,46e82873f40f075f1c2f0d13cad0bd38c7152e1f475c01ad705c2f19b32afb57 +assets/assets/imgs/nueve.webp,1682444681132,f25d3fa4fd33545228ee93388f28f051bf028032eadd31cc9e9d4d144ac8acbb +assets/assets/imgs/numeros.webp,1682444681124,564b36284fa5b7876370b8855920d9ea9412ec7a44a412cd0b266d266d505d74 +assets/assets/imgs/o.webp,1682444681140,87d4ed3976bf3bbd6cff915a9924e5964a706d09e6f59c086834b6d5cf6d5fe1 +assets/assets/imgs/ocho.webp,1682444681108,48c4f417d934c9b92e05abada9d01f159f0408b2a722b2b7b525d228d1c7231e +assets/assets/imgs/ocre.webp,1682444681124,083263cf569601f865f652fe0caa6027cef1f8e202a538b37e618fad5964b539 +assets/assets/imgs/ojos.webp,1682444681124,d8ea6b13044e6b648c15c97155a0873ce9bea01d2285d79461f81e5d343bc800 +assets/assets/imgs/ombligo.webp,1682444681124,0a87b2906eddba8a347aa91a55de65019ecd922a919ad960bcac18c2ed668c8b +assets/assets/imgs/ordenador.webp,1682444681124,171e58bf4f8d0d59df96ac9bab4d6f2ee50a3c48d54fdbb45ff13cc7a606041d +assets/assets/imgs/oreja.webp,1682444681124,18c7d7e9dd9e338d7f6061e9788c2d7a5c3434a562a3bc33a21cde30aea31928 +assets/assets/imgs/organos.webp,1682444681108,7078b054182a856c9a66cbb059d95e9319b0a3b35827f57f7162fea005270c6d +assets/assets/imgs/oso.webp,1682444681124,10c9ae1fc3163956e17a6f756df0e7d713194c18ba16b36d106e85c33328ec45 +assets/assets/imgs/otonio.webp,1682444681144,b34453294dda2a4a2b9e6c1eecd54a94274787961552d4bbc83c8effe7d92aea +assets/assets/imgs/oveja.webp,1682444681132,b7df81e466b9a10607ea3b6e2f19fed509b31f2a097e78d01d6ee25c2344e873 +assets/assets/imgs/pajarito.webp,1682444681132,16250fca307b6b3758b97c50e537db2ed78daf977da702dd981c97e1db60fd0d +assets/assets/imgs/pajaro.webp,1682444681116,62ac6333c90975198c85ec27173e7be4427c88af26f792e2d60836be37810c8d +assets/assets/imgs/paloma.webp,1682444681116,b466d357f4f97f9244cb35a479ebaf480f0822e0121310a5e51ddb98c4aa176b +assets/assets/imgs/pan_blanco.webp,1682444681116,d3a17f4bfa899be9f2defd328265f0d85b26912a615c49ef0e07a06de156ef00 +assets/assets/imgs/pan_negro.webp,1682444681104,625e0fdcc0e4eee6ebe97efbacdfadc07e3a38816d74313518d1c43228e262cd +assets/assets/imgs/pantalon.webp,1682444681116,bc58ec160f2011921cfb7f733df75571a2323df2d4e48b33a6e8eb5e2adf3fcc +assets/assets/imgs/pantalones_cortos.webp,1682444681132,740e451dd839af80508a3b87cc4f9c5dbc730f5e6cbe508b1deaff20c1a6e65a +assets/assets/imgs/para.webp,1682444681144,189e33f136733dc292e439e6bb9bf818e7798aeb9b9d349ff0aea4e3948320b9 +assets/assets/imgs/partes_del_cuerpo.webp,1682444681108,d91ea273df45819c129c26c0f7c41ad8142c377f410edb971e277406cb629b9f +assets/assets/imgs/pasear.webp,1682444681104,539146bcad26484b7b9492e25fb81c22b94cf44084d588179ac01d7aece78640 +assets/assets/imgs/paseo.webp,1682444681116,bef2db16ac98ecb2fab0b344ea24486ba1980ad2a87145ba18c61cb7d95feb52 +assets/assets/imgs/pastillas.webp,1682444681124,31a9500b9a21f12b1def7c8854fb262cd3dd886500400a9d76d3dc75fefdd2e8 +assets/assets/imgs/patalear.webp,1682444681132,cf427a757ace9ce87d1a00522eef3e5f542b0f3af53fed4d033e3c07d1f40992 +assets/assets/imgs/pato.webp,1682444681124,354f8d71ea1b7b730aa3f973f16eaf2c7a9f540cdacc185743287063e6e51649 +assets/assets/imgs/peces.webp,1682444681108,6d2621f979a2a2bb7a247e38a9e165a508f1e29b9126182f6668fb88a27c3172 +assets/assets/imgs/pecho.webp,1682444681144,8a374adc3cf9acdcbce7a871f4a6fdb3b49b68a42063409b01b08b2390ba22e9 +assets/assets/imgs/peinada.webp,1682444681116,2f2ba861f37f46ca97fb01ee5569472abb37cfbb1704c56ce112587d95cda0f2 +assets/assets/imgs/pelicula.webp,1682444681116,a06bce437cc57c81a660a41bf840761d88eb1b5bb6d0eb24b7cde44d4308f7d8 +assets/assets/imgs/pelota.webp,1682444681108,8d212e69cacfb1856c808a5774d49dc1699bb775b8e9a1668e52df6f4f976658 +assets/assets/imgs/pelota_de_futbol.webp,1682444681144,501c8df02cbff679b51c5861f8a0145370c10af21fca2c35be055d9ebc12a650 +assets/assets/imgs/pera.webp,1682444681116,6cc07d2d7ec00550e88143cdb9cdeff23c40a39533a4bacbb51b15375f4f64cd +assets/assets/imgs/perro.webp,1682444681140,39e94bcf6bd81843c35efc4538ab759ba82990e15a6ea99e9d680297c20f39ec +assets/assets/imgs/personas.webp,1682444681124,077e1b18a11bef01afd4c11f7ed93ac30a4d3bd6562373d69b5c61c5da4e0bb3 +assets/assets/imgs/pescadilla.webp,1682444681108,8c7abae2c54b3f22eed3549ebd9077a05763db668f2fa5fd433148f693a30efe +assets/assets/imgs/piano.webp,1682444681124,85fd4445648bb891d4b6126b602cc9b079d5e9541bd0b3081bee1abebd16cf81 +assets/assets/imgs/picto_grupo.webp,1682444681116,07c37c2e37791fca41961d85e24e006144861fb9e3634d13a8976b4706a6558e +assets/assets/imgs/pie.webp,1682444681124,b2955552a205139df4e91bc93fd337a0b8f00123e370048a950ca36d56f446fc +assets/assets/imgs/pimiento_rojo.webp,1682444681132,8fe3ceac4b4d933bbb3e13d345bc10a448b359302d2b6aad4116b3852340f22d +assets/assets/imgs/pimiento_verde.webp,1682444681140,f7de856155719d8b513f0b57a8c71475e4f079b8cf227b9f8b83c716e98f270b +assets/assets/imgs/pincho.webp,1682444681144,a64b32ea39da3d4b3991aa98f9c66aa81499e13a57c8484bbf5083c4c5fa3d73 +assets/assets/imgs/pintar.webp,1682444681108,1213453fd5bd276edbfc136aa9deeeb01874cfee603ba9f0bcc78edc076034fd +assets/assets/imgs/pizzeria.webp,1682444681124,642d7b8722860d9039711edcd46cd5ac795011943ca531fdd7daf3f64e1ffd83 +assets/assets/imgs/plateado.webp,1682444681104,69ae793e829a400605204eaf550920c9a67cb2d3e501ad2ab11bcae98c73d773 +assets/assets/imgs/plato.webp,1682444681116,633b456170c2719115881cdb7cc4581b2db15f8b1af333609bb5f0501d9a4364 +assets/assets/imgs/plaza.webp,1682444681124,1c19a4100a2c62262875b5ee39d89d0b0f31f1426e3fcc8261c6cdc695b1b12e +assets/assets/imgs/plugandplay.webp,1682444681124,3107b55d518fed6ed8240c3f6bf587465593aff9022addee1825ef33d376612d +assets/assets/imgs/plurales.webp,1682444681144,f61ebaafcee7a1711379f6347826efa932915d9f5e4a1ad1886a92d8b58b9185 +assets/assets/imgs/poco.webp,1682444681124,f305d8761a247062d58494da426fb9651facbfebec49f904dfdd803140cb8797 +assets/assets/imgs/pocos.webp,1682444681116,a8c91b8651c3e464041a88b6c2b32914dfa3b4365f81ae854ebf8c2d7c7b7bfe +assets/assets/imgs/policia.webp,1682444681116,aa8d181f61d75ad63d27c015a0032fb147951178f1482ec4e8859d19966f9993 +assets/assets/imgs/polleria.webp,1682444681108,944b25cdb8eb1676e071bfe5318d751c26bb48ceb8c2831b7dfc9f5b164fbaae +assets/assets/imgs/pomelo.webp,1682444681124,ec1970e4da89886ec54b17c5c01962b785556bfa37a12ae4862cdc1416a5f4c1 +assets/assets/imgs/poner.webp,1682444681132,eab4734b71be48140fe0dbd631bd32c2edf00e13d7d6fdd91ef4918da7f399f7 +assets/assets/imgs/por.webp,1682444681116,a7e14e0a1fdf58a97bd211b20a57399c0462f635ec0e115005c16683cafe7726 +assets/assets/imgs/por_favor.webp,1682444681132,083c0df67244660b69c4ce99dfce31e4eef5d35bd47272a81d565c007dcce13f +assets/assets/imgs/postre.webp,1682444681116,c965893f2f73e77e56a6d93ef88891223bdacc95e41e4fc7f47f390606612cc8 +assets/assets/imgs/predictor.webp,1682444681108,22914dc9593d20e5a3b356903bcc06262fece676ed9e8cca98c926ed46402c2e +assets/assets/imgs/preocupada.webp,1682444681116,2031b9a6d8aa9aa2d50c67051ef4b790408eaaf5f2da3eeb434461e1df2b17e9 +assets/assets/imgs/preparado.webp,1682444681132,0379e9b3369359a93727d1025f2ab68181bf22da96136bac2b2a7801c362a621 +assets/assets/imgs/preposiciones.webp,1682444681124,e496c44b7ec5c44587f7d302c8dd73b4554f3339cf4e41ad9df2d308ba30131b +assets/assets/imgs/primavera.webp,1682444681140,106e8ba0e3d576c1a45e7c5c3b36ff3e980494714b969684d96f7bdadcdbf273 +assets/assets/imgs/princesa.webp,1682444681132,69ca94a0579ce4e135ba91cda5b0e4cc77c1ffaa4ad4de2dc3f175effd9d4e65 +assets/assets/imgs/programa_de_cocina.webp,1682444681144,f249a5460f22ae2f938552a44aee3d11cdb23763dd6edd5b6bfa3eb09b080592 +assets/assets/imgs/pronombres.webp,1682444681124,3afc1510ca21d1f6002870cff978ffdd3e0fefac7fce75e7aa88aec037838723 +assets/assets/imgs/prueba1.webp,1682444681116,a1bb6e2a10e2f4900c5c815eb4a22d05b70ba8e25d5cb76498a550b9ac42d4a5 +assets/assets/imgs/pulmones.webp,1682444681132,0fff310126c4edb5b1bd56d1ce5214c4fd8c00737c41355a31a61e8ecb62c83d +assets/assets/imgs/pure.webp,1682444681144,568a78321f1aa5939928957ef3ad3aa68102a0370d502c59917bc850d8684894 +assets/assets/imgs/puzzle.webp,1682444681132,0b0ae1b5afb53f11a8bcfaee4cefc36323320bc591bd5fd3bdbe7cdbd6d17df5 +assets/assets/imgs/que.webp,1682444681108,e9c50c6207dd59feba892a61a75edf02296d70728f493ff3fee2354988db799c +assets/assets/imgs/que_hora_es.webp,1682444681144,82eaee10207f66a716b6bdf378ebfa457fa526d5eaac887433664069359b3759 +assets/assets/imgs/que_pregunta.webp,1682444681104,8b16c30e92e7b5de99a55f4ca36d333a5d3dac2ef5c111f86548ca15cfa0c63e +assets/assets/imgs/queso.webp,1682444681104,0a30d9b28822b85de2ae10f4f5608199f34069bc12d8764f8e5f0769fb6c32c6 +assets/assets/imgs/quien.webp,1682444681116,3bcbc70f3a0139a323ecd78cda186c5f1cb7ad3c91a1aaea8bc9b7ea0f905a8f +assets/assets/imgs/quien_es.webp,1682444681140,b0bac262710c55e525709c1467c101ee10a59570175488272458aa1b5de9a449 +assets/assets/imgs/quienes.webp,1682444681116,d682582065e79d4c6eea90b9982feeed8d44fb80f08ca5a9d275d6d291a83767 +assets/assets/imgs/radio_cd.webp,1682444681108,2d23df2edd5e5ae3d6005466e330d6051c6c9578c38d87c8b0741654c41c99be +assets/assets/imgs/rana.webp,1682444681132,955dd7318375f8aaab0c4ee8dc97eef7cb3662dcefb56c05ab7cf7028d4c7999 +assets/assets/imgs/rata.webp,1682444681144,f30e10cdf4466f8343724ebeaa21cda24bdfae70bb21be512b99159b2e2bed9e +assets/assets/imgs/rechazar.webp,1682444681132,af08816d6fabc3ef64f04c7931769983f070af2b57aa92cff43f4ab8e15453d2 +assets/assets/imgs/rehabilitacion.webp,1682444681108,af4b8d7bab40cfc0f7bfe7f4dd064ab33f8a7e3667e7b9230a1a1463189bdaaa +assets/assets/imgs/reina.webp,1682444681108,8a6fcc2bb2139c73a80b72751e865076930f005ab2aad871c401aaf4c51bfc82 +assets/assets/imgs/reir.webp,1682444681132,0178ad86ffddfd08fb8d0263724509ec7f3a483ed16134ca0e484333a0dc37b5 +assets/assets/imgs/repetir.webp,1682444681116,27f58a2349e26ecb582b935432b682b8542b860787399a6a07500a6640cbd18c +assets/assets/imgs/reptiles.webp,1682444681124,37af4eaefc7c2cce479a06bfac17b146b04ac63d199c44c61b086e06011a8478 +assets/assets/imgs/respirar_bajo_el_agua.webp,1682444681124,321608f90e97b1d78020de466d3e7859a64672d9cbd827853e137a2374d5567a +assets/assets/imgs/responsable.webp,1682444681140,5ff948da8fa3bca84ef4e5b6bd9325352dc33f51e866cac82d41ff92d858d5dd +assets/assets/imgs/restaurante.webp,1682444681124,be2dddfa97ce275fe27c060980559caca0a716c0d380e217b2dfb51278ca1d50 +assets/assets/imgs/rey.webp,1682444681132,d128a542c39b9e4589fd2b37770f236b9513fe723991f97a77516d4aa1259907 +assets/assets/imgs/rica.webp,1682444681116,786b29b568988547801caad3dd0a6e8eb5f681032c34ecff12925808667ff7a6 +assets/assets/imgs/rinoceronte.webp,1682444681116,fae343578e49bf563604d7e96479e9e73bf540eba45d6e30339e0acc0247882b +assets/assets/imgs/robusto.webp,1682444681124,e528fe981c923fc26409b550794ce650a14a1be0d1274e0d891ec040a4bf5ffb +assets/assets/imgs/rodilla.webp,1682444681124,a3b3da7167d7179718e8ea5e1cad85cf5301bd598087192e7738b871773fbc54 +assets/assets/imgs/rollizo.webp,1682444681140,b33019eccd025f2e398216eef339290b36ea4fb29415407f9502b43d743711b6 +assets/assets/imgs/rompecabezas.webp,1682444681140,e18de4e7239838b8dfbfe87eaa3f867112fe4b6001e1792e08b68b7c48060490 +assets/assets/imgs/ropa.webp,1682444681132,89d18cb0b9936424334643136375a535505c67b788957b871a928d7b5f29e6bd +assets/assets/imgs/sacar.webp,1682444681104,3c72aa64bb1f68cc36c1b44631c95fa663772fe216dfaef9d0211795884531b7 +assets/assets/imgs/sal.webp,1682444681116,a436289b91b15c9afd63d8e28f7873831d1c634c30086d6aa7bea966042565fc +assets/assets/imgs/salado.webp,1682444681108,85328ced15c754c032dccf32d84d2208816e52bd26dcbf91f290c44227c6ed1e +assets/assets/imgs/salchichas.webp,1682444681132,2f26d5c06f020df4215f9b1c0df0ce9b37db5f5640aeb64f973517f4f7f30496 +assets/assets/imgs/salir.webp,1682444681116,3340c6e56f688b981ce355223ba9c727cfdd5ef757e7e87ea7aa7e8e2d045862 +assets/assets/imgs/saliva.webp,1682444681124,f05f52ac3c8aad1b77274b7802db3215c298947780c64d0f2918f74c82e0d577 +assets/assets/imgs/saltamontes.webp,1682444681108,e1e63b261d8beda8125f6f4bfd160f1594b407addec1063b79b186732af56e85 +assets/assets/imgs/sandwich.webp,1682444681108,bb9b686ffa9a13bd09f56b3cc12d235177588858d1651888e4755338013c5441 +assets/assets/imgs/sangre.webp,1682444681116,04a204e736bbb284697dd7691ede37a14c789ecd168d3534143841ab9426110d +assets/assets/imgs/sano.webp,1682444681116,ed2a2678a19862bd1bf9c46f7d22e3650b89b03d3f04effacf422301d9e65f99 +assets/assets/imgs/secar.webp,1682444681116,17ebebc9523af171544024bdf9a9eab2745aa93da111a5a0110bd45e12f8c901 +assets/assets/imgs/sed.webp,1682444681132,f9ff8ca58b93c3247ebbaa99d7fc9b5b6f4ccafd3c9cfda5e6099788cc158bbd +assets/assets/imgs/segun.webp,1682444681144,60b524d8266b8cedd84be8d981e021a163a4c13ba6d3986ffff6dfa15c05e52f +assets/assets/imgs/seis.webp,1682444681116,73822866705cf51aa88e35c7c05efa9a468ed6ca29d4320921f206c2b19da840 +assets/assets/imgs/semaforo.webp,1682444681144,5d6b7a89aa66129054729735f84ac9e5e0a4556fd734e82dc0bdb0a17beb2690 +assets/assets/imgs/sentar.webp,1682444681140,2d4a2790e1e2f1f7449bf941eb4d9eae51a80c6e91293d3f939ef0604e9d4418 +assets/assets/imgs/sentimientos.webp,1682444681140,02b0c89e516685a1b61e062be3642acac446f37fd89e4678ba36fe86208f092b +assets/assets/imgs/serie.webp,1682444681124,1b0b4e7bc15adb7c6cacdebc0244534f478fe21a0e4be0aa71b4ecdec444aac2 +assets/assets/imgs/servilleta.webp,1682444681132,47cd56b4dae0b9be3ab7b3653610577209f6d5c04281db3576176780b2f461fb +assets/assets/imgs/share_audio.webp,1682444681124,f8f7400be3b30456afe8aeebb460ab1487fe59106986bb7a608b45c54f5b9813 +assets/assets/imgs/share_image.webp,1682444681104,1833216cb3cd9abc596cb331a7cc884e3ad78b25a320c3fbdbb30cfcba5cc780 +assets/assets/imgs/siete.webp,1682444681124,574a99273bf26e6e6ea12a8d0112a9373b2e779e3189fcc8a2c5146b74fb9dad +assets/assets/imgs/sin.webp,1682444681116,cf0c2101983187f76c232362d9533a8bc5db84ef64b1f5f0ce811094a7a3b255 +assets/assets/imgs/sobacos.webp,1682444681116,b5953063a70e5d3ef060f0d7447623d7234705a6c4a7a68023406b527f1ee66c +assets/assets/imgs/sociales.webp,1682444681132,4a3fbb1c545eb6965303906e0e93ba7afaab10f0b9c5e925eda20f128a8c6112 +assets/assets/imgs/sofa.webp,1682444681108,ee664c1ae0ea88210df9affd37d1f58182ab504766dd4efa845614209ffbc38f +assets/assets/imgs/soleado.webp,1682444681116,d7e7b965201a131954f8da89577f98a6008690aa8497c555e23be9dab530402e +assets/assets/imgs/sonarse_los_mocos.webp,1682444681108,a4507ef4946009513d0433e4609545536e93dc046c82565d4a7fdfb25e018a62 +assets/assets/imgs/sopa.webp,1682444681108,7b59cf7eaf0b39f5e27365dba8ef40cb50e400b4f6817148cac66903a92814f2 +assets/assets/imgs/soplar_las_velas.webp,1682444681104,b556dd8845028baaa645d816a242da36bb6232487f4ff2d5d50ebff8d0ef3f04 +assets/assets/imgs/sorpresa.webp,1682444681108,7b4b50a577e6eafe60ed1d7f5dca28eb763ea117a830eaa734da99de07b39771 +assets/assets/imgs/sosten.webp,1682444681124,f1499e37fb2fddda686161ea7aecb46eea4457f9ab0548b382f8046dd2625028 +assets/assets/imgs/spiderman.webp,1682444681144,a6f57ec2660be9899cc828ebf7ea88a339fd07d2a534527911aa2a0975d37ff8 +assets/assets/imgs/splashscreen.webp,1682444681108,41e266283acdaf95f1a2ea9315f18f236750f9aa4b9e4f3b13baba3e96b49375 +assets/assets/imgs/subir.webp,1682444681124,a523fda8bcbf649f92d41647a8628dd485787a6dd71991ac26fa2b314f24df17 +assets/assets/imgs/sucio.webp,1682444681108,d932e1714e542e124cb9f8ef7876d050e8ab92724fb1eac4b116896aac7e3dad +assets/assets/imgs/supermercado.webp,1682444681108,cbcc1cdd139f8327d7e2c0cf9177423bbe8a5fdbf7e9261c8d140b4bddcc7a9e +assets/assets/imgs/suyos.webp,1682444681132,7baa9af3ad7033cf35adc3f16d5fbc82191dca32918ae205280065f60954d3ca +assets/assets/imgs/sweater.webp,1682444681140,2eb10a176bc78ac28035f0b710ba92f48eabbf2d00429cfa96b6b9033246dad2 +assets/assets/imgs/tablero_de_comunicacion.webp,1682444681124,9ada25e95dda344b92191663e72318fccd3386efb450653275848a45da0a3be9 +assets/assets/imgs/tag_horario_white.webp,1682444681132,de606783749d84c20bedaa01de55c8357e79b03d4016e36679ab8a79ad6aecdd +assets/assets/imgs/tambor.webp,1682444681144,b894bd4449a6a7266a0400177a6999dc053d29ba285866adaab70a29a91b35ae +assets/assets/imgs/tarta.webp,1682444681124,c977c78ecbba07341a8a1bae5a7768acfd91428916ea21e8eb7919906c03a79a +assets/assets/imgs/taxi.webp,1682444681108,5908586cf9e8a440da7d059c68d5883815aec985ab011a3f9da041926a487af6 +assets/assets/imgs/taxista.webp,1682444681104,f24e653eff44b8f75ff0f75f95233de8c42332d3639e1e1af7ab1941f95d2f2d +assets/assets/imgs/te.webp,1682444681144,96a5a93f8a235fd0e40e0cee1568a86570d8ac71dcf1d67ce7b34a2a7d62e42b +assets/assets/imgs/templada.webp,1682444681124,e3e2735bde59887f185eb39f1d109049de108c89c9fd621ebcbce67c096eba0d +assets/assets/imgs/tenedor.webp,1682444681116,6c50d6e38137c9968cd7ec9c00d9bb49108c45ab6c6938acb7658bdd3ff2cc42 +assets/assets/imgs/ternera.webp,1682444681116,cd34f659a0469ec72d029c5f0da7a29f8bc6a6339e65989897d2c89ec49e6e8c +assets/assets/imgs/tetas.webp,1682444681124,17706e07ddf581849f927164f15699d43b456df2fd4fe5b34e2e2654c49236ca +assets/assets/imgs/tiempos.webp,1682444681140,dedaef87582ce713f06c54bd4fc58930519ac6764998a03ee2a5c389c2deac30 +assets/assets/imgs/tienda_de_bicicletas.webp,1682444681124,1e25fae775e9647c6ddaa226fa08e384d0e8130d34329a3bcfd6fa9c056c0116 +assets/assets/imgs/tienda_de_informatica.webp,1682444681132,ca61fd41d4362da287502ed9d492b2a0946d53c95cb875e317cb648f554f31b5 +assets/assets/imgs/tigre.webp,1682444681116,89c04fe5be77df3b86de18b3629e1eb697e0f92b4eb5e4e1e99668571718998a +assets/assets/imgs/tirita.webp,1682444681108,e885dcdd8cf07213688d62fcfd3b1b564416849e76ef2e35bb56cefa130f702f +assets/assets/imgs/toalla.webp,1682444681116,a39682a77735a64d31e11218ce07ddb3d6de815ebedb96459a35455f5c7e8e38 +assets/assets/imgs/tobillo.webp,1682444681124,eabdbe928607c9b35189ba99b4ec9ab6099a40709623ac5662c04020b2f36603 +assets/assets/imgs/tocaboton.webp,1682444681116,eb83069184265cd696d0e7a55e3943956d08e0eba2fdabc1c25463752e8d4035 +assets/assets/imgs/tocar.webp,1682444681132,4be83fc1ffebb62131261e0344662993e2ee047f7d1e2be2aebf1fc37ccf701c +assets/assets/imgs/todas.webp,1682444681132,fd329d3c7c574c7aa68933015807e14e37b022f9e0a05d1ed28dbc98c8dc2a65 +assets/assets/imgs/todos.webp,1682444681124,5ec46b72ec33d8b7f4c1f4093ed10b11ce318325686bcb14e76aa35479654d5a +assets/assets/imgs/tomar.webp,1682444681132,e36666a63e3f8769e23af30e0b3a82b728e29e2ca43c8dbf3dc1c947137ea065 +assets/assets/imgs/tomate.webp,1682444681140,f4cc588ed5d48df03933109c0f8ea161d953f9dfcb65ff5c2aca0642f515b947 +assets/assets/imgs/tortuga.webp,1682444681116,ba1b2a2026022937dce5062d697baaf99cae6f76a3bcc43db71149bf84d4c7be +assets/assets/imgs/tostada.webp,1682444681104,206eeb31be5c70ef36e650a9e530766088782702f3140c9984ceb7527dfd08f5 +assets/assets/imgs/transexual.webp,1682444681108,b599ce6946ce6a48ccfc694e412baff672517e7ebfeb5ec6021a6de0c1d8e388 +assets/assets/imgs/transportes.webp,1682444681132,b1c3a955424528d525c98bbcd47cea35866298b6eb0910d543f6de6e5569566d +assets/assets/imgs/tres.webp,1682444681124,413f0b49b531abf11235ac274f40e366878fa14ddc7f28930c6e8b5eb60b4c52 +assets/assets/imgs/triangulo.webp,1682444681132,6b5a8641cef13609014aa1fef6fbfd0403dc626708f9df265cb4bcb571b93831 +assets/assets/imgs/trompeta.webp,1682444681116,4efcf9793a73d5f5f7c33943ee5ff3686907f4b1a64cdd3cefe04a32b78ab9f9 +assets/assets/imgs/tutocontrol.webp,1682444681124,adea3e53fbf1b8da8c27610a360d2c3e404c590eea4a14bcbaaff1b660f5baee +assets/assets/imgs/tuya.webp,1682444681144,27493a4aff28fbf2a489be238feb2569d3f30648b88c514fe1a93249559866b4 +assets/assets/imgs/unboton.webp,1682444681104,d7c9704c1218442f873ba42d0b1682b40d489602dfdb52cdb4e20a0d3f16b030 +assets/assets/imgs/unia.webp,1682444681116,4763df5d46757e318c743c0a2c8dcd8b62ca64c5e44c399de849340d9a39f251 +assets/assets/imgs/uno.webp,1682444681132,db6ea6c7dbac66f4817ba5c669ed469490fb4dca7aebb72192d16c3976222428 +assets/assets/imgs/vaca.webp,1682444681108,a13e6ac22b8c0a531d8345aa4db7468c0d2e4434c67a11c82e0ba48fb5a784db +assets/assets/imgs/vaso.webp,1682444681132,6440322177227850efa76295019c6460533b5a860cb88200fbe680e2fe9d4e78 +assets/assets/imgs/venda.webp,1682444681108,018a8c2c5c5eb995de8c4e2e4a721448c21cd319e3ae08fa925349e1e353c969 +assets/assets/imgs/verano.webp,1682444681144,7a69a8866a520c96851667113088f5845d13c93233e8dc7ecd9be29758ac1239 +assets/assets/imgs/verbos.webp,1682444681108,c977bad301e03e96683e3da75f26796e0f414fd977f708bcd04a81d7ed2ec179 +assets/assets/imgs/verde_claro.webp,1682444681104,b668d3cde3848929a1f2636b26a30c10442e08e6b91fcecf8e6405567e114a0a +assets/assets/imgs/verduleria.webp,1682444681116,6836ecfe253688d63f58fbeeffcb262ea1e316211622d85145ff27d7d28d8a61 +assets/assets/imgs/vergonzante.webp,1682444681132,f73a1b214a55ef83c3e2b7201423cb8fc8f7d0b09924f1e680881599072a249f +assets/assets/imgs/verguenza.webp,1682444681144,a9e7eddb7e3c8cb04dce51b41e0ea9ac204eb07f41167a8b78dcda5528998251 +assets/assets/imgs/vestido.webp,1682444681116,1c77c1859e47314c687f510e60972b3d6a0ecc66622548c48d34018563d6bd41 +assets/assets/imgs/viajar.webp,1682444681108,65d7dec44da3a662617c76ca4e2ce11e0b97f4f05709c98cfd0948bba113a2ae +assets/assets/imgs/viajar_en_auto.webp,1682444681108,d971aaf5146270236c6cf3e326468ebd246a3aff0f0ff959af919c8edc3c0af8 +assets/assets/imgs/vibora.webp,1682444681108,d17a1d0db965576401a320f4214bb65b7a6264b8618d2a416febfd3d4570ac82 +assets/assets/imgs/vida.webp,1682444681124,83d12bd077b4aaff640c649ea8c8cf9db828b3cd7f9e926c0f6a0a4635d767b4 +assets/assets/imgs/videoclub.webp,1682444681132,2bccf9fcb14101ce75c25c5163af8a22ddcd831eac644e99d5e85b3e61457791 +assets/assets/imgs/viejo.webp,1682444681104,56f4168cf90658afc5c2312bafa60055ad7b5313b985da3dba58dc5540d34483 +assets/assets/imgs/viejo_cosa.webp,1682444681144,f7edc385af8c4b311dc1f5bdc5c07424b2f5e180ab6989f865f554fc4334277d +assets/assets/imgs/vino.webp,1682444681124,66e2840a15f27839b3db7efcb39c8584129120d1b94fa9b22a339b1c7fdad487 +assets/assets/imgs/violin.webp,1682444681108,dbf217f7ef1a981d9daffe558bd9a79e7b7a30d877200e3c0b065b890677eaba +assets/assets/imgs/visita.webp,1682444681144,0abe81d8b41c28f2ebc7655fdf7afb420ec7c56412534cd1cc386e5346b65f28 +assets/assets/imgs/y.webp,1682444681116,33e5e3b9cc90360b5173d7e237159f69476df8bff37289ab010f29b7998d8013 +assets/assets/imgs/zapatilla_de_deporte.webp,1682444681124,e381a6bf1ad5b26f2467868f43f3e53a39f2caf0d7e2aeddd82dbd36d7ec7e4c +assets/assets/imgs/zapato.webp,1682444681144,daddaca0e40d8ef1e2dd2934c7fbb70c288392da1bf3efe587ab1f2b5be92a43 +assets/assets/imgs/zic_add_circle_outline_white_24dp.webp,1682444681116,e8ceba5d32f1a071ff48f16c15e772b0429488ad3dde9de6deec1f31ea21c3e3 +assets/assets/imgs/zic_v1_perdonar.webp,1682444681140,ba75a2c6a3a3251112cb8f4b662d6afa059e294f31770767f9e11ed1285f4a21 +assets/assets/imgs/zid_arroz.webp,1682444681144,f1b8c3a7381e54377e80fd974af1812b84f94ac4a1fad0239f96b3dd08142a09 +assets/assets/imgs/zid_carne.webp,1682444681144,ec87ec43c16677a24ecb0b6ad14eed33be2fea6a3af400a89a7e6eee9b084fca +assets/assets/imgs/zid_diarrea.webp,1682444681108,b4fddcc210f421660a2173f0ebd49e00d0b92ae58e1bf717be89a717113f9c22 +assets/assets/imgs/zid_dolor.webp,1682444681116,f20a2ab4077daa192b8d16f8d3fb100319ca267188f7ac50698cd3ce879286ea +assets/assets/imgs/zid_dolor_de_cabeza.webp,1682444681124,6a7225116b823f0b8c27c1e206495794ca9ac64666bb1f45475511860439139b +assets/assets/imgs/zid_dolor_de_espalda.webp,1682444681116,39a149c568010383adc967bd38d2033af13fdbd081dc33ad2b94a6686ea1182a +assets/assets/imgs/zid_dolor_de_garganta.webp,1682444681124,eb09258992abdb87abbe82535dee386b18d93f6745729ad42331b09b7055d85e +assets/assets/imgs/zid_dolor_de_muela.webp,1682444681108,8ae0f010650d450d0de685bc2d2acf5f824a8ab7d9ba4ec6ccfa59a08a730cb8 +assets/assets/imgs/zid_dolor_de_oido.webp,1682444681124,a803886ff019db13e392b58c26313e23a4c87abd017b7166755091e3f3130481 +assets/assets/imgs/zid_dolor_de_panza.webp,1682444681124,224075be0e8e6325b7f5ac983f221669761b0df3b6c397dd95569716b0d68ecc +assets/assets/imgs/zid_dolor_de_pecho.webp,1682444681124,13864a6b70baea0ac4fc24231f6463d6ccb5203f2c35da356a77851932bff4eb +assets/assets/imgs/zid_ensalada.webp,1682444681116,ed723f449cf56d3a85dd153898c63f9554efd2ff14032235ba0d2e874b6be38d +assets/assets/imgs/zid_fruta.webp,1682444681132,69ef27e937d55b22684eaf6828ee2a71cba772e4a5127e4799dd1b8febbc9763 +assets/assets/imgs/zid_gripe.webp,1682444681104,1a25881650397ca025592b45c135510479fcc0a74563934226c008c6ae8ff0f5 +assets/assets/imgs/zid_hamburguesa_y_patatas_fritas.webp,1682444681116,c3e74e067b6616b03930bdd2a634d45df4ab3132c95b9fb5bd1d3eaaa36dd2cf +assets/assets/imgs/zid_helado.webp,1682444681108,737f022b9909c8f8295bfd64571bcd55b38d9e8a83f0aeb4d56f458eecdda087 +assets/assets/imgs/zid_huevo.webp,1682444681144,fa85b4680102a1a524733949ad7788b0dd56f07b0f1b6985842407ac2525104f +assets/assets/imgs/zid_pasta.webp,1682444681124,38142109953af73d722278d3f480c9d1b7406c46f20c0e23f252e72a312bb151 +assets/assets/imgs/zid_pescado.webp,1682444681104,8a0b24e0f4821f564ef73115a880f42f6fd8ad6f65339dca2fa45912d81c1ac2 +assets/assets/imgs/zid_pollo.webp,1682444681124,280dc38ccab2056cda5505a229cebef458f442a30140ece51a2649820961f170 +assets/assets/imgs/zid_resfriado.webp,1682444681108,19de4f049b02c159ed757834993034e9db0914a721e207277b4cefa6ec5b2be8 +assets/assets/imgs/zid_tarta.webp,1682444681140,c977c78ecbba07341a8a1bae5a7768acfd91428916ea21e8eb7919906c03a79a +assets/assets/imgs/zid_verduras.webp,1682444681144,dc7f0db2a648d4f9a51ed4abdbce1bfe949618cbcb02da79e91aa439e2189780 +assets/assets/imgs/zid_yogurt.webp,1682444681116,267f5f2970d17ea71983d2234e9f0975457176bcdce5162da01156f76ef37b2f +assets/assets/imgs/zumo_de_manzana.webp,1682444681108,e31d488c3177aad3451fe5e4a3785e04b85f0ddfc2377e1ebdb77ebf3b0f04f1 +assets/assets/imgs/zumo_de_melocoton.webp,1682444681108,29e93bfe7e6988bdcfb9330e2c18a8912533222de1551515776775eee80a1e83 +assets/assets/imgs/zumo_de_naranja.webp,1682444681116,e4976bb675ee728b2f5e1cd733b7291ac86412316a9928524b76a2b506e837d8 +assets/assets/imgs/zumo_de_uva.webp,1682444681124,289bbe12963ad47637c31088ea41d7810e656ed7c730550c01835febc921616a +assets/assets/languages/ca_ES.json,1682444681152,5511cee515bc026cfb252cf2014eddad5821880e77759fa4d57cdb0d7b8d0a1c +assets/assets/languages/en_US.json,1682444681152,67dc84a899e88c1981c5dc39ab13a8496de5637679736096565d062feb82cd90 +assets/assets/languages/es_AR.json,1682444681152,619c14c13c01aa2ec47e96c931bf329d42bb2a689b53adc0553aaa7916b8aced +assets/assets/languages/es_CL.json,1682444681152,ebbad8b390cfac927eacdfd2e98d959fa0f46091642522db4a254b96e4279f04 +assets/assets/languages/es_CO.json,1682444681152,c3b9e65497c7f89c41814faa573d890ac897c0a30d36cd828374f36d62e5c6c6 +assets/assets/languages/es_ES.json,1682444681152,42f23223f9f49bb1e68f119a5bbae4fc20878664ce2125a4b7a015808b900259 +assets/assets/languages/it_IT.json,1682444681152,1bb338eb1b2afb66c26bbdd2c462177e2998e22086c9ba5a300e2486a5eb87a6 +assets/assets/languages/pt_BR.json,1682444681152,4b2db11862ee7429cd74f52a49e7b36ca35bd19f85162df494d6179fdb1ecf1c +assets/assets/languages/ur_PK.json,1682444681152,c783fd8e5418605463414332235c59b571456ea22a04660f94d650091053e494 +assets/assets/onboarding/1.png,1682444681156,93ddf0e8d51fa6891d3ab4142e27bd35bf37421de4bb5d941ecf787ff7a0a1b6 +assets/assets/onboarding/2.png,1682444681156,b062e3799e2756cea5ca74330738b0774031bffa8753b7546df5d57a385e3417 +assets/assets/onboarding/3.png,1682444681156,d240840d03a2795b01f99a9a9150d67ad88c51f38a27cea703aaddd1dc6f28b9 +assets/assets/profile/notification_icon.png,1682444681156,045893451ee4f1b7cf8d22f4b0722b74ff67d80b9c156e8b943cc2b08a255ec0 +assets/assets/profile/profile_add_icon.png,1682444681156,2bd92011a5ba3c8f37256dc3ede62f36e794c841a8ddcec3e8de613bb3856863 +assets/assets/profile/profile_chooser_screen_icon_1.png,1682444681156,d17349f7cfd75e4e356a592190f9b844b23e0e80d5ac1fc0b8fd2d1e5eb1cd1d +assets/assets/profile/profile_chooser_screen_icon_2.png,1682444681156,516b896389c8a7e2ab14ca3e6c622eb4efe17967a45fa18bd80b22a0786b4517 +assets/assets/profile/profile_help_screen_icon_1.png,1682444681156,19473474ac528eb1a48e8a91c8e2c22a6b7509f57123112cd03cfb29a7aab225 +assets/assets/profile/profile_help_screen_icon_2.png,1682444681156,f2957d58e481cb4409bdd9cbad07965ef0826f8c7dfbd9e4b637d905e8319a61 +assets/assets/profile/profile_link_icon.png,1682444681156,fc6053579e9fea89fc00509553d11729eebfdcb36e8c5f3c8470a6f07eb07c0a +assets/assets/profile/profile_main_screen_icon2.png,1682444681156,75c6c173a6cebf76d279c480a4dea0a382f4cd9fc6a5adb64a23dc10f6b0cdc4 +assets/assets/profile/profile_ottaa_logo.png,1682444681156,6920dececc12c5fccd348ecabd8012fffb574597e249278c8c910b7da59ca268 +assets/assets/profile/profile_settings_icon_1.png,1682444681156,ba09baeb04a32c88c996c152addce30eb509640a22f820b39c5b0a5dcc8eab6b +assets/assets/profile/profile_settings_icon_2.png,1682444681156,e5735aaa6a4d47e679d7af38f9ef241374d08845c938596a4f4040b3b0323842 +assets/assets/profile/profile_settings_icon_3.png,1682444681156,9d06d4b11cf1f39a0676012614082ea9d610925b8858576e6d9d45a1cc2578bf +assets/assets/profile/profile_settings_icon_4.png,1682444681156,637bca5807e355693a427bd7e75b4e057359dc4c54673a465f1da488d850329f +assets/assets/profile/profile_settings_icon_5.png,1682444681156,e43d92e824e8ba93a907d345146da414e699d0bc6382c121264af89408ae0bbb +assets/assets/profile/tips_icon.png,1682444681156,d76d3ab7c71b8cf6b57b144ca7ee268cbf670ad17bb46960684a91156239ee3d +assets/assets/profile/user_profile_icon_1.png,1682444681156,1685c973327e7261922b7ca86d1d0c0213b87f62a573ee2b6981b52172e71368 +assets/assets/profile/user_profile_icon_2.png,1682444681156,f7eb7b92171f173847b64bfe27053e73157ff8c0bfdf5870e5904dd65dc5c45c +assets/assets/profiles/Group%20615@2x.png,1682444681152,23d8dc906984a687237d176d763cd93f62e54d077e19535f859c37447ab8284a +assets/assets/profiles/Group%20617@2x.png,1682444681152,4d5701fe3db661771afd61448e18a93d41d5078c4eee5c1f3ee45eba17eb9c2e +assets/assets/profiles/Group%20639@2x.png,1682444681152,2bb76bbdb8cdc0ac167e721c7ad8f97d955944f03f2193423e801813c7374200 +assets/assets/profiles/Group%20663@2x.png,1682444681152,3a194c0b4ac81cfea97a1594168e307ec1b2179b5ae754f6aba9574cc574177a +assets/assets/profiles/Group%20664@2x.png,1682444681152,19aa18fecdbaa2f67f1f8245e83c0bba8d035b0db47b04f79d5fdfd43b7e5981 +assets/assets/profiles/Group%20665@2x.png,1682444681152,27ed912e160fcb603a9837a0831f53e9cddd435b24eae3fe03fcd270f8829447 +assets/assets/profiles/Group%20666@2x.png,1682444681152,adb0302539b7fe52f05bcfdd82c7a92dd23a2f76aeaf5e1ae15b3da2aa3b77c2 +assets/assets/profiles/Group%20667@2x.png,1682444681152,bc70e55ad03561c3373e83bc52d3d187796b1d27015b9e43be03447e78edb140 +assets/assets/profiles/Group%20668@2x.png,1682444681152,deaa1aace11f3b4e35bdfb74a8d42b4ea35027b60abeb0888174492a19b83a63 +assets/assets/profiles/Group%20669@2x.png,1682444681152,f993566d41ddf4c86aa06ba17740d5412ba7ad32ef27a39a2527b33fe1509e65 +assets/assets/profiles/Group%20670@2x.png,1682444681152,03f856871e1b46c3254aa1922c07b0e4f61825e3ef42af6f663fd9360d6a1a98 +assets/assets/profiles/Group%20671@2x.png,1682444681152,2039758ee0ea0c2d401b647bc4e57c11fe3e475c031b21a8df8c551065edfeac +assets/assets/profiles/Group%20672@2x.png,1682444681152,3b84ff77d3f11e97815a8cf9864bc33253f04783890d06578ba195899bc0c84c +assets/assets/profiles/Group%20673@2x.png,1682444681152,b214dbefd51fa4eb8177db045207781e265f4d0b375a18eda82437c9602ec450 +assets/assets/profiles/Group%20674@2x.png,1682444681152,d07af8403afe2f3da2fc6ad6394f54dcc92bb4969ae44adfa8aa2232ca9daa64 +assets/assets/rive/loading_ottaa.riv,1682444681156,20242f3236971fa34900fbdbf5d46e06116883858597b2df67f7a2a5d599091d +assets/assets/user_settings/accessibility_icon_1.png,1682444681156,cca081038fb9078461ac167c7b71ea1af97298649000f34f040d1f95a4c3e2df +assets/assets/user_settings/accessibility_icon_2.png,1682444681156,85cc082328cbff042f172b2b73a4fbc7290b659f7788b8a28c1263174e9bb5e6 +assets/assets/user_settings/accessibility_photo_1.png,1682444681156,2660b61730c0edc5a281ce7c76f0ef69afa37437e0000a9a28da6b8b9af2642d +assets/assets/user_settings/accessibility_photo_2.png,1682444681156,9f60c5b75e2a222ec334e2213355cbcb4a009d1d69fe3c3c5442c6f3d42010a3 +assets/assets/user_settings/accessibility_photo_3.png,1682444681156,b53109df2edc4d364d9cc7be16614e98b6ad9754e6f1d5315fc767d1f0295b7c +assets/assets/user_settings/main_settings_icon_1.png,1682444681156,bcaba4ba7e666f3cb343a5752e666fe762e4528ec493bd06d57cb693d20cf7ec +assets/assets/user_settings/main_settings_icon_2.png,1682444681156,9b0c0ce6d69cc78ab1e0d8d867a769e868e3e3f2c57531f0f66c0c7164b3c904 +assets/fonts/MaterialIcons-Regular.otf,1682444681160,01e1893e23bcf2e77aa3229c67ae0f47bca9354102373c6363dea40d78fb848c +assets/packages/cupertino_icons/assets/CupertinoIcons.ttf,1682444681160,a77c8ca7f82c41df974e64528dfac4de5332a92a90dd861a44d5619a74b73b2e +assets/packages/fluttertoast/assets/toastify.css,1682444681160,b3106479402ae9cdfaebc5e46d5b8f807692c6fff685bd43b29ef265fe1f59de +assets/packages/fluttertoast/assets/toastify.js,1682444681156,af7cc93040f6a408fc5081768148326a2d6fa411d38e24c6adfa5dc067f8a1cd +assets/packages/ottaa_ui_kit/lib/assets/fonts/Montserrat-Bold.ttf,1682444681156,f8765939a3209559f462661e867d58b0525b68601e225e85b2b87d4367736cc0 +assets/packages/ottaa_ui_kit/lib/assets/fonts/Montserrat-Medium.ttf,1682444681156,08f834d6aea7d40293a913a0609a268d340c6001ee0303256dfb21eedcddc3fc +assets/packages/ottaa_ui_kit/lib/assets/fonts/Montserrat-Regular.ttf,1682444681156,96495b7f4b86086500d3d23bfdf44040b49b4d6f33efb4ba7c1c6c0528ceb17c +assets/packages/ottaa_ui_kit/lib/assets/fonts/Montserrat-SemiBold.ttf,1682444681156,ca896e87f56895ef5ffddd39762978c281fc1d8a0f800c4b5ab14934ac48b8eb +icons/Icon-192.png,1682444681164,5a3ebcac31167a5edf4352aab694e4e9e28a4d7a94724d41831d6bfb111ee822 +icons/Icon-512.png,1682444681164,ce69969673e2d771c30cfce63425c6658cbfe26e170be81dc2302a00385da11a diff --git a/.firebaserc b/.firebaserc index 356b27ad..215fa5e6 100644 --- a/.firebaserc +++ b/.firebaserc @@ -1,8 +1,7 @@ { "projects": { - "default": "ottaaproject-flutter", - "keyboard": "keyboard-98820", - "ottaa": "ottaaproject-flutter" + "OTTAAFlutter": "ottaaproject-flutter" }, - "targets": {} -} \ No newline at end of file + "targets": {}, + "etags": {} +} diff --git a/.gitignore b/.gitignore index c8b6799d..c6c854d8 100644 --- a/.gitignore +++ b/.gitignore @@ -101,7 +101,10 @@ unlinked_spec.ds **/ios/ServiceDefinitions.json **/ios/Runner/GeneratedPluginRegistrant.* **/ios/Runner/GoogleService-info.plist +**/ios/Runner/GoogleService-Info.plist **/ios/GoogleService-info.plist +**/ios/info.plist +**/ios/*.plist # macOS **/macos/Flutter/GeneratedPluginRegistrant.swift @@ -119,6 +122,6 @@ app.*.symbols !**/ios/**/default.perspectivev3 !/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages !/dev/ci/**/Gemfile.lock -/lib/app/data/models/grupos_model.g.dart -/lib/app/data/models/pict_model.g.dart -/lib/app/data/models/search_model.g.dart +ios/firebase_app_id_file.json +/lib/firebase_options.dart +ios/Runner/GoogleService-Info.plist diff --git a/Readme.md b/Readme.md index c2a85852..223e1802 100644 --- a/Readme.md +++ b/Readme.md @@ -4,7 +4,7 @@ [![Crowdin](https://badges.crowdin.net/ottaa-project/localized.svg)](https://crowdin.com/project/ottaa-project) [![Codemagic build status](https://api.codemagic.io/apps/633ae2406e6d53fd76823f7f/633ae2406e6d53fd76823f7e/status_badge.svg)](https://codemagic.io/apps/633ae2406e6d53fd76823f7f/633ae2406e6d53fd76823f7e/latest_build) -# Welcome to the OTTAA Project # +# Welcome to the OTTAA Project The [OTTAA Project](https://www.ottaaproject.com/) is an augmentative and alternative communication (AAC) mobile application intended for users with speech and language impairments. It is a fast and effective tool that significantly improves users' quality of life and facilitates their social and labor reintegration. We have already positively impacted the lives of more than 40000 people in 11 countries, helping individuals with cerebral palsy, aphasia, autism, Down syndrome, and mild ALS. @@ -14,11 +14,11 @@ You can be a part of this open-source project and help build life-changing techn ottaa_img

-Read our [Project's Roadmap](https://github.com/orgs/OTTAA-Project/projects/4/views/1) to learn about what features we are currently working on, what stage they are in, and when we expect to deliver them to you. +Read our [Project's Roadmap](https://github.com/orgs/OTTAA-Project/projects/4/views/1) to learn about what features we are currently working on, what stage they are in, and when we expect to deliver them to you. ## How does it work? -The OTTA app facilitates human communication via pictograms for those who are speech impaired, suggesting to each user the most appropriate pictograms based on preference, need, and environment. Watch this video for a more comprehensive walkthrough. +The OTTA app facilitates human communication via pictograms for those who are speech impaired, suggesting to each user the most appropriate pictograms based on preference, need, and environment. Watch this video for a more comprehensive walkthrough.

OTTAA The first intelligent communication platform for speech impaired people @@ -26,52 +26,54 @@ The OTTA app facilitates human communication via pictograms for those who are sp ## Getting started: setting up your IDE for the first time -* Run `flutter pub get` to get the dependencies. -* Run `flutter pub run build_runner build` to generate the model class code. -* Run `flutter run` to run the project. +- Run `flutter pub get` to get the dependencies. +- Run `flutter pub run build_runner build` to generate the model class code. +- Run `flutter run` to run the project. +- run `flutter run -d chrome --web-port 3000` to run the project in web. \* In case you encounter any errors in model building: -* Run `flutter packages pub run build_runner build --delete-conflicting-outputs`. +- Run `flutter packages pub run build_runner build --delete-conflicting-outputs`. +## Run tests + +- Run `flutter test` to run all tests. +- Run `flutter test test/.dart` to run a specific test file. +- Run `lcov --remove ./coverage/lcov.info -o ./coverage/output.info 'lib/core/*'` to remove the core folder from the coverage report. ## Resources ### Libraries & tools - The OTTAA Project was developed and runs mainly on: -* [Flutter](https://flutter.dev/) - -* [Firebase](https://firebase.google.com/) +- [Flutter](https://flutter.dev/) +- [Firebase](https://firebase.google.com/) The complete list of libraries used and their functions can be found [here](libraries.md). - ### Tools -* Official Android developer tools +- Official Android developer tools android_dev [Android Studio](https://developer.android.com/studio) -* Repository +- Repository bit_bucket [Bitbucket](https://bitbucket.org) -* Pictograms +- Pictograms araasac [Arasaac](http://arasaac.org/) -* Testing Platform +- Testing Platform test_platform [Testproject](http://testproject.io) - ### API reference - * We are using [Dartdoc](https://pub.dev/packages/dartdoc) to automate the [API reference documentation] (place_holder: link to API reference). For some help getting started with Dartdoc, check out [this guide](/dartdoc_automatic_documentation.md) we put together. +- We are using [Dartdoc](https://pub.dev/packages/dartdoc) to automate the [API reference documentation] (place_holder: link to API reference). For some help getting started with Dartdoc, check out [this guide](/dartdoc_automatic_documentation.md) we put together. ## Contributing @@ -81,12 +83,12 @@ Contributors help the OTTAA Project grow. If you would like to become a contribu Open standards establish protocols and building blocks to help make digital public goods more functional and interoperable. This not only streamlines product development but also removes vendor-imposed boundaries to read or write data files by improving data exchange and open-source development support that is why we use the following Technology standards across our software and implementations. -* HTTPS for secure communication over networks -* OAuth 2 for authentication and user authorization -* UTF-8 for string localization and internalization -* JSON for database structure and data transfer -* PNG & Webp for images and pictograms -* OGG for audio files +- HTTPS for secure communication over networks +- OAuth 2 for authentication and user authorization +- UTF-8 for string localization and internalization +- JSON for database structure and data transfer +- PNG & Webp for images and pictograms +- OGG for audio files ## FAQ @@ -94,7 +96,6 @@ We have compiled a list of FAQs, you can check it [here](place_holder: link to F ## Acknowledgments -

@@ -116,13 +117,9 @@ Support this project by [becoming a sponsor](https://www.ottaaproject.com/suppor ## :memo: Legal & Licenses -* Code - GPLv3 -* ARASAAC Symbols - CC BY-NC-SA 4.0 -* Global Symbols CIC - CC BY-NC-SA 4.0 -* OTTAA Project™ 2016 - 2022 +- Code - GPLv3 +- ARASAAC Symbols - CC BY-NC-SA 4.0 +- Global Symbols CIC - CC BY-NC-SA 4.0 +- OTTAA Project™ 2016 - 2022 OTTAA's brand assets, texts, logos, icons, designs, names of other OTTAA software, and any other brand features and elements, whether registered or unregistered (“Brand Assets”)—are proprietary assets owned exclusively by OTTAA and its group of companies. - - - - diff --git a/analysis_options.yaml b/analysis_options.yaml index 839cc647..d11f52fc 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -1,29 +1,11 @@ -# This file configures the analyzer, which statically analyzes Dart code to -# check for errors, warnings, and lints. -# -# The issues identified by the analyzer are surfaced in the UI of Dart-enabled -# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be -# invoked from the command line by running `flutter analyze`. - -# The following line activates a set of recommended lints for Flutter apps, -# packages, and plugins designed to encourage good coding practices. include: package:flutter_lints/flutter.yaml +# analyzer: +# plugins: +# - custom_lint + linter: - # The lint rules applied to this project can be customized in the - # section below to disable rules from the `package:flutter_lints/flutter.yaml` - # included above or to enable additional rules. A list of all available lints - # and their documentation is published at - # https://dart-lang.github.io/linter/lints/index.html. - # - # Instead of disabling a lint rule for the entire project in the - # section below, it can also be suppressed for a single line of code - # or a specific dart file by using the `// ignore: name_of_lint` and - # `// ignore_for_file: name_of_lint` syntax on the line or in the file - # producing the lint. rules: - # avoid_print: false # Uncomment to disable the `avoid_print` rule - # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule - -# Additional information about this file can be found at -# https://dart.dev/guides/language/analysis-options \ No newline at end of file + use_build_context_synchronously: false +# custom_lint: +# rules: diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 1132128b..733792cd 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -1,6 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 00000000..345888d2 --- /dev/null +++ b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/android/app/src/main/res/mipmap-anydpi-v26/logo_ottaa_square.xml b/android/app/src/main/res/mipmap-anydpi-v26/logo_ottaa_square.xml deleted file mode 100644 index 15f55f35..00000000 --- a/android/app/src/main/res/mipmap-anydpi-v26/logo_ottaa_square.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png index db77bb4b..1b3778f2 100644 Binary files a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-hdpi/logo_ottaa_square_background.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher_background.png similarity index 100% rename from android/app/src/main/res/mipmap-hdpi/logo_ottaa_square_background.png rename to android/app/src/main/res/mipmap-hdpi/ic_launcher_background.png diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png new file mode 100644 index 00000000..67a2574f Binary files /dev/null and b/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png differ diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher_monochrome.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher_monochrome.png new file mode 100644 index 00000000..67a2574f Binary files /dev/null and b/android/app/src/main/res/mipmap-hdpi/ic_launcher_monochrome.png differ diff --git a/android/app/src/main/res/mipmap-hdpi/logo_ottaa_square.png b/android/app/src/main/res/mipmap-hdpi/logo_ottaa_square.png deleted file mode 100644 index 1781f859..00000000 Binary files a/android/app/src/main/res/mipmap-hdpi/logo_ottaa_square.png and /dev/null differ diff --git a/android/app/src/main/res/mipmap-hdpi/logo_ottaa_square_foreground.png b/android/app/src/main/res/mipmap-hdpi/logo_ottaa_square_foreground.png deleted file mode 100644 index 4970d067..00000000 Binary files a/android/app/src/main/res/mipmap-hdpi/logo_ottaa_square_foreground.png and /dev/null differ diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png index 17987b79..af11333a 100644 Binary files a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-mdpi/logo_ottaa_square_background.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher_background.png similarity index 100% rename from android/app/src/main/res/mipmap-mdpi/logo_ottaa_square_background.png rename to android/app/src/main/res/mipmap-mdpi/ic_launcher_background.png diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png new file mode 100644 index 00000000..d611fd7e Binary files /dev/null and b/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png differ diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher_monochrome.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher_monochrome.png new file mode 100644 index 00000000..d611fd7e Binary files /dev/null and b/android/app/src/main/res/mipmap-mdpi/ic_launcher_monochrome.png differ diff --git a/android/app/src/main/res/mipmap-mdpi/logo_ottaa_square.png b/android/app/src/main/res/mipmap-mdpi/logo_ottaa_square.png deleted file mode 100644 index e7590081..00000000 Binary files a/android/app/src/main/res/mipmap-mdpi/logo_ottaa_square.png and /dev/null differ diff --git a/android/app/src/main/res/mipmap-mdpi/logo_ottaa_square_foreground.png b/android/app/src/main/res/mipmap-mdpi/logo_ottaa_square_foreground.png deleted file mode 100644 index 9876ce52..00000000 Binary files a/android/app/src/main/res/mipmap-mdpi/logo_ottaa_square_foreground.png and /dev/null differ diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png index 09d43914..7c919097 100644 Binary files a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-xhdpi/logo_ottaa_square_background.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_background.png similarity index 100% rename from android/app/src/main/res/mipmap-xhdpi/logo_ottaa_square_background.png rename to android/app/src/main/res/mipmap-xhdpi/ic_launcher_background.png diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png new file mode 100644 index 00000000..ebdc13d7 Binary files /dev/null and b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png differ diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher_monochrome.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_monochrome.png new file mode 100644 index 00000000..ebdc13d7 Binary files /dev/null and b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_monochrome.png differ diff --git a/android/app/src/main/res/mipmap-xhdpi/logo_ottaa_square.png b/android/app/src/main/res/mipmap-xhdpi/logo_ottaa_square.png deleted file mode 100644 index b7cc2632..00000000 Binary files a/android/app/src/main/res/mipmap-xhdpi/logo_ottaa_square.png and /dev/null differ diff --git a/android/app/src/main/res/mipmap-xhdpi/logo_ottaa_square_foreground.png b/android/app/src/main/res/mipmap-xhdpi/logo_ottaa_square_foreground.png deleted file mode 100644 index eee361a3..00000000 Binary files a/android/app/src/main/res/mipmap-xhdpi/logo_ottaa_square_foreground.png and /dev/null differ diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png index d5f1c8d3..08341173 100644 Binary files a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-xxhdpi/logo_ottaa_square_background.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_background.png similarity index 100% rename from android/app/src/main/res/mipmap-xxhdpi/logo_ottaa_square_background.png rename to android/app/src/main/res/mipmap-xxhdpi/ic_launcher_background.png diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png new file mode 100644 index 00000000..1394fb40 Binary files /dev/null and b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png differ diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_monochrome.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_monochrome.png new file mode 100644 index 00000000..1394fb40 Binary files /dev/null and b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_monochrome.png differ diff --git a/android/app/src/main/res/mipmap-xxhdpi/logo_ottaa_square.png b/android/app/src/main/res/mipmap-xxhdpi/logo_ottaa_square.png deleted file mode 100644 index e8bbf72e..00000000 Binary files a/android/app/src/main/res/mipmap-xxhdpi/logo_ottaa_square.png and /dev/null differ diff --git a/android/app/src/main/res/mipmap-xxhdpi/logo_ottaa_square_foreground.png b/android/app/src/main/res/mipmap-xxhdpi/logo_ottaa_square_foreground.png deleted file mode 100644 index d89684ca..00000000 Binary files a/android/app/src/main/res/mipmap-xxhdpi/logo_ottaa_square_foreground.png and /dev/null differ diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png index 4d6372ee..d63f0f54 100644 Binary files a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-xxxhdpi/logo_ottaa_square_background.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_background.png similarity index 100% rename from android/app/src/main/res/mipmap-xxxhdpi/logo_ottaa_square_background.png rename to android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_background.png diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png new file mode 100644 index 00000000..7e1f1a5e Binary files /dev/null and b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png differ diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_monochrome.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_monochrome.png new file mode 100644 index 00000000..7e1f1a5e Binary files /dev/null and b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_monochrome.png differ diff --git a/android/app/src/main/res/mipmap-xxxhdpi/logo_ottaa_square.png b/android/app/src/main/res/mipmap-xxxhdpi/logo_ottaa_square.png deleted file mode 100644 index f8284c96..00000000 Binary files a/android/app/src/main/res/mipmap-xxxhdpi/logo_ottaa_square.png and /dev/null differ diff --git a/android/app/src/main/res/mipmap-xxxhdpi/logo_ottaa_square_foreground.png b/android/app/src/main/res/mipmap-xxxhdpi/logo_ottaa_square_foreground.png deleted file mode 100644 index 95361522..00000000 Binary files a/android/app/src/main/res/mipmap-xxxhdpi/logo_ottaa_square_foreground.png and /dev/null differ diff --git a/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml new file mode 100644 index 00000000..ce59fa19 --- /dev/null +++ b/android/app/src/main/res/values/strings.xml @@ -0,0 +1,4 @@ + + + OTTAA Project + \ No newline at end of file diff --git a/android/build.gradle b/android/build.gradle index ecd1cc62..14fba4e8 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -26,6 +26,6 @@ subprojects { project.evaluationDependsOn(':app') } -task clean(type: Delete) { +tasks.register("clean", Delete) { delete rootProject.buildDir -} \ No newline at end of file +} diff --git a/android/gradle.properties b/android/gradle.properties index 94adc3a3..8e2ab5f9 100644 --- a/android/gradle.properties +++ b/android/gradle.properties @@ -1,3 +1,8 @@ -org.gradle.jvmargs=-Xmx1536M android.useAndroidX=true android.enableJetifier=true +org.gradle.jvmargs=-Xmx1536M \ +--add-exports=java.base/sun.nio.ch=ALL-UNNAMED \ +--add-opens=java.base/java.lang=ALL-UNNAMED \ +--add-opens=java.base/java.lang.reflect=ALL-UNNAMED \ +--add-opens=java.base/java.io=ALL-UNNAMED \ +--add-exports=jdk.unsupported/sun.misc=ALL-UNNAMED \ No newline at end of file diff --git a/android/ottaa_project_flutter_android.iml b/android/ottaa_project_flutter_android.iml index 3e44773e..79929925 100644 --- a/android/ottaa_project_flutter_android.iml +++ b/android/ottaa_project_flutter_android.iml @@ -23,7 +23,7 @@ - - + + \ No newline at end of file diff --git a/assets/Buscar-Orange.png b/assets/Buscar-Orange.png new file mode 100644 index 00000000..8d493ad6 Binary files /dev/null and b/assets/Buscar-Orange.png differ diff --git a/assets/Buscar.png b/assets/Buscar.png new file mode 100644 index 00000000..9535bc70 Binary files /dev/null and b/assets/Buscar.png differ diff --git a/assets/Delete-orange.png b/assets/Delete-orange.png new file mode 100644 index 00000000..68f839a4 Binary files /dev/null and b/assets/Delete-orange.png differ diff --git a/assets/Delete.png b/assets/Delete.png new file mode 100644 index 00000000..3aa938b4 Binary files /dev/null and b/assets/Delete.png differ diff --git a/assets/Group 704.png b/assets/Group 704.png new file mode 100644 index 00000000..c712c536 Binary files /dev/null and b/assets/Group 704.png differ diff --git a/assets/Ottaa-orange.png b/assets/Ottaa-orange.png new file mode 100644 index 00000000..fccb2984 Binary files /dev/null and b/assets/Ottaa-orange.png differ diff --git a/assets/Ottaa.png b/assets/Ottaa.png new file mode 100644 index 00000000..3d47f364 Binary files /dev/null and b/assets/Ottaa.png differ diff --git a/assets/board/board_edit_image_1.png b/assets/board/board_edit_image_1.png new file mode 100644 index 00000000..00814e19 Binary files /dev/null and b/assets/board/board_edit_image_1.png differ diff --git a/assets/board/board_edit_image_2.png b/assets/board/board_edit_image_2.png new file mode 100644 index 00000000..8124071d Binary files /dev/null and b/assets/board/board_edit_image_2.png differ diff --git a/assets/board/customize_wait_icon.png b/assets/board/customize_wait_icon.png new file mode 100644 index 00000000..d0df0c79 Binary files /dev/null and b/assets/board/customize_wait_icon.png differ diff --git a/assets/board/icons/icons_not_selected/camara.png b/assets/board/icons/icons_not_selected/camara.png new file mode 100644 index 00000000..82c3fd1f Binary files /dev/null and b/assets/board/icons/icons_not_selected/camara.png differ diff --git a/assets/board/icons/icons_not_selected/delete.png b/assets/board/icons/icons_not_selected/delete.png new file mode 100644 index 00000000..627285e7 Binary files /dev/null and b/assets/board/icons/icons_not_selected/delete.png differ diff --git a/assets/board/icons/icons_not_selected/dice.png b/assets/board/icons/icons_not_selected/dice.png new file mode 100644 index 00000000..7227a2ea Binary files /dev/null and b/assets/board/icons/icons_not_selected/dice.png differ diff --git a/assets/board/icons/icons_not_selected/favourite.png b/assets/board/icons/icons_not_selected/favourite.png new file mode 100644 index 00000000..2de51c35 Binary files /dev/null and b/assets/board/icons/icons_not_selected/favourite.png differ diff --git a/assets/board/icons/icons_not_selected/history.png b/assets/board/icons/icons_not_selected/history.png new file mode 100644 index 00000000..2df1c543 Binary files /dev/null and b/assets/board/icons/icons_not_selected/history.png differ diff --git a/assets/board/icons/icons_not_selected/image.png b/assets/board/icons/icons_not_selected/image.png new file mode 100644 index 00000000..44f21d35 Binary files /dev/null and b/assets/board/icons/icons_not_selected/image.png differ diff --git a/assets/board/icons/icons_not_selected/no.png b/assets/board/icons/icons_not_selected/no.png new file mode 100644 index 00000000..abb98216 Binary files /dev/null and b/assets/board/icons/icons_not_selected/no.png differ diff --git a/assets/board/icons/icons_not_selected/ottaa.png b/assets/board/icons/icons_not_selected/ottaa.png new file mode 100644 index 00000000..181839f1 Binary files /dev/null and b/assets/board/icons/icons_not_selected/ottaa.png differ diff --git a/assets/board/icons/icons_not_selected/refresh.png b/assets/board/icons/icons_not_selected/refresh.png new file mode 100644 index 00000000..50849bcc Binary files /dev/null and b/assets/board/icons/icons_not_selected/refresh.png differ diff --git a/assets/board/icons/icons_not_selected/search.png b/assets/board/icons/icons_not_selected/search.png new file mode 100644 index 00000000..162bce1c Binary files /dev/null and b/assets/board/icons/icons_not_selected/search.png differ diff --git a/assets/board/icons/icons_not_selected/share.png b/assets/board/icons/icons_not_selected/share.png new file mode 100644 index 00000000..5de95375 Binary files /dev/null and b/assets/board/icons/icons_not_selected/share.png differ diff --git a/assets/board/icons/icons_not_selected/yes.png b/assets/board/icons/icons_not_selected/yes.png new file mode 100644 index 00000000..ef3bbb80 Binary files /dev/null and b/assets/board/icons/icons_not_selected/yes.png differ diff --git a/assets/board/icons/icons_selected/camara.png b/assets/board/icons/icons_selected/camara.png new file mode 100644 index 00000000..6d93cae5 Binary files /dev/null and b/assets/board/icons/icons_selected/camara.png differ diff --git a/assets/board/icons/icons_selected/delete.png b/assets/board/icons/icons_selected/delete.png new file mode 100644 index 00000000..c6965a7c Binary files /dev/null and b/assets/board/icons/icons_selected/delete.png differ diff --git a/assets/board/icons/icons_selected/dice.png b/assets/board/icons/icons_selected/dice.png new file mode 100644 index 00000000..62e25e64 Binary files /dev/null and b/assets/board/icons/icons_selected/dice.png differ diff --git a/assets/board/icons/icons_selected/favourite.png b/assets/board/icons/icons_selected/favourite.png new file mode 100644 index 00000000..aa952e79 Binary files /dev/null and b/assets/board/icons/icons_selected/favourite.png differ diff --git a/assets/board/icons/icons_selected/history.png b/assets/board/icons/icons_selected/history.png new file mode 100644 index 00000000..4192c8d0 Binary files /dev/null and b/assets/board/icons/icons_selected/history.png differ diff --git a/assets/board/icons/icons_selected/image.png b/assets/board/icons/icons_selected/image.png new file mode 100644 index 00000000..a4d9450d Binary files /dev/null and b/assets/board/icons/icons_selected/image.png differ diff --git a/assets/board/icons/icons_selected/no.png b/assets/board/icons/icons_selected/no.png new file mode 100644 index 00000000..56dc993a Binary files /dev/null and b/assets/board/icons/icons_selected/no.png differ diff --git a/assets/board/icons/icons_selected/ottaa.png b/assets/board/icons/icons_selected/ottaa.png new file mode 100644 index 00000000..019cb232 Binary files /dev/null and b/assets/board/icons/icons_selected/ottaa.png differ diff --git a/assets/board/icons/icons_selected/refresh.png b/assets/board/icons/icons_selected/refresh.png new file mode 100644 index 00000000..e23522bf Binary files /dev/null and b/assets/board/icons/icons_selected/refresh.png differ diff --git a/assets/board/icons/icons_selected/search.png b/assets/board/icons/icons_selected/search.png new file mode 100644 index 00000000..ffa62d57 Binary files /dev/null and b/assets/board/icons/icons_selected/search.png differ diff --git a/assets/board/icons/icons_selected/share.png b/assets/board/icons/icons_selected/share.png new file mode 100644 index 00000000..bf4b5999 Binary files /dev/null and b/assets/board/icons/icons_selected/share.png differ diff --git a/assets/board/icons/icons_selected/yes.png b/assets/board/icons/icons_selected/yes.png new file mode 100644 index 00000000..22f2d4cd Binary files /dev/null and b/assets/board/icons/icons_selected/yes.png differ diff --git a/assets/edit/arsac_image.png b/assets/edit/arsac_image.png new file mode 100644 index 00000000..ed1c597d Binary files /dev/null and b/assets/edit/arsac_image.png differ diff --git a/assets/edit/board_select_image.png b/assets/edit/board_select_image.png new file mode 100644 index 00000000..6a5f9f48 Binary files /dev/null and b/assets/edit/board_select_image.png differ diff --git a/assets/edit/camera_icon.png b/assets/edit/camera_icon.png new file mode 100644 index 00000000..76eda9c1 Binary files /dev/null and b/assets/edit/camera_icon.png differ diff --git a/assets/edit/gallery_icon.png b/assets/edit/gallery_icon.png new file mode 100644 index 00000000..e594c6be Binary files /dev/null and b/assets/edit/gallery_icon.png differ diff --git a/assets/edit/picto/delete_picto_icon.png b/assets/edit/picto/delete_picto_icon.png new file mode 100644 index 00000000..397de1e4 Binary files /dev/null and b/assets/edit/picto/delete_picto_icon.png differ diff --git a/assets/edit/picto/picto_edit_icon.png b/assets/edit/picto/picto_edit_icon.png new file mode 100644 index 00000000..f6af818b Binary files /dev/null and b/assets/edit/picto/picto_edit_icon.png differ diff --git a/assets/edit/search_data.png b/assets/edit/search_data.png new file mode 100644 index 00000000..2508290d Binary files /dev/null and b/assets/edit/search_data.png differ diff --git a/assets/fIcon.png b/assets/fIcon.png index 59058741..a22a3a13 100644 Binary files a/assets/fIcon.png and b/assets/fIcon.png differ diff --git a/assets/gIcon.png b/assets/gIcon.png index 2c8a91bb..39e3f479 100644 Binary files a/assets/gIcon.png and b/assets/gIcon.png differ diff --git a/assets/games_images/game_icon.png b/assets/games_images/game_icon.png new file mode 100644 index 00000000..3aa3627d Binary files /dev/null and b/assets/games_images/game_icon.png differ diff --git a/assets/games_images/game_search.png b/assets/games_images/game_search.png new file mode 100644 index 00000000..1a3954f3 Binary files /dev/null and b/assets/games_images/game_search.png differ diff --git a/assets/games_images/game_select_photo_0.png b/assets/games_images/game_select_photo_0.png new file mode 100644 index 00000000..3e4d75ac Binary files /dev/null and b/assets/games_images/game_select_photo_0.png differ diff --git a/assets/games_images/game_select_photo_1.png b/assets/games_images/game_select_photo_1.png new file mode 100644 index 00000000..c3950b2b Binary files /dev/null and b/assets/games_images/game_select_photo_1.png differ diff --git a/assets/games_images/game_select_photo_2.png b/assets/games_images/game_select_photo_2.png new file mode 100644 index 00000000..744ae1c6 Binary files /dev/null and b/assets/games_images/game_select_photo_2.png differ diff --git a/assets/games_images/game_select_photo_3.png b/assets/games_images/game_select_photo_3.png new file mode 100644 index 00000000..bfe3a083 Binary files /dev/null and b/assets/games_images/game_select_photo_3.png differ diff --git a/assets/games_images/icon_add.png b/assets/games_images/icon_add.png new file mode 100644 index 00000000..9af0027a Binary files /dev/null and b/assets/games_images/icon_add.png differ diff --git a/assets/games_images/mark.png b/assets/games_images/mark.png new file mode 100644 index 00000000..bc8a8249 Binary files /dev/null and b/assets/games_images/mark.png differ diff --git a/assets/games_images/save_icon.png b/assets/games_images/save_icon.png new file mode 100644 index 00000000..36ab442c Binary files /dev/null and b/assets/games_images/save_icon.png differ diff --git a/assets/games_images/share_icon.png b/assets/games_images/share_icon.png new file mode 100644 index 00000000..c378c762 Binary files /dev/null and b/assets/games_images/share_icon.png differ diff --git a/assets/games_images/speak_logo.png b/assets/games_images/speak_logo.png new file mode 100644 index 00000000..a8162b3e Binary files /dev/null and b/assets/games_images/speak_logo.png differ diff --git a/assets/games_images/trophy.png b/assets/games_images/trophy.png new file mode 100644 index 00000000..02b3d0ac Binary files /dev/null and b/assets/games_images/trophy.png differ diff --git a/assets/grupos.json b/assets/grupos.json index 556e71f7..adfa2b77 100644 --- a/assets/grupos.json +++ b/assets/grupos.json @@ -1,15683 +1,8721 @@ [ { - "id": 0, - "texto": { - "en": "Actions", - "es": "ACCIONES" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fverbos.webp?alt=media&token=f32aaaf1-44aa-49d3-a0ed-981ba01564d5" - }, - "relacion": [ - { - "id": 1, - "frec": 1 - }, + "freq": 10, + "id": "-k6dUC6thWPyULq8MVSe6", + "relations": [ { - "id": 2, - "frec": 1 + "id": "CkTiaqBY3jf86JRq636lt", + "value": 1 }, { - "id": 3, - "frec": 1 + "id": "zRTTg5x_P1E8Z3CU-oWXa", + "value": 1 }, { - "id": 4, - "frec": 1 + "id": "sFNUgvnglgrm6cbYiM0di", + "value": 1 }, { - "id": 5, - "frec": 1 + "id": "LRIKzfm9ZsdNe1u7CUuW_", + "value": 1 }, { - "id": 6, - "frec": 1 + "id": "HQiQh4PPBvO1n-d7JGVj8", + "value": 1 }, { - "id": 7, - "frec": 1 + "id": "J3qQMp0OMr5LC9ebfArxH", + "value": 1 }, { - "id": 8, - "frec": 1 + "id": "YLKXFZ9ze9K9NvJiAx8w0", + "value": 1 }, { - "id": 9, - "frec": 1 + "id": "2u2-AFuI245I7bZ6tsSPh", + "value": 1 }, { - "id": 10, - "frec": 1 + "id": "ms97ZsgQOvD-Z8qpSW4oN", + "value": 1 }, { - "id": 11, - "frec": 1 + "id": "-aePI8WknXpxEpz19Lu48", + "value": 1 }, { - "id": 12, - "frec": 1 + "id": "oAxNCJufVUqZMyWRGdZl9", + "value": 1 }, { - "id": 13, - "frec": 1 + "id": "aXLBXkENJqTYkyZOP8TNS", + "value": 0 }, { - "id": 14, - "frec": 1 + "id": "BQm-YCPc0lfD1-mhecCTL", + "value": 0 }, { - "id": 15, - "frec": 1 + "id": "OvyFC1GHkvJZ0dAAF1QkY", + "value": 0 }, { - "id": 17, - "frec": 1 + "id": "u3BufiTZTK6AylGh80ZFd", + "value": 0 }, { - "id": 18, - "frec": 1 + "id": "S3um53pcko7_BPHy7R6FL", + "value": 0 }, { - "id": 19, - "frec": 1 + "id": "3dtvYLjbl5oDyhZO9eFRY", + "value": 0 }, { - "id": 20, - "frec": 1 + "id": "LngEMJa_ihV8mB7afZX-h", + "value": 0 }, { - "id": 21, - "frec": 1 + "id": "eo3Q5AjHJz5kp1EbdALwh", + "value": 0 }, { - "id": 22, - "frec": 1 - }, + "id": "nnTJQMJWfd2nuTSlFNEOy", + "value": 0 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpronombres.webp?alt=media&token=fde2895a-c02f-464c-b487-ec4826cca6bd" + }, + "text": "PRONOMBRES" + }, + { + "freq": 0, + "id": "0geft4arn_A8kL-rfUPYc", + "relations": [ { - "id": 23, - "frec": 1 + "id": "7iAXKVm22uMgr6aqZ1rr7", + "value": 2 }, { - "id": 26, - "frec": 1 + "id": "iiA1u1JKRmhe2jWVE_W79", + "value": 1 }, { - "id": 28, - "frec": 1 + "id": "8vR0HYniXtrrQqqSIN_JQ", + "value": 1 }, { - "id": 29, - "frec": 1 + "id": "9dvSIpeXa2_12Jip6noJP", + "value": 1 }, { - "id": 30, - "frec": 1 + "id": "FTngK946O8S8bYc0g7vM2", + "value": 1 }, { - "id": 31, - "frec": 1 + "id": "QZNQOaf0SdHDbx1otCmrH", + "value": 1 }, { - "id": 32, - "frec": 1 + "id": "jpKPg3hn6_GO1HSkeLNGz", + "value": 1 }, { - "id": 33, - "frec": 1 + "id": "JFldbhjqxK3fD6D2K4HY4", + "value": 1 }, { - "id": 34, - "frec": 1 + "id": "IEeIvawUD2GIAr1Wypr9i", + "value": 1 }, { - "id": 35, - "frec": 1 + "id": "BQm-YCPc0lfD1-mhecCTL", + "value": 2 }, { - "id": 38, - "frec": 1 + "id": "Fvm2C5NBq01tm0QK9d9QM", + "value": 0 }, { - "id": 39, - "frec": 1 + "id": "FaVvbVzZivuxTwxJTPubK", + "value": 0 }, { - "id": 41, - "frec": 1 + "id": "xbPnUL4qxvm30VFYNphh-", + "value": 0 }, { - "id": 43, - "frec": 1 + "id": "aXLBXkENJqTYkyZOP8TNS", + "value": 0 }, { - "id": 44, - "frec": 1 + "id": "Bub9ZYygLcly15D7_wYks", + "value": 0 }, { - "id": 49, - "frec": 2 + "id": "buyy_2ydocKoi9TnBhZ1N", + "value": 0 }, { - "id": 51, - "frec": 1 - }, + "id": "gzb-RNDLMNkgk9wnPILJi", + "value": 0 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpersonas.webp?alt=media&token=a5223e39-5426-4728-beda-8579fbc82adf" + }, + "text": "PERSONAS" + }, + { + "freq": 280, + "id": "1aM3sTxyb8yLSWtkn2MoO", + "relations": [ { - "id": 52, - "frec": 1 + "id": "aMs2YNnWkw4XN0gAm-jI3", + "value": 1 }, { - "id": 53, - "frec": 1 + "id": "TIsM6aTTZ9W8j6UhW9Qqj", + "value": 1 }, { - "id": 54, - "frec": 1 + "id": "eoYtISVZl3mdwoE_HW-Mv", + "value": 1 }, { - "id": 57, - "frec": 1 + "id": "jBqD3qhhcrioLlCU-xq5b", + "value": 1 }, { - "id": 61, - "frec": 1 + "id": "LksmOMPPOMArbrFsscqOW", + "value": 1 }, { - "id": 64, - "frec": 1 + "id": "QJhkOh48xapiTObEDQLB9", + "value": 1 }, { - "id": 65, - "frec": 1 + "id": "Q6LQqdLcvNOiCFjC0DVo2", + "value": 1 }, { - "id": 66, - "frec": 1 + "id": "TAbuXSnSHU6C3CQ4kbKVh", + "value": 1 }, { - "id": 68, - "frec": 1 + "id": "i2mlV3zGS6nrH2l6N2BlZ", + "value": 1 }, { - "id": 69, - "frec": 1 + "id": "9s5zV3_oGyDx_NEvsKCxX", + "value": 1 }, { - "id": 70, - "frec": 1 + "id": "oEyUWrQj1iYUnlEUdQQ5Z", + "value": 0 }, { - "id": 71, - "frec": 1 - }, + "id": "J7MmgugOu20UtMcMPj59r", + "value": 0 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Finstrumentos.webp?alt=media&token=b58a39b2-6c69-4b19-8658-8a6a4fe7ca2a" + }, + "text": "INSTRUMENTOS MUSICALES" + }, + { + "freq": 160, + "id": "384rVetrrLX4x4pJ0Y0Na", + "relations": [ { - "id": 76, - "frec": 1 + "id": "AWJXh6URGN0Vwm66i6IvL", + "value": 11 }, { - "id": 78, - "frec": 1 + "id": "cJMQi3SVmqvWJ00VxI6gy", + "value": 3 }, { - "id": 79, - "frec": 1 + "id": "Dm3yiKSB134LrjtW_KrO7", + "value": 7 }, { - "id": 81, - "frec": 1 + "id": "9UwpyOnOBoqr4mX3Juqm2", + "value": 1 }, { - "id": 82, - "frec": 1 + "id": "_1lOt0C0MQhvU8QWC6_oZ", + "value": 1 }, { - "id": 85, - "frec": 1 + "id": "JZRBfIXBkeuobtDXbLt5t", + "value": 1 }, { - "id": 86, - "frec": 1 + "id": "ChBc7LjL8dgzZ6LUCAHGh", + "value": 1 }, { - "id": 87, - "frec": 1 + "id": "hKJhXxultsxm0TJl1P8-L", + "value": 1 }, { - "id": 88, - "frec": 1 + "id": "q22wRFF21EigV8YzQ_MfV", + "value": 1 }, { - "id": 90, - "frec": 1 + "id": "0cdYDZ5HPaTmqTTN0_Ee8", + "value": 1 }, { - "id": 92, - "frec": 1 + "id": "XA952Z60D0-cesNCVA-OX", + "value": 1 }, { - "id": 93, - "frec": 1 + "id": "ZnMba2r4XIg9lPi_H2d_Z", + "value": 1 }, { - "id": 94, - "frec": 1 + "id": "UQ5B5K-tpk1XmQC1B9TjQ", + "value": 1 }, { - "id": 95, - "frec": 1 + "id": "IAdQsjTsbBUAMjlwW34cw", + "value": 1 }, { - "id": 97, - "frec": 1 + "id": "nm6e_s01gWHzdVj25BHyq", + "value": 0 }, { - "id": 98, - "frec": 1 + "id": "1pb6S-RR_3zdCq77YFiZ-", + "value": 0 }, { - "id": 100, - "frec": 1 + "id": "TpPNZLsh5jrN9RdPFwmA7", + "value": 0 }, { - "id": 101, - "frec": 1 + "id": "oO21zLMEtHEakvnuTohLu", + "value": 0 }, { - "id": 103, - "frec": 1 + "id": "tw1doIY-jFPofZjlPFj4z", + "value": 0 }, { - "id": 104, - "frec": 1 + "id": "TP-gGRcpcFyx1SrNRsdRV", + "value": 0 }, { - "id": 107, - "frec": 1 + "id": "0vttFf3nAGDW6g5wVStcH", + "value": 0 }, { - "id": 108, - "frec": 1 + "id": "0fHziRVxg0oNDp5pyiI8M", + "value": 0 }, { - "id": 112, - "frec": 1 + "id": "0v5fqIp8GmXsIHO0SPhtt", + "value": 0 }, { - "id": 113, - "frec": 1 + "id": "N2baGNTOapSaFDo1GURiW", + "value": 0 }, { - "id": 116, - "frec": 1 + "id": "Gm_qAGnL4OawmlYmTs7K5", + "value": 0 }, { - "id": 117, - "frec": 1 + "id": "ry_jOegpMf4nB3spGf4d2", + "value": 0 }, { - "id": 118, - "frec": 1 + "id": "MQHnvvU48NnEptP8a9w8C", + "value": 0 }, { - "id": 1029, - "frec": 1 + "id": "7VL_MgnLDY6hi8sbvcGIg", + "value": 0 } ], - "frecuencia": 1 + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fsociales.webp?alt=media&token=4bf39b77-0fdb-4d79-a407-14f5d66281d2" + }, + "text": "INTERACCIONES SOCIALES" }, { - "id": 1, - "texto": { - "en": "Adjectives", - "es": "ADJETIVOS" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fdescripcion.webp?alt=media&token=4dbde8ba-f144-4a12-90f6-013bf68d912d" - }, - "relacion": [ + "freq": 170, + "id": "4e6iVOPLAjnM6wCMUm5P4", + "relations": [ + { + "id": "JawnUo-pseWb3FDVMtxrQ", + "value": 0 + }, + { + "id": "K382TlNZjdMLLpAhCCXLG", + "value": 0 + }, + { + "id": "Ubaq6h7wasdP_YRombm2c", + "value": 0 + }, { - "id": 119, - "frec": 1 + "id": "3arbCGI6fMOWALLanZcg3", + "value": 0 }, { - "id": 121, - "frec": 1 + "id": "lKMW_xTZzCrCHRcGp-Z-n", + "value": 0 }, { - "id": 122, - "frec": 1 + "id": "R06chAQYswLtQK46OInW7", + "value": 0 }, { - "id": 123, - "frec": 1 + "id": "I5AJgba5GTdEjdpFB-LBf", + "value": 0 }, { - "id": 124, - "frec": 1 + "id": "27GbVOZ-szdnzsy92oY-X", + "value": 0 }, { - "id": 125, - "frec": 1 + "id": "9wE9Py6ztyqDrtaypsltA", + "value": 0 }, { - "id": 126, - "frec": 1 + "id": "ff7ES190q1dmFYZ7lo6x0", + "value": 0 }, { - "id": 129, - "frec": 1 + "id": "Bebnh8-UWwtYLnK6p3fKi", + "value": 0 }, { - "id": 130, - "frec": 1 + "id": "4J1bWl6BbbEdZsRGsgYH2", + "value": 0 }, { - "id": 131, - "frec": 1 + "id": "n5bZClAB6jXAZnwxIwH-1", + "value": 0 }, { - "id": 132, - "frec": 1 + "id": "l_ncJLRdVGBzzQc9yqBqs", + "value": 0 }, { - "id": 133, - "frec": 1 + "id": "RwlZ1jr2Ix3evzrW71lN0", + "value": 0 }, { - "id": 134, - "frec": 1 + "id": "upWXctTSKBtFNSXnXDK_u", + "value": 0 }, { - "id": 135, - "frec": 1 + "id": "jhJ2TOfdaRAcVeHGOjwua", + "value": 0 }, { - "id": 136, - "frec": 1 + "id": "D_4Weq7iyi7GMEsgP0xy6", + "value": 0 }, { - "id": 137, - "frec": 1 + "id": "kN85Lb_C4dLnww7sz1afK", + "value": 0 }, { - "id": 138, - "frec": 1 + "id": "TS9z8ZmMEwn0MGSfr9amH", + "value": 0 }, { - "id": 139, - "frec": 1 + "id": "vy-O5Zc5kxY8d-7RROvQI", + "value": 0 }, { - "id": 140, - "frec": 1 + "id": "UwvZVcX_CAQFrI6U4LsNT", + "value": 0 }, { - "id": 141, - "frec": 1 + "id": "4A_FNkGH1EDu0oabPurrL", + "value": 0 }, { - "id": 144, - "frec": 1 + "id": "t-w8e69GwxLyfxlWwHk9f", + "value": 0 }, { - "id": 147, - "frec": 1 + "id": "wnfSUkF8-tQiRTVou1_pd", + "value": 0 }, { - "id": 149, - "frec": 1 + "id": "M5q2CXmK0_WVaVUB_HJB3", + "value": 0 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_desayuno.webp?alt=media&token=25948a6f-b4bd-4958-ad10-3ea868660416" + }, + "text": "DESAYUNO Y MERIENDA" + }, + { + "freq": 310, + "id": "6vmRBH4shBk3UQEUM6APX", + "relations": [ + { + "id": "ecUOs24Pp5ZTRt_ZvED5W", + "value": 1 }, { - "id": 153, - "frec": 1 + "id": "tWxC4hR6di5zQC-Hujlev", + "value": 1 }, { - "id": 156, - "frec": 1 + "id": "bVN3R44VuZDw3IdQMolca", + "value": 1 }, { - "id": 158, - "frec": 1 + "id": "sSTGRl6DpYGZXp8vtTNbm", + "value": 1 }, { - "id": 159, - "frec": 1 + "id": "hmhAUgqvGp7nc1w25sRSx", + "value": 1 }, { - "id": 161, - "frec": 1 + "id": "m3qTT8tiGZQheKIWREzMT", + "value": 1 }, { - "id": 162, - "frec": 1 + "id": "CsKZSNiJw5Q48b26Kskf-", + "value": 1 }, { - "id": 164, - "frec": 1 + "id": "ptQZXjMQyXWycUD1kAkQo", + "value": 1 }, { - "id": 165, - "frec": 1 + "id": "gsU8pE9ozhR73xS2icwJ0", + "value": 1 }, { - "id": 167, - "frec": 1 + "id": "jprAsdXWGQKPlUWwgBBot", + "value": 1 }, { - "id": 171, - "frec": 1 + "id": "7EsVGfapPc_38mHCBy3C3", + "value": 1 }, { - "id": 172, - "frec": 1 + "id": "ebo03xnkyiHD2pKUKULmr", + "value": 1 }, { - "id": 177, - "frec": 1 + "id": "rlGO5jGKPL1vW-VF4nRqZ", + "value": 1 }, { - "id": 178, - "frec": 1 + "id": "NuhUikdCxP0NgsbO0wvAU", + "value": 1 }, { - "id": 179, - "frec": 1 + "id": "qy3c7gvRU7shWuJYr1kBk", + "value": 1 }, { - "id": 181, - "frec": 1 + "id": "hAZhogJSH3bL1iL237N8J", + "value": 1 }, { - "id": 194, - "frec": 1 + "id": "2CgcUkvJUskv982FvG54A", + "value": 1 }, { - "id": 199, - "frec": 1 + "id": "iimGxVoFWlq_THThR3vmF", + "value": 1 }, { - "id": 200, - "frec": 1 + "id": "sysOciGqtL7y4ULuyYVc-", + "value": 1 }, { - "id": 203, - "frec": 1 + "id": "OdCdTUAlbN6kvsPjby_Bi", + "value": 1 }, { - "id": 204, - "frec": 1 + "id": "8iFdjRTQU7ONGnigRTlm8", + "value": 1 }, { - "id": 205, - "frec": 1 + "id": "JQOpcZSCPGMOWZsN8w_yb", + "value": 1 }, { - "id": 207, - "frec": 1 + "id": "DqGa4gqd2ABDi45BT43x4", + "value": 1 }, { - "id": 208, - "frec": 1 + "id": "OKXIGnLh-i1ydTNj450Q8", + "value": 1 }, { - "id": 210, - "frec": 1 + "id": "1zU7kolOKsHP9-oomQW1Q", + "value": 1 }, { - "id": 212, - "frec": 1 + "id": "e5un1yrIuZHQi048e5kD6", + "value": 0 }, { - "id": 213, - "frec": 1 + "id": "3KgKNNnuYMrysEDs3Pu4Z", + "value": 0 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcine.webp?alt=media&token=4109bb74-ab3d-4cda-99fb-34e7030e8762" + }, + "text": "CINE Y PELÍCULAS" + }, + { + "freq": 260, + "id": "7Jm3bDhPInSlwhdy20dKF", + "relations": [ + { + "id": "dLHDzm0rfgL-vXTx14HSm", + "value": 1 }, { - "id": 217, - "frec": 1 + "id": "bVN3R44VuZDw3IdQMolca", + "value": 1 }, { - "id": 218, - "frec": 1 + "id": "AOp6VGyjYIV0Ym9d0basJ", + "value": 1 }, { - "id": 219, - "frec": 1 + "id": "5vxTXbPl4Y0yezGu7p1f6", + "value": 1 }, { - "id": 233, - "frec": 1 + "id": "ZBIFtTq-BH1jv5jLbzrhj", + "value": 1 }, { - "id": 234, - "frec": 1 + "id": "b9Y5MrR-jn8fh77gAkLZy", + "value": 1 }, { - "id": 237, - "frec": 1 + "id": "5Tdy0Gu9SiLsPfWwd-Y2E", + "value": 1 }, { - "id": 238, - "frec": 1 + "id": "F8roVYxKZi88UUGfOvTwl", + "value": 1 }, { - "id": 242, - "frec": 1 + "id": "LmGq1AZs2a0x26r7E9GUj", + "value": 1 }, { - "id": 244, - "frec": 1 + "id": "viAHJeLRr_6j9dEi5klj_", + "value": 1 }, { - "id": 245, - "frec": 1 + "id": "N_893wsadpGg3Ip5sEThe", + "value": 1 }, { - "id": 248, - "frec": 1 + "id": "93hsW10TmX3Vcq_4IvcZ0", + "value": 1 }, { - "id": 253, - "frec": 1 + "id": "9kgRI3KlOIVSuylKffW9g", + "value": 1 }, { - "id": 256, - "frec": 1 + "id": "_eug92AvR1UXpYlfm6o_Q", + "value": 1 }, { - "id": 263, - "frec": 1 + "id": "tQwMPLvqAMAstcqvnOERE", + "value": 1 }, { - "id": 267, - "frec": 1 + "id": "dHM0qnbmtJAkZY0WBsqaY", + "value": 1 }, { - "id": 268, - "frec": 1 + "id": "QGf1Tb1roL7HAXUSrRqRJ", + "value": 1 }, { - "id": 272, - "frec": 1 + "id": "m0434KkjeTv8SGN7WxR2C", + "value": 1 }, { - "id": 274, - "frec": 1 + "id": "H8Bsrr2NK9Q3WGbEp8PMe", + "value": 1 }, { - "id": 280, - "frec": 1 + "id": "L19r487_d3RqWXiNuh3gE", + "value": 1 }, { - "id": 281, - "frec": 1 + "id": "Vzov0z9acB-I1_W_CcFcY", + "value": 1 }, { - "id": 282, - "frec": 1 - } - ] - }, - { - "id": 2, - "texto": { - "en": "Animals", - "es": "ANIMALES" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fanimales.webp?alt=media&token=de80d51b-647a-4860-9233-74b0925e053e" - }, - "relacion": [ + "id": "LaKT8VTw0_6rvordp5-R8", + "value": 1 + }, { - "id": 283, - "frec": 1 + "id": "cxMNBGV3LytDXgwDMCiga", + "value": 1 }, { - "id": 286, - "frec": 1 + "id": "GxrDtsdGcLepdsQr6V9DT", + "value": 1 }, { - "id": 288, - "frec": 1 + "id": "MYqfOzKx2qMHop8GaHs0I", + "value": 1 }, { - "id": 290, - "frec": 1 + "id": "atVEXuftxSiDDj8rzUlFg", + "value": 1 }, { - "id": 293, - "frec": 1 + "id": "KC18_sTEqKucPQ-iwEKYY", + "value": 1 }, { - "id": 294, - "frec": 1 + "id": "9mLx-YMK81AflitELQFqk", + "value": 1 }, { - "id": 296, - "frec": 1 + "id": "OwHzJdOQTFOA8daCVRwm6", + "value": 1 }, { - "id": 297, - "frec": 1 + "id": "WWK2v56LM-zWqujabk9bM", + "value": 1 }, { - "id": 298, - "frec": 1 + "id": "CBTemIvgIN1UAtftkc3sz", + "value": 0 }, { - "id": 299, - "frec": 1 + "id": "9QyJdpUn0f6g7FxWs5qpO", + "value": 0 }, { - "id": 301, - "frec": 1 + "id": "hUYfE_vmNBT_7E60YZsSu", + "value": 0 }, { - "id": 310, - "frec": 1 + "id": "PszHdOxMsS_tAzSrN52Wa", + "value": 0 }, { - "id": 313, - "frec": 1 + "id": "u2e4Zh8qwJF7zKkohQ8df", + "value": 0 }, { - "id": 314, - "frec": 1 + "id": "G09TvOzDSG5m3hTQD9Tej", + "value": 0 }, { - "id": 320, - "frec": 1 + "id": "LEVKlDlJ0wHo5QEjCNAGa", + "value": 0 }, { - "id": 323, - "frec": 1 + "id": "EUsNyf5bDdSLqvZKH1Ltx", + "value": 0 }, { - "id": 327, - "frec": 1 + "id": "N2baGNTOapSaFDo1GURiW", + "value": 0 }, { - "id": 331, - "frec": 1 + "id": "ZBIFtTq-BH1jv5jLbzrhj", + "value": 0 }, { - "id": 332, - "frec": 1 + "id": "JGm4BL7HAfuxX_PGe6Jzk", + "value": 0 }, { - "id": 333, - "frec": 1 + "id": "U1KQsrvTa2E00-ugc-Iy6", + "value": 0 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fclase_plastica.webp?alt=media&token=fb56f0bd-50d1-4a90-b32d-09e85ce95514" + }, + "text": "CLASE DE ARTE" + }, + { + "freq": 130, + "id": "7ngCuvmAnM_7ygpFQgLpk", + "relations": [ + { + "id": "L19r487_d3RqWXiNuh3gE", + "value": 1 }, { - "id": 334, - "frec": 1 + "id": "viAHJeLRr_6j9dEi5klj_", + "value": 1 }, { - "id": 335, - "frec": 1 + "id": "N_893wsadpGg3Ip5sEThe", + "value": 1 }, { - "id": 337, - "frec": 1 + "id": "93hsW10TmX3Vcq_4IvcZ0", + "value": 1 }, { - "id": 340, - "frec": 1 + "id": "9kgRI3KlOIVSuylKffW9g", + "value": 1 }, { - "id": 342, - "frec": 1 + "id": "_eug92AvR1UXpYlfm6o_Q", + "value": 1 }, { - "id": 342, - "frec": 1 + "id": "tQwMPLvqAMAstcqvnOERE", + "value": 1 }, { - "id": 348, - "frec": 1 + "id": "dHM0qnbmtJAkZY0WBsqaY", + "value": 1 }, { - "id": 354, - "frec": 1 + "id": "QGf1Tb1roL7HAXUSrRqRJ", + "value": 1 }, { - "id": 356, - "frec": 1 + "id": "m0434KkjeTv8SGN7WxR2C", + "value": 1 }, { - "id": 357, - "frec": 1 + "id": "H8Bsrr2NK9Q3WGbEp8PMe", + "value": 1 }, { - "id": 359, - "frec": 1 + "id": "Vzov0z9acB-I1_W_CcFcY", + "value": 1 }, { - "id": 362, - "frec": 1 + "id": "LaKT8VTw0_6rvordp5-R8", + "value": 1 }, { - "id": 363, - "frec": 1 + "id": "cxMNBGV3LytDXgwDMCiga", + "value": 1 }, { - "id": 367, - "frec": 1 + "id": "GxrDtsdGcLepdsQr6V9DT", + "value": 1 }, { - "id": 374, - "frec": 1 + "id": "MYqfOzKx2qMHop8GaHs0I", + "value": 1 }, { - "id": 375, - "frec": 1 + "id": "9FiWvg197C-Riid-DVysN", + "value": 0 }, { - "id": 376, - "frec": 1 - } - ] - }, - { - "id": 3, - "texto": { - "en": "Food", - "es": "ALIMENTOS" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcomidas.webp?alt=media&token=9e4bc673-e0d9-4e75-bb78-ea9b0dd294e2" - }, - "relacion": [ - { - "id": 391, - "texto": { - "en": "chard", - "es": "acelga" - }, - "tipo": 2, - "imagen": { - "picto": "acelga" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 393, - "texto": { - "en": "almond", - "es": "almendras" - }, - "tipo": 2, - "imagen": { - "picto": "almendras" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 396, - "texto": { - "en": "sugar", - "es": "azúcar" - }, - "tipo": 2, - "imagen": { - "picto": "azucar" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 394, - "texto": { - "en": "pineapple", - "es": "ananá" - }, - "tipo": 2, - "imagen": { - "picto": "anana" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 398, - "texto": { - "en": "sandwich", - "es": "bocadillo" - }, - "tipo": 2, - "imagen": { - "picto": "bocadillo" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 399, - "texto": { - "en": "pumpkin", - "es": "calabaza" - }, - "tipo": 2, - "imagen": { - "picto": "calabaza" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 400, - "texto": { - "en": "caneloni", - "es": "canelones" - }, - "tipo": 2, - "imagen": { - "picto": "canelones" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 401, - "texto": { - "en": "cappchino", - "es": "capuchino" - }, - "tipo": 2, - "imagen": { - "picto": "capuchino" - }, - "relacion": [], - "agenda": 0, - "gps": 0, - "esSugerencia": false - }, - { - "id": 402, - "texto": { - "en": "chestnuts", - "es": "castañas" - }, - "tipo": 2, - "imagen": { - "picto": "castanas" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 403, - "texto": { - "en": "onion", - "es": "cebolla" - }, - "tipo": 2, - "imagen": { - "picto": "cebolla" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 404, - "texto": { - "en": "cherry", - "es": "cerezas" - }, - "tipo": 2, - "imagen": { - "picto": "cerezas" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 406, - "texto": { - "en": "chupetin", - "es": "chupetin" - }, - "tipo": 2, - "imagen": { - "picto": "chupetin" - }, - "relacion": [], - "agenda": 0, - "gps": 0, - "edad": [ - "NINO" - ] - }, - { - "id": 407, - "texto": { - "en": "plum", - "es": "ciruela" - }, - "tipo": 2, - "imagen": { - "picto": "ciruela" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 408, - "texto": { - "en": "apricot", - "es": "damasco" - }, - "tipo": 2, - "imagen": { - "picto": "damasco" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 412, - "texto": { - "en": "creme caramel", - "es": "flan" - }, - "tipo": 2, - "imagen": { - "picto": "flan" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 413, - "texto": { - "en": "raspberry", - "es": "frambuesa" - }, - "tipo": 2, - "imagen": { - "picto": "frambuesas" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 414, - "texto": { - "en": "strawberry", - "es": "frutilla" - }, - "tipo": 2, - "imagen": { - "picto": "fresa" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 415, - "texto": { - "en": "cookie", - "es": "galleta" - }, - "tipo": 2, - "imagen": { - "picto": "galletas" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 417, - "texto": { - "en": "jelly", - "es": "gelatina" - }, - "tipo": 2, - "imagen": { - "picto": "gelatina" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 420, - "texto": { - "en": "boiled egg", - "es": "huevo duro" - }, - "tipo": 2, - "imagen": { - "picto": "huevo_duro" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 421, - "texto": { - "en": "fried eg", - "es": "huevo frito" - }, - "tipo": 2, - "imagen": { - "picto": "huevo_frito" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 424, - "texto": { - "en": "canned tuna", - "es": "lata de atún" - }, - "tipo": 2, - "imagen": { - "picto": "atun" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 425, - "texto": { - "en": "canned sardine", - "es": "lata de sardinas" - }, - "tipo": 2, - "imagen": { - "picto": "lata_de_sardinas" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 426, - "texto": { - "en": "milk with cacao", - "es": "leche con cacáo" - }, - "tipo": 2, - "imagen": { - "picto": "leche_con_cacao" - }, - "relacion": [], - "agenda": 0, - "gps": 0, - "edad": [ - "NINO" - ] - }, - { - "id": 427, - "texto": { - "en": "milk and cookies", - "es": "leche y galletas" - }, - "tipo": 2, - "imagen": { - "picto": "leche_y_galletas" - }, - "relacion": [], - "agenda": 0, - "gps": 0, - "esSugerencia": false - }, - { - "id": 428, - "texto": { - "en": "lettuce", - "es": "lechuga" - }, - "tipo": 2, - "imagen": { - "picto": "lechuga" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 430, - "texto": { - "en": "corn", - "es": "maiz" - }, - "tipo": 2, - "imagen": { - "picto": "maiz" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 431, - "texto": { - "en": "butter", - "es": "manteca" - }, - "tipo": 2, - "imagen": { - "picto": "manteca" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 432, - "texto": { - "en": "peach", - "es": "durazno" - }, - "tipo": 2, - "imagen": { - "picto": "melocoton" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 435, - "texto": { - "en": "orange", - "es": "naranja" - }, - "tipo": 2, - "imagen": { - "picto": "naranja" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 438, - "texto": { - "en": "white bread", - "es": "pan blanco" - }, - "tipo": 2, - "imagen": { - "picto": "pan_blanco" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 439, - "texto": { - "en": "black bread", - "es": "pan negro" - }, - "tipo": 2, - "imagen": { - "picto": "pan_negro" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 447, - "texto": { - "en": "grapefruit", - "es": "pomelo" - }, - "tipo": 2, - "imagen": { - "picto": "pomelo" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 449, - "texto": { - "en": "smashed potatoes", - "es": "puré" - }, - "tipo": 2, - "imagen": { - "picto": "pure" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 458, - "texto": { - "en": "sandwich", - "es": "sandwich" - }, - "tipo": 2, - "imagen": { - "picto": "sandwich" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 462, - "texto": { - "en": "pie", - "es": "tarta" - }, - "tipo": 2, - "imagen": { - "picto": "tarta" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 463, - "texto": { - "en": "tomato", - "es": "tomate" - }, - "tipo": 2, - "imagen": { - "picto": "tomate" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 465, - "texto": { - "en": "toast", - "es": "tostada" - }, - "tipo": 2, - "imagen": { - "picto": "tostada" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 468, - "texto": { - "en": "apple juice", - "es": "jugo de manzana" - }, - "tipo": 2, - "imagen": { - "picto": "zumo_de_manzana" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 469, - "texto": { - "en": "peach juice", - "es": "jugo de durazno" - }, - "tipo": 2, - "imagen": { - "picto": "melocoton" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 471, - "texto": { - "en": "grape juice", - "es": "jugo de uva" - }, - "tipo": 2, - "imagen": { - "picto": "zumo_de_uva" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 472, - "texto": { - "en": "soup", - "es": "Sopa" - }, - "tipo": 2, - "imagen": { - "picto": "sopa" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 473, - "texto": { - "en": "banana", - "es": "banana" - }, - "tipo": 2, - "imagen": { - "picto": "banana" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 474, - "texto": { - "en": "apple", - "es": "manzana" - }, - "tipo": 2, - "imagen": { - "picto": "manzana" - }, - "relacion": [], - "agenda": 0, - "gps": 0, - "esSugerencia": false - }, - { - "id": 475, - "texto": { - "en": "pear", - "es": "pera" - }, - "tipo": 2, - "imagen": { - "picto": "pera" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 476, - "texto": { - "en": "fish", - "es": "pescado" - }, - "tipo": 2, - "imagen": { - "picto": "zid_pescado" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 477, - "texto": { - "en": "salad", - "es": "ensalada" - }, - "tipo": 2, - "imagen": { - "picto": "zid_ensalada" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 478, - "texto": { - "en": "vegetables", - "es": "verduras" - }, - "tipo": 2, - "imagen": { - "picto": "zid_verduras" - }, - "relacion": [], - "agenda": 0, - "gps": 0, - "esSugerencia": false - }, - { - "id": 480, - "texto": { - "en": "pasta", - "es": "pasta" - }, - "tipo": 2, - "imagen": { - "picto": "zid_pasta" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 481, - "texto": { - "en": "rice", - "es": "arroz" - }, - "tipo": 2, - "imagen": { - "picto": "zid_arroz" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 482, - "texto": { - "en": "beef", - "es": "carne" - }, - "tipo": 2, - "imagen": { - "picto": "zid_carne" - }, - "relacion": [], - "agenda": 0, - "gps": 0, - "esSugerencia": false - }, - { - "id": 483, - "texto": { - "en": "fruit", - "es": "fruta" - }, - "tipo": 2, - "imagen": { - "picto": "zid_fruta" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 484, - "texto": { - "en": "yoghurt", - "es": "yogur" - }, - "tipo": 2, - "imagen": { - "picto": "zid_yogurt" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 485, - "texto": { - "en": "cake", - "es": "torta" - }, - "tipo": 2, - "imagen": { - "picto": "zid_tarta" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 486, - "texto": { - "en": "ice cream", - "es": "helado" - }, - "tipo": 2, - "imagen": { - "picto": "zid_helado" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 487, - "texto": { - "en": "oil", - "es": "aceite" - }, - "tipo": 2, - "imagen": { - "picto": "aceite" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 489, - "texto": { - "en": "salt", - "es": "sal" - }, - "tipo": 2, - "imagen": { - "picto": "sal" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 490, - "texto": { - "en": "mayo", - "es": "mayonesa" - }, - "tipo": 2, - "imagen": { - "picto": "mayonesa" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 492, - "texto": { - "en": "ketchup", - "es": "ketchup" - }, - "tipo": 2, - "imagen": { - "picto": "ketchup" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 494, - "texto": { - "en": "Candy", - "es": "Golosina" - }, - "tipo": 2, - "imagen": { - "picto": "ic_dulces" - }, - "relacion": [], - "agenda": 0, - "gps": 0, - "edad": [ - "JOVEN", - "NINO" - ], - "esSugerencia": false - }, - { - "id": 495, - "texto": { - "en": "milk", - "es": "leche" - }, - "tipo": 2, - "imagen": { - "picto": "leche" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 496, - "texto": { - "en": "coffee", - "es": "café" - }, - "tipo": 2, - "imagen": { - "picto": "cafe" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 497, - "texto": { - "en": "juice", - "es": "jugo" - }, - "tipo": 2, - "imagen": { - "picto": "ic_bebida" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 498, - "texto": { - "en": "chocolate", - "es": "chocolate" - }, - "tipo": 2, - "imagen": { - "picto": "chocolate" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 499, - "texto": { - "en": "te", - "es": "té" - }, - "tipo": 2, - "imagen": { - "picto": "te" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 500, - "texto": { - "en": "water", - "es": "agua" - }, - "tipo": 2, - "imagen": { - "picto": "agua" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 501, - "texto": { - "en": "soda", - "es": "gaseosa" - }, - "tipo": 2, - "imagen": { - "picto": "cocacola" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 502, - "texto": { - "en": "beer", - "es": "cerveza" - }, - "tipo": 2, - "imagen": { - "picto": "cerveza" - }, - "relacion": [], - "agenda": 0, - "gps": 0, - "edad": [ - "ADULTO" - ] - }, - { - "id": 503, - "texto": { - "en": "wine", - "es": "vino" - }, - "tipo": 2, - "imagen": { - "picto": "vino" - }, - "relacion": [], - "agenda": 0, - "gps": 0, - "edad": [ - "ADULTO" - ] - }, - { - "id": 504, - "texto": { - "en": "poultry", - "es": "pollo" - }, - "tipo": 2, - "imagen": { - "picto": "zid_pollo" - }, - "relacion": [], - "agenda": 0, - "gps": 0, - "esSugerencia": false - }, - { - "id": 505, - "texto": { - "en": "chicken thigh", - "es": "muslo de pollo" - }, - "tipo": 2, - "imagen": { - "picto": "muslo_de_pollo" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 507, - "texto": { - "en": "egg", - "es": "huevo" - }, - "tipo": 2, - "imagen": { - "picto": "zid_huevo" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 510, - "texto": { - "en": "fish", - "es": "pescado" - }, - "tipo": 2, - "imagen": { - "picto": "zid_pescado" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 512, - "texto": { - "en": "steak", - "es": "filete" - }, - "tipo": 2, - "imagen": { - "picto": "filete" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 515, - "texto": { - "en": "hamburguer", - "es": "hamburguesa" - }, - "tipo": 2, - "imagen": { - "picto": "hamburguesa" - }, - "relacion": [], - "agenda": 0, - "gps": 0, - "esSugerencia": false - }, - { - "id": 516, - "texto": { - "en": "raw ham", - "es": "jamón crudo" - }, - "tipo": 2, - "imagen": { - "picto": "jamon" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 517, - "texto": { - "en": "cooked ham", - "es": "jamón cocido" - }, - "tipo": 2, - "imagen": { - "picto": "jamon_de_york" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 521, - "texto": { - "en": "cheese", - "es": "queso" - }, - "tipo": 2, - "imagen": { - "picto": "queso" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 524, - "texto": { - "en": "sausage", - "es": "salchichas" - }, - "tipo": 2, - "imagen": { - "picto": "salchichas" - }, - "relacion": [], - "agenda": 0, - "gps": 0 + "id": "rwyX2YemNEx_Mh64IArDQ", + "value": 0 } ], - "frecuencia": 1 + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_colores.webp?alt=media&token=04309e00-d682-43f3-9605-bde0b5b4ab9a" + }, + "text": "COLORES" }, { - "id": 4, - "texto": { - "en": "House", - "es": "CASA" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_casa.webp?alt=media&token=f1d197b6-db37-44e6-b4bc-8ba31b0fa4aa" - }, - "relacion": [ + "freq": 80, + "id": "7w5ACMFdOCTkBrS911MA1", + "relations": [ { - "id": 2, - "frec": 1 + "id": "qsA1zm1DOlItK7DCWzAw8", + "value": 1 }, { - "id": 3, - "frec": 1 + "id": "DSgrhLHauub-gBqMGwacO", + "value": 1 }, { - "id": 5, - "frec": 1 + "id": "i0wB--S4sdL8Q4H9b93UY", + "value": 1 }, { - "id": 8, - "frec": 1 + "id": "Dv9MSCRYbR4Q3K114wXki", + "value": 1 }, { - "id": 17, - "frec": 1 + "id": "_CsJMxqGcNSaujXwRZcpu", + "value": 1 }, { - "id": 20, - "frec": 1 + "id": "MqQgYn5B0uV-DMORCBOmV", + "value": 1 }, { - "id": 199, - "frec": 1 + "id": "khUUL_1JQGngApqBRDh_q", + "value": 1 }, { - "id": 263, - "frec": 1 + "id": "Om1Bvqu8nmGuNGwV8hndM", + "value": 1 }, { - "id": 599, - "frec": 1 + "id": "AQKGKdoX5CYycZ2YqBZVW", + "value": 1 }, { - "id": 605, - "frec": 1 + "id": "ibtmTEP3QGDY8TyVLteuX", + "value": 1 }, { - "id": 653, - "frec": 1 + "id": "-LE2iv3Pwr5KuIyM5bYb3", + "value": 1 }, { - "id": 678, - "frec": 1 + "id": "Fogupb264IyCtbZ-Q2D6w", + "value": 1 }, { - "id": 731, - "frec": 1 + "id": "9EqfwMNtATh1fwMhyn_B1", + "value": 1 }, { - "id": 755, - "frec": 1 + "id": "RBCjBvNXQSZOOpg-5lBlK", + "value": 1 }, { - "id": 758, - "frec": 1 + "id": "K8e2-KkvZfFOQaXnhR37x", + "value": 1 }, { - "id": 773, - "frec": 1 + "id": "tYwEpd2EOtH8wEUr-jwHk", + "value": 1 }, { - "id": 774, - "frec": 1 + "id": "M5q2CXmK0_WVaVUB_HJB3", + "value": 1 }, { - "id": 1012, - "frec": 1 + "id": "Mw6WRebMAKWwXfAvDA7vu", + "value": 1 }, { - "id": 1019, - "frec": 1 + "id": "9FiWvg197C-Riid-DVysN", + "value": 1 }, { - "id": 1023, - "frec": 1 + "id": "MWIzTM6zhTWL1V-brLtBx", + "value": 1 }, { - "id": 1024, - "frec": 1 + "id": "WtYSntcy2CijEORmROeaj", + "value": 1 }, { - "id": 1025, - "frec": 1 + "id": "mTklFAI-FVVLsMKoASZ7T", + "value": 1 }, { - "id": 1026, - "frec": 1 + "id": "QcGJ9u_JqmrW0X47PXWH4", + "value": 1 }, { - "id": 1027, - "frec": 1 + "id": "zm_6R89hr4wjuVkifiYrk", + "value": 1 }, { - "id": 1030, - "frec": 1 + "id": "1Rv9-SSJjHptwvzqLbdbx", + "value": 1 }, { - "id": 1032, - "frec": 1 - } - ] - }, - { - "id": 5, - "texto": { - "en": "School", - "es": "COLEGIO" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_escuela.webp?alt=media&token=05c5460c-c3a5-4404-9389-d6a67e79bb5d" - }, - "relacion": [ - { - "id": 4, - "frec": 1 + "id": "xGsyYCjDzQugVzSaK8CuA", + "value": 1 }, { - "id": 15, - "frec": 1 + "id": "xT4BPNmF-5WAQLfs3cUpS", + "value": 1 }, { - "id": 14, - "frec": 1 + "id": "gff2FqDlgXknRld7YMLWl", + "value": 1 }, { - "id": 18, - "frec": 1 + "id": "UvRS0KmtZn3dq7e8L5RcE", + "value": 1 }, { - "id": 21, - "frec": 1 + "id": "32PnZjlnQbTJo4nL9YJYe", + "value": 1 }, { - "id": 32, - "frec": 1 + "id": "IsWUeiPnDEnzxePKclBNp", + "value": 1 }, { - "id": 43, - "frec": 1 + "id": "wnfSUkF8-tQiRTVou1_pd", + "value": 1 }, { - "id": 101, - "frec": 1 + "id": "81UJI7xOa5l9mVceqkIP5", + "value": 1 }, { - "id": 662, - "frec": 1 + "id": "uFoytOG4qsXzBk979t63y", + "value": 1 }, { - "id": 678, - "frec": 1 + "id": "5Tdy0Gu9SiLsPfWwd-Y2E", + "value": 1 }, { - "id": 751, - "frec": 1 + "id": "PogTYrGfa2WNfBRuA8O4e", + "value": 1 }, { - "id": 752, - "frec": 1 + "id": "5i3kSsCKF7Oa9iJQvXiTe", + "value": 1 }, { - "id": 753, - "frec": 1 + "id": "1DjW-XvWN7iOqoJPRSWwY", + "value": 1 }, { - "id": 754, - "frec": 1 + "id": "gzCjycNS8Cf0vNlo1klji", + "value": 1 }, { - "id": 755, - "frec": 1 + "id": "eduqLSyC3m4uB1Oee6dt6", + "value": 1 }, { - "id": 756, - "frec": 1 + "id": "2RZTRMX56BFLrW7tLJ3Hy", + "value": 1 }, { - "id": 757, - "frec": 1 + "id": "lXH68vGIuZdfA8xVrS8iw", + "value": 1 }, { - "id": 760, - "frec": 1 + "id": "KNH4sLRpVKtHXQa-0y84K", + "value": 1 }, { - "id": 762, - "frec": 1 + "id": "ZAnmv4CLb7hldYUlp2wJU", + "value": 1 }, { - "id": 766, - "frec": 1 + "id": "6nhNeVjDfDi-GmreaqfVo", + "value": 1 }, { - "id": 768, - "frec": 1 + "id": "0Z7uFXpp-XRXmqM8ILhIC", + "value": 1 }, { - "id": 770, - "frec": 1 + "id": "2Vc2H462cutVtUC-5omJk", + "value": 1 }, { - "id": 771, - "frec": 1 + "id": "mRK--C5Q1aGe8MMPJJLYi", + "value": 1 }, { - "id": 769, - "frec": 1 - } - ] - }, - { - "id": 6, - "texto": { - "en": "Colors", - "es": "COLORES" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_colores.webp?alt=media&token=04309e00-d682-43f3-9605-bde0b5b4ab9a" - }, - "relacion": [ + "id": "VoZumy5GtnRdqSOmXAw7j", + "value": 1 + }, { - "id": 733, - "frec": 1 + "id": "K6hd20tWZfwwlYYi7jctt", + "value": 1 }, { - "id": 734, - "frec": 1 + "id": "IO8uTb1K7ElENgp2ujZoK", + "value": 1 }, { - "id": 736, - "frec": 1 + "id": "G2i9LSK4A19237Zp1vXqF", + "value": 1 }, { - "id": 737, - "frec": 1 + "id": "HTBNWax6FCSGXuboGsVUW", + "value": 1 }, { - "id": 738, - "frec": 1 + "id": "u1nIt_oFH426g1IVhlYk5", + "value": 1 }, { - "id": 739, - "frec": 1 + "id": "Qo3Qn_nMe3E6EqNw0UdNZ", + "value": 1 }, { - "id": 740, - "frec": 1 + "id": "aSzpwNza22HZp46Sh6wfx", + "value": 1 }, { - "id": 742, - "frec": 1 + "id": "paPpjw1XVC9-6xcueJsrY", + "value": 1 }, { - "id": 743, - "frec": 1 + "id": "mx6dmRLXA_lkN1QlP71vq", + "value": 1 }, { - "id": 744, - "frec": 1 + "id": "s0BXoyn7AqUAlZ9BOHY6S", + "value": 1 }, { - "id": 745, - "frec": 1 + "id": "d6s8fLFBiQ3KEJlNdJfUW", + "value": 1 }, { - "id": 746, - "frec": 1 + "id": "QUTQLuD2Gv7fHh0V_O5tg", + "value": 1 }, { - "id": 747, - "frec": 1 + "id": "uZRwbLa1lEG7ol0UJKRBj", + "value": 1 }, { - "id": 748, - "frec": 1 + "id": "okr5oAG2U8Er1XwQ8XbWD", + "value": 0 }, { - "id": 749, - "frec": 1 + "id": "qOsbXyvBTMDAwvvnI0iFn", + "value": 0 }, { - "id": 750, - "frec": 1 - } - ] - }, - { - "id": 7, - "texto": { - "en": "Concepts", - "es": "CONCEPTOS" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fconceptos.webp?alt=media&token=544d07e2-680b-427f-a657-9a1438529627" - }, - "relacion": [ + "id": "uDg7Yy86PlwsAd-U96vJR", + "value": 0 + }, { - "id": 702, - "frec": 1 + "id": "1nhsReHG-f-bW-xaZBsxY", + "value": 0 }, { - "id": 703, - "frec": 1 + "id": "40q0NJ6vsziJDNFBqho7Y", + "value": 0 }, { - "id": 704, - "frec": 1 + "id": "3mwcdenOurU_e59ChLqb0", + "value": 0 }, { - "id": 706, - "frec": 1 + "id": "dS-KyYREUQIk7sDlmsvoa", + "value": 0 }, { - "id": 707, - "frec": 1 + "id": "IM8OUKCzHwnjAQWPFgnn6", + "value": 0 }, { - "id": 708, - "frec": 1 + "id": "vPicdKLrhT2wmAAPPukKP", + "value": 0 }, { - "id": 712, - "frec": 1 + "id": "EM8VyonJ7WNdvmRyE3nhZ", + "value": 0 }, { - "id": 713, - "frec": 1 + "id": "c7kK5ROVbO3DHrwSFEawq", + "value": 0 }, { - "id": 714, - "frec": 1 + "id": "ThqkHs4az5tgLqLcfFPaZ", + "value": 0 }, { - "id": 718, - "frec": 1 + "id": "KvY6Taigm4Va_cVjXAfGR", + "value": 0 }, { - "id": 721, - "frec": 1 + "id": "uFoytOG4qsXzBk979t63y", + "value": 0 }, { - "id": 722, - "frec": 1 + "id": "ibtmTEP3QGDY8TyVLteuX", + "value": 0 }, { - "id": 725, - "frec": 1 + "id": "rwyX2YemNEx_Mh64IArDQ", + "value": 0 }, { - "id": 728, - "frec": 1 + "id": "uzSwgQNnV8ZrjxpN5Bz_a", + "value": 0 }, { - "id": 729, - "frec": 1 + "id": "eDX2HSkGaY2TeVwPjR07S", + "value": 0 }, { - "id": 730, - "frec": 1 + "id": "oOkD8Wmvb4t9I2EWqT1Nr", + "value": 0 }, { - "id": 731, - "frec": 1 + "id": "VwZ4EKSggYWxlnAbp-pNB", + "value": 0 }, { - "id": 732, - "frec": 1 + "id": "Td5pgVQDTFOftUgOJ-bD-", + "value": 0 } - ] + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fdescripcion.webp?alt=media&token=4dbde8ba-f144-4a12-90f6-013bf68d912d" + }, + "text": "ADJETIVOS Y ADVERBIOS" }, { - "id": 8, - "texto": { - "en": "Conjunctions", - "es": "CONJUNCIONES" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fconjunciones.webp?alt=media&token=bd3a504d-d5ca-45cc-a29f-869a6b578174" - }, - "relacion": [ - { - "id": 889, - "frec": 1 - }, + "freq": 320, + "id": "8FPdnkMzOIBVTW5-TQxWX", + "relations": [ { - "id": 898, - "frec": 1 + "id": "OKXIGnLh-i1ydTNj450Q8", + "value": 0 }, { - "id": 904, - "frec": 1 + "id": "1zU7kolOKsHP9-oomQW1Q", + "value": 0 }, { - "id": 910, - "frec": 1 + "id": "DqGa4gqd2ABDi45BT43x4", + "value": 0 }, { - "id": 912, - "frec": 1 + "id": "WL3ZN-W_zgnuTJpuqz0YQ", + "value": 0 }, { - "id": 923, - "frec": 1 + "id": "y0SViQxW8Y-yiX1Z7gXWt", + "value": 0 } ], - "frecuencia": 1 + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/6472/6472_500.png" + }, + "text": "PERSONAJES" }, { - "id": 9, - "texto": { - "en": "Body", - "es": "CUERPO" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpartes_del_cuerpo.webp?alt=media&token=b09b6919-2789-46a6-a883-d21c55859e08" - }, - "relacion": [ - { - "id": 776, - "frec": 1 - }, + "freq": 230, + "id": "8t8CAggTj3HuznkKhfXle", + "relations": [ { - "id": 777, - "frec": 1 + "id": "AWJXh6URGN0Vwm66i6IvL", + "value": 11 }, { - "id": 778, - "frec": 1 + "id": "Dm3yiKSB134LrjtW_KrO7", + "value": 7 }, { - "id": 780, - "frec": 1 + "id": "9UwpyOnOBoqr4mX3Juqm2", + "value": 1 }, { - "id": 781, - "frec": 1 + "id": "_1lOt0C0MQhvU8QWC6_oZ", + "value": 1 }, { - "id": 782, - "frec": 1 + "id": "JZRBfIXBkeuobtDXbLt5t", + "value": 1 }, { - "id": 783, - "frec": 1 + "id": "ChBc7LjL8dgzZ6LUCAHGh", + "value": 1 }, { - "id": 784, - "frec": 1 + "id": "hKJhXxultsxm0TJl1P8-L", + "value": 1 }, { - "id": 785, - "frec": 1 + "id": "ZnMba2r4XIg9lPi_H2d_Z", + "value": 1 }, { - "id": 786, - "frec": 1 + "id": "UQ5B5K-tpk1XmQC1B9TjQ", + "value": 1 }, { - "id": 787, - "frec": 1 + "id": "jhJ2TOfdaRAcVeHGOjwua", + "value": 1 }, { - "id": 788, - "frec": 1 + "id": "75gujwNXJdAiNmK6Ffhia", + "value": 1 }, { - "id": 789, - "frec": 1 + "id": "xXtjQktuAq1bmxTc0HSQT", + "value": 1 }, { - "id": 790, - "frec": 1 + "id": "Vjlet5P7XuqTrc22nt_Zz", + "value": 1 }, { - "id": 791, - "frec": 1 + "id": "g2sQSxCcoZuKJ3TabK6oT", + "value": 1 }, { - "id": 792, - "frec": 1 + "id": "4rzonBodQXfs77gALnAP_", + "value": 1 }, { - "id": 793, - "frec": 1 + "id": "8iFdjRTQU7ONGnigRTlm8", + "value": 1 }, { - "id": 794, - "frec": 1 + "id": "xIgPo3N-aKXhVcjultMiY", + "value": 1 }, { - "id": 795, - "frec": 1 + "id": "bw3rqHXD1TJ53xbNggEqH", + "value": 1 }, { - "id": 797, - "frec": 1 + "id": "SXz8iA1Qn_BlgLTAG6Epl", + "value": 1 }, { - "id": 799, - "frec": 1 + "id": "00AkNJ4YLpbRD_mLmQjtp", + "value": 1 }, { - "id": 800, - "frec": 1 + "id": "m39xTdgaenoi4mWGEa-Ew", + "value": 1 }, { - "id": 802, - "frec": 1 + "id": "8KlFB3an1mzdQd6-LGCCE", + "value": 1 }, { - "id": 803, - "frec": 1 + "id": "0IrLGI8Ebm8rcS3ymUXqS", + "value": 1 }, { - "id": 804, - "frec": 1 + "id": "uOA82KFAVtjoYRTuYFgpr", + "value": 1 }, { - "id": 806, - "frec": 1 + "id": "VJ9AU_y7CqsONR6TvhdLh", + "value": 1 }, { - "id": 807, - "frec": 1 + "id": "sDKIldL3tit328Joneo_7", + "value": 1 }, { - "id": 809, - "frec": 1 - } - ] - }, - { - "id": 10, - "texto": { - "en": "Music instruments", - "es": "INSTRUMENTOS MUSICALES" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Finstrumentos.webp?alt=media&token=b58a39b2-6c69-4b19-8658-8a6a4fe7ca2a" - }, - "relacion": [ - { - "id": 850, - "frec": 1 + "id": "b5OdBMMzkf1FlQbUR5-m7", + "value": 1 }, { - "id": 851, - "frec": 1 + "id": "3arbCGI6fMOWALLanZcg3", + "value": 1 }, { - "id": 853, - "frec": 1 + "id": "qU5IvFLD8d16iIHSs_9TM", + "value": 1 }, { - "id": 855, - "frec": 1 + "id": "vZ9JaTnoj8C0ILYxMNB73", + "value": 1 }, { - "id": 857, - "frec": 1 + "id": "7Hz61-WzV62FHsedOwz6q", + "value": 1 }, { - "id": 860, - "frec": 1 + "id": "C12mJ1W11fODI3pv1QOnx", + "value": 1 }, { - "id": 865, - "frec": 1 + "id": "QvaMxPy-3iixHAJFyIrN-", + "value": 1 }, { - "id": 870, - "frec": 1 + "id": "px0jKQDj7r9pOYs4ZrvcT", + "value": 1 }, { - "id": 871, - "frec": 1 + "id": "5VBtwEswIjrv1zbXP-oFn", + "value": 1 }, { - "id": 874, - "frec": 1 + "id": "rMFGfzFobfGsH3_qrLHXU", + "value": 1 }, { - "id": 876, - "frec": 1 - } - ] - }, - { - "id": 11, - "texto": { - "en": "Social interactions", - "es": "INTERACCIONES SOCIALES" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fsociales.webp?alt=media&token=4bf39b77-0fdb-4d79-a407-14f5d66281d2" - }, - "relacion": [ - { - "id": 377, - "frec": 11 + "id": "MNCcHiImRS8tmvhBhzCKj", + "value": 1 }, { - "id": 378, - "frec": 3 + "id": "pwltOTDn2OyABTlD4-27W", + "value": 1 }, { - "id": 379, - "frec": 7 + "id": "MEqo2TROHyroK318sm84f", + "value": 1 }, { - "id": 380, - "frec": 1 + "id": "jmzg4EiC7JEHwe9gNP3C3", + "value": 1 }, { - "id": 381, - "frec": 1 + "id": "8MV4ZFthtUeoxLAIbqGTc", + "value": 1 }, { - "id": 382, - "frec": 1 + "id": "upWXctTSKBtFNSXnXDK_u", + "value": 1 }, { - "id": 383, - "frec": 1 + "id": "JawnUo-pseWb3FDVMtxrQ", + "value": 1 }, { - "id": 384, - "frec": 1 + "id": "DBd09yUlbkaYLsemjFXEs", + "value": 1 }, { - "id": 385, - "frec": 1 + "id": "5LYjhk-N87Ov9NrQcGbLQ", + "value": 1 }, { - "id": 386, - "frec": 1 + "id": "-GL2iAgykP10Ae3AKsVOX", + "value": 1 }, { - "id": 387, - "frec": 1 + "id": "vq3T-UQGTjX3Z9TlEF12e", + "value": 1 }, { - "id": 388, - "frec": 1 + "id": "bge6qR6NzsD5Vk4ifPsSO", + "value": 1 }, { - "id": 389, - "frec": 1 + "id": "FnCBoLSE19WsbUypUKvFc", + "value": 1 }, { - "id": 390, - "frec": 1 - } - ] - }, - { - "id": 12, - "texto": { - "en": "GAMES AND TOYS", - "es": "JUEGOS Y JUGUETES" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fjuguetes.webp?alt=media&token=046c8f8b-7518-4aac-9c56-6ac6fe4a03ef" - }, - "relacion": [ - { - "id": 975, - "frec": 1 + "id": "lKA4b7I3iFkqNzPcAXyBc", + "value": 1 }, { - "id": 976, - "frec": 1 + "id": "iAqItRUQL_YpbMn2pgjsA", + "value": 1 }, { - "id": 977, - "frec": 1 + "id": "pptyFMhLrbC6lN6zmc7D0", + "value": 1 }, { - "id": 980, - "frec": 1 + "id": "_S9Eck14cdOTr0QH4i7sQ", + "value": 1 }, { - "id": 981, - "frec": 1 + "id": "JBKQaBezKuSDaMsnbJMTB", + "value": 1 }, { - "id": 982, - "frec": 1 + "id": "GAxX7EIz1TTLtMX08RRGr", + "value": 1 }, { - "id": 986, - "frec": 1 + "id": "p_qpVEd677b2Bk56yhvj6", + "value": 1 }, { - "id": 987, - "frec": 1 + "id": "armmpopt2RLsVDlqLrQ94", + "value": 1 }, { - "id": 989, - "frec": 1 + "id": "O-CLnVuXAUapOn6TbdhKx", + "value": 0 }, { - "id": 996, - "frec": 1 + "id": "lXH68vGIuZdfA8xVrS8iw", + "value": 0 }, { - "id": 1001, - "frec": 1 + "id": "0Z7uFXpp-XRXmqM8ILhIC", + "value": 0 }, { - "id": 1005, - "frec": 1 + "id": "-LwAKwgCdVkzwM579zRMo", + "value": 0 }, { - "id": 1012, - "frec": 1 + "id": "APXF-lEplPOloppSeIjAY", + "value": 0 }, { - "id": 1013, - "frec": 1 + "id": "rtHwq5WN9KElX3V3SKBmS", + "value": 0 }, { - "id": 1014, - "frec": 1 + "id": "J3rDL96c2zfBQzP45VRCp", + "value": 0 }, { - "id": 1016, - "frec": 1 + "id": "-msU3yor4qJYQHJtWrdk8", + "value": 0 }, { - "id": 1017, - "frec": 1 + "id": "Njz8DrErsexBu8mAI6mnr", + "value": 0 }, { - "id": 1019, - "frec": 1 + "id": "EVmt43vDI3NHFfbbkqokF", + "value": 0 }, { - "id": 1020, - "frec": 1 + "id": "UwvZVcX_CAQFrI6U4LsNT", + "value": 0 } ], - "tags": [ - "NINO" - ] + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Frestaurante.webp?alt=media&token=57ed6d5c-fa5f-41c1-b779-28294311e772" + }, + "text": "LIBRO DEL RESTAURANTE" }, { - "id": 13, - "texto": { - "en": "Places", - "es": "LUGARES" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Flugares.webp?alt=media&token=fa4c9b84-7f78-49d3-8fe7-b67335365b94" - }, - "relacion": [ + "freq": 300, + "id": "9JRv4X68pAtwsFT3Ss0iJ", + "relations": [ { - "id": 644, - "frec": 1 + "id": "ecUOs24Pp5ZTRt_ZvED5W", + "value": 1 }, { - "id": 646, - "frec": 1 + "id": "bVN3R44VuZDw3IdQMolca", + "value": 1 }, { - "id": 648, - "frec": 1 + "id": "cj6OuVw4Nob8jxP-E4rZc", + "value": 1 }, { - "id": 649, - "frec": 1 + "id": "KWYVDZiERE8jtRsL0faHH", + "value": 1 }, { - "id": 650, - "frec": 1 + "id": "D85FU-Wqr2u53tfTXAtHo", + "value": 1 }, { - "id": 651, - "frec": 1 + "id": "ZA2C4bJaL90lBxsTemYWZ", + "value": 0 }, { - "id": 653, - "frec": 1 + "id": "QohNih4wgqjnpWt3kSwtd", + "value": 0 }, { - "id": 656, - "frec": 1 + "id": "LRfh-4RAZTj7cnnDwBmqj", + "value": 0 }, { - "id": 657, - "frec": 1 + "id": "GSEumxiyeVKRRiaY_c8HW", + "value": 0 }, { - "id": 660, - "frec": 1 + "id": "aa3xDW6F9YUKyX0fe5uX8", + "value": 0 }, { - "id": 661, - "frec": 1 + "id": "KpLFOrpuhFKaIbBbFwVVu", + "value": 0 }, { - "id": 662, - "frec": 1 + "id": "bqjKW_qBtRzIThWxdZx2s", + "value": 0 }, { - "id": 666, - "frec": 1 + "id": "YbrNtdUmyMNdAF5CfvY1A", + "value": 0 }, { - "id": 668, - "frec": 1 + "id": "WQ0CNIQ_gjaCxg4tEIsOo", + "value": 0 }, { - "id": 672, - "frec": 1 + "id": "NKQwWPAsVHwFBWuksqfns", + "value": 0 }, { - "id": 675, - "frec": 1 - }, + "id": "Ig1oypuwndODbmKh_NEXs", + "value": 0 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fnatacion.webp?alt=media&token=f4e987c5-4a65-4499-bf95-ec775a6f17e6" + }, + "text": "LIBRO DE NATACIÓN" + }, + { + "freq": 200, + "id": "ByBvBUS7dcXldjzZOVFFP", + "relations": [ { - "id": 678, - "frec": 1 + "id": "yihsjW9ON0Fr9Yy4ZlP9c", + "value": 1 }, { - "id": 679, - "frec": 1 + "id": "eWSI1NInbQowtO99phhGA", + "value": 1 }, { - "id": 680, - "frec": 1 + "id": "sAsTkky29uEVC9vo3Ofbo", + "value": 1 }, { - "id": 682, - "frec": 1 + "id": "ETZNYbrG5wveDl6c9k2_k", + "value": 1 }, { - "id": 685, - "frec": 1 + "id": "cI0JxwhkWU-YA7E7rmJtp", + "value": 1 }, { - "id": 687, - "frec": 1 + "id": "54taab8z9ziXt0IqXHkV9", + "value": 1 }, { - "id": 688, - "frec": 1 + "id": "jTEb3A5ZEKEy2ojuq2vO_", + "value": 1 }, { - "id": 698, - "frec": 1 + "id": "w4cVxbBDZjeNyHwpBARHQ", + "value": 1 }, { - "id": 700, - "frec": 1 - } - ] - }, - { - "id": 15, - "texto": { - "en": "Numbers", - "es": "NúMEROS" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fnumeros.webp?alt=media&token=51f29b27-7998-4db5-bcad-ecc7979beea5" - }, - "relacion": [ + "id": "904w9Je6oDwGXUCIcrUZX", + "value": 1 + }, { - "id": 836, - "frec": 1 + "id": "p1qK47wwLwF8S0Fy8-2Mt", + "value": 1 }, { - "id": 837, - "frec": 1 + "id": "8-4M30dTtmuUJus9MtGqV", + "value": 1 }, { - "id": 838, - "frec": 1 + "id": "sixdpB8hTOhlUr4loz3RB", + "value": 1 }, { - "id": 839, - "frec": 1 + "id": "yk2wDVqHEKKwupgm87OJ2", + "value": 1 }, { - "id": 840, - "frec": 1 + "id": "NLi5ODIzyMAwr2HpDXACp", + "value": 1 }, { - "id": 841, - "frec": 1 + "id": "LDoi3cxodn_AVKSG-Bf_1", + "value": 1 }, { - "id": 842, - "frec": 1 + "id": "INxOSvKbBNOXwruIpuNho", + "value": 1 }, { - "id": 843, - "frec": 1 + "id": "nQSk6_KCEVdO7oC_uxLXN", + "value": 1 }, { - "id": 844, - "frec": 1 + "id": "xnPF8fvkC1TvgETI1JcC9", + "value": 1 }, { - "id": 845, - "frec": 1 + "id": "vmb_RMIB20QND6VcS0deY", + "value": 1 }, { - "id": 846, - "frec": 1 - } - ] - }, - { - "id": 16, - "texto": { - "en": "Clothing", - "es": "VESTIMENTA" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fropa.webp?alt=media&token=52aa7f5e-5b8e-4cf2-9e2b-451f9e06e042" - }, - "relacion": [ + "id": "UXJDiwb3j_zyfGa26ByJL", + "value": 1 + }, { - "id": 924, - "frec": 1 + "id": "mZFwH8xY_OeVDWCdvPZBy", + "value": 1 }, { - "id": 928, - "frec": 1 + "id": "m17b6MazSk6M4gb51_cCy", + "value": 1 }, { - "id": 930, - "frec": 1 + "id": "amk4WRd1sNEIp24pnFw8j", + "value": 1 }, { - "id": 931, - "frec": 1 + "id": "97nIv-aoc51T8kKTZV5cM", + "value": 1 }, { - "id": 934, - "frec": 1 + "id": "Te_jJfeU8Xwa9St2RihBq", + "value": 1 }, { - "id": 936, - "frec": 1 + "id": "oqQWeoWBr5N0LrPGY62Og", + "value": 1 }, { - "id": 938, - "frec": 1 + "id": "nUg2M7p5sUPlGdbBev2-G", + "value": 1 }, { - "id": 939, - "frec": 1 + "id": "3-ueUrnwmIIj0BMP8_Ntb", + "value": 1 }, { - "id": 940, - "frec": 1 + "id": "vaYJPAsTRvslo2qFOJt60", + "value": 0 }, { - "id": 941, - "frec": 1 + "id": "UnQJwWfWCe40DJYR1Er0o", + "value": 0 }, { - "id": 954, - "frec": 1 + "id": "1mU2ZosZXSJrxkh1NmxJT", + "value": 0 }, { - "id": 951, - "frec": 1 + "id": "TBV2BhoZVgl1jMV_jWZYi", + "value": 0 }, { - "id": 956, - "frec": 1 + "id": "PLXxIPYyztaztLf4sPCst", + "value": 0 }, { - "id": 960, - "frec": 1 + "id": "US8_vYTnDfxBw2Ung_J38", + "value": 0 }, { - "id": 962, - "frec": 1 + "id": "IZbfYRzu2cxxDWdbmQeqw", + "value": 0 }, { - "id": 968, - "frec": 1 + "id": "AeFbJQ0M9uTObAlKEX3zr", + "value": 0 }, { - "id": 969, - "frec": 1 + "id": "HKfLJS8aCBtKuKJeSBQUW", + "value": 0 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpartes_del_cuerpo.webp?alt=media&token=b09b6919-2789-46a6-a883-d21c55859e08" + }, + "text": "CUERPO" + }, + { + "freq": 110, + "id": "C7ClEHF5-Mcico4FvRxEV", + "relations": [ + { + "id": "CZrETqLgQlvDkLHvw1t_w", + "value": 1 }, { - "id": 971, - "frec": 1 + "id": "PIBHv5VueBi-sf5qFCN_Y", + "value": 1 }, { - "id": 972, - "frec": 1 + "id": "LEg8z-Q-ONLAAXd-aH_Hb", + "value": 1 }, { - "id": 973, - "frec": 1 + "id": "emm_RirDsO30Enax5Q4gd", + "value": 1 }, { - "id": 974, - "frec": 1 - } - ] - }, - { - "id": 17, - "texto": { - "en": "People", - "es": "PERSONAS" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpersonas.webp?alt=media&token=a5223e39-5426-4728-beda-8579fbc82adf" - }, - "relacion": [ + "id": "ajesFjbC7hwCNLKdif-ix", + "value": 1 + }, { - "id": 614, - "frec": 2 + "id": "B1845IfYfPMz2FWpVFIQv", + "value": 1 }, { - "id": 615, - "frec": 1 + "id": "g1Cj6HW8kg8yPE1XX9pxa", + "value": 1 }, { - "id": 617, - "frec": 1 + "id": "71l2at-8480bvijxn3uBl", + "value": 1 }, { - "id": 619, - "frec": 1 + "id": "wkrNPLGWTqMIy4PJRW9QR", + "value": 1 }, { - "id": 620, - "frec": 1 + "id": "6lYN4qSZx3_tKDClp4Iyr", + "value": 1 }, { - "id": 621, - "frec": 1 + "id": "7Q4Zc0cenSF5U4eKyje1f", + "value": 1 }, { - "id": 622, - "frec": 1 + "id": "T_Q5c4XAfkhkclmnCGHo5", + "value": 1 }, { - "id": 623, - "frec": 1 + "id": "GY_flM-6uR6X3L4AwsiwU", + "value": 1 }, { - "id": 624, - "frec": 1 + "id": "C29KJ8BTFavhj_R9UfnSv", + "value": 1 }, { - "id": 626, - "frec": 1 + "id": "J7wLwBLVx4UANh_x5HdXd", + "value": 1 }, { - "id": 627, - "frec": 1 + "id": "Sp2Ias_Y1HplkHWjIb7Mp", + "value": 1 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpreposiciones.webp?alt=media&token=73b3d814-e509-4ed4-b4f7-cde7c0b4c2a5" + }, + "text": "PREPOSICIONES" + }, + { + "freq": 360, + "id": "GD9YHeLktSsdZQvcoua6x", + "relations": [ + { + "id": "dLHDzm0rfgL-vXTx14HSm", + "value": 1 }, { - "id": 628, - "frec": 1 + "id": "bVN3R44VuZDw3IdQMolca", + "value": 1 }, { - "id": 629, - "frec": 1 + "id": "sSTGRl6DpYGZXp8vtTNbm", + "value": 1 }, { - "id": 630, - "frec": 1 + "id": "AWJXh6URGN0Vwm66i6IvL", + "value": 11 }, { - "id": 631, - "frec": 1 + "id": "cJMQi3SVmqvWJ00VxI6gy", + "value": 3 }, { - "id": 632, - "frec": 1 + "id": "Dm3yiKSB134LrjtW_KrO7", + "value": 7 }, { - "id": 633, - "frec": 1 + "id": "9UwpyOnOBoqr4mX3Juqm2", + "value": 1 }, { - "id": 635, - "frec": 1 + "id": "_1lOt0C0MQhvU8QWC6_oZ", + "value": 1 }, { - "id": 638, - "frec": 1 + "id": "JZRBfIXBkeuobtDXbLt5t", + "value": 1 }, { - "id": 639, - "frec": 1 + "id": "ChBc7LjL8dgzZ6LUCAHGh", + "value": 1 }, { - "id": 640, - "frec": 1 + "id": "hKJhXxultsxm0TJl1P8-L", + "value": 1 }, { - "id": 642, - "frec": 1 + "id": "ZnMba2r4XIg9lPi_H2d_Z", + "value": 1 }, { - "id": 643, - "frec": 2 - } - ] - }, - { - "id": 18, - "texto": { - "en": "Prepositions", - "es": "PREPOSICIONES" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpreposiciones.webp?alt=media&token=73b3d814-e509-4ed4-b4f7-cde7c0b4c2a5" - }, - "relacion": [ + "id": "UQ5B5K-tpk1XmQC1B9TjQ", + "value": 1 + }, { - "id": 525, - "frec": 1 + "id": "8MV4ZFthtUeoxLAIbqGTc", + "value": 1 }, { - "id": 526, - "frec": 1 + "id": "aTwzShtP_zR9x6bSGSzEB", + "value": 1 }, { - "id": 527, - "frec": 1 + "id": "WDUIQV43zghFQq_rSk1Z4", + "value": 1 }, { - "id": 528, - "frec": 1 + "id": "FnCBoLSE19WsbUypUKvFc", + "value": 1 }, { - "id": 529, - "frec": 1 + "id": "UVzdJiqY36fqgBYyz880c", + "value": 1 }, { - "id": 530, - "frec": 1 + "id": "OeA63q6LpqGvXW-cJXEym", + "value": 1 }, { - "id": 531, - "frec": 1 + "id": "10X4OKR5xmNhSj86sbyE_", + "value": 1 }, { - "id": 532, - "frec": 1 + "id": "8iFdjRTQU7ONGnigRTlm8", + "value": 1 }, { - "id": 533, - "frec": 1 + "id": "b1XpSC0ndnm0ZewNXC3pp", + "value": 1 }, { - "id": 534, - "frec": 1 + "id": "L6YLAEsbYcTq-ycQJTvt4", + "value": 0 }, { - "id": 535, - "frec": 1 + "id": "zw-o9pDectP5bxFnUjrJO", + "value": 0 }, { - "id": 536, - "frec": 1 + "id": "FfNU04I4mZ54gWcBXqo2c", + "value": 0 }, { - "id": 537, - "frec": 1 + "id": "93tHieC_CgZqN998y5gAv", + "value": 0 }, { - "id": 538, - "frec": 1 + "id": "mK4AXXhoIVirBz5dr_xLA", + "value": 0 }, { - "id": 539, - "frec": 1 + "id": "CY-IQvUehkaiGFCdKf9bf", + "value": 0 }, { - "id": 540, - "frec": 1 - } - ] - }, - { - "id": 19, - "texto": { - "en": "Pronouns", - "es": "PRONOMBRE" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpronombres.webp?alt=media&token=fde2895a-c02f-464c-b487-ec4826cca6bd" - }, - "relacion": [ + "id": "1WJZO-pUkTaQvyxz41iB-", + "value": 0 + }, { - "id": 889, - "frec": 1 + "id": "lXH68vGIuZdfA8xVrS8iw", + "value": 0 }, { - "id": 890, - "frec": 1 + "id": "0Z7uFXpp-XRXmqM8ILhIC", + "value": 0 }, { - "id": 891, - "frec": 1 + "id": "-LwAKwgCdVkzwM579zRMo", + "value": 0 }, { - "id": 892, - "frec": 1 + "id": "APXF-lEplPOloppSeIjAY", + "value": 0 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Flibro_carnicero.webp?alt=media&token=b3a49a1a-5b29-40a2-a456-6117822efb08" + }, + "text": "LIBRO DE LA CARNICERÍA" + }, + { + "freq": 350, + "id": "HzPl-HvsrXL_QkGT38Ohd", + "relations": [ + { + "id": "dLHDzm0rfgL-vXTx14HSm", + "value": 1 }, { - "id": 893, - "frec": 1 + "id": "bVN3R44VuZDw3IdQMolca", + "value": 1 }, { - "id": 894, - "frec": 1 + "id": "sSTGRl6DpYGZXp8vtTNbm", + "value": 1 }, { - "id": 895, - "frec": 1 + "id": "XnocVMEeUGCSnlnusP44O", + "value": 1 }, { - "id": 896, - "frec": 1 + "id": "aP9QisUdxhgOKIQ2kHNb3", + "value": 1 }, { - "id": 897, - "frec": 1 + "id": "K382TlNZjdMLLpAhCCXLG", + "value": 1 }, { - "id": 898, - "frec": 1 + "id": "vZ9JaTnoj8C0ILYxMNB73", + "value": 1 }, { - "id": 899, - "frec": 1 + "id": "hDvpMlPw-chcuxEisBJTl", + "value": 1 }, { - "id": 900, - "frec": 1 + "id": "qU5IvFLD8d16iIHSs_9TM", + "value": 1 }, { - "id": 901, - "frec": 1 + "id": "fF3ijeQzetfSn6EGcs1yY", + "value": 1 }, { - "id": 903, - "frec": 1 + "id": "TIgoS-YONIwzbrImXetaD", + "value": 1 }, { - "id": 904, - "frec": 1 + "id": "jOALQbfxdXmJVyY6P5gZG", + "value": 1 }, { - "id": 905, - "frec": 1 + "id": "_Lc2-NNL69ZX-aVnUNzgx", + "value": 1 }, { - "id": 906, - "frec": 1 + "id": "nK7DRpxalLBHL9OnRjSim", + "value": 1 }, { - "id": 907, - "frec": 1 + "id": "yxa6QVSrmWUKH2PZHKaVl", + "value": 1 }, { - "id": 910, - "frec": 1 + "id": "NaJxTPq9Ld8I4fwAltyEC", + "value": 1 }, { - "id": 911, - "frec": 1 + "id": "XN0nzhQyHVOhuYuNqrp8g", + "value": 1 }, { - "id": 912, - "frec": 1 + "id": "9wE9Py6ztyqDrtaypsltA", + "value": 1 }, { - "id": 913, - "frec": 1 + "id": "D7dt_hFX5DScV_ssm1nKz", + "value": 1 }, { - "id": 914, - "frec": 1 + "id": "px0jKQDj7r9pOYs4ZrvcT", + "value": 1 }, { - "id": 915, - "frec": 1 + "id": "l_ncJLRdVGBzzQc9yqBqs", + "value": 1 }, { - "id": 918, - "frec": 1 + "id": "RwlZ1jr2Ix3evzrW71lN0", + "value": 1 }, { - "id": 919, - "frec": 1 + "id": "eKJCZc-kD0-m6cVLorFzO", + "value": 1 }, { - "id": 920, - "frec": 1 + "id": "pwltOTDn2OyABTlD4-27W", + "value": 1 }, { - "id": 923, - "frec": 1 - } - ] - }, - { - "id": 20, - "texto": { - "en": "Feelings", - "es": "SENTIMIENTOS" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fsentimientos.webp?alt=media&token=90954fb0-bf68-48fe-8f12-d9dfc21963da" - }, - "relacion": [ - { - "id": 119, - "texto": { - "en": "dull", - "es": "aburrido" - }, - "tipo": 4, - "imagen": { - "picto": "ic_aburrido" - }, - "relacion": [ - { - "id": 44, - "frec": 1 - } - ], - "agenda": 0, - "gps": 0 - }, - { - "id": 121, - "texto": { - "en": "scared", - "es": "asustado" - }, - "tipo": 4, - "imagen": { - "picto": "asustado" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 124, - "texto": { - "en": "anxious", - "es": "ansioso" - }, - "tipo": 4, - "imagen": { - "picto": "ansioso" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 125, - "texto": { - "en": "grieved", - "es": "apenado" - }, - "tipo": 4, - "imagen": { - "picto": "apenado" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 133, - "texto": { - "en": "good", - "es": "bien" - }, - "tipo": 4, - "imagen": { - "picto": "ic_estoy_bien" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 137, - "texto": { - "en": "tired", - "es": "Cansado" - }, - "tipo": 4, - "imagen": { - "picto": "ic_cansado" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 161, - "texto": { - "en": "funny", - "es": "divertido" - }, - "tipo": 4, - "imagen": { - "picto": "divertido" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 164, - "texto": { - "en": "in love", - "es": "enamorado" - }, - "tipo": 4, - "imagen": { - "picto": "enamorado" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 167, - "texto": { - "en": "angry", - "es": "enojado" - }, - "tipo": 4, - "imagen": { - "picto": "ic_enojado" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 171, - "texto": { - "en": "happy", - "es": "feliz" - }, - "tipo": 4, - "imagen": { - "picto": "feliz" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 194, - "texto": { - "en": "irritated", - "es": "irritado" - }, - "tipo": 4, - "imagen": { - "picto": "irritado" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 212, - "texto": { - "en": "upset", - "es": "molesto" - }, - "tipo": 4, - "imagen": { - "picto": "molesto" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 217, - "texto": { - "en": "nervous", - "es": "nervioso" - }, - "tipo": 4, - "imagen": { - "picto": "nervioso" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 237, - "texto": { - "en": "worried", - "es": "preocupada" - }, - "tipo": 4, - "imagen": { - "picto": "preocupada" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 272, - "texto": { - "en": "sad", - "es": "tríste" - }, - "tipo": 4, - "imagen": { - "picto": "ic_triste" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - } - ] - }, - { - "id": 21, - "texto": { - "en": "Stores", - "es": "TIENDAS" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Flibro_tiendas.webp?alt=media&token=4f4f3669-ad33-4baa-8a6e-bace7f17b45f" - }, - "relacion": [ + "id": "upWXctTSKBtFNSXnXDK_u", + "value": 1 + }, { - "id": 650, - "frec": 1 + "id": "UwvZVcX_CAQFrI6U4LsNT", + "value": 1 }, { - "id": 661, - "frec": 1 + "id": "O-CLnVuXAUapOn6TbdhKx", + "value": 0 }, { - "id": 666, - "frec": 1 + "id": "Dm3yiKSB134LrjtW_KrO7", + "value": 0 }, { - "id": 675, - "frec": 1 + "id": "9UwpyOnOBoqr4mX3Juqm2", + "value": 0 }, { - "id": 679, - "frec": 1 + "id": "_1lOt0C0MQhvU8QWC6_oZ", + "value": 0 }, { - "id": 680, - "frec": 1 + "id": "hKJhXxultsxm0TJl1P8-L", + "value": 0 }, { - "id": 688, - "frec": 1 + "id": "ChBc7LjL8dgzZ6LUCAHGh", + "value": 0 }, { - "id": 698, - "frec": 1 + "id": "UQ5B5K-tpk1XmQC1B9TjQ", + "value": 0 }, { - "id": 700, - "frec": 1 - } - ] - }, - { - "id": 22, - "texto": { - "en": "Time", - "es": "TIEMPO" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ftiempos.webp?alt=media&token=a9cba0e5-1635-4d9c-8f1b-9db6243f7e5f" - }, - "relacion": [ + "id": "ZnMba2r4XIg9lPi_H2d_Z", + "value": 0 + }, { - "id": 812, - "frec": 1 + "id": "AWJXh6URGN0Vwm66i6IvL", + "value": 0 }, { - "id": 811, - "frec": 1 + "id": "JZRBfIXBkeuobtDXbLt5t", + "value": 0 }, { - "id": 815, - "frec": 1 + "id": "ChBc7LjL8dgzZ6LUCAHGh", + "value": 0 }, { - "id": 816, - "frec": 1 + "id": "lXH68vGIuZdfA8xVrS8iw", + "value": 0 }, { - "id": 817, - "frec": 1 + "id": "0Z7uFXpp-XRXmqM8ILhIC", + "value": 0 }, { - "id": 818, - "frec": 1 + "id": "-LwAKwgCdVkzwM579zRMo", + "value": 0 }, { - "id": 810, - "frec": 1 + "id": "APXF-lEplPOloppSeIjAY", + "value": 0 } - ] + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Flibro_verduleria.webp?alt=media&token=533584e7-215a-4ab7-bc2f-aecf13c9c6c1" + }, + "text": "LIBRO DE VERDULERÍA" }, { - "id": 23, - "texto": { - "en": "Transport", - "es": "TRANSPORTE" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ftransportes.webp?alt=media&token=94bd980f-eeed-4310-8fe7-09148e19612f" - }, - "relacion": [ + "freq": 120, + "id": "JKEk5TYykBK6ZeYND3Ron", + "relations": [ { - "id": 606, - "frec": 1 + "id": "G_CRpzxWO5XdEMh01O1eJ", + "value": 1 }, { - "id": 607, - "frec": 1 + "id": "mWXxPPvhSHf9hyb-VyuZH", + "value": 1 }, { - "id": 608, - "frec": 1 + "id": "1-VwcvzNfvrwDWRGxRPre", + "value": 1 }, { - "id": 609, - "frec": 1 + "id": "kpghvJtujlt4vPI2N6vsg", + "value": 1 }, { - "id": 610, - "frec": 1 + "id": "pvXSy-5M4i8kysUppvdME", + "value": 1 }, { - "id": 611, - "frec": 1 - } - ] - }, - { - "id": 24, - "texto": { - "en": "ALL", - "es": "TODO" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ftodos.webp?alt=media&token=694aae8b-22c8-4274-b9f1-b3bbdd15d061" - }, - "relacion": [ - { - "id": 1, - "texto": { - "en": "escort", - "es": "acompañar" - }, - "tipo": 3, - "imagen": { - "picto": "ic_acompanar" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 2, - "texto": { - "en": "turn off", - "es": "apagar" - }, - "tipo": 3, - "imagen": { - "picto": "ic_apagar_television" - }, - "relacion": [ - { - "id": 1016, - "frec": 2 - }, - { - "id": 1019, - "frec": 1 - }, - { - "id": 773, - "frec": 2 - }, - { - "id": 774, - "frec": 2 - } - ], - "agenda": 0, - "gps": 0 - }, - { - "id": 3, - "texto": { - "en": "turn the volume down", - "es": "bajar volumen" - }, - "tipo": 3, - "imagen": { - "picto": "ic_volumen_menos" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 4, - "texto": { - "en": "erase", - "es": "borrar" - }, - "tipo": 3, - "imagen": { - "picto": "ic_borrar" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 5, - "texto": { - "en": "search", - "es": "buscar" - }, - "tipo": 3, - "imagen": { - "picto": "ic_buscar" - }, - "relacion": [ - { - "id": 996, - "frec": 1 - }, - { - "id": 500, - "frec": 1 - }, - { - "id": 989, - "frec": 1 - }, - { - "id": 737, - "frec": 2 - }, - { - "id": 385, - "frec": 3 - }, - { - "id": 628, - "frec": 3 - }, - { - "id": 1014, - "frec": 2 - } - ], - "agenda": 0, - "gps": 0 - }, - { - "id": 6, - "texto": { - "en": "sing", - "es": "cantar" - }, - "tipo": 3, - "imagen": { - "picto": "ic_cantar" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 7, - "texto": { - "en": "change", - "es": "cambiar" - }, - "tipo": 3, - "imagen": { - "picto": "ic_cambiar" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 8, - "texto": { - "en": "change channel", - "es": "cambiar de canal" - }, - "tipo": 3, - "imagen": { - "picto": "ic_cambiar_canal" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 9, - "texto": { - "en": "change diapper", - "es": "cambiarme el pañal" - }, - "tipo": 3, - "imagen": { - "picto": "ic_cambiarpanal" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 10, - "texto": { - "en": "change clothes", - "es": "cambiarme la ropa" - }, - "tipo": 3, - "imagen": { - "picto": "ic_cambiarropa" - }, - "relacion": [ - { - "id": 385, - "frec": 1 - } - ], - "agenda": 0, - "gps": 0 - }, - { - "id": 11, - "texto": { - "en": "brush my teeth", - "es": "cepillarme los dientes" - }, - "tipo": 3, - "imagen": { - "picto": "ic_cepillar" - }, - "relacion": [ - { - "id": 385, - "frec": 4 - } - ], - "agenda": 0, - "gps": 0 - }, - { - "id": 12, - "texto": { - "en": "eat a sandwich", - "es": "comer un sandwich" - }, - "tipo": 3, - "imagen": { - "picto": "comer_un_bocadillo" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 13, - "texto": { - "en": "buy", - "es": "comprar" - }, - "tipo": 3, - "imagen": { - "picto": "ic_comprar" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 14, - "texto": { - "en": "give", - "es": "dame" - }, - "tipo": 3, - "imagen": { - "picto": "ic_dar" - }, - "relacion": [ - { - "id": 427, - "frec": 1 - }, - { - "id": 989, - "frec": 1 - }, - { - "id": 500, - "frec": 1 - }, - { - "id": 774, - "frec": 2 - }, - { - "id": 986, - "frec": 2 - }, - { - "id": 857, - "frec": 1 - } - ], - "agenda": 0, - "gps": 0 - }, - { - "id": 15, - "texto": { - "en": "draw", - "es": "dibujar" - }, - "tipo": 3, - "imagen": { - "picto": "ic_dibujar" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 17, - "texto": { - "en": "turn on", - "es": "encender" - }, - "tipo": 3, - "imagen": { - "picto": "encender_la_television" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 18, - "texto": { - "en": "write", - "es": "escribir" - }, - "tipo": 3, - "imagen": { - "picto": "ic_escribir" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 19, - "texto": { - "en": "listen again", - "es": "escuchar de nuevo" - }, - "tipo": 3, - "imagen": { - "picto": "ic_de_nuevo" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 20, - "texto": { - "en": "listen to music", - "es": "escuchar música" - }, - "tipo": 3, - "imagen": { - "picto": "ic_escuchar_musica" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 21, - "texto": { - "en": "listen", - "es": "escuchar" - }, - "tipo": 3, - "imagen": { - "picto": "ic_escuchar" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 22, - "texto": { - "en": "be", - "es": "estoy" - }, - "tipo": 3, - "imagen": { - "picto": "ic_estoy" - }, - "relacion": [ - { - "id": 133, - "frec": 6 - }, - { - "id": 205, - "frec": 2 - }, - { - "id": 204, - "frec": 4 - }, - { - "id": 181, - "frec": 1 - }, - { - "id": 272, - "frec": 1 - }, - { - "id": 274, - "frec": 1 - }, - { - "id": 819, - "frec": 1 - }, - { - "id": 831, - "frec": 1 - }, - { - "id": 119, - "frec": 6 - } - ], - "agenda": 0, - "gps": 0, - "esSugerencia": false - }, - { - "id": 23, - "texto": { - "en": "wait", - "es": "esperar" - }, - "tipo": 3, - "imagen": { - "picto": "esperar" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 26, - "texto": { - "en": "win", - "es": "ganar" - }, - "tipo": 3, - "imagen": { - "picto": "ic_ganar" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 28, - "texto": { - "en": "do", - "es": "hacer" - }, - "tipo": 3, - "imagen": { - "picto": "ic_haciendo" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 29, - "texto": { - "en": "pee", - "es": "hacer pis" - }, - "tipo": 3, - "imagen": { - "picto": "ic_hacerpis" - }, - "relacion": [ - { - "id": 385, - "frec": 3 - } - ], - "agenda": 0, - "gps": 0 - }, - { - "id": 30, - "texto": { - "en": "go", - "es": "ir a" - }, - "tipo": 3, - "imagen": { - "picto": "ir" - }, - "relacion": [ - { - "id": 653, - "frec": 5 - }, - { - "id": 118, - "frec": 5 - }, - { - "id": 650, - "frec": 4 - }, - { - "id": 651, - "frec": 3 - }, - { - "id": 682, - "frec": 1 - }, - { - "id": 688, - "frec": 5 - }, - { - "id": 668, - "frec": 5 - }, - { - "id": 87, - "frec": 1 - }, - { - "id": 51, - "frec": 1 - } - ], - "agenda": 0, - "gps": 0 - }, - { - "id": 31, - "texto": { - "en": "wash hands", - "es": "lavarme las manos" - }, - "tipo": 3, - "imagen": { - "picto": "ic_lavamano" - }, - "relacion": [ - { - "id": 385, - "frec": 1 - } - ], - "agenda": 0, - "gps": 0 - }, - { - "id": 32, - "texto": { - "en": "read", - "es": "leer" - }, - "tipo": 3, - "imagen": { - "picto": "leer" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 33, - "texto": { - "en": "call someone", - "es": "llamar a alguien" - }, - "tipo": 3, - "imagen": { - "picto": "ic_llamaralguien" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 34, - "texto": { - "en": "play with", - "es": "jugar con" - }, - "tipo": 3, - "imagen": { - "picto": "ic_jugar" - }, - "relacion": [ - { - "id": 996, - "frec": 13 - }, - { - "id": 761, - "frec": 15 - }, - { - "id": 615, - "frec": 5 - }, - { - "id": 632, - "frec": 10 - }, - { - "id": 628, - "frec": 3 - }, - { - "id": 977, - "frec": 1 - }, - { - "id": 982, - "frec": 1 - }, - { - "id": 1005, - "frec": 1 - } - ], - "agenda": 0, - "gps": 0, - "edad": [ - "NINO" - ] - }, - { - "id": 35, - "texto": { - "en": "look at the mirror", - "es": "mirarme al espejo" - }, - "tipo": 3, - "imagen": { - "picto": "ic_espejo" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 38, - "texto": { - "en": "take a walk", - "es": "pasear" - }, - "tipo": 3, - "imagen": { - "picto": "ic_pasear" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 39, - "texto": { - "en": "comb", - "es": "peinarme" - }, - "tipo": 3, - "imagen": { - "picto": "ic_peinar" - }, - "relacion": [ - { - "id": 385, - "frec": 2 - } - ], - "agenda": 0, - "gps": 0 - }, - { - "id": 41, - "texto": { - "en": "lose", - "es": "perder" - }, - "tipo": 3, - "imagen": { - "picto": "ic_perder" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 43, - "texto": { - "en": "paint", - "es": "pintar" - }, - "tipo": 3, - "imagen": { - "picto": "ic_pintar" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 44, - "texto": { - "en": "want", - "es": "quiero" - }, - "tipo": 3, - "imagen": { - "picto": "ic_quiero" - }, - "relacion": [ - { - "id": 118, - "frec": 20 - }, - { - "id": 34, - "frec": 43 - }, - { - "id": 29, - "frec": 8 - }, - { - "id": 11, - "frec": 3 - }, - { - "id": 31, - "frec": 3 - }, - { - "id": 39, - "frec": 10 - }, - { - "id": 10, - "frec": 3 - }, - { - "id": 35, - "frec": 4 - }, - { - "id": 5, - "frec": 19 - }, - { - "id": 30, - "frec": 28 - }, - { - "id": 51, - "frec": 16 - }, - { - "id": 2, - "frec": 11 - } - ], - "agenda": 0, - "gps": 0, - "esSugerencia": false - }, - { - "id": 49, - "texto": { - "en": "have", - "es": "tengo" - }, - "tipo": 3, - "imagen": { - "picto": "ic_tengo" - }, - "relacion": [ - { - "id": 177, - "frec": 3 - }, - { - "id": 597, - "frec": 4 - }, - { - "id": 662, - "frec": 2 - }, - { - "id": 754, - "frec": 1 - }, - { - "id": 729, - "frec": 2 - }, - { - "id": 572, - "frec": 2 - }, - { - "id": 277, - "frec": 1 - } - ], - "agenda": 0, - "gps": 0, - "esSugerencia": false - }, - { - "id": 51, - "texto": { - "en": "drink", - "es": "tomar" - }, - "tipo": 3, - "imagen": { - "picto": "beber" - }, - "relacion": [ - { - "id": 500, - "frec": 1 - }, - { - "id": 497, - "frec": 1 - }, - { - "id": 467, - "frec": 1 - }, - { - "id": 468, - "frec": 1 - }, - { - "id": 469, - "frec": 1 - }, - { - "id": 471, - "frec": 1 - }, - { - "id": 495, - "frec": 3 - }, - { - "id": 501, - "frec": 5 - }, - { - "id": 484, - "frec": 2 - }, - { - "id": 486, - "frec": 1 - } - ], - "agenda": 0, - "gps": 0 - }, - { - "id": 52, - "texto": { - "en": "hug", - "es": "abrazar" - }, - "tipo": 3, - "imagen": { - "picto": "abrazar" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 53, - "texto": { - "en": "open", - "es": "abrir" - }, - "tipo": 3, - "imagen": { - "picto": "abrir" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 54, - "texto": { - "en": "hook up", - "es": "abrochar" - }, - "tipo": 3, - "imagen": { - "picto": "abrochar" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 57, - "texto": { - "en": "love", - "es": "amar" - }, - "tipo": 3, - "imagen": { - "picto": "amar" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 61, - "texto": { - "en": "get down", - "es": "bajar" - }, - "tipo": 3, - "imagen": { - "picto": "bajar" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 64, - "texto": { - "en": "kiss", - "es": "besar" - }, - "tipo": 3, - "imagen": { - "picto": "besar" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 65, - "texto": { - "en": "ride", - "es": "cabalgar" - }, - "tipo": 3, - "imagen": { - "picto": "cabalgar" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 66, - "texto": { - "en": "fall", - "es": "caer" - }, - "tipo": 3, - "imagen": { - "picto": "caer" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 68, - "texto": { - "en": "close", - "es": "cerrar" - }, - "tipo": 3, - "imagen": { - "picto": "cerrar" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 69, - "texto": { - "en": "grab", - "es": "agarrar" - }, - "tipo": 3, - "imagen": { - "picto": "coger" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 70, - "texto": { - "en": "run", - "es": "correr" - }, - "tipo": 3, - "imagen": { - "picto": "correr" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 71, - "texto": { - "en": "cut", - "es": "cortar" - }, - "tipo": 3, - "imagen": { - "picto": "cortar" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 76, - "texto": { - "en": "get in", - "es": "entrar" - }, - "tipo": 3, - "imagen": { - "picto": "entrar" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 78, - "texto": { - "en": "hacer el amor", - "es": "hacer el amor" - }, - "tipo": 3, - "imagen": { - "picto": "hacer_el_amor" - }, - "relacion": [], - "agenda": 0, - "gps": 0, - "edad": [ - "ADULTO" - ] - }, - { - "id": 79, - "texto": { - "en": "smell", - "es": "oler" - }, - "tipo": 3, - "imagen": { - "picto": "husmear" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 81, - "texto": { - "en": "investigate", - "es": "investigar" - }, - "tipo": 3, - "imagen": { - "picto": "investigar" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 82, - "texto": { - "en": "play with the tablet", - "es": "jugar con la tablet" - }, - "tipo": 3, - "imagen": { - "picto": "jugar_con_la_tablet" - }, - "relacion": [], - "agenda": 0, - "gps": 0, - "edad": [ - "JOVEN" - ] - }, - { - "id": 85, - "texto": { - "en": "look", - "es": "mirar" - }, - "tipo": 3, - "imagen": { - "picto": "mirar" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 86, - "texto": { - "en": "swim", - "es": "nadar" - }, - "tipo": 3, - "imagen": { - "picto": "nadar" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 87, - "texto": { - "en": "take a walk", - "es": "pasear" - }, - "tipo": 3, - "imagen": { - "picto": "pasear" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 88, - "texto": { - "en": "beat legs", - "es": "patalear" - }, - "tipo": 3, - "imagen": { - "picto": "patalear" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 90, - "texto": { - "en": "paint", - "es": "pintar" - }, - "tipo": 3, - "imagen": { - "picto": "pintar" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 92, - "texto": { - "en": "put", - "es": "poner" - }, - "tipo": 3, - "imagen": { - "picto": "poner" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 93, - "texto": { - "en": "reject", - "es": "rechazar" - }, - "tipo": 3, - "imagen": { - "picto": "rechazar" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 94, - "texto": { - "en": "laugh", - "es": "reir" - }, - "tipo": 3, - "imagen": { - "picto": "reir" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 95, - "texto": { - "en": "repeat", - "es": "repetir" - }, - "tipo": 3, - "imagen": { - "picto": "repetir" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 97, - "texto": { - "en": "take out", - "es": "sacar" - }, - "tipo": 3, - "imagen": { - "picto": "sacar" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 98, - "texto": { - "en": "go out", - "es": "salir" - }, - "tipo": 3, - "imagen": { - "picto": "salir" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 100, - "texto": { - "en": "dry", - "es": "secar" - }, - "tipo": 3, - "imagen": { - "picto": "secar" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 101, - "texto": { - "en": "seat", - "es": "sentarme" - }, - "tipo": 3, - "imagen": { - "picto": "sentar" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 103, - "texto": { - "en": "blow your nose", - "es": "sonarme la nariz" - }, - "tipo": 3, - "imagen": { - "picto": "sonarse_los_mocos" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 104, - "texto": { - "en": "go up", - "es": "subir" - }, - "tipo": 3, - "imagen": { - "picto": "subir" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 107, - "texto": { - "en": "travel", - "es": "viajar" - }, - "tipo": 3, - "imagen": { - "picto": "viajar" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 108, - "texto": { - "en": "travel by car", - "es": "viajar en auto" - }, - "tipo": 3, - "imagen": { - "picto": "viajar_en_auto" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 112, - "texto": { - "en": "clean", - "es": "limpiar" - }, - "tipo": 3, - "imagen": { - "picto": "limpiar" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 113, - "texto": { - "en": "heal", - "es": "curar" - }, - "tipo": 3, - "imagen": { - "picto": "curar" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 116, - "texto": { - "en": "travel", - "es": "viajar" - }, - "tipo": 3, - "imagen": { - "picto": "viajar" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 117, - "texto": { - "en": "touch", - "es": "tocar" - }, - "tipo": 3, - "imagen": { - "picto": "tocar" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 118, - "texto": { - "en": "eat", - "es": "comer" - }, - "tipo": 3, - "imagen": { - "picto": "comer" - }, - "relacion": [ - { - "id": 474, - "frec": 3 - }, - { - "id": 504, - "frec": 4 - }, - { - "id": 494, - "frec": 1 - }, - { - "id": 515, - "frec": 4 - }, - { - "id": 478, - "frec": 4 - }, - { - "id": 482, - "frec": 4 - }, - { - "id": 481, - "frec": 4 - }, - { - "id": 521, - "frec": 4 - }, - { - "id": 480, - "frec": 2 - }, - { - "id": 483, - "frec": 1 - }, - { - "id": 600, - "frec": 1 - }, - { - "id": 400, - "frec": 2 - } - ], - "agenda": 0, - "gps": 0 - }, - { - "id": 119, - "texto": { - "en": "dull", - "es": "aburrido" - }, - "tipo": 4, - "imagen": { - "picto": "ic_aburrido" - }, - "relacion": [ - { - "id": 44, - "frec": 1 - } - ], - "agenda": 0, - "gps": 0 - }, - { - "id": 121, - "texto": { - "en": "scared", - "es": "asustado" - }, - "tipo": 4, - "imagen": { - "picto": "asustado" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 122, - "texto": { - "en": "acid", - "es": "ácido" - }, - "tipo": 4, - "imagen": { - "picto": "acido" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 123, - "texto": { - "en": "tall", - "es": "alto" - }, - "tipo": 4, - "imagen": { - "picto": "alto" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 124, - "texto": { - "en": "anxious", - "es": "ansioso" - }, - "tipo": 4, - "imagen": { - "picto": "ansioso" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 125, - "texto": { - "en": "grieved", - "es": "apenado" - }, - "tipo": 4, - "imagen": { - "picto": "apenado" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 126, - "texto": { - "en": "fixed", - "es": "arreglado" - }, - "tipo": 4, - "imagen": { - "picto": "arreglado" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 129, - "texto": { - "en": "absent", - "es": "ausente" - }, - "tipo": 4, - "imagen": { - "picto": "ausente" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 130, - "texto": { - "en": "short", - "es": "bajo" - }, - "tipo": 4, - "imagen": { - "picto": "bajo" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 131, - "texto": { - "en": "cheap", - "es": "barato" - }, - "tipo": 4, - "imagen": { - "picto": "barato" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 132, - "texto": { - "en": "soft", - "es": "blando" - }, - "tipo": 4, - "imagen": { - "picto": "blando" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 133, - "texto": { - "en": "good", - "es": "bien" - }, - "tipo": 4, - "imagen": { - "picto": "ic_estoy_bien" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 134, - "texto": { - "en": "drunk", - "es": "borracho" - }, - "tipo": 4, - "imagen": { - "picto": "borracho" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 135, - "texto": { - "en": "nice", - "es": "buena" - }, - "tipo": 4, - "imagen": { - "picto": "buena" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 136, - "texto": { - "en": "nice", - "es": "bueno" - }, - "tipo": 4, - "imagen": { - "picto": "bueno" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 137, - "texto": { - "en": "tired", - "es": "Cansado" - }, - "tipo": 4, - "imagen": { - "picto": "ic_cansado" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 138, - "texto": { - "en": "expensive", - "es": "caro" - }, - "tipo": 4, - "imagen": { - "picto": "caro" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 139, - "texto": { - "en": "hot", - "es": "caliente" - }, - "tipo": 4, - "imagen": { - "picto": "caliente" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 140, - "texto": { - "en": "hot", - "es": "caliente" - }, - "tipo": 4, - "imagen": { - "picto": "caliente_cosa" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 141, - "texto": { - "en": "warm", - "es": "caluroso" - }, - "tipo": 4, - "imagen": { - "picto": "caluroso" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 144, - "texto": { - "en": "expensive", - "es": "caro" - }, - "tipo": 4, - "imagen": { - "picto": "caro" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 147, - "texto": { - "en": "clear", - "es": "claro" - }, - "tipo": 4, - "imagen": { - "picto": "claros" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 149, - "texto": { - "en": "comfortable", - "es": "cómodo" - }, - "tipo": 4, - "imagen": { - "picto": "comodo" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 153, - "texto": { - "en": "quarter", - "es": "cuarto" - }, - "tipo": 4, - "imagen": { - "picto": "cuarto" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 156, - "texto": { - "en": "unkwown", - "es": "desconocido" - }, - "tipo": 4, - "imagen": { - "picto": "desconocida" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 158, - "texto": { - "en": "tousled", - "es": "despeinada" - }, - "tipo": 4, - "imagen": { - "picto": "despeinada" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 159, - "texto": { - "en": "tousled", - "es": "despeinado" - }, - "tipo": 4, - "imagen": { - "picto": "despeinado" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 161, - "texto": { - "en": "funny", - "es": "divertido" - }, - "tipo": 4, - "imagen": { - "picto": "divertido" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 162, - "texto": { - "en": "hard", - "es": "duro" - }, - "tipo": 4, - "imagen": { - "picto": "duro" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 164, - "texto": { - "en": "in love", - "es": "enamorado" - }, - "tipo": 4, - "imagen": { - "picto": "enamorado" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 165, - "texto": { - "en": "full", - "es": "entero" - }, - "tipo": 4, - "imagen": { - "picto": "entero" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 167, - "texto": { - "en": "angry", - "es": "enojado" - }, - "tipo": 4, - "imagen": { - "picto": "ic_enojado" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 171, - "texto": { - "en": "happy", - "es": "feliz" - }, - "tipo": 4, - "imagen": { - "picto": "feliz" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 172, - "texto": { - "en": "ugly", - "es": "feo" - }, - "tipo": 4, - "imagen": { - "picto": "feo" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 177, - "texto": { - "en": "cold", - "es": "frío" - }, - "tipo": 4, - "imagen": { - "picto": "frio_cosa" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 178, - "texto": { - "en": "chilly", - "es": "frío" - }, - "tipo": 4, - "imagen": { - "picto": "frio" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 179, - "texto": { - "en": "chilly", - "es": "frío" - }, - "tipo": 4, - "imagen": { - "picto": "frio_bebida" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 181, - "texto": { - "en": "happy", - "es": "feliz" - }, - "tipo": 4, - "imagen": { - "picto": "ic_feliz" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 194, - "texto": { - "en": "irritated", - "es": "irritado" - }, - "tipo": 4, - "imagen": { - "picto": "irritado" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 199, - "texto": { - "en": "lean", - "es": "límpio" - }, - "tipo": 4, - "imagen": { - "picto": "limpio" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 200, - "texto": { - "en": "nice", - "es": "lindo" - }, - "tipo": 4, - "imagen": { - "picto": "lindo" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 203, - "texto": { - "en": "bad", - "es": "malo" - }, - "tipo": 4, - "imagen": { - "picto": "malo" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 204, - "texto": { - "en": "so so", - "es": "mas o menos" - }, - "tipo": 4, - "imagen": { - "picto": "ic_estoy_masomenos" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 205, - "texto": { - "en": "bad", - "es": "mal" - }, - "tipo": 4, - "imagen": { - "picto": "ic_estoy_mal" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 207, - "texto": { - "en": "annoying", - "es": "molesto" - }, - "tipo": 4, - "imagen": { - "picto": "me_molesta_el_ruido" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 208, - "texto": { - "en": "half", - "es": "medio" - }, - "tipo": 4, - "imagen": { - "picto": "media" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 210, - "texto": { - "en": "equals", - "es": "mismo" - }, - "tipo": 4, - "imagen": { - "picto": "mismo" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 212, - "texto": { - "en": "upset", - "es": "molesto" - }, - "tipo": 4, - "imagen": { - "picto": "molesto" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 213, - "texto": { - "en": "a lot", - "es": "mucho" - }, - "tipo": 4, - "imagen": { - "picto": "mucho" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 217, - "texto": { - "en": "nervous", - "es": "nervioso" - }, - "tipo": 4, - "imagen": { - "picto": "nervioso" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 218, - "texto": { - "en": "none", - "es": "ninguno" - }, - "tipo": 4, - "imagen": { - "picto": "ninguno" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 219, - "texto": { - "en": "cloudy", - "es": "nublado" - }, - "tipo": 4, - "imagen": { - "picto": "nublado" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 233, - "texto": { - "en": "few", - "es": "poco" - }, - "tipo": 4, - "imagen": { - "picto": "poco" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 234, - "texto": { - "en": "few", - "es": "pocos" - }, - "tipo": 4, - "imagen": { - "picto": "pocos" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 237, - "texto": { - "en": "worried", - "es": "preocupada" - }, - "tipo": 4, - "imagen": { - "picto": "preocupada" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 238, - "texto": { - "en": "ready", - "es": "preparado" - }, - "tipo": 4, - "imagen": { - "picto": "preparado" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 242, - "texto": { - "en": "wealthy", - "es": "rica" - }, - "tipo": 4, - "imagen": { - "picto": "rica" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 244, - "texto": { - "en": "sturdy", - "es": "robusto" - }, - "tipo": 4, - "imagen": { - "picto": "robusto" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 245, - "texto": { - "en": "chubby", - "es": "gordito" - }, - "tipo": 4, - "imagen": { - "picto": "rollizo" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 248, - "texto": { - "en": "salty", - "es": "salado" - }, - "tipo": 4, - "imagen": { - "picto": "salado" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 253, - "texto": { - "en": "thirsty", - "es": "sediento" - }, - "tipo": 4, - "imagen": { - "picto": "sed" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 256, - "texto": { - "en": "sunny", - "es": "soleado" - }, - "tipo": 4, - "imagen": { - "picto": "soleado" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 263, - "texto": { - "en": "dirty", - "es": "súcio" - }, - "tipo": 4, - "imagen": { - "picto": "sucio" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 267, - "texto": { - "en": "all", - "es": "todos" - }, - "tipo": 4, - "imagen": { - "picto": "todos" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 268, - "texto": { - "en": "all", - "es": "todas" - }, - "tipo": 4, - "imagen": { - "picto": "todas" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 272, - "texto": { - "en": "sad", - "es": "tríste" - }, - "tipo": 4, - "imagen": { - "picto": "ic_triste" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 274, - "texto": { - "en": "crazy", - "es": "un poco loco" - }, - "tipo": 4, - "imagen": { - "picto": "ic_loco" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 280, - "texto": { - "en": "shamefaced", - "es": "vergonzante" - }, - "tipo": 4, - "imagen": { - "picto": "vergonzante" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 281, - "texto": { - "en": "old", - "es": "viejo" - }, - "tipo": 4, - "imagen": { - "picto": "viejo_cosa" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 282, - "texto": { - "en": "elderly", - "es": "viejo" - }, - "tipo": 4, - "imagen": { - "picto": "viejo" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 283, - "texto": { - "en": "bee", - "es": "abeja" - }, - "tipo": 2, - "imagen": { - "picto": "abeja" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 286, - "texto": { - "en": "animals", - "es": "animales" - }, - "tipo": 2, - "imagen": { - "picto": "animales" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 288, - "texto": { - "en": "donkey", - "es": "asno" - }, - "tipo": 2, - "imagen": { - "picto": "asno" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 290, - "texto": { - "en": "whale", - "es": "ballena" - }, - "tipo": 2, - "imagen": { - "picto": "ballena" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 293, - "texto": { - "en": "horse", - "es": "caballo" - }, - "tipo": 2, - "imagen": { - "picto": "caballo" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 294, - "texto": { - "en": "goat", - "es": "cabra" - }, - "tipo": 2, - "imagen": { - "picto": "cabra" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 296, - "texto": { - "en": "camel", - "es": "camello" - }, - "tipo": 2, - "imagen": { - "picto": "camello" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 297, - "texto": { - "en": "bird", - "es": "canario" - }, - "tipo": 2, - "imagen": { - "picto": "canario" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 298, - "texto": { - "en": "crab", - "es": "cangrejo" - }, - "tipo": 2, - "imagen": { - "picto": "cangrejo" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 299, - "texto": { - "en": "snail", - "es": "caracol" - }, - "tipo": 2, - "imagen": { - "picto": "caracol" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 301, - "texto": { - "en": "pig", - "es": "cerdo" - }, - "tipo": 2, - "imagen": { - "picto": "cerdo" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 310, - "texto": { - "en": "cock", - "es": "gallo" - }, - "tipo": 2, - "imagen": { - "picto": "gallo" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 313, - "texto": { - "en": "cat", - "es": "gato" - }, - "tipo": 2, - "imagen": { - "picto": "gato" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 314, - "texto": { - "en": "cricket", - "es": "grillo" - }, - "tipo": 2, - "imagen": { - "picto": "grillo" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 320, - "texto": { - "en": "giraffe", - "es": "jirafa" - }, - "tipo": 2, - "imagen": { - "picto": "jirafa" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 323, - "texto": { - "en": "lion", - "es": "león" - }, - "tipo": 2, - "imagen": { - "picto": "leon" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 327, - "texto": { - "en": "butterfly", - "es": "mariposa" - }, - "tipo": 2, - "imagen": { - "picto": "mariposa" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 331, - "texto": { - "en": "bear", - "es": "oso" - }, - "tipo": 2, - "imagen": { - "picto": "oso" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 332, - "texto": { - "en": "sheep", - "es": "oveja" - }, - "tipo": 2, - "imagen": { - "picto": "oveja" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 333, - "texto": { - "en": "bird", - "es": "pájaro" - }, - "tipo": 2, - "imagen": { - "picto": "pajaro" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 334, - "texto": { - "en": "birdie", - "es": "pájarito" - }, - "tipo": 2, - "imagen": { - "picto": "pajarito" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 335, - "texto": { - "en": "pidgeon", - "es": "paloma" - }, - "tipo": 2, - "imagen": { - "picto": "paloma" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 337, - "texto": { - "en": "duck", - "es": "pato" - }, - "tipo": 2, - "imagen": { - "picto": "pato" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 340, - "texto": { - "en": "fish", - "es": "peces" - }, - "tipo": 2, - "imagen": { - "picto": "peces" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 342, - "texto": { - "en": "dog", - "es": "perro" - }, - "tipo": 2, - "imagen": { - "picto": "perro" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 348, - "texto": { - "en": "frog", - "es": "rana" - }, - "tipo": 2, - "imagen": { - "picto": "rana" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 354, - "texto": { - "en": "tiger", - "es": "tigre" - }, - "tipo": 2, - "imagen": { - "picto": "tigre" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 356, - "texto": { - "en": "tortoise", - "es": "tortuga" - }, - "tipo": 2, - "imagen": { - "picto": "tortuga" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 357, - "texto": { - "en": "cow", - "es": "vaca" - }, - "tipo": 2, - "imagen": { - "picto": "vaca" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 359, - "texto": { - "en": "snake", - "es": "víbora" - }, - "tipo": 2, - "imagen": { - "picto": "vibora" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 362, - "texto": { - "en": "cock", - "es": "gallo" - }, - "tipo": 2, - "imagen": { - "picto": "gallo" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 363, - "texto": { - "en": "tuna", - "es": "atún" - }, - "tipo": 2, - "imagen": { - "picto": "atun" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 367, - "texto": { - "en": "duck", - "es": "pato" - }, - "tipo": 2, - "imagen": { - "picto": "pato" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 374, - "texto": { - "en": "veal", - "es": "ternera" - }, - "tipo": 2, - "imagen": { - "picto": "ternera" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 375, - "texto": { - "en": "pig", - "es": "cerdo" - }, - "tipo": 2, - "imagen": { - "picto": "cerdo" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 376, - "texto": { - "en": "rabbit", - "es": "conejo" - }, - "tipo": 2, - "imagen": { - "picto": "conejo" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 377, - "texto": { - "en": "Hello", - "es": "Hola" - }, - "tipo": 5, - "imagen": { - "picto": "ic_hola" - }, - "relacion": [ - { - "id": 378, - "frec": 12 - }, - { - "id": 49, - "frec": 4 - }, - { - "id": 44, - "frec": 1 - }, - { - "id": 380, - "frec": 8 - }, - { - "id": 632, - "frec": 3 - }, - { - "id": 628, - "frec": 2 - }, - { - "id": 381, - "frec": 2 - }, - { - "id": 379, - "frec": 5 - }, - { - "id": 22, - "frec": 1 - } - ], - "agenda": 0, - "gps": 0 - }, - { - "id": 378, - "texto": { - "en": "How are you?", - "es": "¿Cómo estás?" - }, - "tipo": 5, - "imagen": { - "picto": "ic_como_estas" - }, - "relacion": [ - { - "id": 22, - "frec": 2 - }, - { - "id": 49, - "frec": 1 - }, - { - "id": 44, - "frec": 1 - } - ], - "agenda": 0, - "gps": 0, - "esSugerencia": false - }, - { - "id": 379, - "texto": { - "en": "Good morning", - "es": "Buen día" - }, - "tipo": 5, - "imagen": { - "picto": "ic_buenos_dias" - }, - "relacion": [ - { - "id": 22, - "frec": 1 - }, - { - "id": 44, - "frec": 1 - }, - { - "id": 49, - "frec": 1 - } - ], - "agenda": 0, - "horario": [ - "MANANA" - ], - "gps": 0, - "esSugerencia": false - }, - { - "id": 380, - "texto": { - "en": "Good afternoon", - "es": "Buenas tardes" - }, - "tipo": 5, - "imagen": { - "picto": "ic_buenas_tardes" - }, - "relacion": [ - { - "id": 22, - "frec": 1 - }, - { - "id": 49, - "frec": 1 - }, - { - "id": 44, - "frec": 1 - } - ], - "agenda": 0, - "horario": [ - "MEDIODIA", - "TARDE" - ], - "gps": 0, - "esSugerencia": false - }, - { - "id": 381, - "texto": { - "en": "Good night", - "es": "Buenas noches" - }, - "tipo": 5, - "imagen": { - "picto": "ic_buenas_noches" - }, - "relacion": [ - { - "id": 22, - "frec": 1 - }, - { - "id": 49, - "frec": 1 - }, - { - "id": 44, - "frec": 1 - } - ], - "agenda": 0, - "horario": [ - "NOCHE" - ], - "gps": 0 - }, - { - "id": 382, - "texto": { - "en": "bye", - "es": "Adiós" - }, - "tipo": 5, - "imagen": { - "picto": "ic_adios" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 383, - "texto": { - "en": "Please", - "es": "Por favor" - }, - "tipo": 5, - "imagen": { - "picto": "por_favor" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 384, - "texto": { - "en": "Thank you", - "es": "Gracias" - }, - "tipo": 5, - "imagen": { - "picto": "ic_gracias" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 385, - "texto": { - "en": "Help", - "es": ". ¿me ayudas?" - }, - "tipo": 5, - "imagen": { - "picto": "ic_ayuda" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 386, - "texto": { - "en": "Luck", - "es": "suerte" - }, - "tipo": 5, - "imagen": { - "picto": "ic_suerte" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 387, - "texto": { - "en": "Good bye", - "es": "Chau" - }, - "tipo": 5, - "imagen": { - "picto": "ic_adios" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 388, - "texto": { - "en": "Yes", - "es": "Si" - }, - "tipo": 5, - "imagen": { - "picto": "ic_si" - }, - "relacion": [ - { - "id": 49, - "frec": 5 - }, - { - "id": 44, - "frec": 1 - }, - { - "id": 22, - "frec": 1 - } - ], - "agenda": 0, - "gps": 0 - }, - { - "id": 389, - "texto": { - "en": "No", - "es": "No" - }, - "tipo": 5, - "imagen": { - "picto": "ic_no" - }, - "relacion": [ - { - "id": 49, - "frec": 13 - }, - { - "id": 22, - "frec": 6 - }, - { - "id": 44, - "frec": 1 - } - ], - "agenda": 0, - "gps": 0 - }, - { - "id": 390, - "texto": { - "en": "I would love to", - "es": "Me encantaría" - }, - "tipo": 5, - "imagen": { - "picto": "ic_genial" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 391, - "texto": { - "en": "chard", - "es": "acelga" - }, - "tipo": 2, - "imagen": { - "picto": "acelga" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 393, - "texto": { - "en": "almond", - "es": "almendras" - }, - "tipo": 2, - "imagen": { - "picto": "almendras" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 394, - "texto": { - "en": "pineapple", - "es": "ananá" - }, - "tipo": 2, - "imagen": { - "picto": "anana" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 396, - "texto": { - "en": "sugar", - "es": "azúcar" - }, - "tipo": 2, - "imagen": { - "picto": "azucar" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 398, - "texto": { - "en": "sandwich", - "es": "bocadillo" - }, - "tipo": 2, - "imagen": { - "picto": "bocadillo" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 399, - "texto": { - "en": "pumpkin", - "es": "calabaza" - }, - "tipo": 2, - "imagen": { - "picto": "calabaza" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 400, - "texto": { - "en": "caneloni", - "es": "canelones" - }, - "tipo": 2, - "imagen": { - "picto": "canelones" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 401, - "texto": { - "en": "cappchino", - "es": "capuchino" - }, - "tipo": 2, - "imagen": { - "picto": "capuchino" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 402, - "texto": { - "en": "chestnuts", - "es": "castañas" - }, - "tipo": 2, - "imagen": { - "picto": "castanas" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 403, - "texto": { - "en": "onion", - "es": "cebolla" - }, - "tipo": 2, - "imagen": { - "picto": "cebolla" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 404, - "texto": { - "en": "cherry", - "es": "cerezas" - }, - "tipo": 2, - "imagen": { - "picto": "cerezas" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 406, - "texto": { - "en": "chupetin", - "es": "chupetin" - }, - "tipo": 2, - "imagen": { - "picto": "chupetin" - }, - "relacion": [], - "agenda": 0, - "gps": 0, - "edad": [ - "NINO" - ] - }, - { - "id": 407, - "texto": { - "en": "plum", - "es": "ciruela" - }, - "tipo": 2, - "imagen": { - "picto": "ciruela" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 408, - "texto": { - "en": "apricot", - "es": "damasco" - }, - "tipo": 2, - "imagen": { - "picto": "damasco" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 412, - "texto": { - "en": "creme caramel", - "es": "flan" - }, - "tipo": 2, - "imagen": { - "picto": "flan" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 413, - "texto": { - "en": "raspberry", - "es": "frambuesa" - }, - "tipo": 2, - "imagen": { - "picto": "frambuesas" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 414, - "texto": { - "en": "strawberry", - "es": "frutilla" - }, - "tipo": 2, - "imagen": { - "picto": "fresa" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 415, - "texto": { - "en": "cookie", - "es": "galleta" - }, - "tipo": 2, - "imagen": { - "picto": "galletas" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 417, - "texto": { - "en": "jelly", - "es": "gelatina" - }, - "tipo": 2, - "imagen": { - "picto": "gelatina" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 420, - "texto": { - "en": "boiled egg", - "es": "huevo duro" - }, - "tipo": 2, - "imagen": { - "picto": "huevo_duro" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 421, - "texto": { - "en": "fried eg", - "es": "huevo frito" - }, - "tipo": 2, - "imagen": { - "picto": "huevo_frito" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 424, - "texto": { - "en": "canned tuna", - "es": "lata de atún" - }, - "tipo": 2, - "imagen": { - "picto": "atun" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 425, - "texto": { - "en": "canned sardine", - "es": "lata de sardinas" - }, - "tipo": 2, - "imagen": { - "picto": "lata_de_sardinas" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 426, - "texto": { - "en": "milk with cacao", - "es": "leche con cacáo" - }, - "tipo": 2, - "imagen": { - "picto": "leche_con_cacao" - }, - "relacion": [], - "agenda": 0, - "gps": 0, - "edad": [ - "NINO" - ] - }, - { - "id": 427, - "texto": { - "en": "milk and cookies", - "es": "leche y galletas" - }, - "tipo": 2, - "imagen": { - "picto": "leche_y_galletas" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 428, - "texto": { - "en": "lettuce", - "es": "lechuga" - }, - "tipo": 2, - "imagen": { - "picto": "lechuga" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 430, - "texto": { - "en": "corn", - "es": "maiz" - }, - "tipo": 2, - "imagen": { - "picto": "maiz" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 431, - "texto": { - "en": "butter", - "es": "manteca" - }, - "tipo": 2, - "imagen": { - "picto": "manteca" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 432, - "texto": { - "en": "peach", - "es": "durazno" - }, - "tipo": 2, - "imagen": { - "picto": "melocoton" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 435, - "texto": { - "en": "orange", - "es": "naranja" - }, - "tipo": 2, - "imagen": { - "picto": "naranja" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 438, - "texto": { - "en": "white bread", - "es": "pan blanco" - }, - "tipo": 2, - "imagen": { - "picto": "pan_blanco" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 439, - "texto": { - "en": "black bread", - "es": "pan negro" - }, - "tipo": 2, - "imagen": { - "picto": "pan_negro" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 447, - "texto": { - "en": "grapefruit", - "es": "pomelo" - }, - "tipo": 2, - "imagen": { - "picto": "pomelo" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 449, - "texto": { - "en": "smashed potatoes", - "es": "puré" - }, - "tipo": 2, - "imagen": { - "picto": "pure" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 458, - "texto": { - "en": "sandwich", - "es": "sandwich" - }, - "tipo": 2, - "imagen": { - "picto": "sandwich" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 462, - "texto": { - "en": "pie", - "es": "tarta" - }, - "tipo": 2, - "imagen": { - "picto": "tarta" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 463, - "texto": { - "en": "tomato", - "es": "tomate" - }, - "tipo": 2, - "imagen": { - "picto": "tomate" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 465, - "texto": { - "en": "toast", - "es": "tostada" - }, - "tipo": 2, - "imagen": { - "picto": "tostada" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 468, - "texto": { - "en": "apple juice", - "es": "jugo de manzana" - }, - "tipo": 2, - "imagen": { - "picto": "zumo_de_manzana" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 469, - "texto": { - "en": "peach juice", - "es": "jugo de durazno" - }, - "tipo": 2, - "imagen": { - "picto": "melocoton" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 471, - "texto": { - "en": "grape juice", - "es": "jugo de uva" - }, - "tipo": 2, - "imagen": { - "picto": "zumo_de_uva" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 472, - "texto": { - "en": "soup", - "es": "Sopa" - }, - "tipo": 2, - "imagen": { - "picto": "sopa" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 473, - "texto": { - "en": "banana", - "es": "banana" - }, - "tipo": 2, - "imagen": { - "picto": "banana" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 474, - "texto": { - "en": "apple", - "es": "manzana" - }, - "tipo": 2, - "imagen": { - "picto": "manzana" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 475, - "texto": { - "en": "pear", - "es": "pera" - }, - "tipo": 2, - "imagen": { - "picto": "pera" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 476, - "texto": { - "en": "fish", - "es": "pescado" - }, - "tipo": 2, - "imagen": { - "picto": "zid_pescado" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 477, - "texto": { - "en": "salad", - "es": "ensalada" - }, - "tipo": 2, - "imagen": { - "picto": "zid_ensalada" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 478, - "texto": { - "en": "vegetables", - "es": "verduras" - }, - "tipo": 2, - "imagen": { - "picto": "zid_verduras" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 480, - "texto": { - "en": "pasta", - "es": "pasta" - }, - "tipo": 2, - "imagen": { - "picto": "zid_pasta" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 481, - "texto": { - "en": "rice", - "es": "arroz" - }, - "tipo": 2, - "imagen": { - "picto": "zid_arroz" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 482, - "texto": { - "en": "beef", - "es": "carne" - }, - "tipo": 2, - "imagen": { - "picto": "zid_carne" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 483, - "texto": { - "en": "fruit", - "es": "fruta" - }, - "tipo": 2, - "imagen": { - "picto": "zid_fruta" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 484, - "texto": { - "en": "yoghurt", - "es": "yogur" - }, - "tipo": 2, - "imagen": { - "picto": "zid_yogurt" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 485, - "texto": { - "en": "cake", - "es": "torta" - }, - "tipo": 2, - "imagen": { - "picto": "zid_tarta" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 486, - "texto": { - "en": "ice cream", - "es": "helado" - }, - "tipo": 2, - "imagen": { - "picto": "zid_helado" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 487, - "texto": { - "en": "oil", - "es": "aceite" - }, - "tipo": 2, - "imagen": { - "picto": "aceite" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 489, - "texto": { - "en": "salt", - "es": "sal" - }, - "tipo": 2, - "imagen": { - "picto": "sal" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 490, - "texto": { - "en": "mayo", - "es": "mayonesa" - }, - "tipo": 2, - "imagen": { - "picto": "mayonesa" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 492, - "texto": { - "en": "ketchup", - "es": "ketchup" - }, - "tipo": 2, - "imagen": { - "picto": "ketchup" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 494, - "texto": { - "en": "Candy", - "es": "Golosina" - }, - "tipo": 2, - "imagen": { - "picto": "ic_dulces" - }, - "relacion": [], - "agenda": 0, - "gps": 0, - "edad": [ - "JOVEN", - "NINO" - ] - }, - { - "id": 495, - "texto": { - "en": "milk", - "es": "leche" - }, - "tipo": 2, - "imagen": { - "picto": "leche" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 496, - "texto": { - "en": "coffee", - "es": "café" - }, - "tipo": 2, - "imagen": { - "picto": "cafe" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 497, - "texto": { - "en": "juice", - "es": "jugo" - }, - "tipo": 2, - "imagen": { - "picto": "ic_bebida" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 498, - "texto": { - "en": "chocolate", - "es": "chocolate" - }, - "tipo": 2, - "imagen": { - "picto": "chocolate" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 499, - "texto": { - "en": "te", - "es": "té" - }, - "tipo": 2, - "imagen": { - "picto": "te" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 500, - "texto": { - "en": "water", - "es": "agua" - }, - "tipo": 2, - "imagen": { - "picto": "agua" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 501, - "texto": { - "en": "soda", - "es": "gaseosa" - }, - "tipo": 2, - "imagen": { - "picto": "cocacola" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 502, - "texto": { - "en": "beer", - "es": "cerveza" - }, - "tipo": 2, - "imagen": { - "picto": "cerveza" - }, - "relacion": [], - "agenda": 0, - "gps": 0, - "edad": [ - "ADULTO" - ] - }, - { - "id": 503, - "texto": { - "en": "wine", - "es": "vino" - }, - "tipo": 2, - "imagen": { - "picto": "vino" - }, - "relacion": [], - "agenda": 0, - "gps": 0, - "edad": [ - "ADULTO" - ] - }, - { - "id": 504, - "texto": { - "en": "poultry", - "es": "pollo" - }, - "tipo": 2, - "imagen": { - "picto": "zid_pollo" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 505, - "texto": { - "en": "chicken thigh", - "es": "muslo de pollo" - }, - "tipo": 2, - "imagen": { - "picto": "muslo_de_pollo" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 507, - "texto": { - "en": "egg", - "es": "huevo" - }, - "tipo": 2, - "imagen": { - "picto": "zid_huevo" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 510, - "texto": { - "en": "fish", - "es": "pescado" - }, - "tipo": 2, - "imagen": { - "picto": "zid_pescado" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 512, - "texto": { - "en": "steak", - "es": "filete" - }, - "tipo": 2, - "imagen": { - "picto": "filete" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 515, - "texto": { - "en": "hamburguer", - "es": "hamburguesa" - }, - "tipo": 2, - "imagen": { - "picto": "hamburguesa" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 516, - "texto": { - "en": "raw ham", - "es": "jamón crudo" - }, - "tipo": 2, - "imagen": { - "picto": "jamon" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 517, - "texto": { - "en": "cooked ham", - "es": "jamón cocido" - }, - "tipo": 2, - "imagen": { - "picto": "jamon_de_york" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 521, - "texto": { - "en": "cheese", - "es": "queso" - }, - "tipo": 2, - "imagen": { - "picto": "queso" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 524, - "texto": { - "en": "sausage", - "es": "salchichas" - }, - "tipo": 2, - "imagen": { - "picto": "salchichas" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 525, - "texto": { - "en": "a", - "es": "a" - }, - "tipo": 6, - "imagen": { - "picto": "a" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 526, - "texto": { - "en": "before", - "es": "ante" - }, - "tipo": 6, - "imagen": { - "picto": "ante" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 527, - "texto": { - "en": "beneath", - "es": "bajo" - }, - "tipo": 6, - "imagen": { - "picto": "bajo_prep" - }, - "relacion": [ - { - "id": 528, - "frec": 1 - } - ], - "agenda": 0, - "gps": 0 - }, - { - "id": 528, - "texto": { - "en": "with", - "es": "con" - }, - "tipo": 6, - "imagen": { - "picto": "con_prep" - }, - "relacion": [ - { - "id": 1001, - "frec": 1 - } - ], - "agenda": 0, - "gps": 0 - }, - { - "id": 529, - "texto": { - "en": "against", - "es": "contra" - }, - "tipo": 6, - "imagen": { - "picto": "contra" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 530, - "texto": { - "en": "of", - "es": "de" - }, - "tipo": 6, - "imagen": { - "picto": "de" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 531, - "texto": { - "en": "from", - "es": "desde" - }, - "tipo": 6, - "imagen": { - "picto": "desde" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 532, - "texto": { - "en": "during", - "es": "durante" - }, - "tipo": 6, - "imagen": { - "picto": "durante" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 533, - "texto": { - "en": "in", - "es": "en" - }, - "tipo": 6, - "imagen": { - "picto": "en" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 534, - "texto": { - "en": "between", - "es": "entre" - }, - "tipo": 6, - "imagen": { - "picto": "entre" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 535, - "texto": { - "en": "towards", - "es": "hacia" - }, - "tipo": 6, - "imagen": { - "picto": "hacia" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 536, - "texto": { - "en": "until", - "es": "hasta" - }, - "tipo": 6, - "imagen": { - "picto": "hasta" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 537, - "texto": { - "en": "for", - "es": "para" - }, - "tipo": 6, - "imagen": { - "picto": "para" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 538, - "texto": { - "en": "by", - "es": "por" - }, - "tipo": 6, - "imagen": { - "picto": "por" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 539, - "texto": { - "en": "according", - "es": "según" - }, - "tipo": 6, - "imagen": { - "picto": "segun" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 540, - "texto": { - "en": "without", - "es": "sin" - }, - "tipo": 6, - "imagen": { - "picto": "sin" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 544, - "texto": { - "en": "hero", - "es": "heroe" - }, - "tipo": 2, - "imagen": { - "picto": "spiderman" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 552, - "texto": { - "en": "story", - "es": "cuento" - }, - "tipo": 2, - "imagen": { - "picto": "cuento" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 553, - "texto": { - "en": "book", - "es": "libro" - }, - "tipo": 2, - "imagen": { - "picto": "libro" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 554, - "texto": { - "en": "movie", - "es": "película" - }, - "tipo": 2, - "imagen": { - "picto": "pelicula" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 557, - "texto": { - "en": "in love", - "es": "enamorado" - }, - "tipo": 4, - "imagen": { - "picto": "enamorados" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 560, - "texto": { - "en": "cartoons", - "es": "dibujos animados" - }, - "tipo": 2, - "imagen": { - "picto": "ic_dibujos_animados" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 561, - "texto": { - "en": "ticket", - "es": "entrada" - }, - "tipo": 2, - "imagen": { - "picto": "ic_entrada" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 563, - "texto": { - "en": "row", - "es": "fila" - }, - "tipo": 2, - "imagen": { - "picto": "fila" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 564, - "texto": { - "en": "drink", - "es": "bebida" - }, - "tipo": 2, - "imagen": { - "picto": "bebida" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 565, - "texto": { - "en": "popcorn", - "es": "pochoclos" - }, - "tipo": 2, - "imagen": { - "picto": "ic_palomitas" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 567, - "texto": { - "en": "money", - "es": "dinero" - }, - "tipo": 2, - "imagen": { - "picto": "ic_dinero" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 568, - "texto": { - "en": "remote", - "es": "control remoto" - }, - "tipo": 2, - "imagen": { - "picto": "ic_control_remoto" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 572, - "texto": { - "en": "news", - "es": "noticias" - }, - "tipo": 2, - "imagen": { - "picto": "ic_canal_noticiero" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 573, - "texto": { - "en": "music", - "es": "música" - }, - "tipo": 2, - "imagen": { - "picto": "ic_escuchar_musica" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 575, - "texto": { - "en": "cooking channel", - "es": "canal de cocina" - }, - "tipo": 2, - "imagen": { - "picto": "programa_de_cocina" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 580, - "texto": { - "en": "cartoons", - "es": "dibujos animados" - }, - "tipo": 2, - "imagen": { - "picto": "ic_canal_dibujos_animados" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 583, - "texto": { - "en": "sport channel", - "es": "deportes" - }, - "tipo": 2, - "imagen": { - "picto": "ic_canal_deportes" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 587, - "texto": { - "en": "How much is it?", - "es": "¿cuánto sale?" - }, - "tipo": 2, - "imagen": { - "picto": "ic_precio" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 588, - "texto": { - "en": "invoice", - "es": "factura" - }, - "tipo": 2, - "imagen": { - "picto": "factura" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 589, - "texto": { - "en": "lunch", - "es": "almuerzo" - }, - "tipo": 2, - "imagen": { - "picto": "ic_almuerzo" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 590, - "texto": { - "en": "dinner", - "es": "cena" - }, - "tipo": 2, - "imagen": { - "picto": "ic_cena" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 594, - "texto": { - "en": "breakfast", - "es": "desayuno" - }, - "tipo": 2, - "imagen": { - "picto": "ic_desayuno" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 595, - "texto": { - "en": "Where?", - "es": "¿Dónde es?" - }, - "tipo": 6, - "imagen": { - "picto": "donde" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 597, - "texto": { - "en": "hungry", - "es": "hambre" - }, - "tipo": 2, - "imagen": { - "picto": "ic_hambre" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 598, - "texto": { - "en": "afternoon snack", - "es": "merienda" - }, - "tipo": 2, - "imagen": { - "picto": "ic_merienda" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 599, - "texto": { - "en": "dish", - "es": "plato" - }, - "tipo": 2, - "imagen": { - "picto": "plato" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 600, - "texto": { - "en": "desert", - "es": "postre" - }, - "tipo": 2, - "imagen": { - "picto": "postre" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 602, - "texto": { - "en": "What time is it?", - "es": "¿Qué hora es?" - }, - "tipo": 5, - "imagen": { - "picto": "que_hora_es" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 604, - "texto": { - "en": "napkin", - "es": "servilletas" - }, - "tipo": 2, - "imagen": { - "picto": "servilleta" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 605, - "texto": { - "en": "glass", - "es": "vaso" - }, - "tipo": 2, - "imagen": { - "picto": "vaso" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 606, - "texto": { - "en": "plane", - "es": "avión" - }, - "tipo": 2, - "imagen": { - "picto": "avion" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 607, - "texto": { - "en": "Bus", - "es": "autobús" - }, - "tipo": 2, - "imagen": { - "picto": "autobus" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 608, - "texto": { - "en": "car", - "es": "coche" - }, - "tipo": 2, - "imagen": { - "picto": "coche" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 609, - "texto": { - "en": "Metro", - "es": "metro" - }, - "tipo": 2, - "imagen": { - "picto": "metro" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 610, - "texto": { - "en": "taxi", - "es": "taxi" - }, - "tipo": 2, - "imagen": { - "picto": "taxi" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 611, - "texto": { - "en": "transportation", - "es": "transportes" - }, - "tipo": 2, - "imagen": { - "picto": "transportes" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 614, - "texto": { - "en": "grandpa", - "es": "abuelo" - }, - "tipo": 1, - "imagen": { - "picto": "ic_abuelo" - }, - "relacion": [ - { - "id": 22, - "frec": 4 - }, - { - "id": 14, - "frec": 1 - }, - { - "id": 44, - "frec": 1 - }, - { - "id": 49, - "frec": 1 - }, - { - "id": 378, - "frec": 1 - } - ], - "agenda": 0, - "gps": 0 - }, - { - "id": 615, - "texto": { - "en": "friends", - "es": "amigos" - }, - "tipo": 1, - "imagen": { - "picto": "ic_amigos" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 617, - "texto": { - "en": "Butcher", - "es": "carnicero" - }, - "tipo": 1, - "imagen": { - "picto": "carnicero" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 619, - "texto": { - "en": "chef", - "es": "cocinero" - }, - "tipo": 1, - "imagen": { - "picto": "cocinero" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 620, - "texto": { - "en": "team", - "es": "equipo" - }, - "tipo": 1, - "imagen": { - "picto": "equipo" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 621, - "texto": { - "en": "family", - "es": "familia" - }, - "tipo": 1, - "imagen": { - "picto": "ic_familia" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 622, - "texto": { - "en": "futbol player", - "es": "futbolista" - }, - "tipo": 1, - "imagen": { - "picto": "ic_futbolista" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 623, - "texto": { - "en": "brother", - "es": "hermano" - }, - "tipo": 1, - "imagen": { - "picto": "ic_hermano" - }, - "relacion": [ - { - "id": 22, - "frec": 1 - }, - { - "id": 49, - "frec": 1 - }, - { - "id": 44, - "frec": 1 - }, - { - "id": 14, - "frec": 1 - }, - { - "id": 378, - "frec": 1 - } - ], - "agenda": 0, - "gps": 0 - }, - { - "id": 624, - "texto": { - "en": "sister", - "es": "hermana" - }, - "tipo": 1, - "imagen": { - "picto": "hermana" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 626, - "texto": { - "en": "teacher", - "es": "maestra" - }, - "tipo": 1, - "imagen": { - "picto": "ic_maestra" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 627, - "texto": { - "en": "teacher", - "es": "maestro" - }, - "tipo": 1, - "imagen": { - "picto": "maestro" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 628, - "texto": { - "en": "mom", - "es": "mamá" - }, - "tipo": 1, - "imagen": { - "picto": "ic_mama" - }, - "relacion": [ - { - "id": 44, - "frec": 18 - }, - { - "id": 22, - "frec": 4 - }, - { - "id": 49, - "frec": 6 - }, - { - "id": 378, - "frec": 6 - }, - { - "id": 14, - "frec": 10 - } - ], - "agenda": 0, - "gps": 0 - }, - { - "id": 629, - "texto": { - "en": "medic", - "es": "médico" - }, - "tipo": 1, - "imagen": { - "picto": "ic_medico" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 630, - "texto": { - "en": "boy", - "es": "niño" - }, - "tipo": 1, - "imagen": { - "picto": "nino" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 631, - "texto": { - "en": "girl", - "es": "niña" - }, - "tipo": 1, - "imagen": { - "picto": "nina" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 632, - "texto": { - "en": "dad", - "es": "papá" - }, - "tipo": 1, - "imagen": { - "picto": "ic_papa" - }, - "relacion": [ - { - "id": 44, - "frec": 16 - }, - { - "id": 22, - "frec": 5 - }, - { - "id": 378, - "frec": 1 - }, - { - "id": 14, - "frec": 1 - } - ], - "agenda": 0, - "gps": 0 - }, - { - "id": 633, - "texto": { - "en": "people", - "es": "personas" - }, - "tipo": 1, - "imagen": { - "picto": "personas" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 635, - "texto": { - "en": "princess", - "es": "princesa" - }, - "tipo": 1, - "imagen": { - "picto": "princesa" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 638, - "texto": { - "en": "Queen", - "es": "reina" - }, - "tipo": 1, - "imagen": { - "picto": "reina" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 639, - "texto": { - "en": "King", - "es": "rey" - }, - "tipo": 1, - "imagen": { - "picto": "rey" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 640, - "texto": { - "en": "taxi driver", - "es": "taxista" - }, - "tipo": 1, - "imagen": { - "picto": "taxista" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 642, - "texto": { - "en": "you", - "es": "vos" - }, - "tipo": 1, - "imagen": { - "picto": "ic_tu" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 643, - "texto": { - "en": "I", - "es": "yo" - }, - "tipo": 1, - "imagen": { - "picto": "ic_yo" - }, - "relacion": [ - { - "id": 22, - "frec": 4 - }, - { - "id": 44, - "frec": 20 - }, - { - "id": 49, - "frec": 10 - } - ], - "agenda": 0, - "gps": 0 - }, - { - "id": 644, - "texto": { - "en": "here", - "es": "acá" - }, - "tipo": 2, - "imagen": { - "picto": "ic_aca" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 646, - "texto": { - "en": "airport", - "es": "aeropuerto" - }, - "tipo": 2, - "imagen": { - "picto": "aeropuerto" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 648, - "texto": { - "en": "there", - "es": "allá" - }, - "tipo": 2, - "imagen": { - "picto": "ic_alla" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 649, - "texto": { - "en": "Pub", - "es": "bar" - }, - "tipo": 2, - "imagen": { - "picto": "bar" - }, - "relacion": [], - "agenda": 0, - "gps": 0, - "edad": [ - "ADULTO" - ] - }, - { - "id": 650, - "texto": { - "en": "bike shop", - "es": "una bicicletería" - }, - "tipo": 2, - "imagen": { - "picto": "tienda_de_bicicletas" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 651, - "texto": { - "en": "field", - "es": "la cancha" - }, - "tipo": 2, - "imagen": { - "picto": "cancha" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 653, - "texto": { - "en": "house", - "es": "casa" - }, - "tipo": 2, - "imagen": { - "picto": "ic_casa" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 656, - "texto": { - "en": "city", - "es": "ciudad" - }, - "tipo": 2, - "imagen": { - "picto": "ciudad" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 657, - "texto": { - "en": "dinning room", - "es": "comedor" - }, - "tipo": 2, - "imagen": { - "picto": "ic_comedor" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 660, - "texto": { - "en": "bathroom", - "es": "cuarto de baño" - }, - "tipo": 2, - "imagen": { - "picto": "ic_lugarbanio" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 661, - "texto": { - "en": "disco", - "es": "la discoteca" - }, - "tipo": 2, - "imagen": { - "picto": "discoteca" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 662, - "texto": { - "en": "school", - "es": "escuela" - }, - "tipo": 2, - "imagen": { - "picto": "ic_escuela" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 666, - "texto": { - "en": "Burger shop", - "es": "hamburguesería" - }, - "tipo": 2, - "imagen": { - "picto": "hamburgueseria" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 668, - "texto": { - "en": "hospital", - "es": "hospital" - }, - "tipo": 2, - "imagen": { - "picto": "hospital" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 672, - "texto": { - "en": "garden", - "es": "jardín" - }, - "tipo": 2, - "imagen": { - "picto": "jardin" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 675, - "texto": { - "en": "market", - "es": "mercado" - }, - "tipo": 2, - "imagen": { - "picto": "mercado" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 678, - "texto": { - "en": "yard", - "es": "patio" - }, - "tipo": 2, - "imagen": { - "picto": "ic_patio" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 679, - "texto": { - "en": "Pizza shop", - "es": "pizzería" - }, - "tipo": 2, - "imagen": { - "picto": "pizzeria" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 680, - "texto": { - "en": "Poultry shop", - "es": "pollería" - }, - "tipo": 2, - "imagen": { - "picto": "polleria" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 682, - "texto": { - "en": "square", - "es": "la plaza" - }, - "tipo": 2, - "imagen": { - "picto": "plaza" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 685, - "texto": { - "en": "Restaurant", - "es": "restaurante" - }, - "tipo": 2, - "imagen": { - "picto": "restaurante" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 687, - "texto": { - "en": "traffic light", - "es": "semáforo" - }, - "tipo": 2, - "imagen": { - "picto": "semaforo" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 688, - "texto": { - "en": "supermarket", - "es": "un supermercado" - }, - "tipo": 2, - "imagen": { - "picto": "supermercado" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 698, - "texto": { - "en": "greengrocery", - "es": "verdulería" - }, - "tipo": 2, - "imagen": { - "picto": "verduleria" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 700, - "texto": { - "en": "Blockbuster", - "es": "videoclub" - }, - "tipo": 2, - "imagen": { - "picto": "videoclub" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 702, - "texto": { - "en": "friendship", - "es": "amistad" - }, - "tipo": 6, - "imagen": { - "picto": "amistad" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 703, - "texto": { - "en": "help", - "es": "ayuda" - }, - "tipo": 6, - "imagen": { - "picto": "ayuda" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 704, - "texto": { - "en": "celebration", - "es": "celebración" - }, - "tipo": 6, - "imagen": { - "picto": "celebracion" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 706, - "texto": { - "en": "fulfillment", - "es": "cumplimiento" - }, - "tipo": 6, - "imagen": { - "picto": "cumplimiento" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 707, - "texto": { - "en": "description", - "es": "descripción" - }, - "tipo": 6, - "imagen": { - "picto": "descripcion" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 708, - "texto": { - "en": "Personal hygiene", - "es": "higiene personal" - }, - "tipo": 6, - "imagen": { - "picto": "higiene_personal" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 712, - "texto": { - "en": "physical abuse", - "es": "maltrato físico" - }, - "tipo": 6, - "imagen": { - "picto": "maltrato_fisico" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 713, - "texto": { - "en": "verbal abuse", - "es": "maltrato verbal" - }, - "tipo": 6, - "imagen": { - "picto": "maltrato_verbal" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 714, - "texto": { - "en": "plural", - "es": "plurales" - }, - "tipo": 6, - "imagen": { - "picto": "plurales" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 718, - "texto": { - "en": "rehab", - "es": "rehabilitación" - }, - "tipo": 6, - "imagen": { - "picto": "rehabilitacion" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 721, - "texto": { - "en": "series", - "es": "serie" - }, - "tipo": 6, - "imagen": { - "picto": "serie" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 722, - "texto": { - "en": "feelings", - "es": "sentimientos" - }, - "tipo": 6, - "imagen": { - "picto": "sentimientos" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 725, - "texto": { - "en": "surprise", - "es": "sorpresa" - }, - "tipo": 6, - "imagen": { - "picto": "sorpresa" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 728, - "texto": { - "en": "verbs", - "es": "verbos" - }, - "tipo": 2, - "imagen": { - "picto": "verbos" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 729, - "texto": { - "en": "shame", - "es": "verguenza" - }, - "tipo": 6, - "imagen": { - "picto": "verguenza" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 730, - "texto": { - "en": "life", - "es": "vida" - }, - "tipo": 6, - "imagen": { - "picto": "vida" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 731, - "texto": { - "en": "visit", - "es": "visita" - }, - "tipo": 6, - "imagen": { - "picto": "visita" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 732, - "texto": { - "en": "tour", - "es": "paseo" - }, - "tipo": 6, - "imagen": { - "picto": "paseo" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 733, - "texto": { - "en": "Yellow", - "es": "amarillo" - }, - "tipo": 4, - "imagen": { - "picto": "ic_amarillo" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 734, - "texto": { - "en": "Blue", - "es": "azul" - }, - "tipo": 4, - "imagen": { - "picto": "ic_azul" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 736, - "texto": { - "en": "White", - "es": "blanco" - }, - "tipo": 4, - "imagen": { - "picto": "ic_blanco" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 737, - "texto": { - "en": "Colors", - "es": "colores" - }, - "tipo": 2, - "imagen": { - "picto": "ic_colores" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 738, - "texto": { - "en": "Gold", - "es": "dorado" - }, - "tipo": 4, - "imagen": { - "picto": "dorado" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 739, - "texto": { - "en": "Gray", - "es": "gris" - }, - "tipo": 4, - "imagen": { - "picto": "ic_gris" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 740, - "texto": { - "en": "Purple", - "es": "lila" - }, - "tipo": 4, - "imagen": { - "picto": "lila" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 742, - "texto": { - "en": "Orange", - "es": "naranja" - }, - "tipo": 4, - "imagen": { - "picto": "ic_naranja" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 743, - "texto": { - "en": "Black", - "es": "negro" - }, - "tipo": 4, - "imagen": { - "picto": "ic_negro" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 744, - "texto": { - "en": "Silver", - "es": "plateado" - }, - "tipo": 4, - "imagen": { - "picto": "plateado" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 745, - "texto": { - "en": "What color it is?", - "es": "¿Qué color es?" - }, - "tipo": 5, - "imagen": { - "picto": "color_pregunta" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 746, - "texto": { - "en": "Red", - "es": "rojo" - }, - "tipo": 4, - "imagen": { - "picto": "ic_rojo" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 747, - "texto": { - "en": "Pink", - "es": "rosa" - }, - "tipo": 4, - "imagen": { - "picto": "ic_rosa" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 748, - "texto": { - "en": "Violet", - "es": "violeta" - }, - "tipo": 4, - "imagen": { - "picto": "ic_violeta" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 749, - "texto": { - "en": "Green", - "es": "verde" - }, - "tipo": 4, - "imagen": { - "picto": "ic_verde" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 750, - "texto": { - "en": "Light green", - "es": "verde Claro" - }, - "tipo": 4, - "imagen": { - "picto": "verde_claro" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 751, - "texto": { - "en": "agenda", - "es": "agenda" - }, - "tipo": 2, - "imagen": { - "picto": "ic_agenda" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 752, - "texto": { - "en": "wallet", - "es": "billetera" - }, - "tipo": 2, - "imagen": { - "picto": "ic_billetera" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 753, - "texto": { - "en": "pencil case", - "es": "cartuchera" - }, - "tipo": 2, - "imagen": { - "picto": "ic_cartuchera" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 754, - "texto": { - "en": "Lessons", - "es": "clases" - }, - "tipo": 2, - "imagen": { - "picto": "ic_clases" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 755, - "texto": { - "en": "computer", - "es": "computadora" - }, - "tipo": 2, - "imagen": { - "picto": "ic_computadora" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 756, - "texto": { - "en": "Crayon", - "es": "crayones" - }, - "tipo": 2, - "imagen": { - "picto": "ic_pinturas_de_colores" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 757, - "texto": { - "en": "notebook", - "es": "cuaderno" - }, - "tipo": 2, - "imagen": { - "picto": "ic_cuaderno" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 758, - "texto": { - "en": "room", - "es": "cuarto" - }, - "tipo": 2, - "imagen": { - "picto": "ic_cuarto" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 760, - "texto": { - "en": "eraser", - "es": "goma" - }, - "tipo": 2, - "imagen": { - "picto": "ic_goma" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 761, - "texto": { - "en": "toy", - "es": "el juguete" - }, - "tipo": 2, - "imagen": { - "picto": "ic_jueguete" - }, - "relacion": [ - { - "id": 734, - "frec": 3 - }, - { - "id": 743, - "frec": 1 - }, - { - "id": 747, - "frec": 1 - }, - { - "id": 736, - "frec": 1 - } - ], - "agenda": 0, - "gps": 0 - }, - { - "id": 762, - "texto": { - "en": "pencil", - "es": "lapiz" - }, - "tipo": 2, - "imagen": { - "picto": "ic_lapices_de_colores" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 766, - "texto": { - "en": "paper", - "es": "papel" - }, - "tipo": 2, - "imagen": { - "picto": "ic_papel" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 767, - "texto": { - "en": "ball", - "es": "pelota" - }, - "tipo": 2, - "imagen": { - "picto": "ic_pelotas" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 768, - "texto": { - "en": "glue", - "es": "pegamento" - }, - "tipo": 2, - "imagen": { - "picto": "ic_pegamento" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 769, - "texto": { - "en": "brush", - "es": "pincel" - }, - "tipo": 2, - "imagen": { - "picto": "ic_pincel" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 770, - "texto": { - "en": "blackboard", - "es": "pizarrón" - }, - "tipo": 2, - "imagen": { - "picto": "ic_pizarron" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 771, - "texto": { - "en": "art class", - "es": "plástica" - }, - "tipo": 2, - "imagen": { - "picto": "ic_plastica" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 772, - "texto": { - "en": "magazines", - "es": "revistas" - }, - "tipo": 2, - "imagen": { - "picto": "ic_revistas" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 773, - "texto": { - "en": "TV", - "es": "la televisión" - }, - "tipo": 2, - "imagen": { - "picto": "ic_televisor" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 774, - "texto": { - "en": "tablet", - "es": "la tablet" - }, - "tipo": 2, - "imagen": { - "picto": "ic_tablet" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 776, - "texto": { - "en": "armpit", - "es": "axila" - }, - "tipo": 2, - "imagen": { - "picto": "sobacos" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 777, - "texto": { - "en": "mouth", - "es": "boca" - }, - "tipo": 2, - "imagen": { - "picto": "boca" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 778, - "texto": { - "en": "arm", - "es": "brazo" - }, - "tipo": 2, - "imagen": { - "picto": "brazo" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 780, - "texto": { - "en": "elbow", - "es": "codo" - }, - "tipo": 2, - "imagen": { - "picto": "codo" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 781, - "texto": { - "en": "neck", - "es": "cuello" - }, - "tipo": 2, - "imagen": { - "picto": "cuello" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 782, - "texto": { - "en": "finger", - "es": "dedos" - }, - "tipo": 2, - "imagen": { - "picto": "dedos" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 783, - "texto": { - "en": "bone", - "es": "hueso" - }, - "tipo": 2, - "imagen": { - "picto": "huesos" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 784, - "texto": { - "en": "shoulder", - "es": "hombro" - }, - "tipo": 2, - "imagen": { - "picto": "hombro" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 785, - "texto": { - "en": "tongue", - "es": "lengua" - }, - "tipo": 2, - "imagen": { - "picto": "lengua" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 786, - "texto": { - "en": "hand", - "es": "mano" - }, - "tipo": 2, - "imagen": { - "picto": "mano" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 787, - "texto": { - "en": "snot", - "es": "moco" - }, - "tipo": 2, - "imagen": { - "picto": "moco" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 788, - "texto": { - "en": "wrist", - "es": "muñeca" - }, - "tipo": 2, - "imagen": { - "picto": "munieca" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 789, - "texto": { - "en": "butt", - "es": "nalgas" - }, - "tipo": 2, - "imagen": { - "picto": "nalgas" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 790, - "texto": { - "en": "nose", - "es": "nariz" - }, - "tipo": 2, - "imagen": { - "picto": "nariz" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 791, - "texto": { - "en": "eyes", - "es": "ojos" - }, - "tipo": 2, - "imagen": { - "picto": "ojos" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 792, - "texto": { - "en": "belly button", - "es": "ombligo" - }, - "tipo": 2, - "imagen": { - "picto": "ombligo" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 793, - "texto": { - "en": "ear", - "es": "oreja" - }, - "tipo": 2, - "imagen": { - "picto": "oreja" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 794, - "texto": { - "en": "organs", - "es": "órganos" - }, - "tipo": 2, - "imagen": { - "picto": "organos" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 795, - "texto": { - "en": "belly", - "es": "panza" - }, - "tipo": 2, - "imagen": { - "picto": "barriga" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 797, - "texto": { - "en": "chest", - "es": "pecho" - }, - "tipo": 2, - "imagen": { - "picto": "pecho" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 799, - "texto": { - "en": "foot", - "es": "pie" - }, - "tipo": 2, - "imagen": { - "picto": "pie" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 800, - "texto": { - "en": "lung", - "es": "pulmones" - }, - "tipo": 2, - "imagen": { - "picto": "pulmones" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 802, - "texto": { - "en": "knee", - "es": "rodilla" - }, - "tipo": 2, - "imagen": { - "picto": "rodilla" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 803, - "texto": { - "en": "saliva", - "es": "saliva" - }, - "tipo": 2, - "imagen": { - "picto": "saliva" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 804, - "texto": { - "en": "blood", - "es": "sangre" - }, - "tipo": 2, - "imagen": { - "picto": "sangre" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 806, - "texto": { - "en": "boobs", - "es": "tetas" - }, - "tipo": 2, - "imagen": { - "picto": "tetas" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 807, - "texto": { - "en": "ankle", - "es": "tobillos" - }, - "tipo": 2, - "imagen": { - "picto": "tobillo" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 809, - "texto": { - "en": "nail", - "es": "uña" - }, - "tipo": 2, - "imagen": { - "picto": "unia" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 810, - "texto": { - "en": "before", - "es": "antes" - }, - "tipo": 6, - "imagen": { - "picto": "antes" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 811, - "texto": { - "en": "yesterday", - "es": "ayer" - }, - "tipo": 6, - "imagen": { - "picto": "ayer" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 812, - "texto": { - "en": "after", - "es": "despues" - }, - "tipo": 6, - "imagen": { - "picto": "despues" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 815, - "texto": { - "en": "tomorrow", - "es": "mañana" - }, - "tipo": 6, - "imagen": { - "picto": "maniana" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 816, - "texto": { - "en": "fall", - "es": "otoño" - }, - "tipo": 2, - "imagen": { - "picto": "otonio" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 817, - "texto": { - "en": "spring", - "es": "primavera" - }, - "tipo": 2, - "imagen": { - "picto": "primavera" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 818, - "texto": { - "en": "summer", - "es": "verano" - }, - "tipo": 2, - "imagen": { - "picto": "verano" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 819, - "texto": { - "en": "sick", - "es": "enfermo" - }, - "tipo": 4, - "imagen": { - "picto": "enfermo" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 820, - "texto": { - "en": "diarrhea", - "es": "diarrea" - }, - "tipo": 2, - "imagen": { - "picto": "zid_diarrea" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 821, - "texto": { - "en": "pain", - "es": "dolor" - }, - "tipo": 2, - "imagen": { - "picto": "zid_dolor" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 822, - "texto": { - "en": "toothache", - "es": "dolor de muela" - }, - "tipo": 2, - "imagen": { - "picto": "zid_dolor_de_muela" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 823, - "texto": { - "en": "chest pain", - "es": "dolor de pecho" - }, - "tipo": 2, - "imagen": { - "picto": "zid_dolor_de_pecho" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 824, - "texto": { - "en": "earache", - "es": "dolor de Oido" - }, - "tipo": 2, - "imagen": { - "picto": "zid_dolor_de_oido" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 825, - "texto": { - "en": "stomachache", - "es": "dolor de Panza" - }, - "tipo": 2, - "imagen": { - "picto": "zid_dolor_de_espalda" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 826, - "texto": { - "en": "throat sore", - "es": "dolor de Garganta" - }, - "tipo": 2, - "imagen": { - "picto": "zid_dolor_de_garganta" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 827, - "texto": { - "en": "headache", - "es": "dolor de cabeza" - }, - "tipo": 2, - "imagen": { - "picto": "zid_dolor_de_cabeza" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 828, - "texto": { - "en": "constipation", - "es": "estreñimiento" - }, - "tipo": 2, - "imagen": { - "picto": "estrenimiento" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 829, - "texto": { - "en": "flu", - "es": "gripe" - }, - "tipo": 2, - "imagen": { - "picto": "zid_gripe" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 831, - "texto": { - "en": "cold", - "es": "resfrío" - }, - "tipo": 2, - "imagen": { - "picto": "zid_resfriado" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 834, - "texto": { - "en": "football match", - "es": "partido de fútbol" - }, - "tipo": 2, - "imagen": { - "picto": "ic_partido" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 835, - "texto": { - "en": "Football", - "es": "fútbol" - }, - "tipo": 2, - "imagen": { - "picto": "ic_futbol" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 836, - "texto": { - "en": "one", - "es": "uno" - }, - "tipo": 6, - "imagen": { - "picto": "uno" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 837, - "texto": { - "en": "two", - "es": "dos" - }, - "tipo": 6, - "imagen": { - "picto": "dos" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 838, - "texto": { - "en": "three", - "es": "tres" - }, - "tipo": 6, - "imagen": { - "picto": "tres" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 839, - "texto": { - "en": "four", - "es": "cuatro" - }, - "tipo": 6, - "imagen": { - "picto": "cuatro" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 840, - "texto": { - "en": "five", - "es": "cinco" - }, - "tipo": 6, - "imagen": { - "picto": "cinco" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 841, - "texto": { - "en": "six", - "es": "seis" - }, - "tipo": 6, - "imagen": { - "picto": "seis" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 842, - "texto": { - "en": "seven", - "es": "siete" - }, - "tipo": 6, - "imagen": { - "picto": "siete" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 843, - "texto": { - "en": "eight", - "es": "ocho" - }, - "tipo": 6, - "imagen": { - "picto": "ocho" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 844, - "texto": { - "en": "nine", - "es": "nueve" - }, - "tipo": 6, - "imagen": { - "picto": "nueve" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 845, - "texto": { - "en": "ten", - "es": "diez" - }, - "tipo": 6, - "imagen": { - "picto": "diez" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 846, - "texto": { - "en": "zero", - "es": "cero" - }, - "tipo": 6, - "imagen": { - "picto": "cero" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 850, - "texto": { - "en": "minim", - "es": "blanca" - }, - "tipo": 2, - "imagen": { - "picto": "blanca" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 851, - "texto": { - "en": "peruvian box", - "es": "el cajón" - }, - "tipo": 2, - "imagen": { - "picto": "cajon" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 853, - "texto": { - "en": "chore", - "es": "el coro" - }, - "tipo": 2, - "imagen": { - "picto": "coro" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 855, - "texto": { - "en": "guitar", - "es": "la guitarra" - }, - "tipo": 2, - "imagen": { - "picto": "guitarra" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 857, - "texto": { - "en": "musical instruments", - "es": "los instrumentos musicales" - }, - "tipo": 2, - "imagen": { - "picto": "instrumentos" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 860, - "texto": { - "en": "music lesson", - "es": "música" - }, - "tipo": 2, - "imagen": { - "picto": "ic_musica_id" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 865, - "texto": { - "en": "piano", - "es": "el piano" - }, - "tipo": 2, - "imagen": { - "picto": "piano" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 870, - "texto": { - "en": "drum", - "es": "el tambor" - }, - "tipo": 2, - "imagen": { - "picto": "tambor" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 871, - "texto": { - "en": "triangle", - "es": "el triángulo" - }, - "tipo": 2, - "imagen": { - "picto": "triangulo" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 874, - "texto": { - "en": "trumpet", - "es": "la trompeta" - }, - "tipo": 2, - "imagen": { - "picto": "trompeta" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 876, - "texto": { - "en": "violin", - "es": "el violín" - }, - "tipo": 2, - "imagen": { - "picto": "violin" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 878, - "texto": { - "en": "aspirine", - "es": "aspirina" - }, - "tipo": 2, - "imagen": { - "picto": "ic_aspirina" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 881, - "texto": { - "en": "descongestant", - "es": "descongestivo" - }, - "tipo": 2, - "imagen": { - "picto": "ic_descongestivo" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 882, - "texto": { - "en": "digestive", - "es": "digestivo" - }, - "tipo": 2, - "imagen": { - "picto": "ic_digestivo" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 884, - "texto": { - "en": "syrup", - "es": "jarabe" - }, - "tipo": 2, - "imagen": { - "picto": "jarabe" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 885, - "texto": { - "en": "nebulizer", - "es": "nebulizador" - }, - "tipo": 2, - "imagen": { - "picto": "nebulizador" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 886, - "texto": { - "en": "pills", - "es": "pastillas" - }, - "tipo": 2, - "imagen": { - "picto": "pastillas" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 887, - "texto": { - "en": "bandage", - "es": "venda" - }, - "tipo": 2, - "imagen": { - "picto": "venda" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 889, - "texto": { - "en": "although", - "es": "aunque" - }, - "tipo": 6, - "imagen": { - "picto": "aunque" - }, - "relacion": [ - { - "id": 22, - "frec": 3 - } - ], - "agenda": 0, - "gps": 0 - }, - { - "id": 890, - "texto": { - "en": "which?", - "es": "¿Cuál?" - }, - "tipo": 6, - "imagen": { - "picto": "cual" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 891, - "texto": { - "en": "anyone", - "es": "cualquiera" - }, - "tipo": 6, - "imagen": { - "picto": "cualquier" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 892, - "texto": { - "en": "when?", - "es": "¿Cuándo?" - }, - "tipo": 6, - "imagen": { - "picto": "cuando" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 893, - "texto": { - "en": "how many?", - "es": "¿Cuántos?" - }, - "tipo": 6, - "imagen": { - "picto": "cuantos" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 894, - "texto": { - "en": "how much", - "es": "¿Cuántas?" - }, - "tipo": 6, - "imagen": { - "picto": "cuantos" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 895, - "texto": { - "en": "his", - "es": "del" - }, - "tipo": 6, - "imagen": { - "picto": "del" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 896, - "texto": { - "en": "hers", - "es": "del" - }, - "tipo": 6, - "imagen": { - "picto": "del" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 897, - "texto": { - "en": "its", - "es": "del" - }, - "tipo": 6, - "imagen": { - "picto": "del" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 898, - "texto": { - "en": "and", - "es": "e" - }, - "tipo": 6, - "imagen": { - "picto": "e" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 899, - "texto": { - "en": "he", - "es": "el" - }, - "tipo": 6, - "imagen": { - "picto": "el" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 900, - "texto": { - "en": "she", - "es": "la" - }, - "tipo": 6, - "imagen": { - "picto": "el" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 901, - "texto": { - "en": "I like", - "es": "me gusta" - }, - "tipo": 6, - "imagen": { - "picto": "gustar" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 903, - "texto": { - "en": "no one", - "es": "nadie" - }, - "tipo": 6, - "imagen": { - "picto": "nadie" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 904, - "texto": { - "en": "neither", - "es": "ni" - }, - "tipo": 6, - "imagen": { - "picto": "ni" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 905, - "texto": { - "en": "none", - "es": "ninguno" - }, - "tipo": 6, - "imagen": { - "picto": "ningunos" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 906, - "texto": { - "en": "none", - "es": "ninguna" - }, - "tipo": 6, - "imagen": { - "picto": "ningunos" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 907, - "texto": { - "en": "I don't like", - "es": "no me gusta" - }, - "tipo": 6, - "imagen": { - "picto": "no_gustar" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 910, - "texto": { - "en": "or", - "es": "o" - }, - "tipo": 6, - "imagen": { - "picto": "o" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 911, - "texto": { - "en": "who?", - "es": "quien?" - }, - "tipo": 6, - "imagen": { - "picto": "quien_es" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 912, - "texto": { - "en": "that", - "es": "que" - }, - "tipo": 6, - "imagen": { - "picto": "que" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 913, - "texto": { - "en": "what?", - "es": "¿Qué?" - }, - "tipo": 6, - "imagen": { - "picto": "que_pregunta" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 914, - "texto": { - "en": "who?", - "es": "¿Quién?" - }, - "tipo": 6, - "imagen": { - "picto": "quien" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 915, - "texto": { - "en": "who?", - "es": "¿Quiénes?" - }, - "tipo": 6, - "imagen": { - "picto": "quienes" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 918, - "texto": { - "en": "theirs", - "es": "suyos" - }, - "tipo": 6, - "imagen": { - "picto": "suyos" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 919, - "texto": { - "en": "yours", - "es": "tuyo" - }, - "tipo": 6, - "imagen": { - "picto": "tuya" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 920, - "texto": { - "en": "yours", - "es": "tuya" - }, - "tipo": 6, - "imagen": { - "picto": "tuya" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 923, - "texto": { - "en": "and", - "es": "y" - }, - "tipo": 6, - "imagen": { - "picto": "y" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 924, - "texto": { - "en": "overcoat", - "es": "abrigo" - }, - "tipo": 2, - "imagen": { - "picto": "abrigos" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 928, - "texto": { - "en": "bikini", - "es": "bikini" - }, - "tipo": 2, - "imagen": { - "picto": "bikinis" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 930, - "texto": { - "en": "bag", - "es": "bolsa" - }, - "tipo": 2, - "imagen": { - "picto": "bolsa" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 931, - "texto": { - "en": "boot", - "es": "bota" - }, - "tipo": 2, - "imagen": { - "picto": "bota" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 934, - "texto": { - "en": "button", - "es": "botones" - }, - "tipo": 2, - "imagen": { - "picto": "botones" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 936, - "texto": { - "en": "scarf", - "es": "bufanda" - }, - "tipo": 2, - "imagen": { - "picto": "bufandas" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 938, - "texto": { - "en": "footwear", - "es": "calzado" - }, - "tipo": 2, - "imagen": { - "picto": "calzado" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 939, - "texto": { - "en": "shirt", - "es": "camisa" - }, - "tipo": 2, - "imagen": { - "picto": "camisas" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 940, - "texto": { - "en": "long sleeve", - "es": "camiseta manga larga" - }, - "tipo": 2, - "imagen": { - "picto": "camiseta_de_manga_larga" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 941, - "texto": { - "en": "jacket", - "es": "campera" - }, - "tipo": 2, - "imagen": { - "picto": "campera" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 951, - "texto": { - "en": "hat", - "es": "gorro" - }, - "tipo": 2, - "imagen": { - "picto": "gorro" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 954, - "texto": { - "en": "jean", - "es": "jean" - }, - "tipo": 2, - "imagen": { - "picto": "jean" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 956, - "texto": { - "en": "overall", - "es": "mono" - }, - "tipo": 2, - "imagen": { - "picto": "mono" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 960, - "texto": { - "en": "trouser", - "es": "pantalon" - }, - "tipo": 2, - "imagen": { - "picto": "pantalon" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 962, - "texto": { - "en": "shorts", - "es": "pantalones cortos" - }, - "tipo": 2, - "imagen": { - "picto": "pantalones_cortos" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 968, - "texto": { - "en": "bra", - "es": "sosten" - }, - "tipo": 2, - "imagen": { - "picto": "sosten" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 969, - "texto": { - "en": "sweater", - "es": "sweater" - }, - "tipo": 2, - "imagen": { - "picto": "sweater" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 971, - "texto": { - "en": "dress", - "es": "vestido" - }, - "tipo": 2, - "imagen": { - "picto": "vestido" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 972, - "texto": { - "en": "bandana", - "es": "vincha" - }, - "tipo": 2, - "imagen": { - "picto": "cinta_de_pelo" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 973, - "texto": { - "en": "shoe", - "es": "zapato" - }, - "tipo": 2, - "imagen": { - "picto": "zapato" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 974, - "texto": { - "en": "snicker", - "es": "zapatilla deportiva" - }, - "tipo": 2, - "imagen": { - "picto": "zapatilla_de_deporte" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 975, - "texto": { - "en": "chess", - "es": "el ajedrez" - }, - "tipo": 2, - "imagen": { - "picto": "ajedrez" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 976, - "texto": { - "en": "kite", - "es": "el barrilete" - }, - "tipo": 2, - "imagen": { - "picto": "cometa" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 977, - "texto": { - "en": "cubes", - "es": "los cubos" - }, - "tipo": 2, - "imagen": { - "picto": "cubos_apilables" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 980, - "texto": { - "en": "truck", - "es": "el camión de juguete" - }, - "tipo": 2, - "imagen": { - "picto": "camion_de_juguete" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 981, - "texto": { - "en": "firetruck", - "es": "el coche de bomberos" - }, - "tipo": 2, - "imagen": { - "picto": "coche_de_bomberos" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 982, - "texto": { - "en": "kitchenet", - "es": "la cocinita" - }, - "tipo": 2, - "imagen": { - "picto": "cocinita" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 986, - "texto": { - "en": "story", - "es": "el cuento" - }, - "tipo": 2, - "imagen": { - "picto": "cuento" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 987, - "texto": { - "en": "ballons", - "es": "los globos" - }, - "tipo": 2, - "imagen": { - "picto": "globos" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 989, - "texto": { - "en": "toys", - "es": "los juguetes" - }, - "tipo": 2, - "imagen": { - "picto": "juguetes" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 996, - "texto": { - "en": "ball", - "es": "la pelota" - }, - "tipo": 2, - "imagen": { - "picto": "pelota" - }, - "relacion": [ - { - "id": 737, - "frec": 2 - }, - { - "id": 736, - "frec": 1 - }, - { - "id": 748, - "frec": 1 - }, - { - "id": 749, - "frec": 1 - }, - { - "id": 746, - "frec": 1 - } - ], - "agenda": 0, - "gps": 0 - }, - { - "id": 1001, - "texto": { - "en": "football", - "es": "la pelota de fútbol" - }, - "tipo": 2, - "imagen": { - "picto": "pelota_de_futbol" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 1005, - "texto": { - "en": "jigsaw", - "es": "el rompecabeza" - }, - "tipo": 2, - "imagen": { - "picto": "rompecabezas" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 1012, - "texto": { - "en": "pillow", - "es": "la almohada" - }, - "tipo": 2, - "imagen": { - "picto": "almohada" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 1013, - "texto": { - "en": "movie theater", - "es": "el cine" - }, - "tipo": 2, - "imagen": { - "picto": "cine" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 1014, - "texto": { - "en": "food", - "es": "comida" - }, - "tipo": 2, - "imagen": { - "picto": "comida" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 1016, - "texto": { - "en": "computer", - "es": "la computadora" - }, - "tipo": 2, - "imagen": { - "picto": "ordenador" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 1017, - "texto": { - "en": "book", - "es": "el libro" - }, - "tipo": 2, - "imagen": { - "picto": "libro" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 1019, - "texto": { - "en": "cd player", - "es": "la radio" - }, - "tipo": 2, - "imagen": { - "picto": "radio_cd" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 1020, - "texto": { - "en": "towel", - "es": "la toalla" - }, - "tipo": 2, - "imagen": { - "picto": "toalla" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 1023, - "texto": { - "en": "kitchen", - "es": "cocina" - }, - "tipo": 2, - "imagen": { - "picto": "cocina" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 1024, - "texto": { - "en": "fridge", - "es": "heladera" - }, - "tipo": 2, - "imagen": { - "picto": "nevera" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 1025, - "texto": { - "en": "oven", - "es": "horno" - }, - "tipo": 2, - "imagen": { - "picto": "horno" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 1026, - "texto": { - "en": "spoon", - "es": "cuchara" - }, - "tipo": 2, - "imagen": { - "picto": "cuchara" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 1027, - "texto": { - "en": "fork", - "es": "tenedor" - }, - "tipo": 2, - "imagen": { - "picto": "tenedor" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 1028, - "texto": { - "en": "knife", - "es": "cuchillo" - }, - "tipo": 2, - "imagen": { - "picto": "cuchillo" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 1029, - "texto": { - "en": "cook", - "es": "cocinar" - }, - "tipo": 1, - "imagen": { - "picto": "cocinar" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 1030, - "texto": { - "en": "sofa", - "es": "sillón" - }, - "tipo": 2, - "imagen": { - "picto": "sofa" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 1032, - "texto": { - "en": "table", - "es": "mesa" - }, - "tipo": 2, - "imagen": { - "picto": "mesa" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": -78935557, - "frec": 0 - }, - { - "id": 205895023, - "frec": 1 + "id": "y_5OURnKxFcv4UiMKntUi", + "value": 1 } ], - "frecuencia": 1 + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fconjunciones.webp?alt=media&token=bd3a504d-d5ca-45cc-a29f-869a6b578174" + }, + "text": "CONJUNCIONES" }, { - "id": 25, - "texto": { - "en": "Health book", - "es": "LIBRO DE LA SALUD" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Flibro_salud.webp?alt=media&token=c7b4bf4a-38b5-4b09-ac7d-30299ef09d86" - }, - "relacion": [ + "freq": 40, + "id": "LWyfHr8Oui5HIShtZ_huo", + "relations": [ { - "id": 377, - "frec": 11 + "id": "RwlZ1jr2Ix3evzrW71lN0", + "value": 0 }, { - "id": 378, - "frec": 3 + "id": "MiOe5_Djf-pE9V9aDZ_1G", + "value": 0 }, { - "id": 379, - "frec": 7 + "id": "XN0nzhQyHVOhuYuNqrp8g", + "value": 0 }, { - "id": 380, - "frec": 1 + "id": "jOALQbfxdXmJVyY6P5gZG", + "value": 0 }, { - "id": 381, - "frec": 1 + "id": "_Lc2-NNL69ZX-aVnUNzgx", + "value": 0 }, { - "id": 382, - "frec": 1 + "id": "kDzHKO8eIwNsyKWDw7M0c", + "value": 0 }, { - "id": 383, - "frec": 1 + "id": "9wE9Py6ztyqDrtaypsltA", + "value": 0 }, { - "id": 384, - "frec": 1 + "id": "nK7DRpxalLBHL9OnRjSim", + "value": 0 }, { - "id": 385, - "frec": 1 + "id": "eKJCZc-kD0-m6cVLorFzO", + "value": 0 }, { - "id": 388, - "frec": 1 + "id": "TIgoS-YONIwzbrImXetaD", + "value": 0 }, { - "id": 389, - "frec": 1 + "id": "fF3ijeQzetfSn6EGcs1yY", + "value": 0 }, { - "id": 213, - "frec": 1 + "id": "D7dt_hFX5DScV_ssm1nKz", + "value": 0 }, { - "id": 234, - "frec": 1 + "id": "5W5_sCAyGTkVzguCEg1d1", + "value": 0 }, { - "id": 205, - "frec": 1 + "id": "hDvpMlPw-chcuxEisBJTl", + "value": 0 }, { - "id": 133, - "frec": 1 + "id": "K382TlNZjdMLLpAhCCXLG", + "value": 0 }, { - "id": 30, - "frec": 1 + "id": "cnyLFMkJu2i3cqOY0e9kl", + "value": 0 }, { - "id": 33, - "frec": 1 + "id": "fk_z_HrvcUh8XIq8D6gQP", + "value": 0 }, { - "id": 113, - "frec": 1 + "id": "C_JKGNCxOI5x_f2C4qAyZ", + "value": 0 + } + ], + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/28339/28339_500.png" + }, + "text": "FRUTAS" + }, + { + "freq": 20, + "id": "PYTnUqCLwAbngR2Ozroc2", + "relations": [ + { + "id": "ecUOs24Pp5ZTRt_ZvED5W", + "value": 1 }, { - "id": 112, - "frec": 1 + "id": "KK_i8H9qTfDVYZkQGwd2v", + "value": 1 }, { - "id": 118, - "frec": 1 + "id": "tWxC4hR6di5zQC-Hujlev", + "value": 1 }, { - "id": 117, - "frec": 1 + "id": "dLHDzm0rfgL-vXTx14HSm", + "value": 1 }, { - "id": 101, - "frec": 1 + "id": "yo00Ci8bSRFYPU6HxGVwX", + "value": 1 }, { - "id": 51, - "frec": 1 + "id": "bVN3R44VuZDw3IdQMolca", + "value": 1 }, { - "id": 13, - "frec": 1 + "id": "cj6OuVw4Nob8jxP-E4rZc", + "value": 1 }, { - "id": 621, - "frec": 1 + "id": "sSTGRl6DpYGZXp8vtTNbm", + "value": 1 }, { - "id": 629, - "frec": 1 + "id": "LiBr37yi-YBgQDx4unjyc", + "value": 1 }, { - "id": 668, - "frec": 1 + "id": "AOp6VGyjYIV0Ym9d0basJ", + "value": 1 }, { - "id": 819, - "frec": 1 + "id": "xiaTdHGInqfm4rD6XzSeZ", + "value": 1 }, { - "id": 820, - "frec": 1 + "id": "u8HfFvMPkogdWk-URj9hv", + "value": 1 }, { - "id": 821, - "frec": 1 + "id": "UssSOEEKutvzB_B4fAQE-", + "value": 1 }, { - "id": 822, - "frec": 1 + "id": "KhyTKtiL4ZT4Z1saU1eJh", + "value": 1 }, { - "id": 823, - "frec": 1 + "id": "WRzleD-mI84LaimFH8h6P", + "value": 1 }, { - "id": 824, - "frec": 1 + "id": "bDnuS19hfd9GhJ-6rjNPD", + "value": 1 }, { - "id": 825, - "frec": 1 + "id": "hmhAUgqvGp7nc1w25sRSx", + "value": 1 }, { - "id": 826, - "frec": 1 + "id": "hXgGhazQ_nA5uqpRD6Qwq", + "value": 1 }, { - "id": 827, - "frec": 1 + "id": "5vxTXbPl4Y0yezGu7p1f6", + "value": 1 }, { - "id": 828, - "frec": 1 + "id": "LrDai7jXlGAdZ3e8ZQezj", + "value": 1 }, { - "id": 829, - "frec": 1 + "id": "m3qTT8tiGZQheKIWREzMT", + "value": 1 }, { - "id": 831, - "frec": 1 + "id": "PBqpK7LL1HQPwowPitrss", + "value": 1 }, { - "id": 878, - "frec": 1 + "id": "curstMeuThu2KUph-8rkB", + "value": 1 }, { - "id": 881, - "frec": 1 + "id": "5kjlzqb9Rf3zzqZROaZ9p", + "value": 1 }, { - "id": 882, - "frec": 1 + "id": "ZR-NXJk3SD351W-95cf_T", + "value": 1 }, { - "id": 884, - "frec": 1 + "id": "O-CLnVuXAUapOn6TbdhKx", + "value": 1 }, { - "id": 885, - "frec": 1 + "id": "CYH_6DL9q1iLLetuWeR9A", + "value": 2 }, { - "id": 886, - "frec": 1 + "id": "3w62N9b7Cvb6JMjB9Wphi", + "value": 1 }, { - "id": 887, - "frec": 1 - } - ] - }, - { - "id": 26, - "texto": { - "en": "Fun book I", - "es": "LIBRO DEL OCIO 1" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Flibro_ocio_1.webp?alt=media&token=50186510-bf0a-4416-85a8-fc1b17ff6fd5" - }, - "relacion": [ + "id": "pliNY9oMQh1iSidkEhhDO", + "value": 1 + }, { - "id": 2, - "frec": 1 + "id": "QVqSPPgA89whFTJ0HTphK", + "value": 1 }, { - "id": 8, - "frec": 1 + "id": "OWLDc7Hn3neBAf_V_N27n", + "value": 1 }, { - "id": 3, - "frec": 1 + "id": "ifd0M0pAlFm7aPt1A0ze_", + "value": 1 }, { - "id": 17, - "frec": 1 + "id": "uMhOF9ZvWnjW-Zrjbjfhs", + "value": 1 }, { - "id": 20, - "frec": 1 + "id": "j5xZZev5nTNa-p088Oqnp", + "value": 1 }, { - "id": 13, - "frec": 1 + "id": "U6PoeH-cMdO3ttnLkN7_3", + "value": 1 }, { - "id": 119, - "frec": 1 + "id": "N7n4zQIkJZOhaYESk2GgH", + "value": 1 }, { - "id": 121, - "frec": 1 + "id": "6rcOXG6yxpzHLzMJ9IayI", + "value": 1 }, { - "id": 124, - "frec": 1 + "id": "XnocVMEeUGCSnlnusP44O", + "value": 1 }, { - "id": 138, - "frec": 1 + "id": "qn-7ERrcZxJTqfW6hwNs8", + "value": 1 }, { - "id": 144, - "frec": 1 + "id": "HMPabuHqgtyiCmTLzg-rM", + "value": 1 }, { - "id": 161, - "frec": 1 + "id": "DAq2J_xXHsSCSNPp9qVsk", + "value": 1 }, { - "id": 164, - "frec": 1 + "id": "1B1WmC-V0PglDeRAeINcT", + "value": 1 }, { - "id": 171, - "frec": 1 + "id": "KWYVDZiERE8jtRsL0faHH", + "value": 1 }, { - "id": 207, - "frec": 1 + "id": "6jLkKc9OL5btNOmjJem6S", + "value": 1 }, { - "id": 544, - "frec": 1 + "id": "JB9SIxWzxWFjrbmMuksrY", + "value": 1 }, { - "id": 552, - "frec": 1 + "id": "ZBIFtTq-BH1jv5jLbzrhj", + "value": 1 }, { - "id": 553, - "frec": 1 + "id": "LU7IoUksATEBhd8PaHS1R", + "value": 1 }, { - "id": 554, - "frec": 1 + "id": "XeVaDdUWSEkhfJvTVvUHR", + "value": 1 }, { - "id": 557, - "frec": 1 + "id": "xPUYlxRxgFVn1FHQFz6Ic", + "value": 1 }, { - "id": 560, - "frec": 1 + "id": "H2zMVtjvqi7aUtCypiVKr", + "value": 1 }, { - "id": 561, - "frec": 1 + "id": "Pw3GgPwp7fpDVC6wJjgPn", + "value": 1 }, { - "id": 563, - "frec": 1 + "id": "kaiWPbXxjHXlqcpBaBp4l", + "value": 1 }, { - "id": 564, - "frec": 1 + "id": "-2UbAou9ydr8XeN-jtIz4", + "value": 1 }, { - "id": 565, - "frec": 1 + "id": "PIPQnVS2UiS7kGbucJP8l", + "value": 1 }, { - "id": 567, - "frec": 1 + "id": "t34TbvjJ3zG2jcgJaCeHa", + "value": 1 }, { - "id": 568, - "frec": 1 + "id": "9GqE148SFZqMIft4evAk2", + "value": 1 }, { - "id": 572, - "frec": 1 + "id": "XuAtFop5_JNSYiZkUBzaU", + "value": 1 }, { - "id": 573, - "frec": 1 + "id": "-2UbAou9ydr8XeN-jtIz4", + "value": 0 }, { - "id": 575, - "frec": 1 + "id": "bVN3R44VuZDw3IdQMolca", + "value": 0 }, { - "id": 580, - "frec": 1 + "id": "K8cMIDL0ubQvWhhDtr65F", + "value": 0 }, { - "id": 583, - "frec": 1 + "id": "WRzleD-mI84LaimFH8h6P", + "value": 0 }, { - "id": 587, - "frec": 1 + "id": "VrC7AnovfA7VzmYESVc8L", + "value": 0 }, { - "id": 615, - "frec": 1 + "id": "yJoivIPHOm1Y1lj-hGN1J", + "value": 0 }, { - "id": 621, - "frec": 1 + "id": "rnjJyPTabH_Xpmy4Z4O3U", + "value": 0 }, { - "id": 635, - "frec": 1 + "id": "Ji5OVFX-uNDewL8eX8Cin", + "value": 0 }, { - "id": 638, - "frec": 1 + "id": "Ust3oadA0PUGViYo28Mf3", + "value": 0 }, { - "id": 639, - "frec": 1 + "id": "zANp2EnhT6n0Jcl1Xra6K", + "value": 0 }, { - "id": 661, - "frec": 1 + "id": "Z8xp3kxXuhMVoNm7ddQSX", + "value": 0 }, { - "id": 1013, - "frec": 1 - } - ] - }, - { - "id": 27, - "texto": { - "en": "Fun book II", - "es": "LIBRO DEL OCIO 2" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Flibro_ocio_2.webp?alt=media&token=fa4aa42c-d12a-4c47-a826-7918e5c23735" - }, - "relacion": [ + "id": "XuAtFop5_JNSYiZkUBzaU", + "value": 0 + }, { - "id": 1, - "frec": 1 + "id": "0Vkmy6BZcJn3pFurEevL9", + "value": 0 }, { - "id": 5, - "frec": 1 + "id": "Pw3GgPwp7fpDVC6wJjgPn", + "value": 0 }, { - "id": 2, - "frec": 1 + "id": "uMhOF9ZvWnjW-Zrjbjfhs", + "value": 0 }, { - "id": 8, - "frec": 1 + "id": "50wJdR0-3YLnv9y_2Gx_e", + "value": 0 }, { - "id": 17, - "frec": 1 + "id": "Ust3oadA0PUGViYo28Mf3", + "value": 0 }, { - "id": 20, - "frec": 1 + "id": "u8HfFvMPkogdWk-URj9hv", + "value": 0 }, { - "id": 28, - "frec": 1 + "id": "SE-71I_ahm3oKROReyJHE", + "value": 0 }, { - "id": 30, - "frec": 1 + "id": "6KicPX6y_u2i6tPBZAtvA", + "value": 0 }, { - "id": 34, - "frec": 1 + "id": "_8RIOebHpkr9nCy0_9qhP", + "value": 0 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fverbos.webp?alt=media&token=f32aaaf1-44aa-49d3-a0ed-981ba01564d5" + }, + "text": "ACCIONES" + }, + { + "freq": 100, + "id": "QQszyYRLL-otCQtRfbLzm", + "relations": [ + { + "id": "et1KiL5-zob_EcGlj7tLN", + "value": 1 }, { - "id": 32, - "frec": 1 + "id": "X0-Tf-KR24qEkpGDzG2Z-", + "value": 1 }, { - "id": 38, - "frec": 1 + "id": "Gj7THa6XFHDfYL5H19lwj", + "value": 1 }, { - "id": 70, - "frec": 1 + "id": "UQ-5wOfR0tDzljoDjj2xU", + "value": 1 }, { - "id": 82, - "frec": 1 + "id": "fNAlqbgrpirQZO_LhrkXY", + "value": 1 }, { - "id": 119, - "frec": 1 + "id": "JziaulL-lrAPGNVvwBPK9", + "value": 1 }, { - "id": 124, - "frec": 1 + "id": "0pFtmDZdlnLrUkT_XZDXQ", + "value": 1 }, { - "id": 137, - "frec": 1 + "id": "rU9cpWF0I4wnJjzTXpGtO", + "value": 0 }, { - "id": 161, - "frec": 1 + "id": "bpSuQQRlIcSse40OAxNSG", + "value": 0 }, { - "id": 171, - "frec": 1 + "id": "2y9pxVOBQ2tMdPHcsqQb8", + "value": 0 }, { - "id": 615, - "frec": 1 + "id": "sjGytpiPjwqJfPaRUJ-Iw", + "value": 0 }, { - "id": 623, - "frec": 1 + "id": "0gAyTD6sImo0jpD_bYGVv", + "value": 0 }, { - "id": 624, - "frec": 1 + "id": "Tpj-Fs8LQ566TM0bYlZ6H", + "value": 0 }, { - "id": 672, - "frec": 1 + "id": "dn41o5K_1fo-qHO-YLoQn", + "value": 0 }, { - "id": 678, - "frec": 1 + "id": "bFodvUraUhJeq4waMdlxv", + "value": 0 }, { - "id": 975, - "frec": 1 + "id": "4bHGIoQmDN8LptpdNN4v6", + "value": 0 }, { - "id": 976, - "frec": 1 + "id": "sFNUgvnglgrm6cbYiM0di", + "value": 0 }, { - "id": 977, - "frec": 1 + "id": "gYrIz3R13-BC_pYcvQ9BL", + "value": 0 }, { - "id": 980, - "frec": 1 + "id": "rU9cpWF0I4wnJjzTXpGtO", + "value": 0 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ftiempos.webp?alt=media&token=a9cba0e5-1635-4d9c-8f1b-9db6243f7e5f" + }, + "text": "TIEMPO" + }, + { + "freq": 400, + "id": "V6K3TniptOApMMGa8TspR", + "relations": [ + { + "id": "_WIT6qs1kaiJqB1Ild5Xs", + "value": 0 }, { - "id": 981, - "frec": 1 + "id": "tWxC4hR6di5zQC-Hujlev", + "value": 0 }, { - "id": 982, - "frec": 1 + "id": "FkC5DtSV81OvFMU99qZGg", + "value": 0 }, { - "id": 986, - "frec": 1 + "id": "dHM0qnbmtJAkZY0WBsqaY", + "value": 0 }, { - "id": 987, - "frec": 1 + "id": "-aePI8WknXpxEpz19Lu48", + "value": 0 }, { - "id": 989, - "frec": 1 + "id": "JBU2hMw9gbIy9-wGF4mjD", + "value": 0 }, { - "id": 996, - "frec": 1 + "id": "C12mJ1W11fODI3pv1QOnx", + "value": 0 }, { - "id": 1005, - "frec": 1 - } - ] - }, - { - "id": 28, - "texto": { - "en": "Restaurant Book", - "es": "LIBRO DEL RESTAURANTE" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Frestaurante.webp?alt=media&token=57ed6d5c-fa5f-41c1-b779-28294311e772" - }, - "relacion": [ + "id": "LNBTW0qQtHYQEHatkWGtc", + "value": 0 + }, { - "id": 377, - "frec": 11 + "id": "9ZnzbKMDwGEwC3hXOhXFe", + "value": 0 }, { - "id": 378, - "frec": 3 + "id": "N_893wsadpGg3Ip5sEThe", + "value": 0 }, { - "id": 379, - "frec": 7 + "id": "9GqE148SFZqMIft4evAk2", + "value": 0 }, { - "id": 380, - "frec": 1 + "id": "xT4BPNmF-5WAQLfs3cUpS", + "value": 0 }, { - "id": 381, - "frec": 1 + "id": "d_I8jNfbkQD0CHgZn7hyB", + "value": 0 }, { - "id": 382, - "frec": 1 + "id": "ifd0M0pAlFm7aPt1A0ze_", + "value": 0 }, { - "id": 383, - "frec": 1 + "id": "cS3g4KXf39akVFHCG5AwL", + "value": 0 }, { - "id": 384, - "frec": 1 + "id": "viAHJeLRr_6j9dEi5klj_", + "value": 0 }, { - "id": 388, - "frec": 1 + "id": "RkpoG4KB8m_TJFJf2v3EG", + "value": 0 }, { - "id": 389, - "frec": 1 + "id": "QvaMxPy-3iixHAJFyIrN-", + "value": 0 }, { - "id": 495, - "frec": 1 + "id": "MYqfOzKx2qMHop8GaHs0I", + "value": 0 }, { - "id": 497, - "frec": 1 + "id": "yo00Ci8bSRFYPU6HxGVwX", + "value": 0 }, { - "id": 501, - "frec": 1 + "id": "NuhUikdCxP0NgsbO0wvAU", + "value": 0 }, { - "id": 500, - "frec": 1 + "id": "2KO0BFtB4B6fu1feuAZLt", + "value": 0 }, { - "id": 503, - "frec": 1 + "id": "IsWUeiPnDEnzxePKclBNp", + "value": 0 }, { - "id": 502, - "frec": 1 + "id": "ZRYQmYRGKzheBqk11eGRZ", + "value": 0 }, { - "id": 587, - "frec": 1 + "id": "PBqpK7LL1HQPwowPitrss", + "value": 0 }, { - "id": 588, - "frec": 1 + "id": "g1TLUpuQX2Zs1ob9gqYui", + "value": 0 }, { - "id": 594, - "frec": 1 + "id": "xiaTdHGInqfm4rD6XzSeZ", + "value": 0 }, { - "id": 590, - "frec": 1 + "id": "YbrNtdUmyMNdAF5CfvY1A", + "value": 0 }, { - "id": 589, - "frec": 1 + "id": "MNCcHiImRS8tmvhBhzCKj", + "value": 0 }, { - "id": 599, - "frec": 1 + "id": "71l2at-8480bvijxn3uBl", + "value": 0 }, { - "id": 598, - "frec": 1 + "id": "1YOlJCovdcnnqVihqHVmq", + "value": 0 }, { - "id": 597, - "frec": 1 + "id": "rBwDn3PcJGqytqnOZTJMV", + "value": 0 }, { - "id": 600, - "frec": 1 + "id": "g2sQSxCcoZuKJ3TabK6oT", + "value": 0 }, { - "id": 602, - "frec": 1 + "id": "3932Zm0xgk1hKB2hhBAUa", + "value": 0 }, { - "id": 595, - "frec": 1 + "id": "eWSI1NInbQowtO99phhGA", + "value": 0 }, { - "id": 605, - "frec": 1 + "id": "qn-7ERrcZxJTqfW6hwNs8", + "value": 0 }, { - "id": 604, - "frec": 1 + "id": "_tDZtalMxKSNpWydJ1aeW", + "value": 0 }, { - "id": 400, - "frec": 1 + "id": "eji-M2j5eHkG71DCksleY", + "value": 0 }, { - "id": 401, - "frec": 1 + "id": "Sp2Ias_Y1HplkHWjIb7Mp", + "value": 0 }, { - "id": 403, - "frec": 1 + "id": "3-ueUrnwmIIj0BMP8_Ntb", + "value": 0 }, { - "id": 399, - "frec": 1 + "id": "E-vUPARie8MmfgZwv3Omr", + "value": 0 }, { - "id": 412, - "frec": 1 + "id": "sAsTkky29uEVC9vo3Ofbo", + "value": 0 }, { - "id": 417, - "frec": 1 + "id": "MqQgYn5B0uV-DMORCBOmV", + "value": 0 }, { - "id": 421, - "frec": 1 + "id": "KXHW4m6vXxQU-AEOR4pZ4", + "value": 0 }, { - "id": 424, - "frec": 1 + "id": "alsoa_V3wz3vPpG1TKRZc", + "value": 0 }, { - "id": 458, - "frec": 1 + "id": "3arbCGI6fMOWALLanZcg3", + "value": 0 }, { - "id": 462, - "frec": 1 + "id": "XN0nzhQyHVOhuYuNqrp8g", + "value": 0 }, { - "id": 463, - "frec": 1 + "id": "YIP0Xc4aJsfv0s8BpiQnn", + "value": 0 }, { - "id": 472, - "frec": 1 + "id": "OKXIGnLh-i1ydTNj450Q8", + "value": 0 }, { - "id": 476, - "frec": 1 + "id": "UnQJwWfWCe40DJYR1Er0o", + "value": 0 }, { - "id": 477, - "frec": 1 + "id": "VKrLGgYjc-nLPGsyESDgb", + "value": 0 }, { - "id": 478, - "frec": 1 + "id": "4f1vqDoAvUu2XYk_JlQdC", + "value": 0 }, { - "id": 480, - "frec": 1 + "id": "rlGO5jGKPL1vW-VF4nRqZ", + "value": 0 }, { - "id": 481, - "frec": 1 + "id": "xXtjQktuAq1bmxTc0HSQT", + "value": 0 }, { - "id": 482, - "frec": 1 + "id": "mWXxPPvhSHf9hyb-VyuZH", + "value": 0 }, { - "id": 483, - "frec": 1 + "id": "_3ihCSMQCokXNo8pXii-h", + "value": 0 }, { - "id": 484, - "frec": 1 + "id": "iiA1u1JKRmhe2jWVE_W79", + "value": 0 }, { - "id": 486, - "frec": 1 + "id": "C29KJ8BTFavhj_R9UfnSv", + "value": 0 }, { - "id": 487, - "frec": 1 + "id": "WRzleD-mI84LaimFH8h6P", + "value": 0 }, { - "id": 489, - "frec": 1 + "id": "m0Fkio76HZHS2HguPOTn5", + "value": 0 }, { - "id": 490, - "frec": 1 + "id": "p1qK47wwLwF8S0Fy8-2Mt", + "value": 0 }, { - "id": 492, - "frec": 1 + "id": "97nIv-aoc51T8kKTZV5cM", + "value": 0 }, { - "id": 497, - "frec": 1 + "id": "y_5OURnKxFcv4UiMKntUi", + "value": 0 }, { - "id": 505, - "frec": 1 + "id": "BNjZz9MGLJEKZ4CZoTs2M", + "value": 0 }, { - "id": 512, - "frec": 1 + "id": "dR72liRxC3qmoSa6Dz2a2", + "value": 0 }, { - "id": 515, - "frec": 1 + "id": "ETZNYbrG5wveDl6c9k2_k", + "value": 0 }, { - "id": 619, - "frec": 1 + "id": "vZ9JaTnoj8C0ILYxMNB73", + "value": 0 }, { - "id": 679, - "frec": 1 + "id": "Y5HQq_4crSF2lpwH-KUrt", + "value": 0 }, { - "id": 657, - "frec": 1 + "id": "bNJfccUvG2DQfR1iZP3eR", + "value": 0 }, { - "id": 660, - "frec": 1 + "id": "T_Q5c4XAfkhkclmnCGHo5", + "value": 0 }, { - "id": 649, - "frec": 1 + "id": "yNag8CK0wV_iRMnFznsXk", + "value": 0 }, { - "id": 666, - "frec": 1 + "id": "32PnZjlnQbTJo4nL9YJYe", + "value": 0 }, { - "id": 672, - "frec": 1 + "id": "jOALQbfxdXmJVyY6P5gZG", + "value": 0 }, { - "id": 685, - "frec": 1 - } - ] - }, - { - "id": 29, - "texto": { - "en": "Travel book", - "es": "LIBRO DE VIAJE" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Flibro_viaje.webp?alt=media&token=1f869b28-34f4-4d1d-8dc7-2edcb5276f16" - }, - "relacion": [ + "id": "m3qTT8tiGZQheKIWREzMT", + "value": 0 + }, { - "id": 377, - "frec": 11 + "id": "UXJDiwb3j_zyfGa26ByJL", + "value": 0 }, { - "id": 378, - "frec": 3 + "id": "BjqWZnzLlxdOo4KEzZ46j", + "value": 0 }, { - "id": 379, - "frec": 7 + "id": "wcpXeLMBRusfqfrz9s4mF", + "value": 0 }, { - "id": 380, - "frec": 1 + "id": "9UwpyOnOBoqr4mX3Juqm2", + "value": 0 }, { - "id": 381, - "frec": 1 + "id": "ujyHgmlPIs7UdtndbYd8S", + "value": 0 }, { - "id": 382, - "frec": 1 + "id": "w4cVxbBDZjeNyHwpBARHQ", + "value": 0 }, { - "id": 383, - "frec": 1 + "id": "JEDIYq1BDA23ac9TNhON-", + "value": 0 }, { - "id": 384, - "frec": 1 + "id": "LksmOMPPOMArbrFsscqOW", + "value": 0 }, { - "id": 385, - "frec": 1 + "id": "u8HfFvMPkogdWk-URj9hv", + "value": 0 }, { - "id": 388, - "frec": 1 + "id": "eZEqRZjRK8JJMsfHo4Y7w", + "value": 0 }, { - "id": 389, - "frec": 1 + "id": "LaKT8VTw0_6rvordp5-R8", + "value": 0 }, { - "id": 5, - "frec": 1 + "id": "Erg6LuA8IOQ5V8RTP3pPi", + "value": 0 }, { - "id": 7, - "frec": 1 + "id": "75gujwNXJdAiNmK6Ffhia", + "value": 0 }, { - "id": 8, - "frec": 1 + "id": "bw3rqHXD1TJ53xbNggEqH", + "value": 0 }, { - "id": 1, - "frec": 1 + "id": "8vR0HYniXtrrQqqSIN_JQ", + "value": 0 }, { - "id": 30, - "frec": 1 + "id": "aSzpwNza22HZp46Sh6wfx", + "value": 0 }, { - "id": 33, - "frec": 1 + "id": "QUTQLuD2Gv7fHh0V_O5tg", + "value": 0 }, { - "id": 38, - "frec": 1 + "id": "uZRwbLa1lEG7ol0UJKRBj", + "value": 0 }, { - "id": 101, - "frec": 1 + "id": "cxMNBGV3LytDXgwDMCiga", + "value": 0 }, { - "id": 107, - "frec": 1 + "id": "xQblStUfyBGO27j15Sda3", + "value": 0 }, { - "id": 108, - "frec": 1 + "id": "nQdbkRVcwpQB_hFNPbe6M", + "value": 0 }, { - "id": 112, - "frec": 1 + "id": "uMhOF9ZvWnjW-Zrjbjfhs", + "value": 0 }, { - "id": 140, - "frec": 1 + "id": "KWYVDZiERE8jtRsL0faHH", + "value": 0 }, { - "id": 133, - "frec": 1 + "id": "LiBr37yi-YBgQDx4unjyc", + "value": 0 }, { - "id": 177, - "frec": 1 + "id": "PbtM3htZocZb8YifuPoY5", + "value": 0 }, { - "id": 205, - "frec": 1 + "id": "atWxG3KTHB5moW1dylLJc", + "value": 0 }, { - "id": 499, - "frec": 1 + "id": "OdCdTUAlbN6kvsPjby_Bi", + "value": 0 }, { - "id": 500, - "frec": 1 + "id": "TIsM6aTTZ9W8j6UhW9Qqj", + "value": 0 }, { - "id": 501, - "frec": 1 + "id": "Khdk8mWpyxgLqfC-6lyT9", + "value": 0 }, { - "id": 568, - "frec": 1 + "id": "1DjW-XvWN7iOqoJPRSWwY", + "value": 0 }, { - "id": 587, - "frec": 1 + "id": "CZrETqLgQlvDkLHvw1t_w", + "value": 0 }, { - "id": 588, - "frec": 1 + "id": "F90bXbc0tz9nuzTT7SgqV", + "value": 0 }, { - "id": 589, - "frec": 1 + "id": "Ubaq6h7wasdP_YRombm2c", + "value": 0 }, { - "id": 590, - "frec": 1 + "id": "iimGxVoFWlq_THThR3vmF", + "value": 0 }, { - "id": 594, - "frec": 1 + "id": "tYwEpd2EOtH8wEUr-jwHk", + "value": 0 }, { - "id": 595, - "frec": 1 + "id": "Om1Bvqu8nmGuNGwV8hndM", + "value": 0 }, { - "id": 602, - "frec": 1 + "id": "aP9QisUdxhgOKIQ2kHNb3", + "value": 0 }, { - "id": 606, - "frec": 1 + "id": "NVe4u7BTAVfLk3xkDqLnZ", + "value": 0 }, { - "id": 607, - "frec": 1 + "id": "PIBHv5VueBi-sf5qFCN_Y", + "value": 0 }, { - "id": 608, - "frec": 1 + "id": "Dm3yiKSB134LrjtW_KrO7", + "value": 0 }, { - "id": 609, - "frec": 1 + "id": "IEeIvawUD2GIAr1Wypr9i", + "value": 0 }, { - "id": 610, - "frec": 1 + "id": "cJw2i319mzBUpEfBRDxc9", + "value": 0 }, { - "id": 611, - "frec": 1 + "id": "vmb_RMIB20QND6VcS0deY", + "value": 0 }, { - "id": 646, - "frec": 1 + "id": "eduqLSyC3m4uB1Oee6dt6", + "value": 0 }, { - "id": 656, - "frec": 1 + "id": "17AkRFlfC_koV-lywmDE8", + "value": 0 }, { - "id": 657, - "frec": 1 + "id": "H2zMVtjvqi7aUtCypiVKr", + "value": 0 }, { - "id": 679, - "frec": 1 + "id": "CYH_6DL9q1iLLetuWeR9A", + "value": 0 }, { - "id": 685, - "frec": 1 + "id": "JDbBWMB5No0pK6HvntLt4", + "value": 0 }, { - "id": 666, - "frec": 1 + "id": "MEqo2TROHyroK318sm84f", + "value": 0 }, { - "id": 649, - "frec": 1 + "id": "jprAsdXWGQKPlUWwgBBot", + "value": 0 }, { - "id": 773, - "frec": 1 + "id": "atVEXuftxSiDDj8rzUlFg", + "value": 0 }, { - "id": 1020, - "frec": 1 + "id": "cI0JxwhkWU-YA7E7rmJtp", + "value": 0 }, { - "id": 1019, - "frec": 1 - } - ] - }, - { - "id": 30, - "texto": { - "en": "Hygiene book", - "es": "LIBRO DE HIGIENE" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fhigiene_personal.webp?alt=media&token=d822b484-feb9-4a37-a9f0-ed53e9b3584f" - }, - "relacion": [ + "id": "81UJI7xOa5l9mVceqkIP5", + "value": 0 + }, { - "id": 9, - "frec": 1 + "id": "F8roVYxKZi88UUGfOvTwl", + "value": 0 }, { - "id": 10, - "frec": 1 + "id": "WasZ5bKZZy5Jt4Y-JipxS", + "value": 0 }, { - "id": 11, - "frec": 1 + "id": "54taab8z9ziXt0IqXHkV9", + "value": 0 }, { - "id": 23, - "frec": 1 + "id": "CyKtU9yC0Jy7Ypb4WFp6w", + "value": 0 }, { - "id": 29, - "frec": 1 + "id": "JBKQaBezKuSDaMsnbJMTB", + "value": 0 }, { - "id": 31, - "frec": 1 + "id": "kaiWPbXxjHXlqcpBaBp4l", + "value": 0 }, { - "id": 35, - "frec": 1 + "id": "d4zNoj2BAFG9B7J3KAlLE", + "value": 0 }, { - "id": 39, - "frec": 1 + "id": "PAlC0XSZNru3-LXtfvGjo", + "value": 0 }, { - "id": 54, - "frec": 1 + "id": "Zm4OIanIKTigDGIsInO7o", + "value": 0 }, { - "id": 100, - "frec": 1 + "id": "5VBtwEswIjrv1zbXP-oFn", + "value": 0 }, { - "id": 133, - "frec": 1 + "id": "OWLDc7Hn3neBAf_V_N27n", + "value": 0 }, { - "id": 158, - "frec": 1 + "id": "ptQZXjMQyXWycUD1kAkQo", + "value": 0 }, { - "id": 159, - "frec": 1 + "id": "jfly9fZ3x1da4SGCCNcV2", + "value": 0 }, { - "id": 200, - "frec": 1 + "id": "5LYjhk-N87Ov9NrQcGbLQ", + "value": 0 }, { - "id": 205, - "frec": 1 + "id": "qy3c7gvRU7shWuJYr1kBk", + "value": 0 }, { - "id": 204, - "frec": 1 + "id": "0IrLGI8Ebm8rcS3ymUXqS", + "value": 0 }, { - "id": 263, - "frec": 1 + "id": "ccGASDOGtty6GfQMEEBEU", + "value": 0 }, { - "id": 199, - "frec": 1 - } - ] - }, - { - "id": 31, - "texto": { - "en": "Butcher book", - "es": "LIBRO DE LA CARNICERíA" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Flibro_carnicero.webp?alt=media&token=b3a49a1a-5b29-40a2-a456-6117822efb08" - }, - "relacion": [ + "id": "LRIKzfm9ZsdNe1u7CUuW_", + "value": 0 + }, { - "id": 5, - "frec": 1 + "id": "Vioyf8EXJfY5t34NnN0WO", + "value": 0 }, { - "id": 7, - "frec": 1 + "id": "n5bZClAB6jXAZnwxIwH-1", + "value": 0 }, { - "id": 13, - "frec": 1 + "id": "0cdYDZ5HPaTmqTTN0_Ee8", + "value": 0 }, { - "id": 377, - "frec": 11 + "id": "5L5UzBHOzuHRoO-jyPuEx", + "value": 0 }, { - "id": 378, - "frec": 3 + "id": "LDoi3cxodn_AVKSG-Bf_1", + "value": 0 }, { - "id": 379, - "frec": 7 + "id": "_hqTU9A7I3RFDVrcIEK-L", + "value": 0 }, { - "id": 380, - "frec": 1 + "id": "SXz8iA1Qn_BlgLTAG6Epl", + "value": 0 }, { - "id": 381, - "frec": 1 + "id": "8fGingRAd8idw4qcxyZ-Q", + "value": 0 }, { - "id": 382, - "frec": 1 + "id": "54BVjn2seJWdBNGI20-yJ", + "value": 0 }, { - "id": 383, - "frec": 1 + "id": "CbO32RkDdf9aCucv6BnGS", + "value": 0 }, { - "id": 384, - "frec": 1 + "id": "sPtazVgymXESdS-BcHqU_", + "value": 0 }, { - "id": 388, - "frec": 1 + "id": "b1XpSC0ndnm0ZewNXC3pp", + "value": 0 }, { - "id": 389, - "frec": 1 + "id": "NLi5ODIzyMAwr2HpDXACp", + "value": 0 }, { - "id": 482, - "frec": 1 + "id": "p_XyUXRmeUk_bdjRTMtkz", + "value": 0 }, { - "id": 505, - "frec": 1 + "id": "U6PoeH-cMdO3ttnLkN7_3", + "value": 0 }, { - "id": 512, - "frec": 1 + "id": "X3u4pXTWKcGc43lOkgSBt", + "value": 0 }, { - "id": 515, - "frec": 1 + "id": "L19r487_d3RqWXiNuh3gE", + "value": 0 }, { - "id": 516, - "frec": 1 + "id": "0qoQs8WyLVONnu3_eBGfD", + "value": 0 }, { - "id": 517, - "frec": 1 + "id": "UQ-5wOfR0tDzljoDjj2xU", + "value": 0 }, { - "id": 524, - "frec": 1 + "id": "5gPT9lrNgpRkF07lP6zOq", + "value": 0 }, { - "id": 587, - "frec": 1 + "id": "o0oxaoUFpOLiGsoQBlalI", + "value": 0 }, { - "id": 617, - "frec": 1 - } - ] - }, - { - "id": 32, - "texto": { - "en": "Grocery book", - "es": "LIBRO DEL ALMACéN" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Flibro_almacen.webp?alt=media&token=9f5be80c-f5fc-48dd-be44-ba6ea61a8efc" - }, - "relacion": [ + "id": "yihsjW9ON0Fr9Yy4ZlP9c", + "value": 0 + }, { - "id": 5, - "frec": 1 + "id": "5kjlzqb9Rf3zzqZROaZ9p", + "value": 0 }, { - "id": 13, - "frec": 1 + "id": "FTngK946O8S8bYc0g7vM2", + "value": 0 }, { - "id": 23, - "frec": 1 + "id": "k-iDOTk5uO7ZK5OB3v8It", + "value": 0 }, { - "id": 30, - "frec": 1 + "id": "bVN3R44VuZDw3IdQMolca", + "value": 0 }, { - "id": 138, - "frec": 1 + "id": "_1lOt0C0MQhvU8QWC6_oZ", + "value": 0 }, { - "id": 136, - "frec": 1 + "id": "DXpjgLKTdx9eLLohVdmWM", + "value": 0 }, { - "id": 131, - "frec": 1 + "id": "lKMW_xTZzCrCHRcGp-Z-n", + "value": 0 }, { - "id": 213, - "frec": 1 + "id": "MKR-ukiUlJy4uuqO30UU6", + "value": 0 }, { - "id": 208, - "frec": 1 + "id": "XY6ZCNzeJIEzLtWJcufJm", + "value": 0 }, { - "id": 233, - "frec": 1 + "id": "XuAtFop5_JNSYiZkUBzaU", + "value": 0 }, { - "id": 234, - "frec": 1 + "id": "G_CRpzxWO5XdEMh01O1eJ", + "value": 0 }, { - "id": 267, - "frec": 1 + "id": "M5q2CXmK0_WVaVUB_HJB3", + "value": 0 }, { - "id": 165, - "frec": 1 + "id": "R06chAQYswLtQK46OInW7", + "value": 0 }, { - "id": 153, - "frec": 1 + "id": "IAdQsjTsbBUAMjlwW34cw", + "value": 0 }, { - "id": 394, - "frec": 1 + "id": "L6YLAEsbYcTq-ycQJTvt4", + "value": 0 }, { - "id": 396, - "frec": 1 + "id": "sbv5HLPUR6gHo-EJR2S7S", + "value": 0 }, { - "id": 400, - "frec": 1 + "id": "7iAXKVm22uMgr6aqZ1rr7", + "value": 0 }, { - "id": 401, - "frec": 1 + "id": "emm_RirDsO30Enax5Q4gd", + "value": 0 }, { - "id": 398, - "frec": 1 + "id": "5vxTXbPl4Y0yezGu7p1f6", + "value": 0 }, { - "id": 406, - "frec": 1 + "id": "0Z7uFXpp-XRXmqM8ILhIC", + "value": 0 }, { - "id": 415, - "frec": 1 + "id": "9wE9Py6ztyqDrtaypsltA", + "value": 0 }, { - "id": 425, - "frec": 1 + "id": "93hsW10TmX3Vcq_4IvcZ0", + "value": 0 }, { - "id": 426, - "frec": 1 + "id": "gaem1LHTtfQdnnqYi-sOm", + "value": 0 }, { - "id": 427, - "frec": 1 + "id": "pvXSy-5M4i8kysUppvdME", + "value": 0 }, { - "id": 431, - "frec": 1 + "id": "X0-Tf-KR24qEkpGDzG2Z-", + "value": 0 }, { - "id": 439, - "frec": 1 + "id": "1B1WmC-V0PglDeRAeINcT", + "value": 0 }, { - "id": 484, - "frec": 1 + "id": "jfvreGZv-e8rD4-01wZ5H", + "value": 0 }, { - "id": 483, - "frec": 1 + "id": "Gvmy--9DiUn_tkQYWeWhA", + "value": 0 }, { - "id": 487, - "frec": 1 + "id": "JQOpcZSCPGMOWZsN8w_yb", + "value": 0 }, { - "id": 489, - "frec": 1 + "id": "82LicIQc3K2xCTEt-iMpu", + "value": 0 }, { - "id": 490, - "frec": 1 + "id": "QVqSPPgA89whFTJ0HTphK", + "value": 0 }, { - "id": 492, - "frec": 1 + "id": "LmGq1AZs2a0x26r7E9GUj", + "value": 0 }, { - "id": 495, - "frec": 1 + "id": "9EqfwMNtATh1fwMhyn_B1", + "value": 0 }, { - "id": 496, - "frec": 1 + "id": "gvPwrzDSSEPwcxY878T_c", + "value": 0 }, { - "id": 500, - "frec": 1 + "id": "2CgcUkvJUskv982FvG54A", + "value": 0 }, { - "id": 494, - "frec": 1 + "id": "79xBF6cKgKeD4GeBPe_Ds", + "value": 0 }, { - "id": 588, - "frec": 1 + "id": "hKJhXxultsxm0TJl1P8-L", + "value": 0 }, { - "id": 587, - "frec": 1 + "id": "Z5-sBklfLIWE00CJ_T_ZK", + "value": 0 + }, + { + "id": "ChBc7LjL8dgzZ6LUCAHGh", + "value": 0 + }, + { + "id": "zw-o9pDectP5bxFnUjrJO", + "value": 0 + }, + { + "id": "O-CLnVuXAUapOn6TbdhKx", + "value": 0 + }, + { + "id": "amk4WRd1sNEIp24pnFw8j", + "value": 0 + }, + { + "id": "hAZhogJSH3bL1iL237N8J", + "value": 0 + }, + { + "id": "yqlmoVGItXqaeazw3M3eg", + "value": 0 + }, + { + "id": "t34TbvjJ3zG2jcgJaCeHa", + "value": 0 + }, + { + "id": "8cOIYr-hcK54qWpuT-41e", + "value": 0 + }, + { + "id": "IXRWmFmtqfnHQRcBf1Idl", + "value": 0 + }, + { + "id": "kN85Lb_C4dLnww7sz1afK", + "value": 0 + }, + { + "id": "KhyTKtiL4ZT4Z1saU1eJh", + "value": 0 + }, + { + "id": "OhrHu-xLo8hcn5plWfoX4", + "value": 0 + }, + { + "id": "RBCjBvNXQSZOOpg-5lBlK", + "value": 0 + }, + { + "id": "QnlQ1HOEB9yNjuW3Dd6fc", + "value": 0 + }, + { + "id": "H9SWPnWbR8qcZA-iu5Mz0", + "value": 0 + }, + { + "id": "6jLkKc9OL5btNOmjJem6S", + "value": 0 + }, + { + "id": "D2tSkngqbQmdKLNhn9xWV", + "value": 0 + }, + { + "id": "8-4M30dTtmuUJus9MtGqV", + "value": 0 + }, + { + "id": "MWIzTM6zhTWL1V-brLtBx", + "value": 0 + }, + { + "id": "Pl-M4bc6k2rdhu6FHEbkA", + "value": 0 + }, + { + "id": "nK7DRpxalLBHL9OnRjSim", + "value": 0 + }, + { + "id": "jhJ2TOfdaRAcVeHGOjwua", + "value": 0 + }, + { + "id": "VL4pd0vnJ-CNfMg9bCNed", + "value": 0 + }, + { + "id": "93YmZA7VfAT7TTNTsDE1W", + "value": 0 + }, + { + "id": "GY_flM-6uR6X3L4AwsiwU", + "value": 0 + }, + { + "id": "oSBFO8Ka0PN4bgX0QuWxL", + "value": 0 + }, + { + "id": "QGf1Tb1roL7HAXUSrRqRJ", + "value": 0 + }, + { + "id": "KpLFOrpuhFKaIbBbFwVVu", + "value": 0 + }, + { + "id": "QeqA20MCXB-zNfuKIssMY", + "value": 0 + }, + { + "id": "paPpjw1XVC9-6xcueJsrY", + "value": 0 + }, + { + "id": "iowxE4MxcV6PR2Uhtvxqs", + "value": 0 + }, + { + "id": "sFNUgvnglgrm6cbYiM0di", + "value": 0 + }, + { + "id": "8KlFB3an1mzdQd6-LGCCE", + "value": 0 + }, + { + "id": "WWK2v56LM-zWqujabk9bM", + "value": 0 + }, + { + "id": "4rctwNiN4UaU9lqU48MHG", + "value": 0 + }, + { + "id": "JziaulL-lrAPGNVvwBPK9", + "value": 0 + }, + { + "id": "ebo03xnkyiHD2pKUKULmr", + "value": 0 + }, + { + "id": "AOp6VGyjYIV0Ym9d0basJ", + "value": 0 + }, + { + "id": "hmhAUgqvGp7nc1w25sRSx", + "value": 0 + }, + { + "id": "0jpMJu8isUmOZKxhZ_yaj", + "value": 0 + }, + { + "id": "cj6OuVw4Nob8jxP-E4rZc", + "value": 0 + }, + { + "id": "MMzjhHID8HMqyPjii5o-h", + "value": 0 + }, + { + "id": "uOA82KFAVtjoYRTuYFgpr", + "value": 0 + }, + { + "id": "eKJCZc-kD0-m6cVLorFzO", + "value": 0 + }, + { + "id": "jmzg4EiC7JEHwe9gNP3C3", + "value": 0 + }, + { + "id": "yxa6QVSrmWUKH2PZHKaVl", + "value": 0 + }, + { + "id": "RbZetbSC5064rZccOFD1D", + "value": 0 + }, + { + "id": "_S9Eck14cdOTr0QH4i7sQ", + "value": 0 + }, + { + "id": "Jjq8CM8JrYHIMziuQy-WN", + "value": 0 + }, + { + "id": "qU5IvFLD8d16iIHSs_9TM", + "value": 0 + }, + { + "id": "WjXQhSFPpz42ZUyHvurYG", + "value": 0 + }, + { + "id": "I5AJgba5GTdEjdpFB-LBf", + "value": 0 + }, + { + "id": "F7kJ8VM31BWB4K4T4USzs", + "value": 0 + }, + { + "id": "KK_i8H9qTfDVYZkQGwd2v", + "value": 0 + }, + { + "id": "Dv9MSCRYbR4Q3K114wXki", + "value": 0 + }, + { + "id": "irbOv2dHA7G969dnJMfJn", + "value": 0 + }, + { + "id": "bDnuS19hfd9GhJ-6rjNPD", + "value": 0 + }, + { + "id": "mJqzbxYeIDQciPkeHA1Ao", + "value": 0 + }, + { + "id": "ZR-NXJk3SD351W-95cf_T", + "value": 0 + }, + { + "id": "gff2FqDlgXknRld7YMLWl", + "value": 0 + }, + { + "id": "Qo3Qn_nMe3E6EqNw0UdNZ", + "value": 0 + }, + { + "id": "MQHnvvU48NnEptP8a9w8C", + "value": 0 + }, + { + "id": "27GbVOZ-szdnzsy92oY-X", + "value": 0 + }, + { + "id": "i2mlV3zGS6nrH2l6N2BlZ", + "value": 0 + }, + { + "id": "yvtvSsBLhabkcpeYGbxQr", + "value": 0 + }, + { + "id": "1Ph13Z_Ya6p-q0WA7pSl3", + "value": 0 + }, + { + "id": "vKGLQIas9RdBnPGsaYtr2", + "value": 0 + }, + { + "id": "R9ECa_HQRtpFrb59ebMTQ", + "value": 0 + }, + { + "id": "pliNY9oMQh1iSidkEhhDO", + "value": 0 + }, + { + "id": "Vjlet5P7XuqTrc22nt_Zz", + "value": 0 + }, + { + "id": "OeA63q6LpqGvXW-cJXEym", + "value": 0 + }, + { + "id": "8iFdjRTQU7ONGnigRTlm8", + "value": 0 + }, + { + "id": "2Vc2H462cutVtUC-5omJk", + "value": 0 + }, + { + "id": "UvRS0KmtZn3dq7e8L5RcE", + "value": 0 + }, + { + "id": "dgm3NCKuz7L39PX8LYxj7", + "value": 0 + }, + { + "id": "jBqD3qhhcrioLlCU-xq5b", + "value": 0 + }, + { + "id": "txj22hip0CE9qp_z-daIK", + "value": 0 + }, + { + "id": "TIgoS-YONIwzbrImXetaD", + "value": 0 + }, + { + "id": "0_SK41wNOk6mw2qX_eHXM", + "value": 0 + }, + { + "id": "Wgh5iCzUmx4Je-B85-pra", + "value": 0 + }, + { + "id": "SiOmZdwX8Hf2nE2v6HfCp", + "value": 0 + }, + { + "id": "fF3ijeQzetfSn6EGcs1yY", + "value": 0 + }, + { + "id": "NaJxTPq9Ld8I4fwAltyEC", + "value": 0 + }, + { + "id": "Wu47Qs6Zupu1Ox2gUhkxn", + "value": 0 + }, + { + "id": "BQm-YCPc0lfD1-mhecCTL", + "value": 0 + }, + { + "id": "D7dt_hFX5DScV_ssm1nKz", + "value": 0 + }, + { + "id": "Mw6WRebMAKWwXfAvDA7vu", + "value": 0 + }, + { + "id": "jpKPg3hn6_GO1HSkeLNGz", + "value": 0 + }, + { + "id": "pM-bC77hbj-w44A0HFRDZ", + "value": 0 + }, + { + "id": "px0jKQDj7r9pOYs4ZrvcT", + "value": 0 + }, + { + "id": "vq3T-UQGTjX3Z9TlEF12e", + "value": 0 + }, + { + "id": "G2i9LSK4A19237Zp1vXqF", + "value": 0 + }, + { + "id": "1IjenNwPwsMIWZ4aYBk8S", + "value": 0 + }, + { + "id": "pptyFMhLrbC6lN6zmc7D0", + "value": 0 + }, + { + "id": "5mGrGHzdw_vCwYCRNPcPw", + "value": 0 + }, + { + "id": "B1845IfYfPMz2FWpVFIQv", + "value": 0 + }, + { + "id": "1Rv9-SSJjHptwvzqLbdbx", + "value": 0 + }, + { + "id": "b5OdBMMzkf1FlQbUR5-m7", + "value": 0 + }, + { + "id": "8MV4ZFthtUeoxLAIbqGTc", + "value": 0 + }, + { + "id": "INxOSvKbBNOXwruIpuNho", + "value": 0 + }, + { + "id": "YbvMRsCtMbww8OQgF45QF", + "value": 0 + }, + { + "id": "Uk1Emn5IovsTfFzpQX5Jw", + "value": 0 + }, + { + "id": "HTBNWax6FCSGXuboGsVUW", + "value": 0 + }, + { + "id": "7WxUVoVQfQOzARU2bf6HP", + "value": 0 + }, + { + "id": "ZnMba2r4XIg9lPi_H2d_Z", + "value": 0 + }, + { + "id": "b9Y5MrR-jn8fh77gAkLZy", + "value": 0 + }, + { + "id": "lKA4b7I3iFkqNzPcAXyBc", + "value": 0 + }, + { + "id": "7Hz61-WzV62FHsedOwz6q", + "value": 0 + }, + { + "id": "hDvpMlPw-chcuxEisBJTl", + "value": 0 + }, + { + "id": "curstMeuThu2KUph-8rkB", + "value": 0 + }, + { + "id": "u1nIt_oFH426g1IVhlYk5", + "value": 0 + }, + { + "id": "_CsJMxqGcNSaujXwRZcpu", + "value": 0 + }, + { + "id": "ZBIFtTq-BH1jv5jLbzrhj", + "value": 0 + }, + { + "id": "upWXctTSKBtFNSXnXDK_u", + "value": 0 + }, + { + "id": "904w9Je6oDwGXUCIcrUZX", + "value": 0 + }, + { + "id": "NVjfEut567uXpTaQUNI2i", + "value": 0 + }, + { + "id": "aMs2YNnWkw4XN0gAm-jI3", + "value": 0 + }, + { + "id": "9kgRI3KlOIVSuylKffW9g", + "value": 0 + }, + { + "id": "uPL5NMeXTmD1iU6ZoiROu", + "value": 0 + }, + { + "id": "K382TlNZjdMLLpAhCCXLG", + "value": 0 + }, + { + "id": "JFldbhjqxK3fD6D2K4HY4", + "value": 0 + }, + { + "id": "TZF-7m8VKZ7IL6pyv0Daf", + "value": 0 + }, + { + "id": "YusWY8GwdO43bSp1o3BWC", + "value": 0 + }, + { + "id": "KNH4sLRpVKtHXQa-0y84K", + "value": 0 + }, + { + "id": "XOoGN6huCjVHxH8hRFAw1", + "value": 0 + }, + { + "id": "9s5zV3_oGyDx_NEvsKCxX", + "value": 0 + }, + { + "id": "OHyrmD5US1rHEAEwLQaII", + "value": 0 + }, + { + "id": "cb0rJJEYOeEoRU5fDdQQq", + "value": 0 + }, + { + "id": "pgPlWKk-oww2fua5zYuue", + "value": 0 + }, + { + "id": "MiOe5_Djf-pE9V9aDZ_1G", + "value": 0 + }, + { + "id": "9lS0mNuKIS0olyDwoIJBR", + "value": 0 + }, + { + "id": "XeVaDdUWSEkhfJvTVvUHR", + "value": 0 + }, + { + "id": "JBIehRNmDbK2ALcRN0u9i", + "value": 0 + }, + { + "id": "qYA2U_BFOZtFLClxuCIBJ", + "value": 0 + }, + { + "id": "RwlZ1jr2Ix3evzrW71lN0", + "value": 0 + }, + { + "id": "zdFC3vpgjcyUWB9a4ghRW", + "value": 0 + }, + { + "id": "VwZ4EKSggYWxlnAbp-pNB", + "value": 0 + }, + { + "id": "9U8MzceIsqKhG86oNx9zV", + "value": 0 + }, + { + "id": "mC9Nb7zVdEUpjEBODw_gL", + "value": 0 + }, + { + "id": "et1KiL5-zob_EcGlj7tLN", + "value": 0 + }, + { + "id": "14aCIW665UZtuwNsKKV5s", + "value": 0 + }, + { + "id": "Njz8DrErsexBu8mAI6mnr", + "value": 0 + }, + { + "id": "cTiw7_Yjxu_Kg90q7PdYl", + "value": 0 + }, + { + "id": "0THELgiQ7rvA-orESXJfV", + "value": 0 + }, + { + "id": "ibtmTEP3QGDY8TyVLteuX", + "value": 0 + }, + { + "id": "d6s8fLFBiQ3KEJlNdJfUW", + "value": 0 + }, + { + "id": "LEg8z-Q-ONLAAXd-aH_Hb", + "value": 0 + }, + { + "id": "K8e2-KkvZfFOQaXnhR37x", + "value": 0 + }, + { + "id": "2RZTRMX56BFLrW7tLJ3Hy", + "value": 0 + }, + { + "id": "ecUOs24Pp5ZTRt_ZvED5W", + "value": 0 + }, + { + "id": "H8Bsrr2NK9Q3WGbEp8PMe", + "value": 0 + }, + { + "id": "D_4Weq7iyi7GMEsgP0xy6", + "value": 0 + }, + { + "id": "gzCjycNS8Cf0vNlo1klji", + "value": 0 + }, + { + "id": "YLKXFZ9ze9K9NvJiAx8w0", + "value": 0 + }, + { + "id": "D85FU-Wqr2u53tfTXAtHo", + "value": 0 + }, + { + "id": "djgKI9embnk95PAtFcn45", + "value": 0 + }, + { + "id": "pwltOTDn2OyABTlD4-27W", + "value": 0 + }, + { + "id": "lXH68vGIuZdfA8xVrS8iw", + "value": 0 + }, + { + "id": "oqQWeoWBr5N0LrPGY62Og", + "value": 0 + }, + { + "id": "U1KQsrvTa2E00-ugc-Iy6", + "value": 0 + }, + { + "id": "DkeHJFtqAS005fYUrl1Xz", + "value": 0 + }, + { + "id": "9mLx-YMK81AflitELQFqk", + "value": 0 + }, + { + "id": "C2bgADoxmINRnAiYxZHqd", + "value": 0 + }, + { + "id": "TR5CXN8-pfbWkshdxSBSV", + "value": 0 + }, + { + "id": "aTwzShtP_zR9x6bSGSzEB", + "value": 0 + }, + { + "id": "fNv4Nb6Vafxk0JxXr-iDo", + "value": 0 + }, + { + "id": "qsA1zm1DOlItK7DCWzAw8", + "value": 0 + }, + { + "id": "JawnUo-pseWb3FDVMtxrQ", + "value": 0 + }, + { + "id": "uFoytOG4qsXzBk979t63y", + "value": 0 + }, + { + "id": "4rzonBodQXfs77gALnAP_", + "value": 0 + }, + { + "id": "gsU8pE9ozhR73xS2icwJ0", + "value": 0 + }, + { + "id": "Q6LQqdLcvNOiCFjC0DVo2", + "value": 0 + }, + { + "id": "ajesFjbC7hwCNLKdif-ix", + "value": 0 + }, + { + "id": "-LE2iv3Pwr5KuIyM5bYb3", + "value": 0 + }, + { + "id": "nMQUtS-kFHViOKyop1FdS", + "value": 0 + }, + { + "id": "islCzqFq1SYrZAh63dLhQ", + "value": 0 + }, + { + "id": "NFgGqhEtl0HqipCGGEvwU", + "value": 0 + }, + { + "id": "GAxX7EIz1TTLtMX08RRGr", + "value": 0 + }, + { + "id": "armmpopt2RLsVDlqLrQ94", + "value": 0 + }, + { + "id": "Wva5W8GA0dHzyt2_0FPdm", + "value": 0 + }, + { + "id": "0pFtmDZdlnLrUkT_XZDXQ", + "value": 0 + }, + { + "id": "HMPabuHqgtyiCmTLzg-rM", + "value": 0 + }, + { + "id": "Akf0xlH8UJdXn8BJzPV2A", + "value": 0 + }, + { + "id": "iAqItRUQL_YpbMn2pgjsA", + "value": 0 + }, + { + "id": "N7n4zQIkJZOhaYESk2GgH", + "value": 0 + }, + { + "id": "UVzdJiqY36fqgBYyz880c", + "value": 0 + }, + { + "id": "WtYSntcy2CijEORmROeaj", + "value": 0 + }, + { + "id": "CkTiaqBY3jf86JRq636lt", + "value": 0 + }, + { + "id": "eoYtISVZl3mdwoE_HW-Mv", + "value": 0 + }, + { + "id": "PfNLmlHKFT9d1w6IgeXbU", + "value": 0 + }, + { + "id": "Vzov0z9acB-I1_W_CcFcY", + "value": 0 + }, + { + "id": "zRTTg5x_P1E8Z3CU-oWXa", + "value": 0 + }, + { + "id": "QTkFHWp9KEDgfCjoQjBY2", + "value": 0 + }, + { + "id": "khUUL_1JQGngApqBRDh_q", + "value": 0 + }, + { + "id": "OwHzJdOQTFOA8daCVRwm6", + "value": 0 + }, + { + "id": "AQKGKdoX5CYycZ2YqBZVW", + "value": 0 + }, + { + "id": "5Tdy0Gu9SiLsPfWwd-Y2E", + "value": 0 + }, + { + "id": "FBPIabyaoCK-Y0BziQdji", + "value": 0 + }, + { + "id": "CsKZSNiJw5Q48b26Kskf-", + "value": 0 + }, + { + "id": "jTEb3A5ZEKEy2ojuq2vO_", + "value": 0 + }, + { + "id": "wkrNPLGWTqMIy4PJRW9QR", + "value": 0 + }, + { + "id": "K6hd20tWZfwwlYYi7jctt", + "value": 0 + }, + { + "id": "m17b6MazSk6M4gb51_cCy", + "value": 0 + }, + { + "id": "m39xTdgaenoi4mWGEa-Ew", + "value": 0 + }, + { + "id": "00AkNJ4YLpbRD_mLmQjtp", + "value": 0 + }, + { + "id": "yk2wDVqHEKKwupgm87OJ2", + "value": 0 + }, + { + "id": "hOyjT1JgOYB-mGLFMaNJR", + "value": 0 + }, + { + "id": "DqGa4gqd2ABDi45BT43x4", + "value": 0 + }, + { + "id": "4J1bWl6BbbEdZsRGsgYH2", + "value": 0 + }, + { + "id": "hXgGhazQ_nA5uqpRD6Qwq", + "value": 0 + }, + { + "id": "pkuppr1jMH7SMpa2hrIWQ", + "value": 0 + }, + { + "id": "jtKc2q2n5an342ZkiMB9R", + "value": 0 + }, + { + "id": "WNhpmD_XlTaNEBo7GsFXu", + "value": 0 + }, + { + "id": "kpghvJtujlt4vPI2N6vsg", + "value": 0 + }, + { + "id": "Kn9vE07FK1LrzoD_YxrJD", + "value": 0 + }, + { + "id": "3KbwCHGooNLySWOBlFFuG", + "value": 0 + }, + { + "id": "sDKIldL3tit328Joneo_7", + "value": 0 + }, + { + "id": "k9ZpWM4oRb1q20c0qWCsg", + "value": 0 + }, + { + "id": "JB9SIxWzxWFjrbmMuksrY", + "value": 0 + }, + { + "id": "fUUj_4pKPflmJlxZfk0cX", + "value": 0 + }, + { + "id": "mZFwH8xY_OeVDWCdvPZBy", + "value": 0 + }, + { + "id": "sixdpB8hTOhlUr4loz3RB", + "value": 0 + }, + { + "id": "NFdUTit6Ff-4S7Nzf92U5", + "value": 0 + }, + { + "id": "sysOciGqtL7y4ULuyYVc-", + "value": 0 + }, + { + "id": "xIgPo3N-aKXhVcjultMiY", + "value": 0 + }, + { + "id": "XYY8SV1IAMHjdGjMZxbdy", + "value": 0 + }, + { + "id": "UQ5B5K-tpk1XmQC1B9TjQ", + "value": 0 + }, + { + "id": "p_qpVEd677b2Bk56yhvj6", + "value": 0 + }, + { + "id": "6lYN4qSZx3_tKDClp4Iyr", + "value": 0 + }, + { + "id": "nUg2M7p5sUPlGdbBev2-G", + "value": 0 + }, + { + "id": "Fogupb264IyCtbZ-Q2D6w", + "value": 0 + }, + { + "id": "10X4OKR5xmNhSj86sbyE_", + "value": 0 + }, + { + "id": "PIPQnVS2UiS7kGbucJP8l", + "value": 0 + }, + { + "id": "oAxNCJufVUqZMyWRGdZl9", + "value": 0 + }, + { + "id": "mx6dmRLXA_lkN1QlP71vq", + "value": 0 + }, + { + "id": "VJ9AU_y7CqsONR6TvhdLh", + "value": 0 + }, + { + "id": "g1Cj6HW8kg8yPE1XX9pxa", + "value": 0 + }, + { + "id": "j5xZZev5nTNa-p088Oqnp", + "value": 0 + }, + { + "id": "miPmA2tOQiLxOW7D_V_x6", + "value": 0 + }, + { + "id": "fkNwVm56PSe-qh-QoM0vm", + "value": 0 + }, + { + "id": "IO8uTb1K7ElENgp2ujZoK", + "value": 0 + }, + { + "id": "sSTGRl6DpYGZXp8vtTNbm", + "value": 0 + }, + { + "id": "f2dl12fMZbRdQ7STpcTdk", + "value": 0 + }, + { + "id": "rMFGfzFobfGsH3_qrLHXU", + "value": 0 + }, + { + "id": "QcGJ9u_JqmrW0X47PXWH4", + "value": 0 + }, + { + "id": "TyqVzfOniQNa9WKQRXqr-", + "value": 0 + }, + { + "id": "5i3kSsCKF7Oa9iJQvXiTe", + "value": 0 + }, + { + "id": "G09TvOzDSG5m3hTQD9Tej", + "value": 0 + }, + { + "id": "zi_wcT10fxgn72ZJhVx18", + "value": 0 + }, + { + "id": "HQiQh4PPBvO1n-d7JGVj8", + "value": 0 + }, + { + "id": "6rcOXG6yxpzHLzMJ9IayI", + "value": 0 + }, + { + "id": "TLxsYdrBdHgFZkNJtVTmK", + "value": 0 + }, + { + "id": "TAbuXSnSHU6C3CQ4kbKVh", + "value": 0 + }, + { + "id": "Bebnh8-UWwtYLnK6p3fKi", + "value": 0 + }, + { + "id": "dNvN5P787hAPE7ZYNgwkw", + "value": 0 + }, + { + "id": "GxrDtsdGcLepdsQr6V9DT", + "value": 0 + }, + { + "id": "ry_jOegpMf4nB3spGf4d2", + "value": 0 + }, + { + "id": "TuAjBKPp3-PSdQuooSWZi", + "value": 0 + }, + { + "id": "_lU200bb9Sjv0b_iJKgU2", + "value": 0 + }, + { + "id": "AWJXh6URGN0Vwm66i6IvL", + "value": 0 + }, + { + "id": "HnuZA0UTlnuIfFAN7saxl", + "value": 0 + }, + { + "id": "VoZumy5GtnRdqSOmXAw7j", + "value": 0 + }, + { + "id": "r9qUBQwgY8eycnU2OVey0", + "value": 0 + }, + { + "id": "XA952Z60D0-cesNCVA-OX", + "value": 0 + }, + { + "id": "2u2-AFuI245I7bZ6tsSPh", + "value": 0 + }, + { + "id": "cJMQi3SVmqvWJ00VxI6gy", + "value": 0 + }, + { + "id": "BQhqx1PuF94jwT0ySTlbJ", + "value": 0 + }, + { + "id": "YCu-B26PqjE30AhikHdkI", + "value": 0 + }, + { + "id": "JZRBfIXBkeuobtDXbLt5t", + "value": 0 + }, + { + "id": "g2MhHawoIC9oFNEv5_w63", + "value": 0 + }, + { + "id": "QCQRmsQY6AggjreY9Z0MF", + "value": 0 + }, + { + "id": "v-E2GE1DpCkNAxsfA0f4M", + "value": 0 + }, + { + "id": "7EsVGfapPc_38mHCBy3C3", + "value": 0 + }, + { + "id": "s0BXoyn7AqUAlZ9BOHY6S", + "value": 0 + }, + { + "id": "vPnmrsRou1ihosdVXS_Op", + "value": 0 + }, + { + "id": "J3qQMp0OMr5LC9ebfArxH", + "value": 0 + }, + { + "id": "LU7IoUksATEBhd8PaHS1R", + "value": 0 + }, + { + "id": "Pw3GgPwp7fpDVC6wJjgPn", + "value": 0 + }, + { + "id": "bAoK85XLNb7p0ebevYZ6O", + "value": 0 + }, + { + "id": "NQayjogCYiimP_0OxIfFj", + "value": 0 + }, + { + "id": "ff7ES190q1dmFYZ7lo6x0", + "value": 0 + }, + { + "id": "wnfSUkF8-tQiRTVou1_pd", + "value": 0 + }, + { + "id": "Te_jJfeU8Xwa9St2RihBq", + "value": 0 + }, + { + "id": "xnPF8fvkC1TvgETI1JcC9", + "value": 0 + }, + { + "id": "quE_RA9abVvtG-Fo4Jx8f", + "value": 0 + }, + { + "id": "XC5fIljJ819OYpllYTjpE", + "value": 0 + }, + { + "id": "3w62N9b7Cvb6JMjB9Wphi", + "value": 0 + }, + { + "id": "tGyUfSljuc7A5Do5B9GuN", + "value": 0 + }, + { + "id": "DSgrhLHauub-gBqMGwacO", + "value": 0 + }, + { + "id": "ZAnmv4CLb7hldYUlp2wJU", + "value": 0 + }, + { + "id": "dLHDzm0rfgL-vXTx14HSm", + "value": 0 + }, + { + "id": "xPUYlxRxgFVn1FHQFz6Ic", + "value": 0 + }, + { + "id": "XnocVMEeUGCSnlnusP44O", + "value": 0 + }, + { + "id": "D1gCni2jXpCvKZe4qCtQN", + "value": 0 + }, + { + "id": "Gj7THa6XFHDfYL5H19lwj", + "value": 0 + }, + { + "id": "mRK--C5Q1aGe8MMPJJLYi", + "value": 0 + }, + { + "id": "O_ZfCPZSxGMPT6orCt-O6", + "value": 0 + }, + { + "id": "cJzHrV_PsV-PwwyFN9jka", + "value": 0 + }, + { + "id": "bge6qR6NzsD5Vk4ifPsSO", + "value": 0 + }, + { + "id": "0fcYcD_r0jNWXTTAx8Ph7", + "value": 0 + }, + { + "id": "-2UbAou9ydr8XeN-jtIz4", + "value": 0 + }, + { + "id": "WDUIQV43zghFQq_rSk1Z4", + "value": 0 + }, + { + "id": "k8tJx6PikRcnVuZEqrXRM", + "value": 0 + }, + { + "id": "l_ncJLRdVGBzzQc9yqBqs", + "value": 0 + }, + { + "id": "8LddDqylw-51wHhx9_Qad", + "value": 0 + }, + { + "id": "q22wRFF21EigV8YzQ_MfV", + "value": 0 + }, + { + "id": "QJhkOh48xapiTObEDQLB9", + "value": 0 + }, + { + "id": "xqGzZJIHBeVfSzRfm3rmg", + "value": 0 + }, + { + "id": "AT_rDWsr6xRBgrvgw9Zih", + "value": 0 + }, + { + "id": "JblWXW8TKDCuYu2yTnFBA", + "value": 0 + }, + { + "id": "6t2sPdapSNJrOziDozTWW", + "value": 0 + }, + { + "id": "phZ4F4uzi1TrhjeDMuMsn", + "value": 0 + }, + { + "id": "YeT-jstVSA7-mD9t99Isg", + "value": 0 + }, + { + "id": "_eug92AvR1UXpYlfm6o_Q", + "value": 0 + }, + { + "id": "fjCOcN-PKP6F07IZcI71X", + "value": 0 + }, + { + "id": "rxdfuk6egO7VmZEB3JrUN", + "value": 0 + }, + { + "id": "_HUf6SR0mTP7v72Y9_4gw", + "value": 0 + }, + { + "id": "vazatQ7CrYJFsorVDC5AC", + "value": 0 + }, + { + "id": "GJlUSznzEHCgoAOrVrkp9", + "value": 0 + }, + { + "id": "9dvSIpeXa2_12Jip6noJP", + "value": 0 + }, + { + "id": "KC18_sTEqKucPQ-iwEKYY", + "value": 0 + }, + { + "id": "ms97ZsgQOvD-Z8qpSW4oN", + "value": 0 + }, + { + "id": "9QyJdpUn0f6g7FxWs5qpO", + "value": 0 + }, + { + "id": "DBd09yUlbkaYLsemjFXEs", + "value": 0 + }, + { + "id": "DXb0FpjVM9q8LVl9vvSHn", + "value": 0 + }, + { + "id": "xGsyYCjDzQugVzSaK8CuA", + "value": 0 + }, + { + "id": "UwvZVcX_CAQFrI6U4LsNT", + "value": 0 + }, + { + "id": "1-VwcvzNfvrwDWRGxRPre", + "value": 0 + }, + { + "id": "OblxxVFC-LKPq-8oC9FpE", + "value": 0 + }, + { + "id": "PogTYrGfa2WNfBRuA8O4e", + "value": 0 + }, + { + "id": "JVtu9W3AumOwjUedwhUGE", + "value": 0 + }, + { + "id": "6nhNeVjDfDi-GmreaqfVo", + "value": 0 + }, + { + "id": "i0wB--S4sdL8Q4H9b93UY", + "value": 0 + }, + { + "id": "1zU7kolOKsHP9-oomQW1Q", + "value": 0 + }, + { + "id": "LrDai7jXlGAdZ3e8ZQezj", + "value": 0 + }, + { + "id": "_Lc2-NNL69ZX-aVnUNzgx", + "value": 0 + }, + { + "id": "zm_6R89hr4wjuVkifiYrk", + "value": 0 + }, + { + "id": "2dwtZO2wCm520GPD1i6dl", + "value": 0 + }, + { + "id": "hwzwfMyJsvB42F_QWQWyi", + "value": 0 + }, + { + "id": "PFAi3SdvH9vL7_Bg3MhCA", + "value": 0 + }, + { + "id": "yR9FTtOimFwZG5g5tgpRk", + "value": 0 + }, + { + "id": "7Q4Zc0cenSF5U4eKyje1f", + "value": 0 + }, + { + "id": "whHwNRVnqeM7BMx6nppiW", + "value": 0 + }, + { + "id": "zcibOHpRbSmz1hVNSjPTj", + "value": 0 + }, + { + "id": "nQSk6_KCEVdO7oC_uxLXN", + "value": 0 + }, + { + "id": "LEVKlDlJ0wHo5QEjCNAGa", + "value": 0 + }, + { + "id": "DAq2J_xXHsSCSNPp9qVsk", + "value": 0 + }, + { + "id": "FnCBoLSE19WsbUypUKvFc", + "value": 0 + }, + { + "id": "9FiWvg197C-Riid-DVysN", + "value": 0 + }, + { + "id": "RZfMOtjw0DoGHWaRfCEc4", + "value": 0 + }, + { + "id": "mTklFAI-FVVLsMKoASZ7T", + "value": 0 + }, + { + "id": "e8zl_ecIloo4Vk-OZPJWe", + "value": 0 + }, + { + "id": "-GL2iAgykP10Ae3AKsVOX", + "value": 0 + }, + { + "id": "pHBnmCFpM7oZf0O78CBIz", + "value": 0 + }, + { + "id": "UssSOEEKutvzB_B4fAQE-", + "value": 0 + }, + { + "id": "J7wLwBLVx4UANh_x5HdXd", + "value": 0 + }, + { + "id": "QZNQOaf0SdHDbx1otCmrH", + "value": 0 + }, + { + "id": "fNAlqbgrpirQZO_LhrkXY", + "value": 0 + }, + { + "id": "tQwMPLvqAMAstcqvnOERE", + "value": 0 + }, + { + "id": "m0434KkjeTv8SGN7WxR2C", + "value": 0 + }, + { + "id": "vlh1Pa6eA0ZrBs3vHzWH7", + "value": 0 + }, + { + "id": "ZQEXAf10BkoTvCJx3Ox39", + "value": 0 + }, + { + "id": "okr5oAG2U8Er1XwQ8XbWD", + "value": 0 + }, + { + "id": "qOsbXyvBTMDAwvvnI0iFn", + "value": 0 + }, + { + "id": "uDg7Yy86PlwsAd-U96vJR", + "value": 0 + }, + { + "id": "1nhsReHG-f-bW-xaZBsxY", + "value": 0 + }, + { + "id": "40q0NJ6vsziJDNFBqho7Y", + "value": 0 + }, + { + "id": "3mwcdenOurU_e59ChLqb0", + "value": 0 + }, + { + "id": "dS-KyYREUQIk7sDlmsvoa", + "value": 0 + }, + { + "id": "IM8OUKCzHwnjAQWPFgnn6", + "value": 0 + }, + { + "id": "vPicdKLrhT2wmAAPPukKP", + "value": 0 + }, + { + "id": "EM8VyonJ7WNdvmRyE3nhZ", + "value": 0 + }, + { + "id": "c7kK5ROVbO3DHrwSFEawq", + "value": 0 + }, + { + "id": "ThqkHs4az5tgLqLcfFPaZ", + "value": 0 + }, + { + "id": "KvY6Taigm4Va_cVjXAfGR", + "value": 0 + }, + { + "id": "rwyX2YemNEx_Mh64IArDQ", + "value": 0 + }, + { + "id": "uzSwgQNnV8ZrjxpN5Bz_a", + "value": 0 + }, + { + "id": "eDX2HSkGaY2TeVwPjR07S", + "value": 0 + }, + { + "id": "oOkD8Wmvb4t9I2EWqT1Nr", + "value": 0 + }, + { + "id": "Td5pgVQDTFOftUgOJ-bD-", + "value": 0 + }, + { + "id": "kxuGlfYjS6puO2xD1QvxO", + "value": 0 + }, + { + "id": "g75y4E53ViakV-s5UfnIF", + "value": 0 + }, + { + "id": "vHzfvEgIkQ0e73ryfWP2F", + "value": 0 + }, + { + "id": "xxr0MRGYRmmoNC_gsD9uy", + "value": 0 + }, + { + "id": "BKmATW2uBk4pxnmOaARyq", + "value": 0 + }, + { + "id": "8FFwIw7rJri79BITZBUzm", + "value": 0 + }, + { + "id": "rgyV6CvFe98OGnWut6QCZ", + "value": 0 + }, + { + "id": "zxhRDSHXtV63Sp3c2fjrI", + "value": 0 + }, + { + "id": "GoJuWnn72TCXONXKtYHMm", + "value": 0 + }, + { + "id": "1mS8kgJIod1cyUFH-msnM", + "value": 0 + }, + { + "id": "G6KKVMvPDnjdD9TfBd-B9", + "value": 0 + }, + { + "id": "FgTird367surh-vxXyAK6", + "value": 0 + }, + { + "id": "uiVc5R86QCZkhraEFlrNz", + "value": 0 + }, + { + "id": "hWWOw1gWjWwN7wQJkHrTu", + "value": 0 + }, + { + "id": "CxFmyJYmy6gMRqP9U0cBP", + "value": 0 + }, + { + "id": "7Q9sNljseWjwSPW4in1ga", + "value": 0 + }, + { + "id": "Ig1oypuwndODbmKh_NEXs", + "value": 0 + }, + { + "id": "hT3Lrjn5-q7YIM1loG4MN", + "value": 0 + }, + { + "id": "7VL_MgnLDY6hi8sbvcGIg", + "value": 0 + }, + { + "id": "avzcTznCsQCISYJsLC-w_", + "value": 0 + }, + { + "id": "k7dZhQtwDPFlOk1iPjEOz", + "value": 0 + }, + { + "id": "KrOPANVpdkBWdEZoUwxKf", + "value": 0 + }, + { + "id": "qeJdrxKIIcUctIjo8wWhc", + "value": 0 + }, + { + "id": "Djs1QsLNf8Q5LBIFV5zNC", + "value": 0 + }, + { + "id": "FBTheEQmZZfJRiYjd_Np_", + "value": 0 + }, + { + "id": "Hvb4JdDHX_vNMck_US2UN", + "value": 0 + }, + { + "id": "dnXsSOeVG7mq37uciIi2J", + "value": 0 + }, + { + "id": "EUsNyf5bDdSLqvZKH1Ltx", + "value": 0 + }, + { + "id": "N2baGNTOapSaFDo1GURiW", + "value": 0 + }, + { + "id": "JGm4BL7HAfuxX_PGe6Jzk", + "value": 0 + }, + { + "id": "FfNU04I4mZ54gWcBXqo2c", + "value": 0 + }, + { + "id": "93tHieC_CgZqN998y5gAv", + "value": 0 + }, + { + "id": "mK4AXXhoIVirBz5dr_xLA", + "value": 0 + }, + { + "id": "CY-IQvUehkaiGFCdKf9bf", + "value": 0 + }, + { + "id": "1WJZO-pUkTaQvyxz41iB-", + "value": 0 + }, + { + "id": "-LwAKwgCdVkzwM579zRMo", + "value": 0 + }, + { + "id": "APXF-lEplPOloppSeIjAY", + "value": 0 + }, + { + "id": "nm6e_s01gWHzdVj25BHyq", + "value": 0 + }, + { + "id": "1pb6S-RR_3zdCq77YFiZ-", + "value": 0 + }, + { + "id": "TpPNZLsh5jrN9RdPFwmA7", + "value": 0 + }, + { + "id": "oO21zLMEtHEakvnuTohLu", + "value": 0 + }, + { + "id": "tw1doIY-jFPofZjlPFj4z", + "value": 0 + }, + { + "id": "TP-gGRcpcFyx1SrNRsdRV", + "value": 0 + }, + { + "id": "0vttFf3nAGDW6g5wVStcH", + "value": 0 + }, + { + "id": "0fHziRVxg0oNDp5pyiI8M", + "value": 0 + }, + { + "id": "0v5fqIp8GmXsIHO0SPhtt", + "value": 0 + }, + { + "id": "Gm_qAGnL4OawmlYmTs7K5", + "value": 0 + }, + { + "id": "ZA2C4bJaL90lBxsTemYWZ", + "value": 0 + }, + { + "id": "QohNih4wgqjnpWt3kSwtd", + "value": 0 + }, + { + "id": "LRfh-4RAZTj7cnnDwBmqj", + "value": 0 + }, + { + "id": "GSEumxiyeVKRRiaY_c8HW", + "value": 0 + }, + { + "id": "aa3xDW6F9YUKyX0fe5uX8", + "value": 0 + }, + { + "id": "bqjKW_qBtRzIThWxdZx2s", + "value": 0 + }, + { + "id": "WQ0CNIQ_gjaCxg4tEIsOo", + "value": 0 + }, + { + "id": "NKQwWPAsVHwFBWuksqfns", + "value": 0 + }, + { + "id": "TS9z8ZmMEwn0MGSfr9amH", + "value": 0 + }, + { + "id": "vy-O5Zc5kxY8d-7RROvQI", + "value": 0 + }, + { + "id": "4A_FNkGH1EDu0oabPurrL", + "value": 0 + }, + { + "id": "t-w8e69GwxLyfxlWwHk9f", + "value": 0 + }, + { + "id": "jeO9YZ22LfSObUNhQDRAz", + "value": 0 + }, + { + "id": "HBZNu6m3FELU9eg3OeLdx", + "value": 0 + }, + { + "id": "ntzBlFkDMTKEUHoGNc65u", + "value": 0 + }, + { + "id": "lR84gCk8OM-oYoLAV7tar", + "value": 0 + }, + { + "id": "vOgqHjpHgrUGERIHtVqDe", + "value": 0 + }, + { + "id": "BqS7d4PMhGRqPYlZQzUbR", + "value": 0 + }, + { + "id": "4X7OXm35OSHoSlPxGUi_f", + "value": 0 + }, + { + "id": "e5sCl246xFMESEfFy2PhX", + "value": 0 + }, + { + "id": "2t_eq1JmgHa0R3eu8LMmI", + "value": 0 + }, + { + "id": "zrR1DbO_szgKvxLyrZquw", + "value": 0 + }, + { + "id": "Q6nNH4AIoSeDHODC_Ip8O", + "value": 0 + }, + { + "id": "DG1RiDjDfwWRhpAiIpPqA", + "value": 0 + }, + { + "id": "otTWzTaTAmweNCozT8tn9", + "value": 0 + }, + { + "id": "ijn-QwQuTxRFFVe-7WlSX", + "value": 0 + }, + { + "id": "HKfLJS8aCBtKuKJeSBQUW", + "value": 0 + }, + { + "id": "y5W21CKOkLWnYJo1OC700", + "value": 0 + }, + { + "id": "_FNTsoEjTMV3Uas-gggi2", + "value": 0 + }, + { + "id": "VUJ-zrdsyL9MOuFbdMCAx", + "value": 0 + }, + { + "id": "QclUM2p3iexSjFZI8OU4-", + "value": 0 + }, + { + "id": "qA4v2JWQU0zzBBZgvW7Vt", + "value": 0 + }, + { + "id": "sc0hr3jQ80yXRFDlAn56V", + "value": 0 + }, + { + "id": "Fvm2C5NBq01tm0QK9d9QM", + "value": 0 + }, + { + "id": "FaVvbVzZivuxTwxJTPubK", + "value": 0 + }, + { + "id": "xbPnUL4qxvm30VFYNphh-", + "value": 0 + }, + { + "id": "aXLBXkENJqTYkyZOP8TNS", + "value": 0 + }, + { + "id": "Bub9ZYygLcly15D7_wYks", + "value": 0 + }, + { + "id": "buyy_2ydocKoi9TnBhZ1N", + "value": 0 + }, + { + "id": "gzb-RNDLMNkgk9wnPILJi", + "value": 0 + }, + { + "id": "e5un1yrIuZHQi048e5kD6", + "value": 0 + }, + { + "id": "3KgKNNnuYMrysEDs3Pu4Z", + "value": 0 + }, + { + "id": "oa-MShota2L8n2pU8hIsm", + "value": 0 + }, + { + "id": "r808IO3I6j3os_uix6O63", + "value": 0 + }, + { + "id": "JSFuEHlP-CFvuqvFKMumC", + "value": 0 + }, + { + "id": "Q9Ra0aJaQnOJQ1Kqdc43-", + "value": 0 + }, + { + "id": "0huLn-H32Cbwba28IZ3tc", + "value": 0 + }, + { + "id": "PszHdOxMsS_tAzSrN52Wa", + "value": 0 + }, + { + "id": "ByrvXHEN9Mb8D--7MQAjM", + "value": 0 + }, + { + "id": "q6F-qJ7mTxvwa43F6vwun", + "value": 0 + }, + { + "id": "1QEfLU_S7TM0iMr9VZVtP", + "value": 0 + }, + { + "id": "Ra2rxEEohwxRqDsW2AT3C", + "value": 0 + }, + { + "id": "wCGb6D4xSVr4UeKXzGIlP", + "value": 0 + }, + { + "id": "fL_4POdbPVL9-lvQVWSqY", + "value": 0 + }, + { + "id": "y0SViQxW8Y-yiX1Z7gXWt", + "value": 0 + }, + { + "id": "OeytAsSiEAWC10tXhxbTa", + "value": 0 + }, + { + "id": "Yvxm8RGoFYKUsIXOl33yR", + "value": 0 + }, + { + "id": "NjulpZ9x63ZqxtLMoRjkx", + "value": 0 + }, + { + "id": "2HkB0WZYP7cvWLD39GMQj", + "value": 0 + }, + { + "id": "k41gkf6A_bDtQAJDOrWpP", + "value": 0 + }, + { + "id": "qscoBbrWu7tQbpNj9XUPt", + "value": 0 + }, + { + "id": "x3PNiU1NIeQ3zQa31C8WX", + "value": 0 + }, + { + "id": "LjTGOcyG7DkTs1lJqNr8w", + "value": 0 + }, + { + "id": "NmNouLLx13jzE27jliI_v", + "value": 0 + }, + { + "id": "eGJ8MC1xPE6ueF82jCmVg", + "value": 0 + }, + { + "id": "q7Pz4UqqZUlXeFfXrwXDR", + "value": 0 + }, + { + "id": "FO77qpzyz28knodNtILCA", + "value": 0 + }, + { + "id": "qWhpDTMd8eAEoq7yTKc57", + "value": 0 + }, + { + "id": "kIn8SeGURyvu49EsRqDs7", + "value": 0 + }, + { + "id": "3VEnVjaGFCImBAZ3wEChu", + "value": 0 + }, + { + "id": "SE-71I_ahm3oKROReyJHE", + "value": 0 + }, + { + "id": "lrUuPKco_O8FXDuclzpKE", + "value": 0 + }, + { + "id": "QllvOUe8utZrcBRGw_0vc", + "value": 0 + }, + { + "id": "aC_XP9Ch5PqWoCmcJwI77", + "value": 0 + }, + { + "id": "OUcfOOReAfQroBKlBdDb-", + "value": 0 + }, + { + "id": "mFfylZ8yoLvtkVSDTlVEN", + "value": 0 + }, + { + "id": "Ugs9V9c2c5iHrVC6p17zr", + "value": 0 + }, + { + "id": "ubP5GM7_0vPkRc6zbD9Ez", + "value": 0 + }, + { + "id": "zAmesi1FcIWLXE3WVa9WS", + "value": 0 + }, + { + "id": "U7GiGcYacowWi4MWrCYyj", + "value": 0 + }, + { + "id": "EO4O-s7oafi6QJdxTFNkd", + "value": 0 + }, + { + "id": "Vmnu5eormo-_TOCgF4YzG", + "value": 0 + }, + { + "id": "86gNdF6aTepa0Y9zkD1VQ", + "value": 0 + }, + { + "id": "_2SjbH-xHZq173EU4J65c", + "value": 0 + }, + { + "id": "ak5fBauJzapC4JIf0lT8N", + "value": 0 + }, + { + "id": "gFEnqFhYoXF7QN-n0ONad", + "value": 0 + }, + { + "id": "K8cMIDL0ubQvWhhDtr65F", + "value": 0 + }, + { + "id": "VrC7AnovfA7VzmYESVc8L", + "value": 0 + }, + { + "id": "yJoivIPHOm1Y1lj-hGN1J", + "value": 0 + }, + { + "id": "rnjJyPTabH_Xpmy4Z4O3U", + "value": 0 + }, + { + "id": "Ji5OVFX-uNDewL8eX8Cin", + "value": 0 + }, + { + "id": "Ust3oadA0PUGViYo28Mf3", + "value": 0 + }, + { + "id": "zANp2EnhT6n0Jcl1Xra6K", + "value": 0 + }, + { + "id": "Z8xp3kxXuhMVoNm7ddQSX", + "value": 0 + }, + { + "id": "0Vkmy6BZcJn3pFurEevL9", + "value": 0 + }, + { + "id": "50wJdR0-3YLnv9y_2Gx_e", + "value": 0 + }, + { + "id": "6KicPX6y_u2i6tPBZAtvA", + "value": 0 + }, + { + "id": "_8RIOebHpkr9nCy0_9qhP", + "value": 0 + }, + { + "id": "OvyFC1GHkvJZ0dAAF1QkY", + "value": 0 + }, + { + "id": "u3BufiTZTK6AylGh80ZFd", + "value": 0 + }, + { + "id": "S3um53pcko7_BPHy7R6FL", + "value": 0 + }, + { + "id": "3dtvYLjbl5oDyhZO9eFRY", + "value": 0 + }, + { + "id": "LngEMJa_ihV8mB7afZX-h", + "value": 0 + }, + { + "id": "eo3Q5AjHJz5kp1EbdALwh", + "value": 0 + }, + { + "id": "nnTJQMJWfd2nuTSlFNEOy", + "value": 0 + }, + { + "id": "wBLnDZStKj8YLkg2pTCfh", + "value": 0 + }, + { + "id": "rU9cpWF0I4wnJjzTXpGtO", + "value": 0 + }, + { + "id": "bpSuQQRlIcSse40OAxNSG", + "value": 0 + }, + { + "id": "2y9pxVOBQ2tMdPHcsqQb8", + "value": 0 + }, + { + "id": "sjGytpiPjwqJfPaRUJ-Iw", + "value": 0 + }, + { + "id": "0gAyTD6sImo0jpD_bYGVv", + "value": 0 + }, + { + "id": "Tpj-Fs8LQ566TM0bYlZ6H", + "value": 0 + }, + { + "id": "dn41o5K_1fo-qHO-YLoQn", + "value": 0 + }, + { + "id": "bFodvUraUhJeq4waMdlxv", + "value": 0 + }, + { + "id": "4bHGIoQmDN8LptpdNN4v6", + "value": 0 + }, + { + "id": "gYrIz3R13-BC_pYcvQ9BL", + "value": 0 + }, + { + "id": "rtHwq5WN9KElX3V3SKBmS", + "value": 0 + }, + { + "id": "O450x4W3OOacvJIy4QicJ", + "value": 0 + }, + { + "id": "J3rDL96c2zfBQzP45VRCp", + "value": 0 + }, + { + "id": "-msU3yor4qJYQHJtWrdk8", + "value": 0 + }, + { + "id": "EVmt43vDI3NHFfbbkqokF", + "value": 0 + }, + { + "id": "uYElWOlSOSoQap-d5gsYF", + "value": 0 + }, + { + "id": "CBTemIvgIN1UAtftkc3sz", + "value": 0 + }, + { + "id": "hUYfE_vmNBT_7E60YZsSu", + "value": 0 + }, + { + "id": "u2e4Zh8qwJF7zKkohQ8df", + "value": 0 + }, + { + "id": "5dvq344JstkxUpHszaPfp", + "value": 0 + }, + { + "id": "oYwoiRDWlIjSTbYdC2vG6", + "value": 0 + }, + { + "id": "r7eJgCF_b_ktkztv4-oda", + "value": 0 + }, + { + "id": "1b71P9YjaNWnX8AWjstqG", + "value": 0 + }, + { + "id": "F4cGnA_QHsVKTjUE6MAu9", + "value": 0 + }, + { + "id": "oEHzYcfxDGGcsL-deud1j", + "value": 0 + }, + { + "id": "SOyGnJXLPeVRoZy3vBgpK", + "value": 0 + }, + { + "id": "pv8eYkxczIevQqEGwDz6V", + "value": 0 + }, + { + "id": "vaYJPAsTRvslo2qFOJt60", + "value": 0 + }, + { + "id": "1mU2ZosZXSJrxkh1NmxJT", + "value": 0 + }, + { + "id": "TBV2BhoZVgl1jMV_jWZYi", + "value": 0 + }, + { + "id": "PLXxIPYyztaztLf4sPCst", + "value": 0 + }, + { + "id": "US8_vYTnDfxBw2Ung_J38", + "value": 0 + }, + { + "id": "IZbfYRzu2cxxDWdbmQeqw", + "value": 0 + }, + { + "id": "AeFbJQ0M9uTObAlKEX3zr", + "value": 0 + }, + { + "id": "9MzeUcz1nRqleTkmS_-g2", + "value": 0 + }, + { + "id": "P5zdq4x58yp5TA_soKQEJ", + "value": 0 + }, + { + "id": "WUt3I-NkdbqlSVcwuLfFx", + "value": 0 + }, + { + "id": "oEyUWrQj1iYUnlEUdQQ5Z", + "value": 0 + }, + { + "id": "J7MmgugOu20UtMcMPj59r", + "value": 0 + }, + { + "id": "WL3ZN-W_zgnuTJpuqz0YQ", + "value": 0 + }, + { + "id": "UkLF5sKtVKW0D8RzVCoue", + "value": 0 + }, + { + "id": "W_f7h3qOLl2uEd_OYpMfQ", + "value": 0 + }, + { + "id": "IF3R7tLVAkd4RbL8R07K9", + "value": 0 + }, + { + "id": "L0hfYADgzghRVsZLZHRxE", + "value": 0 + }, + { + "id": "hyUaYltGVJU-wRrAjhhPa", + "value": 0 + }, + { + "id": "J4UUPR-WP0qo1y14bUVI-", + "value": 0 + }, + { + "id": "kDzHKO8eIwNsyKWDw7M0c", + "value": 0 + }, + { + "id": "5W5_sCAyGTkVzguCEg1d1", + "value": 0 + }, + { + "id": "cnyLFMkJu2i3cqOY0e9kl", + "value": 0 + }, + { + "id": "fk_z_HrvcUh8XIq8D6gQP", + "value": 0 + }, + { + "id": "C_JKGNCxOI5x_f2C4qAyZ", + "value": 0 + }, + { + "id": "beNprvNb0UztxR4JLxDFm", + "value": 0 + }, + { + "id": "sP6uvKmY5kA_yuYR8H21c", + "value": 0 + }, + { + "id": "CCWCtXdMuQBJRmaFOAlfQ", + "value": 0 + }, + { + "id": "LAuEISciEf1Wc1j4fERz8", + "value": 0 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ftodos.webp?alt=media&token=694aae8b-22c8-4274-b9f1-b3bbdd15d061" + }, + "text": "TODO" + }, + { + "freq": 390, + "id": "VhfGFlHDcPor996rCzoK9", + "relations": [ + { + "id": "beNprvNb0UztxR4JLxDFm", + "value": 0 + }, + { + "id": "sP6uvKmY5kA_yuYR8H21c", + "value": 0 + }, + { + "id": "CCWCtXdMuQBJRmaFOAlfQ", + "value": 0 + }, + { + "id": "LAuEISciEf1Wc1j4fERz8", + "value": 0 + }, + { + "id": "4bHGIoQmDN8LptpdNN4v6", + "value": 0 + } + ], + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/7099/7099_500.png" + }, + "text": "CELEBRACIONES" + }, + { + "freq": 70, + "id": "WZYuZd331Hm5gHXJtUmBN", + "relations": [ + { + "id": "Erg6LuA8IOQ5V8RTP3pPi", + "value": 1 + }, + { + "id": "OHyrmD5US1rHEAEwLQaII", + "value": 1 + }, + { + "id": "Khdk8mWpyxgLqfC-6lyT9", + "value": 1 + }, + { + "id": "ZRYQmYRGKzheBqk11eGRZ", + "value": 1 + }, + { + "id": "nQdbkRVcwpQB_hFNPbe6M", + "value": 1 + }, + { + "id": "CbO32RkDdf9aCucv6BnGS", + "value": 1 + }, + { + "id": "82LicIQc3K2xCTEt-iMpu", + "value": 1 + }, + { + "id": "zw-o9pDectP5bxFnUjrJO", + "value": 1 + }, + { + "id": "E-vUPARie8MmfgZwv3Omr", + "value": 1 + }, + { + "id": "gvPwrzDSSEPwcxY878T_c", + "value": 1 + }, + { + "id": "WjXQhSFPpz42ZUyHvurYG", + "value": 1 + }, + { + "id": "XC5fIljJ819OYpllYTjpE", + "value": 1 + }, + { + "id": "vazatQ7CrYJFsorVDC5AC", + "value": 1 + }, + { + "id": "KpLFOrpuhFKaIbBbFwVVu", + "value": 1 + }, + { + "id": "vlh1Pa6eA0ZrBs3vHzWH7", + "value": 1 + }, + { + "id": "TR5CXN8-pfbWkshdxSBSV", + "value": 1 + }, + { + "id": "1Ph13Z_Ya6p-q0WA7pSl3", + "value": 1 + }, + { + "id": "IXRWmFmtqfnHQRcBf1Idl", + "value": 1 + }, + { + "id": "xQblStUfyBGO27j15Sda3", + "value": 1 + }, + { + "id": "CyKtU9yC0Jy7Ypb4WFp6w", + "value": 1 + }, + { + "id": "TuAjBKPp3-PSdQuooSWZi", + "value": 1 + }, + { + "id": "whHwNRVnqeM7BMx6nppiW", + "value": 1 + }, + { + "id": "TLxsYdrBdHgFZkNJtVTmK", + "value": 1 + }, + { + "id": "6t2sPdapSNJrOziDozTWW", + "value": 1 + }, + { + "id": "bNJfccUvG2DQfR1iZP3eR", + "value": 1 + }, + { + "id": "cJw2i319mzBUpEfBRDxc9", + "value": 1 + }, + { + "id": "HnuZA0UTlnuIfFAN7saxl", + "value": 1 + }, + { + "id": "pgPlWKk-oww2fua5zYuue", + "value": 0 + }, + { + "id": "5dvq344JstkxUpHszaPfp", + "value": 0 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fanimales.webp?alt=media&token=de80d51b-647a-4860-9233-74b0925e053e" + }, + "text": "ANIMALES" + }, + { + "freq": 270, + "id": "ZgZoyOg5K-LscXdfl6kQG", + "relations": [ + { + "id": "tWxC4hR6di5zQC-Hujlev", + "value": 1 + }, + { + "id": "yo00Ci8bSRFYPU6HxGVwX", + "value": 1 + }, + { + "id": "ecUOs24Pp5ZTRt_ZvED5W", + "value": 1 + }, + { + "id": "xiaTdHGInqfm4rD6XzSeZ", + "value": 1 + }, + { + "id": "KK_i8H9qTfDVYZkQGwd2v", + "value": 1 + }, + { + "id": "KhyTKtiL4ZT4Z1saU1eJh", + "value": 1 + }, + { + "id": "UssSOEEKutvzB_B4fAQE-", + "value": 1 + }, + { + "id": "LmGq1AZs2a0x26r7E9GUj", + "value": 1 + }, + { + "id": "F8roVYxKZi88UUGfOvTwl", + "value": 1 + }, + { + "id": "XOoGN6huCjVHxH8hRFAw1", + "value": 1 + }, + { + "id": "aMs2YNnWkw4XN0gAm-jI3", + "value": 1 + }, + { + "id": "TIsM6aTTZ9W8j6UhW9Qqj", + "value": 1 + }, + { + "id": "eoYtISVZl3mdwoE_HW-Mv", + "value": 1 + }, + { + "id": "jBqD3qhhcrioLlCU-xq5b", + "value": 1 + }, + { + "id": "LksmOMPPOMArbrFsscqOW", + "value": 1 + }, + { + "id": "QJhkOh48xapiTObEDQLB9", + "value": 1 + }, + { + "id": "Q6LQqdLcvNOiCFjC0DVo2", + "value": 1 + }, + { + "id": "TAbuXSnSHU6C3CQ4kbKVh", + "value": 1 + }, + { + "id": "i2mlV3zGS6nrH2l6N2BlZ", + "value": 1 + }, + { + "id": "9s5zV3_oGyDx_NEvsKCxX", + "value": 1 + }, + { + "id": "Akf0xlH8UJdXn8BJzPV2A", + "value": 1 + }, + { + "id": "jBqD3qhhcrioLlCU-xq5b", + "value": 0 + }, + { + "id": "hT3Lrjn5-q7YIM1loG4MN", + "value": 0 + }, + { + "id": "7VL_MgnLDY6hi8sbvcGIg", + "value": 0 + }, + { + "id": "avzcTznCsQCISYJsLC-w_", + "value": 0 + }, + { + "id": "k7dZhQtwDPFlOk1iPjEOz", + "value": 0 + }, + { + "id": "KrOPANVpdkBWdEZoUwxKf", + "value": 0 + }, + { + "id": "qeJdrxKIIcUctIjo8wWhc", + "value": 0 + }, + { + "id": "Djs1QsLNf8Q5LBIFV5zNC", + "value": 0 + }, + { + "id": "t34TbvjJ3zG2jcgJaCeHa", + "value": 0 + }, + { + "id": "FBTheEQmZZfJRiYjd_Np_", + "value": 0 + }, + { + "id": "Hvb4JdDHX_vNMck_US2UN", + "value": 0 + }, + { + "id": "dnXsSOeVG7mq37uciIi2J", + "value": 0 + }, + { + "id": "EUsNyf5bDdSLqvZKH1Ltx", + "value": 0 + }, + { + "id": "N2baGNTOapSaFDo1GURiW", + "value": 0 + }, + { + "id": "ZBIFtTq-BH1jv5jLbzrhj", + "value": 0 + }, + { + "id": "JGm4BL7HAfuxX_PGe6Jzk", + "value": 0 + }, + { + "id": "U1KQsrvTa2E00-ugc-Iy6", + "value": 0 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fclase_musica.webp?alt=media&token=a7a2c34a-9c31-44ad-81d0-b1a4c443aa89" + }, + "text": "CLASE DE MÚSICA" + }, + { + "freq": 180, + "id": "_Cw7FcJSYiterkLSDJH8V", + "relations": [ + { + "id": "KK_i8H9qTfDVYZkQGwd2v", + "value": 1 + }, + { + "id": "tWxC4hR6di5zQC-Hujlev", + "value": 1 + }, + { + "id": "dLHDzm0rfgL-vXTx14HSm", + "value": 1 + }, + { + "id": "RkpoG4KB8m_TJFJf2v3EG", + "value": 1 + }, + { + "id": "xiaTdHGInqfm4rD6XzSeZ", + "value": 1 + }, + { + "id": "KhyTKtiL4ZT4Z1saU1eJh", + "value": 1 + }, + { + "id": "uFoytOG4qsXzBk979t63y", + "value": 1 + }, + { + "id": "aSzpwNza22HZp46Sh6wfx", + "value": 1 + }, + { + "id": "m39xTdgaenoi4mWGEa-Ew", + "value": 1 + }, + { + "id": "sDKIldL3tit328Joneo_7", + "value": 1 + }, + { + "id": "7WxUVoVQfQOzARU2bf6HP", + "value": 1 + }, + { + "id": "Pl-M4bc6k2rdhu6FHEbkA", + "value": 1 + }, + { + "id": "yR9FTtOimFwZG5g5tgpRk", + "value": 1 + }, + { + "id": "4rctwNiN4UaU9lqU48MHG", + "value": 1 + }, + { + "id": "Wu47Qs6Zupu1Ox2gUhkxn", + "value": 1 + }, + { + "id": "RbZetbSC5064rZccOFD1D", + "value": 1 + }, + { + "id": "Vioyf8EXJfY5t34NnN0WO", + "value": 1 + }, + { + "id": "phZ4F4uzi1TrhjeDMuMsn", + "value": 1 + }, + { + "id": "Akf0xlH8UJdXn8BJzPV2A", + "value": 1 + }, + { + "id": "MMzjhHID8HMqyPjii5o-h", + "value": 1 + }, + { + "id": "Wgh5iCzUmx4Je-B85-pra", + "value": 1 + }, + { + "id": "NVe4u7BTAVfLk3xkDqLnZ", + "value": 1 + }, + { + "id": "Z5-sBklfLIWE00CJ_T_ZK", + "value": 1 + }, + { + "id": "zcibOHpRbSmz1hVNSjPTj", + "value": 1 + }, + { + "id": "yqlmoVGItXqaeazw3M3eg", + "value": 1 + }, + { + "id": "JblWXW8TKDCuYu2yTnFBA", + "value": 1 + }, + { + "id": "jeO9YZ22LfSObUNhQDRAz", + "value": 0 + }, + { + "id": "HBZNu6m3FELU9eg3OeLdx", + "value": 0 + }, + { + "id": "ntzBlFkDMTKEUHoGNc65u", + "value": 0 + }, + { + "id": "lR84gCk8OM-oYoLAV7tar", + "value": 0 + }, + { + "id": "vOgqHjpHgrUGERIHtVqDe", + "value": 0 + }, + { + "id": "QVqSPPgA89whFTJ0HTphK", + "value": 0 + }, + { + "id": "6rcOXG6yxpzHLzMJ9IayI", + "value": 0 + }, + { + "id": "BqS7d4PMhGRqPYlZQzUbR", + "value": 0 + }, + { + "id": "vHzfvEgIkQ0e73ryfWP2F", + "value": 0 + }, + { + "id": "4X7OXm35OSHoSlPxGUi_f", + "value": 0 + }, + { + "id": "e5sCl246xFMESEfFy2PhX", + "value": 0 + }, + { + "id": "mJqzbxYeIDQciPkeHA1Ao", + "value": 0 + }, + { + "id": "aMs2YNnWkw4XN0gAm-jI3", + "value": 0 + }, + { + "id": "2t_eq1JmgHa0R3eu8LMmI", + "value": 0 + }, + { + "id": "zrR1DbO_szgKvxLyrZquw", + "value": 0 + }, + { + "id": "Q6nNH4AIoSeDHODC_Ip8O", + "value": 0 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_casa.webp?alt=media&token=f1d197b6-db37-44e6-b4bc-8ba31b0fa4aa" + }, + "text": "CASA" + }, + { + "freq": 140, + "id": "ah257x5jssDmLIOrcSGn6", + "relations": [ + { + "id": "_tDZtalMxKSNpWydJ1aeW", + "value": 0 + }, + { + "id": "xqGzZJIHBeVfSzRfm3rmg", + "value": 1 + }, + { + "id": "Y5HQq_4crSF2lpwH-KUrt", + "value": 2 + }, + { + "id": "ccGASDOGtty6GfQMEEBEU", + "value": 3 + }, + { + "id": "F90bXbc0tz9nuzTT7SgqV", + "value": 4 + }, + { + "id": "YIP0Xc4aJsfv0s8BpiQnn", + "value": 5 + }, + { + "id": "m0Fkio76HZHS2HguPOTn5", + "value": 6 + }, + { + "id": "4f1vqDoAvUu2XYk_JlQdC", + "value": 7 + }, + { + "id": "BjqWZnzLlxdOo4KEzZ46j", + "value": 8 + }, + { + "id": "AT_rDWsr6xRBgrvgw9Zih", + "value": 9 + }, + { + "id": "quE_RA9abVvtG-Fo4Jx8f", + "value": 10 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fnumeros.webp?alt=media&token=51f29b27-7998-4db5-bcad-ecc7979beea5" + }, + "text": "NÚMEROS" + }, + { + "freq": 150, + "id": "berI6X2_pAVCNOrcHAL6y", + "relations": [ + { + "id": "qsA1zm1DOlItK7DCWzAw8", + "value": 0 + }, + { + "id": "DSgrhLHauub-gBqMGwacO", + "value": 0 + }, + { + "id": "_CsJMxqGcNSaujXwRZcpu", + "value": 0 + }, + { + "id": "MqQgYn5B0uV-DMORCBOmV", + "value": 0 + }, + { + "id": "-LE2iv3Pwr5KuIyM5bYb3", + "value": 0 + }, + { + "id": "K8e2-KkvZfFOQaXnhR37x", + "value": 0 + }, + { + "id": "1Rv9-SSJjHptwvzqLbdbx", + "value": 0 + }, + { + "id": "xT4BPNmF-5WAQLfs3cUpS", + "value": 0 + }, + { + "id": "UvRS0KmtZn3dq7e8L5RcE", + "value": 0 + }, + { + "id": "32PnZjlnQbTJo4nL9YJYe", + "value": 0 + }, + { + "id": "YusWY8GwdO43bSp1o3BWC", + "value": 0 + }, + { + "id": "KNH4sLRpVKtHXQa-0y84K", + "value": 0 + }, + { + "id": "mRK--C5Q1aGe8MMPJJLYi", + "value": 0 + }, + { + "id": "s0BXoyn7AqUAlZ9BOHY6S", + "value": 0 + }, + { + "id": "wBLnDZStKj8YLkg2pTCfh", + "value": 0 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fsentimientos.webp?alt=media&token=90954fb0-bf68-48fe-8f12-d9dfc21963da" + }, + "text": "SENTIMIENTOS" + }, + { + "freq": 250, + "id": "ce2z_EeEG2nH0ZS4KVAkA", + "relations": [ + { + "id": "G09TvOzDSG5m3hTQD9Tej", + "value": 1 + }, + { + "id": "AOp6VGyjYIV0Ym9d0basJ", + "value": 1 + }, + { + "id": "LiBr37yi-YBgQDx4unjyc", + "value": 1 + }, + { + "id": "u8HfFvMPkogdWk-URj9hv", + "value": 1 + }, + { + "id": "WRzleD-mI84LaimFH8h6P", + "value": 1 + }, + { + "id": "PBqpK7LL1HQPwowPitrss", + "value": 1 + }, + { + "id": "ZR-NXJk3SD351W-95cf_T", + "value": 1 + }, + { + "id": "H2zMVtjvqi7aUtCypiVKr", + "value": 1 + }, + { + "id": "R9ECa_HQRtpFrb59ebMTQ", + "value": 1 + }, + { + "id": "Pl-M4bc6k2rdhu6FHEbkA", + "value": 1 + }, + { + "id": "Jjq8CM8JrYHIMziuQy-WN", + "value": 1 + }, + { + "id": "14aCIW665UZtuwNsKKV5s", + "value": 1 + }, + { + "id": "DXb0FpjVM9q8LVl9vvSHn", + "value": 1 + }, + { + "id": "4rctwNiN4UaU9lqU48MHG", + "value": 1 + }, + { + "id": "atVEXuftxSiDDj8rzUlFg", + "value": 1 + }, + { + "id": "irbOv2dHA7G969dnJMfJn", + "value": 1 + }, + { + "id": "v-E2GE1DpCkNAxsfA0f4M", + "value": 1 + }, + { + "id": "KC18_sTEqKucPQ-iwEKYY", + "value": 1 + }, + { + "id": "9mLx-YMK81AflitELQFqk", + "value": 1 + }, + { + "id": "LEVKlDlJ0wHo5QEjCNAGa", + "value": 1 + }, + { + "id": "JBU2hMw9gbIy9-wGF4mjD", + "value": 1 + }, + { + "id": "WWK2v56LM-zWqujabk9bM", + "value": 1 + }, + { + "id": "OwHzJdOQTFOA8daCVRwm6", + "value": 1 + }, + { + "id": "SOyGnJXLPeVRoZy3vBgpK", + "value": 0 + }, + { + "id": "CBTemIvgIN1UAtftkc3sz", + "value": 0 + }, + { + "id": "0Vkmy6BZcJn3pFurEevL9", + "value": 0 + }, + { + "id": "uzSwgQNnV8ZrjxpN5Bz_a", + "value": 0 + }, + { + "id": "eDX2HSkGaY2TeVwPjR07S", + "value": 0 + }, + { + "id": "EUsNyf5bDdSLqvZKH1Ltx", + "value": 0 + }, + { + "id": "N2baGNTOapSaFDo1GURiW", + "value": 0 + }, + { + "id": "ZBIFtTq-BH1jv5jLbzrhj", + "value": 0 + }, + { + "id": "U1KQsrvTa2E00-ugc-Iy6", + "value": 0 + }, + { + "id": "JGm4BL7HAfuxX_PGe6Jzk", + "value": 0 + }, + { + "id": "pv8eYkxczIevQqEGwDz6V", + "value": 0 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_escuela.webp?alt=media&token=05c5460c-c3a5-4404-9389-d6a67e79bb5d" + }, + "text": "COLEGIO" + }, + { + "freq": 60, + "id": "dQXaeM3Uul1yEvRwJ4w9t", + "relations": [ + { + "id": "k9ZpWM4oRb1q20c0qWCsg", + "value": 1 + }, + { + "id": "WasZ5bKZZy5Jt4Y-JipxS", + "value": 1 + }, + { + "id": "79xBF6cKgKeD4GeBPe_Ds", + "value": 1 + }, + { + "id": "yvtvSsBLhabkcpeYGbxQr", + "value": 1 + }, + { + "id": "d4zNoj2BAFG9B7J3KAlLE", + "value": 1 + }, + { + "id": "jfly9fZ3x1da4SGCCNcV2", + "value": 1 + }, + { + "id": "NQayjogCYiimP_0OxIfFj", + "value": 1 + }, + { + "id": "d_I8jNfbkQD0CHgZn7hyB", + "value": 1 + }, + { + "id": "XY6ZCNzeJIEzLtWJcufJm", + "value": 1 + }, + { + "id": "NVjfEut567uXpTaQUNI2i", + "value": 1 + }, + { + "id": "RZfMOtjw0DoGHWaRfCEc4", + "value": 1 + }, + { + "id": "g1TLUpuQX2Zs1ob9gqYui", + "value": 1 + }, + { + "id": "DkeHJFtqAS005fYUrl1Xz", + "value": 1 + }, + { + "id": "17AkRFlfC_koV-lywmDE8", + "value": 1 + }, + { + "id": "Uk1Emn5IovsTfFzpQX5Jw", + "value": 1 + }, + { + "id": "tGyUfSljuc7A5Do5B9GuN", + "value": 1 + }, + { + "id": "zi_wcT10fxgn72ZJhVx18", + "value": 1 + }, + { + "id": "nMQUtS-kFHViOKyop1FdS", + "value": 1 + }, + { + "id": "SiOmZdwX8Hf2nE2v6HfCp", + "value": 1 + }, + { + "id": "vPnmrsRou1ihosdVXS_Op", + "value": 1 + }, + { + "id": "oYwoiRDWlIjSTbYdC2vG6", + "value": 0 + }, + { + "id": "qWhpDTMd8eAEoq7yTKc57", + "value": 0 + }, + { + "id": "r7eJgCF_b_ktkztv4-oda", + "value": 0 + }, + { + "id": "1b71P9YjaNWnX8AWjstqG", + "value": 0 + }, + { + "id": "Pw3GgPwp7fpDVC6wJjgPn", + "value": 0 + }, + { + "id": "uMhOF9ZvWnjW-Zrjbjfhs", + "value": 0 + }, + { + "id": "OWLDc7Hn3neBAf_V_N27n", + "value": 0 + }, + { + "id": "F4cGnA_QHsVKTjUE6MAu9", + "value": 0 + }, + { + "id": "Ig1oypuwndODbmKh_NEXs", + "value": 0 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fropa.webp?alt=media&token=52aa7f5e-5b8e-4cf2-9e2b-451f9e06e042" + }, + "text": "VESTIMENTA" + }, + { + "freq": 340, + "id": "ejXQZAiYjrcSFGXb1pz7M", + "relations": [ + { + "id": "0THELgiQ7rvA-orESXJfV", + "value": 1 + }, + { + "id": "3932Zm0xgk1hKB2hhBAUa", + "value": 1 + }, + { + "id": "9U8MzceIsqKhG86oNx9zV", + "value": 1 + }, + { + "id": "Kn9vE07FK1LrzoD_YxrJD", + "value": 1 + }, + { + "id": "rBwDn3PcJGqytqnOZTJMV", + "value": 1 + }, + { + "id": "alsoa_V3wz3vPpG1TKRZc", + "value": 1 + }, + { + "id": "GoJuWnn72TCXONXKtYHMm", + "value": 0 + }, + { + "id": "9MzeUcz1nRqleTkmS_-g2", + "value": 0 + }, + { + "id": "P5zdq4x58yp5TA_soKQEJ", + "value": 0 + }, + { + "id": "WUt3I-NkdbqlSVcwuLfFx", + "value": 0 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ftransportes.webp?alt=media&token=94bd980f-eeed-4310-8fe7-09148e19612f" + }, + "text": "TRANSPORTE" + }, + { + "freq": 190, + "id": "gybgILOLxmIVfeQtb1f94", + "relations": [ + { + "id": "djgKI9embnk95PAtFcn45", + "value": 1 + }, + { + "id": "cj6OuVw4Nob8jxP-E4rZc", + "value": 1 + }, + { + "id": "TZF-7m8VKZ7IL6pyv0Daf", + "value": 1 + }, + { + "id": "hmhAUgqvGp7nc1w25sRSx", + "value": 1 + }, + { + "id": "LrDai7jXlGAdZ3e8ZQezj", + "value": 1 + }, + { + "id": "JDbBWMB5No0pK6HvntLt4", + "value": 1 + }, + { + "id": "bAoK85XLNb7p0ebevYZ6O", + "value": 1 + }, + { + "id": "NFgGqhEtl0HqipCGGEvwU", + "value": 1 + }, + { + "id": "OWLDc7Hn3neBAf_V_N27n", + "value": 1 + }, + { + "id": "xPUYlxRxgFVn1FHQFz6Ic", + "value": 1 + }, + { + "id": "-LE2iv3Pwr5KuIyM5bYb3", + "value": 1 + }, + { + "id": "QcGJ9u_JqmrW0X47PXWH4", + "value": 1 + }, + { + "id": "zm_6R89hr4wjuVkifiYrk", + "value": 1 + }, + { + "id": "5Tdy0Gu9SiLsPfWwd-Y2E", + "value": 1 + }, + { + "id": "1DjW-XvWN7iOqoJPRSWwY", + "value": 1 + }, + { + "id": "5i3kSsCKF7Oa9iJQvXiTe", + "value": 1 + }, + { + "id": "aSzpwNza22HZp46Sh6wfx", + "value": 1 + }, + { + "id": "uFoytOG4qsXzBk979t63y", + "value": 1 + }, + { + "id": "Yvxm8RGoFYKUsIXOl33yR", + "value": 0 + }, + { + "id": "NjulpZ9x63ZqxtLMoRjkx", + "value": 0 + }, + { + "id": "ntzBlFkDMTKEUHoGNc65u", + "value": 0 + }, + { + "id": "2HkB0WZYP7cvWLD39GMQj", + "value": 0 + }, + { + "id": "k41gkf6A_bDtQAJDOrWpP", + "value": 0 + }, + { + "id": "qscoBbrWu7tQbpNj9XUPt", + "value": 0 + }, + { + "id": "YbrNtdUmyMNdAF5CfvY1A", + "value": 0 + }, + { + "id": "x3PNiU1NIeQ3zQa31C8WX", + "value": 0 + }, + { + "id": "LjTGOcyG7DkTs1lJqNr8w", + "value": 0 + }, + { + "id": "NmNouLLx13jzE27jliI_v", + "value": 0 + }, + { + "id": "eGJ8MC1xPE6ueF82jCmVg", + "value": 0 + }, + { + "id": "1B1WmC-V0PglDeRAeINcT", + "value": 0 + }, + { + "id": "q7Pz4UqqZUlXeFfXrwXDR", + "value": 0 + }, + { + "id": "FO77qpzyz28knodNtILCA", + "value": 0 + }, + { + "id": "Pw3GgPwp7fpDVC6wJjgPn", + "value": 0 + }, + { + "id": "uMhOF9ZvWnjW-Zrjbjfhs", + "value": 0 + }, + { + "id": "qWhpDTMd8eAEoq7yTKc57", + "value": 0 + }, + { + "id": "NQayjogCYiimP_0OxIfFj", + "value": 0 + }, + { + "id": "kIn8SeGURyvu49EsRqDs7", + "value": 0 + }, + { + "id": "3VEnVjaGFCImBAZ3wEChu", + "value": 0 + }, + { + "id": "SE-71I_ahm3oKROReyJHE", + "value": 0 + }, + { + "id": "pM-bC77hbj-w44A0HFRDZ", + "value": 0 } - ] + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fhigiene_personal.webp?alt=media&token=d822b484-feb9-4a37-a9f0-ed53e9b3584f" + }, + "text": "LIBRO DE HIGIENE" }, { - "id": 33, - "texto": { - "en": "Greengrocery book", - "es": "LIBRO DE VERDULERíA" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Flibro_verduleria.webp?alt=media&token=533584e7-215a-4ab7-bc2f-aecf13c9c6c1" - }, - "relacion": [ + "freq": 330, + "id": "iHS1HpUBBadzgmbum_bdD", + "relations": [ { - "id": 5, - "frec": 1 + "id": "b1XpSC0ndnm0ZewNXC3pp", + "value": 0 }, { - "id": 7, - "frec": 1 + "id": "LmGq1AZs2a0x26r7E9GUj", + "value": 0 }, { - "id": 13, - "frec": 1 + "id": "9lS0mNuKIS0olyDwoIJBR", + "value": 0 }, { - "id": 22, - "frec": 1 + "id": "C2bgADoxmINRnAiYxZHqd", + "value": 0 }, { - "id": 69, - "frec": 1 + "id": "9dvSIpeXa2_12Jip6noJP", + "value": 0 }, { - "id": 391, - "frec": 1 + "id": "UkLF5sKtVKW0D8RzVCoue", + "value": 0 }, { - "id": 393, - "frec": 1 + "id": "W_f7h3qOLl2uEd_OYpMfQ", + "value": 0 }, { - "id": 399, - "frec": 1 + "id": "IF3R7tLVAkd4RbL8R07K9", + "value": 0 }, { - "id": 402, - "frec": 1 + "id": "L0hfYADgzghRVsZLZHRxE", + "value": 0 }, { - "id": 403, - "frec": 1 + "id": "hyUaYltGVJU-wRrAjhhPa", + "value": 0 }, { - "id": 404, - "frec": 1 + "id": "J4UUPR-WP0qo1y14bUVI-", + "value": 0 }, { - "id": 407, - "frec": 1 + "id": "lKA4b7I3iFkqNzPcAXyBc", + "value": 0 }, { - "id": 408, - "frec": 1 + "id": "F8roVYxKZi88UUGfOvTwl", + "value": 0 + } + ], + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/7795/7795_500.png" + }, + "text": "PROFESIONES Y OFICIOS" + }, + { + "freq": 220, + "id": "jatDsecioVAxRph-WOg4f", + "relations": [ + { + "id": "hmhAUgqvGp7nc1w25sRSx", + "value": 1 }, { - "id": 414, - "frec": 1 + "id": "HMPabuHqgtyiCmTLzg-rM", + "value": 1 }, { - "id": 413, - "frec": 1 + "id": "XeVaDdUWSEkhfJvTVvUHR", + "value": 1 }, { - "id": 428, - "frec": 1 + "id": "H2zMVtjvqi7aUtCypiVKr", + "value": 1 }, { - "id": 430, - "frec": 1 + "id": "PIPQnVS2UiS7kGbucJP8l", + "value": 1 }, { - "id": 432, - "frec": 1 + "id": "AQKGKdoX5CYycZ2YqBZVW", + "value": 1 }, { - "id": 435, - "frec": 1 + "id": "tYwEpd2EOtH8wEUr-jwHk", + "value": 1 }, { - "id": 447, - "frec": 1 + "id": "AWJXh6URGN0Vwm66i6IvL", + "value": 1 }, { - "id": 463, - "frec": 1 + "id": "cJMQi3SVmqvWJ00VxI6gy", + "value": 1 }, { - "id": 473, - "frec": 1 + "id": "Dm3yiKSB134LrjtW_KrO7", + "value": 1 }, { - "id": 474, - "frec": 1 + "id": "9UwpyOnOBoqr4mX3Juqm2", + "value": 1 }, { - "id": 475, - "frec": 1 + "id": "hKJhXxultsxm0TJl1P8-L", + "value": 1 }, { - "id": 478, - "frec": 1 + "id": "JZRBfIXBkeuobtDXbLt5t", + "value": 1 }, { - "id": 483, - "frec": 1 + "id": "ChBc7LjL8dgzZ6LUCAHGh", + "value": 1 }, { - "id": 507, - "frec": 1 - } - ] - }, - { - "id": 34, - "texto": { - "en": "Music lesson", - "es": "CLASE DE MúSICA" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fclase_musica.webp?alt=media&token=a7a2c34a-9c31-44ad-81d0-b1a4c443aa89" - }, - "relacion": [ + "id": "_1lOt0C0MQhvU8QWC6_oZ", + "value": 1 + }, { - "id": 3, - "frec": 1 + "id": "q22wRFF21EigV8YzQ_MfV", + "value": 1 }, { - "id": 6, - "frec": 1 + "id": "XA952Z60D0-cesNCVA-OX", + "value": 1 }, { - "id": 1, - "frec": 1 + "id": "ZnMba2r4XIg9lPi_H2d_Z", + "value": 1 }, { - "id": 17, - "frec": 1 + "id": "UQ5B5K-tpk1XmQC1B9TjQ", + "value": 1 }, { - "id": 2, - "frec": 1 + "id": "2CgcUkvJUskv982FvG54A", + "value": 1 }, { - "id": 20, - "frec": 1 + "id": "8iFdjRTQU7ONGnigRTlm8", + "value": 1 }, { - "id": 19, - "frec": 1 + "id": "xIgPo3N-aKXhVcjultMiY", + "value": 1 }, { - "id": 573, - "frec": 1 + "id": "9lS0mNuKIS0olyDwoIJBR", + "value": 1 }, { - "id": 627, - "frec": 1 + "id": "jtKc2q2n5an342ZkiMB9R", + "value": 1 }, { - "id": 626, - "frec": 1 + "id": "eWSI1NInbQowtO99phhGA", + "value": 1 }, { - "id": 850, - "frec": 1 + "id": "sAsTkky29uEVC9vo3Ofbo", + "value": 1 }, { - "id": 851, - "frec": 1 + "id": "ETZNYbrG5wveDl6c9k2_k", + "value": 1 }, { - "id": 853, - "frec": 1 + "id": "w4cVxbBDZjeNyHwpBARHQ", + "value": 1 }, { - "id": 855, - "frec": 1 + "id": "jTEb3A5ZEKEy2ojuq2vO_", + "value": 1 }, { - "id": 857, - "frec": 1 + "id": "54taab8z9ziXt0IqXHkV9", + "value": 1 }, { - "id": 860, - "frec": 1 + "id": "cI0JxwhkWU-YA7E7rmJtp", + "value": 1 }, { - "id": 865, - "frec": 1 + "id": "904w9Je6oDwGXUCIcrUZX", + "value": 1 }, { - "id": 870, - "frec": 1 + "id": "p1qK47wwLwF8S0Fy8-2Mt", + "value": 1 }, { - "id": 871, - "frec": 1 + "id": "8-4M30dTtmuUJus9MtGqV", + "value": 1 }, { - "id": 874, - "frec": 1 + "id": "sixdpB8hTOhlUr4loz3RB", + "value": 1 }, { - "id": 876, - "frec": 1 + "id": "yk2wDVqHEKKwupgm87OJ2", + "value": 1 }, { - "id": 1019, - "frec": 1 - } - ] - }, - { - "id": 35, - "texto": { - "en": "Art lesson", - "es": "CLASE DE PLáSTICA" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fclase_plastica.webp?alt=media&token=fb56f0bd-50d1-4a90-b32d-09e85ce95514" - }, - "relacion": [ + "id": "NLi5ODIzyMAwr2HpDXACp", + "value": 1 + }, + { + "id": "LDoi3cxodn_AVKSG-Bf_1", + "value": 1 + }, { - "id": 1, - "frec": 1 + "id": "INxOSvKbBNOXwruIpuNho", + "value": 1 }, { - "id": 5, - "frec": 1 + "id": "nQSk6_KCEVdO7oC_uxLXN", + "value": 1 }, { - "id": 7, - "frec": 1 + "id": "vmb_RMIB20QND6VcS0deY", + "value": 1 }, { - "id": 15, - "frec": 1 + "id": "mZFwH8xY_OeVDWCdvPZBy", + "value": 1 }, { - "id": 28, - "frec": 1 + "id": "UXJDiwb3j_zyfGa26ByJL", + "value": 1 }, { - "id": 95, - "frec": 1 + "id": "m17b6MazSk6M4gb51_cCy", + "value": 1 }, { - "id": 90, - "frec": 1 + "id": "amk4WRd1sNEIp24pnFw8j", + "value": 1 }, { - "id": 200, - "frec": 1 + "id": "Te_jJfeU8Xwa9St2RihBq", + "value": 1 }, { - "id": 626, - "frec": 1 + "id": "nUg2M7p5sUPlGdbBev2-G", + "value": 1 }, { - "id": 627, - "frec": 1 + "id": "3-ueUrnwmIIj0BMP8_Ntb", + "value": 1 }, { - "id": 733, - "frec": 1 + "id": "VwZ4EKSggYWxlnAbp-pNB", + "value": 1 }, { - "id": 734, - "frec": 1 + "id": "WNhpmD_XlTaNEBo7GsFXu", + "value": 1 }, { - "id": 736, - "frec": 1 + "id": "UnQJwWfWCe40DJYR1Er0o", + "value": 1 }, { - "id": 737, - "frec": 1 + "id": "H9SWPnWbR8qcZA-iu5Mz0", + "value": 1 }, { - "id": 738, - "frec": 1 + "id": "NFdUTit6Ff-4S7Nzf92U5", + "value": 1 }, { - "id": 739, - "frec": 1 + "id": "cTiw7_Yjxu_Kg90q7PdYl", + "value": 1 }, { - "id": 740, - "frec": 1 + "id": "YbvMRsCtMbww8OQgF45QF", + "value": 1 }, { - "id": 742, - "frec": 1 + "id": "dR72liRxC3qmoSa6Dz2a2", + "value": 1 }, { - "id": 743, - "frec": 1 + "id": "txj22hip0CE9qp_z-daIK", + "value": 1 }, { - "id": 744, - "frec": 1 + "id": "9ZnzbKMDwGEwC3hXOhXFe", + "value": 1 }, { - "id": 745, - "frec": 1 + "id": "jfvreGZv-e8rD4-01wZ5H", + "value": 1 }, { - "id": 746, - "frec": 1 + "id": "lrUuPKco_O8FXDuclzpKE", + "value": 0 }, { - "id": 747, - "frec": 1 + "id": "QllvOUe8utZrcBRGw_0vc", + "value": 0 }, { - "id": 748, - "frec": 1 + "id": "aC_XP9Ch5PqWoCmcJwI77", + "value": 0 }, { - "id": 749, - "frec": 1 + "id": "OUcfOOReAfQroBKlBdDb-", + "value": 0 }, { - "id": 750, - "frec": 1 + "id": "mFfylZ8yoLvtkVSDTlVEN", + "value": 0 }, { - "id": 756, - "frec": 1 + "id": "Ugs9V9c2c5iHrVC6p17zr", + "value": 0 }, { - "id": 754, - "frec": 1 + "id": "ubP5GM7_0vPkRc6zbD9Ez", + "value": 0 }, { - "id": 762, - "frec": 1 + "id": "zAmesi1FcIWLXE3WVa9WS", + "value": 0 }, { - "id": 766, - "frec": 1 + "id": "U7GiGcYacowWi4MWrCYyj", + "value": 0 }, { - "id": 769, - "frec": 1 + "id": "EO4O-s7oafi6QJdxTFNkd", + "value": 0 }, { - "id": 771, - "frec": 1 + "id": "Vmnu5eormo-_TOCgF4YzG", + "value": 0 } - ] - }, - { - "id": 36, - "texto": { - "en": "Lessons", - "es": "CLASES" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Flibro_clases.webp?alt=media&token=d0f51815-d6ec-4d98-972b-8a5e9fbe06e7" + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_farmacia.webp?alt=media&token=0e948284-58e5-4f44-8269-dd5a65ee6558" }, - "relacion": [] + "text": "LIBRO DE LA FARMACIA" }, { - "id": 37, - "texto": { - "en": "Football game", - "es": "FUTBOL" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_futbol.webp?alt=media&token=50db7655-7aff-4f93-9b68-875cc5706c7a" - }, - "relacion": [ + "freq": 370, + "id": "puOOrKWbYzH0B_8uGkxYX", + "relations": [ { - "id": 7, - "frec": 1 + "id": "AWJXh6URGN0Vwm66i6IvL", + "value": 11 }, { - "id": 8, - "frec": 1 + "id": "cJMQi3SVmqvWJ00VxI6gy", + "value": 3 }, { - "id": 2, - "frec": 1 + "id": "Dm3yiKSB134LrjtW_KrO7", + "value": 7 }, { - "id": 17, - "frec": 1 + "id": "9UwpyOnOBoqr4mX3Juqm2", + "value": 1 }, { - "id": 26, - "frec": 1 + "id": "_1lOt0C0MQhvU8QWC6_oZ", + "value": 1 }, { - "id": 34, - "frec": 1 + "id": "JZRBfIXBkeuobtDXbLt5t", + "value": 1 }, { - "id": 41, - "frec": 1 + "id": "ChBc7LjL8dgzZ6LUCAHGh", + "value": 1 }, { - "id": 70, - "frec": 1 + "id": "hKJhXxultsxm0TJl1P8-L", + "value": 1 }, { - "id": 85, - "frec": 1 + "id": "q22wRFF21EigV8YzQ_MfV", + "value": 1 }, { - "id": 119, - "frec": 1 + "id": "ZnMba2r4XIg9lPi_H2d_Z", + "value": 1 }, { - "id": 124, - "frec": 1 + "id": "UQ5B5K-tpk1XmQC1B9TjQ", + "value": 1 }, { - "id": 125, - "frec": 1 + "id": "dLHDzm0rfgL-vXTx14HSm", + "value": 1 }, { - "id": 161, - "frec": 1 + "id": "bVN3R44VuZDw3IdQMolca", + "value": 1 }, { - "id": 171, - "frec": 1 + "id": "RkpoG4KB8m_TJFJf2v3EG", + "value": 1 }, { - "id": 386, - "frec": 1 + "id": "ecUOs24Pp5ZTRt_ZvED5W", + "value": 1 }, { - "id": 377, - "frec": 11 + "id": "m3qTT8tiGZQheKIWREzMT", + "value": 1 }, { - "id": 388, - "frec": 1 + "id": "_3ihCSMQCokXNo8pXii-h", + "value": 1 }, { - "id": 389, - "frec": 1 + "id": "dNvN5P787hAPE7ZYNgwkw", + "value": 1 }, { - "id": 622, - "frec": 1 + "id": "H2zMVtjvqi7aUtCypiVKr", + "value": 1 }, { - "id": 620, - "frec": 1 + "id": "kaiWPbXxjHXlqcpBaBp4l", + "value": 1 }, { - "id": 651, - "frec": 1 + "id": "-2UbAou9ydr8XeN-jtIz4", + "value": 1 }, { - "id": 834, - "frec": 1 + "id": "M5q2CXmK0_WVaVUB_HJB3", + "value": 1 }, { - "id": 835, - "frec": 1 - } - ] - }, - { - "id": 38, - "texto": { - "en": "Movies", - "es": "CINE y PELíCULAS" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcine.webp?alt=media&token=4109bb74-ab3d-4cda-99fb-34e7030e8762" - }, - "relacion": [ + "id": "-LE2iv3Pwr5KuIyM5bYb3", + "value": 1 + }, { - "id": 1, - "frec": 1 + "id": "wnfSUkF8-tQiRTVou1_pd", + "value": 1 }, { - "id": 3, - "frec": 1 + "id": "1DjW-XvWN7iOqoJPRSWwY", + "value": 1 }, { - "id": 7, - "frec": 1 + "id": "D_4Weq7iyi7GMEsgP0xy6", + "value": 1 }, { - "id": 13, - "frec": 1 + "id": "Vjlet5P7XuqTrc22nt_Zz", + "value": 1 }, { - "id": 23, - "frec": 1 + "id": "xXtjQktuAq1bmxTc0HSQT", + "value": 1 }, { - "id": 30, - "frec": 1 + "id": "PfNLmlHKFT9d1w6IgeXbU", + "value": 1 }, { - "id": 544, - "frec": 1 + "id": "8iFdjRTQU7ONGnigRTlm8", + "value": 1 }, { - "id": 552, - "frec": 1 + "id": "xIgPo3N-aKXhVcjultMiY", + "value": 1 }, { - "id": 553, - "frec": 1 + "id": "00AkNJ4YLpbRD_mLmQjtp", + "value": 1 }, { - "id": 554, - "frec": 1 + "id": "SXz8iA1Qn_BlgLTAG6Epl", + "value": 1 }, { - "id": 557, - "frec": 1 + "id": "bw3rqHXD1TJ53xbNggEqH", + "value": 1 }, { - "id": 560, - "frec": 1 + "id": "VJ9AU_y7CqsONR6TvhdLh", + "value": 1 }, { - "id": 561, - "frec": 1 + "id": "JQOpcZSCPGMOWZsN8w_yb", + "value": 1 }, { - "id": 563, - "frec": 1 + "id": "0THELgiQ7rvA-orESXJfV", + "value": 1 }, { - "id": 564, - "frec": 1 + "id": "3932Zm0xgk1hKB2hhBAUa", + "value": 1 }, { - "id": 565, - "frec": 1 + "id": "9U8MzceIsqKhG86oNx9zV", + "value": 1 }, { - "id": 567, - "frec": 1 + "id": "Kn9vE07FK1LrzoD_YxrJD", + "value": 1 }, { - "id": 572, - "frec": 1 + "id": "rBwDn3PcJGqytqnOZTJMV", + "value": 1 }, { - "id": 573, - "frec": 1 + "id": "alsoa_V3wz3vPpG1TKRZc", + "value": 1 }, { - "id": 575, - "frec": 1 + "id": "0fcYcD_r0jNWXTTAx8Ph7", + "value": 1 }, { - "id": 580, - "frec": 1 + "id": "5L5UzBHOzuHRoO-jyPuEx", + "value": 1 }, { - "id": 583, - "frec": 1 + "id": "pptyFMhLrbC6lN6zmc7D0", + "value": 1 }, { - "id": 587, - "frec": 1 + "id": "iAqItRUQL_YpbMn2pgjsA", + "value": 1 }, { - "id": 602, - "frec": 1 + "id": "armmpopt2RLsVDlqLrQ94", + "value": 1 }, { - "id": 635, - "frec": 1 + "id": "GAxX7EIz1TTLtMX08RRGr", + "value": 1 }, { - "id": 638, - "frec": 1 + "id": "JBKQaBezKuSDaMsnbJMTB", + "value": 1 }, { - "id": 639, - "frec": 1 - } - ] - }, - { - "id": 39, - "texto": { - "en": "Pharmacy book", - "es": "LIBRO DE LA FARMACIA" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_farmacia.webp?alt=media&token=0e948284-58e5-4f44-8269-dd5a65ee6558" - }, - "relacion": [ + "id": "RbZetbSC5064rZccOFD1D", + "value": 1 + }, + { + "id": "YbrNtdUmyMNdAF5CfvY1A", + "value": 1 + }, + { + "id": "Akf0xlH8UJdXn8BJzPV2A", + "value": 1 + }, { - "id": 23, - "frec": 1 + "id": "kxuGlfYjS6puO2xD1QvxO", + "value": 0 }, { - "id": 76, - "frec": 1 + "id": "g75y4E53ViakV-s5UfnIF", + "value": 0 }, { - "id": 98, - "frec": 1 + "id": "vHzfvEgIkQ0e73ryfWP2F", + "value": 0 }, { - "id": 101, - "frec": 1 + "id": "xxr0MRGYRmmoNC_gsD9uy", + "value": 0 }, { - "id": 113, - "frec": 1 + "id": "BKmATW2uBk4pxnmOaARyq", + "value": 0 }, { - "id": 131, - "frec": 1 + "id": "8FFwIw7rJri79BITZBUzm", + "value": 0 }, { - "id": 138, - "frec": 1 + "id": "rgyV6CvFe98OGnWut6QCZ", + "value": 0 }, { - "id": 377, - "frec": 1 + "id": "zxhRDSHXtV63Sp3c2fjrI", + "value": 0 }, { - "id": 378, - "frec": 1 + "id": "GoJuWnn72TCXONXKtYHMm", + "value": 0 }, { - "id": 379, - "frec": 1 + "id": "1mS8kgJIod1cyUFH-msnM", + "value": 0 }, { - "id": 380, - "frec": 1 + "id": "G6KKVMvPDnjdD9TfBd-B9", + "value": 0 }, { - "id": 384, - "frec": 1 + "id": "FgTird367surh-vxXyAK6", + "value": 0 }, { - "id": 382, - "frec": 1 + "id": "uiVc5R86QCZkhraEFlrNz", + "value": 0 }, { - "id": 383, - "frec": 1 + "id": "hWWOw1gWjWwN7wQJkHrTu", + "value": 0 }, { - "id": 381, - "frec": 1 + "id": "CxFmyJYmy6gMRqP9U0cBP", + "value": 0 }, { - "id": 385, - "frec": 1 + "id": "7Q9sNljseWjwSPW4in1ga", + "value": 0 }, { - "id": 387, - "frec": 1 + "id": "Mw6WRebMAKWwXfAvDA7vu", + "value": 0 }, { - "id": 388, - "frec": 1 + "id": "81UJI7xOa5l9mVceqkIP5", + "value": 0 }, { - "id": 389, - "frec": 1 + "id": "Ig1oypuwndODbmKh_NEXs", + "value": 0 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Flibro_viaje.webp?alt=media&token=1f869b28-34f4-4d1d-8dc7-2edcb5276f16" + }, + "text": "LIBRO DE VIAJE" + }, + { + "freq": 30, + "id": "puda9fUGjqvm9oSM6CpTk", + "relations": [ + { + "id": "aP9QisUdxhgOKIQ2kHNb3", + "value": 0 }, { - "id": 567, - "frec": 1 + "id": "Ubaq6h7wasdP_YRombm2c", + "value": 0 }, { - "id": 587, - "frec": 1 + "id": "vZ9JaTnoj8C0ILYxMNB73", + "value": 0 }, { - "id": 588, - "frec": 1 + "id": "3arbCGI6fMOWALLanZcg3", + "value": 0 }, { - "id": 629, - "frec": 1 + "id": "qU5IvFLD8d16iIHSs_9TM", + "value": 0 }, { - "id": 708, - "frec": 1 + "id": "7Hz61-WzV62FHsedOwz6q", + "value": 0 }, { - "id": 777, - "frec": 1 + "id": "lKMW_xTZzCrCHRcGp-Z-n", + "value": 0 }, { - "id": 778, - "frec": 1 + "id": "C12mJ1W11fODI3pv1QOnx", + "value": 0 }, { - "id": 780, - "frec": 1 + "id": "I5AJgba5GTdEjdpFB-LBf", + "value": 0 }, { - "id": 784, - "frec": 1 + "id": "yxa6QVSrmWUKH2PZHKaVl", + "value": 0 }, { - "id": 783, - "frec": 1 + "id": "NaJxTPq9Ld8I4fwAltyEC", + "value": 0 }, { - "id": 782, - "frec": 1 + "id": "27GbVOZ-szdnzsy92oY-X", + "value": 0 }, { - "id": 781, - "frec": 1 + "id": "ff7ES190q1dmFYZ7lo6x0", + "value": 0 }, { - "id": 785, - "frec": 1 + "id": "Bebnh8-UWwtYLnK6p3fKi", + "value": 0 }, { - "id": 786, - "frec": 1 + "id": "wcpXeLMBRusfqfrz9s4mF", + "value": 0 }, { - "id": 787, - "frec": 1 + "id": "QvaMxPy-3iixHAJFyIrN-", + "value": 0 }, { - "id": 788, - "frec": 1 + "id": "px0jKQDj7r9pOYs4ZrvcT", + "value": 0 }, { - "id": 789, - "frec": 1 + "id": "n5bZClAB6jXAZnwxIwH-1", + "value": 0 }, { - "id": 790, - "frec": 1 + "id": "5VBtwEswIjrv1zbXP-oFn", + "value": 0 }, { - "id": 791, - "frec": 1 + "id": "l_ncJLRdVGBzzQc9yqBqs", + "value": 0 }, { - "id": 792, - "frec": 1 + "id": "rMFGfzFobfGsH3_qrLHXU", + "value": 0 }, { - "id": 793, - "frec": 1 + "id": "MNCcHiImRS8tmvhBhzCKj", + "value": 0 }, { - "id": 795, - "frec": 1 + "id": "pwltOTDn2OyABTlD4-27W", + "value": 0 }, { - "id": 799, - "frec": 1 + "id": "MEqo2TROHyroK318sm84f", + "value": 0 }, { - "id": 797, - "frec": 1 + "id": "jmzg4EiC7JEHwe9gNP3C3", + "value": 0 }, { - "id": 800, - "frec": 1 + "id": "8MV4ZFthtUeoxLAIbqGTc", + "value": 0 }, { - "id": 802, - "frec": 1 + "id": "upWXctTSKBtFNSXnXDK_u", + "value": 0 }, { - "id": 804, - "frec": 1 + "id": "JawnUo-pseWb3FDVMtxrQ", + "value": 0 }, { - "id": 807, - "frec": 1 + "id": "o0oxaoUFpOLiGsoQBlalI", + "value": 0 }, { - "id": 809, - "frec": 1 + "id": "DBd09yUlbkaYLsemjFXEs", + "value": 0 }, { - "id": 819, - "frec": 1 + "id": "5LYjhk-N87Ov9NrQcGbLQ", + "value": 0 }, { - "id": 820, - "frec": 1 + "id": "-GL2iAgykP10Ae3AKsVOX", + "value": 0 }, { - "id": 821, - "frec": 1 + "id": "vq3T-UQGTjX3Z9TlEF12e", + "value": 0 }, { - "id": 822, - "frec": 1 + "id": "bge6qR6NzsD5Vk4ifPsSO", + "value": 0 }, { - "id": 823, - "frec": 1 + "id": "pHBnmCFpM7oZf0O78CBIz", + "value": 0 }, { - "id": 824, - "frec": 1 + "id": "jhJ2TOfdaRAcVeHGOjwua", + "value": 0 }, { - "id": 825, - "frec": 1 + "id": "kN85Lb_C4dLnww7sz1afK", + "value": 0 }, { - "id": 826, - "frec": 1 + "id": "75gujwNXJdAiNmK6Ffhia", + "value": 0 }, { - "id": 827, - "frec": 1 + "id": "D_4Weq7iyi7GMEsgP0xy6", + "value": 0 }, { - "id": 828, - "frec": 1 + "id": "Vjlet5P7XuqTrc22nt_Zz", + "value": 0 }, { - "id": 829, - "frec": 1 + "id": "xXtjQktuAq1bmxTc0HSQT", + "value": 0 }, { - "id": 831, - "frec": 1 + "id": "L6YLAEsbYcTq-ycQJTvt4", + "value": 0 }, { - "id": 878, - "frec": 1 + "id": "UwvZVcX_CAQFrI6U4LsNT", + "value": 0 }, { - "id": 881, - "frec": 1 + "id": "FnCBoLSE19WsbUypUKvFc", + "value": 0 }, { - "id": 882, - "frec": 1 + "id": "OeA63q6LpqGvXW-cJXEym", + "value": 0 }, { - "id": 884, - "frec": 1 + "id": "4J1bWl6BbbEdZsRGsgYH2", + "value": 0 }, { - "id": 885, - "frec": 1 + "id": "10X4OKR5xmNhSj86sbyE_", + "value": 0 }, { - "id": 886, - "frec": 1 + "id": "rtHwq5WN9KElX3V3SKBmS", + "value": 0 }, { - "id": 887, - "frec": 1 - } - ] - }, - { - "id": 40, - "texto": { - "en": "Swimming", - "es": "LIBRO DE NATACIóN" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fnatacion.webp?alt=media&token=f4e987c5-4a65-4499-bf95-ec775a6f17e6" - }, - "relacion": [ + "id": "O450x4W3OOacvJIy4QicJ", + "value": 0 + }, + { + "id": "J3rDL96c2zfBQzP45VRCp", + "value": 0 + }, + { + "id": "4A_FNkGH1EDu0oabPurrL", + "value": 0 + }, { - "id": 1, - "frec": 1 + "id": "TS9z8ZmMEwn0MGSfr9amH", + "value": 0 }, { - "id": 7, - "frec": 1 + "id": "-msU3yor4qJYQHJtWrdk8", + "value": 0 }, { - "id": 10, - "frec": 1 + "id": "Njz8DrErsexBu8mAI6mnr", + "value": 0 }, { - "id": 86, - "frec": 1 + "id": "EVmt43vDI3NHFfbbkqokF", + "value": 0 }, { - "id": 88, - "frec": 1 + "id": "uYElWOlSOSoQap-d5gsYF", + "value": 0 } - ] + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcomidas.webp?alt=media&token=9e4bc673-e0d9-4e75-bb78-ea9b0dd294e2" + }, + "text": "ALIMENTOS" }, { - "id": -1895165, - "texto": { - "en": "breakfast", - "es": "desayuno" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_desayuno.webp?alt=media&token=25948a6f-b4bd-4958-ad10-3ea868660416" - }, - "relacion": [ - { - "id": 484, - "texto": { - "en": "yoghurt", - "es": "yogur" - }, - "tipo": 2, - "imagen": { - "picto": "zid_yogurt" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 393, - "texto": { - "en": "almond", - "es": "almendras" - }, - "tipo": 2, - "imagen": { - "picto": "almendras" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 396, - "texto": { - "en": "sugar", - "es": "azúcar" - }, - "tipo": 2, - "imagen": { - "picto": "azucar" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 401, - "texto": { - "en": "cappchino", - "es": "capuchino" - }, - "tipo": 2, - "imagen": { - "picto": "capuchino" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 415, - "texto": { - "en": "cookie", - "es": "galleta" - }, - "tipo": 2, - "imagen": { - "picto": "galletas" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 427, - "texto": { - "en": "milk and cookies", - "es": "leche y galletas" - }, - "tipo": 2, - "imagen": { - "picto": "leche_y_galletas" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 426, - "texto": { - "en": "choclote milk", - "es": "leche con cacáo" - }, - "tipo": 2, - "imagen": { - "picto": "leche_con_cacao" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 431, - "texto": { - "en": "butter", - "es": "manteca" - }, - "tipo": 2, - "imagen": { - "picto": "manteca" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 435, - "texto": { - "en": "orange", - "es": "naranja" - }, - "tipo": 2, - "imagen": { - "picto": "naranja" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 438, - "texto": { - "en": "white bread", - "es": "pan blanco" - }, - "tipo": 2, - "imagen": { - "picto": "pan_blanco" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 439, - "texto": { - "en": "black bread", - "es": "pan negro" - }, - "tipo": 2, - "imagen": { - "picto": "pan_negro" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 521, - "texto": { - "en": "cheese", - "es": "queso" - }, - "tipo": 2, - "imagen": { - "picto": "queso" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 465, - "texto": { - "en": "toast", - "es": "tostada" - }, - "tipo": 2, - "imagen": { - "picto": "tostada" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 468, - "texto": { - "en": "apple juice", - "es": "jugo de manzana" - }, - "tipo": 2, - "imagen": { - "picto": "zumo_de_manzana" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 469, - "texto": { - "en": "peach juice", - "es": "jugo de durazno" - }, - "tipo": 2, - "imagen": { - "picto": "melocoton" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 471, - "texto": { - "en": "grape juice", - "es": "jugo de uva" - }, - "tipo": 2, - "imagen": { - "picto": "zumo_de_uva" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 473, - "texto": { - "en": "banana", - "es": "banana" - }, - "tipo": 2, - "imagen": { - "picto": "banana" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 474, - "texto": { - "en": "apple", - "es": "manzana" - }, - "tipo": 2, - "imagen": { - "picto": "manzana" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 483, - "texto": { - "en": "fruit", - "es": "fruta" - }, - "tipo": 2, - "imagen": { - "picto": "zid_fruta" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 495, - "texto": { - "en": "milk", - "es": "leche" - }, - "tipo": 2, - "imagen": { - "picto": "leche" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 499, - "texto": { - "en": "te", - "es": "té" - }, - "tipo": 2, - "imagen": { - "picto": "te" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 498, - "texto": { - "en": "chocolate", - "es": "chocolate" - }, - "tipo": 2, - "imagen": { - "picto": "chocolate" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 496, - "texto": { - "en": "coffee", - "es": "café" - }, - "tipo": 2, - "imagen": { - "picto": "cafe" - }, - "relacion": [], - "agenda": 0, - "gps": 0 + "freq": 290, + "id": "rH7zhJzNVIcEIRyvaYLoi", + "relations": [ + { + "id": "bVN3R44VuZDw3IdQMolca", + "value": 1 + }, + { + "id": "RkpoG4KB8m_TJFJf2v3EG", + "value": 1 + }, + { + "id": "KK_i8H9qTfDVYZkQGwd2v", + "value": 1 + }, + { + "id": "xiaTdHGInqfm4rD6XzSeZ", + "value": 1 + }, + { + "id": "hXgGhazQ_nA5uqpRD6Qwq", + "value": 1 + }, + { + "id": "curstMeuThu2KUph-8rkB", + "value": 1 + }, + { + "id": "5kjlzqb9Rf3zzqZROaZ9p", + "value": 1 + }, + { + "id": "qn-7ERrcZxJTqfW6hwNs8", + "value": 1 + }, + { + "id": "1B1WmC-V0PglDeRAeINcT", + "value": 1 + }, + { + "id": "qsA1zm1DOlItK7DCWzAw8", + "value": 1 + }, + { + "id": "_CsJMxqGcNSaujXwRZcpu", + "value": 1 + }, + { + "id": "MqQgYn5B0uV-DMORCBOmV", + "value": 1 + }, + { + "id": "1Rv9-SSJjHptwvzqLbdbx", + "value": 1 + }, + { + "id": "32PnZjlnQbTJo4nL9YJYe", + "value": 1 + }, + { + "id": "0cdYDZ5HPaTmqTTN0_Ee8", + "value": 1 + }, + { + "id": "9dvSIpeXa2_12Jip6noJP", + "value": 1 + }, + { + "id": "0jpMJu8isUmOZKxhZ_yaj", + "value": 1 + }, + { + "id": "XYY8SV1IAMHjdGjMZxbdy", + "value": 1 + }, + { + "id": "1IjenNwPwsMIWZ4aYBk8S", + "value": 1 } ], - "frecuencia": 1, - "tags": [ - "MANANA" - ] + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_futbol.webp?alt=media&token=50db7655-7aff-4f93-9b68-875cc5706c7a" + }, + "text": "DEPORTES" }, { - "id": 533264, - "texto": { - "en": "lunch", - "es": "almuerzo" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_almuerzo.webp?alt=media&token=b7acb5a2-b170-4c2b-a5b6-341d19db3632" - }, - "relacion": [ + "freq": 210, + "id": "uv4tWMRHfewaEQ_pH0dnV", + "relations": [ + { + "id": "AWJXh6URGN0Vwm66i6IvL", + "value": 11 + }, + { + "id": "cJMQi3SVmqvWJ00VxI6gy", + "value": 3 + }, + { + "id": "Dm3yiKSB134LrjtW_KrO7", + "value": 7 + }, + { + "id": "9UwpyOnOBoqr4mX3Juqm2", + "value": 1 + }, + { + "id": "_1lOt0C0MQhvU8QWC6_oZ", + "value": 1 + }, + { + "id": "JZRBfIXBkeuobtDXbLt5t", + "value": 1 + }, { - "id": 391, - "frec": 1 + "id": "ChBc7LjL8dgzZ6LUCAHGh", + "value": 1 }, { - "id": 398, - "frec": 1 + "id": "hKJhXxultsxm0TJl1P8-L", + "value": 1 }, { - "id": 399, - "frec": 1 + "id": "q22wRFF21EigV8YzQ_MfV", + "value": 1 }, { - "id": 400, - "frec": 1 + "id": "ZnMba2r4XIg9lPi_H2d_Z", + "value": 1 }, { - "id": 403, - "frec": 1 + "id": "UQ5B5K-tpk1XmQC1B9TjQ", + "value": 1 }, { - "id": 420, - "frec": 1 + "id": "lXH68vGIuZdfA8xVrS8iw", + "value": 1 }, { - "id": 424, - "frec": 1 + "id": "2Vc2H462cutVtUC-5omJk", + "value": 1 }, { - "id": 421, - "frec": 1 + "id": "1DjW-XvWN7iOqoJPRSWwY", + "value": 1 }, { - "id": 428, - "frec": 1 + "id": "-LE2iv3Pwr5KuIyM5bYb3", + "value": 1 }, { - "id": 449, - "frec": 1 + "id": "m3qTT8tiGZQheKIWREzMT", + "value": 1 }, { - "id": 458, - "frec": 1 + "id": "_3ihCSMQCokXNo8pXii-h", + "value": 1 }, { - "id": 462, - "frec": 1 + "id": "PIPQnVS2UiS7kGbucJP8l", + "value": 1 }, { - "id": 463, - "frec": 1 + "id": "-2UbAou9ydr8XeN-jtIz4", + "value": 1 }, { - "id": 472, - "frec": 1 + "id": "9GqE148SFZqMIft4evAk2", + "value": 1 }, { - "id": 476, - "frec": 1 + "id": "t34TbvjJ3zG2jcgJaCeHa", + "value": 1 }, { - "id": 477, - "frec": 1 + "id": "H2zMVtjvqi7aUtCypiVKr", + "value": 1 }, { - "id": 478, - "frec": 1 + "id": "3w62N9b7Cvb6JMjB9Wphi", + "value": 1 }, { - "id": 480, - "frec": 1 + "id": "sSTGRl6DpYGZXp8vtTNbm", + "value": 1 }, { - "id": 482, - "frec": 1 + "id": "8vR0HYniXtrrQqqSIN_JQ", + "value": 1 }, { - "id": 481, - "frec": 1 + "id": "9lS0mNuKIS0olyDwoIJBR", + "value": 1 }, { - "id": 489, - "frec": 1 + "id": "iowxE4MxcV6PR2Uhtvxqs", + "value": 1 }, { - "id": 490, - "frec": 1 + "id": "VwZ4EKSggYWxlnAbp-pNB", + "value": 1 }, { - "id": 492, - "frec": 1 + "id": "WNhpmD_XlTaNEBo7GsFXu", + "value": 1 }, { - "id": 504, - "frec": 1 + "id": "UnQJwWfWCe40DJYR1Er0o", + "value": 1 }, { - "id": 503, - "frec": 1 + "id": "H9SWPnWbR8qcZA-iu5Mz0", + "value": 1 }, { - "id": 502, - "frec": 1 + "id": "NFdUTit6Ff-4S7Nzf92U5", + "value": 1 }, { - "id": 501, - "frec": 1 + "id": "cTiw7_Yjxu_Kg90q7PdYl", + "value": 1 }, { - "id": 505, - "frec": 1 + "id": "YbvMRsCtMbww8OQgF45QF", + "value": 1 }, { - "id": 507, - "frec": 1 + "id": "dR72liRxC3qmoSa6Dz2a2", + "value": 1 }, { - "id": 512, - "frec": 1 + "id": "txj22hip0CE9qp_z-daIK", + "value": 1 }, { - "id": 510, - "frec": 1 + "id": "9ZnzbKMDwGEwC3hXOhXFe", + "value": 1 }, { - "id": 515, - "frec": 1 + "id": "jfvreGZv-e8rD4-01wZ5H", + "value": 1 }, { - "id": 516, - "frec": 1 + "id": "DG1RiDjDfwWRhpAiIpPqA", + "value": 0 }, { - "id": 517, - "frec": 1 + "id": "Te_jJfeU8Xwa9St2RihBq", + "value": 0 }, { - "id": 524, - "frec": 1 + "id": "otTWzTaTAmweNCozT8tn9", + "value": 0 }, { - "id": 394, - "frec": 1 + "id": "ijn-QwQuTxRFFVe-7WlSX", + "value": 0 }, { - "id": 404, - "frec": 1 + "id": "HKfLJS8aCBtKuKJeSBQUW", + "value": 0 }, { - "id": 407, - "frec": 1 + "id": "y5W21CKOkLWnYJo1OC700", + "value": 0 }, { - "id": 408, - "frec": 1 + "id": "8-4M30dTtmuUJus9MtGqV", + "value": 0 }, { - "id": 412, - "frec": 1 + "id": "_FNTsoEjTMV3Uas-gggi2", + "value": 0 }, { - "id": 414, - "frec": 1 + "id": "VUJ-zrdsyL9MOuFbdMCAx", + "value": 0 }, { - "id": 413, - "frec": 1 + "id": "QclUM2p3iexSjFZI8OU4-", + "value": 0 }, { - "id": 417, - "frec": 1 + "id": "qA4v2JWQU0zzBBZgvW7Vt", + "value": 0 }, { - "id": 432, - "frec": 1 + "id": "N2baGNTOapSaFDo1GURiW", + "value": 0 }, { - "id": 435, - "frec": 1 + "id": "Gm_qAGnL4OawmlYmTs7K5", + "value": 0 }, { - "id": 447, - "frec": 1 + "id": "sc0hr3jQ80yXRFDlAn56V", + "value": 0 }, { - "id": 475, - "frec": 1 + "id": "-LwAKwgCdVkzwM579zRMo", + "value": 0 }, { - "id": 474, - "frec": 1 + "id": "APXF-lEplPOloppSeIjAY", + "value": 0 }, { - "id": 483, - "frec": 1 + "id": "lXH68vGIuZdfA8xVrS8iw", + "value": 0 }, { - "id": 486, - "frec": 1 + "id": "0Z7uFXpp-XRXmqM8ILhIC", + "value": 0 }, { - "id": 494, - "frec": 1 + "id": "5i3kSsCKF7Oa9iJQvXiTe", + "value": 0 } ], - "tags": [ - "MEDIODIA" - ] + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Flibro_salud.webp?alt=media&token=c7b4bf4a-38b5-4b09-ac7d-30299ef09d86" + }, + "text": "LIBRO DE LA SALUD" }, { - "id": 1377957, - "texto": { - "en": "snack", - "es": "merienda" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_merienda.webp?alt=media&token=93022501-e9f5-412a-aee4-1599f3d80543" + "freq": 380, + "id": "wAhDHMrZ850dHTwgAXrMY", + "relations": [ + { + "id": "ujyHgmlPIs7UdtndbYd8S", + "value": 1 + }, + { + "id": "JEDIYq1BDA23ac9TNhON-", + "value": 1 + }, + { + "id": "QnlQ1HOEB9yNjuW3Dd6fc", + "value": 1 + }, + { + "id": "X3u4pXTWKcGc43lOkgSBt", + "value": 1 + }, + { + "id": "zdFC3vpgjcyUWB9a4ghRW", + "value": 1 + }, + { + "id": "jtKc2q2n5an342ZkiMB9R", + "value": 1 + }, + { + "id": "F7kJ8VM31BWB4K4T4USzs", + "value": 1 + }, + { + "id": "MKR-ukiUlJy4uuqO30UU6", + "value": 1 + }, + { + "id": "QTkFHWp9KEDgfCjoQjBY2", + "value": 1 + }, + { + "id": "JVtu9W3AumOwjUedwhUGE", + "value": 1 + }, + { + "id": "93YmZA7VfAT7TTNTsDE1W", + "value": 1 + }, + { + "id": "OblxxVFC-LKPq-8oC9FpE", + "value": 1 + }, + { + "id": "ZQEXAf10BkoTvCJx3Ox39", + "value": 1 + }, + { + "id": "2KO0BFtB4B6fu1feuAZLt", + "value": 1 + }, + { + "id": "8fGingRAd8idw4qcxyZ-Q", + "value": 1 + }, + { + "id": "g2MhHawoIC9oFNEv5_w63", + "value": 1 + }, + { + "id": "yR9FTtOimFwZG5g5tgpRk", + "value": 1 + }, + { + "id": "_WIT6qs1kaiJqB1Ild5Xs", + "value": 1 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fconceptos.webp?alt=media&token=544d07e2-680b-427f-a657-9a1438529627" }, - "relacion": [ + "text": "CONCEPTOS" + }, + { + "freq": 50, + "id": "xjfPlDs-AcFV9LCyY-v9j", + "relations": [ + { + "id": "BNjZz9MGLJEKZ4CZoTs2M", + "value": 1 + }, + { + "id": "vKGLQIas9RdBnPGsaYtr2", + "value": 1 + }, + { + "id": "miPmA2tOQiLxOW7D_V_x6", + "value": 1 + }, + { + "id": "3KbwCHGooNLySWOBlFFuG", + "value": 1 + }, + { + "id": "8cOIYr-hcK54qWpuT-41e", + "value": 1 + }, + { + "id": "D2tSkngqbQmdKLNhn9xWV", + "value": 1 + }, + { + "id": "dgm3NCKuz7L39PX8LYxj7", + "value": 1 + }, { - "id": 393, - "frec": 1 + "id": "yNag8CK0wV_iRMnFznsXk", + "value": 1 }, { - "id": 396, - "frec": 1 + "id": "YeT-jstVSA7-mD9t99Isg", + "value": 1 }, { - "id": 401, - "frec": 1 + "id": "8LddDqylw-51wHhx9_Qad", + "value": 1 }, { - "id": 415, - "frec": 1 + "id": "Akf0xlH8UJdXn8BJzPV2A", + "value": 1 }, { - "id": 426, - "frec": 1 + "id": "oa-MShota2L8n2pU8hIsm", + "value": 0 }, { - "id": 427, - "frec": 1 + "id": "r808IO3I6j3os_uix6O63", + "value": 0 }, { - "id": 431, - "frec": 1 + "id": "JSFuEHlP-CFvuqvFKMumC", + "value": 0 }, { - "id": 439, - "frec": 1 + "id": "9lS0mNuKIS0olyDwoIJBR", + "value": 0 }, { - "id": 438, - "frec": 1 + "id": "Q9Ra0aJaQnOJQ1Kqdc43-", + "value": 0 }, { - "id": 465, - "frec": 1 + "id": "0huLn-H32Cbwba28IZ3tc", + "value": 0 }, { - "id": 468, - "frec": 1 + "id": "PszHdOxMsS_tAzSrN52Wa", + "value": 0 }, { - "id": 469, - "frec": 1 + "id": "OHyrmD5US1rHEAEwLQaII", + "value": 0 }, { - "id": 471, - "frec": 1 + "id": "ByrvXHEN9Mb8D--7MQAjM", + "value": 0 }, { - "id": 483, - "frec": 1 + "id": "q6F-qJ7mTxvwa43F6vwun", + "value": 0 }, { - "id": 484, - "frec": 1 + "id": "1QEfLU_S7TM0iMr9VZVtP", + "value": 0 }, { - "id": 485, - "frec": 1 + "id": "LksmOMPPOMArbrFsscqOW", + "value": 0 }, { - "id": 496, - "frec": 1 + "id": "jBqD3qhhcrioLlCU-xq5b", + "value": 0 }, { - "id": 495, - "frec": 1 + "id": "Ra2rxEEohwxRqDsW2AT3C", + "value": 0 }, { - "id": 497, - "frec": 1 + "id": "sixdpB8hTOhlUr4loz3RB", + "value": 0 }, { - "id": 498, - "frec": 1 + "id": "wCGb6D4xSVr4UeKXzGIlP", + "value": 0 }, { - "id": 499, - "frec": 1 + "id": "fL_4POdbPVL9-lvQVWSqY", + "value": 0 }, { - "id": 521, - "frec": 1 + "id": "y0SViQxW8Y-yiX1Z7gXWt", + "value": 0 + }, + { + "id": "OdCdTUAlbN6kvsPjby_Bi", + "value": 0 + }, + { + "id": "OeytAsSiEAWC10tXhxbTa", + "value": 0 } ], - "tags": [ - "TARDE" - ] + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fjuguetes.webp?alt=media&token=046c8f8b-7518-4aac-9c56-6ac6fe4a03ef" + }, + "text": "JUEGOS Y JUGUETES" }, { - "id": 1624279, - "texto": { - "en": "Dinner", - "es": "cena" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_cena.webp?alt=media&token=768a1465-9bb2-4f45-895a-29fa7da05086" - }, - "relacion": [ + "freq": 90, + "id": "y545pM8pvB3WgukIac6NT", + "relations": [ + { + "id": "1YOlJCovdcnnqVihqHVmq", + "value": 1 + }, + { + "id": "0fcYcD_r0jNWXTTAx8Ph7", + "value": 1 + }, + { + "id": "fkNwVm56PSe-qh-QoM0vm", + "value": 1 + }, + { + "id": "JBKQaBezKuSDaMsnbJMTB", + "value": 1 + }, + { + "id": "_lU200bb9Sjv0b_iJKgU2", + "value": 1 + }, + { + "id": "XYY8SV1IAMHjdGjMZxbdy", + "value": 1 + }, + { + "id": "7WxUVoVQfQOzARU2bf6HP", + "value": 1 + }, + { + "id": "5L5UzBHOzuHRoO-jyPuEx", + "value": 1 + }, + { + "id": "pptyFMhLrbC6lN6zmc7D0", + "value": 1 + }, + { + "id": "_S9Eck14cdOTr0QH4i7sQ", + "value": 1 + }, + { + "id": "fUUj_4pKPflmJlxZfk0cX", + "value": 1 + }, + { + "id": "R9ECa_HQRtpFrb59ebMTQ", + "value": 1 + }, + { + "id": "GAxX7EIz1TTLtMX08RRGr", + "value": 1 + }, + { + "id": "iowxE4MxcV6PR2Uhtvxqs", + "value": 1 + }, + { + "id": "p_qpVEd677b2Bk56yhvj6", + "value": 1 + }, + { + "id": "LNBTW0qQtHYQEHatkWGtc", + "value": 1 + }, + { + "id": "Pl-M4bc6k2rdhu6FHEbkA", + "value": 1 + }, + { + "id": "iAqItRUQL_YpbMn2pgjsA", + "value": 1 + }, + { + "id": "sPtazVgymXESdS-BcHqU_", + "value": 1 + }, + { + "id": "fjCOcN-PKP6F07IZcI71X", + "value": 1 + }, + { + "id": "armmpopt2RLsVDlqLrQ94", + "value": 1 + }, + { + "id": "Zm4OIanIKTigDGIsInO7o", + "value": 1 + }, + { + "id": "DXpjgLKTdx9eLLohVdmWM", + "value": 1 + }, + { + "id": "m3qTT8tiGZQheKIWREzMT", + "value": 0 + }, + { + "id": "86gNdF6aTepa0Y9zkD1VQ", + "value": 0 + }, { - "id": 391, - "frec": 0 + "id": "G6KKVMvPDnjdD9TfBd-B9", + "value": 0 }, { - "id": 394, - "frec": 1 + "id": "0_SK41wNOk6mw2qX_eHXM", + "value": 0 }, { - "id": 398, - "frec": 1 + "id": "1mS8kgJIod1cyUFH-msnM", + "value": 0 }, { - "id": 399, - "frec": 1 + "id": "_2SjbH-xHZq173EU4J65c", + "value": 0 }, { - "id": 400, - "frec": 1 + "id": "ak5fBauJzapC4JIf0lT8N", + "value": 0 }, { - "id": 404, - "frec": 1 + "id": "gFEnqFhYoXF7QN-n0ONad", + "value": 0 }, { - "id": 403, - "frec": 1 + "id": "XYY8SV1IAMHjdGjMZxbdy", + "value": 0 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Flugares.webp?alt=media&token=fa4c9b84-7f78-49d3-8fe7-b67335365b94" + }, + "text": "LUGARES" + }, + { + "freq": 240, + "id": "zwf7qmSEi7PBwsNaqciA-", + "relations": [ + { + "id": "dLHDzm0rfgL-vXTx14HSm", + "value": 1 }, { - "id": 407, - "frec": 1 + "id": "sSTGRl6DpYGZXp8vtTNbm", + "value": 1 }, { - "id": 408, - "frec": 1 + "id": "hmhAUgqvGp7nc1w25sRSx", + "value": 1 }, { - "id": 412, - "frec": 1 + "id": "m3qTT8tiGZQheKIWREzMT", + "value": 1 }, { - "id": 414, - "frec": 1 + "id": "tYwEpd2EOtH8wEUr-jwHk", + "value": 1 }, { - "id": 413, - "frec": 1 + "id": "AQKGKdoX5CYycZ2YqBZVW", + "value": 1 }, { - "id": 420, - "frec": 1 + "id": "lXH68vGIuZdfA8xVrS8iw", + "value": 1 }, { - "id": 417, - "frec": 1 + "id": "eduqLSyC3m4uB1Oee6dt6", + "value": 1 }, { - "id": 421, - "frec": 1 + "id": "0Z7uFXpp-XRXmqM8ILhIC", + "value": 1 }, { - "id": 424, - "frec": 1 + "id": "2Vc2H462cutVtUC-5omJk", + "value": 1 }, { - "id": 428, - "frec": 1 + "id": "paPpjw1XVC9-6xcueJsrY", + "value": 1 }, { - "id": 425, - "frec": 1 + "id": "gff2FqDlgXknRld7YMLWl", + "value": 1 }, { - "id": 431, - "frec": 1 + "id": "WtYSntcy2CijEORmROeaj", + "value": 1 }, { - "id": 432, - "frec": 1 + "id": "Ubaq6h7wasdP_YRombm2c", + "value": 1 }, { - "id": 435, - "frec": 1 + "id": "3arbCGI6fMOWALLanZcg3", + "value": 1 }, { - "id": 447, - "frec": 1 + "id": "lKMW_xTZzCrCHRcGp-Z-n", + "value": 1 }, { - "id": 449, - "frec": 1 + "id": "I5AJgba5GTdEjdpFB-LBf", + "value": 1 }, { - "id": 458, - "frec": 1 + "id": "R06chAQYswLtQK46OInW7", + "value": 1 }, { - "id": 463, - "frec": 1 + "id": "27GbVOZ-szdnzsy92oY-X", + "value": 1 }, { - "id": 462, - "frec": 1 + "id": "Bebnh8-UWwtYLnK6p3fKi", + "value": 1 }, { - "id": 472, - "frec": 1 + "id": "JawnUo-pseWb3FDVMtxrQ", + "value": 1 }, { - "id": 476, - "frec": 1 + "id": "upWXctTSKBtFNSXnXDK_u", + "value": 1 }, { - "id": 475, - "frec": 1 + "id": "5LYjhk-N87Ov9NrQcGbLQ", + "value": 1 }, { - "id": 474, - "frec": 1 + "id": "-GL2iAgykP10Ae3AKsVOX", + "value": 1 }, { - "id": 477, - "frec": 1 + "id": "vq3T-UQGTjX3Z9TlEF12e", + "value": 1 }, { - "id": 478, - "frec": 1 + "id": "bge6qR6NzsD5Vk4ifPsSO", + "value": 1 }, { - "id": 483, - "frec": 1 + "id": "jhJ2TOfdaRAcVeHGOjwua", + "value": 1 }, { - "id": 482, - "frec": 1 + "id": "kN85Lb_C4dLnww7sz1afK", + "value": 1 }, { - "id": 487, - "frec": 1 + "id": "Vjlet5P7XuqTrc22nt_Zz", + "value": 1 }, { - "id": 489, - "frec": 1 + "id": "pHBnmCFpM7oZf0O78CBIz", + "value": 1 }, { - "id": 490, - "frec": 1 + "id": "xIgPo3N-aKXhVcjultMiY", + "value": 1 }, { - "id": 492, - "frec": 1 + "id": "8iFdjRTQU7ONGnigRTlm8", + "value": 1 }, { - "id": 500, - "frec": 1 + "id": "AWJXh6URGN0Vwm66i6IvL", + "value": 0 }, { - "id": 497, - "frec": 1 + "id": "hKJhXxultsxm0TJl1P8-L", + "value": 0 }, { - "id": 501, - "frec": 1 + "id": "JZRBfIXBkeuobtDXbLt5t", + "value": 0 }, { - "id": 502, - "frec": 1 + "id": "O-CLnVuXAUapOn6TbdhKx", + "value": 0 }, { - "id": 503, - "frec": 1 + "id": "-msU3yor4qJYQHJtWrdk8", + "value": 0 }, { - "id": 507, - "frec": 1 + "id": "oEHzYcfxDGGcsL-deud1j", + "value": 0 }, { - "id": 510, - "frec": 1 + "id": "xXtjQktuAq1bmxTc0HSQT", + "value": 0 }, { - "id": 512, - "frec": 1 + "id": "-LwAKwgCdVkzwM579zRMo", + "value": 0 }, { - "id": 516, - "frec": 1 + "id": "APXF-lEplPOloppSeIjAY", + "value": 0 }, { - "id": 517, - "frec": 1 + "id": "jhJ2TOfdaRAcVeHGOjwua", + "value": 0 }, { - "id": 524, - "frec": 1 + "id": "ff7ES190q1dmFYZ7lo6x0", + "value": 0 }, { - "id": 521, - "frec": 1 + "id": "upWXctTSKBtFNSXnXDK_u", + "value": 0 } ], - "tags": [ - "NOCHE" - ] + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Flibro_almacen.webp?alt=media&token=9f5be80c-f5fc-48dd-be44-ba6ea61a8efc" + }, + "text": "libro de la biblioteca" } ] \ No newline at end of file diff --git a/assets/i18n/ca_ES.json b/assets/i18n/ca_ES.json new file mode 100644 index 00000000..a7a86d03 --- /dev/null +++ b/assets/i18n/ca_ES.json @@ -0,0 +1,388 @@ +{ + "profile": { + "selection": { + "text1": "¿Quién va a utilizar la aplicación en este dispositivo?", + "caregiver_text": "Necessita comunicar-se", + "user_text": "Necessita comunicar-se" + }, + "hello": "Hola {name}!", + "ottaa": { + "tips": "Consells OTTAA" + }, + "mail": "Correo electrónico", + "date": "Data de naixement", + "faq": { + "title": "Preguntes freqüents", + "faq0": "Qui pot usar l'aplicació OTTAA?", + "faq0Description": "OTTAA está diseñado para personas no verbales, es decir, cualquier persona que no utilice el habla oral para comunicarse. Las personas que usan OTTAA hoy en día fueron diagnosticadas con autismo, parálisis cerebral, síndrome de Down, esclerosis lateral amiotrófica (ELA), atrofia muscular espinal (AME) o síndrome de enclaustramiento post al accidente cerebrovascular (LiS), entre otras afecciones. Al ser una herramienta de comunicación dinámica, OTTAA requiere que sus usuarios posean funciones cognitivas de nivel medio a alto. Sin embargo, nos gusta considerar cada caso individualmente, así que no dude en ponerse en contacto y solicitar una evaluación en línea con nuestro equipo.", + "faq1": "Com funciona l'aplicació?", + "faq1Description": "La aplicación OTTAA proporciona al usuario pictogramas: imágenes que representan acciones, objetos, sentimientos o emociones. El usuario puede elegir los pictogramas que necesita y crear una frase, esta se traduce de los pictogramas a una oración escrita que aparece en la pantalla y que la aplicación también lee en voz alta. Consulta nuestro canal de Youtube para obtener una explicación más visual.", + "faq2": "En què es diferencia aquesta aplicació d'altres dispositius AAC (comunicació augmentativa i alternativa)?", + "faq2Description": "L'aplicació OTTAA és diferent d'altres aplicacions de CAA a causa del seu innovador algorisme predictiu i generador de llenguatge natural, que permet que l'aplicació aprengui del comportament de l'usuari a l'aplicació, la seva edat, sexe, l'hora del dia i la seva ubicació per pre-seleccionar pictograma(s) per al moment comunicacional en què es troben.", + "faq3": "Quant costa l'aplicació OTTAA?", + "faq3Description": "L'aplicació OTTAA és gratuïta per descarregar i usar. Per crear un producte sostenible que resisteixi el pas del temps, hi ha algunes característiques que requereixen una subscripció per utilitzar-les. No obstant, estem treballant durament per brindar finançament a tothom que ho necessiti.\n\nSi estàs a Argentina, qualsevol ajuda tècnica que necessiti una persona ha d'estar cobert per un assegurança de salut. Comuniqui's amb el nostre equip per obtenir orientació i assistència sobre com obtenir aquesta cobertura.\n\nSi ets de qualsevol altre país de LATAM i vols compartir la teva experiència sobre aquest tema, no dubtis en comunicar-te, la teva contribució podria ajudar a moltes persones.", + "faq4": "Quins idiomes són compatibles amb el Projecte OTTAA?", + "faq4Description": "Actualmente admitimos español, inglés, portugués y francés. Para español, tenemos versiones localizadas de Argentina, Chile, Colombia y España. Estamos buscando activamente contribuciones sobre nuevos idiomas o una mejor localización para las variedades españolas. Únete a nuestra comunidad de crowdin para contribuir.", + "faq5": "Com puc col·laborar amb el Projecte OTTAA?", + "faq5Description": "Los colaboradores pueden ayudar a OTTAA con el desarrollo, las pruebas y/o la traducción. Para leer más sobre el tema y comenzar, consulta la sección Contribuir en el repositorio oficial de OTTAA en GitHub." + }, + "caregiver": "Acompanyant", + "caregivers_families": "Professionals/Familiars", + "user": "Usuari/a", + "user_description": "Persona no verbal", + "wait": "Por favor espera", + "setting_exp": "Configurant la teva experiència...", + "link_account": "Vincular un compte", + "use": { + "ottaa": "Utilizar OTTAA" + }, + "close_profile": "Ocultar", + "open_profile": "Veure perfil", + "no_account": "Mode sense perfil", + "new_existant": "Nou/Existente", + "what_do": "¿Qué quieres hacer?", + "profile": "Perfil", + "linked_accounts": "Comptes vinculats", + "name": "Nom", + "logout": "Tancar sessió", + "last_name": "Cognom", + "role": "Rol d'ús", + "day": "Dia", + "month": "Mes", + "year": "Any", + "tips": { + "title1": "Estadístiques", + "title2": "Taulells", + "title3": "Historial", + "title4": "Favorits", + "text1": "Mira las estadísticas de tu paciente/familiar, para ver su actividad y cómo fue mejorando a lo largo de los días, semanas y meses.", + "text2": "Oculta los tableros que no use el usuario, para que le aparezcan los tableros que más utiliza y necesita.", + "text3": "Utiliza el historial para ver tus frases pasadas, qué hiciste durante el día y contar historias.", + "text4": "Guarda pictogramas o frases favoritas, para poder acceder a ellas más rápidamente." + }, + "unlink": "Desvincular", + "unlink_account": "¿Desea desvincular a {name} de sus cuentas?", + "help": { + "help": "¿Necesita ayuda?", + "title1": "Preguntes freqüents", + "title2": "Contactar con el soporte" + }, + "link": { + "title": "Vincular Compte", + "mail": { + "title": "Introduzca el correo electrónico vinculado a la cuenta de OTTAA", + "input": { + "required": "El correo electrónico es obligatorio", + "invalid": "El correo electrónico no es válido" + }, + "warn": "*Se enviará una notificación con un código para enlazar los perfiles.", + "contact": "*Asegurate de estar en contacto con la persona que posea esta cuenta en un dispositivo." + }, + "token": { + "title": "Coloque el código de verificación que llegó como notificación a otro dispositivo.", + "problem": "¿Tiene problemas para vincular las cuentas?", + "resend": "Reenviar codi", + "back": "Introducir otro email", + "invalid": "Token no válido" + }, + "wait": { + "title": "Espere", + "subtitle": "Carregant perfil..." + }, + "success": { + "title": "Perfil vinculat amb èxit!", + "lastTime": "Últ. vegada {date}" + }, + "error": { + "link-exist": "Ja estan vinculades", + "miss-caregiver": "Error: Cuidador 404", + "miss-user": "Error: Usuario 404", + "user-no-comp": "Error: Usuario 406", + "caregiver-no-comp": "Error: Cuidador 406", + "autolink": "Error: Mateixa compte", + "auth/user-not-found": "Usuari no trobat", + "miss-token": "Falta el Token", + "invalid-token": "Token no válido", + "expired-token": "Token caducado" + } + }, + "delete_account": "Eliminar cuenta" + }, + "user": { + "main": { + "title": "Configura la teva experiència", + "subtitle1": "Ús de l'aplicació", + "subtitle2": "Llenguatge predictiu" + }, + "settings": { + "main_screen": "Pantalla principal", + "accessibility": "Accessibilitat", + "voice_and_subtitles": "Veu i subtítols", + "language": "Llenguatge" + }, + "main_setting": { + "interaction": "Interaccions", + "talk_delete": "Hablar y Borrar", + "shortcut": "Atajos en el Inicio", + "board_view": "Vista de taulells", + "tabs": "Per pestanyes", + "grid": "Grella", + "ottaa_labs": "OTTAA Labs", + "labs_text": "Funció frases verbals", + "labs_long": "Funció en Mode Beta\nPermet generar frases amb temps verbals més complexos", + "one_by_one": "ONE by ONE" + }, + "accessibility": { + "selection": "Selecció", + "bar_text": "Temps de clic (Segons)", + "connected": "Dispositius connectats", + "device": "Dispositiu d'accessibilitat", + "press": "Press&Press", + "scroll": "Scroll&Press", + "sip": "Soplo y succión", + "selection_type": "Tipus de selecció", + "swept": "Barrido", + "speed": "Velocitat", + "selection_speed": "Velocitat de selecció" + }, + "voice_and_subtitle": { + "voice_types": "Tipus de veu", + "voice_rate": "Velocitat de veu", + "voz1": "Veu 1", + "voz2": "Veu 2", + "voz3": "Veu 3", + "mute": "Silenciar pictogramas", + "subtitle": "Subtítols", + "show": "Mostrar subtítulos", + "size": "Mida", + "capital": "Majúscules" + }, + "language": { + "set": "Llenguatge establert" + } + }, + "global": { + "hello_world": "Hola Món", + "hello": "Hola", + "continue": "Continuar", + "next": "Següent", + "back": "Anterior", + "please_enter_text": "Por favor, introduce un texto", + "done": "Fet", + "yes": "Sí", + "delete": "Esborrar", + "edit": "Editar", + "no": "No", + "mute": "Silenciar", + "important": "Important", + "save_changes": "Desar canvis", + "send": "Enviar", + "skip": "Ometre", + "email": "Correu electrònic", + "step": "Pas", + "share": "Compartir", + "support": "Suport", + "congrats": "Felicitacions", + "settings": "Configuració", + "general": "General", + "pictogram": "Pictogrames", + "configuration": "Configuració", + "user_ottaa": "Usar OTTAA como", + "cancel": "Cancel·lar", + "slow": "Lenta", + "default": "Per defecte", + "fast": "Ràpida", + "voice": "Veu", + "small": "Pequeño", + "medium": "Mitjana", + "big": "Gran", + "comingsoon": "¡Esta característica estará disponible muy pronto!", + "delicate": "Región", + "chile": "Chile", + "spanish": "Español", + "argentina": "Argentina", + "colombia": "Colombia", + "english": "Inglés", + "italian": "Italiano", + "french": "Francés", + "portuguese": "Portugues", + "test": "Esta es la voz que vas a usar en ota", + "add": "Agregar", + "confirm": "Confirmar", + "gallery": "galería", + "arasaac": "ARASAAC", + "text": "Texto", + "color": "Color", + "search": "Buscar", + "actions": "Acciones", + "people": "Personas", + "miscellaneous": "Miscelaneas", + "noun": "Sustantivos", + "adjective": "Adjetivos", + "predictive": "Predictivo", + "sunday": "Domingo", + "monday": "Lunes", + "tuesday": "Martes", + "wednesday": "Miércoles", + "thursday": "Jueves", + "friday": "Viernes", + "saturday": "Sábado", + "tomorrow": "Mañana", + "noon": "Mediodía", + "late": "Tarde", + "evening": "Noche", + "add_new": "Agregar nuevo", + "disguise": "Ocultar", + "save": "Guardar", + "image": "Imágen", + "saved_in": "Guardado en", + "location": "Ubicación", + "voices": "Por favor, instale voces desde la configuración para una mejor usabilidad" + }, + "onboarding": { + "start": "Començar", + "profile": { + "title": "Pantalla de perfils", + "subtitle": "Qui utilitzarà OTTAA avui?", + "description": "Amb la selecció de perfils podràs utilitzar OTTAA des de qualsevol dispositiu, mantenint els teus pictogrames i estils!" + }, + "home": { + "title": "Personaliza tu Inicio", + "subtitle": "Accessos directes a la pantalla principal", + "description": "Personalizá de acuerdo a tus gustos y necesidades" + }, + "customize": { + "title": "Personalizá tu Home", + "subtitle": "Acompanyem en el procés d'aprenentatge", + "description": "Activá o desactivá tableros o pictogramas para modificar la predicción, vos tenés el control." + }, + "skip": { + "title": "Estàs d'acord en saltar la introducció?" + } + }, + "terms": { + "button": "Accepto els termes", + "text": "Per continuar, necessitem que acceptis els termes i condicions.\nVeure termes" + }, + "loginWait": { + "text": "Et donem la benvinguda!\nAl món d'OTTAA" + }, + "login": { + "title": "Ingresa con tu cuenta", + "google": "Continuar con Google.", + "facebook": "Continuar amb Facebook", + "apple": "Continuar con Apple", + "register": "¿Todavía no tienes cuenta? Regístrate aquí", + "wait": { + "title": "Et donem la benvinguda!", + "subtitle": "Al nou món d'OTTAA Project" + } + }, + "customize": { + "board": { + "title": "Quins taulells utilitzarà l'usuari per comunicar-se?", + "appbar": "Taulells predictius", + "skip": "Ometre la selecció de taulells?", + "subtitle": "Veure pictogrames" + }, + "shortcut": { + "title": "Seleccioná los atajos que aparecerán en la pantalla principal.", + "appbar": "Accessos directes", + "favorites": "Favorits", + "history": "Historial", + "camera": "Càmera", + "games": "Jocs" + }, + "picto": { + "title": "Taulell {name}", + "switch": "Activar taulell" + }, + "help": { + "boards": "Los tableros predictivos permiten configurar qué grupo de pictogramas se mostrará en la pantalla del usuario/a final.", + "shortcut": "Els accessos directes són accessos ràpids a diferents funcions perquè l'usuari/a final disposi a la seva pantalla principal." + }, + "wait": { + "title": "Felicitats!", + "subtitle": "Has configurado la experiencia de {name}", + "button": "Anar al panell de perfils" + }, + "skip": "Estàs d'acord en saltar les preferències del perfil?" + }, + "home": { + "grid": { + "title": "Taulells", + "pictos": "Taulell {group}" + } + }, + "chatgpt": { + "prompt": "escribir una frase en español con estas palabras como si fueras {gender}, agregando conectores y artículos cuando sea necesario, pero sin cambiar las palabras: {pictograms}" + }, + "notification": { + "code": { + "request": { + "title": "Verificación de OTTAA Link", + "body": "Están intentando vincular tu cuenta con el token {linkToken}" + }, + "confirm": { + "title": "Confirmación de OTTAA Link", + "body": "Se ha confirmado la vinculación de tu cuenta" + } + } + }, + "game": { + "play": "¡Juguemos!", + "next": "Jugar", + "game_header_0": "¿Cuál es el pictograma?", + "game_header_1": "Unir pictogramas", + "game_header_2": "Juego de la Memoria", + "game_header_3": "Armá una historia", + "game_sub_0": "Respondé las preguntas eligiendo el pictograma correcto. Aprende jugando", + "game_sub_1": "Unir los pictogramas de manera correcta", + "game_sub_2": "Prueba tu memoria, ¿Cuánto recuerdas los pictogramas?", + "game_sub_3": "Elegí los pictogramas que más te gusten, y con la ayuda de Chat GPT, crearás una historia.", + "group": "Seleccioná una categoría para poder jugar", + "search": "Buscar Tablero", + "find": "Encuentra los tableros que quieras, fácilmente!", + "game_1_line": "Seleccioná el pictograma que escuches", + "game_2_line": "Seleccioná la palabra que corresponde a su pictograma", + "game_3_line": "Seleccioná una tarjeta y encontrá la pareja del pictograma", + "game_4_line": "Agregá hasta 4 pictogramas y creá tu propia historia", + "no": "¡Oh Oh!", + "yes": "¡Muy bien!", + "correct": "Correcto", + "incorrect": "Incorrecto", + "use_time": "Tiempo total", + "maximum_streak": "Mejor racha", + "speak_what": "¿Cual es el picto {name}?", + "gptbtn": "Crear historia", + "prompt": "Actúa como maestra de jardín de infantes y escribe una historia en español para niños usando las siguientes palabras:", + "nivel": "Nivel" + }, + "exit": { + "long": { + "headline": "¿Deseas volver a la pantalla de perfiles?", + "body": "Mantén presionado el botón resaltado para volver", + "check": "No volver a mostrar este mensaje", + "btn": "De acuerdo" + }, + "short": { + "headline": "¿Confima que deseas volver a la pantalla de perfiles?" + } + }, + "create": { + "heading": "Crear pictograma", + "image_selection": "Elije la imagen que represente al pictograma", + "choose_color": "Elije el color", + "search_arsaac": "Buscar ARASAAC", + "time_headline": "Selecciona los horarios que más se adecuen a sus actividades", + "time_sub1": "¿Qué días de la semana es cuando más lo utiliza?", + "schedule": "¿En qué horario?", + "save": "Guardar pictograma", + "created_by_me": "Creados por mi", + "new_board": "Nuevo tablero", + "create_new_board": "Crear nuevo tablero", + "board_name": "Nombre del tablero", + "edit_picto": "Editar pictograma", + "final_heading": "Listo, chequea que todo este correcto" + } +} diff --git a/assets/i18n/en.json b/assets/i18n/en.json deleted file mode 100644 index 8bceed80..00000000 --- a/assets/i18n/en.json +++ /dev/null @@ -1,141 +0,0 @@ -{ - "level": "Level", - "report": "Report", - "vocabulary": "Vocabulary", - "most_used_phrases": "MOST USED PHRASES", - "pictogram_by_sentence_on_average": "Pictograms by sentences on average", - "phrases_last_seven_days": "Phrases created in the last 7 days", - "score_text_1": "OTTAA Score is a measure of the overall use of the application, using data as usage in the last days and average picts per sentence.", - "most_used_groups": "Most used Groups", - "ottaa_score": "OTTAA Score", - "favourite_sentence": "Favourite Sentences", - "galeria_grupos": "Gallery Groups", - "add_pict": "Add Pict", - "add_group": "Add Group", - "hello_world": "Hello World", - "we_are_preparing_everything": "We are preparing everything...", - "Hello": "Hello", - "Continue": "Continue", - "Please_register_to": "Please Register to", - "Login_with_google": "Login with Google", - "Login_with_facebook": "Login with Facebook", - "Welcome_this_is_ottaa": "Welcome, this is OTTAA", - "We_help_thousands_of_children_with_speech_problems_to_communicate_improving_their_quality_of_life": "We help thousands of children with speech problems to communicate, improving their quality of life", - "Previous": "Previous", - "Next": "Next", - "Thank_you_for_choosing_ottaa_project": "Thank you for choosing OTTAA PROJECT", - "please_enter_some_text": "Please enter some text", - "Name": "Name", - "Gender": "Gender", - "Date_of_birth": "Date of Birth", - "Lets_get_to_knwo_each_other_first": "Let\"s get to know each other first", - "We_are_going_to_collect_some_data_to_get_to_know_you_better": "We are going to collect some data to get to know you better", - "Launch_short_tutorial": "LAUNCH SHORT TUTORIAL", - "Do_a_guided_workshop": "DO A GUIDED WORKSHOP", - "Book_a_demo": "BOOK A DEMO", - "Ottaa_is_a_powerful_communication_tool": "OTTAA is a powerful \ncommunication tool", - "We_offer_you_different_options_so_that_you_learn_how_to_use_it_and_get_the_most_out_of_it": "We offer you different options so that you learn how to use it and get the most out of it.", - "Choose_your_avatar": "Choose your Avatar", - "Final_step_join": "Final step, join", - "Create_your_avatar_to_be_able_to_recognize_you_all_the_time": "Create your Avatar to be able to recognize you all the time", - "Create_your_phrase": "CREATE YOUR PHRASES", - "step1_long": "Touch one or more of the pictograms to create a sentence as long as you like. The pictograms are automatically related and you will always have one more pictogram to add", - "Talk_to_the_world": "TALK TO THE WORLD", - "step2_long": "Once the phrase is created, touch the OTTAA logo to speak aloud or using the share icon, you can send your phrase through the most used social networks", - "Access_thousands_of_pictograms": "ACCESS THOUSANDS OF PICTOGRAMS", - "Step3_long": "In OTTAA you have access to thousands of pictograms so you can talk about whatever you want. Find the Gallery of Pîctos in the lower left corner of the main screen", - "Ready": "Ready", - "Step4_long": "Enter the selection of games to learn while playing. OTTAA has educational games to learn vocabulary, concepts and much more. Also, more games will be available soon.", - "Play_and_learn": "PLAY AND LEARN", - "Male": "Male", - "Female": "Female", - "Binary": "Binary", - "Fluid": "Fluid", - "Other": "Other", - "hola_nnos_conozcamos_un_poco": "Hello,\nLet\"s get to know each other a little bit.", - "vamos_a_pedirte_cierta_informaci_n_para_nmejorar_tu_experiencia_con_ottaa": "We will ask you for certain information\nto improve your experience with OTTAA.", - "check_if_the_info_is_correct_nif_not_change_it_as_you_wish_this_will_help_us_to_personalize_the_app_for_you": "Check if the info is correct,\nif not, change it as you wish. This will help us to personalize the app for you.", - "te_ofrecemos_varias_opciones_para_naprender_a_utilizarla_y_sacarle_el_maximo_provecho": "We offer you several options to\nlearn how to use it and get the most out of it", - "por_ltimo": "At Last!", - "elige_un_personaje_que_nmejor_te_represente": "Choose a character that best represents you", - "edit_pictogram": "Edit pictogram", - "text": "Text", - "frame": "Frame", - "tags": "tags", - "keep_your_ottaa_up_to_date": "Keep your OTTAA up-to-date", - "account_info": "Account Info", - "account": "Account", - "account_type": "Account Type", - "current_ottaa_installed": "Current OTTAA Installed", - "current_ottaa_version": "Current OTTAA Version", - "device_name": "Device Name", - "contact_support": "Contact Support", - "edit": "Edit", - "delete": "Delete", - "fitzgerald_key": "Fitzgerald key", - "actions": "Actions", - "interactions": "Interactions", - "people": "people", - "nouns": "Nouns", - "adjectives": "Adjectives", - "miscellaneous": "Miscellaneous", - "choose_a_tag": "Choose a TAG", - "tags_widget_long_1": "By choosing TAGs you need to predict better when to show certain pictgorams, based on Time,Location, Calender or Weather", - "text_widget_long_1": "Enter the text to say it loud, can be a single word or a full sentence. Is up to you!", - "important": "Important", - "do_you_want_to_save_changes": "Do you want to save changes", - "no": "No", - "yes": "Yes", - "go_back": "Go Back", - "choose_an_option": "Choose an option", - "camera": "Camera", - "gallery": "Gallery", - "download_from_arasaac": "Download from ARASAAC", - "tags_will_come_in_next_release": "TAGs will come in next Release", - "mute": "Mute", - "about_ottaa": "About OTTAA", - "configuration": "Settings", - "tutorial": "Tutorial", - "close_application": "Close Application", - "sign_out": "Sign out", - "language": "Language", - "ottaa_labs": "OTTA Labs", - "language_page_long_1": "Use artificial intelligence to generate a richer sentence. You need a stable internet connection.", - "settings": "Settings", - "SETTINGS": "SETTINGS", - "pictograms": "Pictograms", - "prediction": "Prediction", - "accessibility": "Accessibility", - "voice_and_subtitles": "Voice and subtitles", - "all_phrases": "All Phrases", - "search": "Search", - "please_enter_a_valid_search": "Please enter a valid search", - "choose_a_picto_to_speak": "Choose a Picto to speak", - "we_are_working_on_this_feature": "We are working on this feature", - "most_used_sentences": "Most used Sentences", - "price_one": "Get access today to all the useful features that OTTAA Premium has to offer for only 990 ARS per month.", - "purchase_subscription": "PURCHASE SUBSCRIPTION", - "sentence_1": "Get access to educational games that allow you to evaluate vocabulary in a fun way", - "sentence_2": "Use OTTAA Project with screen scanning, connect accessible buttons and much more.", - "sentence_3": "With the premium version you can use the GPS to have a better prediction based on the commerce or place where you are", - "whats_the_picto": "What\"s the picto?", - "game1": "Answer the questions by choosing the right pictogram.\nLearn by playing!", - "match_picto": "Match Picto", - "game2": "Attach the pictogram correctly", - "memory_game": "Memory Game", - "game3": "Test your memory", - "play": "PLAY", - "select_a_category_to_play": "Select a category to play", - "image": "Image", - "share_text": "please, create a phrase and select the share button", - "text_to_speche_engine": "TEXT-TO-SPEECH-ENGINE", - "enable_custom_tts": "Enable custom TTS", - "speech_rate": "Speech Rate", - "speech_pitch": "Speech Pitch", - "SUBTITLE": "SUBTITLE", - "customized_subtitle": "Customized subtitle", - "size": "Size", - "upperCase": "UpperCase", - "it_allows_uppercase_subtitles": "It allows uppercase subtitles.", - "login_screen": "Hello, welcome to OTTAA Project, the first predictive communication platform for people with speech impairments, please login with your account and fill in some data to benefit from our prediction." -} \ No newline at end of file diff --git a/assets/i18n/en_US.json b/assets/i18n/en_US.json new file mode 100644 index 00000000..5233153f --- /dev/null +++ b/assets/i18n/en_US.json @@ -0,0 +1,388 @@ +{ + "profile": { + "selection": { + "text1": "Who is going to use the app on this device?", + "caregiver_text": "Needs to communicate", + "user_text": "Needs to communicate" + }, + "hello": "Hi {name}!", + "ottaa": { + "tips": "OTTAA tips" + }, + "mail": "Mail", + "date": "Date of birth", + "faq": { + "title": "Frequently Asked Questions", + "faq0": "Who can use the OTTAA app?", + "faq0Description": "OTTAA is designed for non-verbal individuals, that is anyone that does not use oral speech to communicate. People that are using OTTAA today were diagnosed with autism, cerebral palsy, Down syndrome, Amyotrophic Lateral Sclerosis (ALS), Spinal Motor Atrophy (SMA), or post-stroke locked-in syndrome (LiS), among other affections. Being a dynamic communication tool, OTTAA requires its users to be capable of mid to high-level cognitive functions. However, we like to consider every case individually so do not hesitate to get in touch and request an online assessment with our team.", + "faq1": "How does the app work?", + "faq1Description": "The OTTAA app provides the user with pictograms: images that represent actions, objects, feelings, or emotions. The user can choose the pictogram(s) he or she needs and create a speech utterance. The utterance is translated from the pictogram(s) to a written sentence that appears on the screen and is also read out loud by the app. Check out our Youtube channel for a more visual explanation.", + "faq2": "How is this app different from other AAC (augmentative and alternative communication) devices?", + "faq2Description": "The OTTAA app is different from other AAC apps because of its innovative predictive algorithm and natural language generator, which allow the app to learn from the user’s behavior on the app, their age, gender, the time of the day, and their location to pre-select pictogram(s) for the communicational moment they are in.", + "faq3": "How much does the OTTAA app cost?", + "faq3Description": "The OTTAA app is free to download & use. In order to create a sustainable product that withstands the passage of time, there are some features that require a subscription to access. However, we are working hard to provide financing to everyone that needs it.\n\nIf you are in Argentina, any assistive device a person needs should be covered by health insurance. Contact our team to get guidance and assistance on how to obtain this coverage.\n\nIf you are from any other country in LATAM and want to share your experience around this subject, feel free to reach out, your contribution might help many people in need.", + "faq4": "Which languages are supported by the OTTAA Project?", + "faq4Description": "We currently support Spanish, English, Portuguese, and French. For Spanish, we have localized versions from Argentina, Chile, Colombia, and Spain. We are actively looking for contributions on new languages or better localization for Spanish varieties. Join our crowdin community to contribute.", + "faq5": "How can I collaborate with the OTTAA Project?", + "faq5Description": "Contributors can help OTTAA with developing, testing, and/or translation. To read more about the subject and get started, please see the Contributing section in the official OTTAA GitHub repository." + }, + "caregiver": "Caregiver", + "caregivers_families": "Caregivers/Relatives", + "user": "User", + "user_description": "Non-verbal person", + "wait": "Please wait", + "setting_exp": "Setting up your experience...", + "link_account": "Link to an account", + "use": { + "ottaa": "Use OTTAA" + }, + "close_profile": "Hide", + "open_profile": "View profile", + "no_account": "No account mode", + "new_existant": "New/Existent", + "what_do": "What do you want to do?", + "profile": "Profile", + "linked_accounts": "Linked accounts", + "name": "Name", + "logout": "Logout", + "last_name": "Last Name", + "role": "Role", + "day": "Day", + "month": "Month", + "year": "Year", + "tips": { + "title1": "Stats", + "title2": "Boards", + "title3": "History", + "title4": "Favorites", + "text1": "Take a look at the statistics of your patient/family member, to check their activity and how they improved over the days, weeks and months.", + "text2": "Hide boards the user does not need, so we only show what is important.", + "text3": "Use the history feature to see old sentences, what you did during the day, or tell stories.", + "text4": "Save pictograms and sentences in Favorites, so you can access them quickly." + }, + "unlink": "Unlink", + "unlink_account": "Do you want to unlink {name} from your accounts?", + "help": { + "help": "Need help?", + "title1": "Frequently Asked Questions", + "title2": "Contact support" + }, + "link": { + "title": "Link to an account", + "mail": { + "title": "Enter the email of the account you want to link", + "input": { + "required": "Email is required", + "invalid": "Invalid email" + }, + "warn": "*We will show a token on the device screen to link accounts.", + "contact": "*Be sure you are in contact with the person using this email." + }, + "token": { + "title": "Input the verification code that appears on the other device.", + "problem": "Having trouble linking accounts?", + "resend": "Resend code", + "back": "Please enter another email", + "invalid": "Invalid token" + }, + "wait": { + "title": "Wait", + "subtitle": "Loading profile..." + }, + "success": { + "title": "Profile successfully linked!", + "lastTime": "Last seen {date}" + }, + "error": { + "link-exist": "Already linked", + "miss-caregiver": "Error:Caregiver 404", + "miss-user": "Error:User 404", + "user-no-comp": "Error:User 406", + "caregiver-no-comp": "Error: Caregiver 406", + "autolink": "Error: Same account", + "auth/user-not-found": "User not found", + "miss-token": "Missing token", + "invalid-token": "Invalid token", + "expired-token": "Expired token" + } + }, + "delete_account": "Delete Account" + }, + "user": { + "main": { + "title": "Setting up your experience", + "subtitle1": "Application usage", + "subtitle2": "Predictive texting" + }, + "settings": { + "main_screen": "Main Screen", + "accessibility": "Accessibility", + "voice_and_subtitles": "Voice & subtitles", + "language": "Language" + }, + "main_setting": { + "interaction": "Interactions", + "talk_delete": "Talk & Erase", + "shortcut": "Shortcuts", + "board_view": "Board view", + "tabs": "Tabs", + "grid": "Grid", + "ottaa_labs": "OTTAA Labs", + "labs_text": "Verbal phrases feature", + "labs_long": "Beta mode\nAllows creating sentences with more complex tenses", + "one_by_one": "ONE by ONE" + }, + "accessibility": { + "selection": "Selection", + "bar_text": "Clicking time (Seconds)", + "connected": "Connected devices", + "device": "Assistive device", + "press": "Press&Press", + "scroll": "Scroll&Press", + "sip": "Sip&Puff", + "selection_type": "Selection method", + "swept": "Screen scanning", + "speed": "Speed", + "selection_speed": "Selection speed" + }, + "voice_and_subtitle": { + "voice_types": "Voices", + "voice_rate": "Speech rate", + "voz1": "Voice 1", + "voz2": "Voice 2", + "voz3": "Voice 3", + "mute": "Mute", + "subtitle": "Subtitles", + "show": "Show subtitles", + "size": "Size", + "capital": "Uppercase" + }, + "language": { + "set": "Language" + } + }, + "global": { + "hello_world": "Hello World", + "hello": "Hello", + "continue": "Continue", + "next": "Next", + "back": "Previous", + "please_enter_text": "Please enter some text", + "done": "Done", + "yes": "Yes", + "delete": "Delete", + "edit": "Edit", + "no": "No", + "mute": "Mute", + "important": "Important", + "save_changes": "Save changes", + "send": "Submit", + "skip": "Skip", + "email": "Email", + "step": "Step", + "share": "Share", + "support": "Support", + "congrats": "Congratulations", + "settings": "Settings", + "general": "General", + "pictogram": "Pictograms", + "configuration": "Settings", + "user_ottaa": "Use OTTAA as", + "cancel": "Cancel", + "slow": "Slow", + "default": "Default", + "fast": "Fast", + "voice": "Voice", + "small": "Small", + "medium": "Medium", + "big": "Large", + "comingsoon": "¡This feature will be available very soon!", + "delicate": "Zone", + "chile": "Chile", + "spanish": "Spanish", + "argentina": "Argentina", + "colombia": "Colombia", + "english": "English", + "italian": "Italian", + "french": "French", + "portuguese": "Portuguese", + "test": "This is the voice you are going to use in ota", + "add": "Add", + "confirm": "Confirm", + "gallery": "gallery", + "arasaac": "ARASAAC", + "text": "Text", + "color": "Color", + "search": "Search", + "actions": "Actions", + "people": "People", + "miscellaneous": "Miscellaneous", + "noun": "Nouns", + "adjective": "Adjectives", + "predictive": "Predictive", + "sunday": "Sunday", + "monday": "Monday", + "tuesday": "Tuesday", + "wednesday": "Wednesday", + "thursday": "Thursday", + "friday": "Friday", + "saturday": "Saturday", + "tomorrow": "Tomorrow", + "noon": "Noon", + "late": "Evening", + "evening": "Night", + "add_new": "Add new", + "disguise": "Hide", + "save": "Save", + "image": "Image", + "saved_in": "Saved at", + "location": "Location", + "voices": "Please, install voices from settings for better experience" + }, + "onboarding": { + "start": "Get Started", + "profile": { + "title": "Profiles screen", + "subtitle": "Who is using OTTAA today?", + "description": "With the profile selection, you will be able to use OTTAA from any device, keeping your pictograms and styles!" + }, + "home": { + "title": "Customize your Home", + "subtitle": "Shortcuts on main screen", + "description": "Customize according to your tastes and needs" + }, + "customize": { + "title": "Customize your Home", + "subtitle": "We guide you in the learning process", + "description": "Activate or deactivate boards and pictograms to enhance the prediction, you have control." + }, + "skip": { + "title": "Do you really want to skip the tutorial?" + } + }, + "terms": { + "button": "I accept the terms", + "text": "To continue we need you to accept the terms & conditions.\nSee terms & conditions" + }, + "loginWait": { + "text": "Welcome!\nTo the OTTAA World" + }, + "login": { + "title": "Log in with your account", + "google": "Login with Google.", + "facebook": "Login with Facebook", + "apple": "Login with Apple", + "register": "Don't have an account yet? Sign up here", + "wait": { + "title": "Welcome!", + "subtitle": "To the OTTAA Project World" + } + }, + "customize": { + "board": { + "title": "What boards will the user use?", + "appbar": "Predictive boards", + "skip": "Do you skip board customization?", + "subtitle": "See pictograms" + }, + "shortcut": { + "title": "Choose the shortcuts to use on Home screen.", + "appbar": "Shortcuts", + "favorites": "Favorites", + "history": "History", + "camera": "Camera", + "games": "Games" + }, + "picto": { + "title": "Board {name}", + "switch": "Enable board" + }, + "help": { + "boards": "Predictive boards allow choosing what boards & pictograms will show up to the user.", + "shortcut": "Shortcuts are a fast way to access different features for the user on Home Screen." + }, + "wait": { + "title": "¡Congratulations!", + "subtitle": "{name} experience is all set up", + "button": "Go to profile screen" + }, + "skip": "Do you want to skip profile customization?" + }, + "home": { + "grid": { + "title": "Boards", + "pictos": "Board {group}" + } + }, + "chatgpt": { + "prompt": "write a proper sentence in english with the following words as if you are a {gender}, adding connectors and articles when needed, without changing words: {pictograms}" + }, + "notification": { + "code": { + "request": { + "title": "OTTAA Link verification", + "body": "Someone is trying to link your account with token {linkToken}" + }, + "confirm": { + "title": "OTTAA Link confirmation", + "body": "You have successfully linked your account" + } + } + }, + "game": { + "play": "¡Let's play!", + "next": "Play", + "game_header_0": "What's the pictogram?", + "game_header_1": "Match pictograms", + "game_header_2": "Memory game", + "game_header_3": "Create a story", + "game_sub_0": "Answer questions picking the right pictogram. Learn playing", + "game_sub_1": "Match the pictograms correctly", + "game_sub_2": "Test your memory, can you remember all pictograms?", + "game_sub_3": "Choose the pictograms you like and with ChatGPT you will create a story.", + "group": "Choose a category to play", + "search": "Search board", + "find": "Easily find the boards you want!", + "game_1_line": "Choose the pictogram you listen to", + "game_2_line": "Choose the word that match the pictogram", + "game_3_line": "Choose a card and find the pictogram match", + "game_4_line": "Add up to 4 pictograms and create a story", + "no": "Oh Oh!", + "yes": "Great!", + "correct": "Right", + "incorrect": "Incorrect", + "use_time": "Total time", + "maximum_streak": "Best streak", + "speak_what": "What's the picto {name}?", + "gptbtn": "Create a story", + "prompt": "Act as a kindergarten teacher and write a story in English for kids using the following words:", + "nivel": "Level" + }, + "exit": { + "long": { + "headline": "Do you want to go back to profile screen?", + "body": "Press and hold the highlighted button to go back", + "check": "Do not show this message again", + "btn": "Ok" + }, + "short": { + "headline": "Do you want to go back to profile screen?" + } + }, + "create": { + "heading": "Create pictogram", + "image_selection": "Choose the image that best represent the pictogram", + "choose_color": "Choose color", + "search_arsaac": "Search in ARASAAC", + "time_headline": "Choose the timing that better suits your needs", + "time_sub1": "What days of the week is when you use it the most?", + "schedule": "In what schedule?", + "save": "Save pictogram", + "created_by_me": "Created by me", + "new_board": "New board", + "create_new_board": "Create new board", + "board_name": "Board name", + "edit_picto": "Edit pictogram", + "final_heading": "Done! Check everything is OK" + } +} diff --git a/assets/i18n/es.json b/assets/i18n/es.json deleted file mode 100644 index e4532c9d..00000000 --- a/assets/i18n/es.json +++ /dev/null @@ -1,162 +0,0 @@ -{ - "hello_world": "Hola Mundo", - "we_are_preparing_everything": "Estamos preparando todo...", - "Hello": "Hola", - "Continue": "Continuar", - "Please_register_to": "Por favor regístrese en", - "Login_with_google": "Acceder con Google", - "Login_with_facebook": "Acceder con Facebook", - "Welcome_this_is_ottaa": "Bienvenidos, esto es OTTAA", - "We_help_thousands_of_children_with_speech_problems_to_communicate_improving_their_quality_of_life": "Ayudamos a miles de niños con problemas de habla a comunicarse, mejorando su calidad de vida", - "Previous": "Anterior", - "Next": "Siguiente", - "Thank_you_for_choosing_ottaa_project": "Gracias por elegir OTTAA PROJECT", - "please_enter_some_text": "Por favor ingrese un texto", - "Name": "Nombre", - "Gender": "Genero", - "Date_of_birth": "Fecha de Nacimiento", - "Lets_get_to_knwo_each_other_first": "Vamos a conocernos primero", - "We_are_going_to_collect_some_data_to_get_to_know_you_better": "Vamos a recolectar algunos datos para conocerte mejor", - "Launch_short_tutorial": "TUTORIAL CORTO", - "Do_a_guided_workshop": "HACER UN TALLER GUIADO", - "Book_a_demo": "RESERVA UNA DEMO", - "Ottaa_is_a_powerful_communication_tool": "OTTAA es una potente\nherramienta de comunicación", - "We_offer_you_different_options_so_that_you_learn_how_to_use_it_and_get_the_most_out_of_it": "Te ofrecemos diferentes opciones para que aprendas a usarla y sques el mayor provecho", - "Choose_your_avatar": "Escoge tu Avatar", - "Final_step_join": "Paso final, unete", - "Create_your_avatar_to_be_able_to_recognize_you_all_the_time": "Crea tu Avatar para poder reconocerte todo el tiempo", - "Create_your_phrase": "CREA TUS FRASES", - "step1_long": "Toca uno o más de los pictogramas para crear una frase tan larga cómo quieras. Los pictogramas se relacionan automáticamente y siempre tendrás un pictograma más para agregar", - "Talk_to_the_world": "HABLA CON EL MUNDO", - "step2_long": "Una vez creada la frase, toca el logo de OTTAA par hablar en voz alta o usando el ícono de compartir, podrás enviar tu frase a través de las redes sociales más usadas", - "Access_thousands_of_pictograms": "ACCEDE A MILES DE PICTOGRAMAS", - "Step3_long": "En OTTAA tenés acceso a miles de pictogramas para que hables de lo que quieras. Encuentra la Galería de Pîctos en la esquina inferior izquierda de la pantalla principal", - "Ready": "Listo", - "Step4_long": "Entra a la selección de juegos para aprender jugando. OTTAA cuenta con juegos didácticos para aprender vocabulario, conceptos y mucho más. Además, pronto habrá más juegos disponibles", - "Play_and_learn": "JUEGA Y APRENDE", - "Male": "Masculino", - "Female": "Femenino", - "Binary": "Binary", - "Fluid": "Fluid", - "Other": "Other", - "hola_nnos_conozcamos_un_poco": "Hola,\nNos conozcamos un poco", - "vamos_a_pedirte_cierta_informaci_n_para_nmejorar_tu_experiencia_con_ottaa": "Vamos a pedirte cierta información para\nmejorar tu experiencia con OTTAA", - "check_if_the_info_is_correct_nif_not_change_it_as_you_wish_this_will_help_us_to_personalize_the_app_for_you": "Comprueba si la información es correcta,\nsi no, cámbiala como quieras. Esto nos ayudará a personalizar la aplicación para ti.", - "te_ofrecemos_varias_opciones_para_naprender_a_utilizarla_y_sacarle_el_maximo_provecho": "Te ofrecemos varias opciones para\naprender a utilizarla y sacarle el maximo provecho", - "por_ltimo": "Por Ultimo!", - "elige_un_personaje_que_nmejor_te_represente": "Elige un personaje que mejor te represente", - "edit_pictogram": "Editar pictograma", - "text": "Texto", - "frame": "Marco", - "tags": "Tag", - "keep_your_ottaa_up_to_date": "Mantenga su OTTAA actualizada", - "account_info": "Informacion de cuenta", - "account": "Cuenta", - "account_type": "Tipo de cuenta", - "current_ottaa_installed": "OTTAA actual instalado", - "current_ottaa_version": "Versión actual de OTTAA", - "device_name": "Nombre del dispositivo", - "contact_support": "Soporte de contacto", - "edit": "Editar", - "delete": "Borrar", - "fitzgerald_key": "clave fitzgerald", - "actions": "Comportamiento", - "interactions": "Interacciones", - "people": "gente", - "nouns": "Sustantivos", - "adjectives": "adjetivos", - "miscellaneous": "Diverso", - "choose_a_tag": "Elige una ETIQUETA", - "tags_widget_long_1": "Al elegir las ETIQUETAS, necesita predecir mejor cuándo mostrar ciertos pictogramas, según la hora, la ubicación, el calendario o el clima.", - "text_widget_long_1": "Ingrese el texto para decirlo en voz alta, puede ser una sola palabra o una oración completa. ¡Depende de ti!", - "important": "Importante", - "do_you_want_to_save_changes": "Quieres guardar los cambios", - "no": "No", - "yes": "sí", - "go_back": "Regresa", - "choose_an_option": "Elige una opcion", - "camera": "Cámara", - "gallery": "Galería", - "download_from_arasaac": "Descargar desde ARASAAC", - "tags_will_come_in_next_release": "Los TAG aparecerán en la próxima versión", - "mute": "Silenciar", - "about_ottaa": "Acerca de OTTAA", - "configuration": "Configuración", - "tutorial": "Tutorial", - "close_application": "Cierra la aplicación", - "sign_out": "Desconectar", - "language": "Idioma", - "ottaa_labs": "Laboratorios OTTAa", - "language_page_long_1": "Usa la inteligencia artificial para generar una oración más rica. Necesitas una conexión a Internet estable.", - "settings": "Ajustes", - "SETTINGS": "AJUSTES", - "pictograms": "Pictogramas", - "prediction": "Predicción", - "accessibility": "Accesibilidad", - "voice_and_subtitles": "Voz y subtítulos", - "all_phrases": "Todas las frases", - "search": "Búsqueda", - "please_enter_a_valid_search": "Por favor ingrese una búsqueda válida", - "choose_a_picto_to_speak": "Elige un Picto para hablar", - "we_are_working_on_this_feature": "Estamos trabajando en esta funcionalidad", - "most_used_sentences": "Oraciones más usadas", - "price_one": "Obtenga acceso hoy a todas las funciones útiles que OTTAA Premium tiene para ofrecer por solo 990 ARS al mes.", - "purchase_subscription": "COMPRAR SUSCRIPCIÓN", - "sentence_1": "Accede a juegos educativos que te permiten evaluar vocabulario de una manera divertida", - "sentence_2": "Use OTTAA Project con escaneo de pantalla, conéctese accesible Botones y mucho más.", - "sentence_3": "Con la versión premium puedes usar el GPS para tener una mejor predicción basada en el comercio o lugar donde te encuentres", - "whats_the_picto": "¿Cual es el Picto ?", - "report": "Reporte", - "game1": "Responde a las preguntas eligiendo el pictograma adecuado. ¡Aprende jugando!", - "match_picto": "Igualar pictogramas", - "game2": "Adjunta el pictograma correctamente", - "memory_game": "Juego de memoria", - "game3": "Prueba tu memoria", - "play": "JUGAR", - "select_a_category_to_play": "Seleccione una categoría para jugar", - "image": "Imagen", - "share_text": "por favor, crea una frase y selecciona el botón de compartir", - "text_to_speche_engine": "MOTOR DE TEXTO A VOZ", - "enable_custom_tts": "Habilitar TTS personalizado", - "speech_rate": "Nivel de conversación", - "speech_pitch": "Tono de voz", - "SUBTITLE": "SUBTITULAR", - "customized_subtitle": "subtítulo personalizado", - "size": "Tamaño", - "upperCase": "Mayúsculas", - "it_allows_uppercase_subtitles": "Permite subtítulos en mayúsculas", - "login_screen": "Hola, bienvenido a OTTAA Project, la primera plataforma de comunicación predictiva para personas con problemas del habla, inicie sesión con su cuenta y complete algunos datos para beneficiarse de nuestra predicción.", - "ottaa_score": "OTTAA Score", - "most_used_groups": "Grupos más usados", - "score_text_1": "OTTAA Score es una medida del uso en general de la aplicación, usando datos como uso en los últimos días y promedio de pictos por frase", - "phrases_last_seven_days": "Frases creadas en los últimos 7 días", - "pictogram_by_sentence_on_average": "Pictogramas por frases en promedio", - "most_used_phrases": "Frases Mas Usadas", - "vocabulary": "Vocabulario", - "add_group": "Añadir grupo", - "add_pict": "Agregar imagen", - "galeria_grupos": "Galeria Grupos", - "profile.omitir": "Omitir", - "profile.continuar": "Continuar", - "profile.selection.text1": "¿Quién usará la aplicación en este dispositivo?", - "profile.acompanante": "Acompañante", - "profile.profesionales.familiares": "Profesionales / Familiares", - "profile.necesita.comunicarse": "Necesita comunicarse", - "profile.usuario.a": "Usuario / a", - "profile.aguarde": "Aguarde", - "profile.configurando.su.experiencia": "Configurando su experiencia...", - "profile.hola": "Hola", - "profile.vincular.con.cuenta": "Vincular con cuenta", - "profile.crear.nueva.cuenta": "Crear nueva cuenta", - "profile.usar.ottaa": "Usar Ottaa", - "profile.modo.sin.perfil": "Modo sin perfil", - "profile.nuevo.existente": "Nuevo / Existente", - "profile.agregar.cuenta": "Agregar cuenta", - "profile.qué.deseas.hacer": "¿Qué deseas hacer?", - "profile.perfil" : "Perfil", - "profile.ayuda" : "Ayuda", - "profile.cerrar.sesión" : "Cerrar sesión", - "profile.ottaa.tips" : "Ottaa tips ", - "profile.cuentas.vinculadas" : "Cuentas vinculadas", - "profile.rol.de.uso" : "Rol de uso" -} \ No newline at end of file diff --git a/assets/i18n/es_AR.json b/assets/i18n/es_AR.json index 59e5621b..69382dd1 100644 --- a/assets/i18n/es_AR.json +++ b/assets/i18n/es_AR.json @@ -1,141 +1,388 @@ { - "level": "Nivel", - "report": "Informe", - "vocabulary": "Vocabulario", - "most_used_phrases": "Frases más usadas", - "pictogram_by_sentence_on_average": "Pictogramas por oración en promedio", - "phrases_last_seven_days": "Fases creadas en los últimos 7 días", - "score_text_1": "El puntaje OTTAA es una medida del uso de la aplicación, usa los datos de los últimos días y el promedio de pictogramas por frase.", - "most_used_groups": "Grupos más usados", - "ottaa_score": "Puntaje OTTAA", - "favourite_sentence": "Frases Favoritas", - "galeria_grupos": "Galería de Grupos", - "add_pict": "Añadir Pictograma", - "add_group": "Añadir Grupo", - "hello_world": "Hola Mundo", - "we_are_preparing_everything": "Estamos preparando todo...", - "Hello": "Hola", - "Continue": "Continuar", - "Please_register_to": "Por favor, regístrate en", - "Login_with_google": "Iniciar sesión con Google", - "Login_with_facebook": "Iniciar sesión con Facebook", - "Welcome_this_is_ottaa": "Bienvenido, esto es OTTAA", - "We_help_thousands_of_children_with_speech_problems_to_communicate_improving_their_quality_of_life": "Ayudamos a miles de niños con problemas del habla a comunicarse, mejorando su calidad de vida", - "Previous": "Anterior", - "Next": "Siguiente", - "Thank_you_for_choosing_ottaa_project": "Gracias por elegir OTTAA Project", - "please_enter_some_text": "Por favor ingrese algún texto", - "Name": "Nombre", - "Gender": "Género", - "Date_of_birth": "Fecha de nacimiento", - "Lets_get_to_knwo_each_other_first": "Conozcámonos primero", - "We_are_going_to_collect_some_data_to_get_to_know_you_better": "Vamos a recopilar algunos datos para conocer mejor", - "Launch_short_tutorial": "Empezar Tutorial Corto", - "Do_a_guided_workshop": "DO A GUIDED WORKSHOP", - "Book_a_demo": "BOOK A DEMO", - "Ottaa_is_a_powerful_communication_tool": "OTTAA is a powerful \ncommunication tool", - "We_offer_you_different_options_so_that_you_learn_how_to_use_it_and_get_the_most_out_of_it": "We offer you different options so that you learn how to use it and get the most out of it.", - "Choose_your_avatar": "Choose your Avatar", - "Final_step_join": "Final step, join", - "Create_your_avatar_to_be_able_to_recognize_you_all_the_time": "Create your Avatar to be able to recognize you all the time", - "Create_your_phrase": "CREATE YOUR PHRASES", - "step1_long": "Touch one or more of the pictograms to create a sentence as long as you like. The pictograms are automatically related and you will always have one more pictogram to add", - "Talk_to_the_world": "TALK TO THE WORLD", - "step2_long": "Once the phrase is created, touch the OTTAA logo to speak aloud or using the share icon, you can send your phrase through the most used social networks", - "Access_thousands_of_pictograms": "ACCESS THOUSANDS OF PICTOGRAMS", - "Step3_long": "In OTTAA you have access to thousands of pictograms so you can talk about whatever you want. Find the Gallery of Pîctos in the lower left corner of the main screen", - "Ready": "Ready", - "Step4_long": "Enter the selection of games to learn while playing. OTTAA has educational games to learn vocabulary, concepts and much more. Also, more games will be available soon.", - "Play_and_learn": "PLAY AND LEARN", - "Male": "Masculino", - "Female": "Femenino", - "Binary": "Binary", - "Fluid": "Fluid", - "Other": "Other", - "hola_nnos_conozcamos_un_poco": "Hello,\nLet\"s get to know each other a little bit.", - "vamos_a_pedirte_cierta_informaci_n_para_nmejorar_tu_experiencia_con_ottaa": "We will ask you for certain information\nto improve your experience with OTTAA.", - "check_if_the_info_is_correct_nif_not_change_it_as_you_wish_this_will_help_us_to_personalize_the_app_for_you": "Check if the info is correct,\nif not, change it as you wish. This will help us to personalize the app for you.", - "te_ofrecemos_varias_opciones_para_naprender_a_utilizarla_y_sacarle_el_maximo_provecho": "We offer you several options to\nlearn how to use it and get the most out of it", - "por_ltimo": "At Last!", - "elige_un_personaje_que_nmejor_te_represente": "Choose a character that best represents you", - "edit_pictogram": "Edit pictogram", - "text": "Text", - "frame": "Frame", - "tags": "tags", - "keep_your_ottaa_up_to_date": "Keep your OTTAA up-to-date", - "account_info": "Account Info", - "account": "Account", - "account_type": "Account Type", - "current_ottaa_installed": "Current OTTAA Installed", - "current_ottaa_version": "Current OTTAA Version", - "device_name": "Device Name", - "contact_support": "Contact Support", - "edit": "Edit", - "delete": "Delete", - "fitzgerald_key": "Fitzgerald key", - "actions": "Actions", - "interactions": "Interactions", - "people": "people", - "nouns": "Nouns", - "adjectives": "Adjectives", - "miscellaneous": "Miscellaneous", - "choose_a_tag": "Choose a TAG", - "tags_widget_long_1": "By choosing TAGs you need to predict better when to show certain pictgorams, based on Time,Location, Calender or Weather", - "text_widget_long_1": "Enter the text to say it loud, can be a single word or a full sentence. Is up to you!", - "important": "Important", - "do_you_want_to_save_changes": "Do you want to save changes", - "no": "No", - "yes": "Sí", - "go_back": "Volver", - "choose_an_option": "Elige una opción", - "camera": "Camera", - "gallery": "Gallery", - "download_from_arasaac": "Download from ARASAAC", - "tags_will_come_in_next_release": "TAGs will come in next Release", - "mute": "Mute", - "about_ottaa": "About OTTAA", - "configuration": "Settings", - "tutorial": "Tutorial", - "close_application": "Close Application", - "sign_out": "Sign out", - "language": "Language", - "ottaa_labs": "OTTA Labs", - "language_page_long_1": "Use artificial intelligence to generate a richer sentence. You need a stable internet connection.", - "settings": "Settings", - "SETTINGS": "SETTINGS", - "pictograms": "Pictograms", - "prediction": "Prediction", - "accessibility": "Accessibility", - "voice_and_subtitles": "Voice and subtitles", - "all_phrases": "All Phrases", - "search": "Search", - "please_enter_a_valid_search": "Please enter a valid search", - "choose_a_picto_to_speak": "Choose a Picto to speak", - "we_are_working_on_this_feature": "We are working on this feature", - "most_used_sentences": "Most used Sentences", - "price_one": "Get access today to all the useful features that OTTAA Premium has to offer for only 990 ARS per month.", - "purchase_subscription": "PURCHASE SUBSCRIPTION", - "sentence_1": "Get access to educational games that allow you to evaluate vocabulary in a fun way", - "sentence_2": "Use OTTAA Project with screen scanning, connect accessible buttons and much more.", - "sentence_3": "With the premium version you can use the GPS to have a better prediction based on the commerce or place where you are", - "whats_the_picto": "What\"s the picto?", - "game1": "Answer the questions by choosing the right pictogram.\nLearn by playing!", - "match_picto": "Match Picto", - "game2": "Attach the pictogram correctly", - "memory_game": "Memory Game", - "game3": "Test your memory", - "play": "PLAY", - "select_a_category_to_play": "Select a category to play", - "image": "Image", - "share_text": "please, create a phrase and select the share button", - "text_to_speche_engine": "TEXT-TO-SPEECH-ENGINE", - "enable_custom_tts": "Enable custom TTS", - "speech_rate": "Speech Rate", - "speech_pitch": "Speech Pitch", - "SUBTITLE": "SUBTITLE", - "customized_subtitle": "Customized subtitle", - "size": "Size", - "upperCase": "UpperCase", - "it_allows_uppercase_subtitles": "It allows uppercase subtitles.", - "login_screen": "Hello, welcome to OTTAA Project, the first predictive communication platform for people with speech impairments, please login with your account and fill in some data to benefit from our prediction." -} \ No newline at end of file + "profile": { + "selection": { + "text1": "¿Quién va a utilizar la aplicación en este dispositivo?", + "caregiver_text": "Necesita comunicarse", + "user_text": "Necesita comunicarse" + }, + "hello": "Hola {name}!", + "ottaa": { + "tips": "OTTAA tips" + }, + "mail": "Correo electrónico", + "date": "Fecha de nacimiento", + "faq": { + "title": "Preguntas frecuentes", + "faq0": "¿Quién puede usar la aplicación OTTAA?", + "faq0Description": "OTTAA está diseñado para personas no verbales, es decir, cualquier persona que no utilice el habla oral para comunicarse. Las personas que usan OTTAA hoy en día fueron diagnosticadas con autismo, parálisis cerebral, síndrome de Down, esclerosis lateral amiotrófica (ELA), atrofia muscular espinal (AME) o síndrome de enclaustramiento post al accidente cerebrovascular (LiS), entre otras afecciones. Al ser una herramienta de comunicación dinámica, OTTAA requiere que sus usuarios posean funciones cognitivas de nivel medio a alto. Sin embargo, nos gusta considerar cada caso individualmente, así que no dude en ponerse en contacto y solicitar una evaluación en línea con nuestro equipo.", + "faq1": "¿Cómo funciona la aplicación?", + "faq1Description": "La aplicación OTTAA proporciona al usuario pictogramas: imágenes que representan acciones, objetos, sentimientos o emociones. El usuario puede elegir los pictogramas que necesita y crear una frase, esta se traduce de los pictogramas a una oración escrita que aparece en la pantalla y que la aplicación también lee en voz alta. Consulta nuestro canal de Youtube para obtener una explicación más visual.", + "faq2": "¿En qué se diferencia esta aplicación de otros dispositivos AAC (comunicación aumentativa y alternativa)?", + "faq2Description": "La aplicación OTTAA es diferente de otras aplicaciones de CAA debido a su innovador algoritmo predictivo y generador de lenguaje natural, que permite que la aplicación aprenda del comportamiento del usuario en la aplicación, su edad, sexo, la hora del día y su ubicación para pre -seleccionar pictograma(s) para el momento comunicacional en el que se encuentran.", + "faq3": "¿Cuánto cuesta la aplicación OTTAA?", + "faq3Description": "La aplicación OTTAA es gratuita para descargar y usar. Para crear un producto sostenible que resista el paso del tiempo, hay algunas características que requieren una suscripción para utilizarlas. Sin embargo, estamos trabajando arduamente para brindar financiamiento a todos los que lo necesitan.\n\nSi estás en Argentina, cualquier ayuda técnica que necesite una persona debe estar cubierto por un seguro de salud. Comuníquese con nuestro equipo para obtener orientación y asistencia sobre cómo obtener esta cobertura.\n\nSi sos de cualquier otro país de LATAM y querés compartir tu experiencia sobre este tema, no dudes en comunicarte, tu contribución podría ayudar a muchas personas.", + "faq4": "¿Qué idiomas son compatibles con el Proyecto OTTAA?", + "faq4Description": "Actualmente admitimos español, inglés, portugués y francés. Para español, tenemos versiones localizadas de Argentina, Chile, Colombia y España. Estamos buscando activamente contribuciones sobre nuevos idiomas o una mejor localización para las variedades españolas. Únete a nuestra comunidad de crowdin para contribuir.", + "faq5": "¿Cómo puedo colaborar con el Proyecto OTTAA?", + "faq5Description": "Los colaboradores pueden ayudar a OTTAA con el desarrollo, las pruebas y/o la traducción. Para leer más sobre el tema y comenzar, consulta la sección Contribuir en el repositorio oficial de OTTAA en GitHub." + }, + "caregiver": "Acompañante", + "caregivers_families": "Profesionales/Familiares", + "user": "Usuario/a", + "user_description": "Persona no verbal", + "wait": "Por favor espera", + "setting_exp": "Configurando tu experiencia...", + "link_account": "Vincular una cuenta", + "use": { + "ottaa": "Utilizar OTTAA" + }, + "close_profile": "Ocultar", + "open_profile": "Ver perfil", + "no_account": "Modo sin perfil", + "new_existant": "Nuevo/Existente", + "what_do": "¿Qué quieres hacer?", + "profile": "Perfil", + "linked_accounts": "Cuentas vinculadas", + "name": "Nombre", + "logout": "Cerrar sesión", + "last_name": "Apellido", + "role": "Rol de uso", + "day": "Día", + "month": "Mes", + "year": "Año", + "tips": { + "title1": "Estadísticas", + "title2": "Tableros", + "title3": "Historial", + "title4": "Favoritos", + "text1": "Mira las estadísticas de tu paciente/familiar, para ver su actividad y cómo fue mejorando a lo largo de los días, semanas y meses.", + "text2": "Oculta los tableros que no use el usuario, para que le aparezcan los tableros que más utiliza y necesita.", + "text3": "Utiliza el historial para ver tus frases pasadas, qué hiciste durante el día y contar historias.", + "text4": "Guarda pictogramas o frases favoritas, para poder acceder a ellas más rápidamente." + }, + "unlink": "Desvincular", + "unlink_account": "¿Desea desvincular a {name} de sus cuentas?", + "help": { + "help": "¿Necesita ayuda?", + "title1": "Preguntas frecuentes", + "title2": "Contactar con el soporte" + }, + "link": { + "title": "Vincular Cuenta", + "mail": { + "title": "Introduzca el correo electrónico vinculado a la cuenta de OTTAA", + "input": { + "required": "El correo electrónico es obligatorio", + "invalid": "El correo electrónico no es válido" + }, + "warn": "*Se enviará una notificación con un código para enlazar los perfiles.", + "contact": "*Asegurate de estar en contacto con la persona que posea esta cuenta en un dispositivo." + }, + "token": { + "title": "Coloque el código de verificación que llegó como notificación a otro dispositivo.", + "problem": "¿Tiene problemas para vincular las cuentas?", + "resend": "Reenviar código", + "back": "Introducir otro email", + "invalid": "Token no válido" + }, + "wait": { + "title": "Espere", + "subtitle": "Cargando perfil..." + }, + "success": { + "title": "Perfil vinculado con éxito!", + "lastTime": "Últ. vez {date}" + }, + "error": { + "link-exist": "Ya están vinculadas", + "miss-caregiver": "Error: Cuidador 404", + "miss-user": "Error: Usuario 404", + "user-no-comp": "Error: Usuario 406", + "caregiver-no-comp": "Error: Cuidador 406", + "autolink": "Error: Misma cuenta", + "auth/user-not-found": "Usuario no encontrado", + "miss-token": "Falta el Token", + "invalid-token": "Token no válido", + "expired-token": "Token caducado" + } + }, + "delete_account": "Eliminar cuenta" + }, + "user": { + "main": { + "title": "Configura tu experiencia", + "subtitle1": "Uso de la aplicación", + "subtitle2": "Lenguaje predictivo" + }, + "settings": { + "main_screen": "Pantalla principal", + "accessibility": "Accesibilidad", + "voice_and_subtitles": "Voz y subtítulos", + "language": "Lenguaje" + }, + "main_setting": { + "interaction": "Interacciones", + "talk_delete": "Hablar y Borrar", + "shortcut": "Atajos en el Inicio", + "board_view": "Vista de tableros", + "tabs": "Por pestañas", + "grid": "Grilla", + "ottaa_labs": "OTTAA Labs", + "labs_text": "Función frases verbales", + "labs_long": "Función en Modo Beta\nPermite generar frases con tiempos verbales más complejas", + "one_by_one": "ONE by ONE" + }, + "accessibility": { + "selection": "Selección", + "bar_text": "Tiempo de clickeo (Segundos)", + "connected": "Dispositivos conectados", + "device": "Dispositivo de accesibilidad", + "press": "Press&Press", + "scroll": "Scroll&Press", + "sip": "Soplo y succión", + "selection_type": "Tipo de selección", + "swept": "Barrido", + "speed": "Velocidad", + "selection_speed": "Velocidad de selección" + }, + "voice_and_subtitle": { + "voice_types": "Tipos de voz", + "voice_rate": "Velocidad de voz", + "voz1": "Voz 1", + "voz2": "Voz 2", + "voz3": "Voz 3", + "mute": "Silenciar pictogramas", + "subtitle": "Subtítulos", + "show": "Mostrar subtítulos", + "size": "Tamaño", + "capital": "Mayúsculas" + }, + "language": { + "set": "Idioma establecido" + } + }, + "global": { + "hello_world": "Hola Mundo", + "hello": "Hola", + "continue": "Continuar", + "next": "Siguiente", + "back": "Anterior", + "please_enter_text": "Por favor, introduce un texto", + "done": "Listo", + "yes": "Sí", + "delete": "Borrar", + "edit": "Editar", + "no": "No", + "mute": "Silenciar", + "important": "Importante", + "save_changes": "Guardar cambios", + "send": "Enviar", + "skip": "Omitir", + "email": "Email", + "step": "Paso", + "share": "Compartir", + "support": "Soporte", + "congrats": "Felicitaciones", + "settings": "Configuración", + "general": "General", + "pictogram": "Pictogramas", + "configuration": "Configuración", + "user_ottaa": "Usar OTTAA como", + "cancel": "Cancelar", + "slow": "Lenta", + "default": "Predeterminada", + "fast": "Rápida", + "voice": "Voz", + "small": "Pequeño", + "medium": "Mediano", + "big": "Grande", + "comingsoon": "¡Esta característica estará disponible muy pronto!", + "delicate": "Región", + "chile": "Chile", + "spanish": "Español", + "argentina": "Argentina", + "colombia": "Colombia", + "english": "Inglés", + "italian": "Italiano", + "french": "Francés", + "portuguese": "Portugues", + "test": "Esta es la voz que vas a usar en ota", + "add": "Agregar", + "confirm": "Confirmar", + "gallery": "galería", + "arasaac": "ARASAAC", + "text": "Texto", + "color": "Color", + "search": "Buscar", + "actions": "Acciones", + "people": "Personas", + "miscellaneous": "Miscelaneas", + "noun": "Sustantivos", + "adjective": "Adjetivos", + "predictive": "Predictivo", + "sunday": "Domingo", + "monday": "Lunes", + "tuesday": "Martes", + "wednesday": "Miércoles", + "thursday": "Jueves", + "friday": "Viernes", + "saturday": "Sábado", + "tomorrow": "Mañana", + "noon": "Mediodía", + "late": "Tarde", + "evening": "Noche", + "add_new": "Agregar nuevo", + "disguise": "Ocultar", + "save": "Guardar", + "image": "Imágen", + "saved_in": "Guardado en", + "location": "Ubicación", + "voices": "Por favor, instale voces desde la configuración para una mejor usabilidad" + }, + "onboarding": { + "start": "Comenzar", + "profile": { + "title": "Pantalla de perfiles", + "subtitle": "¿Quién va a usar OTTAA hoy?", + "description": "Con la selección de perfiles vas a poder usar OTTAA desde cualquier dispositivo, manteniendo tus pictogramas y estilos!" + }, + "home": { + "title": "Personaliza tu Inicio", + "subtitle": "Atajos en la pantalla principal", + "description": "Personalizá de acuerdo a tus gustos y necesidades" + }, + "customize": { + "title": "Personalizá tu Home", + "subtitle": "Acompañamos en el proceso de aprendizaje", + "description": "Activá o desactivá tableros o pictogramas para modificar la predicción, vos tenés el control." + }, + "skip": { + "title": "¿Estás de acuerdo en saltar la introducción?" + } + }, + "terms": { + "button": "Acepto los términos", + "text": "Para continuar, necesitamos que aceptes los términos y condiciones.\nVer términos" + }, + "loginWait": { + "text": "Te damos la bienvenida!\nAl mundo de OTTAA" + }, + "login": { + "title": "Ingresa con tu cuenta", + "google": "Continuar con Google.", + "facebook": "Continuar con Facebook", + "apple": "Continuar con Apple", + "register": "¿Todavía no tienes cuenta? Regístrate aquí", + "wait": { + "title": "Te damos la bienvenida!", + "subtitle": "Al nuevo mundo de OTTAA Project" + } + }, + "customize": { + "board": { + "title": "¿Qué tableros utilizará el usuario para comunicarse?", + "appbar": "Tableros predictivos", + "skip": "¿Omitir la elección de tableros?", + "subtitle": "Ver pictogramas" + }, + "shortcut": { + "title": "Seleccioná los atajos que aparecerán en la pantalla principal.", + "appbar": "Atajos", + "favorites": "Favoritos", + "history": "Historial", + "camera": "Cámara", + "games": "Juegos" + }, + "picto": { + "title": "Tablero {name}", + "switch": "Activar tablero" + }, + "help": { + "boards": "Los tableros predictivos permiten configurar qué grupo de pictogramas se mostrará en la pantalla del usuario/a final.", + "shortcut": "Los atajos son accesos rápidos a distintas funciones para que el/la usuario/a final disponga en su pantalla principal." + }, + "wait": { + "title": "¡Felicitaciones!", + "subtitle": "Has configurado la experiencia de {name}", + "button": "Ir al panel de perfiles" + }, + "skip": "¿Estás de acuerdo en saltar las preferencias del perfil?" + }, + "home": { + "grid": { + "title": "Tableros", + "pictos": "Tablero {group}" + } + }, + "chatgpt": { + "prompt": "escribir una frase en español con estas palabras como si fueras {gender}, agregando conectores y artículos cuando sea necesario, pero sin cambiar las palabras: {pictograms}" + }, + "notification": { + "code": { + "request": { + "title": "Verificación de OTTAA Link", + "body": "Están intentando vincular tu cuenta con el token {linkToken}" + }, + "confirm": { + "title": "Confirmación de OTTAA Link", + "body": "Se ha confirmado la vinculación de tu cuenta" + } + } + }, + "game": { + "play": "¡Juguemos!", + "next": "Jugar", + "game_header_0": "¿Cuál es el pictograma?", + "game_header_1": "Unir pictogramas", + "game_header_2": "Juego de la Memoria", + "game_header_3": "Armá una historia", + "game_sub_0": "Respondé las preguntas eligiendo el pictograma correcto. Aprende jugando", + "game_sub_1": "Unir los pictogramas de manera correcta", + "game_sub_2": "Prueba tu memoria, ¿Cuánto recuerdas los pictogramas?", + "game_sub_3": "Elegí los pictogramas que más te gusten, y con la ayuda de Chat GPT, crearás una historia.", + "group": "Seleccioná una categoría para poder jugar", + "search": "Buscar Tablero", + "find": "Encuentra los tableros que quieras, fácilmente!", + "game_1_line": "Seleccioná el pictograma que escuches", + "game_2_line": "Seleccioná la palabra que corresponde a su pictograma", + "game_3_line": "Seleccioná una tarjeta y encontrá la pareja del pictograma", + "game_4_line": "Agregá hasta 4 pictogramas y creá tu propia historia", + "no": "¡Oh Oh!", + "yes": "¡Muy bien!", + "correct": "Correcto", + "incorrect": "Incorrecto", + "use_time": "Tiempo total", + "maximum_streak": "Mejor racha", + "speak_what": "¿Cual es el picto {name}?", + "gptbtn": "Crear historia", + "prompt": "Actúa como maestra de jardín de infantes y escribe una historia en español para niños usando las siguientes palabras:", + "nivel": "Nivel" + }, + "exit": { + "long": { + "headline": "¿Deseas volver a la pantalla de perfiles?", + "body": "Mantén presionado el botón resaltado para volver", + "check": "No volver a mostrar este mensaje", + "btn": "De acuerdo" + }, + "short": { + "headline": "¿Confima que deseas volver a la pantalla de perfiles?" + } + }, + "create": { + "heading": "Crear pictograma", + "image_selection": "Elije la imagen que represente al pictograma", + "choose_color": "Elije el color", + "search_arsaac": "Buscar ARASAAC", + "time_headline": "Selecciona los horarios que más se adecuen a sus actividades", + "time_sub1": "¿Qué días de la semana es cuando más lo utiliza?", + "schedule": "¿En qué horario?", + "save": "Guardar pictograma", + "created_by_me": "Creados por mi", + "new_board": "Nuevo tablero", + "create_new_board": "Crear nuevo tablero", + "board_name": "Nombre del tablero", + "edit_picto": "Editar pictograma", + "final_heading": "Listo, chequea que todo este correcto" + } +} diff --git a/assets/i18n/es_BO.json b/assets/i18n/es_BO.json deleted file mode 100644 index 1b2682ab..00000000 --- a/assets/i18n/es_BO.json +++ /dev/null @@ -1,141 +0,0 @@ -{ - "level": "Level", - "report": "Report", - "vocabulary": "Vocabulary", - "most_used_phrases": "MOST USED PHRASES", - "pictogram_by_sentence_on_average": "Pictograms by sentences on average", - "phrases_last_seven_days": "Phrases created in the last 7 days", - "score_text_1": "OTTAA Score is a measure of the overall use of the application, using data as usage in the last days and average picts per sentence.", - "most_used_groups": "Most used Groups", - "ottaa_score": "OTTAA Score", - "favourite_sentence": "Favourite Sentences", - "galeria_grupos": "Gallery Groups", - "add_pict": "Add Pict", - "add_group": "Add Group", - "hello_world": "Hello World", - "we_are_preparing_everything": "We are preparing everything...", - "Hello": "Hello", - "Continue": "Continue", - "Please_register_to": "Please Register to", - "Login_with_google": "Login with Google", - "Login_with_facebook": "Login with Facebook", - "Welcome_this_is_ottaa": "Welcome, this is OTTAA", - "We_help_thousands_of_children_with_speech_problems_to_communicate_improving_their_quality_of_life": "We help thousands of children with speech problems to communicate, improving their quality of life", - "Previous": "Previous", - "Next": "Next", - "Thank_you_for_choosing_ottaa_project": "Thank you for choosing OTTAA PROJECT", - "please_enter_some_text": "Please enter some text", - "Name": "Name", - "Gender": "Gender", - "Date_of_birth": "Date of Birth", - "Lets_get_to_knwo_each_other_first": "Let's get to know each other first", - "We_are_going_to_collect_some_data_to_get_to_know_you_better": "We are going to collect some data to get to know you better", - "Launch_short_tutorial": "Launch short Tutorial", - "Do_a_guided_workshop": "DO A GUIDED WORKSHOP", - "Book_a_demo": "BOOK A DEMO", - "Ottaa_is_a_powerful_communication_tool": "OTTAA is a powerful \ncommunication tool", - "We_offer_you_different_options_so_that_you_learn_how_to_use_it_and_get_the_most_out_of_it": "We offer you different options so that you learn how to use it and get the most out of it.", - "Choose_your_avatar": "Choose your Avatar", - "Final_step_join": "Final step, join", - "Create_your_avatar_to_be_able_to_recognize_you_all_the_time": "Create your Avatar to be able to recognize you all the time", - "Create_your_phrase": "CREATE YOUR PHRASES", - "step1_long": "Touch one or more of the pictograms to create a sentence as long as you like. The pictograms are automatically related and you will always have one more pictogram to add", - "Talk_to_the_world": "TALK TO THE WORLD", - "step2_long": "Once the phrase is created, touch the OTTAA logo to speak aloud or using the share icon, you can send your phrase through the most used social networks", - "Access_thousands_of_pictograms": "ACCESS THOUSANDS OF PICTOGRAMS", - "Step3_long": "In OTTAA you have access to thousands of pictograms so you can talk about whatever you want. Find the Gallery of Pîctos in the lower left corner of the main screen", - "Ready": "Ready", - "Step4_long": "Enter the selection of games to learn while playing. OTTAA has educational games to learn vocabulary, concepts and much more. Also, more games will be available soon.", - "Play_and_learn": "PLAY AND LEARN", - "Male": "Male", - "Female": "Female", - "Binary": "Binary", - "Fluid": "Fluid", - "Other": "Other", - "hola_nnos_conozcamos_un_poco": "Hello,\nLet\"s get to know each other a little bit.", - "vamos_a_pedirte_cierta_informaci_n_para_nmejorar_tu_experiencia_con_ottaa": "We will ask you for certain information\nto improve your experience with OTTAA.", - "check_if_the_info_is_correct_nif_not_change_it_as_you_wish_this_will_help_us_to_personalize_the_app_for_you": "Check if the info is correct,\nif not, change it as you wish. This will help us to personalize the app for you.", - "te_ofrecemos_varias_opciones_para_naprender_a_utilizarla_y_sacarle_el_maximo_provecho": "We offer you several options to\nlearn how to use it and get the most out of it", - "por_ltimo": "At Last!", - "elige_un_personaje_que_nmejor_te_represente": "Choose a character that best represents you", - "edit_pictogram": "Edit pictogram", - "text": "Text", - "frame": "Frame", - "tags": "tags", - "keep_your_ottaa_up_to_date": "Keep your OTTAA up-to-date", - "account_info": "Account Info", - "account": "Account", - "account_type": "Account Type", - "current_ottaa_installed": "Current OTTAA Installed", - "current_ottaa_version": "Current OTTAA Version", - "device_name": "Device Name", - "contact_support": "Contact Support", - "edit": "Edit", - "delete": "Delete", - "fitzgerald_key": "Fitzgerald key", - "actions": "Actions", - "interactions": "Interactions", - "people": "people", - "nouns": "Nouns", - "adjectives": "Adjectives", - "miscellaneous": "Miscellaneous", - "choose_a_tag": "Choose a TAG", - "tags_widget_long_1": "By choosing TAGs you need to predict better when to show certain pictgorams, based on Time,Location, Calender or Weather", - "text_widget_long_1": "Enter the text to say it loud, can be a single word or a full sentence. Is up to you!", - "important": "Important", - "do_you_want_to_save_changes": "Do you want to save changes", - "no": "No", - "yes": "Yes", - "go_back": "Go Back", - "choose_an_option": "Choose an option", - "camera": "Camera", - "gallery": "Gallery", - "download_from_arasaac": "Download from ARASAAC", - "tags_will_come_in_next_release": "TAGs will come in next Release", - "mute": "Mute", - "about_ottaa": "About OTTAA", - "configuration": "Settings", - "tutorial": "Tutorial", - "close_application": "Close Application", - "sign_out": "Sign out", - "language": "Language", - "ottaa_labs": "OTTA Labs", - "language_page_long_1": "Use artificial intelligence to generate a richer sentence. You need a stable internet connection.", - "settings": "Settings", - "SETTINGS": "SETTINGS", - "pictograms": "Pictograms", - "prediction": "Prediction", - "accessibility": "Accessibility", - "voice_and_subtitles": "Voice and subtitles", - "all_phrases": "All Phrases", - "search": "Search", - "please_enter_a_valid_search": "Please enter a valid search", - "choose_a_picto_to_speak": "Choose a Picto to speak", - "we_are_working_on_this_feature": "We are working on this feature", - "most_used_sentences": "Most used Sentences", - "price_one": "Get access today to all the useful features that OTTAA Premium has to offer for only 990 ARS per month.", - "purchase_subscription": "PURCHASE SUBSCRIPTION", - "sentence_1": "Get access to educational games that allow you to evaluate vocabulary in a fun way", - "sentence_2": "Use OTTAA Project with screen scanning, connect accessible buttons and much more.", - "sentence_3": "With the premium version you can use the GPS to have a better prediction based on the commerce or place where you are", - "whats_the_picto": "What\"s the picto?", - "game1": "Answer the questions by choosing the right pictogram.\nLearn by playing!", - "match_picto": "Match Picto", - "game2": "Attach the pictogram correctly", - "memory_game": "Memory Game", - "game3": "Test your memory", - "play": "PLAY", - "select_a_category_to_play": "Select a category to play", - "image": "Image", - "share_text": "please, create a phrase and select the share button", - "text_to_speche_engine": "TEXT-TO-SPEECH-ENGINE", - "enable_custom_tts": "Enable custom TTS", - "speech_rate": "Speech Rate", - "speech_pitch": "Speech Pitch", - "SUBTITLE": "SUBTITLE", - "customized_subtitle": "Customized subtitle", - "size": "Size", - "upperCase": "UpperCase", - "it_allows_uppercase_subtitles": "It allows uppercase subtitles.", - "login_screen": "Hello, welcome to OTTAA Project, the first predictive communication platform for people with speech impairments, please login with your account and fill in some data to benefit from our prediction." -} \ No newline at end of file diff --git a/assets/i18n/es_CL.json b/assets/i18n/es_CL.json index 1b2682ab..b5bec778 100644 --- a/assets/i18n/es_CL.json +++ b/assets/i18n/es_CL.json @@ -1,141 +1,388 @@ { - "level": "Level", - "report": "Report", - "vocabulary": "Vocabulary", - "most_used_phrases": "MOST USED PHRASES", - "pictogram_by_sentence_on_average": "Pictograms by sentences on average", - "phrases_last_seven_days": "Phrases created in the last 7 days", - "score_text_1": "OTTAA Score is a measure of the overall use of the application, using data as usage in the last days and average picts per sentence.", - "most_used_groups": "Most used Groups", - "ottaa_score": "OTTAA Score", - "favourite_sentence": "Favourite Sentences", - "galeria_grupos": "Gallery Groups", - "add_pict": "Add Pict", - "add_group": "Add Group", - "hello_world": "Hello World", - "we_are_preparing_everything": "We are preparing everything...", - "Hello": "Hello", - "Continue": "Continue", - "Please_register_to": "Please Register to", - "Login_with_google": "Login with Google", - "Login_with_facebook": "Login with Facebook", - "Welcome_this_is_ottaa": "Welcome, this is OTTAA", - "We_help_thousands_of_children_with_speech_problems_to_communicate_improving_their_quality_of_life": "We help thousands of children with speech problems to communicate, improving their quality of life", - "Previous": "Previous", - "Next": "Next", - "Thank_you_for_choosing_ottaa_project": "Thank you for choosing OTTAA PROJECT", - "please_enter_some_text": "Please enter some text", - "Name": "Name", - "Gender": "Gender", - "Date_of_birth": "Date of Birth", - "Lets_get_to_knwo_each_other_first": "Let's get to know each other first", - "We_are_going_to_collect_some_data_to_get_to_know_you_better": "We are going to collect some data to get to know you better", - "Launch_short_tutorial": "Launch short Tutorial", - "Do_a_guided_workshop": "DO A GUIDED WORKSHOP", - "Book_a_demo": "BOOK A DEMO", - "Ottaa_is_a_powerful_communication_tool": "OTTAA is a powerful \ncommunication tool", - "We_offer_you_different_options_so_that_you_learn_how_to_use_it_and_get_the_most_out_of_it": "We offer you different options so that you learn how to use it and get the most out of it.", - "Choose_your_avatar": "Choose your Avatar", - "Final_step_join": "Final step, join", - "Create_your_avatar_to_be_able_to_recognize_you_all_the_time": "Create your Avatar to be able to recognize you all the time", - "Create_your_phrase": "CREATE YOUR PHRASES", - "step1_long": "Touch one or more of the pictograms to create a sentence as long as you like. The pictograms are automatically related and you will always have one more pictogram to add", - "Talk_to_the_world": "TALK TO THE WORLD", - "step2_long": "Once the phrase is created, touch the OTTAA logo to speak aloud or using the share icon, you can send your phrase through the most used social networks", - "Access_thousands_of_pictograms": "ACCESS THOUSANDS OF PICTOGRAMS", - "Step3_long": "In OTTAA you have access to thousands of pictograms so you can talk about whatever you want. Find the Gallery of Pîctos in the lower left corner of the main screen", - "Ready": "Ready", - "Step4_long": "Enter the selection of games to learn while playing. OTTAA has educational games to learn vocabulary, concepts and much more. Also, more games will be available soon.", - "Play_and_learn": "PLAY AND LEARN", - "Male": "Male", - "Female": "Female", - "Binary": "Binary", - "Fluid": "Fluid", - "Other": "Other", - "hola_nnos_conozcamos_un_poco": "Hello,\nLet\"s get to know each other a little bit.", - "vamos_a_pedirte_cierta_informaci_n_para_nmejorar_tu_experiencia_con_ottaa": "We will ask you for certain information\nto improve your experience with OTTAA.", - "check_if_the_info_is_correct_nif_not_change_it_as_you_wish_this_will_help_us_to_personalize_the_app_for_you": "Check if the info is correct,\nif not, change it as you wish. This will help us to personalize the app for you.", - "te_ofrecemos_varias_opciones_para_naprender_a_utilizarla_y_sacarle_el_maximo_provecho": "We offer you several options to\nlearn how to use it and get the most out of it", - "por_ltimo": "At Last!", - "elige_un_personaje_que_nmejor_te_represente": "Choose a character that best represents you", - "edit_pictogram": "Edit pictogram", - "text": "Text", - "frame": "Frame", - "tags": "tags", - "keep_your_ottaa_up_to_date": "Keep your OTTAA up-to-date", - "account_info": "Account Info", - "account": "Account", - "account_type": "Account Type", - "current_ottaa_installed": "Current OTTAA Installed", - "current_ottaa_version": "Current OTTAA Version", - "device_name": "Device Name", - "contact_support": "Contact Support", - "edit": "Edit", - "delete": "Delete", - "fitzgerald_key": "Fitzgerald key", - "actions": "Actions", - "interactions": "Interactions", - "people": "people", - "nouns": "Nouns", - "adjectives": "Adjectives", - "miscellaneous": "Miscellaneous", - "choose_a_tag": "Choose a TAG", - "tags_widget_long_1": "By choosing TAGs you need to predict better when to show certain pictgorams, based on Time,Location, Calender or Weather", - "text_widget_long_1": "Enter the text to say it loud, can be a single word or a full sentence. Is up to you!", - "important": "Important", - "do_you_want_to_save_changes": "Do you want to save changes", - "no": "No", - "yes": "Yes", - "go_back": "Go Back", - "choose_an_option": "Choose an option", - "camera": "Camera", - "gallery": "Gallery", - "download_from_arasaac": "Download from ARASAAC", - "tags_will_come_in_next_release": "TAGs will come in next Release", - "mute": "Mute", - "about_ottaa": "About OTTAA", - "configuration": "Settings", - "tutorial": "Tutorial", - "close_application": "Close Application", - "sign_out": "Sign out", - "language": "Language", - "ottaa_labs": "OTTA Labs", - "language_page_long_1": "Use artificial intelligence to generate a richer sentence. You need a stable internet connection.", - "settings": "Settings", - "SETTINGS": "SETTINGS", - "pictograms": "Pictograms", - "prediction": "Prediction", - "accessibility": "Accessibility", - "voice_and_subtitles": "Voice and subtitles", - "all_phrases": "All Phrases", - "search": "Search", - "please_enter_a_valid_search": "Please enter a valid search", - "choose_a_picto_to_speak": "Choose a Picto to speak", - "we_are_working_on_this_feature": "We are working on this feature", - "most_used_sentences": "Most used Sentences", - "price_one": "Get access today to all the useful features that OTTAA Premium has to offer for only 990 ARS per month.", - "purchase_subscription": "PURCHASE SUBSCRIPTION", - "sentence_1": "Get access to educational games that allow you to evaluate vocabulary in a fun way", - "sentence_2": "Use OTTAA Project with screen scanning, connect accessible buttons and much more.", - "sentence_3": "With the premium version you can use the GPS to have a better prediction based on the commerce or place where you are", - "whats_the_picto": "What\"s the picto?", - "game1": "Answer the questions by choosing the right pictogram.\nLearn by playing!", - "match_picto": "Match Picto", - "game2": "Attach the pictogram correctly", - "memory_game": "Memory Game", - "game3": "Test your memory", - "play": "PLAY", - "select_a_category_to_play": "Select a category to play", - "image": "Image", - "share_text": "please, create a phrase and select the share button", - "text_to_speche_engine": "TEXT-TO-SPEECH-ENGINE", - "enable_custom_tts": "Enable custom TTS", - "speech_rate": "Speech Rate", - "speech_pitch": "Speech Pitch", - "SUBTITLE": "SUBTITLE", - "customized_subtitle": "Customized subtitle", - "size": "Size", - "upperCase": "UpperCase", - "it_allows_uppercase_subtitles": "It allows uppercase subtitles.", - "login_screen": "Hello, welcome to OTTAA Project, the first predictive communication platform for people with speech impairments, please login with your account and fill in some data to benefit from our prediction." -} \ No newline at end of file + "profile": { + "selection": { + "text1": "¿Quién va a utilizar la aplicación en este dispositivo?", + "caregiver_text": "Necesita comunicarse", + "user_text": "Necesita comunicarse" + }, + "hello": "Hola {name}!", + "ottaa": { + "tips": "OTTAA tips" + }, + "mail": "Correo electrónico", + "date": "Fecha de nacimiento", + "faq": { + "title": "Preguntas frecuentes", + "faq0": "¿Quién puede usar la aplicación OTTAA?", + "faq0Description": "OTTAA está diseñado para personas no verbales, es decir, cualquier persona que no utilice el habla oral para comunicarse. Las personas que usan OTTAA hoy en día fueron diagnosticadas con autismo, parálisis cerebral, síndrome de Down, esclerosis lateral amiotrófica (ELA), atrofia muscular espinal (AME) o síndrome de enclaustramiento post al accidente cerebrovascular (LiS), entre otras afecciones. Al ser una herramienta de comunicación dinámica, OTTAA requiere que sus usuarios posean funciones cognitivas de nivel medio a alto. Sin embargo, nos gusta considerar cada caso individualmente, así que no dude en ponerse en contacto y solicitar una evaluación en línea con nuestro equipo.", + "faq1": "¿Cómo funciona la aplicación?", + "faq1Description": "La aplicación OTTAA proporciona al usuario pictogramas: imágenes que representan acciones, objetos, sentimientos o emociones. El usuario puede elegir los pictogramas que necesita y crear una frase, esta se traduce de los pictogramas a una oración escrita que aparece en la pantalla y que la aplicación también lee en voz alta. Consulta nuestro canal de Youtube para obtener una explicación más visual.", + "faq2": "¿En qué se diferencia esta aplicación de otros dispositivos AAC (comunicación aumentativa y alternativa)?", + "faq2Description": "La aplicación OTTAA es diferente de otras aplicaciones de CAA debido a su innovador algoritmo predictivo y generador de lenguaje natural, que permite que la aplicación aprenda del comportamiento del usuario en la aplicación, su edad, sexo, la hora del día y su ubicación para pre -seleccionar pictograma(s) para el momento comunicacional en el que se encuentran.", + "faq3": "¿Cuánto cuesta la aplicación OTTAA?", + "faq3Description": "La aplicación OTTAA es gratuita para descargar y usar. Para crear un producto sostenible que resista el paso del tiempo, hay algunas características que requieren una suscripción para utilizarlas. Sin embargo, estamos trabajando arduamente para brindar financiamiento a todos los que lo necesitan.\n\nSi estás en Argentina, cualquier ayuda técnica que necesite una persona debe estar cubierto por un seguro de salud. Comuníquese con nuestro equipo para obtener orientación y asistencia sobre cómo obtener esta cobertura.\n\nSi sos de cualquier otro país de LATAM y querés compartir tu experiencia sobre este tema, no dudes en comunicarte, tu contribución podría ayudar a muchas personas.", + "faq4": "¿Qué idiomas son compatibles con el Proyecto OTTAA?", + "faq4Description": "Actualmente admitimos español, inglés, portugués y francés. Para español, tenemos versiones localizadas de Argentina, Chile, Colombia y España. Estamos buscando activamente contribuciones sobre nuevos idiomas o una mejor localización para las variedades españolas. Únete a nuestra comunidad de crowdin para contribuir.", + "faq5": "¿Cómo puedo colaborar con el Proyecto OTTAA?", + "faq5Description": "Los colaboradores pueden ayudar a OTTAA con el desarrollo, las pruebas y/o la traducción. Para leer más sobre el tema y comenzar, consulta la sección Contribuir en el repositorio oficial de OTTAA en GitHub." + }, + "caregiver": "Acompañante", + "caregivers_families": "Profesionales/Familiares", + "user": "Usuario/a", + "user_description": "Persona no verbal", + "wait": "Por favor espera", + "setting_exp": "Configurando tu experiencia...", + "link_account": "Vincular una cuenta", + "use": { + "ottaa": "Utilizar OTTAA" + }, + "close_profile": "Ocultar", + "open_profile": "Ver perfil", + "no_account": "Modo sin perfil", + "new_existant": "Nuevo/Existente", + "what_do": "¿Qué quieres hacer?", + "profile": "Perfil", + "linked_accounts": "Cuentas vinculadas", + "name": "Nombre", + "logout": "Cerrar sesión", + "last_name": "Apellido", + "role": "Rol de uso", + "day": "Día", + "month": "Mes", + "year": "Año", + "tips": { + "title1": "Estadísticas", + "title2": "Tableros", + "title3": "Historial", + "title4": "Favoritos", + "text1": "Mira las estadísticas de tu paciente/familiar, para ver su actividad y cómo fue mejorando a lo largo de los días, semanas y meses.", + "text2": "Oculta los tableros que no use el usuario, para que le aparezcan los tableros que más utiliza y necesita.", + "text3": "Utiliza el historial para ver tus frases pasadas, qué hiciste durante el día y contar historias.", + "text4": "Guarda pictogramas o frases favoritas, para poder acceder a ellas más rápidamente." + }, + "unlink": "Desvincular", + "unlink_account": "¿Desea desvincular a {name} de sus cuentas?", + "help": { + "help": "¿Necesita ayuda?", + "title1": "Preguntas frecuentes", + "title2": "Contactar con el soporte" + }, + "link": { + "title": "Vincular Cuenta", + "mail": { + "title": "Introduzca el correo electrónico vinculado a la cuenta de OTTAA", + "input": { + "required": "El correo electrónico es obligatorio", + "invalid": "El correo electrónico no es válido" + }, + "warn": "*Se enviará una notificación con un código para vincular los perfiles.", + "contact": "Asegúrate de estar en contacto con la persona que posea esta cuenta en un dispositivo." + }, + "token": { + "title": "Coloque el código de verificación que llegó como notificación a otro dispositivo.", + "problem": "¿Tiene problemas para vincular las cuentas?", + "resend": "Reenviar código", + "back": "Introducir otro email", + "invalid": "Token no válido" + }, + "wait": { + "title": "Espere", + "subtitle": "Cargando perfil..." + }, + "success": { + "title": "Perfil vinculado con éxito!", + "lastTime": "Últ. vez {date}" + }, + "error": { + "link-exist": "Ya están vinculadas", + "miss-caregiver": "Error: Cuidador 404", + "miss-user": "Error: Usuario 404", + "user-no-comp": "Error: Usuario 406", + "caregiver-no-comp": "Error: Cuidador 406", + "autolink": "Error: Misma cuenta", + "auth/user-not-found": "Usuario no encontrado", + "miss-token": "Falta el Token", + "invalid-token": "Token no válido", + "expired-token": "Token caducado" + } + }, + "delete_account": "Eliminar cuenta" + }, + "user": { + "main": { + "title": "Configura tu experiencia", + "subtitle1": "Uso de la aplicación", + "subtitle2": "Lenguaje predictivo" + }, + "settings": { + "main_screen": "Pantalla principal", + "accessibility": "Accesibilidad", + "voice_and_subtitles": "Voz y subtítulos", + "language": "Lenguaje" + }, + "main_setting": { + "interaction": "Interacciones", + "talk_delete": "Hablar y Borrar", + "shortcut": "Atajos en el Inicio", + "board_view": "Vista de tableros", + "tabs": "Por pestañas", + "grid": "Grilla", + "ottaa_labs": "OTTAA Labs", + "labs_text": "Función frases verbales", + "labs_long": "Función en Modo Beta\nPermite generar frases con tiempos verbales más complejas", + "one_by_one": "ONE by ONE" + }, + "accessibility": { + "selection": "Selección", + "bar_text": "Tiempo de clickeo (Segundos)", + "connected": "Dispositivos conectados", + "device": "Dispositivo de accesibilidad", + "press": "Press&Press", + "scroll": "Scroll&Press", + "sip": "Soplo y succión", + "selection_type": "Tipo de selección", + "swept": "Barrido", + "speed": "Velocidad", + "selection_speed": "Velocidad de selección" + }, + "voice_and_subtitle": { + "voice_types": "Tipos de voz", + "voice_rate": "Velocidad de voz", + "voz1": "Voz 1", + "voz2": "Voz 2", + "voz3": "Voz 3", + "mute": "Silenciar pictogramas", + "subtitle": "Subtítulos", + "show": "Mostrar subtítulos", + "size": "Tamaño", + "capital": "Mayúsculas" + }, + "language": { + "set": "Idioma establecido" + } + }, + "global": { + "hello_world": "Hola Mundo", + "hello": "Hola", + "continue": "Continuar", + "next": "Siguiente", + "back": "Anterior", + "please_enter_text": "Por favor, introduce un texto", + "done": "Listo", + "yes": "Sí", + "delete": "Borrar", + "edit": "Editar", + "no": "No", + "mute": "Silenciar", + "important": "Importante", + "save_changes": "Guardar cambios", + "send": "Enviar", + "skip": "Omitir", + "email": "Email", + "step": "Paso", + "share": "Compartir", + "support": "Soporte", + "congrats": "Felicitaciones", + "settings": "Configuración", + "general": "General", + "pictogram": "Pictogramas", + "configuration": "Configuración", + "user_ottaa": "Usar OTTAA como", + "cancel": "Cancelar", + "slow": "Lenta", + "default": "Predeterminada", + "fast": "Rápida", + "voice": "Voz", + "small": "Pequeño", + "medium": "Mediano", + "big": "Grande", + "comingsoon": "¡Esta característica estará disponible muy pronto!", + "delicate": "Región", + "chile": "Chile", + "spanish": "Español", + "argentina": "Argentina", + "colombia": "Colombia", + "english": "Inglés", + "italian": "Italiano", + "french": "Francés", + "portuguese": "Portugues", + "test": "Esta es la voz que vas a usar en ota", + "add": "Añadir", + "confirm": "Confirmar", + "gallery": "galería", + "arasaac": "ARASAAC", + "text": "Texto", + "color": "Color", + "search": "Buscar", + "actions": "Acciones", + "people": "Personas", + "miscellaneous": "Miscelaneas", + "noun": "Sustantivos", + "adjective": "Adjetivos", + "predictive": "Predictivo", + "sunday": "Domingo", + "monday": "Lunes", + "tuesday": "Martes", + "wednesday": "Miércoles", + "thursday": "Jueves", + "friday": "Viernes", + "saturday": "Sábado", + "tomorrow": "Mañana", + "noon": "Mediodía", + "late": "Tarde", + "evening": "Noche", + "add_new": "Agregar nuevo", + "disguise": "Ocultar", + "save": "Guardar", + "image": "Imágen", + "saved_in": "Guardado en", + "location": "Ubicación", + "voices": "Por favor, instale voces desde la configuración para una mejor usabilidad" + }, + "onboarding": { + "start": "Comenzar", + "profile": { + "title": "Pantalla de perfiles", + "subtitle": "¿Quién va a usar OTTAA hoy?", + "description": "Con la selección de perfiles vas a poder usar OTTAA desde cualquier dispositivo, manteniendo tus pictogramas y estilos!" + }, + "home": { + "title": "Personaliza tu Inicio", + "subtitle": "Atajos en la pantalla principal", + "description": "Personaliza de acuerdo a tus gustos y necesidades" + }, + "customize": { + "title": "Personaliza tu Inicio", + "subtitle": "Acompañamos en el proceso de aprendizaje", + "description": "Activa o desactiva tableros o pictogramas para modificar la predicción, tú tienes el control." + }, + "skip": { + "title": "¿Estás de acuerdo en saltar la introducción?" + } + }, + "terms": { + "button": "Acepto los términos", + "text": "Para continuar, necesitamos que aceptes los términos y condiciones.\nVer términos" + }, + "loginWait": { + "text": "Te damos la bienvenida!\nAl mundo de OTTAA" + }, + "login": { + "title": "Ingresa con tu cuenta", + "google": "Continuar con Google.", + "facebook": "Continuar con Facebook", + "apple": "Continuar con Apple", + "register": "¿Todavía no tienes cuenta? Regístrate aquí", + "wait": { + "title": "Te damos la bienvenida!", + "subtitle": "Al nuevo mundo de OTTAA Project" + } + }, + "customize": { + "board": { + "title": "¿Qué tableros utilizará el usuario para comunicarse?", + "appbar": "Tableros predictivos", + "skip": "¿Omitir la elección de tableros?", + "subtitle": "Ver pictogramas" + }, + "shortcut": { + "title": "Selecciona los atajos que aparecerán en la pantalla principal.", + "appbar": "Atajos", + "favorites": "Favoritos", + "history": "Historial", + "camera": "Cámara", + "games": "Juegos" + }, + "picto": { + "title": "Tablero {name}", + "switch": "Activar tablero" + }, + "help": { + "boards": "Los tableros predictivos permiten configurar qué grupo de pictogramas se mostrará en la pantalla del usuario/a final.", + "shortcut": "Los atajos son accesos rápidos a distintas funciones para que el/la usuario/a final disponga en su pantalla principal." + }, + "wait": { + "title": "¡Felicitaciones!", + "subtitle": "Has configurado la experiencia de {name}", + "button": "Ir al panel de perfiles" + }, + "skip": "¿Estás de acuerdo en saltar las preferencias del perfil?" + }, + "home": { + "grid": { + "title": "Tableros", + "pictos": "Tablero {group}" + } + }, + "chatgpt": { + "prompt": "escribir una frase en español con estas palabras como si fueras {gender}, agregando conectores y artículos cuando sea necesario, pero sin cambiar las palabras: {pictograms}" + }, + "notification": { + "code": { + "request": { + "title": "Verificación de OTTAA Link", + "body": "Están intentando vincular tu cuenta con el token {linkToken}" + }, + "confirm": { + "title": "Confirmación de OTTAA Link", + "body": "Se ha confirmado la vinculación de tu cuenta" + } + } + }, + "game": { + "play": "¡Juguemos!", + "next": "Jugar", + "game_header_0": "¿Cuál es el pictograma?", + "game_header_1": "Unir pictogramas", + "game_header_2": "Juego de la Memoria", + "game_header_3": "Crea una historia", + "game_sub_0": "Respondé las preguntas eligiendo el pictograma correcto. Aprende jugando", + "game_sub_1": "Unir los pictogramas de manera correcta", + "game_sub_2": "Prueba tu memoria, ¿Cuánto recuerdas los pictogramas?", + "game_sub_3": "Elige los pictogramas que más te gusten, y con la ayuda de Chat GPT, crearás una historia.", + "group": "Selecciona una categoría para poder jugar", + "search": "Buscar Tablero", + "find": "Encuentra los tableros que quieras, fácilmente!", + "game_1_line": "Selecciona el pictograma que escuches", + "game_2_line": "Selecciona la palabra que corresponde a su pictograma", + "game_3_line": "Selecciona una tarjeta y encuentra la pareja del pictograma", + "game_4_line": "Agrega hasta 4 pictogramas y crea tu propia historia", + "no": "¡Oh Oh!", + "yes": "¡Muy bien!", + "correct": "Correcto", + "incorrect": "Incorrecto", + "use_time": "Tiempo total", + "maximum_streak": "Mejor racha", + "speak_what": "¿Cual es el picto {name}?", + "gptbtn": "Crear una historia", + "prompt": "Actúa como maestra de jardín de infantes y escribe una historia en español para niños usando las siguientes palabras:", + "nivel": "Nivel" + }, + "exit": { + "long": { + "headline": "¿Deseas volver a la pantalla de perfiles?", + "body": "Mantén presionado el botón resaltado para volver", + "check": "No volver a mostrar este mensaje", + "btn": "De acuerdo" + }, + "short": { + "headline": "¿Confima que deseas volver a la pantalla de perfiles?" + } + }, + "create": { + "heading": "Crear pictograma", + "image_selection": "Elije la imagen que represente al pictograma", + "choose_color": "Elije el color", + "search_arsaac": "Buscar ARASAAC", + "time_headline": "Selecciona los horarios que más se adecuen a sus actividades", + "time_sub1": "¿Qué días de la semana es cuando más lo utiliza?", + "schedule": "¿En qué horario?", + "save": "Guardar pictograma", + "created_by_me": "Creados por mi", + "new_board": "Nuevo tablero", + "create_new_board": "Crear nuevo tablero", + "board_name": "Nombre del tablero", + "edit_picto": "Editar pictograma", + "final_heading": "Listo, chequea que todo este correcto" + } +} diff --git a/assets/i18n/es_CO.json b/assets/i18n/es_CO.json index 1b2682ab..69382dd1 100644 --- a/assets/i18n/es_CO.json +++ b/assets/i18n/es_CO.json @@ -1,141 +1,388 @@ { - "level": "Level", - "report": "Report", - "vocabulary": "Vocabulary", - "most_used_phrases": "MOST USED PHRASES", - "pictogram_by_sentence_on_average": "Pictograms by sentences on average", - "phrases_last_seven_days": "Phrases created in the last 7 days", - "score_text_1": "OTTAA Score is a measure of the overall use of the application, using data as usage in the last days and average picts per sentence.", - "most_used_groups": "Most used Groups", - "ottaa_score": "OTTAA Score", - "favourite_sentence": "Favourite Sentences", - "galeria_grupos": "Gallery Groups", - "add_pict": "Add Pict", - "add_group": "Add Group", - "hello_world": "Hello World", - "we_are_preparing_everything": "We are preparing everything...", - "Hello": "Hello", - "Continue": "Continue", - "Please_register_to": "Please Register to", - "Login_with_google": "Login with Google", - "Login_with_facebook": "Login with Facebook", - "Welcome_this_is_ottaa": "Welcome, this is OTTAA", - "We_help_thousands_of_children_with_speech_problems_to_communicate_improving_their_quality_of_life": "We help thousands of children with speech problems to communicate, improving their quality of life", - "Previous": "Previous", - "Next": "Next", - "Thank_you_for_choosing_ottaa_project": "Thank you for choosing OTTAA PROJECT", - "please_enter_some_text": "Please enter some text", - "Name": "Name", - "Gender": "Gender", - "Date_of_birth": "Date of Birth", - "Lets_get_to_knwo_each_other_first": "Let's get to know each other first", - "We_are_going_to_collect_some_data_to_get_to_know_you_better": "We are going to collect some data to get to know you better", - "Launch_short_tutorial": "Launch short Tutorial", - "Do_a_guided_workshop": "DO A GUIDED WORKSHOP", - "Book_a_demo": "BOOK A DEMO", - "Ottaa_is_a_powerful_communication_tool": "OTTAA is a powerful \ncommunication tool", - "We_offer_you_different_options_so_that_you_learn_how_to_use_it_and_get_the_most_out_of_it": "We offer you different options so that you learn how to use it and get the most out of it.", - "Choose_your_avatar": "Choose your Avatar", - "Final_step_join": "Final step, join", - "Create_your_avatar_to_be_able_to_recognize_you_all_the_time": "Create your Avatar to be able to recognize you all the time", - "Create_your_phrase": "CREATE YOUR PHRASES", - "step1_long": "Touch one or more of the pictograms to create a sentence as long as you like. The pictograms are automatically related and you will always have one more pictogram to add", - "Talk_to_the_world": "TALK TO THE WORLD", - "step2_long": "Once the phrase is created, touch the OTTAA logo to speak aloud or using the share icon, you can send your phrase through the most used social networks", - "Access_thousands_of_pictograms": "ACCESS THOUSANDS OF PICTOGRAMS", - "Step3_long": "In OTTAA you have access to thousands of pictograms so you can talk about whatever you want. Find the Gallery of Pîctos in the lower left corner of the main screen", - "Ready": "Ready", - "Step4_long": "Enter the selection of games to learn while playing. OTTAA has educational games to learn vocabulary, concepts and much more. Also, more games will be available soon.", - "Play_and_learn": "PLAY AND LEARN", - "Male": "Male", - "Female": "Female", - "Binary": "Binary", - "Fluid": "Fluid", - "Other": "Other", - "hola_nnos_conozcamos_un_poco": "Hello,\nLet\"s get to know each other a little bit.", - "vamos_a_pedirte_cierta_informaci_n_para_nmejorar_tu_experiencia_con_ottaa": "We will ask you for certain information\nto improve your experience with OTTAA.", - "check_if_the_info_is_correct_nif_not_change_it_as_you_wish_this_will_help_us_to_personalize_the_app_for_you": "Check if the info is correct,\nif not, change it as you wish. This will help us to personalize the app for you.", - "te_ofrecemos_varias_opciones_para_naprender_a_utilizarla_y_sacarle_el_maximo_provecho": "We offer you several options to\nlearn how to use it and get the most out of it", - "por_ltimo": "At Last!", - "elige_un_personaje_que_nmejor_te_represente": "Choose a character that best represents you", - "edit_pictogram": "Edit pictogram", - "text": "Text", - "frame": "Frame", - "tags": "tags", - "keep_your_ottaa_up_to_date": "Keep your OTTAA up-to-date", - "account_info": "Account Info", - "account": "Account", - "account_type": "Account Type", - "current_ottaa_installed": "Current OTTAA Installed", - "current_ottaa_version": "Current OTTAA Version", - "device_name": "Device Name", - "contact_support": "Contact Support", - "edit": "Edit", - "delete": "Delete", - "fitzgerald_key": "Fitzgerald key", - "actions": "Actions", - "interactions": "Interactions", - "people": "people", - "nouns": "Nouns", - "adjectives": "Adjectives", - "miscellaneous": "Miscellaneous", - "choose_a_tag": "Choose a TAG", - "tags_widget_long_1": "By choosing TAGs you need to predict better when to show certain pictgorams, based on Time,Location, Calender or Weather", - "text_widget_long_1": "Enter the text to say it loud, can be a single word or a full sentence. Is up to you!", - "important": "Important", - "do_you_want_to_save_changes": "Do you want to save changes", - "no": "No", - "yes": "Yes", - "go_back": "Go Back", - "choose_an_option": "Choose an option", - "camera": "Camera", - "gallery": "Gallery", - "download_from_arasaac": "Download from ARASAAC", - "tags_will_come_in_next_release": "TAGs will come in next Release", - "mute": "Mute", - "about_ottaa": "About OTTAA", - "configuration": "Settings", - "tutorial": "Tutorial", - "close_application": "Close Application", - "sign_out": "Sign out", - "language": "Language", - "ottaa_labs": "OTTA Labs", - "language_page_long_1": "Use artificial intelligence to generate a richer sentence. You need a stable internet connection.", - "settings": "Settings", - "SETTINGS": "SETTINGS", - "pictograms": "Pictograms", - "prediction": "Prediction", - "accessibility": "Accessibility", - "voice_and_subtitles": "Voice and subtitles", - "all_phrases": "All Phrases", - "search": "Search", - "please_enter_a_valid_search": "Please enter a valid search", - "choose_a_picto_to_speak": "Choose a Picto to speak", - "we_are_working_on_this_feature": "We are working on this feature", - "most_used_sentences": "Most used Sentences", - "price_one": "Get access today to all the useful features that OTTAA Premium has to offer for only 990 ARS per month.", - "purchase_subscription": "PURCHASE SUBSCRIPTION", - "sentence_1": "Get access to educational games that allow you to evaluate vocabulary in a fun way", - "sentence_2": "Use OTTAA Project with screen scanning, connect accessible buttons and much more.", - "sentence_3": "With the premium version you can use the GPS to have a better prediction based on the commerce or place where you are", - "whats_the_picto": "What\"s the picto?", - "game1": "Answer the questions by choosing the right pictogram.\nLearn by playing!", - "match_picto": "Match Picto", - "game2": "Attach the pictogram correctly", - "memory_game": "Memory Game", - "game3": "Test your memory", - "play": "PLAY", - "select_a_category_to_play": "Select a category to play", - "image": "Image", - "share_text": "please, create a phrase and select the share button", - "text_to_speche_engine": "TEXT-TO-SPEECH-ENGINE", - "enable_custom_tts": "Enable custom TTS", - "speech_rate": "Speech Rate", - "speech_pitch": "Speech Pitch", - "SUBTITLE": "SUBTITLE", - "customized_subtitle": "Customized subtitle", - "size": "Size", - "upperCase": "UpperCase", - "it_allows_uppercase_subtitles": "It allows uppercase subtitles.", - "login_screen": "Hello, welcome to OTTAA Project, the first predictive communication platform for people with speech impairments, please login with your account and fill in some data to benefit from our prediction." -} \ No newline at end of file + "profile": { + "selection": { + "text1": "¿Quién va a utilizar la aplicación en este dispositivo?", + "caregiver_text": "Necesita comunicarse", + "user_text": "Necesita comunicarse" + }, + "hello": "Hola {name}!", + "ottaa": { + "tips": "OTTAA tips" + }, + "mail": "Correo electrónico", + "date": "Fecha de nacimiento", + "faq": { + "title": "Preguntas frecuentes", + "faq0": "¿Quién puede usar la aplicación OTTAA?", + "faq0Description": "OTTAA está diseñado para personas no verbales, es decir, cualquier persona que no utilice el habla oral para comunicarse. Las personas que usan OTTAA hoy en día fueron diagnosticadas con autismo, parálisis cerebral, síndrome de Down, esclerosis lateral amiotrófica (ELA), atrofia muscular espinal (AME) o síndrome de enclaustramiento post al accidente cerebrovascular (LiS), entre otras afecciones. Al ser una herramienta de comunicación dinámica, OTTAA requiere que sus usuarios posean funciones cognitivas de nivel medio a alto. Sin embargo, nos gusta considerar cada caso individualmente, así que no dude en ponerse en contacto y solicitar una evaluación en línea con nuestro equipo.", + "faq1": "¿Cómo funciona la aplicación?", + "faq1Description": "La aplicación OTTAA proporciona al usuario pictogramas: imágenes que representan acciones, objetos, sentimientos o emociones. El usuario puede elegir los pictogramas que necesita y crear una frase, esta se traduce de los pictogramas a una oración escrita que aparece en la pantalla y que la aplicación también lee en voz alta. Consulta nuestro canal de Youtube para obtener una explicación más visual.", + "faq2": "¿En qué se diferencia esta aplicación de otros dispositivos AAC (comunicación aumentativa y alternativa)?", + "faq2Description": "La aplicación OTTAA es diferente de otras aplicaciones de CAA debido a su innovador algoritmo predictivo y generador de lenguaje natural, que permite que la aplicación aprenda del comportamiento del usuario en la aplicación, su edad, sexo, la hora del día y su ubicación para pre -seleccionar pictograma(s) para el momento comunicacional en el que se encuentran.", + "faq3": "¿Cuánto cuesta la aplicación OTTAA?", + "faq3Description": "La aplicación OTTAA es gratuita para descargar y usar. Para crear un producto sostenible que resista el paso del tiempo, hay algunas características que requieren una suscripción para utilizarlas. Sin embargo, estamos trabajando arduamente para brindar financiamiento a todos los que lo necesitan.\n\nSi estás en Argentina, cualquier ayuda técnica que necesite una persona debe estar cubierto por un seguro de salud. Comuníquese con nuestro equipo para obtener orientación y asistencia sobre cómo obtener esta cobertura.\n\nSi sos de cualquier otro país de LATAM y querés compartir tu experiencia sobre este tema, no dudes en comunicarte, tu contribución podría ayudar a muchas personas.", + "faq4": "¿Qué idiomas son compatibles con el Proyecto OTTAA?", + "faq4Description": "Actualmente admitimos español, inglés, portugués y francés. Para español, tenemos versiones localizadas de Argentina, Chile, Colombia y España. Estamos buscando activamente contribuciones sobre nuevos idiomas o una mejor localización para las variedades españolas. Únete a nuestra comunidad de crowdin para contribuir.", + "faq5": "¿Cómo puedo colaborar con el Proyecto OTTAA?", + "faq5Description": "Los colaboradores pueden ayudar a OTTAA con el desarrollo, las pruebas y/o la traducción. Para leer más sobre el tema y comenzar, consulta la sección Contribuir en el repositorio oficial de OTTAA en GitHub." + }, + "caregiver": "Acompañante", + "caregivers_families": "Profesionales/Familiares", + "user": "Usuario/a", + "user_description": "Persona no verbal", + "wait": "Por favor espera", + "setting_exp": "Configurando tu experiencia...", + "link_account": "Vincular una cuenta", + "use": { + "ottaa": "Utilizar OTTAA" + }, + "close_profile": "Ocultar", + "open_profile": "Ver perfil", + "no_account": "Modo sin perfil", + "new_existant": "Nuevo/Existente", + "what_do": "¿Qué quieres hacer?", + "profile": "Perfil", + "linked_accounts": "Cuentas vinculadas", + "name": "Nombre", + "logout": "Cerrar sesión", + "last_name": "Apellido", + "role": "Rol de uso", + "day": "Día", + "month": "Mes", + "year": "Año", + "tips": { + "title1": "Estadísticas", + "title2": "Tableros", + "title3": "Historial", + "title4": "Favoritos", + "text1": "Mira las estadísticas de tu paciente/familiar, para ver su actividad y cómo fue mejorando a lo largo de los días, semanas y meses.", + "text2": "Oculta los tableros que no use el usuario, para que le aparezcan los tableros que más utiliza y necesita.", + "text3": "Utiliza el historial para ver tus frases pasadas, qué hiciste durante el día y contar historias.", + "text4": "Guarda pictogramas o frases favoritas, para poder acceder a ellas más rápidamente." + }, + "unlink": "Desvincular", + "unlink_account": "¿Desea desvincular a {name} de sus cuentas?", + "help": { + "help": "¿Necesita ayuda?", + "title1": "Preguntas frecuentes", + "title2": "Contactar con el soporte" + }, + "link": { + "title": "Vincular Cuenta", + "mail": { + "title": "Introduzca el correo electrónico vinculado a la cuenta de OTTAA", + "input": { + "required": "El correo electrónico es obligatorio", + "invalid": "El correo electrónico no es válido" + }, + "warn": "*Se enviará una notificación con un código para enlazar los perfiles.", + "contact": "*Asegurate de estar en contacto con la persona que posea esta cuenta en un dispositivo." + }, + "token": { + "title": "Coloque el código de verificación que llegó como notificación a otro dispositivo.", + "problem": "¿Tiene problemas para vincular las cuentas?", + "resend": "Reenviar código", + "back": "Introducir otro email", + "invalid": "Token no válido" + }, + "wait": { + "title": "Espere", + "subtitle": "Cargando perfil..." + }, + "success": { + "title": "Perfil vinculado con éxito!", + "lastTime": "Últ. vez {date}" + }, + "error": { + "link-exist": "Ya están vinculadas", + "miss-caregiver": "Error: Cuidador 404", + "miss-user": "Error: Usuario 404", + "user-no-comp": "Error: Usuario 406", + "caregiver-no-comp": "Error: Cuidador 406", + "autolink": "Error: Misma cuenta", + "auth/user-not-found": "Usuario no encontrado", + "miss-token": "Falta el Token", + "invalid-token": "Token no válido", + "expired-token": "Token caducado" + } + }, + "delete_account": "Eliminar cuenta" + }, + "user": { + "main": { + "title": "Configura tu experiencia", + "subtitle1": "Uso de la aplicación", + "subtitle2": "Lenguaje predictivo" + }, + "settings": { + "main_screen": "Pantalla principal", + "accessibility": "Accesibilidad", + "voice_and_subtitles": "Voz y subtítulos", + "language": "Lenguaje" + }, + "main_setting": { + "interaction": "Interacciones", + "talk_delete": "Hablar y Borrar", + "shortcut": "Atajos en el Inicio", + "board_view": "Vista de tableros", + "tabs": "Por pestañas", + "grid": "Grilla", + "ottaa_labs": "OTTAA Labs", + "labs_text": "Función frases verbales", + "labs_long": "Función en Modo Beta\nPermite generar frases con tiempos verbales más complejas", + "one_by_one": "ONE by ONE" + }, + "accessibility": { + "selection": "Selección", + "bar_text": "Tiempo de clickeo (Segundos)", + "connected": "Dispositivos conectados", + "device": "Dispositivo de accesibilidad", + "press": "Press&Press", + "scroll": "Scroll&Press", + "sip": "Soplo y succión", + "selection_type": "Tipo de selección", + "swept": "Barrido", + "speed": "Velocidad", + "selection_speed": "Velocidad de selección" + }, + "voice_and_subtitle": { + "voice_types": "Tipos de voz", + "voice_rate": "Velocidad de voz", + "voz1": "Voz 1", + "voz2": "Voz 2", + "voz3": "Voz 3", + "mute": "Silenciar pictogramas", + "subtitle": "Subtítulos", + "show": "Mostrar subtítulos", + "size": "Tamaño", + "capital": "Mayúsculas" + }, + "language": { + "set": "Idioma establecido" + } + }, + "global": { + "hello_world": "Hola Mundo", + "hello": "Hola", + "continue": "Continuar", + "next": "Siguiente", + "back": "Anterior", + "please_enter_text": "Por favor, introduce un texto", + "done": "Listo", + "yes": "Sí", + "delete": "Borrar", + "edit": "Editar", + "no": "No", + "mute": "Silenciar", + "important": "Importante", + "save_changes": "Guardar cambios", + "send": "Enviar", + "skip": "Omitir", + "email": "Email", + "step": "Paso", + "share": "Compartir", + "support": "Soporte", + "congrats": "Felicitaciones", + "settings": "Configuración", + "general": "General", + "pictogram": "Pictogramas", + "configuration": "Configuración", + "user_ottaa": "Usar OTTAA como", + "cancel": "Cancelar", + "slow": "Lenta", + "default": "Predeterminada", + "fast": "Rápida", + "voice": "Voz", + "small": "Pequeño", + "medium": "Mediano", + "big": "Grande", + "comingsoon": "¡Esta característica estará disponible muy pronto!", + "delicate": "Región", + "chile": "Chile", + "spanish": "Español", + "argentina": "Argentina", + "colombia": "Colombia", + "english": "Inglés", + "italian": "Italiano", + "french": "Francés", + "portuguese": "Portugues", + "test": "Esta es la voz que vas a usar en ota", + "add": "Agregar", + "confirm": "Confirmar", + "gallery": "galería", + "arasaac": "ARASAAC", + "text": "Texto", + "color": "Color", + "search": "Buscar", + "actions": "Acciones", + "people": "Personas", + "miscellaneous": "Miscelaneas", + "noun": "Sustantivos", + "adjective": "Adjetivos", + "predictive": "Predictivo", + "sunday": "Domingo", + "monday": "Lunes", + "tuesday": "Martes", + "wednesday": "Miércoles", + "thursday": "Jueves", + "friday": "Viernes", + "saturday": "Sábado", + "tomorrow": "Mañana", + "noon": "Mediodía", + "late": "Tarde", + "evening": "Noche", + "add_new": "Agregar nuevo", + "disguise": "Ocultar", + "save": "Guardar", + "image": "Imágen", + "saved_in": "Guardado en", + "location": "Ubicación", + "voices": "Por favor, instale voces desde la configuración para una mejor usabilidad" + }, + "onboarding": { + "start": "Comenzar", + "profile": { + "title": "Pantalla de perfiles", + "subtitle": "¿Quién va a usar OTTAA hoy?", + "description": "Con la selección de perfiles vas a poder usar OTTAA desde cualquier dispositivo, manteniendo tus pictogramas y estilos!" + }, + "home": { + "title": "Personaliza tu Inicio", + "subtitle": "Atajos en la pantalla principal", + "description": "Personalizá de acuerdo a tus gustos y necesidades" + }, + "customize": { + "title": "Personalizá tu Home", + "subtitle": "Acompañamos en el proceso de aprendizaje", + "description": "Activá o desactivá tableros o pictogramas para modificar la predicción, vos tenés el control." + }, + "skip": { + "title": "¿Estás de acuerdo en saltar la introducción?" + } + }, + "terms": { + "button": "Acepto los términos", + "text": "Para continuar, necesitamos que aceptes los términos y condiciones.\nVer términos" + }, + "loginWait": { + "text": "Te damos la bienvenida!\nAl mundo de OTTAA" + }, + "login": { + "title": "Ingresa con tu cuenta", + "google": "Continuar con Google.", + "facebook": "Continuar con Facebook", + "apple": "Continuar con Apple", + "register": "¿Todavía no tienes cuenta? Regístrate aquí", + "wait": { + "title": "Te damos la bienvenida!", + "subtitle": "Al nuevo mundo de OTTAA Project" + } + }, + "customize": { + "board": { + "title": "¿Qué tableros utilizará el usuario para comunicarse?", + "appbar": "Tableros predictivos", + "skip": "¿Omitir la elección de tableros?", + "subtitle": "Ver pictogramas" + }, + "shortcut": { + "title": "Seleccioná los atajos que aparecerán en la pantalla principal.", + "appbar": "Atajos", + "favorites": "Favoritos", + "history": "Historial", + "camera": "Cámara", + "games": "Juegos" + }, + "picto": { + "title": "Tablero {name}", + "switch": "Activar tablero" + }, + "help": { + "boards": "Los tableros predictivos permiten configurar qué grupo de pictogramas se mostrará en la pantalla del usuario/a final.", + "shortcut": "Los atajos son accesos rápidos a distintas funciones para que el/la usuario/a final disponga en su pantalla principal." + }, + "wait": { + "title": "¡Felicitaciones!", + "subtitle": "Has configurado la experiencia de {name}", + "button": "Ir al panel de perfiles" + }, + "skip": "¿Estás de acuerdo en saltar las preferencias del perfil?" + }, + "home": { + "grid": { + "title": "Tableros", + "pictos": "Tablero {group}" + } + }, + "chatgpt": { + "prompt": "escribir una frase en español con estas palabras como si fueras {gender}, agregando conectores y artículos cuando sea necesario, pero sin cambiar las palabras: {pictograms}" + }, + "notification": { + "code": { + "request": { + "title": "Verificación de OTTAA Link", + "body": "Están intentando vincular tu cuenta con el token {linkToken}" + }, + "confirm": { + "title": "Confirmación de OTTAA Link", + "body": "Se ha confirmado la vinculación de tu cuenta" + } + } + }, + "game": { + "play": "¡Juguemos!", + "next": "Jugar", + "game_header_0": "¿Cuál es el pictograma?", + "game_header_1": "Unir pictogramas", + "game_header_2": "Juego de la Memoria", + "game_header_3": "Armá una historia", + "game_sub_0": "Respondé las preguntas eligiendo el pictograma correcto. Aprende jugando", + "game_sub_1": "Unir los pictogramas de manera correcta", + "game_sub_2": "Prueba tu memoria, ¿Cuánto recuerdas los pictogramas?", + "game_sub_3": "Elegí los pictogramas que más te gusten, y con la ayuda de Chat GPT, crearás una historia.", + "group": "Seleccioná una categoría para poder jugar", + "search": "Buscar Tablero", + "find": "Encuentra los tableros que quieras, fácilmente!", + "game_1_line": "Seleccioná el pictograma que escuches", + "game_2_line": "Seleccioná la palabra que corresponde a su pictograma", + "game_3_line": "Seleccioná una tarjeta y encontrá la pareja del pictograma", + "game_4_line": "Agregá hasta 4 pictogramas y creá tu propia historia", + "no": "¡Oh Oh!", + "yes": "¡Muy bien!", + "correct": "Correcto", + "incorrect": "Incorrecto", + "use_time": "Tiempo total", + "maximum_streak": "Mejor racha", + "speak_what": "¿Cual es el picto {name}?", + "gptbtn": "Crear historia", + "prompt": "Actúa como maestra de jardín de infantes y escribe una historia en español para niños usando las siguientes palabras:", + "nivel": "Nivel" + }, + "exit": { + "long": { + "headline": "¿Deseas volver a la pantalla de perfiles?", + "body": "Mantén presionado el botón resaltado para volver", + "check": "No volver a mostrar este mensaje", + "btn": "De acuerdo" + }, + "short": { + "headline": "¿Confima que deseas volver a la pantalla de perfiles?" + } + }, + "create": { + "heading": "Crear pictograma", + "image_selection": "Elije la imagen que represente al pictograma", + "choose_color": "Elije el color", + "search_arsaac": "Buscar ARASAAC", + "time_headline": "Selecciona los horarios que más se adecuen a sus actividades", + "time_sub1": "¿Qué días de la semana es cuando más lo utiliza?", + "schedule": "¿En qué horario?", + "save": "Guardar pictograma", + "created_by_me": "Creados por mi", + "new_board": "Nuevo tablero", + "create_new_board": "Crear nuevo tablero", + "board_name": "Nombre del tablero", + "edit_picto": "Editar pictograma", + "final_heading": "Listo, chequea que todo este correcto" + } +} diff --git a/assets/i18n/es_ES.json b/assets/i18n/es_ES.json new file mode 100644 index 00000000..69382dd1 --- /dev/null +++ b/assets/i18n/es_ES.json @@ -0,0 +1,388 @@ +{ + "profile": { + "selection": { + "text1": "¿Quién va a utilizar la aplicación en este dispositivo?", + "caregiver_text": "Necesita comunicarse", + "user_text": "Necesita comunicarse" + }, + "hello": "Hola {name}!", + "ottaa": { + "tips": "OTTAA tips" + }, + "mail": "Correo electrónico", + "date": "Fecha de nacimiento", + "faq": { + "title": "Preguntas frecuentes", + "faq0": "¿Quién puede usar la aplicación OTTAA?", + "faq0Description": "OTTAA está diseñado para personas no verbales, es decir, cualquier persona que no utilice el habla oral para comunicarse. Las personas que usan OTTAA hoy en día fueron diagnosticadas con autismo, parálisis cerebral, síndrome de Down, esclerosis lateral amiotrófica (ELA), atrofia muscular espinal (AME) o síndrome de enclaustramiento post al accidente cerebrovascular (LiS), entre otras afecciones. Al ser una herramienta de comunicación dinámica, OTTAA requiere que sus usuarios posean funciones cognitivas de nivel medio a alto. Sin embargo, nos gusta considerar cada caso individualmente, así que no dude en ponerse en contacto y solicitar una evaluación en línea con nuestro equipo.", + "faq1": "¿Cómo funciona la aplicación?", + "faq1Description": "La aplicación OTTAA proporciona al usuario pictogramas: imágenes que representan acciones, objetos, sentimientos o emociones. El usuario puede elegir los pictogramas que necesita y crear una frase, esta se traduce de los pictogramas a una oración escrita que aparece en la pantalla y que la aplicación también lee en voz alta. Consulta nuestro canal de Youtube para obtener una explicación más visual.", + "faq2": "¿En qué se diferencia esta aplicación de otros dispositivos AAC (comunicación aumentativa y alternativa)?", + "faq2Description": "La aplicación OTTAA es diferente de otras aplicaciones de CAA debido a su innovador algoritmo predictivo y generador de lenguaje natural, que permite que la aplicación aprenda del comportamiento del usuario en la aplicación, su edad, sexo, la hora del día y su ubicación para pre -seleccionar pictograma(s) para el momento comunicacional en el que se encuentran.", + "faq3": "¿Cuánto cuesta la aplicación OTTAA?", + "faq3Description": "La aplicación OTTAA es gratuita para descargar y usar. Para crear un producto sostenible que resista el paso del tiempo, hay algunas características que requieren una suscripción para utilizarlas. Sin embargo, estamos trabajando arduamente para brindar financiamiento a todos los que lo necesitan.\n\nSi estás en Argentina, cualquier ayuda técnica que necesite una persona debe estar cubierto por un seguro de salud. Comuníquese con nuestro equipo para obtener orientación y asistencia sobre cómo obtener esta cobertura.\n\nSi sos de cualquier otro país de LATAM y querés compartir tu experiencia sobre este tema, no dudes en comunicarte, tu contribución podría ayudar a muchas personas.", + "faq4": "¿Qué idiomas son compatibles con el Proyecto OTTAA?", + "faq4Description": "Actualmente admitimos español, inglés, portugués y francés. Para español, tenemos versiones localizadas de Argentina, Chile, Colombia y España. Estamos buscando activamente contribuciones sobre nuevos idiomas o una mejor localización para las variedades españolas. Únete a nuestra comunidad de crowdin para contribuir.", + "faq5": "¿Cómo puedo colaborar con el Proyecto OTTAA?", + "faq5Description": "Los colaboradores pueden ayudar a OTTAA con el desarrollo, las pruebas y/o la traducción. Para leer más sobre el tema y comenzar, consulta la sección Contribuir en el repositorio oficial de OTTAA en GitHub." + }, + "caregiver": "Acompañante", + "caregivers_families": "Profesionales/Familiares", + "user": "Usuario/a", + "user_description": "Persona no verbal", + "wait": "Por favor espera", + "setting_exp": "Configurando tu experiencia...", + "link_account": "Vincular una cuenta", + "use": { + "ottaa": "Utilizar OTTAA" + }, + "close_profile": "Ocultar", + "open_profile": "Ver perfil", + "no_account": "Modo sin perfil", + "new_existant": "Nuevo/Existente", + "what_do": "¿Qué quieres hacer?", + "profile": "Perfil", + "linked_accounts": "Cuentas vinculadas", + "name": "Nombre", + "logout": "Cerrar sesión", + "last_name": "Apellido", + "role": "Rol de uso", + "day": "Día", + "month": "Mes", + "year": "Año", + "tips": { + "title1": "Estadísticas", + "title2": "Tableros", + "title3": "Historial", + "title4": "Favoritos", + "text1": "Mira las estadísticas de tu paciente/familiar, para ver su actividad y cómo fue mejorando a lo largo de los días, semanas y meses.", + "text2": "Oculta los tableros que no use el usuario, para que le aparezcan los tableros que más utiliza y necesita.", + "text3": "Utiliza el historial para ver tus frases pasadas, qué hiciste durante el día y contar historias.", + "text4": "Guarda pictogramas o frases favoritas, para poder acceder a ellas más rápidamente." + }, + "unlink": "Desvincular", + "unlink_account": "¿Desea desvincular a {name} de sus cuentas?", + "help": { + "help": "¿Necesita ayuda?", + "title1": "Preguntas frecuentes", + "title2": "Contactar con el soporte" + }, + "link": { + "title": "Vincular Cuenta", + "mail": { + "title": "Introduzca el correo electrónico vinculado a la cuenta de OTTAA", + "input": { + "required": "El correo electrónico es obligatorio", + "invalid": "El correo electrónico no es válido" + }, + "warn": "*Se enviará una notificación con un código para enlazar los perfiles.", + "contact": "*Asegurate de estar en contacto con la persona que posea esta cuenta en un dispositivo." + }, + "token": { + "title": "Coloque el código de verificación que llegó como notificación a otro dispositivo.", + "problem": "¿Tiene problemas para vincular las cuentas?", + "resend": "Reenviar código", + "back": "Introducir otro email", + "invalid": "Token no válido" + }, + "wait": { + "title": "Espere", + "subtitle": "Cargando perfil..." + }, + "success": { + "title": "Perfil vinculado con éxito!", + "lastTime": "Últ. vez {date}" + }, + "error": { + "link-exist": "Ya están vinculadas", + "miss-caregiver": "Error: Cuidador 404", + "miss-user": "Error: Usuario 404", + "user-no-comp": "Error: Usuario 406", + "caregiver-no-comp": "Error: Cuidador 406", + "autolink": "Error: Misma cuenta", + "auth/user-not-found": "Usuario no encontrado", + "miss-token": "Falta el Token", + "invalid-token": "Token no válido", + "expired-token": "Token caducado" + } + }, + "delete_account": "Eliminar cuenta" + }, + "user": { + "main": { + "title": "Configura tu experiencia", + "subtitle1": "Uso de la aplicación", + "subtitle2": "Lenguaje predictivo" + }, + "settings": { + "main_screen": "Pantalla principal", + "accessibility": "Accesibilidad", + "voice_and_subtitles": "Voz y subtítulos", + "language": "Lenguaje" + }, + "main_setting": { + "interaction": "Interacciones", + "talk_delete": "Hablar y Borrar", + "shortcut": "Atajos en el Inicio", + "board_view": "Vista de tableros", + "tabs": "Por pestañas", + "grid": "Grilla", + "ottaa_labs": "OTTAA Labs", + "labs_text": "Función frases verbales", + "labs_long": "Función en Modo Beta\nPermite generar frases con tiempos verbales más complejas", + "one_by_one": "ONE by ONE" + }, + "accessibility": { + "selection": "Selección", + "bar_text": "Tiempo de clickeo (Segundos)", + "connected": "Dispositivos conectados", + "device": "Dispositivo de accesibilidad", + "press": "Press&Press", + "scroll": "Scroll&Press", + "sip": "Soplo y succión", + "selection_type": "Tipo de selección", + "swept": "Barrido", + "speed": "Velocidad", + "selection_speed": "Velocidad de selección" + }, + "voice_and_subtitle": { + "voice_types": "Tipos de voz", + "voice_rate": "Velocidad de voz", + "voz1": "Voz 1", + "voz2": "Voz 2", + "voz3": "Voz 3", + "mute": "Silenciar pictogramas", + "subtitle": "Subtítulos", + "show": "Mostrar subtítulos", + "size": "Tamaño", + "capital": "Mayúsculas" + }, + "language": { + "set": "Idioma establecido" + } + }, + "global": { + "hello_world": "Hola Mundo", + "hello": "Hola", + "continue": "Continuar", + "next": "Siguiente", + "back": "Anterior", + "please_enter_text": "Por favor, introduce un texto", + "done": "Listo", + "yes": "Sí", + "delete": "Borrar", + "edit": "Editar", + "no": "No", + "mute": "Silenciar", + "important": "Importante", + "save_changes": "Guardar cambios", + "send": "Enviar", + "skip": "Omitir", + "email": "Email", + "step": "Paso", + "share": "Compartir", + "support": "Soporte", + "congrats": "Felicitaciones", + "settings": "Configuración", + "general": "General", + "pictogram": "Pictogramas", + "configuration": "Configuración", + "user_ottaa": "Usar OTTAA como", + "cancel": "Cancelar", + "slow": "Lenta", + "default": "Predeterminada", + "fast": "Rápida", + "voice": "Voz", + "small": "Pequeño", + "medium": "Mediano", + "big": "Grande", + "comingsoon": "¡Esta característica estará disponible muy pronto!", + "delicate": "Región", + "chile": "Chile", + "spanish": "Español", + "argentina": "Argentina", + "colombia": "Colombia", + "english": "Inglés", + "italian": "Italiano", + "french": "Francés", + "portuguese": "Portugues", + "test": "Esta es la voz que vas a usar en ota", + "add": "Agregar", + "confirm": "Confirmar", + "gallery": "galería", + "arasaac": "ARASAAC", + "text": "Texto", + "color": "Color", + "search": "Buscar", + "actions": "Acciones", + "people": "Personas", + "miscellaneous": "Miscelaneas", + "noun": "Sustantivos", + "adjective": "Adjetivos", + "predictive": "Predictivo", + "sunday": "Domingo", + "monday": "Lunes", + "tuesday": "Martes", + "wednesday": "Miércoles", + "thursday": "Jueves", + "friday": "Viernes", + "saturday": "Sábado", + "tomorrow": "Mañana", + "noon": "Mediodía", + "late": "Tarde", + "evening": "Noche", + "add_new": "Agregar nuevo", + "disguise": "Ocultar", + "save": "Guardar", + "image": "Imágen", + "saved_in": "Guardado en", + "location": "Ubicación", + "voices": "Por favor, instale voces desde la configuración para una mejor usabilidad" + }, + "onboarding": { + "start": "Comenzar", + "profile": { + "title": "Pantalla de perfiles", + "subtitle": "¿Quién va a usar OTTAA hoy?", + "description": "Con la selección de perfiles vas a poder usar OTTAA desde cualquier dispositivo, manteniendo tus pictogramas y estilos!" + }, + "home": { + "title": "Personaliza tu Inicio", + "subtitle": "Atajos en la pantalla principal", + "description": "Personalizá de acuerdo a tus gustos y necesidades" + }, + "customize": { + "title": "Personalizá tu Home", + "subtitle": "Acompañamos en el proceso de aprendizaje", + "description": "Activá o desactivá tableros o pictogramas para modificar la predicción, vos tenés el control." + }, + "skip": { + "title": "¿Estás de acuerdo en saltar la introducción?" + } + }, + "terms": { + "button": "Acepto los términos", + "text": "Para continuar, necesitamos que aceptes los términos y condiciones.\nVer términos" + }, + "loginWait": { + "text": "Te damos la bienvenida!\nAl mundo de OTTAA" + }, + "login": { + "title": "Ingresa con tu cuenta", + "google": "Continuar con Google.", + "facebook": "Continuar con Facebook", + "apple": "Continuar con Apple", + "register": "¿Todavía no tienes cuenta? Regístrate aquí", + "wait": { + "title": "Te damos la bienvenida!", + "subtitle": "Al nuevo mundo de OTTAA Project" + } + }, + "customize": { + "board": { + "title": "¿Qué tableros utilizará el usuario para comunicarse?", + "appbar": "Tableros predictivos", + "skip": "¿Omitir la elección de tableros?", + "subtitle": "Ver pictogramas" + }, + "shortcut": { + "title": "Seleccioná los atajos que aparecerán en la pantalla principal.", + "appbar": "Atajos", + "favorites": "Favoritos", + "history": "Historial", + "camera": "Cámara", + "games": "Juegos" + }, + "picto": { + "title": "Tablero {name}", + "switch": "Activar tablero" + }, + "help": { + "boards": "Los tableros predictivos permiten configurar qué grupo de pictogramas se mostrará en la pantalla del usuario/a final.", + "shortcut": "Los atajos son accesos rápidos a distintas funciones para que el/la usuario/a final disponga en su pantalla principal." + }, + "wait": { + "title": "¡Felicitaciones!", + "subtitle": "Has configurado la experiencia de {name}", + "button": "Ir al panel de perfiles" + }, + "skip": "¿Estás de acuerdo en saltar las preferencias del perfil?" + }, + "home": { + "grid": { + "title": "Tableros", + "pictos": "Tablero {group}" + } + }, + "chatgpt": { + "prompt": "escribir una frase en español con estas palabras como si fueras {gender}, agregando conectores y artículos cuando sea necesario, pero sin cambiar las palabras: {pictograms}" + }, + "notification": { + "code": { + "request": { + "title": "Verificación de OTTAA Link", + "body": "Están intentando vincular tu cuenta con el token {linkToken}" + }, + "confirm": { + "title": "Confirmación de OTTAA Link", + "body": "Se ha confirmado la vinculación de tu cuenta" + } + } + }, + "game": { + "play": "¡Juguemos!", + "next": "Jugar", + "game_header_0": "¿Cuál es el pictograma?", + "game_header_1": "Unir pictogramas", + "game_header_2": "Juego de la Memoria", + "game_header_3": "Armá una historia", + "game_sub_0": "Respondé las preguntas eligiendo el pictograma correcto. Aprende jugando", + "game_sub_1": "Unir los pictogramas de manera correcta", + "game_sub_2": "Prueba tu memoria, ¿Cuánto recuerdas los pictogramas?", + "game_sub_3": "Elegí los pictogramas que más te gusten, y con la ayuda de Chat GPT, crearás una historia.", + "group": "Seleccioná una categoría para poder jugar", + "search": "Buscar Tablero", + "find": "Encuentra los tableros que quieras, fácilmente!", + "game_1_line": "Seleccioná el pictograma que escuches", + "game_2_line": "Seleccioná la palabra que corresponde a su pictograma", + "game_3_line": "Seleccioná una tarjeta y encontrá la pareja del pictograma", + "game_4_line": "Agregá hasta 4 pictogramas y creá tu propia historia", + "no": "¡Oh Oh!", + "yes": "¡Muy bien!", + "correct": "Correcto", + "incorrect": "Incorrecto", + "use_time": "Tiempo total", + "maximum_streak": "Mejor racha", + "speak_what": "¿Cual es el picto {name}?", + "gptbtn": "Crear historia", + "prompt": "Actúa como maestra de jardín de infantes y escribe una historia en español para niños usando las siguientes palabras:", + "nivel": "Nivel" + }, + "exit": { + "long": { + "headline": "¿Deseas volver a la pantalla de perfiles?", + "body": "Mantén presionado el botón resaltado para volver", + "check": "No volver a mostrar este mensaje", + "btn": "De acuerdo" + }, + "short": { + "headline": "¿Confima que deseas volver a la pantalla de perfiles?" + } + }, + "create": { + "heading": "Crear pictograma", + "image_selection": "Elije la imagen que represente al pictograma", + "choose_color": "Elije el color", + "search_arsaac": "Buscar ARASAAC", + "time_headline": "Selecciona los horarios que más se adecuen a sus actividades", + "time_sub1": "¿Qué días de la semana es cuando más lo utiliza?", + "schedule": "¿En qué horario?", + "save": "Guardar pictograma", + "created_by_me": "Creados por mi", + "new_board": "Nuevo tablero", + "create_new_board": "Crear nuevo tablero", + "board_name": "Nombre del tablero", + "edit_picto": "Editar pictograma", + "final_heading": "Listo, chequea que todo este correcto" + } +} diff --git a/assets/i18n/es_MX.json b/assets/i18n/es_MX.json deleted file mode 100644 index 1b2682ab..00000000 --- a/assets/i18n/es_MX.json +++ /dev/null @@ -1,141 +0,0 @@ -{ - "level": "Level", - "report": "Report", - "vocabulary": "Vocabulary", - "most_used_phrases": "MOST USED PHRASES", - "pictogram_by_sentence_on_average": "Pictograms by sentences on average", - "phrases_last_seven_days": "Phrases created in the last 7 days", - "score_text_1": "OTTAA Score is a measure of the overall use of the application, using data as usage in the last days and average picts per sentence.", - "most_used_groups": "Most used Groups", - "ottaa_score": "OTTAA Score", - "favourite_sentence": "Favourite Sentences", - "galeria_grupos": "Gallery Groups", - "add_pict": "Add Pict", - "add_group": "Add Group", - "hello_world": "Hello World", - "we_are_preparing_everything": "We are preparing everything...", - "Hello": "Hello", - "Continue": "Continue", - "Please_register_to": "Please Register to", - "Login_with_google": "Login with Google", - "Login_with_facebook": "Login with Facebook", - "Welcome_this_is_ottaa": "Welcome, this is OTTAA", - "We_help_thousands_of_children_with_speech_problems_to_communicate_improving_their_quality_of_life": "We help thousands of children with speech problems to communicate, improving their quality of life", - "Previous": "Previous", - "Next": "Next", - "Thank_you_for_choosing_ottaa_project": "Thank you for choosing OTTAA PROJECT", - "please_enter_some_text": "Please enter some text", - "Name": "Name", - "Gender": "Gender", - "Date_of_birth": "Date of Birth", - "Lets_get_to_knwo_each_other_first": "Let's get to know each other first", - "We_are_going_to_collect_some_data_to_get_to_know_you_better": "We are going to collect some data to get to know you better", - "Launch_short_tutorial": "Launch short Tutorial", - "Do_a_guided_workshop": "DO A GUIDED WORKSHOP", - "Book_a_demo": "BOOK A DEMO", - "Ottaa_is_a_powerful_communication_tool": "OTTAA is a powerful \ncommunication tool", - "We_offer_you_different_options_so_that_you_learn_how_to_use_it_and_get_the_most_out_of_it": "We offer you different options so that you learn how to use it and get the most out of it.", - "Choose_your_avatar": "Choose your Avatar", - "Final_step_join": "Final step, join", - "Create_your_avatar_to_be_able_to_recognize_you_all_the_time": "Create your Avatar to be able to recognize you all the time", - "Create_your_phrase": "CREATE YOUR PHRASES", - "step1_long": "Touch one or more of the pictograms to create a sentence as long as you like. The pictograms are automatically related and you will always have one more pictogram to add", - "Talk_to_the_world": "TALK TO THE WORLD", - "step2_long": "Once the phrase is created, touch the OTTAA logo to speak aloud or using the share icon, you can send your phrase through the most used social networks", - "Access_thousands_of_pictograms": "ACCESS THOUSANDS OF PICTOGRAMS", - "Step3_long": "In OTTAA you have access to thousands of pictograms so you can talk about whatever you want. Find the Gallery of Pîctos in the lower left corner of the main screen", - "Ready": "Ready", - "Step4_long": "Enter the selection of games to learn while playing. OTTAA has educational games to learn vocabulary, concepts and much more. Also, more games will be available soon.", - "Play_and_learn": "PLAY AND LEARN", - "Male": "Male", - "Female": "Female", - "Binary": "Binary", - "Fluid": "Fluid", - "Other": "Other", - "hola_nnos_conozcamos_un_poco": "Hello,\nLet\"s get to know each other a little bit.", - "vamos_a_pedirte_cierta_informaci_n_para_nmejorar_tu_experiencia_con_ottaa": "We will ask you for certain information\nto improve your experience with OTTAA.", - "check_if_the_info_is_correct_nif_not_change_it_as_you_wish_this_will_help_us_to_personalize_the_app_for_you": "Check if the info is correct,\nif not, change it as you wish. This will help us to personalize the app for you.", - "te_ofrecemos_varias_opciones_para_naprender_a_utilizarla_y_sacarle_el_maximo_provecho": "We offer you several options to\nlearn how to use it and get the most out of it", - "por_ltimo": "At Last!", - "elige_un_personaje_que_nmejor_te_represente": "Choose a character that best represents you", - "edit_pictogram": "Edit pictogram", - "text": "Text", - "frame": "Frame", - "tags": "tags", - "keep_your_ottaa_up_to_date": "Keep your OTTAA up-to-date", - "account_info": "Account Info", - "account": "Account", - "account_type": "Account Type", - "current_ottaa_installed": "Current OTTAA Installed", - "current_ottaa_version": "Current OTTAA Version", - "device_name": "Device Name", - "contact_support": "Contact Support", - "edit": "Edit", - "delete": "Delete", - "fitzgerald_key": "Fitzgerald key", - "actions": "Actions", - "interactions": "Interactions", - "people": "people", - "nouns": "Nouns", - "adjectives": "Adjectives", - "miscellaneous": "Miscellaneous", - "choose_a_tag": "Choose a TAG", - "tags_widget_long_1": "By choosing TAGs you need to predict better when to show certain pictgorams, based on Time,Location, Calender or Weather", - "text_widget_long_1": "Enter the text to say it loud, can be a single word or a full sentence. Is up to you!", - "important": "Important", - "do_you_want_to_save_changes": "Do you want to save changes", - "no": "No", - "yes": "Yes", - "go_back": "Go Back", - "choose_an_option": "Choose an option", - "camera": "Camera", - "gallery": "Gallery", - "download_from_arasaac": "Download from ARASAAC", - "tags_will_come_in_next_release": "TAGs will come in next Release", - "mute": "Mute", - "about_ottaa": "About OTTAA", - "configuration": "Settings", - "tutorial": "Tutorial", - "close_application": "Close Application", - "sign_out": "Sign out", - "language": "Language", - "ottaa_labs": "OTTA Labs", - "language_page_long_1": "Use artificial intelligence to generate a richer sentence. You need a stable internet connection.", - "settings": "Settings", - "SETTINGS": "SETTINGS", - "pictograms": "Pictograms", - "prediction": "Prediction", - "accessibility": "Accessibility", - "voice_and_subtitles": "Voice and subtitles", - "all_phrases": "All Phrases", - "search": "Search", - "please_enter_a_valid_search": "Please enter a valid search", - "choose_a_picto_to_speak": "Choose a Picto to speak", - "we_are_working_on_this_feature": "We are working on this feature", - "most_used_sentences": "Most used Sentences", - "price_one": "Get access today to all the useful features that OTTAA Premium has to offer for only 990 ARS per month.", - "purchase_subscription": "PURCHASE SUBSCRIPTION", - "sentence_1": "Get access to educational games that allow you to evaluate vocabulary in a fun way", - "sentence_2": "Use OTTAA Project with screen scanning, connect accessible buttons and much more.", - "sentence_3": "With the premium version you can use the GPS to have a better prediction based on the commerce or place where you are", - "whats_the_picto": "What\"s the picto?", - "game1": "Answer the questions by choosing the right pictogram.\nLearn by playing!", - "match_picto": "Match Picto", - "game2": "Attach the pictogram correctly", - "memory_game": "Memory Game", - "game3": "Test your memory", - "play": "PLAY", - "select_a_category_to_play": "Select a category to play", - "image": "Image", - "share_text": "please, create a phrase and select the share button", - "text_to_speche_engine": "TEXT-TO-SPEECH-ENGINE", - "enable_custom_tts": "Enable custom TTS", - "speech_rate": "Speech Rate", - "speech_pitch": "Speech Pitch", - "SUBTITLE": "SUBTITLE", - "customized_subtitle": "Customized subtitle", - "size": "Size", - "upperCase": "UpperCase", - "it_allows_uppercase_subtitles": "It allows uppercase subtitles.", - "login_screen": "Hello, welcome to OTTAA Project, the first predictive communication platform for people with speech impairments, please login with your account and fill in some data to benefit from our prediction." -} \ No newline at end of file diff --git a/assets/i18n/es_PE.json b/assets/i18n/es_PE.json deleted file mode 100644 index 1b2682ab..00000000 --- a/assets/i18n/es_PE.json +++ /dev/null @@ -1,141 +0,0 @@ -{ - "level": "Level", - "report": "Report", - "vocabulary": "Vocabulary", - "most_used_phrases": "MOST USED PHRASES", - "pictogram_by_sentence_on_average": "Pictograms by sentences on average", - "phrases_last_seven_days": "Phrases created in the last 7 days", - "score_text_1": "OTTAA Score is a measure of the overall use of the application, using data as usage in the last days and average picts per sentence.", - "most_used_groups": "Most used Groups", - "ottaa_score": "OTTAA Score", - "favourite_sentence": "Favourite Sentences", - "galeria_grupos": "Gallery Groups", - "add_pict": "Add Pict", - "add_group": "Add Group", - "hello_world": "Hello World", - "we_are_preparing_everything": "We are preparing everything...", - "Hello": "Hello", - "Continue": "Continue", - "Please_register_to": "Please Register to", - "Login_with_google": "Login with Google", - "Login_with_facebook": "Login with Facebook", - "Welcome_this_is_ottaa": "Welcome, this is OTTAA", - "We_help_thousands_of_children_with_speech_problems_to_communicate_improving_their_quality_of_life": "We help thousands of children with speech problems to communicate, improving their quality of life", - "Previous": "Previous", - "Next": "Next", - "Thank_you_for_choosing_ottaa_project": "Thank you for choosing OTTAA PROJECT", - "please_enter_some_text": "Please enter some text", - "Name": "Name", - "Gender": "Gender", - "Date_of_birth": "Date of Birth", - "Lets_get_to_knwo_each_other_first": "Let's get to know each other first", - "We_are_going_to_collect_some_data_to_get_to_know_you_better": "We are going to collect some data to get to know you better", - "Launch_short_tutorial": "Launch short Tutorial", - "Do_a_guided_workshop": "DO A GUIDED WORKSHOP", - "Book_a_demo": "BOOK A DEMO", - "Ottaa_is_a_powerful_communication_tool": "OTTAA is a powerful \ncommunication tool", - "We_offer_you_different_options_so_that_you_learn_how_to_use_it_and_get_the_most_out_of_it": "We offer you different options so that you learn how to use it and get the most out of it.", - "Choose_your_avatar": "Choose your Avatar", - "Final_step_join": "Final step, join", - "Create_your_avatar_to_be_able_to_recognize_you_all_the_time": "Create your Avatar to be able to recognize you all the time", - "Create_your_phrase": "CREATE YOUR PHRASES", - "step1_long": "Touch one or more of the pictograms to create a sentence as long as you like. The pictograms are automatically related and you will always have one more pictogram to add", - "Talk_to_the_world": "TALK TO THE WORLD", - "step2_long": "Once the phrase is created, touch the OTTAA logo to speak aloud or using the share icon, you can send your phrase through the most used social networks", - "Access_thousands_of_pictograms": "ACCESS THOUSANDS OF PICTOGRAMS", - "Step3_long": "In OTTAA you have access to thousands of pictograms so you can talk about whatever you want. Find the Gallery of Pîctos in the lower left corner of the main screen", - "Ready": "Ready", - "Step4_long": "Enter the selection of games to learn while playing. OTTAA has educational games to learn vocabulary, concepts and much more. Also, more games will be available soon.", - "Play_and_learn": "PLAY AND LEARN", - "Male": "Male", - "Female": "Female", - "Binary": "Binary", - "Fluid": "Fluid", - "Other": "Other", - "hola_nnos_conozcamos_un_poco": "Hello,\nLet\"s get to know each other a little bit.", - "vamos_a_pedirte_cierta_informaci_n_para_nmejorar_tu_experiencia_con_ottaa": "We will ask you for certain information\nto improve your experience with OTTAA.", - "check_if_the_info_is_correct_nif_not_change_it_as_you_wish_this_will_help_us_to_personalize_the_app_for_you": "Check if the info is correct,\nif not, change it as you wish. This will help us to personalize the app for you.", - "te_ofrecemos_varias_opciones_para_naprender_a_utilizarla_y_sacarle_el_maximo_provecho": "We offer you several options to\nlearn how to use it and get the most out of it", - "por_ltimo": "At Last!", - "elige_un_personaje_que_nmejor_te_represente": "Choose a character that best represents you", - "edit_pictogram": "Edit pictogram", - "text": "Text", - "frame": "Frame", - "tags": "tags", - "keep_your_ottaa_up_to_date": "Keep your OTTAA up-to-date", - "account_info": "Account Info", - "account": "Account", - "account_type": "Account Type", - "current_ottaa_installed": "Current OTTAA Installed", - "current_ottaa_version": "Current OTTAA Version", - "device_name": "Device Name", - "contact_support": "Contact Support", - "edit": "Edit", - "delete": "Delete", - "fitzgerald_key": "Fitzgerald key", - "actions": "Actions", - "interactions": "Interactions", - "people": "people", - "nouns": "Nouns", - "adjectives": "Adjectives", - "miscellaneous": "Miscellaneous", - "choose_a_tag": "Choose a TAG", - "tags_widget_long_1": "By choosing TAGs you need to predict better when to show certain pictgorams, based on Time,Location, Calender or Weather", - "text_widget_long_1": "Enter the text to say it loud, can be a single word or a full sentence. Is up to you!", - "important": "Important", - "do_you_want_to_save_changes": "Do you want to save changes", - "no": "No", - "yes": "Yes", - "go_back": "Go Back", - "choose_an_option": "Choose an option", - "camera": "Camera", - "gallery": "Gallery", - "download_from_arasaac": "Download from ARASAAC", - "tags_will_come_in_next_release": "TAGs will come in next Release", - "mute": "Mute", - "about_ottaa": "About OTTAA", - "configuration": "Settings", - "tutorial": "Tutorial", - "close_application": "Close Application", - "sign_out": "Sign out", - "language": "Language", - "ottaa_labs": "OTTA Labs", - "language_page_long_1": "Use artificial intelligence to generate a richer sentence. You need a stable internet connection.", - "settings": "Settings", - "SETTINGS": "SETTINGS", - "pictograms": "Pictograms", - "prediction": "Prediction", - "accessibility": "Accessibility", - "voice_and_subtitles": "Voice and subtitles", - "all_phrases": "All Phrases", - "search": "Search", - "please_enter_a_valid_search": "Please enter a valid search", - "choose_a_picto_to_speak": "Choose a Picto to speak", - "we_are_working_on_this_feature": "We are working on this feature", - "most_used_sentences": "Most used Sentences", - "price_one": "Get access today to all the useful features that OTTAA Premium has to offer for only 990 ARS per month.", - "purchase_subscription": "PURCHASE SUBSCRIPTION", - "sentence_1": "Get access to educational games that allow you to evaluate vocabulary in a fun way", - "sentence_2": "Use OTTAA Project with screen scanning, connect accessible buttons and much more.", - "sentence_3": "With the premium version you can use the GPS to have a better prediction based on the commerce or place where you are", - "whats_the_picto": "What\"s the picto?", - "game1": "Answer the questions by choosing the right pictogram.\nLearn by playing!", - "match_picto": "Match Picto", - "game2": "Attach the pictogram correctly", - "memory_game": "Memory Game", - "game3": "Test your memory", - "play": "PLAY", - "select_a_category_to_play": "Select a category to play", - "image": "Image", - "share_text": "please, create a phrase and select the share button", - "text_to_speche_engine": "TEXT-TO-SPEECH-ENGINE", - "enable_custom_tts": "Enable custom TTS", - "speech_rate": "Speech Rate", - "speech_pitch": "Speech Pitch", - "SUBTITLE": "SUBTITLE", - "customized_subtitle": "Customized subtitle", - "size": "Size", - "upperCase": "UpperCase", - "it_allows_uppercase_subtitles": "It allows uppercase subtitles.", - "login_screen": "Hello, welcome to OTTAA Project, the first predictive communication platform for people with speech impairments, please login with your account and fill in some data to benefit from our prediction." -} \ No newline at end of file diff --git a/assets/i18n/es_PY.json b/assets/i18n/es_PY.json deleted file mode 100644 index 1b2682ab..00000000 --- a/assets/i18n/es_PY.json +++ /dev/null @@ -1,141 +0,0 @@ -{ - "level": "Level", - "report": "Report", - "vocabulary": "Vocabulary", - "most_used_phrases": "MOST USED PHRASES", - "pictogram_by_sentence_on_average": "Pictograms by sentences on average", - "phrases_last_seven_days": "Phrases created in the last 7 days", - "score_text_1": "OTTAA Score is a measure of the overall use of the application, using data as usage in the last days and average picts per sentence.", - "most_used_groups": "Most used Groups", - "ottaa_score": "OTTAA Score", - "favourite_sentence": "Favourite Sentences", - "galeria_grupos": "Gallery Groups", - "add_pict": "Add Pict", - "add_group": "Add Group", - "hello_world": "Hello World", - "we_are_preparing_everything": "We are preparing everything...", - "Hello": "Hello", - "Continue": "Continue", - "Please_register_to": "Please Register to", - "Login_with_google": "Login with Google", - "Login_with_facebook": "Login with Facebook", - "Welcome_this_is_ottaa": "Welcome, this is OTTAA", - "We_help_thousands_of_children_with_speech_problems_to_communicate_improving_their_quality_of_life": "We help thousands of children with speech problems to communicate, improving their quality of life", - "Previous": "Previous", - "Next": "Next", - "Thank_you_for_choosing_ottaa_project": "Thank you for choosing OTTAA PROJECT", - "please_enter_some_text": "Please enter some text", - "Name": "Name", - "Gender": "Gender", - "Date_of_birth": "Date of Birth", - "Lets_get_to_knwo_each_other_first": "Let's get to know each other first", - "We_are_going_to_collect_some_data_to_get_to_know_you_better": "We are going to collect some data to get to know you better", - "Launch_short_tutorial": "Launch short Tutorial", - "Do_a_guided_workshop": "DO A GUIDED WORKSHOP", - "Book_a_demo": "BOOK A DEMO", - "Ottaa_is_a_powerful_communication_tool": "OTTAA is a powerful \ncommunication tool", - "We_offer_you_different_options_so_that_you_learn_how_to_use_it_and_get_the_most_out_of_it": "We offer you different options so that you learn how to use it and get the most out of it.", - "Choose_your_avatar": "Choose your Avatar", - "Final_step_join": "Final step, join", - "Create_your_avatar_to_be_able_to_recognize_you_all_the_time": "Create your Avatar to be able to recognize you all the time", - "Create_your_phrase": "CREATE YOUR PHRASES", - "step1_long": "Touch one or more of the pictograms to create a sentence as long as you like. The pictograms are automatically related and you will always have one more pictogram to add", - "Talk_to_the_world": "TALK TO THE WORLD", - "step2_long": "Once the phrase is created, touch the OTTAA logo to speak aloud or using the share icon, you can send your phrase through the most used social networks", - "Access_thousands_of_pictograms": "ACCESS THOUSANDS OF PICTOGRAMS", - "Step3_long": "In OTTAA you have access to thousands of pictograms so you can talk about whatever you want. Find the Gallery of Pîctos in the lower left corner of the main screen", - "Ready": "Ready", - "Step4_long": "Enter the selection of games to learn while playing. OTTAA has educational games to learn vocabulary, concepts and much more. Also, more games will be available soon.", - "Play_and_learn": "PLAY AND LEARN", - "Male": "Male", - "Female": "Female", - "Binary": "Binary", - "Fluid": "Fluid", - "Other": "Other", - "hola_nnos_conozcamos_un_poco": "Hello,\nLet\"s get to know each other a little bit.", - "vamos_a_pedirte_cierta_informaci_n_para_nmejorar_tu_experiencia_con_ottaa": "We will ask you for certain information\nto improve your experience with OTTAA.", - "check_if_the_info_is_correct_nif_not_change_it_as_you_wish_this_will_help_us_to_personalize_the_app_for_you": "Check if the info is correct,\nif not, change it as you wish. This will help us to personalize the app for you.", - "te_ofrecemos_varias_opciones_para_naprender_a_utilizarla_y_sacarle_el_maximo_provecho": "We offer you several options to\nlearn how to use it and get the most out of it", - "por_ltimo": "At Last!", - "elige_un_personaje_que_nmejor_te_represente": "Choose a character that best represents you", - "edit_pictogram": "Edit pictogram", - "text": "Text", - "frame": "Frame", - "tags": "tags", - "keep_your_ottaa_up_to_date": "Keep your OTTAA up-to-date", - "account_info": "Account Info", - "account": "Account", - "account_type": "Account Type", - "current_ottaa_installed": "Current OTTAA Installed", - "current_ottaa_version": "Current OTTAA Version", - "device_name": "Device Name", - "contact_support": "Contact Support", - "edit": "Edit", - "delete": "Delete", - "fitzgerald_key": "Fitzgerald key", - "actions": "Actions", - "interactions": "Interactions", - "people": "people", - "nouns": "Nouns", - "adjectives": "Adjectives", - "miscellaneous": "Miscellaneous", - "choose_a_tag": "Choose a TAG", - "tags_widget_long_1": "By choosing TAGs you need to predict better when to show certain pictgorams, based on Time,Location, Calender or Weather", - "text_widget_long_1": "Enter the text to say it loud, can be a single word or a full sentence. Is up to you!", - "important": "Important", - "do_you_want_to_save_changes": "Do you want to save changes", - "no": "No", - "yes": "Yes", - "go_back": "Go Back", - "choose_an_option": "Choose an option", - "camera": "Camera", - "gallery": "Gallery", - "download_from_arasaac": "Download from ARASAAC", - "tags_will_come_in_next_release": "TAGs will come in next Release", - "mute": "Mute", - "about_ottaa": "About OTTAA", - "configuration": "Settings", - "tutorial": "Tutorial", - "close_application": "Close Application", - "sign_out": "Sign out", - "language": "Language", - "ottaa_labs": "OTTA Labs", - "language_page_long_1": "Use artificial intelligence to generate a richer sentence. You need a stable internet connection.", - "settings": "Settings", - "SETTINGS": "SETTINGS", - "pictograms": "Pictograms", - "prediction": "Prediction", - "accessibility": "Accessibility", - "voice_and_subtitles": "Voice and subtitles", - "all_phrases": "All Phrases", - "search": "Search", - "please_enter_a_valid_search": "Please enter a valid search", - "choose_a_picto_to_speak": "Choose a Picto to speak", - "we_are_working_on_this_feature": "We are working on this feature", - "most_used_sentences": "Most used Sentences", - "price_one": "Get access today to all the useful features that OTTAA Premium has to offer for only 990 ARS per month.", - "purchase_subscription": "PURCHASE SUBSCRIPTION", - "sentence_1": "Get access to educational games that allow you to evaluate vocabulary in a fun way", - "sentence_2": "Use OTTAA Project with screen scanning, connect accessible buttons and much more.", - "sentence_3": "With the premium version you can use the GPS to have a better prediction based on the commerce or place where you are", - "whats_the_picto": "What\"s the picto?", - "game1": "Answer the questions by choosing the right pictogram.\nLearn by playing!", - "match_picto": "Match Picto", - "game2": "Attach the pictogram correctly", - "memory_game": "Memory Game", - "game3": "Test your memory", - "play": "PLAY", - "select_a_category_to_play": "Select a category to play", - "image": "Image", - "share_text": "please, create a phrase and select the share button", - "text_to_speche_engine": "TEXT-TO-SPEECH-ENGINE", - "enable_custom_tts": "Enable custom TTS", - "speech_rate": "Speech Rate", - "speech_pitch": "Speech Pitch", - "SUBTITLE": "SUBTITLE", - "customized_subtitle": "Customized subtitle", - "size": "Size", - "upperCase": "UpperCase", - "it_allows_uppercase_subtitles": "It allows uppercase subtitles.", - "login_screen": "Hello, welcome to OTTAA Project, the first predictive communication platform for people with speech impairments, please login with your account and fill in some data to benefit from our prediction." -} \ No newline at end of file diff --git a/assets/i18n/fr.json b/assets/i18n/fr.json deleted file mode 100644 index 698d9378..00000000 --- a/assets/i18n/fr.json +++ /dev/null @@ -1,131 +0,0 @@ -{ - "hello_world": "Bonjour le monde!", - "delete": "Effacer", - "mute": "Muet", - "enable_custom_tts": "Activer TTS personnalisé", - "sign_out": "Déconnexion", - "yes": "Oui", - "customized_subtitle": "Sous-titre personnalisé", - "size": "Taille", - "it_allows_uppercase_subtitles": "Il permet les sous-titres majuscules.", - "language": "La langue", - "language_page_long_1": "Utilisez l'intelligence artificielle pour générer une phrase plus riche. Vous avez besoin d'une connexion Internet stable.", - "camera": "Caméra", - "download_from_arasaac": "Download from ARASAAC", - "important": "Important", - "no": "Non", - "choose_an_option": "Choisis une option", - "tutorial": "Tutoriel", - "configuration": "Paramètres", - "text_widget_long_1": "Entrez le texte pour le dire fort", - "Male": "Mâle", - "Female": "Femelle", - "Binary": "Binaire", - "Fluid": "Fluide", - "Other": "Autre", - "edit": "\"modifier \"", - "edit_pictogram": "Modifier le pictogramme", - "image": "Image", - "current_ottaa_installed": "OTTAA actuel installé", - "current_ottaa_version": "Version actuelle d'OTTAA", - "about_ottaa": "À propos d'OTTAA", - "text": "Texte", - "frame": "Cadre", - "nouns": "Noms", - "miscellaneous": "Divers", - "adjectives": "Adjectifs", - "interactions": "Interactions", - "actions": "Actions", - "choose_a_tag": "Choisissez un ÉTIQUETTE", - "Gender": "Le genre", - "pictograms": "Pictogrammes", - "prediction": "Prédiction", - "voice_and_subtitles": "Voix et sous-titres", - "settings": "Réglages", - "select_a_category_to_play": "Sélectionnez une catégorie à jouer", - "gallery": "Galerie", - "sentence_1": "Accédez à des jeux éducatifs qui vous permettent d'évaluer le vocabulaire de manière ludique", - "sentence_3": "Avec la version premium, vous pouvez utiliser le GPS pour avoir une meilleure prédiction en fonction du commerce ou du lieu où vous vous trouvez", - "close_application": "Fermer l'application", - "sentence_2": "Utilisez OTTAA Project avec la numérisation d'écran, connectez des boutons accessibles et bien plus encore.", - "Next": "Prochain", - "Previous": "Précédent", - "memory_game": "Jeux de mémoire", - "check_if_the_info_is_correct_nif_not_change_it_as_you_wish_this_will_help_us_to_personalize_the_app_for_you": "Vérifiez si les informations sont correctes,\nsi ce n'est pas le cas, modifiez-les comme vous le souhaitez. Cela nous aidera à personnaliser l'application pour vous.", - "Name": "Nom", - "por_ltimo": "Enfin!", - "vamos_a_pedirte_cierta_informaci_n_para_nmejorar_tu_experiencia_con_ottaa": "Nous vous demanderons certaines informations\npour améliorer votre expérience avec OTTAA.", - "hola_nnos_conozcamos_un_poco": "Bonjour, \\ Apprenons à nous connaître un peu.", - "elige_un_personaje_que_nmejor_te_represente": "Choisissez un personnage qui vous représente le mieux.", - "te_ofrecemos_varias_opciones_para_naprender_a_utilizarla_y_sacarle_el_maximo_provecho": "Nous vous proposons plusieurs options pour\napprendre à l'utiliser et en tirer le meilleur parti.", - "account_type": "Type de compte:", - "device_name": "Nom de l'appareil:", - "account_info": "Informations de compte", - "keep_your_ottaa_up_to_date": "Gardez votre OTTAA à jour", - "Access_thousands_of_pictograms": "ACCÉDEZ À DES MILLIERS DE PICTOGRAMMES", - "accessibility": "Accessibilité", - "account": "Compte :", - "add_group": "Ajouter un groupe", - "add_pict": "Ajouter un Pictogramme", - "all_phrases": "Toutes les expressions", - "Book_a_demo": " Réserver une démo", - "choose_a_picto_to_speak": "Choisissez un Picto pour parler", - "Choose_your_avatar": "Choisissez votre avatar", - "contact_support": "Contactez nous", - "Continue": "Continuer", - "Create_your_avatar_to_be_able_to_recognize_you_all_the_time": "Créez votre Avatar pour pouvoir vous reconnaître à tout moment", - "Create_your_phrase": "Créez vos expressions", - "Date_of_birth": "Date de naissance:", - "Do_a_guided_workshop": " Réserver une démo", - "do_you_want_to_save_changes": "Voulez-vous enregistrer les modifications?", - "Final_step_join": "Dernière étape, rejoindre", - "fitzgerald_key": "Clé de Fitzgerald", - "galeria_grupos": "Groupes de galeries", - "game1": "\" Répondez aux questions en choisissant le bon pictogramme. Apprenez en jouant !\"", - "game2": "Fixez correctement les pictogrammes", - "game3": "Testez votre mémoire", - "go_back": "Retour", - "Hello": "Hello blank fragment", - "Launch_short_tutorial": "Lancer le court tutoriel", - "Lets_get_to_knwo_each_other_first": "Apprenons d'abord à nous connaître", - "login_screen": "Bonjour, bienvenue sur OTTAA Project, la première plateforme de communication prédictive pour les personnes ayant des troubles de la parole, veuillez vous connecter avec votre compte et remplir quelques données pour bénéficier de notre prédiction.", - "Login_with_facebook": "Se connecter avec Facebook", - "Login_with_google": "Connectez-vous avec Google", - "match_picto": "Pictos de correspondance", - "most_used_sentences": "PLUS DE PHRASES UTILISÉES", - "Ottaa_is_a_powerful_communication_tool": "OTTAA est un puissant\\outil de communication.", - "ottaa_labs": "Laboratoires OTTA", - "people": "Personnes", - "play": "JOUER", - "Play_and_learn": "JOUER ET APPRENDRE", - "please_enter_a_valid_search": "Veuillez entrer une recherche valide", - "please_enter_some_text": "Veuillez saisir du texte", - "Please_register_to": "Veuillez vous inscrire pour", - "price_one": "Merci d'utiliser OTTAA Project, votre période d'essai s'est terminée le", - "purchase_subscription": "ACHAT D'ABONNEMENT", - "Ready": "Prêt", - "search": "Chercher", - "SETTINGS": "RÉGLAGES", - "share_text": "\"S'il vous plaît, créez une phrase et sélectionnez le bouton de partage\"", - "speech_pitch": "Hauteur de la voix", - "speech_rate": "Débit de parole", - "step1_long": "Touchez un ou plusieurs pictogrammes pour créer une phrase aussi longue que vous le souhaitez. Les pictogrammes sont automatiquement liés et vous aurez toujours un pictogramme de plus à ajouter.", - "step2_long": "Une fois la phrase créée, touchez le logo OTTAA pour parler à haute voix ou utilisez l'icône de partage, vous pouvez envoyer votre phrase via les réseaux sociaux les plus utilisés.", - "Step3_long": "\"Dans OTTAA, vous avez accès à des milliers de pictogrammes pour parler de tout ce que vous voulez, trouvez la galerie Picto dans le coin inférieur gauche de l'écran principal. \"", - "Step4_long": "Entrez dans la section des jeux pour apprendre en jouant. OTTAA propose des jeux didactiques pour apprendre du vocabulaire, des concepts et bien plus encore. De plus, d'autres jeux seront bientôt disponibles!", - "SUBTITLE": "SOUS-TITRE", - "tags": "Mots clés", - "tags_widget_long_1": "En choisissant des TAG, vous devez mieux prédire quand afficher certains pictogrammes, en fonction de l'heure, de l'emplacement, du calendrier ou de la météo", - "tags_will_come_in_next_release": "Les balises viendront dans la prochaine version", - "Talk_to_the_world": "Parlez au monde", - "text_to_speche_engine": "Moteur de synthèse vocale", - "Thank_you_for_choosing_ottaa_project": "Merci d'avoir choisi le projet OTTAA.", - "upperCase": "Majuscule", - "We_are_going_to_collect_some_data_to_get_to_know_you_better": "Nous allons collecter des données pour mieux vous connaître", - "we_are_preparing_everything": "Nous préparons tout...", - "we_are_working_on_this_feature": "Nous travaillons sur cette fonction, elle sera bientôt disponible", - "We_help_thousands_of_children_with_speech_problems_to_communicate_improving_their_quality_of_life": "Nous aidons des milliers d'enfants souffrant de troubles de la parole à communiquer, améliorant ainsi leur qualité de vie", - "We_offer_you_different_options_so_that_you_learn_how_to_use_it_and_get_the_most_out_of_it": "Nous vous proposons différentes options afin que vous appreniez à l'utiliser et à en tirer le meilleur parti.", - "Welcome_this_is_ottaa": "Bienvenue,\\in c'est OTTAA", - "whats_the_picto": "Quel est le picto" -} \ No newline at end of file diff --git a/assets/i18n/it_IT.json b/assets/i18n/it_IT.json index 1b2682ab..3adf09a9 100644 --- a/assets/i18n/it_IT.json +++ b/assets/i18n/it_IT.json @@ -1,141 +1,388 @@ { - "level": "Level", - "report": "Report", - "vocabulary": "Vocabulary", - "most_used_phrases": "MOST USED PHRASES", - "pictogram_by_sentence_on_average": "Pictograms by sentences on average", - "phrases_last_seven_days": "Phrases created in the last 7 days", - "score_text_1": "OTTAA Score is a measure of the overall use of the application, using data as usage in the last days and average picts per sentence.", - "most_used_groups": "Most used Groups", - "ottaa_score": "OTTAA Score", - "favourite_sentence": "Favourite Sentences", - "galeria_grupos": "Gallery Groups", - "add_pict": "Add Pict", - "add_group": "Add Group", - "hello_world": "Hello World", - "we_are_preparing_everything": "We are preparing everything...", - "Hello": "Hello", - "Continue": "Continue", - "Please_register_to": "Please Register to", - "Login_with_google": "Login with Google", - "Login_with_facebook": "Login with Facebook", - "Welcome_this_is_ottaa": "Welcome, this is OTTAA", - "We_help_thousands_of_children_with_speech_problems_to_communicate_improving_their_quality_of_life": "We help thousands of children with speech problems to communicate, improving their quality of life", - "Previous": "Previous", - "Next": "Next", - "Thank_you_for_choosing_ottaa_project": "Thank you for choosing OTTAA PROJECT", - "please_enter_some_text": "Please enter some text", - "Name": "Name", - "Gender": "Gender", - "Date_of_birth": "Date of Birth", - "Lets_get_to_knwo_each_other_first": "Let's get to know each other first", - "We_are_going_to_collect_some_data_to_get_to_know_you_better": "We are going to collect some data to get to know you better", - "Launch_short_tutorial": "Launch short Tutorial", - "Do_a_guided_workshop": "DO A GUIDED WORKSHOP", - "Book_a_demo": "BOOK A DEMO", - "Ottaa_is_a_powerful_communication_tool": "OTTAA is a powerful \ncommunication tool", - "We_offer_you_different_options_so_that_you_learn_how_to_use_it_and_get_the_most_out_of_it": "We offer you different options so that you learn how to use it and get the most out of it.", - "Choose_your_avatar": "Choose your Avatar", - "Final_step_join": "Final step, join", - "Create_your_avatar_to_be_able_to_recognize_you_all_the_time": "Create your Avatar to be able to recognize you all the time", - "Create_your_phrase": "CREATE YOUR PHRASES", - "step1_long": "Touch one or more of the pictograms to create a sentence as long as you like. The pictograms are automatically related and you will always have one more pictogram to add", - "Talk_to_the_world": "TALK TO THE WORLD", - "step2_long": "Once the phrase is created, touch the OTTAA logo to speak aloud or using the share icon, you can send your phrase through the most used social networks", - "Access_thousands_of_pictograms": "ACCESS THOUSANDS OF PICTOGRAMS", - "Step3_long": "In OTTAA you have access to thousands of pictograms so you can talk about whatever you want. Find the Gallery of Pîctos in the lower left corner of the main screen", - "Ready": "Ready", - "Step4_long": "Enter the selection of games to learn while playing. OTTAA has educational games to learn vocabulary, concepts and much more. Also, more games will be available soon.", - "Play_and_learn": "PLAY AND LEARN", - "Male": "Male", - "Female": "Female", - "Binary": "Binary", - "Fluid": "Fluid", - "Other": "Other", - "hola_nnos_conozcamos_un_poco": "Hello,\nLet\"s get to know each other a little bit.", - "vamos_a_pedirte_cierta_informaci_n_para_nmejorar_tu_experiencia_con_ottaa": "We will ask you for certain information\nto improve your experience with OTTAA.", - "check_if_the_info_is_correct_nif_not_change_it_as_you_wish_this_will_help_us_to_personalize_the_app_for_you": "Check if the info is correct,\nif not, change it as you wish. This will help us to personalize the app for you.", - "te_ofrecemos_varias_opciones_para_naprender_a_utilizarla_y_sacarle_el_maximo_provecho": "We offer you several options to\nlearn how to use it and get the most out of it", - "por_ltimo": "At Last!", - "elige_un_personaje_que_nmejor_te_represente": "Choose a character that best represents you", - "edit_pictogram": "Edit pictogram", - "text": "Text", - "frame": "Frame", - "tags": "tags", - "keep_your_ottaa_up_to_date": "Keep your OTTAA up-to-date", - "account_info": "Account Info", - "account": "Account", - "account_type": "Account Type", - "current_ottaa_installed": "Current OTTAA Installed", - "current_ottaa_version": "Current OTTAA Version", - "device_name": "Device Name", - "contact_support": "Contact Support", - "edit": "Edit", - "delete": "Delete", - "fitzgerald_key": "Fitzgerald key", - "actions": "Actions", - "interactions": "Interactions", - "people": "people", - "nouns": "Nouns", - "adjectives": "Adjectives", - "miscellaneous": "Miscellaneous", - "choose_a_tag": "Choose a TAG", - "tags_widget_long_1": "By choosing TAGs you need to predict better when to show certain pictgorams, based on Time,Location, Calender or Weather", - "text_widget_long_1": "Enter the text to say it loud, can be a single word or a full sentence. Is up to you!", - "important": "Important", - "do_you_want_to_save_changes": "Do you want to save changes", - "no": "No", - "yes": "Yes", - "go_back": "Go Back", - "choose_an_option": "Choose an option", - "camera": "Camera", - "gallery": "Gallery", - "download_from_arasaac": "Download from ARASAAC", - "tags_will_come_in_next_release": "TAGs will come in next Release", - "mute": "Mute", - "about_ottaa": "About OTTAA", - "configuration": "Settings", - "tutorial": "Tutorial", - "close_application": "Close Application", - "sign_out": "Sign out", - "language": "Language", - "ottaa_labs": "OTTA Labs", - "language_page_long_1": "Use artificial intelligence to generate a richer sentence. You need a stable internet connection.", - "settings": "Settings", - "SETTINGS": "SETTINGS", - "pictograms": "Pictograms", - "prediction": "Prediction", - "accessibility": "Accessibility", - "voice_and_subtitles": "Voice and subtitles", - "all_phrases": "All Phrases", - "search": "Search", - "please_enter_a_valid_search": "Please enter a valid search", - "choose_a_picto_to_speak": "Choose a Picto to speak", - "we_are_working_on_this_feature": "We are working on this feature", - "most_used_sentences": "Most used Sentences", - "price_one": "Get access today to all the useful features that OTTAA Premium has to offer for only 990 ARS per month.", - "purchase_subscription": "PURCHASE SUBSCRIPTION", - "sentence_1": "Get access to educational games that allow you to evaluate vocabulary in a fun way", - "sentence_2": "Use OTTAA Project with screen scanning, connect accessible buttons and much more.", - "sentence_3": "With the premium version you can use the GPS to have a better prediction based on the commerce or place where you are", - "whats_the_picto": "What\"s the picto?", - "game1": "Answer the questions by choosing the right pictogram.\nLearn by playing!", - "match_picto": "Match Picto", - "game2": "Attach the pictogram correctly", - "memory_game": "Memory Game", - "game3": "Test your memory", - "play": "PLAY", - "select_a_category_to_play": "Select a category to play", - "image": "Image", - "share_text": "please, create a phrase and select the share button", - "text_to_speche_engine": "TEXT-TO-SPEECH-ENGINE", - "enable_custom_tts": "Enable custom TTS", - "speech_rate": "Speech Rate", - "speech_pitch": "Speech Pitch", - "SUBTITLE": "SUBTITLE", - "customized_subtitle": "Customized subtitle", - "size": "Size", - "upperCase": "UpperCase", - "it_allows_uppercase_subtitles": "It allows uppercase subtitles.", - "login_screen": "Hello, welcome to OTTAA Project, the first predictive communication platform for people with speech impairments, please login with your account and fill in some data to benefit from our prediction." -} \ No newline at end of file + "profile": { + "selection": { + "text1": "¿Quién va a utilizar la aplicación en este dispositivo?", + "caregiver_text": "Necesita comunicarse", + "user_text": "Necesita comunicarse" + }, + "hello": "Hola {name}!", + "ottaa": { + "tips": "OTTAA tips" + }, + "mail": "Correo electrónico", + "date": "Data di nascita", + "faq": { + "title": "Domande frequenti (FAQ)", + "faq0": "¿Quién puede usar la aplicación OTTAA?", + "faq0Description": "OTTAA está diseñado para personas no verbales, es decir, cualquier persona que no utilice el habla oral para comunicarse. Las personas que usan OTTAA hoy en día fueron diagnosticadas con autismo, parálisis cerebral, síndrome de Down, esclerosis lateral amiotrófica (ELA), atrofia muscular espinal (AME) o síndrome de enclaustramiento post al accidente cerebrovascular (LiS), entre otras afecciones. Al ser una herramienta de comunicación dinámica, OTTAA requiere que sus usuarios posean funciones cognitivas de nivel medio a alto. Sin embargo, nos gusta considerar cada caso individualmente, así que no dude en ponerse en contacto y solicitar una evaluación en línea con nuestro equipo.", + "faq1": "¿Cómo funciona la aplicación?", + "faq1Description": "La aplicación OTTAA proporciona al usuario pictogramas: imágenes que representan acciones, objetos, sentimientos o emociones. El usuario puede elegir los pictogramas que necesita y crear una frase, esta se traduce de los pictogramas a una oración escrita que aparece en la pantalla y que la aplicación también lee en voz alta. Consulta nuestro canal de Youtube para obtener una explicación más visual.", + "faq2": "¿En qué se diferencia esta aplicación de otros dispositivos AAC (comunicación aumentativa y alternativa)?", + "faq2Description": "La aplicación OTTAA es diferente de otras aplicaciones de CAA debido a su innovador algoritmo predictivo y generador de lenguaje natural, que permite que la aplicación aprenda del comportamiento del usuario en la aplicación, su edad, sexo, la hora del día y su ubicación para pre -seleccionar pictograma(s) para el momento comunicacional en el que se encuentran.", + "faq3": "¿Cuánto cuesta la aplicación OTTAA?", + "faq3Description": "La aplicación OTTAA es gratuita para descargar y usar. Para crear un producto sostenible que resista el paso del tiempo, hay algunas características que requieren una suscripción para utilizarlas. Sin embargo, estamos trabajando arduamente para brindar financiamiento a todos los que lo necesitan.\n\nSi estás en Argentina, cualquier ayuda técnica que necesite una persona debe estar cubierto por un seguro de salud. Comuníquese con nuestro equipo para obtener orientación y asistencia sobre cómo obtener esta cobertura.\n\nSi sos de cualquier otro país de LATAM y querés compartir tu experiencia sobre este tema, no dudes en comunicarte, tu contribución podría ayudar a muchas personas.", + "faq4": "¿Qué idiomas son compatibles con el Proyecto OTTAA?", + "faq4Description": "Actualmente admitimos español, inglés, portugués y francés. Para español, tenemos versiones localizadas de Argentina, Chile, Colombia y España. Estamos buscando activamente contribuciones sobre nuevos idiomas o una mejor localización para las variedades españolas. Únete a nuestra comunidad de crowdin para contribuir.", + "faq5": "¿Cómo puedo colaborar con el Proyecto OTTAA?", + "faq5Description": "Los colaboradores pueden ayudar a OTTAA con el desarrollo, las pruebas y/o la traducción. Para leer más sobre el tema y comenzar, consulta la sección Contribuir en el repositorio oficial de OTTAA en GitHub." + }, + "caregiver": "Acompañante", + "caregivers_families": "Profesionales/Familiares", + "user": "Usuario/a", + "user_description": "Persona no verbal", + "wait": "Por favor espera", + "setting_exp": "Configurando tu experiencia...", + "link_account": "Vincular una cuenta", + "use": { + "ottaa": "Utilizar OTTAA" + }, + "close_profile": "Ocultar", + "open_profile": "Ver perfil", + "no_account": "Modo sin perfil", + "new_existant": "Nuevo/Existente", + "what_do": "¿Qué quieres hacer?", + "profile": "Perfil", + "linked_accounts": "Cuentas vinculadas", + "name": "Nombre", + "logout": "Cerrar sesión", + "last_name": "Apellido", + "role": "Rol de uso", + "day": "Giorno", + "month": "Mese", + "year": "Anno", + "tips": { + "title1": "Statistiche", + "title2": "Tableros", + "title3": "Cronolgia", + "title4": "Preferiti", + "text1": "Mira las estadísticas de tu paciente/familiar, para ver su actividad y cómo fue mejorando a lo largo de los días, semanas y meses.", + "text2": "Oculta los tableros que no use el usuario, para que le aparezcan los tableros que más utiliza y necesita.", + "text3": "Utiliza el historial para ver tus frases pasadas, qué hiciste durante el día y contar historias.", + "text4": "Guarda pictogramas o frases favoritas, para poder acceder a ellas más rápidamente." + }, + "unlink": "Desvincular", + "unlink_account": "¿Desea desvincular a {name} de sus cuentas?", + "help": { + "help": "¿Necesita ayuda?", + "title1": "Domande frequenti (FAQ)", + "title2": "Contactar con el soporte" + }, + "link": { + "title": "Vincular Cuenta", + "mail": { + "title": "Introduzca el correo electrónico vinculado a la cuenta de OTTAA", + "input": { + "required": "El correo electrónico es obligatorio", + "invalid": "El correo electrónico no es válido" + }, + "warn": "*Se enviará una notificación con un código para enlazar los perfiles.", + "contact": "*Asegurate de estar en contacto con la persona que posea esta cuenta en un dispositivo." + }, + "token": { + "title": "Coloque el código de verificación que llegó como notificación a otro dispositivo.", + "problem": "¿Tiene problemas para vincular las cuentas?", + "resend": "Reenviar código", + "back": "Introducir otro email", + "invalid": "Token no válido" + }, + "wait": { + "title": "Espere", + "subtitle": "Cargando perfil..." + }, + "success": { + "title": "Perfil vinculado con éxito!", + "lastTime": "Últ. vez {date}" + }, + "error": { + "link-exist": "Ya están vinculadas", + "miss-caregiver": "Error: Cuidador 404", + "miss-user": "Error: Usuario 404", + "user-no-comp": "Error: Usuario 406", + "caregiver-no-comp": "Error: Cuidador 406", + "autolink": "Error: Misma cuenta", + "auth/user-not-found": "Usuario no encontrado", + "miss-token": "Falta el Token", + "invalid-token": "Token no válido", + "expired-token": "Token caducado" + } + }, + "delete_account": "Eliminar cuenta" + }, + "user": { + "main": { + "title": "Configura tu experiencia", + "subtitle1": "Uso de la aplicación", + "subtitle2": "Lenguaje predictivo" + }, + "settings": { + "main_screen": "Pantalla principal", + "accessibility": "Accesibilidad", + "voice_and_subtitles": "Voz y subtítulos", + "language": "Lenguaje" + }, + "main_setting": { + "interaction": "Interacciones", + "talk_delete": "Hablar y Borrar", + "shortcut": "Atajos en el Inicio", + "board_view": "Vista de tableros", + "tabs": "Por pestañas", + "grid": "Grilla", + "ottaa_labs": "OTTAA Labs", + "labs_text": "Función frases verbales", + "labs_long": "Función en Modo Beta\nPermite generar frases con tiempos verbales más complejas", + "one_by_one": "ONE by ONE" + }, + "accessibility": { + "selection": "Selección", + "bar_text": "Tiempo de clickeo (Segundos)", + "connected": "Dispositivos conectados", + "device": "Dispositivo de accesibilidad", + "press": "Press&Press", + "scroll": "Scroll&Press", + "sip": "Soplo y succión", + "selection_type": "Tipo de selección", + "swept": "Barrido", + "speed": "Velocidad", + "selection_speed": "Velocidad de selección" + }, + "voice_and_subtitle": { + "voice_types": "Tipos de voz", + "voice_rate": "Velocidad de voz", + "voz1": "Voz 1", + "voz2": "Voz 2", + "voz3": "Voz 3", + "mute": "Silenciar pictogramas", + "subtitle": "Subtítulos", + "show": "Mostrar subtítulos", + "size": "Tamaño", + "capital": "Mayúsculas" + }, + "language": { + "set": "Idioma establecido" + } + }, + "global": { + "hello_world": "Ciao Mondo", + "hello": "Ciao", + "continue": "Procedi", + "next": "Avanti", + "back": "Indietro", + "please_enter_text": "Por favor, introduce un texto", + "done": "Pronto", + "yes": "Sì", + "delete": "Cancella", + "edit": "Modifica", + "no": "No", + "mute": "Silenzia", + "important": "Importante", + "save_changes": "Salva le modifiche", + "send": "Invia", + "skip": "Salta", + "email": "Indirizzo e-mail", + "step": "Paso", + "share": "Share", + "support": "Supporto", + "congrats": "Congratulazioni", + "settings": "Configuración", + "general": "General", + "pictogram": "Pictogramas", + "configuration": "Configuración", + "user_ottaa": "Usar OTTAA como", + "cancel": "Cancelar", + "slow": "Lenta", + "default": "Predeterminada", + "fast": "Rápida", + "voice": "Voz", + "small": "Pequeño", + "medium": "Mediano", + "big": "Grande", + "comingsoon": "¡Esta característica estará disponible muy pronto!", + "delicate": "Región", + "chile": "Chile", + "spanish": "Español", + "argentina": "Argentina", + "colombia": "Colombia", + "english": "Inglés", + "italian": "Italiano", + "french": "Francés", + "portuguese": "Portugues", + "test": "Esta es la voz que vas a usar en ota", + "add": "Agregar", + "confirm": "Confirmar", + "gallery": "galería", + "arasaac": "ARASAAC", + "text": "Texto", + "color": "Color", + "search": "Buscar", + "actions": "Acciones", + "people": "Personas", + "miscellaneous": "Miscelaneas", + "noun": "Sustantivos", + "adjective": "Adjetivos", + "predictive": "Predictivo", + "sunday": "Domingo", + "monday": "Lunes", + "tuesday": "Martes", + "wednesday": "Miércoles", + "thursday": "Jueves", + "friday": "Viernes", + "saturday": "Sábado", + "tomorrow": "Mañana", + "noon": "Mediodía", + "late": "Tarde", + "evening": "Noche", + "add_new": "Agregar nuevo", + "disguise": "Ocultar", + "save": "Guardar", + "image": "Imágen", + "saved_in": "Guardado en", + "location": "Ubicación", + "voices": "Por favor, instale voces desde la configuración para una mejor usabilidad" + }, + "onboarding": { + "start": "Iniziare", + "profile": { + "title": "Pantalla de perfiles", + "subtitle": "¿Quién va a usar OTTAA hoy?", + "description": "Con la selección de perfiles vas a poder usar OTTAA desde cualquier dispositivo, manteniendo tus pictogramas y estilos!" + }, + "home": { + "title": "Personaliza tu Inicio", + "subtitle": "Atajos en la pantalla principal", + "description": "Personalizá de acuerdo a tus gustos y necesidades" + }, + "customize": { + "title": "Personalizá tu Home", + "subtitle": "Acompañamos en el proceso de aprendizaje", + "description": "Activá o desactivá tableros o pictogramas para modificar la predicción, vos tenés el control." + }, + "skip": { + "title": "¿Estás de acuerdo en saltar la introducción?" + } + }, + "terms": { + "button": "Accetto i termini", + "text": "Para continuar, necesitamos que aceptes los términos y condiciones.\nVer términos" + }, + "loginWait": { + "text": "Te damos la bienvenida!\nAl mundo de OTTAA" + }, + "login": { + "title": "Ingresa con tu cuenta", + "google": "Continuar con Google.", + "facebook": "Continuar con Facebook", + "apple": "Continuar con Apple", + "register": "¿Todavía no tienes cuenta? Regístrate aquí", + "wait": { + "title": "Te damos la bienvenida!", + "subtitle": "Al nuevo mundo de OTTAA Project" + } + }, + "customize": { + "board": { + "title": "¿Qué tableros utilizará el usuario para comunicarse?", + "appbar": "Tableros predictivos", + "skip": "¿Omitir la elección de tableros?", + "subtitle": "Ver pictogramas" + }, + "shortcut": { + "title": "Seleccioná los atajos que aparecerán en la pantalla principal.", + "appbar": "Atajos", + "favorites": "Preferiti", + "history": "Cronolgia", + "camera": "Cámara", + "games": "Juegos" + }, + "picto": { + "title": "Tablero {name}", + "switch": "Activar tablero" + }, + "help": { + "boards": "Los tableros predictivos permiten configurar qué grupo de pictogramas se mostrará en la pantalla del usuario/a final.", + "shortcut": "Los atajos son accesos rápidos a distintas funciones para que el/la usuario/a final disponga en su pantalla principal." + }, + "wait": { + "title": "¡Felicitaciones!", + "subtitle": "Has configurado la experiencia de {name}", + "button": "Ir al panel de perfiles" + }, + "skip": "¿Estás de acuerdo en saltar las preferencias del perfil?" + }, + "home": { + "grid": { + "title": "Tableros", + "pictos": "Tablero {group}" + } + }, + "chatgpt": { + "prompt": "escribir una frase en español con estas palabras como si fueras {gender}, agregando conectores y artículos cuando sea necesario, pero sin cambiar las palabras: {pictograms}" + }, + "notification": { + "code": { + "request": { + "title": "Verificación de OTTAA Link", + "body": "Están intentando vincular tu cuenta con el token {linkToken}" + }, + "confirm": { + "title": "Confirmación de OTTAA Link", + "body": "Se ha confirmado la vinculación de tu cuenta" + } + } + }, + "game": { + "play": "¡Juguemos!", + "next": "Jugar", + "game_header_0": "¿Cuál es el pictograma?", + "game_header_1": "Unir pictogramas", + "game_header_2": "Juego de la Memoria", + "game_header_3": "Armá una historia", + "game_sub_0": "Respondé las preguntas eligiendo el pictograma correcto. Aprende jugando", + "game_sub_1": "Unir los pictogramas de manera correcta", + "game_sub_2": "Prueba tu memoria, ¿Cuánto recuerdas los pictogramas?", + "game_sub_3": "Elegí los pictogramas que más te gusten, y con la ayuda de Chat GPT, crearás una historia.", + "group": "Seleccioná una categoría para poder jugar", + "search": "Buscar Tablero", + "find": "Encuentra los tableros que quieras, fácilmente!", + "game_1_line": "Seleccioná el pictograma que escuches", + "game_2_line": "Seleccioná la palabra que corresponde a su pictograma", + "game_3_line": "Seleccioná una tarjeta y encontrá la pareja del pictograma", + "game_4_line": "Agregá hasta 4 pictogramas y creá tu propia historia", + "no": "¡Oh Oh!", + "yes": "¡Muy bien!", + "correct": "Correcto", + "incorrect": "Incorrecto", + "use_time": "Tiempo total", + "maximum_streak": "Mejor racha", + "speak_what": "¿Cual es el picto {name}?", + "gptbtn": "Crear historia", + "prompt": "Actúa como maestra de jardín de infantes y escribe una historia en español para niños usando las siguientes palabras:", + "nivel": "Nivel" + }, + "exit": { + "long": { + "headline": "¿Deseas volver a la pantalla de perfiles?", + "body": "Mantén presionado el botón resaltado para volver", + "check": "No volver a mostrar este mensaje", + "btn": "De acuerdo" + }, + "short": { + "headline": "¿Confima que deseas volver a la pantalla de perfiles?" + } + }, + "create": { + "heading": "Crear pictograma", + "image_selection": "Elije la imagen que represente al pictograma", + "choose_color": "Elije el color", + "search_arsaac": "Buscar ARASAAC", + "time_headline": "Selecciona los horarios que más se adecuen a sus actividades", + "time_sub1": "¿Qué días de la semana es cuando más lo utiliza?", + "schedule": "¿En qué horario?", + "save": "Guardar pictograma", + "created_by_me": "Creados por mi", + "new_board": "Nuevo tablero", + "create_new_board": "Crear nuevo tablero", + "board_name": "Nombre del tablero", + "edit_picto": "Editar pictograma", + "final_heading": "Listo, chequea que todo este correcto" + } +} diff --git a/assets/i18n/pt.json b/assets/i18n/pt.json deleted file mode 100644 index 6be10c45..00000000 --- a/assets/i18n/pt.json +++ /dev/null @@ -1,133 +0,0 @@ -{ - "hello_world": "Olá Mundo!", - "delete": "Excluir", - "mute": "Mudo", - "enable_custom_tts": "Habilitar TTS personalizado", - "sign_out": "Sair", - "yes": "sim", - "customized_subtitle": "Legenda personalizada", - "size": "Tamanho", - "it_allows_uppercase_subtitles": "Ele permite legendas em maiúsculas.", - "language": "Língua", - "language_page_long_1": "Use inteligência artificial para gerar uma frase mais rica. Você precisa de uma conexão estável com a internet.", - "camera": "Câmera", - "download_from_arasaac": "Baixar de ARASAAC", - "important": "Importante", - "no": "Não", - "choose_an_option": "Escolha uma opção", - "tutorial": "Tutorial", - "configuration": "Configurações", - "text_widget_long_1": "Digite o texto para dizer alto", - "Male": "Masculino", - "Female": "Fêmea", - "Binary": "Binário", - "Fluid": "Fluido", - "Other": "Outro", - "edit": "Editar", - "edit_pictogram": "MODIFICAÇÃO DO PICTOGRAMA", - "image": "Imagem", - "current_ottaa_installed": "OTTAA atual instalado", - "current_ottaa_version": "Versão OTTAA Atual", - "about_ottaa": "Sobre OTTAWA", - "text": "Texto", - "frame": "Quadro", - "nouns": "Substantivos", - "miscellaneous": "Diversos", - "adjectives": "Adjetivos", - "interactions": "Interações", - "actions": "Ações", - "choose_a_tag": "Escolha uma ETIQUETA", - "Gender": "Gênero", - "pictograms": "Pictogramas", - "prediction": "Predição", - "voice_and_subtitles": "Voz e legendas", - "settings": "Definições", - "select_a_category_to_play": "Selecione uma categoria para jogar", - "gallery": "Galeria", - "sentence_1": "Tenha acesso a jogos educativos que permitem avaliar o vocabulário de forma divertida", - "sentence_3": "Com a versão premium pode utilizar o GPS para ter uma melhor previsão com base no comércio ou local onde se encontra", - "close_application": "Fechar aplicação", - "sentence_2": "Use o OTTAA Project com varredura de tela, conecte botões acessíveis e muito mais.", - "Next": "Próximo", - "Previous": "Anterior", - "memory_game": "Jogo da memória", - "check_if_the_info_is_correct_nif_not_change_it_as_you_wish_this_will_help_us_to_personalize_the_app_for_you": "Verifique se as informações estão corretas,\ncaso não, altere-as como desejar. Isso nos ajudará a personalizar o aplicativo para você.", - "Name": "Nome", - "por_ltimo": "Afinal!", - "vamos_a_pedirte_cierta_informaci_n_para_nmejorar_tu_experiencia_con_ottaa": "Solicitaremos certas informações para melhorar sua experiência com a OTTAA.", - "hola_nnos_conozcamos_un_poco": "Olá, vamos nos conhecer um pouco.", - "elige_un_personaje_que_nmejor_te_represente": "Escolha um personagem que melhor represente você.", - "te_ofrecemos_varias_opciones_para_naprender_a_utilizarla_y_sacarle_el_maximo_provecho": "Oferecemos várias opções para\naprender como usá-lo e tirar o máximo proveito dele.", - "account_type": "Tipo de conta:", - "device_name": "Nome do dispositivo:", - "account_info": "Informações da Conta", - "keep_your_ottaa_up_to_date": "Mantenha seu OTTAA atualizado", - "Access_thousands_of_pictograms": "ACESSE MILHARES DE PICTOGRAMAS", - "accessibility": "Acessibilidade", - "account": "Conta :", - "add_group": "ADICIONAR GRUPO", - "add_pict": "ADICIONE UM PICTOGRAMA", - "all_phrases": "Todas as frases", - "Book_a_demo": "Reserve uma demonstração", - "choose_a_picto_to_speak": "Escolha um Picto para falar", - "Choose_your_avatar": "Escolha seu avatar", - "contact_support": "Contate-Nos", - "Continue": "Continuar", - "Create_your_avatar_to_be_able_to_recognize_you_all_the_time": "Crie seu Avatar para poder reconhecê-lo o tempo todo", - "Create_your_phrase": "Crie suas frases", - "Date_of_birth": "Data de nascimento:", - "Do_a_guided_workshop": "Faça um workshop guiado", - "do_you_want_to_save_changes": "Você quer salvar as alterações ?", - "Final_step_join": "Etapa final, junte-se", - "fitzgerald_key": "Chave Fitzgerald", - "galeria_grupos": "Grupos de galerias", - "game1": "\"Responda às perguntas escolhendo o pictograma certo. Aprenda brincando!\"", - "game2": "Anexe os pictogramas corretamente", - "game3": "Teste sua memória", - "go_back": "De volta", - "Hello": "Hello blank fragment", - "Launch_short_tutorial": "Iniciar breve tutorial", - "Lets_get_to_knwo_each_other_first": "Vamos nos conhecer primeiro", - "login_screen": "Olá, bem-vindo ao OTTAA Project, a primeira plataforma de comunicação preditiva para pessoas com deficiência de fala, faça o login com sua conta e preencha alguns dados para se beneficiar de nossa previsão.", - "Login_with_facebook": "Entrar com o Facebook", - "Login_with_google": "Entrar com o Google", - "match_picto": "Imagens de correspondência", - "most_used_sentences": "FRASES MAIS USADAS", - "Ottaa_is_a_powerful_communication_tool": "OTTAA é uma ferramenta de comunicação poderosa.", - "ottaa_labs": "Laboratórios OTTAA", - "people": "Pessoas", - "play": "TOQUE", - "Play_and_learn": "JOGAR E APRENDER", - "please_enter_a_valid_search": "Insira uma pesquisa válida", - "please_enter_some_text": "Por favor, digite algum texto", - "Please_register_to": "Por favor, registre-se para", - "price_one": "Obrigado por usar o OTTAA Project, o período de teste terminou em", - "purchase_subscription": "COMPRAR ASSINATURA", - "Ready": "Preparar", - "search": "Procurar", - "SETTINGS": "DEFINIÇÕES", - "share_text": "\"Por favor, crie uma frase e selecione o botão de compartilhamento\"", - "speech_pitch": "Tom de voz", - "speech_rate": "Taxa de fala", - "step1_long": "Toque em um ou mais pictogramas para criar uma frase do tamanho que desejar. Os pictogramas são relacionados automaticamente e você sempre terá mais um pictograma para adicionar.", - "step2_long": "Uma vez criada a frase, toque no logo da OTTAA para falar em voz alta ou usando o ícone de compartilhamento, você pode enviar sua frase pelas redes sociais mais utilizadas.", - "Step3_long": "\"No OTTAA você tem acesso a milhares de pictogramas para falar o que quiser, encontre a Galeria Picto no canto inferior esquerdo da tela principal.\"", - "Step4_long": "Entre na seção de jogos para aprender jogando. OTTAA tem jogos didáticos para aprender vocabulário, conceitos e muito mais. Além disso, mais jogos estarão disponíveis em breve!", - "SUBTITLE": "LEGENDA", - "tags": "Tag", - "tags_widget_long_1": "Ao escolher TAGs, você precisa prever melhor quando exibir determinados pictgorams, com base na hora, local, calendário ou clima", - "tags_will_come_in_next_release": "TAGs virão na próxima versão", - "Talk_to_the_world": "Fale com o mundo", - "text_to_speche_engine": "Motor de texto para voz", - "Thank_you_for_choosing_ottaa_project": "Obrigado por escolher OTTAA Project.", - "upperCase": "Maiúscula", - "We_are_going_to_collect_some_data_to_get_to_know_you_better": "Vamos coletar alguns dados para conhecê-lo melhor", - "we_are_preparing_everything": "Estamos preparando tudo...", - "we_are_working_on_this_feature": "Estamos trabalhando nesta função, ela estará disponível em breve", - "We_help_thousands_of_children_with_speech_problems_to_communicate_improving_their_quality_of_life": "Estamos ajudando milhares de crianças com deficiência de fala a se comunicarem, melhorando sua qualidade de vida", - "We_offer_you_different_options_so_that_you_learn_how_to_use_it_and_get_the_most_out_of_it": "Oferecemos diferentes opções para que você aprenda a usá-lo e aproveite ao máximo.", - "Welcome_this_is_ottaa": "Bem-vindo,\nisto é OTTAA", - "whats_the_picto": "Qual é o picto", - "favourite_sentence": "Oraciones favoritas", - "level": "Nivel" -} \ No newline at end of file diff --git a/assets/i18n/pt_BR.json b/assets/i18n/pt_BR.json index 1b2682ab..53cd2cc8 100644 --- a/assets/i18n/pt_BR.json +++ b/assets/i18n/pt_BR.json @@ -1,141 +1,388 @@ { - "level": "Level", - "report": "Report", - "vocabulary": "Vocabulary", - "most_used_phrases": "MOST USED PHRASES", - "pictogram_by_sentence_on_average": "Pictograms by sentences on average", - "phrases_last_seven_days": "Phrases created in the last 7 days", - "score_text_1": "OTTAA Score is a measure of the overall use of the application, using data as usage in the last days and average picts per sentence.", - "most_used_groups": "Most used Groups", - "ottaa_score": "OTTAA Score", - "favourite_sentence": "Favourite Sentences", - "galeria_grupos": "Gallery Groups", - "add_pict": "Add Pict", - "add_group": "Add Group", - "hello_world": "Hello World", - "we_are_preparing_everything": "We are preparing everything...", - "Hello": "Hello", - "Continue": "Continue", - "Please_register_to": "Please Register to", - "Login_with_google": "Login with Google", - "Login_with_facebook": "Login with Facebook", - "Welcome_this_is_ottaa": "Welcome, this is OTTAA", - "We_help_thousands_of_children_with_speech_problems_to_communicate_improving_their_quality_of_life": "We help thousands of children with speech problems to communicate, improving their quality of life", - "Previous": "Previous", - "Next": "Next", - "Thank_you_for_choosing_ottaa_project": "Thank you for choosing OTTAA PROJECT", - "please_enter_some_text": "Please enter some text", - "Name": "Name", - "Gender": "Gender", - "Date_of_birth": "Date of Birth", - "Lets_get_to_knwo_each_other_first": "Let's get to know each other first", - "We_are_going_to_collect_some_data_to_get_to_know_you_better": "We are going to collect some data to get to know you better", - "Launch_short_tutorial": "Launch short Tutorial", - "Do_a_guided_workshop": "DO A GUIDED WORKSHOP", - "Book_a_demo": "BOOK A DEMO", - "Ottaa_is_a_powerful_communication_tool": "OTTAA is a powerful \ncommunication tool", - "We_offer_you_different_options_so_that_you_learn_how_to_use_it_and_get_the_most_out_of_it": "We offer you different options so that you learn how to use it and get the most out of it.", - "Choose_your_avatar": "Choose your Avatar", - "Final_step_join": "Final step, join", - "Create_your_avatar_to_be_able_to_recognize_you_all_the_time": "Create your Avatar to be able to recognize you all the time", - "Create_your_phrase": "CREATE YOUR PHRASES", - "step1_long": "Touch one or more of the pictograms to create a sentence as long as you like. The pictograms are automatically related and you will always have one more pictogram to add", - "Talk_to_the_world": "TALK TO THE WORLD", - "step2_long": "Once the phrase is created, touch the OTTAA logo to speak aloud or using the share icon, you can send your phrase through the most used social networks", - "Access_thousands_of_pictograms": "ACCESS THOUSANDS OF PICTOGRAMS", - "Step3_long": "In OTTAA you have access to thousands of pictograms so you can talk about whatever you want. Find the Gallery of Pîctos in the lower left corner of the main screen", - "Ready": "Ready", - "Step4_long": "Enter the selection of games to learn while playing. OTTAA has educational games to learn vocabulary, concepts and much more. Also, more games will be available soon.", - "Play_and_learn": "PLAY AND LEARN", - "Male": "Male", - "Female": "Female", - "Binary": "Binary", - "Fluid": "Fluid", - "Other": "Other", - "hola_nnos_conozcamos_un_poco": "Hello,\nLet\"s get to know each other a little bit.", - "vamos_a_pedirte_cierta_informaci_n_para_nmejorar_tu_experiencia_con_ottaa": "We will ask you for certain information\nto improve your experience with OTTAA.", - "check_if_the_info_is_correct_nif_not_change_it_as_you_wish_this_will_help_us_to_personalize_the_app_for_you": "Check if the info is correct,\nif not, change it as you wish. This will help us to personalize the app for you.", - "te_ofrecemos_varias_opciones_para_naprender_a_utilizarla_y_sacarle_el_maximo_provecho": "We offer you several options to\nlearn how to use it and get the most out of it", - "por_ltimo": "At Last!", - "elige_un_personaje_que_nmejor_te_represente": "Choose a character that best represents you", - "edit_pictogram": "Edit pictogram", - "text": "Text", - "frame": "Frame", - "tags": "tags", - "keep_your_ottaa_up_to_date": "Keep your OTTAA up-to-date", - "account_info": "Account Info", - "account": "Account", - "account_type": "Account Type", - "current_ottaa_installed": "Current OTTAA Installed", - "current_ottaa_version": "Current OTTAA Version", - "device_name": "Device Name", - "contact_support": "Contact Support", - "edit": "Edit", - "delete": "Delete", - "fitzgerald_key": "Fitzgerald key", - "actions": "Actions", - "interactions": "Interactions", - "people": "people", - "nouns": "Nouns", - "adjectives": "Adjectives", - "miscellaneous": "Miscellaneous", - "choose_a_tag": "Choose a TAG", - "tags_widget_long_1": "By choosing TAGs you need to predict better when to show certain pictgorams, based on Time,Location, Calender or Weather", - "text_widget_long_1": "Enter the text to say it loud, can be a single word or a full sentence. Is up to you!", - "important": "Important", - "do_you_want_to_save_changes": "Do you want to save changes", - "no": "No", - "yes": "Yes", - "go_back": "Go Back", - "choose_an_option": "Choose an option", - "camera": "Camera", - "gallery": "Gallery", - "download_from_arasaac": "Download from ARASAAC", - "tags_will_come_in_next_release": "TAGs will come in next Release", - "mute": "Mute", - "about_ottaa": "About OTTAA", - "configuration": "Settings", - "tutorial": "Tutorial", - "close_application": "Close Application", - "sign_out": "Sign out", - "language": "Language", - "ottaa_labs": "OTTA Labs", - "language_page_long_1": "Use artificial intelligence to generate a richer sentence. You need a stable internet connection.", - "settings": "Settings", - "SETTINGS": "SETTINGS", - "pictograms": "Pictograms", - "prediction": "Prediction", - "accessibility": "Accessibility", - "voice_and_subtitles": "Voice and subtitles", - "all_phrases": "All Phrases", - "search": "Search", - "please_enter_a_valid_search": "Please enter a valid search", - "choose_a_picto_to_speak": "Choose a Picto to speak", - "we_are_working_on_this_feature": "We are working on this feature", - "most_used_sentences": "Most used Sentences", - "price_one": "Get access today to all the useful features that OTTAA Premium has to offer for only 990 ARS per month.", - "purchase_subscription": "PURCHASE SUBSCRIPTION", - "sentence_1": "Get access to educational games that allow you to evaluate vocabulary in a fun way", - "sentence_2": "Use OTTAA Project with screen scanning, connect accessible buttons and much more.", - "sentence_3": "With the premium version you can use the GPS to have a better prediction based on the commerce or place where you are", - "whats_the_picto": "What\"s the picto?", - "game1": "Answer the questions by choosing the right pictogram.\nLearn by playing!", - "match_picto": "Match Picto", - "game2": "Attach the pictogram correctly", - "memory_game": "Memory Game", - "game3": "Test your memory", - "play": "PLAY", - "select_a_category_to_play": "Select a category to play", - "image": "Image", - "share_text": "please, create a phrase and select the share button", - "text_to_speche_engine": "TEXT-TO-SPEECH-ENGINE", - "enable_custom_tts": "Enable custom TTS", - "speech_rate": "Speech Rate", - "speech_pitch": "Speech Pitch", - "SUBTITLE": "SUBTITLE", - "customized_subtitle": "Customized subtitle", - "size": "Size", - "upperCase": "UpperCase", - "it_allows_uppercase_subtitles": "It allows uppercase subtitles.", - "login_screen": "Hello, welcome to OTTAA Project, the first predictive communication platform for people with speech impairments, please login with your account and fill in some data to benefit from our prediction." -} \ No newline at end of file + "profile": { + "selection": { + "text1": "¿Quién va a utilizar la aplicación en este dispositivo?", + "caregiver_text": "Precisa comunicar", + "user_text": "Precisa comunicar" + }, + "hello": "Olá {name}!", + "ottaa": { + "tips": "Dicas da OTTAA" + }, + "mail": "Correo electrónico", + "date": "Data de nascimento", + "faq": { + "title": "Perguntas frequentes", + "faq0": "Quem pode usar o aplicativo OTTAA?", + "faq0Description": "OTTAA está diseñado para personas no verbales, es decir, cualquier persona que no utilice el habla oral para comunicarse. Las personas que usan OTTAA hoy en día fueron diagnosticadas con autismo, parálisis cerebral, síndrome de Down, esclerosis lateral amiotrófica (ELA), atrofia muscular espinal (AME) o síndrome de enclaustramiento post al accidente cerebrovascular (LiS), entre otras afecciones. Al ser una herramienta de comunicación dinámica, OTTAA requiere que sus usuarios posean funciones cognitivas de nivel medio a alto. Sin embargo, nos gusta considerar cada caso individualmente, así que no dude en ponerse en contacto y solicitar una evaluación en línea con nuestro equipo.", + "faq1": "Como funciona o aplicativo?", + "faq1Description": "La aplicación OTTAA proporciona al usuario pictogramas: imágenes que representan acciones, objetos, sentimientos o emociones. El usuario puede elegir los pictogramas que necesita y crear una frase, esta se traduce de los pictogramas a una oración escrita que aparece en la pantalla y que la aplicación también lee en voz alta. Consulta nuestro canal de Youtube para obtener una explicación más visual.", + "faq2": "Em que este aplicativo é diferente de outros dispositivos AAC (comunicação aumentativa e alternativa)?", + "faq2Description": "O aplicativo OTTAA é diferente de outros aplicativos de CAA devido ao seu inovador algoritmo preditivo e gerador de linguagem natural, que permite que o aplicativo aprenda do comportamento do usuário no aplicativo, sua idade, sexo, hora do dia e localização para pré-selecionar pictograma(s) para o momento comunicativo em que estão.", + "faq3": "Quanto custa o aplicativo OTTAA?", + "faq3Description": "O aplicativo OTTAA é gratuito para baixar e usar. Para criar um produto sustentável que resista ao tempo, há algumas características que exigem uma assinatura para usá-las. No entanto, estamos trabalhando arduamente para fornecer financiamento a todos que precisam.\n\nSe você estiver na Argentina, qualquer ajuda técnica que uma pessoa precise deve ser coberta por um seguro de saúde. Entre em contato com nossa equipe para obter orientação e assistência sobre como obter essa cobertura.\n\nSe você é de qualquer outro país da América Latina e deseja compartilhar sua experiência sobre esse assunto, não hesite em entrar em contato, sua contribuição pode ajudar muitas pessoas.", + "faq4": "Quais idiomas são compatíveis com o Projeto OTTAA?", + "faq4Description": "Actualmente admitimos español, inglés, portugués y francés. Para español, tenemos versiones localizadas de Argentina, Chile, Colombia y España. Estamos buscando activamente contribuciones sobre nuevos idiomas o una mejor localización para las variedades españolas. Únete a nuestra comunidad de crowdin para contribuir.", + "faq5": "Como posso colaborar com o Projeto OTTAA?", + "faq5Description": "Los colaboradores pueden ayudar a OTTAA con el desarrollo, las pruebas y/o la traducción. Para leer más sobre el tema y comenzar, consulta la sección Contribuir en el repositorio oficial de OTTAA en GitHub." + }, + "caregiver": "Acompanhante", + "caregivers_families": "Profissionais/Familiares", + "user": "Usuário/a", + "user_description": "Pessoa não verbal", + "wait": "Por favor espera", + "setting_exp": "Configurando sua experiência...", + "link_account": "Vincular uma conta", + "use": { + "ottaa": "Utilizar OTTAA" + }, + "close_profile": "Ocultar", + "open_profile": "Ver perfil", + "no_account": "Modo sem perfil", + "new_existant": "Novo/Existente", + "what_do": "¿Qué quieres hacer?", + "profile": "Perfil", + "linked_accounts": "Contas vinculadas", + "name": "Nome", + "logout": "Sair", + "last_name": "Sobrenome", + "role": "Função de uso", + "day": "Dia", + "month": "Mês", + "year": "Ano", + "tips": { + "title1": "Estatísticas", + "title2": "Painéis", + "title3": "Histórico", + "title4": "Favoritos", + "text1": "Mira las estadísticas de tu paciente/familiar, para ver su actividad y cómo fue mejorando a lo largo de los días, semanas y meses.", + "text2": "Oculta los tableros que no use el usuario, para que le aparezcan los tableros que más utiliza y necesita.", + "text3": "Utiliza el historial para ver tus frases pasadas, qué hiciste durante el día y contar historias.", + "text4": "Guarda pictogramas o frases favoritas, para poder acceder a ellas más rápidamente." + }, + "unlink": "Desvincular", + "unlink_account": "¿Desea desvincular a {name} de sus cuentas?", + "help": { + "help": "¿Necesita ayuda?", + "title1": "Perguntas frequentes", + "title2": "Contactar con el soporte" + }, + "link": { + "title": "Vincular Conta", + "mail": { + "title": "Introduzca el correo electrónico vinculado a la cuenta de OTTAA", + "input": { + "required": "El correo electrónico es obligatorio", + "invalid": "El correo electrónico no es válido" + }, + "warn": "*Se enviará una notificación con un código para enlazar los perfiles.", + "contact": "*Asegurate de estar en contacto con la persona que posea esta cuenta en un dispositivo." + }, + "token": { + "title": "Coloque el código de verificación que llegó como notificación a otro dispositivo.", + "problem": "¿Tiene problemas para vincular las cuentas?", + "resend": "Reenviar código", + "back": "Introducir otro email", + "invalid": "Token no válido" + }, + "wait": { + "title": "Espere", + "subtitle": "Carregando perfil..." + }, + "success": { + "title": "Perfil vinculado com sucesso!", + "lastTime": "Últ. vez {date}" + }, + "error": { + "link-exist": "Já estão vinculadas", + "miss-caregiver": "Error: Cuidador 404", + "miss-user": "Error: Usuario 404", + "user-no-comp": "Error: Usuario 406", + "caregiver-no-comp": "Error: Cuidador 406", + "autolink": "Erro: Mesma conta", + "auth/user-not-found": "Usuário não encontrado", + "miss-token": "Token faltando", + "invalid-token": "Token no válido", + "expired-token": "Token caducado" + } + }, + "delete_account": "Eliminar cuenta" + }, + "user": { + "main": { + "title": "Configure sua experiência", + "subtitle1": "Uso do aplicativo", + "subtitle2": "Linguagem preditiva" + }, + "settings": { + "main_screen": "Tela principal", + "accessibility": "Acessibilidade", + "voice_and_subtitles": "Voz e legendas", + "language": "Idioma" + }, + "main_setting": { + "interaction": "Interações", + "talk_delete": "Hablar y Borrar", + "shortcut": "Atajos en el Inicio", + "board_view": "Visualização de painéis", + "tabs": "Por abas", + "grid": "Grade", + "ottaa_labs": "OTTAA Labs", + "labs_text": "Função frases verbais", + "labs_long": "Função em Modo Beta\nPermite gerar frases com tempos verbais mais complexos", + "one_by_one": "ONE by ONE" + }, + "accessibility": { + "selection": "Seleção", + "bar_text": "Tempo de clique (Segundos)", + "connected": "Dispositivos conectados", + "device": "Dispositivo de acessibilidade", + "press": "Pressionar", + "scroll": "Rolar", + "sip": "Soplo y succión", + "selection_type": "Tipo de seleção", + "swept": "Barrido", + "speed": "Velocidade", + "selection_speed": "Velocidade de seleção" + }, + "voice_and_subtitle": { + "voice_types": "Tipos de voz", + "voice_rate": "Velocidade da voz", + "voz1": "Voz 1", + "voz2": "Voz 2", + "voz3": "Voz 3", + "mute": "Silenciar pictogramas", + "subtitle": "Legendas", + "show": "Mostrar subtítulos", + "size": "Tamanho", + "capital": "Maiúsculas" + }, + "language": { + "set": "Idioma definido" + } + }, + "global": { + "hello_world": "Olá Mundo", + "hello": "Olá", + "continue": "Avançar", + "next": "Próximo", + "back": "Prévio", + "please_enter_text": "Por favor, introduce un texto", + "done": "Feito", + "yes": "Sim", + "delete": "Excluir", + "edit": "Editar", + "no": "Não", + "mute": "Silenciar", + "important": "Importante", + "save_changes": "Salvar alterações", + "send": "Enviar", + "skip": "Pular", + "email": "E-mail", + "step": "Passo", + "share": "Compartilhar", + "support": "Suporte", + "congrats": "Parabéns", + "settings": "Configurações", + "general": "Geral", + "pictogram": "Pictograma", + "configuration": "Configuração", + "user_ottaa": "Usar OTTAA como", + "cancel": "Cancelar", + "slow": "Lento", + "default": "Padrão", + "fast": "Rápido", + "voice": "Voz", + "small": "Pequeño", + "medium": "Médio", + "big": "Grande", + "comingsoon": "¡Esta característica estará disponible muy pronto!", + "delicate": "Región", + "chile": "Chile", + "spanish": "Español", + "argentina": "Argentina", + "colombia": "Colombia", + "english": "Inglés", + "italian": "Italiano", + "french": "Francés", + "portuguese": "Portugues", + "test": "Esta es la voz que vas a usar en ota", + "add": "Agregar", + "confirm": "Confirmar", + "gallery": "galería", + "arasaac": "ARASAAC", + "text": "Texto", + "color": "Color", + "search": "Buscar", + "actions": "Acciones", + "people": "Personas", + "miscellaneous": "Miscelaneas", + "noun": "Sustantivos", + "adjective": "Adjetivos", + "predictive": "Predictivo", + "sunday": "Domingo", + "monday": "Lunes", + "tuesday": "Martes", + "wednesday": "Miércoles", + "thursday": "Jueves", + "friday": "Viernes", + "saturday": "Sábado", + "tomorrow": "Mañana", + "noon": "Mediodía", + "late": "Tarde", + "evening": "Noche", + "add_new": "Agregar nuevo", + "disguise": "Ocultar", + "save": "Guardar", + "image": "Imágen", + "saved_in": "Guardado en", + "location": "Ubicación", + "voices": "Por favor, instale voces desde la configuración para una mejor usabilidad" + }, + "onboarding": { + "start": "Começar", + "profile": { + "title": "Tela de perfis", + "subtitle": "Quem vai usar OTTAA hoje?", + "description": "Com a seleção de perfis, você pode usar OTTAA em qualquer dispositivo mantendo seus pictogramas e estilos!" + }, + "home": { + "title": "Personaliza tu Inicio", + "subtitle": "Atalhos na tela principal", + "description": "Personalizá de acuerdo a tus gustos y necesidades" + }, + "customize": { + "title": "Personalizá tu Home", + "subtitle": "Auxiliamos no processo de aprendizagem", + "description": "Activá o desactivá tableros o pictogramas para modificar la predicción, vos tenés el control." + }, + "skip": { + "title": "Você concorda em pular a introdução?" + } + }, + "terms": { + "button": "Aceito os termos", + "text": "Para continuar, precisamos que você aceite os termos e condições.\nVer termos" + }, + "loginWait": { + "text": "Bem-vindo ao mundo OTTAA!" + }, + "login": { + "title": "Ingresa con tu cuenta", + "google": "Continuar con Google.", + "facebook": "Continuar com o Facebook", + "apple": "Continuar con Apple", + "register": "¿Todavía no tienes cuenta? Regístrate aquí", + "wait": { + "title": "Bem-vindo!", + "subtitle": "Ao novo mundo do projeto OTTAA" + } + }, + "customize": { + "board": { + "title": "Que quadros o usuário utilizará para se comunicar?", + "appbar": "Quadros preditivos", + "skip": "Omitir escolha de quadros?", + "subtitle": "Ver pictogramas" + }, + "shortcut": { + "title": "Seleccioná los atajos que aparecerán en la pantalla principal.", + "appbar": "Atalhos", + "favorites": "Favoritos", + "history": "Histórico", + "camera": "Câmera", + "games": "Jogos" + }, + "picto": { + "title": "Quadro {name}", + "switch": "Ativar quadro" + }, + "help": { + "boards": "Los tableros predictivos permiten configurar qué grupo de pictogramas se mostrará en la pantalla del usuario/a final.", + "shortcut": "Atalhos são acessos rápidos a diferentes funções para que o usuário final tenha na sua tela principal." + }, + "wait": { + "title": "Parabéns!", + "subtitle": "Has configurado la experiencia de {name}", + "button": "Ir para o painel de perfis" + }, + "skip": "Você concorda em pular as preferências do perfil?" + }, + "home": { + "grid": { + "title": "Quadros", + "pictos": "Quadro {group}" + } + }, + "chatgpt": { + "prompt": "escribir una frase en español con estas palabras como si fueras {gender}, agregando conectores y artículos cuando sea necesario, pero sin cambiar las palabras: {pictograms}" + }, + "notification": { + "code": { + "request": { + "title": "Verificación de OTTAA Link", + "body": "Están intentando vincular tu cuenta con el token {linkToken}" + }, + "confirm": { + "title": "Confirmación de OTTAA Link", + "body": "Se ha confirmado la vinculación de tu cuenta" + } + } + }, + "game": { + "play": "¡Juguemos!", + "next": "Jugar", + "game_header_0": "¿Cuál es el pictograma?", + "game_header_1": "Unir pictogramas", + "game_header_2": "Juego de la Memoria", + "game_header_3": "Armá una historia", + "game_sub_0": "Respondé las preguntas eligiendo el pictograma correcto. Aprende jugando", + "game_sub_1": "Unir los pictogramas de manera correcta", + "game_sub_2": "Prueba tu memoria, ¿Cuánto recuerdas los pictogramas?", + "game_sub_3": "Elegí los pictogramas que más te gusten, y con la ayuda de Chat GPT, crearás una historia.", + "group": "Seleccioná una categoría para poder jugar", + "search": "Buscar Tablero", + "find": "Encuentra los tableros que quieras, fácilmente!", + "game_1_line": "Seleccioná el pictograma que escuches", + "game_2_line": "Seleccioná la palabra que corresponde a su pictograma", + "game_3_line": "Seleccioná una tarjeta y encontrá la pareja del pictograma", + "game_4_line": "Agregá hasta 4 pictogramas y creá tu propia historia", + "no": "¡Oh Oh!", + "yes": "¡Muy bien!", + "correct": "Correcto", + "incorrect": "Incorrecto", + "use_time": "Tiempo total", + "maximum_streak": "Mejor racha", + "speak_what": "¿Cual es el picto {name}?", + "gptbtn": "Crear historia", + "prompt": "Actúa como maestra de jardín de infantes y escribe una historia en español para niños usando las siguientes palabras:", + "nivel": "Nivel" + }, + "exit": { + "long": { + "headline": "¿Deseas volver a la pantalla de perfiles?", + "body": "Mantén presionado el botón resaltado para volver", + "check": "No volver a mostrar este mensaje", + "btn": "De acuerdo" + }, + "short": { + "headline": "¿Confima que deseas volver a la pantalla de perfiles?" + } + }, + "create": { + "heading": "Crear pictograma", + "image_selection": "Elije la imagen que represente al pictograma", + "choose_color": "Elije el color", + "search_arsaac": "Buscar ARASAAC", + "time_headline": "Selecciona los horarios que más se adecuen a sus actividades", + "time_sub1": "¿Qué días de la semana es cuando más lo utiliza?", + "schedule": "¿En qué horario?", + "save": "Guardar pictograma", + "created_by_me": "Creados por mi", + "new_board": "Nuevo tablero", + "create_new_board": "Crear nuevo tablero", + "board_name": "Nombre del tablero", + "edit_picto": "Editar pictograma", + "final_heading": "Listo, chequea que todo este correcto" + } +} diff --git a/assets/i18n/ur_PK.json b/assets/i18n/ur_PK.json new file mode 100644 index 00000000..2963a1c0 --- /dev/null +++ b/assets/i18n/ur_PK.json @@ -0,0 +1,388 @@ +{ + "profile": { + "selection": { + "text1": "¿Quién va a utilizar la aplicación en este dispositivo?", + "caregiver_text": "رابطہ کرنے کی ضرورت", + "user_text": "رابطہ کرنے کی ضرورت" + }, + "hello": "ہیلو {name}!", + "ottaa": { + "tips": "اوٹا تجاویز" + }, + "mail": "Correo electrónico", + "date": "Fecha de nacimiento", + "faq": { + "title": "Preguntas frecuentes", + "faq0": "OTTAA ایپ کون استعمال کر سکتا ہے؟", + "faq0Description": "OTTAA está diseñado para personas no verbales, es decir, cualquier persona que no utilice el habla oral para comunicarse. Las personas que usan OTTAA hoy en día fueron diagnosticadas con autismo, parálisis cerebral, síndrome de Down, esclerosis lateral amiotrófica (ELA), atrofia muscular espinal (AME) o síndrome de enclaustramiento post al accidente cerebrovascular (LiS), entre otras afecciones. Al ser una herramienta de comunicación dinámica, OTTAA requiere que sus usuarios posean funciones cognitivas de nivel medio a alto. Sin embargo, nos gusta considerar cada caso individualmente, así que no dude en ponerse en contacto y solicitar una evaluación en línea con nuestro equipo.", + "faq1": "ایپ کیسے کام کرتی ہے؟", + "faq1Description": "La aplicación OTTAA proporciona al usuario pictogramas: imágenes que representan acciones, objetos, sentimientos o emociones. El usuario puede elegir los pictogramas que necesita y crear una frase, esta se traduce de los pictogramas a una oración escrita que aparece en la pantalla y que la aplicación también lee en voz alta. Consulta nuestro canal de Youtube para obtener una explicación más visual.", + "faq2": "یہ ایپ دیگر AAC (Augmentative and Alternative Communication) آلات سے کس طرح مختلف ہے؟", + "faq2Description": "اوٹا ایپ اپنے اختراعی پیشن گوئی الگورتھم اور قدرتی زبان کے جنریٹر کی وجہ سے دیگر AAC ایپس سے مختلف ہے، جو ایپ کو ایپ میں صارف کے رویے، ان کی عمر، جنس، دن کا وقت، اور مقام کے بارے میں سیکھنے کی اجازت دیتی ہے مواصلت کے اس لمحے کے لیے جس میں وہ ہیں۔", + "faq3": "اوٹا ایپ کی قیمت کتنی ہے؟", + "faq3Description": "اوٹا ایپ ڈاؤن لوڈ اور استعمال کرنے کے لیے مفت ہے۔ ایک پائیدار پروڈکٹ بنانے کے لیے جو وقت کی کسوٹی پر کھڑی ہو، کچھ خصوصیات ہیں جن کو استعمال کرنے کے لیے سبسکرپشن کی ضرورت ہوتی ہے۔ تاہم، ہم ان تمام لوگوں کو فنڈ فراہم کرنے کے لیے سخت محنت کر رہے ہیں جنہیں اس کی ضرورت ہے۔\n\nاگر آپ ارجنٹائن میں ہیں تو، کسی بھی تکنیکی مدد کی جس کی کسی شخص کو ضرورت ہوتی ہے اسے ہیلتھ انشورنس کے ذریعے کور کیا جانا چاہیے۔ اس کوریج کو کیسے حاصل کیا جائے اس بارے میں رہنمائی اور مدد کے لیے ہماری ٹیم سے رابطہ کریں۔\n\nاگر آپ کسی دوسرے LATAM ملک سے ہیں اور اس موضوع پر اپنے تجربے کا اشتراک کرنا چاہتے ہیں، تو ہم سے رابطہ کرنے میں ہچکچاہٹ محسوس نہ کریں، آپ کا تعاون بہت سے لوگوں کی مدد کر سکتا ہے۔", + "faq4": "اوٹا پروجیکٹ کے ذریعے کن زبانوں کی حمایت کی جاتی ہے؟", + "faq4Description": "Actualmente admitimos español, inglés, portugués y francés. Para español, tenemos versiones localizadas de Argentina, Chile, Colombia y España. Estamos buscando activamente contribuciones sobre nuevos idiomas o una mejor localización para las variedades españolas. Únete a nuestra comunidad de crowdin para contribuir.", + "faq5": "میں اوٹا پروجیکٹ کے ساتھ کیسے تعاون کر سکتا ہوں؟", + "faq5Description": "Los colaboradores pueden ayudar a OTTAA con el desarrollo, las pruebas y/o la traducción. Para leer más sobre el tema y comenzar, consulta la sección Contribuir en el repositorio oficial de OTTAA en GitHub." + }, + "caregiver": "ساتھی", + "caregivers_families": "پیشہ ور افراد/خاندان", + "user": "صارف/صارفین", + "user_description": "غیر زبانی شخص", + "wait": "Por favor espera", + "setting_exp": "آپ کا تجربہ ترتیب دیا جا رہا ہے...", + "link_account": "ایک اکاؤنٹ کو لنک کریں", + "use": { + "ottaa": "Utilizar OTTAA" + }, + "close_profile": "Ocultar", + "open_profile": "پروفائل کا مشاھدہ کریں", + "no_account": "غیر پروفائل موڈ", + "new_existant": "نیا/موجودہ", + "what_do": "¿Qué quieres hacer?", + "profile": "پروفائل", + "linked_accounts": "منسلک اکاؤنٹس", + "name": "نام", + "logout": "لاگ آؤٹ", + "last_name": "کنیت", + "role": "استعمال کا کردار", + "day": "دن", + "month": "مہینہ", + "year": "سال", + "tips": { + "title1": "اعداد و شمار", + "title2": "بورڈز", + "title3": "تاریخ(سرگزشت)", + "title4": "پسندیدہ", + "text1": "Mira las estadísticas de tu paciente/familiar, para ver su actividad y cómo fue mejorando a lo largo de los días, semanas y meses.", + "text2": "Oculta los tableros que no use el usuario, para que le aparezcan los tableros que más utiliza y necesita.", + "text3": "Utiliza el historial para ver tus frases pasadas, qué hiciste durante el día y contar historias.", + "text4": "Guarda pictogramas o frases favoritas, para poder acceder a ellas más rápidamente." + }, + "unlink": "لنک ختم کریں۔", + "unlink_account": "¿Desea desvincular a {name} de sus cuentas?", + "help": { + "help": "¿Necesita ayuda?", + "title1": "Preguntas frecuentes", + "title2": "Contactar con el soporte" + }, + "link": { + "title": "اکاؤنٹ لنک کریں۔", + "mail": { + "title": "Introduzca el correo electrónico vinculado a la cuenta de OTTAA", + "input": { + "required": "El correo electrónico es obligatorio", + "invalid": "El correo electrónico no es válido" + }, + "warn": "*Se enviará una notificación con un código para enlazar los perfiles.", + "contact": "*Asegurate de estar en contacto con la persona que posea esta cuenta en un dispositivo." + }, + "token": { + "title": "Coloque el código de verificación que llegó como notificación a otro dispositivo.", + "problem": "¿Tiene problemas para vincular las cuentas?", + "resend": "کوڈ پھر سے بھیجو", + "back": "Introducir otro email", + "invalid": "Token no válido" + }, + "wait": { + "title": "Espere", + "subtitle": "پروفائل لوڈ ہو رہا ہے..." + }, + "success": { + "title": "پروفائل کامیابی کے ساتھ منسلک ہو گیا!", + "lastTime": "آخری وقت{date}" + }, + "error": { + "link-exist": "پہلے ہی جڑے ہوئے ہیں۔", + "miss-caregiver": "Error: Cuidador 404", + "miss-user": "Error: Usuario 404", + "user-no-comp": "Error: Usuario 406", + "caregiver-no-comp": "Error: Cuidador 406", + "autolink": "خرابی: ایک ہی اکاؤنٹ", + "auth/user-not-found": "صارف نہیں ملا", + "miss-token": "لاپتہ ٹوکن", + "invalid-token": "Token no válido", + "expired-token": "Token caducado" + } + }, + "delete_account": "Eliminar cuenta" + }, + "user": { + "main": { + "title": "اپنے تجربے کو ترتیب دیں۔", + "subtitle1": "ایپ کا استعمال", + "subtitle2": "پیش گوئی کرنے والی زبان" + }, + "settings": { + "main_screen": "Pantalla principal", + "accessibility": "رسائی", + "voice_and_subtitles": "آواز اور سب ٹائٹلز", + "language": "زبان" + }, + "main_setting": { + "interaction": "تعاملات", + "talk_delete": "Hablar y Borrar", + "shortcut": "Atajos en el Inicio", + "board_view": "بورڈز دیکھیں", + "tabs": "ٹیبز کے ذریعے", + "grid": "گرڈ", + "ottaa_labs": "OTTAA Labs", + "labs_text": "فعل فعل کے جملے", + "labs_long": "بیٹا موڈ میں خصوصیت\n\nآپ کو زیادہ پیچیدہ ادوار کے ساتھ جملے بنانے کی اجازت دیتا ہے۔", + "one_by_one": "ONE by ONE" + }, + "accessibility": { + "selection": "انتخاب", + "bar_text": "کلک کرنے کا وقت (سیکنڈز)", + "connected": "منسلک آلات", + "device": "قابل رسائی آلہ", + "press": "دبائیں اور دبائیں", + "scroll": "اسکرول اینڈ پریس", + "sip": "Soplo y succión", + "selection_type": "انتخاب کی قسم", + "swept": "Barrido", + "speed": "رفتار", + "selection_speed": "انتخاب کی رفتار" + }, + "voice_and_subtitle": { + "voice_types": "آواز کی اقسام", + "voice_rate": "آواز کی شرح", + "voz1": "آواز 1", + "voz2": "آواز 2", + "voz3": "آواز 3", + "mute": "Silenciar pictogramas", + "subtitle": "ذیلی عنوان", + "show": "Mostrar subtítulos", + "size": "سائز", + "capital": "بڑے حروف" + }, + "language": { + "set": "زبان مقرر کریں" + } + }, + "global": { + "hello_world": "ہیلو ورلڈ", + "hello": "سلام ", + "continue": "جاری رکھیں", + "next": "اگلا", + "back": "سابقہ", + "please_enter_text": "Por favor, introduce un texto", + "done": "مکمل", + "yes": "ہاں", + "delete": "ختم کریں", + "edit": "ترمیم", + "no": "نہیں", + "mute": "خاموش", + "important": "اہم", + "save_changes": "تبدیلیاں محفوظ کرو", + "send": "بھیجیں", + "skip": "چھوڑ دو", + "email": "ای میل", + "step": "اسٹیپ", + "share": "دوسروں کو بتائیں", + "support": "معاونت", + "congrats": "مبارک ہو", + "settings": "ترتیبات", + "general": "جنرل", + "pictogram": "تصویریں", + "configuration": "ترتیبات", + "user_ottaa": "Usar OTTAA como", + "cancel": "منسوخ", + "slow": "سست", + "default": "پہلے سے طے شدہ\n", + "fast": "تیز", + "voice": "آواز", + "small": "Pequeño", + "medium": "درمیانہ", + "big": "بڑا", + "comingsoon": "¡Esta característica estará disponible muy pronto!", + "delicate": "Región", + "chile": "Chile", + "spanish": "Español", + "argentina": "Argentina", + "colombia": "Colombia", + "english": "Inglés", + "italian": "Italiano", + "french": "Francés", + "portuguese": "Portugues", + "test": "Esta es la voz que vas a usar en ota", + "add": "Agregar", + "confirm": "Confirmar", + "gallery": "galería", + "arasaac": "ARASAAC", + "text": "Texto", + "color": "Color", + "search": "Buscar", + "actions": "Acciones", + "people": "Personas", + "miscellaneous": "Miscelaneas", + "noun": "Sustantivos", + "adjective": "Adjetivos", + "predictive": "Predictivo", + "sunday": "Domingo", + "monday": "Lunes", + "tuesday": "Martes", + "wednesday": "Miércoles", + "thursday": "Jueves", + "friday": "Viernes", + "saturday": "Sábado", + "tomorrow": "Mañana", + "noon": "Mediodía", + "late": "Tarde", + "evening": "Noche", + "add_new": "Agregar nuevo", + "disguise": "Ocultar", + "save": "Guardar", + "image": "Imágen", + "saved_in": "Guardado en", + "location": "Ubicación", + "voices": "Por favor, instale voces desde la configuración para una mejor usabilidad" + }, + "onboarding": { + "start": "شروع کریں", + "profile": { + "title": "پروفائلز کی سکرین", + "subtitle": "آج کون اوٹا استعمال کرنے جا رہا ہے؟", + "description": "پروفائلز کے انتخاب کے ساتھ آپ اپنے تصویروں اور سٹائل کو مدنظر رکھتے ہوئے کسی بھی ڈیوائس سے اوٹا استعمال کر سکیں گے!" + }, + "home": { + "title": "Personaliza tu Inicio", + "subtitle": "مرکزی اسکرین پر شارٹ کٹس", + "description": "Personalizá de acuerdo a tus gustos y necesidades" + }, + "customize": { + "title": "Personalizá tu Home", + "subtitle": "ہم سیکھنے کے عمل میں ساتھ دیتے ہیں۔", + "description": "Activá o desactivá tableros o pictogramas para modificar la predicción, vos tenés el control." + }, + "skip": { + "title": "کیا آپ تعارف کو چھوڑنے سے اتفاق کرتے ہیں؟" + } + }, + "terms": { + "button": "میں شرائط قبول کرتا ہوں۔", + "text": "جاری رکھنے کے لیے، ہمیں آپ سے شرائط و ضوابط کو قبول کرنے کی ضرورت ہے۔\n\nشرائط دیکھیں" + }, + "loginWait": { + "text": "ہم آپ کو خوش آمدید کہتے ہیں!\n\nOTTAA کی دنیا کے لیے" + }, + "login": { + "title": "Ingresa con tu cuenta", + "google": "Continuar con Google.", + "facebook": "فیس بک کے ساتھ جاری رکھیں", + "apple": "Continuar con Apple", + "register": "¿Todavía no tienes cuenta? Regístrate aquí", + "wait": { + "title": "ہم آپ کو خوش آمدید کہتے ہیں!", + "subtitle": "OTTAA پروجیکٹ کی نئی دنیا میں" + } + }, + "customize": { + "board": { + "title": "صارف مواصلت کے لیے کون سے بورڈ استعمال کرے گا؟", + "appbar": "پیش گوئی کرنے والے بورڈز", + "skip": "بورڈز کا انتخاب چھوڑ دیں؟", + "subtitle": "تصویریں دیکھیں" + }, + "shortcut": { + "title": "Seleccioná los atajos que aparecerán en la pantalla principal.", + "appbar": "شارٹ کٹس", + "favorites": "پسندیدہ", + "history": "تاریخ(سرگزشت)", + "camera": "کیمرے", + "games": "کھیل" + }, + "picto": { + "title": "ادارتی ٹیم{name}", + "switch": "ڈیش بورڈ کو چالو کریں۔" + }, + "help": { + "boards": "Los tableros predictivos permiten configurar qué grupo de pictogramas se mostrará en la pantalla del usuario/a final.", + "shortcut": "شارٹ کٹس مختلف فنکشنز تک فوری رسائی ہیں جو اختتامی صارف کے لیے ان کی مرکزی اسکرین پر موجود ہیں۔" + }, + "wait": { + "title": "مبارک ہو", + "subtitle": "Has configurado la experiencia de {name}", + "button": "پروفائلز پینل پر جائیں۔" + }, + "skip": "کیا آپ پروفائل کی ترجیحات کو چھوڑنے سے اتفاق کرتے ہیں؟" + }, + "home": { + "grid": { + "title": "بورڈز", + "pictos": "Tablero {group}" + } + }, + "chatgpt": { + "prompt": "escribir una frase en español con estas palabras como si fueras {gender}, agregando conectores y artículos cuando sea necesario, pero sin cambiar las palabras: {pictograms}" + }, + "notification": { + "code": { + "request": { + "title": "Verificación de OTTAA Link", + "body": "Están intentando vincular tu cuenta con el token {linkToken}" + }, + "confirm": { + "title": "Confirmación de OTTAA Link", + "body": "Se ha confirmado la vinculación de tu cuenta" + } + } + }, + "game": { + "play": "¡Juguemos!", + "next": "Jugar", + "game_header_0": "¿Cuál es el pictograma?", + "game_header_1": "Unir pictogramas", + "game_header_2": "Juego de la Memoria", + "game_header_3": "Armá una historia", + "game_sub_0": "Respondé las preguntas eligiendo el pictograma correcto. Aprende jugando", + "game_sub_1": "Unir los pictogramas de manera correcta", + "game_sub_2": "Prueba tu memoria, ¿Cuánto recuerdas los pictogramas?", + "game_sub_3": "Elegí los pictogramas que más te gusten, y con la ayuda de Chat GPT, crearás una historia.", + "group": "Seleccioná una categoría para poder jugar", + "search": "Buscar Tablero", + "find": "Encuentra los tableros que quieras, fácilmente!", + "game_1_line": "Seleccioná el pictograma que escuches", + "game_2_line": "Seleccioná la palabra que corresponde a su pictograma", + "game_3_line": "Seleccioná una tarjeta y encontrá la pareja del pictograma", + "game_4_line": "Agregá hasta 4 pictogramas y creá tu propia historia", + "no": "¡Oh Oh!", + "yes": "¡Muy bien!", + "correct": "Correcto", + "incorrect": "Incorrecto", + "use_time": "Tiempo total", + "maximum_streak": "Mejor racha", + "speak_what": "¿Cual es el picto {name}?", + "gptbtn": "Crear historia", + "prompt": "Actúa como maestra de jardín de infantes y escribe una historia en español para niños usando las siguientes palabras:", + "nivel": "Nivel" + }, + "exit": { + "long": { + "headline": "¿Deseas volver a la pantalla de perfiles?", + "body": "Mantén presionado el botón resaltado para volver", + "check": "No volver a mostrar este mensaje", + "btn": "De acuerdo" + }, + "short": { + "headline": "¿Confima que deseas volver a la pantalla de perfiles?" + } + }, + "create": { + "heading": "Crear pictograma", + "image_selection": "Elije la imagen que represente al pictograma", + "choose_color": "Elije el color", + "search_arsaac": "Buscar ARASAAC", + "time_headline": "Selecciona los horarios que más se adecuen a sus actividades", + "time_sub1": "¿Qué días de la semana es cuando más lo utiliza?", + "schedule": "¿En qué horario?", + "save": "Guardar pictograma", + "created_by_me": "Creados por mi", + "new_board": "Nuevo tablero", + "create_new_board": "Crear nuevo tablero", + "board_name": "Nombre del tablero", + "edit_picto": "Editar pictograma", + "final_heading": "Listo, chequea que todo este correcto" + } +} diff --git a/assets/languages/ca_ES.json b/assets/languages/ca_ES.json new file mode 100644 index 00000000..9ee69822 --- /dev/null +++ b/assets/languages/ca_ES.json @@ -0,0 +1,2504 @@ +{ + "-2UbAou9ydr8XeN-jtIz4": { + "text": "limpiar" + }, + "-GL2iAgykP10Ae3AKsVOX": { + "text": "sal" + }, + "-LE2iv3Pwr5KuIyM5bYb3": { + "text": "bien" + }, + "-LwAKwgCdVkzwM579zRMo": { + "text": "más" + }, + "-aePI8WknXpxEpz19Lu48": { + "text": "suyos" + }, + "-msU3yor4qJYQHJtWrdk8": { + "text": "pastas" + }, + "00AkNJ4YLpbRD_mLmQjtp": { + "text": "almuerzo" + }, + "0IrLGI8Ebm8rcS3ymUXqS": { + "text": "hambre" + }, + "0THELgiQ7rvA-orESXJfV": { + "text": "avión" + }, + "0Vkmy6BZcJn3pFurEevL9": { + "text": "estudiar" + }, + "0Z7uFXpp-XRXmqM8ILhIC": { + "text": "poco" + }, + "0_SK41wNOk6mw2qX_eHXM": { + "text": "cine" + }, + "0cdYDZ5HPaTmqTTN0_Ee8": { + "text": "suerte" + }, + "0fHziRVxg0oNDp5pyiI8M": { + "text": "permiso" + }, + "0fcYcD_r0jNWXTTAx8Ph7": { + "text": "aeropuerto" + }, + "0gAyTD6sImo0jpD_bYGVv": { + "text": "jueves" + }, + "0huLn-H32Cbwba28IZ3tc": { + "text": "burbujas" + }, + "0jpMJu8isUmOZKxhZ_yaj": { + "text": "equipo" + }, + "0pFtmDZdlnLrUkT_XZDXQ": { + "text": "antes" + }, + "0qoQs8WyLVONnu3_eBGfD": { + "text": "dolor de cabeza" + }, + "0v5fqIp8GmXsIHO0SPhtt": { + "text": "dale" + }, + "0vttFf3nAGDW6g5wVStcH": { + "text": "disculpa" + }, + "1-VwcvzNfvrwDWRGxRPre": { + "text": "ni" + }, + "10X4OKR5xmNhSj86sbyE_": { + "text": "salchichas" + }, + "14aCIW665UZtuwNsKKV5s": { + "text": "cartuchera" + }, + "17AkRFlfC_koV-lywmDE8": { + "text": "pantalones cortos" + }, + "1B1WmC-V0PglDeRAeINcT": { + "text": "mirar" + }, + "1DjW-XvWN7iOqoJPRSWwY": { + "text": "mal" + }, + "1IjenNwPwsMIWZ4aYBk8S": { + "text": "partido" + }, + "1Ph13Z_Ya6p-q0WA7pSl3": { + "text": "pájaro" + }, + "1QEfLU_S7TM0iMr9VZVtP": { + "text": "ronda" + }, + "1Rv9-SSJjHptwvzqLbdbx": { + "text": "divertido" + }, + "1WJZO-pUkTaQvyxz41iB-": { + "text": "picado" + }, + "1YOlJCovdcnnqVihqHVmq": { + "text": "acá" + }, + "1b71P9YjaNWnX8AWjstqG": { + "text": "remera" + }, + "1mS8kgJIod1cyUFH-msnM": { + "text": "estación" + }, + "1mU2ZosZXSJrxkh1NmxJT": { + "text": "izquierda" + }, + "1nhsReHG-f-bW-xaZBsxY": { + "text": "abajo" + }, + "1pb6S-RR_3zdCq77YFiZ-": { + "text": "¡qué mal!" + }, + "1zU7kolOKsHP9-oomQW1Q": { + "text": "rey" + }, + "27GbVOZ-szdnzsy92oY-X": { + "text": "manteca" + }, + "2CgcUkvJUskv982FvG54A": { + "text": "plata" + }, + "2HkB0WZYP7cvWLD39GMQj": { + "text": "bañar" + }, + "2KO0BFtB4B6fu1feuAZLt": { + "text": "verbos" + }, + "2RZTRMX56BFLrW7tLJ3Hy": { + "text": "mismo" + }, + "2Vc2H462cutVtUC-5omJk": { + "text": "pocos" + }, + "2dwtZO2wCm520GPD1i6dl": { + "text": "dolor de garganta" + }, + "2t_eq1JmgHa0R3eu8LMmI": { + "text": "ventilador" + }, + "2u2-AFuI245I7bZ6tsSPh": { + "text": "¿quién?" + }, + "2y9pxVOBQ2tMdPHcsqQb8": { + "text": "martes" + }, + "3-ueUrnwmIIj0BMP8_Ntb": { + "text": "uña" + }, + "32PnZjlnQbTJo4nL9YJYe": { + "text": "feliz" + }, + "3932Zm0xgk1hKB2hhBAUa": { + "text": "colectivo" + }, + "3KbwCHGooNLySWOBlFFuG": { + "text": "cocinita" + }, + "3KgKNNnuYMrysEDs3Pu4Z": { + "text": "subtítulo" + }, + "3VEnVjaGFCImBAZ3wEChu": { + "text": "ropa" + }, + "3arbCGI6fMOWALLanZcg3": { + "text": "capuchino" + }, + "3dtvYLjbl5oDyhZO9eFRY": { + "text": "ellos" + }, + "3mwcdenOurU_e59ChLqb0": { + "text": "fuera" + }, + "3w62N9b7Cvb6JMjB9Wphi": { + "text": "beber" + }, + "40q0NJ6vsziJDNFBqho7Y": { + "text": "dentro" + }, + "4A_FNkGH1EDu0oabPurrL": { + "text": "cereales" + }, + "4J1bWl6BbbEdZsRGsgYH2": { + "text": "queso" + }, + "4X7OXm35OSHoSlPxGUi_f": { + "text": "mueble" + }, + "4bHGIoQmDN8LptpdNN4v6": { + "text": "vacaciones" + }, + "4f1vqDoAvUu2XYk_JlQdC": { + "text": "siete" + }, + "4rctwNiN4UaU9lqU48MHG": { + "text": "computadora" + }, + "4rzonBodQXfs77gALnAP_": { + "text": "cerveza" + }, + "50wJdR0-3YLnv9y_2Gx_e": { + "text": "saltar" + }, + "54BVjn2seJWdBNGI20-yJ": { + "text": "computadora" + }, + "54taab8z9ziXt0IqXHkV9": { + "text": "dedos" + }, + "5L5UzBHOzuHRoO-jyPuEx": { + "text": "ciudad" + }, + "5LYjhk-N87Ov9NrQcGbLQ": { + "text": "aceite" + }, + "5Tdy0Gu9SiLsPfWwd-Y2E": { + "text": "lindo" + }, + "5VBtwEswIjrv1zbXP-oFn": { + "text": "sopa" + }, + "5W5_sCAyGTkVzguCEg1d1": { + "text": "jugo" + }, + "5dvq344JstkxUpHszaPfp": { + "text": "delfín" + }, + "5gPT9lrNgpRkF07lP6zOq": { + "text": "jugo de manzana" + }, + "5i3kSsCKF7Oa9iJQvXiTe": { + "text": "más o menos" + }, + "5kjlzqb9Rf3zzqZROaZ9p": { + "text": "perder" + }, + "5mGrGHzdw_vCwYCRNPcPw": { + "text": "pasear" + }, + "5vxTXbPl4Y0yezGu7p1f6": { + "text": "hacer" + }, + "6KicPX6y_u2i6tPBZAtvA": { + "text": "lavar" + }, + "6jLkKc9OL5btNOmjJem6S": { + "text": "poner" + }, + "6lYN4qSZx3_tKDClp4Iyr": { + "text": "entre" + }, + "6nhNeVjDfDi-GmreaqfVo": { + "text": "nublado" + }, + "6rcOXG6yxpzHLzMJ9IayI": { + "text": "cerrar" + }, + "6t2sPdapSNJrOziDozTWW": { + "text": "vaca" + }, + "71l2at-8480bvijxn3uBl": { + "text": "durante" + }, + "75gujwNXJdAiNmK6Ffhia": { + "text": "jugo" + }, + "79xBF6cKgKeD4GeBPe_Ds": { + "text": "bolsa" + }, + "7EsVGfapPc_38mHCBy3C3": { + "text": "enamorado" + }, + "7Hz61-WzV62FHsedOwz6q": { + "text": "flan" + }, + "7Q4Zc0cenSF5U4eKyje1f": { + "text": "hacia" + }, + "7Q9sNljseWjwSPW4in1ga": { + "text": "recepción" + }, + "7VL_MgnLDY6hi8sbvcGIg": { + "text": "silencio" + }, + "7WxUVoVQfQOzARU2bf6HP": { + "text": "casa" + }, + "7iAXKVm22uMgr6aqZ1rr7": { + "text": "abuelo" + }, + "8-4M30dTtmuUJus9MtGqV": { + "text": "moco" + }, + "81UJI7xOa5l9mVceqkIP5": { + "text": "tener frío" + }, + "82LicIQc3K2xCTEt-iMpu": { + "text": "caracol" + }, + "86gNdF6aTepa0Y9zkD1VQ": { + "text": "campo" + }, + "8FFwIw7rJri79BITZBUzm": { + "text": "hotel" + }, + "8KlFB3an1mzdQd6-LGCCE": { + "text": "merienda" + }, + "8LddDqylw-51wHhx9_Qad": { + "text": "libro" + }, + "8MV4ZFthtUeoxLAIbqGTc": { + "text": "carne" + }, + "8cOIYr-hcK54qWpuT-41e": { + "text": "cuento" + }, + "8fGingRAd8idw4qcxyZ-Q": { + "text": "vergüenza" + }, + "8iFdjRTQU7ONGnigRTlm8": { + "text": "¿cuánto sale?" + }, + "8vR0HYniXtrrQqqSIN_JQ": { + "text": "familia" + }, + "904w9Je6oDwGXUCIcrUZX": { + "text": "lengua" + }, + "93YmZA7VfAT7TTNTsDE1W": { + "text": "serie" + }, + "93hsW10TmX3Vcq_4IvcZ0": { + "text": "blanco" + }, + "93tHieC_CgZqN998y5gAv": { + "text": "chuleta" + }, + "97nIv-aoc51T8kKTZV5cM": { + "text": "saliva" + }, + "9EqfwMNtATh1fwMhyn_B1": { + "text": "buena" + }, + "9FiWvg197C-Riid-DVysN": { + "text": "claro" + }, + "9GqE148SFZqMIft4evAk2": { + "text": "comer" + }, + "9MzeUcz1nRqleTkmS_-g2": { + "text": "barco" + }, + "9QyJdpUn0f6g7FxWs5qpO": { + "text": "cortar" + }, + "9U8MzceIsqKhG86oNx9zV": { + "text": "coche" + }, + "9UwpyOnOBoqr4mX3Juqm2": { + "text": "buenas tardes" + }, + "9ZnzbKMDwGEwC3hXOhXFe": { + "text": "pastillas" + }, + "9dvSIpeXa2_12Jip6noJP": { + "text": "deportista" + }, + "9kgRI3KlOIVSuylKffW9g": { + "text": "colores" + }, + "9lS0mNuKIS0olyDwoIJBR": { + "text": "médico" + }, + "9mLx-YMK81AflitELQFqk": { + "text": "papel" + }, + "9s5zV3_oGyDx_NEvsKCxX": { + "text": "violín" + }, + "9wE9Py6ztyqDrtaypsltA": { + "text": "naranja" + }, + "AOp6VGyjYIV0Ym9d0basJ": { + "text": "dibujar" + }, + "APXF-lEplPOloppSeIjAY": { + "text": "menos" + }, + "AQKGKdoX5CYycZ2YqBZVW": { + "text": "barato" + }, + "AT_rDWsr6xRBgrvgw9Zih": { + "text": "nueve" + }, + "AWJXh6URGN0Vwm66i6IvL": { + "text": "hola" + }, + "AeFbJQ0M9uTObAlKEX3zr": { + "text": "pierna" + }, + "Akf0xlH8UJdXn8BJzPV2A": { + "text": "radio" + }, + "B1845IfYfPMz2FWpVFIQv": { + "text": "de" + }, + "BKmATW2uBk4pxnmOaARyq": { + "text": "documentos" + }, + "BNjZz9MGLJEKZ4CZoTs2M": { + "text": "ajedrez" + }, + "BQhqx1PuF94jwT0ySTlbJ": { + "text": "comida" + }, + "BQm-YCPc0lfD1-mhecCTL": { + "text": "yo" + }, + "Bebnh8-UWwtYLnK6p3fKi": { + "text": "pan negro" + }, + "BjqWZnzLlxdOo4KEzZ46j": { + "text": "ocho" + }, + "BqS7d4PMhGRqPYlZQzUbR": { + "text": "puerta" + }, + "Bub9ZYygLcly15D7_wYks": { + "text": "amigo" + }, + "ByrvXHEN9Mb8D--7MQAjM": { + "text": "peluche" + }, + "C12mJ1W11fODI3pv1QOnx": { + "text": "gelatina" + }, + "C29KJ8BTFavhj_R9UfnSv": { + "text": "por" + }, + "C2bgADoxmINRnAiYxZHqd": { + "text": "taxista" + }, + "CBTemIvgIN1UAtftkc3sz": { + "text": "pegar" + }, + "CCWCtXdMuQBJRmaFOAlfQ": { + "text": "navidad" + }, + "CY-IQvUehkaiGFCdKf9bf": { + "text": "chorizo" + }, + "CYH_6DL9q1iLLetuWeR9A": { + "text": "tener" + }, + "CZrETqLgQlvDkLHvw1t_w": { + "text": "a" + }, + "C_JKGNCxOI5x_f2C4qAyZ": { + "text": "maní" + }, + "CbO32RkDdf9aCucv6BnGS": { + "text": "cabra" + }, + "ChBc7LjL8dgzZ6LUCAHGh": { + "text": "por favor" + }, + "CkTiaqBY3jf86JRq636lt": { + "text": "¿cuál?" + }, + "CsKZSNiJw5Q48b26Kskf-": { + "text": "heroe" + }, + "CxFmyJYmy6gMRqP9U0cBP": { + "text": "estoy perdido" + }, + "CyKtU9yC0Jy7Ypb4WFp6w": { + "text": "perro" + }, + "D1gCni2jXpCvKZe4qCtQN": { + "text": "peces" + }, + "D2tSkngqbQmdKLNhn9xWV": { + "text": "globos" + }, + "D7dt_hFX5DScV_ssm1nKz": { + "text": "pomelo" + }, + "D85FU-Wqr2u53tfTXAtHo": { + "text": "patalear" + }, + "DAq2J_xXHsSCSNPp9qVsk": { + "text": "oler" + }, + "DBd09yUlbkaYLsemjFXEs": { + "text": "helado" + }, + "DG1RiDjDfwWRhpAiIpPqA": { + "text": "vómito" + }, + "DSgrhLHauub-gBqMGwacO": { + "text": "asustado" + }, + "DXb0FpjVM9q8LVl9vvSHn": { + "text": "clases" + }, + "DXpjgLKTdx9eLLohVdmWM": { + "text": "verdulería" + }, + "D_4Weq7iyi7GMEsgP0xy6": { + "text": "té" + }, + "Djs1QsLNf8Q5LBIFV5zNC": { + "text": "partituras" + }, + "DkeHJFtqAS005fYUrl1Xz": { + "text": "pantalon" + }, + "Dm3yiKSB134LrjtW_KrO7": { + "text": "buen día" + }, + "DqGa4gqd2ABDi45BT43x4": { + "text": "princesa" + }, + "Dv9MSCRYbR4Q3K114wXki": { + "text": "alto" + }, + "E-vUPARie8MmfgZwv3Omr": { + "text": "gallo" + }, + "EM8VyonJ7WNdvmRyE3nhZ": { + "text": "lento" + }, + "EO4O-s7oafi6QJdxTFNkd": { + "text": "anticongestivo" + }, + "ETZNYbrG5wveDl6c9k2_k": { + "text": "codo" + }, + "EUsNyf5bDdSLqvZKH1Ltx": { + "text": "no entiendo" + }, + "EVmt43vDI3NHFfbbkqokF": { + "text": "pizza" + }, + "Erg6LuA8IOQ5V8RTP3pPi": { + "text": "abeja" + }, + "F4cGnA_QHsVKTjUE6MAu9": { + "text": "mameluco" + }, + "F7kJ8VM31BWB4K4T4USzs": { + "text": "maltrato físico" + }, + "F8roVYxKZi88UUGfOvTwl": { + "text": "maestra" + }, + "F90bXbc0tz9nuzTT7SgqV": { + "text": "cuatro" + }, + "FBPIabyaoCK-Y0BziQdji": { + "text": "dolor de panza" + }, + "FBTheEQmZZfJRiYjd_Np_": { + "text": "interpretar" + }, + "FO77qpzyz28knodNtILCA": { + "text": "tirar la cadena" + }, + "FTngK946O8S8bYc0g7vM2": { + "text": "mamá" + }, + "FaVvbVzZivuxTwxJTPubK": { + "text": "hermanos" + }, + "FfNU04I4mZ54gWcBXqo2c": { + "text": "panceta" + }, + "FgTird367surh-vxXyAK6": { + "text": "ticket" + }, + "FkC5DtSV81OvFMU99qZGg": { + "text": "pelota" + }, + "FnCBoLSE19WsbUypUKvFc": { + "text": "hamburguesa" + }, + "Fogupb264IyCtbZ-Q2D6w": { + "text": "borracho" + }, + "Fvm2C5NBq01tm0QK9d9QM": { + "text": "hijos" + }, + "G09TvOzDSG5m3hTQD9Tej": { + "text": "borrar" + }, + "G2i9LSK4A19237Zp1vXqF": { + "text": "gordito" + }, + "G6KKVMvPDnjdD9TfBd-B9": { + "text": "playo" + }, + "GAxX7EIz1TTLtMX08RRGr": { + "text": "hamburguesería" + }, + "GJlUSznzEHCgoAOrVrkp9": { + "text": "feliz" + }, + "GSEumxiyeVKRRiaY_c8HW": { + "text": "crol" + }, + "GY_flM-6uR6X3L4AwsiwU": { + "text": "para" + }, + "G_CRpzxWO5XdEMh01O1eJ": { + "text": "aunque" + }, + "Gj7THa6XFHDfYL5H19lwj": { + "text": "mañana" + }, + "Gm_qAGnL4OawmlYmTs7K5": { + "text": "no veo" + }, + "GoJuWnn72TCXONXKtYHMm": { + "text": "tren" + }, + "Gvmy--9DiUn_tkQYWeWhA": { + "text": "canelones" + }, + "GxrDtsdGcLepdsQr6V9DT": { + "text": "verde" + }, + "H2zMVtjvqi7aUtCypiVKr": { + "text": "sentar" + }, + "H8Bsrr2NK9Q3WGbEp8PMe": { + "text": "plateado" + }, + "H9SWPnWbR8qcZA-iu5Mz0": { + "text": "dolor de Oido" + }, + "HBZNu6m3FELU9eg3OeLdx": { + "text": "cortina" + }, + "HKfLJS8aCBtKuKJeSBQUW": { + "text": "golpe" + }, + "HMPabuHqgtyiCmTLzg-rM": { + "text": "entrar" + }, + "HQiQh4PPBvO1n-d7JGVj8": { + "text": "nadie" + }, + "HTBNWax6FCSGXuboGsVUW": { + "text": "salado" + }, + "HnuZA0UTlnuIfFAN7saxl": { + "text": "conejo" + }, + "Hvb4JdDHX_vNMck_US2UN": { + "text": "ensayar" + }, + "I5AJgba5GTdEjdpFB-LBf": { + "text": "chocolatada" + }, + "IAdQsjTsbBUAMjlwW34cw": { + "text": "me encantaría" + }, + "IEeIvawUD2GIAr1Wypr9i": { + "text": "personas" + }, + "IF3R7tLVAkd4RbL8R07K9": { + "text": "actor" + }, + "IM8OUKCzHwnjAQWPFgnn6": { + "text": "lejos" + }, + "INxOSvKbBNOXwruIpuNho": { + "text": "ombligo" + }, + "IO8uTb1K7ElENgp2ujZoK": { + "text": "robusto" + }, + "IXRWmFmtqfnHQRcBf1Idl": { + "text": "paloma" + }, + "IZbfYRzu2cxxDWdbmQeqw": { + "text": "cabeza" + }, + "Ig1oypuwndODbmKh_NEXs": { + "text": "malla" + }, + "IsWUeiPnDEnzxePKclBNp": { + "text": "feo" + }, + "J3qQMp0OMr5LC9ebfArxH": { + "text": "ninguno" + }, + "J3rDL96c2zfBQzP45VRCp": { + "text": "limón" + }, + "J4UUPR-WP0qo1y14bUVI-": { + "text": "veterinario" + }, + "J7MmgugOu20UtMcMPj59r": { + "text": "canción" + }, + "J7wLwBLVx4UANh_x5HdXd": { + "text": "según" + }, + "JB9SIxWzxWFjrbmMuksrY": { + "text": "reir" + }, + "JBIehRNmDbK2ALcRN0u9i": { + "text": "gallo" + }, + "JBKQaBezKuSDaMsnbJMTB": { + "text": "bar" + }, + "JBU2hMw9gbIy9-wGF4mjD": { + "text": "pizarrón" + }, + "JDbBWMB5No0pK6HvntLt4": { + "text": "lavarme las manos" + }, + "JEDIYq1BDA23ac9TNhON-": { + "text": "ayuda" + }, + "JFldbhjqxK3fD6D2K4HY4": { + "text": "papá" + }, + "JGm4BL7HAfuxX_PGe6Jzk": { + "text": "presente" + }, + "JQOpcZSCPGMOWZsN8w_yb": { + "text": "¿qué hora es?" + }, + "JSFuEHlP-CFvuqvFKMumC": { + "text": "autos de juguete" + }, + "JVtu9W3AumOwjUedwhUGE": { + "text": "rehabilitación" + }, + "JZRBfIXBkeuobtDXbLt5t": { + "text": "adiós" + }, + "JawnUo-pseWb3FDVMtxrQ": { + "text": "yogur" + }, + "JblWXW8TKDCuYu2yTnFBA": { + "text": "mesa" + }, + "Ji5OVFX-uNDewL8eX8Cin": { + "text": "pensar" + }, + "Jjq8CM8JrYHIMziuQy-WN": { + "text": "agenda" + }, + "JziaulL-lrAPGNVvwBPK9": { + "text": "verano" + }, + "K382TlNZjdMLLpAhCCXLG": { + "text": "almendras" + }, + "K6hd20tWZfwwlYYi7jctt": { + "text": "rica" + }, + "K8cMIDL0ubQvWhhDtr65F": { + "text": "llorar" + }, + "K8e2-KkvZfFOQaXnhR37x": { + "text": "cansado" + }, + "KC18_sTEqKucPQ-iwEKYY": { + "text": "lapiz" + }, + "KK_i8H9qTfDVYZkQGwd2v": { + "text": "apagar" + }, + "KNH4sLRpVKtHXQa-0y84K": { + "text": "nervioso" + }, + "KWYVDZiERE8jtRsL0faHH": { + "text": "nadar" + }, + "KXHW4m6vXxQU-AEOR4pZ4": { + "text": "balón de fútbol" + }, + "Khdk8mWpyxgLqfC-6lyT9": { + "text": "burro" + }, + "KhyTKtiL4ZT4Z1saU1eJh": { + "text": "escuchar música" + }, + "Kn9vE07FK1LrzoD_YxrJD": { + "text": "subte" + }, + "KpLFOrpuhFKaIbBbFwVVu": { + "text": "mariposa" + }, + "KrOPANVpdkBWdEZoUwxKf": { + "text": "grave" + }, + "KvY6Taigm4Va_cVjXAfGR": { + "text": "corto" + }, + "L0hfYADgzghRVsZLZHRxE": { + "text": "bailarín" + }, + "L19r487_d3RqWXiNuh3gE": { + "text": "¿qué color es?" + }, + "L6YLAEsbYcTq-ycQJTvt4": { + "text": "pollo" + }, + "LAuEISciEf1Wc1j4fERz8": { + "text": "año nuevo" + }, + "LDoi3cxodn_AVKSG-Bf_1": { + "text": "ojos" + }, + "LEVKlDlJ0wHo5QEjCNAGa": { + "text": "pegamento" + }, + "LEg8z-Q-ONLAAXd-aH_Hb": { + "text": "bajo" + }, + "LNBTW0qQtHYQEHatkWGtc": { + "text": "mercado" + }, + "LRIKzfm9ZsdNe1u7CUuW_": { + "text": "¿cuántos?" + }, + "LRfh-4RAZTj7cnnDwBmqj": { + "text": "flotador" + }, + "LU7IoUksATEBhd8PaHS1R": { + "text": "sacar" + }, + "LaKT8VTw0_6rvordp5-R8": { + "text": "rosa" + }, + "LiBr37yi-YBgQDx4unjyc": { + "text": "dá" + }, + "LjTGOcyG7DkTs1lJqNr8w": { + "text": "cabellera" + }, + "LksmOMPPOMArbrFsscqOW": { + "text": "música" + }, + "LmGq1AZs2a0x26r7E9GUj": { + "text": "maestro" + }, + "LngEMJa_ihV8mB7afZX-h": { + "text": "ellas" + }, + "LrDai7jXlGAdZ3e8ZQezj": { + "text": "hacer pis" + }, + "M5q2CXmK0_WVaVUB_HJB3": { + "text": "caliente" + }, + "MEqo2TROHyroK318sm84f": { + "text": "pasta" + }, + "MKR-ukiUlJy4uuqO30UU6": { + "text": "maltrato verbal" + }, + "MMzjhHID8HMqyPjii5o-h": { + "text": "cocina" + }, + "MNCcHiImRS8tmvhBhzCKj": { + "text": "ensalada" + }, + "MQHnvvU48NnEptP8a9w8C": { + "text": "no me gusta" + }, + "MWIzTM6zhTWL1V-brLtBx": { + "text": "cómodo" + }, + "MYqfOzKx2qMHop8GaHs0I": { + "text": "verde Claro" + }, + "MiOe5_Djf-pE9V9aDZ_1G": { + "text": "ananá" + }, + "MqQgYn5B0uV-DMORCBOmV": { + "text": "triste" + }, + "Mw6WRebMAKWwXfAvDA7vu": { + "text": "tener calor" + }, + "N2baGNTOapSaFDo1GURiW": { + "text": "no escucho" + }, + "N7n4zQIkJZOhaYESk2GgH": { + "text": "caer" + }, + "NFdUTit6Ff-4S7Nzf92U5": { + "text": "estreñimiento" + }, + "NFgGqhEtl0HqipCGGEvwU": { + "text": "peinarme" + }, + "NKQwWPAsVHwFBWuksqfns": { + "text": "ducha" + }, + "NLi5ODIzyMAwr2HpDXACp": { + "text": "nariz" + }, + "NQayjogCYiimP_0OxIfFj": { + "text": "zapatos" + }, + "NVe4u7BTAVfLk3xkDqLnZ": { + "text": "horno" + }, + "NVjfEut567uXpTaQUNI2i": { + "text": "campera" + }, + "N_893wsadpGg3Ip5sEThe": { + "text": "azul" + }, + "NaJxTPq9Ld8I4fwAltyEC": { + "text": "maiz" + }, + "NjulpZ9x63ZqxtLMoRjkx": { + "text": "prender la luz" + }, + "Njz8DrErsexBu8mAI6mnr": { + "text": "pescado" + }, + "NmNouLLx13jzE27jliI_v": { + "text": "diente" + }, + "NuhUikdCxP0NgsbO0wvAU": { + "text": "cola" + }, + "O-CLnVuXAUapOn6TbdhKx": { + "text": "querer" + }, + "O450x4W3OOacvJIy4QicJ": { + "text": "verduras" + }, + "OHyrmD5US1rHEAEwLQaII": { + "text": "animales" + }, + "OKXIGnLh-i1ydTNj450Q8": { + "text": "reina" + }, + "OUcfOOReAfQroBKlBdDb-": { + "text": "solución salina" + }, + "OWLDc7Hn3neBAf_V_N27n": { + "text": "abrochar" + }, + "O_ZfCPZSxGMPT6orCt-O6": { + "text": "chancho" + }, + "OblxxVFC-LKPq-8oC9FpE": { + "text": "sentimientos" + }, + "OdCdTUAlbN6kvsPjby_Bi": { + "text": "deportes" + }, + "OeA63q6LpqGvXW-cJXEym": { + "text": "jamón" + }, + "OeytAsSiEAWC10tXhxbTa": { + "text": "personajes" + }, + "OhrHu-xLo8hcn5plWfoX4": { + "text": "caro" + }, + "Om1Bvqu8nmGuNGwV8hndM": { + "text": "bajo" + }, + "OvyFC1GHkvJZ0dAAF1QkY": { + "text": "él" + }, + "OwHzJdOQTFOA8daCVRwm6": { + "text": "pincel" + }, + "P5zdq4x58yp5TA_soKQEJ": { + "text": "bicicleta" + }, + "PAlC0XSZNru3-LXtfvGjo": { + "text": "hacer el amor" + }, + "PBqpK7LL1HQPwowPitrss": { + "text": "leer" + }, + "PFAi3SdvH9vL7_Bg3MhCA": { + "text": "semáforo" + }, + "PIBHv5VueBi-sf5qFCN_Y": { + "text": "ante" + }, + "PIPQnVS2UiS7kGbucJP8l": { + "text": "curar" + }, + "PLXxIPYyztaztLf4sPCst": { + "text": "garganta" + }, + "PbtM3htZocZb8YifuPoY5": { + "text": "cangrejo" + }, + "PfNLmlHKFT9d1w6IgeXbU": { + "text": "control remoto" + }, + "Pl-M4bc6k2rdhu6FHEbkA": { + "text": "patio" + }, + "PogTYrGfa2WNfBRuA8O4e": { + "text": "malo" + }, + "PszHdOxMsS_tAzSrN52Wa": { + "text": "plastilina" + }, + "Pw3GgPwp7fpDVC6wJjgPn": { + "text": "subir" + }, + "Q6LQqdLcvNOiCFjC0DVo2": { + "text": "tambor" + }, + "Q6nNH4AIoSeDHODC_Ip8O": { + "text": "vecino" + }, + "Q9Ra0aJaQnOJQ1Kqdc43-": { + "text": "bebé" + }, + "QCQRmsQY6AggjreY9Z0MF": { + "text": "rechazar" + }, + "QGf1Tb1roL7HAXUSrRqRJ": { + "text": "naranja" + }, + "QJhkOh48xapiTObEDQLB9": { + "text": "piano" + }, + "QTkFHWp9KEDgfCjoQjBY2": { + "text": "plurales" + }, + "QUTQLuD2Gv7fHh0V_O5tg": { + "text": "avergonzado" + }, + "QVqSPPgA89whFTJ0HTphK": { + "text": "abrir" + }, + "QZNQOaf0SdHDbx1otCmrH": { + "text": "niño" + }, + "QcGJ9u_JqmrW0X47PXWH4": { + "text": "despeinada" + }, + "QclUM2p3iexSjFZI8OU4-": { + "text": "fiebre" + }, + "QeqA20MCXB-zNfuKIssMY": { + "text": "lata de atún" + }, + "QllvOUe8utZrcBRGw_0vc": { + "text": "curita" + }, + "QnlQ1HOEB9yNjuW3Dd6fc": { + "text": "celebración" + }, + "Qo3Qn_nMe3E6EqNw0UdNZ": { + "text": "soleado" + }, + "QohNih4wgqjnpWt3kSwtd": { + "text": "entrenador" + }, + "QvaMxPy-3iixHAJFyIrN-": { + "text": "sandwich" + }, + "R06chAQYswLtQK46OInW7": { + "text": "leche con galletas" + }, + "R9ECa_HQRtpFrb59ebMTQ": { + "text": "escuela" + }, + "RBCjBvNXQSZOOpg-5lBlK": { + "text": "bueno" + }, + "RZfMOtjw0DoGHWaRfCEc4": { + "text": "pantalón" + }, + "Ra2rxEEohwxRqDsW2AT3C": { + "text": "videojuegos" + }, + "RbZetbSC5064rZccOFD1D": { + "text": "televisión" + }, + "RkpoG4KB8m_TJFJf2v3EG": { + "text": "cambiar de canal" + }, + "RwlZ1jr2Ix3evzrW71lN0": { + "text": "manzana" + }, + "S3um53pcko7_BPHy7R6FL": { + "text": "nosotros" + }, + "SE-71I_ahm3oKROReyJHE": { + "text": "hacer caca" + }, + "SOyGnJXLPeVRoZy3vBgpK": { + "text": "examen" + }, + "SXz8iA1Qn_BlgLTAG6Epl": { + "text": "cena" + }, + "SiOmZdwX8Hf2nE2v6HfCp": { + "text": "zapato" + }, + "Sp2Ias_Y1HplkHWjIb7Mp": { + "text": "sin" + }, + "TAbuXSnSHU6C3CQ4kbKVh": { + "text": "triángulo" + }, + "TBV2BhoZVgl1jMV_jWZYi": { + "text": "derecha" + }, + "TIgoS-YONIwzbrImXetaD": { + "text": "ciruela" + }, + "TIsM6aTTZ9W8j6UhW9Qqj": { + "text": "coro" + }, + "TLxsYdrBdHgFZkNJtVTmK": { + "text": "tortuga" + }, + "TP-gGRcpcFyx1SrNRsdRV": { + "text": "perdón" + }, + "TR5CXN8-pfbWkshdxSBSV": { + "text": "oveja" + }, + "TS9z8ZmMEwn0MGSfr9amH": { + "text": "palta" + }, + "TZF-7m8VKZ7IL6pyv0Daf": { + "text": "cepillarme los dientes" + }, + "T_Q5c4XAfkhkclmnCGHo5": { + "text": "hasta" + }, + "Td5pgVQDTFOftUgOJ-bD-": { + "text": "picante" + }, + "Te_jJfeU8Xwa9St2RihBq": { + "text": "sangre" + }, + "ThqkHs4az5tgLqLcfFPaZ": { + "text": "largo" + }, + "TpPNZLsh5jrN9RdPFwmA7": { + "text": "¡genial!" + }, + "Tpj-Fs8LQ566TM0bYlZ6H": { + "text": "viernes" + }, + "TuAjBKPp3-PSdQuooSWZi": { + "text": "rana" + }, + "TyqVzfOniQNa9WKQRXqr-": { + "text": "hermana" + }, + "U1KQsrvTa2E00-ugc-Iy6": { + "text": "ausente" + }, + "U6PoeH-cMdO3ttnLkN7_3": { + "text": "cabalgar" + }, + "U7GiGcYacowWi4MWrCYyj": { + "text": "antiinflamatorio" + }, + "UQ-5wOfR0tDzljoDjj2xU": { + "text": "otoño" + }, + "UQ5B5K-tpk1XmQC1B9TjQ": { + "text": "no" + }, + "US8_vYTnDfxBw2Ung_J38": { + "text": "partes íntimas" + }, + "UVzdJiqY36fqgBYyz880c": { + "text": "jamón crudo" + }, + "UXJDiwb3j_zyfGa26ByJL": { + "text": "pecho" + }, + "Ubaq6h7wasdP_YRombm2c": { + "text": "azúcar" + }, + "Ugs9V9c2c5iHrVC6p17zr": { + "text": "analgésico" + }, + "Uk1Emn5IovsTfFzpQX5Jw": { + "text": "sosten" + }, + "UkLF5sKtVKW0D8RzVCoue": { + "text": "bombero" + }, + "UnQJwWfWCe40DJYR1Er0o": { + "text": "dolor" + }, + "UssSOEEKutvzB_B4fAQE-": { + "text": "escuchar de nuevo" + }, + "Ust3oadA0PUGViYo28Mf3": { + "text": "caminar" + }, + "UvRS0KmtZn3dq7e8L5RcE": { + "text": "enojado" + }, + "UwvZVcX_CAQFrI6U4LsNT": { + "text": "huevo" + }, + "VJ9AU_y7CqsONR6TvhdLh": { + "text": "¿dónde es?" + }, + "VKrLGgYjc-nLPGsyESDgb": { + "text": "canario" + }, + "VL4pd0vnJ-CNfMg9bCNed": { + "text": "aspirina" + }, + "VUJ-zrdsyL9MOuFbdMCAx": { + "text": "mareo" + }, + "Vioyf8EXJfY5t34NnN0WO": { + "text": "tablet" + }, + "Vjlet5P7XuqTrc22nt_Zz": { + "text": "agua" + }, + "Vmnu5eormo-_TOCgF4YzG": { + "text": "jarabe para la tos" + }, + "VoZumy5GtnRdqSOmXAw7j": { + "text": "preparado" + }, + "VrC7AnovfA7VzmYESVc8L": { + "text": "conversar" + }, + "VwZ4EKSggYWxlnAbp-pNB": { + "text": "enfermo" + }, + "Vzov0z9acB-I1_W_CcFcY": { + "text": "rojo" + }, + "WDUIQV43zghFQq_rSk1Z4": { + "text": "churrasco" + }, + "WL3ZN-W_zgnuTJpuqz0YQ": { + "text": "príncipe" + }, + "WNhpmD_XlTaNEBo7GsFXu": { + "text": "diarrea" + }, + "WQ0CNIQ_gjaCxg4tEIsOo": { + "text": "clavado" + }, + "WRzleD-mI84LaimFH8h6P": { + "text": "escuchar" + }, + "WUt3I-NkdbqlSVcwuLfFx": { + "text": "patines" + }, + "WWK2v56LM-zWqujabk9bM": { + "text": "plástica" + }, + "W_f7h3qOLl2uEd_OYpMfQ": { + "text": "policía" + }, + "WasZ5bKZZy5Jt4Y-JipxS": { + "text": "bikini" + }, + "Wgh5iCzUmx4Je-B85-pra": { + "text": "heladera" + }, + "WjXQhSFPpz42ZUyHvurYG": { + "text": "grillo" + }, + "WtYSntcy2CijEORmROeaj": { + "text": "un cuarto" + }, + "Wu47Qs6Zupu1Ox2gUhkxn": { + "text": "cuarto" + }, + "Wva5W8GA0dHzyt2_0FPdm": { + "text": "hermano" + }, + "X0-Tf-KR24qEkpGDzG2Z-": { + "text": "ayer" + }, + "X3u4pXTWKcGc43lOkgSBt": { + "text": "cumplimiento" + }, + "XA952Z60D0-cesNCVA-OX": { + "text": "chau" + }, + "XC5fIljJ819OYpllYTjpE": { + "text": "jirafa" + }, + "XN0nzhQyHVOhuYuNqrp8g": { + "text": "durazno" + }, + "XOoGN6huCjVHxH8hRFAw1": { + "text": "blanca" + }, + "XY6ZCNzeJIEzLtWJcufJm": { + "text": "camiseta manga larga" + }, + "XYY8SV1IAMHjdGjMZxbdy": { + "text": "cancha" + }, + "XeVaDdUWSEkhfJvTVvUHR": { + "text": "salir" + }, + "XnocVMEeUGCSnlnusP44O": { + "text": "agarrar" + }, + "XuAtFop5_JNSYiZkUBzaU": { + "text": "cocinar" + }, + "Y5HQq_4crSF2lpwH-KUrt": { + "text": "dos" + }, + "YCu-B26PqjE30AhikHdkI": { + "text": "dibujos animados" + }, + "YIP0Xc4aJsfv0s8BpiQnn": { + "text": "cinco" + }, + "YLKXFZ9ze9K9NvJiAx8w0": { + "text": "¿qué?" + }, + "YbrNtdUmyMNdAF5CfvY1A": { + "text": "toalla" + }, + "YbvMRsCtMbww8OQgF45QF": { + "text": "resfrío" + }, + "YeT-jstVSA7-mD9t99Isg": { + "text": "rompecabeza" + }, + "YusWY8GwdO43bSp1o3BWC": { + "text": "molesto" + }, + "Yvxm8RGoFYKUsIXOl33yR": { + "text": "apagar la luz" + }, + "Z5-sBklfLIWE00CJ_T_ZK": { + "text": "cuchara" + }, + "Z8xp3kxXuhMVoNm7ddQSX": { + "text": "lanzar" + }, + "ZA2C4bJaL90lBxsTemYWZ": { + "text": "piscina" + }, + "ZAnmv4CLb7hldYUlp2wJU": { + "text": "ninguno" + }, + "ZBIFtTq-BH1jv5jLbzrhj": { + "text": "repetir" + }, + "ZQEXAf10BkoTvCJx3Ox39": { + "text": "sorpresa" + }, + "ZR-NXJk3SD351W-95cf_T": { + "text": "pintar" + }, + "ZRYQmYRGKzheBqk11eGRZ": { + "text": "ballena" + }, + "Zm4OIanIKTigDGIsInO7o": { + "text": "un supermercado" + }, + "ZnMba2r4XIg9lPi_H2d_Z": { + "text": "sí" + }, + "_1lOt0C0MQhvU8QWC6_oZ": { + "text": "buenas noches" + }, + "_2SjbH-xHZq173EU4J65c": { + "text": "parque" + }, + "_3ihCSMQCokXNo8pXii-h": { + "text": "llamar a alguien" + }, + "_8RIOebHpkr9nCy0_9qhP": { + "text": "llamar" + }, + "_CsJMxqGcNSaujXwRZcpu": { + "text": "ansioso" + }, + "_FNTsoEjTMV3Uas-gggi2": { + "text": "estrés" + }, + "_HUf6SR0mTP7v72Y9_4gw": { + "text": "coche de bomberos" + }, + "_Lc2-NNL69ZX-aVnUNzgx": { + "text": "frutilla" + }, + "_S9Eck14cdOTr0QH4i7sQ": { + "text": "cuarto de baño" + }, + "_WIT6qs1kaiJqB1Ild5Xs": { + "text": "paseo" + }, + "_eug92AvR1UXpYlfm6o_Q": { + "text": "dorado" + }, + "_hqTU9A7I3RFDVrcIEK-L": { + "text": "%null%" + }, + "_lU200bb9Sjv0b_iJKgU2": { + "text": "una bicicletería" + }, + "_tDZtalMxKSNpWydJ1aeW": { + "text": "cero" + }, + "aC_XP9Ch5PqWoCmcJwI77": { + "text": "algodón" + }, + "aMs2YNnWkw4XN0gAm-jI3": { + "text": "cajón" + }, + "aP9QisUdxhgOKIQ2kHNb3": { + "text": "acelga" + }, + "aSzpwNza22HZp46Sh6wfx": { + "text": "súcio" + }, + "aTwzShtP_zR9x6bSGSzEB": { + "text": "muslo de pollo" + }, + "aXLBXkENJqTYkyZOP8TNS": { + "text": "tú" + }, + "aa3xDW6F9YUKyX0fe5uX8": { + "text": "espaldas" + }, + "ajesFjbC7hwCNLKdif-ix": { + "text": "contra" + }, + "ak5fBauJzapC4JIf0lT8N": { + "text": "cerro" + }, + "alsoa_V3wz3vPpG1TKRZc": { + "text": "transportes" + }, + "amk4WRd1sNEIp24pnFw8j": { + "text": "rodilla" + }, + "armmpopt2RLsVDlqLrQ94": { + "text": "restaurante" + }, + "atVEXuftxSiDDj8rzUlFg": { + "text": "crayones" + }, + "atWxG3KTHB5moW1dylLJc": { + "text": "juguete" + }, + "avzcTznCsQCISYJsLC-w_": { + "text": "notas musicales" + }, + "b1XpSC0ndnm0ZewNXC3pp": { + "text": "carnicero" + }, + "b5OdBMMzkf1FlQbUR5-m7": { + "text": "servilletas" + }, + "b9Y5MrR-jn8fh77gAkLZy": { + "text": "pintar" + }, + "bAoK85XLNb7p0ebevYZ6O": { + "text": "mirarme al espejo" + }, + "bDnuS19hfd9GhJ-6rjNPD": { + "text": "estar" + }, + "bFodvUraUhJeq4waMdlxv": { + "text": "domingo" + }, + "bNJfccUvG2DQfR1iZP3eR": { + "text": "serpiente" + }, + "bVN3R44VuZDw3IdQMolca": { + "text": "cambiar" + }, + "beNprvNb0UztxR4JLxDFm": { + "text": "cumpleaños" + }, + "bge6qR6NzsD5Vk4ifPsSO": { + "text": "ketchup" + }, + "bpSuQQRlIcSse40OAxNSG": { + "text": "lunes" + }, + "bqjKW_qBtRzIThWxdZx2s": { + "text": "gafas de sol" + }, + "buyy_2ydocKoi9TnBhZ1N": { + "text": "amiga" + }, + "bw3rqHXD1TJ53xbNggEqH": { + "text": "desayuno" + }, + "c7kK5ROVbO3DHrwSFEawq": { + "text": "dulce" + }, + "cI0JxwhkWU-YA7E7rmJtp": { + "text": "cuello" + }, + "cJMQi3SVmqvWJ00VxI6gy": { + "text": "¿cómo estás?" + }, + "cJw2i319mzBUpEfBRDxc9": { + "text": "pez" + }, + "cJzHrV_PsV-PwwyFN9jka": { + "text": "%null%" + }, + "cS3g4KXf39akVFHCG5AwL": { + "text": "camión de juguete" + }, + "cTiw7_Yjxu_Kg90q7PdYl": { + "text": "gripe" + }, + "cb0rJJEYOeEoRU5fDdQQq": { + "text": "el" + }, + "ccGASDOGtty6GfQMEEBEU": { + "text": "tres" + }, + "cj6OuVw4Nob8jxP-E4rZc": { + "text": "cambiarme la ropa" + }, + "cnyLFMkJu2i3cqOY0e9kl": { + "text": "pasas" + }, + "curstMeuThu2KUph-8rkB": { + "text": "jugar con" + }, + "cxMNBGV3LytDXgwDMCiga": { + "text": "violeta" + }, + "d4zNoj2BAFG9B7J3KAlLE": { + "text": "botones" + }, + "d6s8fLFBiQ3KEJlNdJfUW": { + "text": "un poco loco" + }, + "dHM0qnbmtJAkZY0WBsqaY": { + "text": "lila" + }, + "dLHDzm0rfgL-vXTx14HSm": { + "text": "buscar" + }, + "dNvN5P787hAPE7ZYNgwkw": { + "text": "pasear" + }, + "dR72liRxC3qmoSa6Dz2a2": { + "text": "jarabe" + }, + "dS-KyYREUQIk7sDlmsvoa": { + "text": "cerca" + }, + "d_I8jNfbkQD0CHgZn7hyB": { + "text": "camisa" + }, + "dgm3NCKuz7L39PX8LYxj7": { + "text": "juguetes" + }, + "djgKI9embnk95PAtFcn45": { + "text": "cambiarme el pañal" + }, + "dn41o5K_1fo-qHO-YLoQn": { + "text": "sábado" + }, + "dnXsSOeVG7mq37uciIi2J": { + "text": "recreo" + }, + "e5sCl246xFMESEfFy2PhX": { + "text": "coche" + }, + "e5un1yrIuZHQi048e5kD6": { + "text": "alfajores" + }, + "e8zl_ecIloo4Vk-OZPJWe": { + "text": "jugar con la tablet" + }, + "eDX2HSkGaY2TeVwPjR07S": { + "text": "fácil" + }, + "eGJ8MC1xPE6ueF82jCmVg": { + "text": "cepillar" + }, + "eKJCZc-kD0-m6cVLorFzO": { + "text": "pera" + }, + "eWSI1NInbQowtO99phhGA": { + "text": "boca" + }, + "eZEqRZjRK8JJMsfHo4Y7w": { + "text": "del" + }, + "ebo03xnkyiHD2pKUKULmr": { + "text": "dibujos animados" + }, + "ecUOs24Pp5ZTRt_ZvED5W": { + "text": "acompañar" + }, + "eduqLSyC3m4uB1Oee6dt6": { + "text": "mitad" + }, + "eji-M2j5eHkG71DCksleY": { + "text": "huevo duro" + }, + "emm_RirDsO30Enax5Q4gd": { + "text": "con" + }, + "eo3Q5AjHJz5kp1EbdALwh": { + "text": "ustedes" + }, + "eoYtISVZl3mdwoE_HW-Mv": { + "text": "guitarra" + }, + "et1KiL5-zob_EcGlj7tLN": { + "text": "despues" + }, + "f2dl12fMZbRdQ7STpcTdk": { + "text": "fútbol" + }, + "fF3ijeQzetfSn6EGcs1yY": { + "text": "cerezas" + }, + "fL_4POdbPVL9-lvQVWSqY": { + "text": "avión de juguete" + }, + "fNAlqbgrpirQZO_LhrkXY": { + "text": "primavera" + }, + "fNv4Nb6Vafxk0JxXr-iDo": { + "text": "investigar" + }, + "fUUj_4pKPflmJlxZfk0cX": { + "text": "discoteca" + }, + "ff7ES190q1dmFYZ7lo6x0": { + "text": "pan blanco" + }, + "fjCOcN-PKP6F07IZcI71X": { + "text": "plaza" + }, + "fkNwVm56PSe-qh-QoM0vm": { + "text": "allá" + }, + "fk_z_HrvcUh8XIq8D6gQP": { + "text": "nueces" + }, + "g1Cj6HW8kg8yPE1XX9pxa": { + "text": "desde" + }, + "g1TLUpuQX2Zs1ob9gqYui": { + "text": "gorro" + }, + "g2MhHawoIC9oFNEv5_w63": { + "text": "vida" + }, + "g2sQSxCcoZuKJ3TabK6oT": { + "text": "vino" + }, + "g75y4E53ViakV-s5UfnIF": { + "text": "equipaje" + }, + "gFEnqFhYoXF7QN-n0ONad": { + "text": "montaña" + }, + "gYrIz3R13-BC_pYcvQ9BL": { + "text": "invierno" + }, + "gaem1LHTtfQdnnqYi-sOm": { + "text": "billetera" + }, + "gff2FqDlgXknRld7YMLWl": { + "text": "entero" + }, + "gsU8pE9ozhR73xS2icwJ0": { + "text": "libro" + }, + "gvPwrzDSSEPwcxY878T_c": { + "text": "gato" + }, + "gzCjycNS8Cf0vNlo1klji": { + "text": "molesto" + }, + "gzb-RNDLMNkgk9wnPILJi": { + "text": "abuela" + }, + "hAZhogJSH3bL1iL237N8J": { + "text": "pochoclos" + }, + "hDvpMlPw-chcuxEisBJTl": { + "text": "castañas" + }, + "hKJhXxultsxm0TJl1P8-L": { + "text": "chau" + }, + "hOyjT1JgOYB-mGLFMaNJR": { + "text": "dolor de pecho" + }, + "hT3Lrjn5-q7YIM1loG4MN": { + "text": "parlante" + }, + "hUYfE_vmNBT_7E60YZsSu": { + "text": "pintura" + }, + "hWWOw1gWjWwN7wQJkHrTu": { + "text": "tour" + }, + "hXgGhazQ_nA5uqpRD6Qwq": { + "text": "ganar" + }, + "hmhAUgqvGp7nc1w25sRSx": { + "text": "esperar" + }, + "hwzwfMyJsvB42F_QWQWyi": { + "text": "jugo de uva" + }, + "hyUaYltGVJU-wRrAjhhPa": { + "text": "cantante" + }, + "i0wB--S4sdL8Q4H9b93UY": { + "text": "ácido" + }, + "i2mlV3zGS6nrH2l6N2BlZ": { + "text": "trompeta" + }, + "iAqItRUQL_YpbMn2pgjsA": { + "text": "pizzería" + }, + "ibtmTEP3QGDY8TyVLteuX": { + "text": "blando" + }, + "ifd0M0pAlFm7aPt1A0ze_": { + "text": "amar" + }, + "iiA1u1JKRmhe2jWVE_W79": { + "text": "amigos" + }, + "iimGxVoFWlq_THThR3vmF": { + "text": "noticias" + }, + "ijn-QwQuTxRFFVe-7WlSX": { + "text": "picazón" + }, + "iowxE4MxcV6PR2Uhtvxqs": { + "text": "hospital" + }, + "irbOv2dHA7G969dnJMfJn": { + "text": "cuaderno" + }, + "islCzqFq1SYrZAh63dLhQ": { + "text": "huevo frito" + }, + "j5xZZev5nTNa-p088Oqnp": { + "text": "besar" + }, + "jBqD3qhhcrioLlCU-xq5b": { + "text": "instrumentos musicales" + }, + "jOALQbfxdXmJVyY6P5gZG": { + "text": "damasco" + }, + "jTEb3A5ZEKEy2ojuq2vO_": { + "text": "hueso" + }, + "jeO9YZ22LfSObUNhQDRAz": { + "text": "ventana" + }, + "jfly9fZ3x1da4SGCCNcV2": { + "text": "bufanda" + }, + "jfvreGZv-e8rD4-01wZ5H": { + "text": "venda" + }, + "jhJ2TOfdaRAcVeHGOjwua": { + "text": "leche" + }, + "jmzg4EiC7JEHwe9gNP3C3": { + "text": "arroz" + }, + "jpKPg3hn6_GO1HSkeLNGz": { + "text": "niña" + }, + "jprAsdXWGQKPlUWwgBBot": { + "text": "película" + }, + "jtKc2q2n5an342ZkiMB9R": { + "text": "higiene personal" + }, + "k-iDOTk5uO7ZK5OB3v8It": { + "text": "viejo" + }, + "k41gkf6A_bDtQAJDOrWpP": { + "text": "pasta de dientes" + }, + "k7dZhQtwDPFlOk1iPjEOz": { + "text": "subir volumen" + }, + "k8tJx6PikRcnVuZEqrXRM": { + "text": "viajar" + }, + "k9ZpWM4oRb1q20c0qWCsg": { + "text": "abrigo" + }, + "kDzHKO8eIwNsyKWDw7M0c": { + "text": "uva" + }, + "kIn8SeGURyvu49EsRqDs7": { + "text": "pijama" + }, + "kN85Lb_C4dLnww7sz1afK": { + "text": "café" + }, + "kaiWPbXxjHXlqcpBaBp4l": { + "text": "viajar" + }, + "khUUL_1JQGngApqBRDh_q": { + "text": "arreglado" + }, + "kpghvJtujlt4vPI2N6vsg": { + "text": "o" + }, + "kxuGlfYjS6puO2xD1QvxO": { + "text": "vamos" + }, + "lKA4b7I3iFkqNzPcAXyBc": { + "text": "cocinero" + }, + "lKMW_xTZzCrCHRcGp-Z-n": { + "text": "galleta" + }, + "lR84gCk8OM-oYoLAV7tar": { + "text": "timbre" + }, + "lXH68vGIuZdfA8xVrS8iw": { + "text": "mucho" + }, + "l_ncJLRdVGBzzQc9yqBqs": { + "text": "banana" + }, + "lrUuPKco_O8FXDuclzpKE": { + "text": "necesitar" + }, + "m0434KkjeTv8SGN7WxR2C": { + "text": "negro" + }, + "m0Fkio76HZHS2HguPOTn5": { + "text": "seis" + }, + "m17b6MazSk6M4gb51_cCy": { + "text": "pulmones" + }, + "m39xTdgaenoi4mWGEa-Ew": { + "text": "plato" + }, + "m3qTT8tiGZQheKIWREzMT": { + "text": "ir a" + }, + "mC9Nb7zVdEUpjEBODw_gL": { + "text": "vos" + }, + "mFfylZ8yoLvtkVSDTlVEN": { + "text": "pomada" + }, + "mJqzbxYeIDQciPkeHA1Ao": { + "text": "cuchillo" + }, + "mK4AXXhoIVirBz5dr_xLA": { + "text": "pavo" + }, + "mRK--C5Q1aGe8MMPJJLYi": { + "text": "preocupado" + }, + "mTklFAI-FVVLsMKoASZ7T": { + "text": "desconocido" + }, + "mWXxPPvhSHf9hyb-VyuZH": { + "text": "e" + }, + "mZFwH8xY_OeVDWCdvPZBy": { + "text": "pie" + }, + "miPmA2tOQiLxOW7D_V_x6": { + "text": "cubos" + }, + "ms97ZsgQOvD-Z8qpSW4oN": { + "text": "¿quiénes?" + }, + "mx6dmRLXA_lkN1QlP71vq": { + "text": "todas" + }, + "n5bZClAB6jXAZnwxIwH-1": { + "text": "tostada" + }, + "nK7DRpxalLBHL9OnRjSim": { + "text": "frambuesa" + }, + "nMQUtS-kFHViOKyop1FdS": { + "text": "vincha" + }, + "nQSk6_KCEVdO7oC_uxLXN": { + "text": "oreja" + }, + "nQdbkRVcwpQB_hFNPbe6M": { + "text": "caballo" + }, + "nUg2M7p5sUPlGdbBev2-G": { + "text": "tobillos" + }, + "nm6e_s01gWHzdVj25BHyq": { + "text": "¡qué lindo!" + }, + "nnTJQMJWfd2nuTSlFNEOy": { + "text": "mío" + }, + "ntzBlFkDMTKEUHoGNc65u": { + "text": "baño" + }, + "o0oxaoUFpOLiGsoQBlalI": { + "text": "torta" + }, + "oAxNCJufVUqZMyWRGdZl9": { + "text": "tuyo" + }, + "oEHzYcfxDGGcsL-deud1j": { + "text": "snack" + }, + "oEyUWrQj1iYUnlEUdQQ5Z": { + "text": "flauta" + }, + "oO21zLMEtHEakvnuTohLu": { + "text": "¡qué divertido!" + }, + "oOkD8Wmvb4t9I2EWqT1Nr": { + "text": "amargo" + }, + "oSBFO8Ka0PN4bgX0QuWxL": { + "text": "viajar en auto" + }, + "oYwoiRDWlIjSTbYdC2vG6": { + "text": "falda" + }, + "oa-MShota2L8n2pU8hIsm": { + "text": "jugar" + }, + "okr5oAG2U8Er1XwQ8XbWD": { + "text": "grande" + }, + "oqQWeoWBr5N0LrPGY62Og": { + "text": "senos" + }, + "otTWzTaTAmweNCozT8tn9": { + "text": "alergia" + }, + "p1qK47wwLwF8S0Fy8-2Mt": { + "text": "mano" + }, + "pHBnmCFpM7oZf0O78CBIz": { + "text": "golosina" + }, + "pM-bC77hbj-w44A0HFRDZ": { + "text": "sonarme la nariz" + }, + "p_XyUXRmeUk_bdjRTMtkz": { + "text": "revistas" + }, + "p_qpVEd677b2Bk56yhvj6": { + "text": "jardín" + }, + "paPpjw1XVC9-6xcueJsrY": { + "text": "todos" + }, + "pgPlWKk-oww2fua5zYuue": { + "text": "mono" + }, + "phZ4F4uzi1TrhjeDMuMsn": { + "text": "almohada" + }, + "pkuppr1jMH7SMpa2hrIWQ": { + "text": "jugo de durazno" + }, + "pliNY9oMQh1iSidkEhhDO": { + "text": "abrazar" + }, + "pptyFMhLrbC6lN6zmc7D0": { + "text": "comedor" + }, + "ptQZXjMQyXWycUD1kAkQo": { + "text": "cuento" + }, + "pv8eYkxczIevQqEGwDz6V": { + "text": "mochila" + }, + "pvXSy-5M4i8kysUppvdME": { + "text": "que" + }, + "pwltOTDn2OyABTlD4-27W": { + "text": "verduras" + }, + "px0jKQDj7r9pOYs4ZrvcT": { + "text": "tomate" + }, + "q22wRFF21EigV8YzQ_MfV": { + "text": "¿me ayudas?" + }, + "q6F-qJ7mTxvwa43F6vwun": { + "text": "escondidas" + }, + "q7Pz4UqqZUlXeFfXrwXDR": { + "text": "enjuagar" + }, + "qA4v2JWQU0zzBBZgvW7Vt": { + "text": "temblores" + }, + "qOsbXyvBTMDAwvvnI0iFn": { + "text": "pequeño" + }, + "qU5IvFLD8d16iIHSs_9TM": { + "text": "cebolla" + }, + "qWhpDTMd8eAEoq7yTKc57": { + "text": "calzón" + }, + "qYA2U_BFOZtFLClxuCIBJ": { + "text": "dolor de muelas" + }, + "qeJdrxKIIcUctIjo8wWhc": { + "text": "aguda" + }, + "qn-7ERrcZxJTqfW6hwNs8": { + "text": "correr" + }, + "qsA1zm1DOlItK7DCWzAw8": { + "text": "aburrido" + }, + "qscoBbrWu7tQbpNj9XUPt": { + "text": "papel higiénica" + }, + "quE_RA9abVvtG-Fo4Jx8f": { + "text": "diez" + }, + "qy3c7gvRU7shWuJYr1kBk": { + "text": "bebida" + }, + "r7eJgCF_b_ktkztv4-oda": { + "text": "medias" + }, + "r808IO3I6j3os_uix6O63": { + "text": "juegos de salón" + }, + "r9qUBQwgY8eycnU2OVey0": { + "text": "comer un sándwich" + }, + "rBwDn3PcJGqytqnOZTJMV": { + "text": "taxi" + }, + "rMFGfzFobfGsH3_qrLHXU": { + "text": "pescado" + }, + "rU9cpWF0I4wnJjzTXpGtO": { + "text": "hoy mismo" + }, + "rgyV6CvFe98OGnWut6QCZ": { + "text": "turista" + }, + "rlGO5jGKPL1vW-VF4nRqZ": { + "text": "entrada" + }, + "rnjJyPTabH_Xpmy4Z4O3U": { + "text": "celebrar" + }, + "rtHwq5WN9KElX3V3SKBmS": { + "text": "papas fritas" + }, + "rwyX2YemNEx_Mh64IArDQ": { + "text": "oscuro" + }, + "rxdfuk6egO7VmZEB3JrUN": { + "text": "la" + }, + "ry_jOegpMf4nB3spGf4d2": { + "text": "me gusta" + }, + "s0BXoyn7AqUAlZ9BOHY6S": { + "text": "tríste" + }, + "sAsTkky29uEVC9vo3Ofbo": { + "text": "brazo" + }, + "sDKIldL3tit328Joneo_7": { + "text": "vaso" + }, + "sFNUgvnglgrm6cbYiM0di": { + "text": "¿cuándo?" + }, + "sP6uvKmY5kA_yuYR8H21c": { + "text": "halloween" + }, + "sPtazVgymXESdS-BcHqU_": { + "text": "pollería" + }, + "sSTGRl6DpYGZXp8vtTNbm": { + "text": "comprar" + }, + "sbv5HLPUR6gHo-EJR2S7S": { + "text": "camello" + }, + "sc0hr3jQ80yXRFDlAn56V": { + "text": "cansancio" + }, + "sixdpB8hTOhlUr4loz3RB": { + "text": "muñeca" + }, + "sjGytpiPjwqJfPaRUJ-Iw": { + "text": "miércoles" + }, + "sysOciGqtL7y4ULuyYVc-": { + "text": "canal de cocina" + }, + "t-w8e69GwxLyfxlWwHk9f": { + "text": "mermelada" + }, + "t34TbvjJ3zG2jcgJaCeHa": { + "text": "tocar" + }, + "tGyUfSljuc7A5Do5B9GuN": { + "text": "sweater" + }, + "tQwMPLvqAMAstcqvnOERE": { + "text": "gris" + }, + "tWxC4hR6di5zQC-Hujlev": { + "text": "bajar volumen" + }, + "tYwEpd2EOtH8wEUr-jwHk": { + "text": "caro" + }, + "tw1doIY-jFPofZjlPFj4z": { + "text": "¿cómo te llamas?" + }, + "txj22hip0CE9qp_z-daIK": { + "text": "nebulizador" + }, + "u1nIt_oFH426g1IVhlYk5": { + "text": "sediento" + }, + "u2e4Zh8qwJF7zKkohQ8df": { + "text": "goma de borrar" + }, + "u3BufiTZTK6AylGh80ZFd": { + "text": "ella" + }, + "u8HfFvMPkogdWk-URj9hv": { + "text": "escribir" + }, + "uDg7Yy86PlwsAd-U96vJR": { + "text": "arriba" + }, + "uFoytOG4qsXzBk979t63y": { + "text": "limpio" + }, + "uMhOF9ZvWnjW-Zrjbjfhs": { + "text": "bajar" + }, + "uOA82KFAVtjoYRTuYFgpr": { + "text": "postre" + }, + "uPL5NMeXTmD1iU6ZoiROu": { + "text": "pájaro" + }, + "uYElWOlSOSoQap-d5gsYF": { + "text": "chocolate" + }, + "uZRwbLa1lEG7ol0UJKRBj": { + "text": "viejo" + }, + "ubP5GM7_0vPkRc6zbD9Ez": { + "text": "antiácido" + }, + "uiVc5R86QCZkhraEFlrNz": { + "text": "museo" + }, + "ujyHgmlPIs7UdtndbYd8S": { + "text": "amistad" + }, + "upWXctTSKBtFNSXnXDK_u": { + "text": "frutas" + }, + "uzSwgQNnV8ZrjxpN5Bz_a": { + "text": "difícil" + }, + "v-E2GE1DpCkNAxsfA0f4M": { + "text": "goma" + }, + "vHzfvEgIkQ0e73ryfWP2F": { + "text": "ordenar" + }, + "vKGLQIas9RdBnPGsaYtr2": { + "text": "cometa" + }, + "vOgqHjpHgrUGERIHtVqDe": { + "text": "basurero" + }, + "vPicdKLrhT2wmAAPPukKP": { + "text": "veloz" + }, + "vPnmrsRou1ihosdVXS_Op": { + "text": "zapatitos" + }, + "vZ9JaTnoj8C0ILYxMNB73": { + "text": "calabaza" + }, + "vaYJPAsTRvslo2qFOJt60": { + "text": "lomo" + }, + "vazatQ7CrYJFsorVDC5AC": { + "text": "león" + }, + "viAHJeLRr_6j9dEi5klj_": { + "text": "amarillo" + }, + "vlh1Pa6eA0ZrBs3vHzWH7": { + "text": "oso" + }, + "vmb_RMIB20QND6VcS0deY": { + "text": "panza" + }, + "vq3T-UQGTjX3Z9TlEF12e": { + "text": "mayonesa" + }, + "vy-O5Zc5kxY8d-7RROvQI": { + "text": "jamón" + }, + "w4cVxbBDZjeNyHwpBARHQ": { + "text": "hombro" + }, + "wBLnDZStKj8YLkg2pTCfh": { + "text": "sentir" + }, + "wCGb6D4xSVr4UeKXzGIlP": { + "text": "disfraces" + }, + "wcpXeLMBRusfqfrz9s4mF": { + "text": "puré" + }, + "whHwNRVnqeM7BMx6nppiW": { + "text": "tigre" + }, + "wkrNPLGWTqMIy4PJRW9QR": { + "text": "en" + }, + "wnfSUkF8-tQiRTVou1_pd": { + "text": "frío" + }, + "x3PNiU1NIeQ3zQa31C8WX": { + "text": "pañal" + }, + "xGsyYCjDzQugVzSaK8CuA": { + "text": "duro" + }, + "xIgPo3N-aKXhVcjultMiY": { + "text": "factura" + }, + "xPUYlxRxgFVn1FHQFz6Ic": { + "text": "secar" + }, + "xQblStUfyBGO27j15Sda3": { + "text": "pato" + }, + "xT4BPNmF-5WAQLfs3cUpS": { + "text": "enamorado" + }, + "xXtjQktuAq1bmxTc0HSQT": { + "text": "gaseosa" + }, + "xbPnUL4qxvm30VFYNphh-": { + "text": "tíos" + }, + "xiaTdHGInqfm4rD6XzSeZ": { + "text": "encender" + }, + "xnPF8fvkC1TvgETI1JcC9": { + "text": "órganos" + }, + "xqGzZJIHBeVfSzRfm3rmg": { + "text": "uno" + }, + "xxr0MRGYRmmoNC_gsD9uy": { + "text": "pasaporte" + }, + "y0SViQxW8Y-yiX1Z7gXWt": { + "text": "superhéroe" + }, + "y5W21CKOkLWnYJo1OC700": { + "text": "tos" + }, + "yJoivIPHOm1Y1lj-hGN1J": { + "text": "dormir" + }, + "yNag8CK0wV_iRMnFznsXk": { + "text": "pelota" + }, + "yR9FTtOimFwZG5g5tgpRk": { + "text": "visita" + }, + "y_5OURnKxFcv4UiMKntUi": { + "text": "y" + }, + "yihsjW9ON0Fr9Yy4ZlP9c": { + "text": "axila" + }, + "yk2wDVqHEKKwupgm87OJ2": { + "text": "nalgas" + }, + "yo00Ci8bSRFYPU6HxGVwX": { + "text": "cantar" + }, + "yqlmoVGItXqaeazw3M3eg": { + "text": "sillón" + }, + "yvtvSsBLhabkcpeYGbxQr": { + "text": "bota" + }, + "yxa6QVSrmWUKH2PZHKaVl": { + "text": "lechuga" + }, + "zANp2EnhT6n0Jcl1Xra6K": { + "text": "bailarín" + }, + "zAmesi1FcIWLXE3WVa9WS": { + "text": "antihistamínico" + }, + "zRTTg5x_P1E8Z3CU-oWXa": { + "text": "cualquiera" + }, + "zcibOHpRbSmz1hVNSjPTj": { + "text": "tenedor" + }, + "zdFC3vpgjcyUWB9a4ghRW": { + "text": "descripción" + }, + "zi_wcT10fxgn72ZJhVx18": { + "text": "vestido" + }, + "zm_6R89hr4wjuVkifiYrk": { + "text": "despeinado" + }, + "zrR1DbO_szgKvxLyrZquw": { + "text": "calefacción" + }, + "zw-o9pDectP5bxFnUjrJO": { + "text": "chancho" + }, + "zxhRDSHXtV63Sp3c2fjrI": { + "text": "aduana" + }, + "-k6dUC6thWPyULq8MVSe6": { + "text": "PRONOMBRES" + }, + "0geft4arn_A8kL-rfUPYc": { + "text": "PERSONAS" + }, + "1aM3sTxyb8yLSWtkn2MoO": { + "text": "INSTRUMENTOS MUSICALES" + }, + "384rVetrrLX4x4pJ0Y0Na": { + "text": "INTERACCIONES SOCIALES" + }, + "4e6iVOPLAjnM6wCMUm5P4": { + "text": "DESAYUNO Y MERIENDA" + }, + "6vmRBH4shBk3UQEUM6APX": { + "text": "CINE Y PELÍCULAS" + }, + "7Jm3bDhPInSlwhdy20dKF": { + "text": "CLASE DE ARTE" + }, + "7ngCuvmAnM_7ygpFQgLpk": { + "text": "COLORES" + }, + "7w5ACMFdOCTkBrS911MA1": { + "text": "ADJETIVOS Y ADVERBIOS" + }, + "8FPdnkMzOIBVTW5-TQxWX": { + "text": "PERSONAJES" + }, + "8t8CAggTj3HuznkKhfXle": { + "text": "LIBRO DEL RESTAURANTE" + }, + "9JRv4X68pAtwsFT3Ss0iJ": { + "text": "LIBRO DE NATACIÓN" + }, + "ByBvBUS7dcXldjzZOVFFP": { + "text": "CUERPO" + }, + "C7ClEHF5-Mcico4FvRxEV": { + "text": "PREPOSICIONES" + }, + "GD9YHeLktSsdZQvcoua6x": { + "text": "LIBRO DE LA CARNICERÍA" + }, + "HzPl-HvsrXL_QkGT38Ohd": { + "text": "LIBRO DE VERDULERÍA" + }, + "JKEk5TYykBK6ZeYND3Ron": { + "text": "CONJUNCIONES" + }, + "LWyfHr8Oui5HIShtZ_huo": { + "text": "FRUTAS" + }, + "PYTnUqCLwAbngR2Ozroc2": { + "text": "ACCIONES" + }, + "QQszyYRLL-otCQtRfbLzm": { + "text": "TIEMPO" + }, + "V6K3TniptOApMMGa8TspR": { + "text": "TODO" + }, + "VhfGFlHDcPor996rCzoK9": { + "text": "CELEBRACIONES" + }, + "WZYuZd331Hm5gHXJtUmBN": { + "text": "ANIMALES" + }, + "ZgZoyOg5K-LscXdfl6kQG": { + "text": "CLASE DE MÚSICA" + }, + "_Cw7FcJSYiterkLSDJH8V": { + "text": "CASA" + }, + "ah257x5jssDmLIOrcSGn6": { + "text": "NÚMEROS" + }, + "berI6X2_pAVCNOrcHAL6y": { + "text": "SENTIMIENTOS" + }, + "ce2z_EeEG2nH0ZS4KVAkA": { + "text": "COLEGIO" + }, + "dQXaeM3Uul1yEvRwJ4w9t": { + "text": "VESTIMENTA" + }, + "ejXQZAiYjrcSFGXb1pz7M": { + "text": "TRANSPORTE" + }, + "gybgILOLxmIVfeQtb1f94": { + "text": "LIBRO DE HIGIENE" + }, + "iHS1HpUBBadzgmbum_bdD": { + "text": "PROFESIONES Y OFICIOS" + }, + "jatDsecioVAxRph-WOg4f": { + "text": "LIBRO DE LA FARMACIA" + }, + "puOOrKWbYzH0B_8uGkxYX": { + "text": "LIBRO DE VIAJE" + }, + "puda9fUGjqvm9oSM6CpTk": { + "text": "ALIMENTOS" + }, + "rH7zhJzNVIcEIRyvaYLoi": { + "text": "DEPORTES" + }, + "uv4tWMRHfewaEQ_pH0dnV": { + "text": "LIBRO DE LA SALUD" + }, + "wAhDHMrZ850dHTwgAXrMY": { + "text": "CONCEPTOS" + }, + "xjfPlDs-AcFV9LCyY-v9j": { + "text": "JUEGOS Y JUGUETES" + }, + "y545pM8pvB3WgukIac6NT": { + "text": "LUGARES" + }, + "zwf7qmSEi7PBwsNaqciA-": { + "text": "libro de la biblioteca" + } +} \ No newline at end of file diff --git a/assets/languages/en_UK.json b/assets/languages/en_UK.json new file mode 100644 index 00000000..688f89ec --- /dev/null +++ b/assets/languages/en_UK.json @@ -0,0 +1 @@ +{"-2UbAou9ydr8XeN-jtIz4": {"text": "clean"}, "-GL2iAgykP10Ae3AKsVOX": {"text": "salt"}, "-LE2iv3Pwr5KuIyM5bYb3": {"text": "good"}, "-LwAKwgCdVkzwM579zRMo": {"text": "more"}, "-aePI8WknXpxEpz19Lu48": {"text": "his"}, "-msU3yor4qJYQHJtWrdk8": {"text": "pasta"}, "00AkNJ4YLpbRD_mLmQjtp": {"text": "lunch"}, "0IrLGI8Ebm8rcS3ymUXqS": {"text": "hunger"}, "0THELgiQ7rvA-orESXJfV": {"text": "plane"}, "0Vkmy6BZcJn3pFurEevL9": {"text": "study"}, "0Z7uFXpp-XRXmqM8ILhIC": {"text": "bit"}, "0_SK41wNOk6mw2qX_eHXM": {"text": "cinema"}, "0cdYDZ5HPaTmqTTN0_Ee8": {"text": "luck"}, "0fHziRVxg0oNDp5pyiI8M": {"text": "permission"}, "0fcYcD_r0jNWXTTAx8Ph7": {"text": "airport"}, "0gAyTD6sImo0jpD_bYGVv": {"text": "Thursday"}, "0huLn-H32Cbwba28IZ3tc": {"text": "bubbles"}, "0jpMJu8isUmOZKxhZ_yaj": {"text": "equipment"}, "0pFtmDZdlnLrUkT_XZDXQ": {"text": "before"}, "0qoQs8WyLVONnu3_eBGfD": {"text": "headache"}, "0v5fqIp8GmXsIHO0SPhtt": {"text": "Go ahead"}, "0vttFf3nAGDW6g5wVStcH": {"text": "sorry"}, "1-VwcvzNfvrwDWRGxRPre": {"text": "neither"}, "10X4OKR5xmNhSj86sbyE_": {"text": "sausages"}, "14aCIW665UZtuwNsKKV5s": {"text": "pencil case"}, "17AkRFlfC_koV-lywmDE8": {"text": "Shorts"}, "1B1WmC-V0PglDeRAeINcT": {"text": "look"}, "1DjW-XvWN7iOqoJPRSWwY": {"text": "evil"}, "1IjenNwPwsMIWZ4aYBk8S": {"text": "game"}, "1Ph13Z_Ya6p-q0WA7pSl3": {"text": "bird"}, "1QEfLU_S7TM0iMr9VZVtP": {"text": "round"}, "1Rv9-SSJjHptwvzqLbdbx": {"text": "fun"}, "1WJZO-pUkTaQvyxz41iB-": {"text": "chopped"}, "1YOlJCovdcnnqVihqHVmq": {"text": "here"}, "1b71P9YjaNWnX8AWjstqG": {"text": "T-shirt"}, "1mS8kgJIod1cyUFH-msnM": {"text": "season"}, "1mU2ZosZXSJrxkh1NmxJT": {"text": "left"}, "1nhsReHG-f-bW-xaZBsxY": {"text": "below"}, "1pb6S-RR_3zdCq77YFiZ-": {"text": "how awful!"}, "1zU7kolOKsHP9-oomQW1Q": {"text": "king"}, "27GbVOZ-szdnzsy92oY-X": {"text": "butter"}, "2CgcUkvJUskv982FvG54A": {"text": "money"}, "2HkB0WZYP7cvWLD39GMQj": {"text": "shower"}, "2KO0BFtB4B6fu1feuAZLt": {"text": "verbs"}, "2RZTRMX56BFLrW7tLJ3Hy": {"text": "same"}, "2Vc2H462cutVtUC-5omJk": {"text": "few"}, "2dwtZO2wCm520GPD1i6dl": {"text": "sore throat"}, "2t_eq1JmgHa0R3eu8LMmI": {"text": "fan"}, "2u2-AFuI245I7bZ6tsSPh": {"text": "who?"}, "2y9pxVOBQ2tMdPHcsqQb8": {"text": "Tuesday"}, "3-ueUrnwmIIj0BMP8_Ntb": {"text": "a"}, "32PnZjlnQbTJo4nL9YJYe": {"text": "happy"}, "3932Zm0xgk1hKB2hhBAUa": {"text": "bus"}, "3KbwCHGooNLySWOBlFFuG": {"text": "kitchenette"}, "3KgKNNnuYMrysEDs3Pu4Z": {"text": "caption"}, "3VEnVjaGFCImBAZ3wEChu": {"text": "clothes"}, "3arbCGI6fMOWALLanZcg3": {"text": "cappuccino"}, "3dtvYLjbl5oDyhZO9eFRY": {"text": "they"}, "3mwcdenOurU_e59ChLqb0": {"text": "out"}, "3w62N9b7Cvb6JMjB9Wphi": {"text": "to drink"}, "40q0NJ6vsziJDNFBqho7Y": {"text": "inside"}, "4A_FNkGH1EDu0oabPurrL": {"text": "cereals"}, "4J1bWl6BbbEdZsRGsgYH2": {"text": "cheese"}, "4X7OXm35OSHoSlPxGUi_f": {"text": "furniture"}, "4bHGIoQmDN8LptpdNN4v6": {"text": "vacation"}, "4f1vqDoAvUu2XYk_JlQdC": {"text": "seven"}, "4rctwNiN4UaU9lqU48MHG": {"text": "computer"}, "4rzonBodQXfs77gALnAP_": {"text": "beer"}, "50wJdR0-3YLnv9y_2Gx_e": {"text": "hop"}, "54BVjn2seJWdBNGI20-yJ": {"text": "computer"}, "54taab8z9ziXt0IqXHkV9": {"text": "fingers"}, "5L5UzBHOzuHRoO-jyPuEx": {"text": "city"}, "5LYjhk-N87Ov9NrQcGbLQ": {"text": "oil"}, "5Tdy0Gu9SiLsPfWwd-Y2E": {"text": "nice"}, "5VBtwEswIjrv1zbXP-oFn": {"text": "soup"}, "5W5_sCAyGTkVzguCEg1d1": {"text": "juice"}, "5dvq344JstkxUpHszaPfp": {"text": "Dolphin"}, "5gPT9lrNgpRkF07lP6zOq": {"text": "Apple juice"}, "5i3kSsCKF7Oa9iJQvXiTe": {"text": "more or less"}, "5kjlzqb9Rf3zzqZROaZ9p": {"text": "lose"}, "5mGrGHzdw_vCwYCRNPcPw": {"text": "sightseeing"}, "5vxTXbPl4Y0yezGu7p1f6": {"text": "do"}, "6KicPX6y_u2i6tPBZAtvA": {"text": "wash"}, "6jLkKc9OL5btNOmjJem6S": {"text": "put"}, "6lYN4qSZx3_tKDClp4Iyr": {"text": "between"}, "6nhNeVjDfDi-GmreaqfVo": {"text": "cloudy"}, "6rcOXG6yxpzHLzMJ9IayI": {"text": "close"}, "6t2sPdapSNJrOziDozTWW": {"text": "cow"}, "71l2at-8480bvijxn3uBl": {"text": "during"}, "75gujwNXJdAiNmK6Ffhia": {"text": "juice"}, "79xBF6cKgKeD4GeBPe_Ds": {"text": "bag"}, "7EsVGfapPc_38mHCBy3C3": {"text": "in love"}, "7Hz61-WzV62FHsedOwz6q": {"text": "custard"}, "7Q4Zc0cenSF5U4eKyje1f": {"text": "toward"}, "7Q9sNljseWjwSPW4in1ga": {"text": "reception"}, "7VL_MgnLDY6hi8sbvcGIg": {"text": "silence"}, "7WxUVoVQfQOzARU2bf6HP": {"text": "home"}, "7iAXKVm22uMgr6aqZ1rr7": {"text": "grandfather"}, "8-4M30dTtmuUJus9MtGqV": {"text": "booger"}, "81UJI7xOa5l9mVceqkIP5": {"text": "be cold"}, "82LicIQc3K2xCTEt-iMpu": {"text": "snail"}, "86gNdF6aTepa0Y9zkD1VQ": {"text": "field"}, "8FFwIw7rJri79BITZBUzm": {"text": "hotel"}, "8KlFB3an1mzdQd6-LGCCE": {"text": "snack"}, "8LddDqylw-51wHhx9_Qad": {"text": "book"}, "8MV4ZFthtUeoxLAIbqGTc": {"text": "meat"}, "8cOIYr-hcK54qWpuT-41e": {"text": "tale"}, "8fGingRAd8idw4qcxyZ-Q": {"text": "shame"}, "8iFdjRTQU7ONGnigRTlm8": {"text": "how much does it cost?"}, "8vR0HYniXtrrQqqSIN_JQ": {"text": "family"}, "904w9Je6oDwGXUCIcrUZX": {"text": "language"}, "93YmZA7VfAT7TTNTsDE1W": {"text": "series"}, "93hsW10TmX3Vcq_4IvcZ0": {"text": "white"}, "93tHieC_CgZqN998y5gAv": {"text": "chop"}, "97nIv-aoc51T8kKTZV5cM": {"text": "saliva"}, "9EqfwMNtATh1fwMhyn_B1": {"text": "good"}, "9FiWvg197C-Riid-DVysN": {"text": "clear"}, "9GqE148SFZqMIft4evAk2": {"text": "eat"}, "9MzeUcz1nRqleTkmS_-g2": {"text": "ship"}, "9QyJdpUn0f6g7FxWs5qpO": {"text": "cut"}, "9U8MzceIsqKhG86oNx9zV": {"text": "car"}, "9UwpyOnOBoqr4mX3Juqm2": {"text": "Good afternoon"}, "9ZnzbKMDwGEwC3hXOhXFe": {"text": "tablets"}, "9dvSIpeXa2_12Jip6noJP": {"text": "sportsman"}, "9kgRI3KlOIVSuylKffW9g": {"text": "colors"}, "9lS0mNuKIS0olyDwoIJBR": {"text": "doctor"}, "9mLx-YMK81AflitELQFqk": {"text": "paper"}, "9s5zV3_oGyDx_NEvsKCxX": {"text": "fiddle"}, "9wE9Py6ztyqDrtaypsltA": {"text": "orange"}, "AOp6VGyjYIV0Ym9d0basJ": {"text": "draw"}, "APXF-lEplPOloppSeIjAY": {"text": "less"}, "AQKGKdoX5CYycZ2YqBZVW": {"text": "cheap"}, "AT_rDWsr6xRBgrvgw9Zih": {"text": "nine"}, "AWJXh6URGN0Vwm66i6IvL": {"text": "hello"}, "AeFbJQ0M9uTObAlKEX3zr": {"text": "leg"}, "Akf0xlH8UJdXn8BJzPV2A": {"text": "radio"}, "B1845IfYfPMz2FWpVFIQv": {"text": "of"}, "BKmATW2uBk4pxnmOaARyq": {"text": "documents"}, "BNjZz9MGLJEKZ4CZoTs2M": {"text": "chess"}, "BQhqx1PuF94jwT0ySTlbJ": {"text": "meal"}, "BQm-YCPc0lfD1-mhecCTL": {"text": "I"}, "Bebnh8-UWwtYLnK6p3fKi": {"text": "black bread"}, "BjqWZnzLlxdOo4KEzZ46j": {"text": "eight"}, "BqS7d4PMhGRqPYlZQzUbR": {"text": "door"}, "Bub9ZYygLcly15D7_wYks": {"text": "friend"}, "ByrvXHEN9Mb8D--7MQAjM": {"text": "teddy"}, "C12mJ1W11fODI3pv1QOnx": {"text": "jelly"}, "C29KJ8BTFavhj_R9UfnSv": {"text": "by"}, "C2bgADoxmINRnAiYxZHqd": {"text": "cabbie"}, "CBTemIvgIN1UAtftkc3sz": {"text": "paste"}, "CCWCtXdMuQBJRmaFOAlfQ": {"text": "Christmas"}, "CY-IQvUehkaiGFCdKf9bf": {"text": "sausage"}, "CYH_6DL9q1iLLetuWeR9A": {"text": "have"}, "CZrETqLgQlvDkLHvw1t_w": {"text": "to"}, "C_JKGNCxOI5x_f2C4qAyZ": {"text": "peanut"}, "CbO32RkDdf9aCucv6BnGS": {"text": "goat"}, "ChBc7LjL8dgzZ6LUCAHGh": {"text": "please"}, "CkTiaqBY3jf86JRq636lt": {"text": "which?"}, "CsKZSNiJw5Q48b26Kskf-": {"text": "hero"}, "CxFmyJYmy6gMRqP9U0cBP": {"text": "I'm lost"}, "CyKtU9yC0Jy7Ypb4WFp6w": {"text": "dog"}, "D1gCni2jXpCvKZe4qCtQN": {"text": "fish"}, "D2tSkngqbQmdKLNhn9xWV": {"text": "balloons"}, "D7dt_hFX5DScV_ssm1nKz": {"text": "grapefruit"}, "D85FU-Wqr2u53tfTXAtHo": {"text": "kick"}, "DAq2J_xXHsSCSNPp9qVsk": {"text": "smell"}, "DBd09yUlbkaYLsemjFXEs": {"text": "frozen"}, "DG1RiDjDfwWRhpAiIpPqA": {"text": "threw up"}, "DSgrhLHauub-gBqMGwacO": {"text": "scared"}, "DXb0FpjVM9q8LVl9vvSHn": {"text": "classes"}, "DXpjgLKTdx9eLLohVdmWM": {"text": "greengrocery"}, "D_4Weq7iyi7GMEsgP0xy6": {"text": "tea"}, "Djs1QsLNf8Q5LBIFV5zNC": {"text": "sheet music"}, "DkeHJFtqAS005fYUrl1Xz": {"text": "pants"}, "Dm3yiKSB134LrjtW_KrO7": {"text": "good day"}, "DqGa4gqd2ABDi45BT43x4": {"text": "princess"}, "Dv9MSCRYbR4Q3K114wXki": {"text": "high"}, "E-vUPARie8MmfgZwv3Omr": {"text": "rooster"}, "EM8VyonJ7WNdvmRyE3nhZ": {"text": "slow"}, "EO4O-s7oafi6QJdxTFNkd": {"text": "decongestant"}, "ETZNYbrG5wveDl6c9k2_k": {"text": "elbow"}, "EUsNyf5bDdSLqvZKH1Ltx": {"text": "I don't understand"}, "EVmt43vDI3NHFfbbkqokF": {"text": "pizza"}, "Erg6LuA8IOQ5V8RTP3pPi": {"text": "bee"}, "F4cGnA_QHsVKTjUE6MAu9": {"text": "Mameluke"}, "F7kJ8VM31BWB4K4T4USzs": {"text": "physical abuse"}, "F8roVYxKZi88UUGfOvTwl": {"text": "teacher"}, "F90bXbc0tz9nuzTT7SgqV": {"text": "four"}, "FBPIabyaoCK-Y0BziQdji": {"text": "stomachache"}, "FBTheEQmZZfJRiYjd_Np_": {"text": "interpret"}, "FO77qpzyz28knodNtILCA": {"text": "flush the chain"}, "FTngK946O8S8bYc0g7vM2": {"text": "mother"}, "FaVvbVzZivuxTwxJTPubK": {"text": "siblings"}, "FfNU04I4mZ54gWcBXqo2c": {"text": "bacon"}, "FgTird367surh-vxXyAK6": {"text": "ticket"}, "FkC5DtSV81OvFMU99qZGg": {"text": "ball"}, "FnCBoLSE19WsbUypUKvFc": {"text": "hamburger"}, "Fogupb264IyCtbZ-Q2D6w": {"text": "drunk"}, "Fvm2C5NBq01tm0QK9d9QM": {"text": "children"}, "G09TvOzDSG5m3hTQD9Tej": {"text": "delete"}, "G2i9LSK4A19237Zp1vXqF": {"text": "chubby"}, "G6KKVMvPDnjdD9TfBd-B9": {"text": "beach"}, "GAxX7EIz1TTLtMX08RRGr": {"text": "Burger"}, "GJlUSznzEHCgoAOrVrkp9": {"text": "happy"}, "GSEumxiyeVKRRiaY_c8HW": {"text": "crawl"}, "GY_flM-6uR6X3L4AwsiwU": {"text": "for"}, "G_CRpzxWO5XdEMh01O1eJ": {"text": "although"}, "Gj7THa6XFHDfYL5H19lwj": {"text": "tomorrow"}, "Gm_qAGnL4OawmlYmTs7K5": {"text": "I do not see"}, "GoJuWnn72TCXONXKtYHMm": {"text": "train"}, "Gvmy--9DiUn_tkQYWeWhA": {"text": "cannelloni"}, "GxrDtsdGcLepdsQr6V9DT": {"text": "green"}, "H2zMVtjvqi7aUtCypiVKr": {"text": "sit"}, "H8Bsrr2NK9Q3WGbEp8PMe": {"text": "silver"}, "H9SWPnWbR8qcZA-iu5Mz0": {"text": "earache"}, "HBZNu6m3FELU9eg3OeLdx": {"text": "curtain"}, "HKfLJS8aCBtKuKJeSBQUW": {"text": "bang"}, "HMPabuHqgtyiCmTLzg-rM": {"text": "get in"}, "HQiQh4PPBvO1n-d7JGVj8": {"text": "nobody"}, "HTBNWax6FCSGXuboGsVUW": {"text": "salty"}, "HnuZA0UTlnuIfFAN7saxl": {"text": "rabbit"}, "Hvb4JdDHX_vNMck_US2UN": {"text": "test"}, "I5AJgba5GTdEjdpFB-LBf": {"text": "chocolate"}, "IAdQsjTsbBUAMjlwW34cw": {"text": "I'd love to"}, "IEeIvawUD2GIAr1Wypr9i": {"text": "people"}, "IF3R7tLVAkd4RbL8R07K9": {"text": "actor"}, "IM8OUKCzHwnjAQWPFgnn6": {"text": "far"}, "INxOSvKbBNOXwruIpuNho": {"text": "belly button"}, "IO8uTb1K7ElENgp2ujZoK": {"text": "robust"}, "IXRWmFmtqfnHQRcBf1Idl": {"text": "pigeon"}, "IZbfYRzu2cxxDWdbmQeqw": {"text": "head"}, "Ig1oypuwndODbmKh_NEXs": {"text": "swimsuit"}, "IsWUeiPnDEnzxePKclBNp": {"text": "ugly"}, "J3qQMp0OMr5LC9ebfArxH": {"text": "none"}, "J3rDL96c2zfBQzP45VRCp": {"text": "lemon"}, "J4UUPR-WP0qo1y14bUVI-": {"text": "vet"}, "J7MmgugOu20UtMcMPj59r": {"text": "song"}, "J7wLwBLVx4UANh_x5HdXd": {"text": "according to"}, "JB9SIxWzxWFjrbmMuksrY": {"text": "laugh"}, "JBIehRNmDbK2ALcRN0u9i": {"text": "rooster"}, "JBKQaBezKuSDaMsnbJMTB": {"text": "bar"}, "JBU2hMw9gbIy9-wGF4mjD": {"text": "board"}, "JDbBWMB5No0pK6HvntLt4": {"text": "wash my hands"}, "JEDIYq1BDA23ac9TNhON-": {"text": "aid"}, "JFldbhjqxK3fD6D2K4HY4": {"text": "dad"}, "JGm4BL7HAfuxX_PGe6Jzk": {"text": "present"}, "JQOpcZSCPGMOWZsN8w_yb": {"text": "what time is it?"}, "JSFuEHlP-CFvuqvFKMumC": {"text": "toy cars"}, "JVtu9W3AumOwjUedwhUGE": {"text": "rehabilitation"}, "JZRBfIXBkeuobtDXbLt5t": {"text": "bye"}, "JawnUo-pseWb3FDVMtxrQ": {"text": "yoghurt"}, "JblWXW8TKDCuYu2yTnFBA": {"text": "table"}, "Ji5OVFX-uNDewL8eX8Cin": {"text": "think"}, "Jjq8CM8JrYHIMziuQy-WN": {"text": "diary"}, "JziaulL-lrAPGNVvwBPK9": {"text": "summer"}, "K382TlNZjdMLLpAhCCXLG": {"text": "almonds"}, "K6hd20tWZfwwlYYi7jctt": {"text": "delicious"}, "K8cMIDL0ubQvWhhDtr65F": {"text": "cry"}, "K8e2-KkvZfFOQaXnhR37x": {"text": "tired"}, "KC18_sTEqKucPQ-iwEKYY": {"text": "pencil"}, "KK_i8H9qTfDVYZkQGwd2v": {"text": "to turn off"}, "KNH4sLRpVKtHXQa-0y84K": {"text": "highly strung"}, "KWYVDZiERE8jtRsL0faHH": {"text": "swim"}, "KXHW4m6vXxQU-AEOR4pZ4": {"text": "soccer ball"}, "Khdk8mWpyxgLqfC-6lyT9": {"text": "donkey"}, "KhyTKtiL4ZT4Z1saU1eJh": {"text": "listen to music"}, "Kn9vE07FK1LrzoD_YxrJD": {"text": "meter"}, "KpLFOrpuhFKaIbBbFwVVu": {"text": "butterfly"}, "KrOPANVpdkBWdEZoUwxKf": {"text": "serious"}, "KvY6Taigm4Va_cVjXAfGR": {"text": "short"}, "L0hfYADgzghRVsZLZHRxE": {"text": "dancer"}, "L19r487_d3RqWXiNuh3gE": {"text": "What color is?"}, "L6YLAEsbYcTq-ycQJTvt4": {"text": "chicken"}, "LAuEISciEf1Wc1j4fERz8": {"text": "new Year"}, "LDoi3cxodn_AVKSG-Bf_1": {"text": "eyes"}, "LEVKlDlJ0wHo5QEjCNAGa": {"text": "glue"}, "LEg8z-Q-ONLAAXd-aH_Hb": {"text": "low"}, "LNBTW0qQtHYQEHatkWGtc": {"text": "market"}, "LRIKzfm9ZsdNe1u7CUuW_": {"text": "how many?"}, "LRfh-4RAZTj7cnnDwBmqj": {"text": "float"}, "LU7IoUksATEBhd8PaHS1R": {"text": "take out"}, "LaKT8VTw0_6rvordp5-R8": {"text": "pink"}, "LiBr37yi-YBgQDx4unjyc": {"text": "give"}, "LjTGOcyG7DkTs1lJqNr8w": {"text": "hair"}, "LksmOMPPOMArbrFsscqOW": {"text": "music"}, "LmGq1AZs2a0x26r7E9GUj": {"text": "teacher"}, "LngEMJa_ihV8mB7afZX-h": {"text": "they"}, "LrDai7jXlGAdZ3e8ZQezj": {"text": "pee"}, "M5q2CXmK0_WVaVUB_HJB3": {"text": "hot"}, "MEqo2TROHyroK318sm84f": {"text": "pasta"}, "MKR-ukiUlJy4uuqO30UU6": {"text": "verbal abuse"}, "MMzjhHID8HMqyPjii5o-h": {"text": "kitchen"}, "MNCcHiImRS8tmvhBhzCKj": {"text": "salad"}, "MQHnvvU48NnEptP8a9w8C": {"text": "I don't like"}, "MWIzTM6zhTWL1V-brLtBx": {"text": "comfortable"}, "MYqfOzKx2qMHop8GaHs0I": {"text": "light green"}, "MiOe5_Djf-pE9V9aDZ_1G": {"text": "pineapple"}, "MqQgYn5B0uV-DMORCBOmV": {"text": "sad"}, "Mw6WRebMAKWwXfAvDA7vu": {"text": "be hot"}, "N2baGNTOapSaFDo1GURiW": {"text": "I can not hear"}, "N7n4zQIkJZOhaYESk2GgH": {"text": "fall"}, "NFdUTit6Ff-4S7Nzf92U5": {"text": "constipation"}, "NFgGqhEtl0HqipCGGEvwU": {"text": "comb my hair"}, "NKQwWPAsVHwFBWuksqfns": {"text": "shower"}, "NLi5ODIzyMAwr2HpDXACp": {"text": "nose"}, "NQayjogCYiimP_0OxIfFj": {"text": "shoes"}, "NVe4u7BTAVfLk3xkDqLnZ": {"text": "oven"}, "NVjfEut567uXpTaQUNI2i": {"text": "jacket"}, "N_893wsadpGg3Ip5sEThe": {"text": "blue"}, "NaJxTPq9Ld8I4fwAltyEC": {"text": "corn"}, "NjulpZ9x63ZqxtLMoRjkx": {"text": "turn on the light"}, "Njz8DrErsexBu8mAI6mnr": {"text": "fish"}, "NmNouLLx13jzE27jliI_v": {"text": "teeth"}, "NuhUikdCxP0NgsbO0wvAU": {"text": "row"}, "O-CLnVuXAUapOn6TbdhKx": {"text": "want"}, "O450x4W3OOacvJIy4QicJ": {"text": "legumes"}, "OHyrmD5US1rHEAEwLQaII": {"text": "animals"}, "OKXIGnLh-i1ydTNj450Q8": {"text": "queen"}, "OUcfOOReAfQroBKlBdDb-": {"text": "Saline solution"}, "OWLDc7Hn3neBAf_V_N27n": {"text": "fasten"}, "O_ZfCPZSxGMPT6orCt-O6": {"text": "pig"}, "OblxxVFC-LKPq-8oC9FpE": {"text": "feelings"}, "OdCdTUAlbN6kvsPjby_Bi": {"text": "sports"}, "OeA63q6LpqGvXW-cJXEym": {"text": "ham"}, "OeytAsSiEAWC10tXhxbTa": {"text": "characters"}, "OhrHu-xLo8hcn5plWfoX4": {"text": "expensive"}, "Om1Bvqu8nmGuNGwV8hndM": {"text": "low"}, "OvyFC1GHkvJZ0dAAF1QkY": {"text": "he"}, "OwHzJdOQTFOA8daCVRwm6": {"text": "Brush"}, "P5zdq4x58yp5TA_soKQEJ": {"text": "bicycle"}, "PAlC0XSZNru3-LXtfvGjo": {"text": "make love"}, "PBqpK7LL1HQPwowPitrss": {"text": "read"}, "PFAi3SdvH9vL7_Bg3MhCA": {"text": "traffic light"}, "PIBHv5VueBi-sf5qFCN_Y": {"text": "in view of"}, "PIPQnVS2UiS7kGbucJP8l": {"text": "cure"}, "PLXxIPYyztaztLf4sPCst": {"text": "throat"}, "PbtM3htZocZb8YifuPoY5": {"text": "crab"}, "PfNLmlHKFT9d1w6IgeXbU": {"text": "remote control"}, "Pl-M4bc6k2rdhu6FHEbkA": {"text": "yard"}, "PogTYrGfa2WNfBRuA8O4e": {"text": "bad"}, "PszHdOxMsS_tAzSrN52Wa": {"text": "clay"}, "Pw3GgPwp7fpDVC6wJjgPn": {"text": "increase"}, "Q6LQqdLcvNOiCFjC0DVo2": {"text": "drum"}, "Q6nNH4AIoSeDHODC_Ip8O": {"text": "neighbor"}, "Q9Ra0aJaQnOJQ1Kqdc43-": {"text": "baby"}, "QCQRmsQY6AggjreY9Z0MF": {"text": "decline"}, "QGf1Tb1roL7HAXUSrRqRJ": {"text": "orange"}, "QJhkOh48xapiTObEDQLB9": {"text": "piano"}, "QTkFHWp9KEDgfCjoQjBY2": {"text": "plurals"}, "QUTQLuD2Gv7fHh0V_O5tg": {"text": "ashamed"}, "QVqSPPgA89whFTJ0HTphK": {"text": "open"}, "QZNQOaf0SdHDbx1otCmrH": {"text": "child"}, "QcGJ9u_JqmrW0X47PXWH4": {"text": "disheveled"}, "QclUM2p3iexSjFZI8OU4-": {"text": "fever"}, "QeqA20MCXB-zNfuKIssMY": {"text": "can of tuna"}, "QllvOUe8utZrcBRGw_0vc": {"text": "band-aid"}, "QnlQ1HOEB9yNjuW3Dd6fc": {"text": "celebration"}, "Qo3Qn_nMe3E6EqNw0UdNZ": {"text": "sunny"}, "QohNih4wgqjnpWt3kSwtd": {"text": "coach"}, "QvaMxPy-3iixHAJFyIrN-": {"text": "sandwich"}, "R06chAQYswLtQK46OInW7": {"text": "milk and cookies"}, "R9ECa_HQRtpFrb59ebMTQ": {"text": "school"}, "RBCjBvNXQSZOOpg-5lBlK": {"text": "Well"}, "RZfMOtjw0DoGHWaRfCEc4": {"text": "pants"}, "Ra2rxEEohwxRqDsW2AT3C": {"text": "video game"}, "RbZetbSC5064rZccOFD1D": {"text": "television"}, "RkpoG4KB8m_TJFJf2v3EG": {"text": "change the channel"}, "RwlZ1jr2Ix3evzrW71lN0": {"text": "apple"}, "S3um53pcko7_BPHy7R6FL": {"text": "us"}, "SE-71I_ahm3oKROReyJHE": {"text": "to poop"}, "SOyGnJXLPeVRoZy3vBgpK": {"text": "exam"}, "SXz8iA1Qn_BlgLTAG6Epl": {"text": "dinner"}, "SiOmZdwX8Hf2nE2v6HfCp": {"text": "shoe"}, "Sp2Ias_Y1HplkHWjIb7Mp": {"text": "without"}, "TAbuXSnSHU6C3CQ4kbKVh": {"text": "triangle"}, "TBV2BhoZVgl1jMV_jWZYi": {"text": "right"}, "TIgoS-YONIwzbrImXetaD": {"text": "plum"}, "TIsM6aTTZ9W8j6UhW9Qqj": {"text": "chorus"}, "TLxsYdrBdHgFZkNJtVTmK": {"text": "tortoise"}, "TP-gGRcpcFyx1SrNRsdRV": {"text": "sorry"}, "TR5CXN8-pfbWkshdxSBSV": {"text": "sheep"}, "TS9z8ZmMEwn0MGSfr9amH": {"text": "avocado"}, "TZF-7m8VKZ7IL6pyv0Daf": {"text": "brush my teeth"}, "T_Q5c4XAfkhkclmnCGHo5": {"text": "until"}, "Td5pgVQDTFOftUgOJ-bD-": {"text": "spicy"}, "Te_jJfeU8Xwa9St2RihBq": {"text": "blood"}, "ThqkHs4az5tgLqLcfFPaZ": {"text": "long"}, "TpPNZLsh5jrN9RdPFwmA7": {"text": "brilliant!"}, "Tpj-Fs8LQ566TM0bYlZ6H": {"text": "Friday"}, "TuAjBKPp3-PSdQuooSWZi": {"text": "frog"}, "TyqVzfOniQNa9WKQRXqr-": {"text": "sister"}, "U1KQsrvTa2E00-ugc-Iy6": {"text": "absent"}, "U6PoeH-cMdO3ttnLkN7_3": {"text": "ride"}, "U7GiGcYacowWi4MWrCYyj": {"text": "anti-inflammatory"}, "UQ-5wOfR0tDzljoDjj2xU": {"text": "autumn"}, "UQ5B5K-tpk1XmQC1B9TjQ": {"text": "No"}, "US8_vYTnDfxBw2Ung_J38": {"text": "Private parts"}, "UVzdJiqY36fqgBYyz880c": {"text": "raw ham"}, "UXJDiwb3j_zyfGa26ByJL": {"text": "chest"}, "Ubaq6h7wasdP_YRombm2c": {"text": "sugar"}, "Ugs9V9c2c5iHrVC6p17zr": {"text": "analgesic"}, "Uk1Emn5IovsTfFzpQX5Jw": {"text": "support"}, "UkLF5sKtVKW0D8RzVCoue": {"text": "firefighter"}, "UnQJwWfWCe40DJYR1Er0o": {"text": "pain"}, "UssSOEEKutvzB_B4fAQE-": {"text": "LISTEN again"}, "Ust3oadA0PUGViYo28Mf3": {"text": "walk"}, "UvRS0KmtZn3dq7e8L5RcE": {"text": "angry"}, "UwvZVcX_CAQFrI6U4LsNT": {"text": "egg"}, "VJ9AU_y7CqsONR6TvhdLh": {"text": "where is?"}, "VKrLGgYjc-nLPGsyESDgb": {"text": "Canary"}, "VL4pd0vnJ-CNfMg9bCNed": {"text": "aspirin"}, "VUJ-zrdsyL9MOuFbdMCAx": {"text": "dizziness"}, "Vioyf8EXJfY5t34NnN0WO": {"text": "tablets"}, "Vjlet5P7XuqTrc22nt_Zz": {"text": "water"}, "Vmnu5eormo-_TOCgF4YzG": {"text": "cough syrup"}, "VoZumy5GtnRdqSOmXAw7j": {"text": "prepared"}, "VrC7AnovfA7VzmYESVc8L": {"text": "discuss"}, "VwZ4EKSggYWxlnAbp-pNB": {"text": "sick"}, "Vzov0z9acB-I1_W_CcFcY": {"text": "red"}, "WDUIQV43zghFQq_rSk1Z4": {"text": "fillet"}, "WL3ZN-W_zgnuTJpuqz0YQ": {"text": "the prince"}, "WNhpmD_XlTaNEBo7GsFXu": {"text": "diarrhea"}, "WQ0CNIQ_gjaCxg4tEIsOo": {"text": "nailed"}, "WRzleD-mI84LaimFH8h6P": {"text": "hear"}, "WUt3I-NkdbqlSVcwuLfFx": {"text": "roller skates"}, "WWK2v56LM-zWqujabk9bM": {"text": "plastic"}, "W_f7h3qOLl2uEd_OYpMfQ": {"text": "police"}, "WasZ5bKZZy5Jt4Y-JipxS": {"text": "bikini"}, "Wgh5iCzUmx4Je-B85-pra": {"text": "refrigerator"}, "WjXQhSFPpz42ZUyHvurYG": {"text": "cricket"}, "WtYSntcy2CijEORmROeaj": {"text": "quarter"}, "Wu47Qs6Zupu1Ox2gUhkxn": {"text": "room"}, "Wva5W8GA0dHzyt2_0FPdm": {"text": "brother"}, "X0-Tf-KR24qEkpGDzG2Z-": {"text": "yesterday"}, "X3u4pXTWKcGc43lOkgSBt": {"text": "compliance"}, "XA952Z60D0-cesNCVA-OX": {"text": "bye"}, "XC5fIljJ819OYpllYTjpE": {"text": "giraffe"}, "XN0nzhQyHVOhuYuNqrp8g": {"text": "peach"}, "XOoGN6huCjVHxH8hRFAw1": {"text": "white"}, "XY6ZCNzeJIEzLtWJcufJm": {"text": "long sleeve shirt"}, "XYY8SV1IAMHjdGjMZxbdy": {"text": "basketball court"}, "XeVaDdUWSEkhfJvTVvUHR": {"text": "go out"}, "XnocVMEeUGCSnlnusP44O": {"text": "grab"}, "XuAtFop5_JNSYiZkUBzaU": {"text": "cook"}, "Y5HQq_4crSF2lpwH-KUrt": {"text": "two"}, "YCu-B26PqjE30AhikHdkI": {"text": "Cartoon"}, "YIP0Xc4aJsfv0s8BpiQnn": {"text": "five"}, "YLKXFZ9ze9K9NvJiAx8w0": {"text": "that?"}, "YbrNtdUmyMNdAF5CfvY1A": {"text": "towel"}, "YbvMRsCtMbww8OQgF45QF": {"text": "cold"}, "YeT-jstVSA7-mD9t99Isg": {"text": "puzzle"}, "YusWY8GwdO43bSp1o3BWC": {"text": "annoying"}, "Yvxm8RGoFYKUsIXOl33yR": {"text": "turn off the light"}, "Z5-sBklfLIWE00CJ_T_ZK": {"text": "spoon"}, "Z8xp3kxXuhMVoNm7ddQSX": {"text": "launch"}, "ZA2C4bJaL90lBxsTemYWZ": {"text": "pool"}, "ZAnmv4CLb7hldYUlp2wJU": {"text": "none"}, "ZBIFtTq-BH1jv5jLbzrhj": {"text": "repeat"}, "ZQEXAf10BkoTvCJx3Ox39": {"text": "surprise"}, "ZR-NXJk3SD351W-95cf_T": {"text": "paint"}, "ZRYQmYRGKzheBqk11eGRZ": {"text": "whale"}, "Zm4OIanIKTigDGIsInO7o": {"text": "a supermarket"}, "ZnMba2r4XIg9lPi_H2d_Z": {"text": "Yeah"}, "_1lOt0C0MQhvU8QWC6_oZ": {"text": "good night"}, "_2SjbH-xHZq173EU4J65c": {"text": "park"}, "_3ihCSMQCokXNo8pXii-h": {"text": "call someone"}, "_8RIOebHpkr9nCy0_9qhP": {"text": "call"}, "_CsJMxqGcNSaujXwRZcpu": {"text": "anxious"}, "_FNTsoEjTMV3Uas-gggi2": {"text": "stress"}, "_HUf6SR0mTP7v72Y9_4gw": {"text": "fire engine"}, "_Lc2-NNL69ZX-aVnUNzgx": {"text": "Strawberry"}, "_S9Eck14cdOTr0QH4i7sQ": {"text": "bathroom"}, "_WIT6qs1kaiJqB1Ild5Xs": {"text": "walk"}, "_eug92AvR1UXpYlfm6o_Q": {"text": "golden"}, "_hqTU9A7I3RFDVrcIEK-L": {"text": "%null%"}, "_lU200bb9Sjv0b_iJKgU2": {"text": "a bike shop"}, "_tDZtalMxKSNpWydJ1aeW": {"text": "zero"}, "aC_XP9Ch5PqWoCmcJwI77": {"text": "cotton"}, "aMs2YNnWkw4XN0gAm-jI3": {"text": "drawer"}, "aP9QisUdxhgOKIQ2kHNb3": {"text": "chard"}, "aSzpwNza22HZp46Sh6wfx": {"text": "dirty"}, "aTwzShtP_zR9x6bSGSzEB": {"text": "chicken thigh"}, "aXLBXkENJqTYkyZOP8TNS": {"text": "you"}, "aa3xDW6F9YUKyX0fe5uX8": {"text": "backs"}, "ajesFjbC7hwCNLKdif-ix": {"text": "against"}, "ak5fBauJzapC4JIf0lT8N": {"text": "hill"}, "alsoa_V3wz3vPpG1TKRZc": {"text": "transportation"}, "amk4WRd1sNEIp24pnFw8j": {"text": "knee"}, "armmpopt2RLsVDlqLrQ94": {"text": "restaurant"}, "atVEXuftxSiDDj8rzUlFg": {"text": "crayons"}, "atWxG3KTHB5moW1dylLJc": {"text": "toy"}, "avzcTznCsQCISYJsLC-w_": {"text": "musical notes"}, "b1XpSC0ndnm0ZewNXC3pp": {"text": "Butcher"}, "b5OdBMMzkf1FlQbUR5-m7": {"text": "napkins"}, "b9Y5MrR-jn8fh77gAkLZy": {"text": "paint"}, "bAoK85XLNb7p0ebevYZ6O": {"text": "look in the mirror"}, "bDnuS19hfd9GhJ-6rjNPD": {"text": "be"}, "bFodvUraUhJeq4waMdlxv": {"text": "Sunday"}, "bNJfccUvG2DQfR1iZP3eR": {"text": "snake"}, "bVN3R44VuZDw3IdQMolca": {"text": "change"}, "beNprvNb0UztxR4JLxDFm": {"text": "birthday"}, "bge6qR6NzsD5Vk4ifPsSO": {"text": "ketchup"}, "bpSuQQRlIcSse40OAxNSG": {"text": "Monday"}, "bqjKW_qBtRzIThWxdZx2s": {"text": "Water glasses"}, "buyy_2ydocKoi9TnBhZ1N": {"text": "friend"}, "bw3rqHXD1TJ53xbNggEqH": {"text": "breakfast"}, "c7kK5ROVbO3DHrwSFEawq": {"text": "sweet"}, "cI0JxwhkWU-YA7E7rmJtp": {"text": "neck"}, "cJMQi3SVmqvWJ00VxI6gy": {"text": "how are you?"}, "cJw2i319mzBUpEfBRDxc9": {"text": "fish"}, "cJzHrV_PsV-PwwyFN9jka": {"text": "%null%"}, "cS3g4KXf39akVFHCG5AwL": {"text": "toy truck"}, "cTiw7_Yjxu_Kg90q7PdYl": {"text": "flu"}, "cb0rJJEYOeEoRU5fDdQQq": {"text": "he"}, "ccGASDOGtty6GfQMEEBEU": {"text": "three"}, "cj6OuVw4Nob8jxP-E4rZc": {"text": "change my clothes"}, "cnyLFMkJu2i3cqOY0e9kl": {"text": "raisins"}, "curstMeuThu2KUph-8rkB": {"text": "play with"}, "cxMNBGV3LytDXgwDMCiga": {"text": "violet"}, "d4zNoj2BAFG9B7J3KAlLE": {"text": "buttons"}, "d6s8fLFBiQ3KEJlNdJfUW": {"text": "a bit crazy"}, "dHM0qnbmtJAkZY0WBsqaY": {"text": "lilac"}, "dLHDzm0rfgL-vXTx14HSm": {"text": "look for"}, "dNvN5P787hAPE7ZYNgwkw": {"text": "sightseeing"}, "dR72liRxC3qmoSa6Dz2a2": {"text": "syrup"}, "dS-KyYREUQIk7sDlmsvoa": {"text": "near"}, "d_I8jNfbkQD0CHgZn7hyB": {"text": "shirt"}, "dgm3NCKuz7L39PX8LYxj7": {"text": "toys"}, "djgKI9embnk95PAtFcn45": {"text": "change my diaper"}, "dn41o5K_1fo-qHO-YLoQn": {"text": "Saturday"}, "dnXsSOeVG7mq37uciIi2J": {"text": "pause"}, "e5sCl246xFMESEfFy2PhX": {"text": "bed"}, "e5un1yrIuZHQi048e5kD6": {"text": "sweets"}, "e8zl_ecIloo4Vk-OZPJWe": {"text": "play with the tablet"}, "eDX2HSkGaY2TeVwPjR07S": {"text": "easy"}, "eGJ8MC1xPE6ueF82jCmVg": {"text": "brush"}, "eKJCZc-kD0-m6cVLorFzO": {"text": "pear"}, "eWSI1NInbQowtO99phhGA": {"text": "mouth"}, "eZEqRZjRK8JJMsfHo4Y7w": {"text": "of the"}, "ebo03xnkyiHD2pKUKULmr": {"text": "Cartoon"}, "ecUOs24Pp5ZTRt_ZvED5W": {"text": "accompany"}, "eduqLSyC3m4uB1Oee6dt6": {"text": "half"}, "eji-M2j5eHkG71DCksleY": {"text": "hard-boiled egg"}, "emm_RirDsO30Enax5Q4gd": {"text": "with"}, "eo3Q5AjHJz5kp1EbdALwh": {"text": "you"}, "eoYtISVZl3mdwoE_HW-Mv": {"text": "guitar"}, "et1KiL5-zob_EcGlj7tLN": {"text": "after"}, "f2dl12fMZbRdQ7STpcTdk": {"text": "soccer"}, "fF3ijeQzetfSn6EGcs1yY": {"text": "cherries"}, "fL_4POdbPVL9-lvQVWSqY": {"text": "toy airplane"}, "fNAlqbgrpirQZO_LhrkXY": {"text": "spring"}, "fNv4Nb6Vafxk0JxXr-iDo": {"text": "investigate"}, "fUUj_4pKPflmJlxZfk0cX": {"text": "discotheque"}, "ff7ES190q1dmFYZ7lo6x0": {"text": "White bread"}, "fjCOcN-PKP6F07IZcI71X": {"text": "square"}, "fkNwVm56PSe-qh-QoM0vm": {"text": "there"}, "fk_z_HrvcUh8XIq8D6gQP": {"text": "walnuts"}, "g1Cj6HW8kg8yPE1XX9pxa": {"text": "from"}, "g1TLUpuQX2Zs1ob9gqYui": {"text": "cap"}, "g2MhHawoIC9oFNEv5_w63": {"text": "life"}, "g2sQSxCcoZuKJ3TabK6oT": {"text": "came"}, "g75y4E53ViakV-s5UfnIF": {"text": "luggage"}, "gFEnqFhYoXF7QN-n0ONad": {"text": "mountain"}, "gYrIz3R13-BC_pYcvQ9BL": {"text": "winter"}, "gaem1LHTtfQdnnqYi-sOm": {"text": "wallet"}, "gff2FqDlgXknRld7YMLWl": {"text": "whole"}, "gsU8pE9ozhR73xS2icwJ0": {"text": "book"}, "gvPwrzDSSEPwcxY878T_c": {"text": "cat"}, "gzCjycNS8Cf0vNlo1klji": {"text": "annoying"}, "gzb-RNDLMNkgk9wnPILJi": {"text": "grandmother"}, "hAZhogJSH3bL1iL237N8J": {"text": "popcorn"}, "hDvpMlPw-chcuxEisBJTl": {"text": "chestnuts"}, "hKJhXxultsxm0TJl1P8-L": {"text": "thank you"}, "hOyjT1JgOYB-mGLFMaNJR": {"text": "chest pain"}, "hT3Lrjn5-q7YIM1loG4MN": {"text": "speaker"}, "hUYfE_vmNBT_7E60YZsSu": {"text": "paint"}, "hWWOw1gWjWwN7wQJkHrTu": {"text": "tour"}, "hXgGhazQ_nA5uqpRD6Qwq": {"text": "gain"}, "hmhAUgqvGp7nc1w25sRSx": {"text": "wait"}, "hwzwfMyJsvB42F_QWQWyi": {"text": "grape juice"}, "hyUaYltGVJU-wRrAjhhPa": {"text": "singer"}, "i0wB--S4sdL8Q4H9b93UY": {"text": "acid"}, "i2mlV3zGS6nrH2l6N2BlZ": {"text": "trumpet"}, "iAqItRUQL_YpbMn2pgjsA": {"text": "Pizza shop"}, "ibtmTEP3QGDY8TyVLteuX": {"text": "soft"}, "ifd0M0pAlFm7aPt1A0ze_": {"text": "love"}, "iiA1u1JKRmhe2jWVE_W79": {"text": "friends"}, "iimGxVoFWlq_THThR3vmF": {"text": "news"}, "ijn-QwQuTxRFFVe-7WlSX": {"text": "itch"}, "iowxE4MxcV6PR2Uhtvxqs": {"text": "hospital"}, "irbOv2dHA7G969dnJMfJn": {"text": "notebook"}, "islCzqFq1SYrZAh63dLhQ": {"text": "fried egg"}, "j5xZZev5nTNa-p088Oqnp": {"text": "kiss"}, "jBqD3qhhcrioLlCU-xq5b": {"text": "musical instruments"}, "jOALQbfxdXmJVyY6P5gZG": {"text": "Damascus"}, "jTEb3A5ZEKEy2ojuq2vO_": {"text": "bone"}, "jeO9YZ22LfSObUNhQDRAz": {"text": "window"}, "jfly9fZ3x1da4SGCCNcV2": {"text": "scarf"}, "jfvreGZv-e8rD4-01wZ5H": {"text": "band"}, "jhJ2TOfdaRAcVeHGOjwua": {"text": "milk"}, "jmzg4EiC7JEHwe9gNP3C3": {"text": "rice"}, "jpKPg3hn6_GO1HSkeLNGz": {"text": "little girl"}, "jprAsdXWGQKPlUWwgBBot": {"text": "movie"}, "jtKc2q2n5an342ZkiMB9R": {"text": "personal hygiene"}, "k-iDOTk5uO7ZK5OB3v8It": {"text": "old"}, "k41gkf6A_bDtQAJDOrWpP": {"text": "toothpaste"}, "k7dZhQtwDPFlOk1iPjEOz": {"text": "turn up the volume"}, "k8tJx6PikRcnVuZEqrXRM": {"text": "travel"}, "k9ZpWM4oRb1q20c0qWCsg": {"text": "coat"}, "kDzHKO8eIwNsyKWDw7M0c": {"text": "grape"}, "kIn8SeGURyvu49EsRqDs7": {"text": "Pijama"}, "kN85Lb_C4dLnww7sz1afK": {"text": "coffee"}, "kaiWPbXxjHXlqcpBaBp4l": {"text": "travel"}, "khUUL_1JQGngApqBRDh_q": {"text": "fixed up"}, "kpghvJtujlt4vPI2N6vsg": {"text": "either"}, "kxuGlfYjS6puO2xD1QvxO": {"text": "come on"}, "lKA4b7I3iFkqNzPcAXyBc": {"text": "chef"}, "lKMW_xTZzCrCHRcGp-Z-n": {"text": "cookie"}, "lR84gCk8OM-oYoLAV7tar": {"text": "doorbell"}, "lXH68vGIuZdfA8xVrS8iw": {"text": "a lot"}, "l_ncJLRdVGBzzQc9yqBqs": {"text": "banana"}, "lrUuPKco_O8FXDuclzpKE": {"text": "need"}, "m0434KkjeTv8SGN7WxR2C": {"text": "black"}, "m0Fkio76HZHS2HguPOTn5": {"text": "six"}, "m17b6MazSk6M4gb51_cCy": {"text": "lungs"}, "m39xTdgaenoi4mWGEa-Ew": {"text": "dish"}, "m3qTT8tiGZQheKIWREzMT": {"text": "gonna"}, "mC9Nb7zVdEUpjEBODw_gL": {"text": "you"}, "mFfylZ8yoLvtkVSDTlVEN": {"text": "ointment"}, "mJqzbxYeIDQciPkeHA1Ao": {"text": "knife"}, "mK4AXXhoIVirBz5dr_xLA": {"text": "turkey"}, "mRK--C5Q1aGe8MMPJJLYi": {"text": "concerned"}, "mTklFAI-FVVLsMKoASZ7T": {"text": "a stranger"}, "mWXxPPvhSHf9hyb-VyuZH": {"text": "and"}, "mZFwH8xY_OeVDWCdvPZBy": {"text": "foot"}, "miPmA2tOQiLxOW7D_V_x6": {"text": "cubes"}, "ms97ZsgQOvD-Z8qpSW4oN": {"text": "who is it?"}, "mx6dmRLXA_lkN1QlP71vq": {"text": "all"}, "n5bZClAB6jXAZnwxIwH-1": {"text": "toast"}, "nK7DRpxalLBHL9OnRjSim": {"text": "raspberry"}, "nMQUtS-kFHViOKyop1FdS": {"text": "headband"}, "nQSk6_KCEVdO7oC_uxLXN": {"text": "ear"}, "nQdbkRVcwpQB_hFNPbe6M": {"text": "horse"}, "nUg2M7p5sUPlGdbBev2-G": {"text": "ankles"}, "nm6e_s01gWHzdVj25BHyq": {"text": "how nice!"}, "nnTJQMJWfd2nuTSlFNEOy": {"text": "mine"}, "ntzBlFkDMTKEUHoGNc65u": {"text": "bathroom"}, "o0oxaoUFpOLiGsoQBlalI": {"text": "cake"}, "oAxNCJufVUqZMyWRGdZl9": {"text": "yours"}, "oEHzYcfxDGGcsL-deud1j": {"text": "snack"}, "oEyUWrQj1iYUnlEUdQQ5Z": {"text": "flute"}, "oO21zLMEtHEakvnuTohLu": {"text": "What fun!"}, "oOkD8Wmvb4t9I2EWqT1Nr": {"text": "bitter"}, "oSBFO8Ka0PN4bgX0QuWxL": {"text": "Travel by car"}, "oYwoiRDWlIjSTbYdC2vG6": {"text": "skirt"}, "oa-MShota2L8n2pU8hIsm": {"text": "play"}, "okr5oAG2U8Er1XwQ8XbWD": {"text": "big"}, "oqQWeoWBr5N0LrPGY62Og": {"text": "breasts"}, "otTWzTaTAmweNCozT8tn9": {"text": "allergy"}, "p1qK47wwLwF8S0Fy8-2Mt": {"text": "hand"}, "pHBnmCFpM7oZf0O78CBIz": {"text": "candy"}, "pM-bC77hbj-w44A0HFRDZ": {"text": "blow my nose"}, "p_XyUXRmeUk_bdjRTMtkz": {"text": "journals"}, "p_qpVEd677b2Bk56yhvj6": {"text": "garden"}, "paPpjw1XVC9-6xcueJsrY": {"text": "all"}, "pgPlWKk-oww2fua5zYuue": {"text": "bun"}, "phZ4F4uzi1TrhjeDMuMsn": {"text": "pillow"}, "pkuppr1jMH7SMpa2hrIWQ": {"text": "peach juice"}, "pliNY9oMQh1iSidkEhhDO": {"text": "embrace"}, "pptyFMhLrbC6lN6zmc7D0": {"text": "dining room"}, "ptQZXjMQyXWycUD1kAkQo": {"text": "tale"}, "pv8eYkxczIevQqEGwDz6V": {"text": "backpack"}, "pvXSy-5M4i8kysUppvdME": {"text": "that"}, "pwltOTDn2OyABTlD4-27W": {"text": "vegetables"}, "px0jKQDj7r9pOYs4ZrvcT": {"text": "tomato"}, "q22wRFF21EigV8YzQ_MfV": {"text": "you help me?"}, "q6F-qJ7mTxvwa43F6vwun": {"text": "hidden"}, "q7Pz4UqqZUlXeFfXrwXDR": {"text": "rinse"}, "qA4v2JWQU0zzBBZgvW7Vt": {"text": "tremors"}, "qOsbXyvBTMDAwvvnI0iFn": {"text": "little"}, "qU5IvFLD8d16iIHSs_9TM": {"text": "onion"}, "qWhpDTMd8eAEoq7yTKc57": {"text": "underwear"}, "qYA2U_BFOZtFLClxuCIBJ": {"text": "toothache"}, "qeJdrxKIIcUctIjo8wWhc": {"text": "sharp"}, "qn-7ERrcZxJTqfW6hwNs8": {"text": "run"}, "qsA1zm1DOlItK7DCWzAw8": {"text": "bored"}, "qscoBbrWu7tQbpNj9XUPt": {"text": "toilet paper"}, "quE_RA9abVvtG-Fo4Jx8f": {"text": "ten"}, "qy3c7gvRU7shWuJYr1kBk": {"text": "drink"}, "r7eJgCF_b_ktkztv4-oda": {"text": "socks"}, "r808IO3I6j3os_uix6O63": {"text": "table games"}, "r9qUBQwgY8eycnU2OVey0": {"text": "eat a sandwich"}, "rBwDn3PcJGqytqnOZTJMV": {"text": "cab"}, "rMFGfzFobfGsH3_qrLHXU": {"text": "fish"}, "rU9cpWF0I4wnJjzTXpGtO": {"text": "today"}, "rgyV6CvFe98OGnWut6QCZ": {"text": "tourist"}, "rlGO5jGKPL1vW-VF4nRqZ": {"text": "entrance"}, "rnjJyPTabH_Xpmy4Z4O3U": {"text": "celebrate"}, "rtHwq5WN9KElX3V3SKBmS": {"text": "French fries"}, "rwyX2YemNEx_Mh64IArDQ": {"text": "dark"}, "rxdfuk6egO7VmZEB3JrUN": {"text": "the"}, "ry_jOegpMf4nB3spGf4d2": {"text": "I like"}, "s0BXoyn7AqUAlZ9BOHY6S": {"text": "sad"}, "sAsTkky29uEVC9vo3Ofbo": {"text": "arm"}, "sDKIldL3tit328Joneo_7": {"text": "glass"}, "sFNUgvnglgrm6cbYiM0di": {"text": "when?"}, "sP6uvKmY5kA_yuYR8H21c": {"text": "Halloween"}, "sPtazVgymXESdS-BcHqU_": {"text": "poultry"}, "sSTGRl6DpYGZXp8vtTNbm": {"text": "buy"}, "sbv5HLPUR6gHo-EJR2S7S": {"text": "camel"}, "sc0hr3jQ80yXRFDlAn56V": {"text": "fatigue"}, "sixdpB8hTOhlUr4loz3RB": {"text": "doll"}, "sjGytpiPjwqJfPaRUJ-Iw": {"text": "Wednesday"}, "sysOciGqtL7y4ULuyYVc-": {"text": "cooking channel"}, "t-w8e69GwxLyfxlWwHk9f": {"text": "jam"}, "t34TbvjJ3zG2jcgJaCeHa": {"text": "tap"}, "tGyUfSljuc7A5Do5B9GuN": {"text": "sweater"}, "tQwMPLvqAMAstcqvnOERE": {"text": "grey"}, "tWxC4hR6di5zQC-Hujlev": {"text": "volume down"}, "tYwEpd2EOtH8wEUr-jwHk": {"text": "expensive"}, "tw1doIY-jFPofZjlPFj4z": {"text": "what is your name?"}, "txj22hip0CE9qp_z-daIK": {"text": "nebulizer"}, "u1nIt_oFH426g1IVhlYk5": {"text": "thirsty"}, "u2e4Zh8qwJF7zKkohQ8df": {"text": "eraser"}, "u3BufiTZTK6AylGh80ZFd": {"text": "she"}, "u8HfFvMPkogdWk-URj9hv": {"text": "write"}, "uDg7Yy86PlwsAd-U96vJR": {"text": "above"}, "uFoytOG4qsXzBk979t63y": {"text": "clean"}, "uMhOF9ZvWnjW-Zrjbjfhs": {"text": "lower"}, "uOA82KFAVtjoYRTuYFgpr": {"text": "dessert"}, "uPL5NMeXTmD1iU6ZoiROu": {"text": "bird"}, "uYElWOlSOSoQap-d5gsYF": {"text": "chocolate"}, "uZRwbLa1lEG7ol0UJKRBj": {"text": "old"}, "ubP5GM7_0vPkRc6zbD9Ez": {"text": "antacid"}, "uiVc5R86QCZkhraEFlrNz": {"text": "museum"}, "ujyHgmlPIs7UdtndbYd8S": {"text": "friendship"}, "upWXctTSKBtFNSXnXDK_u": {"text": "fruit"}, "uzSwgQNnV8ZrjxpN5Bz_a": {"text": "difficult"}, "v-E2GE1DpCkNAxsfA0f4M": {"text": "eraser"}, "vHzfvEgIkQ0e73ryfWP2F": {"text": "order"}, "vKGLQIas9RdBnPGsaYtr2": {"text": "Kite"}, "vOgqHjpHgrUGERIHtVqDe": {"text": "trash"}, "vPicdKLrhT2wmAAPPukKP": {"text": "fast"}, "vPnmrsRou1ihosdVXS_Op": {"text": "sneakers"}, "vZ9JaTnoj8C0ILYxMNB73": {"text": "pumpkin"}, "vaYJPAsTRvslo2qFOJt60": {"text": "back"}, "vazatQ7CrYJFsorVDC5AC": {"text": "lion"}, "viAHJeLRr_6j9dEi5klj_": {"text": "yellow"}, "vlh1Pa6eA0ZrBs3vHzWH7": {"text": "bear"}, "vmb_RMIB20QND6VcS0deY": {"text": "belly"}, "vq3T-UQGTjX3Z9TlEF12e": {"text": "mayonnaise"}, "vy-O5Zc5kxY8d-7RROvQI": {"text": "ham"}, "w4cVxbBDZjeNyHwpBARHQ": {"text": "shoulder"}, "wBLnDZStKj8YLkg2pTCfh": {"text": "feel"}, "wCGb6D4xSVr4UeKXzGIlP": {"text": "costumes"}, "wcpXeLMBRusfqfrz9s4mF": {"text": "mashed potatoes"}, "whHwNRVnqeM7BMx6nppiW": {"text": "tiger"}, "wkrNPLGWTqMIy4PJRW9QR": {"text": "in"}, "wnfSUkF8-tQiRTVou1_pd": {"text": "cold"}, "x3PNiU1NIeQ3zQa31C8WX": {"text": "honeycomb"}, "xGsyYCjDzQugVzSaK8CuA": {"text": "hard"}, "xIgPo3N-aKXhVcjultMiY": {"text": "bill"}, "xPUYlxRxgFVn1FHQFz6Ic": {"text": "dry off"}, "xQblStUfyBGO27j15Sda3": {"text": "duck"}, "xT4BPNmF-5WAQLfs3cUpS": {"text": "in love"}, "xXtjQktuAq1bmxTc0HSQT": {"text": "soda"}, "xbPnUL4qxvm30VFYNphh-": {"text": "uncles"}, "xiaTdHGInqfm4rD6XzSeZ": {"text": "light"}, "xnPF8fvkC1TvgETI1JcC9": {"text": "organs"}, "xqGzZJIHBeVfSzRfm3rmg": {"text": "one"}, "xxr0MRGYRmmoNC_gsD9uy": {"text": "passport"}, "y0SViQxW8Y-yiX1Z7gXWt": {"text": "Super Hero"}, "y5W21CKOkLWnYJo1OC700": {"text": "cough"}, "yJoivIPHOm1Y1lj-hGN1J": {"text": "sleep"}, "yNag8CK0wV_iRMnFznsXk": {"text": "ball"}, "yR9FTtOimFwZG5g5tgpRk": {"text": "visit"}, "y_5OURnKxFcv4UiMKntUi": {"text": "and"}, "yihsjW9ON0Fr9Yy4ZlP9c": {"text": "armpit"}, "yk2wDVqHEKKwupgm87OJ2": {"text": "buttocks"}, "yo00Ci8bSRFYPU6HxGVwX": {"text": "sing"}, "yqlmoVGItXqaeazw3M3eg": {"text": "armchair"}, "yvtvSsBLhabkcpeYGbxQr": {"text": "boot"}, "yxa6QVSrmWUKH2PZHKaVl": {"text": "lettuce"}, "zANp2EnhT6n0Jcl1Xra6K": {"text": "dance"}, "zAmesi1FcIWLXE3WVa9WS": {"text": "antiallergic"}, "zRTTg5x_P1E8Z3CU-oWXa": {"text": "any"}, "zcibOHpRbSmz1hVNSjPTj": {"text": "fork"}, "zdFC3vpgjcyUWB9a4ghRW": {"text": "description"}, "zi_wcT10fxgn72ZJhVx18": {"text": "dress"}, "zm_6R89hr4wjuVkifiYrk": {"text": "disheveled"}, "zrR1DbO_szgKvxLyrZquw": {"text": "heating"}, "zw-o9pDectP5bxFnUjrJO": {"text": "pig"}, "zxhRDSHXtV63Sp3c2fjrI": {"text": "customs"}, "-k6dUC6thWPyULq8MVSe6": {"text": "PRONOUNS"}, "0geft4arn_A8kL-rfUPYc": {"text": "PEOPLE"}, "1aM3sTxyb8yLSWtkn2MoO": {"text": "MUSICAL INSTRUMENTS"}, "384rVetrrLX4x4pJ0Y0Na": {"text": "SOCIAL INTERACTIONS"}, "4e6iVOPLAjnM6wCMUm5P4": {"text": "BREAKFAST AND SNACK"}, "6vmRBH4shBk3UQEUM6APX": {"text": "CINEMA AND MOVIES"}, "7Jm3bDhPInSlwhdy20dKF": {"text": "ART CLASS"}, "7ngCuvmAnM_7ygpFQgLpk": {"text": "COLORS"}, "7w5ACMFdOCTkBrS911MA1": {"text": "ADJECTIVES AND ADVERBS"}, "8FPdnkMzOIBVTW5-TQxWX": {"text": "CHARACTERS"}, "8t8CAggTj3HuznkKhfXle": {"text": "RESTAURANT BOOK"}, "9JRv4X68pAtwsFT3Ss0iJ": {"text": "SWIMMING BOOK"}, "ByBvBUS7dcXldjzZOVFFP": {"text": "BODY"}, "C7ClEHF5-Mcico4FvRxEV": {"text": "PREPOSITIONS"}, "GD9YHeLktSsdZQvcoua6x": {"text": "BOOK OF THE CARNAGE"}, "HzPl-HvsrXL_QkGT38Ohd": {"text": "GREENHOUSE BOOK"}, "JKEk5TYykBK6ZeYND3Ron": {"text": "CONJUNCTIONS"}, "LWyfHr8Oui5HIShtZ_huo": {"text": "FRUIT"}, "PYTnUqCLwAbngR2Ozroc2": {"text": "ACTIONS"}, "QQszyYRLL-otCQtRfbLzm": {"text": "TIME"}, "V6K3TniptOApMMGa8TspR": {"text": "ALL"}, "VhfGFlHDcPor996rCzoK9": {"text": "CELEBRATIONS"}, "WZYuZd331Hm5gHXJtUmBN": {"text": "ANIMALS"}, "ZgZoyOg5K-LscXdfl6kQG": {"text": "MUSIC CLASS"}, "_Cw7FcJSYiterkLSDJH8V": {"text": "HOME"}, "ah257x5jssDmLIOrcSGn6": {"text": "NUMBERS"}, "berI6X2_pAVCNOrcHAL6y": {"text": "FEELINGS"}, "ce2z_EeEG2nH0ZS4KVAkA": {"text": "SCHOOL"}, "dQXaeM3Uul1yEvRwJ4w9t": {"text": "OUTFIT"}, "ejXQZAiYjrcSFGXb1pz7M": {"text": "TRANSPORT"}, "gybgILOLxmIVfeQtb1f94": {"text": "HYGIENE BOOK"}, "iHS1HpUBBadzgmbum_bdD": {"text": "PROFESSIONS AND TRADE"}, "jatDsecioVAxRph-WOg4f": {"text": "PHARMACY BOOK"}, "puOOrKWbYzH0B_8uGkxYX": {"text": "TRAVEL BOOK"}, "puda9fUGjqvm9oSM6CpTk": {"text": "FOOD"}, "rH7zhJzNVIcEIRyvaYLoi": {"text": "SPORTS"}, "uv4tWMRHfewaEQ_pH0dnV": {"text": "HEALTH BOOK"}, "wAhDHMrZ850dHTwgAXrMY": {"text": "CONCEPTS"}, "xjfPlDs-AcFV9LCyY-v9j": {"text": "GAMES AND TOYS"}, "y545pM8pvB3WgukIac6NT": {"text": "PLACES"}, "zwf7qmSEi7PBwsNaqciA-": {"text": "STORE BOOK"}} \ No newline at end of file diff --git a/assets/languages/en_US.json b/assets/languages/en_US.json new file mode 100644 index 00000000..f1af780d --- /dev/null +++ b/assets/languages/en_US.json @@ -0,0 +1,2504 @@ +{ + "-2UbAou9ydr8XeN-jtIz4": { + "text": "clean" + }, + "-GL2iAgykP10Ae3AKsVOX": { + "text": "salt" + }, + "-LE2iv3Pwr5KuIyM5bYb3": { + "text": "good" + }, + "-LwAKwgCdVkzwM579zRMo": { + "text": "more" + }, + "-aePI8WknXpxEpz19Lu48": { + "text": "his" + }, + "-msU3yor4qJYQHJtWrdk8": { + "text": "pasta" + }, + "00AkNJ4YLpbRD_mLmQjtp": { + "text": "lunch" + }, + "0IrLGI8Ebm8rcS3ymUXqS": { + "text": "hunger" + }, + "0THELgiQ7rvA-orESXJfV": { + "text": "plane" + }, + "0Vkmy6BZcJn3pFurEevL9": { + "text": "study" + }, + "0Z7uFXpp-XRXmqM8ILhIC": { + "text": "bit" + }, + "0_SK41wNOk6mw2qX_eHXM": { + "text": "cinema" + }, + "0cdYDZ5HPaTmqTTN0_Ee8": { + "text": "luck" + }, + "0fHziRVxg0oNDp5pyiI8M": { + "text": "permission" + }, + "0fcYcD_r0jNWXTTAx8Ph7": { + "text": "airport" + }, + "0gAyTD6sImo0jpD_bYGVv": { + "text": "thursday" + }, + "0huLn-H32Cbwba28IZ3tc": { + "text": "bubbles" + }, + "0jpMJu8isUmOZKxhZ_yaj": { + "text": "equipment" + }, + "0pFtmDZdlnLrUkT_XZDXQ": { + "text": "before" + }, + "0qoQs8WyLVONnu3_eBGfD": { + "text": "headache" + }, + "0v5fqIp8GmXsIHO0SPhtt": { + "text": "OK" + }, + "0vttFf3nAGDW6g5wVStcH": { + "text": "sorry" + }, + "1-VwcvzNfvrwDWRGxRPre": { + "text": "neither" + }, + "10X4OKR5xmNhSj86sbyE_": { + "text": "sausages" + }, + "14aCIW665UZtuwNsKKV5s": { + "text": "pencil case" + }, + "17AkRFlfC_koV-lywmDE8": { + "text": "shorts" + }, + "1B1WmC-V0PglDeRAeINcT": { + "text": "look" + }, + "1DjW-XvWN7iOqoJPRSWwY": { + "text": "evil" + }, + "1IjenNwPwsMIWZ4aYBk8S": { + "text": "match" + }, + "1Ph13Z_Ya6p-q0WA7pSl3": { + "text": "bird" + }, + "1QEfLU_S7TM0iMr9VZVtP": { + "text": "round of people" + }, + "1Rv9-SSJjHptwvzqLbdbx": { + "text": "fun" + }, + "1WJZO-pUkTaQvyxz41iB-": { + "text": "minced meat" + }, + "1YOlJCovdcnnqVihqHVmq": { + "text": "here" + }, + "1b71P9YjaNWnX8AWjstqG": { + "text": "t-shirt" + }, + "1mS8kgJIod1cyUFH-msnM": { + "text": "station" + }, + "1mU2ZosZXSJrxkh1NmxJT": { + "text": "left" + }, + "1nhsReHG-f-bW-xaZBsxY": { + "text": "down" + }, + "1pb6S-RR_3zdCq77YFiZ-": { + "text": "too bad!" + }, + "1zU7kolOKsHP9-oomQW1Q": { + "text": "king" + }, + "27GbVOZ-szdnzsy92oY-X": { + "text": "butter" + }, + "2CgcUkvJUskv982FvG54A": { + "text": "silver" + }, + "2HkB0WZYP7cvWLD39GMQj": { + "text": "bath" + }, + "2KO0BFtB4B6fu1feuAZLt": { + "text": "verbs" + }, + "2RZTRMX56BFLrW7tLJ3Hy": { + "text": "same" + }, + "2Vc2H462cutVtUC-5omJk": { + "text": "few" + }, + "2dwtZO2wCm520GPD1i6dl": { + "text": "sore throat" + }, + "2t_eq1JmgHa0R3eu8LMmI": { + "text": "fan" + }, + "2u2-AFuI245I7bZ6tsSPh": { + "text": "who?" + }, + "2y9pxVOBQ2tMdPHcsqQb8": { + "text": "tuesday" + }, + "3-ueUrnwmIIj0BMP8_Ntb": { + "text": "nail" + }, + "32PnZjlnQbTJo4nL9YJYe": { + "text": "happy" + }, + "3932Zm0xgk1hKB2hhBAUa": { + "text": "bus" + }, + "3KbwCHGooNLySWOBlFFuG": { + "text": "kitchenette" + }, + "3KgKNNnuYMrysEDs3Pu4Z": { + "text": "subtitles" + }, + "3VEnVjaGFCImBAZ3wEChu": { + "text": "clothes" + }, + "3arbCGI6fMOWALLanZcg3": { + "text": "cappuccino" + }, + "3dtvYLjbl5oDyhZO9eFRY": { + "text": "them" + }, + "3mwcdenOurU_e59ChLqb0": { + "text": "Out" + }, + "3w62N9b7Cvb6JMjB9Wphi": { + "text": "drink" + }, + "40q0NJ6vsziJDNFBqho7Y": { + "text": "In" + }, + "4A_FNkGH1EDu0oabPurrL": { + "text": "cereals" + }, + "4J1bWl6BbbEdZsRGsgYH2": { + "text": "cheese" + }, + "4X7OXm35OSHoSlPxGUi_f": { + "text": "furniture" + }, + "4bHGIoQmDN8LptpdNN4v6": { + "text": "holidays" + }, + "4f1vqDoAvUu2XYk_JlQdC": { + "text": "seven" + }, + "4rctwNiN4UaU9lqU48MHG": { + "text": "computer" + }, + "4rzonBodQXfs77gALnAP_": { + "text": "beer" + }, + "50wJdR0-3YLnv9y_2Gx_e": { + "text": "jump" + }, + "54BVjn2seJWdBNGI20-yJ": { + "text": "computer" + }, + "54taab8z9ziXt0IqXHkV9": { + "text": "fingers" + }, + "5L5UzBHOzuHRoO-jyPuEx": { + "text": "city" + }, + "5LYjhk-N87Ov9NrQcGbLQ": { + "text": "oil" + }, + "5Tdy0Gu9SiLsPfWwd-Y2E": { + "text": "nice" + }, + "5VBtwEswIjrv1zbXP-oFn": { + "text": "soup" + }, + "5W5_sCAyGTkVzguCEg1d1": { + "text": "juice" + }, + "5dvq344JstkxUpHszaPfp": { + "text": "dolphin" + }, + "5gPT9lrNgpRkF07lP6zOq": { + "text": "apple juice" + }, + "5i3kSsCKF7Oa9iJQvXiTe": { + "text": "more or less" + }, + "5kjlzqb9Rf3zzqZROaZ9p": { + "text": "lose" + }, + "5mGrGHzdw_vCwYCRNPcPw": { + "text": "sightseeing" + }, + "5vxTXbPl4Y0yezGu7p1f6": { + "text": "do" + }, + "6KicPX6y_u2i6tPBZAtvA": { + "text": "wash" + }, + "6jLkKc9OL5btNOmjJem6S": { + "text": "put" + }, + "6lYN4qSZx3_tKDClp4Iyr": { + "text": "between" + }, + "6nhNeVjDfDi-GmreaqfVo": { + "text": "cloudy" + }, + "6rcOXG6yxpzHLzMJ9IayI": { + "text": "close" + }, + "6t2sPdapSNJrOziDozTWW": { + "text": "cow" + }, + "71l2at-8480bvijxn3uBl": { + "text": "during" + }, + "75gujwNXJdAiNmK6Ffhia": { + "text": "juice" + }, + "79xBF6cKgKeD4GeBPe_Ds": { + "text": "bag" + }, + "7EsVGfapPc_38mHCBy3C3": { + "text": "in love" + }, + "7Hz61-WzV62FHsedOwz6q": { + "text": "custard" + }, + "7Q4Zc0cenSF5U4eKyje1f": { + "text": "toward" + }, + "7Q9sNljseWjwSPW4in1ga": { + "text": "check-in counter" + }, + "7VL_MgnLDY6hi8sbvcGIg": { + "text": "silence" + }, + "7WxUVoVQfQOzARU2bf6HP": { + "text": "home" + }, + "7iAXKVm22uMgr6aqZ1rr7": { + "text": "grandfather" + }, + "8-4M30dTtmuUJus9MtGqV": { + "text": "booger" + }, + "81UJI7xOa5l9mVceqkIP5": { + "text": "have cold" + }, + "82LicIQc3K2xCTEt-iMpu": { + "text": "snail" + }, + "86gNdF6aTepa0Y9zkD1VQ": { + "text": "field" + }, + "8FFwIw7rJri79BITZBUzm": { + "text": "Hotel" + }, + "8KlFB3an1mzdQd6-LGCCE": { + "text": "snack" + }, + "8LddDqylw-51wHhx9_Qad": { + "text": "book" + }, + "8MV4ZFthtUeoxLAIbqGTc": { + "text": "meat" + }, + "8cOIYr-hcK54qWpuT-41e": { + "text": "tale" + }, + "8fGingRAd8idw4qcxyZ-Q": { + "text": "shame" + }, + "8iFdjRTQU7ONGnigRTlm8": { + "text": "how much does it cost?" + }, + "8vR0HYniXtrrQqqSIN_JQ": { + "text": "family" + }, + "904w9Je6oDwGXUCIcrUZX": { + "text": "language" + }, + "93YmZA7VfAT7TTNTsDE1W": { + "text": "series" + }, + "93hsW10TmX3Vcq_4IvcZ0": { + "text": "white" + }, + "93tHieC_CgZqN998y5gAv": { + "text": "steak" + }, + "97nIv-aoc51T8kKTZV5cM": { + "text": "saliva" + }, + "9EqfwMNtATh1fwMhyn_B1": { + "text": "good" + }, + "9FiWvg197C-Riid-DVysN": { + "text": "clear" + }, + "9GqE148SFZqMIft4evAk2": { + "text": "eat" + }, + "9MzeUcz1nRqleTkmS_-g2": { + "text": "boat" + }, + "9QyJdpUn0f6g7FxWs5qpO": { + "text": "cut" + }, + "9U8MzceIsqKhG86oNx9zV": { + "text": "car" + }, + "9UwpyOnOBoqr4mX3Juqm2": { + "text": "good afternoon" + }, + "9ZnzbKMDwGEwC3hXOhXFe": { + "text": "pills" + }, + "9dvSIpeXa2_12Jip6noJP": { + "text": "sportman" + }, + "9kgRI3KlOIVSuylKffW9g": { + "text": "colors" + }, + "9lS0mNuKIS0olyDwoIJBR": { + "text": "doctor" + }, + "9mLx-YMK81AflitELQFqk": { + "text": "paper" + }, + "9s5zV3_oGyDx_NEvsKCxX": { + "text": "violin" + }, + "9wE9Py6ztyqDrtaypsltA": { + "text": "orange" + }, + "AOp6VGyjYIV0Ym9d0basJ": { + "text": "draw" + }, + "APXF-lEplPOloppSeIjAY": { + "text": "less" + }, + "AQKGKdoX5CYycZ2YqBZVW": { + "text": "cheap" + }, + "AT_rDWsr6xRBgrvgw9Zih": { + "text": "nine" + }, + "AWJXh6URGN0Vwm66i6IvL": { + "text": "hello" + }, + "AeFbJQ0M9uTObAlKEX3zr": { + "text": "leg" + }, + "Akf0xlH8UJdXn8BJzPV2A": { + "text": "radio" + }, + "B1845IfYfPMz2FWpVFIQv": { + "text": "of" + }, + "BKmATW2uBk4pxnmOaARyq": { + "text": "documents" + }, + "BNjZz9MGLJEKZ4CZoTs2M": { + "text": "chess" + }, + "BQhqx1PuF94jwT0ySTlbJ": { + "text": "meal" + }, + "BQm-YCPc0lfD1-mhecCTL": { + "text": "I" + }, + "Bebnh8-UWwtYLnK6p3fKi": { + "text": "black bread" + }, + "BjqWZnzLlxdOo4KEzZ46j": { + "text": "eight" + }, + "BqS7d4PMhGRqPYlZQzUbR": { + "text": "door" + }, + "Bub9ZYygLcly15D7_wYks": { + "text": "friend" + }, + "ByrvXHEN9Mb8D--7MQAjM": { + "text": "teddy" + }, + "C12mJ1W11fODI3pv1QOnx": { + "text": "jelly" + }, + "C29KJ8BTFavhj_R9UfnSv": { + "text": "by" + }, + "C2bgADoxmINRnAiYxZHqd": { + "text": "cab driver" + }, + "CBTemIvgIN1UAtftkc3sz": { + "text": "paste" + }, + "CCWCtXdMuQBJRmaFOAlfQ": { + "text": "christmas" + }, + "CY-IQvUehkaiGFCdKf9bf": { + "text": "chorizo" + }, + "CYH_6DL9q1iLLetuWeR9A": { + "text": "have" + }, + "CZrETqLgQlvDkLHvw1t_w": { + "text": "a" + }, + "C_JKGNCxOI5x_f2C4qAyZ": { + "text": "peanut" + }, + "CbO32RkDdf9aCucv6BnGS": { + "text": "goat" + }, + "ChBc7LjL8dgzZ6LUCAHGh": { + "text": "please" + }, + "CkTiaqBY3jf86JRq636lt": { + "text": "which?" + }, + "CsKZSNiJw5Q48b26Kskf-": { + "text": "hero" + }, + "CxFmyJYmy6gMRqP9U0cBP": { + "text": "lost" + }, + "CyKtU9yC0Jy7Ypb4WFp6w": { + "text": "dog" + }, + "D1gCni2jXpCvKZe4qCtQN": { + "text": "fish" + }, + "D2tSkngqbQmdKLNhn9xWV": { + "text": "balloons" + }, + "D7dt_hFX5DScV_ssm1nKz": { + "text": "grapefruit" + }, + "D85FU-Wqr2u53tfTXAtHo": { + "text": "kick" + }, + "DAq2J_xXHsSCSNPp9qVsk": { + "text": "smell" + }, + "DBd09yUlbkaYLsemjFXEs": { + "text": "frozen" + }, + "DG1RiDjDfwWRhpAiIpPqA": { + "text": "puke" + }, + "DSgrhLHauub-gBqMGwacO": { + "text": "scared" + }, + "DXb0FpjVM9q8LVl9vvSHn": { + "text": "lessons" + }, + "DXpjgLKTdx9eLLohVdmWM": { + "text": "Green grocery" + }, + "D_4Weq7iyi7GMEsgP0xy6": { + "text": "tea" + }, + "Djs1QsLNf8Q5LBIFV5zNC": { + "text": "Music Sheet" + }, + "DkeHJFtqAS005fYUrl1Xz": { + "text": "pants" + }, + "Dm3yiKSB134LrjtW_KrO7": { + "text": "good day" + }, + "DqGa4gqd2ABDi45BT43x4": { + "text": "princess" + }, + "Dv9MSCRYbR4Q3K114wXki": { + "text": "high" + }, + "E-vUPARie8MmfgZwv3Omr": { + "text": "rooster" + }, + "EM8VyonJ7WNdvmRyE3nhZ": { + "text": "slow" + }, + "EO4O-s7oafi6QJdxTFNkd": { + "text": "decongestant" + }, + "ETZNYbrG5wveDl6c9k2_k": { + "text": "elbow" + }, + "EUsNyf5bDdSLqvZKH1Ltx": { + "text": "don't understand" + }, + "EVmt43vDI3NHFfbbkqokF": { + "text": "pizza" + }, + "Erg6LuA8IOQ5V8RTP3pPi": { + "text": "bee" + }, + "F4cGnA_QHsVKTjUE6MAu9": { + "text": "overall" + }, + "F7kJ8VM31BWB4K4T4USzs": { + "text": "physical abuse" + }, + "F8roVYxKZi88UUGfOvTwl": { + "text": "teacher" + }, + "F90bXbc0tz9nuzTT7SgqV": { + "text": "four" + }, + "FBPIabyaoCK-Y0BziQdji": { + "text": "stomachache" + }, + "FBTheEQmZZfJRiYjd_Np_": { + "text": "interpret" + }, + "FO77qpzyz28knodNtILCA": { + "text": "flush" + }, + "FTngK946O8S8bYc0g7vM2": { + "text": "mother" + }, + "FaVvbVzZivuxTwxJTPubK": { + "text": "brother" + }, + "FfNU04I4mZ54gWcBXqo2c": { + "text": "bacon" + }, + "FgTird367surh-vxXyAK6": { + "text": "ticket" + }, + "FkC5DtSV81OvFMU99qZGg": { + "text": "ball" + }, + "FnCBoLSE19WsbUypUKvFc": { + "text": "hamburger" + }, + "Fogupb264IyCtbZ-Q2D6w": { + "text": "drunk" + }, + "Fvm2C5NBq01tm0QK9d9QM": { + "text": "kids" + }, + "G09TvOzDSG5m3hTQD9Tej": { + "text": "delete" + }, + "G2i9LSK4A19237Zp1vXqF": { + "text": "chubby" + }, + "G6KKVMvPDnjdD9TfBd-B9": { + "text": "flat" + }, + "GAxX7EIz1TTLtMX08RRGr": { + "text": "burger joint" + }, + "GJlUSznzEHCgoAOrVrkp9": { + "text": "happy" + }, + "GSEumxiyeVKRRiaY_c8HW": { + "text": "crol" + }, + "GY_flM-6uR6X3L4AwsiwU": { + "text": "for" + }, + "G_CRpzxWO5XdEMh01O1eJ": { + "text": "although" + }, + "Gj7THa6XFHDfYL5H19lwj": { + "text": "tomorrow" + }, + "Gm_qAGnL4OawmlYmTs7K5": { + "text": "can't see" + }, + "GoJuWnn72TCXONXKtYHMm": { + "text": "train" + }, + "Gvmy--9DiUn_tkQYWeWhA": { + "text": "cannelloni" + }, + "GxrDtsdGcLepdsQr6V9DT": { + "text": "green" + }, + "H2zMVtjvqi7aUtCypiVKr": { + "text": "seat" + }, + "H8Bsrr2NK9Q3WGbEp8PMe": { + "text": "silver" + }, + "H9SWPnWbR8qcZA-iu5Mz0": { + "text": "earache" + }, + "HBZNu6m3FELU9eg3OeLdx": { + "text": "curtain" + }, + "HKfLJS8aCBtKuKJeSBQUW": { + "text": "hit" + }, + "HMPabuHqgtyiCmTLzg-rM": { + "text": "get in" + }, + "HQiQh4PPBvO1n-d7JGVj8": { + "text": "nobody" + }, + "HTBNWax6FCSGXuboGsVUW": { + "text": "salty" + }, + "HnuZA0UTlnuIfFAN7saxl": { + "text": "rabbit" + }, + "Hvb4JdDHX_vNMck_US2UN": { + "text": "rehearsal" + }, + "I5AJgba5GTdEjdpFB-LBf": { + "text": "chocolate milk" + }, + "IAdQsjTsbBUAMjlwW34cw": { + "text": "I'd love to" + }, + "IEeIvawUD2GIAr1Wypr9i": { + "text": "people" + }, + "IF3R7tLVAkd4RbL8R07K9": { + "text": "actor" + }, + "IM8OUKCzHwnjAQWPFgnn6": { + "text": "far" + }, + "INxOSvKbBNOXwruIpuNho": { + "text": "belly button" + }, + "IO8uTb1K7ElENgp2ujZoK": { + "text": "robust" + }, + "IXRWmFmtqfnHQRcBf1Idl": { + "text": "pigeon" + }, + "IZbfYRzu2cxxDWdbmQeqw": { + "text": "head" + }, + "Ig1oypuwndODbmKh_NEXs": { + "text": "bathing shorts" + }, + "IsWUeiPnDEnzxePKclBNp": { + "text": "ugly" + }, + "J3qQMp0OMr5LC9ebfArxH": { + "text": "none" + }, + "J3rDL96c2zfBQzP45VRCp": { + "text": "lemon" + }, + "J4UUPR-WP0qo1y14bUVI-": { + "text": "vet" + }, + "J7MmgugOu20UtMcMPj59r": { + "text": "song" + }, + "J7wLwBLVx4UANh_x5HdXd": { + "text": "according to" + }, + "JB9SIxWzxWFjrbmMuksrY": { + "text": "laugh" + }, + "JBIehRNmDbK2ALcRN0u9i": { + "text": "rooster" + }, + "JBKQaBezKuSDaMsnbJMTB": { + "text": "bar" + }, + "JBU2hMw9gbIy9-wGF4mjD": { + "text": "board" + }, + "JDbBWMB5No0pK6HvntLt4": { + "text": "wash my hands" + }, + "JEDIYq1BDA23ac9TNhON-": { + "text": "help" + }, + "JFldbhjqxK3fD6D2K4HY4": { + "text": "dad" + }, + "JGm4BL7HAfuxX_PGe6Jzk": { + "text": "present" + }, + "JQOpcZSCPGMOWZsN8w_yb": { + "text": "what time is it?" + }, + "JSFuEHlP-CFvuqvFKMumC": { + "text": "toy car" + }, + "JVtu9W3AumOwjUedwhUGE": { + "text": "rehabilitation" + }, + "JZRBfIXBkeuobtDXbLt5t": { + "text": "bye" + }, + "JawnUo-pseWb3FDVMtxrQ": { + "text": "yogurt" + }, + "JblWXW8TKDCuYu2yTnFBA": { + "text": "table" + }, + "Ji5OVFX-uNDewL8eX8Cin": { + "text": "think" + }, + "Jjq8CM8JrYHIMziuQy-WN": { + "text": "diary" + }, + "JziaulL-lrAPGNVvwBPK9": { + "text": "summer" + }, + "K382TlNZjdMLLpAhCCXLG": { + "text": "almonds" + }, + "K6hd20tWZfwwlYYi7jctt": { + "text": "delicious" + }, + "K8cMIDL0ubQvWhhDtr65F": { + "text": "cry" + }, + "K8e2-KkvZfFOQaXnhR37x": { + "text": "tired" + }, + "KC18_sTEqKucPQ-iwEKYY": { + "text": "pencil" + }, + "KK_i8H9qTfDVYZkQGwd2v": { + "text": "turn off" + }, + "KNH4sLRpVKtHXQa-0y84K": { + "text": "nervous" + }, + "KWYVDZiERE8jtRsL0faHH": { + "text": "swim" + }, + "KXHW4m6vXxQU-AEOR4pZ4": { + "text": "soccer ball" + }, + "Khdk8mWpyxgLqfC-6lyT9": { + "text": "donkey" + }, + "KhyTKtiL4ZT4Z1saU1eJh": { + "text": "listen to music" + }, + "Kn9vE07FK1LrzoD_YxrJD": { + "text": "metro" + }, + "KpLFOrpuhFKaIbBbFwVVu": { + "text": "butterfly" + }, + "KrOPANVpdkBWdEZoUwxKf": { + "text": "low note" + }, + "KvY6Taigm4Va_cVjXAfGR": { + "text": "short" + }, + "L0hfYADgzghRVsZLZHRxE": { + "text": "dancer" + }, + "L19r487_d3RqWXiNuh3gE": { + "text": "what color it is?" + }, + "L6YLAEsbYcTq-ycQJTvt4": { + "text": "chicken" + }, + "LAuEISciEf1Wc1j4fERz8": { + "text": "new year" + }, + "LDoi3cxodn_AVKSG-Bf_1": { + "text": "eyes" + }, + "LEVKlDlJ0wHo5QEjCNAGa": { + "text": "glue" + }, + "LEg8z-Q-ONLAAXd-aH_Hb": { + "text": "low" + }, + "LNBTW0qQtHYQEHatkWGtc": { + "text": "market" + }, + "LRIKzfm9ZsdNe1u7CUuW_": { + "text": "how many?" + }, + "LRfh-4RAZTj7cnnDwBmqj": { + "text": "floater" + }, + "LU7IoUksATEBhd8PaHS1R": { + "text": "take out" + }, + "LaKT8VTw0_6rvordp5-R8": { + "text": "pink" + }, + "LiBr37yi-YBgQDx4unjyc": { + "text": "give" + }, + "LjTGOcyG7DkTs1lJqNr8w": { + "text": "hair" + }, + "LksmOMPPOMArbrFsscqOW": { + "text": "music" + }, + "LmGq1AZs2a0x26r7E9GUj": { + "text": "teacher" + }, + "LngEMJa_ihV8mB7afZX-h": { + "text": "them" + }, + "LrDai7jXlGAdZ3e8ZQezj": { + "text": "pee" + }, + "M5q2CXmK0_WVaVUB_HJB3": { + "text": "hot" + }, + "MEqo2TROHyroK318sm84f": { + "text": "pasta" + }, + "MKR-ukiUlJy4uuqO30UU6": { + "text": "verbal abuse" + }, + "MMzjhHID8HMqyPjii5o-h": { + "text": "kitchen" + }, + "MNCcHiImRS8tmvhBhzCKj": { + "text": "salad" + }, + "MQHnvvU48NnEptP8a9w8C": { + "text": "I don't like" + }, + "MWIzTM6zhTWL1V-brLtBx": { + "text": "comfortable" + }, + "MYqfOzKx2qMHop8GaHs0I": { + "text": "light green" + }, + "MiOe5_Djf-pE9V9aDZ_1G": { + "text": "pineapple" + }, + "MqQgYn5B0uV-DMORCBOmV": { + "text": "sad" + }, + "Mw6WRebMAKWwXfAvDA7vu": { + "text": "hot" + }, + "N2baGNTOapSaFDo1GURiW": { + "text": "can't hear" + }, + "N7n4zQIkJZOhaYESk2GgH": { + "text": "fall" + }, + "NFdUTit6Ff-4S7Nzf92U5": { + "text": "constipation" + }, + "NFgGqhEtl0HqipCGGEvwU": { + "text": "comb my hair" + }, + "NKQwWPAsVHwFBWuksqfns": { + "text": "shower" + }, + "NLi5ODIzyMAwr2HpDXACp": { + "text": "nose" + }, + "NQayjogCYiimP_0OxIfFj": { + "text": "shoes" + }, + "NVe4u7BTAVfLk3xkDqLnZ": { + "text": "oven" + }, + "NVjfEut567uXpTaQUNI2i": { + "text": "jacket" + }, + "N_893wsadpGg3Ip5sEThe": { + "text": "blue" + }, + "NaJxTPq9Ld8I4fwAltyEC": { + "text": "corn" + }, + "NjulpZ9x63ZqxtLMoRjkx": { + "text": "turn on the lights" + }, + "Njz8DrErsexBu8mAI6mnr": { + "text": "fish" + }, + "NmNouLLx13jzE27jliI_v": { + "text": "teeth" + }, + "NuhUikdCxP0NgsbO0wvAU": { + "text": "queue" + }, + "O-CLnVuXAUapOn6TbdhKx": { + "text": "want" + }, + "O450x4W3OOacvJIy4QicJ": { + "text": "vegetables" + }, + "OHyrmD5US1rHEAEwLQaII": { + "text": "animals" + }, + "OKXIGnLh-i1ydTNj450Q8": { + "text": "queen" + }, + "OUcfOOReAfQroBKlBdDb-": { + "text": "saline solution" + }, + "OWLDc7Hn3neBAf_V_N27n": { + "text": "fasten" + }, + "O_ZfCPZSxGMPT6orCt-O6": { + "text": "pig" + }, + "OblxxVFC-LKPq-8oC9FpE": { + "text": "feelings" + }, + "OdCdTUAlbN6kvsPjby_Bi": { + "text": "sports" + }, + "OeA63q6LpqGvXW-cJXEym": { + "text": "jam" + }, + "OeytAsSiEAWC10tXhxbTa": { + "text": "character" + }, + "OhrHu-xLo8hcn5plWfoX4": { + "text": "expensive" + }, + "Om1Bvqu8nmGuNGwV8hndM": { + "text": "low" + }, + "OvyFC1GHkvJZ0dAAF1QkY": { + "text": "him" + }, + "OwHzJdOQTFOA8daCVRwm6": { + "text": "brush" + }, + "P5zdq4x58yp5TA_soKQEJ": { + "text": "bike" + }, + "PAlC0XSZNru3-LXtfvGjo": { + "text": "make love" + }, + "PBqpK7LL1HQPwowPitrss": { + "text": "read" + }, + "PFAi3SdvH9vL7_Bg3MhCA": { + "text": "traffic light" + }, + "PIBHv5VueBi-sf5qFCN_Y": { + "text": "in view of" + }, + "PIPQnVS2UiS7kGbucJP8l": { + "text": "cure" + }, + "PLXxIPYyztaztLf4sPCst": { + "text": "throat" + }, + "PbtM3htZocZb8YifuPoY5": { + "text": "crab" + }, + "PfNLmlHKFT9d1w6IgeXbU": { + "text": "remote control" + }, + "Pl-M4bc6k2rdhu6FHEbkA": { + "text": "yard" + }, + "PogTYrGfa2WNfBRuA8O4e": { + "text": "bad" + }, + "PszHdOxMsS_tAzSrN52Wa": { + "text": "clay" + }, + "Pw3GgPwp7fpDVC6wJjgPn": { + "text": "increase" + }, + "Q6LQqdLcvNOiCFjC0DVo2": { + "text": "drum" + }, + "Q6nNH4AIoSeDHODC_Ip8O": { + "text": "Neighbors" + }, + "Q9Ra0aJaQnOJQ1Kqdc43-": { + "text": "baby" + }, + "QCQRmsQY6AggjreY9Z0MF": { + "text": "decline" + }, + "QGf1Tb1roL7HAXUSrRqRJ": { + "text": "orange" + }, + "QJhkOh48xapiTObEDQLB9": { + "text": "piano" + }, + "QTkFHWp9KEDgfCjoQjBY2": { + "text": "plurals" + }, + "QUTQLuD2Gv7fHh0V_O5tg": { + "text": "ashamed" + }, + "QVqSPPgA89whFTJ0HTphK": { + "text": "open" + }, + "QZNQOaf0SdHDbx1otCmrH": { + "text": "child" + }, + "QcGJ9u_JqmrW0X47PXWH4": { + "text": "tousled" + }, + "QclUM2p3iexSjFZI8OU4-": { + "text": "fever" + }, + "QeqA20MCXB-zNfuKIssMY": { + "text": "can of tuna" + }, + "QllvOUe8utZrcBRGw_0vc": { + "text": "bandaid" + }, + "QnlQ1HOEB9yNjuW3Dd6fc": { + "text": "celebration" + }, + "Qo3Qn_nMe3E6EqNw0UdNZ": { + "text": "sunny" + }, + "QohNih4wgqjnpWt3kSwtd": { + "text": "coach" + }, + "QvaMxPy-3iixHAJFyIrN-": { + "text": "sandwich" + }, + "R06chAQYswLtQK46OInW7": { + "text": "milk and cookies" + }, + "R9ECa_HQRtpFrb59ebMTQ": { + "text": "school" + }, + "RBCjBvNXQSZOOpg-5lBlK": { + "text": "good" + }, + "RZfMOtjw0DoGHWaRfCEc4": { + "text": "pants" + }, + "Ra2rxEEohwxRqDsW2AT3C": { + "text": "videogames" + }, + "RbZetbSC5064rZccOFD1D": { + "text": "television" + }, + "RkpoG4KB8m_TJFJf2v3EG": { + "text": "change the channel" + }, + "RwlZ1jr2Ix3evzrW71lN0": { + "text": "apple" + }, + "S3um53pcko7_BPHy7R6FL": { + "text": "us" + }, + "SE-71I_ahm3oKROReyJHE": { + "text": "poo" + }, + "SOyGnJXLPeVRoZy3vBgpK": { + "text": "exam" + }, + "SXz8iA1Qn_BlgLTAG6Epl": { + "text": "dinner" + }, + "SiOmZdwX8Hf2nE2v6HfCp": { + "text": "shoe" + }, + "Sp2Ias_Y1HplkHWjIb7Mp": { + "text": "without" + }, + "TAbuXSnSHU6C3CQ4kbKVh": { + "text": "triangle" + }, + "TBV2BhoZVgl1jMV_jWZYi": { + "text": "right" + }, + "TIgoS-YONIwzbrImXetaD": { + "text": "plum" + }, + "TIsM6aTTZ9W8j6UhW9Qqj": { + "text": "chorus" + }, + "TLxsYdrBdHgFZkNJtVTmK": { + "text": "tortoise" + }, + "TP-gGRcpcFyx1SrNRsdRV": { + "text": "Sorry" + }, + "TR5CXN8-pfbWkshdxSBSV": { + "text": "sheep" + }, + "TS9z8ZmMEwn0MGSfr9amH": { + "text": "avocado" + }, + "TZF-7m8VKZ7IL6pyv0Daf": { + "text": "brush my teeth" + }, + "T_Q5c4XAfkhkclmnCGHo5": { + "text": "until" + }, + "Td5pgVQDTFOftUgOJ-bD-": { + "text": "hot" + }, + "Te_jJfeU8Xwa9St2RihBq": { + "text": "blood" + }, + "ThqkHs4az5tgLqLcfFPaZ": { + "text": "Long" + }, + "TpPNZLsh5jrN9RdPFwmA7": { + "text": "Cool!" + }, + "Tpj-Fs8LQ566TM0bYlZ6H": { + "text": "friday" + }, + "TuAjBKPp3-PSdQuooSWZi": { + "text": "frog" + }, + "TyqVzfOniQNa9WKQRXqr-": { + "text": "sister" + }, + "U1KQsrvTa2E00-ugc-Iy6": { + "text": "absent" + }, + "U6PoeH-cMdO3ttnLkN7_3": { + "text": "ride a horse" + }, + "U7GiGcYacowWi4MWrCYyj": { + "text": "anti-inflammatory" + }, + "UQ-5wOfR0tDzljoDjj2xU": { + "text": "autumn" + }, + "UQ5B5K-tpk1XmQC1B9TjQ": { + "text": "no" + }, + "US8_vYTnDfxBw2Ung_J38": { + "text": "private parts" + }, + "UVzdJiqY36fqgBYyz880c": { + "text": "raw ham" + }, + "UXJDiwb3j_zyfGa26ByJL": { + "text": "chest" + }, + "Ubaq6h7wasdP_YRombm2c": { + "text": "sugar" + }, + "Ugs9V9c2c5iHrVC6p17zr": { + "text": "painkiller" + }, + "Uk1Emn5IovsTfFzpQX5Jw": { + "text": "bra" + }, + "UkLF5sKtVKW0D8RzVCoue": { + "text": "firefighter" + }, + "UnQJwWfWCe40DJYR1Er0o": { + "text": "pain" + }, + "UssSOEEKutvzB_B4fAQE-": { + "text": "listen again" + }, + "Ust3oadA0PUGViYo28Mf3": { + "text": "walk" + }, + "UvRS0KmtZn3dq7e8L5RcE": { + "text": "angry" + }, + "UwvZVcX_CAQFrI6U4LsNT": { + "text": "egg" + }, + "VJ9AU_y7CqsONR6TvhdLh": { + "text": "where is?" + }, + "VKrLGgYjc-nLPGsyESDgb": { + "text": "canary" + }, + "VL4pd0vnJ-CNfMg9bCNed": { + "text": "aspirin" + }, + "VUJ-zrdsyL9MOuFbdMCAx": { + "text": "dizziness" + }, + "Vioyf8EXJfY5t34NnN0WO": { + "text": "tablets" + }, + "Vjlet5P7XuqTrc22nt_Zz": { + "text": "water" + }, + "Vmnu5eormo-_TOCgF4YzG": { + "text": "cough syrup" + }, + "VoZumy5GtnRdqSOmXAw7j": { + "text": "prepared" + }, + "VrC7AnovfA7VzmYESVc8L": { + "text": "chat" + }, + "VwZ4EKSggYWxlnAbp-pNB": { + "text": "sick" + }, + "Vzov0z9acB-I1_W_CcFcY": { + "text": "red" + }, + "WDUIQV43zghFQq_rSk1Z4": { + "text": "steak" + }, + "WL3ZN-W_zgnuTJpuqz0YQ": { + "text": "prince" + }, + "WNhpmD_XlTaNEBo7GsFXu": { + "text": "diarrhea" + }, + "WQ0CNIQ_gjaCxg4tEIsOo": { + "text": "dive" + }, + "WRzleD-mI84LaimFH8h6P": { + "text": "hear" + }, + "WUt3I-NkdbqlSVcwuLfFx": { + "text": "skates" + }, + "WWK2v56LM-zWqujabk9bM": { + "text": "art lesson" + }, + "W_f7h3qOLl2uEd_OYpMfQ": { + "text": "policeman" + }, + "WasZ5bKZZy5Jt4Y-JipxS": { + "text": "bikini" + }, + "Wgh5iCzUmx4Je-B85-pra": { + "text": "refrigerator" + }, + "WjXQhSFPpz42ZUyHvurYG": { + "text": "cricket" + }, + "WtYSntcy2CijEORmROeaj": { + "text": "quarter" + }, + "Wu47Qs6Zupu1Ox2gUhkxn": { + "text": "room" + }, + "Wva5W8GA0dHzyt2_0FPdm": { + "text": "brother" + }, + "X0-Tf-KR24qEkpGDzG2Z-": { + "text": "yesterday" + }, + "X3u4pXTWKcGc43lOkgSBt": { + "text": "compliance" + }, + "XA952Z60D0-cesNCVA-OX": { + "text": "bye" + }, + "XC5fIljJ819OYpllYTjpE": { + "text": "giraffe" + }, + "XN0nzhQyHVOhuYuNqrp8g": { + "text": "peach" + }, + "XOoGN6huCjVHxH8hRFAw1": { + "text": "white" + }, + "XY6ZCNzeJIEzLtWJcufJm": { + "text": "long sleeve shirt" + }, + "XYY8SV1IAMHjdGjMZxbdy": { + "text": "basketball court" + }, + "XeVaDdUWSEkhfJvTVvUHR": { + "text": "go out" + }, + "XnocVMEeUGCSnlnusP44O": { + "text": "grab" + }, + "XuAtFop5_JNSYiZkUBzaU": { + "text": "cook" + }, + "Y5HQq_4crSF2lpwH-KUrt": { + "text": "two" + }, + "YCu-B26PqjE30AhikHdkI": { + "text": "cartoon" + }, + "YIP0Xc4aJsfv0s8BpiQnn": { + "text": "five" + }, + "YLKXFZ9ze9K9NvJiAx8w0": { + "text": "what?" + }, + "YbrNtdUmyMNdAF5CfvY1A": { + "text": "towel" + }, + "YbvMRsCtMbww8OQgF45QF": { + "text": "cold" + }, + "YeT-jstVSA7-mD9t99Isg": { + "text": "puzzle" + }, + "YusWY8GwdO43bSp1o3BWC": { + "text": "annoyed" + }, + "Yvxm8RGoFYKUsIXOl33yR": { + "text": "turn of the lights" + }, + "Z5-sBklfLIWE00CJ_T_ZK": { + "text": "spoon" + }, + "Z8xp3kxXuhMVoNm7ddQSX": { + "text": "throw" + }, + "ZA2C4bJaL90lBxsTemYWZ": { + "text": "pool" + }, + "ZAnmv4CLb7hldYUlp2wJU": { + "text": "none" + }, + "ZBIFtTq-BH1jv5jLbzrhj": { + "text": "repeat" + }, + "ZQEXAf10BkoTvCJx3Ox39": { + "text": "surprise" + }, + "ZR-NXJk3SD351W-95cf_T": { + "text": "paint" + }, + "ZRYQmYRGKzheBqk11eGRZ": { + "text": "whale" + }, + "Zm4OIanIKTigDGIsInO7o": { + "text": "a supermarket" + }, + "ZnMba2r4XIg9lPi_H2d_Z": { + "text": "yes" + }, + "_1lOt0C0MQhvU8QWC6_oZ": { + "text": "good night" + }, + "_2SjbH-xHZq173EU4J65c": { + "text": "park" + }, + "_3ihCSMQCokXNo8pXii-h": { + "text": "call someone" + }, + "_8RIOebHpkr9nCy0_9qhP": { + "text": "call" + }, + "_CsJMxqGcNSaujXwRZcpu": { + "text": "anxious" + }, + "_FNTsoEjTMV3Uas-gggi2": { + "text": "stress" + }, + "_HUf6SR0mTP7v72Y9_4gw": { + "text": "fire truck" + }, + "_Lc2-NNL69ZX-aVnUNzgx": { + "text": "strawberry" + }, + "_S9Eck14cdOTr0QH4i7sQ": { + "text": "bathroom" + }, + "_WIT6qs1kaiJqB1Ild5Xs": { + "text": "stroll" + }, + "_eug92AvR1UXpYlfm6o_Q": { + "text": "golden" + }, + "_hqTU9A7I3RFDVrcIEK-L": { + "text": "%null%" + }, + "_lU200bb9Sjv0b_iJKgU2": { + "text": "a bike shop" + }, + "_tDZtalMxKSNpWydJ1aeW": { + "text": "zero" + }, + "aC_XP9Ch5PqWoCmcJwI77": { + "text": "cotton" + }, + "aMs2YNnWkw4XN0gAm-jI3": { + "text": "drawer" + }, + "aP9QisUdxhgOKIQ2kHNb3": { + "text": "chard" + }, + "aSzpwNza22HZp46Sh6wfx": { + "text": "dirty" + }, + "aTwzShtP_zR9x6bSGSzEB": { + "text": "chicken thigh" + }, + "aXLBXkENJqTYkyZOP8TNS": { + "text": "you" + }, + "aa3xDW6F9YUKyX0fe5uX8": { + "text": "Back" + }, + "ajesFjbC7hwCNLKdif-ix": { + "text": "against" + }, + "ak5fBauJzapC4JIf0lT8N": { + "text": "hill" + }, + "alsoa_V3wz3vPpG1TKRZc": { + "text": "transportation" + }, + "amk4WRd1sNEIp24pnFw8j": { + "text": "knee" + }, + "armmpopt2RLsVDlqLrQ94": { + "text": "restaurant" + }, + "atVEXuftxSiDDj8rzUlFg": { + "text": "crayons" + }, + "atWxG3KTHB5moW1dylLJc": { + "text": "toy" + }, + "avzcTznCsQCISYJsLC-w_": { + "text": "musical notes" + }, + "b1XpSC0ndnm0ZewNXC3pp": { + "text": "butcher" + }, + "b5OdBMMzkf1FlQbUR5-m7": { + "text": "napkins" + }, + "b9Y5MrR-jn8fh77gAkLZy": { + "text": "paint" + }, + "bAoK85XLNb7p0ebevYZ6O": { + "text": "look in the mirror" + }, + "bDnuS19hfd9GhJ-6rjNPD": { + "text": "be" + }, + "bFodvUraUhJeq4waMdlxv": { + "text": "sunday" + }, + "bNJfccUvG2DQfR1iZP3eR": { + "text": "snake" + }, + "bVN3R44VuZDw3IdQMolca": { + "text": "change" + }, + "beNprvNb0UztxR4JLxDFm": { + "text": "birthday" + }, + "bge6qR6NzsD5Vk4ifPsSO": { + "text": "ketchup" + }, + "bpSuQQRlIcSse40OAxNSG": { + "text": "monday" + }, + "bqjKW_qBtRzIThWxdZx2s": { + "text": "sunglasses" + }, + "buyy_2ydocKoi9TnBhZ1N": { + "text": "friend" + }, + "bw3rqHXD1TJ53xbNggEqH": { + "text": "breakfast" + }, + "c7kK5ROVbO3DHrwSFEawq": { + "text": "sweet" + }, + "cI0JxwhkWU-YA7E7rmJtp": { + "text": "neck" + }, + "cJMQi3SVmqvWJ00VxI6gy": { + "text": "how are you?" + }, + "cJw2i319mzBUpEfBRDxc9": { + "text": "fish" + }, + "cJzHrV_PsV-PwwyFN9jka": { + "text": "%null%" + }, + "cS3g4KXf39akVFHCG5AwL": { + "text": "toy truck" + }, + "cTiw7_Yjxu_Kg90q7PdYl": { + "text": "flu" + }, + "cb0rJJEYOeEoRU5fDdQQq": { + "text": "he" + }, + "ccGASDOGtty6GfQMEEBEU": { + "text": "three" + }, + "cj6OuVw4Nob8jxP-E4rZc": { + "text": "change my clothes" + }, + "cnyLFMkJu2i3cqOY0e9kl": { + "text": "raisins" + }, + "curstMeuThu2KUph-8rkB": { + "text": "play with" + }, + "cxMNBGV3LytDXgwDMCiga": { + "text": "violet" + }, + "d4zNoj2BAFG9B7J3KAlLE": { + "text": "buttons" + }, + "d6s8fLFBiQ3KEJlNdJfUW": { + "text": "a bit crazy" + }, + "dHM0qnbmtJAkZY0WBsqaY": { + "text": "lilac" + }, + "dLHDzm0rfgL-vXTx14HSm": { + "text": "look for" + }, + "dNvN5P787hAPE7ZYNgwkw": { + "text": "sightseeing" + }, + "dR72liRxC3qmoSa6Dz2a2": { + "text": "syrup" + }, + "dS-KyYREUQIk7sDlmsvoa": { + "text": "near" + }, + "d_I8jNfbkQD0CHgZn7hyB": { + "text": "shirt" + }, + "dgm3NCKuz7L39PX8LYxj7": { + "text": "toys" + }, + "djgKI9embnk95PAtFcn45": { + "text": "change my diaper" + }, + "dn41o5K_1fo-qHO-YLoQn": { + "text": "saturday" + }, + "dnXsSOeVG7mq37uciIi2J": { + "text": "break" + }, + "e5sCl246xFMESEfFy2PhX": { + "text": "car" + }, + "e5un1yrIuZHQi048e5kD6": { + "text": "alfajor" + }, + "e8zl_ecIloo4Vk-OZPJWe": { + "text": "play with the tablet" + }, + "eDX2HSkGaY2TeVwPjR07S": { + "text": "Easy" + }, + "eGJ8MC1xPE6ueF82jCmVg": { + "text": "brush" + }, + "eKJCZc-kD0-m6cVLorFzO": { + "text": "pear" + }, + "eWSI1NInbQowtO99phhGA": { + "text": "mouth" + }, + "eZEqRZjRK8JJMsfHo4Y7w": { + "text": "of the" + }, + "ebo03xnkyiHD2pKUKULmr": { + "text": "cartoon" + }, + "ecUOs24Pp5ZTRt_ZvED5W": { + "text": "escort" + }, + "eduqLSyC3m4uB1Oee6dt6": { + "text": "half" + }, + "eji-M2j5eHkG71DCksleY": { + "text": "hard-boiled egg" + }, + "emm_RirDsO30Enax5Q4gd": { + "text": "with" + }, + "eo3Q5AjHJz5kp1EbdALwh": { + "text": "you" + }, + "eoYtISVZl3mdwoE_HW-Mv": { + "text": "guitar" + }, + "et1KiL5-zob_EcGlj7tLN": { + "text": "after" + }, + "f2dl12fMZbRdQ7STpcTdk": { + "text": "soccer" + }, + "fF3ijeQzetfSn6EGcs1yY": { + "text": "cherries" + }, + "fL_4POdbPVL9-lvQVWSqY": { + "text": "toy plane" + }, + "fNAlqbgrpirQZO_LhrkXY": { + "text": "spring" + }, + "fNv4Nb6Vafxk0JxXr-iDo": { + "text": "investigate" + }, + "fUUj_4pKPflmJlxZfk0cX": { + "text": "discotheque" + }, + "ff7ES190q1dmFYZ7lo6x0": { + "text": "white bread" + }, + "fjCOcN-PKP6F07IZcI71X": { + "text": "square" + }, + "fkNwVm56PSe-qh-QoM0vm": { + "text": "there" + }, + "fk_z_HrvcUh8XIq8D6gQP": { + "text": "nuts" + }, + "g1Cj6HW8kg8yPE1XX9pxa": { + "text": "from" + }, + "g1TLUpuQX2Zs1ob9gqYui": { + "text": "cap" + }, + "g2MhHawoIC9oFNEv5_w63": { + "text": "life" + }, + "g2sQSxCcoZuKJ3TabK6oT": { + "text": "wine" + }, + "g75y4E53ViakV-s5UfnIF": { + "text": "Luggage" + }, + "gFEnqFhYoXF7QN-n0ONad": { + "text": "mountain" + }, + "gYrIz3R13-BC_pYcvQ9BL": { + "text": "winter" + }, + "gaem1LHTtfQdnnqYi-sOm": { + "text": "wallet" + }, + "gff2FqDlgXknRld7YMLWl": { + "text": "whole" + }, + "gsU8pE9ozhR73xS2icwJ0": { + "text": "book" + }, + "gvPwrzDSSEPwcxY878T_c": { + "text": "cat" + }, + "gzCjycNS8Cf0vNlo1klji": { + "text": "annoyed" + }, + "gzb-RNDLMNkgk9wnPILJi": { + "text": "grandfather" + }, + "hAZhogJSH3bL1iL237N8J": { + "text": "popcorn" + }, + "hDvpMlPw-chcuxEisBJTl": { + "text": "chestnuts" + }, + "hKJhXxultsxm0TJl1P8-L": { + "text": "bye" + }, + "hOyjT1JgOYB-mGLFMaNJR": { + "text": "chest pain" + }, + "hT3Lrjn5-q7YIM1loG4MN": { + "text": "speaker" + }, + "hUYfE_vmNBT_7E60YZsSu": { + "text": "Paint" + }, + "hWWOw1gWjWwN7wQJkHrTu": { + "text": "tour" + }, + "hXgGhazQ_nA5uqpRD6Qwq": { + "text": "win" + }, + "hmhAUgqvGp7nc1w25sRSx": { + "text": "wait" + }, + "hwzwfMyJsvB42F_QWQWyi": { + "text": "grape juice" + }, + "hyUaYltGVJU-wRrAjhhPa": { + "text": "singer" + }, + "i0wB--S4sdL8Q4H9b93UY": { + "text": "acid" + }, + "i2mlV3zGS6nrH2l6N2BlZ": { + "text": "trumpet" + }, + "iAqItRUQL_YpbMn2pgjsA": { + "text": "pizza shop" + }, + "ibtmTEP3QGDY8TyVLteuX": { + "text": "soft" + }, + "ifd0M0pAlFm7aPt1A0ze_": { + "text": "love" + }, + "iiA1u1JKRmhe2jWVE_W79": { + "text": "friends" + }, + "iimGxVoFWlq_THThR3vmF": { + "text": "news" + }, + "ijn-QwQuTxRFFVe-7WlSX": { + "text": "itch" + }, + "iowxE4MxcV6PR2Uhtvxqs": { + "text": "hospital" + }, + "irbOv2dHA7G969dnJMfJn": { + "text": "notebook" + }, + "islCzqFq1SYrZAh63dLhQ": { + "text": "fried egg" + }, + "j5xZZev5nTNa-p088Oqnp": { + "text": "kiss" + }, + "jBqD3qhhcrioLlCU-xq5b": { + "text": "musical instruments" + }, + "jOALQbfxdXmJVyY6P5gZG": { + "text": "apricot" + }, + "jTEb3A5ZEKEy2ojuq2vO_": { + "text": "bone" + }, + "jeO9YZ22LfSObUNhQDRAz": { + "text": "window" + }, + "jfly9fZ3x1da4SGCCNcV2": { + "text": "scarf" + }, + "jfvreGZv-e8rD4-01wZ5H": { + "text": "band" + }, + "jhJ2TOfdaRAcVeHGOjwua": { + "text": "milk" + }, + "jmzg4EiC7JEHwe9gNP3C3": { + "text": "rice" + }, + "jpKPg3hn6_GO1HSkeLNGz": { + "text": "little girl" + }, + "jprAsdXWGQKPlUWwgBBot": { + "text": "movie" + }, + "jtKc2q2n5an342ZkiMB9R": { + "text": "personal hygiene" + }, + "k-iDOTk5uO7ZK5OB3v8It": { + "text": "old" + }, + "k41gkf6A_bDtQAJDOrWpP": { + "text": "toothpaste" + }, + "k7dZhQtwDPFlOk1iPjEOz": { + "text": "turn volume up" + }, + "k8tJx6PikRcnVuZEqrXRM": { + "text": "travel" + }, + "k9ZpWM4oRb1q20c0qWCsg": { + "text": "coat" + }, + "kDzHKO8eIwNsyKWDw7M0c": { + "text": "grape" + }, + "kIn8SeGURyvu49EsRqDs7": { + "text": "pajama" + }, + "kN85Lb_C4dLnww7sz1afK": { + "text": "coffee" + }, + "kaiWPbXxjHXlqcpBaBp4l": { + "text": "travel" + }, + "khUUL_1JQGngApqBRDh_q": { + "text": "fixed up" + }, + "kpghvJtujlt4vPI2N6vsg": { + "text": "or" + }, + "kxuGlfYjS6puO2xD1QvxO": { + "text": "Let's go" + }, + "lKA4b7I3iFkqNzPcAXyBc": { + "text": "chef" + }, + "lKMW_xTZzCrCHRcGp-Z-n": { + "text": "cookie" + }, + "lR84gCk8OM-oYoLAV7tar": { + "text": "doorbell" + }, + "lXH68vGIuZdfA8xVrS8iw": { + "text": "a lot" + }, + "l_ncJLRdVGBzzQc9yqBqs": { + "text": "banana" + }, + "lrUuPKco_O8FXDuclzpKE": { + "text": "need" + }, + "m0434KkjeTv8SGN7WxR2C": { + "text": "black" + }, + "m0Fkio76HZHS2HguPOTn5": { + "text": "six" + }, + "m17b6MazSk6M4gb51_cCy": { + "text": "lungs" + }, + "m39xTdgaenoi4mWGEa-Ew": { + "text": "dish" + }, + "m3qTT8tiGZQheKIWREzMT": { + "text": "go to" + }, + "mC9Nb7zVdEUpjEBODw_gL": { + "text": "you" + }, + "mFfylZ8yoLvtkVSDTlVEN": { + "text": "ointment" + }, + "mJqzbxYeIDQciPkeHA1Ao": { + "text": "knife" + }, + "mK4AXXhoIVirBz5dr_xLA": { + "text": "turkey" + }, + "mRK--C5Q1aGe8MMPJJLYi": { + "text": "worried" + }, + "mTklFAI-FVVLsMKoASZ7T": { + "text": "a stranger" + }, + "mWXxPPvhSHf9hyb-VyuZH": { + "text": "and" + }, + "mZFwH8xY_OeVDWCdvPZBy": { + "text": "foot" + }, + "miPmA2tOQiLxOW7D_V_x6": { + "text": "cubes" + }, + "ms97ZsgQOvD-Z8qpSW4oN": { + "text": "who?" + }, + "mx6dmRLXA_lkN1QlP71vq": { + "text": "all" + }, + "n5bZClAB6jXAZnwxIwH-1": { + "text": "toast" + }, + "nK7DRpxalLBHL9OnRjSim": { + "text": "raspberry" + }, + "nMQUtS-kFHViOKyop1FdS": { + "text": "headband" + }, + "nQSk6_KCEVdO7oC_uxLXN": { + "text": "ear" + }, + "nQdbkRVcwpQB_hFNPbe6M": { + "text": "horse" + }, + "nUg2M7p5sUPlGdbBev2-G": { + "text": "ankles" + }, + "nm6e_s01gWHzdVj25BHyq": { + "text": "nice!" + }, + "nnTJQMJWfd2nuTSlFNEOy": { + "text": "mine" + }, + "ntzBlFkDMTKEUHoGNc65u": { + "text": "bathroom" + }, + "o0oxaoUFpOLiGsoQBlalI": { + "text": "cake" + }, + "oAxNCJufVUqZMyWRGdZl9": { + "text": "yours" + }, + "oEHzYcfxDGGcsL-deud1j": { + "text": "snack" + }, + "oEyUWrQj1iYUnlEUdQQ5Z": { + "text": "flute" + }, + "oO21zLMEtHEakvnuTohLu": { + "text": "how fun!" + }, + "oOkD8Wmvb4t9I2EWqT1Nr": { + "text": "bitter" + }, + "oSBFO8Ka0PN4bgX0QuWxL": { + "text": "travel by car" + }, + "oYwoiRDWlIjSTbYdC2vG6": { + "text": "skirt" + }, + "oa-MShota2L8n2pU8hIsm": { + "text": "play" + }, + "okr5oAG2U8Er1XwQ8XbWD": { + "text": "large" + }, + "oqQWeoWBr5N0LrPGY62Og": { + "text": "boobs" + }, + "otTWzTaTAmweNCozT8tn9": { + "text": "alergy" + }, + "p1qK47wwLwF8S0Fy8-2Mt": { + "text": "hand" + }, + "pHBnmCFpM7oZf0O78CBIz": { + "text": "candy" + }, + "pM-bC77hbj-w44A0HFRDZ": { + "text": "blow my nose" + }, + "p_XyUXRmeUk_bdjRTMtkz": { + "text": "journals" + }, + "p_qpVEd677b2Bk56yhvj6": { + "text": "garden" + }, + "paPpjw1XVC9-6xcueJsrY": { + "text": "all" + }, + "pgPlWKk-oww2fua5zYuue": { + "text": "monkey" + }, + "phZ4F4uzi1TrhjeDMuMsn": { + "text": "pillow" + }, + "pkuppr1jMH7SMpa2hrIWQ": { + "text": "peach juice" + }, + "pliNY9oMQh1iSidkEhhDO": { + "text": "embrace" + }, + "pptyFMhLrbC6lN6zmc7D0": { + "text": "dining room" + }, + "ptQZXjMQyXWycUD1kAkQo": { + "text": "tale" + }, + "pv8eYkxczIevQqEGwDz6V": { + "text": "backpack" + }, + "pvXSy-5M4i8kysUppvdME": { + "text": "what" + }, + "pwltOTDn2OyABTlD4-27W": { + "text": "vegetables" + }, + "px0jKQDj7r9pOYs4ZrvcT": { + "text": "tomato" + }, + "q22wRFF21EigV8YzQ_MfV": { + "text": "help me?" + }, + "q6F-qJ7mTxvwa43F6vwun": { + "text": "hide & seek" + }, + "q7Pz4UqqZUlXeFfXrwXDR": { + "text": "rinse" + }, + "qA4v2JWQU0zzBBZgvW7Vt": { + "text": "tremors" + }, + "qOsbXyvBTMDAwvvnI0iFn": { + "text": "small" + }, + "qU5IvFLD8d16iIHSs_9TM": { + "text": "onion" + }, + "qWhpDTMd8eAEoq7yTKc57": { + "text": "underwear" + }, + "qYA2U_BFOZtFLClxuCIBJ": { + "text": "toothache" + }, + "qeJdrxKIIcUctIjo8wWhc": { + "text": "acute" + }, + "qn-7ERrcZxJTqfW6hwNs8": { + "text": "run" + }, + "qsA1zm1DOlItK7DCWzAw8": { + "text": "bored" + }, + "qscoBbrWu7tQbpNj9XUPt": { + "text": "toilet paper" + }, + "quE_RA9abVvtG-Fo4Jx8f": { + "text": "ten" + }, + "qy3c7gvRU7shWuJYr1kBk": { + "text": "drink" + }, + "r7eJgCF_b_ktkztv4-oda": { + "text": "socks" + }, + "r808IO3I6j3os_uix6O63": { + "text": "games" + }, + "r9qUBQwgY8eycnU2OVey0": { + "text": "eat a sandwich" + }, + "rBwDn3PcJGqytqnOZTJMV": { + "text": "cab" + }, + "rMFGfzFobfGsH3_qrLHXU": { + "text": "fish" + }, + "rU9cpWF0I4wnJjzTXpGtO": { + "text": "today" + }, + "rgyV6CvFe98OGnWut6QCZ": { + "text": "turist" + }, + "rlGO5jGKPL1vW-VF4nRqZ": { + "text": "entrance" + }, + "rnjJyPTabH_Xpmy4Z4O3U": { + "text": "celebrate" + }, + "rtHwq5WN9KElX3V3SKBmS": { + "text": "fries" + }, + "rwyX2YemNEx_Mh64IArDQ": { + "text": "dark" + }, + "rxdfuk6egO7VmZEB3JrUN": { + "text": "the" + }, + "ry_jOegpMf4nB3spGf4d2": { + "text": "I like" + }, + "s0BXoyn7AqUAlZ9BOHY6S": { + "text": "sad" + }, + "sAsTkky29uEVC9vo3Ofbo": { + "text": "arm" + }, + "sDKIldL3tit328Joneo_7": { + "text": "glass" + }, + "sFNUgvnglgrm6cbYiM0di": { + "text": "when?" + }, + "sP6uvKmY5kA_yuYR8H21c": { + "text": "halloween" + }, + "sPtazVgymXESdS-BcHqU_": { + "text": "poultry shop" + }, + "sSTGRl6DpYGZXp8vtTNbm": { + "text": "buy" + }, + "sbv5HLPUR6gHo-EJR2S7S": { + "text": "camel" + }, + "sc0hr3jQ80yXRFDlAn56V": { + "text": "tireness" + }, + "sixdpB8hTOhlUr4loz3RB": { + "text": "doll" + }, + "sjGytpiPjwqJfPaRUJ-Iw": { + "text": "wednesday" + }, + "sysOciGqtL7y4ULuyYVc-": { + "text": "cooking channel" + }, + "t-w8e69GwxLyfxlWwHk9f": { + "text": "jelly" + }, + "t34TbvjJ3zG2jcgJaCeHa": { + "text": "touch" + }, + "tGyUfSljuc7A5Do5B9GuN": { + "text": "sweater" + }, + "tQwMPLvqAMAstcqvnOERE": { + "text": "gray" + }, + "tWxC4hR6di5zQC-Hujlev": { + "text": "volume down" + }, + "tYwEpd2EOtH8wEUr-jwHk": { + "text": "expensive" + }, + "tw1doIY-jFPofZjlPFj4z": { + "text": "what's your name?" + }, + "txj22hip0CE9qp_z-daIK": { + "text": "nebulizer" + }, + "u1nIt_oFH426g1IVhlYk5": { + "text": "thirsty" + }, + "u2e4Zh8qwJF7zKkohQ8df": { + "text": "eraser" + }, + "u3BufiTZTK6AylGh80ZFd": { + "text": "she" + }, + "u8HfFvMPkogdWk-URj9hv": { + "text": "write" + }, + "uDg7Yy86PlwsAd-U96vJR": { + "text": "top" + }, + "uFoytOG4qsXzBk979t63y": { + "text": "clean" + }, + "uMhOF9ZvWnjW-Zrjbjfhs": { + "text": "lower" + }, + "uOA82KFAVtjoYRTuYFgpr": { + "text": "dessert" + }, + "uPL5NMeXTmD1iU6ZoiROu": { + "text": "bird" + }, + "uYElWOlSOSoQap-d5gsYF": { + "text": "chocolate" + }, + "uZRwbLa1lEG7ol0UJKRBj": { + "text": "old" + }, + "ubP5GM7_0vPkRc6zbD9Ez": { + "text": "antiacid" + }, + "uiVc5R86QCZkhraEFlrNz": { + "text": "museum" + }, + "ujyHgmlPIs7UdtndbYd8S": { + "text": "friendship" + }, + "upWXctTSKBtFNSXnXDK_u": { + "text": "fruit" + }, + "uzSwgQNnV8ZrjxpN5Bz_a": { + "text": "Hard" + }, + "v-E2GE1DpCkNAxsfA0f4M": { + "text": "eraser" + }, + "vHzfvEgIkQ0e73ryfWP2F": { + "text": "sort" + }, + "vKGLQIas9RdBnPGsaYtr2": { + "text": "kite" + }, + "vOgqHjpHgrUGERIHtVqDe": { + "text": "trash can" + }, + "vPicdKLrhT2wmAAPPukKP": { + "text": "fast" + }, + "vPnmrsRou1ihosdVXS_Op": { + "text": "shoes" + }, + "vZ9JaTnoj8C0ILYxMNB73": { + "text": "pumpkin" + }, + "vaYJPAsTRvslo2qFOJt60": { + "text": "loin" + }, + "vazatQ7CrYJFsorVDC5AC": { + "text": "lion" + }, + "viAHJeLRr_6j9dEi5klj_": { + "text": "yellow" + }, + "vlh1Pa6eA0ZrBs3vHzWH7": { + "text": "bear" + }, + "vmb_RMIB20QND6VcS0deY": { + "text": "belly" + }, + "vq3T-UQGTjX3Z9TlEF12e": { + "text": "mayonnaise" + }, + "vy-O5Zc5kxY8d-7RROvQI": { + "text": "jam" + }, + "w4cVxbBDZjeNyHwpBARHQ": { + "text": "shoulder" + }, + "wBLnDZStKj8YLkg2pTCfh": { + "text": "feel" + }, + "wCGb6D4xSVr4UeKXzGIlP": { + "text": "Costumes" + }, + "wcpXeLMBRusfqfrz9s4mF": { + "text": "mashed potatoes" + }, + "whHwNRVnqeM7BMx6nppiW": { + "text": "tiger" + }, + "wkrNPLGWTqMIy4PJRW9QR": { + "text": "in" + }, + "wnfSUkF8-tQiRTVou1_pd": { + "text": "cold" + }, + "x3PNiU1NIeQ3zQa31C8WX": { + "text": "diaper" + }, + "xGsyYCjDzQugVzSaK8CuA": { + "text": "hard" + }, + "xIgPo3N-aKXhVcjultMiY": { + "text": "bill" + }, + "xPUYlxRxgFVn1FHQFz6Ic": { + "text": "dry off" + }, + "xQblStUfyBGO27j15Sda3": { + "text": "duck" + }, + "xT4BPNmF-5WAQLfs3cUpS": { + "text": "in love" + }, + "xXtjQktuAq1bmxTc0HSQT": { + "text": "soda" + }, + "xbPnUL4qxvm30VFYNphh-": { + "text": "uncles" + }, + "xiaTdHGInqfm4rD6XzSeZ": { + "text": "Turn On" + }, + "xnPF8fvkC1TvgETI1JcC9": { + "text": "organs" + }, + "xqGzZJIHBeVfSzRfm3rmg": { + "text": "one" + }, + "xxr0MRGYRmmoNC_gsD9uy": { + "text": "passport" + }, + "y0SViQxW8Y-yiX1Z7gXWt": { + "text": "Superhero" + }, + "y5W21CKOkLWnYJo1OC700": { + "text": "cough" + }, + "yJoivIPHOm1Y1lj-hGN1J": { + "text": "Sleep" + }, + "yNag8CK0wV_iRMnFznsXk": { + "text": "ball" + }, + "yR9FTtOimFwZG5g5tgpRk": { + "text": "visit" + }, + "y_5OURnKxFcv4UiMKntUi": { + "text": "and" + }, + "yihsjW9ON0Fr9Yy4ZlP9c": { + "text": "armpit" + }, + "yk2wDVqHEKKwupgm87OJ2": { + "text": "buttocks" + }, + "yo00Ci8bSRFYPU6HxGVwX": { + "text": "sing" + }, + "yqlmoVGItXqaeazw3M3eg": { + "text": "armchair" + }, + "yvtvSsBLhabkcpeYGbxQr": { + "text": "boot" + }, + "yxa6QVSrmWUKH2PZHKaVl": { + "text": "lettuce" + }, + "zANp2EnhT6n0Jcl1Xra6K": { + "text": "dancer" + }, + "zAmesi1FcIWLXE3WVa9WS": { + "text": "antihistamine" + }, + "zRTTg5x_P1E8Z3CU-oWXa": { + "text": "any" + }, + "zcibOHpRbSmz1hVNSjPTj": { + "text": "fork" + }, + "zdFC3vpgjcyUWB9a4ghRW": { + "text": "description" + }, + "zi_wcT10fxgn72ZJhVx18": { + "text": "dress" + }, + "zm_6R89hr4wjuVkifiYrk": { + "text": "disheveled" + }, + "zrR1DbO_szgKvxLyrZquw": { + "text": "heating" + }, + "zw-o9pDectP5bxFnUjrJO": { + "text": "pig" + }, + "zxhRDSHXtV63Sp3c2fjrI": { + "text": "customs" + }, + "-k6dUC6thWPyULq8MVSe6": { + "text": "PRONOUN" + }, + "0geft4arn_A8kL-rfUPYc": { + "text": "PEOPLE" + }, + "1aM3sTxyb8yLSWtkn2MoO": { + "text": "MUSICAL INSTRUMENTS" + }, + "384rVetrrLX4x4pJ0Y0Na": { + "text": "SOCIAL INTERACTIONS" + }, + "4e6iVOPLAjnM6wCMUm5P4": { + "text": "BREAKFAST & SNACKS" + }, + "6vmRBH4shBk3UQEUM6APX": { + "text": "CINEMA AND MOVIES" + }, + "7Jm3bDhPInSlwhdy20dKF": { + "text": "ART LESSONS" + }, + "7ngCuvmAnM_7ygpFQgLpk": { + "text": "COLORS" + }, + "7w5ACMFdOCTkBrS911MA1": { + "text": "ADJECTIVES AND ADVERBS" + }, + "8FPdnkMzOIBVTW5-TQxWX": { + "text": "CHARACTERS" + }, + "8t8CAggTj3HuznkKhfXle": { + "text": "RESTAURANT BOOK" + }, + "9JRv4X68pAtwsFT3Ss0iJ": { + "text": "SWIMMING BOOK" + }, + "ByBvBUS7dcXldjzZOVFFP": { + "text": "BODY" + }, + "C7ClEHF5-Mcico4FvRxEV": { + "text": "PREPOSITIONS" + }, + "GD9YHeLktSsdZQvcoua6x": { + "text": "BUTCHER'S BOOK" + }, + "HzPl-HvsrXL_QkGT38Ohd": { + "text": "GREENGROCERY BOOK" + }, + "JKEk5TYykBK6ZeYND3Ron": { + "text": "CONJUNCTIONS" + }, + "LWyfHr8Oui5HIShtZ_huo": { + "text": "FRUITS" + }, + "PYTnUqCLwAbngR2Ozroc2": { + "text": "ACTIONS" + }, + "QQszyYRLL-otCQtRfbLzm": { + "text": "TIME" + }, + "V6K3TniptOApMMGa8TspR": { + "text": "ALL" + }, + "VhfGFlHDcPor996rCzoK9": { + "text": "CELEBRATIONS" + }, + "WZYuZd331Hm5gHXJtUmBN": { + "text": "ANIMALS" + }, + "ZgZoyOg5K-LscXdfl6kQG": { + "text": "MUSIC LESSONS" + }, + "_Cw7FcJSYiterkLSDJH8V": { + "text": "HOUSE" + }, + "ah257x5jssDmLIOrcSGn6": { + "text": "NUMBERS" + }, + "berI6X2_pAVCNOrcHAL6y": { + "text": "FEELINGS" + }, + "ce2z_EeEG2nH0ZS4KVAkA": { + "text": "SCHOOL" + }, + "dQXaeM3Uul1yEvRwJ4w9t": { + "text": "OUTFIT" + }, + "ejXQZAiYjrcSFGXb1pz7M": { + "text": "TRANSPORT" + }, + "gybgILOLxmIVfeQtb1f94": { + "text": "HYGIENE BOOK" + }, + "iHS1HpUBBadzgmbum_bdD": { + "text": "PROFESSIONS AND TRADES" + }, + "jatDsecioVAxRph-WOg4f": { + "text": "PHARMACY BOOK" + }, + "puOOrKWbYzH0B_8uGkxYX": { + "text": "TRAVEL BOOK" + }, + "puda9fUGjqvm9oSM6CpTk": { + "text": "FOOD" + }, + "rH7zhJzNVIcEIRyvaYLoi": { + "text": "SPORTS" + }, + "uv4tWMRHfewaEQ_pH0dnV": { + "text": "HEALTH BOOK" + }, + "wAhDHMrZ850dHTwgAXrMY": { + "text": "CONCEPTS" + }, + "xjfPlDs-AcFV9LCyY-v9j": { + "text": "GAMES AND TOYS" + }, + "y545pM8pvB3WgukIac6NT": { + "text": "PLACES" + }, + "zwf7qmSEi7PBwsNaqciA-": { + "text": "Book of the library" + } +} \ No newline at end of file diff --git a/assets/languages/es_AR.json b/assets/languages/es_AR.json new file mode 100644 index 00000000..70b6a99b --- /dev/null +++ b/assets/languages/es_AR.json @@ -0,0 +1 @@ +{"-2UbAou9ydr8XeN-jtIz4": {"text": "limpiar"}, "-GL2iAgykP10Ae3AKsVOX": {"text": "sal"}, "-LE2iv3Pwr5KuIyM5bYb3": {"text": "bien"}, "-LwAKwgCdVkzwM579zRMo": {"text": "más"}, "-aePI8WknXpxEpz19Lu48": {"text": "suyos"}, "-msU3yor4qJYQHJtWrdk8": {"text": "pastas"}, "00AkNJ4YLpbRD_mLmQjtp": {"text": "almuerzo"}, "0IrLGI8Ebm8rcS3ymUXqS": {"text": "hambre"}, "0THELgiQ7rvA-orESXJfV": {"text": "avión"}, "0Vkmy6BZcJn3pFurEevL9": {"text": "estudiar"}, "0Z7uFXpp-XRXmqM8ILhIC": {"text": "poco"}, "0_SK41wNOk6mw2qX_eHXM": {"text": "cine"}, "0cdYDZ5HPaTmqTTN0_Ee8": {"text": "suerte"}, "0fHziRVxg0oNDp5pyiI8M": {"text": "permiso"}, "0fcYcD_r0jNWXTTAx8Ph7": {"text": "aeropuerto"}, "0gAyTD6sImo0jpD_bYGVv": {"text": "jueves"}, "0huLn-H32Cbwba28IZ3tc": {"text": "burbujas"}, "0jpMJu8isUmOZKxhZ_yaj": {"text": "equipo"}, "0pFtmDZdlnLrUkT_XZDXQ": {"text": "antes"}, "0qoQs8WyLVONnu3_eBGfD": {"text": "dolor de cabeza"}, "0v5fqIp8GmXsIHO0SPhtt": {"text": "dale"}, "0vttFf3nAGDW6g5wVStcH": {"text": "disculpa"}, "1-VwcvzNfvrwDWRGxRPre": {"text": "ni"}, "10X4OKR5xmNhSj86sbyE_": {"text": "salchichas"}, "14aCIW665UZtuwNsKKV5s": {"text": "cartuchera"}, "17AkRFlfC_koV-lywmDE8": {"text": "pantalones cortos"}, "1B1WmC-V0PglDeRAeINcT": {"text": "mirar"}, "1DjW-XvWN7iOqoJPRSWwY": {"text": "mal"}, "1IjenNwPwsMIWZ4aYBk8S": {"text": "partido"}, "1Ph13Z_Ya6p-q0WA7pSl3": {"text": "pájaro"}, "1QEfLU_S7TM0iMr9VZVtP": {"text": "ronda"}, "1Rv9-SSJjHptwvzqLbdbx": {"text": "divertido"}, "1WJZO-pUkTaQvyxz41iB-": {"text": "picado"}, "1YOlJCovdcnnqVihqHVmq": {"text": "acá"}, "1b71P9YjaNWnX8AWjstqG": {"text": "remera"}, "1mS8kgJIod1cyUFH-msnM": {"text": "estación"}, "1mU2ZosZXSJrxkh1NmxJT": {"text": "izquierda"}, "1nhsReHG-f-bW-xaZBsxY": {"text": "abajo"}, "1pb6S-RR_3zdCq77YFiZ-": {"text": "¡qué mal!"}, "1zU7kolOKsHP9-oomQW1Q": {"text": "rey"}, "27GbVOZ-szdnzsy92oY-X": {"text": "manteca"}, "2CgcUkvJUskv982FvG54A": {"text": "plata"}, "2HkB0WZYP7cvWLD39GMQj": {"text": "bañar"}, "2KO0BFtB4B6fu1feuAZLt": {"text": "verbos"}, "2RZTRMX56BFLrW7tLJ3Hy": {"text": "mismo"}, "2Vc2H462cutVtUC-5omJk": {"text": "pocos"}, "2dwtZO2wCm520GPD1i6dl": {"text": "dolor de garganta"}, "2t_eq1JmgHa0R3eu8LMmI": {"text": "ventilador"}, "2u2-AFuI245I7bZ6tsSPh": {"text": "¿quién?"}, "2y9pxVOBQ2tMdPHcsqQb8": {"text": "martes"}, "3-ueUrnwmIIj0BMP8_Ntb": {"text": "uña"}, "32PnZjlnQbTJo4nL9YJYe": {"text": "feliz"}, "3932Zm0xgk1hKB2hhBAUa": {"text": "colectivo"}, "3KbwCHGooNLySWOBlFFuG": {"text": "cocinita"}, "3KgKNNnuYMrysEDs3Pu4Z": {"text": "subtítulo"}, "3VEnVjaGFCImBAZ3wEChu": {"text": "ropa"}, "3arbCGI6fMOWALLanZcg3": {"text": "capuchino"}, "3dtvYLjbl5oDyhZO9eFRY": {"text": "ellos"}, "3mwcdenOurU_e59ChLqb0": {"text": "fuera"}, "3w62N9b7Cvb6JMjB9Wphi": {"text": "beber"}, "40q0NJ6vsziJDNFBqho7Y": {"text": "dentro"}, "4A_FNkGH1EDu0oabPurrL": {"text": "cereales"}, "4J1bWl6BbbEdZsRGsgYH2": {"text": "queso"}, "4X7OXm35OSHoSlPxGUi_f": {"text": "mueble"}, "4bHGIoQmDN8LptpdNN4v6": {"text": "vacaciones"}, "4f1vqDoAvUu2XYk_JlQdC": {"text": "siete"}, "4rctwNiN4UaU9lqU48MHG": {"text": "computadora"}, "4rzonBodQXfs77gALnAP_": {"text": "cerveza"}, "50wJdR0-3YLnv9y_2Gx_e": {"text": "saltar"}, "54BVjn2seJWdBNGI20-yJ": {"text": "computadora"}, "54taab8z9ziXt0IqXHkV9": {"text": "dedos"}, "5L5UzBHOzuHRoO-jyPuEx": {"text": "ciudad"}, "5LYjhk-N87Ov9NrQcGbLQ": {"text": "aceite"}, "5Tdy0Gu9SiLsPfWwd-Y2E": {"text": "lindo"}, "5VBtwEswIjrv1zbXP-oFn": {"text": "sopa"}, "5W5_sCAyGTkVzguCEg1d1": {"text": "jugo"}, "5dvq344JstkxUpHszaPfp": {"text": "delfín"}, "5gPT9lrNgpRkF07lP6zOq": {"text": "jugo de manzana"}, "5i3kSsCKF7Oa9iJQvXiTe": {"text": "más o menos"}, "5kjlzqb9Rf3zzqZROaZ9p": {"text": "perder"}, "5mGrGHzdw_vCwYCRNPcPw": {"text": "pasear"}, "5vxTXbPl4Y0yezGu7p1f6": {"text": "hacer"}, "6KicPX6y_u2i6tPBZAtvA": {"text": "lavar"}, "6jLkKc9OL5btNOmjJem6S": {"text": "poner"}, "6lYN4qSZx3_tKDClp4Iyr": {"text": "entre"}, "6nhNeVjDfDi-GmreaqfVo": {"text": "nublado"}, "6rcOXG6yxpzHLzMJ9IayI": {"text": "cerrar"}, "6t2sPdapSNJrOziDozTWW": {"text": "vaca"}, "71l2at-8480bvijxn3uBl": {"text": "durante"}, "75gujwNXJdAiNmK6Ffhia": {"text": "jugo"}, "79xBF6cKgKeD4GeBPe_Ds": {"text": "bolsa"}, "7EsVGfapPc_38mHCBy3C3": {"text": "enamorado"}, "7Hz61-WzV62FHsedOwz6q": {"text": "flan"}, "7Q4Zc0cenSF5U4eKyje1f": {"text": "hacia"}, "7Q9sNljseWjwSPW4in1ga": {"text": "recepción"}, "7VL_MgnLDY6hi8sbvcGIg": {"text": "silencio"}, "7WxUVoVQfQOzARU2bf6HP": {"text": "casa"}, "7iAXKVm22uMgr6aqZ1rr7": {"text": "abuelo"}, "8-4M30dTtmuUJus9MtGqV": {"text": "moco"}, "81UJI7xOa5l9mVceqkIP5": {"text": "tener frío"}, "82LicIQc3K2xCTEt-iMpu": {"text": "caracol"}, "86gNdF6aTepa0Y9zkD1VQ": {"text": "campo"}, "8FFwIw7rJri79BITZBUzm": {"text": "hotel"}, "8KlFB3an1mzdQd6-LGCCE": {"text": "merienda"}, "8LddDqylw-51wHhx9_Qad": {"text": "libro"}, "8MV4ZFthtUeoxLAIbqGTc": {"text": "carne"}, "8cOIYr-hcK54qWpuT-41e": {"text": "cuento"}, "8fGingRAd8idw4qcxyZ-Q": {"text": "vergüenza"}, "8iFdjRTQU7ONGnigRTlm8": {"text": "¿cuánto sale?"}, "8vR0HYniXtrrQqqSIN_JQ": {"text": "familia"}, "904w9Je6oDwGXUCIcrUZX": {"text": "lengua"}, "93YmZA7VfAT7TTNTsDE1W": {"text": "serie"}, "93hsW10TmX3Vcq_4IvcZ0": {"text": "blanco"}, "93tHieC_CgZqN998y5gAv": {"text": "chuleta"}, "97nIv-aoc51T8kKTZV5cM": {"text": "saliva"}, "9EqfwMNtATh1fwMhyn_B1": {"text": "buena"}, "9FiWvg197C-Riid-DVysN": {"text": "claro"}, "9GqE148SFZqMIft4evAk2": {"text": "comer"}, "9MzeUcz1nRqleTkmS_-g2": {"text": "barco"}, "9QyJdpUn0f6g7FxWs5qpO": {"text": "cortar"}, "9U8MzceIsqKhG86oNx9zV": {"text": "coche"}, "9UwpyOnOBoqr4mX3Juqm2": {"text": "buenas tardes"}, "9ZnzbKMDwGEwC3hXOhXFe": {"text": "pastillas"}, "9dvSIpeXa2_12Jip6noJP": {"text": "deportista"}, "9kgRI3KlOIVSuylKffW9g": {"text": "colores"}, "9lS0mNuKIS0olyDwoIJBR": {"text": "médico"}, "9mLx-YMK81AflitELQFqk": {"text": "papel"}, "9s5zV3_oGyDx_NEvsKCxX": {"text": "violín"}, "9wE9Py6ztyqDrtaypsltA": {"text": "naranja"}, "AOp6VGyjYIV0Ym9d0basJ": {"text": "dibujar"}, "APXF-lEplPOloppSeIjAY": {"text": "menos"}, "AQKGKdoX5CYycZ2YqBZVW": {"text": "barato"}, "AT_rDWsr6xRBgrvgw9Zih": {"text": "nueve"}, "AWJXh6URGN0Vwm66i6IvL": {"text": "hola"}, "AeFbJQ0M9uTObAlKEX3zr": {"text": "pierna"}, "Akf0xlH8UJdXn8BJzPV2A": {"text": "radio"}, "B1845IfYfPMz2FWpVFIQv": {"text": "de"}, "BKmATW2uBk4pxnmOaARyq": {"text": "documentos"}, "BNjZz9MGLJEKZ4CZoTs2M": {"text": "ajedrez"}, "BQhqx1PuF94jwT0ySTlbJ": {"text": "comida"}, "BQm-YCPc0lfD1-mhecCTL": {"text": "yo"}, "Bebnh8-UWwtYLnK6p3fKi": {"text": "pan negro"}, "BjqWZnzLlxdOo4KEzZ46j": {"text": "ocho"}, "BqS7d4PMhGRqPYlZQzUbR": {"text": "puerta"}, "Bub9ZYygLcly15D7_wYks": {"text": "amigo"}, "ByrvXHEN9Mb8D--7MQAjM": {"text": "peluche"}, "C12mJ1W11fODI3pv1QOnx": {"text": "gelatina"}, "C29KJ8BTFavhj_R9UfnSv": {"text": "por"}, "C2bgADoxmINRnAiYxZHqd": {"text": "taxista"}, "CBTemIvgIN1UAtftkc3sz": {"text": "pegar"}, "CCWCtXdMuQBJRmaFOAlfQ": {"text": "navidad"}, "CY-IQvUehkaiGFCdKf9bf": {"text": "chorizo"}, "CYH_6DL9q1iLLetuWeR9A": {"text": "tener"}, "CZrETqLgQlvDkLHvw1t_w": {"text": "a"}, "C_JKGNCxOI5x_f2C4qAyZ": {"text": "maní"}, "CbO32RkDdf9aCucv6BnGS": {"text": "cabra"}, "ChBc7LjL8dgzZ6LUCAHGh": {"text": "por favor"}, "CkTiaqBY3jf86JRq636lt": {"text": "¿cuál?"}, "CsKZSNiJw5Q48b26Kskf-": {"text": "heroe"}, "CxFmyJYmy6gMRqP9U0cBP": {"text": "estoy perdido"}, "CyKtU9yC0Jy7Ypb4WFp6w": {"text": "perro"}, "D1gCni2jXpCvKZe4qCtQN": {"text": "peces"}, "D2tSkngqbQmdKLNhn9xWV": {"text": "globos"}, "D7dt_hFX5DScV_ssm1nKz": {"text": "pomelo"}, "D85FU-Wqr2u53tfTXAtHo": {"text": "patalear"}, "DAq2J_xXHsSCSNPp9qVsk": {"text": "oler"}, "DBd09yUlbkaYLsemjFXEs": {"text": "helado"}, "DG1RiDjDfwWRhpAiIpPqA": {"text": "vómito"}, "DSgrhLHauub-gBqMGwacO": {"text": "asustado"}, "DXb0FpjVM9q8LVl9vvSHn": {"text": "clases"}, "DXpjgLKTdx9eLLohVdmWM": {"text": "verdulería"}, "D_4Weq7iyi7GMEsgP0xy6": {"text": "té"}, "Djs1QsLNf8Q5LBIFV5zNC": {"text": "partituras"}, "DkeHJFtqAS005fYUrl1Xz": {"text": "pantalon"}, "Dm3yiKSB134LrjtW_KrO7": {"text": "buen día"}, "DqGa4gqd2ABDi45BT43x4": {"text": "princesa"}, "Dv9MSCRYbR4Q3K114wXki": {"text": "alto"}, "E-vUPARie8MmfgZwv3Omr": {"text": "gallo"}, "EM8VyonJ7WNdvmRyE3nhZ": {"text": "lento"}, "EO4O-s7oafi6QJdxTFNkd": {"text": "anticongestivo"}, "ETZNYbrG5wveDl6c9k2_k": {"text": "codo"}, "EUsNyf5bDdSLqvZKH1Ltx": {"text": "no entiendo"}, "EVmt43vDI3NHFfbbkqokF": {"text": "pizza"}, "Erg6LuA8IOQ5V8RTP3pPi": {"text": "abeja"}, "F4cGnA_QHsVKTjUE6MAu9": {"text": "mameluco"}, "F7kJ8VM31BWB4K4T4USzs": {"text": "maltrato físico"}, "F8roVYxKZi88UUGfOvTwl": {"text": "maestra"}, "F90bXbc0tz9nuzTT7SgqV": {"text": "cuatro"}, "FBPIabyaoCK-Y0BziQdji": {"text": "dolor de panza"}, "FBTheEQmZZfJRiYjd_Np_": {"text": "interpretar"}, "FO77qpzyz28knodNtILCA": {"text": "tirar la cadena"}, "FTngK946O8S8bYc0g7vM2": {"text": "mamá"}, "FaVvbVzZivuxTwxJTPubK": {"text": "hermanos"}, "FfNU04I4mZ54gWcBXqo2c": {"text": "panceta"}, "FgTird367surh-vxXyAK6": {"text": "ticket"}, "FkC5DtSV81OvFMU99qZGg": {"text": "pelota"}, "FnCBoLSE19WsbUypUKvFc": {"text": "hamburguesa"}, "Fogupb264IyCtbZ-Q2D6w": {"text": "borracho"}, "Fvm2C5NBq01tm0QK9d9QM": {"text": "hijos"}, "G09TvOzDSG5m3hTQD9Tej": {"text": "borrar"}, "G2i9LSK4A19237Zp1vXqF": {"text": "gordito"}, "G6KKVMvPDnjdD9TfBd-B9": {"text": "playo"}, "GAxX7EIz1TTLtMX08RRGr": {"text": "hamburguesería"}, "GJlUSznzEHCgoAOrVrkp9": {"text": "feliz"}, "GSEumxiyeVKRRiaY_c8HW": {"text": "crol"}, "GY_flM-6uR6X3L4AwsiwU": {"text": "para"}, "G_CRpzxWO5XdEMh01O1eJ": {"text": "aunque"}, "Gj7THa6XFHDfYL5H19lwj": {"text": "mañana"}, "Gm_qAGnL4OawmlYmTs7K5": {"text": "no veo"}, "GoJuWnn72TCXONXKtYHMm": {"text": "tren"}, "Gvmy--9DiUn_tkQYWeWhA": {"text": "canelones"}, "GxrDtsdGcLepdsQr6V9DT": {"text": "verde"}, "H2zMVtjvqi7aUtCypiVKr": {"text": "sentar"}, "H8Bsrr2NK9Q3WGbEp8PMe": {"text": "plateado"}, "H9SWPnWbR8qcZA-iu5Mz0": {"text": "dolor de Oido"}, "HBZNu6m3FELU9eg3OeLdx": {"text": "cortina"}, "HKfLJS8aCBtKuKJeSBQUW": {"text": "golpe"}, "HMPabuHqgtyiCmTLzg-rM": {"text": "entrar"}, "HQiQh4PPBvO1n-d7JGVj8": {"text": "nadie"}, "HTBNWax6FCSGXuboGsVUW": {"text": "salado"}, "HnuZA0UTlnuIfFAN7saxl": {"text": "conejo"}, "Hvb4JdDHX_vNMck_US2UN": {"text": "ensayar"}, "I5AJgba5GTdEjdpFB-LBf": {"text": "chocolatada"}, "IAdQsjTsbBUAMjlwW34cw": {"text": "me encantaría"}, "IEeIvawUD2GIAr1Wypr9i": {"text": "personas"}, "IF3R7tLVAkd4RbL8R07K9": {"text": "actor"}, "IM8OUKCzHwnjAQWPFgnn6": {"text": "lejos"}, "INxOSvKbBNOXwruIpuNho": {"text": "ombligo"}, "IO8uTb1K7ElENgp2ujZoK": {"text": "robusto"}, "IXRWmFmtqfnHQRcBf1Idl": {"text": "paloma"}, "IZbfYRzu2cxxDWdbmQeqw": {"text": "cabeza"}, "Ig1oypuwndODbmKh_NEXs": {"text": "malla"}, "IsWUeiPnDEnzxePKclBNp": {"text": "feo"}, "J3qQMp0OMr5LC9ebfArxH": {"text": "ninguno"}, "J3rDL96c2zfBQzP45VRCp": {"text": "limón"}, "J4UUPR-WP0qo1y14bUVI-": {"text": "veterinario"}, "J7MmgugOu20UtMcMPj59r": {"text": "canción"}, "J7wLwBLVx4UANh_x5HdXd": {"text": "según"}, "JB9SIxWzxWFjrbmMuksrY": {"text": "reir"}, "JBIehRNmDbK2ALcRN0u9i": {"text": "gallo"}, "JBKQaBezKuSDaMsnbJMTB": {"text": "bar"}, "JBU2hMw9gbIy9-wGF4mjD": {"text": "pizarrón"}, "JDbBWMB5No0pK6HvntLt4": {"text": "lavarme las manos"}, "JEDIYq1BDA23ac9TNhON-": {"text": "ayuda"}, "JFldbhjqxK3fD6D2K4HY4": {"text": "papá"}, "JGm4BL7HAfuxX_PGe6Jzk": {"text": "presente"}, "JQOpcZSCPGMOWZsN8w_yb": {"text": "¿qué hora es?"}, "JSFuEHlP-CFvuqvFKMumC": {"text": "autos de juguete"}, "JVtu9W3AumOwjUedwhUGE": {"text": "rehabilitación"}, "JZRBfIXBkeuobtDXbLt5t": {"text": "adiós"}, "JawnUo-pseWb3FDVMtxrQ": {"text": "yogur"}, "JblWXW8TKDCuYu2yTnFBA": {"text": "mesa"}, "Ji5OVFX-uNDewL8eX8Cin": {"text": "pensar"}, "Jjq8CM8JrYHIMziuQy-WN": {"text": "agenda"}, "JziaulL-lrAPGNVvwBPK9": {"text": "verano"}, "K382TlNZjdMLLpAhCCXLG": {"text": "almendras"}, "K6hd20tWZfwwlYYi7jctt": {"text": "rica"}, "K8cMIDL0ubQvWhhDtr65F": {"text": "llorar"}, "K8e2-KkvZfFOQaXnhR37x": {"text": "cansado"}, "KC18_sTEqKucPQ-iwEKYY": {"text": "lapiz"}, "KK_i8H9qTfDVYZkQGwd2v": {"text": "apagar"}, "KNH4sLRpVKtHXQa-0y84K": {"text": "nervioso"}, "KWYVDZiERE8jtRsL0faHH": {"text": "nadar"}, "KXHW4m6vXxQU-AEOR4pZ4": {"text": "balón de fútbol"}, "Khdk8mWpyxgLqfC-6lyT9": {"text": "burro"}, "KhyTKtiL4ZT4Z1saU1eJh": {"text": "escuchar música"}, "Kn9vE07FK1LrzoD_YxrJD": {"text": "subte"}, "KpLFOrpuhFKaIbBbFwVVu": {"text": "mariposa"}, "KrOPANVpdkBWdEZoUwxKf": {"text": "grave"}, "KvY6Taigm4Va_cVjXAfGR": {"text": "corto"}, "L0hfYADgzghRVsZLZHRxE": {"text": "bailarín"}, "L19r487_d3RqWXiNuh3gE": {"text": "¿qué color es?"}, "L6YLAEsbYcTq-ycQJTvt4": {"text": "pollo"}, "LAuEISciEf1Wc1j4fERz8": {"text": "año nuevo"}, "LDoi3cxodn_AVKSG-Bf_1": {"text": "ojos"}, "LEVKlDlJ0wHo5QEjCNAGa": {"text": "pegamento"}, "LEg8z-Q-ONLAAXd-aH_Hb": {"text": "bajo"}, "LNBTW0qQtHYQEHatkWGtc": {"text": "mercado"}, "LRIKzfm9ZsdNe1u7CUuW_": {"text": "¿cuántos?"}, "LRfh-4RAZTj7cnnDwBmqj": {"text": "flotador"}, "LU7IoUksATEBhd8PaHS1R": {"text": "sacar"}, "LaKT8VTw0_6rvordp5-R8": {"text": "rosa"}, "LiBr37yi-YBgQDx4unjyc": {"text": "dá"}, "LjTGOcyG7DkTs1lJqNr8w": {"text": "cabellera"}, "LksmOMPPOMArbrFsscqOW": {"text": "música"}, "LmGq1AZs2a0x26r7E9GUj": {"text": "maestro"}, "LngEMJa_ihV8mB7afZX-h": {"text": "ellas"}, "LrDai7jXlGAdZ3e8ZQezj": {"text": "hacer pis"}, "M5q2CXmK0_WVaVUB_HJB3": {"text": "caliente"}, "MEqo2TROHyroK318sm84f": {"text": "pasta"}, "MKR-ukiUlJy4uuqO30UU6": {"text": "maltrato verbal"}, "MMzjhHID8HMqyPjii5o-h": {"text": "cocina"}, "MNCcHiImRS8tmvhBhzCKj": {"text": "ensalada"}, "MQHnvvU48NnEptP8a9w8C": {"text": "no me gusta"}, "MWIzTM6zhTWL1V-brLtBx": {"text": "cómodo"}, "MYqfOzKx2qMHop8GaHs0I": {"text": "verde Claro"}, "MiOe5_Djf-pE9V9aDZ_1G": {"text": "ananá"}, "MqQgYn5B0uV-DMORCBOmV": {"text": "triste"}, "Mw6WRebMAKWwXfAvDA7vu": {"text": "tener calor"}, "N2baGNTOapSaFDo1GURiW": {"text": "no escucho"}, "N7n4zQIkJZOhaYESk2GgH": {"text": "caer"}, "NFdUTit6Ff-4S7Nzf92U5": {"text": "estreñimiento"}, "NFgGqhEtl0HqipCGGEvwU": {"text": "peinarme"}, "NKQwWPAsVHwFBWuksqfns": {"text": "ducha"}, "NLi5ODIzyMAwr2HpDXACp": {"text": "nariz"}, "NQayjogCYiimP_0OxIfFj": {"text": "zapatos"}, "NVe4u7BTAVfLk3xkDqLnZ": {"text": "horno"}, "NVjfEut567uXpTaQUNI2i": {"text": "campera"}, "N_893wsadpGg3Ip5sEThe": {"text": "azul"}, "NaJxTPq9Ld8I4fwAltyEC": {"text": "maiz"}, "NjulpZ9x63ZqxtLMoRjkx": {"text": "prender la luz"}, "Njz8DrErsexBu8mAI6mnr": {"text": "pescado"}, "NmNouLLx13jzE27jliI_v": {"text": "diente"}, "NuhUikdCxP0NgsbO0wvAU": {"text": "cola"}, "O-CLnVuXAUapOn6TbdhKx": {"text": "querer"}, "O450x4W3OOacvJIy4QicJ": {"text": "verduras"}, "OHyrmD5US1rHEAEwLQaII": {"text": "animales"}, "OKXIGnLh-i1ydTNj450Q8": {"text": "reina"}, "OUcfOOReAfQroBKlBdDb-": {"text": "solución salina"}, "OWLDc7Hn3neBAf_V_N27n": {"text": "abrochar"}, "O_ZfCPZSxGMPT6orCt-O6": {"text": "chancho"}, "OblxxVFC-LKPq-8oC9FpE": {"text": "sentimientos"}, "OdCdTUAlbN6kvsPjby_Bi": {"text": "deportes"}, "OeA63q6LpqGvXW-cJXEym": {"text": "jamón"}, "OeytAsSiEAWC10tXhxbTa": {"text": "personajes"}, "OhrHu-xLo8hcn5plWfoX4": {"text": "caro"}, "Om1Bvqu8nmGuNGwV8hndM": {"text": "bajo"}, "OvyFC1GHkvJZ0dAAF1QkY": {"text": "él"}, "OwHzJdOQTFOA8daCVRwm6": {"text": "pincel"}, "P5zdq4x58yp5TA_soKQEJ": {"text": "bicicleta"}, "PAlC0XSZNru3-LXtfvGjo": {"text": "hacer el amor"}, "PBqpK7LL1HQPwowPitrss": {"text": "leer"}, "PFAi3SdvH9vL7_Bg3MhCA": {"text": "semáforo"}, "PIBHv5VueBi-sf5qFCN_Y": {"text": "ante"}, "PIPQnVS2UiS7kGbucJP8l": {"text": "curar"}, "PLXxIPYyztaztLf4sPCst": {"text": "garganta"}, "PbtM3htZocZb8YifuPoY5": {"text": "cangrejo"}, "PfNLmlHKFT9d1w6IgeXbU": {"text": "control remoto"}, "Pl-M4bc6k2rdhu6FHEbkA": {"text": "patio"}, "PogTYrGfa2WNfBRuA8O4e": {"text": "malo"}, "PszHdOxMsS_tAzSrN52Wa": {"text": "plastilina"}, "Pw3GgPwp7fpDVC6wJjgPn": {"text": "subir"}, "Q6LQqdLcvNOiCFjC0DVo2": {"text": "tambor"}, "Q6nNH4AIoSeDHODC_Ip8O": {"text": "vecino"}, "Q9Ra0aJaQnOJQ1Kqdc43-": {"text": "bebé"}, "QCQRmsQY6AggjreY9Z0MF": {"text": "rechazar"}, "QGf1Tb1roL7HAXUSrRqRJ": {"text": "naranja"}, "QJhkOh48xapiTObEDQLB9": {"text": "piano"}, "QTkFHWp9KEDgfCjoQjBY2": {"text": "plurales"}, "QUTQLuD2Gv7fHh0V_O5tg": {"text": "avergonzado"}, "QVqSPPgA89whFTJ0HTphK": {"text": "abrir"}, "QZNQOaf0SdHDbx1otCmrH": {"text": "niño"}, "QcGJ9u_JqmrW0X47PXWH4": {"text": "despeinada"}, "QclUM2p3iexSjFZI8OU4-": {"text": "fiebre"}, "QeqA20MCXB-zNfuKIssMY": {"text": "lata de atún"}, "QllvOUe8utZrcBRGw_0vc": {"text": "curita"}, "QnlQ1HOEB9yNjuW3Dd6fc": {"text": "celebración"}, "Qo3Qn_nMe3E6EqNw0UdNZ": {"text": "soleado"}, "QohNih4wgqjnpWt3kSwtd": {"text": "entrenador"}, "QvaMxPy-3iixHAJFyIrN-": {"text": "sandwich"}, "R06chAQYswLtQK46OInW7": {"text": "leche con galletas"}, "R9ECa_HQRtpFrb59ebMTQ": {"text": "escuela"}, "RBCjBvNXQSZOOpg-5lBlK": {"text": "bueno"}, "RZfMOtjw0DoGHWaRfCEc4": {"text": "pantalón"}, "Ra2rxEEohwxRqDsW2AT3C": {"text": "videojuegos"}, "RbZetbSC5064rZccOFD1D": {"text": "televisión"}, "RkpoG4KB8m_TJFJf2v3EG": {"text": "cambiar de canal"}, "RwlZ1jr2Ix3evzrW71lN0": {"text": "manzana"}, "S3um53pcko7_BPHy7R6FL": {"text": "nosotros"}, "SE-71I_ahm3oKROReyJHE": {"text": "hacer caca"}, "SOyGnJXLPeVRoZy3vBgpK": {"text": "examen"}, "SXz8iA1Qn_BlgLTAG6Epl": {"text": "cena"}, "SiOmZdwX8Hf2nE2v6HfCp": {"text": "zapato"}, "Sp2Ias_Y1HplkHWjIb7Mp": {"text": "sin"}, "TAbuXSnSHU6C3CQ4kbKVh": {"text": "triángulo"}, "TBV2BhoZVgl1jMV_jWZYi": {"text": "derecha"}, "TIgoS-YONIwzbrImXetaD": {"text": "ciruela"}, "TIsM6aTTZ9W8j6UhW9Qqj": {"text": "coro"}, "TLxsYdrBdHgFZkNJtVTmK": {"text": "tortuga"}, "TP-gGRcpcFyx1SrNRsdRV": {"text": "perdón"}, "TR5CXN8-pfbWkshdxSBSV": {"text": "oveja"}, "TS9z8ZmMEwn0MGSfr9amH": {"text": "palta"}, "TZF-7m8VKZ7IL6pyv0Daf": {"text": "cepillarme los dientes"}, "T_Q5c4XAfkhkclmnCGHo5": {"text": "hasta"}, "Td5pgVQDTFOftUgOJ-bD-": {"text": "picante"}, "Te_jJfeU8Xwa9St2RihBq": {"text": "sangre"}, "ThqkHs4az5tgLqLcfFPaZ": {"text": "largo"}, "TpPNZLsh5jrN9RdPFwmA7": {"text": "¡genial!"}, "Tpj-Fs8LQ566TM0bYlZ6H": {"text": "viernes"}, "TuAjBKPp3-PSdQuooSWZi": {"text": "rana"}, "TyqVzfOniQNa9WKQRXqr-": {"text": "hermana"}, "U1KQsrvTa2E00-ugc-Iy6": {"text": "ausente"}, "U6PoeH-cMdO3ttnLkN7_3": {"text": "cabalgar"}, "U7GiGcYacowWi4MWrCYyj": {"text": "antiinflamatorio"}, "UQ-5wOfR0tDzljoDjj2xU": {"text": "otoño"}, "UQ5B5K-tpk1XmQC1B9TjQ": {"text": "no"}, "US8_vYTnDfxBw2Ung_J38": {"text": "partes íntimas"}, "UVzdJiqY36fqgBYyz880c": {"text": "jamón crudo"}, "UXJDiwb3j_zyfGa26ByJL": {"text": "pecho"}, "Ubaq6h7wasdP_YRombm2c": {"text": "azúcar"}, "Ugs9V9c2c5iHrVC6p17zr": {"text": "analgésico"}, "Uk1Emn5IovsTfFzpQX5Jw": {"text": "sosten"}, "UkLF5sKtVKW0D8RzVCoue": {"text": "bombero"}, "UnQJwWfWCe40DJYR1Er0o": {"text": "dolor"}, "UssSOEEKutvzB_B4fAQE-": {"text": "escuchar de nuevo"}, "Ust3oadA0PUGViYo28Mf3": {"text": "caminar"}, "UvRS0KmtZn3dq7e8L5RcE": {"text": "enojado"}, "UwvZVcX_CAQFrI6U4LsNT": {"text": "huevo"}, "VJ9AU_y7CqsONR6TvhdLh": {"text": "¿dónde es?"}, "VKrLGgYjc-nLPGsyESDgb": {"text": "canario"}, "VL4pd0vnJ-CNfMg9bCNed": {"text": "aspirina"}, "VUJ-zrdsyL9MOuFbdMCAx": {"text": "mareo"}, "Vioyf8EXJfY5t34NnN0WO": {"text": "tablet"}, "Vjlet5P7XuqTrc22nt_Zz": {"text": "agua"}, "Vmnu5eormo-_TOCgF4YzG": {"text": "jarabe para la tos"}, "VoZumy5GtnRdqSOmXAw7j": {"text": "preparado"}, "VrC7AnovfA7VzmYESVc8L": {"text": "conversar"}, "VwZ4EKSggYWxlnAbp-pNB": {"text": "enfermo"}, "Vzov0z9acB-I1_W_CcFcY": {"text": "rojo"}, "WDUIQV43zghFQq_rSk1Z4": {"text": "churrasco"}, "WL3ZN-W_zgnuTJpuqz0YQ": {"text": "príncipe"}, "WNhpmD_XlTaNEBo7GsFXu": {"text": "diarrea"}, "WQ0CNIQ_gjaCxg4tEIsOo": {"text": "clavado"}, "WRzleD-mI84LaimFH8h6P": {"text": "escuchar"}, "WUt3I-NkdbqlSVcwuLfFx": {"text": "patines"}, "WWK2v56LM-zWqujabk9bM": {"text": "plástica"}, "W_f7h3qOLl2uEd_OYpMfQ": {"text": "policía"}, "WasZ5bKZZy5Jt4Y-JipxS": {"text": "bikini"}, "Wgh5iCzUmx4Je-B85-pra": {"text": "heladera"}, "WjXQhSFPpz42ZUyHvurYG": {"text": "grillo"}, "WtYSntcy2CijEORmROeaj": {"text": "un cuarto"}, "Wu47Qs6Zupu1Ox2gUhkxn": {"text": "cuarto"}, "Wva5W8GA0dHzyt2_0FPdm": {"text": "hermano"}, "X0-Tf-KR24qEkpGDzG2Z-": {"text": "ayer"}, "X3u4pXTWKcGc43lOkgSBt": {"text": "cumplimiento"}, "XA952Z60D0-cesNCVA-OX": {"text": "chau"}, "XC5fIljJ819OYpllYTjpE": {"text": "jirafa"}, "XN0nzhQyHVOhuYuNqrp8g": {"text": "durazno"}, "XOoGN6huCjVHxH8hRFAw1": {"text": "blanca"}, "XY6ZCNzeJIEzLtWJcufJm": {"text": "camiseta manga larga"}, "XYY8SV1IAMHjdGjMZxbdy": {"text": "cancha"}, "XeVaDdUWSEkhfJvTVvUHR": {"text": "salir"}, "XnocVMEeUGCSnlnusP44O": {"text": "agarrar"}, "XuAtFop5_JNSYiZkUBzaU": {"text": "cocinar"}, "Y5HQq_4crSF2lpwH-KUrt": {"text": "dos"}, "YCu-B26PqjE30AhikHdkI": {"text": "dibujos animados"}, "YIP0Xc4aJsfv0s8BpiQnn": {"text": "cinco"}, "YLKXFZ9ze9K9NvJiAx8w0": {"text": "¿qué?"}, "YbrNtdUmyMNdAF5CfvY1A": {"text": "toalla"}, "YbvMRsCtMbww8OQgF45QF": {"text": "resfrío"}, "YeT-jstVSA7-mD9t99Isg": {"text": "rompecabeza"}, "YusWY8GwdO43bSp1o3BWC": {"text": "molesto"}, "Yvxm8RGoFYKUsIXOl33yR": {"text": "apagar la luz"}, "Z5-sBklfLIWE00CJ_T_ZK": {"text": "cuchara"}, "Z8xp3kxXuhMVoNm7ddQSX": {"text": "lanzar"}, "ZA2C4bJaL90lBxsTemYWZ": {"text": "piscina"}, "ZAnmv4CLb7hldYUlp2wJU": {"text": "ninguno"}, "ZBIFtTq-BH1jv5jLbzrhj": {"text": "repetir"}, "ZQEXAf10BkoTvCJx3Ox39": {"text": "sorpresa"}, "ZR-NXJk3SD351W-95cf_T": {"text": "pintar"}, "ZRYQmYRGKzheBqk11eGRZ": {"text": "ballena"}, "Zm4OIanIKTigDGIsInO7o": {"text": "un supermercado"}, "ZnMba2r4XIg9lPi_H2d_Z": {"text": "sí"}, "_1lOt0C0MQhvU8QWC6_oZ": {"text": "buenas noches"}, "_2SjbH-xHZq173EU4J65c": {"text": "parque"}, "_3ihCSMQCokXNo8pXii-h": {"text": "llamar a alguien"}, "_8RIOebHpkr9nCy0_9qhP": {"text": "llamar"}, "_CsJMxqGcNSaujXwRZcpu": {"text": "ansioso"}, "_FNTsoEjTMV3Uas-gggi2": {"text": "estrés"}, "_HUf6SR0mTP7v72Y9_4gw": {"text": "coche de bomberos"}, "_Lc2-NNL69ZX-aVnUNzgx": {"text": "frutilla"}, "_S9Eck14cdOTr0QH4i7sQ": {"text": "cuarto de baño"}, "_WIT6qs1kaiJqB1Ild5Xs": {"text": "paseo"}, "_eug92AvR1UXpYlfm6o_Q": {"text": "dorado"}, "_hqTU9A7I3RFDVrcIEK-L": {"text": "%null%"}, "_lU200bb9Sjv0b_iJKgU2": {"text": "una bicicletería"}, "_tDZtalMxKSNpWydJ1aeW": {"text": "cero"}, "aC_XP9Ch5PqWoCmcJwI77": {"text": "algodón"}, "aMs2YNnWkw4XN0gAm-jI3": {"text": "cajón"}, "aP9QisUdxhgOKIQ2kHNb3": {"text": "acelga"}, "aSzpwNza22HZp46Sh6wfx": {"text": "súcio"}, "aTwzShtP_zR9x6bSGSzEB": {"text": "muslo de pollo"}, "aXLBXkENJqTYkyZOP8TNS": {"text": "tú"}, "aa3xDW6F9YUKyX0fe5uX8": {"text": "espaldas"}, "ajesFjbC7hwCNLKdif-ix": {"text": "contra"}, "ak5fBauJzapC4JIf0lT8N": {"text": "cerro"}, "alsoa_V3wz3vPpG1TKRZc": {"text": "transportes"}, "amk4WRd1sNEIp24pnFw8j": {"text": "rodilla"}, "armmpopt2RLsVDlqLrQ94": {"text": "restaurante"}, "atVEXuftxSiDDj8rzUlFg": {"text": "crayones"}, "atWxG3KTHB5moW1dylLJc": {"text": "juguete"}, "avzcTznCsQCISYJsLC-w_": {"text": "notas musicales"}, "b1XpSC0ndnm0ZewNXC3pp": {"text": "carnicero"}, "b5OdBMMzkf1FlQbUR5-m7": {"text": "servilletas"}, "b9Y5MrR-jn8fh77gAkLZy": {"text": "pintar"}, "bAoK85XLNb7p0ebevYZ6O": {"text": "mirarme al espejo"}, "bDnuS19hfd9GhJ-6rjNPD": {"text": "estar"}, "bFodvUraUhJeq4waMdlxv": {"text": "domingo"}, "bNJfccUvG2DQfR1iZP3eR": {"text": "serpiente"}, "bVN3R44VuZDw3IdQMolca": {"text": "cambiar"}, "beNprvNb0UztxR4JLxDFm": {"text": "cumpleaños"}, "bge6qR6NzsD5Vk4ifPsSO": {"text": "ketchup"}, "bpSuQQRlIcSse40OAxNSG": {"text": "lunes"}, "bqjKW_qBtRzIThWxdZx2s": {"text": "gafas de sol"}, "buyy_2ydocKoi9TnBhZ1N": {"text": "amiga"}, "bw3rqHXD1TJ53xbNggEqH": {"text": "desayuno"}, "c7kK5ROVbO3DHrwSFEawq": {"text": "dulce"}, "cI0JxwhkWU-YA7E7rmJtp": {"text": "cuello"}, "cJMQi3SVmqvWJ00VxI6gy": {"text": "¿cómo estás?"}, "cJw2i319mzBUpEfBRDxc9": {"text": "pez"}, "cJzHrV_PsV-PwwyFN9jka": {"text": "%null%"}, "cS3g4KXf39akVFHCG5AwL": {"text": "camión de juguete"}, "cTiw7_Yjxu_Kg90q7PdYl": {"text": "gripe"}, "cb0rJJEYOeEoRU5fDdQQq": {"text": "el"}, "ccGASDOGtty6GfQMEEBEU": {"text": "tres"}, "cj6OuVw4Nob8jxP-E4rZc": {"text": "cambiarme la ropa"}, "cnyLFMkJu2i3cqOY0e9kl": {"text": "pasas"}, "curstMeuThu2KUph-8rkB": {"text": "jugar con"}, "cxMNBGV3LytDXgwDMCiga": {"text": "violeta"}, "d4zNoj2BAFG9B7J3KAlLE": {"text": "botones"}, "d6s8fLFBiQ3KEJlNdJfUW": {"text": "un poco loco"}, "dHM0qnbmtJAkZY0WBsqaY": {"text": "lila"}, "dLHDzm0rfgL-vXTx14HSm": {"text": "buscar"}, "dNvN5P787hAPE7ZYNgwkw": {"text": "pasear"}, "dR72liRxC3qmoSa6Dz2a2": {"text": "jarabe"}, "dS-KyYREUQIk7sDlmsvoa": {"text": "cerca"}, "d_I8jNfbkQD0CHgZn7hyB": {"text": "camisa"}, "dgm3NCKuz7L39PX8LYxj7": {"text": "juguetes"}, "djgKI9embnk95PAtFcn45": {"text": "cambiarme el pañal"}, "dn41o5K_1fo-qHO-YLoQn": {"text": "sábado"}, "dnXsSOeVG7mq37uciIi2J": {"text": "recreo"}, "e5sCl246xFMESEfFy2PhX": {"text": "coche"}, "e5un1yrIuZHQi048e5kD6": {"text": "alfajores"}, "e8zl_ecIloo4Vk-OZPJWe": {"text": "jugar con la tablet"}, "eDX2HSkGaY2TeVwPjR07S": {"text": "fácil"}, "eGJ8MC1xPE6ueF82jCmVg": {"text": "cepillar"}, "eKJCZc-kD0-m6cVLorFzO": {"text": "pera"}, "eWSI1NInbQowtO99phhGA": {"text": "boca"}, "eZEqRZjRK8JJMsfHo4Y7w": {"text": "del"}, "ebo03xnkyiHD2pKUKULmr": {"text": "dibujos animados"}, "ecUOs24Pp5ZTRt_ZvED5W": {"text": "acompañar"}, "eduqLSyC3m4uB1Oee6dt6": {"text": "mitad"}, "eji-M2j5eHkG71DCksleY": {"text": "huevo duro"}, "emm_RirDsO30Enax5Q4gd": {"text": "con"}, "eo3Q5AjHJz5kp1EbdALwh": {"text": "ustedes"}, "eoYtISVZl3mdwoE_HW-Mv": {"text": "guitarra"}, "et1KiL5-zob_EcGlj7tLN": {"text": "despues"}, "f2dl12fMZbRdQ7STpcTdk": {"text": "fútbol"}, "fF3ijeQzetfSn6EGcs1yY": {"text": "cerezas"}, "fL_4POdbPVL9-lvQVWSqY": {"text": "avión de juguete"}, "fNAlqbgrpirQZO_LhrkXY": {"text": "primavera"}, "fNv4Nb6Vafxk0JxXr-iDo": {"text": "investigar"}, "fUUj_4pKPflmJlxZfk0cX": {"text": "discoteca"}, "ff7ES190q1dmFYZ7lo6x0": {"text": "pan blanco"}, "fjCOcN-PKP6F07IZcI71X": {"text": "plaza"}, "fkNwVm56PSe-qh-QoM0vm": {"text": "allá"}, "fk_z_HrvcUh8XIq8D6gQP": {"text": "nueces"}, "g1Cj6HW8kg8yPE1XX9pxa": {"text": "desde"}, "g1TLUpuQX2Zs1ob9gqYui": {"text": "gorro"}, "g2MhHawoIC9oFNEv5_w63": {"text": "vida"}, "g2sQSxCcoZuKJ3TabK6oT": {"text": "vino"}, "g75y4E53ViakV-s5UfnIF": {"text": "equipaje"}, "gFEnqFhYoXF7QN-n0ONad": {"text": "montaña"}, "gYrIz3R13-BC_pYcvQ9BL": {"text": "invierno"}, "gaem1LHTtfQdnnqYi-sOm": {"text": "billetera"}, "gff2FqDlgXknRld7YMLWl": {"text": "entero"}, "gsU8pE9ozhR73xS2icwJ0": {"text": "libro"}, "gvPwrzDSSEPwcxY878T_c": {"text": "gato"}, "gzCjycNS8Cf0vNlo1klji": {"text": "molesto"}, "gzb-RNDLMNkgk9wnPILJi": {"text": "abuela"}, "hAZhogJSH3bL1iL237N8J": {"text": "pochoclos"}, "hDvpMlPw-chcuxEisBJTl": {"text": "castañas"}, "hKJhXxultsxm0TJl1P8-L": {"text": "chau"}, "hOyjT1JgOYB-mGLFMaNJR": {"text": "dolor de pecho"}, "hT3Lrjn5-q7YIM1loG4MN": {"text": "parlante"}, "hUYfE_vmNBT_7E60YZsSu": {"text": "pintura"}, "hWWOw1gWjWwN7wQJkHrTu": {"text": "tour"}, "hXgGhazQ_nA5uqpRD6Qwq": {"text": "ganar"}, "hmhAUgqvGp7nc1w25sRSx": {"text": "esperar"}, "hwzwfMyJsvB42F_QWQWyi": {"text": "jugo de uva"}, "hyUaYltGVJU-wRrAjhhPa": {"text": "cantante"}, "i0wB--S4sdL8Q4H9b93UY": {"text": "ácido"}, "i2mlV3zGS6nrH2l6N2BlZ": {"text": "trompeta"}, "iAqItRUQL_YpbMn2pgjsA": {"text": "pizzería"}, "ibtmTEP3QGDY8TyVLteuX": {"text": "blando"}, "ifd0M0pAlFm7aPt1A0ze_": {"text": "amar"}, "iiA1u1JKRmhe2jWVE_W79": {"text": "amigos"}, "iimGxVoFWlq_THThR3vmF": {"text": "noticias"}, "ijn-QwQuTxRFFVe-7WlSX": {"text": "picazón"}, "iowxE4MxcV6PR2Uhtvxqs": {"text": "hospital"}, "irbOv2dHA7G969dnJMfJn": {"text": "cuaderno"}, "islCzqFq1SYrZAh63dLhQ": {"text": "huevo frito"}, "j5xZZev5nTNa-p088Oqnp": {"text": "besar"}, "jBqD3qhhcrioLlCU-xq5b": {"text": "instrumentos musicales"}, "jOALQbfxdXmJVyY6P5gZG": {"text": "damasco"}, "jTEb3A5ZEKEy2ojuq2vO_": {"text": "hueso"}, "jeO9YZ22LfSObUNhQDRAz": {"text": "ventana"}, "jfly9fZ3x1da4SGCCNcV2": {"text": "bufanda"}, "jfvreGZv-e8rD4-01wZ5H": {"text": "venda"}, "jhJ2TOfdaRAcVeHGOjwua": {"text": "leche"}, "jmzg4EiC7JEHwe9gNP3C3": {"text": "arroz"}, "jpKPg3hn6_GO1HSkeLNGz": {"text": "niña"}, "jprAsdXWGQKPlUWwgBBot": {"text": "película"}, "jtKc2q2n5an342ZkiMB9R": {"text": "higiene personal"}, "k-iDOTk5uO7ZK5OB3v8It": {"text": "viejo"}, "k41gkf6A_bDtQAJDOrWpP": {"text": "pasta de dientes"}, "k7dZhQtwDPFlOk1iPjEOz": {"text": "subir volumen"}, "k8tJx6PikRcnVuZEqrXRM": {"text": "viajar"}, "k9ZpWM4oRb1q20c0qWCsg": {"text": "abrigo"}, "kDzHKO8eIwNsyKWDw7M0c": {"text": "uva"}, "kIn8SeGURyvu49EsRqDs7": {"text": "pijama"}, "kN85Lb_C4dLnww7sz1afK": {"text": "café"}, "kaiWPbXxjHXlqcpBaBp4l": {"text": "viajar"}, "khUUL_1JQGngApqBRDh_q": {"text": "arreglado"}, "kpghvJtujlt4vPI2N6vsg": {"text": "o"}, "kxuGlfYjS6puO2xD1QvxO": {"text": "vamos"}, "lKA4b7I3iFkqNzPcAXyBc": {"text": "cocinero"}, "lKMW_xTZzCrCHRcGp-Z-n": {"text": "galleta"}, "lR84gCk8OM-oYoLAV7tar": {"text": "timbre"}, "lXH68vGIuZdfA8xVrS8iw": {"text": "mucho"}, "l_ncJLRdVGBzzQc9yqBqs": {"text": "banana"}, "lrUuPKco_O8FXDuclzpKE": {"text": "necesitar"}, "m0434KkjeTv8SGN7WxR2C": {"text": "negro"}, "m0Fkio76HZHS2HguPOTn5": {"text": "seis"}, "m17b6MazSk6M4gb51_cCy": {"text": "pulmones"}, "m39xTdgaenoi4mWGEa-Ew": {"text": "plato"}, "m3qTT8tiGZQheKIWREzMT": {"text": "ir a"}, "mC9Nb7zVdEUpjEBODw_gL": {"text": "vos"}, "mFfylZ8yoLvtkVSDTlVEN": {"text": "pomada"}, "mJqzbxYeIDQciPkeHA1Ao": {"text": "cuchillo"}, "mK4AXXhoIVirBz5dr_xLA": {"text": "pavo"}, "mRK--C5Q1aGe8MMPJJLYi": {"text": "preocupado"}, "mTklFAI-FVVLsMKoASZ7T": {"text": "desconocido"}, "mWXxPPvhSHf9hyb-VyuZH": {"text": "e"}, "mZFwH8xY_OeVDWCdvPZBy": {"text": "pie"}, "miPmA2tOQiLxOW7D_V_x6": {"text": "cubos"}, "ms97ZsgQOvD-Z8qpSW4oN": {"text": "¿quiénes?"}, "mx6dmRLXA_lkN1QlP71vq": {"text": "todas"}, "n5bZClAB6jXAZnwxIwH-1": {"text": "tostada"}, "nK7DRpxalLBHL9OnRjSim": {"text": "frambuesa"}, "nMQUtS-kFHViOKyop1FdS": {"text": "vincha"}, "nQSk6_KCEVdO7oC_uxLXN": {"text": "oreja"}, "nQdbkRVcwpQB_hFNPbe6M": {"text": "caballo"}, "nUg2M7p5sUPlGdbBev2-G": {"text": "tobillos"}, "nm6e_s01gWHzdVj25BHyq": {"text": "¡qué lindo!"}, "nnTJQMJWfd2nuTSlFNEOy": {"text": "mío"}, "ntzBlFkDMTKEUHoGNc65u": {"text": "baño"}, "o0oxaoUFpOLiGsoQBlalI": {"text": "torta"}, "oAxNCJufVUqZMyWRGdZl9": {"text": "tuyo"}, "oEHzYcfxDGGcsL-deud1j": {"text": "snack"}, "oEyUWrQj1iYUnlEUdQQ5Z": {"text": "flauta"}, "oO21zLMEtHEakvnuTohLu": {"text": "¡qué divertido!"}, "oOkD8Wmvb4t9I2EWqT1Nr": {"text": "amargo"}, "oSBFO8Ka0PN4bgX0QuWxL": {"text": "viajar en auto"}, "oYwoiRDWlIjSTbYdC2vG6": {"text": "falda"}, "oa-MShota2L8n2pU8hIsm": {"text": "jugar"}, "okr5oAG2U8Er1XwQ8XbWD": {"text": "grande"}, "oqQWeoWBr5N0LrPGY62Og": {"text": "senos"}, "otTWzTaTAmweNCozT8tn9": {"text": "alergia"}, "p1qK47wwLwF8S0Fy8-2Mt": {"text": "mano"}, "pHBnmCFpM7oZf0O78CBIz": {"text": "golosina"}, "pM-bC77hbj-w44A0HFRDZ": {"text": "sonarme la nariz"}, "p_XyUXRmeUk_bdjRTMtkz": {"text": "revistas"}, "p_qpVEd677b2Bk56yhvj6": {"text": "jardín"}, "paPpjw1XVC9-6xcueJsrY": {"text": "todos"}, "pgPlWKk-oww2fua5zYuue": {"text": "mono"}, "phZ4F4uzi1TrhjeDMuMsn": {"text": "almohada"}, "pkuppr1jMH7SMpa2hrIWQ": {"text": "jugo de durazno"}, "pliNY9oMQh1iSidkEhhDO": {"text": "abrazar"}, "pptyFMhLrbC6lN6zmc7D0": {"text": "comedor"}, "ptQZXjMQyXWycUD1kAkQo": {"text": "cuento"}, "pv8eYkxczIevQqEGwDz6V": {"text": "mochila"}, "pvXSy-5M4i8kysUppvdME": {"text": "que"}, "pwltOTDn2OyABTlD4-27W": {"text": "verduras"}, "px0jKQDj7r9pOYs4ZrvcT": {"text": "tomate"}, "q22wRFF21EigV8YzQ_MfV": {"text": "¿me ayudas?"}, "q6F-qJ7mTxvwa43F6vwun": {"text": "escondidas"}, "q7Pz4UqqZUlXeFfXrwXDR": {"text": "enjuagar"}, "qA4v2JWQU0zzBBZgvW7Vt": {"text": "temblores"}, "qOsbXyvBTMDAwvvnI0iFn": {"text": "pequeño"}, "qU5IvFLD8d16iIHSs_9TM": {"text": "cebolla"}, "qWhpDTMd8eAEoq7yTKc57": {"text": "calzón"}, "qYA2U_BFOZtFLClxuCIBJ": {"text": "dolor de muelas"}, "qeJdrxKIIcUctIjo8wWhc": {"text": "aguda"}, "qn-7ERrcZxJTqfW6hwNs8": {"text": "correr"}, "qsA1zm1DOlItK7DCWzAw8": {"text": "aburrido"}, "qscoBbrWu7tQbpNj9XUPt": {"text": "papel higiénica"}, "quE_RA9abVvtG-Fo4Jx8f": {"text": "diez"}, "qy3c7gvRU7shWuJYr1kBk": {"text": "bebida"}, "r7eJgCF_b_ktkztv4-oda": {"text": "medias"}, "r808IO3I6j3os_uix6O63": {"text": "juegos de salón"}, "r9qUBQwgY8eycnU2OVey0": {"text": "comer un sándwich"}, "rBwDn3PcJGqytqnOZTJMV": {"text": "taxi"}, "rMFGfzFobfGsH3_qrLHXU": {"text": "pescado"}, "rU9cpWF0I4wnJjzTXpGtO": {"text": "hoy mismo"}, "rgyV6CvFe98OGnWut6QCZ": {"text": "turista"}, "rlGO5jGKPL1vW-VF4nRqZ": {"text": "entrada"}, "rnjJyPTabH_Xpmy4Z4O3U": {"text": "celebrar"}, "rtHwq5WN9KElX3V3SKBmS": {"text": "papas fritas"}, "rwyX2YemNEx_Mh64IArDQ": {"text": "oscuro"}, "rxdfuk6egO7VmZEB3JrUN": {"text": "la"}, "ry_jOegpMf4nB3spGf4d2": {"text": "me gusta"}, "s0BXoyn7AqUAlZ9BOHY6S": {"text": "tríste"}, "sAsTkky29uEVC9vo3Ofbo": {"text": "brazo"}, "sDKIldL3tit328Joneo_7": {"text": "vaso"}, "sFNUgvnglgrm6cbYiM0di": {"text": "¿cuándo?"}, "sP6uvKmY5kA_yuYR8H21c": {"text": "halloween"}, "sPtazVgymXESdS-BcHqU_": {"text": "pollería"}, "sSTGRl6DpYGZXp8vtTNbm": {"text": "comprar"}, "sbv5HLPUR6gHo-EJR2S7S": {"text": "camello"}, "sc0hr3jQ80yXRFDlAn56V": {"text": "cansancio"}, "sixdpB8hTOhlUr4loz3RB": {"text": "muñeca"}, "sjGytpiPjwqJfPaRUJ-Iw": {"text": "miércoles"}, "sysOciGqtL7y4ULuyYVc-": {"text": "canal de cocina"}, "t-w8e69GwxLyfxlWwHk9f": {"text": "mermelada"}, "t34TbvjJ3zG2jcgJaCeHa": {"text": "tocar"}, "tGyUfSljuc7A5Do5B9GuN": {"text": "sweater"}, "tQwMPLvqAMAstcqvnOERE": {"text": "gris"}, "tWxC4hR6di5zQC-Hujlev": {"text": "bajar volumen"}, "tYwEpd2EOtH8wEUr-jwHk": {"text": "caro"}, "tw1doIY-jFPofZjlPFj4z": {"text": "¿cómo te llamas?"}, "txj22hip0CE9qp_z-daIK": {"text": "nebulizador"}, "u1nIt_oFH426g1IVhlYk5": {"text": "sediento"}, "u2e4Zh8qwJF7zKkohQ8df": {"text": "goma de borrar"}, "u3BufiTZTK6AylGh80ZFd": {"text": "ella"}, "u8HfFvMPkogdWk-URj9hv": {"text": "escribir"}, "uDg7Yy86PlwsAd-U96vJR": {"text": "arriba"}, "uFoytOG4qsXzBk979t63y": {"text": "limpio"}, "uMhOF9ZvWnjW-Zrjbjfhs": {"text": "bajar"}, "uOA82KFAVtjoYRTuYFgpr": {"text": "postre"}, "uPL5NMeXTmD1iU6ZoiROu": {"text": "pájaro"}, "uYElWOlSOSoQap-d5gsYF": {"text": "chocolate"}, "uZRwbLa1lEG7ol0UJKRBj": {"text": "viejo"}, "ubP5GM7_0vPkRc6zbD9Ez": {"text": "antiácido"}, "uiVc5R86QCZkhraEFlrNz": {"text": "museo"}, "ujyHgmlPIs7UdtndbYd8S": {"text": "amistad"}, "upWXctTSKBtFNSXnXDK_u": {"text": "frutas"}, "uzSwgQNnV8ZrjxpN5Bz_a": {"text": "difícil"}, "v-E2GE1DpCkNAxsfA0f4M": {"text": "goma"}, "vHzfvEgIkQ0e73ryfWP2F": {"text": "ordenar"}, "vKGLQIas9RdBnPGsaYtr2": {"text": "cometa"}, "vOgqHjpHgrUGERIHtVqDe": {"text": "basurero"}, "vPicdKLrhT2wmAAPPukKP": {"text": "veloz"}, "vPnmrsRou1ihosdVXS_Op": {"text": "zapatitos"}, "vZ9JaTnoj8C0ILYxMNB73": {"text": "calabaza"}, "vaYJPAsTRvslo2qFOJt60": {"text": "lomo"}, "vazatQ7CrYJFsorVDC5AC": {"text": "león"}, "viAHJeLRr_6j9dEi5klj_": {"text": "amarillo"}, "vlh1Pa6eA0ZrBs3vHzWH7": {"text": "oso"}, "vmb_RMIB20QND6VcS0deY": {"text": "panza"}, "vq3T-UQGTjX3Z9TlEF12e": {"text": "mayonesa"}, "vy-O5Zc5kxY8d-7RROvQI": {"text": "jamón"}, "w4cVxbBDZjeNyHwpBARHQ": {"text": "hombro"}, "wBLnDZStKj8YLkg2pTCfh": {"text": "sentir"}, "wCGb6D4xSVr4UeKXzGIlP": {"text": "disfraces"}, "wcpXeLMBRusfqfrz9s4mF": {"text": "puré"}, "whHwNRVnqeM7BMx6nppiW": {"text": "tigre"}, "wkrNPLGWTqMIy4PJRW9QR": {"text": "en"}, "wnfSUkF8-tQiRTVou1_pd": {"text": "frío"}, "x3PNiU1NIeQ3zQa31C8WX": {"text": "pañal"}, "xGsyYCjDzQugVzSaK8CuA": {"text": "duro"}, "xIgPo3N-aKXhVcjultMiY": {"text": "factura"}, "xPUYlxRxgFVn1FHQFz6Ic": {"text": "secar"}, "xQblStUfyBGO27j15Sda3": {"text": "pato"}, "xT4BPNmF-5WAQLfs3cUpS": {"text": "enamorado"}, "xXtjQktuAq1bmxTc0HSQT": {"text": "gaseosa"}, "xbPnUL4qxvm30VFYNphh-": {"text": "tíos"}, "xiaTdHGInqfm4rD6XzSeZ": {"text": "encender"}, "xnPF8fvkC1TvgETI1JcC9": {"text": "órganos"}, "xqGzZJIHBeVfSzRfm3rmg": {"text": "uno"}, "xxr0MRGYRmmoNC_gsD9uy": {"text": "pasaporte"}, "y0SViQxW8Y-yiX1Z7gXWt": {"text": "superhéroe"}, "y5W21CKOkLWnYJo1OC700": {"text": "tos"}, "yJoivIPHOm1Y1lj-hGN1J": {"text": "dormir"}, "yNag8CK0wV_iRMnFznsXk": {"text": "pelota"}, "yR9FTtOimFwZG5g5tgpRk": {"text": "visita"}, "y_5OURnKxFcv4UiMKntUi": {"text": "y"}, "yihsjW9ON0Fr9Yy4ZlP9c": {"text": "axila"}, "yk2wDVqHEKKwupgm87OJ2": {"text": "nalgas"}, "yo00Ci8bSRFYPU6HxGVwX": {"text": "cantar"}, "yqlmoVGItXqaeazw3M3eg": {"text": "sillón"}, "yvtvSsBLhabkcpeYGbxQr": {"text": "bota"}, "yxa6QVSrmWUKH2PZHKaVl": {"text": "lechuga"}, "zANp2EnhT6n0Jcl1Xra6K": {"text": "bailarín"}, "zAmesi1FcIWLXE3WVa9WS": {"text": "antihistamínico"}, "zRTTg5x_P1E8Z3CU-oWXa": {"text": "cualquiera"}, "zcibOHpRbSmz1hVNSjPTj": {"text": "tenedor"}, "zdFC3vpgjcyUWB9a4ghRW": {"text": "descripción"}, "zi_wcT10fxgn72ZJhVx18": {"text": "vestido"}, "zm_6R89hr4wjuVkifiYrk": {"text": "despeinado"}, "zrR1DbO_szgKvxLyrZquw": {"text": "calefacción"}, "zw-o9pDectP5bxFnUjrJO": {"text": "chancho"}, "zxhRDSHXtV63Sp3c2fjrI": {"text": "aduana"}, "-k6dUC6thWPyULq8MVSe6": {"text": "PRONOMBRES"}, "0geft4arn_A8kL-rfUPYc": {"text": "PERSONAS"}, "1aM3sTxyb8yLSWtkn2MoO": {"text": "INSTRUMENTOS MUSICALES"}, "384rVetrrLX4x4pJ0Y0Na": {"text": "INTERACCIONES SOCIALES"}, "4e6iVOPLAjnM6wCMUm5P4": {"text": "DESAYUNO Y MERIENDA"}, "6vmRBH4shBk3UQEUM6APX": {"text": "CINE Y PELÍCULAS"}, "7Jm3bDhPInSlwhdy20dKF": {"text": "CLASE DE ARTE"}, "7ngCuvmAnM_7ygpFQgLpk": {"text": "COLORES"}, "7w5ACMFdOCTkBrS911MA1": {"text": "ADJETIVOS Y ADVERBIOS"}, "8FPdnkMzOIBVTW5-TQxWX": {"text": "PERSONAJES"}, "8t8CAggTj3HuznkKhfXle": {"text": "LIBRO DEL RESTAURANTE"}, "9JRv4X68pAtwsFT3Ss0iJ": {"text": "LIBRO DE NATACIÓN"}, "ByBvBUS7dcXldjzZOVFFP": {"text": "CUERPO"}, "C7ClEHF5-Mcico4FvRxEV": {"text": "PREPOSICIONES"}, "GD9YHeLktSsdZQvcoua6x": {"text": "LIBRO DE LA CARNICERÍA"}, "HzPl-HvsrXL_QkGT38Ohd": {"text": "LIBRO DE VERDULERÍA"}, "JKEk5TYykBK6ZeYND3Ron": {"text": "CONJUNCIONES"}, "LWyfHr8Oui5HIShtZ_huo": {"text": "FRUTAS"}, "PYTnUqCLwAbngR2Ozroc2": {"text": "ACCIONES"}, "QQszyYRLL-otCQtRfbLzm": {"text": "TIEMPO"}, "V6K3TniptOApMMGa8TspR": {"text": "TODO"}, "VhfGFlHDcPor996rCzoK9": {"text": "CELEBRACIONES"}, "WZYuZd331Hm5gHXJtUmBN": {"text": "ANIMALES"}, "ZgZoyOg5K-LscXdfl6kQG": {"text": "CLASE DE MÚSICA"}, "_Cw7FcJSYiterkLSDJH8V": {"text": "CASA"}, "ah257x5jssDmLIOrcSGn6": {"text": "NÚMEROS"}, "berI6X2_pAVCNOrcHAL6y": {"text": "SENTIMIENTOS"}, "ce2z_EeEG2nH0ZS4KVAkA": {"text": "COLEGIO"}, "dQXaeM3Uul1yEvRwJ4w9t": {"text": "VESTIMENTA"}, "ejXQZAiYjrcSFGXb1pz7M": {"text": "TRANSPORTE"}, "gybgILOLxmIVfeQtb1f94": {"text": "LIBRO DE HIGIENE"}, "iHS1HpUBBadzgmbum_bdD": {"text": "PROFESIONES Y OFICIOS"}, "jatDsecioVAxRph-WOg4f": {"text": "LIBRO DE LA FARMACIA"}, "puOOrKWbYzH0B_8uGkxYX": {"text": "LIBRO DE VIAJE"}, "puda9fUGjqvm9oSM6CpTk": {"text": "ALIMENTOS"}, "rH7zhJzNVIcEIRyvaYLoi": {"text": "DEPORTES"}, "uv4tWMRHfewaEQ_pH0dnV": {"text": "LIBRO DE LA SALUD"}, "wAhDHMrZ850dHTwgAXrMY": {"text": "CONCEPTOS"}, "xjfPlDs-AcFV9LCyY-v9j": {"text": "JUEGOS Y JUGUETES"}, "y545pM8pvB3WgukIac6NT": {"text": "LUGARES"}, "zwf7qmSEi7PBwsNaqciA-": {"text": "libro de la biblioteca"}} \ No newline at end of file diff --git a/assets/languages/es_CL.json b/assets/languages/es_CL.json new file mode 100644 index 00000000..9ee69822 --- /dev/null +++ b/assets/languages/es_CL.json @@ -0,0 +1,2504 @@ +{ + "-2UbAou9ydr8XeN-jtIz4": { + "text": "limpiar" + }, + "-GL2iAgykP10Ae3AKsVOX": { + "text": "sal" + }, + "-LE2iv3Pwr5KuIyM5bYb3": { + "text": "bien" + }, + "-LwAKwgCdVkzwM579zRMo": { + "text": "más" + }, + "-aePI8WknXpxEpz19Lu48": { + "text": "suyos" + }, + "-msU3yor4qJYQHJtWrdk8": { + "text": "pastas" + }, + "00AkNJ4YLpbRD_mLmQjtp": { + "text": "almuerzo" + }, + "0IrLGI8Ebm8rcS3ymUXqS": { + "text": "hambre" + }, + "0THELgiQ7rvA-orESXJfV": { + "text": "avión" + }, + "0Vkmy6BZcJn3pFurEevL9": { + "text": "estudiar" + }, + "0Z7uFXpp-XRXmqM8ILhIC": { + "text": "poco" + }, + "0_SK41wNOk6mw2qX_eHXM": { + "text": "cine" + }, + "0cdYDZ5HPaTmqTTN0_Ee8": { + "text": "suerte" + }, + "0fHziRVxg0oNDp5pyiI8M": { + "text": "permiso" + }, + "0fcYcD_r0jNWXTTAx8Ph7": { + "text": "aeropuerto" + }, + "0gAyTD6sImo0jpD_bYGVv": { + "text": "jueves" + }, + "0huLn-H32Cbwba28IZ3tc": { + "text": "burbujas" + }, + "0jpMJu8isUmOZKxhZ_yaj": { + "text": "equipo" + }, + "0pFtmDZdlnLrUkT_XZDXQ": { + "text": "antes" + }, + "0qoQs8WyLVONnu3_eBGfD": { + "text": "dolor de cabeza" + }, + "0v5fqIp8GmXsIHO0SPhtt": { + "text": "dale" + }, + "0vttFf3nAGDW6g5wVStcH": { + "text": "disculpa" + }, + "1-VwcvzNfvrwDWRGxRPre": { + "text": "ni" + }, + "10X4OKR5xmNhSj86sbyE_": { + "text": "salchichas" + }, + "14aCIW665UZtuwNsKKV5s": { + "text": "cartuchera" + }, + "17AkRFlfC_koV-lywmDE8": { + "text": "pantalones cortos" + }, + "1B1WmC-V0PglDeRAeINcT": { + "text": "mirar" + }, + "1DjW-XvWN7iOqoJPRSWwY": { + "text": "mal" + }, + "1IjenNwPwsMIWZ4aYBk8S": { + "text": "partido" + }, + "1Ph13Z_Ya6p-q0WA7pSl3": { + "text": "pájaro" + }, + "1QEfLU_S7TM0iMr9VZVtP": { + "text": "ronda" + }, + "1Rv9-SSJjHptwvzqLbdbx": { + "text": "divertido" + }, + "1WJZO-pUkTaQvyxz41iB-": { + "text": "picado" + }, + "1YOlJCovdcnnqVihqHVmq": { + "text": "acá" + }, + "1b71P9YjaNWnX8AWjstqG": { + "text": "remera" + }, + "1mS8kgJIod1cyUFH-msnM": { + "text": "estación" + }, + "1mU2ZosZXSJrxkh1NmxJT": { + "text": "izquierda" + }, + "1nhsReHG-f-bW-xaZBsxY": { + "text": "abajo" + }, + "1pb6S-RR_3zdCq77YFiZ-": { + "text": "¡qué mal!" + }, + "1zU7kolOKsHP9-oomQW1Q": { + "text": "rey" + }, + "27GbVOZ-szdnzsy92oY-X": { + "text": "manteca" + }, + "2CgcUkvJUskv982FvG54A": { + "text": "plata" + }, + "2HkB0WZYP7cvWLD39GMQj": { + "text": "bañar" + }, + "2KO0BFtB4B6fu1feuAZLt": { + "text": "verbos" + }, + "2RZTRMX56BFLrW7tLJ3Hy": { + "text": "mismo" + }, + "2Vc2H462cutVtUC-5omJk": { + "text": "pocos" + }, + "2dwtZO2wCm520GPD1i6dl": { + "text": "dolor de garganta" + }, + "2t_eq1JmgHa0R3eu8LMmI": { + "text": "ventilador" + }, + "2u2-AFuI245I7bZ6tsSPh": { + "text": "¿quién?" + }, + "2y9pxVOBQ2tMdPHcsqQb8": { + "text": "martes" + }, + "3-ueUrnwmIIj0BMP8_Ntb": { + "text": "uña" + }, + "32PnZjlnQbTJo4nL9YJYe": { + "text": "feliz" + }, + "3932Zm0xgk1hKB2hhBAUa": { + "text": "colectivo" + }, + "3KbwCHGooNLySWOBlFFuG": { + "text": "cocinita" + }, + "3KgKNNnuYMrysEDs3Pu4Z": { + "text": "subtítulo" + }, + "3VEnVjaGFCImBAZ3wEChu": { + "text": "ropa" + }, + "3arbCGI6fMOWALLanZcg3": { + "text": "capuchino" + }, + "3dtvYLjbl5oDyhZO9eFRY": { + "text": "ellos" + }, + "3mwcdenOurU_e59ChLqb0": { + "text": "fuera" + }, + "3w62N9b7Cvb6JMjB9Wphi": { + "text": "beber" + }, + "40q0NJ6vsziJDNFBqho7Y": { + "text": "dentro" + }, + "4A_FNkGH1EDu0oabPurrL": { + "text": "cereales" + }, + "4J1bWl6BbbEdZsRGsgYH2": { + "text": "queso" + }, + "4X7OXm35OSHoSlPxGUi_f": { + "text": "mueble" + }, + "4bHGIoQmDN8LptpdNN4v6": { + "text": "vacaciones" + }, + "4f1vqDoAvUu2XYk_JlQdC": { + "text": "siete" + }, + "4rctwNiN4UaU9lqU48MHG": { + "text": "computadora" + }, + "4rzonBodQXfs77gALnAP_": { + "text": "cerveza" + }, + "50wJdR0-3YLnv9y_2Gx_e": { + "text": "saltar" + }, + "54BVjn2seJWdBNGI20-yJ": { + "text": "computadora" + }, + "54taab8z9ziXt0IqXHkV9": { + "text": "dedos" + }, + "5L5UzBHOzuHRoO-jyPuEx": { + "text": "ciudad" + }, + "5LYjhk-N87Ov9NrQcGbLQ": { + "text": "aceite" + }, + "5Tdy0Gu9SiLsPfWwd-Y2E": { + "text": "lindo" + }, + "5VBtwEswIjrv1zbXP-oFn": { + "text": "sopa" + }, + "5W5_sCAyGTkVzguCEg1d1": { + "text": "jugo" + }, + "5dvq344JstkxUpHszaPfp": { + "text": "delfín" + }, + "5gPT9lrNgpRkF07lP6zOq": { + "text": "jugo de manzana" + }, + "5i3kSsCKF7Oa9iJQvXiTe": { + "text": "más o menos" + }, + "5kjlzqb9Rf3zzqZROaZ9p": { + "text": "perder" + }, + "5mGrGHzdw_vCwYCRNPcPw": { + "text": "pasear" + }, + "5vxTXbPl4Y0yezGu7p1f6": { + "text": "hacer" + }, + "6KicPX6y_u2i6tPBZAtvA": { + "text": "lavar" + }, + "6jLkKc9OL5btNOmjJem6S": { + "text": "poner" + }, + "6lYN4qSZx3_tKDClp4Iyr": { + "text": "entre" + }, + "6nhNeVjDfDi-GmreaqfVo": { + "text": "nublado" + }, + "6rcOXG6yxpzHLzMJ9IayI": { + "text": "cerrar" + }, + "6t2sPdapSNJrOziDozTWW": { + "text": "vaca" + }, + "71l2at-8480bvijxn3uBl": { + "text": "durante" + }, + "75gujwNXJdAiNmK6Ffhia": { + "text": "jugo" + }, + "79xBF6cKgKeD4GeBPe_Ds": { + "text": "bolsa" + }, + "7EsVGfapPc_38mHCBy3C3": { + "text": "enamorado" + }, + "7Hz61-WzV62FHsedOwz6q": { + "text": "flan" + }, + "7Q4Zc0cenSF5U4eKyje1f": { + "text": "hacia" + }, + "7Q9sNljseWjwSPW4in1ga": { + "text": "recepción" + }, + "7VL_MgnLDY6hi8sbvcGIg": { + "text": "silencio" + }, + "7WxUVoVQfQOzARU2bf6HP": { + "text": "casa" + }, + "7iAXKVm22uMgr6aqZ1rr7": { + "text": "abuelo" + }, + "8-4M30dTtmuUJus9MtGqV": { + "text": "moco" + }, + "81UJI7xOa5l9mVceqkIP5": { + "text": "tener frío" + }, + "82LicIQc3K2xCTEt-iMpu": { + "text": "caracol" + }, + "86gNdF6aTepa0Y9zkD1VQ": { + "text": "campo" + }, + "8FFwIw7rJri79BITZBUzm": { + "text": "hotel" + }, + "8KlFB3an1mzdQd6-LGCCE": { + "text": "merienda" + }, + "8LddDqylw-51wHhx9_Qad": { + "text": "libro" + }, + "8MV4ZFthtUeoxLAIbqGTc": { + "text": "carne" + }, + "8cOIYr-hcK54qWpuT-41e": { + "text": "cuento" + }, + "8fGingRAd8idw4qcxyZ-Q": { + "text": "vergüenza" + }, + "8iFdjRTQU7ONGnigRTlm8": { + "text": "¿cuánto sale?" + }, + "8vR0HYniXtrrQqqSIN_JQ": { + "text": "familia" + }, + "904w9Je6oDwGXUCIcrUZX": { + "text": "lengua" + }, + "93YmZA7VfAT7TTNTsDE1W": { + "text": "serie" + }, + "93hsW10TmX3Vcq_4IvcZ0": { + "text": "blanco" + }, + "93tHieC_CgZqN998y5gAv": { + "text": "chuleta" + }, + "97nIv-aoc51T8kKTZV5cM": { + "text": "saliva" + }, + "9EqfwMNtATh1fwMhyn_B1": { + "text": "buena" + }, + "9FiWvg197C-Riid-DVysN": { + "text": "claro" + }, + "9GqE148SFZqMIft4evAk2": { + "text": "comer" + }, + "9MzeUcz1nRqleTkmS_-g2": { + "text": "barco" + }, + "9QyJdpUn0f6g7FxWs5qpO": { + "text": "cortar" + }, + "9U8MzceIsqKhG86oNx9zV": { + "text": "coche" + }, + "9UwpyOnOBoqr4mX3Juqm2": { + "text": "buenas tardes" + }, + "9ZnzbKMDwGEwC3hXOhXFe": { + "text": "pastillas" + }, + "9dvSIpeXa2_12Jip6noJP": { + "text": "deportista" + }, + "9kgRI3KlOIVSuylKffW9g": { + "text": "colores" + }, + "9lS0mNuKIS0olyDwoIJBR": { + "text": "médico" + }, + "9mLx-YMK81AflitELQFqk": { + "text": "papel" + }, + "9s5zV3_oGyDx_NEvsKCxX": { + "text": "violín" + }, + "9wE9Py6ztyqDrtaypsltA": { + "text": "naranja" + }, + "AOp6VGyjYIV0Ym9d0basJ": { + "text": "dibujar" + }, + "APXF-lEplPOloppSeIjAY": { + "text": "menos" + }, + "AQKGKdoX5CYycZ2YqBZVW": { + "text": "barato" + }, + "AT_rDWsr6xRBgrvgw9Zih": { + "text": "nueve" + }, + "AWJXh6URGN0Vwm66i6IvL": { + "text": "hola" + }, + "AeFbJQ0M9uTObAlKEX3zr": { + "text": "pierna" + }, + "Akf0xlH8UJdXn8BJzPV2A": { + "text": "radio" + }, + "B1845IfYfPMz2FWpVFIQv": { + "text": "de" + }, + "BKmATW2uBk4pxnmOaARyq": { + "text": "documentos" + }, + "BNjZz9MGLJEKZ4CZoTs2M": { + "text": "ajedrez" + }, + "BQhqx1PuF94jwT0ySTlbJ": { + "text": "comida" + }, + "BQm-YCPc0lfD1-mhecCTL": { + "text": "yo" + }, + "Bebnh8-UWwtYLnK6p3fKi": { + "text": "pan negro" + }, + "BjqWZnzLlxdOo4KEzZ46j": { + "text": "ocho" + }, + "BqS7d4PMhGRqPYlZQzUbR": { + "text": "puerta" + }, + "Bub9ZYygLcly15D7_wYks": { + "text": "amigo" + }, + "ByrvXHEN9Mb8D--7MQAjM": { + "text": "peluche" + }, + "C12mJ1W11fODI3pv1QOnx": { + "text": "gelatina" + }, + "C29KJ8BTFavhj_R9UfnSv": { + "text": "por" + }, + "C2bgADoxmINRnAiYxZHqd": { + "text": "taxista" + }, + "CBTemIvgIN1UAtftkc3sz": { + "text": "pegar" + }, + "CCWCtXdMuQBJRmaFOAlfQ": { + "text": "navidad" + }, + "CY-IQvUehkaiGFCdKf9bf": { + "text": "chorizo" + }, + "CYH_6DL9q1iLLetuWeR9A": { + "text": "tener" + }, + "CZrETqLgQlvDkLHvw1t_w": { + "text": "a" + }, + "C_JKGNCxOI5x_f2C4qAyZ": { + "text": "maní" + }, + "CbO32RkDdf9aCucv6BnGS": { + "text": "cabra" + }, + "ChBc7LjL8dgzZ6LUCAHGh": { + "text": "por favor" + }, + "CkTiaqBY3jf86JRq636lt": { + "text": "¿cuál?" + }, + "CsKZSNiJw5Q48b26Kskf-": { + "text": "heroe" + }, + "CxFmyJYmy6gMRqP9U0cBP": { + "text": "estoy perdido" + }, + "CyKtU9yC0Jy7Ypb4WFp6w": { + "text": "perro" + }, + "D1gCni2jXpCvKZe4qCtQN": { + "text": "peces" + }, + "D2tSkngqbQmdKLNhn9xWV": { + "text": "globos" + }, + "D7dt_hFX5DScV_ssm1nKz": { + "text": "pomelo" + }, + "D85FU-Wqr2u53tfTXAtHo": { + "text": "patalear" + }, + "DAq2J_xXHsSCSNPp9qVsk": { + "text": "oler" + }, + "DBd09yUlbkaYLsemjFXEs": { + "text": "helado" + }, + "DG1RiDjDfwWRhpAiIpPqA": { + "text": "vómito" + }, + "DSgrhLHauub-gBqMGwacO": { + "text": "asustado" + }, + "DXb0FpjVM9q8LVl9vvSHn": { + "text": "clases" + }, + "DXpjgLKTdx9eLLohVdmWM": { + "text": "verdulería" + }, + "D_4Weq7iyi7GMEsgP0xy6": { + "text": "té" + }, + "Djs1QsLNf8Q5LBIFV5zNC": { + "text": "partituras" + }, + "DkeHJFtqAS005fYUrl1Xz": { + "text": "pantalon" + }, + "Dm3yiKSB134LrjtW_KrO7": { + "text": "buen día" + }, + "DqGa4gqd2ABDi45BT43x4": { + "text": "princesa" + }, + "Dv9MSCRYbR4Q3K114wXki": { + "text": "alto" + }, + "E-vUPARie8MmfgZwv3Omr": { + "text": "gallo" + }, + "EM8VyonJ7WNdvmRyE3nhZ": { + "text": "lento" + }, + "EO4O-s7oafi6QJdxTFNkd": { + "text": "anticongestivo" + }, + "ETZNYbrG5wveDl6c9k2_k": { + "text": "codo" + }, + "EUsNyf5bDdSLqvZKH1Ltx": { + "text": "no entiendo" + }, + "EVmt43vDI3NHFfbbkqokF": { + "text": "pizza" + }, + "Erg6LuA8IOQ5V8RTP3pPi": { + "text": "abeja" + }, + "F4cGnA_QHsVKTjUE6MAu9": { + "text": "mameluco" + }, + "F7kJ8VM31BWB4K4T4USzs": { + "text": "maltrato físico" + }, + "F8roVYxKZi88UUGfOvTwl": { + "text": "maestra" + }, + "F90bXbc0tz9nuzTT7SgqV": { + "text": "cuatro" + }, + "FBPIabyaoCK-Y0BziQdji": { + "text": "dolor de panza" + }, + "FBTheEQmZZfJRiYjd_Np_": { + "text": "interpretar" + }, + "FO77qpzyz28knodNtILCA": { + "text": "tirar la cadena" + }, + "FTngK946O8S8bYc0g7vM2": { + "text": "mamá" + }, + "FaVvbVzZivuxTwxJTPubK": { + "text": "hermanos" + }, + "FfNU04I4mZ54gWcBXqo2c": { + "text": "panceta" + }, + "FgTird367surh-vxXyAK6": { + "text": "ticket" + }, + "FkC5DtSV81OvFMU99qZGg": { + "text": "pelota" + }, + "FnCBoLSE19WsbUypUKvFc": { + "text": "hamburguesa" + }, + "Fogupb264IyCtbZ-Q2D6w": { + "text": "borracho" + }, + "Fvm2C5NBq01tm0QK9d9QM": { + "text": "hijos" + }, + "G09TvOzDSG5m3hTQD9Tej": { + "text": "borrar" + }, + "G2i9LSK4A19237Zp1vXqF": { + "text": "gordito" + }, + "G6KKVMvPDnjdD9TfBd-B9": { + "text": "playo" + }, + "GAxX7EIz1TTLtMX08RRGr": { + "text": "hamburguesería" + }, + "GJlUSznzEHCgoAOrVrkp9": { + "text": "feliz" + }, + "GSEumxiyeVKRRiaY_c8HW": { + "text": "crol" + }, + "GY_flM-6uR6X3L4AwsiwU": { + "text": "para" + }, + "G_CRpzxWO5XdEMh01O1eJ": { + "text": "aunque" + }, + "Gj7THa6XFHDfYL5H19lwj": { + "text": "mañana" + }, + "Gm_qAGnL4OawmlYmTs7K5": { + "text": "no veo" + }, + "GoJuWnn72TCXONXKtYHMm": { + "text": "tren" + }, + "Gvmy--9DiUn_tkQYWeWhA": { + "text": "canelones" + }, + "GxrDtsdGcLepdsQr6V9DT": { + "text": "verde" + }, + "H2zMVtjvqi7aUtCypiVKr": { + "text": "sentar" + }, + "H8Bsrr2NK9Q3WGbEp8PMe": { + "text": "plateado" + }, + "H9SWPnWbR8qcZA-iu5Mz0": { + "text": "dolor de Oido" + }, + "HBZNu6m3FELU9eg3OeLdx": { + "text": "cortina" + }, + "HKfLJS8aCBtKuKJeSBQUW": { + "text": "golpe" + }, + "HMPabuHqgtyiCmTLzg-rM": { + "text": "entrar" + }, + "HQiQh4PPBvO1n-d7JGVj8": { + "text": "nadie" + }, + "HTBNWax6FCSGXuboGsVUW": { + "text": "salado" + }, + "HnuZA0UTlnuIfFAN7saxl": { + "text": "conejo" + }, + "Hvb4JdDHX_vNMck_US2UN": { + "text": "ensayar" + }, + "I5AJgba5GTdEjdpFB-LBf": { + "text": "chocolatada" + }, + "IAdQsjTsbBUAMjlwW34cw": { + "text": "me encantaría" + }, + "IEeIvawUD2GIAr1Wypr9i": { + "text": "personas" + }, + "IF3R7tLVAkd4RbL8R07K9": { + "text": "actor" + }, + "IM8OUKCzHwnjAQWPFgnn6": { + "text": "lejos" + }, + "INxOSvKbBNOXwruIpuNho": { + "text": "ombligo" + }, + "IO8uTb1K7ElENgp2ujZoK": { + "text": "robusto" + }, + "IXRWmFmtqfnHQRcBf1Idl": { + "text": "paloma" + }, + "IZbfYRzu2cxxDWdbmQeqw": { + "text": "cabeza" + }, + "Ig1oypuwndODbmKh_NEXs": { + "text": "malla" + }, + "IsWUeiPnDEnzxePKclBNp": { + "text": "feo" + }, + "J3qQMp0OMr5LC9ebfArxH": { + "text": "ninguno" + }, + "J3rDL96c2zfBQzP45VRCp": { + "text": "limón" + }, + "J4UUPR-WP0qo1y14bUVI-": { + "text": "veterinario" + }, + "J7MmgugOu20UtMcMPj59r": { + "text": "canción" + }, + "J7wLwBLVx4UANh_x5HdXd": { + "text": "según" + }, + "JB9SIxWzxWFjrbmMuksrY": { + "text": "reir" + }, + "JBIehRNmDbK2ALcRN0u9i": { + "text": "gallo" + }, + "JBKQaBezKuSDaMsnbJMTB": { + "text": "bar" + }, + "JBU2hMw9gbIy9-wGF4mjD": { + "text": "pizarrón" + }, + "JDbBWMB5No0pK6HvntLt4": { + "text": "lavarme las manos" + }, + "JEDIYq1BDA23ac9TNhON-": { + "text": "ayuda" + }, + "JFldbhjqxK3fD6D2K4HY4": { + "text": "papá" + }, + "JGm4BL7HAfuxX_PGe6Jzk": { + "text": "presente" + }, + "JQOpcZSCPGMOWZsN8w_yb": { + "text": "¿qué hora es?" + }, + "JSFuEHlP-CFvuqvFKMumC": { + "text": "autos de juguete" + }, + "JVtu9W3AumOwjUedwhUGE": { + "text": "rehabilitación" + }, + "JZRBfIXBkeuobtDXbLt5t": { + "text": "adiós" + }, + "JawnUo-pseWb3FDVMtxrQ": { + "text": "yogur" + }, + "JblWXW8TKDCuYu2yTnFBA": { + "text": "mesa" + }, + "Ji5OVFX-uNDewL8eX8Cin": { + "text": "pensar" + }, + "Jjq8CM8JrYHIMziuQy-WN": { + "text": "agenda" + }, + "JziaulL-lrAPGNVvwBPK9": { + "text": "verano" + }, + "K382TlNZjdMLLpAhCCXLG": { + "text": "almendras" + }, + "K6hd20tWZfwwlYYi7jctt": { + "text": "rica" + }, + "K8cMIDL0ubQvWhhDtr65F": { + "text": "llorar" + }, + "K8e2-KkvZfFOQaXnhR37x": { + "text": "cansado" + }, + "KC18_sTEqKucPQ-iwEKYY": { + "text": "lapiz" + }, + "KK_i8H9qTfDVYZkQGwd2v": { + "text": "apagar" + }, + "KNH4sLRpVKtHXQa-0y84K": { + "text": "nervioso" + }, + "KWYVDZiERE8jtRsL0faHH": { + "text": "nadar" + }, + "KXHW4m6vXxQU-AEOR4pZ4": { + "text": "balón de fútbol" + }, + "Khdk8mWpyxgLqfC-6lyT9": { + "text": "burro" + }, + "KhyTKtiL4ZT4Z1saU1eJh": { + "text": "escuchar música" + }, + "Kn9vE07FK1LrzoD_YxrJD": { + "text": "subte" + }, + "KpLFOrpuhFKaIbBbFwVVu": { + "text": "mariposa" + }, + "KrOPANVpdkBWdEZoUwxKf": { + "text": "grave" + }, + "KvY6Taigm4Va_cVjXAfGR": { + "text": "corto" + }, + "L0hfYADgzghRVsZLZHRxE": { + "text": "bailarín" + }, + "L19r487_d3RqWXiNuh3gE": { + "text": "¿qué color es?" + }, + "L6YLAEsbYcTq-ycQJTvt4": { + "text": "pollo" + }, + "LAuEISciEf1Wc1j4fERz8": { + "text": "año nuevo" + }, + "LDoi3cxodn_AVKSG-Bf_1": { + "text": "ojos" + }, + "LEVKlDlJ0wHo5QEjCNAGa": { + "text": "pegamento" + }, + "LEg8z-Q-ONLAAXd-aH_Hb": { + "text": "bajo" + }, + "LNBTW0qQtHYQEHatkWGtc": { + "text": "mercado" + }, + "LRIKzfm9ZsdNe1u7CUuW_": { + "text": "¿cuántos?" + }, + "LRfh-4RAZTj7cnnDwBmqj": { + "text": "flotador" + }, + "LU7IoUksATEBhd8PaHS1R": { + "text": "sacar" + }, + "LaKT8VTw0_6rvordp5-R8": { + "text": "rosa" + }, + "LiBr37yi-YBgQDx4unjyc": { + "text": "dá" + }, + "LjTGOcyG7DkTs1lJqNr8w": { + "text": "cabellera" + }, + "LksmOMPPOMArbrFsscqOW": { + "text": "música" + }, + "LmGq1AZs2a0x26r7E9GUj": { + "text": "maestro" + }, + "LngEMJa_ihV8mB7afZX-h": { + "text": "ellas" + }, + "LrDai7jXlGAdZ3e8ZQezj": { + "text": "hacer pis" + }, + "M5q2CXmK0_WVaVUB_HJB3": { + "text": "caliente" + }, + "MEqo2TROHyroK318sm84f": { + "text": "pasta" + }, + "MKR-ukiUlJy4uuqO30UU6": { + "text": "maltrato verbal" + }, + "MMzjhHID8HMqyPjii5o-h": { + "text": "cocina" + }, + "MNCcHiImRS8tmvhBhzCKj": { + "text": "ensalada" + }, + "MQHnvvU48NnEptP8a9w8C": { + "text": "no me gusta" + }, + "MWIzTM6zhTWL1V-brLtBx": { + "text": "cómodo" + }, + "MYqfOzKx2qMHop8GaHs0I": { + "text": "verde Claro" + }, + "MiOe5_Djf-pE9V9aDZ_1G": { + "text": "ananá" + }, + "MqQgYn5B0uV-DMORCBOmV": { + "text": "triste" + }, + "Mw6WRebMAKWwXfAvDA7vu": { + "text": "tener calor" + }, + "N2baGNTOapSaFDo1GURiW": { + "text": "no escucho" + }, + "N7n4zQIkJZOhaYESk2GgH": { + "text": "caer" + }, + "NFdUTit6Ff-4S7Nzf92U5": { + "text": "estreñimiento" + }, + "NFgGqhEtl0HqipCGGEvwU": { + "text": "peinarme" + }, + "NKQwWPAsVHwFBWuksqfns": { + "text": "ducha" + }, + "NLi5ODIzyMAwr2HpDXACp": { + "text": "nariz" + }, + "NQayjogCYiimP_0OxIfFj": { + "text": "zapatos" + }, + "NVe4u7BTAVfLk3xkDqLnZ": { + "text": "horno" + }, + "NVjfEut567uXpTaQUNI2i": { + "text": "campera" + }, + "N_893wsadpGg3Ip5sEThe": { + "text": "azul" + }, + "NaJxTPq9Ld8I4fwAltyEC": { + "text": "maiz" + }, + "NjulpZ9x63ZqxtLMoRjkx": { + "text": "prender la luz" + }, + "Njz8DrErsexBu8mAI6mnr": { + "text": "pescado" + }, + "NmNouLLx13jzE27jliI_v": { + "text": "diente" + }, + "NuhUikdCxP0NgsbO0wvAU": { + "text": "cola" + }, + "O-CLnVuXAUapOn6TbdhKx": { + "text": "querer" + }, + "O450x4W3OOacvJIy4QicJ": { + "text": "verduras" + }, + "OHyrmD5US1rHEAEwLQaII": { + "text": "animales" + }, + "OKXIGnLh-i1ydTNj450Q8": { + "text": "reina" + }, + "OUcfOOReAfQroBKlBdDb-": { + "text": "solución salina" + }, + "OWLDc7Hn3neBAf_V_N27n": { + "text": "abrochar" + }, + "O_ZfCPZSxGMPT6orCt-O6": { + "text": "chancho" + }, + "OblxxVFC-LKPq-8oC9FpE": { + "text": "sentimientos" + }, + "OdCdTUAlbN6kvsPjby_Bi": { + "text": "deportes" + }, + "OeA63q6LpqGvXW-cJXEym": { + "text": "jamón" + }, + "OeytAsSiEAWC10tXhxbTa": { + "text": "personajes" + }, + "OhrHu-xLo8hcn5plWfoX4": { + "text": "caro" + }, + "Om1Bvqu8nmGuNGwV8hndM": { + "text": "bajo" + }, + "OvyFC1GHkvJZ0dAAF1QkY": { + "text": "él" + }, + "OwHzJdOQTFOA8daCVRwm6": { + "text": "pincel" + }, + "P5zdq4x58yp5TA_soKQEJ": { + "text": "bicicleta" + }, + "PAlC0XSZNru3-LXtfvGjo": { + "text": "hacer el amor" + }, + "PBqpK7LL1HQPwowPitrss": { + "text": "leer" + }, + "PFAi3SdvH9vL7_Bg3MhCA": { + "text": "semáforo" + }, + "PIBHv5VueBi-sf5qFCN_Y": { + "text": "ante" + }, + "PIPQnVS2UiS7kGbucJP8l": { + "text": "curar" + }, + "PLXxIPYyztaztLf4sPCst": { + "text": "garganta" + }, + "PbtM3htZocZb8YifuPoY5": { + "text": "cangrejo" + }, + "PfNLmlHKFT9d1w6IgeXbU": { + "text": "control remoto" + }, + "Pl-M4bc6k2rdhu6FHEbkA": { + "text": "patio" + }, + "PogTYrGfa2WNfBRuA8O4e": { + "text": "malo" + }, + "PszHdOxMsS_tAzSrN52Wa": { + "text": "plastilina" + }, + "Pw3GgPwp7fpDVC6wJjgPn": { + "text": "subir" + }, + "Q6LQqdLcvNOiCFjC0DVo2": { + "text": "tambor" + }, + "Q6nNH4AIoSeDHODC_Ip8O": { + "text": "vecino" + }, + "Q9Ra0aJaQnOJQ1Kqdc43-": { + "text": "bebé" + }, + "QCQRmsQY6AggjreY9Z0MF": { + "text": "rechazar" + }, + "QGf1Tb1roL7HAXUSrRqRJ": { + "text": "naranja" + }, + "QJhkOh48xapiTObEDQLB9": { + "text": "piano" + }, + "QTkFHWp9KEDgfCjoQjBY2": { + "text": "plurales" + }, + "QUTQLuD2Gv7fHh0V_O5tg": { + "text": "avergonzado" + }, + "QVqSPPgA89whFTJ0HTphK": { + "text": "abrir" + }, + "QZNQOaf0SdHDbx1otCmrH": { + "text": "niño" + }, + "QcGJ9u_JqmrW0X47PXWH4": { + "text": "despeinada" + }, + "QclUM2p3iexSjFZI8OU4-": { + "text": "fiebre" + }, + "QeqA20MCXB-zNfuKIssMY": { + "text": "lata de atún" + }, + "QllvOUe8utZrcBRGw_0vc": { + "text": "curita" + }, + "QnlQ1HOEB9yNjuW3Dd6fc": { + "text": "celebración" + }, + "Qo3Qn_nMe3E6EqNw0UdNZ": { + "text": "soleado" + }, + "QohNih4wgqjnpWt3kSwtd": { + "text": "entrenador" + }, + "QvaMxPy-3iixHAJFyIrN-": { + "text": "sandwich" + }, + "R06chAQYswLtQK46OInW7": { + "text": "leche con galletas" + }, + "R9ECa_HQRtpFrb59ebMTQ": { + "text": "escuela" + }, + "RBCjBvNXQSZOOpg-5lBlK": { + "text": "bueno" + }, + "RZfMOtjw0DoGHWaRfCEc4": { + "text": "pantalón" + }, + "Ra2rxEEohwxRqDsW2AT3C": { + "text": "videojuegos" + }, + "RbZetbSC5064rZccOFD1D": { + "text": "televisión" + }, + "RkpoG4KB8m_TJFJf2v3EG": { + "text": "cambiar de canal" + }, + "RwlZ1jr2Ix3evzrW71lN0": { + "text": "manzana" + }, + "S3um53pcko7_BPHy7R6FL": { + "text": "nosotros" + }, + "SE-71I_ahm3oKROReyJHE": { + "text": "hacer caca" + }, + "SOyGnJXLPeVRoZy3vBgpK": { + "text": "examen" + }, + "SXz8iA1Qn_BlgLTAG6Epl": { + "text": "cena" + }, + "SiOmZdwX8Hf2nE2v6HfCp": { + "text": "zapato" + }, + "Sp2Ias_Y1HplkHWjIb7Mp": { + "text": "sin" + }, + "TAbuXSnSHU6C3CQ4kbKVh": { + "text": "triángulo" + }, + "TBV2BhoZVgl1jMV_jWZYi": { + "text": "derecha" + }, + "TIgoS-YONIwzbrImXetaD": { + "text": "ciruela" + }, + "TIsM6aTTZ9W8j6UhW9Qqj": { + "text": "coro" + }, + "TLxsYdrBdHgFZkNJtVTmK": { + "text": "tortuga" + }, + "TP-gGRcpcFyx1SrNRsdRV": { + "text": "perdón" + }, + "TR5CXN8-pfbWkshdxSBSV": { + "text": "oveja" + }, + "TS9z8ZmMEwn0MGSfr9amH": { + "text": "palta" + }, + "TZF-7m8VKZ7IL6pyv0Daf": { + "text": "cepillarme los dientes" + }, + "T_Q5c4XAfkhkclmnCGHo5": { + "text": "hasta" + }, + "Td5pgVQDTFOftUgOJ-bD-": { + "text": "picante" + }, + "Te_jJfeU8Xwa9St2RihBq": { + "text": "sangre" + }, + "ThqkHs4az5tgLqLcfFPaZ": { + "text": "largo" + }, + "TpPNZLsh5jrN9RdPFwmA7": { + "text": "¡genial!" + }, + "Tpj-Fs8LQ566TM0bYlZ6H": { + "text": "viernes" + }, + "TuAjBKPp3-PSdQuooSWZi": { + "text": "rana" + }, + "TyqVzfOniQNa9WKQRXqr-": { + "text": "hermana" + }, + "U1KQsrvTa2E00-ugc-Iy6": { + "text": "ausente" + }, + "U6PoeH-cMdO3ttnLkN7_3": { + "text": "cabalgar" + }, + "U7GiGcYacowWi4MWrCYyj": { + "text": "antiinflamatorio" + }, + "UQ-5wOfR0tDzljoDjj2xU": { + "text": "otoño" + }, + "UQ5B5K-tpk1XmQC1B9TjQ": { + "text": "no" + }, + "US8_vYTnDfxBw2Ung_J38": { + "text": "partes íntimas" + }, + "UVzdJiqY36fqgBYyz880c": { + "text": "jamón crudo" + }, + "UXJDiwb3j_zyfGa26ByJL": { + "text": "pecho" + }, + "Ubaq6h7wasdP_YRombm2c": { + "text": "azúcar" + }, + "Ugs9V9c2c5iHrVC6p17zr": { + "text": "analgésico" + }, + "Uk1Emn5IovsTfFzpQX5Jw": { + "text": "sosten" + }, + "UkLF5sKtVKW0D8RzVCoue": { + "text": "bombero" + }, + "UnQJwWfWCe40DJYR1Er0o": { + "text": "dolor" + }, + "UssSOEEKutvzB_B4fAQE-": { + "text": "escuchar de nuevo" + }, + "Ust3oadA0PUGViYo28Mf3": { + "text": "caminar" + }, + "UvRS0KmtZn3dq7e8L5RcE": { + "text": "enojado" + }, + "UwvZVcX_CAQFrI6U4LsNT": { + "text": "huevo" + }, + "VJ9AU_y7CqsONR6TvhdLh": { + "text": "¿dónde es?" + }, + "VKrLGgYjc-nLPGsyESDgb": { + "text": "canario" + }, + "VL4pd0vnJ-CNfMg9bCNed": { + "text": "aspirina" + }, + "VUJ-zrdsyL9MOuFbdMCAx": { + "text": "mareo" + }, + "Vioyf8EXJfY5t34NnN0WO": { + "text": "tablet" + }, + "Vjlet5P7XuqTrc22nt_Zz": { + "text": "agua" + }, + "Vmnu5eormo-_TOCgF4YzG": { + "text": "jarabe para la tos" + }, + "VoZumy5GtnRdqSOmXAw7j": { + "text": "preparado" + }, + "VrC7AnovfA7VzmYESVc8L": { + "text": "conversar" + }, + "VwZ4EKSggYWxlnAbp-pNB": { + "text": "enfermo" + }, + "Vzov0z9acB-I1_W_CcFcY": { + "text": "rojo" + }, + "WDUIQV43zghFQq_rSk1Z4": { + "text": "churrasco" + }, + "WL3ZN-W_zgnuTJpuqz0YQ": { + "text": "príncipe" + }, + "WNhpmD_XlTaNEBo7GsFXu": { + "text": "diarrea" + }, + "WQ0CNIQ_gjaCxg4tEIsOo": { + "text": "clavado" + }, + "WRzleD-mI84LaimFH8h6P": { + "text": "escuchar" + }, + "WUt3I-NkdbqlSVcwuLfFx": { + "text": "patines" + }, + "WWK2v56LM-zWqujabk9bM": { + "text": "plástica" + }, + "W_f7h3qOLl2uEd_OYpMfQ": { + "text": "policía" + }, + "WasZ5bKZZy5Jt4Y-JipxS": { + "text": "bikini" + }, + "Wgh5iCzUmx4Je-B85-pra": { + "text": "heladera" + }, + "WjXQhSFPpz42ZUyHvurYG": { + "text": "grillo" + }, + "WtYSntcy2CijEORmROeaj": { + "text": "un cuarto" + }, + "Wu47Qs6Zupu1Ox2gUhkxn": { + "text": "cuarto" + }, + "Wva5W8GA0dHzyt2_0FPdm": { + "text": "hermano" + }, + "X0-Tf-KR24qEkpGDzG2Z-": { + "text": "ayer" + }, + "X3u4pXTWKcGc43lOkgSBt": { + "text": "cumplimiento" + }, + "XA952Z60D0-cesNCVA-OX": { + "text": "chau" + }, + "XC5fIljJ819OYpllYTjpE": { + "text": "jirafa" + }, + "XN0nzhQyHVOhuYuNqrp8g": { + "text": "durazno" + }, + "XOoGN6huCjVHxH8hRFAw1": { + "text": "blanca" + }, + "XY6ZCNzeJIEzLtWJcufJm": { + "text": "camiseta manga larga" + }, + "XYY8SV1IAMHjdGjMZxbdy": { + "text": "cancha" + }, + "XeVaDdUWSEkhfJvTVvUHR": { + "text": "salir" + }, + "XnocVMEeUGCSnlnusP44O": { + "text": "agarrar" + }, + "XuAtFop5_JNSYiZkUBzaU": { + "text": "cocinar" + }, + "Y5HQq_4crSF2lpwH-KUrt": { + "text": "dos" + }, + "YCu-B26PqjE30AhikHdkI": { + "text": "dibujos animados" + }, + "YIP0Xc4aJsfv0s8BpiQnn": { + "text": "cinco" + }, + "YLKXFZ9ze9K9NvJiAx8w0": { + "text": "¿qué?" + }, + "YbrNtdUmyMNdAF5CfvY1A": { + "text": "toalla" + }, + "YbvMRsCtMbww8OQgF45QF": { + "text": "resfrío" + }, + "YeT-jstVSA7-mD9t99Isg": { + "text": "rompecabeza" + }, + "YusWY8GwdO43bSp1o3BWC": { + "text": "molesto" + }, + "Yvxm8RGoFYKUsIXOl33yR": { + "text": "apagar la luz" + }, + "Z5-sBklfLIWE00CJ_T_ZK": { + "text": "cuchara" + }, + "Z8xp3kxXuhMVoNm7ddQSX": { + "text": "lanzar" + }, + "ZA2C4bJaL90lBxsTemYWZ": { + "text": "piscina" + }, + "ZAnmv4CLb7hldYUlp2wJU": { + "text": "ninguno" + }, + "ZBIFtTq-BH1jv5jLbzrhj": { + "text": "repetir" + }, + "ZQEXAf10BkoTvCJx3Ox39": { + "text": "sorpresa" + }, + "ZR-NXJk3SD351W-95cf_T": { + "text": "pintar" + }, + "ZRYQmYRGKzheBqk11eGRZ": { + "text": "ballena" + }, + "Zm4OIanIKTigDGIsInO7o": { + "text": "un supermercado" + }, + "ZnMba2r4XIg9lPi_H2d_Z": { + "text": "sí" + }, + "_1lOt0C0MQhvU8QWC6_oZ": { + "text": "buenas noches" + }, + "_2SjbH-xHZq173EU4J65c": { + "text": "parque" + }, + "_3ihCSMQCokXNo8pXii-h": { + "text": "llamar a alguien" + }, + "_8RIOebHpkr9nCy0_9qhP": { + "text": "llamar" + }, + "_CsJMxqGcNSaujXwRZcpu": { + "text": "ansioso" + }, + "_FNTsoEjTMV3Uas-gggi2": { + "text": "estrés" + }, + "_HUf6SR0mTP7v72Y9_4gw": { + "text": "coche de bomberos" + }, + "_Lc2-NNL69ZX-aVnUNzgx": { + "text": "frutilla" + }, + "_S9Eck14cdOTr0QH4i7sQ": { + "text": "cuarto de baño" + }, + "_WIT6qs1kaiJqB1Ild5Xs": { + "text": "paseo" + }, + "_eug92AvR1UXpYlfm6o_Q": { + "text": "dorado" + }, + "_hqTU9A7I3RFDVrcIEK-L": { + "text": "%null%" + }, + "_lU200bb9Sjv0b_iJKgU2": { + "text": "una bicicletería" + }, + "_tDZtalMxKSNpWydJ1aeW": { + "text": "cero" + }, + "aC_XP9Ch5PqWoCmcJwI77": { + "text": "algodón" + }, + "aMs2YNnWkw4XN0gAm-jI3": { + "text": "cajón" + }, + "aP9QisUdxhgOKIQ2kHNb3": { + "text": "acelga" + }, + "aSzpwNza22HZp46Sh6wfx": { + "text": "súcio" + }, + "aTwzShtP_zR9x6bSGSzEB": { + "text": "muslo de pollo" + }, + "aXLBXkENJqTYkyZOP8TNS": { + "text": "tú" + }, + "aa3xDW6F9YUKyX0fe5uX8": { + "text": "espaldas" + }, + "ajesFjbC7hwCNLKdif-ix": { + "text": "contra" + }, + "ak5fBauJzapC4JIf0lT8N": { + "text": "cerro" + }, + "alsoa_V3wz3vPpG1TKRZc": { + "text": "transportes" + }, + "amk4WRd1sNEIp24pnFw8j": { + "text": "rodilla" + }, + "armmpopt2RLsVDlqLrQ94": { + "text": "restaurante" + }, + "atVEXuftxSiDDj8rzUlFg": { + "text": "crayones" + }, + "atWxG3KTHB5moW1dylLJc": { + "text": "juguete" + }, + "avzcTznCsQCISYJsLC-w_": { + "text": "notas musicales" + }, + "b1XpSC0ndnm0ZewNXC3pp": { + "text": "carnicero" + }, + "b5OdBMMzkf1FlQbUR5-m7": { + "text": "servilletas" + }, + "b9Y5MrR-jn8fh77gAkLZy": { + "text": "pintar" + }, + "bAoK85XLNb7p0ebevYZ6O": { + "text": "mirarme al espejo" + }, + "bDnuS19hfd9GhJ-6rjNPD": { + "text": "estar" + }, + "bFodvUraUhJeq4waMdlxv": { + "text": "domingo" + }, + "bNJfccUvG2DQfR1iZP3eR": { + "text": "serpiente" + }, + "bVN3R44VuZDw3IdQMolca": { + "text": "cambiar" + }, + "beNprvNb0UztxR4JLxDFm": { + "text": "cumpleaños" + }, + "bge6qR6NzsD5Vk4ifPsSO": { + "text": "ketchup" + }, + "bpSuQQRlIcSse40OAxNSG": { + "text": "lunes" + }, + "bqjKW_qBtRzIThWxdZx2s": { + "text": "gafas de sol" + }, + "buyy_2ydocKoi9TnBhZ1N": { + "text": "amiga" + }, + "bw3rqHXD1TJ53xbNggEqH": { + "text": "desayuno" + }, + "c7kK5ROVbO3DHrwSFEawq": { + "text": "dulce" + }, + "cI0JxwhkWU-YA7E7rmJtp": { + "text": "cuello" + }, + "cJMQi3SVmqvWJ00VxI6gy": { + "text": "¿cómo estás?" + }, + "cJw2i319mzBUpEfBRDxc9": { + "text": "pez" + }, + "cJzHrV_PsV-PwwyFN9jka": { + "text": "%null%" + }, + "cS3g4KXf39akVFHCG5AwL": { + "text": "camión de juguete" + }, + "cTiw7_Yjxu_Kg90q7PdYl": { + "text": "gripe" + }, + "cb0rJJEYOeEoRU5fDdQQq": { + "text": "el" + }, + "ccGASDOGtty6GfQMEEBEU": { + "text": "tres" + }, + "cj6OuVw4Nob8jxP-E4rZc": { + "text": "cambiarme la ropa" + }, + "cnyLFMkJu2i3cqOY0e9kl": { + "text": "pasas" + }, + "curstMeuThu2KUph-8rkB": { + "text": "jugar con" + }, + "cxMNBGV3LytDXgwDMCiga": { + "text": "violeta" + }, + "d4zNoj2BAFG9B7J3KAlLE": { + "text": "botones" + }, + "d6s8fLFBiQ3KEJlNdJfUW": { + "text": "un poco loco" + }, + "dHM0qnbmtJAkZY0WBsqaY": { + "text": "lila" + }, + "dLHDzm0rfgL-vXTx14HSm": { + "text": "buscar" + }, + "dNvN5P787hAPE7ZYNgwkw": { + "text": "pasear" + }, + "dR72liRxC3qmoSa6Dz2a2": { + "text": "jarabe" + }, + "dS-KyYREUQIk7sDlmsvoa": { + "text": "cerca" + }, + "d_I8jNfbkQD0CHgZn7hyB": { + "text": "camisa" + }, + "dgm3NCKuz7L39PX8LYxj7": { + "text": "juguetes" + }, + "djgKI9embnk95PAtFcn45": { + "text": "cambiarme el pañal" + }, + "dn41o5K_1fo-qHO-YLoQn": { + "text": "sábado" + }, + "dnXsSOeVG7mq37uciIi2J": { + "text": "recreo" + }, + "e5sCl246xFMESEfFy2PhX": { + "text": "coche" + }, + "e5un1yrIuZHQi048e5kD6": { + "text": "alfajores" + }, + "e8zl_ecIloo4Vk-OZPJWe": { + "text": "jugar con la tablet" + }, + "eDX2HSkGaY2TeVwPjR07S": { + "text": "fácil" + }, + "eGJ8MC1xPE6ueF82jCmVg": { + "text": "cepillar" + }, + "eKJCZc-kD0-m6cVLorFzO": { + "text": "pera" + }, + "eWSI1NInbQowtO99phhGA": { + "text": "boca" + }, + "eZEqRZjRK8JJMsfHo4Y7w": { + "text": "del" + }, + "ebo03xnkyiHD2pKUKULmr": { + "text": "dibujos animados" + }, + "ecUOs24Pp5ZTRt_ZvED5W": { + "text": "acompañar" + }, + "eduqLSyC3m4uB1Oee6dt6": { + "text": "mitad" + }, + "eji-M2j5eHkG71DCksleY": { + "text": "huevo duro" + }, + "emm_RirDsO30Enax5Q4gd": { + "text": "con" + }, + "eo3Q5AjHJz5kp1EbdALwh": { + "text": "ustedes" + }, + "eoYtISVZl3mdwoE_HW-Mv": { + "text": "guitarra" + }, + "et1KiL5-zob_EcGlj7tLN": { + "text": "despues" + }, + "f2dl12fMZbRdQ7STpcTdk": { + "text": "fútbol" + }, + "fF3ijeQzetfSn6EGcs1yY": { + "text": "cerezas" + }, + "fL_4POdbPVL9-lvQVWSqY": { + "text": "avión de juguete" + }, + "fNAlqbgrpirQZO_LhrkXY": { + "text": "primavera" + }, + "fNv4Nb6Vafxk0JxXr-iDo": { + "text": "investigar" + }, + "fUUj_4pKPflmJlxZfk0cX": { + "text": "discoteca" + }, + "ff7ES190q1dmFYZ7lo6x0": { + "text": "pan blanco" + }, + "fjCOcN-PKP6F07IZcI71X": { + "text": "plaza" + }, + "fkNwVm56PSe-qh-QoM0vm": { + "text": "allá" + }, + "fk_z_HrvcUh8XIq8D6gQP": { + "text": "nueces" + }, + "g1Cj6HW8kg8yPE1XX9pxa": { + "text": "desde" + }, + "g1TLUpuQX2Zs1ob9gqYui": { + "text": "gorro" + }, + "g2MhHawoIC9oFNEv5_w63": { + "text": "vida" + }, + "g2sQSxCcoZuKJ3TabK6oT": { + "text": "vino" + }, + "g75y4E53ViakV-s5UfnIF": { + "text": "equipaje" + }, + "gFEnqFhYoXF7QN-n0ONad": { + "text": "montaña" + }, + "gYrIz3R13-BC_pYcvQ9BL": { + "text": "invierno" + }, + "gaem1LHTtfQdnnqYi-sOm": { + "text": "billetera" + }, + "gff2FqDlgXknRld7YMLWl": { + "text": "entero" + }, + "gsU8pE9ozhR73xS2icwJ0": { + "text": "libro" + }, + "gvPwrzDSSEPwcxY878T_c": { + "text": "gato" + }, + "gzCjycNS8Cf0vNlo1klji": { + "text": "molesto" + }, + "gzb-RNDLMNkgk9wnPILJi": { + "text": "abuela" + }, + "hAZhogJSH3bL1iL237N8J": { + "text": "pochoclos" + }, + "hDvpMlPw-chcuxEisBJTl": { + "text": "castañas" + }, + "hKJhXxultsxm0TJl1P8-L": { + "text": "chau" + }, + "hOyjT1JgOYB-mGLFMaNJR": { + "text": "dolor de pecho" + }, + "hT3Lrjn5-q7YIM1loG4MN": { + "text": "parlante" + }, + "hUYfE_vmNBT_7E60YZsSu": { + "text": "pintura" + }, + "hWWOw1gWjWwN7wQJkHrTu": { + "text": "tour" + }, + "hXgGhazQ_nA5uqpRD6Qwq": { + "text": "ganar" + }, + "hmhAUgqvGp7nc1w25sRSx": { + "text": "esperar" + }, + "hwzwfMyJsvB42F_QWQWyi": { + "text": "jugo de uva" + }, + "hyUaYltGVJU-wRrAjhhPa": { + "text": "cantante" + }, + "i0wB--S4sdL8Q4H9b93UY": { + "text": "ácido" + }, + "i2mlV3zGS6nrH2l6N2BlZ": { + "text": "trompeta" + }, + "iAqItRUQL_YpbMn2pgjsA": { + "text": "pizzería" + }, + "ibtmTEP3QGDY8TyVLteuX": { + "text": "blando" + }, + "ifd0M0pAlFm7aPt1A0ze_": { + "text": "amar" + }, + "iiA1u1JKRmhe2jWVE_W79": { + "text": "amigos" + }, + "iimGxVoFWlq_THThR3vmF": { + "text": "noticias" + }, + "ijn-QwQuTxRFFVe-7WlSX": { + "text": "picazón" + }, + "iowxE4MxcV6PR2Uhtvxqs": { + "text": "hospital" + }, + "irbOv2dHA7G969dnJMfJn": { + "text": "cuaderno" + }, + "islCzqFq1SYrZAh63dLhQ": { + "text": "huevo frito" + }, + "j5xZZev5nTNa-p088Oqnp": { + "text": "besar" + }, + "jBqD3qhhcrioLlCU-xq5b": { + "text": "instrumentos musicales" + }, + "jOALQbfxdXmJVyY6P5gZG": { + "text": "damasco" + }, + "jTEb3A5ZEKEy2ojuq2vO_": { + "text": "hueso" + }, + "jeO9YZ22LfSObUNhQDRAz": { + "text": "ventana" + }, + "jfly9fZ3x1da4SGCCNcV2": { + "text": "bufanda" + }, + "jfvreGZv-e8rD4-01wZ5H": { + "text": "venda" + }, + "jhJ2TOfdaRAcVeHGOjwua": { + "text": "leche" + }, + "jmzg4EiC7JEHwe9gNP3C3": { + "text": "arroz" + }, + "jpKPg3hn6_GO1HSkeLNGz": { + "text": "niña" + }, + "jprAsdXWGQKPlUWwgBBot": { + "text": "película" + }, + "jtKc2q2n5an342ZkiMB9R": { + "text": "higiene personal" + }, + "k-iDOTk5uO7ZK5OB3v8It": { + "text": "viejo" + }, + "k41gkf6A_bDtQAJDOrWpP": { + "text": "pasta de dientes" + }, + "k7dZhQtwDPFlOk1iPjEOz": { + "text": "subir volumen" + }, + "k8tJx6PikRcnVuZEqrXRM": { + "text": "viajar" + }, + "k9ZpWM4oRb1q20c0qWCsg": { + "text": "abrigo" + }, + "kDzHKO8eIwNsyKWDw7M0c": { + "text": "uva" + }, + "kIn8SeGURyvu49EsRqDs7": { + "text": "pijama" + }, + "kN85Lb_C4dLnww7sz1afK": { + "text": "café" + }, + "kaiWPbXxjHXlqcpBaBp4l": { + "text": "viajar" + }, + "khUUL_1JQGngApqBRDh_q": { + "text": "arreglado" + }, + "kpghvJtujlt4vPI2N6vsg": { + "text": "o" + }, + "kxuGlfYjS6puO2xD1QvxO": { + "text": "vamos" + }, + "lKA4b7I3iFkqNzPcAXyBc": { + "text": "cocinero" + }, + "lKMW_xTZzCrCHRcGp-Z-n": { + "text": "galleta" + }, + "lR84gCk8OM-oYoLAV7tar": { + "text": "timbre" + }, + "lXH68vGIuZdfA8xVrS8iw": { + "text": "mucho" + }, + "l_ncJLRdVGBzzQc9yqBqs": { + "text": "banana" + }, + "lrUuPKco_O8FXDuclzpKE": { + "text": "necesitar" + }, + "m0434KkjeTv8SGN7WxR2C": { + "text": "negro" + }, + "m0Fkio76HZHS2HguPOTn5": { + "text": "seis" + }, + "m17b6MazSk6M4gb51_cCy": { + "text": "pulmones" + }, + "m39xTdgaenoi4mWGEa-Ew": { + "text": "plato" + }, + "m3qTT8tiGZQheKIWREzMT": { + "text": "ir a" + }, + "mC9Nb7zVdEUpjEBODw_gL": { + "text": "vos" + }, + "mFfylZ8yoLvtkVSDTlVEN": { + "text": "pomada" + }, + "mJqzbxYeIDQciPkeHA1Ao": { + "text": "cuchillo" + }, + "mK4AXXhoIVirBz5dr_xLA": { + "text": "pavo" + }, + "mRK--C5Q1aGe8MMPJJLYi": { + "text": "preocupado" + }, + "mTklFAI-FVVLsMKoASZ7T": { + "text": "desconocido" + }, + "mWXxPPvhSHf9hyb-VyuZH": { + "text": "e" + }, + "mZFwH8xY_OeVDWCdvPZBy": { + "text": "pie" + }, + "miPmA2tOQiLxOW7D_V_x6": { + "text": "cubos" + }, + "ms97ZsgQOvD-Z8qpSW4oN": { + "text": "¿quiénes?" + }, + "mx6dmRLXA_lkN1QlP71vq": { + "text": "todas" + }, + "n5bZClAB6jXAZnwxIwH-1": { + "text": "tostada" + }, + "nK7DRpxalLBHL9OnRjSim": { + "text": "frambuesa" + }, + "nMQUtS-kFHViOKyop1FdS": { + "text": "vincha" + }, + "nQSk6_KCEVdO7oC_uxLXN": { + "text": "oreja" + }, + "nQdbkRVcwpQB_hFNPbe6M": { + "text": "caballo" + }, + "nUg2M7p5sUPlGdbBev2-G": { + "text": "tobillos" + }, + "nm6e_s01gWHzdVj25BHyq": { + "text": "¡qué lindo!" + }, + "nnTJQMJWfd2nuTSlFNEOy": { + "text": "mío" + }, + "ntzBlFkDMTKEUHoGNc65u": { + "text": "baño" + }, + "o0oxaoUFpOLiGsoQBlalI": { + "text": "torta" + }, + "oAxNCJufVUqZMyWRGdZl9": { + "text": "tuyo" + }, + "oEHzYcfxDGGcsL-deud1j": { + "text": "snack" + }, + "oEyUWrQj1iYUnlEUdQQ5Z": { + "text": "flauta" + }, + "oO21zLMEtHEakvnuTohLu": { + "text": "¡qué divertido!" + }, + "oOkD8Wmvb4t9I2EWqT1Nr": { + "text": "amargo" + }, + "oSBFO8Ka0PN4bgX0QuWxL": { + "text": "viajar en auto" + }, + "oYwoiRDWlIjSTbYdC2vG6": { + "text": "falda" + }, + "oa-MShota2L8n2pU8hIsm": { + "text": "jugar" + }, + "okr5oAG2U8Er1XwQ8XbWD": { + "text": "grande" + }, + "oqQWeoWBr5N0LrPGY62Og": { + "text": "senos" + }, + "otTWzTaTAmweNCozT8tn9": { + "text": "alergia" + }, + "p1qK47wwLwF8S0Fy8-2Mt": { + "text": "mano" + }, + "pHBnmCFpM7oZf0O78CBIz": { + "text": "golosina" + }, + "pM-bC77hbj-w44A0HFRDZ": { + "text": "sonarme la nariz" + }, + "p_XyUXRmeUk_bdjRTMtkz": { + "text": "revistas" + }, + "p_qpVEd677b2Bk56yhvj6": { + "text": "jardín" + }, + "paPpjw1XVC9-6xcueJsrY": { + "text": "todos" + }, + "pgPlWKk-oww2fua5zYuue": { + "text": "mono" + }, + "phZ4F4uzi1TrhjeDMuMsn": { + "text": "almohada" + }, + "pkuppr1jMH7SMpa2hrIWQ": { + "text": "jugo de durazno" + }, + "pliNY9oMQh1iSidkEhhDO": { + "text": "abrazar" + }, + "pptyFMhLrbC6lN6zmc7D0": { + "text": "comedor" + }, + "ptQZXjMQyXWycUD1kAkQo": { + "text": "cuento" + }, + "pv8eYkxczIevQqEGwDz6V": { + "text": "mochila" + }, + "pvXSy-5M4i8kysUppvdME": { + "text": "que" + }, + "pwltOTDn2OyABTlD4-27W": { + "text": "verduras" + }, + "px0jKQDj7r9pOYs4ZrvcT": { + "text": "tomate" + }, + "q22wRFF21EigV8YzQ_MfV": { + "text": "¿me ayudas?" + }, + "q6F-qJ7mTxvwa43F6vwun": { + "text": "escondidas" + }, + "q7Pz4UqqZUlXeFfXrwXDR": { + "text": "enjuagar" + }, + "qA4v2JWQU0zzBBZgvW7Vt": { + "text": "temblores" + }, + "qOsbXyvBTMDAwvvnI0iFn": { + "text": "pequeño" + }, + "qU5IvFLD8d16iIHSs_9TM": { + "text": "cebolla" + }, + "qWhpDTMd8eAEoq7yTKc57": { + "text": "calzón" + }, + "qYA2U_BFOZtFLClxuCIBJ": { + "text": "dolor de muelas" + }, + "qeJdrxKIIcUctIjo8wWhc": { + "text": "aguda" + }, + "qn-7ERrcZxJTqfW6hwNs8": { + "text": "correr" + }, + "qsA1zm1DOlItK7DCWzAw8": { + "text": "aburrido" + }, + "qscoBbrWu7tQbpNj9XUPt": { + "text": "papel higiénica" + }, + "quE_RA9abVvtG-Fo4Jx8f": { + "text": "diez" + }, + "qy3c7gvRU7shWuJYr1kBk": { + "text": "bebida" + }, + "r7eJgCF_b_ktkztv4-oda": { + "text": "medias" + }, + "r808IO3I6j3os_uix6O63": { + "text": "juegos de salón" + }, + "r9qUBQwgY8eycnU2OVey0": { + "text": "comer un sándwich" + }, + "rBwDn3PcJGqytqnOZTJMV": { + "text": "taxi" + }, + "rMFGfzFobfGsH3_qrLHXU": { + "text": "pescado" + }, + "rU9cpWF0I4wnJjzTXpGtO": { + "text": "hoy mismo" + }, + "rgyV6CvFe98OGnWut6QCZ": { + "text": "turista" + }, + "rlGO5jGKPL1vW-VF4nRqZ": { + "text": "entrada" + }, + "rnjJyPTabH_Xpmy4Z4O3U": { + "text": "celebrar" + }, + "rtHwq5WN9KElX3V3SKBmS": { + "text": "papas fritas" + }, + "rwyX2YemNEx_Mh64IArDQ": { + "text": "oscuro" + }, + "rxdfuk6egO7VmZEB3JrUN": { + "text": "la" + }, + "ry_jOegpMf4nB3spGf4d2": { + "text": "me gusta" + }, + "s0BXoyn7AqUAlZ9BOHY6S": { + "text": "tríste" + }, + "sAsTkky29uEVC9vo3Ofbo": { + "text": "brazo" + }, + "sDKIldL3tit328Joneo_7": { + "text": "vaso" + }, + "sFNUgvnglgrm6cbYiM0di": { + "text": "¿cuándo?" + }, + "sP6uvKmY5kA_yuYR8H21c": { + "text": "halloween" + }, + "sPtazVgymXESdS-BcHqU_": { + "text": "pollería" + }, + "sSTGRl6DpYGZXp8vtTNbm": { + "text": "comprar" + }, + "sbv5HLPUR6gHo-EJR2S7S": { + "text": "camello" + }, + "sc0hr3jQ80yXRFDlAn56V": { + "text": "cansancio" + }, + "sixdpB8hTOhlUr4loz3RB": { + "text": "muñeca" + }, + "sjGytpiPjwqJfPaRUJ-Iw": { + "text": "miércoles" + }, + "sysOciGqtL7y4ULuyYVc-": { + "text": "canal de cocina" + }, + "t-w8e69GwxLyfxlWwHk9f": { + "text": "mermelada" + }, + "t34TbvjJ3zG2jcgJaCeHa": { + "text": "tocar" + }, + "tGyUfSljuc7A5Do5B9GuN": { + "text": "sweater" + }, + "tQwMPLvqAMAstcqvnOERE": { + "text": "gris" + }, + "tWxC4hR6di5zQC-Hujlev": { + "text": "bajar volumen" + }, + "tYwEpd2EOtH8wEUr-jwHk": { + "text": "caro" + }, + "tw1doIY-jFPofZjlPFj4z": { + "text": "¿cómo te llamas?" + }, + "txj22hip0CE9qp_z-daIK": { + "text": "nebulizador" + }, + "u1nIt_oFH426g1IVhlYk5": { + "text": "sediento" + }, + "u2e4Zh8qwJF7zKkohQ8df": { + "text": "goma de borrar" + }, + "u3BufiTZTK6AylGh80ZFd": { + "text": "ella" + }, + "u8HfFvMPkogdWk-URj9hv": { + "text": "escribir" + }, + "uDg7Yy86PlwsAd-U96vJR": { + "text": "arriba" + }, + "uFoytOG4qsXzBk979t63y": { + "text": "limpio" + }, + "uMhOF9ZvWnjW-Zrjbjfhs": { + "text": "bajar" + }, + "uOA82KFAVtjoYRTuYFgpr": { + "text": "postre" + }, + "uPL5NMeXTmD1iU6ZoiROu": { + "text": "pájaro" + }, + "uYElWOlSOSoQap-d5gsYF": { + "text": "chocolate" + }, + "uZRwbLa1lEG7ol0UJKRBj": { + "text": "viejo" + }, + "ubP5GM7_0vPkRc6zbD9Ez": { + "text": "antiácido" + }, + "uiVc5R86QCZkhraEFlrNz": { + "text": "museo" + }, + "ujyHgmlPIs7UdtndbYd8S": { + "text": "amistad" + }, + "upWXctTSKBtFNSXnXDK_u": { + "text": "frutas" + }, + "uzSwgQNnV8ZrjxpN5Bz_a": { + "text": "difícil" + }, + "v-E2GE1DpCkNAxsfA0f4M": { + "text": "goma" + }, + "vHzfvEgIkQ0e73ryfWP2F": { + "text": "ordenar" + }, + "vKGLQIas9RdBnPGsaYtr2": { + "text": "cometa" + }, + "vOgqHjpHgrUGERIHtVqDe": { + "text": "basurero" + }, + "vPicdKLrhT2wmAAPPukKP": { + "text": "veloz" + }, + "vPnmrsRou1ihosdVXS_Op": { + "text": "zapatitos" + }, + "vZ9JaTnoj8C0ILYxMNB73": { + "text": "calabaza" + }, + "vaYJPAsTRvslo2qFOJt60": { + "text": "lomo" + }, + "vazatQ7CrYJFsorVDC5AC": { + "text": "león" + }, + "viAHJeLRr_6j9dEi5klj_": { + "text": "amarillo" + }, + "vlh1Pa6eA0ZrBs3vHzWH7": { + "text": "oso" + }, + "vmb_RMIB20QND6VcS0deY": { + "text": "panza" + }, + "vq3T-UQGTjX3Z9TlEF12e": { + "text": "mayonesa" + }, + "vy-O5Zc5kxY8d-7RROvQI": { + "text": "jamón" + }, + "w4cVxbBDZjeNyHwpBARHQ": { + "text": "hombro" + }, + "wBLnDZStKj8YLkg2pTCfh": { + "text": "sentir" + }, + "wCGb6D4xSVr4UeKXzGIlP": { + "text": "disfraces" + }, + "wcpXeLMBRusfqfrz9s4mF": { + "text": "puré" + }, + "whHwNRVnqeM7BMx6nppiW": { + "text": "tigre" + }, + "wkrNPLGWTqMIy4PJRW9QR": { + "text": "en" + }, + "wnfSUkF8-tQiRTVou1_pd": { + "text": "frío" + }, + "x3PNiU1NIeQ3zQa31C8WX": { + "text": "pañal" + }, + "xGsyYCjDzQugVzSaK8CuA": { + "text": "duro" + }, + "xIgPo3N-aKXhVcjultMiY": { + "text": "factura" + }, + "xPUYlxRxgFVn1FHQFz6Ic": { + "text": "secar" + }, + "xQblStUfyBGO27j15Sda3": { + "text": "pato" + }, + "xT4BPNmF-5WAQLfs3cUpS": { + "text": "enamorado" + }, + "xXtjQktuAq1bmxTc0HSQT": { + "text": "gaseosa" + }, + "xbPnUL4qxvm30VFYNphh-": { + "text": "tíos" + }, + "xiaTdHGInqfm4rD6XzSeZ": { + "text": "encender" + }, + "xnPF8fvkC1TvgETI1JcC9": { + "text": "órganos" + }, + "xqGzZJIHBeVfSzRfm3rmg": { + "text": "uno" + }, + "xxr0MRGYRmmoNC_gsD9uy": { + "text": "pasaporte" + }, + "y0SViQxW8Y-yiX1Z7gXWt": { + "text": "superhéroe" + }, + "y5W21CKOkLWnYJo1OC700": { + "text": "tos" + }, + "yJoivIPHOm1Y1lj-hGN1J": { + "text": "dormir" + }, + "yNag8CK0wV_iRMnFznsXk": { + "text": "pelota" + }, + "yR9FTtOimFwZG5g5tgpRk": { + "text": "visita" + }, + "y_5OURnKxFcv4UiMKntUi": { + "text": "y" + }, + "yihsjW9ON0Fr9Yy4ZlP9c": { + "text": "axila" + }, + "yk2wDVqHEKKwupgm87OJ2": { + "text": "nalgas" + }, + "yo00Ci8bSRFYPU6HxGVwX": { + "text": "cantar" + }, + "yqlmoVGItXqaeazw3M3eg": { + "text": "sillón" + }, + "yvtvSsBLhabkcpeYGbxQr": { + "text": "bota" + }, + "yxa6QVSrmWUKH2PZHKaVl": { + "text": "lechuga" + }, + "zANp2EnhT6n0Jcl1Xra6K": { + "text": "bailarín" + }, + "zAmesi1FcIWLXE3WVa9WS": { + "text": "antihistamínico" + }, + "zRTTg5x_P1E8Z3CU-oWXa": { + "text": "cualquiera" + }, + "zcibOHpRbSmz1hVNSjPTj": { + "text": "tenedor" + }, + "zdFC3vpgjcyUWB9a4ghRW": { + "text": "descripción" + }, + "zi_wcT10fxgn72ZJhVx18": { + "text": "vestido" + }, + "zm_6R89hr4wjuVkifiYrk": { + "text": "despeinado" + }, + "zrR1DbO_szgKvxLyrZquw": { + "text": "calefacción" + }, + "zw-o9pDectP5bxFnUjrJO": { + "text": "chancho" + }, + "zxhRDSHXtV63Sp3c2fjrI": { + "text": "aduana" + }, + "-k6dUC6thWPyULq8MVSe6": { + "text": "PRONOMBRES" + }, + "0geft4arn_A8kL-rfUPYc": { + "text": "PERSONAS" + }, + "1aM3sTxyb8yLSWtkn2MoO": { + "text": "INSTRUMENTOS MUSICALES" + }, + "384rVetrrLX4x4pJ0Y0Na": { + "text": "INTERACCIONES SOCIALES" + }, + "4e6iVOPLAjnM6wCMUm5P4": { + "text": "DESAYUNO Y MERIENDA" + }, + "6vmRBH4shBk3UQEUM6APX": { + "text": "CINE Y PELÍCULAS" + }, + "7Jm3bDhPInSlwhdy20dKF": { + "text": "CLASE DE ARTE" + }, + "7ngCuvmAnM_7ygpFQgLpk": { + "text": "COLORES" + }, + "7w5ACMFdOCTkBrS911MA1": { + "text": "ADJETIVOS Y ADVERBIOS" + }, + "8FPdnkMzOIBVTW5-TQxWX": { + "text": "PERSONAJES" + }, + "8t8CAggTj3HuznkKhfXle": { + "text": "LIBRO DEL RESTAURANTE" + }, + "9JRv4X68pAtwsFT3Ss0iJ": { + "text": "LIBRO DE NATACIÓN" + }, + "ByBvBUS7dcXldjzZOVFFP": { + "text": "CUERPO" + }, + "C7ClEHF5-Mcico4FvRxEV": { + "text": "PREPOSICIONES" + }, + "GD9YHeLktSsdZQvcoua6x": { + "text": "LIBRO DE LA CARNICERÍA" + }, + "HzPl-HvsrXL_QkGT38Ohd": { + "text": "LIBRO DE VERDULERÍA" + }, + "JKEk5TYykBK6ZeYND3Ron": { + "text": "CONJUNCIONES" + }, + "LWyfHr8Oui5HIShtZ_huo": { + "text": "FRUTAS" + }, + "PYTnUqCLwAbngR2Ozroc2": { + "text": "ACCIONES" + }, + "QQszyYRLL-otCQtRfbLzm": { + "text": "TIEMPO" + }, + "V6K3TniptOApMMGa8TspR": { + "text": "TODO" + }, + "VhfGFlHDcPor996rCzoK9": { + "text": "CELEBRACIONES" + }, + "WZYuZd331Hm5gHXJtUmBN": { + "text": "ANIMALES" + }, + "ZgZoyOg5K-LscXdfl6kQG": { + "text": "CLASE DE MÚSICA" + }, + "_Cw7FcJSYiterkLSDJH8V": { + "text": "CASA" + }, + "ah257x5jssDmLIOrcSGn6": { + "text": "NÚMEROS" + }, + "berI6X2_pAVCNOrcHAL6y": { + "text": "SENTIMIENTOS" + }, + "ce2z_EeEG2nH0ZS4KVAkA": { + "text": "COLEGIO" + }, + "dQXaeM3Uul1yEvRwJ4w9t": { + "text": "VESTIMENTA" + }, + "ejXQZAiYjrcSFGXb1pz7M": { + "text": "TRANSPORTE" + }, + "gybgILOLxmIVfeQtb1f94": { + "text": "LIBRO DE HIGIENE" + }, + "iHS1HpUBBadzgmbum_bdD": { + "text": "PROFESIONES Y OFICIOS" + }, + "jatDsecioVAxRph-WOg4f": { + "text": "LIBRO DE LA FARMACIA" + }, + "puOOrKWbYzH0B_8uGkxYX": { + "text": "LIBRO DE VIAJE" + }, + "puda9fUGjqvm9oSM6CpTk": { + "text": "ALIMENTOS" + }, + "rH7zhJzNVIcEIRyvaYLoi": { + "text": "DEPORTES" + }, + "uv4tWMRHfewaEQ_pH0dnV": { + "text": "LIBRO DE LA SALUD" + }, + "wAhDHMrZ850dHTwgAXrMY": { + "text": "CONCEPTOS" + }, + "xjfPlDs-AcFV9LCyY-v9j": { + "text": "JUEGOS Y JUGUETES" + }, + "y545pM8pvB3WgukIac6NT": { + "text": "LUGARES" + }, + "zwf7qmSEi7PBwsNaqciA-": { + "text": "libro de la biblioteca" + } +} \ No newline at end of file diff --git a/assets/languages/es_CO.json b/assets/languages/es_CO.json new file mode 100644 index 00000000..9ee69822 --- /dev/null +++ b/assets/languages/es_CO.json @@ -0,0 +1,2504 @@ +{ + "-2UbAou9ydr8XeN-jtIz4": { + "text": "limpiar" + }, + "-GL2iAgykP10Ae3AKsVOX": { + "text": "sal" + }, + "-LE2iv3Pwr5KuIyM5bYb3": { + "text": "bien" + }, + "-LwAKwgCdVkzwM579zRMo": { + "text": "más" + }, + "-aePI8WknXpxEpz19Lu48": { + "text": "suyos" + }, + "-msU3yor4qJYQHJtWrdk8": { + "text": "pastas" + }, + "00AkNJ4YLpbRD_mLmQjtp": { + "text": "almuerzo" + }, + "0IrLGI8Ebm8rcS3ymUXqS": { + "text": "hambre" + }, + "0THELgiQ7rvA-orESXJfV": { + "text": "avión" + }, + "0Vkmy6BZcJn3pFurEevL9": { + "text": "estudiar" + }, + "0Z7uFXpp-XRXmqM8ILhIC": { + "text": "poco" + }, + "0_SK41wNOk6mw2qX_eHXM": { + "text": "cine" + }, + "0cdYDZ5HPaTmqTTN0_Ee8": { + "text": "suerte" + }, + "0fHziRVxg0oNDp5pyiI8M": { + "text": "permiso" + }, + "0fcYcD_r0jNWXTTAx8Ph7": { + "text": "aeropuerto" + }, + "0gAyTD6sImo0jpD_bYGVv": { + "text": "jueves" + }, + "0huLn-H32Cbwba28IZ3tc": { + "text": "burbujas" + }, + "0jpMJu8isUmOZKxhZ_yaj": { + "text": "equipo" + }, + "0pFtmDZdlnLrUkT_XZDXQ": { + "text": "antes" + }, + "0qoQs8WyLVONnu3_eBGfD": { + "text": "dolor de cabeza" + }, + "0v5fqIp8GmXsIHO0SPhtt": { + "text": "dale" + }, + "0vttFf3nAGDW6g5wVStcH": { + "text": "disculpa" + }, + "1-VwcvzNfvrwDWRGxRPre": { + "text": "ni" + }, + "10X4OKR5xmNhSj86sbyE_": { + "text": "salchichas" + }, + "14aCIW665UZtuwNsKKV5s": { + "text": "cartuchera" + }, + "17AkRFlfC_koV-lywmDE8": { + "text": "pantalones cortos" + }, + "1B1WmC-V0PglDeRAeINcT": { + "text": "mirar" + }, + "1DjW-XvWN7iOqoJPRSWwY": { + "text": "mal" + }, + "1IjenNwPwsMIWZ4aYBk8S": { + "text": "partido" + }, + "1Ph13Z_Ya6p-q0WA7pSl3": { + "text": "pájaro" + }, + "1QEfLU_S7TM0iMr9VZVtP": { + "text": "ronda" + }, + "1Rv9-SSJjHptwvzqLbdbx": { + "text": "divertido" + }, + "1WJZO-pUkTaQvyxz41iB-": { + "text": "picado" + }, + "1YOlJCovdcnnqVihqHVmq": { + "text": "acá" + }, + "1b71P9YjaNWnX8AWjstqG": { + "text": "remera" + }, + "1mS8kgJIod1cyUFH-msnM": { + "text": "estación" + }, + "1mU2ZosZXSJrxkh1NmxJT": { + "text": "izquierda" + }, + "1nhsReHG-f-bW-xaZBsxY": { + "text": "abajo" + }, + "1pb6S-RR_3zdCq77YFiZ-": { + "text": "¡qué mal!" + }, + "1zU7kolOKsHP9-oomQW1Q": { + "text": "rey" + }, + "27GbVOZ-szdnzsy92oY-X": { + "text": "manteca" + }, + "2CgcUkvJUskv982FvG54A": { + "text": "plata" + }, + "2HkB0WZYP7cvWLD39GMQj": { + "text": "bañar" + }, + "2KO0BFtB4B6fu1feuAZLt": { + "text": "verbos" + }, + "2RZTRMX56BFLrW7tLJ3Hy": { + "text": "mismo" + }, + "2Vc2H462cutVtUC-5omJk": { + "text": "pocos" + }, + "2dwtZO2wCm520GPD1i6dl": { + "text": "dolor de garganta" + }, + "2t_eq1JmgHa0R3eu8LMmI": { + "text": "ventilador" + }, + "2u2-AFuI245I7bZ6tsSPh": { + "text": "¿quién?" + }, + "2y9pxVOBQ2tMdPHcsqQb8": { + "text": "martes" + }, + "3-ueUrnwmIIj0BMP8_Ntb": { + "text": "uña" + }, + "32PnZjlnQbTJo4nL9YJYe": { + "text": "feliz" + }, + "3932Zm0xgk1hKB2hhBAUa": { + "text": "colectivo" + }, + "3KbwCHGooNLySWOBlFFuG": { + "text": "cocinita" + }, + "3KgKNNnuYMrysEDs3Pu4Z": { + "text": "subtítulo" + }, + "3VEnVjaGFCImBAZ3wEChu": { + "text": "ropa" + }, + "3arbCGI6fMOWALLanZcg3": { + "text": "capuchino" + }, + "3dtvYLjbl5oDyhZO9eFRY": { + "text": "ellos" + }, + "3mwcdenOurU_e59ChLqb0": { + "text": "fuera" + }, + "3w62N9b7Cvb6JMjB9Wphi": { + "text": "beber" + }, + "40q0NJ6vsziJDNFBqho7Y": { + "text": "dentro" + }, + "4A_FNkGH1EDu0oabPurrL": { + "text": "cereales" + }, + "4J1bWl6BbbEdZsRGsgYH2": { + "text": "queso" + }, + "4X7OXm35OSHoSlPxGUi_f": { + "text": "mueble" + }, + "4bHGIoQmDN8LptpdNN4v6": { + "text": "vacaciones" + }, + "4f1vqDoAvUu2XYk_JlQdC": { + "text": "siete" + }, + "4rctwNiN4UaU9lqU48MHG": { + "text": "computadora" + }, + "4rzonBodQXfs77gALnAP_": { + "text": "cerveza" + }, + "50wJdR0-3YLnv9y_2Gx_e": { + "text": "saltar" + }, + "54BVjn2seJWdBNGI20-yJ": { + "text": "computadora" + }, + "54taab8z9ziXt0IqXHkV9": { + "text": "dedos" + }, + "5L5UzBHOzuHRoO-jyPuEx": { + "text": "ciudad" + }, + "5LYjhk-N87Ov9NrQcGbLQ": { + "text": "aceite" + }, + "5Tdy0Gu9SiLsPfWwd-Y2E": { + "text": "lindo" + }, + "5VBtwEswIjrv1zbXP-oFn": { + "text": "sopa" + }, + "5W5_sCAyGTkVzguCEg1d1": { + "text": "jugo" + }, + "5dvq344JstkxUpHszaPfp": { + "text": "delfín" + }, + "5gPT9lrNgpRkF07lP6zOq": { + "text": "jugo de manzana" + }, + "5i3kSsCKF7Oa9iJQvXiTe": { + "text": "más o menos" + }, + "5kjlzqb9Rf3zzqZROaZ9p": { + "text": "perder" + }, + "5mGrGHzdw_vCwYCRNPcPw": { + "text": "pasear" + }, + "5vxTXbPl4Y0yezGu7p1f6": { + "text": "hacer" + }, + "6KicPX6y_u2i6tPBZAtvA": { + "text": "lavar" + }, + "6jLkKc9OL5btNOmjJem6S": { + "text": "poner" + }, + "6lYN4qSZx3_tKDClp4Iyr": { + "text": "entre" + }, + "6nhNeVjDfDi-GmreaqfVo": { + "text": "nublado" + }, + "6rcOXG6yxpzHLzMJ9IayI": { + "text": "cerrar" + }, + "6t2sPdapSNJrOziDozTWW": { + "text": "vaca" + }, + "71l2at-8480bvijxn3uBl": { + "text": "durante" + }, + "75gujwNXJdAiNmK6Ffhia": { + "text": "jugo" + }, + "79xBF6cKgKeD4GeBPe_Ds": { + "text": "bolsa" + }, + "7EsVGfapPc_38mHCBy3C3": { + "text": "enamorado" + }, + "7Hz61-WzV62FHsedOwz6q": { + "text": "flan" + }, + "7Q4Zc0cenSF5U4eKyje1f": { + "text": "hacia" + }, + "7Q9sNljseWjwSPW4in1ga": { + "text": "recepción" + }, + "7VL_MgnLDY6hi8sbvcGIg": { + "text": "silencio" + }, + "7WxUVoVQfQOzARU2bf6HP": { + "text": "casa" + }, + "7iAXKVm22uMgr6aqZ1rr7": { + "text": "abuelo" + }, + "8-4M30dTtmuUJus9MtGqV": { + "text": "moco" + }, + "81UJI7xOa5l9mVceqkIP5": { + "text": "tener frío" + }, + "82LicIQc3K2xCTEt-iMpu": { + "text": "caracol" + }, + "86gNdF6aTepa0Y9zkD1VQ": { + "text": "campo" + }, + "8FFwIw7rJri79BITZBUzm": { + "text": "hotel" + }, + "8KlFB3an1mzdQd6-LGCCE": { + "text": "merienda" + }, + "8LddDqylw-51wHhx9_Qad": { + "text": "libro" + }, + "8MV4ZFthtUeoxLAIbqGTc": { + "text": "carne" + }, + "8cOIYr-hcK54qWpuT-41e": { + "text": "cuento" + }, + "8fGingRAd8idw4qcxyZ-Q": { + "text": "vergüenza" + }, + "8iFdjRTQU7ONGnigRTlm8": { + "text": "¿cuánto sale?" + }, + "8vR0HYniXtrrQqqSIN_JQ": { + "text": "familia" + }, + "904w9Je6oDwGXUCIcrUZX": { + "text": "lengua" + }, + "93YmZA7VfAT7TTNTsDE1W": { + "text": "serie" + }, + "93hsW10TmX3Vcq_4IvcZ0": { + "text": "blanco" + }, + "93tHieC_CgZqN998y5gAv": { + "text": "chuleta" + }, + "97nIv-aoc51T8kKTZV5cM": { + "text": "saliva" + }, + "9EqfwMNtATh1fwMhyn_B1": { + "text": "buena" + }, + "9FiWvg197C-Riid-DVysN": { + "text": "claro" + }, + "9GqE148SFZqMIft4evAk2": { + "text": "comer" + }, + "9MzeUcz1nRqleTkmS_-g2": { + "text": "barco" + }, + "9QyJdpUn0f6g7FxWs5qpO": { + "text": "cortar" + }, + "9U8MzceIsqKhG86oNx9zV": { + "text": "coche" + }, + "9UwpyOnOBoqr4mX3Juqm2": { + "text": "buenas tardes" + }, + "9ZnzbKMDwGEwC3hXOhXFe": { + "text": "pastillas" + }, + "9dvSIpeXa2_12Jip6noJP": { + "text": "deportista" + }, + "9kgRI3KlOIVSuylKffW9g": { + "text": "colores" + }, + "9lS0mNuKIS0olyDwoIJBR": { + "text": "médico" + }, + "9mLx-YMK81AflitELQFqk": { + "text": "papel" + }, + "9s5zV3_oGyDx_NEvsKCxX": { + "text": "violín" + }, + "9wE9Py6ztyqDrtaypsltA": { + "text": "naranja" + }, + "AOp6VGyjYIV0Ym9d0basJ": { + "text": "dibujar" + }, + "APXF-lEplPOloppSeIjAY": { + "text": "menos" + }, + "AQKGKdoX5CYycZ2YqBZVW": { + "text": "barato" + }, + "AT_rDWsr6xRBgrvgw9Zih": { + "text": "nueve" + }, + "AWJXh6URGN0Vwm66i6IvL": { + "text": "hola" + }, + "AeFbJQ0M9uTObAlKEX3zr": { + "text": "pierna" + }, + "Akf0xlH8UJdXn8BJzPV2A": { + "text": "radio" + }, + "B1845IfYfPMz2FWpVFIQv": { + "text": "de" + }, + "BKmATW2uBk4pxnmOaARyq": { + "text": "documentos" + }, + "BNjZz9MGLJEKZ4CZoTs2M": { + "text": "ajedrez" + }, + "BQhqx1PuF94jwT0ySTlbJ": { + "text": "comida" + }, + "BQm-YCPc0lfD1-mhecCTL": { + "text": "yo" + }, + "Bebnh8-UWwtYLnK6p3fKi": { + "text": "pan negro" + }, + "BjqWZnzLlxdOo4KEzZ46j": { + "text": "ocho" + }, + "BqS7d4PMhGRqPYlZQzUbR": { + "text": "puerta" + }, + "Bub9ZYygLcly15D7_wYks": { + "text": "amigo" + }, + "ByrvXHEN9Mb8D--7MQAjM": { + "text": "peluche" + }, + "C12mJ1W11fODI3pv1QOnx": { + "text": "gelatina" + }, + "C29KJ8BTFavhj_R9UfnSv": { + "text": "por" + }, + "C2bgADoxmINRnAiYxZHqd": { + "text": "taxista" + }, + "CBTemIvgIN1UAtftkc3sz": { + "text": "pegar" + }, + "CCWCtXdMuQBJRmaFOAlfQ": { + "text": "navidad" + }, + "CY-IQvUehkaiGFCdKf9bf": { + "text": "chorizo" + }, + "CYH_6DL9q1iLLetuWeR9A": { + "text": "tener" + }, + "CZrETqLgQlvDkLHvw1t_w": { + "text": "a" + }, + "C_JKGNCxOI5x_f2C4qAyZ": { + "text": "maní" + }, + "CbO32RkDdf9aCucv6BnGS": { + "text": "cabra" + }, + "ChBc7LjL8dgzZ6LUCAHGh": { + "text": "por favor" + }, + "CkTiaqBY3jf86JRq636lt": { + "text": "¿cuál?" + }, + "CsKZSNiJw5Q48b26Kskf-": { + "text": "heroe" + }, + "CxFmyJYmy6gMRqP9U0cBP": { + "text": "estoy perdido" + }, + "CyKtU9yC0Jy7Ypb4WFp6w": { + "text": "perro" + }, + "D1gCni2jXpCvKZe4qCtQN": { + "text": "peces" + }, + "D2tSkngqbQmdKLNhn9xWV": { + "text": "globos" + }, + "D7dt_hFX5DScV_ssm1nKz": { + "text": "pomelo" + }, + "D85FU-Wqr2u53tfTXAtHo": { + "text": "patalear" + }, + "DAq2J_xXHsSCSNPp9qVsk": { + "text": "oler" + }, + "DBd09yUlbkaYLsemjFXEs": { + "text": "helado" + }, + "DG1RiDjDfwWRhpAiIpPqA": { + "text": "vómito" + }, + "DSgrhLHauub-gBqMGwacO": { + "text": "asustado" + }, + "DXb0FpjVM9q8LVl9vvSHn": { + "text": "clases" + }, + "DXpjgLKTdx9eLLohVdmWM": { + "text": "verdulería" + }, + "D_4Weq7iyi7GMEsgP0xy6": { + "text": "té" + }, + "Djs1QsLNf8Q5LBIFV5zNC": { + "text": "partituras" + }, + "DkeHJFtqAS005fYUrl1Xz": { + "text": "pantalon" + }, + "Dm3yiKSB134LrjtW_KrO7": { + "text": "buen día" + }, + "DqGa4gqd2ABDi45BT43x4": { + "text": "princesa" + }, + "Dv9MSCRYbR4Q3K114wXki": { + "text": "alto" + }, + "E-vUPARie8MmfgZwv3Omr": { + "text": "gallo" + }, + "EM8VyonJ7WNdvmRyE3nhZ": { + "text": "lento" + }, + "EO4O-s7oafi6QJdxTFNkd": { + "text": "anticongestivo" + }, + "ETZNYbrG5wveDl6c9k2_k": { + "text": "codo" + }, + "EUsNyf5bDdSLqvZKH1Ltx": { + "text": "no entiendo" + }, + "EVmt43vDI3NHFfbbkqokF": { + "text": "pizza" + }, + "Erg6LuA8IOQ5V8RTP3pPi": { + "text": "abeja" + }, + "F4cGnA_QHsVKTjUE6MAu9": { + "text": "mameluco" + }, + "F7kJ8VM31BWB4K4T4USzs": { + "text": "maltrato físico" + }, + "F8roVYxKZi88UUGfOvTwl": { + "text": "maestra" + }, + "F90bXbc0tz9nuzTT7SgqV": { + "text": "cuatro" + }, + "FBPIabyaoCK-Y0BziQdji": { + "text": "dolor de panza" + }, + "FBTheEQmZZfJRiYjd_Np_": { + "text": "interpretar" + }, + "FO77qpzyz28knodNtILCA": { + "text": "tirar la cadena" + }, + "FTngK946O8S8bYc0g7vM2": { + "text": "mamá" + }, + "FaVvbVzZivuxTwxJTPubK": { + "text": "hermanos" + }, + "FfNU04I4mZ54gWcBXqo2c": { + "text": "panceta" + }, + "FgTird367surh-vxXyAK6": { + "text": "ticket" + }, + "FkC5DtSV81OvFMU99qZGg": { + "text": "pelota" + }, + "FnCBoLSE19WsbUypUKvFc": { + "text": "hamburguesa" + }, + "Fogupb264IyCtbZ-Q2D6w": { + "text": "borracho" + }, + "Fvm2C5NBq01tm0QK9d9QM": { + "text": "hijos" + }, + "G09TvOzDSG5m3hTQD9Tej": { + "text": "borrar" + }, + "G2i9LSK4A19237Zp1vXqF": { + "text": "gordito" + }, + "G6KKVMvPDnjdD9TfBd-B9": { + "text": "playo" + }, + "GAxX7EIz1TTLtMX08RRGr": { + "text": "hamburguesería" + }, + "GJlUSznzEHCgoAOrVrkp9": { + "text": "feliz" + }, + "GSEumxiyeVKRRiaY_c8HW": { + "text": "crol" + }, + "GY_flM-6uR6X3L4AwsiwU": { + "text": "para" + }, + "G_CRpzxWO5XdEMh01O1eJ": { + "text": "aunque" + }, + "Gj7THa6XFHDfYL5H19lwj": { + "text": "mañana" + }, + "Gm_qAGnL4OawmlYmTs7K5": { + "text": "no veo" + }, + "GoJuWnn72TCXONXKtYHMm": { + "text": "tren" + }, + "Gvmy--9DiUn_tkQYWeWhA": { + "text": "canelones" + }, + "GxrDtsdGcLepdsQr6V9DT": { + "text": "verde" + }, + "H2zMVtjvqi7aUtCypiVKr": { + "text": "sentar" + }, + "H8Bsrr2NK9Q3WGbEp8PMe": { + "text": "plateado" + }, + "H9SWPnWbR8qcZA-iu5Mz0": { + "text": "dolor de Oido" + }, + "HBZNu6m3FELU9eg3OeLdx": { + "text": "cortina" + }, + "HKfLJS8aCBtKuKJeSBQUW": { + "text": "golpe" + }, + "HMPabuHqgtyiCmTLzg-rM": { + "text": "entrar" + }, + "HQiQh4PPBvO1n-d7JGVj8": { + "text": "nadie" + }, + "HTBNWax6FCSGXuboGsVUW": { + "text": "salado" + }, + "HnuZA0UTlnuIfFAN7saxl": { + "text": "conejo" + }, + "Hvb4JdDHX_vNMck_US2UN": { + "text": "ensayar" + }, + "I5AJgba5GTdEjdpFB-LBf": { + "text": "chocolatada" + }, + "IAdQsjTsbBUAMjlwW34cw": { + "text": "me encantaría" + }, + "IEeIvawUD2GIAr1Wypr9i": { + "text": "personas" + }, + "IF3R7tLVAkd4RbL8R07K9": { + "text": "actor" + }, + "IM8OUKCzHwnjAQWPFgnn6": { + "text": "lejos" + }, + "INxOSvKbBNOXwruIpuNho": { + "text": "ombligo" + }, + "IO8uTb1K7ElENgp2ujZoK": { + "text": "robusto" + }, + "IXRWmFmtqfnHQRcBf1Idl": { + "text": "paloma" + }, + "IZbfYRzu2cxxDWdbmQeqw": { + "text": "cabeza" + }, + "Ig1oypuwndODbmKh_NEXs": { + "text": "malla" + }, + "IsWUeiPnDEnzxePKclBNp": { + "text": "feo" + }, + "J3qQMp0OMr5LC9ebfArxH": { + "text": "ninguno" + }, + "J3rDL96c2zfBQzP45VRCp": { + "text": "limón" + }, + "J4UUPR-WP0qo1y14bUVI-": { + "text": "veterinario" + }, + "J7MmgugOu20UtMcMPj59r": { + "text": "canción" + }, + "J7wLwBLVx4UANh_x5HdXd": { + "text": "según" + }, + "JB9SIxWzxWFjrbmMuksrY": { + "text": "reir" + }, + "JBIehRNmDbK2ALcRN0u9i": { + "text": "gallo" + }, + "JBKQaBezKuSDaMsnbJMTB": { + "text": "bar" + }, + "JBU2hMw9gbIy9-wGF4mjD": { + "text": "pizarrón" + }, + "JDbBWMB5No0pK6HvntLt4": { + "text": "lavarme las manos" + }, + "JEDIYq1BDA23ac9TNhON-": { + "text": "ayuda" + }, + "JFldbhjqxK3fD6D2K4HY4": { + "text": "papá" + }, + "JGm4BL7HAfuxX_PGe6Jzk": { + "text": "presente" + }, + "JQOpcZSCPGMOWZsN8w_yb": { + "text": "¿qué hora es?" + }, + "JSFuEHlP-CFvuqvFKMumC": { + "text": "autos de juguete" + }, + "JVtu9W3AumOwjUedwhUGE": { + "text": "rehabilitación" + }, + "JZRBfIXBkeuobtDXbLt5t": { + "text": "adiós" + }, + "JawnUo-pseWb3FDVMtxrQ": { + "text": "yogur" + }, + "JblWXW8TKDCuYu2yTnFBA": { + "text": "mesa" + }, + "Ji5OVFX-uNDewL8eX8Cin": { + "text": "pensar" + }, + "Jjq8CM8JrYHIMziuQy-WN": { + "text": "agenda" + }, + "JziaulL-lrAPGNVvwBPK9": { + "text": "verano" + }, + "K382TlNZjdMLLpAhCCXLG": { + "text": "almendras" + }, + "K6hd20tWZfwwlYYi7jctt": { + "text": "rica" + }, + "K8cMIDL0ubQvWhhDtr65F": { + "text": "llorar" + }, + "K8e2-KkvZfFOQaXnhR37x": { + "text": "cansado" + }, + "KC18_sTEqKucPQ-iwEKYY": { + "text": "lapiz" + }, + "KK_i8H9qTfDVYZkQGwd2v": { + "text": "apagar" + }, + "KNH4sLRpVKtHXQa-0y84K": { + "text": "nervioso" + }, + "KWYVDZiERE8jtRsL0faHH": { + "text": "nadar" + }, + "KXHW4m6vXxQU-AEOR4pZ4": { + "text": "balón de fútbol" + }, + "Khdk8mWpyxgLqfC-6lyT9": { + "text": "burro" + }, + "KhyTKtiL4ZT4Z1saU1eJh": { + "text": "escuchar música" + }, + "Kn9vE07FK1LrzoD_YxrJD": { + "text": "subte" + }, + "KpLFOrpuhFKaIbBbFwVVu": { + "text": "mariposa" + }, + "KrOPANVpdkBWdEZoUwxKf": { + "text": "grave" + }, + "KvY6Taigm4Va_cVjXAfGR": { + "text": "corto" + }, + "L0hfYADgzghRVsZLZHRxE": { + "text": "bailarín" + }, + "L19r487_d3RqWXiNuh3gE": { + "text": "¿qué color es?" + }, + "L6YLAEsbYcTq-ycQJTvt4": { + "text": "pollo" + }, + "LAuEISciEf1Wc1j4fERz8": { + "text": "año nuevo" + }, + "LDoi3cxodn_AVKSG-Bf_1": { + "text": "ojos" + }, + "LEVKlDlJ0wHo5QEjCNAGa": { + "text": "pegamento" + }, + "LEg8z-Q-ONLAAXd-aH_Hb": { + "text": "bajo" + }, + "LNBTW0qQtHYQEHatkWGtc": { + "text": "mercado" + }, + "LRIKzfm9ZsdNe1u7CUuW_": { + "text": "¿cuántos?" + }, + "LRfh-4RAZTj7cnnDwBmqj": { + "text": "flotador" + }, + "LU7IoUksATEBhd8PaHS1R": { + "text": "sacar" + }, + "LaKT8VTw0_6rvordp5-R8": { + "text": "rosa" + }, + "LiBr37yi-YBgQDx4unjyc": { + "text": "dá" + }, + "LjTGOcyG7DkTs1lJqNr8w": { + "text": "cabellera" + }, + "LksmOMPPOMArbrFsscqOW": { + "text": "música" + }, + "LmGq1AZs2a0x26r7E9GUj": { + "text": "maestro" + }, + "LngEMJa_ihV8mB7afZX-h": { + "text": "ellas" + }, + "LrDai7jXlGAdZ3e8ZQezj": { + "text": "hacer pis" + }, + "M5q2CXmK0_WVaVUB_HJB3": { + "text": "caliente" + }, + "MEqo2TROHyroK318sm84f": { + "text": "pasta" + }, + "MKR-ukiUlJy4uuqO30UU6": { + "text": "maltrato verbal" + }, + "MMzjhHID8HMqyPjii5o-h": { + "text": "cocina" + }, + "MNCcHiImRS8tmvhBhzCKj": { + "text": "ensalada" + }, + "MQHnvvU48NnEptP8a9w8C": { + "text": "no me gusta" + }, + "MWIzTM6zhTWL1V-brLtBx": { + "text": "cómodo" + }, + "MYqfOzKx2qMHop8GaHs0I": { + "text": "verde Claro" + }, + "MiOe5_Djf-pE9V9aDZ_1G": { + "text": "ananá" + }, + "MqQgYn5B0uV-DMORCBOmV": { + "text": "triste" + }, + "Mw6WRebMAKWwXfAvDA7vu": { + "text": "tener calor" + }, + "N2baGNTOapSaFDo1GURiW": { + "text": "no escucho" + }, + "N7n4zQIkJZOhaYESk2GgH": { + "text": "caer" + }, + "NFdUTit6Ff-4S7Nzf92U5": { + "text": "estreñimiento" + }, + "NFgGqhEtl0HqipCGGEvwU": { + "text": "peinarme" + }, + "NKQwWPAsVHwFBWuksqfns": { + "text": "ducha" + }, + "NLi5ODIzyMAwr2HpDXACp": { + "text": "nariz" + }, + "NQayjogCYiimP_0OxIfFj": { + "text": "zapatos" + }, + "NVe4u7BTAVfLk3xkDqLnZ": { + "text": "horno" + }, + "NVjfEut567uXpTaQUNI2i": { + "text": "campera" + }, + "N_893wsadpGg3Ip5sEThe": { + "text": "azul" + }, + "NaJxTPq9Ld8I4fwAltyEC": { + "text": "maiz" + }, + "NjulpZ9x63ZqxtLMoRjkx": { + "text": "prender la luz" + }, + "Njz8DrErsexBu8mAI6mnr": { + "text": "pescado" + }, + "NmNouLLx13jzE27jliI_v": { + "text": "diente" + }, + "NuhUikdCxP0NgsbO0wvAU": { + "text": "cola" + }, + "O-CLnVuXAUapOn6TbdhKx": { + "text": "querer" + }, + "O450x4W3OOacvJIy4QicJ": { + "text": "verduras" + }, + "OHyrmD5US1rHEAEwLQaII": { + "text": "animales" + }, + "OKXIGnLh-i1ydTNj450Q8": { + "text": "reina" + }, + "OUcfOOReAfQroBKlBdDb-": { + "text": "solución salina" + }, + "OWLDc7Hn3neBAf_V_N27n": { + "text": "abrochar" + }, + "O_ZfCPZSxGMPT6orCt-O6": { + "text": "chancho" + }, + "OblxxVFC-LKPq-8oC9FpE": { + "text": "sentimientos" + }, + "OdCdTUAlbN6kvsPjby_Bi": { + "text": "deportes" + }, + "OeA63q6LpqGvXW-cJXEym": { + "text": "jamón" + }, + "OeytAsSiEAWC10tXhxbTa": { + "text": "personajes" + }, + "OhrHu-xLo8hcn5plWfoX4": { + "text": "caro" + }, + "Om1Bvqu8nmGuNGwV8hndM": { + "text": "bajo" + }, + "OvyFC1GHkvJZ0dAAF1QkY": { + "text": "él" + }, + "OwHzJdOQTFOA8daCVRwm6": { + "text": "pincel" + }, + "P5zdq4x58yp5TA_soKQEJ": { + "text": "bicicleta" + }, + "PAlC0XSZNru3-LXtfvGjo": { + "text": "hacer el amor" + }, + "PBqpK7LL1HQPwowPitrss": { + "text": "leer" + }, + "PFAi3SdvH9vL7_Bg3MhCA": { + "text": "semáforo" + }, + "PIBHv5VueBi-sf5qFCN_Y": { + "text": "ante" + }, + "PIPQnVS2UiS7kGbucJP8l": { + "text": "curar" + }, + "PLXxIPYyztaztLf4sPCst": { + "text": "garganta" + }, + "PbtM3htZocZb8YifuPoY5": { + "text": "cangrejo" + }, + "PfNLmlHKFT9d1w6IgeXbU": { + "text": "control remoto" + }, + "Pl-M4bc6k2rdhu6FHEbkA": { + "text": "patio" + }, + "PogTYrGfa2WNfBRuA8O4e": { + "text": "malo" + }, + "PszHdOxMsS_tAzSrN52Wa": { + "text": "plastilina" + }, + "Pw3GgPwp7fpDVC6wJjgPn": { + "text": "subir" + }, + "Q6LQqdLcvNOiCFjC0DVo2": { + "text": "tambor" + }, + "Q6nNH4AIoSeDHODC_Ip8O": { + "text": "vecino" + }, + "Q9Ra0aJaQnOJQ1Kqdc43-": { + "text": "bebé" + }, + "QCQRmsQY6AggjreY9Z0MF": { + "text": "rechazar" + }, + "QGf1Tb1roL7HAXUSrRqRJ": { + "text": "naranja" + }, + "QJhkOh48xapiTObEDQLB9": { + "text": "piano" + }, + "QTkFHWp9KEDgfCjoQjBY2": { + "text": "plurales" + }, + "QUTQLuD2Gv7fHh0V_O5tg": { + "text": "avergonzado" + }, + "QVqSPPgA89whFTJ0HTphK": { + "text": "abrir" + }, + "QZNQOaf0SdHDbx1otCmrH": { + "text": "niño" + }, + "QcGJ9u_JqmrW0X47PXWH4": { + "text": "despeinada" + }, + "QclUM2p3iexSjFZI8OU4-": { + "text": "fiebre" + }, + "QeqA20MCXB-zNfuKIssMY": { + "text": "lata de atún" + }, + "QllvOUe8utZrcBRGw_0vc": { + "text": "curita" + }, + "QnlQ1HOEB9yNjuW3Dd6fc": { + "text": "celebración" + }, + "Qo3Qn_nMe3E6EqNw0UdNZ": { + "text": "soleado" + }, + "QohNih4wgqjnpWt3kSwtd": { + "text": "entrenador" + }, + "QvaMxPy-3iixHAJFyIrN-": { + "text": "sandwich" + }, + "R06chAQYswLtQK46OInW7": { + "text": "leche con galletas" + }, + "R9ECa_HQRtpFrb59ebMTQ": { + "text": "escuela" + }, + "RBCjBvNXQSZOOpg-5lBlK": { + "text": "bueno" + }, + "RZfMOtjw0DoGHWaRfCEc4": { + "text": "pantalón" + }, + "Ra2rxEEohwxRqDsW2AT3C": { + "text": "videojuegos" + }, + "RbZetbSC5064rZccOFD1D": { + "text": "televisión" + }, + "RkpoG4KB8m_TJFJf2v3EG": { + "text": "cambiar de canal" + }, + "RwlZ1jr2Ix3evzrW71lN0": { + "text": "manzana" + }, + "S3um53pcko7_BPHy7R6FL": { + "text": "nosotros" + }, + "SE-71I_ahm3oKROReyJHE": { + "text": "hacer caca" + }, + "SOyGnJXLPeVRoZy3vBgpK": { + "text": "examen" + }, + "SXz8iA1Qn_BlgLTAG6Epl": { + "text": "cena" + }, + "SiOmZdwX8Hf2nE2v6HfCp": { + "text": "zapato" + }, + "Sp2Ias_Y1HplkHWjIb7Mp": { + "text": "sin" + }, + "TAbuXSnSHU6C3CQ4kbKVh": { + "text": "triángulo" + }, + "TBV2BhoZVgl1jMV_jWZYi": { + "text": "derecha" + }, + "TIgoS-YONIwzbrImXetaD": { + "text": "ciruela" + }, + "TIsM6aTTZ9W8j6UhW9Qqj": { + "text": "coro" + }, + "TLxsYdrBdHgFZkNJtVTmK": { + "text": "tortuga" + }, + "TP-gGRcpcFyx1SrNRsdRV": { + "text": "perdón" + }, + "TR5CXN8-pfbWkshdxSBSV": { + "text": "oveja" + }, + "TS9z8ZmMEwn0MGSfr9amH": { + "text": "palta" + }, + "TZF-7m8VKZ7IL6pyv0Daf": { + "text": "cepillarme los dientes" + }, + "T_Q5c4XAfkhkclmnCGHo5": { + "text": "hasta" + }, + "Td5pgVQDTFOftUgOJ-bD-": { + "text": "picante" + }, + "Te_jJfeU8Xwa9St2RihBq": { + "text": "sangre" + }, + "ThqkHs4az5tgLqLcfFPaZ": { + "text": "largo" + }, + "TpPNZLsh5jrN9RdPFwmA7": { + "text": "¡genial!" + }, + "Tpj-Fs8LQ566TM0bYlZ6H": { + "text": "viernes" + }, + "TuAjBKPp3-PSdQuooSWZi": { + "text": "rana" + }, + "TyqVzfOniQNa9WKQRXqr-": { + "text": "hermana" + }, + "U1KQsrvTa2E00-ugc-Iy6": { + "text": "ausente" + }, + "U6PoeH-cMdO3ttnLkN7_3": { + "text": "cabalgar" + }, + "U7GiGcYacowWi4MWrCYyj": { + "text": "antiinflamatorio" + }, + "UQ-5wOfR0tDzljoDjj2xU": { + "text": "otoño" + }, + "UQ5B5K-tpk1XmQC1B9TjQ": { + "text": "no" + }, + "US8_vYTnDfxBw2Ung_J38": { + "text": "partes íntimas" + }, + "UVzdJiqY36fqgBYyz880c": { + "text": "jamón crudo" + }, + "UXJDiwb3j_zyfGa26ByJL": { + "text": "pecho" + }, + "Ubaq6h7wasdP_YRombm2c": { + "text": "azúcar" + }, + "Ugs9V9c2c5iHrVC6p17zr": { + "text": "analgésico" + }, + "Uk1Emn5IovsTfFzpQX5Jw": { + "text": "sosten" + }, + "UkLF5sKtVKW0D8RzVCoue": { + "text": "bombero" + }, + "UnQJwWfWCe40DJYR1Er0o": { + "text": "dolor" + }, + "UssSOEEKutvzB_B4fAQE-": { + "text": "escuchar de nuevo" + }, + "Ust3oadA0PUGViYo28Mf3": { + "text": "caminar" + }, + "UvRS0KmtZn3dq7e8L5RcE": { + "text": "enojado" + }, + "UwvZVcX_CAQFrI6U4LsNT": { + "text": "huevo" + }, + "VJ9AU_y7CqsONR6TvhdLh": { + "text": "¿dónde es?" + }, + "VKrLGgYjc-nLPGsyESDgb": { + "text": "canario" + }, + "VL4pd0vnJ-CNfMg9bCNed": { + "text": "aspirina" + }, + "VUJ-zrdsyL9MOuFbdMCAx": { + "text": "mareo" + }, + "Vioyf8EXJfY5t34NnN0WO": { + "text": "tablet" + }, + "Vjlet5P7XuqTrc22nt_Zz": { + "text": "agua" + }, + "Vmnu5eormo-_TOCgF4YzG": { + "text": "jarabe para la tos" + }, + "VoZumy5GtnRdqSOmXAw7j": { + "text": "preparado" + }, + "VrC7AnovfA7VzmYESVc8L": { + "text": "conversar" + }, + "VwZ4EKSggYWxlnAbp-pNB": { + "text": "enfermo" + }, + "Vzov0z9acB-I1_W_CcFcY": { + "text": "rojo" + }, + "WDUIQV43zghFQq_rSk1Z4": { + "text": "churrasco" + }, + "WL3ZN-W_zgnuTJpuqz0YQ": { + "text": "príncipe" + }, + "WNhpmD_XlTaNEBo7GsFXu": { + "text": "diarrea" + }, + "WQ0CNIQ_gjaCxg4tEIsOo": { + "text": "clavado" + }, + "WRzleD-mI84LaimFH8h6P": { + "text": "escuchar" + }, + "WUt3I-NkdbqlSVcwuLfFx": { + "text": "patines" + }, + "WWK2v56LM-zWqujabk9bM": { + "text": "plástica" + }, + "W_f7h3qOLl2uEd_OYpMfQ": { + "text": "policía" + }, + "WasZ5bKZZy5Jt4Y-JipxS": { + "text": "bikini" + }, + "Wgh5iCzUmx4Je-B85-pra": { + "text": "heladera" + }, + "WjXQhSFPpz42ZUyHvurYG": { + "text": "grillo" + }, + "WtYSntcy2CijEORmROeaj": { + "text": "un cuarto" + }, + "Wu47Qs6Zupu1Ox2gUhkxn": { + "text": "cuarto" + }, + "Wva5W8GA0dHzyt2_0FPdm": { + "text": "hermano" + }, + "X0-Tf-KR24qEkpGDzG2Z-": { + "text": "ayer" + }, + "X3u4pXTWKcGc43lOkgSBt": { + "text": "cumplimiento" + }, + "XA952Z60D0-cesNCVA-OX": { + "text": "chau" + }, + "XC5fIljJ819OYpllYTjpE": { + "text": "jirafa" + }, + "XN0nzhQyHVOhuYuNqrp8g": { + "text": "durazno" + }, + "XOoGN6huCjVHxH8hRFAw1": { + "text": "blanca" + }, + "XY6ZCNzeJIEzLtWJcufJm": { + "text": "camiseta manga larga" + }, + "XYY8SV1IAMHjdGjMZxbdy": { + "text": "cancha" + }, + "XeVaDdUWSEkhfJvTVvUHR": { + "text": "salir" + }, + "XnocVMEeUGCSnlnusP44O": { + "text": "agarrar" + }, + "XuAtFop5_JNSYiZkUBzaU": { + "text": "cocinar" + }, + "Y5HQq_4crSF2lpwH-KUrt": { + "text": "dos" + }, + "YCu-B26PqjE30AhikHdkI": { + "text": "dibujos animados" + }, + "YIP0Xc4aJsfv0s8BpiQnn": { + "text": "cinco" + }, + "YLKXFZ9ze9K9NvJiAx8w0": { + "text": "¿qué?" + }, + "YbrNtdUmyMNdAF5CfvY1A": { + "text": "toalla" + }, + "YbvMRsCtMbww8OQgF45QF": { + "text": "resfrío" + }, + "YeT-jstVSA7-mD9t99Isg": { + "text": "rompecabeza" + }, + "YusWY8GwdO43bSp1o3BWC": { + "text": "molesto" + }, + "Yvxm8RGoFYKUsIXOl33yR": { + "text": "apagar la luz" + }, + "Z5-sBklfLIWE00CJ_T_ZK": { + "text": "cuchara" + }, + "Z8xp3kxXuhMVoNm7ddQSX": { + "text": "lanzar" + }, + "ZA2C4bJaL90lBxsTemYWZ": { + "text": "piscina" + }, + "ZAnmv4CLb7hldYUlp2wJU": { + "text": "ninguno" + }, + "ZBIFtTq-BH1jv5jLbzrhj": { + "text": "repetir" + }, + "ZQEXAf10BkoTvCJx3Ox39": { + "text": "sorpresa" + }, + "ZR-NXJk3SD351W-95cf_T": { + "text": "pintar" + }, + "ZRYQmYRGKzheBqk11eGRZ": { + "text": "ballena" + }, + "Zm4OIanIKTigDGIsInO7o": { + "text": "un supermercado" + }, + "ZnMba2r4XIg9lPi_H2d_Z": { + "text": "sí" + }, + "_1lOt0C0MQhvU8QWC6_oZ": { + "text": "buenas noches" + }, + "_2SjbH-xHZq173EU4J65c": { + "text": "parque" + }, + "_3ihCSMQCokXNo8pXii-h": { + "text": "llamar a alguien" + }, + "_8RIOebHpkr9nCy0_9qhP": { + "text": "llamar" + }, + "_CsJMxqGcNSaujXwRZcpu": { + "text": "ansioso" + }, + "_FNTsoEjTMV3Uas-gggi2": { + "text": "estrés" + }, + "_HUf6SR0mTP7v72Y9_4gw": { + "text": "coche de bomberos" + }, + "_Lc2-NNL69ZX-aVnUNzgx": { + "text": "frutilla" + }, + "_S9Eck14cdOTr0QH4i7sQ": { + "text": "cuarto de baño" + }, + "_WIT6qs1kaiJqB1Ild5Xs": { + "text": "paseo" + }, + "_eug92AvR1UXpYlfm6o_Q": { + "text": "dorado" + }, + "_hqTU9A7I3RFDVrcIEK-L": { + "text": "%null%" + }, + "_lU200bb9Sjv0b_iJKgU2": { + "text": "una bicicletería" + }, + "_tDZtalMxKSNpWydJ1aeW": { + "text": "cero" + }, + "aC_XP9Ch5PqWoCmcJwI77": { + "text": "algodón" + }, + "aMs2YNnWkw4XN0gAm-jI3": { + "text": "cajón" + }, + "aP9QisUdxhgOKIQ2kHNb3": { + "text": "acelga" + }, + "aSzpwNza22HZp46Sh6wfx": { + "text": "súcio" + }, + "aTwzShtP_zR9x6bSGSzEB": { + "text": "muslo de pollo" + }, + "aXLBXkENJqTYkyZOP8TNS": { + "text": "tú" + }, + "aa3xDW6F9YUKyX0fe5uX8": { + "text": "espaldas" + }, + "ajesFjbC7hwCNLKdif-ix": { + "text": "contra" + }, + "ak5fBauJzapC4JIf0lT8N": { + "text": "cerro" + }, + "alsoa_V3wz3vPpG1TKRZc": { + "text": "transportes" + }, + "amk4WRd1sNEIp24pnFw8j": { + "text": "rodilla" + }, + "armmpopt2RLsVDlqLrQ94": { + "text": "restaurante" + }, + "atVEXuftxSiDDj8rzUlFg": { + "text": "crayones" + }, + "atWxG3KTHB5moW1dylLJc": { + "text": "juguete" + }, + "avzcTznCsQCISYJsLC-w_": { + "text": "notas musicales" + }, + "b1XpSC0ndnm0ZewNXC3pp": { + "text": "carnicero" + }, + "b5OdBMMzkf1FlQbUR5-m7": { + "text": "servilletas" + }, + "b9Y5MrR-jn8fh77gAkLZy": { + "text": "pintar" + }, + "bAoK85XLNb7p0ebevYZ6O": { + "text": "mirarme al espejo" + }, + "bDnuS19hfd9GhJ-6rjNPD": { + "text": "estar" + }, + "bFodvUraUhJeq4waMdlxv": { + "text": "domingo" + }, + "bNJfccUvG2DQfR1iZP3eR": { + "text": "serpiente" + }, + "bVN3R44VuZDw3IdQMolca": { + "text": "cambiar" + }, + "beNprvNb0UztxR4JLxDFm": { + "text": "cumpleaños" + }, + "bge6qR6NzsD5Vk4ifPsSO": { + "text": "ketchup" + }, + "bpSuQQRlIcSse40OAxNSG": { + "text": "lunes" + }, + "bqjKW_qBtRzIThWxdZx2s": { + "text": "gafas de sol" + }, + "buyy_2ydocKoi9TnBhZ1N": { + "text": "amiga" + }, + "bw3rqHXD1TJ53xbNggEqH": { + "text": "desayuno" + }, + "c7kK5ROVbO3DHrwSFEawq": { + "text": "dulce" + }, + "cI0JxwhkWU-YA7E7rmJtp": { + "text": "cuello" + }, + "cJMQi3SVmqvWJ00VxI6gy": { + "text": "¿cómo estás?" + }, + "cJw2i319mzBUpEfBRDxc9": { + "text": "pez" + }, + "cJzHrV_PsV-PwwyFN9jka": { + "text": "%null%" + }, + "cS3g4KXf39akVFHCG5AwL": { + "text": "camión de juguete" + }, + "cTiw7_Yjxu_Kg90q7PdYl": { + "text": "gripe" + }, + "cb0rJJEYOeEoRU5fDdQQq": { + "text": "el" + }, + "ccGASDOGtty6GfQMEEBEU": { + "text": "tres" + }, + "cj6OuVw4Nob8jxP-E4rZc": { + "text": "cambiarme la ropa" + }, + "cnyLFMkJu2i3cqOY0e9kl": { + "text": "pasas" + }, + "curstMeuThu2KUph-8rkB": { + "text": "jugar con" + }, + "cxMNBGV3LytDXgwDMCiga": { + "text": "violeta" + }, + "d4zNoj2BAFG9B7J3KAlLE": { + "text": "botones" + }, + "d6s8fLFBiQ3KEJlNdJfUW": { + "text": "un poco loco" + }, + "dHM0qnbmtJAkZY0WBsqaY": { + "text": "lila" + }, + "dLHDzm0rfgL-vXTx14HSm": { + "text": "buscar" + }, + "dNvN5P787hAPE7ZYNgwkw": { + "text": "pasear" + }, + "dR72liRxC3qmoSa6Dz2a2": { + "text": "jarabe" + }, + "dS-KyYREUQIk7sDlmsvoa": { + "text": "cerca" + }, + "d_I8jNfbkQD0CHgZn7hyB": { + "text": "camisa" + }, + "dgm3NCKuz7L39PX8LYxj7": { + "text": "juguetes" + }, + "djgKI9embnk95PAtFcn45": { + "text": "cambiarme el pañal" + }, + "dn41o5K_1fo-qHO-YLoQn": { + "text": "sábado" + }, + "dnXsSOeVG7mq37uciIi2J": { + "text": "recreo" + }, + "e5sCl246xFMESEfFy2PhX": { + "text": "coche" + }, + "e5un1yrIuZHQi048e5kD6": { + "text": "alfajores" + }, + "e8zl_ecIloo4Vk-OZPJWe": { + "text": "jugar con la tablet" + }, + "eDX2HSkGaY2TeVwPjR07S": { + "text": "fácil" + }, + "eGJ8MC1xPE6ueF82jCmVg": { + "text": "cepillar" + }, + "eKJCZc-kD0-m6cVLorFzO": { + "text": "pera" + }, + "eWSI1NInbQowtO99phhGA": { + "text": "boca" + }, + "eZEqRZjRK8JJMsfHo4Y7w": { + "text": "del" + }, + "ebo03xnkyiHD2pKUKULmr": { + "text": "dibujos animados" + }, + "ecUOs24Pp5ZTRt_ZvED5W": { + "text": "acompañar" + }, + "eduqLSyC3m4uB1Oee6dt6": { + "text": "mitad" + }, + "eji-M2j5eHkG71DCksleY": { + "text": "huevo duro" + }, + "emm_RirDsO30Enax5Q4gd": { + "text": "con" + }, + "eo3Q5AjHJz5kp1EbdALwh": { + "text": "ustedes" + }, + "eoYtISVZl3mdwoE_HW-Mv": { + "text": "guitarra" + }, + "et1KiL5-zob_EcGlj7tLN": { + "text": "despues" + }, + "f2dl12fMZbRdQ7STpcTdk": { + "text": "fútbol" + }, + "fF3ijeQzetfSn6EGcs1yY": { + "text": "cerezas" + }, + "fL_4POdbPVL9-lvQVWSqY": { + "text": "avión de juguete" + }, + "fNAlqbgrpirQZO_LhrkXY": { + "text": "primavera" + }, + "fNv4Nb6Vafxk0JxXr-iDo": { + "text": "investigar" + }, + "fUUj_4pKPflmJlxZfk0cX": { + "text": "discoteca" + }, + "ff7ES190q1dmFYZ7lo6x0": { + "text": "pan blanco" + }, + "fjCOcN-PKP6F07IZcI71X": { + "text": "plaza" + }, + "fkNwVm56PSe-qh-QoM0vm": { + "text": "allá" + }, + "fk_z_HrvcUh8XIq8D6gQP": { + "text": "nueces" + }, + "g1Cj6HW8kg8yPE1XX9pxa": { + "text": "desde" + }, + "g1TLUpuQX2Zs1ob9gqYui": { + "text": "gorro" + }, + "g2MhHawoIC9oFNEv5_w63": { + "text": "vida" + }, + "g2sQSxCcoZuKJ3TabK6oT": { + "text": "vino" + }, + "g75y4E53ViakV-s5UfnIF": { + "text": "equipaje" + }, + "gFEnqFhYoXF7QN-n0ONad": { + "text": "montaña" + }, + "gYrIz3R13-BC_pYcvQ9BL": { + "text": "invierno" + }, + "gaem1LHTtfQdnnqYi-sOm": { + "text": "billetera" + }, + "gff2FqDlgXknRld7YMLWl": { + "text": "entero" + }, + "gsU8pE9ozhR73xS2icwJ0": { + "text": "libro" + }, + "gvPwrzDSSEPwcxY878T_c": { + "text": "gato" + }, + "gzCjycNS8Cf0vNlo1klji": { + "text": "molesto" + }, + "gzb-RNDLMNkgk9wnPILJi": { + "text": "abuela" + }, + "hAZhogJSH3bL1iL237N8J": { + "text": "pochoclos" + }, + "hDvpMlPw-chcuxEisBJTl": { + "text": "castañas" + }, + "hKJhXxultsxm0TJl1P8-L": { + "text": "chau" + }, + "hOyjT1JgOYB-mGLFMaNJR": { + "text": "dolor de pecho" + }, + "hT3Lrjn5-q7YIM1loG4MN": { + "text": "parlante" + }, + "hUYfE_vmNBT_7E60YZsSu": { + "text": "pintura" + }, + "hWWOw1gWjWwN7wQJkHrTu": { + "text": "tour" + }, + "hXgGhazQ_nA5uqpRD6Qwq": { + "text": "ganar" + }, + "hmhAUgqvGp7nc1w25sRSx": { + "text": "esperar" + }, + "hwzwfMyJsvB42F_QWQWyi": { + "text": "jugo de uva" + }, + "hyUaYltGVJU-wRrAjhhPa": { + "text": "cantante" + }, + "i0wB--S4sdL8Q4H9b93UY": { + "text": "ácido" + }, + "i2mlV3zGS6nrH2l6N2BlZ": { + "text": "trompeta" + }, + "iAqItRUQL_YpbMn2pgjsA": { + "text": "pizzería" + }, + "ibtmTEP3QGDY8TyVLteuX": { + "text": "blando" + }, + "ifd0M0pAlFm7aPt1A0ze_": { + "text": "amar" + }, + "iiA1u1JKRmhe2jWVE_W79": { + "text": "amigos" + }, + "iimGxVoFWlq_THThR3vmF": { + "text": "noticias" + }, + "ijn-QwQuTxRFFVe-7WlSX": { + "text": "picazón" + }, + "iowxE4MxcV6PR2Uhtvxqs": { + "text": "hospital" + }, + "irbOv2dHA7G969dnJMfJn": { + "text": "cuaderno" + }, + "islCzqFq1SYrZAh63dLhQ": { + "text": "huevo frito" + }, + "j5xZZev5nTNa-p088Oqnp": { + "text": "besar" + }, + "jBqD3qhhcrioLlCU-xq5b": { + "text": "instrumentos musicales" + }, + "jOALQbfxdXmJVyY6P5gZG": { + "text": "damasco" + }, + "jTEb3A5ZEKEy2ojuq2vO_": { + "text": "hueso" + }, + "jeO9YZ22LfSObUNhQDRAz": { + "text": "ventana" + }, + "jfly9fZ3x1da4SGCCNcV2": { + "text": "bufanda" + }, + "jfvreGZv-e8rD4-01wZ5H": { + "text": "venda" + }, + "jhJ2TOfdaRAcVeHGOjwua": { + "text": "leche" + }, + "jmzg4EiC7JEHwe9gNP3C3": { + "text": "arroz" + }, + "jpKPg3hn6_GO1HSkeLNGz": { + "text": "niña" + }, + "jprAsdXWGQKPlUWwgBBot": { + "text": "película" + }, + "jtKc2q2n5an342ZkiMB9R": { + "text": "higiene personal" + }, + "k-iDOTk5uO7ZK5OB3v8It": { + "text": "viejo" + }, + "k41gkf6A_bDtQAJDOrWpP": { + "text": "pasta de dientes" + }, + "k7dZhQtwDPFlOk1iPjEOz": { + "text": "subir volumen" + }, + "k8tJx6PikRcnVuZEqrXRM": { + "text": "viajar" + }, + "k9ZpWM4oRb1q20c0qWCsg": { + "text": "abrigo" + }, + "kDzHKO8eIwNsyKWDw7M0c": { + "text": "uva" + }, + "kIn8SeGURyvu49EsRqDs7": { + "text": "pijama" + }, + "kN85Lb_C4dLnww7sz1afK": { + "text": "café" + }, + "kaiWPbXxjHXlqcpBaBp4l": { + "text": "viajar" + }, + "khUUL_1JQGngApqBRDh_q": { + "text": "arreglado" + }, + "kpghvJtujlt4vPI2N6vsg": { + "text": "o" + }, + "kxuGlfYjS6puO2xD1QvxO": { + "text": "vamos" + }, + "lKA4b7I3iFkqNzPcAXyBc": { + "text": "cocinero" + }, + "lKMW_xTZzCrCHRcGp-Z-n": { + "text": "galleta" + }, + "lR84gCk8OM-oYoLAV7tar": { + "text": "timbre" + }, + "lXH68vGIuZdfA8xVrS8iw": { + "text": "mucho" + }, + "l_ncJLRdVGBzzQc9yqBqs": { + "text": "banana" + }, + "lrUuPKco_O8FXDuclzpKE": { + "text": "necesitar" + }, + "m0434KkjeTv8SGN7WxR2C": { + "text": "negro" + }, + "m0Fkio76HZHS2HguPOTn5": { + "text": "seis" + }, + "m17b6MazSk6M4gb51_cCy": { + "text": "pulmones" + }, + "m39xTdgaenoi4mWGEa-Ew": { + "text": "plato" + }, + "m3qTT8tiGZQheKIWREzMT": { + "text": "ir a" + }, + "mC9Nb7zVdEUpjEBODw_gL": { + "text": "vos" + }, + "mFfylZ8yoLvtkVSDTlVEN": { + "text": "pomada" + }, + "mJqzbxYeIDQciPkeHA1Ao": { + "text": "cuchillo" + }, + "mK4AXXhoIVirBz5dr_xLA": { + "text": "pavo" + }, + "mRK--C5Q1aGe8MMPJJLYi": { + "text": "preocupado" + }, + "mTklFAI-FVVLsMKoASZ7T": { + "text": "desconocido" + }, + "mWXxPPvhSHf9hyb-VyuZH": { + "text": "e" + }, + "mZFwH8xY_OeVDWCdvPZBy": { + "text": "pie" + }, + "miPmA2tOQiLxOW7D_V_x6": { + "text": "cubos" + }, + "ms97ZsgQOvD-Z8qpSW4oN": { + "text": "¿quiénes?" + }, + "mx6dmRLXA_lkN1QlP71vq": { + "text": "todas" + }, + "n5bZClAB6jXAZnwxIwH-1": { + "text": "tostada" + }, + "nK7DRpxalLBHL9OnRjSim": { + "text": "frambuesa" + }, + "nMQUtS-kFHViOKyop1FdS": { + "text": "vincha" + }, + "nQSk6_KCEVdO7oC_uxLXN": { + "text": "oreja" + }, + "nQdbkRVcwpQB_hFNPbe6M": { + "text": "caballo" + }, + "nUg2M7p5sUPlGdbBev2-G": { + "text": "tobillos" + }, + "nm6e_s01gWHzdVj25BHyq": { + "text": "¡qué lindo!" + }, + "nnTJQMJWfd2nuTSlFNEOy": { + "text": "mío" + }, + "ntzBlFkDMTKEUHoGNc65u": { + "text": "baño" + }, + "o0oxaoUFpOLiGsoQBlalI": { + "text": "torta" + }, + "oAxNCJufVUqZMyWRGdZl9": { + "text": "tuyo" + }, + "oEHzYcfxDGGcsL-deud1j": { + "text": "snack" + }, + "oEyUWrQj1iYUnlEUdQQ5Z": { + "text": "flauta" + }, + "oO21zLMEtHEakvnuTohLu": { + "text": "¡qué divertido!" + }, + "oOkD8Wmvb4t9I2EWqT1Nr": { + "text": "amargo" + }, + "oSBFO8Ka0PN4bgX0QuWxL": { + "text": "viajar en auto" + }, + "oYwoiRDWlIjSTbYdC2vG6": { + "text": "falda" + }, + "oa-MShota2L8n2pU8hIsm": { + "text": "jugar" + }, + "okr5oAG2U8Er1XwQ8XbWD": { + "text": "grande" + }, + "oqQWeoWBr5N0LrPGY62Og": { + "text": "senos" + }, + "otTWzTaTAmweNCozT8tn9": { + "text": "alergia" + }, + "p1qK47wwLwF8S0Fy8-2Mt": { + "text": "mano" + }, + "pHBnmCFpM7oZf0O78CBIz": { + "text": "golosina" + }, + "pM-bC77hbj-w44A0HFRDZ": { + "text": "sonarme la nariz" + }, + "p_XyUXRmeUk_bdjRTMtkz": { + "text": "revistas" + }, + "p_qpVEd677b2Bk56yhvj6": { + "text": "jardín" + }, + "paPpjw1XVC9-6xcueJsrY": { + "text": "todos" + }, + "pgPlWKk-oww2fua5zYuue": { + "text": "mono" + }, + "phZ4F4uzi1TrhjeDMuMsn": { + "text": "almohada" + }, + "pkuppr1jMH7SMpa2hrIWQ": { + "text": "jugo de durazno" + }, + "pliNY9oMQh1iSidkEhhDO": { + "text": "abrazar" + }, + "pptyFMhLrbC6lN6zmc7D0": { + "text": "comedor" + }, + "ptQZXjMQyXWycUD1kAkQo": { + "text": "cuento" + }, + "pv8eYkxczIevQqEGwDz6V": { + "text": "mochila" + }, + "pvXSy-5M4i8kysUppvdME": { + "text": "que" + }, + "pwltOTDn2OyABTlD4-27W": { + "text": "verduras" + }, + "px0jKQDj7r9pOYs4ZrvcT": { + "text": "tomate" + }, + "q22wRFF21EigV8YzQ_MfV": { + "text": "¿me ayudas?" + }, + "q6F-qJ7mTxvwa43F6vwun": { + "text": "escondidas" + }, + "q7Pz4UqqZUlXeFfXrwXDR": { + "text": "enjuagar" + }, + "qA4v2JWQU0zzBBZgvW7Vt": { + "text": "temblores" + }, + "qOsbXyvBTMDAwvvnI0iFn": { + "text": "pequeño" + }, + "qU5IvFLD8d16iIHSs_9TM": { + "text": "cebolla" + }, + "qWhpDTMd8eAEoq7yTKc57": { + "text": "calzón" + }, + "qYA2U_BFOZtFLClxuCIBJ": { + "text": "dolor de muelas" + }, + "qeJdrxKIIcUctIjo8wWhc": { + "text": "aguda" + }, + "qn-7ERrcZxJTqfW6hwNs8": { + "text": "correr" + }, + "qsA1zm1DOlItK7DCWzAw8": { + "text": "aburrido" + }, + "qscoBbrWu7tQbpNj9XUPt": { + "text": "papel higiénica" + }, + "quE_RA9abVvtG-Fo4Jx8f": { + "text": "diez" + }, + "qy3c7gvRU7shWuJYr1kBk": { + "text": "bebida" + }, + "r7eJgCF_b_ktkztv4-oda": { + "text": "medias" + }, + "r808IO3I6j3os_uix6O63": { + "text": "juegos de salón" + }, + "r9qUBQwgY8eycnU2OVey0": { + "text": "comer un sándwich" + }, + "rBwDn3PcJGqytqnOZTJMV": { + "text": "taxi" + }, + "rMFGfzFobfGsH3_qrLHXU": { + "text": "pescado" + }, + "rU9cpWF0I4wnJjzTXpGtO": { + "text": "hoy mismo" + }, + "rgyV6CvFe98OGnWut6QCZ": { + "text": "turista" + }, + "rlGO5jGKPL1vW-VF4nRqZ": { + "text": "entrada" + }, + "rnjJyPTabH_Xpmy4Z4O3U": { + "text": "celebrar" + }, + "rtHwq5WN9KElX3V3SKBmS": { + "text": "papas fritas" + }, + "rwyX2YemNEx_Mh64IArDQ": { + "text": "oscuro" + }, + "rxdfuk6egO7VmZEB3JrUN": { + "text": "la" + }, + "ry_jOegpMf4nB3spGf4d2": { + "text": "me gusta" + }, + "s0BXoyn7AqUAlZ9BOHY6S": { + "text": "tríste" + }, + "sAsTkky29uEVC9vo3Ofbo": { + "text": "brazo" + }, + "sDKIldL3tit328Joneo_7": { + "text": "vaso" + }, + "sFNUgvnglgrm6cbYiM0di": { + "text": "¿cuándo?" + }, + "sP6uvKmY5kA_yuYR8H21c": { + "text": "halloween" + }, + "sPtazVgymXESdS-BcHqU_": { + "text": "pollería" + }, + "sSTGRl6DpYGZXp8vtTNbm": { + "text": "comprar" + }, + "sbv5HLPUR6gHo-EJR2S7S": { + "text": "camello" + }, + "sc0hr3jQ80yXRFDlAn56V": { + "text": "cansancio" + }, + "sixdpB8hTOhlUr4loz3RB": { + "text": "muñeca" + }, + "sjGytpiPjwqJfPaRUJ-Iw": { + "text": "miércoles" + }, + "sysOciGqtL7y4ULuyYVc-": { + "text": "canal de cocina" + }, + "t-w8e69GwxLyfxlWwHk9f": { + "text": "mermelada" + }, + "t34TbvjJ3zG2jcgJaCeHa": { + "text": "tocar" + }, + "tGyUfSljuc7A5Do5B9GuN": { + "text": "sweater" + }, + "tQwMPLvqAMAstcqvnOERE": { + "text": "gris" + }, + "tWxC4hR6di5zQC-Hujlev": { + "text": "bajar volumen" + }, + "tYwEpd2EOtH8wEUr-jwHk": { + "text": "caro" + }, + "tw1doIY-jFPofZjlPFj4z": { + "text": "¿cómo te llamas?" + }, + "txj22hip0CE9qp_z-daIK": { + "text": "nebulizador" + }, + "u1nIt_oFH426g1IVhlYk5": { + "text": "sediento" + }, + "u2e4Zh8qwJF7zKkohQ8df": { + "text": "goma de borrar" + }, + "u3BufiTZTK6AylGh80ZFd": { + "text": "ella" + }, + "u8HfFvMPkogdWk-URj9hv": { + "text": "escribir" + }, + "uDg7Yy86PlwsAd-U96vJR": { + "text": "arriba" + }, + "uFoytOG4qsXzBk979t63y": { + "text": "limpio" + }, + "uMhOF9ZvWnjW-Zrjbjfhs": { + "text": "bajar" + }, + "uOA82KFAVtjoYRTuYFgpr": { + "text": "postre" + }, + "uPL5NMeXTmD1iU6ZoiROu": { + "text": "pájaro" + }, + "uYElWOlSOSoQap-d5gsYF": { + "text": "chocolate" + }, + "uZRwbLa1lEG7ol0UJKRBj": { + "text": "viejo" + }, + "ubP5GM7_0vPkRc6zbD9Ez": { + "text": "antiácido" + }, + "uiVc5R86QCZkhraEFlrNz": { + "text": "museo" + }, + "ujyHgmlPIs7UdtndbYd8S": { + "text": "amistad" + }, + "upWXctTSKBtFNSXnXDK_u": { + "text": "frutas" + }, + "uzSwgQNnV8ZrjxpN5Bz_a": { + "text": "difícil" + }, + "v-E2GE1DpCkNAxsfA0f4M": { + "text": "goma" + }, + "vHzfvEgIkQ0e73ryfWP2F": { + "text": "ordenar" + }, + "vKGLQIas9RdBnPGsaYtr2": { + "text": "cometa" + }, + "vOgqHjpHgrUGERIHtVqDe": { + "text": "basurero" + }, + "vPicdKLrhT2wmAAPPukKP": { + "text": "veloz" + }, + "vPnmrsRou1ihosdVXS_Op": { + "text": "zapatitos" + }, + "vZ9JaTnoj8C0ILYxMNB73": { + "text": "calabaza" + }, + "vaYJPAsTRvslo2qFOJt60": { + "text": "lomo" + }, + "vazatQ7CrYJFsorVDC5AC": { + "text": "león" + }, + "viAHJeLRr_6j9dEi5klj_": { + "text": "amarillo" + }, + "vlh1Pa6eA0ZrBs3vHzWH7": { + "text": "oso" + }, + "vmb_RMIB20QND6VcS0deY": { + "text": "panza" + }, + "vq3T-UQGTjX3Z9TlEF12e": { + "text": "mayonesa" + }, + "vy-O5Zc5kxY8d-7RROvQI": { + "text": "jamón" + }, + "w4cVxbBDZjeNyHwpBARHQ": { + "text": "hombro" + }, + "wBLnDZStKj8YLkg2pTCfh": { + "text": "sentir" + }, + "wCGb6D4xSVr4UeKXzGIlP": { + "text": "disfraces" + }, + "wcpXeLMBRusfqfrz9s4mF": { + "text": "puré" + }, + "whHwNRVnqeM7BMx6nppiW": { + "text": "tigre" + }, + "wkrNPLGWTqMIy4PJRW9QR": { + "text": "en" + }, + "wnfSUkF8-tQiRTVou1_pd": { + "text": "frío" + }, + "x3PNiU1NIeQ3zQa31C8WX": { + "text": "pañal" + }, + "xGsyYCjDzQugVzSaK8CuA": { + "text": "duro" + }, + "xIgPo3N-aKXhVcjultMiY": { + "text": "factura" + }, + "xPUYlxRxgFVn1FHQFz6Ic": { + "text": "secar" + }, + "xQblStUfyBGO27j15Sda3": { + "text": "pato" + }, + "xT4BPNmF-5WAQLfs3cUpS": { + "text": "enamorado" + }, + "xXtjQktuAq1bmxTc0HSQT": { + "text": "gaseosa" + }, + "xbPnUL4qxvm30VFYNphh-": { + "text": "tíos" + }, + "xiaTdHGInqfm4rD6XzSeZ": { + "text": "encender" + }, + "xnPF8fvkC1TvgETI1JcC9": { + "text": "órganos" + }, + "xqGzZJIHBeVfSzRfm3rmg": { + "text": "uno" + }, + "xxr0MRGYRmmoNC_gsD9uy": { + "text": "pasaporte" + }, + "y0SViQxW8Y-yiX1Z7gXWt": { + "text": "superhéroe" + }, + "y5W21CKOkLWnYJo1OC700": { + "text": "tos" + }, + "yJoivIPHOm1Y1lj-hGN1J": { + "text": "dormir" + }, + "yNag8CK0wV_iRMnFznsXk": { + "text": "pelota" + }, + "yR9FTtOimFwZG5g5tgpRk": { + "text": "visita" + }, + "y_5OURnKxFcv4UiMKntUi": { + "text": "y" + }, + "yihsjW9ON0Fr9Yy4ZlP9c": { + "text": "axila" + }, + "yk2wDVqHEKKwupgm87OJ2": { + "text": "nalgas" + }, + "yo00Ci8bSRFYPU6HxGVwX": { + "text": "cantar" + }, + "yqlmoVGItXqaeazw3M3eg": { + "text": "sillón" + }, + "yvtvSsBLhabkcpeYGbxQr": { + "text": "bota" + }, + "yxa6QVSrmWUKH2PZHKaVl": { + "text": "lechuga" + }, + "zANp2EnhT6n0Jcl1Xra6K": { + "text": "bailarín" + }, + "zAmesi1FcIWLXE3WVa9WS": { + "text": "antihistamínico" + }, + "zRTTg5x_P1E8Z3CU-oWXa": { + "text": "cualquiera" + }, + "zcibOHpRbSmz1hVNSjPTj": { + "text": "tenedor" + }, + "zdFC3vpgjcyUWB9a4ghRW": { + "text": "descripción" + }, + "zi_wcT10fxgn72ZJhVx18": { + "text": "vestido" + }, + "zm_6R89hr4wjuVkifiYrk": { + "text": "despeinado" + }, + "zrR1DbO_szgKvxLyrZquw": { + "text": "calefacción" + }, + "zw-o9pDectP5bxFnUjrJO": { + "text": "chancho" + }, + "zxhRDSHXtV63Sp3c2fjrI": { + "text": "aduana" + }, + "-k6dUC6thWPyULq8MVSe6": { + "text": "PRONOMBRES" + }, + "0geft4arn_A8kL-rfUPYc": { + "text": "PERSONAS" + }, + "1aM3sTxyb8yLSWtkn2MoO": { + "text": "INSTRUMENTOS MUSICALES" + }, + "384rVetrrLX4x4pJ0Y0Na": { + "text": "INTERACCIONES SOCIALES" + }, + "4e6iVOPLAjnM6wCMUm5P4": { + "text": "DESAYUNO Y MERIENDA" + }, + "6vmRBH4shBk3UQEUM6APX": { + "text": "CINE Y PELÍCULAS" + }, + "7Jm3bDhPInSlwhdy20dKF": { + "text": "CLASE DE ARTE" + }, + "7ngCuvmAnM_7ygpFQgLpk": { + "text": "COLORES" + }, + "7w5ACMFdOCTkBrS911MA1": { + "text": "ADJETIVOS Y ADVERBIOS" + }, + "8FPdnkMzOIBVTW5-TQxWX": { + "text": "PERSONAJES" + }, + "8t8CAggTj3HuznkKhfXle": { + "text": "LIBRO DEL RESTAURANTE" + }, + "9JRv4X68pAtwsFT3Ss0iJ": { + "text": "LIBRO DE NATACIÓN" + }, + "ByBvBUS7dcXldjzZOVFFP": { + "text": "CUERPO" + }, + "C7ClEHF5-Mcico4FvRxEV": { + "text": "PREPOSICIONES" + }, + "GD9YHeLktSsdZQvcoua6x": { + "text": "LIBRO DE LA CARNICERÍA" + }, + "HzPl-HvsrXL_QkGT38Ohd": { + "text": "LIBRO DE VERDULERÍA" + }, + "JKEk5TYykBK6ZeYND3Ron": { + "text": "CONJUNCIONES" + }, + "LWyfHr8Oui5HIShtZ_huo": { + "text": "FRUTAS" + }, + "PYTnUqCLwAbngR2Ozroc2": { + "text": "ACCIONES" + }, + "QQszyYRLL-otCQtRfbLzm": { + "text": "TIEMPO" + }, + "V6K3TniptOApMMGa8TspR": { + "text": "TODO" + }, + "VhfGFlHDcPor996rCzoK9": { + "text": "CELEBRACIONES" + }, + "WZYuZd331Hm5gHXJtUmBN": { + "text": "ANIMALES" + }, + "ZgZoyOg5K-LscXdfl6kQG": { + "text": "CLASE DE MÚSICA" + }, + "_Cw7FcJSYiterkLSDJH8V": { + "text": "CASA" + }, + "ah257x5jssDmLIOrcSGn6": { + "text": "NÚMEROS" + }, + "berI6X2_pAVCNOrcHAL6y": { + "text": "SENTIMIENTOS" + }, + "ce2z_EeEG2nH0ZS4KVAkA": { + "text": "COLEGIO" + }, + "dQXaeM3Uul1yEvRwJ4w9t": { + "text": "VESTIMENTA" + }, + "ejXQZAiYjrcSFGXb1pz7M": { + "text": "TRANSPORTE" + }, + "gybgILOLxmIVfeQtb1f94": { + "text": "LIBRO DE HIGIENE" + }, + "iHS1HpUBBadzgmbum_bdD": { + "text": "PROFESIONES Y OFICIOS" + }, + "jatDsecioVAxRph-WOg4f": { + "text": "LIBRO DE LA FARMACIA" + }, + "puOOrKWbYzH0B_8uGkxYX": { + "text": "LIBRO DE VIAJE" + }, + "puda9fUGjqvm9oSM6CpTk": { + "text": "ALIMENTOS" + }, + "rH7zhJzNVIcEIRyvaYLoi": { + "text": "DEPORTES" + }, + "uv4tWMRHfewaEQ_pH0dnV": { + "text": "LIBRO DE LA SALUD" + }, + "wAhDHMrZ850dHTwgAXrMY": { + "text": "CONCEPTOS" + }, + "xjfPlDs-AcFV9LCyY-v9j": { + "text": "JUEGOS Y JUGUETES" + }, + "y545pM8pvB3WgukIac6NT": { + "text": "LUGARES" + }, + "zwf7qmSEi7PBwsNaqciA-": { + "text": "libro de la biblioteca" + } +} \ No newline at end of file diff --git a/assets/languages/es_ES.json b/assets/languages/es_ES.json new file mode 100644 index 00000000..9ee69822 --- /dev/null +++ b/assets/languages/es_ES.json @@ -0,0 +1,2504 @@ +{ + "-2UbAou9ydr8XeN-jtIz4": { + "text": "limpiar" + }, + "-GL2iAgykP10Ae3AKsVOX": { + "text": "sal" + }, + "-LE2iv3Pwr5KuIyM5bYb3": { + "text": "bien" + }, + "-LwAKwgCdVkzwM579zRMo": { + "text": "más" + }, + "-aePI8WknXpxEpz19Lu48": { + "text": "suyos" + }, + "-msU3yor4qJYQHJtWrdk8": { + "text": "pastas" + }, + "00AkNJ4YLpbRD_mLmQjtp": { + "text": "almuerzo" + }, + "0IrLGI8Ebm8rcS3ymUXqS": { + "text": "hambre" + }, + "0THELgiQ7rvA-orESXJfV": { + "text": "avión" + }, + "0Vkmy6BZcJn3pFurEevL9": { + "text": "estudiar" + }, + "0Z7uFXpp-XRXmqM8ILhIC": { + "text": "poco" + }, + "0_SK41wNOk6mw2qX_eHXM": { + "text": "cine" + }, + "0cdYDZ5HPaTmqTTN0_Ee8": { + "text": "suerte" + }, + "0fHziRVxg0oNDp5pyiI8M": { + "text": "permiso" + }, + "0fcYcD_r0jNWXTTAx8Ph7": { + "text": "aeropuerto" + }, + "0gAyTD6sImo0jpD_bYGVv": { + "text": "jueves" + }, + "0huLn-H32Cbwba28IZ3tc": { + "text": "burbujas" + }, + "0jpMJu8isUmOZKxhZ_yaj": { + "text": "equipo" + }, + "0pFtmDZdlnLrUkT_XZDXQ": { + "text": "antes" + }, + "0qoQs8WyLVONnu3_eBGfD": { + "text": "dolor de cabeza" + }, + "0v5fqIp8GmXsIHO0SPhtt": { + "text": "dale" + }, + "0vttFf3nAGDW6g5wVStcH": { + "text": "disculpa" + }, + "1-VwcvzNfvrwDWRGxRPre": { + "text": "ni" + }, + "10X4OKR5xmNhSj86sbyE_": { + "text": "salchichas" + }, + "14aCIW665UZtuwNsKKV5s": { + "text": "cartuchera" + }, + "17AkRFlfC_koV-lywmDE8": { + "text": "pantalones cortos" + }, + "1B1WmC-V0PglDeRAeINcT": { + "text": "mirar" + }, + "1DjW-XvWN7iOqoJPRSWwY": { + "text": "mal" + }, + "1IjenNwPwsMIWZ4aYBk8S": { + "text": "partido" + }, + "1Ph13Z_Ya6p-q0WA7pSl3": { + "text": "pájaro" + }, + "1QEfLU_S7TM0iMr9VZVtP": { + "text": "ronda" + }, + "1Rv9-SSJjHptwvzqLbdbx": { + "text": "divertido" + }, + "1WJZO-pUkTaQvyxz41iB-": { + "text": "picado" + }, + "1YOlJCovdcnnqVihqHVmq": { + "text": "acá" + }, + "1b71P9YjaNWnX8AWjstqG": { + "text": "remera" + }, + "1mS8kgJIod1cyUFH-msnM": { + "text": "estación" + }, + "1mU2ZosZXSJrxkh1NmxJT": { + "text": "izquierda" + }, + "1nhsReHG-f-bW-xaZBsxY": { + "text": "abajo" + }, + "1pb6S-RR_3zdCq77YFiZ-": { + "text": "¡qué mal!" + }, + "1zU7kolOKsHP9-oomQW1Q": { + "text": "rey" + }, + "27GbVOZ-szdnzsy92oY-X": { + "text": "manteca" + }, + "2CgcUkvJUskv982FvG54A": { + "text": "plata" + }, + "2HkB0WZYP7cvWLD39GMQj": { + "text": "bañar" + }, + "2KO0BFtB4B6fu1feuAZLt": { + "text": "verbos" + }, + "2RZTRMX56BFLrW7tLJ3Hy": { + "text": "mismo" + }, + "2Vc2H462cutVtUC-5omJk": { + "text": "pocos" + }, + "2dwtZO2wCm520GPD1i6dl": { + "text": "dolor de garganta" + }, + "2t_eq1JmgHa0R3eu8LMmI": { + "text": "ventilador" + }, + "2u2-AFuI245I7bZ6tsSPh": { + "text": "¿quién?" + }, + "2y9pxVOBQ2tMdPHcsqQb8": { + "text": "martes" + }, + "3-ueUrnwmIIj0BMP8_Ntb": { + "text": "uña" + }, + "32PnZjlnQbTJo4nL9YJYe": { + "text": "feliz" + }, + "3932Zm0xgk1hKB2hhBAUa": { + "text": "colectivo" + }, + "3KbwCHGooNLySWOBlFFuG": { + "text": "cocinita" + }, + "3KgKNNnuYMrysEDs3Pu4Z": { + "text": "subtítulo" + }, + "3VEnVjaGFCImBAZ3wEChu": { + "text": "ropa" + }, + "3arbCGI6fMOWALLanZcg3": { + "text": "capuchino" + }, + "3dtvYLjbl5oDyhZO9eFRY": { + "text": "ellos" + }, + "3mwcdenOurU_e59ChLqb0": { + "text": "fuera" + }, + "3w62N9b7Cvb6JMjB9Wphi": { + "text": "beber" + }, + "40q0NJ6vsziJDNFBqho7Y": { + "text": "dentro" + }, + "4A_FNkGH1EDu0oabPurrL": { + "text": "cereales" + }, + "4J1bWl6BbbEdZsRGsgYH2": { + "text": "queso" + }, + "4X7OXm35OSHoSlPxGUi_f": { + "text": "mueble" + }, + "4bHGIoQmDN8LptpdNN4v6": { + "text": "vacaciones" + }, + "4f1vqDoAvUu2XYk_JlQdC": { + "text": "siete" + }, + "4rctwNiN4UaU9lqU48MHG": { + "text": "computadora" + }, + "4rzonBodQXfs77gALnAP_": { + "text": "cerveza" + }, + "50wJdR0-3YLnv9y_2Gx_e": { + "text": "saltar" + }, + "54BVjn2seJWdBNGI20-yJ": { + "text": "computadora" + }, + "54taab8z9ziXt0IqXHkV9": { + "text": "dedos" + }, + "5L5UzBHOzuHRoO-jyPuEx": { + "text": "ciudad" + }, + "5LYjhk-N87Ov9NrQcGbLQ": { + "text": "aceite" + }, + "5Tdy0Gu9SiLsPfWwd-Y2E": { + "text": "lindo" + }, + "5VBtwEswIjrv1zbXP-oFn": { + "text": "sopa" + }, + "5W5_sCAyGTkVzguCEg1d1": { + "text": "jugo" + }, + "5dvq344JstkxUpHszaPfp": { + "text": "delfín" + }, + "5gPT9lrNgpRkF07lP6zOq": { + "text": "jugo de manzana" + }, + "5i3kSsCKF7Oa9iJQvXiTe": { + "text": "más o menos" + }, + "5kjlzqb9Rf3zzqZROaZ9p": { + "text": "perder" + }, + "5mGrGHzdw_vCwYCRNPcPw": { + "text": "pasear" + }, + "5vxTXbPl4Y0yezGu7p1f6": { + "text": "hacer" + }, + "6KicPX6y_u2i6tPBZAtvA": { + "text": "lavar" + }, + "6jLkKc9OL5btNOmjJem6S": { + "text": "poner" + }, + "6lYN4qSZx3_tKDClp4Iyr": { + "text": "entre" + }, + "6nhNeVjDfDi-GmreaqfVo": { + "text": "nublado" + }, + "6rcOXG6yxpzHLzMJ9IayI": { + "text": "cerrar" + }, + "6t2sPdapSNJrOziDozTWW": { + "text": "vaca" + }, + "71l2at-8480bvijxn3uBl": { + "text": "durante" + }, + "75gujwNXJdAiNmK6Ffhia": { + "text": "jugo" + }, + "79xBF6cKgKeD4GeBPe_Ds": { + "text": "bolsa" + }, + "7EsVGfapPc_38mHCBy3C3": { + "text": "enamorado" + }, + "7Hz61-WzV62FHsedOwz6q": { + "text": "flan" + }, + "7Q4Zc0cenSF5U4eKyje1f": { + "text": "hacia" + }, + "7Q9sNljseWjwSPW4in1ga": { + "text": "recepción" + }, + "7VL_MgnLDY6hi8sbvcGIg": { + "text": "silencio" + }, + "7WxUVoVQfQOzARU2bf6HP": { + "text": "casa" + }, + "7iAXKVm22uMgr6aqZ1rr7": { + "text": "abuelo" + }, + "8-4M30dTtmuUJus9MtGqV": { + "text": "moco" + }, + "81UJI7xOa5l9mVceqkIP5": { + "text": "tener frío" + }, + "82LicIQc3K2xCTEt-iMpu": { + "text": "caracol" + }, + "86gNdF6aTepa0Y9zkD1VQ": { + "text": "campo" + }, + "8FFwIw7rJri79BITZBUzm": { + "text": "hotel" + }, + "8KlFB3an1mzdQd6-LGCCE": { + "text": "merienda" + }, + "8LddDqylw-51wHhx9_Qad": { + "text": "libro" + }, + "8MV4ZFthtUeoxLAIbqGTc": { + "text": "carne" + }, + "8cOIYr-hcK54qWpuT-41e": { + "text": "cuento" + }, + "8fGingRAd8idw4qcxyZ-Q": { + "text": "vergüenza" + }, + "8iFdjRTQU7ONGnigRTlm8": { + "text": "¿cuánto sale?" + }, + "8vR0HYniXtrrQqqSIN_JQ": { + "text": "familia" + }, + "904w9Je6oDwGXUCIcrUZX": { + "text": "lengua" + }, + "93YmZA7VfAT7TTNTsDE1W": { + "text": "serie" + }, + "93hsW10TmX3Vcq_4IvcZ0": { + "text": "blanco" + }, + "93tHieC_CgZqN998y5gAv": { + "text": "chuleta" + }, + "97nIv-aoc51T8kKTZV5cM": { + "text": "saliva" + }, + "9EqfwMNtATh1fwMhyn_B1": { + "text": "buena" + }, + "9FiWvg197C-Riid-DVysN": { + "text": "claro" + }, + "9GqE148SFZqMIft4evAk2": { + "text": "comer" + }, + "9MzeUcz1nRqleTkmS_-g2": { + "text": "barco" + }, + "9QyJdpUn0f6g7FxWs5qpO": { + "text": "cortar" + }, + "9U8MzceIsqKhG86oNx9zV": { + "text": "coche" + }, + "9UwpyOnOBoqr4mX3Juqm2": { + "text": "buenas tardes" + }, + "9ZnzbKMDwGEwC3hXOhXFe": { + "text": "pastillas" + }, + "9dvSIpeXa2_12Jip6noJP": { + "text": "deportista" + }, + "9kgRI3KlOIVSuylKffW9g": { + "text": "colores" + }, + "9lS0mNuKIS0olyDwoIJBR": { + "text": "médico" + }, + "9mLx-YMK81AflitELQFqk": { + "text": "papel" + }, + "9s5zV3_oGyDx_NEvsKCxX": { + "text": "violín" + }, + "9wE9Py6ztyqDrtaypsltA": { + "text": "naranja" + }, + "AOp6VGyjYIV0Ym9d0basJ": { + "text": "dibujar" + }, + "APXF-lEplPOloppSeIjAY": { + "text": "menos" + }, + "AQKGKdoX5CYycZ2YqBZVW": { + "text": "barato" + }, + "AT_rDWsr6xRBgrvgw9Zih": { + "text": "nueve" + }, + "AWJXh6URGN0Vwm66i6IvL": { + "text": "hola" + }, + "AeFbJQ0M9uTObAlKEX3zr": { + "text": "pierna" + }, + "Akf0xlH8UJdXn8BJzPV2A": { + "text": "radio" + }, + "B1845IfYfPMz2FWpVFIQv": { + "text": "de" + }, + "BKmATW2uBk4pxnmOaARyq": { + "text": "documentos" + }, + "BNjZz9MGLJEKZ4CZoTs2M": { + "text": "ajedrez" + }, + "BQhqx1PuF94jwT0ySTlbJ": { + "text": "comida" + }, + "BQm-YCPc0lfD1-mhecCTL": { + "text": "yo" + }, + "Bebnh8-UWwtYLnK6p3fKi": { + "text": "pan negro" + }, + "BjqWZnzLlxdOo4KEzZ46j": { + "text": "ocho" + }, + "BqS7d4PMhGRqPYlZQzUbR": { + "text": "puerta" + }, + "Bub9ZYygLcly15D7_wYks": { + "text": "amigo" + }, + "ByrvXHEN9Mb8D--7MQAjM": { + "text": "peluche" + }, + "C12mJ1W11fODI3pv1QOnx": { + "text": "gelatina" + }, + "C29KJ8BTFavhj_R9UfnSv": { + "text": "por" + }, + "C2bgADoxmINRnAiYxZHqd": { + "text": "taxista" + }, + "CBTemIvgIN1UAtftkc3sz": { + "text": "pegar" + }, + "CCWCtXdMuQBJRmaFOAlfQ": { + "text": "navidad" + }, + "CY-IQvUehkaiGFCdKf9bf": { + "text": "chorizo" + }, + "CYH_6DL9q1iLLetuWeR9A": { + "text": "tener" + }, + "CZrETqLgQlvDkLHvw1t_w": { + "text": "a" + }, + "C_JKGNCxOI5x_f2C4qAyZ": { + "text": "maní" + }, + "CbO32RkDdf9aCucv6BnGS": { + "text": "cabra" + }, + "ChBc7LjL8dgzZ6LUCAHGh": { + "text": "por favor" + }, + "CkTiaqBY3jf86JRq636lt": { + "text": "¿cuál?" + }, + "CsKZSNiJw5Q48b26Kskf-": { + "text": "heroe" + }, + "CxFmyJYmy6gMRqP9U0cBP": { + "text": "estoy perdido" + }, + "CyKtU9yC0Jy7Ypb4WFp6w": { + "text": "perro" + }, + "D1gCni2jXpCvKZe4qCtQN": { + "text": "peces" + }, + "D2tSkngqbQmdKLNhn9xWV": { + "text": "globos" + }, + "D7dt_hFX5DScV_ssm1nKz": { + "text": "pomelo" + }, + "D85FU-Wqr2u53tfTXAtHo": { + "text": "patalear" + }, + "DAq2J_xXHsSCSNPp9qVsk": { + "text": "oler" + }, + "DBd09yUlbkaYLsemjFXEs": { + "text": "helado" + }, + "DG1RiDjDfwWRhpAiIpPqA": { + "text": "vómito" + }, + "DSgrhLHauub-gBqMGwacO": { + "text": "asustado" + }, + "DXb0FpjVM9q8LVl9vvSHn": { + "text": "clases" + }, + "DXpjgLKTdx9eLLohVdmWM": { + "text": "verdulería" + }, + "D_4Weq7iyi7GMEsgP0xy6": { + "text": "té" + }, + "Djs1QsLNf8Q5LBIFV5zNC": { + "text": "partituras" + }, + "DkeHJFtqAS005fYUrl1Xz": { + "text": "pantalon" + }, + "Dm3yiKSB134LrjtW_KrO7": { + "text": "buen día" + }, + "DqGa4gqd2ABDi45BT43x4": { + "text": "princesa" + }, + "Dv9MSCRYbR4Q3K114wXki": { + "text": "alto" + }, + "E-vUPARie8MmfgZwv3Omr": { + "text": "gallo" + }, + "EM8VyonJ7WNdvmRyE3nhZ": { + "text": "lento" + }, + "EO4O-s7oafi6QJdxTFNkd": { + "text": "anticongestivo" + }, + "ETZNYbrG5wveDl6c9k2_k": { + "text": "codo" + }, + "EUsNyf5bDdSLqvZKH1Ltx": { + "text": "no entiendo" + }, + "EVmt43vDI3NHFfbbkqokF": { + "text": "pizza" + }, + "Erg6LuA8IOQ5V8RTP3pPi": { + "text": "abeja" + }, + "F4cGnA_QHsVKTjUE6MAu9": { + "text": "mameluco" + }, + "F7kJ8VM31BWB4K4T4USzs": { + "text": "maltrato físico" + }, + "F8roVYxKZi88UUGfOvTwl": { + "text": "maestra" + }, + "F90bXbc0tz9nuzTT7SgqV": { + "text": "cuatro" + }, + "FBPIabyaoCK-Y0BziQdji": { + "text": "dolor de panza" + }, + "FBTheEQmZZfJRiYjd_Np_": { + "text": "interpretar" + }, + "FO77qpzyz28knodNtILCA": { + "text": "tirar la cadena" + }, + "FTngK946O8S8bYc0g7vM2": { + "text": "mamá" + }, + "FaVvbVzZivuxTwxJTPubK": { + "text": "hermanos" + }, + "FfNU04I4mZ54gWcBXqo2c": { + "text": "panceta" + }, + "FgTird367surh-vxXyAK6": { + "text": "ticket" + }, + "FkC5DtSV81OvFMU99qZGg": { + "text": "pelota" + }, + "FnCBoLSE19WsbUypUKvFc": { + "text": "hamburguesa" + }, + "Fogupb264IyCtbZ-Q2D6w": { + "text": "borracho" + }, + "Fvm2C5NBq01tm0QK9d9QM": { + "text": "hijos" + }, + "G09TvOzDSG5m3hTQD9Tej": { + "text": "borrar" + }, + "G2i9LSK4A19237Zp1vXqF": { + "text": "gordito" + }, + "G6KKVMvPDnjdD9TfBd-B9": { + "text": "playo" + }, + "GAxX7EIz1TTLtMX08RRGr": { + "text": "hamburguesería" + }, + "GJlUSznzEHCgoAOrVrkp9": { + "text": "feliz" + }, + "GSEumxiyeVKRRiaY_c8HW": { + "text": "crol" + }, + "GY_flM-6uR6X3L4AwsiwU": { + "text": "para" + }, + "G_CRpzxWO5XdEMh01O1eJ": { + "text": "aunque" + }, + "Gj7THa6XFHDfYL5H19lwj": { + "text": "mañana" + }, + "Gm_qAGnL4OawmlYmTs7K5": { + "text": "no veo" + }, + "GoJuWnn72TCXONXKtYHMm": { + "text": "tren" + }, + "Gvmy--9DiUn_tkQYWeWhA": { + "text": "canelones" + }, + "GxrDtsdGcLepdsQr6V9DT": { + "text": "verde" + }, + "H2zMVtjvqi7aUtCypiVKr": { + "text": "sentar" + }, + "H8Bsrr2NK9Q3WGbEp8PMe": { + "text": "plateado" + }, + "H9SWPnWbR8qcZA-iu5Mz0": { + "text": "dolor de Oido" + }, + "HBZNu6m3FELU9eg3OeLdx": { + "text": "cortina" + }, + "HKfLJS8aCBtKuKJeSBQUW": { + "text": "golpe" + }, + "HMPabuHqgtyiCmTLzg-rM": { + "text": "entrar" + }, + "HQiQh4PPBvO1n-d7JGVj8": { + "text": "nadie" + }, + "HTBNWax6FCSGXuboGsVUW": { + "text": "salado" + }, + "HnuZA0UTlnuIfFAN7saxl": { + "text": "conejo" + }, + "Hvb4JdDHX_vNMck_US2UN": { + "text": "ensayar" + }, + "I5AJgba5GTdEjdpFB-LBf": { + "text": "chocolatada" + }, + "IAdQsjTsbBUAMjlwW34cw": { + "text": "me encantaría" + }, + "IEeIvawUD2GIAr1Wypr9i": { + "text": "personas" + }, + "IF3R7tLVAkd4RbL8R07K9": { + "text": "actor" + }, + "IM8OUKCzHwnjAQWPFgnn6": { + "text": "lejos" + }, + "INxOSvKbBNOXwruIpuNho": { + "text": "ombligo" + }, + "IO8uTb1K7ElENgp2ujZoK": { + "text": "robusto" + }, + "IXRWmFmtqfnHQRcBf1Idl": { + "text": "paloma" + }, + "IZbfYRzu2cxxDWdbmQeqw": { + "text": "cabeza" + }, + "Ig1oypuwndODbmKh_NEXs": { + "text": "malla" + }, + "IsWUeiPnDEnzxePKclBNp": { + "text": "feo" + }, + "J3qQMp0OMr5LC9ebfArxH": { + "text": "ninguno" + }, + "J3rDL96c2zfBQzP45VRCp": { + "text": "limón" + }, + "J4UUPR-WP0qo1y14bUVI-": { + "text": "veterinario" + }, + "J7MmgugOu20UtMcMPj59r": { + "text": "canción" + }, + "J7wLwBLVx4UANh_x5HdXd": { + "text": "según" + }, + "JB9SIxWzxWFjrbmMuksrY": { + "text": "reir" + }, + "JBIehRNmDbK2ALcRN0u9i": { + "text": "gallo" + }, + "JBKQaBezKuSDaMsnbJMTB": { + "text": "bar" + }, + "JBU2hMw9gbIy9-wGF4mjD": { + "text": "pizarrón" + }, + "JDbBWMB5No0pK6HvntLt4": { + "text": "lavarme las manos" + }, + "JEDIYq1BDA23ac9TNhON-": { + "text": "ayuda" + }, + "JFldbhjqxK3fD6D2K4HY4": { + "text": "papá" + }, + "JGm4BL7HAfuxX_PGe6Jzk": { + "text": "presente" + }, + "JQOpcZSCPGMOWZsN8w_yb": { + "text": "¿qué hora es?" + }, + "JSFuEHlP-CFvuqvFKMumC": { + "text": "autos de juguete" + }, + "JVtu9W3AumOwjUedwhUGE": { + "text": "rehabilitación" + }, + "JZRBfIXBkeuobtDXbLt5t": { + "text": "adiós" + }, + "JawnUo-pseWb3FDVMtxrQ": { + "text": "yogur" + }, + "JblWXW8TKDCuYu2yTnFBA": { + "text": "mesa" + }, + "Ji5OVFX-uNDewL8eX8Cin": { + "text": "pensar" + }, + "Jjq8CM8JrYHIMziuQy-WN": { + "text": "agenda" + }, + "JziaulL-lrAPGNVvwBPK9": { + "text": "verano" + }, + "K382TlNZjdMLLpAhCCXLG": { + "text": "almendras" + }, + "K6hd20tWZfwwlYYi7jctt": { + "text": "rica" + }, + "K8cMIDL0ubQvWhhDtr65F": { + "text": "llorar" + }, + "K8e2-KkvZfFOQaXnhR37x": { + "text": "cansado" + }, + "KC18_sTEqKucPQ-iwEKYY": { + "text": "lapiz" + }, + "KK_i8H9qTfDVYZkQGwd2v": { + "text": "apagar" + }, + "KNH4sLRpVKtHXQa-0y84K": { + "text": "nervioso" + }, + "KWYVDZiERE8jtRsL0faHH": { + "text": "nadar" + }, + "KXHW4m6vXxQU-AEOR4pZ4": { + "text": "balón de fútbol" + }, + "Khdk8mWpyxgLqfC-6lyT9": { + "text": "burro" + }, + "KhyTKtiL4ZT4Z1saU1eJh": { + "text": "escuchar música" + }, + "Kn9vE07FK1LrzoD_YxrJD": { + "text": "subte" + }, + "KpLFOrpuhFKaIbBbFwVVu": { + "text": "mariposa" + }, + "KrOPANVpdkBWdEZoUwxKf": { + "text": "grave" + }, + "KvY6Taigm4Va_cVjXAfGR": { + "text": "corto" + }, + "L0hfYADgzghRVsZLZHRxE": { + "text": "bailarín" + }, + "L19r487_d3RqWXiNuh3gE": { + "text": "¿qué color es?" + }, + "L6YLAEsbYcTq-ycQJTvt4": { + "text": "pollo" + }, + "LAuEISciEf1Wc1j4fERz8": { + "text": "año nuevo" + }, + "LDoi3cxodn_AVKSG-Bf_1": { + "text": "ojos" + }, + "LEVKlDlJ0wHo5QEjCNAGa": { + "text": "pegamento" + }, + "LEg8z-Q-ONLAAXd-aH_Hb": { + "text": "bajo" + }, + "LNBTW0qQtHYQEHatkWGtc": { + "text": "mercado" + }, + "LRIKzfm9ZsdNe1u7CUuW_": { + "text": "¿cuántos?" + }, + "LRfh-4RAZTj7cnnDwBmqj": { + "text": "flotador" + }, + "LU7IoUksATEBhd8PaHS1R": { + "text": "sacar" + }, + "LaKT8VTw0_6rvordp5-R8": { + "text": "rosa" + }, + "LiBr37yi-YBgQDx4unjyc": { + "text": "dá" + }, + "LjTGOcyG7DkTs1lJqNr8w": { + "text": "cabellera" + }, + "LksmOMPPOMArbrFsscqOW": { + "text": "música" + }, + "LmGq1AZs2a0x26r7E9GUj": { + "text": "maestro" + }, + "LngEMJa_ihV8mB7afZX-h": { + "text": "ellas" + }, + "LrDai7jXlGAdZ3e8ZQezj": { + "text": "hacer pis" + }, + "M5q2CXmK0_WVaVUB_HJB3": { + "text": "caliente" + }, + "MEqo2TROHyroK318sm84f": { + "text": "pasta" + }, + "MKR-ukiUlJy4uuqO30UU6": { + "text": "maltrato verbal" + }, + "MMzjhHID8HMqyPjii5o-h": { + "text": "cocina" + }, + "MNCcHiImRS8tmvhBhzCKj": { + "text": "ensalada" + }, + "MQHnvvU48NnEptP8a9w8C": { + "text": "no me gusta" + }, + "MWIzTM6zhTWL1V-brLtBx": { + "text": "cómodo" + }, + "MYqfOzKx2qMHop8GaHs0I": { + "text": "verde Claro" + }, + "MiOe5_Djf-pE9V9aDZ_1G": { + "text": "ananá" + }, + "MqQgYn5B0uV-DMORCBOmV": { + "text": "triste" + }, + "Mw6WRebMAKWwXfAvDA7vu": { + "text": "tener calor" + }, + "N2baGNTOapSaFDo1GURiW": { + "text": "no escucho" + }, + "N7n4zQIkJZOhaYESk2GgH": { + "text": "caer" + }, + "NFdUTit6Ff-4S7Nzf92U5": { + "text": "estreñimiento" + }, + "NFgGqhEtl0HqipCGGEvwU": { + "text": "peinarme" + }, + "NKQwWPAsVHwFBWuksqfns": { + "text": "ducha" + }, + "NLi5ODIzyMAwr2HpDXACp": { + "text": "nariz" + }, + "NQayjogCYiimP_0OxIfFj": { + "text": "zapatos" + }, + "NVe4u7BTAVfLk3xkDqLnZ": { + "text": "horno" + }, + "NVjfEut567uXpTaQUNI2i": { + "text": "campera" + }, + "N_893wsadpGg3Ip5sEThe": { + "text": "azul" + }, + "NaJxTPq9Ld8I4fwAltyEC": { + "text": "maiz" + }, + "NjulpZ9x63ZqxtLMoRjkx": { + "text": "prender la luz" + }, + "Njz8DrErsexBu8mAI6mnr": { + "text": "pescado" + }, + "NmNouLLx13jzE27jliI_v": { + "text": "diente" + }, + "NuhUikdCxP0NgsbO0wvAU": { + "text": "cola" + }, + "O-CLnVuXAUapOn6TbdhKx": { + "text": "querer" + }, + "O450x4W3OOacvJIy4QicJ": { + "text": "verduras" + }, + "OHyrmD5US1rHEAEwLQaII": { + "text": "animales" + }, + "OKXIGnLh-i1ydTNj450Q8": { + "text": "reina" + }, + "OUcfOOReAfQroBKlBdDb-": { + "text": "solución salina" + }, + "OWLDc7Hn3neBAf_V_N27n": { + "text": "abrochar" + }, + "O_ZfCPZSxGMPT6orCt-O6": { + "text": "chancho" + }, + "OblxxVFC-LKPq-8oC9FpE": { + "text": "sentimientos" + }, + "OdCdTUAlbN6kvsPjby_Bi": { + "text": "deportes" + }, + "OeA63q6LpqGvXW-cJXEym": { + "text": "jamón" + }, + "OeytAsSiEAWC10tXhxbTa": { + "text": "personajes" + }, + "OhrHu-xLo8hcn5plWfoX4": { + "text": "caro" + }, + "Om1Bvqu8nmGuNGwV8hndM": { + "text": "bajo" + }, + "OvyFC1GHkvJZ0dAAF1QkY": { + "text": "él" + }, + "OwHzJdOQTFOA8daCVRwm6": { + "text": "pincel" + }, + "P5zdq4x58yp5TA_soKQEJ": { + "text": "bicicleta" + }, + "PAlC0XSZNru3-LXtfvGjo": { + "text": "hacer el amor" + }, + "PBqpK7LL1HQPwowPitrss": { + "text": "leer" + }, + "PFAi3SdvH9vL7_Bg3MhCA": { + "text": "semáforo" + }, + "PIBHv5VueBi-sf5qFCN_Y": { + "text": "ante" + }, + "PIPQnVS2UiS7kGbucJP8l": { + "text": "curar" + }, + "PLXxIPYyztaztLf4sPCst": { + "text": "garganta" + }, + "PbtM3htZocZb8YifuPoY5": { + "text": "cangrejo" + }, + "PfNLmlHKFT9d1w6IgeXbU": { + "text": "control remoto" + }, + "Pl-M4bc6k2rdhu6FHEbkA": { + "text": "patio" + }, + "PogTYrGfa2WNfBRuA8O4e": { + "text": "malo" + }, + "PszHdOxMsS_tAzSrN52Wa": { + "text": "plastilina" + }, + "Pw3GgPwp7fpDVC6wJjgPn": { + "text": "subir" + }, + "Q6LQqdLcvNOiCFjC0DVo2": { + "text": "tambor" + }, + "Q6nNH4AIoSeDHODC_Ip8O": { + "text": "vecino" + }, + "Q9Ra0aJaQnOJQ1Kqdc43-": { + "text": "bebé" + }, + "QCQRmsQY6AggjreY9Z0MF": { + "text": "rechazar" + }, + "QGf1Tb1roL7HAXUSrRqRJ": { + "text": "naranja" + }, + "QJhkOh48xapiTObEDQLB9": { + "text": "piano" + }, + "QTkFHWp9KEDgfCjoQjBY2": { + "text": "plurales" + }, + "QUTQLuD2Gv7fHh0V_O5tg": { + "text": "avergonzado" + }, + "QVqSPPgA89whFTJ0HTphK": { + "text": "abrir" + }, + "QZNQOaf0SdHDbx1otCmrH": { + "text": "niño" + }, + "QcGJ9u_JqmrW0X47PXWH4": { + "text": "despeinada" + }, + "QclUM2p3iexSjFZI8OU4-": { + "text": "fiebre" + }, + "QeqA20MCXB-zNfuKIssMY": { + "text": "lata de atún" + }, + "QllvOUe8utZrcBRGw_0vc": { + "text": "curita" + }, + "QnlQ1HOEB9yNjuW3Dd6fc": { + "text": "celebración" + }, + "Qo3Qn_nMe3E6EqNw0UdNZ": { + "text": "soleado" + }, + "QohNih4wgqjnpWt3kSwtd": { + "text": "entrenador" + }, + "QvaMxPy-3iixHAJFyIrN-": { + "text": "sandwich" + }, + "R06chAQYswLtQK46OInW7": { + "text": "leche con galletas" + }, + "R9ECa_HQRtpFrb59ebMTQ": { + "text": "escuela" + }, + "RBCjBvNXQSZOOpg-5lBlK": { + "text": "bueno" + }, + "RZfMOtjw0DoGHWaRfCEc4": { + "text": "pantalón" + }, + "Ra2rxEEohwxRqDsW2AT3C": { + "text": "videojuegos" + }, + "RbZetbSC5064rZccOFD1D": { + "text": "televisión" + }, + "RkpoG4KB8m_TJFJf2v3EG": { + "text": "cambiar de canal" + }, + "RwlZ1jr2Ix3evzrW71lN0": { + "text": "manzana" + }, + "S3um53pcko7_BPHy7R6FL": { + "text": "nosotros" + }, + "SE-71I_ahm3oKROReyJHE": { + "text": "hacer caca" + }, + "SOyGnJXLPeVRoZy3vBgpK": { + "text": "examen" + }, + "SXz8iA1Qn_BlgLTAG6Epl": { + "text": "cena" + }, + "SiOmZdwX8Hf2nE2v6HfCp": { + "text": "zapato" + }, + "Sp2Ias_Y1HplkHWjIb7Mp": { + "text": "sin" + }, + "TAbuXSnSHU6C3CQ4kbKVh": { + "text": "triángulo" + }, + "TBV2BhoZVgl1jMV_jWZYi": { + "text": "derecha" + }, + "TIgoS-YONIwzbrImXetaD": { + "text": "ciruela" + }, + "TIsM6aTTZ9W8j6UhW9Qqj": { + "text": "coro" + }, + "TLxsYdrBdHgFZkNJtVTmK": { + "text": "tortuga" + }, + "TP-gGRcpcFyx1SrNRsdRV": { + "text": "perdón" + }, + "TR5CXN8-pfbWkshdxSBSV": { + "text": "oveja" + }, + "TS9z8ZmMEwn0MGSfr9amH": { + "text": "palta" + }, + "TZF-7m8VKZ7IL6pyv0Daf": { + "text": "cepillarme los dientes" + }, + "T_Q5c4XAfkhkclmnCGHo5": { + "text": "hasta" + }, + "Td5pgVQDTFOftUgOJ-bD-": { + "text": "picante" + }, + "Te_jJfeU8Xwa9St2RihBq": { + "text": "sangre" + }, + "ThqkHs4az5tgLqLcfFPaZ": { + "text": "largo" + }, + "TpPNZLsh5jrN9RdPFwmA7": { + "text": "¡genial!" + }, + "Tpj-Fs8LQ566TM0bYlZ6H": { + "text": "viernes" + }, + "TuAjBKPp3-PSdQuooSWZi": { + "text": "rana" + }, + "TyqVzfOniQNa9WKQRXqr-": { + "text": "hermana" + }, + "U1KQsrvTa2E00-ugc-Iy6": { + "text": "ausente" + }, + "U6PoeH-cMdO3ttnLkN7_3": { + "text": "cabalgar" + }, + "U7GiGcYacowWi4MWrCYyj": { + "text": "antiinflamatorio" + }, + "UQ-5wOfR0tDzljoDjj2xU": { + "text": "otoño" + }, + "UQ5B5K-tpk1XmQC1B9TjQ": { + "text": "no" + }, + "US8_vYTnDfxBw2Ung_J38": { + "text": "partes íntimas" + }, + "UVzdJiqY36fqgBYyz880c": { + "text": "jamón crudo" + }, + "UXJDiwb3j_zyfGa26ByJL": { + "text": "pecho" + }, + "Ubaq6h7wasdP_YRombm2c": { + "text": "azúcar" + }, + "Ugs9V9c2c5iHrVC6p17zr": { + "text": "analgésico" + }, + "Uk1Emn5IovsTfFzpQX5Jw": { + "text": "sosten" + }, + "UkLF5sKtVKW0D8RzVCoue": { + "text": "bombero" + }, + "UnQJwWfWCe40DJYR1Er0o": { + "text": "dolor" + }, + "UssSOEEKutvzB_B4fAQE-": { + "text": "escuchar de nuevo" + }, + "Ust3oadA0PUGViYo28Mf3": { + "text": "caminar" + }, + "UvRS0KmtZn3dq7e8L5RcE": { + "text": "enojado" + }, + "UwvZVcX_CAQFrI6U4LsNT": { + "text": "huevo" + }, + "VJ9AU_y7CqsONR6TvhdLh": { + "text": "¿dónde es?" + }, + "VKrLGgYjc-nLPGsyESDgb": { + "text": "canario" + }, + "VL4pd0vnJ-CNfMg9bCNed": { + "text": "aspirina" + }, + "VUJ-zrdsyL9MOuFbdMCAx": { + "text": "mareo" + }, + "Vioyf8EXJfY5t34NnN0WO": { + "text": "tablet" + }, + "Vjlet5P7XuqTrc22nt_Zz": { + "text": "agua" + }, + "Vmnu5eormo-_TOCgF4YzG": { + "text": "jarabe para la tos" + }, + "VoZumy5GtnRdqSOmXAw7j": { + "text": "preparado" + }, + "VrC7AnovfA7VzmYESVc8L": { + "text": "conversar" + }, + "VwZ4EKSggYWxlnAbp-pNB": { + "text": "enfermo" + }, + "Vzov0z9acB-I1_W_CcFcY": { + "text": "rojo" + }, + "WDUIQV43zghFQq_rSk1Z4": { + "text": "churrasco" + }, + "WL3ZN-W_zgnuTJpuqz0YQ": { + "text": "príncipe" + }, + "WNhpmD_XlTaNEBo7GsFXu": { + "text": "diarrea" + }, + "WQ0CNIQ_gjaCxg4tEIsOo": { + "text": "clavado" + }, + "WRzleD-mI84LaimFH8h6P": { + "text": "escuchar" + }, + "WUt3I-NkdbqlSVcwuLfFx": { + "text": "patines" + }, + "WWK2v56LM-zWqujabk9bM": { + "text": "plástica" + }, + "W_f7h3qOLl2uEd_OYpMfQ": { + "text": "policía" + }, + "WasZ5bKZZy5Jt4Y-JipxS": { + "text": "bikini" + }, + "Wgh5iCzUmx4Je-B85-pra": { + "text": "heladera" + }, + "WjXQhSFPpz42ZUyHvurYG": { + "text": "grillo" + }, + "WtYSntcy2CijEORmROeaj": { + "text": "un cuarto" + }, + "Wu47Qs6Zupu1Ox2gUhkxn": { + "text": "cuarto" + }, + "Wva5W8GA0dHzyt2_0FPdm": { + "text": "hermano" + }, + "X0-Tf-KR24qEkpGDzG2Z-": { + "text": "ayer" + }, + "X3u4pXTWKcGc43lOkgSBt": { + "text": "cumplimiento" + }, + "XA952Z60D0-cesNCVA-OX": { + "text": "chau" + }, + "XC5fIljJ819OYpllYTjpE": { + "text": "jirafa" + }, + "XN0nzhQyHVOhuYuNqrp8g": { + "text": "durazno" + }, + "XOoGN6huCjVHxH8hRFAw1": { + "text": "blanca" + }, + "XY6ZCNzeJIEzLtWJcufJm": { + "text": "camiseta manga larga" + }, + "XYY8SV1IAMHjdGjMZxbdy": { + "text": "cancha" + }, + "XeVaDdUWSEkhfJvTVvUHR": { + "text": "salir" + }, + "XnocVMEeUGCSnlnusP44O": { + "text": "agarrar" + }, + "XuAtFop5_JNSYiZkUBzaU": { + "text": "cocinar" + }, + "Y5HQq_4crSF2lpwH-KUrt": { + "text": "dos" + }, + "YCu-B26PqjE30AhikHdkI": { + "text": "dibujos animados" + }, + "YIP0Xc4aJsfv0s8BpiQnn": { + "text": "cinco" + }, + "YLKXFZ9ze9K9NvJiAx8w0": { + "text": "¿qué?" + }, + "YbrNtdUmyMNdAF5CfvY1A": { + "text": "toalla" + }, + "YbvMRsCtMbww8OQgF45QF": { + "text": "resfrío" + }, + "YeT-jstVSA7-mD9t99Isg": { + "text": "rompecabeza" + }, + "YusWY8GwdO43bSp1o3BWC": { + "text": "molesto" + }, + "Yvxm8RGoFYKUsIXOl33yR": { + "text": "apagar la luz" + }, + "Z5-sBklfLIWE00CJ_T_ZK": { + "text": "cuchara" + }, + "Z8xp3kxXuhMVoNm7ddQSX": { + "text": "lanzar" + }, + "ZA2C4bJaL90lBxsTemYWZ": { + "text": "piscina" + }, + "ZAnmv4CLb7hldYUlp2wJU": { + "text": "ninguno" + }, + "ZBIFtTq-BH1jv5jLbzrhj": { + "text": "repetir" + }, + "ZQEXAf10BkoTvCJx3Ox39": { + "text": "sorpresa" + }, + "ZR-NXJk3SD351W-95cf_T": { + "text": "pintar" + }, + "ZRYQmYRGKzheBqk11eGRZ": { + "text": "ballena" + }, + "Zm4OIanIKTigDGIsInO7o": { + "text": "un supermercado" + }, + "ZnMba2r4XIg9lPi_H2d_Z": { + "text": "sí" + }, + "_1lOt0C0MQhvU8QWC6_oZ": { + "text": "buenas noches" + }, + "_2SjbH-xHZq173EU4J65c": { + "text": "parque" + }, + "_3ihCSMQCokXNo8pXii-h": { + "text": "llamar a alguien" + }, + "_8RIOebHpkr9nCy0_9qhP": { + "text": "llamar" + }, + "_CsJMxqGcNSaujXwRZcpu": { + "text": "ansioso" + }, + "_FNTsoEjTMV3Uas-gggi2": { + "text": "estrés" + }, + "_HUf6SR0mTP7v72Y9_4gw": { + "text": "coche de bomberos" + }, + "_Lc2-NNL69ZX-aVnUNzgx": { + "text": "frutilla" + }, + "_S9Eck14cdOTr0QH4i7sQ": { + "text": "cuarto de baño" + }, + "_WIT6qs1kaiJqB1Ild5Xs": { + "text": "paseo" + }, + "_eug92AvR1UXpYlfm6o_Q": { + "text": "dorado" + }, + "_hqTU9A7I3RFDVrcIEK-L": { + "text": "%null%" + }, + "_lU200bb9Sjv0b_iJKgU2": { + "text": "una bicicletería" + }, + "_tDZtalMxKSNpWydJ1aeW": { + "text": "cero" + }, + "aC_XP9Ch5PqWoCmcJwI77": { + "text": "algodón" + }, + "aMs2YNnWkw4XN0gAm-jI3": { + "text": "cajón" + }, + "aP9QisUdxhgOKIQ2kHNb3": { + "text": "acelga" + }, + "aSzpwNza22HZp46Sh6wfx": { + "text": "súcio" + }, + "aTwzShtP_zR9x6bSGSzEB": { + "text": "muslo de pollo" + }, + "aXLBXkENJqTYkyZOP8TNS": { + "text": "tú" + }, + "aa3xDW6F9YUKyX0fe5uX8": { + "text": "espaldas" + }, + "ajesFjbC7hwCNLKdif-ix": { + "text": "contra" + }, + "ak5fBauJzapC4JIf0lT8N": { + "text": "cerro" + }, + "alsoa_V3wz3vPpG1TKRZc": { + "text": "transportes" + }, + "amk4WRd1sNEIp24pnFw8j": { + "text": "rodilla" + }, + "armmpopt2RLsVDlqLrQ94": { + "text": "restaurante" + }, + "atVEXuftxSiDDj8rzUlFg": { + "text": "crayones" + }, + "atWxG3KTHB5moW1dylLJc": { + "text": "juguete" + }, + "avzcTznCsQCISYJsLC-w_": { + "text": "notas musicales" + }, + "b1XpSC0ndnm0ZewNXC3pp": { + "text": "carnicero" + }, + "b5OdBMMzkf1FlQbUR5-m7": { + "text": "servilletas" + }, + "b9Y5MrR-jn8fh77gAkLZy": { + "text": "pintar" + }, + "bAoK85XLNb7p0ebevYZ6O": { + "text": "mirarme al espejo" + }, + "bDnuS19hfd9GhJ-6rjNPD": { + "text": "estar" + }, + "bFodvUraUhJeq4waMdlxv": { + "text": "domingo" + }, + "bNJfccUvG2DQfR1iZP3eR": { + "text": "serpiente" + }, + "bVN3R44VuZDw3IdQMolca": { + "text": "cambiar" + }, + "beNprvNb0UztxR4JLxDFm": { + "text": "cumpleaños" + }, + "bge6qR6NzsD5Vk4ifPsSO": { + "text": "ketchup" + }, + "bpSuQQRlIcSse40OAxNSG": { + "text": "lunes" + }, + "bqjKW_qBtRzIThWxdZx2s": { + "text": "gafas de sol" + }, + "buyy_2ydocKoi9TnBhZ1N": { + "text": "amiga" + }, + "bw3rqHXD1TJ53xbNggEqH": { + "text": "desayuno" + }, + "c7kK5ROVbO3DHrwSFEawq": { + "text": "dulce" + }, + "cI0JxwhkWU-YA7E7rmJtp": { + "text": "cuello" + }, + "cJMQi3SVmqvWJ00VxI6gy": { + "text": "¿cómo estás?" + }, + "cJw2i319mzBUpEfBRDxc9": { + "text": "pez" + }, + "cJzHrV_PsV-PwwyFN9jka": { + "text": "%null%" + }, + "cS3g4KXf39akVFHCG5AwL": { + "text": "camión de juguete" + }, + "cTiw7_Yjxu_Kg90q7PdYl": { + "text": "gripe" + }, + "cb0rJJEYOeEoRU5fDdQQq": { + "text": "el" + }, + "ccGASDOGtty6GfQMEEBEU": { + "text": "tres" + }, + "cj6OuVw4Nob8jxP-E4rZc": { + "text": "cambiarme la ropa" + }, + "cnyLFMkJu2i3cqOY0e9kl": { + "text": "pasas" + }, + "curstMeuThu2KUph-8rkB": { + "text": "jugar con" + }, + "cxMNBGV3LytDXgwDMCiga": { + "text": "violeta" + }, + "d4zNoj2BAFG9B7J3KAlLE": { + "text": "botones" + }, + "d6s8fLFBiQ3KEJlNdJfUW": { + "text": "un poco loco" + }, + "dHM0qnbmtJAkZY0WBsqaY": { + "text": "lila" + }, + "dLHDzm0rfgL-vXTx14HSm": { + "text": "buscar" + }, + "dNvN5P787hAPE7ZYNgwkw": { + "text": "pasear" + }, + "dR72liRxC3qmoSa6Dz2a2": { + "text": "jarabe" + }, + "dS-KyYREUQIk7sDlmsvoa": { + "text": "cerca" + }, + "d_I8jNfbkQD0CHgZn7hyB": { + "text": "camisa" + }, + "dgm3NCKuz7L39PX8LYxj7": { + "text": "juguetes" + }, + "djgKI9embnk95PAtFcn45": { + "text": "cambiarme el pañal" + }, + "dn41o5K_1fo-qHO-YLoQn": { + "text": "sábado" + }, + "dnXsSOeVG7mq37uciIi2J": { + "text": "recreo" + }, + "e5sCl246xFMESEfFy2PhX": { + "text": "coche" + }, + "e5un1yrIuZHQi048e5kD6": { + "text": "alfajores" + }, + "e8zl_ecIloo4Vk-OZPJWe": { + "text": "jugar con la tablet" + }, + "eDX2HSkGaY2TeVwPjR07S": { + "text": "fácil" + }, + "eGJ8MC1xPE6ueF82jCmVg": { + "text": "cepillar" + }, + "eKJCZc-kD0-m6cVLorFzO": { + "text": "pera" + }, + "eWSI1NInbQowtO99phhGA": { + "text": "boca" + }, + "eZEqRZjRK8JJMsfHo4Y7w": { + "text": "del" + }, + "ebo03xnkyiHD2pKUKULmr": { + "text": "dibujos animados" + }, + "ecUOs24Pp5ZTRt_ZvED5W": { + "text": "acompañar" + }, + "eduqLSyC3m4uB1Oee6dt6": { + "text": "mitad" + }, + "eji-M2j5eHkG71DCksleY": { + "text": "huevo duro" + }, + "emm_RirDsO30Enax5Q4gd": { + "text": "con" + }, + "eo3Q5AjHJz5kp1EbdALwh": { + "text": "ustedes" + }, + "eoYtISVZl3mdwoE_HW-Mv": { + "text": "guitarra" + }, + "et1KiL5-zob_EcGlj7tLN": { + "text": "despues" + }, + "f2dl12fMZbRdQ7STpcTdk": { + "text": "fútbol" + }, + "fF3ijeQzetfSn6EGcs1yY": { + "text": "cerezas" + }, + "fL_4POdbPVL9-lvQVWSqY": { + "text": "avión de juguete" + }, + "fNAlqbgrpirQZO_LhrkXY": { + "text": "primavera" + }, + "fNv4Nb6Vafxk0JxXr-iDo": { + "text": "investigar" + }, + "fUUj_4pKPflmJlxZfk0cX": { + "text": "discoteca" + }, + "ff7ES190q1dmFYZ7lo6x0": { + "text": "pan blanco" + }, + "fjCOcN-PKP6F07IZcI71X": { + "text": "plaza" + }, + "fkNwVm56PSe-qh-QoM0vm": { + "text": "allá" + }, + "fk_z_HrvcUh8XIq8D6gQP": { + "text": "nueces" + }, + "g1Cj6HW8kg8yPE1XX9pxa": { + "text": "desde" + }, + "g1TLUpuQX2Zs1ob9gqYui": { + "text": "gorro" + }, + "g2MhHawoIC9oFNEv5_w63": { + "text": "vida" + }, + "g2sQSxCcoZuKJ3TabK6oT": { + "text": "vino" + }, + "g75y4E53ViakV-s5UfnIF": { + "text": "equipaje" + }, + "gFEnqFhYoXF7QN-n0ONad": { + "text": "montaña" + }, + "gYrIz3R13-BC_pYcvQ9BL": { + "text": "invierno" + }, + "gaem1LHTtfQdnnqYi-sOm": { + "text": "billetera" + }, + "gff2FqDlgXknRld7YMLWl": { + "text": "entero" + }, + "gsU8pE9ozhR73xS2icwJ0": { + "text": "libro" + }, + "gvPwrzDSSEPwcxY878T_c": { + "text": "gato" + }, + "gzCjycNS8Cf0vNlo1klji": { + "text": "molesto" + }, + "gzb-RNDLMNkgk9wnPILJi": { + "text": "abuela" + }, + "hAZhogJSH3bL1iL237N8J": { + "text": "pochoclos" + }, + "hDvpMlPw-chcuxEisBJTl": { + "text": "castañas" + }, + "hKJhXxultsxm0TJl1P8-L": { + "text": "chau" + }, + "hOyjT1JgOYB-mGLFMaNJR": { + "text": "dolor de pecho" + }, + "hT3Lrjn5-q7YIM1loG4MN": { + "text": "parlante" + }, + "hUYfE_vmNBT_7E60YZsSu": { + "text": "pintura" + }, + "hWWOw1gWjWwN7wQJkHrTu": { + "text": "tour" + }, + "hXgGhazQ_nA5uqpRD6Qwq": { + "text": "ganar" + }, + "hmhAUgqvGp7nc1w25sRSx": { + "text": "esperar" + }, + "hwzwfMyJsvB42F_QWQWyi": { + "text": "jugo de uva" + }, + "hyUaYltGVJU-wRrAjhhPa": { + "text": "cantante" + }, + "i0wB--S4sdL8Q4H9b93UY": { + "text": "ácido" + }, + "i2mlV3zGS6nrH2l6N2BlZ": { + "text": "trompeta" + }, + "iAqItRUQL_YpbMn2pgjsA": { + "text": "pizzería" + }, + "ibtmTEP3QGDY8TyVLteuX": { + "text": "blando" + }, + "ifd0M0pAlFm7aPt1A0ze_": { + "text": "amar" + }, + "iiA1u1JKRmhe2jWVE_W79": { + "text": "amigos" + }, + "iimGxVoFWlq_THThR3vmF": { + "text": "noticias" + }, + "ijn-QwQuTxRFFVe-7WlSX": { + "text": "picazón" + }, + "iowxE4MxcV6PR2Uhtvxqs": { + "text": "hospital" + }, + "irbOv2dHA7G969dnJMfJn": { + "text": "cuaderno" + }, + "islCzqFq1SYrZAh63dLhQ": { + "text": "huevo frito" + }, + "j5xZZev5nTNa-p088Oqnp": { + "text": "besar" + }, + "jBqD3qhhcrioLlCU-xq5b": { + "text": "instrumentos musicales" + }, + "jOALQbfxdXmJVyY6P5gZG": { + "text": "damasco" + }, + "jTEb3A5ZEKEy2ojuq2vO_": { + "text": "hueso" + }, + "jeO9YZ22LfSObUNhQDRAz": { + "text": "ventana" + }, + "jfly9fZ3x1da4SGCCNcV2": { + "text": "bufanda" + }, + "jfvreGZv-e8rD4-01wZ5H": { + "text": "venda" + }, + "jhJ2TOfdaRAcVeHGOjwua": { + "text": "leche" + }, + "jmzg4EiC7JEHwe9gNP3C3": { + "text": "arroz" + }, + "jpKPg3hn6_GO1HSkeLNGz": { + "text": "niña" + }, + "jprAsdXWGQKPlUWwgBBot": { + "text": "película" + }, + "jtKc2q2n5an342ZkiMB9R": { + "text": "higiene personal" + }, + "k-iDOTk5uO7ZK5OB3v8It": { + "text": "viejo" + }, + "k41gkf6A_bDtQAJDOrWpP": { + "text": "pasta de dientes" + }, + "k7dZhQtwDPFlOk1iPjEOz": { + "text": "subir volumen" + }, + "k8tJx6PikRcnVuZEqrXRM": { + "text": "viajar" + }, + "k9ZpWM4oRb1q20c0qWCsg": { + "text": "abrigo" + }, + "kDzHKO8eIwNsyKWDw7M0c": { + "text": "uva" + }, + "kIn8SeGURyvu49EsRqDs7": { + "text": "pijama" + }, + "kN85Lb_C4dLnww7sz1afK": { + "text": "café" + }, + "kaiWPbXxjHXlqcpBaBp4l": { + "text": "viajar" + }, + "khUUL_1JQGngApqBRDh_q": { + "text": "arreglado" + }, + "kpghvJtujlt4vPI2N6vsg": { + "text": "o" + }, + "kxuGlfYjS6puO2xD1QvxO": { + "text": "vamos" + }, + "lKA4b7I3iFkqNzPcAXyBc": { + "text": "cocinero" + }, + "lKMW_xTZzCrCHRcGp-Z-n": { + "text": "galleta" + }, + "lR84gCk8OM-oYoLAV7tar": { + "text": "timbre" + }, + "lXH68vGIuZdfA8xVrS8iw": { + "text": "mucho" + }, + "l_ncJLRdVGBzzQc9yqBqs": { + "text": "banana" + }, + "lrUuPKco_O8FXDuclzpKE": { + "text": "necesitar" + }, + "m0434KkjeTv8SGN7WxR2C": { + "text": "negro" + }, + "m0Fkio76HZHS2HguPOTn5": { + "text": "seis" + }, + "m17b6MazSk6M4gb51_cCy": { + "text": "pulmones" + }, + "m39xTdgaenoi4mWGEa-Ew": { + "text": "plato" + }, + "m3qTT8tiGZQheKIWREzMT": { + "text": "ir a" + }, + "mC9Nb7zVdEUpjEBODw_gL": { + "text": "vos" + }, + "mFfylZ8yoLvtkVSDTlVEN": { + "text": "pomada" + }, + "mJqzbxYeIDQciPkeHA1Ao": { + "text": "cuchillo" + }, + "mK4AXXhoIVirBz5dr_xLA": { + "text": "pavo" + }, + "mRK--C5Q1aGe8MMPJJLYi": { + "text": "preocupado" + }, + "mTklFAI-FVVLsMKoASZ7T": { + "text": "desconocido" + }, + "mWXxPPvhSHf9hyb-VyuZH": { + "text": "e" + }, + "mZFwH8xY_OeVDWCdvPZBy": { + "text": "pie" + }, + "miPmA2tOQiLxOW7D_V_x6": { + "text": "cubos" + }, + "ms97ZsgQOvD-Z8qpSW4oN": { + "text": "¿quiénes?" + }, + "mx6dmRLXA_lkN1QlP71vq": { + "text": "todas" + }, + "n5bZClAB6jXAZnwxIwH-1": { + "text": "tostada" + }, + "nK7DRpxalLBHL9OnRjSim": { + "text": "frambuesa" + }, + "nMQUtS-kFHViOKyop1FdS": { + "text": "vincha" + }, + "nQSk6_KCEVdO7oC_uxLXN": { + "text": "oreja" + }, + "nQdbkRVcwpQB_hFNPbe6M": { + "text": "caballo" + }, + "nUg2M7p5sUPlGdbBev2-G": { + "text": "tobillos" + }, + "nm6e_s01gWHzdVj25BHyq": { + "text": "¡qué lindo!" + }, + "nnTJQMJWfd2nuTSlFNEOy": { + "text": "mío" + }, + "ntzBlFkDMTKEUHoGNc65u": { + "text": "baño" + }, + "o0oxaoUFpOLiGsoQBlalI": { + "text": "torta" + }, + "oAxNCJufVUqZMyWRGdZl9": { + "text": "tuyo" + }, + "oEHzYcfxDGGcsL-deud1j": { + "text": "snack" + }, + "oEyUWrQj1iYUnlEUdQQ5Z": { + "text": "flauta" + }, + "oO21zLMEtHEakvnuTohLu": { + "text": "¡qué divertido!" + }, + "oOkD8Wmvb4t9I2EWqT1Nr": { + "text": "amargo" + }, + "oSBFO8Ka0PN4bgX0QuWxL": { + "text": "viajar en auto" + }, + "oYwoiRDWlIjSTbYdC2vG6": { + "text": "falda" + }, + "oa-MShota2L8n2pU8hIsm": { + "text": "jugar" + }, + "okr5oAG2U8Er1XwQ8XbWD": { + "text": "grande" + }, + "oqQWeoWBr5N0LrPGY62Og": { + "text": "senos" + }, + "otTWzTaTAmweNCozT8tn9": { + "text": "alergia" + }, + "p1qK47wwLwF8S0Fy8-2Mt": { + "text": "mano" + }, + "pHBnmCFpM7oZf0O78CBIz": { + "text": "golosina" + }, + "pM-bC77hbj-w44A0HFRDZ": { + "text": "sonarme la nariz" + }, + "p_XyUXRmeUk_bdjRTMtkz": { + "text": "revistas" + }, + "p_qpVEd677b2Bk56yhvj6": { + "text": "jardín" + }, + "paPpjw1XVC9-6xcueJsrY": { + "text": "todos" + }, + "pgPlWKk-oww2fua5zYuue": { + "text": "mono" + }, + "phZ4F4uzi1TrhjeDMuMsn": { + "text": "almohada" + }, + "pkuppr1jMH7SMpa2hrIWQ": { + "text": "jugo de durazno" + }, + "pliNY9oMQh1iSidkEhhDO": { + "text": "abrazar" + }, + "pptyFMhLrbC6lN6zmc7D0": { + "text": "comedor" + }, + "ptQZXjMQyXWycUD1kAkQo": { + "text": "cuento" + }, + "pv8eYkxczIevQqEGwDz6V": { + "text": "mochila" + }, + "pvXSy-5M4i8kysUppvdME": { + "text": "que" + }, + "pwltOTDn2OyABTlD4-27W": { + "text": "verduras" + }, + "px0jKQDj7r9pOYs4ZrvcT": { + "text": "tomate" + }, + "q22wRFF21EigV8YzQ_MfV": { + "text": "¿me ayudas?" + }, + "q6F-qJ7mTxvwa43F6vwun": { + "text": "escondidas" + }, + "q7Pz4UqqZUlXeFfXrwXDR": { + "text": "enjuagar" + }, + "qA4v2JWQU0zzBBZgvW7Vt": { + "text": "temblores" + }, + "qOsbXyvBTMDAwvvnI0iFn": { + "text": "pequeño" + }, + "qU5IvFLD8d16iIHSs_9TM": { + "text": "cebolla" + }, + "qWhpDTMd8eAEoq7yTKc57": { + "text": "calzón" + }, + "qYA2U_BFOZtFLClxuCIBJ": { + "text": "dolor de muelas" + }, + "qeJdrxKIIcUctIjo8wWhc": { + "text": "aguda" + }, + "qn-7ERrcZxJTqfW6hwNs8": { + "text": "correr" + }, + "qsA1zm1DOlItK7DCWzAw8": { + "text": "aburrido" + }, + "qscoBbrWu7tQbpNj9XUPt": { + "text": "papel higiénica" + }, + "quE_RA9abVvtG-Fo4Jx8f": { + "text": "diez" + }, + "qy3c7gvRU7shWuJYr1kBk": { + "text": "bebida" + }, + "r7eJgCF_b_ktkztv4-oda": { + "text": "medias" + }, + "r808IO3I6j3os_uix6O63": { + "text": "juegos de salón" + }, + "r9qUBQwgY8eycnU2OVey0": { + "text": "comer un sándwich" + }, + "rBwDn3PcJGqytqnOZTJMV": { + "text": "taxi" + }, + "rMFGfzFobfGsH3_qrLHXU": { + "text": "pescado" + }, + "rU9cpWF0I4wnJjzTXpGtO": { + "text": "hoy mismo" + }, + "rgyV6CvFe98OGnWut6QCZ": { + "text": "turista" + }, + "rlGO5jGKPL1vW-VF4nRqZ": { + "text": "entrada" + }, + "rnjJyPTabH_Xpmy4Z4O3U": { + "text": "celebrar" + }, + "rtHwq5WN9KElX3V3SKBmS": { + "text": "papas fritas" + }, + "rwyX2YemNEx_Mh64IArDQ": { + "text": "oscuro" + }, + "rxdfuk6egO7VmZEB3JrUN": { + "text": "la" + }, + "ry_jOegpMf4nB3spGf4d2": { + "text": "me gusta" + }, + "s0BXoyn7AqUAlZ9BOHY6S": { + "text": "tríste" + }, + "sAsTkky29uEVC9vo3Ofbo": { + "text": "brazo" + }, + "sDKIldL3tit328Joneo_7": { + "text": "vaso" + }, + "sFNUgvnglgrm6cbYiM0di": { + "text": "¿cuándo?" + }, + "sP6uvKmY5kA_yuYR8H21c": { + "text": "halloween" + }, + "sPtazVgymXESdS-BcHqU_": { + "text": "pollería" + }, + "sSTGRl6DpYGZXp8vtTNbm": { + "text": "comprar" + }, + "sbv5HLPUR6gHo-EJR2S7S": { + "text": "camello" + }, + "sc0hr3jQ80yXRFDlAn56V": { + "text": "cansancio" + }, + "sixdpB8hTOhlUr4loz3RB": { + "text": "muñeca" + }, + "sjGytpiPjwqJfPaRUJ-Iw": { + "text": "miércoles" + }, + "sysOciGqtL7y4ULuyYVc-": { + "text": "canal de cocina" + }, + "t-w8e69GwxLyfxlWwHk9f": { + "text": "mermelada" + }, + "t34TbvjJ3zG2jcgJaCeHa": { + "text": "tocar" + }, + "tGyUfSljuc7A5Do5B9GuN": { + "text": "sweater" + }, + "tQwMPLvqAMAstcqvnOERE": { + "text": "gris" + }, + "tWxC4hR6di5zQC-Hujlev": { + "text": "bajar volumen" + }, + "tYwEpd2EOtH8wEUr-jwHk": { + "text": "caro" + }, + "tw1doIY-jFPofZjlPFj4z": { + "text": "¿cómo te llamas?" + }, + "txj22hip0CE9qp_z-daIK": { + "text": "nebulizador" + }, + "u1nIt_oFH426g1IVhlYk5": { + "text": "sediento" + }, + "u2e4Zh8qwJF7zKkohQ8df": { + "text": "goma de borrar" + }, + "u3BufiTZTK6AylGh80ZFd": { + "text": "ella" + }, + "u8HfFvMPkogdWk-URj9hv": { + "text": "escribir" + }, + "uDg7Yy86PlwsAd-U96vJR": { + "text": "arriba" + }, + "uFoytOG4qsXzBk979t63y": { + "text": "limpio" + }, + "uMhOF9ZvWnjW-Zrjbjfhs": { + "text": "bajar" + }, + "uOA82KFAVtjoYRTuYFgpr": { + "text": "postre" + }, + "uPL5NMeXTmD1iU6ZoiROu": { + "text": "pájaro" + }, + "uYElWOlSOSoQap-d5gsYF": { + "text": "chocolate" + }, + "uZRwbLa1lEG7ol0UJKRBj": { + "text": "viejo" + }, + "ubP5GM7_0vPkRc6zbD9Ez": { + "text": "antiácido" + }, + "uiVc5R86QCZkhraEFlrNz": { + "text": "museo" + }, + "ujyHgmlPIs7UdtndbYd8S": { + "text": "amistad" + }, + "upWXctTSKBtFNSXnXDK_u": { + "text": "frutas" + }, + "uzSwgQNnV8ZrjxpN5Bz_a": { + "text": "difícil" + }, + "v-E2GE1DpCkNAxsfA0f4M": { + "text": "goma" + }, + "vHzfvEgIkQ0e73ryfWP2F": { + "text": "ordenar" + }, + "vKGLQIas9RdBnPGsaYtr2": { + "text": "cometa" + }, + "vOgqHjpHgrUGERIHtVqDe": { + "text": "basurero" + }, + "vPicdKLrhT2wmAAPPukKP": { + "text": "veloz" + }, + "vPnmrsRou1ihosdVXS_Op": { + "text": "zapatitos" + }, + "vZ9JaTnoj8C0ILYxMNB73": { + "text": "calabaza" + }, + "vaYJPAsTRvslo2qFOJt60": { + "text": "lomo" + }, + "vazatQ7CrYJFsorVDC5AC": { + "text": "león" + }, + "viAHJeLRr_6j9dEi5klj_": { + "text": "amarillo" + }, + "vlh1Pa6eA0ZrBs3vHzWH7": { + "text": "oso" + }, + "vmb_RMIB20QND6VcS0deY": { + "text": "panza" + }, + "vq3T-UQGTjX3Z9TlEF12e": { + "text": "mayonesa" + }, + "vy-O5Zc5kxY8d-7RROvQI": { + "text": "jamón" + }, + "w4cVxbBDZjeNyHwpBARHQ": { + "text": "hombro" + }, + "wBLnDZStKj8YLkg2pTCfh": { + "text": "sentir" + }, + "wCGb6D4xSVr4UeKXzGIlP": { + "text": "disfraces" + }, + "wcpXeLMBRusfqfrz9s4mF": { + "text": "puré" + }, + "whHwNRVnqeM7BMx6nppiW": { + "text": "tigre" + }, + "wkrNPLGWTqMIy4PJRW9QR": { + "text": "en" + }, + "wnfSUkF8-tQiRTVou1_pd": { + "text": "frío" + }, + "x3PNiU1NIeQ3zQa31C8WX": { + "text": "pañal" + }, + "xGsyYCjDzQugVzSaK8CuA": { + "text": "duro" + }, + "xIgPo3N-aKXhVcjultMiY": { + "text": "factura" + }, + "xPUYlxRxgFVn1FHQFz6Ic": { + "text": "secar" + }, + "xQblStUfyBGO27j15Sda3": { + "text": "pato" + }, + "xT4BPNmF-5WAQLfs3cUpS": { + "text": "enamorado" + }, + "xXtjQktuAq1bmxTc0HSQT": { + "text": "gaseosa" + }, + "xbPnUL4qxvm30VFYNphh-": { + "text": "tíos" + }, + "xiaTdHGInqfm4rD6XzSeZ": { + "text": "encender" + }, + "xnPF8fvkC1TvgETI1JcC9": { + "text": "órganos" + }, + "xqGzZJIHBeVfSzRfm3rmg": { + "text": "uno" + }, + "xxr0MRGYRmmoNC_gsD9uy": { + "text": "pasaporte" + }, + "y0SViQxW8Y-yiX1Z7gXWt": { + "text": "superhéroe" + }, + "y5W21CKOkLWnYJo1OC700": { + "text": "tos" + }, + "yJoivIPHOm1Y1lj-hGN1J": { + "text": "dormir" + }, + "yNag8CK0wV_iRMnFznsXk": { + "text": "pelota" + }, + "yR9FTtOimFwZG5g5tgpRk": { + "text": "visita" + }, + "y_5OURnKxFcv4UiMKntUi": { + "text": "y" + }, + "yihsjW9ON0Fr9Yy4ZlP9c": { + "text": "axila" + }, + "yk2wDVqHEKKwupgm87OJ2": { + "text": "nalgas" + }, + "yo00Ci8bSRFYPU6HxGVwX": { + "text": "cantar" + }, + "yqlmoVGItXqaeazw3M3eg": { + "text": "sillón" + }, + "yvtvSsBLhabkcpeYGbxQr": { + "text": "bota" + }, + "yxa6QVSrmWUKH2PZHKaVl": { + "text": "lechuga" + }, + "zANp2EnhT6n0Jcl1Xra6K": { + "text": "bailarín" + }, + "zAmesi1FcIWLXE3WVa9WS": { + "text": "antihistamínico" + }, + "zRTTg5x_P1E8Z3CU-oWXa": { + "text": "cualquiera" + }, + "zcibOHpRbSmz1hVNSjPTj": { + "text": "tenedor" + }, + "zdFC3vpgjcyUWB9a4ghRW": { + "text": "descripción" + }, + "zi_wcT10fxgn72ZJhVx18": { + "text": "vestido" + }, + "zm_6R89hr4wjuVkifiYrk": { + "text": "despeinado" + }, + "zrR1DbO_szgKvxLyrZquw": { + "text": "calefacción" + }, + "zw-o9pDectP5bxFnUjrJO": { + "text": "chancho" + }, + "zxhRDSHXtV63Sp3c2fjrI": { + "text": "aduana" + }, + "-k6dUC6thWPyULq8MVSe6": { + "text": "PRONOMBRES" + }, + "0geft4arn_A8kL-rfUPYc": { + "text": "PERSONAS" + }, + "1aM3sTxyb8yLSWtkn2MoO": { + "text": "INSTRUMENTOS MUSICALES" + }, + "384rVetrrLX4x4pJ0Y0Na": { + "text": "INTERACCIONES SOCIALES" + }, + "4e6iVOPLAjnM6wCMUm5P4": { + "text": "DESAYUNO Y MERIENDA" + }, + "6vmRBH4shBk3UQEUM6APX": { + "text": "CINE Y PELÍCULAS" + }, + "7Jm3bDhPInSlwhdy20dKF": { + "text": "CLASE DE ARTE" + }, + "7ngCuvmAnM_7ygpFQgLpk": { + "text": "COLORES" + }, + "7w5ACMFdOCTkBrS911MA1": { + "text": "ADJETIVOS Y ADVERBIOS" + }, + "8FPdnkMzOIBVTW5-TQxWX": { + "text": "PERSONAJES" + }, + "8t8CAggTj3HuznkKhfXle": { + "text": "LIBRO DEL RESTAURANTE" + }, + "9JRv4X68pAtwsFT3Ss0iJ": { + "text": "LIBRO DE NATACIÓN" + }, + "ByBvBUS7dcXldjzZOVFFP": { + "text": "CUERPO" + }, + "C7ClEHF5-Mcico4FvRxEV": { + "text": "PREPOSICIONES" + }, + "GD9YHeLktSsdZQvcoua6x": { + "text": "LIBRO DE LA CARNICERÍA" + }, + "HzPl-HvsrXL_QkGT38Ohd": { + "text": "LIBRO DE VERDULERÍA" + }, + "JKEk5TYykBK6ZeYND3Ron": { + "text": "CONJUNCIONES" + }, + "LWyfHr8Oui5HIShtZ_huo": { + "text": "FRUTAS" + }, + "PYTnUqCLwAbngR2Ozroc2": { + "text": "ACCIONES" + }, + "QQszyYRLL-otCQtRfbLzm": { + "text": "TIEMPO" + }, + "V6K3TniptOApMMGa8TspR": { + "text": "TODO" + }, + "VhfGFlHDcPor996rCzoK9": { + "text": "CELEBRACIONES" + }, + "WZYuZd331Hm5gHXJtUmBN": { + "text": "ANIMALES" + }, + "ZgZoyOg5K-LscXdfl6kQG": { + "text": "CLASE DE MÚSICA" + }, + "_Cw7FcJSYiterkLSDJH8V": { + "text": "CASA" + }, + "ah257x5jssDmLIOrcSGn6": { + "text": "NÚMEROS" + }, + "berI6X2_pAVCNOrcHAL6y": { + "text": "SENTIMIENTOS" + }, + "ce2z_EeEG2nH0ZS4KVAkA": { + "text": "COLEGIO" + }, + "dQXaeM3Uul1yEvRwJ4w9t": { + "text": "VESTIMENTA" + }, + "ejXQZAiYjrcSFGXb1pz7M": { + "text": "TRANSPORTE" + }, + "gybgILOLxmIVfeQtb1f94": { + "text": "LIBRO DE HIGIENE" + }, + "iHS1HpUBBadzgmbum_bdD": { + "text": "PROFESIONES Y OFICIOS" + }, + "jatDsecioVAxRph-WOg4f": { + "text": "LIBRO DE LA FARMACIA" + }, + "puOOrKWbYzH0B_8uGkxYX": { + "text": "LIBRO DE VIAJE" + }, + "puda9fUGjqvm9oSM6CpTk": { + "text": "ALIMENTOS" + }, + "rH7zhJzNVIcEIRyvaYLoi": { + "text": "DEPORTES" + }, + "uv4tWMRHfewaEQ_pH0dnV": { + "text": "LIBRO DE LA SALUD" + }, + "wAhDHMrZ850dHTwgAXrMY": { + "text": "CONCEPTOS" + }, + "xjfPlDs-AcFV9LCyY-v9j": { + "text": "JUEGOS Y JUGUETES" + }, + "y545pM8pvB3WgukIac6NT": { + "text": "LUGARES" + }, + "zwf7qmSEi7PBwsNaqciA-": { + "text": "libro de la biblioteca" + } +} \ No newline at end of file diff --git a/assets/languages/es_MX.json b/assets/languages/es_MX.json new file mode 100644 index 00000000..15162ef5 --- /dev/null +++ b/assets/languages/es_MX.json @@ -0,0 +1 @@ +{"-2UbAou9ydr8XeN-jtIz4": {"text": "limpiar"}, "-GL2iAgykP10Ae3AKsVOX": {"text": "sal"}, "-LE2iv3Pwr5KuIyM5bYb3": {"text": "bien"}, "-LwAKwgCdVkzwM579zRMo": {"text": "más"}, "-aePI8WknXpxEpz19Lu48": {"text": "suyos"}, "-msU3yor4qJYQHJtWrdk8": {"text": "pastas"}, "00AkNJ4YLpbRD_mLmQjtp": {"text": "almuerzo"}, "0IrLGI8Ebm8rcS3ymUXqS": {"text": "hambre"}, "0THELgiQ7rvA-orESXJfV": {"text": "avión"}, "0Vkmy6BZcJn3pFurEevL9": {"text": "estudiar"}, "0Z7uFXpp-XRXmqM8ILhIC": {"text": "poco"}, "0_SK41wNOk6mw2qX_eHXM": {"text": "cine"}, "0cdYDZ5HPaTmqTTN0_Ee8": {"text": "suerte"}, "0fHziRVxg0oNDp5pyiI8M": {"text": "permiso"}, "0fcYcD_r0jNWXTTAx8Ph7": {"text": "aeropuerto"}, "0gAyTD6sImo0jpD_bYGVv": {"text": "jueves"}, "0huLn-H32Cbwba28IZ3tc": {"text": "burbujas"}, "0jpMJu8isUmOZKxhZ_yaj": {"text": "equipo"}, "0pFtmDZdlnLrUkT_XZDXQ": {"text": "antes"}, "0qoQs8WyLVONnu3_eBGfD": {"text": "dolor de cabeza"}, "0v5fqIp8GmXsIHO0SPhtt": {"text": "dale"}, "0vttFf3nAGDW6g5wVStcH": {"text": "disculpa"}, "1-VwcvzNfvrwDWRGxRPre": {"text": "ni"}, "10X4OKR5xmNhSj86sbyE_": {"text": "salchichas"}, "14aCIW665UZtuwNsKKV5s": {"text": "cartuchera"}, "17AkRFlfC_koV-lywmDE8": {"text": "pantalones cortos"}, "1B1WmC-V0PglDeRAeINcT": {"text": "mirar"}, "1DjW-XvWN7iOqoJPRSWwY": {"text": "mal"}, "1IjenNwPwsMIWZ4aYBk8S": {"text": "partido"}, "1Ph13Z_Ya6p-q0WA7pSl3": {"text": "pájaro"}, "1QEfLU_S7TM0iMr9VZVtP": {"text": "ronda"}, "1Rv9-SSJjHptwvzqLbdbx": {"text": "divertido"}, "1WJZO-pUkTaQvyxz41iB-": {"text": "picado"}, "1YOlJCovdcnnqVihqHVmq": {"text": "acá"}, "1b71P9YjaNWnX8AWjstqG": {"text": "remera"}, "1mS8kgJIod1cyUFH-msnM": {"text": "estación"}, "1mU2ZosZXSJrxkh1NmxJT": {"text": "izquierda"}, "1nhsReHG-f-bW-xaZBsxY": {"text": "abajo"}, "1pb6S-RR_3zdCq77YFiZ-": {"text": "¡qué mal!"}, "1zU7kolOKsHP9-oomQW1Q": {"text": "rey"}, "27GbVOZ-szdnzsy92oY-X": {"text": "manteca"}, "2CgcUkvJUskv982FvG54A": {"text": "dinero"}, "2HkB0WZYP7cvWLD39GMQj": {"text": "duchar"}, "2KO0BFtB4B6fu1feuAZLt": {"text": "verbos"}, "2RZTRMX56BFLrW7tLJ3Hy": {"text": "mismo"}, "2Vc2H462cutVtUC-5omJk": {"text": "pocos"}, "2dwtZO2wCm520GPD1i6dl": {"text": "dolor de garganta"}, "2t_eq1JmgHa0R3eu8LMmI": {"text": "ventilador"}, "2u2-AFuI245I7bZ6tsSPh": {"text": "¿quién?"}, "2y9pxVOBQ2tMdPHcsqQb8": {"text": "martes"}, "3-ueUrnwmIIj0BMP8_Ntb": {"text": "uña"}, "32PnZjlnQbTJo4nL9YJYe": {"text": "feliz"}, "3932Zm0xgk1hKB2hhBAUa": {"text": "autobús"}, "3KbwCHGooNLySWOBlFFuG": {"text": "cocinita"}, "3KgKNNnuYMrysEDs3Pu4Z": {"text": "subtítulo"}, "3VEnVjaGFCImBAZ3wEChu": {"text": "ropa"}, "3arbCGI6fMOWALLanZcg3": {"text": "capuchino"}, "3dtvYLjbl5oDyhZO9eFRY": {"text": "ellos"}, "3mwcdenOurU_e59ChLqb0": {"text": "fuera"}, "3w62N9b7Cvb6JMjB9Wphi": {"text": "beber"}, "40q0NJ6vsziJDNFBqho7Y": {"text": "dentro"}, "4A_FNkGH1EDu0oabPurrL": {"text": "cereales"}, "4J1bWl6BbbEdZsRGsgYH2": {"text": "queso"}, "4X7OXm35OSHoSlPxGUi_f": {"text": "mueble"}, "4bHGIoQmDN8LptpdNN4v6": {"text": "vacaciones"}, "4f1vqDoAvUu2XYk_JlQdC": {"text": "siete"}, "4rctwNiN4UaU9lqU48MHG": {"text": "computadora"}, "4rzonBodQXfs77gALnAP_": {"text": "cerveza"}, "50wJdR0-3YLnv9y_2Gx_e": {"text": "saltar"}, "54BVjn2seJWdBNGI20-yJ": {"text": "computadora"}, "54taab8z9ziXt0IqXHkV9": {"text": "dedos"}, "5L5UzBHOzuHRoO-jyPuEx": {"text": "ciudad"}, "5LYjhk-N87Ov9NrQcGbLQ": {"text": "aceite"}, "5Tdy0Gu9SiLsPfWwd-Y2E": {"text": "lindo"}, "5VBtwEswIjrv1zbXP-oFn": {"text": "sopa"}, "5W5_sCAyGTkVzguCEg1d1": {"text": "jugo"}, "5dvq344JstkxUpHszaPfp": {"text": "delfín"}, "5gPT9lrNgpRkF07lP6zOq": {"text": "zumo de manzana"}, "5i3kSsCKF7Oa9iJQvXiTe": {"text": "más o menos"}, "5kjlzqb9Rf3zzqZROaZ9p": {"text": "perder"}, "5mGrGHzdw_vCwYCRNPcPw": {"text": "pasear"}, "5vxTXbPl4Y0yezGu7p1f6": {"text": "hacer"}, "6KicPX6y_u2i6tPBZAtvA": {"text": "lavar"}, "6jLkKc9OL5btNOmjJem6S": {"text": "poner"}, "6lYN4qSZx3_tKDClp4Iyr": {"text": "entre"}, "6nhNeVjDfDi-GmreaqfVo": {"text": "nublado"}, "6rcOXG6yxpzHLzMJ9IayI": {"text": "cerrar"}, "6t2sPdapSNJrOziDozTWW": {"text": "vaca"}, "71l2at-8480bvijxn3uBl": {"text": "durante"}, "75gujwNXJdAiNmK6Ffhia": {"text": "zumo"}, "79xBF6cKgKeD4GeBPe_Ds": {"text": "bolsa"}, "7EsVGfapPc_38mHCBy3C3": {"text": "enamorado"}, "7Hz61-WzV62FHsedOwz6q": {"text": "flan"}, "7Q4Zc0cenSF5U4eKyje1f": {"text": "hacia"}, "7Q9sNljseWjwSPW4in1ga": {"text": "recepción"}, "7VL_MgnLDY6hi8sbvcGIg": {"text": "silencio"}, "7WxUVoVQfQOzARU2bf6HP": {"text": "casa"}, "7iAXKVm22uMgr6aqZ1rr7": {"text": "abuelo"}, "8-4M30dTtmuUJus9MtGqV": {"text": "moco"}, "81UJI7xOa5l9mVceqkIP5": {"text": "tener frío"}, "82LicIQc3K2xCTEt-iMpu": {"text": "caracol"}, "86gNdF6aTepa0Y9zkD1VQ": {"text": "campo"}, "8FFwIw7rJri79BITZBUzm": {"text": "hotel"}, "8KlFB3an1mzdQd6-LGCCE": {"text": "merienda"}, "8LddDqylw-51wHhx9_Qad": {"text": "libro"}, "8MV4ZFthtUeoxLAIbqGTc": {"text": "carne"}, "8cOIYr-hcK54qWpuT-41e": {"text": "cuento"}, "8fGingRAd8idw4qcxyZ-Q": {"text": "vergüenza"}, "8iFdjRTQU7ONGnigRTlm8": {"text": "¿cuánto sale?"}, "8vR0HYniXtrrQqqSIN_JQ": {"text": "familia"}, "904w9Je6oDwGXUCIcrUZX": {"text": "lengua"}, "93YmZA7VfAT7TTNTsDE1W": {"text": "serie"}, "93hsW10TmX3Vcq_4IvcZ0": {"text": "blanco"}, "93tHieC_CgZqN998y5gAv": {"text": "chuleta"}, "97nIv-aoc51T8kKTZV5cM": {"text": "saliva"}, "9EqfwMNtATh1fwMhyn_B1": {"text": "buena"}, "9FiWvg197C-Riid-DVysN": {"text": "claro"}, "9GqE148SFZqMIft4evAk2": {"text": "comer"}, "9MzeUcz1nRqleTkmS_-g2": {"text": "barco"}, "9QyJdpUn0f6g7FxWs5qpO": {"text": "cortar"}, "9U8MzceIsqKhG86oNx9zV": {"text": "coche"}, "9UwpyOnOBoqr4mX3Juqm2": {"text": "buenas tardes"}, "9ZnzbKMDwGEwC3hXOhXFe": {"text": "pastillas"}, "9dvSIpeXa2_12Jip6noJP": {"text": "deportista"}, "9kgRI3KlOIVSuylKffW9g": {"text": "colores"}, "9lS0mNuKIS0olyDwoIJBR": {"text": "médico"}, "9mLx-YMK81AflitELQFqk": {"text": "papel"}, "9s5zV3_oGyDx_NEvsKCxX": {"text": "violín"}, "9wE9Py6ztyqDrtaypsltA": {"text": "naranja"}, "AOp6VGyjYIV0Ym9d0basJ": {"text": "dibujar"}, "APXF-lEplPOloppSeIjAY": {"text": "menos"}, "AQKGKdoX5CYycZ2YqBZVW": {"text": "barato"}, "AT_rDWsr6xRBgrvgw9Zih": {"text": "nueve"}, "AWJXh6URGN0Vwm66i6IvL": {"text": "hola"}, "AeFbJQ0M9uTObAlKEX3zr": {"text": "pierna"}, "Akf0xlH8UJdXn8BJzPV2A": {"text": "radio"}, "B1845IfYfPMz2FWpVFIQv": {"text": "de"}, "BKmATW2uBk4pxnmOaARyq": {"text": "documentos"}, "BNjZz9MGLJEKZ4CZoTs2M": {"text": "ajedrez"}, "BQhqx1PuF94jwT0ySTlbJ": {"text": "comida"}, "BQm-YCPc0lfD1-mhecCTL": {"text": "yo"}, "Bebnh8-UWwtYLnK6p3fKi": {"text": "pan negro"}, "BjqWZnzLlxdOo4KEzZ46j": {"text": "ocho"}, "BqS7d4PMhGRqPYlZQzUbR": {"text": "puerta"}, "Bub9ZYygLcly15D7_wYks": {"text": "amigo"}, "ByrvXHEN9Mb8D--7MQAjM": {"text": "peluche"}, "C12mJ1W11fODI3pv1QOnx": {"text": "gelatina"}, "C29KJ8BTFavhj_R9UfnSv": {"text": "por"}, "C2bgADoxmINRnAiYxZHqd": {"text": "taxista"}, "CBTemIvgIN1UAtftkc3sz": {"text": "pegar"}, "CCWCtXdMuQBJRmaFOAlfQ": {"text": "navidad"}, "CY-IQvUehkaiGFCdKf9bf": {"text": "chorizo"}, "CYH_6DL9q1iLLetuWeR9A": {"text": "tener"}, "CZrETqLgQlvDkLHvw1t_w": {"text": "a"}, "C_JKGNCxOI5x_f2C4qAyZ": {"text": "maní"}, "CbO32RkDdf9aCucv6BnGS": {"text": "cabra"}, "ChBc7LjL8dgzZ6LUCAHGh": {"text": "por favor"}, "CkTiaqBY3jf86JRq636lt": {"text": "¿cuál?"}, "CsKZSNiJw5Q48b26Kskf-": {"text": "heroe"}, "CxFmyJYmy6gMRqP9U0cBP": {"text": "estoy perdido"}, "CyKtU9yC0Jy7Ypb4WFp6w": {"text": "perro"}, "D1gCni2jXpCvKZe4qCtQN": {"text": "peces"}, "D2tSkngqbQmdKLNhn9xWV": {"text": "globos"}, "D7dt_hFX5DScV_ssm1nKz": {"text": "pomelo"}, "D85FU-Wqr2u53tfTXAtHo": {"text": "patalear"}, "DAq2J_xXHsSCSNPp9qVsk": {"text": "oler"}, "DBd09yUlbkaYLsemjFXEs": {"text": "helado"}, "DG1RiDjDfwWRhpAiIpPqA": {"text": "vómito"}, "DSgrhLHauub-gBqMGwacO": {"text": "asustado"}, "DXb0FpjVM9q8LVl9vvSHn": {"text": "clases"}, "DXpjgLKTdx9eLLohVdmWM": {"text": "verdulería"}, "D_4Weq7iyi7GMEsgP0xy6": {"text": "té"}, "Djs1QsLNf8Q5LBIFV5zNC": {"text": "partituras"}, "DkeHJFtqAS005fYUrl1Xz": {"text": "pantalon"}, "Dm3yiKSB134LrjtW_KrO7": {"text": "buen día"}, "DqGa4gqd2ABDi45BT43x4": {"text": "princesa"}, "Dv9MSCRYbR4Q3K114wXki": {"text": "alto"}, "E-vUPARie8MmfgZwv3Omr": {"text": "gallo"}, "EM8VyonJ7WNdvmRyE3nhZ": {"text": "lento"}, "EO4O-s7oafi6QJdxTFNkd": {"text": "anticongestivo"}, "ETZNYbrG5wveDl6c9k2_k": {"text": "codo"}, "EUsNyf5bDdSLqvZKH1Ltx": {"text": "no entiendo"}, "EVmt43vDI3NHFfbbkqokF": {"text": "pizza"}, "Erg6LuA8IOQ5V8RTP3pPi": {"text": "abeja"}, "F4cGnA_QHsVKTjUE6MAu9": {"text": "mameluco"}, "F7kJ8VM31BWB4K4T4USzs": {"text": "maltrato físico"}, "F8roVYxKZi88UUGfOvTwl": {"text": "maestra"}, "F90bXbc0tz9nuzTT7SgqV": {"text": "cuatro"}, "FBPIabyaoCK-Y0BziQdji": {"text": "dolor de barriga"}, "FBTheEQmZZfJRiYjd_Np_": {"text": "interpretar"}, "FO77qpzyz28knodNtILCA": {"text": "tirar la cadena"}, "FTngK946O8S8bYc0g7vM2": {"text": "mamá"}, "FaVvbVzZivuxTwxJTPubK": {"text": "hermanos"}, "FfNU04I4mZ54gWcBXqo2c": {"text": "panceta"}, "FgTird367surh-vxXyAK6": {"text": "ticket"}, "FkC5DtSV81OvFMU99qZGg": {"text": "balón"}, "FnCBoLSE19WsbUypUKvFc": {"text": "hamburguesa"}, "Fogupb264IyCtbZ-Q2D6w": {"text": "borracho"}, "Fvm2C5NBq01tm0QK9d9QM": {"text": "hijos"}, "G09TvOzDSG5m3hTQD9Tej": {"text": "borrar"}, "G2i9LSK4A19237Zp1vXqF": {"text": "gordito"}, "G6KKVMvPDnjdD9TfBd-B9": {"text": "playa"}, "GAxX7EIz1TTLtMX08RRGr": {"text": "hamburguesería"}, "GJlUSznzEHCgoAOrVrkp9": {"text": "feliz"}, "GSEumxiyeVKRRiaY_c8HW": {"text": "crol"}, "GY_flM-6uR6X3L4AwsiwU": {"text": "para"}, "G_CRpzxWO5XdEMh01O1eJ": {"text": "aunque"}, "Gj7THa6XFHDfYL5H19lwj": {"text": "mañana"}, "Gm_qAGnL4OawmlYmTs7K5": {"text": "no veo"}, "GoJuWnn72TCXONXKtYHMm": {"text": "tren"}, "Gvmy--9DiUn_tkQYWeWhA": {"text": "canelones"}, "GxrDtsdGcLepdsQr6V9DT": {"text": "verde"}, "H2zMVtjvqi7aUtCypiVKr": {"text": "sentar"}, "H8Bsrr2NK9Q3WGbEp8PMe": {"text": "plateado"}, "H9SWPnWbR8qcZA-iu5Mz0": {"text": "dolor de Oido"}, "HBZNu6m3FELU9eg3OeLdx": {"text": "cortina"}, "HKfLJS8aCBtKuKJeSBQUW": {"text": "golpe"}, "HMPabuHqgtyiCmTLzg-rM": {"text": "entrar"}, "HQiQh4PPBvO1n-d7JGVj8": {"text": "nadie"}, "HTBNWax6FCSGXuboGsVUW": {"text": "salado"}, "HnuZA0UTlnuIfFAN7saxl": {"text": "conejo"}, "Hvb4JdDHX_vNMck_US2UN": {"text": "ensayar"}, "I5AJgba5GTdEjdpFB-LBf": {"text": "chocolatada"}, "IAdQsjTsbBUAMjlwW34cw": {"text": "me encantaría"}, "IEeIvawUD2GIAr1Wypr9i": {"text": "personas"}, "IF3R7tLVAkd4RbL8R07K9": {"text": "actor"}, "IM8OUKCzHwnjAQWPFgnn6": {"text": "lejos"}, "INxOSvKbBNOXwruIpuNho": {"text": "ombligo"}, "IO8uTb1K7ElENgp2ujZoK": {"text": "robusto"}, "IXRWmFmtqfnHQRcBf1Idl": {"text": "paloma"}, "IZbfYRzu2cxxDWdbmQeqw": {"text": "cabeza"}, "Ig1oypuwndODbmKh_NEXs": {"text": "traje de baño"}, "IsWUeiPnDEnzxePKclBNp": {"text": "feo"}, "J3qQMp0OMr5LC9ebfArxH": {"text": "ninguno"}, "J3rDL96c2zfBQzP45VRCp": {"text": "limón"}, "J4UUPR-WP0qo1y14bUVI-": {"text": "veterinario"}, "J7MmgugOu20UtMcMPj59r": {"text": "canción"}, "J7wLwBLVx4UANh_x5HdXd": {"text": "según"}, "JB9SIxWzxWFjrbmMuksrY": {"text": "reir"}, "JBIehRNmDbK2ALcRN0u9i": {"text": "gallo"}, "JBKQaBezKuSDaMsnbJMTB": {"text": "bar"}, "JBU2hMw9gbIy9-wGF4mjD": {"text": "pizarra"}, "JDbBWMB5No0pK6HvntLt4": {"text": "lavarme las manos"}, "JEDIYq1BDA23ac9TNhON-": {"text": "ayuda"}, "JFldbhjqxK3fD6D2K4HY4": {"text": "papá"}, "JGm4BL7HAfuxX_PGe6Jzk": {"text": "presente"}, "JQOpcZSCPGMOWZsN8w_yb": {"text": "¿qué hora es?"}, "JSFuEHlP-CFvuqvFKMumC": {"text": "autos de juguete"}, "JVtu9W3AumOwjUedwhUGE": {"text": "rehabilitación"}, "JZRBfIXBkeuobtDXbLt5t": {"text": "adiós"}, "JawnUo-pseWb3FDVMtxrQ": {"text": "yogur"}, "JblWXW8TKDCuYu2yTnFBA": {"text": "mesa"}, "Ji5OVFX-uNDewL8eX8Cin": {"text": "pensar"}, "Jjq8CM8JrYHIMziuQy-WN": {"text": "agenda"}, "JziaulL-lrAPGNVvwBPK9": {"text": "verano"}, "K382TlNZjdMLLpAhCCXLG": {"text": "almendras"}, "K6hd20tWZfwwlYYi7jctt": {"text": "rica"}, "K8cMIDL0ubQvWhhDtr65F": {"text": "llorar"}, "K8e2-KkvZfFOQaXnhR37x": {"text": "cansado"}, "KC18_sTEqKucPQ-iwEKYY": {"text": "lapiz"}, "KK_i8H9qTfDVYZkQGwd2v": {"text": "apagar"}, "KNH4sLRpVKtHXQa-0y84K": {"text": "nervioso"}, "KWYVDZiERE8jtRsL0faHH": {"text": "nadar"}, "KXHW4m6vXxQU-AEOR4pZ4": {"text": "balón de fútbol"}, "Khdk8mWpyxgLqfC-6lyT9": {"text": "burro"}, "KhyTKtiL4ZT4Z1saU1eJh": {"text": "escuchar música"}, "Kn9vE07FK1LrzoD_YxrJD": {"text": "metro"}, "KpLFOrpuhFKaIbBbFwVVu": {"text": "mariposa"}, "KrOPANVpdkBWdEZoUwxKf": {"text": "grave"}, "KvY6Taigm4Va_cVjXAfGR": {"text": "corto"}, "L0hfYADgzghRVsZLZHRxE": {"text": "bailarín"}, "L19r487_d3RqWXiNuh3gE": {"text": "¿qué color es?"}, "L6YLAEsbYcTq-ycQJTvt4": {"text": "pollo"}, "LAuEISciEf1Wc1j4fERz8": {"text": "año nuevo"}, "LDoi3cxodn_AVKSG-Bf_1": {"text": "ojos"}, "LEVKlDlJ0wHo5QEjCNAGa": {"text": "pegamento"}, "LEg8z-Q-ONLAAXd-aH_Hb": {"text": "bajo"}, "LNBTW0qQtHYQEHatkWGtc": {"text": "mercado"}, "LRIKzfm9ZsdNe1u7CUuW_": {"text": "¿cuántos?"}, "LRfh-4RAZTj7cnnDwBmqj": {"text": "flotador"}, "LU7IoUksATEBhd8PaHS1R": {"text": "sacar"}, "LaKT8VTw0_6rvordp5-R8": {"text": "rosa"}, "LiBr37yi-YBgQDx4unjyc": {"text": "dar"}, "LjTGOcyG7DkTs1lJqNr8w": {"text": "cabello"}, "LksmOMPPOMArbrFsscqOW": {"text": "música"}, "LmGq1AZs2a0x26r7E9GUj": {"text": "maestro"}, "LngEMJa_ihV8mB7afZX-h": {"text": "ellas"}, "LrDai7jXlGAdZ3e8ZQezj": {"text": "hacer pis"}, "M5q2CXmK0_WVaVUB_HJB3": {"text": "caliente"}, "MEqo2TROHyroK318sm84f": {"text": "pasta"}, "MKR-ukiUlJy4uuqO30UU6": {"text": "maltrato verbal"}, "MMzjhHID8HMqyPjii5o-h": {"text": "cocina"}, "MNCcHiImRS8tmvhBhzCKj": {"text": "ensalada"}, "MQHnvvU48NnEptP8a9w8C": {"text": "no me gusta"}, "MWIzTM6zhTWL1V-brLtBx": {"text": "cómodo"}, "MYqfOzKx2qMHop8GaHs0I": {"text": "verde Claro"}, "MiOe5_Djf-pE9V9aDZ_1G": {"text": "ananá"}, "MqQgYn5B0uV-DMORCBOmV": {"text": "triste"}, "Mw6WRebMAKWwXfAvDA7vu": {"text": "tener calor"}, "N2baGNTOapSaFDo1GURiW": {"text": "no escucho"}, "N7n4zQIkJZOhaYESk2GgH": {"text": "caer"}, "NFdUTit6Ff-4S7Nzf92U5": {"text": "estreñimiento"}, "NFgGqhEtl0HqipCGGEvwU": {"text": "peinarme"}, "NKQwWPAsVHwFBWuksqfns": {"text": "ducha"}, "NLi5ODIzyMAwr2HpDXACp": {"text": "nariz"}, "NQayjogCYiimP_0OxIfFj": {"text": "zapatos"}, "NVe4u7BTAVfLk3xkDqLnZ": {"text": "horno"}, "NVjfEut567uXpTaQUNI2i": {"text": "campera"}, "N_893wsadpGg3Ip5sEThe": {"text": "azul"}, "NaJxTPq9Ld8I4fwAltyEC": {"text": "maiz"}, "NjulpZ9x63ZqxtLMoRjkx": {"text": "prender la luz"}, "Njz8DrErsexBu8mAI6mnr": {"text": "pescaíto"}, "NmNouLLx13jzE27jliI_v": {"text": "diente"}, "NuhUikdCxP0NgsbO0wvAU": {"text": "cola"}, "O-CLnVuXAUapOn6TbdhKx": {"text": "querer"}, "O450x4W3OOacvJIy4QicJ": {"text": "legumbre"}, "OHyrmD5US1rHEAEwLQaII": {"text": "animal"}, "OKXIGnLh-i1ydTNj450Q8": {"text": "reina"}, "OUcfOOReAfQroBKlBdDb-": {"text": "solución salina"}, "OWLDc7Hn3neBAf_V_N27n": {"text": "abrochar"}, "O_ZfCPZSxGMPT6orCt-O6": {"text": "cerdo"}, "OblxxVFC-LKPq-8oC9FpE": {"text": "sentimientos"}, "OdCdTUAlbN6kvsPjby_Bi": {"text": "deportes"}, "OeA63q6LpqGvXW-cJXEym": {"text": "jamón"}, "OeytAsSiEAWC10tXhxbTa": {"text": "personajes"}, "OhrHu-xLo8hcn5plWfoX4": {"text": "caro"}, "Om1Bvqu8nmGuNGwV8hndM": {"text": "bajo"}, "OvyFC1GHkvJZ0dAAF1QkY": {"text": "él"}, "OwHzJdOQTFOA8daCVRwm6": {"text": "pincel"}, "P5zdq4x58yp5TA_soKQEJ": {"text": "bicicleta"}, "PAlC0XSZNru3-LXtfvGjo": {"text": "hacer el amor"}, "PBqpK7LL1HQPwowPitrss": {"text": "leer"}, "PFAi3SdvH9vL7_Bg3MhCA": {"text": "semáforo"}, "PIBHv5VueBi-sf5qFCN_Y": {"text": "ante"}, "PIPQnVS2UiS7kGbucJP8l": {"text": "curar"}, "PLXxIPYyztaztLf4sPCst": {"text": "garganta"}, "PbtM3htZocZb8YifuPoY5": {"text": "cangrejo"}, "PfNLmlHKFT9d1w6IgeXbU": {"text": "control remoto"}, "Pl-M4bc6k2rdhu6FHEbkA": {"text": "patio"}, "PogTYrGfa2WNfBRuA8O4e": {"text": "malo"}, "PszHdOxMsS_tAzSrN52Wa": {"text": "plastilina"}, "Pw3GgPwp7fpDVC6wJjgPn": {"text": "subir"}, "Q6LQqdLcvNOiCFjC0DVo2": {"text": "tambor"}, "Q6nNH4AIoSeDHODC_Ip8O": {"text": "vecino"}, "Q9Ra0aJaQnOJQ1Kqdc43-": {"text": "bebé"}, "QCQRmsQY6AggjreY9Z0MF": {"text": "rechazar"}, "QGf1Tb1roL7HAXUSrRqRJ": {"text": "naranja"}, "QJhkOh48xapiTObEDQLB9": {"text": "piano"}, "QTkFHWp9KEDgfCjoQjBY2": {"text": "plurales"}, "QUTQLuD2Gv7fHh0V_O5tg": {"text": "avergonzado"}, "QVqSPPgA89whFTJ0HTphK": {"text": "abrir"}, "QZNQOaf0SdHDbx1otCmrH": {"text": "niño"}, "QcGJ9u_JqmrW0X47PXWH4": {"text": "despeinada"}, "QclUM2p3iexSjFZI8OU4-": {"text": "fiebre"}, "QeqA20MCXB-zNfuKIssMY": {"text": "lata de atún"}, "QllvOUe8utZrcBRGw_0vc": {"text": "curita"}, "QnlQ1HOEB9yNjuW3Dd6fc": {"text": "celebración"}, "Qo3Qn_nMe3E6EqNw0UdNZ": {"text": "soleado"}, "QohNih4wgqjnpWt3kSwtd": {"text": "entrenador"}, "QvaMxPy-3iixHAJFyIrN-": {"text": "sandwich"}, "R06chAQYswLtQK46OInW7": {"text": "leche y galletas"}, "R9ECa_HQRtpFrb59ebMTQ": {"text": "escuela"}, "RBCjBvNXQSZOOpg-5lBlK": {"text": "bueno"}, "RZfMOtjw0DoGHWaRfCEc4": {"text": "pantalón"}, "Ra2rxEEohwxRqDsW2AT3C": {"text": "videojuegos"}, "RbZetbSC5064rZccOFD1D": {"text": "televisión"}, "RkpoG4KB8m_TJFJf2v3EG": {"text": "cambiar de canal"}, "RwlZ1jr2Ix3evzrW71lN0": {"text": "manzana"}, "S3um53pcko7_BPHy7R6FL": {"text": "nosotros"}, "SE-71I_ahm3oKROReyJHE": {"text": "hacer caca"}, "SOyGnJXLPeVRoZy3vBgpK": {"text": "exámen"}, "SXz8iA1Qn_BlgLTAG6Epl": {"text": "ceña"}, "SiOmZdwX8Hf2nE2v6HfCp": {"text": "sapato"}, "Sp2Ias_Y1HplkHWjIb7Mp": {"text": "sín"}, "TAbuXSnSHU6C3CQ4kbKVh": {"text": "tríángulo"}, "TBV2BhoZVgl1jMV_jWZYi": {"text": "derecha"}, "TIgoS-YONIwzbrImXetaD": {"text": "ciruela"}, "TIsM6aTTZ9W8j6UhW9Qqj": {"text": "coro"}, "TLxsYdrBdHgFZkNJtVTmK": {"text": "tortuga"}, "TP-gGRcpcFyx1SrNRsdRV": {"text": "perdón"}, "TR5CXN8-pfbWkshdxSBSV": {"text": "oveja"}, "TS9z8ZmMEwn0MGSfr9amH": {"text": "palta"}, "TZF-7m8VKZ7IL6pyv0Daf": {"text": "cepillarme los dientes"}, "T_Q5c4XAfkhkclmnCGHo5": {"text": "hasta"}, "Td5pgVQDTFOftUgOJ-bD-": {"text": "picante"}, "Te_jJfeU8Xwa9St2RihBq": {"text": "sangre"}, "ThqkHs4az5tgLqLcfFPaZ": {"text": "largo"}, "TpPNZLsh5jrN9RdPFwmA7": {"text": "¡genial!"}, "Tpj-Fs8LQ566TM0bYlZ6H": {"text": "viernes"}, "TuAjBKPp3-PSdQuooSWZi": {"text": "rana"}, "TyqVzfOniQNa9WKQRXqr-": {"text": "hermana"}, "U1KQsrvTa2E00-ugc-Iy6": {"text": "ausente"}, "U6PoeH-cMdO3ttnLkN7_3": {"text": "cabalgar"}, "U7GiGcYacowWi4MWrCYyj": {"text": "antiinflamatorio"}, "UQ-5wOfR0tDzljoDjj2xU": {"text": "otoño"}, "UQ5B5K-tpk1XmQC1B9TjQ": {"text": "no"}, "US8_vYTnDfxBw2Ung_J38": {"text": "partes íntimas"}, "UVzdJiqY36fqgBYyz880c": {"text": "jamón crudo"}, "UXJDiwb3j_zyfGa26ByJL": {"text": "pecho"}, "Ubaq6h7wasdP_YRombm2c": {"text": "azúcar"}, "Ugs9V9c2c5iHrVC6p17zr": {"text": "analgésico"}, "Uk1Emn5IovsTfFzpQX5Jw": {"text": "sosten"}, "UkLF5sKtVKW0D8RzVCoue": {"text": "bombero"}, "UnQJwWfWCe40DJYR1Er0o": {"text": "dolor"}, "UssSOEEKutvzB_B4fAQE-": {"text": "escuchar de nuevo"}, "Ust3oadA0PUGViYo28Mf3": {"text": "caminar"}, "UvRS0KmtZn3dq7e8L5RcE": {"text": "enojado"}, "UwvZVcX_CAQFrI6U4LsNT": {"text": "huevo"}, "VJ9AU_y7CqsONR6TvhdLh": {"text": "¿dónde es?"}, "VKrLGgYjc-nLPGsyESDgb": {"text": "canario"}, "VL4pd0vnJ-CNfMg9bCNed": {"text": "aspirina"}, "VUJ-zrdsyL9MOuFbdMCAx": {"text": "mareo"}, "Vioyf8EXJfY5t34NnN0WO": {"text": "tablet"}, "Vjlet5P7XuqTrc22nt_Zz": {"text": "agua"}, "Vmnu5eormo-_TOCgF4YzG": {"text": "jarabe para la tos"}, "VoZumy5GtnRdqSOmXAw7j": {"text": "preparado"}, "VrC7AnovfA7VzmYESVc8L": {"text": "conversar"}, "VwZ4EKSggYWxlnAbp-pNB": {"text": "enfermo"}, "Vzov0z9acB-I1_W_CcFcY": {"text": "rojo"}, "WDUIQV43zghFQq_rSk1Z4": {"text": "filete"}, "WL3ZN-W_zgnuTJpuqz0YQ": {"text": "príncipe"}, "WNhpmD_XlTaNEBo7GsFXu": {"text": "diarrea"}, "WQ0CNIQ_gjaCxg4tEIsOo": {"text": "clavado"}, "WRzleD-mI84LaimFH8h6P": {"text": "escuchar"}, "WUt3I-NkdbqlSVcwuLfFx": {"text": "patines"}, "WWK2v56LM-zWqujabk9bM": {"text": "plástica"}, "W_f7h3qOLl2uEd_OYpMfQ": {"text": "policía"}, "WasZ5bKZZy5Jt4Y-JipxS": {"text": "bikini"}, "Wgh5iCzUmx4Je-B85-pra": {"text": "heladera"}, "WjXQhSFPpz42ZUyHvurYG": {"text": "grillo"}, "WtYSntcy2CijEORmROeaj": {"text": "un cuarto"}, "Wu47Qs6Zupu1Ox2gUhkxn": {"text": "cuarto"}, "Wva5W8GA0dHzyt2_0FPdm": {"text": "hermano"}, "X0-Tf-KR24qEkpGDzG2Z-": {"text": "ayer"}, "X3u4pXTWKcGc43lOkgSBt": {"text": "cumplimiento"}, "XA952Z60D0-cesNCVA-OX": {"text": "chau"}, "XC5fIljJ819OYpllYTjpE": {"text": "jirafa"}, "XN0nzhQyHVOhuYuNqrp8g": {"text": "durazno"}, "XOoGN6huCjVHxH8hRFAw1": {"text": "blanca"}, "XY6ZCNzeJIEzLtWJcufJm": {"text": "camiseta manga larga"}, "XYY8SV1IAMHjdGjMZxbdy": {"text": "cancha"}, "XeVaDdUWSEkhfJvTVvUHR": {"text": "salir"}, "XnocVMEeUGCSnlnusP44O": {"text": "agarrar"}, "XuAtFop5_JNSYiZkUBzaU": {"text": "cocinar"}, "Y5HQq_4crSF2lpwH-KUrt": {"text": "dos"}, "YCu-B26PqjE30AhikHdkI": {"text": "dibujos animados"}, "YIP0Xc4aJsfv0s8BpiQnn": {"text": "cinco"}, "YLKXFZ9ze9K9NvJiAx8w0": {"text": "¿qué?"}, "YbrNtdUmyMNdAF5CfvY1A": {"text": "toalla"}, "YbvMRsCtMbww8OQgF45QF": {"text": "resfrío"}, "YeT-jstVSA7-mD9t99Isg": {"text": "rompecabeza"}, "YusWY8GwdO43bSp1o3BWC": {"text": "molesto"}, "Yvxm8RGoFYKUsIXOl33yR": {"text": "apagar la luz"}, "Z5-sBklfLIWE00CJ_T_ZK": {"text": "cuchara"}, "Z8xp3kxXuhMVoNm7ddQSX": {"text": "lanzar"}, "ZA2C4bJaL90lBxsTemYWZ": {"text": "piscina"}, "ZAnmv4CLb7hldYUlp2wJU": {"text": "ninguno"}, "ZBIFtTq-BH1jv5jLbzrhj": {"text": "repetir"}, "ZQEXAf10BkoTvCJx3Ox39": {"text": "sorpresa"}, "ZR-NXJk3SD351W-95cf_T": {"text": "pintar"}, "ZRYQmYRGKzheBqk11eGRZ": {"text": "ballena"}, "Zm4OIanIKTigDGIsInO7o": {"text": "un supermercado"}, "ZnMba2r4XIg9lPi_H2d_Z": {"text": "sí"}, "_1lOt0C0MQhvU8QWC6_oZ": {"text": "buenas noches"}, "_2SjbH-xHZq173EU4J65c": {"text": "parque"}, "_3ihCSMQCokXNo8pXii-h": {"text": "llamar a alguien"}, "_8RIOebHpkr9nCy0_9qhP": {"text": "llamar"}, "_CsJMxqGcNSaujXwRZcpu": {"text": "ansioso"}, "_FNTsoEjTMV3Uas-gggi2": {"text": "estrés"}, "_HUf6SR0mTP7v72Y9_4gw": {"text": "coche de bomberos"}, "_Lc2-NNL69ZX-aVnUNzgx": {"text": "frutilla"}, "_S9Eck14cdOTr0QH4i7sQ": {"text": "cuarto de baño"}, "_WIT6qs1kaiJqB1Ild5Xs": {"text": "paseo"}, "_eug92AvR1UXpYlfm6o_Q": {"text": "dorado"}, "_hqTU9A7I3RFDVrcIEK-L": {"text": "%null%"}, "_lU200bb9Sjv0b_iJKgU2": {"text": "una bicicletería"}, "_tDZtalMxKSNpWydJ1aeW": {"text": "cero"}, "aC_XP9Ch5PqWoCmcJwI77": {"text": "algodón"}, "aMs2YNnWkw4XN0gAm-jI3": {"text": "cajón"}, "aP9QisUdxhgOKIQ2kHNb3": {"text": "acelga"}, "aSzpwNza22HZp46Sh6wfx": {"text": "súcio"}, "aTwzShtP_zR9x6bSGSzEB": {"text": "muslo de pollo"}, "aXLBXkENJqTYkyZOP8TNS": {"text": "tú"}, "aa3xDW6F9YUKyX0fe5uX8": {"text": "espaldas"}, "ajesFjbC7hwCNLKdif-ix": {"text": "contra"}, "ak5fBauJzapC4JIf0lT8N": {"text": "cerro"}, "alsoa_V3wz3vPpG1TKRZc": {"text": "transportes"}, "amk4WRd1sNEIp24pnFw8j": {"text": "rodilla"}, "armmpopt2RLsVDlqLrQ94": {"text": "restaurante"}, "atVEXuftxSiDDj8rzUlFg": {"text": "crayones"}, "atWxG3KTHB5moW1dylLJc": {"text": "juguete"}, "avzcTznCsQCISYJsLC-w_": {"text": "notas musicales"}, "b1XpSC0ndnm0ZewNXC3pp": {"text": "carnicero"}, "b5OdBMMzkf1FlQbUR5-m7": {"text": "servilletas"}, "b9Y5MrR-jn8fh77gAkLZy": {"text": "pintar"}, "bAoK85XLNb7p0ebevYZ6O": {"text": "mirarme al espejo"}, "bDnuS19hfd9GhJ-6rjNPD": {"text": "estar"}, "bFodvUraUhJeq4waMdlxv": {"text": "domingo"}, "bNJfccUvG2DQfR1iZP3eR": {"text": "serpiente"}, "bVN3R44VuZDw3IdQMolca": {"text": "cambiar"}, "beNprvNb0UztxR4JLxDFm": {"text": "cumpleaños"}, "bge6qR6NzsD5Vk4ifPsSO": {"text": "ketchup"}, "bpSuQQRlIcSse40OAxNSG": {"text": "lunes"}, "bqjKW_qBtRzIThWxdZx2s": {"text": "gafas de agua"}, "buyy_2ydocKoi9TnBhZ1N": {"text": "amiga"}, "bw3rqHXD1TJ53xbNggEqH": {"text": "desayuno"}, "c7kK5ROVbO3DHrwSFEawq": {"text": "dulce"}, "cI0JxwhkWU-YA7E7rmJtp": {"text": "cuello"}, "cJMQi3SVmqvWJ00VxI6gy": {"text": "¿cómo estás?"}, "cJw2i319mzBUpEfBRDxc9": {"text": "pez"}, "cJzHrV_PsV-PwwyFN9jka": {"text": "%null%"}, "cS3g4KXf39akVFHCG5AwL": {"text": "camión de juguete"}, "cTiw7_Yjxu_Kg90q7PdYl": {"text": "gripe"}, "cb0rJJEYOeEoRU5fDdQQq": {"text": "el"}, "ccGASDOGtty6GfQMEEBEU": {"text": "tres"}, "cj6OuVw4Nob8jxP-E4rZc": {"text": "cambiarme la ropa"}, "cnyLFMkJu2i3cqOY0e9kl": {"text": "pasas"}, "curstMeuThu2KUph-8rkB": {"text": "jugar con"}, "cxMNBGV3LytDXgwDMCiga": {"text": "violeta"}, "d4zNoj2BAFG9B7J3KAlLE": {"text": "botones"}, "d6s8fLFBiQ3KEJlNdJfUW": {"text": "un poco loco"}, "dHM0qnbmtJAkZY0WBsqaY": {"text": "lila"}, "dLHDzm0rfgL-vXTx14HSm": {"text": "buscar"}, "dNvN5P787hAPE7ZYNgwkw": {"text": "pasear"}, "dR72liRxC3qmoSa6Dz2a2": {"text": "jarabe"}, "dS-KyYREUQIk7sDlmsvoa": {"text": "cerca"}, "d_I8jNfbkQD0CHgZn7hyB": {"text": "camisa"}, "dgm3NCKuz7L39PX8LYxj7": {"text": "juguetes"}, "djgKI9embnk95PAtFcn45": {"text": "cambiarme el pañal"}, "dn41o5K_1fo-qHO-YLoQn": {"text": "sábado"}, "dnXsSOeVG7mq37uciIi2J": {"text": "recreo"}, "e5sCl246xFMESEfFy2PhX": {"text": "coche"}, "e5un1yrIuZHQi048e5kD6": {"text": "caramelos"}, "e8zl_ecIloo4Vk-OZPJWe": {"text": "jugar con la tableta"}, "eDX2HSkGaY2TeVwPjR07S": {"text": "fácil"}, "eGJ8MC1xPE6ueF82jCmVg": {"text": "cepillar"}, "eKJCZc-kD0-m6cVLorFzO": {"text": "pera"}, "eWSI1NInbQowtO99phhGA": {"text": "boca"}, "eZEqRZjRK8JJMsfHo4Y7w": {"text": "del"}, "ebo03xnkyiHD2pKUKULmr": {"text": "dibujos animados"}, "ecUOs24Pp5ZTRt_ZvED5W": {"text": "acompañar"}, "eduqLSyC3m4uB1Oee6dt6": {"text": "mitad"}, "eji-M2j5eHkG71DCksleY": {"text": "huevo duro"}, "emm_RirDsO30Enax5Q4gd": {"text": "con"}, "eo3Q5AjHJz5kp1EbdALwh": {"text": "ustedes"}, "eoYtISVZl3mdwoE_HW-Mv": {"text": "guitarra"}, "et1KiL5-zob_EcGlj7tLN": {"text": "despues"}, "f2dl12fMZbRdQ7STpcTdk": {"text": "fútbol"}, "fF3ijeQzetfSn6EGcs1yY": {"text": "cerezas"}, "fL_4POdbPVL9-lvQVWSqY": {"text": "avión de juguete"}, "fNAlqbgrpirQZO_LhrkXY": {"text": "primavera"}, "fNv4Nb6Vafxk0JxXr-iDo": {"text": "investigar"}, "fUUj_4pKPflmJlxZfk0cX": {"text": "discoteca"}, "ff7ES190q1dmFYZ7lo6x0": {"text": "pan blanco"}, "fjCOcN-PKP6F07IZcI71X": {"text": "plaza"}, "fkNwVm56PSe-qh-QoM0vm": {"text": "allá"}, "fk_z_HrvcUh8XIq8D6gQP": {"text": "nueces"}, "g1Cj6HW8kg8yPE1XX9pxa": {"text": "desde"}, "g1TLUpuQX2Zs1ob9gqYui": {"text": "gorro"}, "g2MhHawoIC9oFNEv5_w63": {"text": "vida"}, "g2sQSxCcoZuKJ3TabK6oT": {"text": "vino"}, "g75y4E53ViakV-s5UfnIF": {"text": "equipaje"}, "gFEnqFhYoXF7QN-n0ONad": {"text": "montaña"}, "gYrIz3R13-BC_pYcvQ9BL": {"text": "invierno"}, "gaem1LHTtfQdnnqYi-sOm": {"text": "billetera"}, "gff2FqDlgXknRld7YMLWl": {"text": "entero"}, "gsU8pE9ozhR73xS2icwJ0": {"text": "libro"}, "gvPwrzDSSEPwcxY878T_c": {"text": "gato"}, "gzCjycNS8Cf0vNlo1klji": {"text": "molesto"}, "gzb-RNDLMNkgk9wnPILJi": {"text": "abuela"}, "hAZhogJSH3bL1iL237N8J": {"text": "pochoclos"}, "hDvpMlPw-chcuxEisBJTl": {"text": "castañas"}, "hKJhXxultsxm0TJl1P8-L": {"text": "gracias"}, "hOyjT1JgOYB-mGLFMaNJR": {"text": "dolor de pecho"}, "hT3Lrjn5-q7YIM1loG4MN": {"text": "altavoz"}, "hUYfE_vmNBT_7E60YZsSu": {"text": "pintura"}, "hWWOw1gWjWwN7wQJkHrTu": {"text": "tour"}, "hXgGhazQ_nA5uqpRD6Qwq": {"text": "ganar"}, "hmhAUgqvGp7nc1w25sRSx": {"text": "esperar"}, "hwzwfMyJsvB42F_QWQWyi": {"text": "zumo de uva"}, "hyUaYltGVJU-wRrAjhhPa": {"text": "cantante"}, "i0wB--S4sdL8Q4H9b93UY": {"text": "ácido"}, "i2mlV3zGS6nrH2l6N2BlZ": {"text": "trompeta"}, "iAqItRUQL_YpbMn2pgjsA": {"text": "pizzería"}, "ibtmTEP3QGDY8TyVLteuX": {"text": "blando"}, "ifd0M0pAlFm7aPt1A0ze_": {"text": "amar"}, "iiA1u1JKRmhe2jWVE_W79": {"text": "amigos"}, "iimGxVoFWlq_THThR3vmF": {"text": "noticias"}, "ijn-QwQuTxRFFVe-7WlSX": {"text": "picazón"}, "iowxE4MxcV6PR2Uhtvxqs": {"text": "hospital"}, "irbOv2dHA7G969dnJMfJn": {"text": "cuaderno"}, "islCzqFq1SYrZAh63dLhQ": {"text": "huevo frito"}, "j5xZZev5nTNa-p088Oqnp": {"text": "besar"}, "jBqD3qhhcrioLlCU-xq5b": {"text": "instrumentos musicales"}, "jOALQbfxdXmJVyY6P5gZG": {"text": "damasco"}, "jTEb3A5ZEKEy2ojuq2vO_": {"text": "hueso"}, "jeO9YZ22LfSObUNhQDRAz": {"text": "ventana"}, "jfly9fZ3x1da4SGCCNcV2": {"text": "bufanda"}, "jfvreGZv-e8rD4-01wZ5H": {"text": "venda"}, "jhJ2TOfdaRAcVeHGOjwua": {"text": "leche"}, "jmzg4EiC7JEHwe9gNP3C3": {"text": "arroz"}, "jpKPg3hn6_GO1HSkeLNGz": {"text": "niña"}, "jprAsdXWGQKPlUWwgBBot": {"text": "película"}, "jtKc2q2n5an342ZkiMB9R": {"text": "higiene personal"}, "k-iDOTk5uO7ZK5OB3v8It": {"text": "viejo"}, "k41gkf6A_bDtQAJDOrWpP": {"text": "pasta de dientes"}, "k7dZhQtwDPFlOk1iPjEOz": {"text": "subir volumen"}, "k8tJx6PikRcnVuZEqrXRM": {"text": "viajar"}, "k9ZpWM4oRb1q20c0qWCsg": {"text": "abrigo"}, "kDzHKO8eIwNsyKWDw7M0c": {"text": "uva"}, "kIn8SeGURyvu49EsRqDs7": {"text": "pijama"}, "kN85Lb_C4dLnww7sz1afK": {"text": "café"}, "kaiWPbXxjHXlqcpBaBp4l": {"text": "viajar"}, "khUUL_1JQGngApqBRDh_q": {"text": "arreglado"}, "kpghvJtujlt4vPI2N6vsg": {"text": "o"}, "kxuGlfYjS6puO2xD1QvxO": {"text": "vamos"}, "lKA4b7I3iFkqNzPcAXyBc": {"text": "cocinero"}, "lKMW_xTZzCrCHRcGp-Z-n": {"text": "galleta"}, "lR84gCk8OM-oYoLAV7tar": {"text": "timbre"}, "lXH68vGIuZdfA8xVrS8iw": {"text": "mucho"}, "l_ncJLRdVGBzzQc9yqBqs": {"text": "banana"}, "lrUuPKco_O8FXDuclzpKE": {"text": "necesitar"}, "m0434KkjeTv8SGN7WxR2C": {"text": "negro"}, "m0Fkio76HZHS2HguPOTn5": {"text": "seis"}, "m17b6MazSk6M4gb51_cCy": {"text": "pulmones"}, "m39xTdgaenoi4mWGEa-Ew": {"text": "plato"}, "m3qTT8tiGZQheKIWREzMT": {"text": "ir a"}, "mC9Nb7zVdEUpjEBODw_gL": {"text": "vos"}, "mFfylZ8yoLvtkVSDTlVEN": {"text": "pomada"}, "mJqzbxYeIDQciPkeHA1Ao": {"text": "cuchillo"}, "mK4AXXhoIVirBz5dr_xLA": {"text": "pavo"}, "mRK--C5Q1aGe8MMPJJLYi": {"text": "preocupado"}, "mTklFAI-FVVLsMKoASZ7T": {"text": "desconocido"}, "mWXxPPvhSHf9hyb-VyuZH": {"text": "e"}, "mZFwH8xY_OeVDWCdvPZBy": {"text": "pie"}, "miPmA2tOQiLxOW7D_V_x6": {"text": "cubos"}, "ms97ZsgQOvD-Z8qpSW4oN": {"text": "¿quiénes?"}, "mx6dmRLXA_lkN1QlP71vq": {"text": "todas"}, "n5bZClAB6jXAZnwxIwH-1": {"text": "tostada"}, "nK7DRpxalLBHL9OnRjSim": {"text": "frambuesa"}, "nMQUtS-kFHViOKyop1FdS": {"text": "vincha"}, "nQSk6_KCEVdO7oC_uxLXN": {"text": "oreja"}, "nQdbkRVcwpQB_hFNPbe6M": {"text": "caballo"}, "nUg2M7p5sUPlGdbBev2-G": {"text": "tobillos"}, "nm6e_s01gWHzdVj25BHyq": {"text": "¡qué lindo!"}, "nnTJQMJWfd2nuTSlFNEOy": {"text": "mío"}, "ntzBlFkDMTKEUHoGNc65u": {"text": "baño"}, "o0oxaoUFpOLiGsoQBlalI": {"text": "torta"}, "oAxNCJufVUqZMyWRGdZl9": {"text": "tuyo"}, "oEHzYcfxDGGcsL-deud1j": {"text": "snack"}, "oEyUWrQj1iYUnlEUdQQ5Z": {"text": "flauta"}, "oO21zLMEtHEakvnuTohLu": {"text": "¡qué divertido!"}, "oOkD8Wmvb4t9I2EWqT1Nr": {"text": "amargo"}, "oSBFO8Ka0PN4bgX0QuWxL": {"text": "viajar en auto"}, "oYwoiRDWlIjSTbYdC2vG6": {"text": "falda"}, "oa-MShota2L8n2pU8hIsm": {"text": "jugar"}, "okr5oAG2U8Er1XwQ8XbWD": {"text": "grande"}, "oqQWeoWBr5N0LrPGY62Og": {"text": "senos"}, "otTWzTaTAmweNCozT8tn9": {"text": "alergia"}, "p1qK47wwLwF8S0Fy8-2Mt": {"text": "mano"}, "pHBnmCFpM7oZf0O78CBIz": {"text": "golosina"}, "pM-bC77hbj-w44A0HFRDZ": {"text": "sonarme la nariz"}, "p_XyUXRmeUk_bdjRTMtkz": {"text": "revistas"}, "p_qpVEd677b2Bk56yhvj6": {"text": "jardín"}, "paPpjw1XVC9-6xcueJsrY": {"text": "todos"}, "pgPlWKk-oww2fua5zYuue": {"text": "mono"}, "phZ4F4uzi1TrhjeDMuMsn": {"text": "almohada"}, "pkuppr1jMH7SMpa2hrIWQ": {"text": "zumo de durazno"}, "pliNY9oMQh1iSidkEhhDO": {"text": "abrazar"}, "pptyFMhLrbC6lN6zmc7D0": {"text": "comedor"}, "ptQZXjMQyXWycUD1kAkQo": {"text": "cuento"}, "pv8eYkxczIevQqEGwDz6V": {"text": "mochila"}, "pvXSy-5M4i8kysUppvdME": {"text": "que"}, "pwltOTDn2OyABTlD4-27W": {"text": "verduras"}, "px0jKQDj7r9pOYs4ZrvcT": {"text": "tomate"}, "q22wRFF21EigV8YzQ_MfV": {"text": "¿me ayudas?"}, "q6F-qJ7mTxvwa43F6vwun": {"text": "escondidas"}, "q7Pz4UqqZUlXeFfXrwXDR": {"text": "enjuagar"}, "qA4v2JWQU0zzBBZgvW7Vt": {"text": "temblores"}, "qOsbXyvBTMDAwvvnI0iFn": {"text": "pequeño"}, "qU5IvFLD8d16iIHSs_9TM": {"text": "cebolla"}, "qWhpDTMd8eAEoq7yTKc57": {"text": "ropa interior"}, "qYA2U_BFOZtFLClxuCIBJ": {"text": "dolor de muela"}, "qeJdrxKIIcUctIjo8wWhc": {"text": "agudo"}, "qn-7ERrcZxJTqfW6hwNs8": {"text": "correr"}, "qsA1zm1DOlItK7DCWzAw8": {"text": "aburrido"}, "qscoBbrWu7tQbpNj9XUPt": {"text": "papel higiénico"}, "quE_RA9abVvtG-Fo4Jx8f": {"text": "diez"}, "qy3c7gvRU7shWuJYr1kBk": {"text": "bebida"}, "r7eJgCF_b_ktkztv4-oda": {"text": "medias"}, "r808IO3I6j3os_uix6O63": {"text": "juegos de mesa"}, "r9qUBQwgY8eycnU2OVey0": {"text": "comer un sandwich"}, "rBwDn3PcJGqytqnOZTJMV": {"text": "taxi"}, "rMFGfzFobfGsH3_qrLHXU": {"text": "pescaíto"}, "rU9cpWF0I4wnJjzTXpGtO": {"text": "hoy"}, "rgyV6CvFe98OGnWut6QCZ": {"text": "turista"}, "rlGO5jGKPL1vW-VF4nRqZ": {"text": "entrada"}, "rnjJyPTabH_Xpmy4Z4O3U": {"text": "celebrar"}, "rtHwq5WN9KElX3V3SKBmS": {"text": "papas fritas"}, "rwyX2YemNEx_Mh64IArDQ": {"text": "oscuro"}, "rxdfuk6egO7VmZEB3JrUN": {"text": "la"}, "ry_jOegpMf4nB3spGf4d2": {"text": "me gusta"}, "s0BXoyn7AqUAlZ9BOHY6S": {"text": "tríste"}, "sAsTkky29uEVC9vo3Ofbo": {"text": "brazo"}, "sDKIldL3tit328Joneo_7": {"text": "vaso"}, "sFNUgvnglgrm6cbYiM0di": {"text": "¿cuándo?"}, "sP6uvKmY5kA_yuYR8H21c": {"text": "halloween"}, "sPtazVgymXESdS-BcHqU_": {"text": "pollería"}, "sSTGRl6DpYGZXp8vtTNbm": {"text": "comprar"}, "sbv5HLPUR6gHo-EJR2S7S": {"text": "camello"}, "sc0hr3jQ80yXRFDlAn56V": {"text": "cansancio"}, "sixdpB8hTOhlUr4loz3RB": {"text": "muñeca"}, "sjGytpiPjwqJfPaRUJ-Iw": {"text": "miércoles"}, "sysOciGqtL7y4ULuyYVc-": {"text": "canal de cocina"}, "t-w8e69GwxLyfxlWwHk9f": {"text": "mermelada"}, "t34TbvjJ3zG2jcgJaCeHa": {"text": "tocar"}, "tGyUfSljuc7A5Do5B9GuN": {"text": "sweater"}, "tQwMPLvqAMAstcqvnOERE": {"text": "gris"}, "tWxC4hR6di5zQC-Hujlev": {"text": "bajar volumen"}, "tYwEpd2EOtH8wEUr-jwHk": {"text": "caro"}, "tw1doIY-jFPofZjlPFj4z": {"text": "¿cómo te llamas?"}, "txj22hip0CE9qp_z-daIK": {"text": "nebulizador"}, "u1nIt_oFH426g1IVhlYk5": {"text": "sediento"}, "u2e4Zh8qwJF7zKkohQ8df": {"text": "goma de borrar"}, "u3BufiTZTK6AylGh80ZFd": {"text": "ella"}, "u8HfFvMPkogdWk-URj9hv": {"text": "escribir"}, "uDg7Yy86PlwsAd-U96vJR": {"text": "arriba"}, "uFoytOG4qsXzBk979t63y": {"text": "limpio"}, "uMhOF9ZvWnjW-Zrjbjfhs": {"text": "bajar"}, "uOA82KFAVtjoYRTuYFgpr": {"text": "postre"}, "uPL5NMeXTmD1iU6ZoiROu": {"text": "pájaro"}, "uYElWOlSOSoQap-d5gsYF": {"text": "chocolate"}, "uZRwbLa1lEG7ol0UJKRBj": {"text": "viejo"}, "ubP5GM7_0vPkRc6zbD9Ez": {"text": "antiácido"}, "uiVc5R86QCZkhraEFlrNz": {"text": "museo"}, "ujyHgmlPIs7UdtndbYd8S": {"text": "amistad"}, "upWXctTSKBtFNSXnXDK_u": {"text": "frutas"}, "uzSwgQNnV8ZrjxpN5Bz_a": {"text": "difícil"}, "v-E2GE1DpCkNAxsfA0f4M": {"text": "goma"}, "vHzfvEgIkQ0e73ryfWP2F": {"text": "ordenar"}, "vKGLQIas9RdBnPGsaYtr2": {"text": "barrilete"}, "vOgqHjpHgrUGERIHtVqDe": {"text": "basura"}, "vPicdKLrhT2wmAAPPukKP": {"text": "rápido"}, "vPnmrsRou1ihosdVXS_Op": {"text": "zapatillas"}, "vZ9JaTnoj8C0ILYxMNB73": {"text": "calabaza"}, "vaYJPAsTRvslo2qFOJt60": {"text": "espalda"}, "vazatQ7CrYJFsorVDC5AC": {"text": "león"}, "viAHJeLRr_6j9dEi5klj_": {"text": "amarillo"}, "vlh1Pa6eA0ZrBs3vHzWH7": {"text": "oso"}, "vmb_RMIB20QND6VcS0deY": {"text": "barriga"}, "vq3T-UQGTjX3Z9TlEF12e": {"text": "mayonesa"}, "vy-O5Zc5kxY8d-7RROvQI": {"text": "jamón"}, "w4cVxbBDZjeNyHwpBARHQ": {"text": "hombro"}, "wBLnDZStKj8YLkg2pTCfh": {"text": "sentir"}, "wCGb6D4xSVr4UeKXzGIlP": {"text": "disfraces"}, "wcpXeLMBRusfqfrz9s4mF": {"text": "puré"}, "whHwNRVnqeM7BMx6nppiW": {"text": "tigre"}, "wkrNPLGWTqMIy4PJRW9QR": {"text": "en"}, "wnfSUkF8-tQiRTVou1_pd": {"text": "frío"}, "x3PNiU1NIeQ3zQa31C8WX": {"text": "pañal"}, "xGsyYCjDzQugVzSaK8CuA": {"text": "duro"}, "xIgPo3N-aKXhVcjultMiY": {"text": "factura"}, "xPUYlxRxgFVn1FHQFz6Ic": {"text": "secar"}, "xQblStUfyBGO27j15Sda3": {"text": "pato"}, "xT4BPNmF-5WAQLfs3cUpS": {"text": "enamorado"}, "xXtjQktuAq1bmxTc0HSQT": {"text": "gaseosa"}, "xbPnUL4qxvm30VFYNphh-": {"text": "tíos"}, "xiaTdHGInqfm4rD6XzSeZ": {"text": "encender"}, "xnPF8fvkC1TvgETI1JcC9": {"text": "órganos"}, "xqGzZJIHBeVfSzRfm3rmg": {"text": "uno"}, "xxr0MRGYRmmoNC_gsD9uy": {"text": "pasaporte"}, "y0SViQxW8Y-yiX1Z7gXWt": {"text": "superhéroe"}, "y5W21CKOkLWnYJo1OC700": {"text": "tos"}, "yJoivIPHOm1Y1lj-hGN1J": {"text": "dormir"}, "yNag8CK0wV_iRMnFznsXk": {"text": "balón"}, "yR9FTtOimFwZG5g5tgpRk": {"text": "visita"}, "y_5OURnKxFcv4UiMKntUi": {"text": "y"}, "yihsjW9ON0Fr9Yy4ZlP9c": {"text": "axila"}, "yk2wDVqHEKKwupgm87OJ2": {"text": "nalgas"}, "yo00Ci8bSRFYPU6HxGVwX": {"text": "cantar"}, "yqlmoVGItXqaeazw3M3eg": {"text": "sillón"}, "yvtvSsBLhabkcpeYGbxQr": {"text": "bota"}, "yxa6QVSrmWUKH2PZHKaVl": {"text": "lechuga"}, "zANp2EnhT6n0Jcl1Xra6K": {"text": "bailar"}, "zAmesi1FcIWLXE3WVa9WS": {"text": "antialérgico"}, "zRTTg5x_P1E8Z3CU-oWXa": {"text": "cualquiera"}, "zcibOHpRbSmz1hVNSjPTj": {"text": "tenedor"}, "zdFC3vpgjcyUWB9a4ghRW": {"text": "descripción"}, "zi_wcT10fxgn72ZJhVx18": {"text": "vestido"}, "zm_6R89hr4wjuVkifiYrk": {"text": "despeinado"}, "zrR1DbO_szgKvxLyrZquw": {"text": "calefacción"}, "zw-o9pDectP5bxFnUjrJO": {"text": "cerdo"}, "zxhRDSHXtV63Sp3c2fjrI": {"text": "aduana"}, "-k6dUC6thWPyULq8MVSe6": {"text": "PRONOMBRES"}, "0geft4arn_A8kL-rfUPYc": {"text": "PERSONAS"}, "1aM3sTxyb8yLSWtkn2MoO": {"text": "INSTRUMENTOS MUSICALES"}, "384rVetrrLX4x4pJ0Y0Na": {"text": "INTERACCIONES SOCIALES"}, "4e6iVOPLAjnM6wCMUm5P4": {"text": "DESAYUNO Y MERIENDA"}, "6vmRBH4shBk3UQEUM6APX": {"text": "CINE Y PELÍCULAS"}, "7Jm3bDhPInSlwhdy20dKF": {"text": "CLASE DE ARTE"}, "7ngCuvmAnM_7ygpFQgLpk": {"text": "COLORES"}, "7w5ACMFdOCTkBrS911MA1": {"text": "ADJETIVOS Y ADVERBIOS"}, "8FPdnkMzOIBVTW5-TQxWX": {"text": "PERSONAJES"}, "8t8CAggTj3HuznkKhfXle": {"text": "LIBRO DEL RESTAURANTE"}, "9JRv4X68pAtwsFT3Ss0iJ": {"text": "LIBRO DE NATACIÓN"}, "ByBvBUS7dcXldjzZOVFFP": {"text": "CUERPO"}, "C7ClEHF5-Mcico4FvRxEV": {"text": "PREPOSICIONES"}, "GD9YHeLktSsdZQvcoua6x": {"text": "LIBRO DE LA CARNICERÍA"}, "HzPl-HvsrXL_QkGT38Ohd": {"text": "LIBRO DE VERDULERÍA"}, "JKEk5TYykBK6ZeYND3Ron": {"text": "CONJUNCIONES"}, "LWyfHr8Oui5HIShtZ_huo": {"text": "FRUTAS"}, "PYTnUqCLwAbngR2Ozroc2": {"text": "ACCIONES"}, "QQszyYRLL-otCQtRfbLzm": {"text": "TIEMPO"}, "V6K3TniptOApMMGa8TspR": {"text": "TODO"}, "VhfGFlHDcPor996rCzoK9": {"text": "CELEBRACIONES"}, "WZYuZd331Hm5gHXJtUmBN": {"text": "ANIMALES"}, "ZgZoyOg5K-LscXdfl6kQG": {"text": "CLASE DE MÚSICA"}, "_Cw7FcJSYiterkLSDJH8V": {"text": "CASA"}, "ah257x5jssDmLIOrcSGn6": {"text": "NÚMEROS"}, "berI6X2_pAVCNOrcHAL6y": {"text": "SENTIMIENTOS"}, "ce2z_EeEG2nH0ZS4KVAkA": {"text": "COLEGIO"}, "dQXaeM3Uul1yEvRwJ4w9t": {"text": "VESTIMENTA"}, "ejXQZAiYjrcSFGXb1pz7M": {"text": "TRANSPORTE"}, "gybgILOLxmIVfeQtb1f94": {"text": "LIBRO DE HIGIENE"}, "iHS1HpUBBadzgmbum_bdD": {"text": "PROFESIONES Y OFICIOS"}, "jatDsecioVAxRph-WOg4f": {"text": "LIBRO DE LA FARMACIA"}, "puOOrKWbYzH0B_8uGkxYX": {"text": "LIBRO DE VIAJE"}, "puda9fUGjqvm9oSM6CpTk": {"text": "ALIMENTOS"}, "rH7zhJzNVIcEIRyvaYLoi": {"text": "DEPORTES"}, "uv4tWMRHfewaEQ_pH0dnV": {"text": "LIBRO DE LA SALUD"}, "wAhDHMrZ850dHTwgAXrMY": {"text": "CONCEPTOS"}, "xjfPlDs-AcFV9LCyY-v9j": {"text": "JUEGOS Y JUGUETES"}, "y545pM8pvB3WgukIac6NT": {"text": "LUGARES"}, "zwf7qmSEi7PBwsNaqciA-": {"text": "LIBRO DEL ALMACÉN"}} \ No newline at end of file diff --git a/assets/languages/es_US.json b/assets/languages/es_US.json new file mode 100644 index 00000000..6e97ae14 --- /dev/null +++ b/assets/languages/es_US.json @@ -0,0 +1 @@ +{"-2UbAou9ydr8XeN-jtIz4": {"text": "limpiar"}, "-GL2iAgykP10Ae3AKsVOX": {"text": "sal"}, "-LE2iv3Pwr5KuIyM5bYb3": {"text": "bien"}, "-LwAKwgCdVkzwM579zRMo": {"text": "más"}, "-aePI8WknXpxEpz19Lu48": {"text": "suyos"}, "-msU3yor4qJYQHJtWrdk8": {"text": "pastas"}, "00AkNJ4YLpbRD_mLmQjtp": {"text": "almuerzo"}, "0IrLGI8Ebm8rcS3ymUXqS": {"text": "hambre"}, "0THELgiQ7rvA-orESXJfV": {"text": "avión"}, "0Vkmy6BZcJn3pFurEevL9": {"text": "estudiar"}, "0Z7uFXpp-XRXmqM8ILhIC": {"text": "poco"}, "0_SK41wNOk6mw2qX_eHXM": {"text": "cine"}, "0cdYDZ5HPaTmqTTN0_Ee8": {"text": "suerte"}, "0fHziRVxg0oNDp5pyiI8M": {"text": "permiso"}, "0fcYcD_r0jNWXTTAx8Ph7": {"text": "aeropuerto"}, "0gAyTD6sImo0jpD_bYGVv": {"text": "jueves"}, "0huLn-H32Cbwba28IZ3tc": {"text": "burbujas"}, "0jpMJu8isUmOZKxhZ_yaj": {"text": "equipo"}, "0pFtmDZdlnLrUkT_XZDXQ": {"text": "antes"}, "0qoQs8WyLVONnu3_eBGfD": {"text": "dolor de cabeza"}, "0v5fqIp8GmXsIHO0SPhtt": {"text": "dale"}, "0vttFf3nAGDW6g5wVStcH": {"text": "disculpa"}, "1-VwcvzNfvrwDWRGxRPre": {"text": "ni"}, "10X4OKR5xmNhSj86sbyE_": {"text": "salchichas"}, "14aCIW665UZtuwNsKKV5s": {"text": "cartuchera"}, "17AkRFlfC_koV-lywmDE8": {"text": "pantalones cortos"}, "1B1WmC-V0PglDeRAeINcT": {"text": "mirar"}, "1DjW-XvWN7iOqoJPRSWwY": {"text": "mal"}, "1IjenNwPwsMIWZ4aYBk8S": {"text": "partido"}, "1Ph13Z_Ya6p-q0WA7pSl3": {"text": "pájaro"}, "1QEfLU_S7TM0iMr9VZVtP": {"text": "ronda"}, "1Rv9-SSJjHptwvzqLbdbx": {"text": "divertido"}, "1WJZO-pUkTaQvyxz41iB-": {"text": "picado"}, "1YOlJCovdcnnqVihqHVmq": {"text": "acá"}, "1b71P9YjaNWnX8AWjstqG": {"text": "remera"}, "1mS8kgJIod1cyUFH-msnM": {"text": "estación"}, "1mU2ZosZXSJrxkh1NmxJT": {"text": "izquierda"}, "1nhsReHG-f-bW-xaZBsxY": {"text": "abajo"}, "1pb6S-RR_3zdCq77YFiZ-": {"text": "¡qué mal!"}, "1zU7kolOKsHP9-oomQW1Q": {"text": "rey"}, "27GbVOZ-szdnzsy92oY-X": {"text": "manteca"}, "2CgcUkvJUskv982FvG54A": {"text": "dinero"}, "2HkB0WZYP7cvWLD39GMQj": {"text": "duchar"}, "2KO0BFtB4B6fu1feuAZLt": {"text": "verbos"}, "2RZTRMX56BFLrW7tLJ3Hy": {"text": "mismo"}, "2Vc2H462cutVtUC-5omJk": {"text": "pocos"}, "2dwtZO2wCm520GPD1i6dl": {"text": "dolor de garganta"}, "2t_eq1JmgHa0R3eu8LMmI": {"text": "ventilador"}, "2u2-AFuI245I7bZ6tsSPh": {"text": "¿quién?"}, "2y9pxVOBQ2tMdPHcsqQb8": {"text": "martes"}, "3-ueUrnwmIIj0BMP8_Ntb": {"text": "uña"}, "32PnZjlnQbTJo4nL9YJYe": {"text": "feliz"}, "3932Zm0xgk1hKB2hhBAUa": {"text": "autobús"}, "3KbwCHGooNLySWOBlFFuG": {"text": "cocinita"}, "3KgKNNnuYMrysEDs3Pu4Z": {"text": "subtítulo"}, "3VEnVjaGFCImBAZ3wEChu": {"text": "ropa"}, "3arbCGI6fMOWALLanZcg3": {"text": "capuchino"}, "3dtvYLjbl5oDyhZO9eFRY": {"text": "ellos"}, "3mwcdenOurU_e59ChLqb0": {"text": "fuera"}, "3w62N9b7Cvb6JMjB9Wphi": {"text": "beber"}, "40q0NJ6vsziJDNFBqho7Y": {"text": "dentro"}, "4A_FNkGH1EDu0oabPurrL": {"text": "cereales"}, "4J1bWl6BbbEdZsRGsgYH2": {"text": "queso"}, "4X7OXm35OSHoSlPxGUi_f": {"text": "mueble"}, "4bHGIoQmDN8LptpdNN4v6": {"text": "vacaciones"}, "4f1vqDoAvUu2XYk_JlQdC": {"text": "siete"}, "4rctwNiN4UaU9lqU48MHG": {"text": "computadora"}, "4rzonBodQXfs77gALnAP_": {"text": "cerveza"}, "50wJdR0-3YLnv9y_2Gx_e": {"text": "saltar"}, "54BVjn2seJWdBNGI20-yJ": {"text": "computadora"}, "54taab8z9ziXt0IqXHkV9": {"text": "dedos"}, "5L5UzBHOzuHRoO-jyPuEx": {"text": "ciudad"}, "5LYjhk-N87Ov9NrQcGbLQ": {"text": "aceite"}, "5Tdy0Gu9SiLsPfWwd-Y2E": {"text": "lindo"}, "5VBtwEswIjrv1zbXP-oFn": {"text": "sopa"}, "5W5_sCAyGTkVzguCEg1d1": {"text": "jugo"}, "5dvq344JstkxUpHszaPfp": {"text": "delfín"}, "5gPT9lrNgpRkF07lP6zOq": {"text": "zumo de manzana"}, "5i3kSsCKF7Oa9iJQvXiTe": {"text": "más o menos"}, "5kjlzqb9Rf3zzqZROaZ9p": {"text": "perder"}, "5mGrGHzdw_vCwYCRNPcPw": {"text": "pasear"}, "5vxTXbPl4Y0yezGu7p1f6": {"text": "hacer"}, "6KicPX6y_u2i6tPBZAtvA": {"text": "lavar"}, "6jLkKc9OL5btNOmjJem6S": {"text": "poner"}, "6lYN4qSZx3_tKDClp4Iyr": {"text": "entre"}, "6nhNeVjDfDi-GmreaqfVo": {"text": "nublado"}, "6rcOXG6yxpzHLzMJ9IayI": {"text": "cerrar"}, "6t2sPdapSNJrOziDozTWW": {"text": "vaca"}, "71l2at-8480bvijxn3uBl": {"text": "durante"}, "75gujwNXJdAiNmK6Ffhia": {"text": "zumo"}, "79xBF6cKgKeD4GeBPe_Ds": {"text": "bolsa"}, "7EsVGfapPc_38mHCBy3C3": {"text": "enamorado"}, "7Hz61-WzV62FHsedOwz6q": {"text": "flan"}, "7Q4Zc0cenSF5U4eKyje1f": {"text": "hacia"}, "7Q9sNljseWjwSPW4in1ga": {"text": "recepción"}, "7VL_MgnLDY6hi8sbvcGIg": {"text": "silencio"}, "7WxUVoVQfQOzARU2bf6HP": {"text": "casa"}, "7iAXKVm22uMgr6aqZ1rr7": {"text": "abuelo"}, "8-4M30dTtmuUJus9MtGqV": {"text": "moco"}, "81UJI7xOa5l9mVceqkIP5": {"text": "tener frío"}, "82LicIQc3K2xCTEt-iMpu": {"text": "caracol"}, "86gNdF6aTepa0Y9zkD1VQ": {"text": "campo"}, "8FFwIw7rJri79BITZBUzm": {"text": "hotel"}, "8KlFB3an1mzdQd6-LGCCE": {"text": "merienda"}, "8LddDqylw-51wHhx9_Qad": {"text": "libro"}, "8MV4ZFthtUeoxLAIbqGTc": {"text": "carne"}, "8cOIYr-hcK54qWpuT-41e": {"text": "cuento"}, "8fGingRAd8idw4qcxyZ-Q": {"text": "vergüenza"}, "8iFdjRTQU7ONGnigRTlm8": {"text": "¿cuánto sale?"}, "8vR0HYniXtrrQqqSIN_JQ": {"text": "familia"}, "904w9Je6oDwGXUCIcrUZX": {"text": "lengua"}, "93YmZA7VfAT7TTNTsDE1W": {"text": "serie"}, "93hsW10TmX3Vcq_4IvcZ0": {"text": "blanco"}, "93tHieC_CgZqN998y5gAv": {"text": "chuleta"}, "97nIv-aoc51T8kKTZV5cM": {"text": "saliva"}, "9EqfwMNtATh1fwMhyn_B1": {"text": "buena"}, "9FiWvg197C-Riid-DVysN": {"text": "claro"}, "9GqE148SFZqMIft4evAk2": {"text": "comer"}, "9MzeUcz1nRqleTkmS_-g2": {"text": "barco"}, "9QyJdpUn0f6g7FxWs5qpO": {"text": "cortar"}, "9U8MzceIsqKhG86oNx9zV": {"text": "coche"}, "9UwpyOnOBoqr4mX3Juqm2": {"text": "buenas tardes"}, "9ZnzbKMDwGEwC3hXOhXFe": {"text": "pastillas"}, "9dvSIpeXa2_12Jip6noJP": {"text": "deportista"}, "9kgRI3KlOIVSuylKffW9g": {"text": "colores"}, "9lS0mNuKIS0olyDwoIJBR": {"text": "médico"}, "9mLx-YMK81AflitELQFqk": {"text": "papel"}, "9s5zV3_oGyDx_NEvsKCxX": {"text": "violín"}, "9wE9Py6ztyqDrtaypsltA": {"text": "naranja"}, "AOp6VGyjYIV0Ym9d0basJ": {"text": "dibujar"}, "APXF-lEplPOloppSeIjAY": {"text": "menos"}, "AQKGKdoX5CYycZ2YqBZVW": {"text": "barato"}, "AT_rDWsr6xRBgrvgw9Zih": {"text": "nueve"}, "AWJXh6URGN0Vwm66i6IvL": {"text": "hola"}, "AeFbJQ0M9uTObAlKEX3zr": {"text": "pierna"}, "Akf0xlH8UJdXn8BJzPV2A": {"text": "radio"}, "B1845IfYfPMz2FWpVFIQv": {"text": "de"}, "BKmATW2uBk4pxnmOaARyq": {"text": "documentos"}, "BNjZz9MGLJEKZ4CZoTs2M": {"text": "ajedrez"}, "BQhqx1PuF94jwT0ySTlbJ": {"text": "comida"}, "BQm-YCPc0lfD1-mhecCTL": {"text": "yo"}, "Bebnh8-UWwtYLnK6p3fKi": {"text": "pan negro"}, "BjqWZnzLlxdOo4KEzZ46j": {"text": "ocho"}, "BqS7d4PMhGRqPYlZQzUbR": {"text": "puerta"}, "Bub9ZYygLcly15D7_wYks": {"text": "amigo"}, "ByrvXHEN9Mb8D--7MQAjM": {"text": "peluche"}, "C12mJ1W11fODI3pv1QOnx": {"text": "gelatina"}, "C29KJ8BTFavhj_R9UfnSv": {"text": "por"}, "C2bgADoxmINRnAiYxZHqd": {"text": "taxista"}, "CBTemIvgIN1UAtftkc3sz": {"text": "pegar"}, "CCWCtXdMuQBJRmaFOAlfQ": {"text": "navidad"}, "CY-IQvUehkaiGFCdKf9bf": {"text": "chorizo"}, "CYH_6DL9q1iLLetuWeR9A": {"text": "tener"}, "CZrETqLgQlvDkLHvw1t_w": {"text": "a"}, "C_JKGNCxOI5x_f2C4qAyZ": {"text": "maní"}, "CbO32RkDdf9aCucv6BnGS": {"text": "cabra"}, "ChBc7LjL8dgzZ6LUCAHGh": {"text": "por favor"}, "CkTiaqBY3jf86JRq636lt": {"text": "¿cuál?"}, "CsKZSNiJw5Q48b26Kskf-": {"text": "heroe"}, "CxFmyJYmy6gMRqP9U0cBP": {"text": "estoy perdido"}, "CyKtU9yC0Jy7Ypb4WFp6w": {"text": "perro"}, "D1gCni2jXpCvKZe4qCtQN": {"text": "peces"}, "D2tSkngqbQmdKLNhn9xWV": {"text": "globos"}, "D7dt_hFX5DScV_ssm1nKz": {"text": "pomelo"}, "D85FU-Wqr2u53tfTXAtHo": {"text": "patalear"}, "DAq2J_xXHsSCSNPp9qVsk": {"text": "oler"}, "DBd09yUlbkaYLsemjFXEs": {"text": "helado"}, "DG1RiDjDfwWRhpAiIpPqA": {"text": "vómito"}, "DSgrhLHauub-gBqMGwacO": {"text": "asustado"}, "DXb0FpjVM9q8LVl9vvSHn": {"text": "clases"}, "DXpjgLKTdx9eLLohVdmWM": {"text": "verdulería"}, "D_4Weq7iyi7GMEsgP0xy6": {"text": "té"}, "Djs1QsLNf8Q5LBIFV5zNC": {"text": "partituras"}, "DkeHJFtqAS005fYUrl1Xz": {"text": "pantalon"}, "Dm3yiKSB134LrjtW_KrO7": {"text": "buen día"}, "DqGa4gqd2ABDi45BT43x4": {"text": "princesa"}, "Dv9MSCRYbR4Q3K114wXki": {"text": "alto"}, "E-vUPARie8MmfgZwv3Omr": {"text": "gallo"}, "EM8VyonJ7WNdvmRyE3nhZ": {"text": "lento"}, "EO4O-s7oafi6QJdxTFNkd": {"text": "anticongestivo"}, "ETZNYbrG5wveDl6c9k2_k": {"text": "codo"}, "EUsNyf5bDdSLqvZKH1Ltx": {"text": "no entiendo"}, "EVmt43vDI3NHFfbbkqokF": {"text": "pizza"}, "Erg6LuA8IOQ5V8RTP3pPi": {"text": "abeja"}, "F4cGnA_QHsVKTjUE6MAu9": {"text": "mameluco"}, "F7kJ8VM31BWB4K4T4USzs": {"text": "maltrato físico"}, "F8roVYxKZi88UUGfOvTwl": {"text": "maestra"}, "F90bXbc0tz9nuzTT7SgqV": {"text": "cuatro"}, "FBPIabyaoCK-Y0BziQdji": {"text": "dolor de barriga"}, "FBTheEQmZZfJRiYjd_Np_": {"text": "interpretar"}, "FO77qpzyz28knodNtILCA": {"text": "tirar la cadena"}, "FTngK946O8S8bYc0g7vM2": {"text": "mamá"}, "FaVvbVzZivuxTwxJTPubK": {"text": "hermanos"}, "FfNU04I4mZ54gWcBXqo2c": {"text": "panceta"}, "FgTird367surh-vxXyAK6": {"text": "ticket"}, "FkC5DtSV81OvFMU99qZGg": {"text": "balón"}, "FnCBoLSE19WsbUypUKvFc": {"text": "hamburguesa"}, "Fogupb264IyCtbZ-Q2D6w": {"text": "borracho"}, "Fvm2C5NBq01tm0QK9d9QM": {"text": "hijos"}, "G09TvOzDSG5m3hTQD9Tej": {"text": "borrar"}, "G2i9LSK4A19237Zp1vXqF": {"text": "gordito"}, "G6KKVMvPDnjdD9TfBd-B9": {"text": "playa"}, "GAxX7EIz1TTLtMX08RRGr": {"text": "hamburguesería"}, "GJlUSznzEHCgoAOrVrkp9": {"text": "feliz"}, "GSEumxiyeVKRRiaY_c8HW": {"text": "crol"}, "GY_flM-6uR6X3L4AwsiwU": {"text": "para"}, "G_CRpzxWO5XdEMh01O1eJ": {"text": "aunque"}, "Gj7THa6XFHDfYL5H19lwj": {"text": "mañana"}, "Gm_qAGnL4OawmlYmTs7K5": {"text": "no veo"}, "GoJuWnn72TCXONXKtYHMm": {"text": "tren"}, "Gvmy--9DiUn_tkQYWeWhA": {"text": "canelones"}, "GxrDtsdGcLepdsQr6V9DT": {"text": "verde"}, "H2zMVtjvqi7aUtCypiVKr": {"text": "sentar"}, "H8Bsrr2NK9Q3WGbEp8PMe": {"text": "plateado"}, "H9SWPnWbR8qcZA-iu5Mz0": {"text": "dolor de Oido"}, "HBZNu6m3FELU9eg3OeLdx": {"text": "cortina"}, "HKfLJS8aCBtKuKJeSBQUW": {"text": "golpe"}, "HMPabuHqgtyiCmTLzg-rM": {"text": "entrar"}, "HQiQh4PPBvO1n-d7JGVj8": {"text": "nadie"}, "HTBNWax6FCSGXuboGsVUW": {"text": "salado"}, "HnuZA0UTlnuIfFAN7saxl": {"text": "conejo"}, "Hvb4JdDHX_vNMck_US2UN": {"text": "ensayar"}, "I5AJgba5GTdEjdpFB-LBf": {"text": "chocolatada"}, "IAdQsjTsbBUAMjlwW34cw": {"text": "me encantaría"}, "IEeIvawUD2GIAr1Wypr9i": {"text": "personas"}, "IF3R7tLVAkd4RbL8R07K9": {"text": "actor"}, "IM8OUKCzHwnjAQWPFgnn6": {"text": "lejos"}, "INxOSvKbBNOXwruIpuNho": {"text": "ombligo"}, "IO8uTb1K7ElENgp2ujZoK": {"text": "robusto"}, "IXRWmFmtqfnHQRcBf1Idl": {"text": "paloma"}, "IZbfYRzu2cxxDWdbmQeqw": {"text": "cabeza"}, "Ig1oypuwndODbmKh_NEXs": {"text": "traje de baño"}, "IsWUeiPnDEnzxePKclBNp": {"text": "feo"}, "J3qQMp0OMr5LC9ebfArxH": {"text": "ninguno"}, "J3rDL96c2zfBQzP45VRCp": {"text": "limón"}, "J4UUPR-WP0qo1y14bUVI-": {"text": "veterinario"}, "J7MmgugOu20UtMcMPj59r": {"text": "canción"}, "J7wLwBLVx4UANh_x5HdXd": {"text": "según"}, "JB9SIxWzxWFjrbmMuksrY": {"text": "reir"}, "JBIehRNmDbK2ALcRN0u9i": {"text": "gallo"}, "JBKQaBezKuSDaMsnbJMTB": {"text": "bar"}, "JBU2hMw9gbIy9-wGF4mjD": {"text": "pizarra"}, "JDbBWMB5No0pK6HvntLt4": {"text": "lavarme las manos"}, "JEDIYq1BDA23ac9TNhON-": {"text": "ayuda"}, "JFldbhjqxK3fD6D2K4HY4": {"text": "papá"}, "JGm4BL7HAfuxX_PGe6Jzk": {"text": "presente"}, "JQOpcZSCPGMOWZsN8w_yb": {"text": "¿qué hora es?"}, "JSFuEHlP-CFvuqvFKMumC": {"text": "autos de juguete"}, "JVtu9W3AumOwjUedwhUGE": {"text": "rehabilitación"}, "JZRBfIXBkeuobtDXbLt5t": {"text": "adiós"}, "JawnUo-pseWb3FDVMtxrQ": {"text": "yogur"}, "JblWXW8TKDCuYu2yTnFBA": {"text": "mesa"}, "Ji5OVFX-uNDewL8eX8Cin": {"text": "pensar"}, "Jjq8CM8JrYHIMziuQy-WN": {"text": "agenda"}, "JziaulL-lrAPGNVvwBPK9": {"text": "verano"}, "K382TlNZjdMLLpAhCCXLG": {"text": "almendras"}, "K6hd20tWZfwwlYYi7jctt": {"text": "rica"}, "K8cMIDL0ubQvWhhDtr65F": {"text": "llorar"}, "K8e2-KkvZfFOQaXnhR37x": {"text": "cansado"}, "KC18_sTEqKucPQ-iwEKYY": {"text": "lapiz"}, "KK_i8H9qTfDVYZkQGwd2v": {"text": "apagar"}, "KNH4sLRpVKtHXQa-0y84K": {"text": "nervioso"}, "KWYVDZiERE8jtRsL0faHH": {"text": "nadar"}, "KXHW4m6vXxQU-AEOR4pZ4": {"text": "balón de fútbol"}, "Khdk8mWpyxgLqfC-6lyT9": {"text": "burro"}, "KhyTKtiL4ZT4Z1saU1eJh": {"text": "escuchar música"}, "Kn9vE07FK1LrzoD_YxrJD": {"text": "metro"}, "KpLFOrpuhFKaIbBbFwVVu": {"text": "mariposa"}, "KrOPANVpdkBWdEZoUwxKf": {"text": "grave"}, "KvY6Taigm4Va_cVjXAfGR": {"text": "corto"}, "L0hfYADgzghRVsZLZHRxE": {"text": "bailarín"}, "L19r487_d3RqWXiNuh3gE": {"text": "¿qué color es?"}, "L6YLAEsbYcTq-ycQJTvt4": {"text": "pollo"}, "LAuEISciEf1Wc1j4fERz8": {"text": "año nuevo"}, "LDoi3cxodn_AVKSG-Bf_1": {"text": "ojos"}, "LEVKlDlJ0wHo5QEjCNAGa": {"text": "pegamento"}, "LEg8z-Q-ONLAAXd-aH_Hb": {"text": "bajo"}, "LNBTW0qQtHYQEHatkWGtc": {"text": "mercado"}, "LRIKzfm9ZsdNe1u7CUuW_": {"text": "¿cuántos?"}, "LRfh-4RAZTj7cnnDwBmqj": {"text": "flotador"}, "LU7IoUksATEBhd8PaHS1R": {"text": "sacar"}, "LaKT8VTw0_6rvordp5-R8": {"text": "rosa"}, "LiBr37yi-YBgQDx4unjyc": {"text": "dar"}, "LjTGOcyG7DkTs1lJqNr8w": {"text": "cabello"}, "LksmOMPPOMArbrFsscqOW": {"text": "música"}, "LmGq1AZs2a0x26r7E9GUj": {"text": "maestro"}, "LngEMJa_ihV8mB7afZX-h": {"text": "ellas"}, "LrDai7jXlGAdZ3e8ZQezj": {"text": "hacer pis"}, "M5q2CXmK0_WVaVUB_HJB3": {"text": "caliente"}, "MEqo2TROHyroK318sm84f": {"text": "pasta"}, "MKR-ukiUlJy4uuqO30UU6": {"text": "maltrato verbal"}, "MMzjhHID8HMqyPjii5o-h": {"text": "cocina"}, "MNCcHiImRS8tmvhBhzCKj": {"text": "ensalada"}, "MQHnvvU48NnEptP8a9w8C": {"text": "no me gusta"}, "MWIzTM6zhTWL1V-brLtBx": {"text": "cómodo"}, "MYqfOzKx2qMHop8GaHs0I": {"text": "verde Claro"}, "MiOe5_Djf-pE9V9aDZ_1G": {"text": "ananá"}, "MqQgYn5B0uV-DMORCBOmV": {"text": "triste"}, "Mw6WRebMAKWwXfAvDA7vu": {"text": "tener calor"}, "N2baGNTOapSaFDo1GURiW": {"text": "no escucho"}, "N7n4zQIkJZOhaYESk2GgH": {"text": "caer"}, "NFdUTit6Ff-4S7Nzf92U5": {"text": "estreñimiento"}, "NFgGqhEtl0HqipCGGEvwU": {"text": "peinarme"}, "NKQwWPAsVHwFBWuksqfns": {"text": "ducha"}, "NLi5ODIzyMAwr2HpDXACp": {"text": "nariz"}, "NQayjogCYiimP_0OxIfFj": {"text": "zapatos"}, "NVe4u7BTAVfLk3xkDqLnZ": {"text": "horno"}, "NVjfEut567uXpTaQUNI2i": {"text": "campera"}, "N_893wsadpGg3Ip5sEThe": {"text": "azul"}, "NaJxTPq9Ld8I4fwAltyEC": {"text": "maiz"}, "NjulpZ9x63ZqxtLMoRjkx": {"text": "prender la luz"}, "Njz8DrErsexBu8mAI6mnr": {"text": "pescado"}, "NmNouLLx13jzE27jliI_v": {"text": "diente"}, "NuhUikdCxP0NgsbO0wvAU": {"text": "hilera"}, "O-CLnVuXAUapOn6TbdhKx": {"text": "querer"}, "O450x4W3OOacvJIy4QicJ": {"text": "legumbre"}, "OHyrmD5US1rHEAEwLQaII": {"text": "animal"}, "OKXIGnLh-i1ydTNj450Q8": {"text": "reina"}, "OUcfOOReAfQroBKlBdDb-": {"text": "solución salina"}, "OWLDc7Hn3neBAf_V_N27n": {"text": "abrochar"}, "O_ZfCPZSxGMPT6orCt-O6": {"text": "cerdo"}, "OblxxVFC-LKPq-8oC9FpE": {"text": "sentimientos"}, "OdCdTUAlbN6kvsPjby_Bi": {"text": "deportes"}, "OeA63q6LpqGvXW-cJXEym": {"text": "jamón"}, "OeytAsSiEAWC10tXhxbTa": {"text": "personajes"}, "OhrHu-xLo8hcn5plWfoX4": {"text": "caro"}, "Om1Bvqu8nmGuNGwV8hndM": {"text": "bajo"}, "OvyFC1GHkvJZ0dAAF1QkY": {"text": "él"}, "OwHzJdOQTFOA8daCVRwm6": {"text": "pincel"}, "P5zdq4x58yp5TA_soKQEJ": {"text": "bicicleta"}, "PAlC0XSZNru3-LXtfvGjo": {"text": "hacer el amor"}, "PBqpK7LL1HQPwowPitrss": {"text": "leer"}, "PFAi3SdvH9vL7_Bg3MhCA": {"text": "semáforo"}, "PIBHv5VueBi-sf5qFCN_Y": {"text": "ante"}, "PIPQnVS2UiS7kGbucJP8l": {"text": "curar"}, "PLXxIPYyztaztLf4sPCst": {"text": "garganta"}, "PbtM3htZocZb8YifuPoY5": {"text": "cangrejo"}, "PfNLmlHKFT9d1w6IgeXbU": {"text": "control remoto"}, "Pl-M4bc6k2rdhu6FHEbkA": {"text": "patio"}, "PogTYrGfa2WNfBRuA8O4e": {"text": "malo"}, "PszHdOxMsS_tAzSrN52Wa": {"text": "plastilina"}, "Pw3GgPwp7fpDVC6wJjgPn": {"text": "subir"}, "Q6LQqdLcvNOiCFjC0DVo2": {"text": "tambor"}, "Q6nNH4AIoSeDHODC_Ip8O": {"text": "vecino"}, "Q9Ra0aJaQnOJQ1Kqdc43-": {"text": "bebé"}, "QCQRmsQY6AggjreY9Z0MF": {"text": "rechazar"}, "QGf1Tb1roL7HAXUSrRqRJ": {"text": "naranja"}, "QJhkOh48xapiTObEDQLB9": {"text": "piano"}, "QTkFHWp9KEDgfCjoQjBY2": {"text": "plurales"}, "QUTQLuD2Gv7fHh0V_O5tg": {"text": "avergonzado"}, "QVqSPPgA89whFTJ0HTphK": {"text": "abrir"}, "QZNQOaf0SdHDbx1otCmrH": {"text": "niño"}, "QcGJ9u_JqmrW0X47PXWH4": {"text": "despeinada"}, "QclUM2p3iexSjFZI8OU4-": {"text": "fiebre"}, "QeqA20MCXB-zNfuKIssMY": {"text": "lata de atún"}, "QllvOUe8utZrcBRGw_0vc": {"text": "curita"}, "QnlQ1HOEB9yNjuW3Dd6fc": {"text": "celebración"}, "Qo3Qn_nMe3E6EqNw0UdNZ": {"text": "soleado"}, "QohNih4wgqjnpWt3kSwtd": {"text": "entrenador"}, "QvaMxPy-3iixHAJFyIrN-": {"text": "sandwich"}, "R06chAQYswLtQK46OInW7": {"text": "leche y galletas"}, "R9ECa_HQRtpFrb59ebMTQ": {"text": "escuela"}, "RBCjBvNXQSZOOpg-5lBlK": {"text": "bueno"}, "RZfMOtjw0DoGHWaRfCEc4": {"text": "pantalón"}, "Ra2rxEEohwxRqDsW2AT3C": {"text": "videojuegos"}, "RbZetbSC5064rZccOFD1D": {"text": "televisión"}, "RkpoG4KB8m_TJFJf2v3EG": {"text": "cambiar de canal"}, "RwlZ1jr2Ix3evzrW71lN0": {"text": "manzana"}, "S3um53pcko7_BPHy7R6FL": {"text": "nosotros"}, "SE-71I_ahm3oKROReyJHE": {"text": "hacer caca"}, "SOyGnJXLPeVRoZy3vBgpK": {"text": "exámen"}, "SXz8iA1Qn_BlgLTAG6Epl": {"text": "cena"}, "SiOmZdwX8Hf2nE2v6HfCp": {"text": "zapato"}, "Sp2Ias_Y1HplkHWjIb7Mp": {"text": "sin"}, "TAbuXSnSHU6C3CQ4kbKVh": {"text": "triángulo"}, "TBV2BhoZVgl1jMV_jWZYi": {"text": "derecha"}, "TIgoS-YONIwzbrImXetaD": {"text": "ciruela"}, "TIsM6aTTZ9W8j6UhW9Qqj": {"text": "coro"}, "TLxsYdrBdHgFZkNJtVTmK": {"text": "tortuga"}, "TP-gGRcpcFyx1SrNRsdRV": {"text": "perdón"}, "TR5CXN8-pfbWkshdxSBSV": {"text": "oveja"}, "TS9z8ZmMEwn0MGSfr9amH": {"text": "palta"}, "TZF-7m8VKZ7IL6pyv0Daf": {"text": "cepillarme los dientes"}, "T_Q5c4XAfkhkclmnCGHo5": {"text": "hasta"}, "Td5pgVQDTFOftUgOJ-bD-": {"text": "picante"}, "Te_jJfeU8Xwa9St2RihBq": {"text": "sangre"}, "ThqkHs4az5tgLqLcfFPaZ": {"text": "largo"}, "TpPNZLsh5jrN9RdPFwmA7": {"text": "¡genial!"}, "Tpj-Fs8LQ566TM0bYlZ6H": {"text": "viernes"}, "TuAjBKPp3-PSdQuooSWZi": {"text": "rana"}, "TyqVzfOniQNa9WKQRXqr-": {"text": "hermana"}, "U1KQsrvTa2E00-ugc-Iy6": {"text": "ausente"}, "U6PoeH-cMdO3ttnLkN7_3": {"text": "cabalgar"}, "U7GiGcYacowWi4MWrCYyj": {"text": "antiinflamatorio"}, "UQ-5wOfR0tDzljoDjj2xU": {"text": "otoño"}, "UQ5B5K-tpk1XmQC1B9TjQ": {"text": "no"}, "US8_vYTnDfxBw2Ung_J38": {"text": "partes íntimas"}, "UVzdJiqY36fqgBYyz880c": {"text": "jamón crudo"}, "UXJDiwb3j_zyfGa26ByJL": {"text": "pecho"}, "Ubaq6h7wasdP_YRombm2c": {"text": "azúcar"}, "Ugs9V9c2c5iHrVC6p17zr": {"text": "analgésico"}, "Uk1Emn5IovsTfFzpQX5Jw": {"text": "sujetador"}, "UkLF5sKtVKW0D8RzVCoue": {"text": "bombero"}, "UnQJwWfWCe40DJYR1Er0o": {"text": "dolor"}, "UssSOEEKutvzB_B4fAQE-": {"text": "escuchar de nuevo"}, "Ust3oadA0PUGViYo28Mf3": {"text": "caminar"}, "UvRS0KmtZn3dq7e8L5RcE": {"text": "enojado"}, "UwvZVcX_CAQFrI6U4LsNT": {"text": "huevo"}, "VJ9AU_y7CqsONR6TvhdLh": {"text": "¿dónde está?"}, "VKrLGgYjc-nLPGsyESDgb": {"text": "canario"}, "VL4pd0vnJ-CNfMg9bCNed": {"text": "aspirina"}, "VUJ-zrdsyL9MOuFbdMCAx": {"text": "mareo"}, "Vioyf8EXJfY5t34NnN0WO": {"text": "tablet"}, "Vjlet5P7XuqTrc22nt_Zz": {"text": "agua"}, "Vmnu5eormo-_TOCgF4YzG": {"text": "jarabe para la tos"}, "VoZumy5GtnRdqSOmXAw7j": {"text": "preparado"}, "VrC7AnovfA7VzmYESVc8L": {"text": "conversar"}, "VwZ4EKSggYWxlnAbp-pNB": {"text": "enfermo"}, "Vzov0z9acB-I1_W_CcFcY": {"text": "rojo"}, "WDUIQV43zghFQq_rSk1Z4": {"text": "filete"}, "WL3ZN-W_zgnuTJpuqz0YQ": {"text": "príncipe"}, "WNhpmD_XlTaNEBo7GsFXu": {"text": "diarrea"}, "WQ0CNIQ_gjaCxg4tEIsOo": {"text": "clavado"}, "WRzleD-mI84LaimFH8h6P": {"text": "escuchar"}, "WUt3I-NkdbqlSVcwuLfFx": {"text": "patines"}, "WWK2v56LM-zWqujabk9bM": {"text": "plástica"}, "W_f7h3qOLl2uEd_OYpMfQ": {"text": "policía"}, "WasZ5bKZZy5Jt4Y-JipxS": {"text": "bikini"}, "Wgh5iCzUmx4Je-B85-pra": {"text": "refrigerador"}, "WjXQhSFPpz42ZUyHvurYG": {"text": "grillo"}, "WtYSntcy2CijEORmROeaj": {"text": "un cuarto"}, "Wu47Qs6Zupu1Ox2gUhkxn": {"text": "cuarto"}, "Wva5W8GA0dHzyt2_0FPdm": {"text": "hermano"}, "X0-Tf-KR24qEkpGDzG2Z-": {"text": "ayer"}, "X3u4pXTWKcGc43lOkgSBt": {"text": "cumplimiento"}, "XA952Z60D0-cesNCVA-OX": {"text": "chau"}, "XC5fIljJ819OYpllYTjpE": {"text": "jirafa"}, "XN0nzhQyHVOhuYuNqrp8g": {"text": "durazno"}, "XOoGN6huCjVHxH8hRFAw1": {"text": "blanca"}, "XY6ZCNzeJIEzLtWJcufJm": {"text": "camiseta manga larga"}, "XYY8SV1IAMHjdGjMZxbdy": {"text": "cancha"}, "XeVaDdUWSEkhfJvTVvUHR": {"text": "salir"}, "XnocVMEeUGCSnlnusP44O": {"text": "agarrar"}, "XuAtFop5_JNSYiZkUBzaU": {"text": "cocinar"}, "Y5HQq_4crSF2lpwH-KUrt": {"text": "dos"}, "YCu-B26PqjE30AhikHdkI": {"text": "dibujos animados"}, "YIP0Xc4aJsfv0s8BpiQnn": {"text": "cinco"}, "YLKXFZ9ze9K9NvJiAx8w0": {"text": "¿qué?"}, "YbrNtdUmyMNdAF5CfvY1A": {"text": "toalla"}, "YbvMRsCtMbww8OQgF45QF": {"text": "resfrío"}, "YeT-jstVSA7-mD9t99Isg": {"text": "rompecabeza"}, "YusWY8GwdO43bSp1o3BWC": {"text": "molesto"}, "Yvxm8RGoFYKUsIXOl33yR": {"text": "apagar la luz"}, "Z5-sBklfLIWE00CJ_T_ZK": {"text": "cuchara"}, "Z8xp3kxXuhMVoNm7ddQSX": {"text": "lanzar"}, "ZA2C4bJaL90lBxsTemYWZ": {"text": "piscina"}, "ZAnmv4CLb7hldYUlp2wJU": {"text": "ninguno"}, "ZBIFtTq-BH1jv5jLbzrhj": {"text": "repetir"}, "ZQEXAf10BkoTvCJx3Ox39": {"text": "sorpresa"}, "ZR-NXJk3SD351W-95cf_T": {"text": "pintar"}, "ZRYQmYRGKzheBqk11eGRZ": {"text": "ballena"}, "Zm4OIanIKTigDGIsInO7o": {"text": "un supermercado"}, "ZnMba2r4XIg9lPi_H2d_Z": {"text": "sí"}, "_1lOt0C0MQhvU8QWC6_oZ": {"text": "buenas noches"}, "_2SjbH-xHZq173EU4J65c": {"text": "parque"}, "_3ihCSMQCokXNo8pXii-h": {"text": "llamar a alguien"}, "_8RIOebHpkr9nCy0_9qhP": {"text": "llamar"}, "_CsJMxqGcNSaujXwRZcpu": {"text": "ansioso"}, "_FNTsoEjTMV3Uas-gggi2": {"text": "estrés"}, "_HUf6SR0mTP7v72Y9_4gw": {"text": "coche de bomberos"}, "_Lc2-NNL69ZX-aVnUNzgx": {"text": "frutilla"}, "_S9Eck14cdOTr0QH4i7sQ": {"text": "cuarto de baño"}, "_WIT6qs1kaiJqB1Ild5Xs": {"text": "paseo"}, "_eug92AvR1UXpYlfm6o_Q": {"text": "dorado"}, "_hqTU9A7I3RFDVrcIEK-L": {"text": "%null%"}, "_lU200bb9Sjv0b_iJKgU2": {"text": "una bicicletería"}, "_tDZtalMxKSNpWydJ1aeW": {"text": "cero"}, "aC_XP9Ch5PqWoCmcJwI77": {"text": "algodón"}, "aMs2YNnWkw4XN0gAm-jI3": {"text": "cajón"}, "aP9QisUdxhgOKIQ2kHNb3": {"text": "acelga"}, "aSzpwNza22HZp46Sh6wfx": {"text": "súcio"}, "aTwzShtP_zR9x6bSGSzEB": {"text": "muslo de pollo"}, "aXLBXkENJqTYkyZOP8TNS": {"text": "tú"}, "aa3xDW6F9YUKyX0fe5uX8": {"text": "espaldas"}, "ajesFjbC7hwCNLKdif-ix": {"text": "contra"}, "ak5fBauJzapC4JIf0lT8N": {"text": "cerro"}, "alsoa_V3wz3vPpG1TKRZc": {"text": "transportes"}, "amk4WRd1sNEIp24pnFw8j": {"text": "rodilla"}, "armmpopt2RLsVDlqLrQ94": {"text": "restaurante"}, "atVEXuftxSiDDj8rzUlFg": {"text": "crayones"}, "atWxG3KTHB5moW1dylLJc": {"text": "juguete"}, "avzcTznCsQCISYJsLC-w_": {"text": "notas musicales"}, "b1XpSC0ndnm0ZewNXC3pp": {"text": "carnicero"}, "b5OdBMMzkf1FlQbUR5-m7": {"text": "servilletas"}, "b9Y5MrR-jn8fh77gAkLZy": {"text": "pintar"}, "bAoK85XLNb7p0ebevYZ6O": {"text": "mirarme al espejo"}, "bDnuS19hfd9GhJ-6rjNPD": {"text": "estar"}, "bFodvUraUhJeq4waMdlxv": {"text": "domingo"}, "bNJfccUvG2DQfR1iZP3eR": {"text": "serpiente"}, "bVN3R44VuZDw3IdQMolca": {"text": "cambiar"}, "beNprvNb0UztxR4JLxDFm": {"text": "birthday"}, "bge6qR6NzsD5Vk4ifPsSO": {"text": "catsup"}, "bpSuQQRlIcSse40OAxNSG": {"text": "monday"}, "bqjKW_qBtRzIThWxdZx2s": {"text": "sunglasses"}, "buyy_2ydocKoi9TnBhZ1N": {"text": "friend"}, "bw3rqHXD1TJ53xbNggEqH": {"text": "breakfast"}, "c7kK5ROVbO3DHrwSFEawq": {"text": "candy"}, "cI0JxwhkWU-YA7E7rmJtp": {"text": "neck"}, "cJMQi3SVmqvWJ00VxI6gy": {"text": "how are you?"}, "cJw2i319mzBUpEfBRDxc9": {"text": "fish"}, "cJzHrV_PsV-PwwyFN9jka": {"text": "%null%"}, "cS3g4KXf39akVFHCG5AwL": {"text": "camión de juguete"}, "cTiw7_Yjxu_Kg90q7PdYl": {"text": "gripe"}, "cb0rJJEYOeEoRU5fDdQQq": {"text": "el"}, "ccGASDOGtty6GfQMEEBEU": {"text": "tres"}, "cj6OuVw4Nob8jxP-E4rZc": {"text": "cambiarme la ropa"}, "cnyLFMkJu2i3cqOY0e9kl": {"text": "pasas"}, "curstMeuThu2KUph-8rkB": {"text": "jugar con"}, "cxMNBGV3LytDXgwDMCiga": {"text": "violeta"}, "d4zNoj2BAFG9B7J3KAlLE": {"text": "botones"}, "d6s8fLFBiQ3KEJlNdJfUW": {"text": "un poco loco"}, "dHM0qnbmtJAkZY0WBsqaY": {"text": "lila"}, "dLHDzm0rfgL-vXTx14HSm": {"text": "buscar"}, "dNvN5P787hAPE7ZYNgwkw": {"text": "pasear"}, "dR72liRxC3qmoSa6Dz2a2": {"text": "jarabe"}, "dS-KyYREUQIk7sDlmsvoa": {"text": "cerca"}, "d_I8jNfbkQD0CHgZn7hyB": {"text": "camisa"}, "dgm3NCKuz7L39PX8LYxj7": {"text": "juguetes"}, "djgKI9embnk95PAtFcn45": {"text": "cambiarme el pañal"}, "dn41o5K_1fo-qHO-YLoQn": {"text": "sábado"}, "dnXsSOeVG7mq37uciIi2J": {"text": "recreo"}, "e5sCl246xFMESEfFy2PhX": {"text": "coche"}, "e5un1yrIuZHQi048e5kD6": {"text": "caramelos"}, "e8zl_ecIloo4Vk-OZPJWe": {"text": "jugar con la tableta"}, "eDX2HSkGaY2TeVwPjR07S": {"text": "fácil"}, "eGJ8MC1xPE6ueF82jCmVg": {"text": "cepillar"}, "eKJCZc-kD0-m6cVLorFzO": {"text": "pera"}, "eWSI1NInbQowtO99phhGA": {"text": "boca"}, "eZEqRZjRK8JJMsfHo4Y7w": {"text": "del"}, "ebo03xnkyiHD2pKUKULmr": {"text": "dibujos animados"}, "ecUOs24Pp5ZTRt_ZvED5W": {"text": "acompañar"}, "eduqLSyC3m4uB1Oee6dt6": {"text": "mitad"}, "eji-M2j5eHkG71DCksleY": {"text": "huevo duro"}, "emm_RirDsO30Enax5Q4gd": {"text": "con"}, "eo3Q5AjHJz5kp1EbdALwh": {"text": "ustedes"}, "eoYtISVZl3mdwoE_HW-Mv": {"text": "guitarra"}, "et1KiL5-zob_EcGlj7tLN": {"text": "despues"}, "f2dl12fMZbRdQ7STpcTdk": {"text": "fútbol"}, "fF3ijeQzetfSn6EGcs1yY": {"text": "cerezas"}, "fL_4POdbPVL9-lvQVWSqY": {"text": "avión de juguete"}, "fNAlqbgrpirQZO_LhrkXY": {"text": "primavera"}, "fNv4Nb6Vafxk0JxXr-iDo": {"text": "investigar"}, "fUUj_4pKPflmJlxZfk0cX": {"text": "discoteca"}, "ff7ES190q1dmFYZ7lo6x0": {"text": "pan blanco"}, "fjCOcN-PKP6F07IZcI71X": {"text": "plaza"}, "fkNwVm56PSe-qh-QoM0vm": {"text": "allá"}, "fk_z_HrvcUh8XIq8D6gQP": {"text": "nueces"}, "g1Cj6HW8kg8yPE1XX9pxa": {"text": "desde"}, "g1TLUpuQX2Zs1ob9gqYui": {"text": "gorro"}, "g2MhHawoIC9oFNEv5_w63": {"text": "vida"}, "g2sQSxCcoZuKJ3TabK6oT": {"text": "vino"}, "g75y4E53ViakV-s5UfnIF": {"text": "equipaje"}, "gFEnqFhYoXF7QN-n0ONad": {"text": "montaña"}, "gYrIz3R13-BC_pYcvQ9BL": {"text": "invierno"}, "gaem1LHTtfQdnnqYi-sOm": {"text": "billetera"}, "gff2FqDlgXknRld7YMLWl": {"text": "entero"}, "gsU8pE9ozhR73xS2icwJ0": {"text": "libro"}, "gvPwrzDSSEPwcxY878T_c": {"text": "gato"}, "gzCjycNS8Cf0vNlo1klji": {"text": "molesto"}, "gzb-RNDLMNkgk9wnPILJi": {"text": "abuela"}, "hAZhogJSH3bL1iL237N8J": {"text": "pochoclos"}, "hDvpMlPw-chcuxEisBJTl": {"text": "castañas"}, "hKJhXxultsxm0TJl1P8-L": {"text": "gracias"}, "hOyjT1JgOYB-mGLFMaNJR": {"text": "dolor de pecho"}, "hT3Lrjn5-q7YIM1loG4MN": {"text": "altavoz"}, "hUYfE_vmNBT_7E60YZsSu": {"text": "pintura"}, "hWWOw1gWjWwN7wQJkHrTu": {"text": "tour"}, "hXgGhazQ_nA5uqpRD6Qwq": {"text": "ganar"}, "hmhAUgqvGp7nc1w25sRSx": {"text": "esperar"}, "hwzwfMyJsvB42F_QWQWyi": {"text": "zumo de uva"}, "hyUaYltGVJU-wRrAjhhPa": {"text": "cantante"}, "i0wB--S4sdL8Q4H9b93UY": {"text": "ácido"}, "i2mlV3zGS6nrH2l6N2BlZ": {"text": "trompeta"}, "iAqItRUQL_YpbMn2pgjsA": {"text": "pizzería"}, "ibtmTEP3QGDY8TyVLteuX": {"text": "blando"}, "ifd0M0pAlFm7aPt1A0ze_": {"text": "amar"}, "iiA1u1JKRmhe2jWVE_W79": {"text": "amigos"}, "iimGxVoFWlq_THThR3vmF": {"text": "noticias"}, "ijn-QwQuTxRFFVe-7WlSX": {"text": "picazón"}, "iowxE4MxcV6PR2Uhtvxqs": {"text": "hospital"}, "irbOv2dHA7G969dnJMfJn": {"text": "cuaderno"}, "islCzqFq1SYrZAh63dLhQ": {"text": "huevo frito"}, "j5xZZev5nTNa-p088Oqnp": {"text": "besar"}, "jBqD3qhhcrioLlCU-xq5b": {"text": "instrumentos musicales"}, "jOALQbfxdXmJVyY6P5gZG": {"text": "damasco"}, "jTEb3A5ZEKEy2ojuq2vO_": {"text": "hueso"}, "jeO9YZ22LfSObUNhQDRAz": {"text": "ventana"}, "jfly9fZ3x1da4SGCCNcV2": {"text": "bufanda"}, "jfvreGZv-e8rD4-01wZ5H": {"text": "venda"}, "jhJ2TOfdaRAcVeHGOjwua": {"text": "leche"}, "jmzg4EiC7JEHwe9gNP3C3": {"text": "arroz"}, "jpKPg3hn6_GO1HSkeLNGz": {"text": "niña"}, "jprAsdXWGQKPlUWwgBBot": {"text": "película"}, "jtKc2q2n5an342ZkiMB9R": {"text": "higiene personal"}, "k-iDOTk5uO7ZK5OB3v8It": {"text": "viejo"}, "k41gkf6A_bDtQAJDOrWpP": {"text": "pasta de dientes"}, "k7dZhQtwDPFlOk1iPjEOz": {"text": "subir volumen"}, "k8tJx6PikRcnVuZEqrXRM": {"text": "viajar"}, "k9ZpWM4oRb1q20c0qWCsg": {"text": "abrigo"}, "kDzHKO8eIwNsyKWDw7M0c": {"text": "uva"}, "kIn8SeGURyvu49EsRqDs7": {"text": "pijama"}, "kN85Lb_C4dLnww7sz1afK": {"text": "café"}, "kaiWPbXxjHXlqcpBaBp4l": {"text": "viajar"}, "khUUL_1JQGngApqBRDh_q": {"text": "arreglado"}, "kpghvJtujlt4vPI2N6vsg": {"text": "o"}, "kxuGlfYjS6puO2xD1QvxO": {"text": "vamos"}, "lKA4b7I3iFkqNzPcAXyBc": {"text": "cocinero"}, "lKMW_xTZzCrCHRcGp-Z-n": {"text": "galleta"}, "lR84gCk8OM-oYoLAV7tar": {"text": "timbre"}, "lXH68vGIuZdfA8xVrS8iw": {"text": "mucho"}, "l_ncJLRdVGBzzQc9yqBqs": {"text": "banana"}, "lrUuPKco_O8FXDuclzpKE": {"text": "necesitar"}, "m0434KkjeTv8SGN7WxR2C": {"text": "negro"}, "m0Fkio76HZHS2HguPOTn5": {"text": "seis"}, "m17b6MazSk6M4gb51_cCy": {"text": "pulmones"}, "m39xTdgaenoi4mWGEa-Ew": {"text": "plato"}, "m3qTT8tiGZQheKIWREzMT": {"text": "ir a"}, "mC9Nb7zVdEUpjEBODw_gL": {"text": "vos"}, "mFfylZ8yoLvtkVSDTlVEN": {"text": "pomada"}, "mJqzbxYeIDQciPkeHA1Ao": {"text": "cuchillo"}, "mK4AXXhoIVirBz5dr_xLA": {"text": "pavo"}, "mRK--C5Q1aGe8MMPJJLYi": {"text": "preocupado"}, "mTklFAI-FVVLsMKoASZ7T": {"text": "desconocido"}, "mWXxPPvhSHf9hyb-VyuZH": {"text": "e"}, "mZFwH8xY_OeVDWCdvPZBy": {"text": "pie"}, "miPmA2tOQiLxOW7D_V_x6": {"text": "cubos"}, "ms97ZsgQOvD-Z8qpSW4oN": {"text": "¿quiénes?"}, "mx6dmRLXA_lkN1QlP71vq": {"text": "todas"}, "n5bZClAB6jXAZnwxIwH-1": {"text": "tostada"}, "nK7DRpxalLBHL9OnRjSim": {"text": "frambuesa"}, "nMQUtS-kFHViOKyop1FdS": {"text": "vincha"}, "nQSk6_KCEVdO7oC_uxLXN": {"text": "oreja"}, "nQdbkRVcwpQB_hFNPbe6M": {"text": "caballo"}, "nUg2M7p5sUPlGdbBev2-G": {"text": "tobillos"}, "nm6e_s01gWHzdVj25BHyq": {"text": "¡qué lindo!"}, "nnTJQMJWfd2nuTSlFNEOy": {"text": "mío"}, "ntzBlFkDMTKEUHoGNc65u": {"text": "baño"}, "o0oxaoUFpOLiGsoQBlalI": {"text": "torta"}, "oAxNCJufVUqZMyWRGdZl9": {"text": "tuyo"}, "oEHzYcfxDGGcsL-deud1j": {"text": "snack"}, "oEyUWrQj1iYUnlEUdQQ5Z": {"text": "flauta"}, "oO21zLMEtHEakvnuTohLu": {"text": "¡qué divertido!"}, "oOkD8Wmvb4t9I2EWqT1Nr": {"text": "amargo"}, "oSBFO8Ka0PN4bgX0QuWxL": {"text": "viajar en auto"}, "oYwoiRDWlIjSTbYdC2vG6": {"text": "falda"}, "oa-MShota2L8n2pU8hIsm": {"text": "jugar"}, "okr5oAG2U8Er1XwQ8XbWD": {"text": "grande"}, "oqQWeoWBr5N0LrPGY62Og": {"text": "senos"}, "otTWzTaTAmweNCozT8tn9": {"text": "alergia"}, "p1qK47wwLwF8S0Fy8-2Mt": {"text": "mano"}, "pHBnmCFpM7oZf0O78CBIz": {"text": "golosina"}, "pM-bC77hbj-w44A0HFRDZ": {"text": "sonarme la nariz"}, "p_XyUXRmeUk_bdjRTMtkz": {"text": "revistas"}, "p_qpVEd677b2Bk56yhvj6": {"text": "jardín"}, "paPpjw1XVC9-6xcueJsrY": {"text": "todos"}, "pgPlWKk-oww2fua5zYuue": {"text": "mono"}, "phZ4F4uzi1TrhjeDMuMsn": {"text": "almohada"}, "pkuppr1jMH7SMpa2hrIWQ": {"text": "zumo de durazno"}, "pliNY9oMQh1iSidkEhhDO": {"text": "abrazar"}, "pptyFMhLrbC6lN6zmc7D0": {"text": "comedor"}, "ptQZXjMQyXWycUD1kAkQo": {"text": "cuento"}, "pv8eYkxczIevQqEGwDz6V": {"text": "mochila"}, "pvXSy-5M4i8kysUppvdME": {"text": "que"}, "pwltOTDn2OyABTlD4-27W": {"text": "verduras"}, "px0jKQDj7r9pOYs4ZrvcT": {"text": "tomate"}, "q22wRFF21EigV8YzQ_MfV": {"text": "¿me ayudas?"}, "q6F-qJ7mTxvwa43F6vwun": {"text": "escondidas"}, "q7Pz4UqqZUlXeFfXrwXDR": {"text": "enjuagar"}, "qA4v2JWQU0zzBBZgvW7Vt": {"text": "temblores"}, "qOsbXyvBTMDAwvvnI0iFn": {"text": "pequeño"}, "qU5IvFLD8d16iIHSs_9TM": {"text": "cebolla"}, "qWhpDTMd8eAEoq7yTKc57": {"text": "ropa interior"}, "qYA2U_BFOZtFLClxuCIBJ": {"text": "dolor de muela"}, "qeJdrxKIIcUctIjo8wWhc": {"text": "agudo"}, "qn-7ERrcZxJTqfW6hwNs8": {"text": "correr"}, "qsA1zm1DOlItK7DCWzAw8": {"text": "aburrido"}, "qscoBbrWu7tQbpNj9XUPt": {"text": "papel higiénico"}, "quE_RA9abVvtG-Fo4Jx8f": {"text": "diez"}, "qy3c7gvRU7shWuJYr1kBk": {"text": "bebida"}, "r7eJgCF_b_ktkztv4-oda": {"text": "medias"}, "r808IO3I6j3os_uix6O63": {"text": "juegos de mesa"}, "r9qUBQwgY8eycnU2OVey0": {"text": "comer un sándwich"}, "rBwDn3PcJGqytqnOZTJMV": {"text": "taxi"}, "rMFGfzFobfGsH3_qrLHXU": {"text": "pescado"}, "rU9cpWF0I4wnJjzTXpGtO": {"text": "hoy"}, "rgyV6CvFe98OGnWut6QCZ": {"text": "turista"}, "rlGO5jGKPL1vW-VF4nRqZ": {"text": "entrada"}, "rnjJyPTabH_Xpmy4Z4O3U": {"text": "celebrar"}, "rtHwq5WN9KElX3V3SKBmS": {"text": "papas fritas"}, "rwyX2YemNEx_Mh64IArDQ": {"text": "oscuro"}, "rxdfuk6egO7VmZEB3JrUN": {"text": "la"}, "ry_jOegpMf4nB3spGf4d2": {"text": "me gusta"}, "s0BXoyn7AqUAlZ9BOHY6S": {"text": "tríste"}, "sAsTkky29uEVC9vo3Ofbo": {"text": "brazo"}, "sDKIldL3tit328Joneo_7": {"text": "vaso"}, "sFNUgvnglgrm6cbYiM0di": {"text": "¿cuándo?"}, "sP6uvKmY5kA_yuYR8H21c": {"text": "halloween"}, "sPtazVgymXESdS-BcHqU_": {"text": "pollería"}, "sSTGRl6DpYGZXp8vtTNbm": {"text": "comprar"}, "sbv5HLPUR6gHo-EJR2S7S": {"text": "camello"}, "sc0hr3jQ80yXRFDlAn56V": {"text": "cansancio"}, "sixdpB8hTOhlUr4loz3RB": {"text": "muñeca"}, "sjGytpiPjwqJfPaRUJ-Iw": {"text": "miércoles"}, "sysOciGqtL7y4ULuyYVc-": {"text": "canal de cocina"}, "t-w8e69GwxLyfxlWwHk9f": {"text": "mermelada"}, "t34TbvjJ3zG2jcgJaCeHa": {"text": "tocar"}, "tGyUfSljuc7A5Do5B9GuN": {"text": "sweater"}, "tQwMPLvqAMAstcqvnOERE": {"text": "gris"}, "tWxC4hR6di5zQC-Hujlev": {"text": "bajar volumen"}, "tYwEpd2EOtH8wEUr-jwHk": {"text": "caro"}, "tw1doIY-jFPofZjlPFj4z": {"text": "¿cómo te llamas?"}, "txj22hip0CE9qp_z-daIK": {"text": "nebulizador"}, "u1nIt_oFH426g1IVhlYk5": {"text": "sediento"}, "u2e4Zh8qwJF7zKkohQ8df": {"text": "goma de borrar"}, "u3BufiTZTK6AylGh80ZFd": {"text": "ella"}, "u8HfFvMPkogdWk-URj9hv": {"text": "escribir"}, "uDg7Yy86PlwsAd-U96vJR": {"text": "arriba"}, "uFoytOG4qsXzBk979t63y": {"text": "limpio"}, "uMhOF9ZvWnjW-Zrjbjfhs": {"text": "bajar"}, "uOA82KFAVtjoYRTuYFgpr": {"text": "postre"}, "uPL5NMeXTmD1iU6ZoiROu": {"text": "pájaro"}, "uYElWOlSOSoQap-d5gsYF": {"text": "chocolate"}, "uZRwbLa1lEG7ol0UJKRBj": {"text": "viejo"}, "ubP5GM7_0vPkRc6zbD9Ez": {"text": "antiacido"}, "uiVc5R86QCZkhraEFlrNz": {"text": "museo"}, "ujyHgmlPIs7UdtndbYd8S": {"text": "amistad"}, "upWXctTSKBtFNSXnXDK_u": {"text": "frutas"}, "uzSwgQNnV8ZrjxpN5Bz_a": {"text": "dificil"}, "v-E2GE1DpCkNAxsfA0f4M": {"text": "goma"}, "vHzfvEgIkQ0e73ryfWP2F": {"text": "ordenar"}, "vKGLQIas9RdBnPGsaYtr2": {"text": "cometa"}, "vOgqHjpHgrUGERIHtVqDe": {"text": "desechos"}, "vPicdKLrhT2wmAAPPukKP": {"text": "veloz"}, "vPnmrsRou1ihosdVXS_Op": {"text": "tenis"}, "vZ9JaTnoj8C0ILYxMNB73": {"text": "calabacín"}, "vaYJPAsTRvslo2qFOJt60": {"text": "lomo"}, "vazatQ7CrYJFsorVDC5AC": {"text": "leon"}, "viAHJeLRr_6j9dEi5klj_": {"text": "amarillo"}, "vlh1Pa6eA0ZrBs3vHzWH7": {"text": "oso"}, "vmb_RMIB20QND6VcS0deY": {"text": "panza"}, "vq3T-UQGTjX3Z9TlEF12e": {"text": "mayonesa"}, "vy-O5Zc5kxY8d-7RROvQI": {"text": "jamón"}, "w4cVxbBDZjeNyHwpBARHQ": {"text": "hombro"}, "wBLnDZStKj8YLkg2pTCfh": {"text": "sentir"}, "wCGb6D4xSVr4UeKXzGIlP": {"text": "disfraces"}, "wcpXeLMBRusfqfrz9s4mF": {"text": "puré"}, "whHwNRVnqeM7BMx6nppiW": {"text": "tigre"}, "wkrNPLGWTqMIy4PJRW9QR": {"text": "en"}, "wnfSUkF8-tQiRTVou1_pd": {"text": "frío"}, "x3PNiU1NIeQ3zQa31C8WX": {"text": "pañal"}, "xGsyYCjDzQugVzSaK8CuA": {"text": "duro"}, "xIgPo3N-aKXhVcjultMiY": {"text": "factura"}, "xPUYlxRxgFVn1FHQFz6Ic": {"text": "secar"}, "xQblStUfyBGO27j15Sda3": {"text": "pato"}, "xT4BPNmF-5WAQLfs3cUpS": {"text": "enamorado"}, "xXtjQktuAq1bmxTc0HSQT": {"text": "gaseosa"}, "xbPnUL4qxvm30VFYNphh-": {"text": "tíos"}, "xiaTdHGInqfm4rD6XzSeZ": {"text": "encender"}, "xnPF8fvkC1TvgETI1JcC9": {"text": "órganos"}, "xqGzZJIHBeVfSzRfm3rmg": {"text": "uno"}, "xxr0MRGYRmmoNC_gsD9uy": {"text": "pasaporte"}, "y0SViQxW8Y-yiX1Z7gXWt": {"text": "superhéroe"}, "y5W21CKOkLWnYJo1OC700": {"text": "tos"}, "yJoivIPHOm1Y1lj-hGN1J": {"text": "dormir"}, "yNag8CK0wV_iRMnFznsXk": {"text": "balón"}, "yR9FTtOimFwZG5g5tgpRk": {"text": "visita"}, "y_5OURnKxFcv4UiMKntUi": {"text": "y"}, "yihsjW9ON0Fr9Yy4ZlP9c": {"text": "axila"}, "yk2wDVqHEKKwupgm87OJ2": {"text": "nalgas"}, "yo00Ci8bSRFYPU6HxGVwX": {"text": "cantar"}, "yqlmoVGItXqaeazw3M3eg": {"text": "sofá"}, "yvtvSsBLhabkcpeYGbxQr": {"text": "botín"}, "yxa6QVSrmWUKH2PZHKaVl": {"text": "lechuga"}, "zANp2EnhT6n0Jcl1Xra6K": {"text": "bailar"}, "zAmesi1FcIWLXE3WVa9WS": {"text": "antialérgico"}, "zRTTg5x_P1E8Z3CU-oWXa": {"text": "cualquiera"}, "zcibOHpRbSmz1hVNSjPTj": {"text": "tenedor"}, "zdFC3vpgjcyUWB9a4ghRW": {"text": "descripción"}, "zi_wcT10fxgn72ZJhVx18": {"text": "vestido"}, "zm_6R89hr4wjuVkifiYrk": {"text": "despeinado"}, "zrR1DbO_szgKvxLyrZquw": {"text": "calefacción"}, "zw-o9pDectP5bxFnUjrJO": {"text": "cerdo"}, "zxhRDSHXtV63Sp3c2fjrI": {"text": "aduana"}, "-k6dUC6thWPyULq8MVSe6": {"text": "PRONOMBRES"}, "0geft4arn_A8kL-rfUPYc": {"text": "PERSONAS"}, "1aM3sTxyb8yLSWtkn2MoO": {"text": "INSTRUMENTOS MUSICALES"}, "384rVetrrLX4x4pJ0Y0Na": {"text": "INTERACCIONES SOCIALES"}, "4e6iVOPLAjnM6wCMUm5P4": {"text": "DESAYUNO Y MERIENDA"}, "6vmRBH4shBk3UQEUM6APX": {"text": "CINE Y PELÍCULAS"}, "7Jm3bDhPInSlwhdy20dKF": {"text": "CLASE DE ARTE"}, "7ngCuvmAnM_7ygpFQgLpk": {"text": "COLORES"}, "7w5ACMFdOCTkBrS911MA1": {"text": "ADJETIVOS Y ADVERBIOS"}, "8FPdnkMzOIBVTW5-TQxWX": {"text": "PERSONAJES"}, "8t8CAggTj3HuznkKhfXle": {"text": "LIBRO DEL RESTAURANTE"}, "9JRv4X68pAtwsFT3Ss0iJ": {"text": "LIBRO DE NATACIÓN"}, "ByBvBUS7dcXldjzZOVFFP": {"text": "CUERPO"}, "C7ClEHF5-Mcico4FvRxEV": {"text": "PREPOSICIONES"}, "GD9YHeLktSsdZQvcoua6x": {"text": "LIBRO DE LA CARNICERÍA"}, "HzPl-HvsrXL_QkGT38Ohd": {"text": "LIBRO DE VERDULERÍA"}, "JKEk5TYykBK6ZeYND3Ron": {"text": "CONJUNCIONES"}, "LWyfHr8Oui5HIShtZ_huo": {"text": "FRUTAS"}, "PYTnUqCLwAbngR2Ozroc2": {"text": "ACCIONES"}, "QQszyYRLL-otCQtRfbLzm": {"text": "TIEMPO"}, "V6K3TniptOApMMGa8TspR": {"text": "TODO"}, "VhfGFlHDcPor996rCzoK9": {"text": "CELEBRACIONES"}, "WZYuZd331Hm5gHXJtUmBN": {"text": "ANIMALES"}, "ZgZoyOg5K-LscXdfl6kQG": {"text": "CLASE DE MÚSICA"}, "_Cw7FcJSYiterkLSDJH8V": {"text": "CASA"}, "ah257x5jssDmLIOrcSGn6": {"text": "NÚMEROS"}, "berI6X2_pAVCNOrcHAL6y": {"text": "SENTIMIENTOS"}, "ce2z_EeEG2nH0ZS4KVAkA": {"text": "COLEGIO"}, "dQXaeM3Uul1yEvRwJ4w9t": {"text": "VESTIMENTA"}, "ejXQZAiYjrcSFGXb1pz7M": {"text": "TRANSPORTE"}, "gybgILOLxmIVfeQtb1f94": {"text": "LIBRO DE HIGIENE"}, "iHS1HpUBBadzgmbum_bdD": {"text": "PROFESIONES Y OFICIOS"}, "jatDsecioVAxRph-WOg4f": {"text": "LIBRO DE LA FARMACIA"}, "puOOrKWbYzH0B_8uGkxYX": {"text": "LIBRO DE VIAJE"}, "puda9fUGjqvm9oSM6CpTk": {"text": "ALIMENTOS"}, "rH7zhJzNVIcEIRyvaYLoi": {"text": "DEPORTES"}, "uv4tWMRHfewaEQ_pH0dnV": {"text": "LIBRO DE LA SALUD"}, "wAhDHMrZ850dHTwgAXrMY": {"text": "CONCEPTOS"}, "xjfPlDs-AcFV9LCyY-v9j": {"text": "JUEGOS Y JUGUETES"}, "y545pM8pvB3WgukIac6NT": {"text": "LUGARES"}, "zwf7qmSEi7PBwsNaqciA-": {"text": "libro de la tienda"}} \ No newline at end of file diff --git a/assets/languages/grupos_fr.json b/assets/languages/grupos_fr.json deleted file mode 100644 index bf1b8360..00000000 --- a/assets/languages/grupos_fr.json +++ /dev/null @@ -1,11722 +0,0 @@ -[ - { - "id": 0, - "texto": { - "en": "Actions", - "fr": "actes" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fverbos.webp?alt=media&token=f32aaaf1-44aa-49d3-a0ed-981ba01564d5" - }, - "relacion": [ - { - "id": 1, - "frec": 1 - }, - { - "id": 2, - "frec": 1 - }, - { - "id": 3, - "frec": 1 - }, - { - "id": 4, - "frec": 1 - }, - { - "id": 5, - "frec": 1 - }, - { - "id": 6, - "frec": 1 - }, - { - "id": 7, - "frec": 1 - }, - { - "id": 8, - "frec": 1 - }, - { - "id": 9, - "frec": 1 - }, - { - "id": 10, - "frec": 1 - }, - { - "id": 11, - "frec": 1 - }, - { - "id": 12, - "frec": 1 - }, - { - "id": 13, - "frec": 1 - }, - { - "id": 14, - "frec": 1 - }, - { - "id": 15, - "frec": 1 - }, - { - "id": 16, - "frec": 1 - }, - { - "id": 17, - "frec": 1 - }, - { - "id": 18, - "frec": 1 - }, - { - "id": 19, - "frec": 1 - }, - { - "id": 20, - "frec": 1 - }, - { - "id": 21, - "frec": 1 - }, - { - "id": 22, - "frec": 1 - }, - { - "id": 23, - "frec": 1 - }, - { - "id": 24, - "frec": 1 - }, - { - "id": 25, - "frec": 1 - }, - { - "id": 26, - "frec": 1 - }, - { - "id": 27, - "frec": 1 - }, - { - "id": 28, - "frec": 1 - }, - { - "id": 29, - "frec": 1 - }, - { - "id": 30, - "frec": 1 - }, - { - "id": 31, - "frec": 1 - }, - { - "id": 32, - "frec": 1 - }, - { - "id": 33, - "frec": 1 - }, - { - "id": 34, - "frec": 1 - }, - { - "id": 35, - "frec": 1 - }, - { - "id": 36, - "frec": 1 - }, - { - "id": 37, - "frec": 1 - }, - { - "id": 38, - "frec": 1 - }, - { - "id": 39, - "frec": 1 - }, - { - "id": 40, - "frec": 1 - }, - { - "id": 41, - "frec": 1 - }, - { - "id": 42, - "frec": 1 - }, - { - "id": 43, - "frec": 1 - }, - { - "id": 44, - "frec": 1 - }, - { - "id": 45, - "frec": 1 - }, - { - "id": 46, - "frec": 1 - }, - { - "id": 47, - "frec": 1 - }, - { - "id": 48, - "frec": 1 - }, - { - "id": 49, - "frec": 2 - }, - { - "id": 50, - "frec": 1 - }, - { - "id": 51, - "frec": 1 - }, - { - "id": 52, - "frec": 1 - }, - { - "id": 53, - "frec": 1 - }, - { - "id": 54, - "frec": 1 - }, - { - "id": 55, - "frec": 1 - }, - { - "id": 56, - "frec": 1 - }, - { - "id": 57, - "frec": 1 - }, - { - "id": 58, - "frec": 1 - }, - { - "id": 59, - "frec": 1 - }, - { - "id": 60, - "frec": 1 - }, - { - "id": 61, - "frec": 1 - }, - { - "id": 62, - "frec": 1 - }, - { - "id": 63, - "frec": 1 - }, - { - "id": 64, - "frec": 1 - }, - { - "id": 65, - "frec": 1 - }, - { - "id": 66, - "frec": 1 - }, - { - "id": 67, - "frec": 1 - }, - { - "id": 68, - "frec": 1 - }, - { - "id": 69, - "frec": 1 - }, - { - "id": 70, - "frec": 1 - }, - { - "id": 71, - "frec": 1 - }, - { - "id": 72, - "frec": 1 - }, - { - "id": 73, - "frec": 1 - }, - { - "id": 74, - "frec": 1 - }, - { - "id": 75, - "frec": 1 - }, - { - "id": 76, - "frec": 1 - }, - { - "id": 77, - "frec": 1 - }, - { - "id": 78, - "frec": 1 - }, - { - "id": 79, - "frec": 1 - }, - { - "id": 80, - "frec": 1 - }, - { - "id": 81, - "frec": 1 - }, - { - "id": 82, - "frec": 1 - }, - { - "id": 83, - "frec": 1 - }, - { - "id": 84, - "frec": 1 - }, - { - "id": 85, - "frec": 1 - }, - { - "id": 86, - "frec": 1 - }, - { - "id": 87, - "frec": 1 - }, - { - "id": 88, - "frec": 1 - }, - { - "id": 90, - "frec": 1 - }, - { - "id": 89, - "frec": 1 - }, - { - "id": 91, - "frec": 1 - }, - { - "id": 92, - "frec": 1 - }, - { - "id": 93, - "frec": 1 - }, - { - "id": 94, - "frec": 1 - }, - { - "id": 95, - "frec": 1 - }, - { - "id": 96, - "frec": 1 - }, - { - "id": 97, - "frec": 1 - }, - { - "id": 98, - "frec": 1 - }, - { - "id": 99, - "frec": 1 - }, - { - "id": 100, - "frec": 1 - }, - { - "id": 101, - "frec": 1 - }, - { - "id": 102, - "frec": 1 - }, - { - "id": 103, - "frec": 1 - }, - { - "id": 104, - "frec": 1 - }, - { - "id": 105, - "frec": 1 - }, - { - "id": 106, - "frec": 1 - }, - { - "id": 107, - "frec": 1 - }, - { - "id": 108, - "frec": 1 - }, - { - "id": 109, - "frec": 1 - }, - { - "id": 110, - "frec": 1 - }, - { - "id": 111, - "frec": 1 - }, - { - "id": 112, - "frec": 1 - }, - { - "id": 113, - "frec": 1 - }, - { - "id": 114, - "frec": 1 - }, - { - "id": 115, - "frec": 1 - }, - { - "id": 116, - "frec": 1 - }, - { - "id": 117, - "frec": 1 - }, - { - "id": 118, - "frec": 1 - } - ], - "frecuencia": 1 - }, - { - "id": 1, - "texto": { - "en": "Adjectives", - "fr": "Adjectifs" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fdescripcion.webp?alt=media&token=4dbde8ba-f144-4a12-90f6-013bf68d912d" - }, - "relacion": [ - { - "id": 119, - "frec": 1 - }, - { - "id": 120, - "frec": 1 - }, - { - "id": 121, - "frec": 1 - }, - { - "id": 122, - "frec": 1 - }, - { - "id": 123, - "frec": 1 - }, - { - "id": 124, - "frec": 1 - }, - { - "id": 125, - "frec": 1 - }, - { - "id": 126, - "frec": 1 - }, - { - "id": 127, - "frec": 1 - }, - { - "id": 128, - "frec": 1 - }, - { - "id": 129, - "frec": 1 - }, - { - "id": 130, - "frec": 1 - }, - { - "id": 131, - "frec": 1 - }, - { - "id": 132, - "frec": 1 - }, - { - "id": 133, - "frec": 1 - }, - { - "id": 134, - "frec": 1 - }, - { - "id": 135, - "frec": 1 - }, - { - "id": 136, - "frec": 1 - }, - { - "id": 137, - "frec": 1 - }, - { - "id": 138, - "frec": 1 - }, - { - "id": 139, - "frec": 1 - }, - { - "id": 140, - "frec": 1 - }, - { - "id": 141, - "frec": 1 - }, - { - "id": 142, - "frec": 1 - }, - { - "id": 143, - "frec": 1 - }, - { - "id": 144, - "frec": 1 - }, - { - "id": 145, - "frec": 1 - }, - { - "id": 146, - "frec": 1 - }, - { - "id": 147, - "frec": 1 - }, - { - "id": 148, - "frec": 1 - }, - { - "id": 149, - "frec": 1 - }, - { - "id": 150, - "frec": 1 - }, - { - "id": 151, - "frec": 1 - }, - { - "id": 152, - "frec": 1 - }, - { - "id": 153, - "frec": 1 - }, - { - "id": 154, - "frec": 1 - }, - { - "id": 155, - "frec": 1 - }, - { - "id": 156, - "frec": 1 - }, - { - "id": 157, - "frec": 1 - }, - { - "id": 158, - "frec": 1 - }, - { - "id": 159, - "frec": 1 - }, - { - "id": 160, - "frec": 1 - }, - { - "id": 161, - "frec": 1 - }, - { - "id": 162, - "frec": 1 - }, - { - "id": 163, - "frec": 1 - }, - { - "id": 164, - "frec": 1 - }, - { - "id": 165, - "frec": 1 - }, - { - "id": 166, - "frec": 1 - }, - { - "id": 167, - "frec": 1 - }, - { - "id": 168, - "frec": 1 - }, - { - "id": 169, - "frec": 1 - }, - { - "id": 170, - "frec": 1 - }, - { - "id": 171, - "frec": 1 - }, - { - "id": 172, - "frec": 1 - }, - { - "id": 173, - "frec": 1 - }, - { - "id": 174, - "frec": 1 - }, - { - "id": 175, - "frec": 1 - }, - { - "id": 176, - "frec": 1 - }, - { - "id": 177, - "frec": 1 - }, - { - "id": 178, - "frec": 1 - }, - { - "id": 179, - "frec": 1 - }, - { - "id": 180, - "frec": 1 - }, - { - "id": 181, - "frec": 1 - }, - { - "id": 182, - "frec": 1 - }, - { - "id": 183, - "frec": 1 - }, - { - "id": 184, - "frec": 1 - }, - { - "id": 185, - "frec": 1 - }, - { - "id": 186, - "frec": 1 - }, - { - "id": 187, - "frec": 1 - }, - { - "id": 188, - "frec": 1 - }, - { - "id": 189, - "frec": 1 - }, - { - "id": 190, - "frec": 1 - }, - { - "id": 191, - "frec": 1 - }, - { - "id": 192, - "frec": 1 - }, - { - "id": 193, - "frec": 1 - }, - { - "id": 194, - "frec": 1 - }, - { - "id": 195, - "frec": 1 - }, - { - "id": 196, - "frec": 1 - }, - { - "id": 197, - "frec": 1 - }, - { - "id": 198, - "frec": 1 - }, - { - "id": 199, - "frec": 1 - }, - { - "id": 200, - "frec": 1 - }, - { - "id": 201, - "frec": 1 - }, - { - "id": 202, - "frec": 1 - }, - { - "id": 203, - "frec": 1 - }, - { - "id": 204, - "frec": 1 - }, - { - "id": 205, - "frec": 1 - }, - { - "id": 206, - "frec": 1 - }, - { - "id": 207, - "frec": 1 - }, - { - "id": 208, - "frec": 1 - }, - { - "id": 209, - "frec": 1 - }, - { - "id": 210, - "frec": 1 - }, - { - "id": 211, - "frec": 1 - }, - { - "id": 212, - "frec": 1 - }, - { - "id": 213, - "frec": 1 - }, - { - "id": 214, - "frec": 1 - }, - { - "id": 215, - "frec": 1 - }, - { - "id": 216, - "frec": 1 - }, - { - "id": 217, - "frec": 1 - }, - { - "id": 218, - "frec": 1 - }, - { - "id": 219, - "frec": 1 - }, - { - "id": 220, - "frec": 1 - }, - { - "id": 221, - "frec": 1 - }, - { - "id": 222, - "frec": 1 - }, - { - "id": 223, - "frec": 1 - }, - { - "id": 224, - "frec": 1 - }, - { - "id": 225, - "frec": 1 - }, - { - "id": 226, - "frec": 1 - }, - { - "id": 227, - "frec": 1 - }, - { - "id": 228, - "frec": 1 - }, - { - "id": 229, - "frec": 1 - }, - { - "id": 230, - "frec": 1 - }, - { - "id": 231, - "frec": 1 - }, - { - "id": 232, - "frec": 1 - }, - { - "id": 233, - "frec": 1 - }, - { - "id": 234, - "frec": 1 - }, - { - "id": 235, - "frec": 1 - }, - { - "id": 236, - "frec": 1 - }, - { - "id": 237, - "frec": 1 - }, - { - "id": 238, - "frec": 1 - }, - { - "id": 239, - "frec": 1 - }, - { - "id": 240, - "frec": 1 - }, - { - "id": 241, - "frec": 1 - }, - { - "id": 242, - "frec": 1 - }, - { - "id": 243, - "frec": 1 - }, - { - "id": 244, - "frec": 1 - }, - { - "id": 245, - "frec": 1 - }, - { - "id": 246, - "frec": 1 - }, - { - "id": 247, - "frec": 1 - }, - { - "id": 248, - "frec": 1 - }, - { - "id": 249, - "frec": 1 - }, - { - "id": 250, - "frec": 1 - }, - { - "id": 251, - "frec": 1 - }, - { - "id": 252, - "frec": 1 - }, - { - "id": 253, - "frec": 1 - }, - { - "id": 254, - "frec": 1 - }, - { - "id": 255, - "frec": 1 - }, - { - "id": 256, - "frec": 1 - }, - { - "id": 257, - "frec": 1 - }, - { - "id": 258, - "frec": 1 - }, - { - "id": 259, - "frec": 1 - }, - { - "id": 260, - "frec": 1 - }, - { - "id": 261, - "frec": 1 - }, - { - "id": 262, - "frec": 1 - }, - { - "id": 263, - "frec": 1 - }, - { - "id": 264, - "frec": 1 - }, - { - "id": 265, - "frec": 1 - }, - { - "id": 266, - "frec": 1 - }, - { - "id": 267, - "frec": 1 - }, - { - "id": 268, - "frec": 1 - }, - { - "id": 269, - "frec": 1 - }, - { - "id": 270, - "frec": 1 - }, - { - "id": 271, - "frec": 1 - }, - { - "id": 272, - "frec": 1 - }, - { - "id": 273, - "frec": 1 - }, - { - "id": 274, - "frec": 1 - }, - { - "id": 275, - "frec": 1 - }, - { - "id": 276, - "frec": 1 - }, - { - "id": 277, - "frec": 1 - }, - { - "id": 278, - "frec": 1 - }, - { - "id": 279, - "frec": 1 - }, - { - "id": 280, - "frec": 1 - }, - { - "id": 281, - "frec": 1 - }, - { - "id": 282, - "frec": 1 - } - ] - }, - { - "id": 2, - "texto": { - "en": "Animals", - "fr": "Animaux" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fanimales.webp?alt=media&token=de80d51b-647a-4860-9233-74b0925e053e" - }, - "relacion": [ - { - "id": 283, - "frec": 1 - }, - { - "id": 284, - "frec": 1 - }, - { - "id": 285, - "frec": 1 - }, - { - "id": 286, - "frec": 1 - }, - { - "id": 287, - "frec": 1 - }, - { - "id": 288, - "frec": 1 - }, - { - "id": 289, - "frec": 1 - }, - { - "id": 290, - "frec": 1 - }, - { - "id": 291, - "frec": 1 - }, - { - "id": 292, - "frec": 1 - }, - { - "id": 293, - "frec": 1 - }, - { - "id": 294, - "frec": 1 - }, - { - "id": 295, - "frec": 1 - }, - { - "id": 296, - "frec": 1 - }, - { - "id": 297, - "frec": 1 - }, - { - "id": 298, - "frec": 1 - }, - { - "id": 299, - "frec": 1 - }, - { - "id": 300, - "frec": 1 - }, - { - "id": 301, - "frec": 1 - }, - { - "id": 302, - "frec": 1 - }, - { - "id": 303, - "frec": 1 - }, - { - "id": 304, - "frec": 1 - }, - { - "id": 305, - "frec": 1 - }, - { - "id": 306, - "frec": 1 - }, - { - "id": 307, - "frec": 1 - }, - { - "id": 308, - "frec": 1 - }, - { - "id": 309, - "frec": 1 - }, - { - "id": 310, - "frec": 1 - }, - { - "id": 311, - "frec": 1 - }, - { - "id": 312, - "frec": 1 - }, - { - "id": 313, - "frec": 1 - }, - { - "id": 314, - "frec": 1 - }, - { - "id": 315, - "frec": 1 - }, - { - "id": 316, - "frec": 1 - }, - { - "id": 317, - "frec": 1 - }, - { - "id": 318, - "frec": 1 - }, - { - "id": 319, - "frec": 1 - }, - { - "id": 320, - "frec": 1 - }, - { - "id": 321, - "frec": 1 - }, - { - "id": 322, - "frec": 1 - }, - { - "id": 323, - "frec": 1 - }, - { - "id": 324, - "frec": 1 - }, - { - "id": 325, - "frec": 1 - }, - { - "id": 326, - "frec": 1 - }, - { - "id": 327, - "frec": 1 - }, - { - "id": 328, - "frec": 1 - }, - { - "id": 330, - "frec": 1 - }, - { - "id": 329, - "frec": 1 - }, - { - "id": 331, - "frec": 1 - }, - { - "id": 332, - "frec": 1 - }, - { - "id": 333, - "frec": 1 - }, - { - "id": 334, - "frec": 1 - }, - { - "id": 335, - "frec": 1 - }, - { - "id": 336, - "frec": 1 - }, - { - "id": 337, - "frec": 1 - }, - { - "id": 338, - "frec": 1 - }, - { - "id": 339, - "frec": 1 - }, - { - "id": 340, - "frec": 1 - }, - { - "id": 341, - "frec": 1 - }, - { - "id": 342, - "frec": 1 - }, - { - "id": 342, - "frec": 1 - }, - { - "id": 343, - "frec": 1 - }, - { - "id": 344, - "frec": 1 - }, - { - "id": 345, - "frec": 1 - }, - { - "id": 346, - "frec": 1 - }, - { - "id": 347, - "frec": 1 - }, - { - "id": 348, - "frec": 1 - }, - { - "id": 349, - "frec": 1 - }, - { - "id": 350, - "frec": 1 - }, - { - "id": 351, - "frec": 1 - }, - { - "id": 352, - "frec": 1 - }, - { - "id": 353, - "frec": 1 - }, - { - "id": 354, - "frec": 1 - }, - { - "id": 355, - "frec": 1 - }, - { - "id": 356, - "frec": 1 - }, - { - "id": 357, - "frec": 1 - }, - { - "id": 358, - "frec": 1 - }, - { - "id": 359, - "frec": 1 - }, - { - "id": 360, - "frec": 1 - }, - { - "id": 361, - "frec": 1 - }, - { - "id": 362, - "frec": 1 - }, - { - "id": 363, - "frec": 1 - }, - { - "id": 364, - "frec": 1 - }, - { - "id": 365, - "frec": 1 - }, - { - "id": 366, - "frec": 1 - }, - { - "id": 367, - "frec": 1 - }, - { - "id": 368, - "frec": 1 - }, - { - "id": 369, - "frec": 1 - }, - { - "id": 370, - "frec": 1 - }, - { - "id": 371, - "frec": 1 - }, - { - "id": 371, - "frec": 1 - }, - { - "id": 372, - "frec": 1 - }, - { - "id": 373, - "frec": 1 - }, - { - "id": 374, - "frec": 1 - }, - { - "id": 375, - "frec": 1 - }, - { - "id": 376, - "frec": 1 - } - ] - }, - { - "id": 3, - "texto": { - "en": "Food", - "fr": "Aliments" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcomidas.webp?alt=media&token=9e4bc673-e0d9-4e75-bb78-ea9b0dd294e2" - }, - "relacion": [ - { - "id": 391, - "frec": 1 - }, - { - "id": 392, - "frec": 1 - }, - { - "id": 393, - "frec": 1 - }, - { - "id": 394, - "frec": 1 - }, - { - "id": 395, - "frec": 1 - }, - { - "id": 396, - "frec": 1 - }, - { - "id": 397, - "frec": 1 - }, - { - "id": 398, - "frec": 1 - }, - { - "id": 399, - "frec": 1 - }, - { - "id": 400, - "frec": 1 - }, - { - "id": 401, - "frec": 1 - }, - { - "id": 402, - "frec": 1 - }, - { - "id": 403, - "frec": 1 - }, - { - "id": 404, - "frec": 1 - }, - { - "id": 405, - "frec": 1 - }, - { - "id": 406, - "frec": 1 - }, - { - "id": 407, - "frec": 1 - }, - { - "id": 408, - "frec": 1 - }, - { - "id": 409, - "frec": 1 - }, - { - "id": 410, - "frec": 1 - }, - { - "id": 411, - "frec": 1 - }, - { - "id": 412, - "frec": 1 - }, - { - "id": 413, - "frec": 1 - }, - { - "id": 414, - "frec": 1 - }, - { - "id": 415, - "frec": 1 - }, - { - "id": 416, - "frec": 1 - }, - { - "id": 417, - "frec": 1 - }, - { - "id": 418, - "frec": 1 - }, - { - "id": 419, - "frec": 1 - }, - { - "id": 420, - "frec": 1 - }, - { - "id": 421, - "frec": 1 - }, - { - "id": 422, - "frec": 1 - }, - { - "id": 423, - "frec": 1 - }, - { - "id": 424, - "frec": 1 - }, - { - "id": 425, - "frec": 1 - }, - { - "id": 426, - "frec": 1 - }, - { - "id": 427, - "frec": 1 - }, - { - "id": 428, - "frec": 1 - }, - { - "id": 429, - "frec": 1 - }, - { - "id": 430, - "frec": 1 - }, - { - "id": 431, - "frec": 1 - }, - { - "id": 432, - "frec": 1 - }, - { - "id": 433, - "frec": 1 - }, - { - "id": 434, - "frec": 1 - }, - { - "id": 435, - "frec": 1 - }, - { - "id": 436, - "frec": 1 - }, - { - "id": 438, - "frec": 1 - }, - { - "id": 437, - "frec": 1 - }, - { - "id": 439, - "frec": 1 - }, - { - "id": 440, - "frec": 1 - }, - { - "id": 441, - "frec": 1 - }, - { - "id": 442, - "frec": 1 - }, - { - "id": 443, - "frec": 1 - }, - { - "id": 444, - "frec": 1 - }, - { - "id": 445, - "frec": 1 - }, - { - "id": 446, - "frec": 1 - }, - { - "id": 447, - "frec": 1 - }, - { - "id": 448, - "frec": 1 - }, - { - "id": 449, - "frec": 1 - }, - { - "id": 450, - "frec": 1 - }, - { - "id": 451, - "frec": 1 - }, - { - "id": 452, - "frec": 1 - }, - { - "id": 453, - "frec": 1 - }, - { - "id": 454, - "frec": 1 - }, - { - "id": 455, - "frec": 1 - }, - { - "id": 456, - "frec": 1 - }, - { - "id": 457, - "frec": 1 - }, - { - "id": 458, - "frec": 1 - }, - { - "id": 459, - "frec": 1 - }, - { - "id": 460, - "frec": 1 - }, - { - "id": 461, - "frec": 1 - }, - { - "id": 462, - "frec": 1 - }, - { - "id": 463, - "frec": 1 - }, - { - "id": 464, - "frec": 1 - }, - { - "id": 465, - "frec": 1 - }, - { - "id": 466, - "frec": 1 - }, - { - "id": 467, - "frec": 1 - }, - { - "id": 468, - "frec": 1 - }, - { - "id": 469, - "frec": 1 - }, - { - "id": 470, - "frec": 1 - }, - { - "id": 471, - "frec": 1 - }, - { - "id": 472, - "frec": 1 - }, - { - "id": 473, - "frec": 1 - }, - { - "id": 474, - "frec": 1 - }, - { - "id": 475, - "frec": 1 - }, - { - "id": 476, - "frec": 1 - }, - { - "id": 477, - "frec": 1 - }, - { - "id": 478, - "frec": 1 - }, - { - "id": 479, - "frec": 1 - }, - { - "id": 480, - "frec": 1 - }, - { - "id": 481, - "frec": 1 - }, - { - "id": 482, - "frec": 1 - }, - { - "id": 483, - "frec": 1 - }, - { - "id": 484, - "frec": 1 - }, - { - "id": 485, - "frec": 1 - }, - { - "id": 486, - "frec": 1 - }, - { - "id": 487, - "frec": 1 - }, - { - "id": 488, - "frec": 1 - }, - { - "id": 489, - "frec": 1 - }, - { - "id": 490, - "frec": 1 - }, - { - "id": 491, - "frec": 1 - }, - { - "id": 492, - "frec": 1 - }, - { - "id": 493, - "frec": 1 - }, - { - "id": 494, - "frec": 1 - }, - { - "id": 495, - "frec": 1 - }, - { - "id": 496, - "frec": 1 - }, - { - "id": 497, - "frec": 1 - }, - { - "id": 498, - "frec": 1 - }, - { - "id": 499, - "frec": 1 - }, - { - "id": 500, - "frec": 1 - }, - { - "id": 501, - "frec": 1 - }, - { - "id": 502, - "frec": 1 - }, - { - "id": 503, - "frec": 1 - }, - { - "id": 504, - "frec": 1 - }, - { - "id": 505, - "frec": 1 - }, - { - "id": 506, - "frec": 1 - }, - { - "id": 507, - "frec": 1 - }, - { - "id": 510, - "frec": 1 - }, - { - "id": 511, - "frec": 1 - }, - { - "id": 512, - "frec": 1 - }, - { - "id": 513, - "frec": 1 - }, - { - "id": 514, - "frec": 1 - }, - { - "id": 515, - "frec": 1 - }, - { - "id": 516, - "frec": 1 - }, - { - "id": 517, - "frec": 1 - }, - { - "id": 518, - "frec": 1 - }, - { - "id": 519, - "frec": 1 - }, - { - "id": 520, - "frec": 1 - }, - { - "id": 521, - "frec": 1 - }, - { - "id": 522, - "frec": 1 - }, - { - "id": 523, - "frec": 1 - }, - { - "id": 524, - "frec": 1 - } - ] - }, - { - "id": 4, - "texto": { - "en": "House", - "fr": "Maison" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_casa.webp?alt=media&token=f1d197b6-db37-44e6-b4bc-8ba31b0fa4aa" - }, - "relacion": [ - { - "id": 2, - "frec": 1 - }, - { - "id": 3, - "frec": 1 - }, - { - "id": 5, - "frec": 1 - }, - { - "id": 8, - "frec": 1 - }, - { - "id": 17, - "frec": 1 - }, - { - "id": 20, - "frec": 1 - }, - { - "id": 157, - "frec": 1 - }, - { - "id": 199, - "frec": 1 - }, - { - "id": 222, - "frec": 1 - }, - { - "id": 263, - "frec": 1 - }, - { - "id": 586, - "frec": 1 - }, - { - "id": 599, - "frec": 1 - }, - { - "id": 605, - "frec": 1 - }, - { - "id": 653, - "frec": 1 - }, - { - "id": 678, - "frec": 1 - }, - { - "id": 731, - "frec": 1 - }, - { - "id": 755, - "frec": 1 - }, - { - "id": 758, - "frec": 1 - }, - { - "id": 773, - "frec": 1 - }, - { - "id": 774, - "frec": 1 - }, - { - "id": 1015, - "frec": 1 - }, - { - "id": 1012, - "frec": 1 - }, - { - "id": 1019, - "frec": 1 - }, - { - "id": 1023, - "frec": 1 - }, - { - "id": 1022, - "frec": 1 - }, - { - "id": 1021, - "frec": 1 - }, - { - "id": 1024, - "frec": 1 - }, - { - "id": 1025, - "frec": 1 - }, - { - "id": 1026, - "frec": 1 - }, - { - "id": 1027, - "frec": 1 - }, - { - "id": 1030, - "frec": 1 - }, - { - "id": 1031, - "frec": 1 - }, - { - "id": 1032, - "frec": 1 - } - ] - }, - { - "id": 5, - "texto": { - "en": "School", - "fr": "École" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_escuela.webp?alt=media&token=05c5460c-c3a5-4404-9389-d6a67e79bb5d" - }, - "relacion": [ - { - "id": 4, - "frec": 1 - }, - { - "id": 15, - "frec": 1 - }, - { - "id": 14, - "frec": 1 - }, - { - "id": 18, - "frec": 1 - }, - { - "id": 21, - "frec": 1 - }, - { - "id": 32, - "frec": 1 - }, - { - "id": 43, - "frec": 1 - }, - { - "id": 101, - "frec": 1 - }, - { - "id": 662, - "frec": 1 - }, - { - "id": 678, - "frec": 1 - }, - { - "id": 751, - "frec": 1 - }, - { - "id": 752, - "frec": 1 - }, - { - "id": 753, - "frec": 1 - }, - { - "id": 754, - "frec": 1 - }, - { - "id": 755, - "frec": 1 - }, - { - "id": 756, - "frec": 1 - }, - { - "id": 757, - "frec": 1 - }, - { - "id": 760, - "frec": 1 - }, - { - "id": 762, - "frec": 1 - }, - { - "id": 766, - "frec": 1 - }, - { - "id": 768, - "frec": 1 - }, - { - "id": 770, - "frec": 1 - }, - { - "id": 771, - "frec": 1 - }, - { - "id": 769, - "frec": 1 - } - ] - }, - { - "id": 6, - "texto": { - "en": "Colors", - "fr": "Couleurs" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_colores.webp?alt=media&token=04309e00-d682-43f3-9605-bde0b5b4ab9a" - }, - "relacion": [ - { - "id": 733, - "frec": 1 - }, - { - "id": 734, - "frec": 1 - }, - { - "id": 735, - "frec": 1 - }, - { - "id": 736, - "frec": 1 - }, - { - "id": 737, - "frec": 1 - }, - { - "id": 738, - "frec": 1 - }, - { - "id": 739, - "frec": 1 - }, - { - "id": 740, - "frec": 1 - }, - { - "id": 741, - "frec": 1 - }, - { - "id": 742, - "frec": 1 - }, - { - "id": 743, - "frec": 1 - }, - { - "id": 744, - "frec": 1 - }, - { - "id": 745, - "frec": 1 - }, - { - "id": 746, - "frec": 1 - }, - { - "id": 747, - "frec": 1 - }, - { - "id": 748, - "frec": 1 - }, - { - "id": 749, - "frec": 1 - }, - { - "id": 750, - "frec": 1 - } - ] - }, - { - "id": 7, - "texto": { - "en": "Concepts", - "fr": "Concepts" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fconceptos.webp?alt=media&token=544d07e2-680b-427f-a657-9a1438529627" - }, - "relacion": [ - { - "id": 702, - "frec": 1 - }, - { - "id": 703, - "frec": 1 - }, - { - "id": 704, - "frec": 1 - }, - { - "id": 705, - "frec": 1 - }, - { - "id": 706, - "frec": 1 - }, - { - "id": 707, - "frec": 1 - }, - { - "id": 708, - "frec": 1 - }, - { - "id": 709, - "frec": 1 - }, - { - "id": 710, - "frec": 1 - }, - { - "id": 711, - "frec": 1 - }, - { - "id": 712, - "frec": 1 - }, - { - "id": 713, - "frec": 1 - }, - { - "id": 714, - "frec": 1 - }, - { - "id": 715, - "frec": 1 - }, - { - "id": 716, - "frec": 1 - }, - { - "id": 717, - "frec": 1 - }, - { - "id": 718, - "frec": 1 - }, - { - "id": 719, - "frec": 1 - }, - { - "id": 720, - "frec": 1 - }, - { - "id": 721, - "frec": 1 - }, - { - "id": 722, - "frec": 1 - }, - { - "id": 723, - "frec": 1 - }, - { - "id": 724, - "frec": 1 - }, - { - "id": 725, - "frec": 1 - }, - { - "id": 726, - "frec": 1 - }, - { - "id": 727, - "frec": 1 - }, - { - "id": 728, - "frec": 1 - }, - { - "id": 729, - "frec": 1 - }, - { - "id": 730, - "frec": 1 - }, - { - "id": 731, - "frec": 1 - }, - { - "id": 732, - "frec": 1 - } - ] - }, - { - "id": 8, - "texto": { - "en": "Conjunctions", - "fr": "Conjonctions" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fconjunciones.webp?alt=media&token=bd3a504d-d5ca-45cc-a29f-869a6b578174" - }, - "relacion": [ - { - "id": 889, - "frec": 1 - }, - { - "id": 898, - "frec": 1 - }, - { - "id": 904, - "frec": 1 - }, - { - "id": 910, - "frec": 1 - }, - { - "id": 916, - "frec": 1 - }, - { - "id": 912, - "frec": 1 - }, - { - "id": 923, - "frec": 1 - } - ] - }, - { - "id": 9, - "texto": { - "en": "Body", - "fr": "Corps" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpartes_del_cuerpo.webp?alt=media&token=b09b6919-2789-46a6-a883-d21c55859e08" - }, - "relacion": [ - { - "id": 776, - "frec": 1 - }, - { - "id": 777, - "frec": 1 - }, - { - "id": 778, - "frec": 1 - }, - { - "id": 779, - "frec": 1 - }, - { - "id": 780, - "frec": 1 - }, - { - "id": 781, - "frec": 1 - }, - { - "id": 782, - "frec": 1 - }, - { - "id": 783, - "frec": 1 - }, - { - "id": 784, - "frec": 1 - }, - { - "id": 785, - "frec": 1 - }, - { - "id": 786, - "frec": 1 - }, - { - "id": 787, - "frec": 1 - }, - { - "id": 788, - "frec": 1 - }, - { - "id": 789, - "frec": 1 - }, - { - "id": 790, - "frec": 1 - }, - { - "id": 791, - "frec": 1 - }, - { - "id": 792, - "frec": 1 - }, - { - "id": 793, - "frec": 1 - }, - { - "id": 794, - "frec": 1 - }, - { - "id": 795, - "frec": 1 - }, - { - "id": 796, - "frec": 1 - }, - { - "id": 797, - "frec": 1 - }, - { - "id": 798, - "frec": 1 - }, - { - "id": 799, - "frec": 1 - }, - { - "id": 800, - "frec": 1 - }, - { - "id": 801, - "frec": 1 - }, - { - "id": 802, - "frec": 1 - }, - { - "id": 803, - "frec": 1 - }, - { - "id": 804, - "frec": 1 - }, - { - "id": 805, - "frec": 1 - }, - { - "id": 806, - "frec": 1 - }, - { - "id": 807, - "frec": 1 - }, - { - "id": 808, - "frec": 1 - }, - { - "id": 809, - "frec": 1 - } - ] - }, - { - "id": 10, - "texto": { - "en": "Music instruments", - "fr": "Instruments de musique" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Finstrumentos.webp?alt=media&token=b58a39b2-6c69-4b19-8658-8a6a4fe7ca2a" - }, - "relacion": [ - { - "id": 847, - "frec": 1 - }, - { - "id": 848, - "frec": 1 - }, - { - "id": 849, - "frec": 1 - }, - { - "id": 850, - "frec": 1 - }, - { - "id": 851, - "frec": 1 - }, - { - "id": 852, - "frec": 1 - }, - { - "id": 853, - "frec": 1 - }, - { - "id": 854, - "frec": 1 - }, - { - "id": 855, - "frec": 1 - }, - { - "id": 856, - "frec": 1 - }, - { - "id": 857, - "frec": 1 - }, - { - "id": 858, - "frec": 1 - }, - { - "id": 859, - "frec": 1 - }, - { - "id": 860, - "frec": 1 - }, - { - "id": 861, - "frec": 1 - }, - { - "id": 862, - "frec": 1 - }, - { - "id": 863, - "frec": 1 - }, - { - "id": 864, - "frec": 1 - }, - { - "id": 865, - "frec": 1 - }, - { - "id": 866, - "frec": 1 - }, - { - "id": 867, - "frec": 1 - }, - { - "id": 868, - "frec": 1 - }, - { - "id": 869, - "frec": 1 - }, - { - "id": 870, - "frec": 1 - }, - { - "id": 871, - "frec": 1 - }, - { - "id": 872, - "frec": 1 - }, - { - "id": 873, - "frec": 1 - }, - { - "id": 874, - "frec": 1 - }, - { - "id": 875, - "frec": 1 - }, - { - "id": 876, - "frec": 1 - }, - { - "id": 877, - "frec": 1 - } - ] - }, - { - "id": 11, - "texto": { - "en": "Social interactions", - "fr": "Interactions sociales" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fsociales.webp?alt=media&token=4bf39b77-0fdb-4d79-a407-14f5d66281d2" - }, - "relacion": [ - { - "id": 377, - "frec": 10 - }, - { - "id": 378, - "frec": 3 - }, - { - "id": 379, - "frec": 7 - }, - { - "id": 380, - "frec": 1 - }, - { - "id": 381, - "frec": 1 - }, - { - "id": 382, - "frec": 1 - }, - { - "id": 383, - "frec": 1 - }, - { - "id": 384, - "frec": 1 - }, - { - "id": 385, - "frec": 1 - }, - { - "id": 386, - "frec": 1 - }, - { - "id": 387, - "frec": 1 - }, - { - "id": 388, - "frec": 1 - }, - { - "id": 389, - "frec": 1 - }, - { - "id": 390, - "frec": 1 - } - ] - }, - { - "id": 12, - "texto": { - "en": "Toys", - "fr": "Jouets" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fjuguetes.webp?alt=media&token=046c8f8b-7518-4aac-9c56-6ac6fe4a03ef" - }, - "relacion": [ - { - "id": 975, - "frec": 1 - }, - { - "id": 976, - "frec": 1 - }, - { - "id": 977, - "frec": 1 - }, - { - "id": 978, - "frec": 1 - }, - { - "id": 979, - "frec": 1 - }, - { - "id": 980, - "frec": 1 - }, - { - "id": 981, - "frec": 1 - }, - { - "id": 982, - "frec": 1 - }, - { - "id": 983, - "frec": 1 - }, - { - "id": 984, - "frec": 1 - }, - { - "id": 985, - "frec": 1 - }, - { - "id": 986, - "frec": 1 - }, - { - "id": 987, - "frec": 1 - }, - { - "id": 989, - "frec": 1 - }, - { - "id": 990, - "frec": 1 - }, - { - "id": 988, - "frec": 1 - }, - { - "id": 991, - "frec": 1 - }, - { - "id": 992, - "frec": 1 - }, - { - "id": 993, - "frec": 1 - }, - { - "id": 994, - "frec": 1 - }, - { - "id": 995, - "frec": 1 - }, - { - "id": 996, - "frec": 1 - }, - { - "id": 997, - "frec": 1 - }, - { - "id": 998, - "frec": 1 - }, - { - "id": 999, - "frec": 1 - }, - { - "id": 1000, - "frec": 1 - }, - { - "id": 1001, - "frec": 1 - }, - { - "id": 1002, - "frec": 1 - }, - { - "id": 1003, - "frec": 1 - }, - { - "id": 1004, - "frec": 1 - }, - { - "id": 1005, - "frec": 1 - }, - { - "id": 1006, - "frec": 1 - }, - { - "id": 1007, - "frec": 1 - }, - { - "id": 1008, - "frec": 1 - }, - { - "id": 1009, - "frec": 1 - }, - { - "id": 1010, - "frec": 1 - }, - { - "id": 1011, - "frec": 1 - }, - { - "id": 1012, - "frec": 1 - }, - { - "id": 1013, - "frec": 1 - }, - { - "id": 1014, - "frec": 1 - }, - { - "id": 1015, - "frec": 1 - }, - { - "id": 1016, - "frec": 1 - }, - { - "id": 1017, - "frec": 1 - }, - { - "id": 1018, - "frec": 1 - }, - { - "id": 1019, - "frec": 1 - }, - { - "id": 1020, - "frec": 1 - }, - { - "id": 1021, - "frec": 1 - }, - { - "id": 1022, - "frec": 1 - } - ] - }, - { - "id": 13, - "texto": { - "en": "Places", - "fr": "Des endroits" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Flugares.webp?alt=media&token=fa4c9b84-7f78-49d3-8fe7-b67335365b94" - }, - "relacion": [ - { - "id": 644, - "frec": 1 - }, - { - "id": 645, - "frec": 1 - }, - { - "id": 646, - "frec": 1 - }, - { - "id": 647, - "frec": 1 - }, - { - "id": 648, - "frec": 1 - }, - { - "id": 649, - "frec": 1 - }, - { - "id": 650, - "frec": 1 - }, - { - "id": 651, - "frec": 1 - }, - { - "id": 652, - "frec": 1 - }, - { - "id": 653, - "frec": 1 - }, - { - "id": 654, - "frec": 1 - }, - { - "id": 655, - "frec": 1 - }, - { - "id": 656, - "frec": 1 - }, - { - "id": 657, - "frec": 1 - }, - { - "id": 658, - "frec": 1 - }, - { - "id": 659, - "frec": 1 - }, - { - "id": 660, - "frec": 1 - }, - { - "id": 661, - "frec": 1 - }, - { - "id": 662, - "frec": 1 - }, - { - "id": 663, - "frec": 1 - }, - { - "id": 664, - "frec": 1 - }, - { - "id": 665, - "frec": 1 - }, - { - "id": 666, - "frec": 1 - }, - { - "id": 667, - "frec": 1 - }, - { - "id": 668, - "frec": 1 - }, - { - "id": 669, - "frec": 1 - }, - { - "id": 670, - "frec": 1 - }, - { - "id": 671, - "frec": 1 - }, - { - "id": 672, - "frec": 1 - }, - { - "id": 673, - "frec": 1 - }, - { - "id": 674, - "frec": 1 - }, - { - "id": 675, - "frec": 1 - }, - { - "id": 676, - "frec": 1 - }, - { - "id": 677, - "frec": 1 - }, - { - "id": 678, - "frec": 1 - }, - { - "id": 679, - "frec": 1 - }, - { - "id": 680, - "frec": 1 - }, - { - "id": 681, - "frec": 1 - }, - { - "id": 682, - "frec": 1 - }, - { - "id": 683, - "frec": 1 - }, - { - "id": 684, - "frec": 1 - }, - { - "id": 685, - "frec": 1 - }, - { - "id": 686, - "frec": 1 - }, - { - "id": 687, - "frec": 1 - }, - { - "id": 688, - "frec": 1 - }, - { - "id": 689, - "frec": 1 - }, - { - "id": 690, - "frec": 1 - }, - { - "id": 691, - "frec": 1 - }, - { - "id": 692, - "frec": 1 - }, - { - "id": 693, - "frec": 1 - }, - { - "id": 694, - "frec": 1 - }, - { - "id": 695, - "frec": 1 - }, - { - "id": 696, - "frec": 1 - }, - { - "id": 697, - "frec": 1 - }, - { - "id": 698, - "frec": 1 - }, - { - "id": 699, - "frec": 1 - }, - { - "id": 700, - "frec": 1 - }, - { - "id": 701, - "frec": 1 - }, - { - "id": 508, - "frec": 1 - } - ] - }, - { - "id": 15, - "texto": { - "en": "Numbers", - "fr": "Nombres" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fnumeros.webp?alt=media&token=51f29b27-7998-4db5-bcad-ecc7979beea5" - }, - "relacion": [ - { - "id": 836, - "frec": 1 - }, - { - "id": 837, - "frec": 1 - }, - { - "id": 838, - "frec": 1 - }, - { - "id": 839, - "frec": 1 - }, - { - "id": 840, - "frec": 1 - }, - { - "id": 841, - "frec": 1 - }, - { - "id": 842, - "frec": 1 - }, - { - "id": 843, - "frec": 1 - }, - { - "id": 844, - "frec": 1 - }, - { - "id": 845, - "frec": 1 - }, - { - "id": 846, - "frec": 1 - } - ] - }, - { - "id": 16, - "texto": { - "en": "Clothing", - "fr": "Vêtements" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fropa.webp?alt=media&token=52aa7f5e-5b8e-4cf2-9e2b-451f9e06e042" - }, - "relacion": [ - { - "id": 924, - "frec": 1 - }, - { - "id": 925, - "frec": 1 - }, - { - "id": 926, - "frec": 1 - }, - { - "id": 927, - "frec": 1 - }, - { - "id": 928, - "frec": 1 - }, - { - "id": 929, - "frec": 1 - }, - { - "id": 930, - "frec": 1 - }, - { - "id": 931, - "frec": 1 - }, - { - "id": 932, - "frec": 1 - }, - { - "id": 933, - "frec": 1 - }, - { - "id": 934, - "frec": 1 - }, - { - "id": 935, - "frec": 1 - }, - { - "id": 936, - "frec": 1 - }, - { - "id": 937, - "frec": 1 - }, - { - "id": 938, - "frec": 1 - }, - { - "id": 939, - "frec": 1 - }, - { - "id": 940, - "frec": 1 - }, - { - "id": 941, - "frec": 1 - }, - { - "id": 942, - "frec": 1 - }, - { - "id": 943, - "frec": 1 - }, - { - "id": 944, - "frec": 1 - }, - { - "id": 945, - "frec": 1 - }, - { - "id": 946, - "frec": 1 - }, - { - "id": 947, - "frec": 1 - }, - { - "id": 948, - "frec": 1 - }, - { - "id": 949, - "frec": 1 - }, - { - "id": 950, - "frec": 1 - }, - { - "id": 952, - "frec": 1 - }, - { - "id": 953, - "frec": 1 - }, - { - "id": 954, - "frec": 1 - }, - { - "id": 951, - "frec": 1 - }, - { - "id": 955, - "frec": 1 - }, - { - "id": 956, - "frec": 1 - }, - { - "id": 957, - "frec": 1 - }, - { - "id": 958, - "frec": 1 - }, - { - "id": 959, - "frec": 1 - }, - { - "id": 960, - "frec": 1 - }, - { - "id": 961, - "frec": 1 - }, - { - "id": 962, - "frec": 1 - }, - { - "id": 963, - "frec": 1 - }, - { - "id": 964, - "frec": 1 - }, - { - "id": 965, - "frec": 1 - }, - { - "id": 966, - "frec": 1 - }, - { - "id": 967, - "frec": 1 - }, - { - "id": 968, - "frec": 1 - }, - { - "id": 969, - "frec": 1 - }, - { - "id": 970, - "frec": 1 - }, - { - "id": 971, - "frec": 1 - }, - { - "id": 972, - "frec": 1 - }, - { - "id": 973, - "frec": 1 - }, - { - "id": 974, - "frec": 1 - } - ] - }, - { - "id": 17, - "texto": { - "en": "People", - "fr": "Gens" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpersonas.webp?alt=media&token=a5223e39-5426-4728-beda-8579fbc82adf" - }, - "relacion": [ - { - "id": 509, - "frec": 1 - }, - { - "id": 614, - "frec": 1 - }, - { - "id": 615, - "frec": 1 - }, - { - "id": 616, - "frec": 1 - }, - { - "id": 618, - "frec": 1 - }, - { - "id": 617, - "frec": 1 - }, - { - "id": 619, - "frec": 1 - }, - { - "id": 620, - "frec": 1 - }, - { - "id": 621, - "frec": 1 - }, - { - "id": 622, - "frec": 1 - }, - { - "id": 623, - "frec": 1 - }, - { - "id": 624, - "frec": 1 - }, - { - "id": 625, - "frec": 1 - }, - { - "id": 626, - "frec": 1 - }, - { - "id": 627, - "frec": 1 - }, - { - "id": 628, - "frec": 1 - }, - { - "id": 629, - "frec": 1 - }, - { - "id": 630, - "frec": 1 - }, - { - "id": 631, - "frec": 1 - }, - { - "id": 632, - "frec": 1 - }, - { - "id": 633, - "frec": 1 - }, - { - "id": 634, - "frec": 1 - }, - { - "id": 635, - "frec": 1 - }, - { - "id": 636, - "frec": 1 - }, - { - "id": 637, - "frec": 1 - }, - { - "id": 638, - "frec": 1 - }, - { - "id": 639, - "frec": 1 - }, - { - "id": 640, - "frec": 1 - }, - { - "id": 641, - "frec": 1 - }, - { - "id": 642, - "frec": 1 - }, - { - "id": 643, - "frec": 2 - } - ] - }, - { - "id": 18, - "texto": { - "en": "Prepositions", - "fr": "Prépositions" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpreposiciones.webp?alt=media&token=73b3d814-e509-4ed4-b4f7-cde7c0b4c2a5" - }, - "relacion": [ - { - "id": 525, - "frec": 1 - }, - { - "id": 526, - "frec": 1 - }, - { - "id": 527, - "frec": 1 - }, - { - "id": 528, - "frec": 1 - }, - { - "id": 529, - "frec": 1 - }, - { - "id": 530, - "frec": 1 - }, - { - "id": 531, - "frec": 1 - }, - { - "id": 532, - "frec": 1 - }, - { - "id": 533, - "frec": 1 - }, - { - "id": 534, - "frec": 1 - }, - { - "id": 535, - "frec": 1 - }, - { - "id": 536, - "frec": 1 - }, - { - "id": 537, - "frec": 1 - }, - { - "id": 538, - "frec": 1 - }, - { - "id": 539, - "frec": 1 - }, - { - "id": 540, - "frec": 1 - }, - { - "id": 541, - "frec": 1 - }, - { - "id": 542, - "frec": 1 - } - ] - }, - { - "id": 19, - "texto": { - "en": "Pronouns", - "fr": "Pronoms" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpronombres.webp?alt=media&token=fde2895a-c02f-464c-b487-ec4826cca6bd" - }, - "relacion": [ - { - "id": 888, - "frec": 1 - }, - { - "id": 889, - "frec": 1 - }, - { - "id": 890, - "frec": 1 - }, - { - "id": 891, - "frec": 1 - }, - { - "id": 892, - "frec": 1 - }, - { - "id": 893, - "frec": 1 - }, - { - "id": 894, - "frec": 1 - }, - { - "id": 895, - "frec": 1 - }, - { - "id": 896, - "frec": 1 - }, - { - "id": 897, - "frec": 1 - }, - { - "id": 898, - "frec": 1 - }, - { - "id": 899, - "frec": 1 - }, - { - "id": 900, - "frec": 1 - }, - { - "id": 901, - "frec": 1 - }, - { - "id": 902, - "frec": 1 - }, - { - "id": 903, - "frec": 1 - }, - { - "id": 904, - "frec": 1 - }, - { - "id": 905, - "frec": 1 - }, - { - "id": 906, - "frec": 1 - }, - { - "id": 907, - "frec": 1 - }, - { - "id": 908, - "frec": 1 - }, - { - "id": 909, - "frec": 1 - }, - { - "id": 910, - "frec": 1 - }, - { - "id": 911, - "frec": 1 - }, - { - "id": 912, - "frec": 1 - }, - { - "id": 913, - "frec": 1 - }, - { - "id": 914, - "frec": 1 - }, - { - "id": 915, - "frec": 1 - }, - { - "id": 916, - "frec": 1 - }, - { - "id": 917, - "frec": 1 - }, - { - "id": 918, - "frec": 1 - }, - { - "id": 919, - "frec": 1 - }, - { - "id": 920, - "frec": 1 - }, - { - "id": 921, - "frec": 1 - }, - { - "id": 922, - "frec": 1 - }, - { - "id": 923, - "frec": 1 - } - ] - }, - { - "id": 20, - "texto": { - "en": "Feelings", - "fr": "Sentiments" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fsentimientos.webp?alt=media&token=90954fb0-bf68-48fe-8f12-d9dfc21963da" - }, - "relacion": [ - { - "id": 119, - "frec": 1 - }, - { - "id": 120, - "frec": 1 - }, - { - "id": 121, - "frec": 1 - }, - { - "id": 124, - "frec": 1 - }, - { - "id": 125, - "frec": 1 - }, - { - "id": 128, - "frec": 1 - }, - { - "id": 133, - "frec": 1 - }, - { - "id": 137, - "frec": 1 - }, - { - "id": 151, - "frec": 1 - }, - { - "id": 161, - "frec": 1 - }, - { - "id": 164, - "frec": 1 - }, - { - "id": 167, - "frec": 1 - }, - { - "id": 171, - "frec": 1 - }, - { - "id": 190, - "frec": 1 - }, - { - "id": 194, - "frec": 1 - }, - { - "id": 212, - "frec": 1 - }, - { - "id": 217, - "frec": 1 - }, - { - "id": 237, - "frec": 1 - }, - { - "id": 272, - "frec": 1 - } - ] - }, - { - "id": 21, - "texto": { - "en": "Stores", - "fr": "Magasins" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Flibro_tiendas.webp?alt=media&token=4f4f3669-ad33-4baa-8a6e-bace7f17b45f" - }, - "relacion": [ - { - "id": 508, - "frec": 1 - }, - { - "id": 647, - "frec": 1 - }, - { - "id": 650, - "frec": 1 - }, - { - "id": 652, - "frec": 1 - }, - { - "id": 654, - "frec": 1 - }, - { - "id": 655, - "frec": 1 - }, - { - "id": 658, - "frec": 1 - }, - { - "id": 659, - "frec": 1 - }, - { - "id": 661, - "frec": 1 - }, - { - "id": 664, - "frec": 1 - }, - { - "id": 666, - "frec": 1 - }, - { - "id": 673, - "frec": 1 - }, - { - "id": 674, - "frec": 1 - }, - { - "id": 675, - "frec": 1 - }, - { - "id": 677, - "frec": 1 - }, - { - "id": 679, - "frec": 1 - }, - { - "id": 680, - "frec": 1 - }, - { - "id": 684, - "frec": 1 - }, - { - "id": 688, - "frec": 1 - }, - { - "id": 690, - "frec": 1 - }, - { - "id": 691, - "frec": 1 - }, - { - "id": 692, - "frec": 1 - }, - { - "id": 693, - "frec": 1 - }, - { - "id": 694, - "frec": 1 - }, - { - "id": 695, - "frec": 1 - }, - { - "id": 696, - "frec": 1 - }, - { - "id": 697, - "frec": 1 - }, - { - "id": 698, - "frec": 1 - }, - { - "id": 699, - "frec": 1 - }, - { - "id": 700, - "frec": 1 - } - ] - }, - { - "id": 22, - "texto": { - "en": "Time", - "fr": "Temps" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ftiempos.webp?alt=media&token=a9cba0e5-1635-4d9c-8f1b-9db6243f7e5f" - }, - "relacion": [ - { - "id": 813, - "frec": 1 - }, - { - "id": 812, - "frec": 1 - }, - { - "id": 811, - "frec": 1 - }, - { - "id": 814, - "frec": 1 - }, - { - "id": 815, - "frec": 1 - }, - { - "id": 816, - "frec": 1 - }, - { - "id": 817, - "frec": 1 - }, - { - "id": 818, - "frec": 1 - }, - { - "id": 810, - "frec": 1 - } - ] - }, - { - "id": 23, - "texto": { - "en": "Transport", - "fr": "Transport" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ftransportes.webp?alt=media&token=94bd980f-eeed-4310-8fe7-09148e19612f" - }, - "relacion": [ - { - "id": 606, - "frec": 1 - }, - { - "id": 607, - "frec": 1 - }, - { - "id": 608, - "frec": 1 - }, - { - "id": 609, - "frec": 1 - }, - { - "id": 610, - "frec": 1 - }, - { - "id": 611, - "frec": 1 - }, - { - "id": 612, - "frec": 1 - }, - { - "id": 613, - "frec": 1 - } - ] - }, - { - "id": 24, - "texto": { - "en": "ALL", - "fr": "TOUT" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ftodos.webp?alt=media&token=694aae8b-22c8-4274-b9f1-b3bbdd15d061" - }, - "relacion": [ - { - "id": 1, - "frec": 1 - }, - { - "id": 2, - "frec": 1 - }, - { - "id": 3, - "frec": 1 - }, - { - "id": 4, - "frec": 1 - }, - { - "id": 5, - "frec": 1 - }, - { - "id": 6, - "frec": 1 - }, - { - "id": 7, - "frec": 1 - }, - { - "id": 8, - "frec": 1 - }, - { - "id": 9, - "frec": 1 - }, - { - "id": 10, - "frec": 1 - }, - { - "id": 11, - "frec": 1 - }, - { - "id": 12, - "frec": 1 - }, - { - "id": 13, - "frec": 1 - }, - { - "id": 14, - "frec": 1 - }, - { - "id": 15, - "frec": 1 - }, - { - "id": 16, - "frec": 1 - }, - { - "id": 17, - "frec": 1 - }, - { - "id": 18, - "frec": 1 - }, - { - "id": 19, - "frec": 1 - }, - { - "id": 20, - "frec": 1 - }, - { - "id": 21, - "frec": 1 - }, - { - "id": 22, - "frec": 1 - }, - { - "id": 23, - "frec": 1 - }, - { - "id": 24, - "frec": 1 - }, - { - "id": 25, - "frec": 1 - }, - { - "id": 26, - "frec": 1 - }, - { - "id": 27, - "frec": 1 - }, - { - "id": 28, - "frec": 1 - }, - { - "id": 29, - "frec": 1 - }, - { - "id": 30, - "frec": 1 - }, - { - "id": 31, - "frec": 1 - }, - { - "id": 32, - "frec": 1 - }, - { - "id": 33, - "frec": 1 - }, - { - "id": 34, - "frec": 1 - }, - { - "id": 35, - "frec": 1 - }, - { - "id": 36, - "frec": 1 - }, - { - "id": 37, - "frec": 1 - }, - { - "id": 38, - "frec": 1 - }, - { - "id": 39, - "frec": 1 - }, - { - "id": 40, - "frec": 1 - }, - { - "id": 41, - "frec": 1 - }, - { - "id": 42, - "frec": 1 - }, - { - "id": 43, - "frec": 1 - }, - { - "id": 44, - "frec": 1 - }, - { - "id": 45, - "frec": 1 - }, - { - "id": 46, - "frec": 1 - }, - { - "id": 47, - "frec": 1 - }, - { - "id": 48, - "frec": 1 - }, - { - "id": 49, - "frec": 2 - }, - { - "id": 50, - "frec": 1 - }, - { - "id": 51, - "frec": 1 - }, - { - "id": 52, - "frec": 1 - }, - { - "id": 53, - "frec": 1 - }, - { - "id": 54, - "frec": 1 - }, - { - "id": 55, - "frec": 1 - }, - { - "id": 56, - "frec": 1 - }, - { - "id": 57, - "frec": 1 - }, - { - "id": 58, - "frec": 1 - }, - { - "id": 59, - "frec": 1 - }, - { - "id": 60, - "frec": 1 - }, - { - "id": 61, - "frec": 1 - }, - { - "id": 62, - "frec": 1 - }, - { - "id": 63, - "frec": 1 - }, - { - "id": 64, - "frec": 1 - }, - { - "id": 65, - "frec": 1 - }, - { - "id": 66, - "frec": 1 - }, - { - "id": 67, - "frec": 1 - }, - { - "id": 68, - "frec": 1 - }, - { - "id": 69, - "frec": 1 - }, - { - "id": 70, - "frec": 1 - }, - { - "id": 71, - "frec": 1 - }, - { - "id": 72, - "frec": 1 - }, - { - "id": 73, - "frec": 1 - }, - { - "id": 74, - "frec": 1 - }, - { - "id": 75, - "frec": 1 - }, - { - "id": 76, - "frec": 1 - }, - { - "id": 77, - "frec": 1 - }, - { - "id": 78, - "frec": 1 - }, - { - "id": 79, - "frec": 1 - }, - { - "id": 80, - "frec": 1 - }, - { - "id": 81, - "frec": 1 - }, - { - "id": 82, - "frec": 1 - }, - { - "id": 83, - "frec": 1 - }, - { - "id": 84, - "frec": 1 - }, - { - "id": 85, - "frec": 1 - }, - { - "id": 86, - "frec": 1 - }, - { - "id": 87, - "frec": 1 - }, - { - "id": 88, - "frec": 1 - }, - { - "id": 89, - "frec": 1 - }, - { - "id": 90, - "frec": 1 - }, - { - "id": 91, - "frec": 1 - }, - { - "id": 92, - "frec": 1 - }, - { - "id": 93, - "frec": 1 - }, - { - "id": 94, - "frec": 1 - }, - { - "id": 95, - "frec": 1 - }, - { - "id": 96, - "frec": 1 - }, - { - "id": 97, - "frec": 1 - }, - { - "id": 98, - "frec": 1 - }, - { - "id": 99, - "frec": 1 - }, - { - "id": 100, - "frec": 1 - }, - { - "id": 101, - "frec": 1 - }, - { - "id": 102, - "frec": 1 - }, - { - "id": 103, - "frec": 1 - }, - { - "id": 104, - "frec": 1 - }, - { - "id": 105, - "frec": 1 - }, - { - "id": 106, - "frec": 1 - }, - { - "id": 107, - "frec": 1 - }, - { - "id": 108, - "frec": 1 - }, - { - "id": 109, - "frec": 1 - }, - { - "id": 110, - "frec": 1 - }, - { - "id": 111, - "frec": 1 - }, - { - "id": 112, - "frec": 1 - }, - { - "id": 113, - "frec": 1 - }, - { - "id": 114, - "frec": 1 - }, - { - "id": 115, - "frec": 1 - }, - { - "id": 116, - "frec": 1 - }, - { - "id": 117, - "frec": 1 - }, - { - "id": 118, - "frec": 1 - }, - { - "id": 119, - "frec": 1 - }, - { - "id": 120, - "frec": 1 - }, - { - "id": 121, - "frec": 1 - }, - { - "id": 122, - "frec": 1 - }, - { - "id": 123, - "frec": 1 - }, - { - "id": 124, - "frec": 1 - }, - { - "id": 125, - "frec": 1 - }, - { - "id": 126, - "frec": 1 - }, - { - "id": 127, - "frec": 1 - }, - { - "id": 128, - "frec": 1 - }, - { - "id": 129, - "frec": 1 - }, - { - "id": 130, - "frec": 1 - }, - { - "id": 131, - "frec": 1 - }, - { - "id": 132, - "frec": 1 - }, - { - "id": 133, - "frec": 1 - }, - { - "id": 134, - "frec": 1 - }, - { - "id": 135, - "frec": 1 - }, - { - "id": 136, - "frec": 1 - }, - { - "id": 137, - "frec": 1 - }, - { - "id": 138, - "frec": 1 - }, - { - "id": 139, - "frec": 1 - }, - { - "id": 140, - "frec": 1 - }, - { - "id": 141, - "frec": 1 - }, - { - "id": 142, - "frec": 1 - }, - { - "id": 143, - "frec": 1 - }, - { - "id": 144, - "frec": 1 - }, - { - "id": 145, - "frec": 1 - }, - { - "id": 146, - "frec": 1 - }, - { - "id": 147, - "frec": 1 - }, - { - "id": 148, - "frec": 1 - }, - { - "id": 149, - "frec": 1 - }, - { - "id": 150, - "frec": 1 - }, - { - "id": 151, - "frec": 1 - }, - { - "id": 152, - "frec": 1 - }, - { - "id": 153, - "frec": 1 - }, - { - "id": 154, - "frec": 1 - }, - { - "id": 155, - "frec": 1 - }, - { - "id": 156, - "frec": 1 - }, - { - "id": 157, - "frec": 1 - }, - { - "id": 158, - "frec": 1 - }, - { - "id": 159, - "frec": 1 - }, - { - "id": 160, - "frec": 1 - }, - { - "id": 161, - "frec": 1 - }, - { - "id": 162, - "frec": 1 - }, - { - "id": 163, - "frec": 1 - }, - { - "id": 164, - "frec": 1 - }, - { - "id": 165, - "frec": 1 - }, - { - "id": 166, - "frec": 1 - }, - { - "id": 167, - "frec": 1 - }, - { - "id": 168, - "frec": 1 - }, - { - "id": 169, - "frec": 1 - }, - { - "id": 170, - "frec": 1 - }, - { - "id": 171, - "frec": 1 - }, - { - "id": 172, - "frec": 1 - }, - { - "id": 173, - "frec": 1 - }, - { - "id": 174, - "frec": 1 - }, - { - "id": 175, - "frec": 1 - }, - { - "id": 176, - "frec": 1 - }, - { - "id": 177, - "frec": 1 - }, - { - "id": 178, - "frec": 1 - }, - { - "id": 179, - "frec": 1 - }, - { - "id": 180, - "frec": 1 - }, - { - "id": 181, - "frec": 1 - }, - { - "id": 182, - "frec": 1 - }, - { - "id": 183, - "frec": 1 - }, - { - "id": 184, - "frec": 1 - }, - { - "id": 185, - "frec": 1 - }, - { - "id": 186, - "frec": 1 - }, - { - "id": 187, - "frec": 1 - }, - { - "id": 188, - "frec": 1 - }, - { - "id": 189, - "frec": 1 - }, - { - "id": 190, - "frec": 1 - }, - { - "id": 191, - "frec": 1 - }, - { - "id": 192, - "frec": 1 - }, - { - "id": 193, - "frec": 1 - }, - { - "id": 194, - "frec": 1 - }, - { - "id": 195, - "frec": 1 - }, - { - "id": 196, - "frec": 1 - }, - { - "id": 197, - "frec": 1 - }, - { - "id": 198, - "frec": 1 - }, - { - "id": 199, - "frec": 1 - }, - { - "id": 200, - "frec": 1 - }, - { - "id": 201, - "frec": 1 - }, - { - "id": 202, - "frec": 1 - }, - { - "id": 203, - "frec": 1 - }, - { - "id": 204, - "frec": 1 - }, - { - "id": 205, - "frec": 1 - }, - { - "id": 206, - "frec": 1 - }, - { - "id": 207, - "frec": 1 - }, - { - "id": 208, - "frec": 1 - }, - { - "id": 209, - "frec": 1 - }, - { - "id": 210, - "frec": 1 - }, - { - "id": 211, - "frec": 1 - }, - { - "id": 212, - "frec": 1 - }, - { - "id": 213, - "frec": 1 - }, - { - "id": 214, - "frec": 1 - }, - { - "id": 215, - "frec": 1 - }, - { - "id": 216, - "frec": 1 - }, - { - "id": 217, - "frec": 1 - }, - { - "id": 218, - "frec": 1 - }, - { - "id": 219, - "frec": 1 - }, - { - "id": 220, - "frec": 1 - }, - { - "id": 221, - "frec": 1 - }, - { - "id": 222, - "frec": 1 - }, - { - "id": 223, - "frec": 1 - }, - { - "id": 224, - "frec": 1 - }, - { - "id": 225, - "frec": 1 - }, - { - "id": 226, - "frec": 1 - }, - { - "id": 227, - "frec": 1 - }, - { - "id": 228, - "frec": 1 - }, - { - "id": 229, - "frec": 1 - }, - { - "id": 230, - "frec": 1 - }, - { - "id": 231, - "frec": 1 - }, - { - "id": 232, - "frec": 1 - }, - { - "id": 233, - "frec": 1 - }, - { - "id": 234, - "frec": 1 - }, - { - "id": 235, - "frec": 1 - }, - { - "id": 236, - "frec": 1 - }, - { - "id": 237, - "frec": 1 - }, - { - "id": 238, - "frec": 1 - }, - { - "id": 239, - "frec": 1 - }, - { - "id": 240, - "frec": 1 - }, - { - "id": 241, - "frec": 1 - }, - { - "id": 242, - "frec": 1 - }, - { - "id": 243, - "frec": 1 - }, - { - "id": 244, - "frec": 1 - }, - { - "id": 245, - "frec": 1 - }, - { - "id": 246, - "frec": 1 - }, - { - "id": 247, - "frec": 1 - }, - { - "id": 248, - "frec": 1 - }, - { - "id": 249, - "frec": 1 - }, - { - "id": 250, - "frec": 1 - }, - { - "id": 251, - "frec": 1 - }, - { - "id": 252, - "frec": 1 - }, - { - "id": 253, - "frec": 1 - }, - { - "id": 254, - "frec": 1 - }, - { - "id": 255, - "frec": 1 - }, - { - "id": 256, - "frec": 1 - }, - { - "id": 257, - "frec": 1 - }, - { - "id": 258, - "frec": 1 - }, - { - "id": 259, - "frec": 1 - }, - { - "id": 260, - "frec": 1 - }, - { - "id": 261, - "frec": 1 - }, - { - "id": 262, - "frec": 1 - }, - { - "id": 263, - "frec": 1 - }, - { - "id": 264, - "frec": 1 - }, - { - "id": 265, - "frec": 1 - }, - { - "id": 266, - "frec": 1 - }, - { - "id": 267, - "frec": 1 - }, - { - "id": 268, - "frec": 1 - }, - { - "id": 269, - "frec": 1 - }, - { - "id": 270, - "frec": 1 - }, - { - "id": 271, - "frec": 1 - }, - { - "id": 272, - "frec": 1 - }, - { - "id": 273, - "frec": 1 - }, - { - "id": 274, - "frec": 1 - }, - { - "id": 275, - "frec": 1 - }, - { - "id": 276, - "frec": 1 - }, - { - "id": 277, - "frec": 1 - }, - { - "id": 278, - "frec": 1 - }, - { - "id": 279, - "frec": 1 - }, - { - "id": 280, - "frec": 1 - }, - { - "id": 281, - "frec": 1 - }, - { - "id": 282, - "frec": 1 - }, - { - "id": 283, - "frec": 1 - }, - { - "id": 284, - "frec": 1 - }, - { - "id": 285, - "frec": 1 - }, - { - "id": 286, - "frec": 1 - }, - { - "id": 287, - "frec": 1 - }, - { - "id": 288, - "frec": 1 - }, - { - "id": 289, - "frec": 1 - }, - { - "id": 290, - "frec": 1 - }, - { - "id": 291, - "frec": 1 - }, - { - "id": 292, - "frec": 1 - }, - { - "id": 293, - "frec": 1 - }, - { - "id": 294, - "frec": 1 - }, - { - "id": 295, - "frec": 1 - }, - { - "id": 296, - "frec": 1 - }, - { - "id": 297, - "frec": 1 - }, - { - "id": 298, - "frec": 1 - }, - { - "id": 299, - "frec": 1 - }, - { - "id": 300, - "frec": 1 - }, - { - "id": 301, - "frec": 1 - }, - { - "id": 302, - "frec": 1 - }, - { - "id": 303, - "frec": 1 - }, - { - "id": 304, - "frec": 1 - }, - { - "id": 305, - "frec": 1 - }, - { - "id": 306, - "frec": 1 - }, - { - "id": 307, - "frec": 1 - }, - { - "id": 308, - "frec": 1 - }, - { - "id": 309, - "frec": 1 - }, - { - "id": 310, - "frec": 1 - }, - { - "id": 311, - "frec": 1 - }, - { - "id": 312, - "frec": 1 - }, - { - "id": 313, - "frec": 1 - }, - { - "id": 314, - "frec": 1 - }, - { - "id": 315, - "frec": 1 - }, - { - "id": 316, - "frec": 1 - }, - { - "id": 317, - "frec": 1 - }, - { - "id": 318, - "frec": 1 - }, - { - "id": 319, - "frec": 1 - }, - { - "id": 320, - "frec": 1 - }, - { - "id": 321, - "frec": 1 - }, - { - "id": 322, - "frec": 1 - }, - { - "id": 323, - "frec": 1 - }, - { - "id": 324, - "frec": 1 - }, - { - "id": 325, - "frec": 1 - }, - { - "id": 326, - "frec": 1 - }, - { - "id": 327, - "frec": 1 - }, - { - "id": 328, - "frec": 1 - }, - { - "id": 329, - "frec": 1 - }, - { - "id": 330, - "frec": 1 - }, - { - "id": 331, - "frec": 1 - }, - { - "id": 332, - "frec": 1 - }, - { - "id": 333, - "frec": 1 - }, - { - "id": 334, - "frec": 1 - }, - { - "id": 335, - "frec": 1 - }, - { - "id": 336, - "frec": 1 - }, - { - "id": 337, - "frec": 1 - }, - { - "id": 338, - "frec": 1 - }, - { - "id": 339, - "frec": 1 - }, - { - "id": 340, - "frec": 1 - }, - { - "id": 341, - "frec": 1 - }, - { - "id": 342, - "frec": 1 - }, - { - "id": 343, - "frec": 1 - }, - { - "id": 344, - "frec": 1 - }, - { - "id": 345, - "frec": 1 - }, - { - "id": 346, - "frec": 1 - }, - { - "id": 347, - "frec": 1 - }, - { - "id": 348, - "frec": 1 - }, - { - "id": 349, - "frec": 1 - }, - { - "id": 350, - "frec": 1 - }, - { - "id": 351, - "frec": 1 - }, - { - "id": 352, - "frec": 1 - }, - { - "id": 353, - "frec": 1 - }, - { - "id": 354, - "frec": 1 - }, - { - "id": 355, - "frec": 1 - }, - { - "id": 356, - "frec": 1 - }, - { - "id": 357, - "frec": 1 - }, - { - "id": 358, - "frec": 1 - }, - { - "id": 359, - "frec": 1 - }, - { - "id": 360, - "frec": 1 - }, - { - "id": 361, - "frec": 1 - }, - { - "id": 362, - "frec": 1 - }, - { - "id": 363, - "frec": 1 - }, - { - "id": 364, - "frec": 1 - }, - { - "id": 365, - "frec": 1 - }, - { - "id": 366, - "frec": 1 - }, - { - "id": 367, - "frec": 1 - }, - { - "id": 368, - "frec": 1 - }, - { - "id": 369, - "frec": 1 - }, - { - "id": 370, - "frec": 1 - }, - { - "id": 371, - "frec": 1 - }, - { - "id": 372, - "frec": 1 - }, - { - "id": 373, - "frec": 1 - }, - { - "id": 374, - "frec": 1 - }, - { - "id": 375, - "frec": 1 - }, - { - "id": 376, - "frec": 1 - }, - { - "id": 377, - "frec": 10 - }, - { - "id": 378, - "frec": 3 - }, - { - "id": 379, - "frec": 7 - }, - { - "id": 380, - "frec": 1 - }, - { - "id": 381, - "frec": 1 - }, - { - "id": 382, - "frec": 1 - }, - { - "id": 383, - "frec": 1 - }, - { - "id": 384, - "frec": 1 - }, - { - "id": 385, - "frec": 1 - }, - { - "id": 386, - "frec": 1 - }, - { - "id": 387, - "frec": 1 - }, - { - "id": 388, - "frec": 1 - }, - { - "id": 389, - "frec": 1 - }, - { - "id": 390, - "frec": 1 - }, - { - "id": 391, - "frec": 1 - }, - { - "id": 392, - "frec": 1 - }, - { - "id": 393, - "frec": 1 - }, - { - "id": 394, - "frec": 1 - }, - { - "id": 395, - "frec": 1 - }, - { - "id": 396, - "frec": 1 - }, - { - "id": 397, - "frec": 1 - }, - { - "id": 398, - "frec": 1 - }, - { - "id": 399, - "frec": 1 - }, - { - "id": 400, - "frec": 1 - }, - { - "id": 401, - "frec": 1 - }, - { - "id": 402, - "frec": 1 - }, - { - "id": 403, - "frec": 1 - }, - { - "id": 404, - "frec": 1 - }, - { - "id": 405, - "frec": 1 - }, - { - "id": 406, - "frec": 1 - }, - { - "id": 407, - "frec": 1 - }, - { - "id": 408, - "frec": 1 - }, - { - "id": 409, - "frec": 1 - }, - { - "id": 410, - "frec": 1 - }, - { - "id": 411, - "frec": 1 - }, - { - "id": 412, - "frec": 1 - }, - { - "id": 413, - "frec": 1 - }, - { - "id": 414, - "frec": 1 - }, - { - "id": 415, - "frec": 1 - }, - { - "id": 416, - "frec": 1 - }, - { - "id": 417, - "frec": 1 - }, - { - "id": 418, - "frec": 1 - }, - { - "id": 419, - "frec": 1 - }, - { - "id": 420, - "frec": 1 - }, - { - "id": 421, - "frec": 1 - }, - { - "id": 422, - "frec": 1 - }, - { - "id": 423, - "frec": 1 - }, - { - "id": 424, - "frec": 1 - }, - { - "id": 425, - "frec": 1 - }, - { - "id": 426, - "frec": 1 - }, - { - "id": 427, - "frec": 1 - }, - { - "id": 428, - "frec": 1 - }, - { - "id": 429, - "frec": 1 - }, - { - "id": 430, - "frec": 1 - }, - { - "id": 431, - "frec": 1 - }, - { - "id": 432, - "frec": 1 - }, - { - "id": 433, - "frec": 1 - }, - { - "id": 434, - "frec": 1 - }, - { - "id": 435, - "frec": 1 - }, - { - "id": 436, - "frec": 1 - }, - { - "id": 437, - "frec": 1 - }, - { - "id": 438, - "frec": 1 - }, - { - "id": 439, - "frec": 1 - }, - { - "id": 440, - "frec": 1 - }, - { - "id": 441, - "frec": 1 - }, - { - "id": 442, - "frec": 1 - }, - { - "id": 443, - "frec": 1 - }, - { - "id": 444, - "frec": 1 - }, - { - "id": 445, - "frec": 1 - }, - { - "id": 446, - "frec": 1 - }, - { - "id": 447, - "frec": 1 - }, - { - "id": 448, - "frec": 1 - }, - { - "id": 449, - "frec": 1 - }, - { - "id": 450, - "frec": 1 - }, - { - "id": 451, - "frec": 1 - }, - { - "id": 452, - "frec": 1 - }, - { - "id": 453, - "frec": 1 - }, - { - "id": 454, - "frec": 1 - }, - { - "id": 455, - "frec": 1 - }, - { - "id": 456, - "frec": 1 - }, - { - "id": 457, - "frec": 1 - }, - { - "id": 458, - "frec": 1 - }, - { - "id": 459, - "frec": 1 - }, - { - "id": 460, - "frec": 1 - }, - { - "id": 461, - "frec": 1 - }, - { - "id": 462, - "frec": 1 - }, - { - "id": 463, - "frec": 1 - }, - { - "id": 464, - "frec": 1 - }, - { - "id": 465, - "frec": 1 - }, - { - "id": 466, - "frec": 1 - }, - { - "id": 467, - "frec": 1 - }, - { - "id": 468, - "frec": 1 - }, - { - "id": 469, - "frec": 1 - }, - { - "id": 470, - "frec": 1 - }, - { - "id": 471, - "frec": 1 - }, - { - "id": 472, - "frec": 1 - }, - { - "id": 473, - "frec": 1 - }, - { - "id": 474, - "frec": 1 - }, - { - "id": 475, - "frec": 1 - }, - { - "id": 476, - "frec": 1 - }, - { - "id": 477, - "frec": 1 - }, - { - "id": 478, - "frec": 1 - }, - { - "id": 479, - "frec": 1 - }, - { - "id": 480, - "frec": 1 - }, - { - "id": 481, - "frec": 1 - }, - { - "id": 482, - "frec": 1 - }, - { - "id": 483, - "frec": 1 - }, - { - "id": 484, - "frec": 1 - }, - { - "id": 485, - "frec": 1 - }, - { - "id": 486, - "frec": 1 - }, - { - "id": 487, - "frec": 1 - }, - { - "id": 488, - "frec": 1 - }, - { - "id": 489, - "frec": 1 - }, - { - "id": 490, - "frec": 1 - }, - { - "id": 491, - "frec": 1 - }, - { - "id": 492, - "frec": 1 - }, - { - "id": 493, - "frec": 1 - }, - { - "id": 494, - "frec": 1 - }, - { - "id": 495, - "frec": 1 - }, - { - "id": 496, - "frec": 1 - }, - { - "id": 497, - "frec": 1 - }, - { - "id": 498, - "frec": 1 - }, - { - "id": 499, - "frec": 1 - }, - { - "id": 500, - "frec": 1 - }, - { - "id": 501, - "frec": 1 - }, - { - "id": 502, - "frec": 1 - }, - { - "id": 503, - "frec": 1 - }, - { - "id": 504, - "frec": 1 - }, - { - "id": 505, - "frec": 1 - }, - { - "id": 506, - "frec": 1 - }, - { - "id": 507, - "frec": 1 - }, - { - "id": 508, - "frec": 1 - }, - { - "id": 509, - "frec": 1 - }, - { - "id": 510, - "frec": 1 - }, - { - "id": 511, - "frec": 1 - }, - { - "id": 512, - "frec": 1 - }, - { - "id": 513, - "frec": 1 - }, - { - "id": 514, - "frec": 1 - }, - { - "id": 515, - "frec": 1 - }, - { - "id": 516, - "frec": 1 - }, - { - "id": 517, - "frec": 1 - }, - { - "id": 518, - "frec": 1 - }, - { - "id": 519, - "frec": 1 - }, - { - "id": 520, - "frec": 1 - }, - { - "id": 521, - "frec": 1 - }, - { - "id": 522, - "frec": 1 - }, - { - "id": 523, - "frec": 1 - }, - { - "id": 524, - "frec": 1 - }, - { - "id": 525, - "frec": 1 - }, - { - "id": 526, - "frec": 1 - }, - { - "id": 527, - "frec": 1 - }, - { - "id": 528, - "frec": 1 - }, - { - "id": 529, - "frec": 1 - }, - { - "id": 530, - "frec": 1 - }, - { - "id": 531, - "frec": 1 - }, - { - "id": 532, - "frec": 1 - }, - { - "id": 533, - "frec": 1 - }, - { - "id": 534, - "frec": 1 - }, - { - "id": 535, - "frec": 1 - }, - { - "id": 536, - "frec": 1 - }, - { - "id": 537, - "frec": 1 - }, - { - "id": 538, - "frec": 1 - }, - { - "id": 539, - "frec": 1 - }, - { - "id": 540, - "frec": 1 - }, - { - "id": 541, - "frec": 1 - }, - { - "id": 542, - "frec": 1 - }, - { - "id": 543, - "frec": 1 - }, - { - "id": 544, - "frec": 1 - }, - { - "id": 545, - "frec": 1 - }, - { - "id": 546, - "frec": 1 - }, - { - "id": 547, - "frec": 1 - }, - { - "id": 548, - "frec": 1 - }, - { - "id": 549, - "frec": 1 - }, - { - "id": 550, - "frec": 1 - }, - { - "id": 551, - "frec": 1 - }, - { - "id": 552, - "frec": 1 - }, - { - "id": 553, - "frec": 1 - }, - { - "id": 554, - "frec": 1 - }, - { - "id": 555, - "frec": 1 - }, - { - "id": 556, - "frec": 1 - }, - { - "id": 557, - "frec": 1 - }, - { - "id": 558, - "frec": 1 - }, - { - "id": 559, - "frec": 1 - }, - { - "id": 560, - "frec": 1 - }, - { - "id": 561, - "frec": 1 - }, - { - "id": 562, - "frec": 1 - }, - { - "id": 563, - "frec": 1 - }, - { - "id": 564, - "frec": 1 - }, - { - "id": 565, - "frec": 1 - }, - { - "id": 566, - "frec": 1 - }, - { - "id": 567, - "frec": 1 - }, - { - "id": 568, - "frec": 1 - }, - { - "id": 569, - "frec": 1 - }, - { - "id": 570, - "frec": 1 - }, - { - "id": 571, - "frec": 1 - }, - { - "id": 572, - "frec": 1 - }, - { - "id": 573, - "frec": 1 - }, - { - "id": 574, - "frec": 1 - }, - { - "id": 575, - "frec": 1 - }, - { - "id": 576, - "frec": 1 - }, - { - "id": 577, - "frec": 1 - }, - { - "id": 578, - "frec": 1 - }, - { - "id": 579, - "frec": 1 - }, - { - "id": 580, - "frec": 1 - }, - { - "id": 581, - "frec": 1 - }, - { - "id": 582, - "frec": 1 - }, - { - "id": 583, - "frec": 1 - }, - { - "id": 584, - "frec": 1 - }, - { - "id": 585, - "frec": 1 - }, - { - "id": 586, - "frec": 1 - }, - { - "id": 587, - "frec": 1 - }, - { - "id": 588, - "frec": 1 - }, - { - "id": 589, - "frec": 1 - }, - { - "id": 590, - "frec": 1 - }, - { - "id": 591, - "frec": 1 - }, - { - "id": 592, - "frec": 1 - }, - { - "id": 593, - "frec": 1 - }, - { - "id": 594, - "frec": 1 - }, - { - "id": 595, - "frec": 1 - }, - { - "id": 596, - "frec": 1 - }, - { - "id": 597, - "frec": 1 - }, - { - "id": 598, - "frec": 1 - }, - { - "id": 599, - "frec": 1 - }, - { - "id": 600, - "frec": 1 - }, - { - "id": 601, - "frec": 1 - }, - { - "id": 602, - "frec": 1 - }, - { - "id": 603, - "frec": 1 - }, - { - "id": 604, - "frec": 1 - }, - { - "id": 605, - "frec": 1 - }, - { - "id": 606, - "frec": 1 - }, - { - "id": 607, - "frec": 1 - }, - { - "id": 608, - "frec": 1 - }, - { - "id": 609, - "frec": 1 - }, - { - "id": 610, - "frec": 1 - }, - { - "id": 611, - "frec": 1 - }, - { - "id": 612, - "frec": 1 - }, - { - "id": 613, - "frec": 1 - }, - { - "id": 614, - "frec": 1 - }, - { - "id": 615, - "frec": 1 - }, - { - "id": 616, - "frec": 1 - }, - { - "id": 617, - "frec": 1 - }, - { - "id": 618, - "frec": 1 - }, - { - "id": 619, - "frec": 1 - }, - { - "id": 620, - "frec": 1 - }, - { - "id": 621, - "frec": 1 - }, - { - "id": 622, - "frec": 1 - }, - { - "id": 623, - "frec": 1 - }, - { - "id": 624, - "frec": 1 - }, - { - "id": 625, - "frec": 1 - }, - { - "id": 626, - "frec": 1 - }, - { - "id": 627, - "frec": 1 - }, - { - "id": 628, - "frec": 1 - }, - { - "id": 629, - "frec": 1 - }, - { - "id": 630, - "frec": 1 - }, - { - "id": 631, - "frec": 1 - }, - { - "id": 632, - "frec": 1 - }, - { - "id": 633, - "frec": 1 - }, - { - "id": 634, - "frec": 1 - }, - { - "id": 635, - "frec": 1 - }, - { - "id": 636, - "frec": 1 - }, - { - "id": 637, - "frec": 1 - }, - { - "id": 638, - "frec": 1 - }, - { - "id": 639, - "frec": 1 - }, - { - "id": 640, - "frec": 1 - }, - { - "id": 641, - "frec": 1 - }, - { - "id": 642, - "frec": 1 - }, - { - "id": 643, - "frec": 2 - }, - { - "id": 644, - "frec": 1 - }, - { - "id": 645, - "frec": 1 - }, - { - "id": 646, - "frec": 1 - }, - { - "id": 647, - "frec": 1 - }, - { - "id": 648, - "frec": 1 - }, - { - "id": 649, - "frec": 1 - }, - { - "id": 650, - "frec": 1 - }, - { - "id": 651, - "frec": 1 - }, - { - "id": 652, - "frec": 1 - }, - { - "id": 653, - "frec": 1 - }, - { - "id": 654, - "frec": 1 - }, - { - "id": 655, - "frec": 1 - }, - { - "id": 656, - "frec": 1 - }, - { - "id": 657, - "frec": 1 - }, - { - "id": 658, - "frec": 1 - }, - { - "id": 659, - "frec": 1 - }, - { - "id": 660, - "frec": 1 - }, - { - "id": 661, - "frec": 1 - }, - { - "id": 662, - "frec": 1 - }, - { - "id": 663, - "frec": 1 - }, - { - "id": 664, - "frec": 1 - }, - { - "id": 665, - "frec": 1 - }, - { - "id": 666, - "frec": 1 - }, - { - "id": 667, - "frec": 1 - }, - { - "id": 668, - "frec": 1 - }, - { - "id": 669, - "frec": 1 - }, - { - "id": 670, - "frec": 1 - }, - { - "id": 671, - "frec": 1 - }, - { - "id": 672, - "frec": 1 - }, - { - "id": 673, - "frec": 1 - }, - { - "id": 674, - "frec": 1 - }, - { - "id": 675, - "frec": 1 - }, - { - "id": 676, - "frec": 1 - }, - { - "id": 677, - "frec": 1 - }, - { - "id": 678, - "frec": 1 - }, - { - "id": 679, - "frec": 1 - }, - { - "id": 680, - "frec": 1 - }, - { - "id": 681, - "frec": 1 - }, - { - "id": 682, - "frec": 1 - }, - { - "id": 683, - "frec": 1 - }, - { - "id": 684, - "frec": 1 - }, - { - "id": 685, - "frec": 1 - }, - { - "id": 686, - "frec": 1 - }, - { - "id": 687, - "frec": 1 - }, - { - "id": 688, - "frec": 1 - }, - { - "id": 689, - "frec": 1 - }, - { - "id": 690, - "frec": 1 - }, - { - "id": 691, - "frec": 1 - }, - { - "id": 692, - "frec": 1 - }, - { - "id": 693, - "frec": 1 - }, - { - "id": 694, - "frec": 1 - }, - { - "id": 695, - "frec": 1 - }, - { - "id": 696, - "frec": 1 - }, - { - "id": 697, - "frec": 1 - }, - { - "id": 698, - "frec": 1 - }, - { - "id": 699, - "frec": 1 - }, - { - "id": 700, - "frec": 1 - }, - { - "id": 701, - "frec": 1 - }, - { - "id": 702, - "frec": 1 - }, - { - "id": 703, - "frec": 1 - }, - { - "id": 704, - "frec": 1 - }, - { - "id": 705, - "frec": 1 - }, - { - "id": 706, - "frec": 1 - }, - { - "id": 707, - "frec": 1 - }, - { - "id": 708, - "frec": 1 - }, - { - "id": 709, - "frec": 1 - }, - { - "id": 710, - "frec": 1 - }, - { - "id": 711, - "frec": 1 - }, - { - "id": 712, - "frec": 1 - }, - { - "id": 713, - "frec": 1 - }, - { - "id": 714, - "frec": 1 - }, - { - "id": 715, - "frec": 1 - }, - { - "id": 716, - "frec": 1 - }, - { - "id": 717, - "frec": 1 - }, - { - "id": 718, - "frec": 1 - }, - { - "id": 719, - "frec": 1 - }, - { - "id": 720, - "frec": 1 - }, - { - "id": 721, - "frec": 1 - }, - { - "id": 722, - "frec": 1 - }, - { - "id": 723, - "frec": 1 - }, - { - "id": 724, - "frec": 1 - }, - { - "id": 725, - "frec": 1 - }, - { - "id": 726, - "frec": 1 - }, - { - "id": 727, - "frec": 1 - }, - { - "id": 728, - "frec": 1 - }, - { - "id": 729, - "frec": 1 - }, - { - "id": 730, - "frec": 1 - }, - { - "id": 731, - "frec": 1 - }, - { - "id": 732, - "frec": 1 - }, - { - "id": 733, - "frec": 1 - }, - { - "id": 734, - "frec": 1 - }, - { - "id": 735, - "frec": 1 - }, - { - "id": 736, - "frec": 1 - }, - { - "id": 737, - "frec": 1 - }, - { - "id": 738, - "frec": 1 - }, - { - "id": 739, - "frec": 1 - }, - { - "id": 740, - "frec": 1 - }, - { - "id": 741, - "frec": 1 - }, - { - "id": 742, - "frec": 1 - }, - { - "id": 743, - "frec": 1 - }, - { - "id": 744, - "frec": 1 - }, - { - "id": 745, - "frec": 1 - }, - { - "id": 746, - "frec": 1 - }, - { - "id": 747, - "frec": 1 - }, - { - "id": 748, - "frec": 1 - }, - { - "id": 749, - "frec": 1 - }, - { - "id": 750, - "frec": 1 - }, - { - "id": 751, - "frec": 1 - }, - { - "id": 752, - "frec": 1 - }, - { - "id": 753, - "frec": 1 - }, - { - "id": 754, - "frec": 1 - }, - { - "id": 755, - "frec": 1 - }, - { - "id": 756, - "frec": 1 - }, - { - "id": 757, - "frec": 1 - }, - { - "id": 758, - "frec": 1 - }, - { - "id": 759, - "frec": 1 - }, - { - "id": 760, - "frec": 1 - }, - { - "id": 761, - "frec": 1 - }, - { - "id": 762, - "frec": 1 - }, - { - "id": 763, - "frec": 1 - }, - { - "id": 764, - "frec": 1 - }, - { - "id": 765, - "frec": 1 - }, - { - "id": 766, - "frec": 1 - }, - { - "id": 767, - "frec": 1 - }, - { - "id": 768, - "frec": 1 - }, - { - "id": 769, - "frec": 1 - }, - { - "id": 770, - "frec": 1 - }, - { - "id": 771, - "frec": 1 - }, - { - "id": 772, - "frec": 1 - }, - { - "id": 773, - "frec": 1 - }, - { - "id": 774, - "frec": 1 - }, - { - "id": 775, - "frec": 1 - }, - { - "id": 776, - "frec": 1 - }, - { - "id": 777, - "frec": 1 - }, - { - "id": 778, - "frec": 1 - }, - { - "id": 779, - "frec": 1 - }, - { - "id": 780, - "frec": 1 - }, - { - "id": 781, - "frec": 1 - }, - { - "id": 782, - "frec": 1 - }, - { - "id": 783, - "frec": 1 - }, - { - "id": 784, - "frec": 1 - }, - { - "id": 785, - "frec": 1 - }, - { - "id": 786, - "frec": 1 - }, - { - "id": 787, - "frec": 1 - }, - { - "id": 788, - "frec": 1 - }, - { - "id": 789, - "frec": 1 - }, - { - "id": 790, - "frec": 1 - }, - { - "id": 791, - "frec": 1 - }, - { - "id": 792, - "frec": 1 - }, - { - "id": 793, - "frec": 1 - }, - { - "id": 794, - "frec": 1 - }, - { - "id": 795, - "frec": 1 - }, - { - "id": 796, - "frec": 1 - }, - { - "id": 797, - "frec": 1 - }, - { - "id": 798, - "frec": 1 - }, - { - "id": 799, - "frec": 1 - }, - { - "id": 800, - "frec": 1 - }, - { - "id": 801, - "frec": 1 - }, - { - "id": 802, - "frec": 1 - }, - { - "id": 803, - "frec": 1 - }, - { - "id": 804, - "frec": 1 - }, - { - "id": 805, - "frec": 1 - }, - { - "id": 806, - "frec": 1 - }, - { - "id": 807, - "frec": 1 - }, - { - "id": 808, - "frec": 1 - }, - { - "id": 809, - "frec": 1 - }, - { - "id": 810, - "frec": 1 - }, - { - "id": 811, - "frec": 1 - }, - { - "id": 812, - "frec": 1 - }, - { - "id": 813, - "frec": 1 - }, - { - "id": 814, - "frec": 1 - }, - { - "id": 815, - "frec": 1 - }, - { - "id": 816, - "frec": 1 - }, - { - "id": 817, - "frec": 1 - }, - { - "id": 818, - "frec": 1 - }, - { - "id": 819, - "frec": 1 - }, - { - "id": 820, - "frec": 1 - }, - { - "id": 821, - "frec": 1 - }, - { - "id": 822, - "frec": 1 - }, - { - "id": 823, - "frec": 1 - }, - { - "id": 824, - "frec": 1 - }, - { - "id": 825, - "frec": 1 - }, - { - "id": 826, - "frec": 1 - }, - { - "id": 827, - "frec": 1 - }, - { - "id": 828, - "frec": 1 - }, - { - "id": 829, - "frec": 1 - }, - { - "id": 830, - "frec": 1 - }, - { - "id": 831, - "frec": 1 - }, - { - "id": 832, - "frec": 1 - }, - { - "id": 833, - "frec": 1 - }, - { - "id": 834, - "frec": 1 - }, - { - "id": 835, - "frec": 1 - }, - { - "id": 836, - "frec": 1 - }, - { - "id": 837, - "frec": 1 - }, - { - "id": 838, - "frec": 1 - }, - { - "id": 839, - "frec": 1 - }, - { - "id": 840, - "frec": 1 - }, - { - "id": 841, - "frec": 1 - }, - { - "id": 842, - "frec": 1 - }, - { - "id": 843, - "frec": 1 - }, - { - "id": 844, - "frec": 1 - }, - { - "id": 845, - "frec": 1 - }, - { - "id": 846, - "frec": 1 - }, - { - "id": 847, - "frec": 1 - }, - { - "id": 848, - "frec": 1 - }, - { - "id": 849, - "frec": 1 - }, - { - "id": 850, - "frec": 1 - }, - { - "id": 851, - "frec": 1 - }, - { - "id": 852, - "frec": 1 - }, - { - "id": 853, - "frec": 1 - }, - { - "id": 854, - "frec": 1 - }, - { - "id": 855, - "frec": 1 - }, - { - "id": 856, - "frec": 1 - }, - { - "id": 857, - "frec": 1 - }, - { - "id": 858, - "frec": 1 - }, - { - "id": 859, - "frec": 1 - }, - { - "id": 860, - "frec": 1 - }, - { - "id": 861, - "frec": 1 - }, - { - "id": 862, - "frec": 1 - }, - { - "id": 863, - "frec": 1 - }, - { - "id": 864, - "frec": 1 - }, - { - "id": 865, - "frec": 1 - }, - { - "id": 866, - "frec": 1 - }, - { - "id": 867, - "frec": 1 - }, - { - "id": 868, - "frec": 1 - }, - { - "id": 869, - "frec": 1 - }, - { - "id": 870, - "frec": 1 - }, - { - "id": 871, - "frec": 1 - }, - { - "id": 872, - "frec": 1 - }, - { - "id": 873, - "frec": 1 - }, - { - "id": 874, - "frec": 1 - }, - { - "id": 875, - "frec": 1 - }, - { - "id": 876, - "frec": 1 - }, - { - "id": 877, - "frec": 1 - }, - { - "id": 878, - "frec": 1 - }, - { - "id": 879, - "frec": 1 - }, - { - "id": 880, - "frec": 1 - }, - { - "id": 881, - "frec": 1 - }, - { - "id": 882, - "frec": 1 - }, - { - "id": 883, - "frec": 1 - }, - { - "id": 884, - "frec": 1 - }, - { - "id": 885, - "frec": 1 - }, - { - "id": 886, - "frec": 1 - }, - { - "id": 887, - "frec": 1 - }, - { - "id": 888, - "frec": 1 - }, - { - "id": 889, - "frec": 1 - }, - { - "id": 890, - "frec": 1 - }, - { - "id": 891, - "frec": 1 - }, - { - "id": 892, - "frec": 1 - }, - { - "id": 893, - "frec": 1 - }, - { - "id": 894, - "frec": 1 - }, - { - "id": 895, - "frec": 1 - }, - { - "id": 896, - "frec": 1 - }, - { - "id": 897, - "frec": 1 - }, - { - "id": 898, - "frec": 1 - }, - { - "id": 899, - "frec": 1 - }, - { - "id": 900, - "frec": 1 - }, - { - "id": 901, - "frec": 1 - }, - { - "id": 902, - "frec": 1 - }, - { - "id": 903, - "frec": 1 - }, - { - "id": 904, - "frec": 1 - }, - { - "id": 905, - "frec": 1 - }, - { - "id": 906, - "frec": 1 - }, - { - "id": 907, - "frec": 1 - }, - { - "id": 908, - "frec": 1 - }, - { - "id": 909, - "frec": 1 - }, - { - "id": 910, - "frec": 1 - }, - { - "id": 911, - "frec": 1 - }, - { - "id": 912, - "frec": 1 - }, - { - "id": 913, - "frec": 1 - }, - { - "id": 914, - "frec": 1 - }, - { - "id": 915, - "frec": 1 - }, - { - "id": 916, - "frec": 1 - }, - { - "id": 917, - "frec": 1 - }, - { - "id": 918, - "frec": 1 - }, - { - "id": 919, - "frec": 1 - }, - { - "id": 920, - "frec": 1 - }, - { - "id": 921, - "frec": 1 - }, - { - "id": 922, - "frec": 1 - }, - { - "id": 923, - "frec": 1 - }, - { - "id": 924, - "frec": 1 - }, - { - "id": 925, - "frec": 1 - }, - { - "id": 926, - "frec": 1 - }, - { - "id": 927, - "frec": 1 - }, - { - "id": 928, - "frec": 1 - }, - { - "id": 929, - "frec": 1 - }, - { - "id": 930, - "frec": 1 - }, - { - "id": 931, - "frec": 1 - }, - { - "id": 932, - "frec": 1 - }, - { - "id": 933, - "frec": 1 - }, - { - "id": 934, - "frec": 1 - }, - { - "id": 935, - "frec": 1 - }, - { - "id": 936, - "frec": 1 - }, - { - "id": 937, - "frec": 1 - }, - { - "id": 938, - "frec": 1 - }, - { - "id": 939, - "frec": 1 - }, - { - "id": 940, - "frec": 1 - }, - { - "id": 941, - "frec": 1 - }, - { - "id": 942, - "frec": 1 - }, - { - "id": 943, - "frec": 1 - }, - { - "id": 944, - "frec": 1 - }, - { - "id": 945, - "frec": 1 - }, - { - "id": 946, - "frec": 1 - }, - { - "id": 947, - "frec": 1 - }, - { - "id": 948, - "frec": 1 - }, - { - "id": 949, - "frec": 1 - }, - { - "id": 950, - "frec": 1 - }, - { - "id": 951, - "frec": 1 - }, - { - "id": 952, - "frec": 1 - }, - { - "id": 953, - "frec": 1 - }, - { - "id": 954, - "frec": 1 - }, - { - "id": 955, - "frec": 1 - }, - { - "id": 956, - "frec": 1 - }, - { - "id": 957, - "frec": 1 - }, - { - "id": 958, - "frec": 1 - }, - { - "id": 959, - "frec": 1 - }, - { - "id": 960, - "frec": 1 - }, - { - "id": 961, - "frec": 1 - }, - { - "id": 962, - "frec": 1 - }, - { - "id": 963, - "frec": 1 - }, - { - "id": 964, - "frec": 1 - }, - { - "id": 965, - "frec": 1 - }, - { - "id": 966, - "frec": 1 - }, - { - "id": 967, - "frec": 1 - }, - { - "id": 968, - "frec": 1 - }, - { - "id": 969, - "frec": 1 - }, - { - "id": 970, - "frec": 1 - }, - { - "id": 971, - "frec": 1 - }, - { - "id": 972, - "frec": 1 - }, - { - "id": 973, - "frec": 1 - }, - { - "id": 974, - "frec": 1 - }, - { - "id": 975, - "frec": 1 - }, - { - "id": 976, - "frec": 1 - }, - { - "id": 977, - "frec": 1 - }, - { - "id": 978, - "frec": 1 - }, - { - "id": 979, - "frec": 1 - }, - { - "id": 980, - "frec": 1 - }, - { - "id": 981, - "frec": 1 - }, - { - "id": 982, - "frec": 1 - }, - { - "id": 983, - "frec": 1 - }, - { - "id": 984, - "frec": 1 - }, - { - "id": 985, - "frec": 1 - }, - { - "id": 986, - "frec": 1 - }, - { - "id": 987, - "frec": 1 - }, - { - "id": 988, - "frec": 1 - }, - { - "id": 989, - "frec": 1 - }, - { - "id": 990, - "frec": 1 - }, - { - "id": 991, - "frec": 1 - }, - { - "id": 992, - "frec": 1 - }, - { - "id": 993, - "frec": 1 - }, - { - "id": 994, - "frec": 1 - }, - { - "id": 995, - "frec": 1 - }, - { - "id": 996, - "frec": 1 - }, - { - "id": 997, - "frec": 1 - }, - { - "id": 998, - "frec": 1 - }, - { - "id": 999, - "frec": 1 - }, - { - "id": 1000, - "frec": 1 - }, - { - "id": 1001, - "frec": 1 - }, - { - "id": 1002, - "frec": 1 - }, - { - "id": 1003, - "frec": 1 - }, - { - "id": 1004, - "frec": 1 - }, - { - "id": 1005, - "frec": 1 - }, - { - "id": 1006, - "frec": 1 - }, - { - "id": 1007, - "frec": 1 - }, - { - "id": 1008, - "frec": 1 - }, - { - "id": 1009, - "frec": 1 - }, - { - "id": 1010, - "frec": 1 - }, - { - "id": 1011, - "frec": 1 - }, - { - "id": 1012, - "frec": 1 - }, - { - "id": 1013, - "frec": 1 - }, - { - "id": 1014, - "frec": 1 - }, - { - "id": 1015, - "frec": 1 - }, - { - "id": 1016, - "frec": 1 - }, - { - "id": 1017, - "frec": 1 - }, - { - "id": 1018, - "frec": 1 - }, - { - "id": 1019, - "frec": 1 - }, - { - "id": 1020, - "frec": 1 - }, - { - "id": 1021, - "frec": 1 - }, - { - "id": 1022, - "frec": 1 - } - ] - }, - { - "id": 25, - "texto": { - "en": "Health book", - "fr": "Livre de santé" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Flibro_salud.webp?alt=media&token=c7b4bf4a-38b5-4b09-ac7d-30299ef09d86" - }, - "relacion": [ - { - "id": 377, - "frec": 10 - }, - { - "id": 378, - "frec": 3 - }, - { - "id": 379, - "frec": 7 - }, - { - "id": 380, - "frec": 1 - }, - { - "id": 381, - "frec": 1 - }, - { - "id": 382, - "frec": 1 - }, - { - "id": 383, - "frec": 1 - }, - { - "id": 384, - "frec": 1 - }, - { - "id": 385, - "frec": 1 - }, - { - "id": 388, - "frec": 1 - }, - { - "id": 389, - "frec": 1 - }, - { - "id": 213, - "frec": 1 - }, - { - "id": 234, - "frec": 1 - }, - { - "id": 205, - "frec": 1 - }, - { - "id": 133, - "frec": 1 - }, - { - "id": 30, - "frec": 1 - }, - { - "id": 33, - "frec": 1 - }, - { - "id": 36, - "frec": 1 - }, - { - "id": 37, - "frec": 1 - }, - { - "id": 113, - "frec": 1 - }, - { - "id": 114, - "frec": 1 - }, - { - "id": 112, - "frec": 1 - }, - { - "id": 118, - "frec": 1 - }, - { - "id": 117, - "frec": 1 - }, - { - "id": 101, - "frec": 1 - }, - { - "id": 51, - "frec": 1 - }, - { - "id": 42, - "frec": 1 - }, - { - "id": 13, - "frec": 1 - }, - { - "id": 621, - "frec": 1 - }, - { - "id": 629, - "frec": 1 - }, - { - "id": 668, - "frec": 1 - }, - { - "id": 819, - "frec": 1 - }, - { - "id": 820, - "frec": 1 - }, - { - "id": 821, - "frec": 1 - }, - { - "id": 822, - "frec": 1 - }, - { - "id": 823, - "frec": 1 - }, - { - "id": 824, - "frec": 1 - }, - { - "id": 825, - "frec": 1 - }, - { - "id": 826, - "frec": 1 - }, - { - "id": 827, - "frec": 1 - }, - { - "id": 828, - "frec": 1 - }, - { - "id": 829, - "frec": 1 - }, - { - "id": 830, - "frec": 1 - }, - { - "id": 831, - "frec": 1 - }, - { - "id": 878, - "frec": 1 - }, - { - "id": 879, - "frec": 1 - }, - { - "id": 880, - "frec": 1 - }, - { - "id": 881, - "frec": 1 - }, - { - "id": 882, - "frec": 1 - }, - { - "id": 883, - "frec": 1 - }, - { - "id": 884, - "frec": 1 - }, - { - "id": 885, - "frec": 1 - }, - { - "id": 886, - "frec": 1 - }, - { - "id": 887, - "frec": 1 - } - ] - }, - { - "id": 26, - "texto": { - "en": "Fun book I", - "fr": "Livre amusant I" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Flibro_ocio_1.webp?alt=media&token=50186510-bf0a-4416-85a8-fc1b17ff6fd5" - }, - "relacion": [ - { - "id": 2, - "frec": 1 - }, - { - "id": 8, - "frec": 1 - }, - { - "id": 3, - "frec": 1 - }, - { - "id": 17, - "frec": 1 - }, - { - "id": 20, - "frec": 1 - }, - { - "id": 48, - "frec": 1 - }, - { - "id": 37, - "frec": 1 - }, - { - "id": 36, - "frec": 1 - }, - { - "id": 13, - "frec": 1 - }, - { - "id": 119, - "frec": 1 - }, - { - "id": 121, - "frec": 1 - }, - { - "id": 124, - "frec": 1 - }, - { - "id": 138, - "frec": 1 - }, - { - "id": 144, - "frec": 1 - }, - { - "id": 161, - "frec": 1 - }, - { - "id": 164, - "frec": 1 - }, - { - "id": 171, - "frec": 1 - }, - { - "id": 207, - "frec": 1 - }, - { - "id": 543, - "frec": 1 - }, - { - "id": 544, - "frec": 1 - }, - { - "id": 546, - "frec": 1 - }, - { - "id": 545, - "frec": 1 - }, - { - "id": 547, - "frec": 1 - }, - { - "id": 548, - "frec": 1 - }, - { - "id": 549, - "frec": 1 - }, - { - "id": 550, - "frec": 1 - }, - { - "id": 551, - "frec": 1 - }, - { - "id": 552, - "frec": 1 - }, - { - "id": 553, - "frec": 1 - }, - { - "id": 554, - "frec": 1 - }, - { - "id": 555, - "frec": 1 - }, - { - "id": 556, - "frec": 1 - }, - { - "id": 557, - "frec": 1 - }, - { - "id": 558, - "frec": 1 - }, - { - "id": 559, - "frec": 1 - }, - { - "id": 560, - "frec": 1 - }, - { - "id": 561, - "frec": 1 - }, - { - "id": 562, - "frec": 1 - }, - { - "id": 563, - "frec": 1 - }, - { - "id": 564, - "frec": 1 - }, - { - "id": 565, - "frec": 1 - }, - { - "id": 566, - "frec": 1 - }, - { - "id": 567, - "frec": 1 - }, - { - "id": 568, - "frec": 1 - }, - { - "id": 569, - "frec": 1 - }, - { - "id": 570, - "frec": 1 - }, - { - "id": 571, - "frec": 1 - }, - { - "id": 572, - "frec": 1 - }, - { - "id": 573, - "frec": 1 - }, - { - "id": 574, - "frec": 1 - }, - { - "id": 576, - "frec": 1 - }, - { - "id": 575, - "frec": 1 - }, - { - "id": 577, - "frec": 1 - }, - { - "id": 578, - "frec": 1 - }, - { - "id": 579, - "frec": 1 - }, - { - "id": 580, - "frec": 1 - }, - { - "id": 581, - "frec": 1 - }, - { - "id": 582, - "frec": 1 - }, - { - "id": 583, - "frec": 1 - }, - { - "id": 584, - "frec": 1 - }, - { - "id": 587, - "frec": 1 - }, - { - "id": 615, - "frec": 1 - }, - { - "id": 621, - "frec": 1 - }, - { - "id": 634, - "frec": 1 - }, - { - "id": 635, - "frec": 1 - }, - { - "id": 636, - "frec": 1 - }, - { - "id": 638, - "frec": 1 - }, - { - "id": 639, - "frec": 1 - }, - { - "id": 641, - "frec": 1 - }, - { - "id": 661, - "frec": 1 - }, - { - "id": 1013, - "frec": 1 - } - ] - }, - { - "id": 27, - "texto": { - "en": "Fun book II", - "fr": "Livre amusant II" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Flibro_ocio_2.webp?alt=media&token=fa4aa42c-d12a-4c47-a826-7918e5c23735" - }, - "relacion": [ - { - "id": 1, - "frec": 1 - }, - { - "id": 5, - "frec": 1 - }, - { - "id": 2, - "frec": 1 - }, - { - "id": 8, - "frec": 1 - }, - { - "id": 17, - "frec": 1 - }, - { - "id": 20, - "frec": 1 - }, - { - "id": 28, - "frec": 1 - }, - { - "id": 30, - "frec": 1 - }, - { - "id": 34, - "frec": 1 - }, - { - "id": 32, - "frec": 1 - }, - { - "id": 38, - "frec": 1 - }, - { - "id": 70, - "frec": 1 - }, - { - "id": 82, - "frec": 1 - }, - { - "id": 119, - "frec": 1 - }, - { - "id": 124, - "frec": 1 - }, - { - "id": 137, - "frec": 1 - }, - { - "id": 161, - "frec": 1 - }, - { - "id": 171, - "frec": 1 - }, - { - "id": 615, - "frec": 1 - }, - { - "id": 623, - "frec": 1 - }, - { - "id": 624, - "frec": 1 - }, - { - "id": 672, - "frec": 1 - }, - { - "id": 678, - "frec": 1 - }, - { - "id": 689, - "frec": 1 - }, - { - "id": 975, - "frec": 1 - }, - { - "id": 976, - "frec": 1 - }, - { - "id": 977, - "frec": 1 - }, - { - "id": 978, - "frec": 1 - }, - { - "id": 979, - "frec": 1 - }, - { - "id": 980, - "frec": 1 - }, - { - "id": 981, - "frec": 1 - }, - { - "id": 982, - "frec": 1 - }, - { - "id": 983, - "frec": 1 - }, - { - "id": 984, - "frec": 1 - }, - { - "id": 985, - "frec": 1 - }, - { - "id": 986, - "frec": 1 - }, - { - "id": 987, - "frec": 1 - }, - { - "id": 988, - "frec": 1 - }, - { - "id": 989, - "frec": 1 - }, - { - "id": 990, - "frec": 1 - }, - { - "id": 991, - "frec": 1 - }, - { - "id": 992, - "frec": 1 - }, - { - "id": 993, - "frec": 1 - }, - { - "id": 994, - "frec": 1 - }, - { - "id": 995, - "frec": 1 - }, - { - "id": 996, - "frec": 1 - }, - { - "id": 997, - "frec": 1 - }, - { - "id": 1003, - "frec": 1 - }, - { - "id": 1005, - "frec": 1 - }, - { - "id": 1004, - "frec": 1 - }, - { - "id": 1006, - "frec": 1 - }, - { - "id": 1007, - "frec": 1 - }, - { - "id": 1008, - "frec": 1 - }, - { - "id": 1011, - "frec": 1 - }, - { - "id": 1010, - "frec": 1 - }, - { - "id": 1009, - "frec": 1 - } - ] - }, - { - "id": 28, - "texto": { - "en": "Restaurant Book", - "fr": "Livre de restaurant" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Frestaurante.webp?alt=media&token=57ed6d5c-fa5f-41c1-b779-28294311e772" - }, - "relacion": [ - { - "id": 377, - "frec": 10 - }, - { - "id": 378, - "frec": 3 - }, - { - "id": 379, - "frec": 7 - }, - { - "id": 380, - "frec": 1 - }, - { - "id": 381, - "frec": 1 - }, - { - "id": 382, - "frec": 1 - }, - { - "id": 383, - "frec": 1 - }, - { - "id": 384, - "frec": 1 - }, - { - "id": 388, - "frec": 1 - }, - { - "id": 389, - "frec": 1 - }, - { - "id": 495, - "frec": 1 - }, - { - "id": 497, - "frec": 1 - }, - { - "id": 501, - "frec": 1 - }, - { - "id": 500, - "frec": 1 - }, - { - "id": 503, - "frec": 1 - }, - { - "id": 502, - "frec": 1 - }, - { - "id": 587, - "frec": 1 - }, - { - "id": 588, - "frec": 1 - }, - { - "id": 594, - "frec": 1 - }, - { - "id": 590, - "frec": 1 - }, - { - "id": 589, - "frec": 1 - }, - { - "id": 592, - "frec": 1 - }, - { - "id": 593, - "frec": 1 - }, - { - "id": 599, - "frec": 1 - }, - { - "id": 598, - "frec": 1 - }, - { - "id": 597, - "frec": 1 - }, - { - "id": 600, - "frec": 1 - }, - { - "id": 602, - "frec": 1 - }, - { - "id": 595, - "frec": 1 - }, - { - "id": 605, - "frec": 1 - }, - { - "id": 604, - "frec": 1 - }, - { - "id": 603, - "frec": 1 - }, - { - "id": 601, - "frec": 1 - }, - { - "id": 400, - "frec": 1 - }, - { - "id": 401, - "frec": 1 - }, - { - "id": 405, - "frec": 1 - }, - { - "id": 403, - "frec": 1 - }, - { - "id": 399, - "frec": 1 - }, - { - "id": 411, - "frec": 1 - }, - { - "id": 412, - "frec": 1 - }, - { - "id": 417, - "frec": 1 - }, - { - "id": 418, - "frec": 1 - }, - { - "id": 416, - "frec": 1 - }, - { - "id": 421, - "frec": 1 - }, - { - "id": 424, - "frec": 1 - }, - { - "id": 429, - "frec": 1 - }, - { - "id": 437, - "frec": 1 - }, - { - "id": 442, - "frec": 1 - }, - { - "id": 454, - "frec": 1 - }, - { - "id": 455, - "frec": 1 - }, - { - "id": 458, - "frec": 1 - }, - { - "id": 461, - "frec": 1 - }, - { - "id": 462, - "frec": 1 - }, - { - "id": 464, - "frec": 1 - }, - { - "id": 463, - "frec": 1 - }, - { - "id": 472, - "frec": 1 - }, - { - "id": 476, - "frec": 1 - }, - { - "id": 477, - "frec": 1 - }, - { - "id": 478, - "frec": 1 - }, - { - "id": 480, - "frec": 1 - }, - { - "id": 481, - "frec": 1 - }, - { - "id": 482, - "frec": 1 - }, - { - "id": 483, - "frec": 1 - }, - { - "id": 484, - "frec": 1 - }, - { - "id": 486, - "frec": 1 - }, - { - "id": 487, - "frec": 1 - }, - { - "id": 488, - "frec": 1 - }, - { - "id": 489, - "frec": 1 - }, - { - "id": 490, - "frec": 1 - }, - { - "id": 491, - "frec": 1 - }, - { - "id": 492, - "frec": 1 - }, - { - "id": 497, - "frec": 1 - }, - { - "id": 493, - "frec": 1 - }, - { - "id": 505, - "frec": 1 - }, - { - "id": 506, - "frec": 1 - }, - { - "id": 511, - "frec": 1 - }, - { - "id": 512, - "frec": 1 - }, - { - "id": 515, - "frec": 1 - }, - { - "id": 513, - "frec": 1 - }, - { - "id": 618, - "frec": 1 - }, - { - "id": 619, - "frec": 1 - }, - { - "id": 679, - "frec": 1 - }, - { - "id": 657, - "frec": 1 - }, - { - "id": 660, - "frec": 1 - }, - { - "id": 649, - "frec": 1 - }, - { - "id": 666, - "frec": 1 - }, - { - "id": 672, - "frec": 1 - }, - { - "id": 685, - "frec": 1 - }, - { - "id": 689, - "frec": 1 - } - ] - }, - { - "id": 29, - "texto": { - "en": "Travel book", - "fr": "Livre de voyage" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Flibro_viaje.webp?alt=media&token=1f869b28-34f4-4d1d-8dc7-2edcb5276f16" - }, - "relacion": [ - { - "id": 377, - "frec": 10 - }, - { - "id": 378, - "frec": 3 - }, - { - "id": 379, - "frec": 7 - }, - { - "id": 380, - "frec": 1 - }, - { - "id": 381, - "frec": 1 - }, - { - "id": 382, - "frec": 1 - }, - { - "id": 383, - "frec": 1 - }, - { - "id": 384, - "frec": 1 - }, - { - "id": 385, - "frec": 1 - }, - { - "id": 388, - "frec": 1 - }, - { - "id": 389, - "frec": 1 - }, - { - "id": 5, - "frec": 1 - }, - { - "id": 7, - "frec": 1 - }, - { - "id": 8, - "frec": 1 - }, - { - "id": 1, - "frec": 1 - }, - { - "id": 30, - "frec": 1 - }, - { - "id": 33, - "frec": 1 - }, - { - "id": 38, - "frec": 1 - }, - { - "id": 73, - "frec": 1 - }, - { - "id": 74, - "frec": 1 - }, - { - "id": 101, - "frec": 1 - }, - { - "id": 107, - "frec": 1 - }, - { - "id": 108, - "frec": 1 - }, - { - "id": 109, - "frec": 1 - }, - { - "id": 111, - "frec": 1 - }, - { - "id": 110, - "frec": 1 - }, - { - "id": 112, - "frec": 1 - }, - { - "id": 140, - "frec": 1 - }, - { - "id": 133, - "frec": 1 - }, - { - "id": 177, - "frec": 1 - }, - { - "id": 205, - "frec": 1 - }, - { - "id": 499, - "frec": 1 - }, - { - "id": 500, - "frec": 1 - }, - { - "id": 501, - "frec": 1 - }, - { - "id": 568, - "frec": 1 - }, - { - "id": 587, - "frec": 1 - }, - { - "id": 588, - "frec": 1 - }, - { - "id": 589, - "frec": 1 - }, - { - "id": 590, - "frec": 1 - }, - { - "id": 594, - "frec": 1 - }, - { - "id": 595, - "frec": 1 - }, - { - "id": 602, - "frec": 1 - }, - { - "id": 606, - "frec": 1 - }, - { - "id": 607, - "frec": 1 - }, - { - "id": 608, - "frec": 1 - }, - { - "id": 609, - "frec": 1 - }, - { - "id": 610, - "frec": 1 - }, - { - "id": 611, - "frec": 1 - }, - { - "id": 612, - "frec": 1 - }, - { - "id": 613, - "frec": 1 - }, - { - "id": 618, - "frec": 1 - }, - { - "id": 646, - "frec": 1 - }, - { - "id": 647, - "frec": 1 - }, - { - "id": 656, - "frec": 1 - }, - { - "id": 657, - "frec": 1 - }, - { - "id": 669, - "frec": 1 - }, - { - "id": 670, - "frec": 1 - }, - { - "id": 679, - "frec": 1 - }, - { - "id": 685, - "frec": 1 - }, - { - "id": 666, - "frec": 1 - }, - { - "id": 649, - "frec": 1 - }, - { - "id": 773, - "frec": 1 - }, - { - "id": 1015, - "frec": 1 - }, - { - "id": 1021, - "frec": 1 - }, - { - "id": 1022, - "frec": 1 - }, - { - "id": 1020, - "frec": 1 - }, - { - "id": 1019, - "frec": 1 - } - ] - }, - { - "id": 30, - "texto": { - "en": "Hygiene book", - "fr": "Livre d'hygiène" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fhigiene_personal.webp?alt=media&token=d822b484-feb9-4a37-a9f0-ed53e9b3584f" - }, - "relacion": [ - { - "id": 9, - "frec": 1 - }, - { - "id": 10, - "frec": 1 - }, - { - "id": 11, - "frec": 1 - }, - { - "id": 23, - "frec": 1 - }, - { - "id": 29, - "frec": 1 - }, - { - "id": 31, - "frec": 1 - }, - { - "id": 35, - "frec": 1 - }, - { - "id": 39, - "frec": 1 - }, - { - "id": 42, - "frec": 1 - }, - { - "id": 54, - "frec": 1 - }, - { - "id": 100, - "frec": 1 - }, - { - "id": 133, - "frec": 1 - }, - { - "id": 158, - "frec": 1 - }, - { - "id": 159, - "frec": 1 - }, - { - "id": 185, - "frec": 1 - }, - { - "id": 186, - "frec": 1 - }, - { - "id": 200, - "frec": 1 - }, - { - "id": 205, - "frec": 1 - }, - { - "id": 204, - "frec": 1 - }, - { - "id": 209, - "frec": 1 - }, - { - "id": 263, - "frec": 1 - }, - { - "id": 199, - "frec": 1 - }, - { - "id": 226, - "frec": 1 - }, - { - "id": 227, - "frec": 1 - } - ] - }, - { - "id": 31, - "texto": { - "en": "Butcher book", - "fr": "Livre de boucherie" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Flibro_carnicero.webp?alt=media&token=b3a49a1a-5b29-40a2-a456-6117822efb08" - }, - "relacion": [ - { - "id": 5, - "frec": 1 - }, - { - "id": 7, - "frec": 1 - }, - { - "id": 13, - "frec": 1 - }, - { - "id": 36, - "frec": 1 - }, - { - "id": 37, - "frec": 1 - }, - { - "id": 47, - "frec": 1 - }, - { - "id": 377, - "frec": 10 - }, - { - "id": 378, - "frec": 3 - }, - { - "id": 379, - "frec": 7 - }, - { - "id": 380, - "frec": 1 - }, - { - "id": 381, - "frec": 1 - }, - { - "id": 382, - "frec": 1 - }, - { - "id": 383, - "frec": 1 - }, - { - "id": 384, - "frec": 1 - }, - { - "id": 388, - "frec": 1 - }, - { - "id": 389, - "frec": 1 - }, - { - "id": 482, - "frec": 1 - }, - { - "id": 511, - "frec": 1 - }, - { - "id": 505, - "frec": 1 - }, - { - "id": 506, - "frec": 1 - }, - { - "id": 512, - "frec": 1 - }, - { - "id": 513, - "frec": 1 - }, - { - "id": 514, - "frec": 1 - }, - { - "id": 515, - "frec": 1 - }, - { - "id": 516, - "frec": 1 - }, - { - "id": 517, - "frec": 1 - }, - { - "id": 518, - "frec": 1 - }, - { - "id": 519, - "frec": 1 - }, - { - "id": 520, - "frec": 1 - }, - { - "id": 522, - "frec": 1 - }, - { - "id": 523, - "frec": 1 - }, - { - "id": 524, - "frec": 1 - }, - { - "id": 587, - "frec": 1 - }, - { - "id": 617, - "frec": 1 - } - ] - }, - { - "id": 32, - "texto": { - "en": "Grocery book", - "fr": "Livre d'épicerie" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Flibro_almacen.webp?alt=media&token=9f5be80c-f5fc-48dd-be44-ba6ea61a8efc" - }, - "relacion": [ - { - "id": 5, - "frec": 1 - }, - { - "id": 13, - "frec": 1 - }, - { - "id": 23, - "frec": 1 - }, - { - "id": 30, - "frec": 1 - }, - { - "id": 36, - "frec": 1 - }, - { - "id": 37, - "frec": 1 - }, - { - "id": 138, - "frec": 1 - }, - { - "id": 136, - "frec": 1 - }, - { - "id": 131, - "frec": 1 - }, - { - "id": 213, - "frec": 1 - }, - { - "id": 208, - "frec": 1 - }, - { - "id": 233, - "frec": 1 - }, - { - "id": 234, - "frec": 1 - }, - { - "id": 267, - "frec": 1 - }, - { - "id": 165, - "frec": 1 - }, - { - "id": 153, - "frec": 1 - }, - { - "id": 168, - "frec": 1 - }, - { - "id": 206, - "frec": 1 - }, - { - "id": 228, - "frec": 1 - }, - { - "id": 394, - "frec": 1 - }, - { - "id": 396, - "frec": 1 - }, - { - "id": 400, - "frec": 1 - }, - { - "id": 401, - "frec": 1 - }, - { - "id": 398, - "frec": 1 - }, - { - "id": 406, - "frec": 1 - }, - { - "id": 415, - "frec": 1 - }, - { - "id": 425, - "frec": 1 - }, - { - "id": 426, - "frec": 1 - }, - { - "id": 427, - "frec": 1 - }, - { - "id": 431, - "frec": 1 - }, - { - "id": 439, - "frec": 1 - }, - { - "id": 440, - "frec": 1 - }, - { - "id": 450, - "frec": 1 - }, - { - "id": 451, - "frec": 1 - }, - { - "id": 452, - "frec": 1 - }, - { - "id": 459, - "frec": 1 - }, - { - "id": 466, - "frec": 1 - }, - { - "id": 484, - "frec": 1 - }, - { - "id": 483, - "frec": 1 - }, - { - "id": 487, - "frec": 1 - }, - { - "id": 488, - "frec": 1 - }, - { - "id": 489, - "frec": 1 - }, - { - "id": 490, - "frec": 1 - }, - { - "id": 491, - "frec": 1 - }, - { - "id": 492, - "frec": 1 - }, - { - "id": 495, - "frec": 1 - }, - { - "id": 496, - "frec": 1 - }, - { - "id": 500, - "frec": 1 - }, - { - "id": 494, - "frec": 1 - }, - { - "id": 588, - "frec": 1 - }, - { - "id": 587, - "frec": 1 - } - ] - }, - { - "id": 33, - "texto": { - "en": "Greengrocery book", - "fr": "Livre de légumes" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Flibro_verduleria.webp?alt=media&token=533584e7-215a-4ab7-bc2f-aecf13c9c6c1" - }, - "relacion": [ - { - "id": 5, - "frec": 1 - }, - { - "id": 7, - "frec": 1 - }, - { - "id": 13, - "frec": 1 - }, - { - "id": 22, - "frec": 1 - }, - { - "id": 36, - "frec": 1 - }, - { - "id": 37, - "frec": 1 - }, - { - "id": 69, - "frec": 1 - }, - { - "id": 391, - "frec": 1 - }, - { - "id": 392, - "frec": 1 - }, - { - "id": 393, - "frec": 1 - }, - { - "id": 395, - "frec": 1 - }, - { - "id": 397, - "frec": 1 - }, - { - "id": 399, - "frec": 1 - }, - { - "id": 402, - "frec": 1 - }, - { - "id": 403, - "frec": 1 - }, - { - "id": 404, - "frec": 1 - }, - { - "id": 405, - "frec": 1 - }, - { - "id": 407, - "frec": 1 - }, - { - "id": 408, - "frec": 1 - }, - { - "id": 409, - "frec": 1 - }, - { - "id": 410, - "frec": 1 - }, - { - "id": 414, - "frec": 1 - }, - { - "id": 413, - "frec": 1 - }, - { - "id": 418, - "frec": 1 - }, - { - "id": 419, - "frec": 1 - }, - { - "id": 422, - "frec": 1 - }, - { - "id": 423, - "frec": 1 - }, - { - "id": 428, - "frec": 1 - }, - { - "id": 430, - "frec": 1 - }, - { - "id": 432, - "frec": 1 - }, - { - "id": 433, - "frec": 1 - }, - { - "id": 434, - "frec": 1 - }, - { - "id": 435, - "frec": 1 - }, - { - "id": 436, - "frec": 1 - }, - { - "id": 441, - "frec": 1 - }, - { - "id": 442, - "frec": 1 - }, - { - "id": 443, - "frec": 1 - }, - { - "id": 444, - "frec": 1 - }, - { - "id": 445, - "frec": 1 - }, - { - "id": 446, - "frec": 1 - }, - { - "id": 447, - "frec": 1 - }, - { - "id": 448, - "frec": 1 - }, - { - "id": 456, - "frec": 1 - }, - { - "id": 457, - "frec": 1 - }, - { - "id": 460, - "frec": 1 - }, - { - "id": 463, - "frec": 1 - }, - { - "id": 473, - "frec": 1 - }, - { - "id": 474, - "frec": 1 - }, - { - "id": 475, - "frec": 1 - }, - { - "id": 478, - "frec": 1 - }, - { - "id": 483, - "frec": 1 - }, - { - "id": 507, - "frec": 1 - } - ] - }, - { - "id": 34, - "texto": { - "en": "Music lesson", - "fr": "Cours de musique" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fclase_musica.webp?alt=media&token=a7a2c34a-9c31-44ad-81d0-b1a4c443aa89" - }, - "relacion": [ - { - "id": 3, - "frec": 1 - }, - { - "id": 6, - "frec": 1 - }, - { - "id": 1, - "frec": 1 - }, - { - "id": 17, - "frec": 1 - }, - { - "id": 2, - "frec": 1 - }, - { - "id": 20, - "frec": 1 - }, - { - "id": 19, - "frec": 1 - }, - { - "id": 50, - "frec": 1 - }, - { - "id": 573, - "frec": 1 - }, - { - "id": 627, - "frec": 1 - }, - { - "id": 626, - "frec": 1 - }, - { - "id": 847, - "frec": 1 - }, - { - "id": 848, - "frec": 1 - }, - { - "id": 849, - "frec": 1 - }, - { - "id": 850, - "frec": 1 - }, - { - "id": 851, - "frec": 1 - }, - { - "id": 852, - "frec": 1 - }, - { - "id": 853, - "frec": 1 - }, - { - "id": 854, - "frec": 1 - }, - { - "id": 855, - "frec": 1 - }, - { - "id": 856, - "frec": 1 - }, - { - "id": 857, - "frec": 1 - }, - { - "id": 858, - "frec": 1 - }, - { - "id": 859, - "frec": 1 - }, - { - "id": 860, - "frec": 1 - }, - { - "id": 861, - "frec": 1 - }, - { - "id": 862, - "frec": 1 - }, - { - "id": 863, - "frec": 1 - }, - { - "id": 864, - "frec": 1 - }, - { - "id": 865, - "frec": 1 - }, - { - "id": 866, - "frec": 1 - }, - { - "id": 867, - "frec": 1 - }, - { - "id": 868, - "frec": 1 - }, - { - "id": 869, - "frec": 1 - }, - { - "id": 870, - "frec": 1 - }, - { - "id": 871, - "frec": 1 - }, - { - "id": 872, - "frec": 1 - }, - { - "id": 873, - "frec": 1 - }, - { - "id": 874, - "frec": 1 - }, - { - "id": 875, - "frec": 1 - }, - { - "id": 876, - "frec": 1 - }, - { - "id": 877, - "frec": 1 - }, - { - "id": 1019, - "frec": 1 - } - ] - }, - { - "id": 35, - "texto": { - "en": "Art lesson", - "fr": "Leçon d'art" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fclase_plastica.webp?alt=media&token=fb56f0bd-50d1-4a90-b32d-09e85ce95514" - }, - "relacion": [ - { - "id": 1, - "frec": 1 - }, - { - "id": 5, - "frec": 1 - }, - { - "id": 7, - "frec": 1 - }, - { - "id": 15, - "frec": 1 - }, - { - "id": 28, - "frec": 1 - }, - { - "id": 74, - "frec": 1 - }, - { - "id": 95, - "frec": 1 - }, - { - "id": 90, - "frec": 1 - }, - { - "id": 200, - "frec": 1 - }, - { - "id": 626, - "frec": 1 - }, - { - "id": 627, - "frec": 1 - }, - { - "id": 733, - "frec": 1 - }, - { - "id": 734, - "frec": 1 - }, - { - "id": 735, - "frec": 1 - }, - { - "id": 736, - "frec": 1 - }, - { - "id": 737, - "frec": 1 - }, - { - "id": 738, - "frec": 1 - }, - { - "id": 739, - "frec": 1 - }, - { - "id": 740, - "frec": 1 - }, - { - "id": 741, - "frec": 1 - }, - { - "id": 742, - "frec": 1 - }, - { - "id": 743, - "frec": 1 - }, - { - "id": 744, - "frec": 1 - }, - { - "id": 745, - "frec": 1 - }, - { - "id": 746, - "frec": 1 - }, - { - "id": 747, - "frec": 1 - }, - { - "id": 748, - "frec": 1 - }, - { - "id": 749, - "frec": 1 - }, - { - "id": 750, - "frec": 1 - }, - { - "id": 756, - "frec": 1 - }, - { - "id": 754, - "frec": 1 - }, - { - "id": 762, - "frec": 1 - }, - { - "id": 766, - "frec": 1 - }, - { - "id": 769, - "frec": 1 - }, - { - "id": 771, - "frec": 1 - }, - { - "id": 775, - "frec": 1 - } - ] - }, - { - "id": 36, - "texto": { - "en": "Lessons", - "fr": "Cours" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Flibro_clases.webp?alt=media&token=d0f51815-d6ec-4d98-972b-8a5e9fbe06e7" - }, - "relacion": [] - }, - { - "id": 37, - "texto": { - "en": "Football game", - "fr": "Jeu de football" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_futbol.webp?alt=media&token=50db7655-7aff-4f93-9b68-875cc5706c7a" - }, - "relacion": [ - { - "id": 7, - "frec": 1 - }, - { - "id": 8, - "frec": 1 - }, - { - "id": 2, - "frec": 1 - }, - { - "id": 17, - "frec": 1 - }, - { - "id": 16, - "frec": 1 - }, - { - "id": 26, - "frec": 1 - }, - { - "id": 34, - "frec": 1 - }, - { - "id": 41, - "frec": 1 - }, - { - "id": 46, - "frec": 1 - }, - { - "id": 70, - "frec": 1 - }, - { - "id": 85, - "frec": 1 - }, - { - "id": 119, - "frec": 1 - }, - { - "id": 124, - "frec": 1 - }, - { - "id": 125, - "frec": 1 - }, - { - "id": 161, - "frec": 1 - }, - { - "id": 171, - "frec": 1 - }, - { - "id": 386, - "frec": 1 - }, - { - "id": 377, - "frec": 10 - }, - { - "id": 388, - "frec": 1 - }, - { - "id": 389, - "frec": 1 - }, - { - "id": 616, - "frec": 1 - }, - { - "id": 622, - "frec": 1 - }, - { - "id": 620, - "frec": 1 - }, - { - "id": 651, - "frec": 1 - }, - { - "id": 832, - "frec": 1 - }, - { - "id": 833, - "frec": 1 - }, - { - "id": 834, - "frec": 1 - }, - { - "id": 835, - "frec": 1 - } - ] - }, - { - "id": 38, - "texto": { - "en": "Movies", - "fr": "Films" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcine.webp?alt=media&token=4109bb74-ab3d-4cda-99fb-34e7030e8762" - }, - "relacion": [ - { - "id": 1, - "frec": 1 - }, - { - "id": 3, - "frec": 1 - }, - { - "id": 7, - "frec": 1 - }, - { - "id": 13, - "frec": 1 - }, - { - "id": 23, - "frec": 1 - }, - { - "id": 30, - "frec": 1 - }, - { - "id": 36, - "frec": 1 - }, - { - "id": 37, - "frec": 1 - }, - { - "id": 48, - "frec": 1 - }, - { - "id": 74, - "frec": 1 - }, - { - "id": 543, - "frec": 1 - }, - { - "id": 544, - "frec": 1 - }, - { - "id": 545, - "frec": 1 - }, - { - "id": 546, - "frec": 1 - }, - { - "id": 547, - "frec": 1 - }, - { - "id": 548, - "frec": 1 - }, - { - "id": 549, - "frec": 1 - }, - { - "id": 550, - "frec": 1 - }, - { - "id": 551, - "frec": 1 - }, - { - "id": 552, - "frec": 1 - }, - { - "id": 553, - "frec": 1 - }, - { - "id": 554, - "frec": 1 - }, - { - "id": 555, - "frec": 1 - }, - { - "id": 556, - "frec": 1 - }, - { - "id": 557, - "frec": 1 - }, - { - "id": 558, - "frec": 1 - }, - { - "id": 559, - "frec": 1 - }, - { - "id": 560, - "frec": 1 - }, - { - "id": 561, - "frec": 1 - }, - { - "id": 562, - "frec": 1 - }, - { - "id": 563, - "frec": 1 - }, - { - "id": 564, - "frec": 1 - }, - { - "id": 565, - "frec": 1 - }, - { - "id": 566, - "frec": 1 - }, - { - "id": 567, - "frec": 1 - }, - { - "id": 569, - "frec": 1 - }, - { - "id": 570, - "frec": 1 - }, - { - "id": 571, - "frec": 1 - }, - { - "id": 572, - "frec": 1 - }, - { - "id": 573, - "frec": 1 - }, - { - "id": 574, - "frec": 1 - }, - { - "id": 576, - "frec": 1 - }, - { - "id": 575, - "frec": 1 - }, - { - "id": 577, - "frec": 1 - }, - { - "id": 578, - "frec": 1 - }, - { - "id": 579, - "frec": 1 - }, - { - "id": 580, - "frec": 1 - }, - { - "id": 581, - "frec": 1 - }, - { - "id": 582, - "frec": 1 - }, - { - "id": 583, - "frec": 1 - }, - { - "id": 584, - "frec": 1 - }, - { - "id": 587, - "frec": 1 - }, - { - "id": 602, - "frec": 1 - }, - { - "id": 634, - "frec": 1 - }, - { - "id": 636, - "frec": 1 - }, - { - "id": 635, - "frec": 1 - }, - { - "id": 638, - "frec": 1 - }, - { - "id": 639, - "frec": 1 - }, - { - "id": 641, - "frec": 1 - } - ] - }, - { - "id": 39, - "texto": { - "en": "Pharmacy book", - "fr": "Livre de pharmacie" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_farmacia.webp?alt=media&token=0e948284-58e5-4f44-8269-dd5a65ee6558" - }, - "relacion": [ - { - "id": 23, - "frec": 1 - }, - { - "id": 36, - "frec": 1 - }, - { - "id": 37, - "frec": 1 - }, - { - "id": 47, - "frec": 1 - }, - { - "id": 76, - "frec": 1 - }, - { - "id": 98, - "frec": 1 - }, - { - "id": 101, - "frec": 1 - }, - { - "id": 113, - "frec": 1 - }, - { - "id": 114, - "frec": 1 - }, - { - "id": 131, - "frec": 1 - }, - { - "id": 138, - "frec": 1 - }, - { - "id": 250, - "frec": 1 - }, - { - "id": 251, - "frec": 1 - }, - { - "id": 377, - "frec": 1 - }, - { - "id": 378, - "frec": 1 - }, - { - "id": 379, - "frec": 1 - }, - { - "id": 380, - "frec": 1 - }, - { - "id": 384, - "frec": 1 - }, - { - "id": 382, - "frec": 1 - }, - { - "id": 383, - "frec": 1 - }, - { - "id": 381, - "frec": 1 - }, - { - "id": 385, - "frec": 1 - }, - { - "id": 387, - "frec": 1 - }, - { - "id": 388, - "frec": 1 - }, - { - "id": 389, - "frec": 1 - }, - { - "id": 567, - "frec": 1 - }, - { - "id": 587, - "frec": 1 - }, - { - "id": 588, - "frec": 1 - }, - { - "id": 629, - "frec": 1 - }, - { - "id": 708, - "frec": 1 - }, - { - "id": 777, - "frec": 1 - }, - { - "id": 778, - "frec": 1 - }, - { - "id": 779, - "frec": 1 - }, - { - "id": 780, - "frec": 1 - }, - { - "id": 784, - "frec": 1 - }, - { - "id": 783, - "frec": 1 - }, - { - "id": 782, - "frec": 1 - }, - { - "id": 781, - "frec": 1 - }, - { - "id": 785, - "frec": 1 - }, - { - "id": 786, - "frec": 1 - }, - { - "id": 787, - "frec": 1 - }, - { - "id": 788, - "frec": 1 - }, - { - "id": 789, - "frec": 1 - }, - { - "id": 790, - "frec": 1 - }, - { - "id": 791, - "frec": 1 - }, - { - "id": 792, - "frec": 1 - }, - { - "id": 793, - "frec": 1 - }, - { - "id": 795, - "frec": 1 - }, - { - "id": 799, - "frec": 1 - }, - { - "id": 797, - "frec": 1 - }, - { - "id": 800, - "frec": 1 - }, - { - "id": 801, - "frec": 1 - }, - { - "id": 802, - "frec": 1 - }, - { - "id": 804, - "frec": 1 - }, - { - "id": 807, - "frec": 1 - }, - { - "id": 805, - "frec": 1 - }, - { - "id": 809, - "frec": 1 - }, - { - "id": 819, - "frec": 1 - }, - { - "id": 820, - "frec": 1 - }, - { - "id": 821, - "frec": 1 - }, - { - "id": 822, - "frec": 1 - }, - { - "id": 823, - "frec": 1 - }, - { - "id": 824, - "frec": 1 - }, - { - "id": 825, - "frec": 1 - }, - { - "id": 826, - "frec": 1 - }, - { - "id": 827, - "frec": 1 - }, - { - "id": 828, - "frec": 1 - }, - { - "id": 829, - "frec": 1 - }, - { - "id": 830, - "frec": 1 - }, - { - "id": 831, - "frec": 1 - }, - { - "id": 878, - "frec": 1 - }, - { - "id": 879, - "frec": 1 - }, - { - "id": 880, - "frec": 1 - }, - { - "id": 881, - "frec": 1 - }, - { - "id": 882, - "frec": 1 - }, - { - "id": 883, - "frec": 1 - }, - { - "id": 884, - "frec": 1 - }, - { - "id": 885, - "frec": 1 - }, - { - "id": 886, - "frec": 1 - }, - { - "id": 887, - "frec": 1 - } - ] - }, - { - "id": 40, - "texto": { - "en": "Swimming", - "fr": "La natation" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fnatacion.webp?alt=media&token=f4e987c5-4a65-4499-bf95-ec775a6f17e6" - }, - "relacion": [ - { - "id": 1, - "frec": 1 - }, - { - "id": 7, - "frec": 1 - }, - { - "id": 10, - "frec": 1 - }, - { - "id": 59, - "frec": 1 - }, - { - "id": 63, - "frec": 1 - }, - { - "id": 86, - "frec": 1 - }, - { - "id": 88, - "frec": 1 - }, - { - "id": 83, - "frec": 1 - }, - { - "id": 96, - "frec": 1 - }, - { - "id": 102, - "frec": 1 - }, - { - "id": 99, - "frec": 1 - }, - { - "id": 105, - "frec": 1 - } - ] - } -] \ No newline at end of file diff --git a/assets/languages/grupos_pt.json b/assets/languages/grupos_pt.json deleted file mode 100644 index f7314406..00000000 --- a/assets/languages/grupos_pt.json +++ /dev/null @@ -1,11721 +0,0 @@ -[ - { - "id": 0, - "texto": { - "en": "Actions", - "pt": "Ações" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fverbos.webp?alt=media&token=f32aaaf1-44aa-49d3-a0ed-981ba01564d5" - }, - "relacion": [ - { - "id": 1, - "frec": 1 - }, - { - "id": 2, - "frec": 1 - }, - { - "id": 3, - "frec": 1 - }, - { - "id": 4, - "frec": 1 - }, - { - "id": 5, - "frec": 1 - }, - { - "id": 6, - "frec": 1 - }, - { - "id": 7, - "frec": 1 - }, - { - "id": 8, - "frec": 1 - }, - { - "id": 9, - "frec": 1 - }, - { - "id": 10, - "frec": 1 - }, - { - "id": 11, - "frec": 1 - }, - { - "id": 12, - "frec": 1 - }, - { - "id": 13, - "frec": 1 - }, - { - "id": 14, - "frec": 1 - }, - { - "id": 15, - "frec": 1 - }, - { - "id": 16, - "frec": 1 - }, - { - "id": 17, - "frec": 1 - }, - { - "id": 18, - "frec": 1 - }, - { - "id": 19, - "frec": 1 - }, - { - "id": 20, - "frec": 1 - }, - { - "id": 21, - "frec": 1 - }, - { - "id": 22, - "frec": 1 - }, - { - "id": 23, - "frec": 1 - }, - { - "id": 24, - "frec": 1 - }, - { - "id": 25, - "frec": 1 - }, - { - "id": 26, - "frec": 1 - }, - { - "id": 27, - "frec": 1 - }, - { - "id": 28, - "frec": 1 - }, - { - "id": 29, - "frec": 1 - }, - { - "id": 30, - "frec": 1 - }, - { - "id": 31, - "frec": 1 - }, - { - "id": 32, - "frec": 1 - }, - { - "id": 33, - "frec": 1 - }, - { - "id": 34, - "frec": 1 - }, - { - "id": 35, - "frec": 1 - }, - { - "id": 36, - "frec": 1 - }, - { - "id": 37, - "frec": 1 - }, - { - "id": 38, - "frec": 1 - }, - { - "id": 39, - "frec": 1 - }, - { - "id": 40, - "frec": 1 - }, - { - "id": 41, - "frec": 1 - }, - { - "id": 42, - "frec": 1 - }, - { - "id": 43, - "frec": 1 - }, - { - "id": 44, - "frec": 1 - }, - { - "id": 45, - "frec": 1 - }, - { - "id": 46, - "frec": 1 - }, - { - "id": 47, - "frec": 1 - }, - { - "id": 48, - "frec": 1 - }, - { - "id": 49, - "frec": 2 - }, - { - "id": 50, - "frec": 1 - }, - { - "id": 51, - "frec": 1 - }, - { - "id": 52, - "frec": 1 - }, - { - "id": 53, - "frec": 1 - }, - { - "id": 54, - "frec": 1 - }, - { - "id": 55, - "frec": 1 - }, - { - "id": 56, - "frec": 1 - }, - { - "id": 57, - "frec": 1 - }, - { - "id": 58, - "frec": 1 - }, - { - "id": 59, - "frec": 1 - }, - { - "id": 60, - "frec": 1 - }, - { - "id": 61, - "frec": 1 - }, - { - "id": 62, - "frec": 1 - }, - { - "id": 63, - "frec": 1 - }, - { - "id": 64, - "frec": 1 - }, - { - "id": 65, - "frec": 1 - }, - { - "id": 66, - "frec": 1 - }, - { - "id": 67, - "frec": 1 - }, - { - "id": 68, - "frec": 1 - }, - { - "id": 69, - "frec": 1 - }, - { - "id": 70, - "frec": 1 - }, - { - "id": 71, - "frec": 1 - }, - { - "id": 72, - "frec": 1 - }, - { - "id": 73, - "frec": 1 - }, - { - "id": 74, - "frec": 1 - }, - { - "id": 75, - "frec": 1 - }, - { - "id": 76, - "frec": 1 - }, - { - "id": 77, - "frec": 1 - }, - { - "id": 78, - "frec": 1 - }, - { - "id": 79, - "frec": 1 - }, - { - "id": 80, - "frec": 1 - }, - { - "id": 81, - "frec": 1 - }, - { - "id": 82, - "frec": 1 - }, - { - "id": 83, - "frec": 1 - }, - { - "id": 84, - "frec": 1 - }, - { - "id": 85, - "frec": 1 - }, - { - "id": 86, - "frec": 1 - }, - { - "id": 87, - "frec": 1 - }, - { - "id": 88, - "frec": 1 - }, - { - "id": 90, - "frec": 1 - }, - { - "id": 89, - "frec": 1 - }, - { - "id": 91, - "frec": 1 - }, - { - "id": 92, - "frec": 1 - }, - { - "id": 93, - "frec": 1 - }, - { - "id": 94, - "frec": 1 - }, - { - "id": 95, - "frec": 1 - }, - { - "id": 96, - "frec": 1 - }, - { - "id": 97, - "frec": 1 - }, - { - "id": 98, - "frec": 1 - }, - { - "id": 99, - "frec": 1 - }, - { - "id": 100, - "frec": 1 - }, - { - "id": 101, - "frec": 1 - }, - { - "id": 102, - "frec": 1 - }, - { - "id": 103, - "frec": 1 - }, - { - "id": 104, - "frec": 1 - }, - { - "id": 105, - "frec": 1 - }, - { - "id": 106, - "frec": 1 - }, - { - "id": 107, - "frec": 1 - }, - { - "id": 108, - "frec": 1 - }, - { - "id": 109, - "frec": 1 - }, - { - "id": 110, - "frec": 1 - }, - { - "id": 111, - "frec": 1 - }, - { - "id": 112, - "frec": 1 - }, - { - "id": 113, - "frec": 1 - }, - { - "id": 114, - "frec": 1 - }, - { - "id": 115, - "frec": 1 - }, - { - "id": 116, - "frec": 1 - }, - { - "id": 117, - "frec": 1 - }, - { - "id": 118, - "frec": 1 - } - ] - }, - { - "id": 1, - "texto": { - "en": "Adjectives", - "pt": "Adjetivos" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fdescripcion.webp?alt=media&token=4dbde8ba-f144-4a12-90f6-013bf68d912d" - }, - "relacion": [ - { - "id": 119, - "frec": 1 - }, - { - "id": 120, - "frec": 1 - }, - { - "id": 121, - "frec": 1 - }, - { - "id": 122, - "frec": 1 - }, - { - "id": 123, - "frec": 1 - }, - { - "id": 124, - "frec": 1 - }, - { - "id": 125, - "frec": 1 - }, - { - "id": 126, - "frec": 1 - }, - { - "id": 127, - "frec": 1 - }, - { - "id": 128, - "frec": 1 - }, - { - "id": 129, - "frec": 1 - }, - { - "id": 130, - "frec": 1 - }, - { - "id": 131, - "frec": 1 - }, - { - "id": 132, - "frec": 1 - }, - { - "id": 133, - "frec": 1 - }, - { - "id": 134, - "frec": 1 - }, - { - "id": 135, - "frec": 1 - }, - { - "id": 136, - "frec": 1 - }, - { - "id": 137, - "frec": 1 - }, - { - "id": 138, - "frec": 1 - }, - { - "id": 139, - "frec": 1 - }, - { - "id": 140, - "frec": 1 - }, - { - "id": 141, - "frec": 1 - }, - { - "id": 142, - "frec": 1 - }, - { - "id": 143, - "frec": 1 - }, - { - "id": 144, - "frec": 1 - }, - { - "id": 145, - "frec": 1 - }, - { - "id": 146, - "frec": 1 - }, - { - "id": 147, - "frec": 1 - }, - { - "id": 148, - "frec": 1 - }, - { - "id": 149, - "frec": 1 - }, - { - "id": 150, - "frec": 1 - }, - { - "id": 151, - "frec": 1 - }, - { - "id": 152, - "frec": 1 - }, - { - "id": 153, - "frec": 1 - }, - { - "id": 154, - "frec": 1 - }, - { - "id": 155, - "frec": 1 - }, - { - "id": 156, - "frec": 1 - }, - { - "id": 157, - "frec": 1 - }, - { - "id": 158, - "frec": 1 - }, - { - "id": 159, - "frec": 1 - }, - { - "id": 160, - "frec": 1 - }, - { - "id": 161, - "frec": 1 - }, - { - "id": 162, - "frec": 1 - }, - { - "id": 163, - "frec": 1 - }, - { - "id": 164, - "frec": 1 - }, - { - "id": 165, - "frec": 1 - }, - { - "id": 166, - "frec": 1 - }, - { - "id": 167, - "frec": 1 - }, - { - "id": 168, - "frec": 1 - }, - { - "id": 169, - "frec": 1 - }, - { - "id": 170, - "frec": 1 - }, - { - "id": 171, - "frec": 1 - }, - { - "id": 172, - "frec": 1 - }, - { - "id": 173, - "frec": 1 - }, - { - "id": 174, - "frec": 1 - }, - { - "id": 175, - "frec": 1 - }, - { - "id": 176, - "frec": 1 - }, - { - "id": 177, - "frec": 1 - }, - { - "id": 178, - "frec": 1 - }, - { - "id": 179, - "frec": 1 - }, - { - "id": 180, - "frec": 1 - }, - { - "id": 181, - "frec": 1 - }, - { - "id": 182, - "frec": 1 - }, - { - "id": 183, - "frec": 1 - }, - { - "id": 184, - "frec": 1 - }, - { - "id": 185, - "frec": 1 - }, - { - "id": 186, - "frec": 1 - }, - { - "id": 187, - "frec": 1 - }, - { - "id": 188, - "frec": 1 - }, - { - "id": 189, - "frec": 1 - }, - { - "id": 190, - "frec": 1 - }, - { - "id": 191, - "frec": 1 - }, - { - "id": 192, - "frec": 1 - }, - { - "id": 193, - "frec": 1 - }, - { - "id": 194, - "frec": 1 - }, - { - "id": 195, - "frec": 1 - }, - { - "id": 196, - "frec": 1 - }, - { - "id": 197, - "frec": 1 - }, - { - "id": 198, - "frec": 1 - }, - { - "id": 199, - "frec": 1 - }, - { - "id": 200, - "frec": 1 - }, - { - "id": 201, - "frec": 1 - }, - { - "id": 202, - "frec": 1 - }, - { - "id": 203, - "frec": 1 - }, - { - "id": 204, - "frec": 1 - }, - { - "id": 205, - "frec": 1 - }, - { - "id": 206, - "frec": 1 - }, - { - "id": 207, - "frec": 1 - }, - { - "id": 208, - "frec": 1 - }, - { - "id": 209, - "frec": 1 - }, - { - "id": 210, - "frec": 1 - }, - { - "id": 211, - "frec": 1 - }, - { - "id": 212, - "frec": 1 - }, - { - "id": 213, - "frec": 1 - }, - { - "id": 214, - "frec": 1 - }, - { - "id": 215, - "frec": 1 - }, - { - "id": 216, - "frec": 1 - }, - { - "id": 217, - "frec": 1 - }, - { - "id": 218, - "frec": 1 - }, - { - "id": 219, - "frec": 1 - }, - { - "id": 220, - "frec": 1 - }, - { - "id": 221, - "frec": 1 - }, - { - "id": 222, - "frec": 1 - }, - { - "id": 223, - "frec": 1 - }, - { - "id": 224, - "frec": 1 - }, - { - "id": 225, - "frec": 1 - }, - { - "id": 226, - "frec": 1 - }, - { - "id": 227, - "frec": 1 - }, - { - "id": 228, - "frec": 1 - }, - { - "id": 229, - "frec": 1 - }, - { - "id": 230, - "frec": 1 - }, - { - "id": 231, - "frec": 1 - }, - { - "id": 232, - "frec": 1 - }, - { - "id": 233, - "frec": 1 - }, - { - "id": 234, - "frec": 1 - }, - { - "id": 235, - "frec": 1 - }, - { - "id": 236, - "frec": 1 - }, - { - "id": 237, - "frec": 1 - }, - { - "id": 238, - "frec": 1 - }, - { - "id": 239, - "frec": 1 - }, - { - "id": 240, - "frec": 1 - }, - { - "id": 241, - "frec": 1 - }, - { - "id": 242, - "frec": 1 - }, - { - "id": 243, - "frec": 1 - }, - { - "id": 244, - "frec": 1 - }, - { - "id": 245, - "frec": 1 - }, - { - "id": 246, - "frec": 1 - }, - { - "id": 247, - "frec": 1 - }, - { - "id": 248, - "frec": 1 - }, - { - "id": 249, - "frec": 1 - }, - { - "id": 250, - "frec": 1 - }, - { - "id": 251, - "frec": 1 - }, - { - "id": 252, - "frec": 1 - }, - { - "id": 253, - "frec": 1 - }, - { - "id": 254, - "frec": 1 - }, - { - "id": 255, - "frec": 1 - }, - { - "id": 256, - "frec": 1 - }, - { - "id": 257, - "frec": 1 - }, - { - "id": 258, - "frec": 1 - }, - { - "id": 259, - "frec": 1 - }, - { - "id": 260, - "frec": 1 - }, - { - "id": 261, - "frec": 1 - }, - { - "id": 262, - "frec": 1 - }, - { - "id": 263, - "frec": 1 - }, - { - "id": 264, - "frec": 1 - }, - { - "id": 265, - "frec": 1 - }, - { - "id": 266, - "frec": 1 - }, - { - "id": 267, - "frec": 1 - }, - { - "id": 268, - "frec": 1 - }, - { - "id": 269, - "frec": 1 - }, - { - "id": 270, - "frec": 1 - }, - { - "id": 271, - "frec": 1 - }, - { - "id": 272, - "frec": 1 - }, - { - "id": 273, - "frec": 1 - }, - { - "id": 274, - "frec": 1 - }, - { - "id": 275, - "frec": 1 - }, - { - "id": 276, - "frec": 1 - }, - { - "id": 277, - "frec": 1 - }, - { - "id": 278, - "frec": 1 - }, - { - "id": 279, - "frec": 1 - }, - { - "id": 280, - "frec": 1 - }, - { - "id": 281, - "frec": 1 - }, - { - "id": 282, - "frec": 1 - } - ] - }, - { - "id": 2, - "texto": { - "en": "Animals", - "pt": "Animais" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fanimales.webp?alt=media&token=de80d51b-647a-4860-9233-74b0925e053e" - }, - "relacion": [ - { - "id": 283, - "frec": 1 - }, - { - "id": 284, - "frec": 1 - }, - { - "id": 285, - "frec": 1 - }, - { - "id": 286, - "frec": 1 - }, - { - "id": 287, - "frec": 1 - }, - { - "id": 288, - "frec": 1 - }, - { - "id": 289, - "frec": 1 - }, - { - "id": 290, - "frec": 1 - }, - { - "id": 291, - "frec": 1 - }, - { - "id": 292, - "frec": 1 - }, - { - "id": 293, - "frec": 1 - }, - { - "id": 294, - "frec": 1 - }, - { - "id": 295, - "frec": 1 - }, - { - "id": 296, - "frec": 1 - }, - { - "id": 297, - "frec": 1 - }, - { - "id": 298, - "frec": 1 - }, - { - "id": 299, - "frec": 1 - }, - { - "id": 300, - "frec": 1 - }, - { - "id": 301, - "frec": 1 - }, - { - "id": 302, - "frec": 1 - }, - { - "id": 303, - "frec": 1 - }, - { - "id": 304, - "frec": 1 - }, - { - "id": 305, - "frec": 1 - }, - { - "id": 306, - "frec": 1 - }, - { - "id": 307, - "frec": 1 - }, - { - "id": 308, - "frec": 1 - }, - { - "id": 309, - "frec": 1 - }, - { - "id": 310, - "frec": 1 - }, - { - "id": 311, - "frec": 1 - }, - { - "id": 312, - "frec": 1 - }, - { - "id": 313, - "frec": 1 - }, - { - "id": 314, - "frec": 1 - }, - { - "id": 315, - "frec": 1 - }, - { - "id": 316, - "frec": 1 - }, - { - "id": 317, - "frec": 1 - }, - { - "id": 318, - "frec": 1 - }, - { - "id": 319, - "frec": 1 - }, - { - "id": 320, - "frec": 1 - }, - { - "id": 321, - "frec": 1 - }, - { - "id": 322, - "frec": 1 - }, - { - "id": 323, - "frec": 1 - }, - { - "id": 324, - "frec": 1 - }, - { - "id": 325, - "frec": 1 - }, - { - "id": 326, - "frec": 1 - }, - { - "id": 327, - "frec": 1 - }, - { - "id": 328, - "frec": 1 - }, - { - "id": 330, - "frec": 1 - }, - { - "id": 329, - "frec": 1 - }, - { - "id": 331, - "frec": 1 - }, - { - "id": 332, - "frec": 1 - }, - { - "id": 333, - "frec": 1 - }, - { - "id": 334, - "frec": 1 - }, - { - "id": 335, - "frec": 1 - }, - { - "id": 336, - "frec": 1 - }, - { - "id": 337, - "frec": 1 - }, - { - "id": 338, - "frec": 1 - }, - { - "id": 339, - "frec": 1 - }, - { - "id": 340, - "frec": 1 - }, - { - "id": 341, - "frec": 1 - }, - { - "id": 342, - "frec": 1 - }, - { - "id": 342, - "frec": 1 - }, - { - "id": 343, - "frec": 1 - }, - { - "id": 344, - "frec": 1 - }, - { - "id": 345, - "frec": 1 - }, - { - "id": 346, - "frec": 1 - }, - { - "id": 347, - "frec": 1 - }, - { - "id": 348, - "frec": 1 - }, - { - "id": 349, - "frec": 1 - }, - { - "id": 350, - "frec": 1 - }, - { - "id": 351, - "frec": 1 - }, - { - "id": 352, - "frec": 1 - }, - { - "id": 353, - "frec": 1 - }, - { - "id": 354, - "frec": 1 - }, - { - "id": 355, - "frec": 1 - }, - { - "id": 356, - "frec": 1 - }, - { - "id": 357, - "frec": 1 - }, - { - "id": 358, - "frec": 1 - }, - { - "id": 359, - "frec": 1 - }, - { - "id": 360, - "frec": 1 - }, - { - "id": 361, - "frec": 1 - }, - { - "id": 362, - "frec": 1 - }, - { - "id": 363, - "frec": 1 - }, - { - "id": 364, - "frec": 1 - }, - { - "id": 365, - "frec": 1 - }, - { - "id": 366, - "frec": 1 - }, - { - "id": 367, - "frec": 1 - }, - { - "id": 368, - "frec": 1 - }, - { - "id": 369, - "frec": 1 - }, - { - "id": 370, - "frec": 1 - }, - { - "id": 371, - "frec": 1 - }, - { - "id": 371, - "frec": 1 - }, - { - "id": 372, - "frec": 1 - }, - { - "id": 373, - "frec": 1 - }, - { - "id": 374, - "frec": 1 - }, - { - "id": 375, - "frec": 1 - }, - { - "id": 376, - "frec": 1 - } - ] - }, - { - "id": 3, - "texto": { - "en": "Food", - "pt": "Comida" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcomidas.webp?alt=media&token=9e4bc673-e0d9-4e75-bb78-ea9b0dd294e2" - }, - "relacion": [ - { - "id": 391, - "frec": 1 - }, - { - "id": 392, - "frec": 1 - }, - { - "id": 393, - "frec": 1 - }, - { - "id": 394, - "frec": 1 - }, - { - "id": 395, - "frec": 1 - }, - { - "id": 396, - "frec": 1 - }, - { - "id": 397, - "frec": 1 - }, - { - "id": 398, - "frec": 1 - }, - { - "id": 399, - "frec": 1 - }, - { - "id": 400, - "frec": 1 - }, - { - "id": 401, - "frec": 1 - }, - { - "id": 402, - "frec": 1 - }, - { - "id": 403, - "frec": 1 - }, - { - "id": 404, - "frec": 1 - }, - { - "id": 405, - "frec": 1 - }, - { - "id": 406, - "frec": 1 - }, - { - "id": 407, - "frec": 1 - }, - { - "id": 408, - "frec": 1 - }, - { - "id": 409, - "frec": 1 - }, - { - "id": 410, - "frec": 1 - }, - { - "id": 411, - "frec": 1 - }, - { - "id": 412, - "frec": 1 - }, - { - "id": 413, - "frec": 1 - }, - { - "id": 414, - "frec": 1 - }, - { - "id": 415, - "frec": 1 - }, - { - "id": 416, - "frec": 1 - }, - { - "id": 417, - "frec": 1 - }, - { - "id": 418, - "frec": 1 - }, - { - "id": 419, - "frec": 1 - }, - { - "id": 420, - "frec": 1 - }, - { - "id": 421, - "frec": 1 - }, - { - "id": 422, - "frec": 1 - }, - { - "id": 423, - "frec": 1 - }, - { - "id": 424, - "frec": 1 - }, - { - "id": 425, - "frec": 1 - }, - { - "id": 426, - "frec": 1 - }, - { - "id": 427, - "frec": 1 - }, - { - "id": 428, - "frec": 1 - }, - { - "id": 429, - "frec": 1 - }, - { - "id": 430, - "frec": 1 - }, - { - "id": 431, - "frec": 1 - }, - { - "id": 432, - "frec": 1 - }, - { - "id": 433, - "frec": 1 - }, - { - "id": 434, - "frec": 1 - }, - { - "id": 435, - "frec": 1 - }, - { - "id": 436, - "frec": 1 - }, - { - "id": 438, - "frec": 1 - }, - { - "id": 437, - "frec": 1 - }, - { - "id": 439, - "frec": 1 - }, - { - "id": 440, - "frec": 1 - }, - { - "id": 441, - "frec": 1 - }, - { - "id": 442, - "frec": 1 - }, - { - "id": 443, - "frec": 1 - }, - { - "id": 444, - "frec": 1 - }, - { - "id": 445, - "frec": 1 - }, - { - "id": 446, - "frec": 1 - }, - { - "id": 447, - "frec": 1 - }, - { - "id": 448, - "frec": 1 - }, - { - "id": 449, - "frec": 1 - }, - { - "id": 450, - "frec": 1 - }, - { - "id": 451, - "frec": 1 - }, - { - "id": 452, - "frec": 1 - }, - { - "id": 453, - "frec": 1 - }, - { - "id": 454, - "frec": 1 - }, - { - "id": 455, - "frec": 1 - }, - { - "id": 456, - "frec": 1 - }, - { - "id": 457, - "frec": 1 - }, - { - "id": 458, - "frec": 1 - }, - { - "id": 459, - "frec": 1 - }, - { - "id": 460, - "frec": 1 - }, - { - "id": 461, - "frec": 1 - }, - { - "id": 462, - "frec": 1 - }, - { - "id": 463, - "frec": 1 - }, - { - "id": 464, - "frec": 1 - }, - { - "id": 465, - "frec": 1 - }, - { - "id": 466, - "frec": 1 - }, - { - "id": 467, - "frec": 1 - }, - { - "id": 468, - "frec": 1 - }, - { - "id": 469, - "frec": 1 - }, - { - "id": 470, - "frec": 1 - }, - { - "id": 471, - "frec": 1 - }, - { - "id": 472, - "frec": 1 - }, - { - "id": 473, - "frec": 1 - }, - { - "id": 474, - "frec": 1 - }, - { - "id": 475, - "frec": 1 - }, - { - "id": 476, - "frec": 1 - }, - { - "id": 477, - "frec": 1 - }, - { - "id": 478, - "frec": 1 - }, - { - "id": 479, - "frec": 1 - }, - { - "id": 480, - "frec": 1 - }, - { - "id": 481, - "frec": 1 - }, - { - "id": 482, - "frec": 1 - }, - { - "id": 483, - "frec": 1 - }, - { - "id": 484, - "frec": 1 - }, - { - "id": 485, - "frec": 1 - }, - { - "id": 486, - "frec": 1 - }, - { - "id": 487, - "frec": 1 - }, - { - "id": 488, - "frec": 1 - }, - { - "id": 489, - "frec": 1 - }, - { - "id": 490, - "frec": 1 - }, - { - "id": 491, - "frec": 1 - }, - { - "id": 492, - "frec": 1 - }, - { - "id": 493, - "frec": 1 - }, - { - "id": 494, - "frec": 1 - }, - { - "id": 495, - "frec": 1 - }, - { - "id": 496, - "frec": 1 - }, - { - "id": 497, - "frec": 1 - }, - { - "id": 498, - "frec": 1 - }, - { - "id": 499, - "frec": 1 - }, - { - "id": 500, - "frec": 1 - }, - { - "id": 501, - "frec": 1 - }, - { - "id": 502, - "frec": 1 - }, - { - "id": 503, - "frec": 1 - }, - { - "id": 504, - "frec": 1 - }, - { - "id": 505, - "frec": 1 - }, - { - "id": 506, - "frec": 1 - }, - { - "id": 507, - "frec": 1 - }, - { - "id": 510, - "frec": 1 - }, - { - "id": 511, - "frec": 1 - }, - { - "id": 512, - "frec": 1 - }, - { - "id": 513, - "frec": 1 - }, - { - "id": 514, - "frec": 1 - }, - { - "id": 515, - "frec": 1 - }, - { - "id": 516, - "frec": 1 - }, - { - "id": 517, - "frec": 1 - }, - { - "id": 518, - "frec": 1 - }, - { - "id": 519, - "frec": 1 - }, - { - "id": 520, - "frec": 1 - }, - { - "id": 521, - "frec": 1 - }, - { - "id": 522, - "frec": 1 - }, - { - "id": 523, - "frec": 1 - }, - { - "id": 524, - "frec": 1 - } - ] - }, - { - "id": 4, - "texto": { - "en": "House", - "pt": "casa" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_casa.webp?alt=media&token=f1d197b6-db37-44e6-b4bc-8ba31b0fa4aa" - }, - "relacion": [ - { - "id": 2, - "frec": 1 - }, - { - "id": 3, - "frec": 1 - }, - { - "id": 5, - "frec": 1 - }, - { - "id": 8, - "frec": 1 - }, - { - "id": 17, - "frec": 1 - }, - { - "id": 20, - "frec": 1 - }, - { - "id": 157, - "frec": 1 - }, - { - "id": 199, - "frec": 1 - }, - { - "id": 222, - "frec": 1 - }, - { - "id": 263, - "frec": 1 - }, - { - "id": 586, - "frec": 1 - }, - { - "id": 599, - "frec": 1 - }, - { - "id": 605, - "frec": 1 - }, - { - "id": 653, - "frec": 1 - }, - { - "id": 678, - "frec": 1 - }, - { - "id": 731, - "frec": 1 - }, - { - "id": 755, - "frec": 1 - }, - { - "id": 758, - "frec": 1 - }, - { - "id": 773, - "frec": 1 - }, - { - "id": 774, - "frec": 1 - }, - { - "id": 1015, - "frec": 1 - }, - { - "id": 1012, - "frec": 1 - }, - { - "id": 1019, - "frec": 1 - }, - { - "id": 1023, - "frec": 1 - }, - { - "id": 1022, - "frec": 1 - }, - { - "id": 1021, - "frec": 1 - }, - { - "id": 1024, - "frec": 1 - }, - { - "id": 1025, - "frec": 1 - }, - { - "id": 1026, - "frec": 1 - }, - { - "id": 1027, - "frec": 1 - }, - { - "id": 1030, - "frec": 1 - }, - { - "id": 1031, - "frec": 1 - }, - { - "id": 1032, - "frec": 1 - } - ] - }, - { - "id": 5, - "texto": { - "en": "School", - "pt": "Escola" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_escuela.webp?alt=media&token=05c5460c-c3a5-4404-9389-d6a67e79bb5d" - }, - "relacion": [ - { - "id": 4, - "frec": 1 - }, - { - "id": 15, - "frec": 1 - }, - { - "id": 14, - "frec": 1 - }, - { - "id": 18, - "frec": 1 - }, - { - "id": 21, - "frec": 1 - }, - { - "id": 32, - "frec": 1 - }, - { - "id": 43, - "frec": 1 - }, - { - "id": 101, - "frec": 1 - }, - { - "id": 662, - "frec": 1 - }, - { - "id": 678, - "frec": 1 - }, - { - "id": 751, - "frec": 1 - }, - { - "id": 752, - "frec": 1 - }, - { - "id": 753, - "frec": 1 - }, - { - "id": 754, - "frec": 1 - }, - { - "id": 755, - "frec": 1 - }, - { - "id": 756, - "frec": 1 - }, - { - "id": 757, - "frec": 1 - }, - { - "id": 760, - "frec": 1 - }, - { - "id": 762, - "frec": 1 - }, - { - "id": 766, - "frec": 1 - }, - { - "id": 768, - "frec": 1 - }, - { - "id": 770, - "frec": 1 - }, - { - "id": 771, - "frec": 1 - }, - { - "id": 769, - "frec": 1 - } - ] - }, - { - "id": 6, - "texto": { - "en": "Colors", - "pt": "Cores" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_colores.webp?alt=media&token=04309e00-d682-43f3-9605-bde0b5b4ab9a" - }, - "relacion": [ - { - "id": 733, - "frec": 1 - }, - { - "id": 734, - "frec": 1 - }, - { - "id": 735, - "frec": 1 - }, - { - "id": 736, - "frec": 1 - }, - { - "id": 737, - "frec": 1 - }, - { - "id": 738, - "frec": 1 - }, - { - "id": 739, - "frec": 1 - }, - { - "id": 740, - "frec": 1 - }, - { - "id": 741, - "frec": 1 - }, - { - "id": 742, - "frec": 1 - }, - { - "id": 743, - "frec": 1 - }, - { - "id": 744, - "frec": 1 - }, - { - "id": 745, - "frec": 1 - }, - { - "id": 746, - "frec": 1 - }, - { - "id": 747, - "frec": 1 - }, - { - "id": 748, - "frec": 1 - }, - { - "id": 749, - "frec": 1 - }, - { - "id": 750, - "frec": 1 - } - ] - }, - { - "id": 7, - "texto": { - "en": "Concepts", - "pt": "Conceitos" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fconceptos.webp?alt=media&token=544d07e2-680b-427f-a657-9a1438529627" - }, - "relacion": [ - { - "id": 702, - "frec": 1 - }, - { - "id": 703, - "frec": 1 - }, - { - "id": 704, - "frec": 1 - }, - { - "id": 705, - "frec": 1 - }, - { - "id": 706, - "frec": 1 - }, - { - "id": 707, - "frec": 1 - }, - { - "id": 708, - "frec": 1 - }, - { - "id": 709, - "frec": 1 - }, - { - "id": 710, - "frec": 1 - }, - { - "id": 711, - "frec": 1 - }, - { - "id": 712, - "frec": 1 - }, - { - "id": 713, - "frec": 1 - }, - { - "id": 714, - "frec": 1 - }, - { - "id": 715, - "frec": 1 - }, - { - "id": 716, - "frec": 1 - }, - { - "id": 717, - "frec": 1 - }, - { - "id": 718, - "frec": 1 - }, - { - "id": 719, - "frec": 1 - }, - { - "id": 720, - "frec": 1 - }, - { - "id": 721, - "frec": 1 - }, - { - "id": 722, - "frec": 1 - }, - { - "id": 723, - "frec": 1 - }, - { - "id": 724, - "frec": 1 - }, - { - "id": 725, - "frec": 1 - }, - { - "id": 726, - "frec": 1 - }, - { - "id": 727, - "frec": 1 - }, - { - "id": 728, - "frec": 1 - }, - { - "id": 729, - "frec": 1 - }, - { - "id": 730, - "frec": 1 - }, - { - "id": 731, - "frec": 1 - }, - { - "id": 732, - "frec": 1 - } - ] - }, - { - "id": 8, - "texto": { - "en": "Conjunctions", - "pt": "Conjunções" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fconjunciones.webp?alt=media&token=bd3a504d-d5ca-45cc-a29f-869a6b578174" - }, - "relacion": [ - { - "id": 889, - "frec": 1 - }, - { - "id": 898, - "frec": 1 - }, - { - "id": 904, - "frec": 1 - }, - { - "id": 910, - "frec": 1 - }, - { - "id": 916, - "frec": 1 - }, - { - "id": 912, - "frec": 1 - }, - { - "id": 923, - "frec": 1 - } - ] - }, - { - "id": 9, - "texto": { - "en": "Body", - "pt": "Corpo" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpartes_del_cuerpo.webp?alt=media&token=b09b6919-2789-46a6-a883-d21c55859e08" - }, - "relacion": [ - { - "id": 776, - "frec": 1 - }, - { - "id": 777, - "frec": 1 - }, - { - "id": 778, - "frec": 1 - }, - { - "id": 779, - "frec": 1 - }, - { - "id": 780, - "frec": 1 - }, - { - "id": 781, - "frec": 1 - }, - { - "id": 782, - "frec": 1 - }, - { - "id": 783, - "frec": 1 - }, - { - "id": 784, - "frec": 1 - }, - { - "id": 785, - "frec": 1 - }, - { - "id": 786, - "frec": 1 - }, - { - "id": 787, - "frec": 1 - }, - { - "id": 788, - "frec": 1 - }, - { - "id": 789, - "frec": 1 - }, - { - "id": 790, - "frec": 1 - }, - { - "id": 791, - "frec": 1 - }, - { - "id": 792, - "frec": 1 - }, - { - "id": 793, - "frec": 1 - }, - { - "id": 794, - "frec": 1 - }, - { - "id": 795, - "frec": 1 - }, - { - "id": 796, - "frec": 1 - }, - { - "id": 797, - "frec": 1 - }, - { - "id": 798, - "frec": 1 - }, - { - "id": 799, - "frec": 1 - }, - { - "id": 800, - "frec": 1 - }, - { - "id": 801, - "frec": 1 - }, - { - "id": 802, - "frec": 1 - }, - { - "id": 803, - "frec": 1 - }, - { - "id": 804, - "frec": 1 - }, - { - "id": 805, - "frec": 1 - }, - { - "id": 806, - "frec": 1 - }, - { - "id": 807, - "frec": 1 - }, - { - "id": 808, - "frec": 1 - }, - { - "id": 809, - "frec": 1 - } - ] - }, - { - "id": 10, - "texto": { - "en": "Music instruments", - "pt": "Instrumentos musicais" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Finstrumentos.webp?alt=media&token=b58a39b2-6c69-4b19-8658-8a6a4fe7ca2a" - }, - "relacion": [ - { - "id": 847, - "frec": 1 - }, - { - "id": 848, - "frec": 1 - }, - { - "id": 849, - "frec": 1 - }, - { - "id": 850, - "frec": 1 - }, - { - "id": 851, - "frec": 1 - }, - { - "id": 852, - "frec": 1 - }, - { - "id": 853, - "frec": 1 - }, - { - "id": 854, - "frec": 1 - }, - { - "id": 855, - "frec": 1 - }, - { - "id": 856, - "frec": 1 - }, - { - "id": 857, - "frec": 1 - }, - { - "id": 858, - "frec": 1 - }, - { - "id": 859, - "frec": 1 - }, - { - "id": 860, - "frec": 1 - }, - { - "id": 861, - "frec": 1 - }, - { - "id": 862, - "frec": 1 - }, - { - "id": 863, - "frec": 1 - }, - { - "id": 864, - "frec": 1 - }, - { - "id": 865, - "frec": 1 - }, - { - "id": 866, - "frec": 1 - }, - { - "id": 867, - "frec": 1 - }, - { - "id": 868, - "frec": 1 - }, - { - "id": 869, - "frec": 1 - }, - { - "id": 870, - "frec": 1 - }, - { - "id": 871, - "frec": 1 - }, - { - "id": 872, - "frec": 1 - }, - { - "id": 873, - "frec": 1 - }, - { - "id": 874, - "frec": 1 - }, - { - "id": 875, - "frec": 1 - }, - { - "id": 876, - "frec": 1 - }, - { - "id": 877, - "frec": 1 - } - ] - }, - { - "id": 11, - "texto": { - "en": "Social interactions", - "pt": "Interações sociais" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fsociales.webp?alt=media&token=4bf39b77-0fdb-4d79-a407-14f5d66281d2" - }, - "relacion": [ - { - "id": 377, - "frec": 10 - }, - { - "id": 378, - "frec": 3 - }, - { - "id": 379, - "frec": 7 - }, - { - "id": 380, - "frec": 1 - }, - { - "id": 381, - "frec": 1 - }, - { - "id": 382, - "frec": 1 - }, - { - "id": 383, - "frec": 1 - }, - { - "id": 384, - "frec": 1 - }, - { - "id": 385, - "frec": 1 - }, - { - "id": 386, - "frec": 1 - }, - { - "id": 387, - "frec": 1 - }, - { - "id": 388, - "frec": 1 - }, - { - "id": 389, - "frec": 1 - }, - { - "id": 390, - "frec": 1 - } - ] - }, - { - "id": 12, - "texto": { - "en": "Toys", - "pt": "Brinquedos" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fjuguetes.webp?alt=media&token=046c8f8b-7518-4aac-9c56-6ac6fe4a03ef" - }, - "relacion": [ - { - "id": 975, - "frec": 1 - }, - { - "id": 976, - "frec": 1 - }, - { - "id": 977, - "frec": 1 - }, - { - "id": 978, - "frec": 1 - }, - { - "id": 979, - "frec": 1 - }, - { - "id": 980, - "frec": 1 - }, - { - "id": 981, - "frec": 1 - }, - { - "id": 982, - "frec": 1 - }, - { - "id": 983, - "frec": 1 - }, - { - "id": 984, - "frec": 1 - }, - { - "id": 985, - "frec": 1 - }, - { - "id": 986, - "frec": 1 - }, - { - "id": 987, - "frec": 1 - }, - { - "id": 989, - "frec": 1 - }, - { - "id": 990, - "frec": 1 - }, - { - "id": 988, - "frec": 1 - }, - { - "id": 991, - "frec": 1 - }, - { - "id": 992, - "frec": 1 - }, - { - "id": 993, - "frec": 1 - }, - { - "id": 994, - "frec": 1 - }, - { - "id": 995, - "frec": 1 - }, - { - "id": 996, - "frec": 1 - }, - { - "id": 997, - "frec": 1 - }, - { - "id": 998, - "frec": 1 - }, - { - "id": 999, - "frec": 1 - }, - { - "id": 1000, - "frec": 1 - }, - { - "id": 1001, - "frec": 1 - }, - { - "id": 1002, - "frec": 1 - }, - { - "id": 1003, - "frec": 1 - }, - { - "id": 1004, - "frec": 1 - }, - { - "id": 1005, - "frec": 1 - }, - { - "id": 1006, - "frec": 1 - }, - { - "id": 1007, - "frec": 1 - }, - { - "id": 1008, - "frec": 1 - }, - { - "id": 1009, - "frec": 1 - }, - { - "id": 1010, - "frec": 1 - }, - { - "id": 1011, - "frec": 1 - }, - { - "id": 1012, - "frec": 1 - }, - { - "id": 1013, - "frec": 1 - }, - { - "id": 1014, - "frec": 1 - }, - { - "id": 1015, - "frec": 1 - }, - { - "id": 1016, - "frec": 1 - }, - { - "id": 1017, - "frec": 1 - }, - { - "id": 1018, - "frec": 1 - }, - { - "id": 1019, - "frec": 1 - }, - { - "id": 1020, - "frec": 1 - }, - { - "id": 1021, - "frec": 1 - }, - { - "id": 1022, - "frec": 1 - } - ] - }, - { - "id": 13, - "texto": { - "en": "Places", - "pt": "Locais" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Flugares.webp?alt=media&token=fa4c9b84-7f78-49d3-8fe7-b67335365b94" - }, - "relacion": [ - { - "id": 644, - "frec": 1 - }, - { - "id": 645, - "frec": 1 - }, - { - "id": 646, - "frec": 1 - }, - { - "id": 647, - "frec": 1 - }, - { - "id": 648, - "frec": 1 - }, - { - "id": 649, - "frec": 1 - }, - { - "id": 650, - "frec": 1 - }, - { - "id": 651, - "frec": 1 - }, - { - "id": 652, - "frec": 1 - }, - { - "id": 653, - "frec": 1 - }, - { - "id": 654, - "frec": 1 - }, - { - "id": 655, - "frec": 1 - }, - { - "id": 656, - "frec": 1 - }, - { - "id": 657, - "frec": 1 - }, - { - "id": 658, - "frec": 1 - }, - { - "id": 659, - "frec": 1 - }, - { - "id": 660, - "frec": 1 - }, - { - "id": 661, - "frec": 1 - }, - { - "id": 662, - "frec": 1 - }, - { - "id": 663, - "frec": 1 - }, - { - "id": 664, - "frec": 1 - }, - { - "id": 665, - "frec": 1 - }, - { - "id": 666, - "frec": 1 - }, - { - "id": 667, - "frec": 1 - }, - { - "id": 668, - "frec": 1 - }, - { - "id": 669, - "frec": 1 - }, - { - "id": 670, - "frec": 1 - }, - { - "id": 671, - "frec": 1 - }, - { - "id": 672, - "frec": 1 - }, - { - "id": 673, - "frec": 1 - }, - { - "id": 674, - "frec": 1 - }, - { - "id": 675, - "frec": 1 - }, - { - "id": 676, - "frec": 1 - }, - { - "id": 677, - "frec": 1 - }, - { - "id": 678, - "frec": 1 - }, - { - "id": 679, - "frec": 1 - }, - { - "id": 680, - "frec": 1 - }, - { - "id": 681, - "frec": 1 - }, - { - "id": 682, - "frec": 1 - }, - { - "id": 683, - "frec": 1 - }, - { - "id": 684, - "frec": 1 - }, - { - "id": 685, - "frec": 1 - }, - { - "id": 686, - "frec": 1 - }, - { - "id": 687, - "frec": 1 - }, - { - "id": 688, - "frec": 1 - }, - { - "id": 689, - "frec": 1 - }, - { - "id": 690, - "frec": 1 - }, - { - "id": 691, - "frec": 1 - }, - { - "id": 692, - "frec": 1 - }, - { - "id": 693, - "frec": 1 - }, - { - "id": 694, - "frec": 1 - }, - { - "id": 695, - "frec": 1 - }, - { - "id": 696, - "frec": 1 - }, - { - "id": 697, - "frec": 1 - }, - { - "id": 698, - "frec": 1 - }, - { - "id": 699, - "frec": 1 - }, - { - "id": 700, - "frec": 1 - }, - { - "id": 701, - "frec": 1 - }, - { - "id": 508, - "frec": 1 - } - ] - }, - { - "id": 15, - "texto": { - "en": "Numbers", - "pt": "Números" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fnumeros.webp?alt=media&token=51f29b27-7998-4db5-bcad-ecc7979beea5" - }, - "relacion": [ - { - "id": 836, - "frec": 1 - }, - { - "id": 837, - "frec": 1 - }, - { - "id": 838, - "frec": 1 - }, - { - "id": 839, - "frec": 1 - }, - { - "id": 840, - "frec": 1 - }, - { - "id": 841, - "frec": 1 - }, - { - "id": 842, - "frec": 1 - }, - { - "id": 843, - "frec": 1 - }, - { - "id": 844, - "frec": 1 - }, - { - "id": 845, - "frec": 1 - }, - { - "id": 846, - "frec": 1 - } - ] - }, - { - "id": 16, - "texto": { - "en": "Clothing", - "pt": "Roupas" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fropa.webp?alt=media&token=52aa7f5e-5b8e-4cf2-9e2b-451f9e06e042" - }, - "relacion": [ - { - "id": 924, - "frec": 1 - }, - { - "id": 925, - "frec": 1 - }, - { - "id": 926, - "frec": 1 - }, - { - "id": 927, - "frec": 1 - }, - { - "id": 928, - "frec": 1 - }, - { - "id": 929, - "frec": 1 - }, - { - "id": 930, - "frec": 1 - }, - { - "id": 931, - "frec": 1 - }, - { - "id": 932, - "frec": 1 - }, - { - "id": 933, - "frec": 1 - }, - { - "id": 934, - "frec": 1 - }, - { - "id": 935, - "frec": 1 - }, - { - "id": 936, - "frec": 1 - }, - { - "id": 937, - "frec": 1 - }, - { - "id": 938, - "frec": 1 - }, - { - "id": 939, - "frec": 1 - }, - { - "id": 940, - "frec": 1 - }, - { - "id": 941, - "frec": 1 - }, - { - "id": 942, - "frec": 1 - }, - { - "id": 943, - "frec": 1 - }, - { - "id": 944, - "frec": 1 - }, - { - "id": 945, - "frec": 1 - }, - { - "id": 946, - "frec": 1 - }, - { - "id": 947, - "frec": 1 - }, - { - "id": 948, - "frec": 1 - }, - { - "id": 949, - "frec": 1 - }, - { - "id": 950, - "frec": 1 - }, - { - "id": 952, - "frec": 1 - }, - { - "id": 953, - "frec": 1 - }, - { - "id": 954, - "frec": 1 - }, - { - "id": 951, - "frec": 1 - }, - { - "id": 955, - "frec": 1 - }, - { - "id": 956, - "frec": 1 - }, - { - "id": 957, - "frec": 1 - }, - { - "id": 958, - "frec": 1 - }, - { - "id": 959, - "frec": 1 - }, - { - "id": 960, - "frec": 1 - }, - { - "id": 961, - "frec": 1 - }, - { - "id": 962, - "frec": 1 - }, - { - "id": 963, - "frec": 1 - }, - { - "id": 964, - "frec": 1 - }, - { - "id": 965, - "frec": 1 - }, - { - "id": 966, - "frec": 1 - }, - { - "id": 967, - "frec": 1 - }, - { - "id": 968, - "frec": 1 - }, - { - "id": 969, - "frec": 1 - }, - { - "id": 970, - "frec": 1 - }, - { - "id": 971, - "frec": 1 - }, - { - "id": 972, - "frec": 1 - }, - { - "id": 973, - "frec": 1 - }, - { - "id": 974, - "frec": 1 - } - ] - }, - { - "id": 17, - "texto": { - "en": "People", - "pt": "Pessoas" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpersonas.webp?alt=media&token=a5223e39-5426-4728-beda-8579fbc82adf" - }, - "relacion": [ - { - "id": 509, - "frec": 1 - }, - { - "id": 614, - "frec": 1 - }, - { - "id": 615, - "frec": 1 - }, - { - "id": 616, - "frec": 1 - }, - { - "id": 618, - "frec": 1 - }, - { - "id": 617, - "frec": 1 - }, - { - "id": 619, - "frec": 1 - }, - { - "id": 620, - "frec": 1 - }, - { - "id": 621, - "frec": 1 - }, - { - "id": 622, - "frec": 1 - }, - { - "id": 623, - "frec": 1 - }, - { - "id": 624, - "frec": 1 - }, - { - "id": 625, - "frec": 1 - }, - { - "id": 626, - "frec": 1 - }, - { - "id": 627, - "frec": 1 - }, - { - "id": 628, - "frec": 1 - }, - { - "id": 629, - "frec": 1 - }, - { - "id": 630, - "frec": 1 - }, - { - "id": 631, - "frec": 1 - }, - { - "id": 632, - "frec": 1 - }, - { - "id": 633, - "frec": 1 - }, - { - "id": 634, - "frec": 1 - }, - { - "id": 635, - "frec": 1 - }, - { - "id": 636, - "frec": 1 - }, - { - "id": 637, - "frec": 1 - }, - { - "id": 638, - "frec": 1 - }, - { - "id": 639, - "frec": 1 - }, - { - "id": 640, - "frec": 1 - }, - { - "id": 641, - "frec": 1 - }, - { - "id": 642, - "frec": 1 - }, - { - "id": 643, - "frec": 2 - } - ] - }, - { - "id": 18, - "texto": { - "en": "Prepositions", - "pt": "Preposições" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpreposiciones.webp?alt=media&token=73b3d814-e509-4ed4-b4f7-cde7c0b4c2a5" - }, - "relacion": [ - { - "id": 525, - "frec": 1 - }, - { - "id": 526, - "frec": 1 - }, - { - "id": 527, - "frec": 1 - }, - { - "id": 528, - "frec": 1 - }, - { - "id": 529, - "frec": 1 - }, - { - "id": 530, - "frec": 1 - }, - { - "id": 531, - "frec": 1 - }, - { - "id": 532, - "frec": 1 - }, - { - "id": 533, - "frec": 1 - }, - { - "id": 534, - "frec": 1 - }, - { - "id": 535, - "frec": 1 - }, - { - "id": 536, - "frec": 1 - }, - { - "id": 537, - "frec": 1 - }, - { - "id": 538, - "frec": 1 - }, - { - "id": 539, - "frec": 1 - }, - { - "id": 540, - "frec": 1 - }, - { - "id": 541, - "frec": 1 - }, - { - "id": 542, - "frec": 1 - } - ] - }, - { - "id": 19, - "texto": { - "en": "Pronouns", - "pt": "Pronomes" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpronombres.webp?alt=media&token=fde2895a-c02f-464c-b487-ec4826cca6bd" - }, - "relacion": [ - { - "id": 888, - "frec": 1 - }, - { - "id": 889, - "frec": 1 - }, - { - "id": 890, - "frec": 1 - }, - { - "id": 891, - "frec": 1 - }, - { - "id": 892, - "frec": 1 - }, - { - "id": 893, - "frec": 1 - }, - { - "id": 894, - "frec": 1 - }, - { - "id": 895, - "frec": 1 - }, - { - "id": 896, - "frec": 1 - }, - { - "id": 897, - "frec": 1 - }, - { - "id": 898, - "frec": 1 - }, - { - "id": 899, - "frec": 1 - }, - { - "id": 900, - "frec": 1 - }, - { - "id": 901, - "frec": 1 - }, - { - "id": 902, - "frec": 1 - }, - { - "id": 903, - "frec": 1 - }, - { - "id": 904, - "frec": 1 - }, - { - "id": 905, - "frec": 1 - }, - { - "id": 906, - "frec": 1 - }, - { - "id": 907, - "frec": 1 - }, - { - "id": 908, - "frec": 1 - }, - { - "id": 909, - "frec": 1 - }, - { - "id": 910, - "frec": 1 - }, - { - "id": 911, - "frec": 1 - }, - { - "id": 912, - "frec": 1 - }, - { - "id": 913, - "frec": 1 - }, - { - "id": 914, - "frec": 1 - }, - { - "id": 915, - "frec": 1 - }, - { - "id": 916, - "frec": 1 - }, - { - "id": 917, - "frec": 1 - }, - { - "id": 918, - "frec": 1 - }, - { - "id": 919, - "frec": 1 - }, - { - "id": 920, - "frec": 1 - }, - { - "id": 921, - "frec": 1 - }, - { - "id": 922, - "frec": 1 - }, - { - "id": 923, - "frec": 1 - } - ] - }, - { - "id": 20, - "texto": { - "en": "Feelings", - "pt": "Sentimentos" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fsentimientos.webp?alt=media&token=90954fb0-bf68-48fe-8f12-d9dfc21963da" - }, - "relacion": [ - { - "id": 119, - "frec": 1 - }, - { - "id": 120, - "frec": 1 - }, - { - "id": 121, - "frec": 1 - }, - { - "id": 124, - "frec": 1 - }, - { - "id": 125, - "frec": 1 - }, - { - "id": 128, - "frec": 1 - }, - { - "id": 133, - "frec": 1 - }, - { - "id": 137, - "frec": 1 - }, - { - "id": 151, - "frec": 1 - }, - { - "id": 161, - "frec": 1 - }, - { - "id": 164, - "frec": 1 - }, - { - "id": 167, - "frec": 1 - }, - { - "id": 171, - "frec": 1 - }, - { - "id": 190, - "frec": 1 - }, - { - "id": 194, - "frec": 1 - }, - { - "id": 212, - "frec": 1 - }, - { - "id": 217, - "frec": 1 - }, - { - "id": 237, - "frec": 1 - }, - { - "id": 272, - "frec": 1 - } - ] - }, - { - "id": 21, - "texto": { - "en": "Stores", - "pt": "Lojas" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Flibro_tiendas.webp?alt=media&token=4f4f3669-ad33-4baa-8a6e-bace7f17b45f" - }, - "relacion": [ - { - "id": 508, - "frec": 1 - }, - { - "id": 647, - "frec": 1 - }, - { - "id": 650, - "frec": 1 - }, - { - "id": 652, - "frec": 1 - }, - { - "id": 654, - "frec": 1 - }, - { - "id": 655, - "frec": 1 - }, - { - "id": 658, - "frec": 1 - }, - { - "id": 659, - "frec": 1 - }, - { - "id": 661, - "frec": 1 - }, - { - "id": 664, - "frec": 1 - }, - { - "id": 666, - "frec": 1 - }, - { - "id": 673, - "frec": 1 - }, - { - "id": 674, - "frec": 1 - }, - { - "id": 675, - "frec": 1 - }, - { - "id": 677, - "frec": 1 - }, - { - "id": 679, - "frec": 1 - }, - { - "id": 680, - "frec": 1 - }, - { - "id": 684, - "frec": 1 - }, - { - "id": 688, - "frec": 1 - }, - { - "id": 690, - "frec": 1 - }, - { - "id": 691, - "frec": 1 - }, - { - "id": 692, - "frec": 1 - }, - { - "id": 693, - "frec": 1 - }, - { - "id": 694, - "frec": 1 - }, - { - "id": 695, - "frec": 1 - }, - { - "id": 696, - "frec": 1 - }, - { - "id": 697, - "frec": 1 - }, - { - "id": 698, - "frec": 1 - }, - { - "id": 699, - "frec": 1 - }, - { - "id": 700, - "frec": 1 - } - ] - }, - { - "id": 22, - "texto": { - "en": "Time", - "pt": "Tempo" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ftiempos.webp?alt=media&token=a9cba0e5-1635-4d9c-8f1b-9db6243f7e5f" - }, - "relacion": [ - { - "id": 813, - "frec": 1 - }, - { - "id": 812, - "frec": 1 - }, - { - "id": 811, - "frec": 1 - }, - { - "id": 814, - "frec": 1 - }, - { - "id": 815, - "frec": 1 - }, - { - "id": 816, - "frec": 1 - }, - { - "id": 817, - "frec": 1 - }, - { - "id": 818, - "frec": 1 - }, - { - "id": 810, - "frec": 1 - } - ] - }, - { - "id": 23, - "texto": { - "en": "Transport", - "pt": "Transporte" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ftransportes.webp?alt=media&token=94bd980f-eeed-4310-8fe7-09148e19612f" - }, - "relacion": [ - { - "id": 606, - "frec": 1 - }, - { - "id": 607, - "frec": 1 - }, - { - "id": 608, - "frec": 1 - }, - { - "id": 609, - "frec": 1 - }, - { - "id": 610, - "frec": 1 - }, - { - "id": 611, - "frec": 1 - }, - { - "id": 612, - "frec": 1 - }, - { - "id": 613, - "frec": 1 - } - ] - }, - { - "id": 24, - "texto": { - "en": "ALL", - "pt": "TODOS" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ftodos.webp?alt=media&token=694aae8b-22c8-4274-b9f1-b3bbdd15d061" - }, - "relacion": [ - { - "id": 1, - "frec": 1 - }, - { - "id": 2, - "frec": 1 - }, - { - "id": 3, - "frec": 1 - }, - { - "id": 4, - "frec": 1 - }, - { - "id": 5, - "frec": 1 - }, - { - "id": 6, - "frec": 1 - }, - { - "id": 7, - "frec": 1 - }, - { - "id": 8, - "frec": 1 - }, - { - "id": 9, - "frec": 1 - }, - { - "id": 10, - "frec": 1 - }, - { - "id": 11, - "frec": 1 - }, - { - "id": 12, - "frec": 1 - }, - { - "id": 13, - "frec": 1 - }, - { - "id": 14, - "frec": 1 - }, - { - "id": 15, - "frec": 1 - }, - { - "id": 16, - "frec": 1 - }, - { - "id": 17, - "frec": 1 - }, - { - "id": 18, - "frec": 1 - }, - { - "id": 19, - "frec": 1 - }, - { - "id": 20, - "frec": 1 - }, - { - "id": 21, - "frec": 1 - }, - { - "id": 22, - "frec": 1 - }, - { - "id": 23, - "frec": 1 - }, - { - "id": 24, - "frec": 1 - }, - { - "id": 25, - "frec": 1 - }, - { - "id": 26, - "frec": 1 - }, - { - "id": 27, - "frec": 1 - }, - { - "id": 28, - "frec": 1 - }, - { - "id": 29, - "frec": 1 - }, - { - "id": 30, - "frec": 1 - }, - { - "id": 31, - "frec": 1 - }, - { - "id": 32, - "frec": 1 - }, - { - "id": 33, - "frec": 1 - }, - { - "id": 34, - "frec": 1 - }, - { - "id": 35, - "frec": 1 - }, - { - "id": 36, - "frec": 1 - }, - { - "id": 37, - "frec": 1 - }, - { - "id": 38, - "frec": 1 - }, - { - "id": 39, - "frec": 1 - }, - { - "id": 40, - "frec": 1 - }, - { - "id": 41, - "frec": 1 - }, - { - "id": 42, - "frec": 1 - }, - { - "id": 43, - "frec": 1 - }, - { - "id": 44, - "frec": 1 - }, - { - "id": 45, - "frec": 1 - }, - { - "id": 46, - "frec": 1 - }, - { - "id": 47, - "frec": 1 - }, - { - "id": 48, - "frec": 1 - }, - { - "id": 49, - "frec": 2 - }, - { - "id": 50, - "frec": 1 - }, - { - "id": 51, - "frec": 1 - }, - { - "id": 52, - "frec": 1 - }, - { - "id": 53, - "frec": 1 - }, - { - "id": 54, - "frec": 1 - }, - { - "id": 55, - "frec": 1 - }, - { - "id": 56, - "frec": 1 - }, - { - "id": 57, - "frec": 1 - }, - { - "id": 58, - "frec": 1 - }, - { - "id": 59, - "frec": 1 - }, - { - "id": 60, - "frec": 1 - }, - { - "id": 61, - "frec": 1 - }, - { - "id": 62, - "frec": 1 - }, - { - "id": 63, - "frec": 1 - }, - { - "id": 64, - "frec": 1 - }, - { - "id": 65, - "frec": 1 - }, - { - "id": 66, - "frec": 1 - }, - { - "id": 67, - "frec": 1 - }, - { - "id": 68, - "frec": 1 - }, - { - "id": 69, - "frec": 1 - }, - { - "id": 70, - "frec": 1 - }, - { - "id": 71, - "frec": 1 - }, - { - "id": 72, - "frec": 1 - }, - { - "id": 73, - "frec": 1 - }, - { - "id": 74, - "frec": 1 - }, - { - "id": 75, - "frec": 1 - }, - { - "id": 76, - "frec": 1 - }, - { - "id": 77, - "frec": 1 - }, - { - "id": 78, - "frec": 1 - }, - { - "id": 79, - "frec": 1 - }, - { - "id": 80, - "frec": 1 - }, - { - "id": 81, - "frec": 1 - }, - { - "id": 82, - "frec": 1 - }, - { - "id": 83, - "frec": 1 - }, - { - "id": 84, - "frec": 1 - }, - { - "id": 85, - "frec": 1 - }, - { - "id": 86, - "frec": 1 - }, - { - "id": 87, - "frec": 1 - }, - { - "id": 88, - "frec": 1 - }, - { - "id": 89, - "frec": 1 - }, - { - "id": 90, - "frec": 1 - }, - { - "id": 91, - "frec": 1 - }, - { - "id": 92, - "frec": 1 - }, - { - "id": 93, - "frec": 1 - }, - { - "id": 94, - "frec": 1 - }, - { - "id": 95, - "frec": 1 - }, - { - "id": 96, - "frec": 1 - }, - { - "id": 97, - "frec": 1 - }, - { - "id": 98, - "frec": 1 - }, - { - "id": 99, - "frec": 1 - }, - { - "id": 100, - "frec": 1 - }, - { - "id": 101, - "frec": 1 - }, - { - "id": 102, - "frec": 1 - }, - { - "id": 103, - "frec": 1 - }, - { - "id": 104, - "frec": 1 - }, - { - "id": 105, - "frec": 1 - }, - { - "id": 106, - "frec": 1 - }, - { - "id": 107, - "frec": 1 - }, - { - "id": 108, - "frec": 1 - }, - { - "id": 109, - "frec": 1 - }, - { - "id": 110, - "frec": 1 - }, - { - "id": 111, - "frec": 1 - }, - { - "id": 112, - "frec": 1 - }, - { - "id": 113, - "frec": 1 - }, - { - "id": 114, - "frec": 1 - }, - { - "id": 115, - "frec": 1 - }, - { - "id": 116, - "frec": 1 - }, - { - "id": 117, - "frec": 1 - }, - { - "id": 118, - "frec": 1 - }, - { - "id": 119, - "frec": 1 - }, - { - "id": 120, - "frec": 1 - }, - { - "id": 121, - "frec": 1 - }, - { - "id": 122, - "frec": 1 - }, - { - "id": 123, - "frec": 1 - }, - { - "id": 124, - "frec": 1 - }, - { - "id": 125, - "frec": 1 - }, - { - "id": 126, - "frec": 1 - }, - { - "id": 127, - "frec": 1 - }, - { - "id": 128, - "frec": 1 - }, - { - "id": 129, - "frec": 1 - }, - { - "id": 130, - "frec": 1 - }, - { - "id": 131, - "frec": 1 - }, - { - "id": 132, - "frec": 1 - }, - { - "id": 133, - "frec": 1 - }, - { - "id": 134, - "frec": 1 - }, - { - "id": 135, - "frec": 1 - }, - { - "id": 136, - "frec": 1 - }, - { - "id": 137, - "frec": 1 - }, - { - "id": 138, - "frec": 1 - }, - { - "id": 139, - "frec": 1 - }, - { - "id": 140, - "frec": 1 - }, - { - "id": 141, - "frec": 1 - }, - { - "id": 142, - "frec": 1 - }, - { - "id": 143, - "frec": 1 - }, - { - "id": 144, - "frec": 1 - }, - { - "id": 145, - "frec": 1 - }, - { - "id": 146, - "frec": 1 - }, - { - "id": 147, - "frec": 1 - }, - { - "id": 148, - "frec": 1 - }, - { - "id": 149, - "frec": 1 - }, - { - "id": 150, - "frec": 1 - }, - { - "id": 151, - "frec": 1 - }, - { - "id": 152, - "frec": 1 - }, - { - "id": 153, - "frec": 1 - }, - { - "id": 154, - "frec": 1 - }, - { - "id": 155, - "frec": 1 - }, - { - "id": 156, - "frec": 1 - }, - { - "id": 157, - "frec": 1 - }, - { - "id": 158, - "frec": 1 - }, - { - "id": 159, - "frec": 1 - }, - { - "id": 160, - "frec": 1 - }, - { - "id": 161, - "frec": 1 - }, - { - "id": 162, - "frec": 1 - }, - { - "id": 163, - "frec": 1 - }, - { - "id": 164, - "frec": 1 - }, - { - "id": 165, - "frec": 1 - }, - { - "id": 166, - "frec": 1 - }, - { - "id": 167, - "frec": 1 - }, - { - "id": 168, - "frec": 1 - }, - { - "id": 169, - "frec": 1 - }, - { - "id": 170, - "frec": 1 - }, - { - "id": 171, - "frec": 1 - }, - { - "id": 172, - "frec": 1 - }, - { - "id": 173, - "frec": 1 - }, - { - "id": 174, - "frec": 1 - }, - { - "id": 175, - "frec": 1 - }, - { - "id": 176, - "frec": 1 - }, - { - "id": 177, - "frec": 1 - }, - { - "id": 178, - "frec": 1 - }, - { - "id": 179, - "frec": 1 - }, - { - "id": 180, - "frec": 1 - }, - { - "id": 181, - "frec": 1 - }, - { - "id": 182, - "frec": 1 - }, - { - "id": 183, - "frec": 1 - }, - { - "id": 184, - "frec": 1 - }, - { - "id": 185, - "frec": 1 - }, - { - "id": 186, - "frec": 1 - }, - { - "id": 187, - "frec": 1 - }, - { - "id": 188, - "frec": 1 - }, - { - "id": 189, - "frec": 1 - }, - { - "id": 190, - "frec": 1 - }, - { - "id": 191, - "frec": 1 - }, - { - "id": 192, - "frec": 1 - }, - { - "id": 193, - "frec": 1 - }, - { - "id": 194, - "frec": 1 - }, - { - "id": 195, - "frec": 1 - }, - { - "id": 196, - "frec": 1 - }, - { - "id": 197, - "frec": 1 - }, - { - "id": 198, - "frec": 1 - }, - { - "id": 199, - "frec": 1 - }, - { - "id": 200, - "frec": 1 - }, - { - "id": 201, - "frec": 1 - }, - { - "id": 202, - "frec": 1 - }, - { - "id": 203, - "frec": 1 - }, - { - "id": 204, - "frec": 1 - }, - { - "id": 205, - "frec": 1 - }, - { - "id": 206, - "frec": 1 - }, - { - "id": 207, - "frec": 1 - }, - { - "id": 208, - "frec": 1 - }, - { - "id": 209, - "frec": 1 - }, - { - "id": 210, - "frec": 1 - }, - { - "id": 211, - "frec": 1 - }, - { - "id": 212, - "frec": 1 - }, - { - "id": 213, - "frec": 1 - }, - { - "id": 214, - "frec": 1 - }, - { - "id": 215, - "frec": 1 - }, - { - "id": 216, - "frec": 1 - }, - { - "id": 217, - "frec": 1 - }, - { - "id": 218, - "frec": 1 - }, - { - "id": 219, - "frec": 1 - }, - { - "id": 220, - "frec": 1 - }, - { - "id": 221, - "frec": 1 - }, - { - "id": 222, - "frec": 1 - }, - { - "id": 223, - "frec": 1 - }, - { - "id": 224, - "frec": 1 - }, - { - "id": 225, - "frec": 1 - }, - { - "id": 226, - "frec": 1 - }, - { - "id": 227, - "frec": 1 - }, - { - "id": 228, - "frec": 1 - }, - { - "id": 229, - "frec": 1 - }, - { - "id": 230, - "frec": 1 - }, - { - "id": 231, - "frec": 1 - }, - { - "id": 232, - "frec": 1 - }, - { - "id": 233, - "frec": 1 - }, - { - "id": 234, - "frec": 1 - }, - { - "id": 235, - "frec": 1 - }, - { - "id": 236, - "frec": 1 - }, - { - "id": 237, - "frec": 1 - }, - { - "id": 238, - "frec": 1 - }, - { - "id": 239, - "frec": 1 - }, - { - "id": 240, - "frec": 1 - }, - { - "id": 241, - "frec": 1 - }, - { - "id": 242, - "frec": 1 - }, - { - "id": 243, - "frec": 1 - }, - { - "id": 244, - "frec": 1 - }, - { - "id": 245, - "frec": 1 - }, - { - "id": 246, - "frec": 1 - }, - { - "id": 247, - "frec": 1 - }, - { - "id": 248, - "frec": 1 - }, - { - "id": 249, - "frec": 1 - }, - { - "id": 250, - "frec": 1 - }, - { - "id": 251, - "frec": 1 - }, - { - "id": 252, - "frec": 1 - }, - { - "id": 253, - "frec": 1 - }, - { - "id": 254, - "frec": 1 - }, - { - "id": 255, - "frec": 1 - }, - { - "id": 256, - "frec": 1 - }, - { - "id": 257, - "frec": 1 - }, - { - "id": 258, - "frec": 1 - }, - { - "id": 259, - "frec": 1 - }, - { - "id": 260, - "frec": 1 - }, - { - "id": 261, - "frec": 1 - }, - { - "id": 262, - "frec": 1 - }, - { - "id": 263, - "frec": 1 - }, - { - "id": 264, - "frec": 1 - }, - { - "id": 265, - "frec": 1 - }, - { - "id": 266, - "frec": 1 - }, - { - "id": 267, - "frec": 1 - }, - { - "id": 268, - "frec": 1 - }, - { - "id": 269, - "frec": 1 - }, - { - "id": 270, - "frec": 1 - }, - { - "id": 271, - "frec": 1 - }, - { - "id": 272, - "frec": 1 - }, - { - "id": 273, - "frec": 1 - }, - { - "id": 274, - "frec": 1 - }, - { - "id": 275, - "frec": 1 - }, - { - "id": 276, - "frec": 1 - }, - { - "id": 277, - "frec": 1 - }, - { - "id": 278, - "frec": 1 - }, - { - "id": 279, - "frec": 1 - }, - { - "id": 280, - "frec": 1 - }, - { - "id": 281, - "frec": 1 - }, - { - "id": 282, - "frec": 1 - }, - { - "id": 283, - "frec": 1 - }, - { - "id": 284, - "frec": 1 - }, - { - "id": 285, - "frec": 1 - }, - { - "id": 286, - "frec": 1 - }, - { - "id": 287, - "frec": 1 - }, - { - "id": 288, - "frec": 1 - }, - { - "id": 289, - "frec": 1 - }, - { - "id": 290, - "frec": 1 - }, - { - "id": 291, - "frec": 1 - }, - { - "id": 292, - "frec": 1 - }, - { - "id": 293, - "frec": 1 - }, - { - "id": 294, - "frec": 1 - }, - { - "id": 295, - "frec": 1 - }, - { - "id": 296, - "frec": 1 - }, - { - "id": 297, - "frec": 1 - }, - { - "id": 298, - "frec": 1 - }, - { - "id": 299, - "frec": 1 - }, - { - "id": 300, - "frec": 1 - }, - { - "id": 301, - "frec": 1 - }, - { - "id": 302, - "frec": 1 - }, - { - "id": 303, - "frec": 1 - }, - { - "id": 304, - "frec": 1 - }, - { - "id": 305, - "frec": 1 - }, - { - "id": 306, - "frec": 1 - }, - { - "id": 307, - "frec": 1 - }, - { - "id": 308, - "frec": 1 - }, - { - "id": 309, - "frec": 1 - }, - { - "id": 310, - "frec": 1 - }, - { - "id": 311, - "frec": 1 - }, - { - "id": 312, - "frec": 1 - }, - { - "id": 313, - "frec": 1 - }, - { - "id": 314, - "frec": 1 - }, - { - "id": 315, - "frec": 1 - }, - { - "id": 316, - "frec": 1 - }, - { - "id": 317, - "frec": 1 - }, - { - "id": 318, - "frec": 1 - }, - { - "id": 319, - "frec": 1 - }, - { - "id": 320, - "frec": 1 - }, - { - "id": 321, - "frec": 1 - }, - { - "id": 322, - "frec": 1 - }, - { - "id": 323, - "frec": 1 - }, - { - "id": 324, - "frec": 1 - }, - { - "id": 325, - "frec": 1 - }, - { - "id": 326, - "frec": 1 - }, - { - "id": 327, - "frec": 1 - }, - { - "id": 328, - "frec": 1 - }, - { - "id": 329, - "frec": 1 - }, - { - "id": 330, - "frec": 1 - }, - { - "id": 331, - "frec": 1 - }, - { - "id": 332, - "frec": 1 - }, - { - "id": 333, - "frec": 1 - }, - { - "id": 334, - "frec": 1 - }, - { - "id": 335, - "frec": 1 - }, - { - "id": 336, - "frec": 1 - }, - { - "id": 337, - "frec": 1 - }, - { - "id": 338, - "frec": 1 - }, - { - "id": 339, - "frec": 1 - }, - { - "id": 340, - "frec": 1 - }, - { - "id": 341, - "frec": 1 - }, - { - "id": 342, - "frec": 1 - }, - { - "id": 343, - "frec": 1 - }, - { - "id": 344, - "frec": 1 - }, - { - "id": 345, - "frec": 1 - }, - { - "id": 346, - "frec": 1 - }, - { - "id": 347, - "frec": 1 - }, - { - "id": 348, - "frec": 1 - }, - { - "id": 349, - "frec": 1 - }, - { - "id": 350, - "frec": 1 - }, - { - "id": 351, - "frec": 1 - }, - { - "id": 352, - "frec": 1 - }, - { - "id": 353, - "frec": 1 - }, - { - "id": 354, - "frec": 1 - }, - { - "id": 355, - "frec": 1 - }, - { - "id": 356, - "frec": 1 - }, - { - "id": 357, - "frec": 1 - }, - { - "id": 358, - "frec": 1 - }, - { - "id": 359, - "frec": 1 - }, - { - "id": 360, - "frec": 1 - }, - { - "id": 361, - "frec": 1 - }, - { - "id": 362, - "frec": 1 - }, - { - "id": 363, - "frec": 1 - }, - { - "id": 364, - "frec": 1 - }, - { - "id": 365, - "frec": 1 - }, - { - "id": 366, - "frec": 1 - }, - { - "id": 367, - "frec": 1 - }, - { - "id": 368, - "frec": 1 - }, - { - "id": 369, - "frec": 1 - }, - { - "id": 370, - "frec": 1 - }, - { - "id": 371, - "frec": 1 - }, - { - "id": 372, - "frec": 1 - }, - { - "id": 373, - "frec": 1 - }, - { - "id": 374, - "frec": 1 - }, - { - "id": 375, - "frec": 1 - }, - { - "id": 376, - "frec": 1 - }, - { - "id": 377, - "frec": 10 - }, - { - "id": 378, - "frec": 3 - }, - { - "id": 379, - "frec": 7 - }, - { - "id": 380, - "frec": 1 - }, - { - "id": 381, - "frec": 1 - }, - { - "id": 382, - "frec": 1 - }, - { - "id": 383, - "frec": 1 - }, - { - "id": 384, - "frec": 1 - }, - { - "id": 385, - "frec": 1 - }, - { - "id": 386, - "frec": 1 - }, - { - "id": 387, - "frec": 1 - }, - { - "id": 388, - "frec": 1 - }, - { - "id": 389, - "frec": 1 - }, - { - "id": 390, - "frec": 1 - }, - { - "id": 391, - "frec": 1 - }, - { - "id": 392, - "frec": 1 - }, - { - "id": 393, - "frec": 1 - }, - { - "id": 394, - "frec": 1 - }, - { - "id": 395, - "frec": 1 - }, - { - "id": 396, - "frec": 1 - }, - { - "id": 397, - "frec": 1 - }, - { - "id": 398, - "frec": 1 - }, - { - "id": 399, - "frec": 1 - }, - { - "id": 400, - "frec": 1 - }, - { - "id": 401, - "frec": 1 - }, - { - "id": 402, - "frec": 1 - }, - { - "id": 403, - "frec": 1 - }, - { - "id": 404, - "frec": 1 - }, - { - "id": 405, - "frec": 1 - }, - { - "id": 406, - "frec": 1 - }, - { - "id": 407, - "frec": 1 - }, - { - "id": 408, - "frec": 1 - }, - { - "id": 409, - "frec": 1 - }, - { - "id": 410, - "frec": 1 - }, - { - "id": 411, - "frec": 1 - }, - { - "id": 412, - "frec": 1 - }, - { - "id": 413, - "frec": 1 - }, - { - "id": 414, - "frec": 1 - }, - { - "id": 415, - "frec": 1 - }, - { - "id": 416, - "frec": 1 - }, - { - "id": 417, - "frec": 1 - }, - { - "id": 418, - "frec": 1 - }, - { - "id": 419, - "frec": 1 - }, - { - "id": 420, - "frec": 1 - }, - { - "id": 421, - "frec": 1 - }, - { - "id": 422, - "frec": 1 - }, - { - "id": 423, - "frec": 1 - }, - { - "id": 424, - "frec": 1 - }, - { - "id": 425, - "frec": 1 - }, - { - "id": 426, - "frec": 1 - }, - { - "id": 427, - "frec": 1 - }, - { - "id": 428, - "frec": 1 - }, - { - "id": 429, - "frec": 1 - }, - { - "id": 430, - "frec": 1 - }, - { - "id": 431, - "frec": 1 - }, - { - "id": 432, - "frec": 1 - }, - { - "id": 433, - "frec": 1 - }, - { - "id": 434, - "frec": 1 - }, - { - "id": 435, - "frec": 1 - }, - { - "id": 436, - "frec": 1 - }, - { - "id": 437, - "frec": 1 - }, - { - "id": 438, - "frec": 1 - }, - { - "id": 439, - "frec": 1 - }, - { - "id": 440, - "frec": 1 - }, - { - "id": 441, - "frec": 1 - }, - { - "id": 442, - "frec": 1 - }, - { - "id": 443, - "frec": 1 - }, - { - "id": 444, - "frec": 1 - }, - { - "id": 445, - "frec": 1 - }, - { - "id": 446, - "frec": 1 - }, - { - "id": 447, - "frec": 1 - }, - { - "id": 448, - "frec": 1 - }, - { - "id": 449, - "frec": 1 - }, - { - "id": 450, - "frec": 1 - }, - { - "id": 451, - "frec": 1 - }, - { - "id": 452, - "frec": 1 - }, - { - "id": 453, - "frec": 1 - }, - { - "id": 454, - "frec": 1 - }, - { - "id": 455, - "frec": 1 - }, - { - "id": 456, - "frec": 1 - }, - { - "id": 457, - "frec": 1 - }, - { - "id": 458, - "frec": 1 - }, - { - "id": 459, - "frec": 1 - }, - { - "id": 460, - "frec": 1 - }, - { - "id": 461, - "frec": 1 - }, - { - "id": 462, - "frec": 1 - }, - { - "id": 463, - "frec": 1 - }, - { - "id": 464, - "frec": 1 - }, - { - "id": 465, - "frec": 1 - }, - { - "id": 466, - "frec": 1 - }, - { - "id": 467, - "frec": 1 - }, - { - "id": 468, - "frec": 1 - }, - { - "id": 469, - "frec": 1 - }, - { - "id": 470, - "frec": 1 - }, - { - "id": 471, - "frec": 1 - }, - { - "id": 472, - "frec": 1 - }, - { - "id": 473, - "frec": 1 - }, - { - "id": 474, - "frec": 1 - }, - { - "id": 475, - "frec": 1 - }, - { - "id": 476, - "frec": 1 - }, - { - "id": 477, - "frec": 1 - }, - { - "id": 478, - "frec": 1 - }, - { - "id": 479, - "frec": 1 - }, - { - "id": 480, - "frec": 1 - }, - { - "id": 481, - "frec": 1 - }, - { - "id": 482, - "frec": 1 - }, - { - "id": 483, - "frec": 1 - }, - { - "id": 484, - "frec": 1 - }, - { - "id": 485, - "frec": 1 - }, - { - "id": 486, - "frec": 1 - }, - { - "id": 487, - "frec": 1 - }, - { - "id": 488, - "frec": 1 - }, - { - "id": 489, - "frec": 1 - }, - { - "id": 490, - "frec": 1 - }, - { - "id": 491, - "frec": 1 - }, - { - "id": 492, - "frec": 1 - }, - { - "id": 493, - "frec": 1 - }, - { - "id": 494, - "frec": 1 - }, - { - "id": 495, - "frec": 1 - }, - { - "id": 496, - "frec": 1 - }, - { - "id": 497, - "frec": 1 - }, - { - "id": 498, - "frec": 1 - }, - { - "id": 499, - "frec": 1 - }, - { - "id": 500, - "frec": 1 - }, - { - "id": 501, - "frec": 1 - }, - { - "id": 502, - "frec": 1 - }, - { - "id": 503, - "frec": 1 - }, - { - "id": 504, - "frec": 1 - }, - { - "id": 505, - "frec": 1 - }, - { - "id": 506, - "frec": 1 - }, - { - "id": 507, - "frec": 1 - }, - { - "id": 508, - "frec": 1 - }, - { - "id": 509, - "frec": 1 - }, - { - "id": 510, - "frec": 1 - }, - { - "id": 511, - "frec": 1 - }, - { - "id": 512, - "frec": 1 - }, - { - "id": 513, - "frec": 1 - }, - { - "id": 514, - "frec": 1 - }, - { - "id": 515, - "frec": 1 - }, - { - "id": 516, - "frec": 1 - }, - { - "id": 517, - "frec": 1 - }, - { - "id": 518, - "frec": 1 - }, - { - "id": 519, - "frec": 1 - }, - { - "id": 520, - "frec": 1 - }, - { - "id": 521, - "frec": 1 - }, - { - "id": 522, - "frec": 1 - }, - { - "id": 523, - "frec": 1 - }, - { - "id": 524, - "frec": 1 - }, - { - "id": 525, - "frec": 1 - }, - { - "id": 526, - "frec": 1 - }, - { - "id": 527, - "frec": 1 - }, - { - "id": 528, - "frec": 1 - }, - { - "id": 529, - "frec": 1 - }, - { - "id": 530, - "frec": 1 - }, - { - "id": 531, - "frec": 1 - }, - { - "id": 532, - "frec": 1 - }, - { - "id": 533, - "frec": 1 - }, - { - "id": 534, - "frec": 1 - }, - { - "id": 535, - "frec": 1 - }, - { - "id": 536, - "frec": 1 - }, - { - "id": 537, - "frec": 1 - }, - { - "id": 538, - "frec": 1 - }, - { - "id": 539, - "frec": 1 - }, - { - "id": 540, - "frec": 1 - }, - { - "id": 541, - "frec": 1 - }, - { - "id": 542, - "frec": 1 - }, - { - "id": 543, - "frec": 1 - }, - { - "id": 544, - "frec": 1 - }, - { - "id": 545, - "frec": 1 - }, - { - "id": 546, - "frec": 1 - }, - { - "id": 547, - "frec": 1 - }, - { - "id": 548, - "frec": 1 - }, - { - "id": 549, - "frec": 1 - }, - { - "id": 550, - "frec": 1 - }, - { - "id": 551, - "frec": 1 - }, - { - "id": 552, - "frec": 1 - }, - { - "id": 553, - "frec": 1 - }, - { - "id": 554, - "frec": 1 - }, - { - "id": 555, - "frec": 1 - }, - { - "id": 556, - "frec": 1 - }, - { - "id": 557, - "frec": 1 - }, - { - "id": 558, - "frec": 1 - }, - { - "id": 559, - "frec": 1 - }, - { - "id": 560, - "frec": 1 - }, - { - "id": 561, - "frec": 1 - }, - { - "id": 562, - "frec": 1 - }, - { - "id": 563, - "frec": 1 - }, - { - "id": 564, - "frec": 1 - }, - { - "id": 565, - "frec": 1 - }, - { - "id": 566, - "frec": 1 - }, - { - "id": 567, - "frec": 1 - }, - { - "id": 568, - "frec": 1 - }, - { - "id": 569, - "frec": 1 - }, - { - "id": 570, - "frec": 1 - }, - { - "id": 571, - "frec": 1 - }, - { - "id": 572, - "frec": 1 - }, - { - "id": 573, - "frec": 1 - }, - { - "id": 574, - "frec": 1 - }, - { - "id": 575, - "frec": 1 - }, - { - "id": 576, - "frec": 1 - }, - { - "id": 577, - "frec": 1 - }, - { - "id": 578, - "frec": 1 - }, - { - "id": 579, - "frec": 1 - }, - { - "id": 580, - "frec": 1 - }, - { - "id": 581, - "frec": 1 - }, - { - "id": 582, - "frec": 1 - }, - { - "id": 583, - "frec": 1 - }, - { - "id": 584, - "frec": 1 - }, - { - "id": 585, - "frec": 1 - }, - { - "id": 586, - "frec": 1 - }, - { - "id": 587, - "frec": 1 - }, - { - "id": 588, - "frec": 1 - }, - { - "id": 589, - "frec": 1 - }, - { - "id": 590, - "frec": 1 - }, - { - "id": 591, - "frec": 1 - }, - { - "id": 592, - "frec": 1 - }, - { - "id": 593, - "frec": 1 - }, - { - "id": 594, - "frec": 1 - }, - { - "id": 595, - "frec": 1 - }, - { - "id": 596, - "frec": 1 - }, - { - "id": 597, - "frec": 1 - }, - { - "id": 598, - "frec": 1 - }, - { - "id": 599, - "frec": 1 - }, - { - "id": 600, - "frec": 1 - }, - { - "id": 601, - "frec": 1 - }, - { - "id": 602, - "frec": 1 - }, - { - "id": 603, - "frec": 1 - }, - { - "id": 604, - "frec": 1 - }, - { - "id": 605, - "frec": 1 - }, - { - "id": 606, - "frec": 1 - }, - { - "id": 607, - "frec": 1 - }, - { - "id": 608, - "frec": 1 - }, - { - "id": 609, - "frec": 1 - }, - { - "id": 610, - "frec": 1 - }, - { - "id": 611, - "frec": 1 - }, - { - "id": 612, - "frec": 1 - }, - { - "id": 613, - "frec": 1 - }, - { - "id": 614, - "frec": 1 - }, - { - "id": 615, - "frec": 1 - }, - { - "id": 616, - "frec": 1 - }, - { - "id": 617, - "frec": 1 - }, - { - "id": 618, - "frec": 1 - }, - { - "id": 619, - "frec": 1 - }, - { - "id": 620, - "frec": 1 - }, - { - "id": 621, - "frec": 1 - }, - { - "id": 622, - "frec": 1 - }, - { - "id": 623, - "frec": 1 - }, - { - "id": 624, - "frec": 1 - }, - { - "id": 625, - "frec": 1 - }, - { - "id": 626, - "frec": 1 - }, - { - "id": 627, - "frec": 1 - }, - { - "id": 628, - "frec": 1 - }, - { - "id": 629, - "frec": 1 - }, - { - "id": 630, - "frec": 1 - }, - { - "id": 631, - "frec": 1 - }, - { - "id": 632, - "frec": 1 - }, - { - "id": 633, - "frec": 1 - }, - { - "id": 634, - "frec": 1 - }, - { - "id": 635, - "frec": 1 - }, - { - "id": 636, - "frec": 1 - }, - { - "id": 637, - "frec": 1 - }, - { - "id": 638, - "frec": 1 - }, - { - "id": 639, - "frec": 1 - }, - { - "id": 640, - "frec": 1 - }, - { - "id": 641, - "frec": 1 - }, - { - "id": 642, - "frec": 1 - }, - { - "id": 643, - "frec": 2 - }, - { - "id": 644, - "frec": 1 - }, - { - "id": 645, - "frec": 1 - }, - { - "id": 646, - "frec": 1 - }, - { - "id": 647, - "frec": 1 - }, - { - "id": 648, - "frec": 1 - }, - { - "id": 649, - "frec": 1 - }, - { - "id": 650, - "frec": 1 - }, - { - "id": 651, - "frec": 1 - }, - { - "id": 652, - "frec": 1 - }, - { - "id": 653, - "frec": 1 - }, - { - "id": 654, - "frec": 1 - }, - { - "id": 655, - "frec": 1 - }, - { - "id": 656, - "frec": 1 - }, - { - "id": 657, - "frec": 1 - }, - { - "id": 658, - "frec": 1 - }, - { - "id": 659, - "frec": 1 - }, - { - "id": 660, - "frec": 1 - }, - { - "id": 661, - "frec": 1 - }, - { - "id": 662, - "frec": 1 - }, - { - "id": 663, - "frec": 1 - }, - { - "id": 664, - "frec": 1 - }, - { - "id": 665, - "frec": 1 - }, - { - "id": 666, - "frec": 1 - }, - { - "id": 667, - "frec": 1 - }, - { - "id": 668, - "frec": 1 - }, - { - "id": 669, - "frec": 1 - }, - { - "id": 670, - "frec": 1 - }, - { - "id": 671, - "frec": 1 - }, - { - "id": 672, - "frec": 1 - }, - { - "id": 673, - "frec": 1 - }, - { - "id": 674, - "frec": 1 - }, - { - "id": 675, - "frec": 1 - }, - { - "id": 676, - "frec": 1 - }, - { - "id": 677, - "frec": 1 - }, - { - "id": 678, - "frec": 1 - }, - { - "id": 679, - "frec": 1 - }, - { - "id": 680, - "frec": 1 - }, - { - "id": 681, - "frec": 1 - }, - { - "id": 682, - "frec": 1 - }, - { - "id": 683, - "frec": 1 - }, - { - "id": 684, - "frec": 1 - }, - { - "id": 685, - "frec": 1 - }, - { - "id": 686, - "frec": 1 - }, - { - "id": 687, - "frec": 1 - }, - { - "id": 688, - "frec": 1 - }, - { - "id": 689, - "frec": 1 - }, - { - "id": 690, - "frec": 1 - }, - { - "id": 691, - "frec": 1 - }, - { - "id": 692, - "frec": 1 - }, - { - "id": 693, - "frec": 1 - }, - { - "id": 694, - "frec": 1 - }, - { - "id": 695, - "frec": 1 - }, - { - "id": 696, - "frec": 1 - }, - { - "id": 697, - "frec": 1 - }, - { - "id": 698, - "frec": 1 - }, - { - "id": 699, - "frec": 1 - }, - { - "id": 700, - "frec": 1 - }, - { - "id": 701, - "frec": 1 - }, - { - "id": 702, - "frec": 1 - }, - { - "id": 703, - "frec": 1 - }, - { - "id": 704, - "frec": 1 - }, - { - "id": 705, - "frec": 1 - }, - { - "id": 706, - "frec": 1 - }, - { - "id": 707, - "frec": 1 - }, - { - "id": 708, - "frec": 1 - }, - { - "id": 709, - "frec": 1 - }, - { - "id": 710, - "frec": 1 - }, - { - "id": 711, - "frec": 1 - }, - { - "id": 712, - "frec": 1 - }, - { - "id": 713, - "frec": 1 - }, - { - "id": 714, - "frec": 1 - }, - { - "id": 715, - "frec": 1 - }, - { - "id": 716, - "frec": 1 - }, - { - "id": 717, - "frec": 1 - }, - { - "id": 718, - "frec": 1 - }, - { - "id": 719, - "frec": 1 - }, - { - "id": 720, - "frec": 1 - }, - { - "id": 721, - "frec": 1 - }, - { - "id": 722, - "frec": 1 - }, - { - "id": 723, - "frec": 1 - }, - { - "id": 724, - "frec": 1 - }, - { - "id": 725, - "frec": 1 - }, - { - "id": 726, - "frec": 1 - }, - { - "id": 727, - "frec": 1 - }, - { - "id": 728, - "frec": 1 - }, - { - "id": 729, - "frec": 1 - }, - { - "id": 730, - "frec": 1 - }, - { - "id": 731, - "frec": 1 - }, - { - "id": 732, - "frec": 1 - }, - { - "id": 733, - "frec": 1 - }, - { - "id": 734, - "frec": 1 - }, - { - "id": 735, - "frec": 1 - }, - { - "id": 736, - "frec": 1 - }, - { - "id": 737, - "frec": 1 - }, - { - "id": 738, - "frec": 1 - }, - { - "id": 739, - "frec": 1 - }, - { - "id": 740, - "frec": 1 - }, - { - "id": 741, - "frec": 1 - }, - { - "id": 742, - "frec": 1 - }, - { - "id": 743, - "frec": 1 - }, - { - "id": 744, - "frec": 1 - }, - { - "id": 745, - "frec": 1 - }, - { - "id": 746, - "frec": 1 - }, - { - "id": 747, - "frec": 1 - }, - { - "id": 748, - "frec": 1 - }, - { - "id": 749, - "frec": 1 - }, - { - "id": 750, - "frec": 1 - }, - { - "id": 751, - "frec": 1 - }, - { - "id": 752, - "frec": 1 - }, - { - "id": 753, - "frec": 1 - }, - { - "id": 754, - "frec": 1 - }, - { - "id": 755, - "frec": 1 - }, - { - "id": 756, - "frec": 1 - }, - { - "id": 757, - "frec": 1 - }, - { - "id": 758, - "frec": 1 - }, - { - "id": 759, - "frec": 1 - }, - { - "id": 760, - "frec": 1 - }, - { - "id": 761, - "frec": 1 - }, - { - "id": 762, - "frec": 1 - }, - { - "id": 763, - "frec": 1 - }, - { - "id": 764, - "frec": 1 - }, - { - "id": 765, - "frec": 1 - }, - { - "id": 766, - "frec": 1 - }, - { - "id": 767, - "frec": 1 - }, - { - "id": 768, - "frec": 1 - }, - { - "id": 769, - "frec": 1 - }, - { - "id": 770, - "frec": 1 - }, - { - "id": 771, - "frec": 1 - }, - { - "id": 772, - "frec": 1 - }, - { - "id": 773, - "frec": 1 - }, - { - "id": 774, - "frec": 1 - }, - { - "id": 775, - "frec": 1 - }, - { - "id": 776, - "frec": 1 - }, - { - "id": 777, - "frec": 1 - }, - { - "id": 778, - "frec": 1 - }, - { - "id": 779, - "frec": 1 - }, - { - "id": 780, - "frec": 1 - }, - { - "id": 781, - "frec": 1 - }, - { - "id": 782, - "frec": 1 - }, - { - "id": 783, - "frec": 1 - }, - { - "id": 784, - "frec": 1 - }, - { - "id": 785, - "frec": 1 - }, - { - "id": 786, - "frec": 1 - }, - { - "id": 787, - "frec": 1 - }, - { - "id": 788, - "frec": 1 - }, - { - "id": 789, - "frec": 1 - }, - { - "id": 790, - "frec": 1 - }, - { - "id": 791, - "frec": 1 - }, - { - "id": 792, - "frec": 1 - }, - { - "id": 793, - "frec": 1 - }, - { - "id": 794, - "frec": 1 - }, - { - "id": 795, - "frec": 1 - }, - { - "id": 796, - "frec": 1 - }, - { - "id": 797, - "frec": 1 - }, - { - "id": 798, - "frec": 1 - }, - { - "id": 799, - "frec": 1 - }, - { - "id": 800, - "frec": 1 - }, - { - "id": 801, - "frec": 1 - }, - { - "id": 802, - "frec": 1 - }, - { - "id": 803, - "frec": 1 - }, - { - "id": 804, - "frec": 1 - }, - { - "id": 805, - "frec": 1 - }, - { - "id": 806, - "frec": 1 - }, - { - "id": 807, - "frec": 1 - }, - { - "id": 808, - "frec": 1 - }, - { - "id": 809, - "frec": 1 - }, - { - "id": 810, - "frec": 1 - }, - { - "id": 811, - "frec": 1 - }, - { - "id": 812, - "frec": 1 - }, - { - "id": 813, - "frec": 1 - }, - { - "id": 814, - "frec": 1 - }, - { - "id": 815, - "frec": 1 - }, - { - "id": 816, - "frec": 1 - }, - { - "id": 817, - "frec": 1 - }, - { - "id": 818, - "frec": 1 - }, - { - "id": 819, - "frec": 1 - }, - { - "id": 820, - "frec": 1 - }, - { - "id": 821, - "frec": 1 - }, - { - "id": 822, - "frec": 1 - }, - { - "id": 823, - "frec": 1 - }, - { - "id": 824, - "frec": 1 - }, - { - "id": 825, - "frec": 1 - }, - { - "id": 826, - "frec": 1 - }, - { - "id": 827, - "frec": 1 - }, - { - "id": 828, - "frec": 1 - }, - { - "id": 829, - "frec": 1 - }, - { - "id": 830, - "frec": 1 - }, - { - "id": 831, - "frec": 1 - }, - { - "id": 832, - "frec": 1 - }, - { - "id": 833, - "frec": 1 - }, - { - "id": 834, - "frec": 1 - }, - { - "id": 835, - "frec": 1 - }, - { - "id": 836, - "frec": 1 - }, - { - "id": 837, - "frec": 1 - }, - { - "id": 838, - "frec": 1 - }, - { - "id": 839, - "frec": 1 - }, - { - "id": 840, - "frec": 1 - }, - { - "id": 841, - "frec": 1 - }, - { - "id": 842, - "frec": 1 - }, - { - "id": 843, - "frec": 1 - }, - { - "id": 844, - "frec": 1 - }, - { - "id": 845, - "frec": 1 - }, - { - "id": 846, - "frec": 1 - }, - { - "id": 847, - "frec": 1 - }, - { - "id": 848, - "frec": 1 - }, - { - "id": 849, - "frec": 1 - }, - { - "id": 850, - "frec": 1 - }, - { - "id": 851, - "frec": 1 - }, - { - "id": 852, - "frec": 1 - }, - { - "id": 853, - "frec": 1 - }, - { - "id": 854, - "frec": 1 - }, - { - "id": 855, - "frec": 1 - }, - { - "id": 856, - "frec": 1 - }, - { - "id": 857, - "frec": 1 - }, - { - "id": 858, - "frec": 1 - }, - { - "id": 859, - "frec": 1 - }, - { - "id": 860, - "frec": 1 - }, - { - "id": 861, - "frec": 1 - }, - { - "id": 862, - "frec": 1 - }, - { - "id": 863, - "frec": 1 - }, - { - "id": 864, - "frec": 1 - }, - { - "id": 865, - "frec": 1 - }, - { - "id": 866, - "frec": 1 - }, - { - "id": 867, - "frec": 1 - }, - { - "id": 868, - "frec": 1 - }, - { - "id": 869, - "frec": 1 - }, - { - "id": 870, - "frec": 1 - }, - { - "id": 871, - "frec": 1 - }, - { - "id": 872, - "frec": 1 - }, - { - "id": 873, - "frec": 1 - }, - { - "id": 874, - "frec": 1 - }, - { - "id": 875, - "frec": 1 - }, - { - "id": 876, - "frec": 1 - }, - { - "id": 877, - "frec": 1 - }, - { - "id": 878, - "frec": 1 - }, - { - "id": 879, - "frec": 1 - }, - { - "id": 880, - "frec": 1 - }, - { - "id": 881, - "frec": 1 - }, - { - "id": 882, - "frec": 1 - }, - { - "id": 883, - "frec": 1 - }, - { - "id": 884, - "frec": 1 - }, - { - "id": 885, - "frec": 1 - }, - { - "id": 886, - "frec": 1 - }, - { - "id": 887, - "frec": 1 - }, - { - "id": 888, - "frec": 1 - }, - { - "id": 889, - "frec": 1 - }, - { - "id": 890, - "frec": 1 - }, - { - "id": 891, - "frec": 1 - }, - { - "id": 892, - "frec": 1 - }, - { - "id": 893, - "frec": 1 - }, - { - "id": 894, - "frec": 1 - }, - { - "id": 895, - "frec": 1 - }, - { - "id": 896, - "frec": 1 - }, - { - "id": 897, - "frec": 1 - }, - { - "id": 898, - "frec": 1 - }, - { - "id": 899, - "frec": 1 - }, - { - "id": 900, - "frec": 1 - }, - { - "id": 901, - "frec": 1 - }, - { - "id": 902, - "frec": 1 - }, - { - "id": 903, - "frec": 1 - }, - { - "id": 904, - "frec": 1 - }, - { - "id": 905, - "frec": 1 - }, - { - "id": 906, - "frec": 1 - }, - { - "id": 907, - "frec": 1 - }, - { - "id": 908, - "frec": 1 - }, - { - "id": 909, - "frec": 1 - }, - { - "id": 910, - "frec": 1 - }, - { - "id": 911, - "frec": 1 - }, - { - "id": 912, - "frec": 1 - }, - { - "id": 913, - "frec": 1 - }, - { - "id": 914, - "frec": 1 - }, - { - "id": 915, - "frec": 1 - }, - { - "id": 916, - "frec": 1 - }, - { - "id": 917, - "frec": 1 - }, - { - "id": 918, - "frec": 1 - }, - { - "id": 919, - "frec": 1 - }, - { - "id": 920, - "frec": 1 - }, - { - "id": 921, - "frec": 1 - }, - { - "id": 922, - "frec": 1 - }, - { - "id": 923, - "frec": 1 - }, - { - "id": 924, - "frec": 1 - }, - { - "id": 925, - "frec": 1 - }, - { - "id": 926, - "frec": 1 - }, - { - "id": 927, - "frec": 1 - }, - { - "id": 928, - "frec": 1 - }, - { - "id": 929, - "frec": 1 - }, - { - "id": 930, - "frec": 1 - }, - { - "id": 931, - "frec": 1 - }, - { - "id": 932, - "frec": 1 - }, - { - "id": 933, - "frec": 1 - }, - { - "id": 934, - "frec": 1 - }, - { - "id": 935, - "frec": 1 - }, - { - "id": 936, - "frec": 1 - }, - { - "id": 937, - "frec": 1 - }, - { - "id": 938, - "frec": 1 - }, - { - "id": 939, - "frec": 1 - }, - { - "id": 940, - "frec": 1 - }, - { - "id": 941, - "frec": 1 - }, - { - "id": 942, - "frec": 1 - }, - { - "id": 943, - "frec": 1 - }, - { - "id": 944, - "frec": 1 - }, - { - "id": 945, - "frec": 1 - }, - { - "id": 946, - "frec": 1 - }, - { - "id": 947, - "frec": 1 - }, - { - "id": 948, - "frec": 1 - }, - { - "id": 949, - "frec": 1 - }, - { - "id": 950, - "frec": 1 - }, - { - "id": 951, - "frec": 1 - }, - { - "id": 952, - "frec": 1 - }, - { - "id": 953, - "frec": 1 - }, - { - "id": 954, - "frec": 1 - }, - { - "id": 955, - "frec": 1 - }, - { - "id": 956, - "frec": 1 - }, - { - "id": 957, - "frec": 1 - }, - { - "id": 958, - "frec": 1 - }, - { - "id": 959, - "frec": 1 - }, - { - "id": 960, - "frec": 1 - }, - { - "id": 961, - "frec": 1 - }, - { - "id": 962, - "frec": 1 - }, - { - "id": 963, - "frec": 1 - }, - { - "id": 964, - "frec": 1 - }, - { - "id": 965, - "frec": 1 - }, - { - "id": 966, - "frec": 1 - }, - { - "id": 967, - "frec": 1 - }, - { - "id": 968, - "frec": 1 - }, - { - "id": 969, - "frec": 1 - }, - { - "id": 970, - "frec": 1 - }, - { - "id": 971, - "frec": 1 - }, - { - "id": 972, - "frec": 1 - }, - { - "id": 973, - "frec": 1 - }, - { - "id": 974, - "frec": 1 - }, - { - "id": 975, - "frec": 1 - }, - { - "id": 976, - "frec": 1 - }, - { - "id": 977, - "frec": 1 - }, - { - "id": 978, - "frec": 1 - }, - { - "id": 979, - "frec": 1 - }, - { - "id": 980, - "frec": 1 - }, - { - "id": 981, - "frec": 1 - }, - { - "id": 982, - "frec": 1 - }, - { - "id": 983, - "frec": 1 - }, - { - "id": 984, - "frec": 1 - }, - { - "id": 985, - "frec": 1 - }, - { - "id": 986, - "frec": 1 - }, - { - "id": 987, - "frec": 1 - }, - { - "id": 988, - "frec": 1 - }, - { - "id": 989, - "frec": 1 - }, - { - "id": 990, - "frec": 1 - }, - { - "id": 991, - "frec": 1 - }, - { - "id": 992, - "frec": 1 - }, - { - "id": 993, - "frec": 1 - }, - { - "id": 994, - "frec": 1 - }, - { - "id": 995, - "frec": 1 - }, - { - "id": 996, - "frec": 1 - }, - { - "id": 997, - "frec": 1 - }, - { - "id": 998, - "frec": 1 - }, - { - "id": 999, - "frec": 1 - }, - { - "id": 1000, - "frec": 1 - }, - { - "id": 1001, - "frec": 1 - }, - { - "id": 1002, - "frec": 1 - }, - { - "id": 1003, - "frec": 1 - }, - { - "id": 1004, - "frec": 1 - }, - { - "id": 1005, - "frec": 1 - }, - { - "id": 1006, - "frec": 1 - }, - { - "id": 1007, - "frec": 1 - }, - { - "id": 1008, - "frec": 1 - }, - { - "id": 1009, - "frec": 1 - }, - { - "id": 1010, - "frec": 1 - }, - { - "id": 1011, - "frec": 1 - }, - { - "id": 1012, - "frec": 1 - }, - { - "id": 1013, - "frec": 1 - }, - { - "id": 1014, - "frec": 1 - }, - { - "id": 1015, - "frec": 1 - }, - { - "id": 1016, - "frec": 1 - }, - { - "id": 1017, - "frec": 1 - }, - { - "id": 1018, - "frec": 1 - }, - { - "id": 1019, - "frec": 1 - }, - { - "id": 1020, - "frec": 1 - }, - { - "id": 1021, - "frec": 1 - }, - { - "id": 1022, - "frec": 1 - } - ] - }, - { - "id": 25, - "texto": { - "en": "Health book", - "pt": "Livro de saúde" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Flibro_salud.webp?alt=media&token=c7b4bf4a-38b5-4b09-ac7d-30299ef09d86" - }, - "relacion": [ - { - "id": 377, - "frec": 10 - }, - { - "id": 378, - "frec": 3 - }, - { - "id": 379, - "frec": 7 - }, - { - "id": 380, - "frec": 1 - }, - { - "id": 381, - "frec": 1 - }, - { - "id": 382, - "frec": 1 - }, - { - "id": 383, - "frec": 1 - }, - { - "id": 384, - "frec": 1 - }, - { - "id": 385, - "frec": 1 - }, - { - "id": 388, - "frec": 1 - }, - { - "id": 389, - "frec": 1 - }, - { - "id": 213, - "frec": 1 - }, - { - "id": 234, - "frec": 1 - }, - { - "id": 205, - "frec": 1 - }, - { - "id": 133, - "frec": 1 - }, - { - "id": 30, - "frec": 1 - }, - { - "id": 33, - "frec": 1 - }, - { - "id": 36, - "frec": 1 - }, - { - "id": 37, - "frec": 1 - }, - { - "id": 113, - "frec": 1 - }, - { - "id": 114, - "frec": 1 - }, - { - "id": 112, - "frec": 1 - }, - { - "id": 118, - "frec": 1 - }, - { - "id": 117, - "frec": 1 - }, - { - "id": 101, - "frec": 1 - }, - { - "id": 51, - "frec": 1 - }, - { - "id": 42, - "frec": 1 - }, - { - "id": 13, - "frec": 1 - }, - { - "id": 621, - "frec": 1 - }, - { - "id": 629, - "frec": 1 - }, - { - "id": 668, - "frec": 1 - }, - { - "id": 819, - "frec": 1 - }, - { - "id": 820, - "frec": 1 - }, - { - "id": 821, - "frec": 1 - }, - { - "id": 822, - "frec": 1 - }, - { - "id": 823, - "frec": 1 - }, - { - "id": 824, - "frec": 1 - }, - { - "id": 825, - "frec": 1 - }, - { - "id": 826, - "frec": 1 - }, - { - "id": 827, - "frec": 1 - }, - { - "id": 828, - "frec": 1 - }, - { - "id": 829, - "frec": 1 - }, - { - "id": 830, - "frec": 1 - }, - { - "id": 831, - "frec": 1 - }, - { - "id": 878, - "frec": 1 - }, - { - "id": 879, - "frec": 1 - }, - { - "id": 880, - "frec": 1 - }, - { - "id": 881, - "frec": 1 - }, - { - "id": 882, - "frec": 1 - }, - { - "id": 883, - "frec": 1 - }, - { - "id": 884, - "frec": 1 - }, - { - "id": 885, - "frec": 1 - }, - { - "id": 886, - "frec": 1 - }, - { - "id": 887, - "frec": 1 - } - ] - }, - { - "id": 26, - "texto": { - "en": "Fun book I", - "pt": "Livro divertido eu" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Flibro_ocio_1.webp?alt=media&token=50186510-bf0a-4416-85a8-fc1b17ff6fd5" - }, - "relacion": [ - { - "id": 2, - "frec": 1 - }, - { - "id": 8, - "frec": 1 - }, - { - "id": 3, - "frec": 1 - }, - { - "id": 17, - "frec": 1 - }, - { - "id": 20, - "frec": 1 - }, - { - "id": 48, - "frec": 1 - }, - { - "id": 37, - "frec": 1 - }, - { - "id": 36, - "frec": 1 - }, - { - "id": 13, - "frec": 1 - }, - { - "id": 119, - "frec": 1 - }, - { - "id": 121, - "frec": 1 - }, - { - "id": 124, - "frec": 1 - }, - { - "id": 138, - "frec": 1 - }, - { - "id": 144, - "frec": 1 - }, - { - "id": 161, - "frec": 1 - }, - { - "id": 164, - "frec": 1 - }, - { - "id": 171, - "frec": 1 - }, - { - "id": 207, - "frec": 1 - }, - { - "id": 543, - "frec": 1 - }, - { - "id": 544, - "frec": 1 - }, - { - "id": 546, - "frec": 1 - }, - { - "id": 545, - "frec": 1 - }, - { - "id": 547, - "frec": 1 - }, - { - "id": 548, - "frec": 1 - }, - { - "id": 549, - "frec": 1 - }, - { - "id": 550, - "frec": 1 - }, - { - "id": 551, - "frec": 1 - }, - { - "id": 552, - "frec": 1 - }, - { - "id": 553, - "frec": 1 - }, - { - "id": 554, - "frec": 1 - }, - { - "id": 555, - "frec": 1 - }, - { - "id": 556, - "frec": 1 - }, - { - "id": 557, - "frec": 1 - }, - { - "id": 558, - "frec": 1 - }, - { - "id": 559, - "frec": 1 - }, - { - "id": 560, - "frec": 1 - }, - { - "id": 561, - "frec": 1 - }, - { - "id": 562, - "frec": 1 - }, - { - "id": 563, - "frec": 1 - }, - { - "id": 564, - "frec": 1 - }, - { - "id": 565, - "frec": 1 - }, - { - "id": 566, - "frec": 1 - }, - { - "id": 567, - "frec": 1 - }, - { - "id": 568, - "frec": 1 - }, - { - "id": 569, - "frec": 1 - }, - { - "id": 570, - "frec": 1 - }, - { - "id": 571, - "frec": 1 - }, - { - "id": 572, - "frec": 1 - }, - { - "id": 573, - "frec": 1 - }, - { - "id": 574, - "frec": 1 - }, - { - "id": 576, - "frec": 1 - }, - { - "id": 575, - "frec": 1 - }, - { - "id": 577, - "frec": 1 - }, - { - "id": 578, - "frec": 1 - }, - { - "id": 579, - "frec": 1 - }, - { - "id": 580, - "frec": 1 - }, - { - "id": 581, - "frec": 1 - }, - { - "id": 582, - "frec": 1 - }, - { - "id": 583, - "frec": 1 - }, - { - "id": 584, - "frec": 1 - }, - { - "id": 587, - "frec": 1 - }, - { - "id": 615, - "frec": 1 - }, - { - "id": 621, - "frec": 1 - }, - { - "id": 634, - "frec": 1 - }, - { - "id": 635, - "frec": 1 - }, - { - "id": 636, - "frec": 1 - }, - { - "id": 638, - "frec": 1 - }, - { - "id": 639, - "frec": 1 - }, - { - "id": 641, - "frec": 1 - }, - { - "id": 661, - "frec": 1 - }, - { - "id": 1013, - "frec": 1 - } - ] - }, - { - "id": 27, - "texto": { - "en": "Fun book II", - "pt": "Livro divertido II" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Flibro_ocio_2.webp?alt=media&token=fa4aa42c-d12a-4c47-a826-7918e5c23735" - }, - "relacion": [ - { - "id": 1, - "frec": 1 - }, - { - "id": 5, - "frec": 1 - }, - { - "id": 2, - "frec": 1 - }, - { - "id": 8, - "frec": 1 - }, - { - "id": 17, - "frec": 1 - }, - { - "id": 20, - "frec": 1 - }, - { - "id": 28, - "frec": 1 - }, - { - "id": 30, - "frec": 1 - }, - { - "id": 34, - "frec": 1 - }, - { - "id": 32, - "frec": 1 - }, - { - "id": 38, - "frec": 1 - }, - { - "id": 70, - "frec": 1 - }, - { - "id": 82, - "frec": 1 - }, - { - "id": 119, - "frec": 1 - }, - { - "id": 124, - "frec": 1 - }, - { - "id": 137, - "frec": 1 - }, - { - "id": 161, - "frec": 1 - }, - { - "id": 171, - "frec": 1 - }, - { - "id": 615, - "frec": 1 - }, - { - "id": 623, - "frec": 1 - }, - { - "id": 624, - "frec": 1 - }, - { - "id": 672, - "frec": 1 - }, - { - "id": 678, - "frec": 1 - }, - { - "id": 689, - "frec": 1 - }, - { - "id": 975, - "frec": 1 - }, - { - "id": 976, - "frec": 1 - }, - { - "id": 977, - "frec": 1 - }, - { - "id": 978, - "frec": 1 - }, - { - "id": 979, - "frec": 1 - }, - { - "id": 980, - "frec": 1 - }, - { - "id": 981, - "frec": 1 - }, - { - "id": 982, - "frec": 1 - }, - { - "id": 983, - "frec": 1 - }, - { - "id": 984, - "frec": 1 - }, - { - "id": 985, - "frec": 1 - }, - { - "id": 986, - "frec": 1 - }, - { - "id": 987, - "frec": 1 - }, - { - "id": 988, - "frec": 1 - }, - { - "id": 989, - "frec": 1 - }, - { - "id": 990, - "frec": 1 - }, - { - "id": 991, - "frec": 1 - }, - { - "id": 992, - "frec": 1 - }, - { - "id": 993, - "frec": 1 - }, - { - "id": 994, - "frec": 1 - }, - { - "id": 995, - "frec": 1 - }, - { - "id": 996, - "frec": 1 - }, - { - "id": 997, - "frec": 1 - }, - { - "id": 1003, - "frec": 1 - }, - { - "id": 1005, - "frec": 1 - }, - { - "id": 1004, - "frec": 1 - }, - { - "id": 1006, - "frec": 1 - }, - { - "id": 1007, - "frec": 1 - }, - { - "id": 1008, - "frec": 1 - }, - { - "id": 1011, - "frec": 1 - }, - { - "id": 1010, - "frec": 1 - }, - { - "id": 1009, - "frec": 1 - } - ] - }, - { - "id": 28, - "texto": { - "en": "Restaurant Book", - "pt": "Livro de restaurante" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Frestaurante.webp?alt=media&token=57ed6d5c-fa5f-41c1-b779-28294311e772" - }, - "relacion": [ - { - "id": 377, - "frec": 10 - }, - { - "id": 378, - "frec": 3 - }, - { - "id": 379, - "frec": 7 - }, - { - "id": 380, - "frec": 1 - }, - { - "id": 381, - "frec": 1 - }, - { - "id": 382, - "frec": 1 - }, - { - "id": 383, - "frec": 1 - }, - { - "id": 384, - "frec": 1 - }, - { - "id": 388, - "frec": 1 - }, - { - "id": 389, - "frec": 1 - }, - { - "id": 495, - "frec": 1 - }, - { - "id": 497, - "frec": 1 - }, - { - "id": 501, - "frec": 1 - }, - { - "id": 500, - "frec": 1 - }, - { - "id": 503, - "frec": 1 - }, - { - "id": 502, - "frec": 1 - }, - { - "id": 587, - "frec": 1 - }, - { - "id": 588, - "frec": 1 - }, - { - "id": 594, - "frec": 1 - }, - { - "id": 590, - "frec": 1 - }, - { - "id": 589, - "frec": 1 - }, - { - "id": 592, - "frec": 1 - }, - { - "id": 593, - "frec": 1 - }, - { - "id": 599, - "frec": 1 - }, - { - "id": 598, - "frec": 1 - }, - { - "id": 597, - "frec": 1 - }, - { - "id": 600, - "frec": 1 - }, - { - "id": 602, - "frec": 1 - }, - { - "id": 595, - "frec": 1 - }, - { - "id": 605, - "frec": 1 - }, - { - "id": 604, - "frec": 1 - }, - { - "id": 603, - "frec": 1 - }, - { - "id": 601, - "frec": 1 - }, - { - "id": 400, - "frec": 1 - }, - { - "id": 401, - "frec": 1 - }, - { - "id": 405, - "frec": 1 - }, - { - "id": 403, - "frec": 1 - }, - { - "id": 399, - "frec": 1 - }, - { - "id": 411, - "frec": 1 - }, - { - "id": 412, - "frec": 1 - }, - { - "id": 417, - "frec": 1 - }, - { - "id": 418, - "frec": 1 - }, - { - "id": 416, - "frec": 1 - }, - { - "id": 421, - "frec": 1 - }, - { - "id": 424, - "frec": 1 - }, - { - "id": 429, - "frec": 1 - }, - { - "id": 437, - "frec": 1 - }, - { - "id": 442, - "frec": 1 - }, - { - "id": 454, - "frec": 1 - }, - { - "id": 455, - "frec": 1 - }, - { - "id": 458, - "frec": 1 - }, - { - "id": 461, - "frec": 1 - }, - { - "id": 462, - "frec": 1 - }, - { - "id": 464, - "frec": 1 - }, - { - "id": 463, - "frec": 1 - }, - { - "id": 472, - "frec": 1 - }, - { - "id": 476, - "frec": 1 - }, - { - "id": 477, - "frec": 1 - }, - { - "id": 478, - "frec": 1 - }, - { - "id": 480, - "frec": 1 - }, - { - "id": 481, - "frec": 1 - }, - { - "id": 482, - "frec": 1 - }, - { - "id": 483, - "frec": 1 - }, - { - "id": 484, - "frec": 1 - }, - { - "id": 486, - "frec": 1 - }, - { - "id": 487, - "frec": 1 - }, - { - "id": 488, - "frec": 1 - }, - { - "id": 489, - "frec": 1 - }, - { - "id": 490, - "frec": 1 - }, - { - "id": 491, - "frec": 1 - }, - { - "id": 492, - "frec": 1 - }, - { - "id": 497, - "frec": 1 - }, - { - "id": 493, - "frec": 1 - }, - { - "id": 505, - "frec": 1 - }, - { - "id": 506, - "frec": 1 - }, - { - "id": 511, - "frec": 1 - }, - { - "id": 512, - "frec": 1 - }, - { - "id": 515, - "frec": 1 - }, - { - "id": 513, - "frec": 1 - }, - { - "id": 618, - "frec": 1 - }, - { - "id": 619, - "frec": 1 - }, - { - "id": 679, - "frec": 1 - }, - { - "id": 657, - "frec": 1 - }, - { - "id": 660, - "frec": 1 - }, - { - "id": 649, - "frec": 1 - }, - { - "id": 666, - "frec": 1 - }, - { - "id": 672, - "frec": 1 - }, - { - "id": 685, - "frec": 1 - }, - { - "id": 689, - "frec": 1 - } - ] - }, - { - "id": 29, - "texto": { - "en": "Travel book", - "pt": "Livro de viagem" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Flibro_viaje.webp?alt=media&token=1f869b28-34f4-4d1d-8dc7-2edcb5276f16" - }, - "relacion": [ - { - "id": 377, - "frec": 10 - }, - { - "id": 378, - "frec": 3 - }, - { - "id": 379, - "frec": 7 - }, - { - "id": 380, - "frec": 1 - }, - { - "id": 381, - "frec": 1 - }, - { - "id": 382, - "frec": 1 - }, - { - "id": 383, - "frec": 1 - }, - { - "id": 384, - "frec": 1 - }, - { - "id": 385, - "frec": 1 - }, - { - "id": 388, - "frec": 1 - }, - { - "id": 389, - "frec": 1 - }, - { - "id": 5, - "frec": 1 - }, - { - "id": 7, - "frec": 1 - }, - { - "id": 8, - "frec": 1 - }, - { - "id": 1, - "frec": 1 - }, - { - "id": 30, - "frec": 1 - }, - { - "id": 33, - "frec": 1 - }, - { - "id": 38, - "frec": 1 - }, - { - "id": 73, - "frec": 1 - }, - { - "id": 74, - "frec": 1 - }, - { - "id": 101, - "frec": 1 - }, - { - "id": 107, - "frec": 1 - }, - { - "id": 108, - "frec": 1 - }, - { - "id": 109, - "frec": 1 - }, - { - "id": 111, - "frec": 1 - }, - { - "id": 110, - "frec": 1 - }, - { - "id": 112, - "frec": 1 - }, - { - "id": 140, - "frec": 1 - }, - { - "id": 133, - "frec": 1 - }, - { - "id": 177, - "frec": 1 - }, - { - "id": 205, - "frec": 1 - }, - { - "id": 499, - "frec": 1 - }, - { - "id": 500, - "frec": 1 - }, - { - "id": 501, - "frec": 1 - }, - { - "id": 568, - "frec": 1 - }, - { - "id": 587, - "frec": 1 - }, - { - "id": 588, - "frec": 1 - }, - { - "id": 589, - "frec": 1 - }, - { - "id": 590, - "frec": 1 - }, - { - "id": 594, - "frec": 1 - }, - { - "id": 595, - "frec": 1 - }, - { - "id": 602, - "frec": 1 - }, - { - "id": 606, - "frec": 1 - }, - { - "id": 607, - "frec": 1 - }, - { - "id": 608, - "frec": 1 - }, - { - "id": 609, - "frec": 1 - }, - { - "id": 610, - "frec": 1 - }, - { - "id": 611, - "frec": 1 - }, - { - "id": 612, - "frec": 1 - }, - { - "id": 613, - "frec": 1 - }, - { - "id": 618, - "frec": 1 - }, - { - "id": 646, - "frec": 1 - }, - { - "id": 647, - "frec": 1 - }, - { - "id": 656, - "frec": 1 - }, - { - "id": 657, - "frec": 1 - }, - { - "id": 669, - "frec": 1 - }, - { - "id": 670, - "frec": 1 - }, - { - "id": 679, - "frec": 1 - }, - { - "id": 685, - "frec": 1 - }, - { - "id": 666, - "frec": 1 - }, - { - "id": 649, - "frec": 1 - }, - { - "id": 773, - "frec": 1 - }, - { - "id": 1015, - "frec": 1 - }, - { - "id": 1021, - "frec": 1 - }, - { - "id": 1022, - "frec": 1 - }, - { - "id": 1020, - "frec": 1 - }, - { - "id": 1019, - "frec": 1 - } - ] - }, - { - "id": 30, - "texto": { - "en": "Hygiene book", - "pt": "Livro de higiene" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fhigiene_personal.webp?alt=media&token=d822b484-feb9-4a37-a9f0-ed53e9b3584f" - }, - "relacion": [ - { - "id": 9, - "frec": 1 - }, - { - "id": 10, - "frec": 1 - }, - { - "id": 11, - "frec": 1 - }, - { - "id": 23, - "frec": 1 - }, - { - "id": 29, - "frec": 1 - }, - { - "id": 31, - "frec": 1 - }, - { - "id": 35, - "frec": 1 - }, - { - "id": 39, - "frec": 1 - }, - { - "id": 42, - "frec": 1 - }, - { - "id": 54, - "frec": 1 - }, - { - "id": 100, - "frec": 1 - }, - { - "id": 133, - "frec": 1 - }, - { - "id": 158, - "frec": 1 - }, - { - "id": 159, - "frec": 1 - }, - { - "id": 185, - "frec": 1 - }, - { - "id": 186, - "frec": 1 - }, - { - "id": 200, - "frec": 1 - }, - { - "id": 205, - "frec": 1 - }, - { - "id": 204, - "frec": 1 - }, - { - "id": 209, - "frec": 1 - }, - { - "id": 263, - "frec": 1 - }, - { - "id": 199, - "frec": 1 - }, - { - "id": 226, - "frec": 1 - }, - { - "id": 227, - "frec": 1 - } - ] - }, - { - "id": 31, - "texto": { - "en": "Butcher book", - "pt": "Livro de carniceiro" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Flibro_carnicero.webp?alt=media&token=b3a49a1a-5b29-40a2-a456-6117822efb08" - }, - "relacion": [ - { - "id": 5, - "frec": 1 - }, - { - "id": 7, - "frec": 1 - }, - { - "id": 13, - "frec": 1 - }, - { - "id": 36, - "frec": 1 - }, - { - "id": 37, - "frec": 1 - }, - { - "id": 47, - "frec": 1 - }, - { - "id": 377, - "frec": 10 - }, - { - "id": 378, - "frec": 3 - }, - { - "id": 379, - "frec": 7 - }, - { - "id": 380, - "frec": 1 - }, - { - "id": 381, - "frec": 1 - }, - { - "id": 382, - "frec": 1 - }, - { - "id": 383, - "frec": 1 - }, - { - "id": 384, - "frec": 1 - }, - { - "id": 388, - "frec": 1 - }, - { - "id": 389, - "frec": 1 - }, - { - "id": 482, - "frec": 1 - }, - { - "id": 511, - "frec": 1 - }, - { - "id": 505, - "frec": 1 - }, - { - "id": 506, - "frec": 1 - }, - { - "id": 512, - "frec": 1 - }, - { - "id": 513, - "frec": 1 - }, - { - "id": 514, - "frec": 1 - }, - { - "id": 515, - "frec": 1 - }, - { - "id": 516, - "frec": 1 - }, - { - "id": 517, - "frec": 1 - }, - { - "id": 518, - "frec": 1 - }, - { - "id": 519, - "frec": 1 - }, - { - "id": 520, - "frec": 1 - }, - { - "id": 522, - "frec": 1 - }, - { - "id": 523, - "frec": 1 - }, - { - "id": 524, - "frec": 1 - }, - { - "id": 587, - "frec": 1 - }, - { - "id": 617, - "frec": 1 - } - ] - }, - { - "id": 32, - "texto": { - "en": "Grocery book", - "pt": "Livro de supermercado" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Flibro_almacen.webp?alt=media&token=9f5be80c-f5fc-48dd-be44-ba6ea61a8efc" - }, - "relacion": [ - { - "id": 5, - "frec": 1 - }, - { - "id": 13, - "frec": 1 - }, - { - "id": 23, - "frec": 1 - }, - { - "id": 30, - "frec": 1 - }, - { - "id": 36, - "frec": 1 - }, - { - "id": 37, - "frec": 1 - }, - { - "id": 138, - "frec": 1 - }, - { - "id": 136, - "frec": 1 - }, - { - "id": 131, - "frec": 1 - }, - { - "id": 213, - "frec": 1 - }, - { - "id": 208, - "frec": 1 - }, - { - "id": 233, - "frec": 1 - }, - { - "id": 234, - "frec": 1 - }, - { - "id": 267, - "frec": 1 - }, - { - "id": 165, - "frec": 1 - }, - { - "id": 153, - "frec": 1 - }, - { - "id": 168, - "frec": 1 - }, - { - "id": 206, - "frec": 1 - }, - { - "id": 228, - "frec": 1 - }, - { - "id": 394, - "frec": 1 - }, - { - "id": 396, - "frec": 1 - }, - { - "id": 400, - "frec": 1 - }, - { - "id": 401, - "frec": 1 - }, - { - "id": 398, - "frec": 1 - }, - { - "id": 406, - "frec": 1 - }, - { - "id": 415, - "frec": 1 - }, - { - "id": 425, - "frec": 1 - }, - { - "id": 426, - "frec": 1 - }, - { - "id": 427, - "frec": 1 - }, - { - "id": 431, - "frec": 1 - }, - { - "id": 439, - "frec": 1 - }, - { - "id": 440, - "frec": 1 - }, - { - "id": 450, - "frec": 1 - }, - { - "id": 451, - "frec": 1 - }, - { - "id": 452, - "frec": 1 - }, - { - "id": 459, - "frec": 1 - }, - { - "id": 466, - "frec": 1 - }, - { - "id": 484, - "frec": 1 - }, - { - "id": 483, - "frec": 1 - }, - { - "id": 487, - "frec": 1 - }, - { - "id": 488, - "frec": 1 - }, - { - "id": 489, - "frec": 1 - }, - { - "id": 490, - "frec": 1 - }, - { - "id": 491, - "frec": 1 - }, - { - "id": 492, - "frec": 1 - }, - { - "id": 495, - "frec": 1 - }, - { - "id": 496, - "frec": 1 - }, - { - "id": 500, - "frec": 1 - }, - { - "id": 494, - "frec": 1 - }, - { - "id": 588, - "frec": 1 - }, - { - "id": 587, - "frec": 1 - } - ] - }, - { - "id": 33, - "texto": { - "en": "Greengrocery book", - "pt": "Livro de Greengrocery" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Flibro_verduleria.webp?alt=media&token=533584e7-215a-4ab7-bc2f-aecf13c9c6c1" - }, - "relacion": [ - { - "id": 5, - "frec": 1 - }, - { - "id": 7, - "frec": 1 - }, - { - "id": 13, - "frec": 1 - }, - { - "id": 22, - "frec": 1 - }, - { - "id": 36, - "frec": 1 - }, - { - "id": 37, - "frec": 1 - }, - { - "id": 69, - "frec": 1 - }, - { - "id": 391, - "frec": 1 - }, - { - "id": 392, - "frec": 1 - }, - { - "id": 393, - "frec": 1 - }, - { - "id": 395, - "frec": 1 - }, - { - "id": 397, - "frec": 1 - }, - { - "id": 399, - "frec": 1 - }, - { - "id": 402, - "frec": 1 - }, - { - "id": 403, - "frec": 1 - }, - { - "id": 404, - "frec": 1 - }, - { - "id": 405, - "frec": 1 - }, - { - "id": 407, - "frec": 1 - }, - { - "id": 408, - "frec": 1 - }, - { - "id": 409, - "frec": 1 - }, - { - "id": 410, - "frec": 1 - }, - { - "id": 414, - "frec": 1 - }, - { - "id": 413, - "frec": 1 - }, - { - "id": 418, - "frec": 1 - }, - { - "id": 419, - "frec": 1 - }, - { - "id": 422, - "frec": 1 - }, - { - "id": 423, - "frec": 1 - }, - { - "id": 428, - "frec": 1 - }, - { - "id": 430, - "frec": 1 - }, - { - "id": 432, - "frec": 1 - }, - { - "id": 433, - "frec": 1 - }, - { - "id": 434, - "frec": 1 - }, - { - "id": 435, - "frec": 1 - }, - { - "id": 436, - "frec": 1 - }, - { - "id": 441, - "frec": 1 - }, - { - "id": 442, - "frec": 1 - }, - { - "id": 443, - "frec": 1 - }, - { - "id": 444, - "frec": 1 - }, - { - "id": 445, - "frec": 1 - }, - { - "id": 446, - "frec": 1 - }, - { - "id": 447, - "frec": 1 - }, - { - "id": 448, - "frec": 1 - }, - { - "id": 456, - "frec": 1 - }, - { - "id": 457, - "frec": 1 - }, - { - "id": 460, - "frec": 1 - }, - { - "id": 463, - "frec": 1 - }, - { - "id": 473, - "frec": 1 - }, - { - "id": 474, - "frec": 1 - }, - { - "id": 475, - "frec": 1 - }, - { - "id": 478, - "frec": 1 - }, - { - "id": 483, - "frec": 1 - }, - { - "id": 507, - "frec": 1 - } - ] - }, - { - "id": 34, - "texto": { - "en": "Music lesson", - "pt": "Aula de música" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fclase_musica.webp?alt=media&token=a7a2c34a-9c31-44ad-81d0-b1a4c443aa89" - }, - "relacion": [ - { - "id": 3, - "frec": 1 - }, - { - "id": 6, - "frec": 1 - }, - { - "id": 1, - "frec": 1 - }, - { - "id": 17, - "frec": 1 - }, - { - "id": 2, - "frec": 1 - }, - { - "id": 20, - "frec": 1 - }, - { - "id": 19, - "frec": 1 - }, - { - "id": 50, - "frec": 1 - }, - { - "id": 573, - "frec": 1 - }, - { - "id": 627, - "frec": 1 - }, - { - "id": 626, - "frec": 1 - }, - { - "id": 847, - "frec": 1 - }, - { - "id": 848, - "frec": 1 - }, - { - "id": 849, - "frec": 1 - }, - { - "id": 850, - "frec": 1 - }, - { - "id": 851, - "frec": 1 - }, - { - "id": 852, - "frec": 1 - }, - { - "id": 853, - "frec": 1 - }, - { - "id": 854, - "frec": 1 - }, - { - "id": 855, - "frec": 1 - }, - { - "id": 856, - "frec": 1 - }, - { - "id": 857, - "frec": 1 - }, - { - "id": 858, - "frec": 1 - }, - { - "id": 859, - "frec": 1 - }, - { - "id": 860, - "frec": 1 - }, - { - "id": 861, - "frec": 1 - }, - { - "id": 862, - "frec": 1 - }, - { - "id": 863, - "frec": 1 - }, - { - "id": 864, - "frec": 1 - }, - { - "id": 865, - "frec": 1 - }, - { - "id": 866, - "frec": 1 - }, - { - "id": 867, - "frec": 1 - }, - { - "id": 868, - "frec": 1 - }, - { - "id": 869, - "frec": 1 - }, - { - "id": 870, - "frec": 1 - }, - { - "id": 871, - "frec": 1 - }, - { - "id": 872, - "frec": 1 - }, - { - "id": 873, - "frec": 1 - }, - { - "id": 874, - "frec": 1 - }, - { - "id": 875, - "frec": 1 - }, - { - "id": 876, - "frec": 1 - }, - { - "id": 877, - "frec": 1 - }, - { - "id": 1019, - "frec": 1 - } - ] - }, - { - "id": 35, - "texto": { - "en": "Art lesson", - "pt": "Aula de artes" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fclase_plastica.webp?alt=media&token=fb56f0bd-50d1-4a90-b32d-09e85ce95514" - }, - "relacion": [ - { - "id": 1, - "frec": 1 - }, - { - "id": 5, - "frec": 1 - }, - { - "id": 7, - "frec": 1 - }, - { - "id": 15, - "frec": 1 - }, - { - "id": 28, - "frec": 1 - }, - { - "id": 74, - "frec": 1 - }, - { - "id": 95, - "frec": 1 - }, - { - "id": 90, - "frec": 1 - }, - { - "id": 200, - "frec": 1 - }, - { - "id": 626, - "frec": 1 - }, - { - "id": 627, - "frec": 1 - }, - { - "id": 733, - "frec": 1 - }, - { - "id": 734, - "frec": 1 - }, - { - "id": 735, - "frec": 1 - }, - { - "id": 736, - "frec": 1 - }, - { - "id": 737, - "frec": 1 - }, - { - "id": 738, - "frec": 1 - }, - { - "id": 739, - "frec": 1 - }, - { - "id": 740, - "frec": 1 - }, - { - "id": 741, - "frec": 1 - }, - { - "id": 742, - "frec": 1 - }, - { - "id": 743, - "frec": 1 - }, - { - "id": 744, - "frec": 1 - }, - { - "id": 745, - "frec": 1 - }, - { - "id": 746, - "frec": 1 - }, - { - "id": 747, - "frec": 1 - }, - { - "id": 748, - "frec": 1 - }, - { - "id": 749, - "frec": 1 - }, - { - "id": 750, - "frec": 1 - }, - { - "id": 756, - "frec": 1 - }, - { - "id": 754, - "frec": 1 - }, - { - "id": 762, - "frec": 1 - }, - { - "id": 766, - "frec": 1 - }, - { - "id": 769, - "frec": 1 - }, - { - "id": 771, - "frec": 1 - }, - { - "id": 775, - "frec": 1 - } - ] - }, - { - "id": 36, - "texto": { - "en": "Lessons", - "pt": "Lições" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Flibro_clases.webp?alt=media&token=d0f51815-d6ec-4d98-972b-8a5e9fbe06e7" - }, - "relacion": [] - }, - { - "id": 37, - "texto": { - "en": "Football game", - "pt": "Jogo de futebol" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_futbol.webp?alt=media&token=50db7655-7aff-4f93-9b68-875cc5706c7a" - }, - "relacion": [ - { - "id": 7, - "frec": 1 - }, - { - "id": 8, - "frec": 1 - }, - { - "id": 2, - "frec": 1 - }, - { - "id": 17, - "frec": 1 - }, - { - "id": 16, - "frec": 1 - }, - { - "id": 26, - "frec": 1 - }, - { - "id": 34, - "frec": 1 - }, - { - "id": 41, - "frec": 1 - }, - { - "id": 46, - "frec": 1 - }, - { - "id": 70, - "frec": 1 - }, - { - "id": 85, - "frec": 1 - }, - { - "id": 119, - "frec": 1 - }, - { - "id": 124, - "frec": 1 - }, - { - "id": 125, - "frec": 1 - }, - { - "id": 161, - "frec": 1 - }, - { - "id": 171, - "frec": 1 - }, - { - "id": 386, - "frec": 1 - }, - { - "id": 377, - "frec": 10 - }, - { - "id": 388, - "frec": 1 - }, - { - "id": 389, - "frec": 1 - }, - { - "id": 616, - "frec": 1 - }, - { - "id": 622, - "frec": 1 - }, - { - "id": 620, - "frec": 1 - }, - { - "id": 651, - "frec": 1 - }, - { - "id": 832, - "frec": 1 - }, - { - "id": 833, - "frec": 1 - }, - { - "id": 834, - "frec": 1 - }, - { - "id": 835, - "frec": 1 - } - ] - }, - { - "id": 38, - "texto": { - "en": "Movies", - "pt": "Filmes" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcine.webp?alt=media&token=4109bb74-ab3d-4cda-99fb-34e7030e8762" - }, - "relacion": [ - { - "id": 1, - "frec": 1 - }, - { - "id": 3, - "frec": 1 - }, - { - "id": 7, - "frec": 1 - }, - { - "id": 13, - "frec": 1 - }, - { - "id": 23, - "frec": 1 - }, - { - "id": 30, - "frec": 1 - }, - { - "id": 36, - "frec": 1 - }, - { - "id": 37, - "frec": 1 - }, - { - "id": 48, - "frec": 1 - }, - { - "id": 74, - "frec": 1 - }, - { - "id": 543, - "frec": 1 - }, - { - "id": 544, - "frec": 1 - }, - { - "id": 545, - "frec": 1 - }, - { - "id": 546, - "frec": 1 - }, - { - "id": 547, - "frec": 1 - }, - { - "id": 548, - "frec": 1 - }, - { - "id": 549, - "frec": 1 - }, - { - "id": 550, - "frec": 1 - }, - { - "id": 551, - "frec": 1 - }, - { - "id": 552, - "frec": 1 - }, - { - "id": 553, - "frec": 1 - }, - { - "id": 554, - "frec": 1 - }, - { - "id": 555, - "frec": 1 - }, - { - "id": 556, - "frec": 1 - }, - { - "id": 557, - "frec": 1 - }, - { - "id": 558, - "frec": 1 - }, - { - "id": 559, - "frec": 1 - }, - { - "id": 560, - "frec": 1 - }, - { - "id": 561, - "frec": 1 - }, - { - "id": 562, - "frec": 1 - }, - { - "id": 563, - "frec": 1 - }, - { - "id": 564, - "frec": 1 - }, - { - "id": 565, - "frec": 1 - }, - { - "id": 566, - "frec": 1 - }, - { - "id": 567, - "frec": 1 - }, - { - "id": 569, - "frec": 1 - }, - { - "id": 570, - "frec": 1 - }, - { - "id": 571, - "frec": 1 - }, - { - "id": 572, - "frec": 1 - }, - { - "id": 573, - "frec": 1 - }, - { - "id": 574, - "frec": 1 - }, - { - "id": 576, - "frec": 1 - }, - { - "id": 575, - "frec": 1 - }, - { - "id": 577, - "frec": 1 - }, - { - "id": 578, - "frec": 1 - }, - { - "id": 579, - "frec": 1 - }, - { - "id": 580, - "frec": 1 - }, - { - "id": 581, - "frec": 1 - }, - { - "id": 582, - "frec": 1 - }, - { - "id": 583, - "frec": 1 - }, - { - "id": 584, - "frec": 1 - }, - { - "id": 587, - "frec": 1 - }, - { - "id": 602, - "frec": 1 - }, - { - "id": 634, - "frec": 1 - }, - { - "id": 636, - "frec": 1 - }, - { - "id": 635, - "frec": 1 - }, - { - "id": 638, - "frec": 1 - }, - { - "id": 639, - "frec": 1 - }, - { - "id": 641, - "frec": 1 - } - ] - }, - { - "id": 39, - "texto": { - "en": "Pharmacy book", - "pt": "Livro de farmácia" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_farmacia.webp?alt=media&token=0e948284-58e5-4f44-8269-dd5a65ee6558" - }, - "relacion": [ - { - "id": 23, - "frec": 1 - }, - { - "id": 36, - "frec": 1 - }, - { - "id": 37, - "frec": 1 - }, - { - "id": 47, - "frec": 1 - }, - { - "id": 76, - "frec": 1 - }, - { - "id": 98, - "frec": 1 - }, - { - "id": 101, - "frec": 1 - }, - { - "id": 113, - "frec": 1 - }, - { - "id": 114, - "frec": 1 - }, - { - "id": 131, - "frec": 1 - }, - { - "id": 138, - "frec": 1 - }, - { - "id": 250, - "frec": 1 - }, - { - "id": 251, - "frec": 1 - }, - { - "id": 377, - "frec": 1 - }, - { - "id": 378, - "frec": 1 - }, - { - "id": 379, - "frec": 1 - }, - { - "id": 380, - "frec": 1 - }, - { - "id": 384, - "frec": 1 - }, - { - "id": 382, - "frec": 1 - }, - { - "id": 383, - "frec": 1 - }, - { - "id": 381, - "frec": 1 - }, - { - "id": 385, - "frec": 1 - }, - { - "id": 387, - "frec": 1 - }, - { - "id": 388, - "frec": 1 - }, - { - "id": 389, - "frec": 1 - }, - { - "id": 567, - "frec": 1 - }, - { - "id": 587, - "frec": 1 - }, - { - "id": 588, - "frec": 1 - }, - { - "id": 629, - "frec": 1 - }, - { - "id": 708, - "frec": 1 - }, - { - "id": 777, - "frec": 1 - }, - { - "id": 778, - "frec": 1 - }, - { - "id": 779, - "frec": 1 - }, - { - "id": 780, - "frec": 1 - }, - { - "id": 784, - "frec": 1 - }, - { - "id": 783, - "frec": 1 - }, - { - "id": 782, - "frec": 1 - }, - { - "id": 781, - "frec": 1 - }, - { - "id": 785, - "frec": 1 - }, - { - "id": 786, - "frec": 1 - }, - { - "id": 787, - "frec": 1 - }, - { - "id": 788, - "frec": 1 - }, - { - "id": 789, - "frec": 1 - }, - { - "id": 790, - "frec": 1 - }, - { - "id": 791, - "frec": 1 - }, - { - "id": 792, - "frec": 1 - }, - { - "id": 793, - "frec": 1 - }, - { - "id": 795, - "frec": 1 - }, - { - "id": 799, - "frec": 1 - }, - { - "id": 797, - "frec": 1 - }, - { - "id": 800, - "frec": 1 - }, - { - "id": 801, - "frec": 1 - }, - { - "id": 802, - "frec": 1 - }, - { - "id": 804, - "frec": 1 - }, - { - "id": 807, - "frec": 1 - }, - { - "id": 805, - "frec": 1 - }, - { - "id": 809, - "frec": 1 - }, - { - "id": 819, - "frec": 1 - }, - { - "id": 820, - "frec": 1 - }, - { - "id": 821, - "frec": 1 - }, - { - "id": 822, - "frec": 1 - }, - { - "id": 823, - "frec": 1 - }, - { - "id": 824, - "frec": 1 - }, - { - "id": 825, - "frec": 1 - }, - { - "id": 826, - "frec": 1 - }, - { - "id": 827, - "frec": 1 - }, - { - "id": 828, - "frec": 1 - }, - { - "id": 829, - "frec": 1 - }, - { - "id": 830, - "frec": 1 - }, - { - "id": 831, - "frec": 1 - }, - { - "id": 878, - "frec": 1 - }, - { - "id": 879, - "frec": 1 - }, - { - "id": 880, - "frec": 1 - }, - { - "id": 881, - "frec": 1 - }, - { - "id": 882, - "frec": 1 - }, - { - "id": 883, - "frec": 1 - }, - { - "id": 884, - "frec": 1 - }, - { - "id": 885, - "frec": 1 - }, - { - "id": 886, - "frec": 1 - }, - { - "id": 887, - "frec": 1 - } - ] - }, - { - "id": 40, - "texto": { - "en": "Swimming", - "pt": "Natação" - }, - "tipo": 0, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fnatacion.webp?alt=media&token=f4e987c5-4a65-4499-bf95-ec775a6f17e6" - }, - "relacion": [ - { - "id": 1, - "frec": 1 - }, - { - "id": 7, - "frec": 1 - }, - { - "id": 10, - "frec": 1 - }, - { - "id": 59, - "frec": 1 - }, - { - "id": 63, - "frec": 1 - }, - { - "id": 86, - "frec": 1 - }, - { - "id": 88, - "frec": 1 - }, - { - "id": 83, - "frec": 1 - }, - { - "id": 96, - "frec": 1 - }, - { - "id": 102, - "frec": 1 - }, - { - "id": 99, - "frec": 1 - }, - { - "id": 105, - "frec": 1 - } - ] - } -] \ No newline at end of file diff --git a/assets/languages/it_IT.json b/assets/languages/it_IT.json new file mode 100644 index 00000000..9ee69822 --- /dev/null +++ b/assets/languages/it_IT.json @@ -0,0 +1,2504 @@ +{ + "-2UbAou9ydr8XeN-jtIz4": { + "text": "limpiar" + }, + "-GL2iAgykP10Ae3AKsVOX": { + "text": "sal" + }, + "-LE2iv3Pwr5KuIyM5bYb3": { + "text": "bien" + }, + "-LwAKwgCdVkzwM579zRMo": { + "text": "más" + }, + "-aePI8WknXpxEpz19Lu48": { + "text": "suyos" + }, + "-msU3yor4qJYQHJtWrdk8": { + "text": "pastas" + }, + "00AkNJ4YLpbRD_mLmQjtp": { + "text": "almuerzo" + }, + "0IrLGI8Ebm8rcS3ymUXqS": { + "text": "hambre" + }, + "0THELgiQ7rvA-orESXJfV": { + "text": "avión" + }, + "0Vkmy6BZcJn3pFurEevL9": { + "text": "estudiar" + }, + "0Z7uFXpp-XRXmqM8ILhIC": { + "text": "poco" + }, + "0_SK41wNOk6mw2qX_eHXM": { + "text": "cine" + }, + "0cdYDZ5HPaTmqTTN0_Ee8": { + "text": "suerte" + }, + "0fHziRVxg0oNDp5pyiI8M": { + "text": "permiso" + }, + "0fcYcD_r0jNWXTTAx8Ph7": { + "text": "aeropuerto" + }, + "0gAyTD6sImo0jpD_bYGVv": { + "text": "jueves" + }, + "0huLn-H32Cbwba28IZ3tc": { + "text": "burbujas" + }, + "0jpMJu8isUmOZKxhZ_yaj": { + "text": "equipo" + }, + "0pFtmDZdlnLrUkT_XZDXQ": { + "text": "antes" + }, + "0qoQs8WyLVONnu3_eBGfD": { + "text": "dolor de cabeza" + }, + "0v5fqIp8GmXsIHO0SPhtt": { + "text": "dale" + }, + "0vttFf3nAGDW6g5wVStcH": { + "text": "disculpa" + }, + "1-VwcvzNfvrwDWRGxRPre": { + "text": "ni" + }, + "10X4OKR5xmNhSj86sbyE_": { + "text": "salchichas" + }, + "14aCIW665UZtuwNsKKV5s": { + "text": "cartuchera" + }, + "17AkRFlfC_koV-lywmDE8": { + "text": "pantalones cortos" + }, + "1B1WmC-V0PglDeRAeINcT": { + "text": "mirar" + }, + "1DjW-XvWN7iOqoJPRSWwY": { + "text": "mal" + }, + "1IjenNwPwsMIWZ4aYBk8S": { + "text": "partido" + }, + "1Ph13Z_Ya6p-q0WA7pSl3": { + "text": "pájaro" + }, + "1QEfLU_S7TM0iMr9VZVtP": { + "text": "ronda" + }, + "1Rv9-SSJjHptwvzqLbdbx": { + "text": "divertido" + }, + "1WJZO-pUkTaQvyxz41iB-": { + "text": "picado" + }, + "1YOlJCovdcnnqVihqHVmq": { + "text": "acá" + }, + "1b71P9YjaNWnX8AWjstqG": { + "text": "remera" + }, + "1mS8kgJIod1cyUFH-msnM": { + "text": "estación" + }, + "1mU2ZosZXSJrxkh1NmxJT": { + "text": "izquierda" + }, + "1nhsReHG-f-bW-xaZBsxY": { + "text": "abajo" + }, + "1pb6S-RR_3zdCq77YFiZ-": { + "text": "¡qué mal!" + }, + "1zU7kolOKsHP9-oomQW1Q": { + "text": "rey" + }, + "27GbVOZ-szdnzsy92oY-X": { + "text": "manteca" + }, + "2CgcUkvJUskv982FvG54A": { + "text": "plata" + }, + "2HkB0WZYP7cvWLD39GMQj": { + "text": "bañar" + }, + "2KO0BFtB4B6fu1feuAZLt": { + "text": "verbos" + }, + "2RZTRMX56BFLrW7tLJ3Hy": { + "text": "mismo" + }, + "2Vc2H462cutVtUC-5omJk": { + "text": "pocos" + }, + "2dwtZO2wCm520GPD1i6dl": { + "text": "dolor de garganta" + }, + "2t_eq1JmgHa0R3eu8LMmI": { + "text": "ventilador" + }, + "2u2-AFuI245I7bZ6tsSPh": { + "text": "¿quién?" + }, + "2y9pxVOBQ2tMdPHcsqQb8": { + "text": "martes" + }, + "3-ueUrnwmIIj0BMP8_Ntb": { + "text": "uña" + }, + "32PnZjlnQbTJo4nL9YJYe": { + "text": "feliz" + }, + "3932Zm0xgk1hKB2hhBAUa": { + "text": "colectivo" + }, + "3KbwCHGooNLySWOBlFFuG": { + "text": "cocinita" + }, + "3KgKNNnuYMrysEDs3Pu4Z": { + "text": "subtítulo" + }, + "3VEnVjaGFCImBAZ3wEChu": { + "text": "ropa" + }, + "3arbCGI6fMOWALLanZcg3": { + "text": "capuchino" + }, + "3dtvYLjbl5oDyhZO9eFRY": { + "text": "ellos" + }, + "3mwcdenOurU_e59ChLqb0": { + "text": "fuera" + }, + "3w62N9b7Cvb6JMjB9Wphi": { + "text": "beber" + }, + "40q0NJ6vsziJDNFBqho7Y": { + "text": "dentro" + }, + "4A_FNkGH1EDu0oabPurrL": { + "text": "cereales" + }, + "4J1bWl6BbbEdZsRGsgYH2": { + "text": "queso" + }, + "4X7OXm35OSHoSlPxGUi_f": { + "text": "mueble" + }, + "4bHGIoQmDN8LptpdNN4v6": { + "text": "vacaciones" + }, + "4f1vqDoAvUu2XYk_JlQdC": { + "text": "siete" + }, + "4rctwNiN4UaU9lqU48MHG": { + "text": "computadora" + }, + "4rzonBodQXfs77gALnAP_": { + "text": "cerveza" + }, + "50wJdR0-3YLnv9y_2Gx_e": { + "text": "saltar" + }, + "54BVjn2seJWdBNGI20-yJ": { + "text": "computadora" + }, + "54taab8z9ziXt0IqXHkV9": { + "text": "dedos" + }, + "5L5UzBHOzuHRoO-jyPuEx": { + "text": "ciudad" + }, + "5LYjhk-N87Ov9NrQcGbLQ": { + "text": "aceite" + }, + "5Tdy0Gu9SiLsPfWwd-Y2E": { + "text": "lindo" + }, + "5VBtwEswIjrv1zbXP-oFn": { + "text": "sopa" + }, + "5W5_sCAyGTkVzguCEg1d1": { + "text": "jugo" + }, + "5dvq344JstkxUpHszaPfp": { + "text": "delfín" + }, + "5gPT9lrNgpRkF07lP6zOq": { + "text": "jugo de manzana" + }, + "5i3kSsCKF7Oa9iJQvXiTe": { + "text": "más o menos" + }, + "5kjlzqb9Rf3zzqZROaZ9p": { + "text": "perder" + }, + "5mGrGHzdw_vCwYCRNPcPw": { + "text": "pasear" + }, + "5vxTXbPl4Y0yezGu7p1f6": { + "text": "hacer" + }, + "6KicPX6y_u2i6tPBZAtvA": { + "text": "lavar" + }, + "6jLkKc9OL5btNOmjJem6S": { + "text": "poner" + }, + "6lYN4qSZx3_tKDClp4Iyr": { + "text": "entre" + }, + "6nhNeVjDfDi-GmreaqfVo": { + "text": "nublado" + }, + "6rcOXG6yxpzHLzMJ9IayI": { + "text": "cerrar" + }, + "6t2sPdapSNJrOziDozTWW": { + "text": "vaca" + }, + "71l2at-8480bvijxn3uBl": { + "text": "durante" + }, + "75gujwNXJdAiNmK6Ffhia": { + "text": "jugo" + }, + "79xBF6cKgKeD4GeBPe_Ds": { + "text": "bolsa" + }, + "7EsVGfapPc_38mHCBy3C3": { + "text": "enamorado" + }, + "7Hz61-WzV62FHsedOwz6q": { + "text": "flan" + }, + "7Q4Zc0cenSF5U4eKyje1f": { + "text": "hacia" + }, + "7Q9sNljseWjwSPW4in1ga": { + "text": "recepción" + }, + "7VL_MgnLDY6hi8sbvcGIg": { + "text": "silencio" + }, + "7WxUVoVQfQOzARU2bf6HP": { + "text": "casa" + }, + "7iAXKVm22uMgr6aqZ1rr7": { + "text": "abuelo" + }, + "8-4M30dTtmuUJus9MtGqV": { + "text": "moco" + }, + "81UJI7xOa5l9mVceqkIP5": { + "text": "tener frío" + }, + "82LicIQc3K2xCTEt-iMpu": { + "text": "caracol" + }, + "86gNdF6aTepa0Y9zkD1VQ": { + "text": "campo" + }, + "8FFwIw7rJri79BITZBUzm": { + "text": "hotel" + }, + "8KlFB3an1mzdQd6-LGCCE": { + "text": "merienda" + }, + "8LddDqylw-51wHhx9_Qad": { + "text": "libro" + }, + "8MV4ZFthtUeoxLAIbqGTc": { + "text": "carne" + }, + "8cOIYr-hcK54qWpuT-41e": { + "text": "cuento" + }, + "8fGingRAd8idw4qcxyZ-Q": { + "text": "vergüenza" + }, + "8iFdjRTQU7ONGnigRTlm8": { + "text": "¿cuánto sale?" + }, + "8vR0HYniXtrrQqqSIN_JQ": { + "text": "familia" + }, + "904w9Je6oDwGXUCIcrUZX": { + "text": "lengua" + }, + "93YmZA7VfAT7TTNTsDE1W": { + "text": "serie" + }, + "93hsW10TmX3Vcq_4IvcZ0": { + "text": "blanco" + }, + "93tHieC_CgZqN998y5gAv": { + "text": "chuleta" + }, + "97nIv-aoc51T8kKTZV5cM": { + "text": "saliva" + }, + "9EqfwMNtATh1fwMhyn_B1": { + "text": "buena" + }, + "9FiWvg197C-Riid-DVysN": { + "text": "claro" + }, + "9GqE148SFZqMIft4evAk2": { + "text": "comer" + }, + "9MzeUcz1nRqleTkmS_-g2": { + "text": "barco" + }, + "9QyJdpUn0f6g7FxWs5qpO": { + "text": "cortar" + }, + "9U8MzceIsqKhG86oNx9zV": { + "text": "coche" + }, + "9UwpyOnOBoqr4mX3Juqm2": { + "text": "buenas tardes" + }, + "9ZnzbKMDwGEwC3hXOhXFe": { + "text": "pastillas" + }, + "9dvSIpeXa2_12Jip6noJP": { + "text": "deportista" + }, + "9kgRI3KlOIVSuylKffW9g": { + "text": "colores" + }, + "9lS0mNuKIS0olyDwoIJBR": { + "text": "médico" + }, + "9mLx-YMK81AflitELQFqk": { + "text": "papel" + }, + "9s5zV3_oGyDx_NEvsKCxX": { + "text": "violín" + }, + "9wE9Py6ztyqDrtaypsltA": { + "text": "naranja" + }, + "AOp6VGyjYIV0Ym9d0basJ": { + "text": "dibujar" + }, + "APXF-lEplPOloppSeIjAY": { + "text": "menos" + }, + "AQKGKdoX5CYycZ2YqBZVW": { + "text": "barato" + }, + "AT_rDWsr6xRBgrvgw9Zih": { + "text": "nueve" + }, + "AWJXh6URGN0Vwm66i6IvL": { + "text": "hola" + }, + "AeFbJQ0M9uTObAlKEX3zr": { + "text": "pierna" + }, + "Akf0xlH8UJdXn8BJzPV2A": { + "text": "radio" + }, + "B1845IfYfPMz2FWpVFIQv": { + "text": "de" + }, + "BKmATW2uBk4pxnmOaARyq": { + "text": "documentos" + }, + "BNjZz9MGLJEKZ4CZoTs2M": { + "text": "ajedrez" + }, + "BQhqx1PuF94jwT0ySTlbJ": { + "text": "comida" + }, + "BQm-YCPc0lfD1-mhecCTL": { + "text": "yo" + }, + "Bebnh8-UWwtYLnK6p3fKi": { + "text": "pan negro" + }, + "BjqWZnzLlxdOo4KEzZ46j": { + "text": "ocho" + }, + "BqS7d4PMhGRqPYlZQzUbR": { + "text": "puerta" + }, + "Bub9ZYygLcly15D7_wYks": { + "text": "amigo" + }, + "ByrvXHEN9Mb8D--7MQAjM": { + "text": "peluche" + }, + "C12mJ1W11fODI3pv1QOnx": { + "text": "gelatina" + }, + "C29KJ8BTFavhj_R9UfnSv": { + "text": "por" + }, + "C2bgADoxmINRnAiYxZHqd": { + "text": "taxista" + }, + "CBTemIvgIN1UAtftkc3sz": { + "text": "pegar" + }, + "CCWCtXdMuQBJRmaFOAlfQ": { + "text": "navidad" + }, + "CY-IQvUehkaiGFCdKf9bf": { + "text": "chorizo" + }, + "CYH_6DL9q1iLLetuWeR9A": { + "text": "tener" + }, + "CZrETqLgQlvDkLHvw1t_w": { + "text": "a" + }, + "C_JKGNCxOI5x_f2C4qAyZ": { + "text": "maní" + }, + "CbO32RkDdf9aCucv6BnGS": { + "text": "cabra" + }, + "ChBc7LjL8dgzZ6LUCAHGh": { + "text": "por favor" + }, + "CkTiaqBY3jf86JRq636lt": { + "text": "¿cuál?" + }, + "CsKZSNiJw5Q48b26Kskf-": { + "text": "heroe" + }, + "CxFmyJYmy6gMRqP9U0cBP": { + "text": "estoy perdido" + }, + "CyKtU9yC0Jy7Ypb4WFp6w": { + "text": "perro" + }, + "D1gCni2jXpCvKZe4qCtQN": { + "text": "peces" + }, + "D2tSkngqbQmdKLNhn9xWV": { + "text": "globos" + }, + "D7dt_hFX5DScV_ssm1nKz": { + "text": "pomelo" + }, + "D85FU-Wqr2u53tfTXAtHo": { + "text": "patalear" + }, + "DAq2J_xXHsSCSNPp9qVsk": { + "text": "oler" + }, + "DBd09yUlbkaYLsemjFXEs": { + "text": "helado" + }, + "DG1RiDjDfwWRhpAiIpPqA": { + "text": "vómito" + }, + "DSgrhLHauub-gBqMGwacO": { + "text": "asustado" + }, + "DXb0FpjVM9q8LVl9vvSHn": { + "text": "clases" + }, + "DXpjgLKTdx9eLLohVdmWM": { + "text": "verdulería" + }, + "D_4Weq7iyi7GMEsgP0xy6": { + "text": "té" + }, + "Djs1QsLNf8Q5LBIFV5zNC": { + "text": "partituras" + }, + "DkeHJFtqAS005fYUrl1Xz": { + "text": "pantalon" + }, + "Dm3yiKSB134LrjtW_KrO7": { + "text": "buen día" + }, + "DqGa4gqd2ABDi45BT43x4": { + "text": "princesa" + }, + "Dv9MSCRYbR4Q3K114wXki": { + "text": "alto" + }, + "E-vUPARie8MmfgZwv3Omr": { + "text": "gallo" + }, + "EM8VyonJ7WNdvmRyE3nhZ": { + "text": "lento" + }, + "EO4O-s7oafi6QJdxTFNkd": { + "text": "anticongestivo" + }, + "ETZNYbrG5wveDl6c9k2_k": { + "text": "codo" + }, + "EUsNyf5bDdSLqvZKH1Ltx": { + "text": "no entiendo" + }, + "EVmt43vDI3NHFfbbkqokF": { + "text": "pizza" + }, + "Erg6LuA8IOQ5V8RTP3pPi": { + "text": "abeja" + }, + "F4cGnA_QHsVKTjUE6MAu9": { + "text": "mameluco" + }, + "F7kJ8VM31BWB4K4T4USzs": { + "text": "maltrato físico" + }, + "F8roVYxKZi88UUGfOvTwl": { + "text": "maestra" + }, + "F90bXbc0tz9nuzTT7SgqV": { + "text": "cuatro" + }, + "FBPIabyaoCK-Y0BziQdji": { + "text": "dolor de panza" + }, + "FBTheEQmZZfJRiYjd_Np_": { + "text": "interpretar" + }, + "FO77qpzyz28knodNtILCA": { + "text": "tirar la cadena" + }, + "FTngK946O8S8bYc0g7vM2": { + "text": "mamá" + }, + "FaVvbVzZivuxTwxJTPubK": { + "text": "hermanos" + }, + "FfNU04I4mZ54gWcBXqo2c": { + "text": "panceta" + }, + "FgTird367surh-vxXyAK6": { + "text": "ticket" + }, + "FkC5DtSV81OvFMU99qZGg": { + "text": "pelota" + }, + "FnCBoLSE19WsbUypUKvFc": { + "text": "hamburguesa" + }, + "Fogupb264IyCtbZ-Q2D6w": { + "text": "borracho" + }, + "Fvm2C5NBq01tm0QK9d9QM": { + "text": "hijos" + }, + "G09TvOzDSG5m3hTQD9Tej": { + "text": "borrar" + }, + "G2i9LSK4A19237Zp1vXqF": { + "text": "gordito" + }, + "G6KKVMvPDnjdD9TfBd-B9": { + "text": "playo" + }, + "GAxX7EIz1TTLtMX08RRGr": { + "text": "hamburguesería" + }, + "GJlUSznzEHCgoAOrVrkp9": { + "text": "feliz" + }, + "GSEumxiyeVKRRiaY_c8HW": { + "text": "crol" + }, + "GY_flM-6uR6X3L4AwsiwU": { + "text": "para" + }, + "G_CRpzxWO5XdEMh01O1eJ": { + "text": "aunque" + }, + "Gj7THa6XFHDfYL5H19lwj": { + "text": "mañana" + }, + "Gm_qAGnL4OawmlYmTs7K5": { + "text": "no veo" + }, + "GoJuWnn72TCXONXKtYHMm": { + "text": "tren" + }, + "Gvmy--9DiUn_tkQYWeWhA": { + "text": "canelones" + }, + "GxrDtsdGcLepdsQr6V9DT": { + "text": "verde" + }, + "H2zMVtjvqi7aUtCypiVKr": { + "text": "sentar" + }, + "H8Bsrr2NK9Q3WGbEp8PMe": { + "text": "plateado" + }, + "H9SWPnWbR8qcZA-iu5Mz0": { + "text": "dolor de Oido" + }, + "HBZNu6m3FELU9eg3OeLdx": { + "text": "cortina" + }, + "HKfLJS8aCBtKuKJeSBQUW": { + "text": "golpe" + }, + "HMPabuHqgtyiCmTLzg-rM": { + "text": "entrar" + }, + "HQiQh4PPBvO1n-d7JGVj8": { + "text": "nadie" + }, + "HTBNWax6FCSGXuboGsVUW": { + "text": "salado" + }, + "HnuZA0UTlnuIfFAN7saxl": { + "text": "conejo" + }, + "Hvb4JdDHX_vNMck_US2UN": { + "text": "ensayar" + }, + "I5AJgba5GTdEjdpFB-LBf": { + "text": "chocolatada" + }, + "IAdQsjTsbBUAMjlwW34cw": { + "text": "me encantaría" + }, + "IEeIvawUD2GIAr1Wypr9i": { + "text": "personas" + }, + "IF3R7tLVAkd4RbL8R07K9": { + "text": "actor" + }, + "IM8OUKCzHwnjAQWPFgnn6": { + "text": "lejos" + }, + "INxOSvKbBNOXwruIpuNho": { + "text": "ombligo" + }, + "IO8uTb1K7ElENgp2ujZoK": { + "text": "robusto" + }, + "IXRWmFmtqfnHQRcBf1Idl": { + "text": "paloma" + }, + "IZbfYRzu2cxxDWdbmQeqw": { + "text": "cabeza" + }, + "Ig1oypuwndODbmKh_NEXs": { + "text": "malla" + }, + "IsWUeiPnDEnzxePKclBNp": { + "text": "feo" + }, + "J3qQMp0OMr5LC9ebfArxH": { + "text": "ninguno" + }, + "J3rDL96c2zfBQzP45VRCp": { + "text": "limón" + }, + "J4UUPR-WP0qo1y14bUVI-": { + "text": "veterinario" + }, + "J7MmgugOu20UtMcMPj59r": { + "text": "canción" + }, + "J7wLwBLVx4UANh_x5HdXd": { + "text": "según" + }, + "JB9SIxWzxWFjrbmMuksrY": { + "text": "reir" + }, + "JBIehRNmDbK2ALcRN0u9i": { + "text": "gallo" + }, + "JBKQaBezKuSDaMsnbJMTB": { + "text": "bar" + }, + "JBU2hMw9gbIy9-wGF4mjD": { + "text": "pizarrón" + }, + "JDbBWMB5No0pK6HvntLt4": { + "text": "lavarme las manos" + }, + "JEDIYq1BDA23ac9TNhON-": { + "text": "ayuda" + }, + "JFldbhjqxK3fD6D2K4HY4": { + "text": "papá" + }, + "JGm4BL7HAfuxX_PGe6Jzk": { + "text": "presente" + }, + "JQOpcZSCPGMOWZsN8w_yb": { + "text": "¿qué hora es?" + }, + "JSFuEHlP-CFvuqvFKMumC": { + "text": "autos de juguete" + }, + "JVtu9W3AumOwjUedwhUGE": { + "text": "rehabilitación" + }, + "JZRBfIXBkeuobtDXbLt5t": { + "text": "adiós" + }, + "JawnUo-pseWb3FDVMtxrQ": { + "text": "yogur" + }, + "JblWXW8TKDCuYu2yTnFBA": { + "text": "mesa" + }, + "Ji5OVFX-uNDewL8eX8Cin": { + "text": "pensar" + }, + "Jjq8CM8JrYHIMziuQy-WN": { + "text": "agenda" + }, + "JziaulL-lrAPGNVvwBPK9": { + "text": "verano" + }, + "K382TlNZjdMLLpAhCCXLG": { + "text": "almendras" + }, + "K6hd20tWZfwwlYYi7jctt": { + "text": "rica" + }, + "K8cMIDL0ubQvWhhDtr65F": { + "text": "llorar" + }, + "K8e2-KkvZfFOQaXnhR37x": { + "text": "cansado" + }, + "KC18_sTEqKucPQ-iwEKYY": { + "text": "lapiz" + }, + "KK_i8H9qTfDVYZkQGwd2v": { + "text": "apagar" + }, + "KNH4sLRpVKtHXQa-0y84K": { + "text": "nervioso" + }, + "KWYVDZiERE8jtRsL0faHH": { + "text": "nadar" + }, + "KXHW4m6vXxQU-AEOR4pZ4": { + "text": "balón de fútbol" + }, + "Khdk8mWpyxgLqfC-6lyT9": { + "text": "burro" + }, + "KhyTKtiL4ZT4Z1saU1eJh": { + "text": "escuchar música" + }, + "Kn9vE07FK1LrzoD_YxrJD": { + "text": "subte" + }, + "KpLFOrpuhFKaIbBbFwVVu": { + "text": "mariposa" + }, + "KrOPANVpdkBWdEZoUwxKf": { + "text": "grave" + }, + "KvY6Taigm4Va_cVjXAfGR": { + "text": "corto" + }, + "L0hfYADgzghRVsZLZHRxE": { + "text": "bailarín" + }, + "L19r487_d3RqWXiNuh3gE": { + "text": "¿qué color es?" + }, + "L6YLAEsbYcTq-ycQJTvt4": { + "text": "pollo" + }, + "LAuEISciEf1Wc1j4fERz8": { + "text": "año nuevo" + }, + "LDoi3cxodn_AVKSG-Bf_1": { + "text": "ojos" + }, + "LEVKlDlJ0wHo5QEjCNAGa": { + "text": "pegamento" + }, + "LEg8z-Q-ONLAAXd-aH_Hb": { + "text": "bajo" + }, + "LNBTW0qQtHYQEHatkWGtc": { + "text": "mercado" + }, + "LRIKzfm9ZsdNe1u7CUuW_": { + "text": "¿cuántos?" + }, + "LRfh-4RAZTj7cnnDwBmqj": { + "text": "flotador" + }, + "LU7IoUksATEBhd8PaHS1R": { + "text": "sacar" + }, + "LaKT8VTw0_6rvordp5-R8": { + "text": "rosa" + }, + "LiBr37yi-YBgQDx4unjyc": { + "text": "dá" + }, + "LjTGOcyG7DkTs1lJqNr8w": { + "text": "cabellera" + }, + "LksmOMPPOMArbrFsscqOW": { + "text": "música" + }, + "LmGq1AZs2a0x26r7E9GUj": { + "text": "maestro" + }, + "LngEMJa_ihV8mB7afZX-h": { + "text": "ellas" + }, + "LrDai7jXlGAdZ3e8ZQezj": { + "text": "hacer pis" + }, + "M5q2CXmK0_WVaVUB_HJB3": { + "text": "caliente" + }, + "MEqo2TROHyroK318sm84f": { + "text": "pasta" + }, + "MKR-ukiUlJy4uuqO30UU6": { + "text": "maltrato verbal" + }, + "MMzjhHID8HMqyPjii5o-h": { + "text": "cocina" + }, + "MNCcHiImRS8tmvhBhzCKj": { + "text": "ensalada" + }, + "MQHnvvU48NnEptP8a9w8C": { + "text": "no me gusta" + }, + "MWIzTM6zhTWL1V-brLtBx": { + "text": "cómodo" + }, + "MYqfOzKx2qMHop8GaHs0I": { + "text": "verde Claro" + }, + "MiOe5_Djf-pE9V9aDZ_1G": { + "text": "ananá" + }, + "MqQgYn5B0uV-DMORCBOmV": { + "text": "triste" + }, + "Mw6WRebMAKWwXfAvDA7vu": { + "text": "tener calor" + }, + "N2baGNTOapSaFDo1GURiW": { + "text": "no escucho" + }, + "N7n4zQIkJZOhaYESk2GgH": { + "text": "caer" + }, + "NFdUTit6Ff-4S7Nzf92U5": { + "text": "estreñimiento" + }, + "NFgGqhEtl0HqipCGGEvwU": { + "text": "peinarme" + }, + "NKQwWPAsVHwFBWuksqfns": { + "text": "ducha" + }, + "NLi5ODIzyMAwr2HpDXACp": { + "text": "nariz" + }, + "NQayjogCYiimP_0OxIfFj": { + "text": "zapatos" + }, + "NVe4u7BTAVfLk3xkDqLnZ": { + "text": "horno" + }, + "NVjfEut567uXpTaQUNI2i": { + "text": "campera" + }, + "N_893wsadpGg3Ip5sEThe": { + "text": "azul" + }, + "NaJxTPq9Ld8I4fwAltyEC": { + "text": "maiz" + }, + "NjulpZ9x63ZqxtLMoRjkx": { + "text": "prender la luz" + }, + "Njz8DrErsexBu8mAI6mnr": { + "text": "pescado" + }, + "NmNouLLx13jzE27jliI_v": { + "text": "diente" + }, + "NuhUikdCxP0NgsbO0wvAU": { + "text": "cola" + }, + "O-CLnVuXAUapOn6TbdhKx": { + "text": "querer" + }, + "O450x4W3OOacvJIy4QicJ": { + "text": "verduras" + }, + "OHyrmD5US1rHEAEwLQaII": { + "text": "animales" + }, + "OKXIGnLh-i1ydTNj450Q8": { + "text": "reina" + }, + "OUcfOOReAfQroBKlBdDb-": { + "text": "solución salina" + }, + "OWLDc7Hn3neBAf_V_N27n": { + "text": "abrochar" + }, + "O_ZfCPZSxGMPT6orCt-O6": { + "text": "chancho" + }, + "OblxxVFC-LKPq-8oC9FpE": { + "text": "sentimientos" + }, + "OdCdTUAlbN6kvsPjby_Bi": { + "text": "deportes" + }, + "OeA63q6LpqGvXW-cJXEym": { + "text": "jamón" + }, + "OeytAsSiEAWC10tXhxbTa": { + "text": "personajes" + }, + "OhrHu-xLo8hcn5plWfoX4": { + "text": "caro" + }, + "Om1Bvqu8nmGuNGwV8hndM": { + "text": "bajo" + }, + "OvyFC1GHkvJZ0dAAF1QkY": { + "text": "él" + }, + "OwHzJdOQTFOA8daCVRwm6": { + "text": "pincel" + }, + "P5zdq4x58yp5TA_soKQEJ": { + "text": "bicicleta" + }, + "PAlC0XSZNru3-LXtfvGjo": { + "text": "hacer el amor" + }, + "PBqpK7LL1HQPwowPitrss": { + "text": "leer" + }, + "PFAi3SdvH9vL7_Bg3MhCA": { + "text": "semáforo" + }, + "PIBHv5VueBi-sf5qFCN_Y": { + "text": "ante" + }, + "PIPQnVS2UiS7kGbucJP8l": { + "text": "curar" + }, + "PLXxIPYyztaztLf4sPCst": { + "text": "garganta" + }, + "PbtM3htZocZb8YifuPoY5": { + "text": "cangrejo" + }, + "PfNLmlHKFT9d1w6IgeXbU": { + "text": "control remoto" + }, + "Pl-M4bc6k2rdhu6FHEbkA": { + "text": "patio" + }, + "PogTYrGfa2WNfBRuA8O4e": { + "text": "malo" + }, + "PszHdOxMsS_tAzSrN52Wa": { + "text": "plastilina" + }, + "Pw3GgPwp7fpDVC6wJjgPn": { + "text": "subir" + }, + "Q6LQqdLcvNOiCFjC0DVo2": { + "text": "tambor" + }, + "Q6nNH4AIoSeDHODC_Ip8O": { + "text": "vecino" + }, + "Q9Ra0aJaQnOJQ1Kqdc43-": { + "text": "bebé" + }, + "QCQRmsQY6AggjreY9Z0MF": { + "text": "rechazar" + }, + "QGf1Tb1roL7HAXUSrRqRJ": { + "text": "naranja" + }, + "QJhkOh48xapiTObEDQLB9": { + "text": "piano" + }, + "QTkFHWp9KEDgfCjoQjBY2": { + "text": "plurales" + }, + "QUTQLuD2Gv7fHh0V_O5tg": { + "text": "avergonzado" + }, + "QVqSPPgA89whFTJ0HTphK": { + "text": "abrir" + }, + "QZNQOaf0SdHDbx1otCmrH": { + "text": "niño" + }, + "QcGJ9u_JqmrW0X47PXWH4": { + "text": "despeinada" + }, + "QclUM2p3iexSjFZI8OU4-": { + "text": "fiebre" + }, + "QeqA20MCXB-zNfuKIssMY": { + "text": "lata de atún" + }, + "QllvOUe8utZrcBRGw_0vc": { + "text": "curita" + }, + "QnlQ1HOEB9yNjuW3Dd6fc": { + "text": "celebración" + }, + "Qo3Qn_nMe3E6EqNw0UdNZ": { + "text": "soleado" + }, + "QohNih4wgqjnpWt3kSwtd": { + "text": "entrenador" + }, + "QvaMxPy-3iixHAJFyIrN-": { + "text": "sandwich" + }, + "R06chAQYswLtQK46OInW7": { + "text": "leche con galletas" + }, + "R9ECa_HQRtpFrb59ebMTQ": { + "text": "escuela" + }, + "RBCjBvNXQSZOOpg-5lBlK": { + "text": "bueno" + }, + "RZfMOtjw0DoGHWaRfCEc4": { + "text": "pantalón" + }, + "Ra2rxEEohwxRqDsW2AT3C": { + "text": "videojuegos" + }, + "RbZetbSC5064rZccOFD1D": { + "text": "televisión" + }, + "RkpoG4KB8m_TJFJf2v3EG": { + "text": "cambiar de canal" + }, + "RwlZ1jr2Ix3evzrW71lN0": { + "text": "manzana" + }, + "S3um53pcko7_BPHy7R6FL": { + "text": "nosotros" + }, + "SE-71I_ahm3oKROReyJHE": { + "text": "hacer caca" + }, + "SOyGnJXLPeVRoZy3vBgpK": { + "text": "examen" + }, + "SXz8iA1Qn_BlgLTAG6Epl": { + "text": "cena" + }, + "SiOmZdwX8Hf2nE2v6HfCp": { + "text": "zapato" + }, + "Sp2Ias_Y1HplkHWjIb7Mp": { + "text": "sin" + }, + "TAbuXSnSHU6C3CQ4kbKVh": { + "text": "triángulo" + }, + "TBV2BhoZVgl1jMV_jWZYi": { + "text": "derecha" + }, + "TIgoS-YONIwzbrImXetaD": { + "text": "ciruela" + }, + "TIsM6aTTZ9W8j6UhW9Qqj": { + "text": "coro" + }, + "TLxsYdrBdHgFZkNJtVTmK": { + "text": "tortuga" + }, + "TP-gGRcpcFyx1SrNRsdRV": { + "text": "perdón" + }, + "TR5CXN8-pfbWkshdxSBSV": { + "text": "oveja" + }, + "TS9z8ZmMEwn0MGSfr9amH": { + "text": "palta" + }, + "TZF-7m8VKZ7IL6pyv0Daf": { + "text": "cepillarme los dientes" + }, + "T_Q5c4XAfkhkclmnCGHo5": { + "text": "hasta" + }, + "Td5pgVQDTFOftUgOJ-bD-": { + "text": "picante" + }, + "Te_jJfeU8Xwa9St2RihBq": { + "text": "sangre" + }, + "ThqkHs4az5tgLqLcfFPaZ": { + "text": "largo" + }, + "TpPNZLsh5jrN9RdPFwmA7": { + "text": "¡genial!" + }, + "Tpj-Fs8LQ566TM0bYlZ6H": { + "text": "viernes" + }, + "TuAjBKPp3-PSdQuooSWZi": { + "text": "rana" + }, + "TyqVzfOniQNa9WKQRXqr-": { + "text": "hermana" + }, + "U1KQsrvTa2E00-ugc-Iy6": { + "text": "ausente" + }, + "U6PoeH-cMdO3ttnLkN7_3": { + "text": "cabalgar" + }, + "U7GiGcYacowWi4MWrCYyj": { + "text": "antiinflamatorio" + }, + "UQ-5wOfR0tDzljoDjj2xU": { + "text": "otoño" + }, + "UQ5B5K-tpk1XmQC1B9TjQ": { + "text": "no" + }, + "US8_vYTnDfxBw2Ung_J38": { + "text": "partes íntimas" + }, + "UVzdJiqY36fqgBYyz880c": { + "text": "jamón crudo" + }, + "UXJDiwb3j_zyfGa26ByJL": { + "text": "pecho" + }, + "Ubaq6h7wasdP_YRombm2c": { + "text": "azúcar" + }, + "Ugs9V9c2c5iHrVC6p17zr": { + "text": "analgésico" + }, + "Uk1Emn5IovsTfFzpQX5Jw": { + "text": "sosten" + }, + "UkLF5sKtVKW0D8RzVCoue": { + "text": "bombero" + }, + "UnQJwWfWCe40DJYR1Er0o": { + "text": "dolor" + }, + "UssSOEEKutvzB_B4fAQE-": { + "text": "escuchar de nuevo" + }, + "Ust3oadA0PUGViYo28Mf3": { + "text": "caminar" + }, + "UvRS0KmtZn3dq7e8L5RcE": { + "text": "enojado" + }, + "UwvZVcX_CAQFrI6U4LsNT": { + "text": "huevo" + }, + "VJ9AU_y7CqsONR6TvhdLh": { + "text": "¿dónde es?" + }, + "VKrLGgYjc-nLPGsyESDgb": { + "text": "canario" + }, + "VL4pd0vnJ-CNfMg9bCNed": { + "text": "aspirina" + }, + "VUJ-zrdsyL9MOuFbdMCAx": { + "text": "mareo" + }, + "Vioyf8EXJfY5t34NnN0WO": { + "text": "tablet" + }, + "Vjlet5P7XuqTrc22nt_Zz": { + "text": "agua" + }, + "Vmnu5eormo-_TOCgF4YzG": { + "text": "jarabe para la tos" + }, + "VoZumy5GtnRdqSOmXAw7j": { + "text": "preparado" + }, + "VrC7AnovfA7VzmYESVc8L": { + "text": "conversar" + }, + "VwZ4EKSggYWxlnAbp-pNB": { + "text": "enfermo" + }, + "Vzov0z9acB-I1_W_CcFcY": { + "text": "rojo" + }, + "WDUIQV43zghFQq_rSk1Z4": { + "text": "churrasco" + }, + "WL3ZN-W_zgnuTJpuqz0YQ": { + "text": "príncipe" + }, + "WNhpmD_XlTaNEBo7GsFXu": { + "text": "diarrea" + }, + "WQ0CNIQ_gjaCxg4tEIsOo": { + "text": "clavado" + }, + "WRzleD-mI84LaimFH8h6P": { + "text": "escuchar" + }, + "WUt3I-NkdbqlSVcwuLfFx": { + "text": "patines" + }, + "WWK2v56LM-zWqujabk9bM": { + "text": "plástica" + }, + "W_f7h3qOLl2uEd_OYpMfQ": { + "text": "policía" + }, + "WasZ5bKZZy5Jt4Y-JipxS": { + "text": "bikini" + }, + "Wgh5iCzUmx4Je-B85-pra": { + "text": "heladera" + }, + "WjXQhSFPpz42ZUyHvurYG": { + "text": "grillo" + }, + "WtYSntcy2CijEORmROeaj": { + "text": "un cuarto" + }, + "Wu47Qs6Zupu1Ox2gUhkxn": { + "text": "cuarto" + }, + "Wva5W8GA0dHzyt2_0FPdm": { + "text": "hermano" + }, + "X0-Tf-KR24qEkpGDzG2Z-": { + "text": "ayer" + }, + "X3u4pXTWKcGc43lOkgSBt": { + "text": "cumplimiento" + }, + "XA952Z60D0-cesNCVA-OX": { + "text": "chau" + }, + "XC5fIljJ819OYpllYTjpE": { + "text": "jirafa" + }, + "XN0nzhQyHVOhuYuNqrp8g": { + "text": "durazno" + }, + "XOoGN6huCjVHxH8hRFAw1": { + "text": "blanca" + }, + "XY6ZCNzeJIEzLtWJcufJm": { + "text": "camiseta manga larga" + }, + "XYY8SV1IAMHjdGjMZxbdy": { + "text": "cancha" + }, + "XeVaDdUWSEkhfJvTVvUHR": { + "text": "salir" + }, + "XnocVMEeUGCSnlnusP44O": { + "text": "agarrar" + }, + "XuAtFop5_JNSYiZkUBzaU": { + "text": "cocinar" + }, + "Y5HQq_4crSF2lpwH-KUrt": { + "text": "dos" + }, + "YCu-B26PqjE30AhikHdkI": { + "text": "dibujos animados" + }, + "YIP0Xc4aJsfv0s8BpiQnn": { + "text": "cinco" + }, + "YLKXFZ9ze9K9NvJiAx8w0": { + "text": "¿qué?" + }, + "YbrNtdUmyMNdAF5CfvY1A": { + "text": "toalla" + }, + "YbvMRsCtMbww8OQgF45QF": { + "text": "resfrío" + }, + "YeT-jstVSA7-mD9t99Isg": { + "text": "rompecabeza" + }, + "YusWY8GwdO43bSp1o3BWC": { + "text": "molesto" + }, + "Yvxm8RGoFYKUsIXOl33yR": { + "text": "apagar la luz" + }, + "Z5-sBklfLIWE00CJ_T_ZK": { + "text": "cuchara" + }, + "Z8xp3kxXuhMVoNm7ddQSX": { + "text": "lanzar" + }, + "ZA2C4bJaL90lBxsTemYWZ": { + "text": "piscina" + }, + "ZAnmv4CLb7hldYUlp2wJU": { + "text": "ninguno" + }, + "ZBIFtTq-BH1jv5jLbzrhj": { + "text": "repetir" + }, + "ZQEXAf10BkoTvCJx3Ox39": { + "text": "sorpresa" + }, + "ZR-NXJk3SD351W-95cf_T": { + "text": "pintar" + }, + "ZRYQmYRGKzheBqk11eGRZ": { + "text": "ballena" + }, + "Zm4OIanIKTigDGIsInO7o": { + "text": "un supermercado" + }, + "ZnMba2r4XIg9lPi_H2d_Z": { + "text": "sí" + }, + "_1lOt0C0MQhvU8QWC6_oZ": { + "text": "buenas noches" + }, + "_2SjbH-xHZq173EU4J65c": { + "text": "parque" + }, + "_3ihCSMQCokXNo8pXii-h": { + "text": "llamar a alguien" + }, + "_8RIOebHpkr9nCy0_9qhP": { + "text": "llamar" + }, + "_CsJMxqGcNSaujXwRZcpu": { + "text": "ansioso" + }, + "_FNTsoEjTMV3Uas-gggi2": { + "text": "estrés" + }, + "_HUf6SR0mTP7v72Y9_4gw": { + "text": "coche de bomberos" + }, + "_Lc2-NNL69ZX-aVnUNzgx": { + "text": "frutilla" + }, + "_S9Eck14cdOTr0QH4i7sQ": { + "text": "cuarto de baño" + }, + "_WIT6qs1kaiJqB1Ild5Xs": { + "text": "paseo" + }, + "_eug92AvR1UXpYlfm6o_Q": { + "text": "dorado" + }, + "_hqTU9A7I3RFDVrcIEK-L": { + "text": "%null%" + }, + "_lU200bb9Sjv0b_iJKgU2": { + "text": "una bicicletería" + }, + "_tDZtalMxKSNpWydJ1aeW": { + "text": "cero" + }, + "aC_XP9Ch5PqWoCmcJwI77": { + "text": "algodón" + }, + "aMs2YNnWkw4XN0gAm-jI3": { + "text": "cajón" + }, + "aP9QisUdxhgOKIQ2kHNb3": { + "text": "acelga" + }, + "aSzpwNza22HZp46Sh6wfx": { + "text": "súcio" + }, + "aTwzShtP_zR9x6bSGSzEB": { + "text": "muslo de pollo" + }, + "aXLBXkENJqTYkyZOP8TNS": { + "text": "tú" + }, + "aa3xDW6F9YUKyX0fe5uX8": { + "text": "espaldas" + }, + "ajesFjbC7hwCNLKdif-ix": { + "text": "contra" + }, + "ak5fBauJzapC4JIf0lT8N": { + "text": "cerro" + }, + "alsoa_V3wz3vPpG1TKRZc": { + "text": "transportes" + }, + "amk4WRd1sNEIp24pnFw8j": { + "text": "rodilla" + }, + "armmpopt2RLsVDlqLrQ94": { + "text": "restaurante" + }, + "atVEXuftxSiDDj8rzUlFg": { + "text": "crayones" + }, + "atWxG3KTHB5moW1dylLJc": { + "text": "juguete" + }, + "avzcTznCsQCISYJsLC-w_": { + "text": "notas musicales" + }, + "b1XpSC0ndnm0ZewNXC3pp": { + "text": "carnicero" + }, + "b5OdBMMzkf1FlQbUR5-m7": { + "text": "servilletas" + }, + "b9Y5MrR-jn8fh77gAkLZy": { + "text": "pintar" + }, + "bAoK85XLNb7p0ebevYZ6O": { + "text": "mirarme al espejo" + }, + "bDnuS19hfd9GhJ-6rjNPD": { + "text": "estar" + }, + "bFodvUraUhJeq4waMdlxv": { + "text": "domingo" + }, + "bNJfccUvG2DQfR1iZP3eR": { + "text": "serpiente" + }, + "bVN3R44VuZDw3IdQMolca": { + "text": "cambiar" + }, + "beNprvNb0UztxR4JLxDFm": { + "text": "cumpleaños" + }, + "bge6qR6NzsD5Vk4ifPsSO": { + "text": "ketchup" + }, + "bpSuQQRlIcSse40OAxNSG": { + "text": "lunes" + }, + "bqjKW_qBtRzIThWxdZx2s": { + "text": "gafas de sol" + }, + "buyy_2ydocKoi9TnBhZ1N": { + "text": "amiga" + }, + "bw3rqHXD1TJ53xbNggEqH": { + "text": "desayuno" + }, + "c7kK5ROVbO3DHrwSFEawq": { + "text": "dulce" + }, + "cI0JxwhkWU-YA7E7rmJtp": { + "text": "cuello" + }, + "cJMQi3SVmqvWJ00VxI6gy": { + "text": "¿cómo estás?" + }, + "cJw2i319mzBUpEfBRDxc9": { + "text": "pez" + }, + "cJzHrV_PsV-PwwyFN9jka": { + "text": "%null%" + }, + "cS3g4KXf39akVFHCG5AwL": { + "text": "camión de juguete" + }, + "cTiw7_Yjxu_Kg90q7PdYl": { + "text": "gripe" + }, + "cb0rJJEYOeEoRU5fDdQQq": { + "text": "el" + }, + "ccGASDOGtty6GfQMEEBEU": { + "text": "tres" + }, + "cj6OuVw4Nob8jxP-E4rZc": { + "text": "cambiarme la ropa" + }, + "cnyLFMkJu2i3cqOY0e9kl": { + "text": "pasas" + }, + "curstMeuThu2KUph-8rkB": { + "text": "jugar con" + }, + "cxMNBGV3LytDXgwDMCiga": { + "text": "violeta" + }, + "d4zNoj2BAFG9B7J3KAlLE": { + "text": "botones" + }, + "d6s8fLFBiQ3KEJlNdJfUW": { + "text": "un poco loco" + }, + "dHM0qnbmtJAkZY0WBsqaY": { + "text": "lila" + }, + "dLHDzm0rfgL-vXTx14HSm": { + "text": "buscar" + }, + "dNvN5P787hAPE7ZYNgwkw": { + "text": "pasear" + }, + "dR72liRxC3qmoSa6Dz2a2": { + "text": "jarabe" + }, + "dS-KyYREUQIk7sDlmsvoa": { + "text": "cerca" + }, + "d_I8jNfbkQD0CHgZn7hyB": { + "text": "camisa" + }, + "dgm3NCKuz7L39PX8LYxj7": { + "text": "juguetes" + }, + "djgKI9embnk95PAtFcn45": { + "text": "cambiarme el pañal" + }, + "dn41o5K_1fo-qHO-YLoQn": { + "text": "sábado" + }, + "dnXsSOeVG7mq37uciIi2J": { + "text": "recreo" + }, + "e5sCl246xFMESEfFy2PhX": { + "text": "coche" + }, + "e5un1yrIuZHQi048e5kD6": { + "text": "alfajores" + }, + "e8zl_ecIloo4Vk-OZPJWe": { + "text": "jugar con la tablet" + }, + "eDX2HSkGaY2TeVwPjR07S": { + "text": "fácil" + }, + "eGJ8MC1xPE6ueF82jCmVg": { + "text": "cepillar" + }, + "eKJCZc-kD0-m6cVLorFzO": { + "text": "pera" + }, + "eWSI1NInbQowtO99phhGA": { + "text": "boca" + }, + "eZEqRZjRK8JJMsfHo4Y7w": { + "text": "del" + }, + "ebo03xnkyiHD2pKUKULmr": { + "text": "dibujos animados" + }, + "ecUOs24Pp5ZTRt_ZvED5W": { + "text": "acompañar" + }, + "eduqLSyC3m4uB1Oee6dt6": { + "text": "mitad" + }, + "eji-M2j5eHkG71DCksleY": { + "text": "huevo duro" + }, + "emm_RirDsO30Enax5Q4gd": { + "text": "con" + }, + "eo3Q5AjHJz5kp1EbdALwh": { + "text": "ustedes" + }, + "eoYtISVZl3mdwoE_HW-Mv": { + "text": "guitarra" + }, + "et1KiL5-zob_EcGlj7tLN": { + "text": "despues" + }, + "f2dl12fMZbRdQ7STpcTdk": { + "text": "fútbol" + }, + "fF3ijeQzetfSn6EGcs1yY": { + "text": "cerezas" + }, + "fL_4POdbPVL9-lvQVWSqY": { + "text": "avión de juguete" + }, + "fNAlqbgrpirQZO_LhrkXY": { + "text": "primavera" + }, + "fNv4Nb6Vafxk0JxXr-iDo": { + "text": "investigar" + }, + "fUUj_4pKPflmJlxZfk0cX": { + "text": "discoteca" + }, + "ff7ES190q1dmFYZ7lo6x0": { + "text": "pan blanco" + }, + "fjCOcN-PKP6F07IZcI71X": { + "text": "plaza" + }, + "fkNwVm56PSe-qh-QoM0vm": { + "text": "allá" + }, + "fk_z_HrvcUh8XIq8D6gQP": { + "text": "nueces" + }, + "g1Cj6HW8kg8yPE1XX9pxa": { + "text": "desde" + }, + "g1TLUpuQX2Zs1ob9gqYui": { + "text": "gorro" + }, + "g2MhHawoIC9oFNEv5_w63": { + "text": "vida" + }, + "g2sQSxCcoZuKJ3TabK6oT": { + "text": "vino" + }, + "g75y4E53ViakV-s5UfnIF": { + "text": "equipaje" + }, + "gFEnqFhYoXF7QN-n0ONad": { + "text": "montaña" + }, + "gYrIz3R13-BC_pYcvQ9BL": { + "text": "invierno" + }, + "gaem1LHTtfQdnnqYi-sOm": { + "text": "billetera" + }, + "gff2FqDlgXknRld7YMLWl": { + "text": "entero" + }, + "gsU8pE9ozhR73xS2icwJ0": { + "text": "libro" + }, + "gvPwrzDSSEPwcxY878T_c": { + "text": "gato" + }, + "gzCjycNS8Cf0vNlo1klji": { + "text": "molesto" + }, + "gzb-RNDLMNkgk9wnPILJi": { + "text": "abuela" + }, + "hAZhogJSH3bL1iL237N8J": { + "text": "pochoclos" + }, + "hDvpMlPw-chcuxEisBJTl": { + "text": "castañas" + }, + "hKJhXxultsxm0TJl1P8-L": { + "text": "chau" + }, + "hOyjT1JgOYB-mGLFMaNJR": { + "text": "dolor de pecho" + }, + "hT3Lrjn5-q7YIM1loG4MN": { + "text": "parlante" + }, + "hUYfE_vmNBT_7E60YZsSu": { + "text": "pintura" + }, + "hWWOw1gWjWwN7wQJkHrTu": { + "text": "tour" + }, + "hXgGhazQ_nA5uqpRD6Qwq": { + "text": "ganar" + }, + "hmhAUgqvGp7nc1w25sRSx": { + "text": "esperar" + }, + "hwzwfMyJsvB42F_QWQWyi": { + "text": "jugo de uva" + }, + "hyUaYltGVJU-wRrAjhhPa": { + "text": "cantante" + }, + "i0wB--S4sdL8Q4H9b93UY": { + "text": "ácido" + }, + "i2mlV3zGS6nrH2l6N2BlZ": { + "text": "trompeta" + }, + "iAqItRUQL_YpbMn2pgjsA": { + "text": "pizzería" + }, + "ibtmTEP3QGDY8TyVLteuX": { + "text": "blando" + }, + "ifd0M0pAlFm7aPt1A0ze_": { + "text": "amar" + }, + "iiA1u1JKRmhe2jWVE_W79": { + "text": "amigos" + }, + "iimGxVoFWlq_THThR3vmF": { + "text": "noticias" + }, + "ijn-QwQuTxRFFVe-7WlSX": { + "text": "picazón" + }, + "iowxE4MxcV6PR2Uhtvxqs": { + "text": "hospital" + }, + "irbOv2dHA7G969dnJMfJn": { + "text": "cuaderno" + }, + "islCzqFq1SYrZAh63dLhQ": { + "text": "huevo frito" + }, + "j5xZZev5nTNa-p088Oqnp": { + "text": "besar" + }, + "jBqD3qhhcrioLlCU-xq5b": { + "text": "instrumentos musicales" + }, + "jOALQbfxdXmJVyY6P5gZG": { + "text": "damasco" + }, + "jTEb3A5ZEKEy2ojuq2vO_": { + "text": "hueso" + }, + "jeO9YZ22LfSObUNhQDRAz": { + "text": "ventana" + }, + "jfly9fZ3x1da4SGCCNcV2": { + "text": "bufanda" + }, + "jfvreGZv-e8rD4-01wZ5H": { + "text": "venda" + }, + "jhJ2TOfdaRAcVeHGOjwua": { + "text": "leche" + }, + "jmzg4EiC7JEHwe9gNP3C3": { + "text": "arroz" + }, + "jpKPg3hn6_GO1HSkeLNGz": { + "text": "niña" + }, + "jprAsdXWGQKPlUWwgBBot": { + "text": "película" + }, + "jtKc2q2n5an342ZkiMB9R": { + "text": "higiene personal" + }, + "k-iDOTk5uO7ZK5OB3v8It": { + "text": "viejo" + }, + "k41gkf6A_bDtQAJDOrWpP": { + "text": "pasta de dientes" + }, + "k7dZhQtwDPFlOk1iPjEOz": { + "text": "subir volumen" + }, + "k8tJx6PikRcnVuZEqrXRM": { + "text": "viajar" + }, + "k9ZpWM4oRb1q20c0qWCsg": { + "text": "abrigo" + }, + "kDzHKO8eIwNsyKWDw7M0c": { + "text": "uva" + }, + "kIn8SeGURyvu49EsRqDs7": { + "text": "pijama" + }, + "kN85Lb_C4dLnww7sz1afK": { + "text": "café" + }, + "kaiWPbXxjHXlqcpBaBp4l": { + "text": "viajar" + }, + "khUUL_1JQGngApqBRDh_q": { + "text": "arreglado" + }, + "kpghvJtujlt4vPI2N6vsg": { + "text": "o" + }, + "kxuGlfYjS6puO2xD1QvxO": { + "text": "vamos" + }, + "lKA4b7I3iFkqNzPcAXyBc": { + "text": "cocinero" + }, + "lKMW_xTZzCrCHRcGp-Z-n": { + "text": "galleta" + }, + "lR84gCk8OM-oYoLAV7tar": { + "text": "timbre" + }, + "lXH68vGIuZdfA8xVrS8iw": { + "text": "mucho" + }, + "l_ncJLRdVGBzzQc9yqBqs": { + "text": "banana" + }, + "lrUuPKco_O8FXDuclzpKE": { + "text": "necesitar" + }, + "m0434KkjeTv8SGN7WxR2C": { + "text": "negro" + }, + "m0Fkio76HZHS2HguPOTn5": { + "text": "seis" + }, + "m17b6MazSk6M4gb51_cCy": { + "text": "pulmones" + }, + "m39xTdgaenoi4mWGEa-Ew": { + "text": "plato" + }, + "m3qTT8tiGZQheKIWREzMT": { + "text": "ir a" + }, + "mC9Nb7zVdEUpjEBODw_gL": { + "text": "vos" + }, + "mFfylZ8yoLvtkVSDTlVEN": { + "text": "pomada" + }, + "mJqzbxYeIDQciPkeHA1Ao": { + "text": "cuchillo" + }, + "mK4AXXhoIVirBz5dr_xLA": { + "text": "pavo" + }, + "mRK--C5Q1aGe8MMPJJLYi": { + "text": "preocupado" + }, + "mTklFAI-FVVLsMKoASZ7T": { + "text": "desconocido" + }, + "mWXxPPvhSHf9hyb-VyuZH": { + "text": "e" + }, + "mZFwH8xY_OeVDWCdvPZBy": { + "text": "pie" + }, + "miPmA2tOQiLxOW7D_V_x6": { + "text": "cubos" + }, + "ms97ZsgQOvD-Z8qpSW4oN": { + "text": "¿quiénes?" + }, + "mx6dmRLXA_lkN1QlP71vq": { + "text": "todas" + }, + "n5bZClAB6jXAZnwxIwH-1": { + "text": "tostada" + }, + "nK7DRpxalLBHL9OnRjSim": { + "text": "frambuesa" + }, + "nMQUtS-kFHViOKyop1FdS": { + "text": "vincha" + }, + "nQSk6_KCEVdO7oC_uxLXN": { + "text": "oreja" + }, + "nQdbkRVcwpQB_hFNPbe6M": { + "text": "caballo" + }, + "nUg2M7p5sUPlGdbBev2-G": { + "text": "tobillos" + }, + "nm6e_s01gWHzdVj25BHyq": { + "text": "¡qué lindo!" + }, + "nnTJQMJWfd2nuTSlFNEOy": { + "text": "mío" + }, + "ntzBlFkDMTKEUHoGNc65u": { + "text": "baño" + }, + "o0oxaoUFpOLiGsoQBlalI": { + "text": "torta" + }, + "oAxNCJufVUqZMyWRGdZl9": { + "text": "tuyo" + }, + "oEHzYcfxDGGcsL-deud1j": { + "text": "snack" + }, + "oEyUWrQj1iYUnlEUdQQ5Z": { + "text": "flauta" + }, + "oO21zLMEtHEakvnuTohLu": { + "text": "¡qué divertido!" + }, + "oOkD8Wmvb4t9I2EWqT1Nr": { + "text": "amargo" + }, + "oSBFO8Ka0PN4bgX0QuWxL": { + "text": "viajar en auto" + }, + "oYwoiRDWlIjSTbYdC2vG6": { + "text": "falda" + }, + "oa-MShota2L8n2pU8hIsm": { + "text": "jugar" + }, + "okr5oAG2U8Er1XwQ8XbWD": { + "text": "grande" + }, + "oqQWeoWBr5N0LrPGY62Og": { + "text": "senos" + }, + "otTWzTaTAmweNCozT8tn9": { + "text": "alergia" + }, + "p1qK47wwLwF8S0Fy8-2Mt": { + "text": "mano" + }, + "pHBnmCFpM7oZf0O78CBIz": { + "text": "golosina" + }, + "pM-bC77hbj-w44A0HFRDZ": { + "text": "sonarme la nariz" + }, + "p_XyUXRmeUk_bdjRTMtkz": { + "text": "revistas" + }, + "p_qpVEd677b2Bk56yhvj6": { + "text": "jardín" + }, + "paPpjw1XVC9-6xcueJsrY": { + "text": "todos" + }, + "pgPlWKk-oww2fua5zYuue": { + "text": "mono" + }, + "phZ4F4uzi1TrhjeDMuMsn": { + "text": "almohada" + }, + "pkuppr1jMH7SMpa2hrIWQ": { + "text": "jugo de durazno" + }, + "pliNY9oMQh1iSidkEhhDO": { + "text": "abrazar" + }, + "pptyFMhLrbC6lN6zmc7D0": { + "text": "comedor" + }, + "ptQZXjMQyXWycUD1kAkQo": { + "text": "cuento" + }, + "pv8eYkxczIevQqEGwDz6V": { + "text": "mochila" + }, + "pvXSy-5M4i8kysUppvdME": { + "text": "que" + }, + "pwltOTDn2OyABTlD4-27W": { + "text": "verduras" + }, + "px0jKQDj7r9pOYs4ZrvcT": { + "text": "tomate" + }, + "q22wRFF21EigV8YzQ_MfV": { + "text": "¿me ayudas?" + }, + "q6F-qJ7mTxvwa43F6vwun": { + "text": "escondidas" + }, + "q7Pz4UqqZUlXeFfXrwXDR": { + "text": "enjuagar" + }, + "qA4v2JWQU0zzBBZgvW7Vt": { + "text": "temblores" + }, + "qOsbXyvBTMDAwvvnI0iFn": { + "text": "pequeño" + }, + "qU5IvFLD8d16iIHSs_9TM": { + "text": "cebolla" + }, + "qWhpDTMd8eAEoq7yTKc57": { + "text": "calzón" + }, + "qYA2U_BFOZtFLClxuCIBJ": { + "text": "dolor de muelas" + }, + "qeJdrxKIIcUctIjo8wWhc": { + "text": "aguda" + }, + "qn-7ERrcZxJTqfW6hwNs8": { + "text": "correr" + }, + "qsA1zm1DOlItK7DCWzAw8": { + "text": "aburrido" + }, + "qscoBbrWu7tQbpNj9XUPt": { + "text": "papel higiénica" + }, + "quE_RA9abVvtG-Fo4Jx8f": { + "text": "diez" + }, + "qy3c7gvRU7shWuJYr1kBk": { + "text": "bebida" + }, + "r7eJgCF_b_ktkztv4-oda": { + "text": "medias" + }, + "r808IO3I6j3os_uix6O63": { + "text": "juegos de salón" + }, + "r9qUBQwgY8eycnU2OVey0": { + "text": "comer un sándwich" + }, + "rBwDn3PcJGqytqnOZTJMV": { + "text": "taxi" + }, + "rMFGfzFobfGsH3_qrLHXU": { + "text": "pescado" + }, + "rU9cpWF0I4wnJjzTXpGtO": { + "text": "hoy mismo" + }, + "rgyV6CvFe98OGnWut6QCZ": { + "text": "turista" + }, + "rlGO5jGKPL1vW-VF4nRqZ": { + "text": "entrada" + }, + "rnjJyPTabH_Xpmy4Z4O3U": { + "text": "celebrar" + }, + "rtHwq5WN9KElX3V3SKBmS": { + "text": "papas fritas" + }, + "rwyX2YemNEx_Mh64IArDQ": { + "text": "oscuro" + }, + "rxdfuk6egO7VmZEB3JrUN": { + "text": "la" + }, + "ry_jOegpMf4nB3spGf4d2": { + "text": "me gusta" + }, + "s0BXoyn7AqUAlZ9BOHY6S": { + "text": "tríste" + }, + "sAsTkky29uEVC9vo3Ofbo": { + "text": "brazo" + }, + "sDKIldL3tit328Joneo_7": { + "text": "vaso" + }, + "sFNUgvnglgrm6cbYiM0di": { + "text": "¿cuándo?" + }, + "sP6uvKmY5kA_yuYR8H21c": { + "text": "halloween" + }, + "sPtazVgymXESdS-BcHqU_": { + "text": "pollería" + }, + "sSTGRl6DpYGZXp8vtTNbm": { + "text": "comprar" + }, + "sbv5HLPUR6gHo-EJR2S7S": { + "text": "camello" + }, + "sc0hr3jQ80yXRFDlAn56V": { + "text": "cansancio" + }, + "sixdpB8hTOhlUr4loz3RB": { + "text": "muñeca" + }, + "sjGytpiPjwqJfPaRUJ-Iw": { + "text": "miércoles" + }, + "sysOciGqtL7y4ULuyYVc-": { + "text": "canal de cocina" + }, + "t-w8e69GwxLyfxlWwHk9f": { + "text": "mermelada" + }, + "t34TbvjJ3zG2jcgJaCeHa": { + "text": "tocar" + }, + "tGyUfSljuc7A5Do5B9GuN": { + "text": "sweater" + }, + "tQwMPLvqAMAstcqvnOERE": { + "text": "gris" + }, + "tWxC4hR6di5zQC-Hujlev": { + "text": "bajar volumen" + }, + "tYwEpd2EOtH8wEUr-jwHk": { + "text": "caro" + }, + "tw1doIY-jFPofZjlPFj4z": { + "text": "¿cómo te llamas?" + }, + "txj22hip0CE9qp_z-daIK": { + "text": "nebulizador" + }, + "u1nIt_oFH426g1IVhlYk5": { + "text": "sediento" + }, + "u2e4Zh8qwJF7zKkohQ8df": { + "text": "goma de borrar" + }, + "u3BufiTZTK6AylGh80ZFd": { + "text": "ella" + }, + "u8HfFvMPkogdWk-URj9hv": { + "text": "escribir" + }, + "uDg7Yy86PlwsAd-U96vJR": { + "text": "arriba" + }, + "uFoytOG4qsXzBk979t63y": { + "text": "limpio" + }, + "uMhOF9ZvWnjW-Zrjbjfhs": { + "text": "bajar" + }, + "uOA82KFAVtjoYRTuYFgpr": { + "text": "postre" + }, + "uPL5NMeXTmD1iU6ZoiROu": { + "text": "pájaro" + }, + "uYElWOlSOSoQap-d5gsYF": { + "text": "chocolate" + }, + "uZRwbLa1lEG7ol0UJKRBj": { + "text": "viejo" + }, + "ubP5GM7_0vPkRc6zbD9Ez": { + "text": "antiácido" + }, + "uiVc5R86QCZkhraEFlrNz": { + "text": "museo" + }, + "ujyHgmlPIs7UdtndbYd8S": { + "text": "amistad" + }, + "upWXctTSKBtFNSXnXDK_u": { + "text": "frutas" + }, + "uzSwgQNnV8ZrjxpN5Bz_a": { + "text": "difícil" + }, + "v-E2GE1DpCkNAxsfA0f4M": { + "text": "goma" + }, + "vHzfvEgIkQ0e73ryfWP2F": { + "text": "ordenar" + }, + "vKGLQIas9RdBnPGsaYtr2": { + "text": "cometa" + }, + "vOgqHjpHgrUGERIHtVqDe": { + "text": "basurero" + }, + "vPicdKLrhT2wmAAPPukKP": { + "text": "veloz" + }, + "vPnmrsRou1ihosdVXS_Op": { + "text": "zapatitos" + }, + "vZ9JaTnoj8C0ILYxMNB73": { + "text": "calabaza" + }, + "vaYJPAsTRvslo2qFOJt60": { + "text": "lomo" + }, + "vazatQ7CrYJFsorVDC5AC": { + "text": "león" + }, + "viAHJeLRr_6j9dEi5klj_": { + "text": "amarillo" + }, + "vlh1Pa6eA0ZrBs3vHzWH7": { + "text": "oso" + }, + "vmb_RMIB20QND6VcS0deY": { + "text": "panza" + }, + "vq3T-UQGTjX3Z9TlEF12e": { + "text": "mayonesa" + }, + "vy-O5Zc5kxY8d-7RROvQI": { + "text": "jamón" + }, + "w4cVxbBDZjeNyHwpBARHQ": { + "text": "hombro" + }, + "wBLnDZStKj8YLkg2pTCfh": { + "text": "sentir" + }, + "wCGb6D4xSVr4UeKXzGIlP": { + "text": "disfraces" + }, + "wcpXeLMBRusfqfrz9s4mF": { + "text": "puré" + }, + "whHwNRVnqeM7BMx6nppiW": { + "text": "tigre" + }, + "wkrNPLGWTqMIy4PJRW9QR": { + "text": "en" + }, + "wnfSUkF8-tQiRTVou1_pd": { + "text": "frío" + }, + "x3PNiU1NIeQ3zQa31C8WX": { + "text": "pañal" + }, + "xGsyYCjDzQugVzSaK8CuA": { + "text": "duro" + }, + "xIgPo3N-aKXhVcjultMiY": { + "text": "factura" + }, + "xPUYlxRxgFVn1FHQFz6Ic": { + "text": "secar" + }, + "xQblStUfyBGO27j15Sda3": { + "text": "pato" + }, + "xT4BPNmF-5WAQLfs3cUpS": { + "text": "enamorado" + }, + "xXtjQktuAq1bmxTc0HSQT": { + "text": "gaseosa" + }, + "xbPnUL4qxvm30VFYNphh-": { + "text": "tíos" + }, + "xiaTdHGInqfm4rD6XzSeZ": { + "text": "encender" + }, + "xnPF8fvkC1TvgETI1JcC9": { + "text": "órganos" + }, + "xqGzZJIHBeVfSzRfm3rmg": { + "text": "uno" + }, + "xxr0MRGYRmmoNC_gsD9uy": { + "text": "pasaporte" + }, + "y0SViQxW8Y-yiX1Z7gXWt": { + "text": "superhéroe" + }, + "y5W21CKOkLWnYJo1OC700": { + "text": "tos" + }, + "yJoivIPHOm1Y1lj-hGN1J": { + "text": "dormir" + }, + "yNag8CK0wV_iRMnFznsXk": { + "text": "pelota" + }, + "yR9FTtOimFwZG5g5tgpRk": { + "text": "visita" + }, + "y_5OURnKxFcv4UiMKntUi": { + "text": "y" + }, + "yihsjW9ON0Fr9Yy4ZlP9c": { + "text": "axila" + }, + "yk2wDVqHEKKwupgm87OJ2": { + "text": "nalgas" + }, + "yo00Ci8bSRFYPU6HxGVwX": { + "text": "cantar" + }, + "yqlmoVGItXqaeazw3M3eg": { + "text": "sillón" + }, + "yvtvSsBLhabkcpeYGbxQr": { + "text": "bota" + }, + "yxa6QVSrmWUKH2PZHKaVl": { + "text": "lechuga" + }, + "zANp2EnhT6n0Jcl1Xra6K": { + "text": "bailarín" + }, + "zAmesi1FcIWLXE3WVa9WS": { + "text": "antihistamínico" + }, + "zRTTg5x_P1E8Z3CU-oWXa": { + "text": "cualquiera" + }, + "zcibOHpRbSmz1hVNSjPTj": { + "text": "tenedor" + }, + "zdFC3vpgjcyUWB9a4ghRW": { + "text": "descripción" + }, + "zi_wcT10fxgn72ZJhVx18": { + "text": "vestido" + }, + "zm_6R89hr4wjuVkifiYrk": { + "text": "despeinado" + }, + "zrR1DbO_szgKvxLyrZquw": { + "text": "calefacción" + }, + "zw-o9pDectP5bxFnUjrJO": { + "text": "chancho" + }, + "zxhRDSHXtV63Sp3c2fjrI": { + "text": "aduana" + }, + "-k6dUC6thWPyULq8MVSe6": { + "text": "PRONOMBRES" + }, + "0geft4arn_A8kL-rfUPYc": { + "text": "PERSONAS" + }, + "1aM3sTxyb8yLSWtkn2MoO": { + "text": "INSTRUMENTOS MUSICALES" + }, + "384rVetrrLX4x4pJ0Y0Na": { + "text": "INTERACCIONES SOCIALES" + }, + "4e6iVOPLAjnM6wCMUm5P4": { + "text": "DESAYUNO Y MERIENDA" + }, + "6vmRBH4shBk3UQEUM6APX": { + "text": "CINE Y PELÍCULAS" + }, + "7Jm3bDhPInSlwhdy20dKF": { + "text": "CLASE DE ARTE" + }, + "7ngCuvmAnM_7ygpFQgLpk": { + "text": "COLORES" + }, + "7w5ACMFdOCTkBrS911MA1": { + "text": "ADJETIVOS Y ADVERBIOS" + }, + "8FPdnkMzOIBVTW5-TQxWX": { + "text": "PERSONAJES" + }, + "8t8CAggTj3HuznkKhfXle": { + "text": "LIBRO DEL RESTAURANTE" + }, + "9JRv4X68pAtwsFT3Ss0iJ": { + "text": "LIBRO DE NATACIÓN" + }, + "ByBvBUS7dcXldjzZOVFFP": { + "text": "CUERPO" + }, + "C7ClEHF5-Mcico4FvRxEV": { + "text": "PREPOSICIONES" + }, + "GD9YHeLktSsdZQvcoua6x": { + "text": "LIBRO DE LA CARNICERÍA" + }, + "HzPl-HvsrXL_QkGT38Ohd": { + "text": "LIBRO DE VERDULERÍA" + }, + "JKEk5TYykBK6ZeYND3Ron": { + "text": "CONJUNCIONES" + }, + "LWyfHr8Oui5HIShtZ_huo": { + "text": "FRUTAS" + }, + "PYTnUqCLwAbngR2Ozroc2": { + "text": "ACCIONES" + }, + "QQszyYRLL-otCQtRfbLzm": { + "text": "TIEMPO" + }, + "V6K3TniptOApMMGa8TspR": { + "text": "TODO" + }, + "VhfGFlHDcPor996rCzoK9": { + "text": "CELEBRACIONES" + }, + "WZYuZd331Hm5gHXJtUmBN": { + "text": "ANIMALES" + }, + "ZgZoyOg5K-LscXdfl6kQG": { + "text": "CLASE DE MÚSICA" + }, + "_Cw7FcJSYiterkLSDJH8V": { + "text": "CASA" + }, + "ah257x5jssDmLIOrcSGn6": { + "text": "NÚMEROS" + }, + "berI6X2_pAVCNOrcHAL6y": { + "text": "SENTIMIENTOS" + }, + "ce2z_EeEG2nH0ZS4KVAkA": { + "text": "COLEGIO" + }, + "dQXaeM3Uul1yEvRwJ4w9t": { + "text": "VESTIMENTA" + }, + "ejXQZAiYjrcSFGXb1pz7M": { + "text": "TRANSPORTE" + }, + "gybgILOLxmIVfeQtb1f94": { + "text": "LIBRO DE HIGIENE" + }, + "iHS1HpUBBadzgmbum_bdD": { + "text": "PROFESIONES Y OFICIOS" + }, + "jatDsecioVAxRph-WOg4f": { + "text": "LIBRO DE LA FARMACIA" + }, + "puOOrKWbYzH0B_8uGkxYX": { + "text": "LIBRO DE VIAJE" + }, + "puda9fUGjqvm9oSM6CpTk": { + "text": "ALIMENTOS" + }, + "rH7zhJzNVIcEIRyvaYLoi": { + "text": "DEPORTES" + }, + "uv4tWMRHfewaEQ_pH0dnV": { + "text": "LIBRO DE LA SALUD" + }, + "wAhDHMrZ850dHTwgAXrMY": { + "text": "CONCEPTOS" + }, + "xjfPlDs-AcFV9LCyY-v9j": { + "text": "JUEGOS Y JUGUETES" + }, + "y545pM8pvB3WgukIac6NT": { + "text": "LUGARES" + }, + "zwf7qmSEi7PBwsNaqciA-": { + "text": "libro de la biblioteca" + } +} \ No newline at end of file diff --git a/assets/languages/pictos_fr.json b/assets/languages/pictos_fr.json deleted file mode 100644 index fc67ae28..00000000 --- a/assets/languages/pictos_fr.json +++ /dev/null @@ -1,8338 +0,0 @@ -[ - { - "id": 0, - "texto": { - "en": "", - "fr": "" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_action_previous.webp?alt=media&token=a6feccd4-fd34-4b5a-ac1d-a5f027551d44" - }, - "relacion": [ - { - "id": 377, - "frec": 26 - }, - { - "id": 643, - "frec": 17 - }, - { - "id": 628, - "frec": 11 - }, - { - "id": 632, - "frec": 1 - }, - { - "id": 388, - "frec": 1 - }, - { - "id": 389, - "frec": 1 - }, - { - "id": 614, - "frec": 3 - }, - { - "id": 623, - "frec": 1 - }, - { - "id": 44, - "frec": 4 - } - ], - "agenda": 0, - "gps": 0 - }, - { - "id": 1, - "texto": { - "en": "escort", - "fr": "escorte" - }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_acompanar.webp?alt=media&token=dcd36ffa-bfb6-412e-a368-d6a60815e93b" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 2, - "texto": { - "en": "turn off", - "fr": "éteindre" - }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_apagar_television.webp?alt=media&token=d4967332-d189-4df5-ba33-ae4ccfc9b400" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 3, - "texto": { - "en": "turn the volume down", - "fr": "baisser le volume" - }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_volumen_menos.webp?alt=media&token=a96a4d6a-55fc-4b35-87f3-6e5a995efabc" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 4, - "texto": { - "en": "erase", - "fr": "effacer" - }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_borrar.webp?alt=media&token=8141651f-d10e-41c3-800e-ebcd444f0665" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 5, - "texto": { - "en": "search", - "fr": "chercher" - }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_buscar.webp?alt=media&token=ee3aa171-1a16-4563-a8c5-a9c4c32c8748" - }, - "relacion": [ - { - "id": 996, - "frec": 1 - } - ], - "agenda": 0, - "gps": 0 - }, - { - "id": 6, - "texto": { - "en": "sing", - "fr": "chanter" - }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_cantar.webp?alt=media&token=b0a7dbc5-47be-4c86-a6be-9811415ce329" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 7, - "texto": { - "en": "change", - "fr": "changement" - }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_cambiar.webp?alt=media&token=c5512652-c864-4bf1-bce2-3b6cd0290462" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 8, - "texto": { - "en": "change channel", - "fr": "changer de chaîne" - }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_cambiar_canal.webp?alt=media&token=bb216f15-f686-4f31-ba31-c20dc370a538" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 9, - "texto": { - "en": "change diapper", - "fr": "changer diapper" - }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_cambiarpanal.webp?alt=media&token=42b1f845-854d-4b29-aaf9-f228302deb64" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 10, - "texto": { - "en": "change clothes", - "fr": "changer de vêtements" - }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_cambiarropa.webp?alt=media&token=2493ba44-ec6a-4811-8960-c3d9bebc608f" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 11, - "texto": { - "en": "brush my teeth", - "fr": "brosser mes dents" - }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_cepillar.webp?alt=media&token=5025fba1-67ca-4c00-b61c-18fcee7fbacf" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 12, - "texto": { - "en": "eat a sandwich", - "fr": "manger un sandwich" - }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcomer_un_bocadillo.webp?alt=media&token=051a6f68-0ab9-40fb-90fe-03eedefc72ef" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 13, - "texto": { - "en": "buy", - "fr": "acheter" - }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_comprar.webp?alt=media&token=9d2bdbfc-8e58-4d9b-a7e5-47eea780fc37" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 14, - "texto": { - "en": "give", - "fr": "donner" - }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_dar.webp?alt=media&token=792b74d2-9da1-4fc2-9c21-14fdae807a67" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 15, - "texto": { - "en": "draw", - "fr": "dessiner" - }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_dibujar.webp?alt=media&token=caaec230-be41-40f5-b252-45ef3027ece1" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 17, - "texto": { - "en": "turn on", - "fr": "allumer" - }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fencender_la_television.webp?alt=media&token=de8e299d-f53d-40cd-a04f-4d3e5614d84c" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 18, - "texto": { - "en": "write", - "fr": "écrire" - }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_escribir.webp?alt=media&token=56300bbc-6082-4d71-bdae-4e7ae02540d1" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 19, - "texto": { - "en": "listen again", - "fr": "écoute encore" - }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_de_nuevo.webp?alt=media&token=925fbdb2-67aa-48d8-b023-5c8bd8dcbc75" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 20, - "texto": { - "en": "listen to music", - "fr": "écouter de la musique" - }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_escuchar_musica.webp?alt=media&token=258720fc-5ba7-44e4-b03e-2b3575a56784" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 21, - "texto": { - "en": "listen", - "fr": "écouter" - }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_escuchar.webp?alt=media&token=768c54e4-d18b-463f-9cf4-e5c6e9d715b9" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 22, - "texto": { - "en": "be", - "fr": "être" - }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_estoy.webp?alt=media&token=d46357be-23e9-44e0-8fd5-430f9542c817" - }, - "relacion": [ - { - "id": 133, - "frec": 2 - }, - { - "id": 205, - "frec": 1 - }, - { - "id": 204, - "frec": 1 - }, - { - "id": 181, - "frec": 1 - }, - { - "id": 272, - "frec": 1 - }, - { - "id": 274, - "frec": 1 - }, - { - "id": 819, - "frec": 1 - }, - { - "id": 831, - "frec": 1 - }, - { - "id": 119, - "frec": 1 - } - ], - "agenda": 0, - "gps": 0 - }, - { - "id": 23, - "texto": { - "en": "wait", - "fr": "attendez" - }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fesperar.webp?alt=media&token=c877c0c0-b425-4f97-8650-7b5c22b5c0c2" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 26, - "texto": { - "en": "win", - "fr": "gagner" - }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_ganar.webp?alt=media&token=07cd9657-3510-44de-9bdd-16544b5bf73f" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 28, - "texto": { - "en": "do", - "fr": "faire" - }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_haciendo.webp?alt=media&token=d3b4e1aa-97d0-41a3-aa83-aa8004ce75f2" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 29, - "texto": { - "en": "pee", - "fr": "pipi" - }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_hacerpis.webp?alt=media&token=4ce82c9c-7cf8-4d10-808f-e06ca0aec6fb" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 30, - "texto": { - "en": "go", - "fr": "aller" - }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fir.webp?alt=media&token=087da971-16b1-4d6c-855c-f7481e0840db" - }, - "relacion": [ - { - "id": 653, - "frec": 1 - }, - { - "id": 118, - "frec": 1 - } - ], - "agenda": 0, - "gps": 0 - }, - { - "id": 31, - "texto": { - "en": "wash hands", - "fr": "laver les mains" - }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_lavamano.webp?alt=media&token=7c486791-926b-4813-8697-d96615f9a1c6" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 32, - "texto": { - "en": "read", - "fr": "lis" - }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fleer.webp?alt=media&token=2008ecda-fb99-4cfd-be06-3ac1cb1d2100" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 33, - "texto": { - "en": "call someone", - "fr": "Appeler quelqu'un" - }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_llamaralguien.webp?alt=media&token=1bc21620-5b70-467f-9680-9d18d15f30e5" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 34, - "texto": { - "en": "play", - "fr": "jouer" - }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_jugar.webp?alt=media&token=aba130c0-3439-4bcb-97b2-80adaaa645b5" - }, - "relacion": [ - { - "id": 996, - "frec": 4 - }, - { - "id": 761, - "frec": 4 - }, - { - "id": 848, - "frec": 2 - } - ], - "agenda": 0, - "gps": 0 - }, - { - "id": 35, - "texto": { - "en": "look at the mirror", - "fr": "regarder dans le miroir" - }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_espejo.webp?alt=media&token=64b31994-8493-4f77-b978-dff642f1e685" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 38, - "texto": { - "en": "take a walk", - "fr": "faire une promenade" - }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_pasear.webp?alt=media&token=8ce622f4-a514-462a-bdb1-792e0c85863b" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 39, - "texto": { - "en": "comb", - "fr": "peigne" - }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_peinar.webp?alt=media&token=f97dbc62-edb3-434f-8139-f4f40401caf4" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 41, - "texto": { - "en": "lose", - "fr": "perdre" - }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_perder.webp?alt=media&token=6262e1ba-75d3-4a44-b365-8ed676102c8e" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 43, - "texto": { - "en": "paint", - "fr": "peindre" - }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_pintar.webp?alt=media&token=5dd94837-f3fb-4f86-a82d-03cc7dff54bf" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 44, - "texto": { - "en": "want", - "fr": "vouloir" - }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_quiero.webp?alt=media&token=0012395e-71a4-453f-aafb-d58c0ebf70b6" - }, - "relacion": [ - { - "id": 118, - "frec": 3 - }, - { - "id": 34, - "frec": 7 - }, - { - "id": 29, - "frec": 2 - }, - { - "id": 11, - "frec": 1 - }, - { - "id": 31, - "frec": 2 - }, - { - "id": 39, - "frec": 3 - }, - { - "id": 10, - "frec": 1 - }, - { - "id": 35, - "frec": 2 - }, - { - "id": 5, - "frec": 2 - }, - { - "id": 30, - "frec": 2 - } - ], - "agenda": 0, - "gps": 0 - }, - { - "id": 49, - "texto": { - "en": "have", - "fr": "avoir" - }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_tengo.webp?alt=media&token=860f02bc-61ee-4fb7-a120-53a15e5b59a7" - }, - "relacion": [ - { - "id": 177, - "frec": 1 - }, - { - "id": 597, - "frec": 3 - } - ], - "agenda": 0, - "gps": 0 - }, - { - "id": 51, - "texto": { - "en": "drink", - "fr": "boisson" - }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fbeber.webp?alt=media&token=95642655-8bd4-47d7-8222-0244e7491598" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 52, - "texto": { - "en": "hug", - "fr": "étreinte" - }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fabrazar.webp?alt=media&token=e60acc80-b7b7-4ee6-a0ff-f81b6ee5fda3" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 53, - "texto": { - "en": "open", - "fr": "ouvrir" - }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fabrir.webp?alt=media&token=f4eef053-9555-4bc5-9c98-027004815311" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 54, - "texto": { - "en": "hook up", - "fr": "brancher" - }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fabrochar.webp?alt=media&token=ee1e45ea-b017-4dec-ac58-eafea2d644f5" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 57, - "texto": { - "en": "love", - "fr": "amour" - }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Famar.webp?alt=media&token=4080adb7-3ce9-4759-864c-7f676f3a95b1" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 61, - "texto": { - "en": "get down", - "fr": "descendre" - }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fbajar.webp?alt=media&token=2247bc63-785c-4290-87ee-93ca136dbed3" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 64, - "texto": { - "en": "kiss", - "fr": "baiser" - }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fbesar.webp?alt=media&token=ac69b6b5-e23a-4199-a576-88196d37ca01" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 65, - "texto": { - "en": "ride", - "fr": "balade" - }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcabalgar.webp?alt=media&token=54b54202-50bf-4472-8768-e14da82265ab" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 66, - "texto": { - "en": "fall", - "fr": "tomber" - }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcaer.webp?alt=media&token=5bdb209f-082b-442d-82bb-429359e504d1" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 68, - "texto": { - "en": "close", - "fr": "Fermer" - }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcerrar.webp?alt=media&token=ee470cae-e15f-4522-a0ae-2434efc3f2fc" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 69, - "texto": { - "en": "grab", - "fr": "saisir" - }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcoger.webp?alt=media&token=a2949664-3aa3-43f7-bf88-eafb8818bc53" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 70, - "texto": { - "en": "run", - "fr": "courir" - }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcorrer.webp?alt=media&token=a4439f93-1f23-4bbe-ac63-b0a26711da1d" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 71, - "texto": { - "en": "cut", - "fr": "Couper" - }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcortar.webp?alt=media&token=0d88cafb-a552-4dec-b675-ccc9f3c5f5ee" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 76, - "texto": { - "en": "get in", - "fr": "entrer" - }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fentrar.webp?alt=media&token=f968b6e8-3694-4813-9b97-644e0e630826" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 78, - "texto": { - "en": "make love", - "fr": "faire l'amour" - }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fhacer_el_amor.webp?alt=media&token=f7e8141e-8325-4564-bcc4-7c75e59152a9" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 79, - "texto": { - "en": "smell", - "fr": "odeur" - }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fhusmear.webp?alt=media&token=e1bdad48-76a9-4de9-9246-a0d9e60c8c2d" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 81, - "texto": { - "en": "investigate", - "fr": "enquêter" - }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Finvestigar.webp?alt=media&token=30a04dc5-cd12-4eaf-bb84-690f12b997ee" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 82, - "texto": { - "en": "play with the tablet", - "fr": "jouer avec la tablette" - }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fjugar_con_la_tablet.webp?alt=media&token=9e30d1b6-ab88-463f-a30f-c1d4b199dcdc" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 85, - "texto": { - "en": "look", - "fr": "Regardez" - }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fmirar.webp?alt=media&token=e4a59c5c-b538-4074-8e97-4e08a1b5a6d2" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 86, - "texto": { - "en": "swim", - "fr": "nager" - }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fnadar.webp?alt=media&token=d861abe6-d581-4cf9-97d7-24f56578e504" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 87, - "texto": { - "en": "take a walk", - "fr": "faire une promenade" - }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpasear.webp?alt=media&token=1de7c440-8578-45bf-8d39-dd1b6d8a40d9" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 88, - "texto": { - "en": "beat legs", - "fr": "battre les jambes" - }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpatalear.webp?alt=media&token=30c83c44-61e3-45d0-82d2-8ff832657153" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 90, - "texto": { - "en": "paint", - "fr": "peindre" - }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpintar.webp?alt=media&token=02634a91-0bef-46f5-b8a7-561d1fca2b33" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 92, - "texto": { - "en": "put", - "fr": "mettre" - }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fponer.webp?alt=media&token=f21e413f-f1d6-4d6c-bf94-b825fa5badb2" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 93, - "texto": { - "en": "reject", - "fr": "rejeter" - }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Frechazar.webp?alt=media&token=3b1e10e1-25a3-445c-a302-63a3ea2ad511" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 94, - "texto": { - "en": "laugh", - "fr": "rire" - }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Freir.webp?alt=media&token=d6341292-b530-4e2e-9423-c187996470f0" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 95, - "texto": { - "en": "repeat", - "fr": "répéter" - }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Frepetir.webp?alt=media&token=14874d12-fd73-4cfc-a27f-09c987a04b33" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 97, - "texto": { - "en": "take out", - "fr": "sortir" - }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fsacar.webp?alt=media&token=c7e6ed51-5ff9-42a1-b3b7-dabf51ddf266" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 98, - "texto": { - "en": "go out", - "fr": "sortir" - }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fsalir.webp?alt=media&token=8b81f386-fd97-42bb-8ef8-87814b1148c9" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 100, - "texto": { - "en": "dry", - "fr": "sec" - }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fsecar.webp?alt=media&token=a1539795-90ff-4aaa-b26c-a58016b7683c" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 101, - "texto": { - "en": "seat", - "fr": "siège" - }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fsentar.webp?alt=media&token=ea6097b0-55a0-45f9-b85e-df3ea858158d" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 103, - "texto": { - "en": "blow your nose", - "fr": "mouche ton nez" - }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fsonarse_los_mocos.webp?alt=media&token=53e05413-9fd2-451b-86f6-4d953cf4abed" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 104, - "texto": { - "en": "go up", - "fr": "monter" - }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fsubir.webp?alt=media&token=0d1f10bf-924a-4ac0-bbb5-e2269d8fa39c" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 107, - "texto": { - "en": "travel", - "fr": "Voyage" - }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fviajar.webp?alt=media&token=ccfef1e5-8011-4c79-8b69-f2b136b1b0b9" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 108, - "texto": { - "en": "travel by car", - "fr": "Voyage en voiture" - }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fviajar_en_auto.webp?alt=media&token=fc534378-43da-411b-a070-c9e8dc5cab52" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 112, - "texto": { - "en": "clean", - "fr": "nettoyer" - }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Flimpiar.webp?alt=media&token=a68c1cfd-0df4-4ab2-a733-536631bb3080" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 113, - "texto": { - "en": "heal", - "fr": "guérir" - }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcurar.webp?alt=media&token=f975cb51-cc90-4f59-a3c2-e8b4dff82501" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 116, - "texto": { - "en": "travel", - "fr": "Voyage" - }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fviajar.webp?alt=media&token=ccfef1e5-8011-4c79-8b69-f2b136b1b0b9" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 117, - "texto": { - "en": "touch", - "fr": "toucher" - }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ftocar.webp?alt=media&token=d6a78a59-63c8-423c-b0ec-59c3ece6da56" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 118, - "texto": { - "en": "eat", - "fr": "manger" - }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcomer.webp?alt=media&token=c2db19af-5cd9-4b28-8786-bec02bec2e95" - }, - "relacion": [ - { - "id": 474, - "frec": 1 - }, - { - "id": 504, - "frec": 3 - }, - { - "id": 494, - "frec": 1 - }, - { - "id": 515, - "frec": 1 - }, - { - "id": 478, - "frec": 1 - } - ], - "agenda": 0, - "gps": 0 - }, - { - "id": 119, - "texto": { - "en": "dull", - "fr": "terne" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_aburrido.webp?alt=media&token=e307839a-58fe-4c57-8f59-9ede484d2c53" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 121, - "texto": { - "en": "scared", - "fr": "effrayé" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fasustado.webp?alt=media&token=adba1b85-d3aa-44c6-80a2-873d8bc7806e" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 122, - "texto": { - "en": "acid", - "fr": "acide" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Facido.webp?alt=media&token=472e6bbd-dc9b-4ab1-86f1-8f66dea4e558" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 123, - "texto": { - "en": "tall", - "fr": "grand" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Falto.webp?alt=media&token=f8bf46a1-c6c6-409b-98e9-ee795ee15de8" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 124, - "texto": { - "en": "anxious", - "fr": "anxieux" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fansioso.webp?alt=media&token=c9934785-ceaa-438b-9e02-cc0e49d25aef" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 125, - "texto": { - "en": "grieved", - "fr": "attristé" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fapenado.webp?alt=media&token=1121ff0c-c2e7-4119-bc3e-a03a393f264b" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 126, - "texto": { - "en": "fixed", - "fr": "fixé" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Farreglado.webp?alt=media&token=f71281ba-0a11-4f1e-9eee-fe0fbe34d2ae" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 129, - "texto": { - "en": "absent", - "fr": "absent" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fausente.webp?alt=media&token=b83de519-06a7-40ef-bc2c-3e7256275e24" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 130, - "texto": { - "en": "short", - "fr": "court" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fbajo.webp?alt=media&token=6f4344d4-866a-4a2d-b33b-ef7f658e6521" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 131, - "texto": { - "en": "cheap", - "fr": "pas cher" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fbarato.webp?alt=media&token=d088ad6b-3126-4ab3-af01-82ee565df5cf" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 132, - "texto": { - "en": "soft", - "fr": "doux" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fblando.webp?alt=media&token=075e9135-a115-4836-acde-c098d21cc4a4" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 133, - "texto": { - "en": "good", - "fr": "bien" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_estoy_bien.webp?alt=media&token=11f656c5-d219-43b5-93e7-09f9697f2d65" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 134, - "texto": { - "en": "drunk", - "fr": "ivre" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fborracho.webp?alt=media&token=b0478e6a-157b-4109-be3e-64f64b926815" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 135, - "texto": { - "en": "nice", - "fr": "agréable" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fbuena.webp?alt=media&token=622125ee-a972-4419-8aac-3fc01c70f437" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 136, - "texto": { - "en": "nice", - "fr": "agréable" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fbueno.webp?alt=media&token=ce7bc25a-b814-43f3-a0e4-f89925cc3a40" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 137, - "texto": { - "en": "tired", - "fr": "fatigué" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_cansado.webp?alt=media&token=0485b40d-800e-4ae8-8f1a-af38ab2c79b7" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 138, - "texto": { - "en": "expensive", - "fr": "coûteux" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcaro.webp?alt=media&token=bf0e37f5-b5e2-4f91-824f-e9644af0dc4f" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 139, - "texto": { - "en": "hot", - "fr": "chaud" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcaliente.webp?alt=media&token=1a683cf4-d621-4bf1-9fa5-419c3a699a94" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 140, - "texto": { - "en": "hot", - "fr": "chaud" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcaliente_cosa.webp?alt=media&token=85612726-a786-41f7-aa5e-169ec0f86b6d" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 141, - "texto": { - "en": "warm", - "fr": "chaud" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcaluroso.webp?alt=media&token=1e1aa29c-b682-42ec-abd9-610d903fa020" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 144, - "texto": { - "en": "expensive", - "fr": "coûteux" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcaro.webp?alt=media&token=bf0e37f5-b5e2-4f91-824f-e9644af0dc4f" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 147, - "texto": { - "en": "clear", - "fr": "clair" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fclaros.webp?alt=media&token=c1fd7615-c8ca-496f-99aa-d869de08e27f" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 149, - "texto": { - "en": "comfortable", - "fr": "confortable" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcomodo.webp?alt=media&token=8d46e93a-b3aa-46e8-8726-80b097f612b1" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 153, - "texto": { - "en": "quarter", - "fr": "trimestre" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcuarto.webp?alt=media&token=745ef84d-1934-48bc-a279-657b1d63c7d7" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 156, - "texto": { - "en": "unkwown", - "fr": "inconnu" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fdesconocida.webp?alt=media&token=e8545797-ce84-463d-8c9c-97b39c5d9a03" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 158, - "texto": { - "en": "tousled", - "fr": "ébouriffé" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fdespeinada.webp?alt=media&token=dd507db6-7f92-40cb-982d-47e4fa9381c3" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 159, - "texto": { - "en": "tousled", - "fr": "ébouriffé" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fdespeinado.webp?alt=media&token=8c85ff0d-8102-40e3-a09d-9fc4a0ebf2f1" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 161, - "texto": { - "en": "funny", - "fr": "drôle" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fdivertido.webp?alt=media&token=2efe9347-c828-4946-bd51-d84815185caa" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 162, - "texto": { - "en": "hard", - "fr": "difficile" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fduro.webp?alt=media&token=f20a39e0-6a1e-4ac5-9735-cea0cc23bd2c" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 164, - "texto": { - "en": "in love", - "fr": "amoureux" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fenamorado.webp?alt=media&token=4c7e4801-3d0d-4a28-8faf-747e2087b6af" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 165, - "texto": { - "en": "full", - "fr": "plein" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fentero.webp?alt=media&token=0007ed58-3331-4cac-accf-7a00491abac0" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 167, - "texto": { - "en": "angry", - "fr": "en colère" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_enojado.webp?alt=media&token=0cf1e573-341e-4f1c-a2b1-8e407b6f2ea3" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 171, - "texto": { - "en": "happy", - "fr": "content" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ffeliz.webp?alt=media&token=6e0556fc-0825-4e02-a428-758ac7a42686" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 172, - "texto": { - "en": "ugly", - "fr": "laid" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ffeo.webp?alt=media&token=323fb303-2787-4186-afc7-7281bee66317" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 177, - "texto": { - "en": "cold", - "fr": "du froid" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ffrio_cosa.webp?alt=media&token=d1f315da-7d2b-4894-9123-83e69a3bf671" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 178, - "texto": { - "en": "chilly", - "fr": "froid" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ffrio.webp?alt=media&token=9b56d164-cb41-47b9-9281-de7bc09aafc4" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 179, - "texto": { - "en": "chilly", - "fr": "froid" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ffrio_bebida.webp?alt=media&token=aab2a538-aeff-41f7-bbac-97c164d2a5a6" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 181, - "texto": { - "en": "happy", - "fr": "content" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_feliz.webp?alt=media&token=9ec37b34-ac24-4da9-b90d-e4f23f727358" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 194, - "texto": { - "en": "irritated", - "fr": "irrité" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Firritado.webp?alt=media&token=67d39162-7ffc-40cf-869d-4ce59cc9d1e8" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 199, - "texto": { - "en": "lean", - "fr": "maigre" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Flimpio.webp?alt=media&token=47decee5-b701-48b3-876f-58900d8270f8" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 200, - "texto": { - "en": "nice", - "fr": "agréable" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Flindo.webp?alt=media&token=b708bf7e-50e2-4d1c-89d6-ebbb7ec92e81" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 203, - "texto": { - "en": "bad", - "fr": "mal" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fmalo.webp?alt=media&token=0c04538d-6ffb-4edf-8097-7e4b69d8d87c" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 204, - "texto": { - "en": "so so", - "fr": "Comme ci comme ça" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_estoy_masomenos.webp?alt=media&token=f18a2305-333c-4b02-bcc2-8dac84c0f56c" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 205, - "texto": { - "en": "bad", - "fr": "mal" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_estoy_mal.webp?alt=media&token=cbd50a8b-74cc-48ac-b1c3-c3accf49bc62" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 207, - "texto": { - "en": "annoying", - "fr": "ennuyeux" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fme_molesta_el_ruido.webp?alt=media&token=1614de99-ce1d-4536-b826-7e79108d0526" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 208, - "texto": { - "en": "half", - "fr": "moitié" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fmedia.webp?alt=media&token=810240c1-a6a0-4c66-972f-9201c730dd4c" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 210, - "texto": { - "en": "equals", - "fr": "équivaut à" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fmismo.webp?alt=media&token=afcd67dc-37f1-4ee6-8651-4776cdccb259" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 212, - "texto": { - "en": "upset", - "fr": "dérangé" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fmolesto.webp?alt=media&token=f7186ab0-583a-43da-9d07-ec34822ed0ed" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 213, - "texto": { - "en": "a lot", - "fr": "beaucoup" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fmucho.webp?alt=media&token=6566212e-9051-411c-8825-a88189a218ad" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 217, - "texto": { - "en": "nervous", - "fr": "nerveux" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fnervioso.webp?alt=media&token=7bd9407c-d980-42bc-bd0d-3b0b49bb0baa" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 218, - "texto": { - "en": "none", - "fr": "aucun" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fa.webp?alt=media&token=3e8a5652-be09-49bc-9bfa-3511eebfd9e8" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 219, - "texto": { - "en": "cloudy", - "fr": "nuageux" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fnublado.webp?alt=media&token=35741aaa-92c9-44b7-baae-3fa886348ac9" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 233, - "texto": { - "en": "few", - "fr": "peu" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpoco.webp?alt=media&token=1d232fd6-f131-48b3-9457-7d8310e9c88e" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 234, - "texto": { - "en": "few", - "fr": "peu" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpocos.webp?alt=media&token=3db8f233-9a11-47b3-9894-9cde18678671" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 237, - "texto": { - "en": "worried", - "fr": "inquiet" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpreocupada.webp?alt=media&token=c7ee4743-cca8-4478-a69e-ea2393a5a0b1" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 238, - "texto": { - "en": "ready", - "fr": "prêt" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpreparado.webp?alt=media&token=20acd627-34f7-4115-9a7a-37245ed069ce" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 242, - "texto": { - "en": "wealthy", - "fr": "riches" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Frica.webp?alt=media&token=1b58ab93-2b20-44fb-999d-ee76b1d32e66" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 244, - "texto": { - "en": "sturdy", - "fr": "solide" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Frobusto.webp?alt=media&token=a3e17c83-5cf6-468a-a5fb-6c0fb7dc62ea" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 245, - "texto": { - "en": "chubby", - "fr": "joufflu" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Frollizo.webp?alt=media&token=513c2520-3ebb-4a01-9652-471b147ab87e" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 248, - "texto": { - "en": "salty", - "fr": "salé" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fsalado.webp?alt=media&token=64004dbf-110a-4faf-8ab0-ea27d30dcd54" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 253, - "texto": { - "en": "thirsty", - "fr": "assoiffé" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fsed.webp?alt=media&token=3c0d95f9-623a-43d6-bccd-b15697ab4d6e" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 256, - "texto": { - "en": "sunny", - "fr": "ensoleillé" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fsoleado.webp?alt=media&token=cd13634a-16d4-4ca1-80d7-6937f0c63e50" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 263, - "texto": { - "en": "dirty", - "fr": "sale" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fsucio.webp?alt=media&token=7e883539-03c3-4d06-b22f-26c417886cec" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 267, - "texto": { - "en": "all", - "fr": "tout" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ftodos.webp?alt=media&token=694aae8b-22c8-4274-b9f1-b3bbdd15d061" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 268, - "texto": { - "en": "all", - "fr": "tout" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ftodas.webp?alt=media&token=dcdb7025-41d9-4230-8871-51612bf8bfec" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 272, - "texto": { - "en": "sad", - "fr": "triste" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_triste.webp?alt=media&token=8f49d913-1dbb-48df-a07b-614fa3188ad8" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 274, - "texto": { - "en": "crazy", - "fr": "fou" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_loco.webp?alt=media&token=ad86fdf3-5b8c-4af1-aed0-81052e3a6c96" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 280, - "texto": { - "en": "shamefaced", - "fr": "honteux" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fvergonzante.webp?alt=media&token=0d7f7e5e-3e27-468b-bcac-663410387c39" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 281, - "texto": { - "en": "old", - "fr": "vieux" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fviejo_cosa.webp?alt=media&token=501e0dae-62bd-44e2-9025-f1aa3008c602" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 282, - "texto": { - "en": "elderly", - "fr": "personnes âgées" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fviejo.webp?alt=media&token=da1f540c-5a60-4370-8804-d4bd7bc8a114" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 283, - "texto": { - "en": "bee", - "fr": "abeille" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fabeja.webp?alt=media&token=c6b4cea3-73ad-40e2-a7ce-2c897667eda7" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 286, - "texto": { - "en": "animals", - "fr": "animaux" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fanimales.webp?alt=media&token=a9f8b76e-61ab-4c70-aef4-ec4e6549da60" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 288, - "texto": { - "en": "donkey", - "fr": "âne" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fasno.webp?alt=media&token=78f9eab7-8cfa-402f-b6b6-457dc3bf8594" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 290, - "texto": { - "en": "whale", - "fr": "baleine" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fballena.webp?alt=media&token=89bbc0a0-5fb0-4102-b5b4-16f1e3f429f6" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 293, - "texto": { - "en": "horse", - "fr": "cheval" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcaballo.webp?alt=media&token=9c065f9b-ca24-4eb0-b76c-7e505e8f0b44" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 294, - "texto": { - "en": "goat", - "fr": "chèvre" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcabra.webp?alt=media&token=6e21add4-63cb-424b-8b67-913ba96b509b" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 296, - "texto": { - "en": "camel", - "fr": "chameau" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcamello.webp?alt=media&token=d06d45dc-4b22-4d06-9312-6a9b5cc8bf02" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 297, - "texto": { - "en": "bird", - "fr": "oiseau" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcanario.webp?alt=media&token=a5c74e04-d7d8-44a2-8ef6-3b418cb088f5" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 298, - "texto": { - "en": "crab", - "fr": "Crabe" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcangrejo.webp?alt=media&token=39083c10-717e-4ac4-80ed-0b213978884b" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 299, - "texto": { - "en": "snail", - "fr": "escargot" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcaracol.webp?alt=media&token=69284140-729e-4e25-918c-9d544a7f7426" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 301, - "texto": { - "en": "pig", - "fr": "porc" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcerdo.webp?alt=media&token=741f2ba1-fe2a-43b2-be72-3a7f30f861d8" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 310, - "texto": { - "en": "cock", - "fr": "coq" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fgallo.webp?alt=media&token=f7eeb656-0122-4522-a795-630b90749f8a" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 313, - "texto": { - "en": "cat", - "fr": "chat" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fgato.webp?alt=media&token=49aa560c-4b75-4bba-84dd-7829fec81abe" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 314, - "texto": { - "en": "cricket", - "fr": "criquet" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fgrillo.webp?alt=media&token=74055068-db86-47f3-bda0-972078777797" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 320, - "texto": { - "en": "giraffe", - "fr": "girafe" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fjirafa.webp?alt=media&token=5e9950fc-00dc-4d7a-90b3-cee9f55a2dc0" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 323, - "texto": { - "en": "lion", - "fr": "Lion" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fleon.webp?alt=media&token=ea99f84a-e3e8-46a5-a24c-d3a81fa0a10e" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 327, - "texto": { - "en": "butterfly", - "fr": "papillon" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fmariposa.webp?alt=media&token=eb75c2c3-871e-42ed-a893-0142c9eb6c05" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 331, - "texto": { - "en": "bear", - "fr": "ours" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Foso.webp?alt=media&token=47e35861-59b3-499a-9e8b-c10d52e6451e" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 332, - "texto": { - "en": "sheep", - "fr": "mouton" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Foveja.webp?alt=media&token=11981786-fded-4f20-8d7a-8b2cef80e782" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 333, - "texto": { - "en": "bird", - "fr": "oiseau" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpajaro.webp?alt=media&token=be98ebb6-6c77-46e4-93aa-5f999363d793" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 334, - "texto": { - "en": "birdie", - "fr": "birdie" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpajarito.webp?alt=media&token=70c9bceb-f954-4b83-8889-40bbdee3ad5b" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 335, - "texto": { - "en": "pidgeon", - "fr": "pidgeon" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpaloma.webp?alt=media&token=2f011521-d2b1-4834-a7fc-18ef1b8a6837" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 337, - "texto": { - "en": "duck", - "fr": "canard" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpato.webp?alt=media&token=d828454d-109a-4321-8348-a029423823a0" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 340, - "texto": { - "en": "fish", - "fr": "poisson" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpeces.webp?alt=media&token=c9e8c8d9-ac35-4b91-a3c2-0ab94c1c5a13" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 342, - "texto": { - "en": "dog", - "fr": "chien" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fperro.webp?alt=media&token=efaf7bd3-68cb-46e7-b239-5dd43e674cb2" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 348, - "texto": { - "en": "frog", - "fr": "grenouille" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Frana.webp?alt=media&token=8f852e14-de74-4088-b4ee-313b37373e48" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 354, - "texto": { - "en": "tiger", - "fr": "tigre" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ftigre.webp?alt=media&token=8eb90cc1-2275-4d7d-b109-e051c165fd0f" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 356, - "texto": { - "en": "tortoise", - "fr": "tortue" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ftortuga.webp?alt=media&token=992b3a94-8af0-42d7-998a-ab7cf9f9649a" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 357, - "texto": { - "en": "cow", - "fr": "vache" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fvaca.webp?alt=media&token=169415f8-b6e6-473b-9421-8c036350a451" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 359, - "texto": { - "en": "snake", - "fr": "serpent" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fvibora.webp?alt=media&token=54e9f484-0f32-4510-8615-396956d6bb0c" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 362, - "texto": { - "en": "cock", - "fr": "coq" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fgallo.webp?alt=media&token=f7eeb656-0122-4522-a795-630b90749f8a" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 363, - "texto": { - "en": "tuna", - "fr": "thon" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fatun.webp?alt=media&token=3268b4fa-6306-468c-b56e-dc3253ebaa6e" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 374, - "texto": { - "en": "veal", - "fr": "veau" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fternera.webp?alt=media&token=6a044f56-c3c8-456b-b59b-788a90d61d62" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 375, - "texto": { - "en": "pig", - "fr": "porc" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcerdo.webp?alt=media&token=741f2ba1-fe2a-43b2-be72-3a7f30f861d8" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 376, - "texto": { - "en": "rabbit", - "fr": "lapin" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fconejo.webp?alt=media&token=b5eac151-aecb-458f-b8c4-eb911037dab7" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 377, - "texto": { - "en": "Hello", - "fr": "Bonjour" - }, - "tipo": 5, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_hola.webp?alt=media&token=747ec011-4e60-4f0a-9ec5-b548eea2f49c" - }, - "relacion": [ - { - "id": 378, - "frec": 5 - }, - { - "id": 49, - "frec": 3 - }, - { - "id": 44, - "frec": 1 - }, - { - "id": 380, - "frec": 1 - }, - { - "id": 632, - "frec": 1 - }, - { - "id": 628, - "frec": 1 - }, - { - "id": 381, - "frec": 1 - }, - { - "id": 379, - "frec": 1 - } - ], - "agenda": 0, - "gps": 0 - }, - { - "id": 378, - "texto": { - "en": "How are you?", - "fr": "Comment allez-vous?" - }, - "tipo": 5, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_como_estas.webp?alt=media&token=5580c46b-0516-413e-9c94-87a6c4d47410" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 379, - "texto": { - "en": "Good morning", - "fr": "Bonjour" - }, - "tipo": 5, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_buenos_dias.webp?alt=media&token=0d7fe795-3024-45fb-8ba5-bd361d2c61ee" - }, - "relacion": [], - "agenda": 0, - "horario": [ - "MANANA" - ], - "gps": 0 - }, - { - "id": 380, - "texto": { - "en": "Good afternoon", - "fr": "bonne après-midi" - }, - "tipo": 5, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_buenas_tardes.webp?alt=media&token=b42a7da3-eb59-4685-8d2d-5402cb3bbddb" - }, - "relacion": [], - "agenda": 0, - "horario": [ - "MEDIODIA", - "TARDE" - ], - "gps": 0 - }, - { - "id": 381, - "texto": { - "en": "Good night", - "fr": "Bonne nuit" - }, - "tipo": 5, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_buenas_noches.webp?alt=media&token=ed63a9b2-8617-48d0-ad6b-4c699eb2bce6" - }, - "relacion": [], - "agenda": 0, - "horario": [ - "NOCHE" - ], - "gps": 0 - }, - { - "id": 382, - "texto": { - "en": "bye", - "fr": "au revoir" - }, - "tipo": 5, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_adios.webp?alt=media&token=94e8b976-f724-417e-b921-1800c14f8e5a" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 383, - "texto": { - "en": "Please", - "fr": "S'il vous plaît" - }, - "tipo": 5, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpor_favor.webp?alt=media&token=5de541ca-cc32-45f9-8f24-d5af9f44bca9" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 384, - "texto": { - "en": "Thank you", - "fr": "Je vous remercie" - }, - "tipo": 5, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_gracias.webp?alt=media&token=520ea249-7aa3-407e-99b7-259e1e44ec41" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 385, - "texto": { - "en": "Help", - "fr": "Aidez-moi" - }, - "tipo": 5, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_ayuda.webp?alt=media&token=52542e12-7482-4409-b5e1-ce4fb61af996" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 386, - "texto": { - "en": "Luck", - "fr": "La chance" - }, - "tipo": 5, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_suerte.webp?alt=media&token=d5dd1d50-6740-46f2-9b51-0f1b0cc09ee5" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 387, - "texto": { - "en": "Good bye", - "fr": "Au revoir" - }, - "tipo": 5, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_adios.webp?alt=media&token=94e8b976-f724-417e-b921-1800c14f8e5a" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 388, - "texto": { - "en": "Yes", - "fr": "Oui" - }, - "tipo": 5, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_si.webp?alt=media&token=c55c8d1d-d5ff-4e1a-9283-e0ed5c1e587d" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 389, - "texto": { - "en": "No", - "fr": "Non" - }, - "tipo": 5, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_no.webp?alt=media&token=a8446260-23d3-4a04-83da-3119d521bb70" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 390, - "texto": { - "en": "I would love to", - "fr": "J'aimerais bien" - }, - "tipo": 5, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_genial.webp?alt=media&token=b9203a83-25ce-4da4-bc52-5c8ee7ed9f2b" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 391, - "texto": { - "en": "chard", - "fr": "bettes" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Facelga.webp?alt=media&token=efcd0769-fa2f-4730-9b33-a4fc5c62c533" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 393, - "texto": { - "en": "almond", - "fr": "amande" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Falmendras.webp?alt=media&token=8a49e474-bfec-4ee7-8bae-d4f46ec22400" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 394, - "texto": { - "en": "pineapple", - "fr": "ananas" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fanana.webp?alt=media&token=c9c88c38-b210-495f-88d5-1e840bd036f6" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 396, - "texto": { - "en": "sugar", - "fr": "sucre" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fazucar.webp?alt=media&token=788bb77b-e6e0-4cd4-84c3-eddfeffa3e3c" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 398, - "texto": { - "en": "sandwich", - "fr": "sandwich" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fbocadillo.webp?alt=media&token=48edafdd-3303-40a7-94fa-6800e3c94e0c" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 399, - "texto": { - "en": "pumpkin", - "fr": "citrouille" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcalabaza.webp?alt=media&token=c353fe3f-6b3a-48d5-9f2c-3ffdc2db9d18" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 400, - "texto": { - "en": "caneloni", - "fr": "caneloni" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcanelones.webp?alt=media&token=86ac56b1-ac2d-44f1-a80d-b0cf65b35968" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 401, - "texto": { - "en": "cappchino", - "fr": "cappchino" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcapuchino.webp?alt=media&token=f01e2fe2-206a-45f2-b689-51a8fff98f50" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 402, - "texto": { - "en": "chestnuts", - "fr": "châtaignes" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcastanas.webp?alt=media&token=604b50af-9328-4c81-bae0-57674e510117" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 403, - "texto": { - "en": "onion", - "fr": "oignon" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcebolla.webp?alt=media&token=af1f0474-59b3-4bf7-8b49-c18c61393813" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 404, - "texto": { - "en": "cherry", - "fr": "Cerise" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcerezas.webp?alt=media&token=5f66d7cb-c4c8-4c5e-b05f-7d48ac3f05e6" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 406, - "texto": { - "en": "lollipop", - "fr": "sucette" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fchupetin.webp?alt=media&token=b3f95f54-d2b4-4827-ab7a-a44ebc6d5f3e" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 407, - "texto": { - "en": "plum", - "fr": "prune" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fciruela.webp?alt=media&token=c0beef71-79dc-4cc5-8906-a1c27f37bed8" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 408, - "texto": { - "en": "apricot", - "fr": "abricot" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fdamasco.webp?alt=media&token=0abf4e01-36e5-441f-8e1b-a60e6dd56809" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 412, - "texto": { - "en": "creme caramel", - "fr": "crème caramel" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fflan.webp?alt=media&token=c4cbe053-d065-47a3-a317-a9ff710ee5a0" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 413, - "texto": { - "en": "raspberry", - "fr": "framboise" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fframbuesas.webp?alt=media&token=5b377f0a-a7cd-4904-8da7-09ba5191671c" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 414, - "texto": { - "en": "strawberry", - "fr": "fraise" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ffresa.webp?alt=media&token=cd851af7-e7fc-4842-ac66-7ef2d6fe4018" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 415, - "texto": { - "en": "cookie", - "fr": "biscuit" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fgalletas.webp?alt=media&token=0a5b87dc-2b95-49f6-9433-0f8955beec29" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 417, - "texto": { - "en": "jelly", - "fr": "gelée" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fgelatina.webp?alt=media&token=90951f93-c68c-44f5-8855-bab89935ea72" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 420, - "texto": { - "en": "boiled egg", - "fr": "oeuf dur" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fhuevo_duro.webp?alt=media&token=ad859492-0aaf-4e9e-aba7-58035b34b92e" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 421, - "texto": { - "en": "fried eg", - "fr": "frit par exemple" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fhuevo_frito.webp?alt=media&token=481b1c1d-6856-4c97-b41d-90500a683e99" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 424, - "texto": { - "en": "canned tuna", - "fr": "thon en conserve" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fatun.webp?alt=media&token=3268b4fa-6306-468c-b56e-dc3253ebaa6e" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 425, - "texto": { - "en": "canned sardine", - "fr": "sardine en conserve" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Flata_de_sardinas.webp?alt=media&token=98ed3763-4987-464a-9139-d060e6433a4c" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 426, - "texto": { - "en": "choclote milk", - "fr": "lait de choclote" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fleche_con_cacao.webp?alt=media&token=83b77847-9dd6-416c-9100-8fee10be0174" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 427, - "texto": { - "en": "milk and cookies", - "fr": "lait et biscuits" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fleche_y_galletas.webp?alt=media&token=8bae8aa0-60be-4d0e-aa71-1b336ad89a26" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 428, - "texto": { - "en": "lettuce", - "fr": "salade" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Flechuga.webp?alt=media&token=5c996973-d151-4065-b7ca-cdfcc56e4d4f" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 430, - "texto": { - "en": "corn", - "fr": "blé" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fmaiz.webp?alt=media&token=9e88d99c-4748-4001-b468-52ba9e318356" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 431, - "texto": { - "en": "butter", - "fr": "beurre" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fmanteca.webp?alt=media&token=abb20bfc-1da4-4f2a-8a1b-2ba8154cb138" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 432, - "texto": { - "en": "peach", - "fr": "pêche" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fmelocoton.webp?alt=media&token=b00db9ca-225c-4867-8c54-ed3754e15c04" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 435, - "texto": { - "en": "orange", - "fr": "Orange" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fnaranja.webp?alt=media&token=17f79963-266e-4032-b9fb-ddbba417e802" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 438, - "texto": { - "en": "white bread", - "fr": "pain blanc" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpan_blanco.webp?alt=media&token=ee91777b-6221-4dfa-a962-8307735c83bc" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 439, - "texto": { - "en": "black bread", - "fr": "pain noir" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpan_negro.webp?alt=media&token=ce94f5bd-135c-4b77-9f78-7bdff71ede10" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 447, - "texto": { - "en": "grapefruit", - "fr": "pamplemousse" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpomelo.webp?alt=media&token=4b112d85-10dd-4d9f-b9af-4e0c221fa896" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 449, - "texto": { - "en": "smashed potatoes", - "fr": "pommes de terre brisées" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpure.webp?alt=media&token=676f1e4f-eac9-4980-bcac-b72f2feefdae" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 458, - "texto": { - "en": "sandwich", - "fr": "sandwich" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fsandwich.webp?alt=media&token=7fc5f532-18d1-4b03-a06f-8008fb0c8434" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 462, - "texto": { - "en": "pie", - "fr": "tarte" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ftarta.webp?alt=media&token=14e0eb74-1ad9-45f0-92cf-b7983100cae6" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 463, - "texto": { - "en": "tomato", - "fr": "tomate" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ftomate.webp?alt=media&token=c41dbeb9-419d-45f7-a621-d4d40dc027d4" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 465, - "texto": { - "en": "toast", - "fr": "pain grillé" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ftostada.webp?alt=media&token=a07b7217-cf65-42ae-a72f-327b8ba13f66" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 468, - "texto": { - "en": "apple juice", - "fr": "jus de pomme" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fzumo_de_manzana.webp?alt=media&token=0512a2bb-b7b1-41e5-ac98-a124816536cb" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 469, - "texto": { - "en": "peach juice", - "fr": "jus de pêche" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fmelocoton.webp?alt=media&token=b00db9ca-225c-4867-8c54-ed3754e15c04" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 471, - "texto": { - "en": "grape juice", - "fr": "jus de raisin" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fzumo_de_uva.webp?alt=media&token=15b7e370-22b3-41b8-9946-8fb91f053c48" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 472, - "texto": { - "en": "soup", - "fr": "soupe" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fsopa.webp?alt=media&token=2add9150-6bf8-4d89-a250-3c7a79fc4c7e" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 473, - "texto": { - "en": "banana", - "fr": "banane" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fbanana.webp?alt=media&token=b01c35ae-502a-47dc-804d-b99bc870230f" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 474, - "texto": { - "en": "apple", - "fr": "Pomme" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fmanzana.webp?alt=media&token=d7e920bb-54b7-4159-8401-d917395942f2" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 475, - "texto": { - "en": "pear", - "fr": "poire" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpera.webp?alt=media&token=2feac2ab-b589-4815-96d9-366a2a2a4c4e" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 476, - "texto": { - "en": "fish", - "fr": "poisson" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fzid_pescado.webp?alt=media&token=c61c5906-1c00-425f-af6f-63c50b9a005a" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 477, - "texto": { - "en": "salad", - "fr": "salade" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fzid_ensalada.webp?alt=media&token=a7c8ec3f-130b-4988-862c-1af0d209ef75" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 478, - "texto": { - "en": "vegetables", - "fr": "des légumes" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fzid_verduras.webp?alt=media&token=e74f9d18-10ee-47f4-947c-1ab02b13f5df" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 480, - "texto": { - "en": "pasta", - "fr": "Pâtes" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fzid_pasta.webp?alt=media&token=f118a1c6-859f-47a5-8ab2-d4ca29106455" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 481, - "texto": { - "en": "rice", - "fr": "riz" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fzid_arroz.webp?alt=media&token=fd394581-3a2b-4875-bd2c-f907496ebd9b" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 482, - "texto": { - "en": "beef", - "fr": "du boeuf" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fzid_carne.webp?alt=media&token=1bc65494-6f49-4389-bb81-fae3e7591240" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 483, - "texto": { - "en": "fruit", - "fr": "fruit" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fzid_fruta.webp?alt=media&token=11397b4e-44e3-4d03-a4ea-1409c209b4e6" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 484, - "texto": { - "en": "yoghurt", - "fr": "Yaourt" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fzid_yogurt.webp?alt=media&token=b3831fe0-1846-4012-aa6b-35c76f25c3ad" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 485, - "texto": { - "en": "cake", - "fr": "gâteau" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fzid_tarta.webp?alt=media&token=648ebcaa-13fd-48a2-8649-844260914a2d" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 486, - "texto": { - "en": "ice cream", - "fr": "crème glacée" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fzid_helado.webp?alt=media&token=18fc2aae-6651-47b7-9d86-b654606bb863" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 487, - "texto": { - "en": "oil", - "fr": "pétrole" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Faceite.webp?alt=media&token=a2c953be-6ccc-4dce-9665-7d099e0542de" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 489, - "texto": { - "en": "salt", - "fr": "sel" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fsal.webp?alt=media&token=ea989d3f-c52a-443a-a6a0-41b9f9094936" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 490, - "texto": { - "en": "mayo", - "fr": "mayo" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fmayonesa.webp?alt=media&token=1c7844ec-5a64-490a-a59b-e94840792d05" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 492, - "texto": { - "en": "ketchup", - "fr": "ketchup" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fketchup.webp?alt=media&token=5a6dcbbf-994c-4c27-aa9c-75a4e808465d" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 494, - "texto": { - "en": "candy", - "fr": "bonbons" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_dulces.webp?alt=media&token=3ee8a703-20b4-454c-8254-1c0c1b66873d" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 495, - "texto": { - "en": "milk", - "fr": "Lait" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fleche.webp?alt=media&token=819236fb-c7ba-4624-a964-194f9197bc1f" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 496, - "texto": { - "en": "coffee", - "fr": "café" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcafe.webp?alt=media&token=d3c77313-ac4a-4df2-8be1-a4d01697a80b" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 497, - "texto": { - "en": "juice", - "fr": "jus" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_bebida.webp?alt=media&token=6a37edef-b1a1-4727-a5a3-d6b0d8c0a305" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 498, - "texto": { - "en": "chocolate", - "fr": "Chocolat" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fchocolate.webp?alt=media&token=ad78a202-7ab5-43bb-8069-fa86ec267938" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 499, - "texto": { - "en": "te", - "fr": "te" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fte.webp?alt=media&token=a27a3bc5-9899-42e3-a69c-0ab3ed23f331" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 500, - "texto": { - "en": "water", - "fr": "eau" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fagua.webp?alt=media&token=b7a9b14c-ecf5-4647-a364-21cab9feb013" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 501, - "texto": { - "en": "soda", - "fr": "un soda" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcocacola.webp?alt=media&token=e2196ddc-639b-499e-ab5f-c6d02bae6110" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 502, - "texto": { - "en": "beer", - "fr": "Bière" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcerveza.webp?alt=media&token=923077ac-4f46-47b6-a98e-60fb98e63522" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 503, - "texto": { - "en": "wine", - "fr": "du vin" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fvino.webp?alt=media&token=e1cadaf5-7b3c-444b-bb61-3d971efb0991" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 504, - "texto": { - "en": "poultry", - "fr": "la volaille" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fzid_pollo.webp?alt=media&token=2e79ffa9-57e4-4456-85be-77789e3876fd" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 505, - "texto": { - "en": "chicken thigh", - "fr": "cuisse de poulet" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fmuslo_de_pollo.webp?alt=media&token=86df988a-e631-426d-ab68-69afb702b85c" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 507, - "texto": { - "en": "egg", - "fr": "Oeuf" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fzid_huevo.webp?alt=media&token=ca26cfcd-56e8-4b77-8ef0-5f66236ab6c0" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 510, - "texto": { - "en": "fish", - "fr": "poisson" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fzid_pescado.webp?alt=media&token=c61c5906-1c00-425f-af6f-63c50b9a005a" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 512, - "texto": { - "en": "steak", - "fr": "steak" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ffilete.webp?alt=media&token=03537ace-c649-4720-86ef-949b7dc58542" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 515, - "texto": { - "en": "hamburguer", - "fr": "hamburguer" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fhamburguesa.webp?alt=media&token=1f1ac265-9d7e-4aeb-afec-16b4b70185e1" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 516, - "texto": { - "en": "raw ham", - "fr": "Jambon cru" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fjamon.webp?alt=media&token=9f8df889-6aa9-4f38-bc9d-6ffe0a368900" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 517, - "texto": { - "en": "cooked ham", - "fr": "jambon cuit" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fjamon_de_york.webp?alt=media&token=5a7c91e0-8fe6-4072-b01d-6db1b67e5d6b" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 521, - "texto": { - "en": "cheese", - "fr": "fromage" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fqueso.webp?alt=media&token=f36923ae-193d-4e9f-bbd3-60557ac52629" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 524, - "texto": { - "en": "sausage", - "fr": "saucisse" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fsalchichas.webp?alt=media&token=aee011c3-8381-4e88-b47d-45677eebf67e" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 525, - "texto": { - "en": "a", - "fr": "une" - }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fa.webp?alt=media&token=3e8a5652-be09-49bc-9bfa-3511eebfd9e8" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 526, - "texto": { - "en": "before", - "fr": "avant" - }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fante.webp?alt=media&token=9a02d561-8472-473c-b508-0b090b8f2669" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 527, - "texto": { - "en": "beneath", - "fr": "sous" - }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fbajo_prep.webp?alt=media&token=86a87969-ff5a-4c9e-9642-9fc7b8592ef1" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 528, - "texto": { - "en": "with", - "fr": "avec" - }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcon_prep.webp?alt=media&token=4649b3b9-e248-4048-8949-fd75c423a3e3" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 529, - "texto": { - "en": "against", - "fr": "contre" - }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcontra.webp?alt=media&token=7cf1b7cc-6d1d-4a9f-b099-e1d4ac4dbc4c" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 530, - "texto": { - "en": "of", - "fr": "de" - }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fde.webp?alt=media&token=d388d233-8798-4143-81de-74dcae1e14be" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 531, - "texto": { - "en": "from", - "fr": "de" - }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fdesde.webp?alt=media&token=005cccd6-1a3d-4a79-a1df-c3be054e023c" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 532, - "texto": { - "en": "during", - "fr": "pendant" - }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fdurante.webp?alt=media&token=c10ae87d-faff-4424-8878-5b19f3685c7c" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 533, - "texto": { - "en": "in", - "fr": "dans" - }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fen.webp?alt=media&token=0cfe18f8-3a5d-429f-bf01-0e8e8426249e" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 534, - "texto": { - "en": "between", - "fr": "entre" - }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fentre.webp?alt=media&token=68f3c53e-8d7b-41fa-9d72-44edd964f6b2" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 535, - "texto": { - "en": "towards", - "fr": "vers" - }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fhacia.webp?alt=media&token=2ab6617b-974d-4f81-ac2b-de2dcf4e69de" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 536, - "texto": { - "en": "until", - "fr": "jusqu'à" - }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fhasta.webp?alt=media&token=ce288b3a-16ca-4754-8e1c-27764f7801f9" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 537, - "texto": { - "en": "for", - "fr": "pour" - }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpara.webp?alt=media&token=b1a11e96-a245-477a-996e-4890d4c3f9ba" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 538, - "texto": { - "en": "by", - "fr": "par" - }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpor.webp?alt=media&token=62c20067-7143-44cc-89e5-3cfb834f5a48" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 539, - "texto": { - "en": "according", - "fr": "selon" - }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fsegun.webp?alt=media&token=3eaba42f-d343-48a6-96f6-92945a8b91bf" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 540, - "texto": { - "en": "without", - "fr": "sans pour autant" - }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fsin.webp?alt=media&token=94983140-df48-4734-ac04-479ad98c5b26" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 544, - "texto": { - "en": "hero", - "fr": "héros" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fspiderman.webp?alt=media&token=118e61bb-843e-427b-86b9-9dcb559cd496" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 552, - "texto": { - "en": "story", - "fr": "récit" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcuento.webp?alt=media&token=2f3fa4f7-9f55-424e-a587-8974d1728f84" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 553, - "texto": { - "en": "book", - "fr": "livre" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Flibro.webp?alt=media&token=ce9ae11b-a7e1-48ae-bc73-36358db5e1ec" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 554, - "texto": { - "en": "movie", - "fr": "film" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpelicula.webp?alt=media&token=0668824c-95f4-4e4b-a7df-7c062b988073" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 557, - "texto": { - "en": "in love", - "fr": "amoureux" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fenamorados.webp?alt=media&token=10dcfa22-c4a8-4c38-b71a-886cd0d56f3b" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 560, - "texto": { - "en": "cartoons", - "fr": "les dessins animés" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_dibujos_animados.webp?alt=media&token=7849908a-4329-4361-ac52-f583f345b9d7" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 561, - "texto": { - "en": "ticket", - "fr": "billet" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_entrada.webp?alt=media&token=3c3f1754-1512-4658-923b-3486a794d797" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 563, - "texto": { - "en": "row", - "fr": "rangée" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ffila.webp?alt=media&token=4679780c-e3c4-4da7-b6fc-4e14a05a20eb" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 564, - "texto": { - "en": "drink", - "fr": "boisson" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fbebida.webp?alt=media&token=70276811-03c6-4072-89e2-c07fea37652f" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 565, - "texto": { - "en": "popcorn", - "fr": "pop corn" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_palomitas.webp?alt=media&token=f85af19c-2583-4c1a-83d0-bf55b275a45c" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 567, - "texto": { - "en": "money", - "fr": "argent" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_dinero.webp?alt=media&token=511fcf7d-fc11-40fa-b28f-6afea1e470bf" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 568, - "texto": { - "en": "remote", - "fr": "éloigné" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_control_remoto.webp?alt=media&token=cc3d03f5-5051-410d-8edf-74e46fe7d138" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 572, - "texto": { - "en": "news", - "fr": "nouvelles" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_canal_noticiero.webp?alt=media&token=94107da2-251c-41eb-9a7c-2a41971e9a11" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 573, - "texto": { - "en": "music", - "fr": "la musique" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_escuchar_musica.webp?alt=media&token=258720fc-5ba7-44e4-b03e-2b3575a56784" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 575, - "texto": { - "en": "cooking channel", - "fr": "canal de cuisson" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fprograma_de_cocina.webp?alt=media&token=902c0c03-0d97-4426-9ba6-6bdc9307ab29" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 580, - "texto": { - "en": "cartoons", - "fr": "les dessins animés" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_canal_dibujos_animados.webp?alt=media&token=64a8bf60-3076-41a1-80fa-035278796067" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 583, - "texto": { - "en": "sport channel", - "fr": "canal sportif" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_canal_deportes.webp?alt=media&token=83ff30a5-1672-4d60-bc80-8851a3608c9b" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 587, - "texto": { - "en": "How much is it?", - "fr": "Combien ça coûte?" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_precio.webp?alt=media&token=b31b9ab7-69e3-4476-a843-885bee00a080" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 588, - "texto": { - "en": "invoice", - "fr": "facture d'achat" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ffactura.webp?alt=media&token=f2d735fa-3b58-438b-90dc-e32e8cb2c276" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 589, - "texto": { - "en": "lunch", - "fr": "le déjeuner" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_almuerzo.webp?alt=media&token=b7acb5a2-b170-4c2b-a5b6-341d19db3632" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 590, - "texto": { - "en": "dinner", - "fr": "dîner" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_cena.webp?alt=media&token=768a1465-9bb2-4f45-895a-29fa7da05086" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 594, - "texto": { - "en": "breakfast", - "fr": "déjeuner" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_desayuno.webp?alt=media&token=25948a6f-b4bd-4958-ad10-3ea868660416" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 595, - "texto": { - "en": "Where?", - "fr": "Où?" - }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fdonde.webp?alt=media&token=9e13c203-dc99-4345-aba7-8e2ce243627b" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 597, - "texto": { - "en": "hungry", - "fr": "affamé" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_hambre.webp?alt=media&token=3af9b051-508f-4a4d-9969-2c9e393283d2" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 598, - "texto": { - "en": "afternoon snack", - "fr": "goûter de l'après-midi" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_merienda.webp?alt=media&token=93022501-e9f5-412a-aee4-1599f3d80543" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 599, - "texto": { - "en": "dish", - "fr": "plat" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fplato.webp?alt=media&token=0a96d1d6-45dc-4a45-8e94-318ce29d32cb" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 600, - "texto": { - "en": "desert", - "fr": "désert" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpostre.webp?alt=media&token=5ba3ed23-b812-4e40-8693-7972e8671b86" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 602, - "texto": { - "en": "What time is it?", - "fr": "Quelle heure est-il?" - }, - "tipo": 5, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fque_hora_es.webp?alt=media&token=44e9f414-a3da-4401-82c8-bb12fc1c7102" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 604, - "texto": { - "en": "napkin", - "fr": "serviette de table" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fservilleta.webp?alt=media&token=6a5049bc-046d-4d64-b7a1-a8fc0687d9a2" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 605, - "texto": { - "en": "glass", - "fr": "verre" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fvaso.webp?alt=media&token=0e374ed3-0fe4-4d0c-aaa8-e62dd900a2cc" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 606, - "texto": { - "en": "plane", - "fr": "avion" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Favion.webp?alt=media&token=c46dbcaa-99a0-4605-8eb5-8907dfd0e43f" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 607, - "texto": { - "en": "Bus", - "fr": "Autobus" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fautobus.webp?alt=media&token=15a4c091-c8fb-4c00-8cc3-dfe53becfc8f" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 608, - "texto": { - "en": "car", - "fr": "voiture" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcoche.webp?alt=media&token=7d0e03da-0698-4e7a-9db1-5b812740a944" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 609, - "texto": { - "en": "Metro", - "fr": "Métro" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fmetro.webp?alt=media&token=32eebc33-69af-416c-9596-ba7f0e33655a" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 610, - "texto": { - "en": "taxi", - "fr": "Taxi" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ftaxi.webp?alt=media&token=2809dbe3-07a6-4ef4-90b1-f8725c91be44" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 611, - "texto": { - "en": "transportation", - "fr": "transport" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ftransportes.webp?alt=media&token=94bd980f-eeed-4310-8fe7-09148e19612f" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 614, - "texto": { - "en": "grandpa", - "fr": "grand-père" - }, - "tipo": 1, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_abuelo.webp?alt=media&token=a699f1b0-1b85-4932-a32a-b07c570e2547" - }, - "relacion": [ - { - "id": 22, - "frec": 2 - } - ], - "agenda": 0, - "gps": 0 - }, - { - "id": 615, - "texto": { - "en": "friends", - "fr": "copains" - }, - "tipo": 1, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_amigos.webp?alt=media&token=01d03271-5536-4654-ab0d-a938a1b432db" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 617, - "texto": { - "en": "butcher", - "fr": "Boucher" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcarnicero.webp?alt=media&token=8922d169-5277-40f3-a3e4-07925112592f" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 619, - "texto": { - "en": "chef", - "fr": "chef" - }, - "tipo": 1, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcocinero.webp?alt=media&token=982eabfe-1544-4ff1-adb1-6eeac3937f1f" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 620, - "texto": { - "en": "team", - "fr": "équipe" - }, - "tipo": 1, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fequipo.webp?alt=media&token=fe87fc4f-4e88-41a3-90ce-a6104a538091" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 621, - "texto": { - "en": "family", - "fr": "famille" - }, - "tipo": 1, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_familia.webp?alt=media&token=577a591a-1df9-48f3-87dd-6548498130c5" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 622, - "texto": { - "en": "futbol player", - "fr": "joueur de futbol" - }, - "tipo": 1, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_futbolista.webp?alt=media&token=f08a6396-a149-400e-8f8b-8fb62c6205d8" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 623, - "texto": { - "en": "brother", - "fr": "frère" - }, - "tipo": 1, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_hermano.webp?alt=media&token=9783e15c-f073-4dc0-b556-9e69fd522058" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 624, - "texto": { - "en": "sister", - "fr": "sœur" - }, - "tipo": 1, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fhermana.webp?alt=media&token=1eb4b2d7-fe8b-487e-b36a-4340352e79ce" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 626, - "texto": { - "en": "teacher", - "fr": "prof" - }, - "tipo": 1, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_maestra.webp?alt=media&token=4ee47174-ea96-46df-9f02-c35642dfaf31" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 627, - "texto": { - "en": "teacher", - "fr": "prof" - }, - "tipo": 1, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fmaestro.webp?alt=media&token=00e6a3c7-c0da-4de3-9ac0-82642de9f4e9" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 628, - "texto": { - "en": "mom", - "fr": "maman" - }, - "tipo": 1, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_mama.webp?alt=media&token=190be130-d7dd-4e30-80cb-d010a247ff67" - }, - "relacion": [ - { - "id": 44, - "frec": 6 - } - ], - "agenda": 0, - "gps": 0 - }, - { - "id": 629, - "texto": { - "en": "medic", - "fr": "médical" - }, - "tipo": 1, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_medico.webp?alt=media&token=a89f8154-0460-4e0b-b350-d447325021d3https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_medico.webp?alt=media&token=a89f8154-0460-4e0b-b350-d447325021d3" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 630, - "texto": { - "en": "boy", - "fr": "garçon" - }, - "tipo": 1, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fnino.webp?alt=media&token=f9c17702-4712-41f1-b72f-31e9919a0b5d" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 631, - "texto": { - "en": "girl", - "fr": "fille" - }, - "tipo": 1, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fnina.webp?alt=media&token=6c9fe38c-bcda-432d-9ec6-5fb53b127f69" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 632, - "texto": { - "en": "dad", - "fr": "papa" - }, - "tipo": 1, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_papa.webp?alt=media&token=47ca6188-b568-4a92-bbcd-138781aff945" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 633, - "texto": { - "en": "people", - "fr": "gens" - }, - "tipo": 1, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpersonas.webp?alt=media&token=a5223e39-5426-4728-beda-8579fbc82adf" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 635, - "texto": { - "en": "princess", - "fr": "Princesse" - }, - "tipo": 1, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fprincesa.webp?alt=media&token=73c9d26b-a83c-4f75-9c1d-ae8661899d86" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 638, - "texto": { - "en": "Queen", - "fr": "Reine" - }, - "tipo": 1, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Freina.webp?alt=media&token=4c3c92ca-ab20-4bb3-b800-229033025084" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 639, - "texto": { - "en": "King", - "fr": "Roi" - }, - "tipo": 1, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Frey.webp?alt=media&token=6c6b9e6f-f61e-40b2-ab1b-9e2c52988a76" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 640, - "texto": { - "en": "taxi driver", - "fr": "conducteur de taxi" - }, - "tipo": 1, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ftaxista.webp?alt=media&token=b4ac3631-1c95-47ed-a3f2-2dde435b3448" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 642, - "texto": { - "en": "you", - "fr": "toi" - }, - "tipo": 1, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_tu.webp?alt=media&token=6e51dc01-7d7f-48b2-80e9-8e3930009a9b" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 643, - "texto": { - "en": "I", - "fr": "je" - }, - "tipo": 1, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_yo.webp?alt=media&token=9860a758-6779-438b-9ca3-49dfb28607e0" - }, - "relacion": [ - { - "id": 22, - "frec": 3 - }, - { - "id": 44, - "frec": 8 - }, - { - "id": 49, - "frec": 6 - }, - { - "id": 14, - "frec": 1 - } - ], - "agenda": 0, - "gps": 0 - }, - { - "id": 644, - "texto": { - "en": "here", - "fr": "ici" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_aca.webp?alt=media&token=0758a4e6-5f77-4dd8-a599-075c1823a9ce" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 646, - "texto": { - "en": "airport", - "fr": "aéroport" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Faeropuerto.webp?alt=media&token=2f7b5699-6a42-43ec-bcdb-e4bb6283fe4f" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 648, - "texto": { - "en": "there", - "fr": "Là" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_alla.webp?alt=media&token=1c3baab3-4166-47fe-8e37-ade8bcf2c564" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 649, - "texto": { - "en": "bar", - "fr": "bar" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fbar.webp?alt=media&token=ee953361-583a-4181-8fe7-735b7814e951" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 650, - "texto": { - "en": "bike shop", - "fr": "magasin de vélo" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ftienda_de_bicicletas.webp?alt=media&token=ee06d1a7-260f-4eab-bf25-831be398cd64" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 651, - "texto": { - "en": "field", - "fr": "champ" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcancha.webp?alt=media&token=bd539ba6-3e6c-4441-b5d2-cd52a7922a69" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 653, - "texto": { - "en": "house", - "fr": "maison" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_casa.webp?alt=media&token=f1d197b6-db37-44e6-b4bc-8ba31b0fa4aa" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 656, - "texto": { - "en": "city", - "fr": "ville" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fciudad.webp?alt=media&token=e57e17e4-6d75-47fe-9fc9-5465ca130261" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 657, - "texto": { - "en": "dinning room", - "fr": "salle à manger" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_comedor.webp?alt=media&token=eb71846a-eef3-4c0d-aabd-026e7b716e00" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 660, - "texto": { - "en": "bathroom", - "fr": "salle de bains" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_lugarbanio.webp?alt=media&token=d0a972ae-70d9-4636-9fc1-9da26af74026" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 661, - "texto": { - "en": "disco", - "fr": "disco" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fdiscoteca.webp?alt=media&token=e24b6b94-cc28-4cf0-b694-e59ad19adbec" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 662, - "texto": { - "en": "school", - "fr": "école" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_escuela.webp?alt=media&token=05c5460c-c3a5-4404-9389-d6a67e79bb5d" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 666, - "texto": { - "en": "Burger shop", - "fr": "Burger" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fhamburgueseria.webp?alt=media&token=54beeb1d-8901-472f-ac33-aa906e18627a" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 668, - "texto": { - "en": "hospital", - "fr": "hôpital" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fhospital.webp?alt=media&token=03e15e0e-b1ee-4446-adf5-f13fc1cab51d" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 672, - "texto": { - "en": "garden", - "fr": "jardin" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fjardin.webp?alt=media&token=cbca3a9b-3073-4eb3-8b68-ef2bcf079d76" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 675, - "texto": { - "en": "market", - "fr": "marché" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fmercado.webp?alt=media&token=bd72176b-1f7d-453b-9f33-dbc5ad38ae7e" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 678, - "texto": { - "en": "yard", - "fr": "Cour" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_patio.webp?alt=media&token=776f4a4a-6d91-4221-90ac-3325636f908e" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 679, - "texto": { - "en": "Pizza shop", - "fr": "pizzeria" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpizzeria.webp?alt=media&token=c8b53f71-6c9d-4084-92e1-46b148ee00c0" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 680, - "texto": { - "en": "Poultry shop", - "fr": "Volaille" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpolleria.webp?alt=media&token=e4684ecb-a406-4b62-8940-4daced7e368d" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 682, - "texto": { - "en": "square", - "fr": "carré" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fplaza.webp?alt=media&token=ad247196-bec9-4017-ae34-7a7b62a5ab32" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 685, - "texto": { - "en": "Restaurant", - "fr": "Restaurant" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Frestaurante.webp?alt=media&token=57ed6d5c-fa5f-41c1-b779-28294311e772" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 687, - "texto": { - "en": "traffic light", - "fr": "feu de circulation" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fsemaforo.webp?alt=media&token=eb4320ad-dc97-4847-941a-d2b055da30cc" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 688, - "texto": { - "en": "supermarket", - "fr": "supermarché" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fsupermercado.webp?alt=media&token=f5c6e8ce-3c97-40b0-860a-ad5d02a0bf7e" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 698, - "texto": { - "en": "greengrocery", - "fr": "épicerie" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fverduleria.webp?alt=media&token=be70aebe-bc45-4ab1-9dcf-a0531a26a7be" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 700, - "texto": { - "en": "Blockbuster", - "fr": "Superproduction" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fvideoclub.webp?alt=media&token=c1b47059-a6c9-4fb2-ac5f-38cfaf94a82d" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 702, - "texto": { - "en": "friendship", - "fr": "relation amicale" - }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Famistad.webp?alt=media&token=4ac81414-1b57-4607-89d0-1dcb7f066355" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 703, - "texto": { - "en": "help", - "fr": "Aidez-moi" - }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fayuda.webp?alt=media&token=a952e524-1a73-4105-ad7b-38925f2abe45" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 704, - "texto": { - "en": "celebration", - "fr": "fête" - }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcelebracion.webp?alt=media&token=41b124b1-e168-4f46-a3d9-5ee24c13649d" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 706, - "texto": { - "en": "fulfillment", - "fr": "accomplissement" - }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcumplimiento.webp?alt=media&token=971b0f6d-fec4-4155-aca0-3145f1a8c8bf" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 707, - "texto": { - "en": "description", - "fr": "la description" - }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fdescripcion.webp?alt=media&token=4dbde8ba-f144-4a12-90f6-013bf68d912d" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 708, - "texto": { - "en": "Personal hygiene", - "fr": "Hygiène personnelle" - }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fhigiene_personal.webp?alt=media&token=d822b484-feb9-4a37-a9f0-ed53e9b3584f" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 712, - "texto": { - "en": "physical abuse", - "fr": "violence physique" - }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fmaltrato_fisico.webp?alt=media&token=dbf253eb-4088-4bb6-ab66-42069cdc3ae9" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 713, - "texto": { - "en": "verbal abuse", - "fr": "violence verbale" - }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fmaltrato_verbal.webp?alt=media&token=7fe36de4-c1f4-4ac9-ad65-9a24c137cfce" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 714, - "texto": { - "en": "plural", - "fr": "pluriel" - }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fplurales.webp?alt=media&token=99818cbc-fc14-4a3c-ada6-b113b53542ec" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 718, - "texto": { - "en": "rehab", - "fr": "désintox" - }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Frehabilitacion.webp?alt=media&token=da4746ed-7fe5-48b5-afde-a59d382c5024" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 721, - "texto": { - "en": "series", - "fr": "séries" - }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fserie.webp?alt=media&token=1388c38c-f90f-429d-b241-f4cd45987736" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 722, - "texto": { - "en": "feelings", - "fr": "sentiments" - }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fsentimientos.webp?alt=media&token=90954fb0-bf68-48fe-8f12-d9dfc21963da" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 725, - "texto": { - "en": "surprise", - "fr": "surprise" - }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fsorpresa.webp?alt=media&token=27ad6998-250d-4aa3-8e2b-8f0c55525c2d" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 728, - "texto": { - "en": "verbs", - "fr": "verbes" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fverbos.webp?alt=media&token=f32aaaf1-44aa-49d3-a0ed-981ba01564d5" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 729, - "texto": { - "en": "shame", - "fr": "la honte" - }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fverguenza.webp?alt=media&token=fec28338-c19b-4c65-ac5b-766011b26e46" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 730, - "texto": { - "en": "life", - "fr": "la vie" - }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fvida.webp?alt=media&token=4082f898-9a1c-4dcc-b77c-d9908df532af" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 731, - "texto": { - "en": "visit", - "fr": "visite" - }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fvisita.webp?alt=media&token=4767c963-69f9-4565-b120-b25e2a09dd62" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 732, - "texto": { - "en": "tour", - "fr": "tour" - }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpaseo.webp?alt=media&token=2cc070cb-cb0b-4491-9a5b-0fdb66bf00ab" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 733, - "texto": { - "en": "Yellow", - "fr": "Jaune" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_amarillo.webp?alt=media&token=26bb22a3-04f2-4cb6-b185-06bcdf430c97" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 734, - "texto": { - "en": "Blue", - "fr": "Bleu" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_azul.webp?alt=media&token=9661fb07-6a30-4b2d-9b0d-38cc305fc6e0" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 736, - "texto": { - "en": "White", - "fr": "blanc" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_blanco.webp?alt=media&token=1f42fc7a-4032-41c3-a9ce-976ff07012ad" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 737, - "texto": { - "en": "Colors", - "fr": "Couleurs" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_colores.webp?alt=media&token=04309e00-d682-43f3-9605-bde0b5b4ab9a" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 738, - "texto": { - "en": "Gold", - "fr": "Or" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fdorado.webp?alt=media&token=2da74e47-082e-40a8-a5e8-9f17d2ad06c0" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 739, - "texto": { - "en": "Gray", - "fr": "Gris" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_gris.webp?alt=media&token=9075f69e-3085-4894-b7a3-2f556bc6bb27" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 740, - "texto": { - "en": "Purple", - "fr": "Violet" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Flila.webp?alt=media&token=3b380965-52f2-4529-846f-45cf1c4fdf9c" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 742, - "texto": { - "en": "Orange", - "fr": "Orange" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_naranja.webp?alt=media&token=72d9eae2-64ae-41e4-94ad-45b57e3e0c6f" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 743, - "texto": { - "en": "Black", - "fr": "Noir" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_negro.webp?alt=media&token=4a94ed36-a674-4a54-835d-5e53b49c2a79" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 744, - "texto": { - "en": "Silver", - "fr": "argent" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fplateado.webp?alt=media&token=b0286d9e-a044-4045-9ece-113d2e3547a5" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 745, - "texto": { - "en": "What color it is?", - "fr": "De quelle couleur est-il?" - }, - "tipo": 5, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcolor_pregunta.webp?alt=media&token=323d5f57-fc0b-4178-810a-dceef199c4c1" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 746, - "texto": { - "en": "Red", - "fr": "rouge" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_rojo.webp?alt=media&token=db03a6d8-b224-4c3e-95ae-b9726acbb4a9" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 747, - "texto": { - "en": "Pink", - "fr": "Rose" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_rosa.webp?alt=media&token=7d6813b9-27af-4c7c-839f-52b8332bbcba" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 748, - "texto": { - "en": "Violet", - "fr": "Violet" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_violeta.webp?alt=media&token=11f96684-2a3e-45b1-a014-36d9af8fc0fd" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 749, - "texto": { - "en": "Green", - "fr": "vert" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_verde.webp?alt=media&token=b0bb5586-ca8e-4ff9-89a1-25be6ffb1fe3" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 750, - "texto": { - "en": "Light green", - "fr": "Vert clair" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fverde_claro.webp?alt=media&token=61212a6e-41a5-4ca6-ac01-c927b148ba21" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 751, - "texto": { - "en": "agenda", - "fr": "ordre du jour" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_agenda.webp?alt=media&token=6c163ede-8b50-4330-8bb1-86a8709c2df3" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 752, - "texto": { - "en": "wallet", - "fr": "portefeuille" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_billetera.webp?alt=media&token=287d976d-97fa-4d7f-a67b-a01e884f1539" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 753, - "texto": { - "en": "pencil case", - "fr": "trousse" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_cartuchera.webp?alt=media&token=60a16199-fb91-4ba6-9b40-939237b6a84c" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 754, - "texto": { - "en": "Lessons", - "fr": "Cours" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_clases.webp?alt=media&token=bbf3f869-948b-4be0-93fb-44b637a651b0" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 755, - "texto": { - "en": "computer", - "fr": "ordinateur" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_computadora.webp?alt=media&token=a8231494-9cd4-4214-957c-0f0cac0bf51a" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 756, - "texto": { - "en": "Crayon", - "fr": "Crayon" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_pinturas_de_colores.webp?alt=media&token=a9216975-c04c-458e-ab37-f25c8845ff68" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 757, - "texto": { - "en": "notebook", - "fr": "carnet" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_cuaderno.webp?alt=media&token=8a9f694c-56c6-4050-86cc-88a2e8f339e2" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 758, - "texto": { - "en": "room", - "fr": "chambre" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_cuarto.webp?alt=media&token=71b775de-e204-4136-97f9-f8b7346073ed" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 760, - "texto": { - "en": "eraser", - "fr": "la gomme" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_goma.webp?alt=media&token=3ae9dee2-fd64-41ca-9278-015438dc0bc1" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 761, - "texto": { - "en": "toy", - "fr": "jouet" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_jueguete.jpg?alt=media&token=4c74d182-45e0-4642-87e5-645aa1a9dda6" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 762, - "texto": { - "en": "pencil", - "fr": "crayon" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_lapices_de_colores.webp?alt=media&token=1662d13d-3aaf-45d7-b3cf-921499a43030" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 766, - "texto": { - "en": "paper", - "fr": "papier" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_papel.webp?alt=media&token=08b182e0-e3c7-451c-bc15-1c97aaeede75" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 767, - "texto": { - "en": "ball", - "fr": "ballon" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_pelotas.webp?alt=media&token=2b17cead-37bc-40c1-9933-8320836adeb0" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 768, - "texto": { - "en": "glue", - "fr": "la colle" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_pegamento.webp?alt=media&token=4d4468d0-6cb2-4054-bdd7-40c4b5db74b3" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 769, - "texto": { - "en": "brush", - "fr": "brosse" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_pincel.webp?alt=media&token=61071c3c-12af-43dc-addd-cf9e15635637" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 770, - "texto": { - "en": "blackboard", - "fr": "tableau noir" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_pizarron.webp?alt=media&token=9a9cc7f1-8a76-4cff-9c4a-c77cb73663b9" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 771, - "texto": { - "en": "art class", - "fr": "classe d'art plastique" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_plastica.webp?alt=media&token=f07c00ef-d42e-48dc-a115-6958e289006b" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 772, - "texto": { - "en": "magazines", - "fr": "les magazines" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_revistas.webp?alt=media&token=201c8e17-b30d-43dc-aeee-f0df613ea313" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 773, - "texto": { - "en": "TV", - "fr": "la télé" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_televisor.webp?alt=media&token=2575675b-b3c4-4e35-9cde-17bba27623ee" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 774, - "texto": { - "en": "tablet", - "fr": "tablette" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_tablet.webp?alt=media&token=b7eaaf47-0194-4491-8377-f593b85a48a0" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 776, - "texto": { - "en": "armpit", - "fr": "aisselle" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fsobacos.webp?alt=media&token=50574607-d2a3-4f19-bb41-8bfa08b9ea5c" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 777, - "texto": { - "en": "mouth", - "fr": "bouche" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fboca.webp?alt=media&token=7e81102f-105b-4d12-9aaa-75ad145bbf4a" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 778, - "texto": { - "en": "arm", - "fr": "bras" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fbrazo.webp?alt=media&token=7e37e062-4e54-4226-80a1-ad131b7ea8a3" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 780, - "texto": { - "en": "elbow", - "fr": "coude" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcodo.webp?alt=media&token=63ba0037-61a2-43a6-8667-98a165d9c693" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 781, - "texto": { - "en": "neck", - "fr": "cou" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcuello.webp?alt=media&token=f84d7986-8ce0-4769-961b-33bc3d124434" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 782, - "texto": { - "en": "finger", - "fr": "doigt" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fdedos.webp?alt=media&token=9aa0483f-ec5b-405b-a2d5-1100dd29c4d0" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 783, - "texto": { - "en": "bone", - "fr": "OS" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fhuesos.webp?alt=media&token=5a5cf2e5-3784-4bd4-981a-8a1f4b0ea629" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 784, - "texto": { - "en": "shoulder", - "fr": "épaule" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fhombro.webp?alt=media&token=3dd8a8f7-1112-481f-bb85-5bc7f1906efe" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 785, - "texto": { - "en": "tongue", - "fr": "langue" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Flengua.webp?alt=media&token=2709f72b-2c75-4b13-8c8b-cfb383e7eb1f" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 786, - "texto": { - "en": "hand", - "fr": "main" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fmano.webp?alt=media&token=9c37784a-1416-44e0-9e4f-66b91a14ccdf" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 787, - "texto": { - "en": "snot", - "fr": "morve" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fmoco.webp?alt=media&token=1b0893a9-a04a-483e-b3b3-421205246d55" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 788, - "texto": { - "en": "wrist", - "fr": "poignet" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fmunieca.webp?alt=media&token=93fdb3d3-f6bf-462d-bdd7-969b56e610da" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 789, - "texto": { - "en": "butt", - "fr": "bout" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fnalgas.webp?alt=media&token=f30a68d3-fffd-4a9e-a852-8c7ae5f690ff" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 790, - "texto": { - "en": "nose", - "fr": "nez" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fnariz.webp?alt=media&token=63d5ec69-287f-4c90-be26-0ab914885f7a" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 791, - "texto": { - "en": "eyes", - "fr": "les yeux" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fojos.webp?alt=media&token=0cd2a2d8-83aa-45b0-9e6c-2ad9105c2c80" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 792, - "texto": { - "en": "belly button", - "fr": "nombril" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fombligo.webp?alt=media&token=67d379bf-68c6-4261-8f3b-73d8ae2d42e4" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 793, - "texto": { - "en": "ear", - "fr": "oreille" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Foreja.webp?alt=media&token=63fccce7-1454-4e0a-a725-6d3feddf8c72" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 794, - "texto": { - "en": "organs", - "fr": "organes" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Forganos.webp?alt=media&token=65032cca-fd5c-4b8b-9f09-438818366c48" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 795, - "texto": { - "en": "belly", - "fr": "ventre" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fbarriga.webp?alt=media&token=485c7a63-7546-4f0a-9da4-0d8fc1b97be0" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 797, - "texto": { - "en": "chest", - "fr": "poitrine" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpecho.webp?alt=media&token=55d7a439-26c1-48b6-82ae-8d749d0142d7" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 799, - "texto": { - "en": "foot", - "fr": "pied" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpie.webp?alt=media&token=461fd01a-1ce2-49e7-9d95-c1b07079734b" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 800, - "texto": { - "en": "lung", - "fr": "poumon" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpulmones.webp?alt=media&token=9fd10e4a-561e-4140-892b-164b87c3859e" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 802, - "texto": { - "en": "knee", - "fr": "le genou" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Frodilla.webp?alt=media&token=abca8679-496e-42ac-8d16-7bf963ccd560" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 803, - "texto": { - "en": "saliva", - "fr": "salive" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fsaliva.webp?alt=media&token=5db48872-d5c5-40f7-95cc-7232d323b873" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 804, - "texto": { - "en": "blood", - "fr": "du sang" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fsangre.webp?alt=media&token=48399efe-6a12-4413-b61d-28ffa8dc5576" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 806, - "texto": { - "en": "boobs", - "fr": "seins" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ftetas.webp?alt=media&token=e99632cc-4c1c-4855-baf3-31f28b80bce4" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 807, - "texto": { - "en": "ankle", - "fr": "cheville" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ftobillo.webp?alt=media&token=077938b4-f18b-4d2e-b386-ea9e35be9539" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 809, - "texto": { - "en": "nail", - "fr": "clou" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Funia.webp?alt=media&token=5d43c3a6-52bf-4a22-90b5-cf4f7e42fd9c" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 810, - "texto": { - "en": "before", - "fr": "avant" - }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fantes.webp?alt=media&token=3dd6363e-4ce8-439b-ade7-79d2988c5d3d" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 811, - "texto": { - "en": "yesterday", - "fr": "hier" - }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fayer.webp?alt=media&token=651e6c3e-091b-4586-91e3-666afc9be72e" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 812, - "texto": { - "en": "after", - "fr": "après" - }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fdespues.webp?alt=media&token=5e7ca0db-5aa6-40d1-a0f2-6fa71c76e76e" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 815, - "texto": { - "en": "tomorrow", - "fr": "demain" - }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fmaniana.webp?alt=media&token=ed816c6e-a76b-457d-898d-684ae82d70f1" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 816, - "texto": { - "en": "fall", - "fr": "tomber" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fotonio.webp?alt=media&token=1d1a0c5b-e4c7-4976-879b-357f3c84ee62" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 817, - "texto": { - "en": "spring", - "fr": "printemps" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fprimavera.webp?alt=media&token=aaea64e6-61c9-4c6d-8357-ec36fb5e9031" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 818, - "texto": { - "en": "summer", - "fr": "été" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fverano.webp?alt=media&token=ec7103a4-ece7-47e3-988d-3ed2075f5f65" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 819, - "texto": { - "en": "sick", - "fr": "malade" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fenfermo.webp?alt=media&token=764245fa-4e99-479e-8b3b-d7a08264a54a" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 820, - "texto": { - "en": "diarrhea", - "fr": "la diarrhée" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fzid_diarrea.webp?alt=media&token=1ebef72f-8be3-40e9-8acb-baf64842e986" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 821, - "texto": { - "en": "pain", - "fr": "douleur" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fzid_dolor.webp?alt=media&token=fa664a43-d014-4cdf-aa74-bfe5a48bbbfa" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 822, - "texto": { - "en": "toothache", - "fr": "mal aux dents" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fzid_dolor_de_muela.webp?alt=media&token=296042a8-304b-49f4-8dc3-eecf5c7e4ef1" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 823, - "texto": { - "en": "chest pain", - "fr": "douleur de poitrine" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fzid_dolor_de_pecho.webp?alt=media&token=90df8549-8eb6-4006-959a-b51b4a8481d7" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 824, - "texto": { - "en": "earache", - "fr": "mal d'oreille" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fzid_dolor_de_oido.webp?alt=media&token=53457290-15a6-4afb-9a67-6a251f8d17ea" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 825, - "texto": { - "en": "stomachache", - "fr": "maux d'estomac" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fzid_dolor_de_espalda.webp?alt=media&token=b8ed9cd5-04d7-4d51-87a4-2ff15b5ca7bb" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 826, - "texto": { - "en": "throat sore", - "fr": "mal de gorge" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fzid_dolor_de_garganta.webp?alt=media&token=1f994ca1-0abf-4377-93f1-520004a95ec2" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 827, - "texto": { - "en": "headache", - "fr": "mal de tête" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fzid_dolor_de_cabeza.webp?alt=media&token=20980fc1-4310-482a-89c1-1a37141fcacd" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 828, - "texto": { - "en": "constipation", - "fr": "constipation" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Festrenimiento.webp?alt=media&token=c7741445-f298-403a-95a9-291596fac8f6" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 829, - "texto": { - "en": "flu", - "fr": "grippe" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fzid_gripe.webp?alt=media&token=561b5a4b-f721-40e8-93d1-c4f73acc0044" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 831, - "texto": { - "en": "cold", - "fr": "du froid" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fzid_resfriado.webp?alt=media&token=88ccba98-7926-49f5-b376-aac36faecd74" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 834, - "texto": { - "en": "football match", - "fr": "match de football" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_partido.webp?alt=media&token=75c30e48-e4d6-4cf9-abb3-a35cfbdc2043" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 835, - "texto": { - "en": "Football", - "fr": "Football" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_futbol.webp?alt=media&token=50db7655-7aff-4f93-9b68-875cc5706c7a" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 836, - "texto": { - "en": "one", - "fr": "un" - }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Funo.webp?alt=media&token=86499f4d-0702-4d07-beab-c235b500de25" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 837, - "texto": { - "en": "two", - "fr": "deux" - }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fdos.webp?alt=media&token=e1040518-cecd-4ff2-a1d2-ff2bcbfd42ba" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 838, - "texto": { - "en": "three", - "fr": "Trois" - }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ftres.webp?alt=media&token=52b1eca2-d7b8-470a-b252-bc815998c32e" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 839, - "texto": { - "en": "four", - "fr": "quatre" - }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcuatro.webp?alt=media&token=2b9cb275-8a39-45cb-bce7-6bf2f3bbeb4b" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 840, - "texto": { - "en": "five", - "fr": "cinq" - }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcinco.webp?alt=media&token=62c2628b-899f-4e6b-991e-57e58f7083da" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 841, - "texto": { - "en": "six", - "fr": "six" - }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fseis.webp?alt=media&token=b7811c3a-4c9b-4f54-93da-fe6fd12e84d8" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 842, - "texto": { - "en": "seven", - "fr": "Sept" - }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fsiete.webp?alt=media&token=6e7d62b1-62b9-4eaf-acc2-5ec55eb46d9b" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 843, - "texto": { - "en": "eight", - "fr": "huit" - }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Focho.webp?alt=media&token=e52965f6-188c-4b34-b973-b2d45b962e9d" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 844, - "texto": { - "en": "nine", - "fr": "neuf" - }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fnueve.webp?alt=media&token=0ae70911-b2ac-47ab-8efc-c2d048819b53" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 845, - "texto": { - "en": "ten", - "fr": "Dix" - }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fdiez.webp?alt=media&token=8684b962-ecf3-48e7-8f36-fe065caea19b" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 846, - "texto": { - "en": "zero", - "fr": "zéro" - }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcero.webp?alt=media&token=f21cba0a-a49b-4d7c-9f49-adde729892c6" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 850, - "texto": { - "en": "minim", - "fr": "blanche" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fblanca.webp?alt=media&token=29601eda-4a20-47a7-b271-dd003afaa6d9" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 851, - "texto": { - "en": "peruvian box", - "fr": "boîte péruvienne" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcajon.webp?alt=media&token=65cd501e-2856-4424-a0a9-a3395494520d" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 853, - "texto": { - "en": "chore", - "fr": "corvée" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcoro.webp?alt=media&token=bb964d61-b045-4569-a9fa-43df344f7444" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 855, - "texto": { - "en": "guitar", - "fr": "guitare" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fguitarra.webp?alt=media&token=702e15f5-2020-43b4-a4a0-339de944b32c" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 857, - "texto": { - "en": "musical instruments", - "fr": "instruments de musique" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Finstrumentos.webp?alt=media&token=b58a39b2-6c69-4b19-8658-8a6a4fe7ca2a" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 860, - "texto": { - "en": "music lesson", - "fr": "cours de musique" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_musica_id.webp?alt=media&token=7256f5b2-50d3-404c-b028-d3d4e81276bd" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 865, - "texto": { - "en": "piano", - "fr": "piano" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpiano.webp?alt=media&token=e07c1a80-4bb9-455d-b249-75f1731bb974" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 870, - "texto": { - "en": "drum", - "fr": "tambour" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ftambor.webp?alt=media&token=f5b6ecd0-a046-4281-bff7-a4d9b43e812a" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 871, - "texto": { - "en": "triangle", - "fr": "Triangle" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ftriangulo.webp?alt=media&token=6c36ca91-d690-4221-a208-4bf0ab4229db" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 874, - "texto": { - "en": "trumpet", - "fr": "trompette" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ftrompeta.webp?alt=media&token=e670470a-5b54-4e66-a80e-bf6a11e10863" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 876, - "texto": { - "en": "violin", - "fr": "violon" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fviolin.webp?alt=media&token=6db738b3-f616-412c-9c83-1fba5996c080" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 878, - "texto": { - "en": "aspirine", - "fr": "aspirine" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_aspirina.jpg?alt=media&token=1104fe22-4f42-4bba-a75d-bb25af56333e" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 881, - "texto": { - "en": "descongestant", - "fr": "descongestant" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_descongestivo.jpg?alt=media&token=30ce525c-874f-4c72-af98-23ac6609dab5" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 882, - "texto": { - "en": "digestive", - "fr": "digestif" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_digestivo.webp?alt=media&token=0a2a998d-5647-4676-b38d-4ec2b5e89d0e" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 884, - "texto": { - "en": "syrup", - "fr": "sirop" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fjarabe.webp?alt=media&token=b806ca7f-fa06-4b8d-830b-ff601799ed55" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 885, - "texto": { - "en": "nebulizer", - "fr": "nébuliseur" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fnebulizador.webp?alt=media&token=9632dea8-ba4a-4546-850b-22a310ed3070" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 886, - "texto": { - "en": "pills", - "fr": "pilules" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpastillas.webp?alt=media&token=074e4198-f3ba-4790-b525-aaaeade3366b" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 887, - "texto": { - "en": "bandage", - "fr": "bandage" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fvenda.webp?alt=media&token=e72b4a6f-825c-47bd-bd4b-5aae4ebd0ed1" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 889, - "texto": { - "en": "although", - "fr": "bien que" - }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Faunque.webp?alt=media&token=3391538b-22f9-4361-b227-245c79d6c2e3" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 890, - "texto": { - "en": "which?", - "fr": "lequel?" - }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcual.webp?alt=media&token=30542648-4e68-4cb3-b4e4-beccc65f2a1c" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 891, - "texto": { - "en": "anyone", - "fr": "n'importe qui" - }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcualquier.webp?alt=media&token=acf40755-f64a-428e-8222-44e1f474ba69" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 892, - "texto": { - "en": "when?", - "fr": "quand?" - }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcuando.webp?alt=media&token=de1e2647-da8a-4e65-ba6e-2abbfdd1636e" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 893, - "texto": { - "en": "how many?", - "fr": "combien?" - }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcuantos.webp?alt=media&token=3907d69b-e474-4ab8-a7ad-97eb99823477" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 894, - "texto": { - "en": "how much", - "fr": "combien" - }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcuantos.webp?alt=media&token=3907d69b-e474-4ab8-a7ad-97eb99823477" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 895, - "texto": { - "en": "his", - "fr": "le sien" - }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fdel.webp?alt=media&token=b3f31b71-2488-4636-a036-e420dc519c2f" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 896, - "texto": { - "en": "hers", - "fr": "la sienne" - }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fdel.webp?alt=media&token=b3f31b71-2488-4636-a036-e420dc519c2f" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 897, - "texto": { - "en": "its", - "fr": "ses" - }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fdel.webp?alt=media&token=b3f31b71-2488-4636-a036-e420dc519c2f" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 898, - "texto": { - "en": "and", - "fr": "et" - }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fe.webp?alt=media&token=4b5833d7-9d6a-40f1-a90a-ef23d13ece1b" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 899, - "texto": { - "en": "he", - "fr": "il" - }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fel.webp?alt=media&token=dafa6e53-8f89-4722-9fd5-ca4d1c942aea" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 900, - "texto": { - "en": "she", - "fr": "elle" - }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fel.webp?alt=media&token=dafa6e53-8f89-4722-9fd5-ca4d1c942aea" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 901, - "texto": { - "en": "I like", - "fr": "J'aime" - }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fgustar.webp?alt=media&token=fe83aa9b-071b-44c6-9a1c-e2e892e0d8b3" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 903, - "texto": { - "en": "no one", - "fr": "personne" - }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fnadie.webp?alt=media&token=af36278a-a443-4d56-9d03-78a072f0aa56" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 904, - "texto": { - "en": "neither", - "fr": "ni" - }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fni.webp?alt=media&token=d2bafbdf-863b-4f34-b4c8-6cddc8031062" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 905, - "texto": { - "en": "none", - "fr": "aucun" - }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fningunos.webp?alt=media&token=0a10497d-0497-462a-bb53-ed6f227bb7b6" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 906, - "texto": { - "en": "none", - "fr": "aucun" - }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fningunos.webp?alt=media&token=0a10497d-0497-462a-bb53-ed6f227bb7b6" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 907, - "texto": { - "en": "I don't like", - "fr": "Je n'aime pas" - }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fno_gustar.webp?alt=media&token=e2b175cd-9167-4be8-9b9a-4cffafb7403b" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 910, - "texto": { - "en": "or", - "fr": "ou" - }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fo.webp?alt=media&token=30bbee61-26e4-42b4-8663-40f542478523" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 911, - "texto": { - "en": "who?", - "fr": "qui?" - }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fquien_es.webp?alt=media&token=c30b2009-2039-4ffb-a85c-12ddf5e68908" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 912, - "texto": { - "en": "that", - "fr": "cette" - }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fque.webp?alt=media&token=f87f3317-4166-4243-ae02-8dbea7c7e695" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 913, - "texto": { - "en": "what?", - "fr": "quelle?" - }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fque_pregunta.webp?alt=media&token=746d6a83-4d91-4be2-8a20-3cdbf6ecdd0b" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 914, - "texto": { - "en": "who?", - "fr": "qui?" - }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fquien.webp?alt=media&token=94d5cbe4-5aab-4898-b2b3-d335741935ab" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 915, - "texto": { - "en": "who?", - "fr": "qui?" - }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fquienes.webp?alt=media&token=52dd1ebb-74ef-4b1a-9cff-0180ed85ea3d" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 918, - "texto": { - "en": "theirs", - "fr": "les leurs" - }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fsuyos.webp?alt=media&token=1265f18e-c7f5-4f94-852a-76c1f9841d25" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 919, - "texto": { - "en": "yours", - "fr": "le tiens" - }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ftuya.webp?alt=media&token=e38d6e6e-0e88-4374-8d9c-8dc5725de50e" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 920, - "texto": { - "en": "yours", - "fr": "le tiens" - }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ftuya.webp?alt=media&token=f0b677b3-7fbe-4d02-8e31-ecae0ba9b0da" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 923, - "texto": { - "en": "and", - "fr": "et" - }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fy.webp?alt=media&token=a6efd48e-4961-43ff-9827-b72b6b8403d8" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 924, - "texto": { - "en": "overcoat", - "fr": "pardessus" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fabrigos.webp?alt=media&token=64ed9ddd-1b04-40b4-922e-3280d633c0fe" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 928, - "texto": { - "en": "bikini", - "fr": "bikini" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fbikinis.webp?alt=media&token=f901e863-6e71-4b05-8275-859616e7f2fe" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 930, - "texto": { - "en": "bag", - "fr": "sac" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fbolsa.webp?alt=media&token=e9b61c73-7dfc-4425-8005-56267ca563a4" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 931, - "texto": { - "en": "boot", - "fr": "démarrage" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fbota.webp?alt=media&token=8c87ccb0-c105-4fed-8ea6-e126c3000beb" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 934, - "texto": { - "en": "button", - "fr": "bouton" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fbotones.webp?alt=media&token=4ebeb788-7618-46be-9aaf-016d66fc298b" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 936, - "texto": { - "en": "scarf", - "fr": "écharpe" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fbufandas.webp?alt=media&token=2a6e67eb-235e-4668-9b7f-2c656f174ffc" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 938, - "texto": { - "en": "footwear", - "fr": "chaussure" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcalzado.webp?alt=media&token=aae778c8-0b55-4c4c-9907-e943ef51f77d" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 939, - "texto": { - "en": "shirt", - "fr": "chemise" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcamisas.webp?alt=media&token=77ef1c19-9414-4fa7-b3e4-b0e304c724c2" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 940, - "texto": { - "en": "long sleeve", - "fr": "manche longue" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcamiseta_de_manga_larga.webp?alt=media&token=89da6e32-4371-471a-b8cf-d86a43c6e78c" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 941, - "texto": { - "en": "jacket", - "fr": "veste" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcampera.webp?alt=media&token=a0569880-f80b-452d-a88c-d7b52d803e0c" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 951, - "texto": { - "en": "hat", - "fr": "chapeau" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fgorro.webp?alt=media&token=7d67441b-5c98-4de4-b963-9dbcaed92805" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 954, - "texto": { - "en": "jean", - "fr": "jean" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fjean.webp?alt=media&token=63fd1bde-8163-458a-a66c-6843038ec3f6" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 956, - "texto": { - "en": "overall", - "fr": "global" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fmono.webp?alt=media&token=7a7422c4-a218-41c5-ae87-1f27be86fca5" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 960, - "texto": { - "en": "trouser", - "fr": "pantalons" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpantalon.webp?alt=media&token=313784be-798d-44ee-8347-7b8b0ae797f2" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 962, - "texto": { - "en": "shorts", - "fr": "short" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpantalones_cortos.webp?alt=media&token=48ca7ec7-555a-40c9-b325-34eddf840149" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 968, - "texto": { - "en": "bra", - "fr": "soutien-gorge" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fsosten.webp?alt=media&token=1a3d73cc-5ee1-4f01-ab48-45ca047a5443" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 969, - "texto": { - "en": "sweater", - "fr": "chandail" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fsweater.webp?alt=media&token=9998eaa9-ac10-4469-a5a4-b4f1a4f7ae11" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 971, - "texto": { - "en": "dress", - "fr": "robe" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fvestido.webp?alt=media&token=d3b3e62b-5471-4bf4-b71a-9c941c4d65f6" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 972, - "texto": { - "en": "bandana", - "fr": "bandana" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcinta_de_pelo.webp?alt=media&token=77776f51-148a-40ca-b3d5-761364ca7003" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 973, - "texto": { - "en": "shoe", - "fr": "chaussure" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fzapato.webp?alt=media&token=a51da690-0fca-4643-bc09-9c79079e25c5" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 974, - "texto": { - "en": "snicker", - "fr": "snicker" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fzapatilla_de_deporte.webp?alt=media&token=b6c013b5-a117-41ac-b0fc-1ca3754abdf0" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 975, - "texto": { - "en": "chess", - "fr": "échecs" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fajedrez.webp?alt=media&token=0a869cce-d01f-4275-b7b2-eb0b91490175" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 976, - "texto": { - "en": "kite", - "fr": "cerf-volant" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcometa.webp?alt=media&token=a22a7840-294f-4fe2-aec1-6328f7dfe09c" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 977, - "texto": { - "en": "cubes", - "fr": "cubes" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcubos_apilables.webp?alt=media&token=2b2fa371-b481-4aa8-b1b0-072a4fa934bb" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 980, - "texto": { - "en": "truck", - "fr": "un camion" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcamion_de_juguete.webp?alt=media&token=95137b41-ea78-4a82-8fcc-9effdb9f08e5" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 981, - "texto": { - "en": "firetruck", - "fr": "camion de pompier" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcoche_de_bomberos.webp?alt=media&token=259f65d9-b5bd-4b8d-91cd-df0fca11b6a1" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 982, - "texto": { - "en": "kitchenet", - "fr": "cuisinette" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcocinita.webp?alt=media&token=5cd82ee3-0664-4aa6-b819-665c6c02fd2f" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 986, - "texto": { - "en": "story", - "fr": "récit" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcuento.webp?alt=media&token=2f3fa4f7-9f55-424e-a587-8974d1728f84" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 987, - "texto": { - "en": "ballons", - "fr": "ballons" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fglobos.webp?alt=media&token=1ad716c7-890b-477b-9a8d-c904a0c2c401" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 989, - "texto": { - "en": "toys", - "fr": "jouets" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fjuguetes.webp?alt=media&token=046c8f8b-7518-4aac-9c56-6ac6fe4a03ef" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 996, - "texto": { - "en": "ball", - "fr": "ballon" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpelota.webp?alt=media&token=ae1475c3-af87-493d-8843-3ad0720b6fb8" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 1001, - "texto": { - "en": "football", - "da": "fodbold" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpelota_de_futbol.webp?alt=media&token=7cad69b4-d5bc-4464-89b3-f411d7de08bc" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 1005, - "texto": { - "en": "jigsaw", - "da": "puslespil" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Frompecabezas.webp?alt=media&token=a1901342-85d3-4e93-9b0d-2ef3b599d05b" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 1012, - "texto": { - "en": "pillow", - "da": "pude" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Falmohada.webp?alt=media&token=ad78fd9b-ae55-4372-a510-ab4944730826" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 1013, - "texto": { - "en": "movie theater", - "da": "biograf" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcine.webp?alt=media&token=4109bb74-ab3d-4cda-99fb-34e7030e8762" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 1014, - "texto": { - "en": "food", - "da": "mad" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcomida.webp?alt=media&token=20c3c26a-3091-40c6-87b2-6e38230a0e94" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 1016, - "texto": { - "en": "computer", - "da": "computer" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fordenador.webp?alt=media&token=9452b67d-5e5c-456a-bb33-1398701f7f00" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 1017, - "texto": { - "en": "book", - "da": "Bestil" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Flibro.webp?alt=media&token=ce9ae11b-a7e1-48ae-bc73-36358db5e1ec" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 1019, - "texto": { - "en": "cd player", - "da": "CD afspiller" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fradio_cd.webp?alt=media&token=be52e6f8-9f19-444c-aa13-a1a63c8bae42" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 1020, - "texto": { - "en": "towel", - "da": "håndklæde" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ftoalla.webp?alt=media&token=2364b04f-3636-42c0-b40f-06fca87b6477" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 1023, - "texto": { - "en": "", - "da": "" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcocina.webp?alt=media&token=0f13280e-6377-482b-80f8-88b87659718c", - "pictoEditado": "/storage/emulated/0/Android/data/com.stonefacesoft.ottaa/Files/MI_03082016_181141.png" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 1024, - "texto": { - "en": "", - "da": "" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fnevera.webp?alt=media&token=26ab2e17-fa2b-49cc-875d-1eb22929b367", - "pictoEditado": "/storage/emulated/0/Android/data/com.stonefacesoft.ottaa/Files/MI_03082016_181219.jpg" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - } -] \ No newline at end of file diff --git a/assets/languages/pt_BR.json b/assets/languages/pt_BR.json new file mode 100644 index 00000000..9ee69822 --- /dev/null +++ b/assets/languages/pt_BR.json @@ -0,0 +1,2504 @@ +{ + "-2UbAou9ydr8XeN-jtIz4": { + "text": "limpiar" + }, + "-GL2iAgykP10Ae3AKsVOX": { + "text": "sal" + }, + "-LE2iv3Pwr5KuIyM5bYb3": { + "text": "bien" + }, + "-LwAKwgCdVkzwM579zRMo": { + "text": "más" + }, + "-aePI8WknXpxEpz19Lu48": { + "text": "suyos" + }, + "-msU3yor4qJYQHJtWrdk8": { + "text": "pastas" + }, + "00AkNJ4YLpbRD_mLmQjtp": { + "text": "almuerzo" + }, + "0IrLGI8Ebm8rcS3ymUXqS": { + "text": "hambre" + }, + "0THELgiQ7rvA-orESXJfV": { + "text": "avión" + }, + "0Vkmy6BZcJn3pFurEevL9": { + "text": "estudiar" + }, + "0Z7uFXpp-XRXmqM8ILhIC": { + "text": "poco" + }, + "0_SK41wNOk6mw2qX_eHXM": { + "text": "cine" + }, + "0cdYDZ5HPaTmqTTN0_Ee8": { + "text": "suerte" + }, + "0fHziRVxg0oNDp5pyiI8M": { + "text": "permiso" + }, + "0fcYcD_r0jNWXTTAx8Ph7": { + "text": "aeropuerto" + }, + "0gAyTD6sImo0jpD_bYGVv": { + "text": "jueves" + }, + "0huLn-H32Cbwba28IZ3tc": { + "text": "burbujas" + }, + "0jpMJu8isUmOZKxhZ_yaj": { + "text": "equipo" + }, + "0pFtmDZdlnLrUkT_XZDXQ": { + "text": "antes" + }, + "0qoQs8WyLVONnu3_eBGfD": { + "text": "dolor de cabeza" + }, + "0v5fqIp8GmXsIHO0SPhtt": { + "text": "dale" + }, + "0vttFf3nAGDW6g5wVStcH": { + "text": "disculpa" + }, + "1-VwcvzNfvrwDWRGxRPre": { + "text": "ni" + }, + "10X4OKR5xmNhSj86sbyE_": { + "text": "salchichas" + }, + "14aCIW665UZtuwNsKKV5s": { + "text": "cartuchera" + }, + "17AkRFlfC_koV-lywmDE8": { + "text": "pantalones cortos" + }, + "1B1WmC-V0PglDeRAeINcT": { + "text": "mirar" + }, + "1DjW-XvWN7iOqoJPRSWwY": { + "text": "mal" + }, + "1IjenNwPwsMIWZ4aYBk8S": { + "text": "partido" + }, + "1Ph13Z_Ya6p-q0WA7pSl3": { + "text": "pájaro" + }, + "1QEfLU_S7TM0iMr9VZVtP": { + "text": "ronda" + }, + "1Rv9-SSJjHptwvzqLbdbx": { + "text": "divertido" + }, + "1WJZO-pUkTaQvyxz41iB-": { + "text": "picado" + }, + "1YOlJCovdcnnqVihqHVmq": { + "text": "acá" + }, + "1b71P9YjaNWnX8AWjstqG": { + "text": "remera" + }, + "1mS8kgJIod1cyUFH-msnM": { + "text": "estación" + }, + "1mU2ZosZXSJrxkh1NmxJT": { + "text": "izquierda" + }, + "1nhsReHG-f-bW-xaZBsxY": { + "text": "abajo" + }, + "1pb6S-RR_3zdCq77YFiZ-": { + "text": "¡qué mal!" + }, + "1zU7kolOKsHP9-oomQW1Q": { + "text": "rey" + }, + "27GbVOZ-szdnzsy92oY-X": { + "text": "manteca" + }, + "2CgcUkvJUskv982FvG54A": { + "text": "plata" + }, + "2HkB0WZYP7cvWLD39GMQj": { + "text": "bañar" + }, + "2KO0BFtB4B6fu1feuAZLt": { + "text": "verbos" + }, + "2RZTRMX56BFLrW7tLJ3Hy": { + "text": "mismo" + }, + "2Vc2H462cutVtUC-5omJk": { + "text": "pocos" + }, + "2dwtZO2wCm520GPD1i6dl": { + "text": "dolor de garganta" + }, + "2t_eq1JmgHa0R3eu8LMmI": { + "text": "ventilador" + }, + "2u2-AFuI245I7bZ6tsSPh": { + "text": "¿quién?" + }, + "2y9pxVOBQ2tMdPHcsqQb8": { + "text": "martes" + }, + "3-ueUrnwmIIj0BMP8_Ntb": { + "text": "uña" + }, + "32PnZjlnQbTJo4nL9YJYe": { + "text": "feliz" + }, + "3932Zm0xgk1hKB2hhBAUa": { + "text": "colectivo" + }, + "3KbwCHGooNLySWOBlFFuG": { + "text": "cocinita" + }, + "3KgKNNnuYMrysEDs3Pu4Z": { + "text": "subtítulo" + }, + "3VEnVjaGFCImBAZ3wEChu": { + "text": "ropa" + }, + "3arbCGI6fMOWALLanZcg3": { + "text": "capuchino" + }, + "3dtvYLjbl5oDyhZO9eFRY": { + "text": "ellos" + }, + "3mwcdenOurU_e59ChLqb0": { + "text": "fuera" + }, + "3w62N9b7Cvb6JMjB9Wphi": { + "text": "beber" + }, + "40q0NJ6vsziJDNFBqho7Y": { + "text": "dentro" + }, + "4A_FNkGH1EDu0oabPurrL": { + "text": "cereales" + }, + "4J1bWl6BbbEdZsRGsgYH2": { + "text": "queso" + }, + "4X7OXm35OSHoSlPxGUi_f": { + "text": "mueble" + }, + "4bHGIoQmDN8LptpdNN4v6": { + "text": "vacaciones" + }, + "4f1vqDoAvUu2XYk_JlQdC": { + "text": "siete" + }, + "4rctwNiN4UaU9lqU48MHG": { + "text": "computadora" + }, + "4rzonBodQXfs77gALnAP_": { + "text": "cerveza" + }, + "50wJdR0-3YLnv9y_2Gx_e": { + "text": "saltar" + }, + "54BVjn2seJWdBNGI20-yJ": { + "text": "computadora" + }, + "54taab8z9ziXt0IqXHkV9": { + "text": "dedos" + }, + "5L5UzBHOzuHRoO-jyPuEx": { + "text": "ciudad" + }, + "5LYjhk-N87Ov9NrQcGbLQ": { + "text": "aceite" + }, + "5Tdy0Gu9SiLsPfWwd-Y2E": { + "text": "lindo" + }, + "5VBtwEswIjrv1zbXP-oFn": { + "text": "sopa" + }, + "5W5_sCAyGTkVzguCEg1d1": { + "text": "jugo" + }, + "5dvq344JstkxUpHszaPfp": { + "text": "delfín" + }, + "5gPT9lrNgpRkF07lP6zOq": { + "text": "jugo de manzana" + }, + "5i3kSsCKF7Oa9iJQvXiTe": { + "text": "más o menos" + }, + "5kjlzqb9Rf3zzqZROaZ9p": { + "text": "perder" + }, + "5mGrGHzdw_vCwYCRNPcPw": { + "text": "pasear" + }, + "5vxTXbPl4Y0yezGu7p1f6": { + "text": "hacer" + }, + "6KicPX6y_u2i6tPBZAtvA": { + "text": "lavar" + }, + "6jLkKc9OL5btNOmjJem6S": { + "text": "poner" + }, + "6lYN4qSZx3_tKDClp4Iyr": { + "text": "entre" + }, + "6nhNeVjDfDi-GmreaqfVo": { + "text": "nublado" + }, + "6rcOXG6yxpzHLzMJ9IayI": { + "text": "cerrar" + }, + "6t2sPdapSNJrOziDozTWW": { + "text": "vaca" + }, + "71l2at-8480bvijxn3uBl": { + "text": "durante" + }, + "75gujwNXJdAiNmK6Ffhia": { + "text": "jugo" + }, + "79xBF6cKgKeD4GeBPe_Ds": { + "text": "bolsa" + }, + "7EsVGfapPc_38mHCBy3C3": { + "text": "enamorado" + }, + "7Hz61-WzV62FHsedOwz6q": { + "text": "flan" + }, + "7Q4Zc0cenSF5U4eKyje1f": { + "text": "hacia" + }, + "7Q9sNljseWjwSPW4in1ga": { + "text": "recepción" + }, + "7VL_MgnLDY6hi8sbvcGIg": { + "text": "silencio" + }, + "7WxUVoVQfQOzARU2bf6HP": { + "text": "casa" + }, + "7iAXKVm22uMgr6aqZ1rr7": { + "text": "abuelo" + }, + "8-4M30dTtmuUJus9MtGqV": { + "text": "moco" + }, + "81UJI7xOa5l9mVceqkIP5": { + "text": "tener frío" + }, + "82LicIQc3K2xCTEt-iMpu": { + "text": "caracol" + }, + "86gNdF6aTepa0Y9zkD1VQ": { + "text": "campo" + }, + "8FFwIw7rJri79BITZBUzm": { + "text": "hotel" + }, + "8KlFB3an1mzdQd6-LGCCE": { + "text": "merienda" + }, + "8LddDqylw-51wHhx9_Qad": { + "text": "libro" + }, + "8MV4ZFthtUeoxLAIbqGTc": { + "text": "carne" + }, + "8cOIYr-hcK54qWpuT-41e": { + "text": "cuento" + }, + "8fGingRAd8idw4qcxyZ-Q": { + "text": "vergüenza" + }, + "8iFdjRTQU7ONGnigRTlm8": { + "text": "¿cuánto sale?" + }, + "8vR0HYniXtrrQqqSIN_JQ": { + "text": "familia" + }, + "904w9Je6oDwGXUCIcrUZX": { + "text": "lengua" + }, + "93YmZA7VfAT7TTNTsDE1W": { + "text": "serie" + }, + "93hsW10TmX3Vcq_4IvcZ0": { + "text": "blanco" + }, + "93tHieC_CgZqN998y5gAv": { + "text": "chuleta" + }, + "97nIv-aoc51T8kKTZV5cM": { + "text": "saliva" + }, + "9EqfwMNtATh1fwMhyn_B1": { + "text": "buena" + }, + "9FiWvg197C-Riid-DVysN": { + "text": "claro" + }, + "9GqE148SFZqMIft4evAk2": { + "text": "comer" + }, + "9MzeUcz1nRqleTkmS_-g2": { + "text": "barco" + }, + "9QyJdpUn0f6g7FxWs5qpO": { + "text": "cortar" + }, + "9U8MzceIsqKhG86oNx9zV": { + "text": "coche" + }, + "9UwpyOnOBoqr4mX3Juqm2": { + "text": "buenas tardes" + }, + "9ZnzbKMDwGEwC3hXOhXFe": { + "text": "pastillas" + }, + "9dvSIpeXa2_12Jip6noJP": { + "text": "deportista" + }, + "9kgRI3KlOIVSuylKffW9g": { + "text": "colores" + }, + "9lS0mNuKIS0olyDwoIJBR": { + "text": "médico" + }, + "9mLx-YMK81AflitELQFqk": { + "text": "papel" + }, + "9s5zV3_oGyDx_NEvsKCxX": { + "text": "violín" + }, + "9wE9Py6ztyqDrtaypsltA": { + "text": "naranja" + }, + "AOp6VGyjYIV0Ym9d0basJ": { + "text": "dibujar" + }, + "APXF-lEplPOloppSeIjAY": { + "text": "menos" + }, + "AQKGKdoX5CYycZ2YqBZVW": { + "text": "barato" + }, + "AT_rDWsr6xRBgrvgw9Zih": { + "text": "nueve" + }, + "AWJXh6URGN0Vwm66i6IvL": { + "text": "hola" + }, + "AeFbJQ0M9uTObAlKEX3zr": { + "text": "pierna" + }, + "Akf0xlH8UJdXn8BJzPV2A": { + "text": "radio" + }, + "B1845IfYfPMz2FWpVFIQv": { + "text": "de" + }, + "BKmATW2uBk4pxnmOaARyq": { + "text": "documentos" + }, + "BNjZz9MGLJEKZ4CZoTs2M": { + "text": "ajedrez" + }, + "BQhqx1PuF94jwT0ySTlbJ": { + "text": "comida" + }, + "BQm-YCPc0lfD1-mhecCTL": { + "text": "yo" + }, + "Bebnh8-UWwtYLnK6p3fKi": { + "text": "pan negro" + }, + "BjqWZnzLlxdOo4KEzZ46j": { + "text": "ocho" + }, + "BqS7d4PMhGRqPYlZQzUbR": { + "text": "puerta" + }, + "Bub9ZYygLcly15D7_wYks": { + "text": "amigo" + }, + "ByrvXHEN9Mb8D--7MQAjM": { + "text": "peluche" + }, + "C12mJ1W11fODI3pv1QOnx": { + "text": "gelatina" + }, + "C29KJ8BTFavhj_R9UfnSv": { + "text": "por" + }, + "C2bgADoxmINRnAiYxZHqd": { + "text": "taxista" + }, + "CBTemIvgIN1UAtftkc3sz": { + "text": "pegar" + }, + "CCWCtXdMuQBJRmaFOAlfQ": { + "text": "navidad" + }, + "CY-IQvUehkaiGFCdKf9bf": { + "text": "chorizo" + }, + "CYH_6DL9q1iLLetuWeR9A": { + "text": "tener" + }, + "CZrETqLgQlvDkLHvw1t_w": { + "text": "a" + }, + "C_JKGNCxOI5x_f2C4qAyZ": { + "text": "maní" + }, + "CbO32RkDdf9aCucv6BnGS": { + "text": "cabra" + }, + "ChBc7LjL8dgzZ6LUCAHGh": { + "text": "por favor" + }, + "CkTiaqBY3jf86JRq636lt": { + "text": "¿cuál?" + }, + "CsKZSNiJw5Q48b26Kskf-": { + "text": "heroe" + }, + "CxFmyJYmy6gMRqP9U0cBP": { + "text": "estoy perdido" + }, + "CyKtU9yC0Jy7Ypb4WFp6w": { + "text": "perro" + }, + "D1gCni2jXpCvKZe4qCtQN": { + "text": "peces" + }, + "D2tSkngqbQmdKLNhn9xWV": { + "text": "globos" + }, + "D7dt_hFX5DScV_ssm1nKz": { + "text": "pomelo" + }, + "D85FU-Wqr2u53tfTXAtHo": { + "text": "patalear" + }, + "DAq2J_xXHsSCSNPp9qVsk": { + "text": "oler" + }, + "DBd09yUlbkaYLsemjFXEs": { + "text": "helado" + }, + "DG1RiDjDfwWRhpAiIpPqA": { + "text": "vómito" + }, + "DSgrhLHauub-gBqMGwacO": { + "text": "asustado" + }, + "DXb0FpjVM9q8LVl9vvSHn": { + "text": "clases" + }, + "DXpjgLKTdx9eLLohVdmWM": { + "text": "verdulería" + }, + "D_4Weq7iyi7GMEsgP0xy6": { + "text": "té" + }, + "Djs1QsLNf8Q5LBIFV5zNC": { + "text": "partituras" + }, + "DkeHJFtqAS005fYUrl1Xz": { + "text": "pantalon" + }, + "Dm3yiKSB134LrjtW_KrO7": { + "text": "buen día" + }, + "DqGa4gqd2ABDi45BT43x4": { + "text": "princesa" + }, + "Dv9MSCRYbR4Q3K114wXki": { + "text": "alto" + }, + "E-vUPARie8MmfgZwv3Omr": { + "text": "gallo" + }, + "EM8VyonJ7WNdvmRyE3nhZ": { + "text": "lento" + }, + "EO4O-s7oafi6QJdxTFNkd": { + "text": "anticongestivo" + }, + "ETZNYbrG5wveDl6c9k2_k": { + "text": "codo" + }, + "EUsNyf5bDdSLqvZKH1Ltx": { + "text": "no entiendo" + }, + "EVmt43vDI3NHFfbbkqokF": { + "text": "pizza" + }, + "Erg6LuA8IOQ5V8RTP3pPi": { + "text": "abeja" + }, + "F4cGnA_QHsVKTjUE6MAu9": { + "text": "mameluco" + }, + "F7kJ8VM31BWB4K4T4USzs": { + "text": "maltrato físico" + }, + "F8roVYxKZi88UUGfOvTwl": { + "text": "maestra" + }, + "F90bXbc0tz9nuzTT7SgqV": { + "text": "cuatro" + }, + "FBPIabyaoCK-Y0BziQdji": { + "text": "dolor de panza" + }, + "FBTheEQmZZfJRiYjd_Np_": { + "text": "interpretar" + }, + "FO77qpzyz28knodNtILCA": { + "text": "tirar la cadena" + }, + "FTngK946O8S8bYc0g7vM2": { + "text": "mamá" + }, + "FaVvbVzZivuxTwxJTPubK": { + "text": "hermanos" + }, + "FfNU04I4mZ54gWcBXqo2c": { + "text": "panceta" + }, + "FgTird367surh-vxXyAK6": { + "text": "ticket" + }, + "FkC5DtSV81OvFMU99qZGg": { + "text": "pelota" + }, + "FnCBoLSE19WsbUypUKvFc": { + "text": "hamburguesa" + }, + "Fogupb264IyCtbZ-Q2D6w": { + "text": "borracho" + }, + "Fvm2C5NBq01tm0QK9d9QM": { + "text": "hijos" + }, + "G09TvOzDSG5m3hTQD9Tej": { + "text": "borrar" + }, + "G2i9LSK4A19237Zp1vXqF": { + "text": "gordito" + }, + "G6KKVMvPDnjdD9TfBd-B9": { + "text": "playo" + }, + "GAxX7EIz1TTLtMX08RRGr": { + "text": "hamburguesería" + }, + "GJlUSznzEHCgoAOrVrkp9": { + "text": "feliz" + }, + "GSEumxiyeVKRRiaY_c8HW": { + "text": "crol" + }, + "GY_flM-6uR6X3L4AwsiwU": { + "text": "para" + }, + "G_CRpzxWO5XdEMh01O1eJ": { + "text": "aunque" + }, + "Gj7THa6XFHDfYL5H19lwj": { + "text": "mañana" + }, + "Gm_qAGnL4OawmlYmTs7K5": { + "text": "no veo" + }, + "GoJuWnn72TCXONXKtYHMm": { + "text": "tren" + }, + "Gvmy--9DiUn_tkQYWeWhA": { + "text": "canelones" + }, + "GxrDtsdGcLepdsQr6V9DT": { + "text": "verde" + }, + "H2zMVtjvqi7aUtCypiVKr": { + "text": "sentar" + }, + "H8Bsrr2NK9Q3WGbEp8PMe": { + "text": "plateado" + }, + "H9SWPnWbR8qcZA-iu5Mz0": { + "text": "dolor de Oido" + }, + "HBZNu6m3FELU9eg3OeLdx": { + "text": "cortina" + }, + "HKfLJS8aCBtKuKJeSBQUW": { + "text": "golpe" + }, + "HMPabuHqgtyiCmTLzg-rM": { + "text": "entrar" + }, + "HQiQh4PPBvO1n-d7JGVj8": { + "text": "nadie" + }, + "HTBNWax6FCSGXuboGsVUW": { + "text": "salado" + }, + "HnuZA0UTlnuIfFAN7saxl": { + "text": "conejo" + }, + "Hvb4JdDHX_vNMck_US2UN": { + "text": "ensayar" + }, + "I5AJgba5GTdEjdpFB-LBf": { + "text": "chocolatada" + }, + "IAdQsjTsbBUAMjlwW34cw": { + "text": "me encantaría" + }, + "IEeIvawUD2GIAr1Wypr9i": { + "text": "personas" + }, + "IF3R7tLVAkd4RbL8R07K9": { + "text": "actor" + }, + "IM8OUKCzHwnjAQWPFgnn6": { + "text": "lejos" + }, + "INxOSvKbBNOXwruIpuNho": { + "text": "ombligo" + }, + "IO8uTb1K7ElENgp2ujZoK": { + "text": "robusto" + }, + "IXRWmFmtqfnHQRcBf1Idl": { + "text": "paloma" + }, + "IZbfYRzu2cxxDWdbmQeqw": { + "text": "cabeza" + }, + "Ig1oypuwndODbmKh_NEXs": { + "text": "malla" + }, + "IsWUeiPnDEnzxePKclBNp": { + "text": "feo" + }, + "J3qQMp0OMr5LC9ebfArxH": { + "text": "ninguno" + }, + "J3rDL96c2zfBQzP45VRCp": { + "text": "limón" + }, + "J4UUPR-WP0qo1y14bUVI-": { + "text": "veterinario" + }, + "J7MmgugOu20UtMcMPj59r": { + "text": "canción" + }, + "J7wLwBLVx4UANh_x5HdXd": { + "text": "según" + }, + "JB9SIxWzxWFjrbmMuksrY": { + "text": "reir" + }, + "JBIehRNmDbK2ALcRN0u9i": { + "text": "gallo" + }, + "JBKQaBezKuSDaMsnbJMTB": { + "text": "bar" + }, + "JBU2hMw9gbIy9-wGF4mjD": { + "text": "pizarrón" + }, + "JDbBWMB5No0pK6HvntLt4": { + "text": "lavarme las manos" + }, + "JEDIYq1BDA23ac9TNhON-": { + "text": "ayuda" + }, + "JFldbhjqxK3fD6D2K4HY4": { + "text": "papá" + }, + "JGm4BL7HAfuxX_PGe6Jzk": { + "text": "presente" + }, + "JQOpcZSCPGMOWZsN8w_yb": { + "text": "¿qué hora es?" + }, + "JSFuEHlP-CFvuqvFKMumC": { + "text": "autos de juguete" + }, + "JVtu9W3AumOwjUedwhUGE": { + "text": "rehabilitación" + }, + "JZRBfIXBkeuobtDXbLt5t": { + "text": "adiós" + }, + "JawnUo-pseWb3FDVMtxrQ": { + "text": "yogur" + }, + "JblWXW8TKDCuYu2yTnFBA": { + "text": "mesa" + }, + "Ji5OVFX-uNDewL8eX8Cin": { + "text": "pensar" + }, + "Jjq8CM8JrYHIMziuQy-WN": { + "text": "agenda" + }, + "JziaulL-lrAPGNVvwBPK9": { + "text": "verano" + }, + "K382TlNZjdMLLpAhCCXLG": { + "text": "almendras" + }, + "K6hd20tWZfwwlYYi7jctt": { + "text": "rica" + }, + "K8cMIDL0ubQvWhhDtr65F": { + "text": "llorar" + }, + "K8e2-KkvZfFOQaXnhR37x": { + "text": "cansado" + }, + "KC18_sTEqKucPQ-iwEKYY": { + "text": "lapiz" + }, + "KK_i8H9qTfDVYZkQGwd2v": { + "text": "apagar" + }, + "KNH4sLRpVKtHXQa-0y84K": { + "text": "nervioso" + }, + "KWYVDZiERE8jtRsL0faHH": { + "text": "nadar" + }, + "KXHW4m6vXxQU-AEOR4pZ4": { + "text": "balón de fútbol" + }, + "Khdk8mWpyxgLqfC-6lyT9": { + "text": "burro" + }, + "KhyTKtiL4ZT4Z1saU1eJh": { + "text": "escuchar música" + }, + "Kn9vE07FK1LrzoD_YxrJD": { + "text": "subte" + }, + "KpLFOrpuhFKaIbBbFwVVu": { + "text": "mariposa" + }, + "KrOPANVpdkBWdEZoUwxKf": { + "text": "grave" + }, + "KvY6Taigm4Va_cVjXAfGR": { + "text": "corto" + }, + "L0hfYADgzghRVsZLZHRxE": { + "text": "bailarín" + }, + "L19r487_d3RqWXiNuh3gE": { + "text": "¿qué color es?" + }, + "L6YLAEsbYcTq-ycQJTvt4": { + "text": "pollo" + }, + "LAuEISciEf1Wc1j4fERz8": { + "text": "año nuevo" + }, + "LDoi3cxodn_AVKSG-Bf_1": { + "text": "ojos" + }, + "LEVKlDlJ0wHo5QEjCNAGa": { + "text": "pegamento" + }, + "LEg8z-Q-ONLAAXd-aH_Hb": { + "text": "bajo" + }, + "LNBTW0qQtHYQEHatkWGtc": { + "text": "mercado" + }, + "LRIKzfm9ZsdNe1u7CUuW_": { + "text": "¿cuántos?" + }, + "LRfh-4RAZTj7cnnDwBmqj": { + "text": "flotador" + }, + "LU7IoUksATEBhd8PaHS1R": { + "text": "sacar" + }, + "LaKT8VTw0_6rvordp5-R8": { + "text": "rosa" + }, + "LiBr37yi-YBgQDx4unjyc": { + "text": "dá" + }, + "LjTGOcyG7DkTs1lJqNr8w": { + "text": "cabellera" + }, + "LksmOMPPOMArbrFsscqOW": { + "text": "música" + }, + "LmGq1AZs2a0x26r7E9GUj": { + "text": "maestro" + }, + "LngEMJa_ihV8mB7afZX-h": { + "text": "ellas" + }, + "LrDai7jXlGAdZ3e8ZQezj": { + "text": "hacer pis" + }, + "M5q2CXmK0_WVaVUB_HJB3": { + "text": "caliente" + }, + "MEqo2TROHyroK318sm84f": { + "text": "pasta" + }, + "MKR-ukiUlJy4uuqO30UU6": { + "text": "maltrato verbal" + }, + "MMzjhHID8HMqyPjii5o-h": { + "text": "cocina" + }, + "MNCcHiImRS8tmvhBhzCKj": { + "text": "ensalada" + }, + "MQHnvvU48NnEptP8a9w8C": { + "text": "no me gusta" + }, + "MWIzTM6zhTWL1V-brLtBx": { + "text": "cómodo" + }, + "MYqfOzKx2qMHop8GaHs0I": { + "text": "verde Claro" + }, + "MiOe5_Djf-pE9V9aDZ_1G": { + "text": "ananá" + }, + "MqQgYn5B0uV-DMORCBOmV": { + "text": "triste" + }, + "Mw6WRebMAKWwXfAvDA7vu": { + "text": "tener calor" + }, + "N2baGNTOapSaFDo1GURiW": { + "text": "no escucho" + }, + "N7n4zQIkJZOhaYESk2GgH": { + "text": "caer" + }, + "NFdUTit6Ff-4S7Nzf92U5": { + "text": "estreñimiento" + }, + "NFgGqhEtl0HqipCGGEvwU": { + "text": "peinarme" + }, + "NKQwWPAsVHwFBWuksqfns": { + "text": "ducha" + }, + "NLi5ODIzyMAwr2HpDXACp": { + "text": "nariz" + }, + "NQayjogCYiimP_0OxIfFj": { + "text": "zapatos" + }, + "NVe4u7BTAVfLk3xkDqLnZ": { + "text": "horno" + }, + "NVjfEut567uXpTaQUNI2i": { + "text": "campera" + }, + "N_893wsadpGg3Ip5sEThe": { + "text": "azul" + }, + "NaJxTPq9Ld8I4fwAltyEC": { + "text": "maiz" + }, + "NjulpZ9x63ZqxtLMoRjkx": { + "text": "prender la luz" + }, + "Njz8DrErsexBu8mAI6mnr": { + "text": "pescado" + }, + "NmNouLLx13jzE27jliI_v": { + "text": "diente" + }, + "NuhUikdCxP0NgsbO0wvAU": { + "text": "cola" + }, + "O-CLnVuXAUapOn6TbdhKx": { + "text": "querer" + }, + "O450x4W3OOacvJIy4QicJ": { + "text": "verduras" + }, + "OHyrmD5US1rHEAEwLQaII": { + "text": "animales" + }, + "OKXIGnLh-i1ydTNj450Q8": { + "text": "reina" + }, + "OUcfOOReAfQroBKlBdDb-": { + "text": "solución salina" + }, + "OWLDc7Hn3neBAf_V_N27n": { + "text": "abrochar" + }, + "O_ZfCPZSxGMPT6orCt-O6": { + "text": "chancho" + }, + "OblxxVFC-LKPq-8oC9FpE": { + "text": "sentimientos" + }, + "OdCdTUAlbN6kvsPjby_Bi": { + "text": "deportes" + }, + "OeA63q6LpqGvXW-cJXEym": { + "text": "jamón" + }, + "OeytAsSiEAWC10tXhxbTa": { + "text": "personajes" + }, + "OhrHu-xLo8hcn5plWfoX4": { + "text": "caro" + }, + "Om1Bvqu8nmGuNGwV8hndM": { + "text": "bajo" + }, + "OvyFC1GHkvJZ0dAAF1QkY": { + "text": "él" + }, + "OwHzJdOQTFOA8daCVRwm6": { + "text": "pincel" + }, + "P5zdq4x58yp5TA_soKQEJ": { + "text": "bicicleta" + }, + "PAlC0XSZNru3-LXtfvGjo": { + "text": "hacer el amor" + }, + "PBqpK7LL1HQPwowPitrss": { + "text": "leer" + }, + "PFAi3SdvH9vL7_Bg3MhCA": { + "text": "semáforo" + }, + "PIBHv5VueBi-sf5qFCN_Y": { + "text": "ante" + }, + "PIPQnVS2UiS7kGbucJP8l": { + "text": "curar" + }, + "PLXxIPYyztaztLf4sPCst": { + "text": "garganta" + }, + "PbtM3htZocZb8YifuPoY5": { + "text": "cangrejo" + }, + "PfNLmlHKFT9d1w6IgeXbU": { + "text": "control remoto" + }, + "Pl-M4bc6k2rdhu6FHEbkA": { + "text": "patio" + }, + "PogTYrGfa2WNfBRuA8O4e": { + "text": "malo" + }, + "PszHdOxMsS_tAzSrN52Wa": { + "text": "plastilina" + }, + "Pw3GgPwp7fpDVC6wJjgPn": { + "text": "subir" + }, + "Q6LQqdLcvNOiCFjC0DVo2": { + "text": "tambor" + }, + "Q6nNH4AIoSeDHODC_Ip8O": { + "text": "vecino" + }, + "Q9Ra0aJaQnOJQ1Kqdc43-": { + "text": "bebé" + }, + "QCQRmsQY6AggjreY9Z0MF": { + "text": "rechazar" + }, + "QGf1Tb1roL7HAXUSrRqRJ": { + "text": "naranja" + }, + "QJhkOh48xapiTObEDQLB9": { + "text": "piano" + }, + "QTkFHWp9KEDgfCjoQjBY2": { + "text": "plurales" + }, + "QUTQLuD2Gv7fHh0V_O5tg": { + "text": "avergonzado" + }, + "QVqSPPgA89whFTJ0HTphK": { + "text": "abrir" + }, + "QZNQOaf0SdHDbx1otCmrH": { + "text": "niño" + }, + "QcGJ9u_JqmrW0X47PXWH4": { + "text": "despeinada" + }, + "QclUM2p3iexSjFZI8OU4-": { + "text": "fiebre" + }, + "QeqA20MCXB-zNfuKIssMY": { + "text": "lata de atún" + }, + "QllvOUe8utZrcBRGw_0vc": { + "text": "curita" + }, + "QnlQ1HOEB9yNjuW3Dd6fc": { + "text": "celebración" + }, + "Qo3Qn_nMe3E6EqNw0UdNZ": { + "text": "soleado" + }, + "QohNih4wgqjnpWt3kSwtd": { + "text": "entrenador" + }, + "QvaMxPy-3iixHAJFyIrN-": { + "text": "sandwich" + }, + "R06chAQYswLtQK46OInW7": { + "text": "leche con galletas" + }, + "R9ECa_HQRtpFrb59ebMTQ": { + "text": "escuela" + }, + "RBCjBvNXQSZOOpg-5lBlK": { + "text": "bueno" + }, + "RZfMOtjw0DoGHWaRfCEc4": { + "text": "pantalón" + }, + "Ra2rxEEohwxRqDsW2AT3C": { + "text": "videojuegos" + }, + "RbZetbSC5064rZccOFD1D": { + "text": "televisión" + }, + "RkpoG4KB8m_TJFJf2v3EG": { + "text": "cambiar de canal" + }, + "RwlZ1jr2Ix3evzrW71lN0": { + "text": "manzana" + }, + "S3um53pcko7_BPHy7R6FL": { + "text": "nosotros" + }, + "SE-71I_ahm3oKROReyJHE": { + "text": "hacer caca" + }, + "SOyGnJXLPeVRoZy3vBgpK": { + "text": "examen" + }, + "SXz8iA1Qn_BlgLTAG6Epl": { + "text": "cena" + }, + "SiOmZdwX8Hf2nE2v6HfCp": { + "text": "zapato" + }, + "Sp2Ias_Y1HplkHWjIb7Mp": { + "text": "sin" + }, + "TAbuXSnSHU6C3CQ4kbKVh": { + "text": "triángulo" + }, + "TBV2BhoZVgl1jMV_jWZYi": { + "text": "derecha" + }, + "TIgoS-YONIwzbrImXetaD": { + "text": "ciruela" + }, + "TIsM6aTTZ9W8j6UhW9Qqj": { + "text": "coro" + }, + "TLxsYdrBdHgFZkNJtVTmK": { + "text": "tortuga" + }, + "TP-gGRcpcFyx1SrNRsdRV": { + "text": "perdón" + }, + "TR5CXN8-pfbWkshdxSBSV": { + "text": "oveja" + }, + "TS9z8ZmMEwn0MGSfr9amH": { + "text": "palta" + }, + "TZF-7m8VKZ7IL6pyv0Daf": { + "text": "cepillarme los dientes" + }, + "T_Q5c4XAfkhkclmnCGHo5": { + "text": "hasta" + }, + "Td5pgVQDTFOftUgOJ-bD-": { + "text": "picante" + }, + "Te_jJfeU8Xwa9St2RihBq": { + "text": "sangre" + }, + "ThqkHs4az5tgLqLcfFPaZ": { + "text": "largo" + }, + "TpPNZLsh5jrN9RdPFwmA7": { + "text": "¡genial!" + }, + "Tpj-Fs8LQ566TM0bYlZ6H": { + "text": "viernes" + }, + "TuAjBKPp3-PSdQuooSWZi": { + "text": "rana" + }, + "TyqVzfOniQNa9WKQRXqr-": { + "text": "hermana" + }, + "U1KQsrvTa2E00-ugc-Iy6": { + "text": "ausente" + }, + "U6PoeH-cMdO3ttnLkN7_3": { + "text": "cabalgar" + }, + "U7GiGcYacowWi4MWrCYyj": { + "text": "antiinflamatorio" + }, + "UQ-5wOfR0tDzljoDjj2xU": { + "text": "otoño" + }, + "UQ5B5K-tpk1XmQC1B9TjQ": { + "text": "no" + }, + "US8_vYTnDfxBw2Ung_J38": { + "text": "partes íntimas" + }, + "UVzdJiqY36fqgBYyz880c": { + "text": "jamón crudo" + }, + "UXJDiwb3j_zyfGa26ByJL": { + "text": "pecho" + }, + "Ubaq6h7wasdP_YRombm2c": { + "text": "azúcar" + }, + "Ugs9V9c2c5iHrVC6p17zr": { + "text": "analgésico" + }, + "Uk1Emn5IovsTfFzpQX5Jw": { + "text": "sosten" + }, + "UkLF5sKtVKW0D8RzVCoue": { + "text": "bombero" + }, + "UnQJwWfWCe40DJYR1Er0o": { + "text": "dolor" + }, + "UssSOEEKutvzB_B4fAQE-": { + "text": "escuchar de nuevo" + }, + "Ust3oadA0PUGViYo28Mf3": { + "text": "caminar" + }, + "UvRS0KmtZn3dq7e8L5RcE": { + "text": "enojado" + }, + "UwvZVcX_CAQFrI6U4LsNT": { + "text": "huevo" + }, + "VJ9AU_y7CqsONR6TvhdLh": { + "text": "¿dónde es?" + }, + "VKrLGgYjc-nLPGsyESDgb": { + "text": "canario" + }, + "VL4pd0vnJ-CNfMg9bCNed": { + "text": "aspirina" + }, + "VUJ-zrdsyL9MOuFbdMCAx": { + "text": "mareo" + }, + "Vioyf8EXJfY5t34NnN0WO": { + "text": "tablet" + }, + "Vjlet5P7XuqTrc22nt_Zz": { + "text": "agua" + }, + "Vmnu5eormo-_TOCgF4YzG": { + "text": "jarabe para la tos" + }, + "VoZumy5GtnRdqSOmXAw7j": { + "text": "preparado" + }, + "VrC7AnovfA7VzmYESVc8L": { + "text": "conversar" + }, + "VwZ4EKSggYWxlnAbp-pNB": { + "text": "enfermo" + }, + "Vzov0z9acB-I1_W_CcFcY": { + "text": "rojo" + }, + "WDUIQV43zghFQq_rSk1Z4": { + "text": "churrasco" + }, + "WL3ZN-W_zgnuTJpuqz0YQ": { + "text": "príncipe" + }, + "WNhpmD_XlTaNEBo7GsFXu": { + "text": "diarrea" + }, + "WQ0CNIQ_gjaCxg4tEIsOo": { + "text": "clavado" + }, + "WRzleD-mI84LaimFH8h6P": { + "text": "escuchar" + }, + "WUt3I-NkdbqlSVcwuLfFx": { + "text": "patines" + }, + "WWK2v56LM-zWqujabk9bM": { + "text": "plástica" + }, + "W_f7h3qOLl2uEd_OYpMfQ": { + "text": "policía" + }, + "WasZ5bKZZy5Jt4Y-JipxS": { + "text": "bikini" + }, + "Wgh5iCzUmx4Je-B85-pra": { + "text": "heladera" + }, + "WjXQhSFPpz42ZUyHvurYG": { + "text": "grillo" + }, + "WtYSntcy2CijEORmROeaj": { + "text": "un cuarto" + }, + "Wu47Qs6Zupu1Ox2gUhkxn": { + "text": "cuarto" + }, + "Wva5W8GA0dHzyt2_0FPdm": { + "text": "hermano" + }, + "X0-Tf-KR24qEkpGDzG2Z-": { + "text": "ayer" + }, + "X3u4pXTWKcGc43lOkgSBt": { + "text": "cumplimiento" + }, + "XA952Z60D0-cesNCVA-OX": { + "text": "chau" + }, + "XC5fIljJ819OYpllYTjpE": { + "text": "jirafa" + }, + "XN0nzhQyHVOhuYuNqrp8g": { + "text": "durazno" + }, + "XOoGN6huCjVHxH8hRFAw1": { + "text": "blanca" + }, + "XY6ZCNzeJIEzLtWJcufJm": { + "text": "camiseta manga larga" + }, + "XYY8SV1IAMHjdGjMZxbdy": { + "text": "cancha" + }, + "XeVaDdUWSEkhfJvTVvUHR": { + "text": "salir" + }, + "XnocVMEeUGCSnlnusP44O": { + "text": "agarrar" + }, + "XuAtFop5_JNSYiZkUBzaU": { + "text": "cocinar" + }, + "Y5HQq_4crSF2lpwH-KUrt": { + "text": "dos" + }, + "YCu-B26PqjE30AhikHdkI": { + "text": "dibujos animados" + }, + "YIP0Xc4aJsfv0s8BpiQnn": { + "text": "cinco" + }, + "YLKXFZ9ze9K9NvJiAx8w0": { + "text": "¿qué?" + }, + "YbrNtdUmyMNdAF5CfvY1A": { + "text": "toalla" + }, + "YbvMRsCtMbww8OQgF45QF": { + "text": "resfrío" + }, + "YeT-jstVSA7-mD9t99Isg": { + "text": "rompecabeza" + }, + "YusWY8GwdO43bSp1o3BWC": { + "text": "molesto" + }, + "Yvxm8RGoFYKUsIXOl33yR": { + "text": "apagar la luz" + }, + "Z5-sBklfLIWE00CJ_T_ZK": { + "text": "cuchara" + }, + "Z8xp3kxXuhMVoNm7ddQSX": { + "text": "lanzar" + }, + "ZA2C4bJaL90lBxsTemYWZ": { + "text": "piscina" + }, + "ZAnmv4CLb7hldYUlp2wJU": { + "text": "ninguno" + }, + "ZBIFtTq-BH1jv5jLbzrhj": { + "text": "repetir" + }, + "ZQEXAf10BkoTvCJx3Ox39": { + "text": "sorpresa" + }, + "ZR-NXJk3SD351W-95cf_T": { + "text": "pintar" + }, + "ZRYQmYRGKzheBqk11eGRZ": { + "text": "ballena" + }, + "Zm4OIanIKTigDGIsInO7o": { + "text": "un supermercado" + }, + "ZnMba2r4XIg9lPi_H2d_Z": { + "text": "sí" + }, + "_1lOt0C0MQhvU8QWC6_oZ": { + "text": "buenas noches" + }, + "_2SjbH-xHZq173EU4J65c": { + "text": "parque" + }, + "_3ihCSMQCokXNo8pXii-h": { + "text": "llamar a alguien" + }, + "_8RIOebHpkr9nCy0_9qhP": { + "text": "llamar" + }, + "_CsJMxqGcNSaujXwRZcpu": { + "text": "ansioso" + }, + "_FNTsoEjTMV3Uas-gggi2": { + "text": "estrés" + }, + "_HUf6SR0mTP7v72Y9_4gw": { + "text": "coche de bomberos" + }, + "_Lc2-NNL69ZX-aVnUNzgx": { + "text": "frutilla" + }, + "_S9Eck14cdOTr0QH4i7sQ": { + "text": "cuarto de baño" + }, + "_WIT6qs1kaiJqB1Ild5Xs": { + "text": "paseo" + }, + "_eug92AvR1UXpYlfm6o_Q": { + "text": "dorado" + }, + "_hqTU9A7I3RFDVrcIEK-L": { + "text": "%null%" + }, + "_lU200bb9Sjv0b_iJKgU2": { + "text": "una bicicletería" + }, + "_tDZtalMxKSNpWydJ1aeW": { + "text": "cero" + }, + "aC_XP9Ch5PqWoCmcJwI77": { + "text": "algodón" + }, + "aMs2YNnWkw4XN0gAm-jI3": { + "text": "cajón" + }, + "aP9QisUdxhgOKIQ2kHNb3": { + "text": "acelga" + }, + "aSzpwNza22HZp46Sh6wfx": { + "text": "súcio" + }, + "aTwzShtP_zR9x6bSGSzEB": { + "text": "muslo de pollo" + }, + "aXLBXkENJqTYkyZOP8TNS": { + "text": "tú" + }, + "aa3xDW6F9YUKyX0fe5uX8": { + "text": "espaldas" + }, + "ajesFjbC7hwCNLKdif-ix": { + "text": "contra" + }, + "ak5fBauJzapC4JIf0lT8N": { + "text": "cerro" + }, + "alsoa_V3wz3vPpG1TKRZc": { + "text": "transportes" + }, + "amk4WRd1sNEIp24pnFw8j": { + "text": "rodilla" + }, + "armmpopt2RLsVDlqLrQ94": { + "text": "restaurante" + }, + "atVEXuftxSiDDj8rzUlFg": { + "text": "crayones" + }, + "atWxG3KTHB5moW1dylLJc": { + "text": "juguete" + }, + "avzcTznCsQCISYJsLC-w_": { + "text": "notas musicales" + }, + "b1XpSC0ndnm0ZewNXC3pp": { + "text": "carnicero" + }, + "b5OdBMMzkf1FlQbUR5-m7": { + "text": "servilletas" + }, + "b9Y5MrR-jn8fh77gAkLZy": { + "text": "pintar" + }, + "bAoK85XLNb7p0ebevYZ6O": { + "text": "mirarme al espejo" + }, + "bDnuS19hfd9GhJ-6rjNPD": { + "text": "estar" + }, + "bFodvUraUhJeq4waMdlxv": { + "text": "domingo" + }, + "bNJfccUvG2DQfR1iZP3eR": { + "text": "serpiente" + }, + "bVN3R44VuZDw3IdQMolca": { + "text": "cambiar" + }, + "beNprvNb0UztxR4JLxDFm": { + "text": "cumpleaños" + }, + "bge6qR6NzsD5Vk4ifPsSO": { + "text": "ketchup" + }, + "bpSuQQRlIcSse40OAxNSG": { + "text": "lunes" + }, + "bqjKW_qBtRzIThWxdZx2s": { + "text": "gafas de sol" + }, + "buyy_2ydocKoi9TnBhZ1N": { + "text": "amiga" + }, + "bw3rqHXD1TJ53xbNggEqH": { + "text": "desayuno" + }, + "c7kK5ROVbO3DHrwSFEawq": { + "text": "dulce" + }, + "cI0JxwhkWU-YA7E7rmJtp": { + "text": "cuello" + }, + "cJMQi3SVmqvWJ00VxI6gy": { + "text": "¿cómo estás?" + }, + "cJw2i319mzBUpEfBRDxc9": { + "text": "pez" + }, + "cJzHrV_PsV-PwwyFN9jka": { + "text": "%null%" + }, + "cS3g4KXf39akVFHCG5AwL": { + "text": "camión de juguete" + }, + "cTiw7_Yjxu_Kg90q7PdYl": { + "text": "gripe" + }, + "cb0rJJEYOeEoRU5fDdQQq": { + "text": "el" + }, + "ccGASDOGtty6GfQMEEBEU": { + "text": "tres" + }, + "cj6OuVw4Nob8jxP-E4rZc": { + "text": "cambiarme la ropa" + }, + "cnyLFMkJu2i3cqOY0e9kl": { + "text": "pasas" + }, + "curstMeuThu2KUph-8rkB": { + "text": "jugar con" + }, + "cxMNBGV3LytDXgwDMCiga": { + "text": "violeta" + }, + "d4zNoj2BAFG9B7J3KAlLE": { + "text": "botones" + }, + "d6s8fLFBiQ3KEJlNdJfUW": { + "text": "un poco loco" + }, + "dHM0qnbmtJAkZY0WBsqaY": { + "text": "lila" + }, + "dLHDzm0rfgL-vXTx14HSm": { + "text": "buscar" + }, + "dNvN5P787hAPE7ZYNgwkw": { + "text": "pasear" + }, + "dR72liRxC3qmoSa6Dz2a2": { + "text": "jarabe" + }, + "dS-KyYREUQIk7sDlmsvoa": { + "text": "cerca" + }, + "d_I8jNfbkQD0CHgZn7hyB": { + "text": "camisa" + }, + "dgm3NCKuz7L39PX8LYxj7": { + "text": "juguetes" + }, + "djgKI9embnk95PAtFcn45": { + "text": "cambiarme el pañal" + }, + "dn41o5K_1fo-qHO-YLoQn": { + "text": "sábado" + }, + "dnXsSOeVG7mq37uciIi2J": { + "text": "recreo" + }, + "e5sCl246xFMESEfFy2PhX": { + "text": "coche" + }, + "e5un1yrIuZHQi048e5kD6": { + "text": "alfajores" + }, + "e8zl_ecIloo4Vk-OZPJWe": { + "text": "jugar con la tablet" + }, + "eDX2HSkGaY2TeVwPjR07S": { + "text": "fácil" + }, + "eGJ8MC1xPE6ueF82jCmVg": { + "text": "cepillar" + }, + "eKJCZc-kD0-m6cVLorFzO": { + "text": "pera" + }, + "eWSI1NInbQowtO99phhGA": { + "text": "boca" + }, + "eZEqRZjRK8JJMsfHo4Y7w": { + "text": "del" + }, + "ebo03xnkyiHD2pKUKULmr": { + "text": "dibujos animados" + }, + "ecUOs24Pp5ZTRt_ZvED5W": { + "text": "acompañar" + }, + "eduqLSyC3m4uB1Oee6dt6": { + "text": "mitad" + }, + "eji-M2j5eHkG71DCksleY": { + "text": "huevo duro" + }, + "emm_RirDsO30Enax5Q4gd": { + "text": "con" + }, + "eo3Q5AjHJz5kp1EbdALwh": { + "text": "ustedes" + }, + "eoYtISVZl3mdwoE_HW-Mv": { + "text": "guitarra" + }, + "et1KiL5-zob_EcGlj7tLN": { + "text": "despues" + }, + "f2dl12fMZbRdQ7STpcTdk": { + "text": "fútbol" + }, + "fF3ijeQzetfSn6EGcs1yY": { + "text": "cerezas" + }, + "fL_4POdbPVL9-lvQVWSqY": { + "text": "avión de juguete" + }, + "fNAlqbgrpirQZO_LhrkXY": { + "text": "primavera" + }, + "fNv4Nb6Vafxk0JxXr-iDo": { + "text": "investigar" + }, + "fUUj_4pKPflmJlxZfk0cX": { + "text": "discoteca" + }, + "ff7ES190q1dmFYZ7lo6x0": { + "text": "pan blanco" + }, + "fjCOcN-PKP6F07IZcI71X": { + "text": "plaza" + }, + "fkNwVm56PSe-qh-QoM0vm": { + "text": "allá" + }, + "fk_z_HrvcUh8XIq8D6gQP": { + "text": "nueces" + }, + "g1Cj6HW8kg8yPE1XX9pxa": { + "text": "desde" + }, + "g1TLUpuQX2Zs1ob9gqYui": { + "text": "gorro" + }, + "g2MhHawoIC9oFNEv5_w63": { + "text": "vida" + }, + "g2sQSxCcoZuKJ3TabK6oT": { + "text": "vino" + }, + "g75y4E53ViakV-s5UfnIF": { + "text": "equipaje" + }, + "gFEnqFhYoXF7QN-n0ONad": { + "text": "montaña" + }, + "gYrIz3R13-BC_pYcvQ9BL": { + "text": "invierno" + }, + "gaem1LHTtfQdnnqYi-sOm": { + "text": "billetera" + }, + "gff2FqDlgXknRld7YMLWl": { + "text": "entero" + }, + "gsU8pE9ozhR73xS2icwJ0": { + "text": "libro" + }, + "gvPwrzDSSEPwcxY878T_c": { + "text": "gato" + }, + "gzCjycNS8Cf0vNlo1klji": { + "text": "molesto" + }, + "gzb-RNDLMNkgk9wnPILJi": { + "text": "abuela" + }, + "hAZhogJSH3bL1iL237N8J": { + "text": "pochoclos" + }, + "hDvpMlPw-chcuxEisBJTl": { + "text": "castañas" + }, + "hKJhXxultsxm0TJl1P8-L": { + "text": "chau" + }, + "hOyjT1JgOYB-mGLFMaNJR": { + "text": "dolor de pecho" + }, + "hT3Lrjn5-q7YIM1loG4MN": { + "text": "parlante" + }, + "hUYfE_vmNBT_7E60YZsSu": { + "text": "pintura" + }, + "hWWOw1gWjWwN7wQJkHrTu": { + "text": "tour" + }, + "hXgGhazQ_nA5uqpRD6Qwq": { + "text": "ganar" + }, + "hmhAUgqvGp7nc1w25sRSx": { + "text": "esperar" + }, + "hwzwfMyJsvB42F_QWQWyi": { + "text": "jugo de uva" + }, + "hyUaYltGVJU-wRrAjhhPa": { + "text": "cantante" + }, + "i0wB--S4sdL8Q4H9b93UY": { + "text": "ácido" + }, + "i2mlV3zGS6nrH2l6N2BlZ": { + "text": "trompeta" + }, + "iAqItRUQL_YpbMn2pgjsA": { + "text": "pizzería" + }, + "ibtmTEP3QGDY8TyVLteuX": { + "text": "blando" + }, + "ifd0M0pAlFm7aPt1A0ze_": { + "text": "amar" + }, + "iiA1u1JKRmhe2jWVE_W79": { + "text": "amigos" + }, + "iimGxVoFWlq_THThR3vmF": { + "text": "noticias" + }, + "ijn-QwQuTxRFFVe-7WlSX": { + "text": "picazón" + }, + "iowxE4MxcV6PR2Uhtvxqs": { + "text": "hospital" + }, + "irbOv2dHA7G969dnJMfJn": { + "text": "cuaderno" + }, + "islCzqFq1SYrZAh63dLhQ": { + "text": "huevo frito" + }, + "j5xZZev5nTNa-p088Oqnp": { + "text": "besar" + }, + "jBqD3qhhcrioLlCU-xq5b": { + "text": "instrumentos musicales" + }, + "jOALQbfxdXmJVyY6P5gZG": { + "text": "damasco" + }, + "jTEb3A5ZEKEy2ojuq2vO_": { + "text": "hueso" + }, + "jeO9YZ22LfSObUNhQDRAz": { + "text": "ventana" + }, + "jfly9fZ3x1da4SGCCNcV2": { + "text": "bufanda" + }, + "jfvreGZv-e8rD4-01wZ5H": { + "text": "venda" + }, + "jhJ2TOfdaRAcVeHGOjwua": { + "text": "leche" + }, + "jmzg4EiC7JEHwe9gNP3C3": { + "text": "arroz" + }, + "jpKPg3hn6_GO1HSkeLNGz": { + "text": "niña" + }, + "jprAsdXWGQKPlUWwgBBot": { + "text": "película" + }, + "jtKc2q2n5an342ZkiMB9R": { + "text": "higiene personal" + }, + "k-iDOTk5uO7ZK5OB3v8It": { + "text": "viejo" + }, + "k41gkf6A_bDtQAJDOrWpP": { + "text": "pasta de dientes" + }, + "k7dZhQtwDPFlOk1iPjEOz": { + "text": "subir volumen" + }, + "k8tJx6PikRcnVuZEqrXRM": { + "text": "viajar" + }, + "k9ZpWM4oRb1q20c0qWCsg": { + "text": "abrigo" + }, + "kDzHKO8eIwNsyKWDw7M0c": { + "text": "uva" + }, + "kIn8SeGURyvu49EsRqDs7": { + "text": "pijama" + }, + "kN85Lb_C4dLnww7sz1afK": { + "text": "café" + }, + "kaiWPbXxjHXlqcpBaBp4l": { + "text": "viajar" + }, + "khUUL_1JQGngApqBRDh_q": { + "text": "arreglado" + }, + "kpghvJtujlt4vPI2N6vsg": { + "text": "o" + }, + "kxuGlfYjS6puO2xD1QvxO": { + "text": "vamos" + }, + "lKA4b7I3iFkqNzPcAXyBc": { + "text": "cocinero" + }, + "lKMW_xTZzCrCHRcGp-Z-n": { + "text": "galleta" + }, + "lR84gCk8OM-oYoLAV7tar": { + "text": "timbre" + }, + "lXH68vGIuZdfA8xVrS8iw": { + "text": "mucho" + }, + "l_ncJLRdVGBzzQc9yqBqs": { + "text": "banana" + }, + "lrUuPKco_O8FXDuclzpKE": { + "text": "necesitar" + }, + "m0434KkjeTv8SGN7WxR2C": { + "text": "negro" + }, + "m0Fkio76HZHS2HguPOTn5": { + "text": "seis" + }, + "m17b6MazSk6M4gb51_cCy": { + "text": "pulmones" + }, + "m39xTdgaenoi4mWGEa-Ew": { + "text": "plato" + }, + "m3qTT8tiGZQheKIWREzMT": { + "text": "ir a" + }, + "mC9Nb7zVdEUpjEBODw_gL": { + "text": "vos" + }, + "mFfylZ8yoLvtkVSDTlVEN": { + "text": "pomada" + }, + "mJqzbxYeIDQciPkeHA1Ao": { + "text": "cuchillo" + }, + "mK4AXXhoIVirBz5dr_xLA": { + "text": "pavo" + }, + "mRK--C5Q1aGe8MMPJJLYi": { + "text": "preocupado" + }, + "mTklFAI-FVVLsMKoASZ7T": { + "text": "desconocido" + }, + "mWXxPPvhSHf9hyb-VyuZH": { + "text": "e" + }, + "mZFwH8xY_OeVDWCdvPZBy": { + "text": "pie" + }, + "miPmA2tOQiLxOW7D_V_x6": { + "text": "cubos" + }, + "ms97ZsgQOvD-Z8qpSW4oN": { + "text": "¿quiénes?" + }, + "mx6dmRLXA_lkN1QlP71vq": { + "text": "todas" + }, + "n5bZClAB6jXAZnwxIwH-1": { + "text": "tostada" + }, + "nK7DRpxalLBHL9OnRjSim": { + "text": "frambuesa" + }, + "nMQUtS-kFHViOKyop1FdS": { + "text": "vincha" + }, + "nQSk6_KCEVdO7oC_uxLXN": { + "text": "oreja" + }, + "nQdbkRVcwpQB_hFNPbe6M": { + "text": "caballo" + }, + "nUg2M7p5sUPlGdbBev2-G": { + "text": "tobillos" + }, + "nm6e_s01gWHzdVj25BHyq": { + "text": "¡qué lindo!" + }, + "nnTJQMJWfd2nuTSlFNEOy": { + "text": "mío" + }, + "ntzBlFkDMTKEUHoGNc65u": { + "text": "baño" + }, + "o0oxaoUFpOLiGsoQBlalI": { + "text": "torta" + }, + "oAxNCJufVUqZMyWRGdZl9": { + "text": "tuyo" + }, + "oEHzYcfxDGGcsL-deud1j": { + "text": "snack" + }, + "oEyUWrQj1iYUnlEUdQQ5Z": { + "text": "flauta" + }, + "oO21zLMEtHEakvnuTohLu": { + "text": "¡qué divertido!" + }, + "oOkD8Wmvb4t9I2EWqT1Nr": { + "text": "amargo" + }, + "oSBFO8Ka0PN4bgX0QuWxL": { + "text": "viajar en auto" + }, + "oYwoiRDWlIjSTbYdC2vG6": { + "text": "falda" + }, + "oa-MShota2L8n2pU8hIsm": { + "text": "jugar" + }, + "okr5oAG2U8Er1XwQ8XbWD": { + "text": "grande" + }, + "oqQWeoWBr5N0LrPGY62Og": { + "text": "senos" + }, + "otTWzTaTAmweNCozT8tn9": { + "text": "alergia" + }, + "p1qK47wwLwF8S0Fy8-2Mt": { + "text": "mano" + }, + "pHBnmCFpM7oZf0O78CBIz": { + "text": "golosina" + }, + "pM-bC77hbj-w44A0HFRDZ": { + "text": "sonarme la nariz" + }, + "p_XyUXRmeUk_bdjRTMtkz": { + "text": "revistas" + }, + "p_qpVEd677b2Bk56yhvj6": { + "text": "jardín" + }, + "paPpjw1XVC9-6xcueJsrY": { + "text": "todos" + }, + "pgPlWKk-oww2fua5zYuue": { + "text": "mono" + }, + "phZ4F4uzi1TrhjeDMuMsn": { + "text": "almohada" + }, + "pkuppr1jMH7SMpa2hrIWQ": { + "text": "jugo de durazno" + }, + "pliNY9oMQh1iSidkEhhDO": { + "text": "abrazar" + }, + "pptyFMhLrbC6lN6zmc7D0": { + "text": "comedor" + }, + "ptQZXjMQyXWycUD1kAkQo": { + "text": "cuento" + }, + "pv8eYkxczIevQqEGwDz6V": { + "text": "mochila" + }, + "pvXSy-5M4i8kysUppvdME": { + "text": "que" + }, + "pwltOTDn2OyABTlD4-27W": { + "text": "verduras" + }, + "px0jKQDj7r9pOYs4ZrvcT": { + "text": "tomate" + }, + "q22wRFF21EigV8YzQ_MfV": { + "text": "¿me ayudas?" + }, + "q6F-qJ7mTxvwa43F6vwun": { + "text": "escondidas" + }, + "q7Pz4UqqZUlXeFfXrwXDR": { + "text": "enjuagar" + }, + "qA4v2JWQU0zzBBZgvW7Vt": { + "text": "temblores" + }, + "qOsbXyvBTMDAwvvnI0iFn": { + "text": "pequeño" + }, + "qU5IvFLD8d16iIHSs_9TM": { + "text": "cebolla" + }, + "qWhpDTMd8eAEoq7yTKc57": { + "text": "calzón" + }, + "qYA2U_BFOZtFLClxuCIBJ": { + "text": "dolor de muelas" + }, + "qeJdrxKIIcUctIjo8wWhc": { + "text": "aguda" + }, + "qn-7ERrcZxJTqfW6hwNs8": { + "text": "correr" + }, + "qsA1zm1DOlItK7DCWzAw8": { + "text": "aburrido" + }, + "qscoBbrWu7tQbpNj9XUPt": { + "text": "papel higiénica" + }, + "quE_RA9abVvtG-Fo4Jx8f": { + "text": "diez" + }, + "qy3c7gvRU7shWuJYr1kBk": { + "text": "bebida" + }, + "r7eJgCF_b_ktkztv4-oda": { + "text": "medias" + }, + "r808IO3I6j3os_uix6O63": { + "text": "juegos de salón" + }, + "r9qUBQwgY8eycnU2OVey0": { + "text": "comer un sándwich" + }, + "rBwDn3PcJGqytqnOZTJMV": { + "text": "taxi" + }, + "rMFGfzFobfGsH3_qrLHXU": { + "text": "pescado" + }, + "rU9cpWF0I4wnJjzTXpGtO": { + "text": "hoy mismo" + }, + "rgyV6CvFe98OGnWut6QCZ": { + "text": "turista" + }, + "rlGO5jGKPL1vW-VF4nRqZ": { + "text": "entrada" + }, + "rnjJyPTabH_Xpmy4Z4O3U": { + "text": "celebrar" + }, + "rtHwq5WN9KElX3V3SKBmS": { + "text": "papas fritas" + }, + "rwyX2YemNEx_Mh64IArDQ": { + "text": "oscuro" + }, + "rxdfuk6egO7VmZEB3JrUN": { + "text": "la" + }, + "ry_jOegpMf4nB3spGf4d2": { + "text": "me gusta" + }, + "s0BXoyn7AqUAlZ9BOHY6S": { + "text": "tríste" + }, + "sAsTkky29uEVC9vo3Ofbo": { + "text": "brazo" + }, + "sDKIldL3tit328Joneo_7": { + "text": "vaso" + }, + "sFNUgvnglgrm6cbYiM0di": { + "text": "¿cuándo?" + }, + "sP6uvKmY5kA_yuYR8H21c": { + "text": "halloween" + }, + "sPtazVgymXESdS-BcHqU_": { + "text": "pollería" + }, + "sSTGRl6DpYGZXp8vtTNbm": { + "text": "comprar" + }, + "sbv5HLPUR6gHo-EJR2S7S": { + "text": "camello" + }, + "sc0hr3jQ80yXRFDlAn56V": { + "text": "cansancio" + }, + "sixdpB8hTOhlUr4loz3RB": { + "text": "muñeca" + }, + "sjGytpiPjwqJfPaRUJ-Iw": { + "text": "miércoles" + }, + "sysOciGqtL7y4ULuyYVc-": { + "text": "canal de cocina" + }, + "t-w8e69GwxLyfxlWwHk9f": { + "text": "mermelada" + }, + "t34TbvjJ3zG2jcgJaCeHa": { + "text": "tocar" + }, + "tGyUfSljuc7A5Do5B9GuN": { + "text": "sweater" + }, + "tQwMPLvqAMAstcqvnOERE": { + "text": "gris" + }, + "tWxC4hR6di5zQC-Hujlev": { + "text": "bajar volumen" + }, + "tYwEpd2EOtH8wEUr-jwHk": { + "text": "caro" + }, + "tw1doIY-jFPofZjlPFj4z": { + "text": "¿cómo te llamas?" + }, + "txj22hip0CE9qp_z-daIK": { + "text": "nebulizador" + }, + "u1nIt_oFH426g1IVhlYk5": { + "text": "sediento" + }, + "u2e4Zh8qwJF7zKkohQ8df": { + "text": "goma de borrar" + }, + "u3BufiTZTK6AylGh80ZFd": { + "text": "ella" + }, + "u8HfFvMPkogdWk-URj9hv": { + "text": "escribir" + }, + "uDg7Yy86PlwsAd-U96vJR": { + "text": "arriba" + }, + "uFoytOG4qsXzBk979t63y": { + "text": "limpio" + }, + "uMhOF9ZvWnjW-Zrjbjfhs": { + "text": "bajar" + }, + "uOA82KFAVtjoYRTuYFgpr": { + "text": "postre" + }, + "uPL5NMeXTmD1iU6ZoiROu": { + "text": "pájaro" + }, + "uYElWOlSOSoQap-d5gsYF": { + "text": "chocolate" + }, + "uZRwbLa1lEG7ol0UJKRBj": { + "text": "viejo" + }, + "ubP5GM7_0vPkRc6zbD9Ez": { + "text": "antiácido" + }, + "uiVc5R86QCZkhraEFlrNz": { + "text": "museo" + }, + "ujyHgmlPIs7UdtndbYd8S": { + "text": "amistad" + }, + "upWXctTSKBtFNSXnXDK_u": { + "text": "frutas" + }, + "uzSwgQNnV8ZrjxpN5Bz_a": { + "text": "difícil" + }, + "v-E2GE1DpCkNAxsfA0f4M": { + "text": "goma" + }, + "vHzfvEgIkQ0e73ryfWP2F": { + "text": "ordenar" + }, + "vKGLQIas9RdBnPGsaYtr2": { + "text": "cometa" + }, + "vOgqHjpHgrUGERIHtVqDe": { + "text": "basurero" + }, + "vPicdKLrhT2wmAAPPukKP": { + "text": "veloz" + }, + "vPnmrsRou1ihosdVXS_Op": { + "text": "zapatitos" + }, + "vZ9JaTnoj8C0ILYxMNB73": { + "text": "calabaza" + }, + "vaYJPAsTRvslo2qFOJt60": { + "text": "lomo" + }, + "vazatQ7CrYJFsorVDC5AC": { + "text": "león" + }, + "viAHJeLRr_6j9dEi5klj_": { + "text": "amarillo" + }, + "vlh1Pa6eA0ZrBs3vHzWH7": { + "text": "oso" + }, + "vmb_RMIB20QND6VcS0deY": { + "text": "panza" + }, + "vq3T-UQGTjX3Z9TlEF12e": { + "text": "mayonesa" + }, + "vy-O5Zc5kxY8d-7RROvQI": { + "text": "jamón" + }, + "w4cVxbBDZjeNyHwpBARHQ": { + "text": "hombro" + }, + "wBLnDZStKj8YLkg2pTCfh": { + "text": "sentir" + }, + "wCGb6D4xSVr4UeKXzGIlP": { + "text": "disfraces" + }, + "wcpXeLMBRusfqfrz9s4mF": { + "text": "puré" + }, + "whHwNRVnqeM7BMx6nppiW": { + "text": "tigre" + }, + "wkrNPLGWTqMIy4PJRW9QR": { + "text": "en" + }, + "wnfSUkF8-tQiRTVou1_pd": { + "text": "frío" + }, + "x3PNiU1NIeQ3zQa31C8WX": { + "text": "pañal" + }, + "xGsyYCjDzQugVzSaK8CuA": { + "text": "duro" + }, + "xIgPo3N-aKXhVcjultMiY": { + "text": "factura" + }, + "xPUYlxRxgFVn1FHQFz6Ic": { + "text": "secar" + }, + "xQblStUfyBGO27j15Sda3": { + "text": "pato" + }, + "xT4BPNmF-5WAQLfs3cUpS": { + "text": "enamorado" + }, + "xXtjQktuAq1bmxTc0HSQT": { + "text": "gaseosa" + }, + "xbPnUL4qxvm30VFYNphh-": { + "text": "tíos" + }, + "xiaTdHGInqfm4rD6XzSeZ": { + "text": "encender" + }, + "xnPF8fvkC1TvgETI1JcC9": { + "text": "órganos" + }, + "xqGzZJIHBeVfSzRfm3rmg": { + "text": "uno" + }, + "xxr0MRGYRmmoNC_gsD9uy": { + "text": "pasaporte" + }, + "y0SViQxW8Y-yiX1Z7gXWt": { + "text": "superhéroe" + }, + "y5W21CKOkLWnYJo1OC700": { + "text": "tos" + }, + "yJoivIPHOm1Y1lj-hGN1J": { + "text": "dormir" + }, + "yNag8CK0wV_iRMnFznsXk": { + "text": "pelota" + }, + "yR9FTtOimFwZG5g5tgpRk": { + "text": "visita" + }, + "y_5OURnKxFcv4UiMKntUi": { + "text": "y" + }, + "yihsjW9ON0Fr9Yy4ZlP9c": { + "text": "axila" + }, + "yk2wDVqHEKKwupgm87OJ2": { + "text": "nalgas" + }, + "yo00Ci8bSRFYPU6HxGVwX": { + "text": "cantar" + }, + "yqlmoVGItXqaeazw3M3eg": { + "text": "sillón" + }, + "yvtvSsBLhabkcpeYGbxQr": { + "text": "bota" + }, + "yxa6QVSrmWUKH2PZHKaVl": { + "text": "lechuga" + }, + "zANp2EnhT6n0Jcl1Xra6K": { + "text": "bailarín" + }, + "zAmesi1FcIWLXE3WVa9WS": { + "text": "antihistamínico" + }, + "zRTTg5x_P1E8Z3CU-oWXa": { + "text": "cualquiera" + }, + "zcibOHpRbSmz1hVNSjPTj": { + "text": "tenedor" + }, + "zdFC3vpgjcyUWB9a4ghRW": { + "text": "descripción" + }, + "zi_wcT10fxgn72ZJhVx18": { + "text": "vestido" + }, + "zm_6R89hr4wjuVkifiYrk": { + "text": "despeinado" + }, + "zrR1DbO_szgKvxLyrZquw": { + "text": "calefacción" + }, + "zw-o9pDectP5bxFnUjrJO": { + "text": "chancho" + }, + "zxhRDSHXtV63Sp3c2fjrI": { + "text": "aduana" + }, + "-k6dUC6thWPyULq8MVSe6": { + "text": "PRONOMBRES" + }, + "0geft4arn_A8kL-rfUPYc": { + "text": "PERSONAS" + }, + "1aM3sTxyb8yLSWtkn2MoO": { + "text": "INSTRUMENTOS MUSICALES" + }, + "384rVetrrLX4x4pJ0Y0Na": { + "text": "INTERACCIONES SOCIALES" + }, + "4e6iVOPLAjnM6wCMUm5P4": { + "text": "DESAYUNO Y MERIENDA" + }, + "6vmRBH4shBk3UQEUM6APX": { + "text": "CINE Y PELÍCULAS" + }, + "7Jm3bDhPInSlwhdy20dKF": { + "text": "CLASE DE ARTE" + }, + "7ngCuvmAnM_7ygpFQgLpk": { + "text": "COLORES" + }, + "7w5ACMFdOCTkBrS911MA1": { + "text": "ADJETIVOS Y ADVERBIOS" + }, + "8FPdnkMzOIBVTW5-TQxWX": { + "text": "PERSONAJES" + }, + "8t8CAggTj3HuznkKhfXle": { + "text": "LIBRO DEL RESTAURANTE" + }, + "9JRv4X68pAtwsFT3Ss0iJ": { + "text": "LIBRO DE NATACIÓN" + }, + "ByBvBUS7dcXldjzZOVFFP": { + "text": "CUERPO" + }, + "C7ClEHF5-Mcico4FvRxEV": { + "text": "PREPOSICIONES" + }, + "GD9YHeLktSsdZQvcoua6x": { + "text": "LIBRO DE LA CARNICERÍA" + }, + "HzPl-HvsrXL_QkGT38Ohd": { + "text": "LIBRO DE VERDULERÍA" + }, + "JKEk5TYykBK6ZeYND3Ron": { + "text": "CONJUNCIONES" + }, + "LWyfHr8Oui5HIShtZ_huo": { + "text": "FRUTAS" + }, + "PYTnUqCLwAbngR2Ozroc2": { + "text": "ACCIONES" + }, + "QQszyYRLL-otCQtRfbLzm": { + "text": "TIEMPO" + }, + "V6K3TniptOApMMGa8TspR": { + "text": "TODO" + }, + "VhfGFlHDcPor996rCzoK9": { + "text": "CELEBRACIONES" + }, + "WZYuZd331Hm5gHXJtUmBN": { + "text": "ANIMALES" + }, + "ZgZoyOg5K-LscXdfl6kQG": { + "text": "CLASE DE MÚSICA" + }, + "_Cw7FcJSYiterkLSDJH8V": { + "text": "CASA" + }, + "ah257x5jssDmLIOrcSGn6": { + "text": "NÚMEROS" + }, + "berI6X2_pAVCNOrcHAL6y": { + "text": "SENTIMIENTOS" + }, + "ce2z_EeEG2nH0ZS4KVAkA": { + "text": "COLEGIO" + }, + "dQXaeM3Uul1yEvRwJ4w9t": { + "text": "VESTIMENTA" + }, + "ejXQZAiYjrcSFGXb1pz7M": { + "text": "TRANSPORTE" + }, + "gybgILOLxmIVfeQtb1f94": { + "text": "LIBRO DE HIGIENE" + }, + "iHS1HpUBBadzgmbum_bdD": { + "text": "PROFESIONES Y OFICIOS" + }, + "jatDsecioVAxRph-WOg4f": { + "text": "LIBRO DE LA FARMACIA" + }, + "puOOrKWbYzH0B_8uGkxYX": { + "text": "LIBRO DE VIAJE" + }, + "puda9fUGjqvm9oSM6CpTk": { + "text": "ALIMENTOS" + }, + "rH7zhJzNVIcEIRyvaYLoi": { + "text": "DEPORTES" + }, + "uv4tWMRHfewaEQ_pH0dnV": { + "text": "LIBRO DE LA SALUD" + }, + "wAhDHMrZ850dHTwgAXrMY": { + "text": "CONCEPTOS" + }, + "xjfPlDs-AcFV9LCyY-v9j": { + "text": "JUEGOS Y JUGUETES" + }, + "y545pM8pvB3WgukIac6NT": { + "text": "LUGARES" + }, + "zwf7qmSEi7PBwsNaqciA-": { + "text": "libro de la biblioteca" + } +} \ No newline at end of file diff --git a/assets/languages/pt_PT.json b/assets/languages/pt_PT.json new file mode 100644 index 00000000..23cd901c --- /dev/null +++ b/assets/languages/pt_PT.json @@ -0,0 +1 @@ +{"-2UbAou9ydr8XeN-jtIz4": {"text": "limpar"}, "-GL2iAgykP10Ae3AKsVOX": {"text": "sal"}, "-LE2iv3Pwr5KuIyM5bYb3": {"text": "bom"}, "-LwAKwgCdVkzwM579zRMo": {"text": "avançar"}, "-aePI8WknXpxEpz19Lu48": {"text": "dele"}, "-msU3yor4qJYQHJtWrdk8": {"text": "massa"}, "00AkNJ4YLpbRD_mLmQjtp": {"text": "almoço"}, "0IrLGI8Ebm8rcS3ymUXqS": {"text": "fome"}, "0THELgiQ7rvA-orESXJfV": {"text": "avião"}, "0Vkmy6BZcJn3pFurEevL9": {"text": "estudar"}, "0Z7uFXpp-XRXmqM8ILhIC": {"text": "pedaço"}, "0_SK41wNOk6mw2qX_eHXM": {"text": "cinema"}, "0cdYDZ5HPaTmqTTN0_Ee8": {"text": "sorte"}, "0fHziRVxg0oNDp5pyiI8M": {"text": "permissão"}, "0fcYcD_r0jNWXTTAx8Ph7": {"text": "aeroporto"}, "0gAyTD6sImo0jpD_bYGVv": {"text": "Quinta-feira"}, "0huLn-H32Cbwba28IZ3tc": {"text": "bolhas"}, "0jpMJu8isUmOZKxhZ_yaj": {"text": "equipamento"}, "0pFtmDZdlnLrUkT_XZDXQ": {"text": "antes"}, "0qoQs8WyLVONnu3_eBGfD": {"text": "dor de cabeça"}, "0v5fqIp8GmXsIHO0SPhtt": {"text": "Vá em frente"}, "0vttFf3nAGDW6g5wVStcH": {"text": "desculpe"}, "1-VwcvzNfvrwDWRGxRPre": {"text": "nenhum"}, "10X4OKR5xmNhSj86sbyE_": {"text": "salsichas"}, "14aCIW665UZtuwNsKKV5s": {"text": "estojo"}, "17AkRFlfC_koV-lywmDE8": {"text": "calças curtas"}, "1B1WmC-V0PglDeRAeINcT": {"text": "olhar"}, "1DjW-XvWN7iOqoJPRSWwY": {"text": "mal"}, "1IjenNwPwsMIWZ4aYBk8S": {"text": "jogo"}, "1Ph13Z_Ya6p-q0WA7pSl3": {"text": "pássaro"}, "1QEfLU_S7TM0iMr9VZVtP": {"text": "redondo"}, "1Rv9-SSJjHptwvzqLbdbx": {"text": "diversão"}, "1WJZO-pUkTaQvyxz41iB-": {"text": "picado"}, "1YOlJCovdcnnqVihqHVmq": {"text": "aqui"}, "1b71P9YjaNWnX8AWjstqG": {"text": "Camiseta"}, "1mS8kgJIod1cyUFH-msnM": {"text": "Estação"}, "1mU2ZosZXSJrxkh1NmxJT": {"text": "esquerda"}, "1nhsReHG-f-bW-xaZBsxY": {"text": "abaixo"}, "1pb6S-RR_3zdCq77YFiZ-": {"text": "que mal!"}, "1zU7kolOKsHP9-oomQW1Q": {"text": "rei"}, "27GbVOZ-szdnzsy92oY-X": {"text": "manteiga"}, "2CgcUkvJUskv982FvG54A": {"text": "dinheiro"}, "2HkB0WZYP7cvWLD39GMQj": {"text": "banho"}, "2KO0BFtB4B6fu1feuAZLt": {"text": "verbos"}, "2RZTRMX56BFLrW7tLJ3Hy": {"text": "mesmo"}, "2Vc2H462cutVtUC-5omJk": {"text": "alguns"}, "2dwtZO2wCm520GPD1i6dl": {"text": "dor de garganta"}, "2t_eq1JmgHa0R3eu8LMmI": {"text": "fã"}, "2u2-AFuI245I7bZ6tsSPh": {"text": "Quem?"}, "2y9pxVOBQ2tMdPHcsqQb8": {"text": "Terça-feira"}, "3-ueUrnwmIIj0BMP8_Ntb": {"text": "a"}, "32PnZjlnQbTJo4nL9YJYe": {"text": "feliz"}, "3932Zm0xgk1hKB2hhBAUa": {"text": "ônibus"}, "3KbwCHGooNLySWOBlFFuG": {"text": "kitchenette"}, "3KgKNNnuYMrysEDs3Pu4Z": {"text": "rubrica"}, "3VEnVjaGFCImBAZ3wEChu": {"text": "roupas"}, "3arbCGI6fMOWALLanZcg3": {"text": "capuccino"}, "3dtvYLjbl5oDyhZO9eFRY": {"text": "eles"}, "3mwcdenOurU_e59ChLqb0": {"text": "fora"}, "3w62N9b7Cvb6JMjB9Wphi": {"text": "para beber"}, "40q0NJ6vsziJDNFBqho7Y": {"text": "dentro"}, "4A_FNkGH1EDu0oabPurrL": {"text": "cereais"}, "4J1bWl6BbbEdZsRGsgYH2": {"text": "queijo"}, "4X7OXm35OSHoSlPxGUi_f": {"text": "mobília"}, "4bHGIoQmDN8LptpdNN4v6": {"text": "férias"}, "4f1vqDoAvUu2XYk_JlQdC": {"text": "Sete"}, "4rctwNiN4UaU9lqU48MHG": {"text": "computador"}, "4rzonBodQXfs77gALnAP_": {"text": "cerveja"}, "50wJdR0-3YLnv9y_2Gx_e": {"text": "saltar"}, "54BVjn2seJWdBNGI20-yJ": {"text": "computador"}, "54taab8z9ziXt0IqXHkV9": {"text": "dedos"}, "5L5UzBHOzuHRoO-jyPuEx": {"text": "cidade"}, "5LYjhk-N87Ov9NrQcGbLQ": {"text": "óleo"}, "5Tdy0Gu9SiLsPfWwd-Y2E": {"text": "legal"}, "5VBtwEswIjrv1zbXP-oFn": {"text": "sopa"}, "5W5_sCAyGTkVzguCEg1d1": {"text": "suco"}, "5dvq344JstkxUpHszaPfp": {"text": "Golfinho"}, "5gPT9lrNgpRkF07lP6zOq": {"text": "suco de maça"}, "5i3kSsCKF7Oa9iJQvXiTe": {"text": "mais ou menos"}, "5kjlzqb9Rf3zzqZROaZ9p": {"text": "perder"}, "5mGrGHzdw_vCwYCRNPcPw": {"text": "passeio turístico"}, "5vxTXbPl4Y0yezGu7p1f6": {"text": "fazer"}, "6KicPX6y_u2i6tPBZAtvA": {"text": "lavar"}, "6jLkKc9OL5btNOmjJem6S": {"text": "colocar"}, "6lYN4qSZx3_tKDClp4Iyr": {"text": "entre"}, "6nhNeVjDfDi-GmreaqfVo": {"text": "nublado"}, "6rcOXG6yxpzHLzMJ9IayI": {"text": "fechar"}, "6t2sPdapSNJrOziDozTWW": {"text": "vaca"}, "71l2at-8480bvijxn3uBl": {"text": "durante"}, "75gujwNXJdAiNmK6Ffhia": {"text": "suco"}, "79xBF6cKgKeD4GeBPe_Ds": {"text": "bolsa"}, "7EsVGfapPc_38mHCBy3C3": {"text": "apaixonado"}, "7Hz61-WzV62FHsedOwz6q": {"text": "Quindim"}, "7Q4Zc0cenSF5U4eKyje1f": {"text": "na direção"}, "7Q9sNljseWjwSPW4in1ga": {"text": "recepção"}, "7VL_MgnLDY6hi8sbvcGIg": {"text": "silêncio"}, "7WxUVoVQfQOzARU2bf6HP": {"text": "lar"}, "7iAXKVm22uMgr6aqZ1rr7": {"text": "avô"}, "8-4M30dTtmuUJus9MtGqV": {"text": "meleca"}, "81UJI7xOa5l9mVceqkIP5": {"text": "Tenho frio"}, "82LicIQc3K2xCTEt-iMpu": {"text": "lesma"}, "86gNdF6aTepa0Y9zkD1VQ": {"text": "campo"}, "8FFwIw7rJri79BITZBUzm": {"text": "hotel"}, "8KlFB3an1mzdQd6-LGCCE": {"text": "lanche"}, "8LddDqylw-51wHhx9_Qad": {"text": "livro"}, "8MV4ZFthtUeoxLAIbqGTc": {"text": "carne"}, "8cOIYr-hcK54qWpuT-41e": {"text": "conto"}, "8fGingRAd8idw4qcxyZ-Q": {"text": "vergonha"}, "8iFdjRTQU7ONGnigRTlm8": {"text": "Quanto custa?"}, "8vR0HYniXtrrQqqSIN_JQ": {"text": "família"}, "904w9Je6oDwGXUCIcrUZX": {"text": "linguagem"}, "93YmZA7VfAT7TTNTsDE1W": {"text": "Series"}, "93hsW10TmX3Vcq_4IvcZ0": {"text": "branco"}, "93tHieC_CgZqN998y5gAv": {"text": "cortar"}, "97nIv-aoc51T8kKTZV5cM": {"text": "saliva"}, "9EqfwMNtATh1fwMhyn_B1": {"text": "bom"}, "9FiWvg197C-Riid-DVysN": {"text": "claro"}, "9GqE148SFZqMIft4evAk2": {"text": "comer"}, "9MzeUcz1nRqleTkmS_-g2": {"text": "enviar"}, "9QyJdpUn0f6g7FxWs5qpO": {"text": "corte"}, "9U8MzceIsqKhG86oNx9zV": {"text": "carro"}, "9UwpyOnOBoqr4mX3Juqm2": {"text": "boa tarde"}, "9ZnzbKMDwGEwC3hXOhXFe": {"text": "comprimidos"}, "9dvSIpeXa2_12Jip6noJP": {"text": "desportista"}, "9kgRI3KlOIVSuylKffW9g": {"text": "cores"}, "9lS0mNuKIS0olyDwoIJBR": {"text": "doutor"}, "9mLx-YMK81AflitELQFqk": {"text": "papel"}, "9s5zV3_oGyDx_NEvsKCxX": {"text": "violino"}, "9wE9Py6ztyqDrtaypsltA": {"text": "laranja"}, "AOp6VGyjYIV0Ym9d0basJ": {"text": "empate"}, "APXF-lEplPOloppSeIjAY": {"text": "menos"}, "AQKGKdoX5CYycZ2YqBZVW": {"text": "barato"}, "AT_rDWsr6xRBgrvgw9Zih": {"text": "nove"}, "AWJXh6URGN0Vwm66i6IvL": {"text": "olá"}, "AeFbJQ0M9uTObAlKEX3zr": {"text": "perna"}, "Akf0xlH8UJdXn8BJzPV2A": {"text": "rádio"}, "B1845IfYfPMz2FWpVFIQv": {"text": "de"}, "BKmATW2uBk4pxnmOaARyq": {"text": "documentos"}, "BNjZz9MGLJEKZ4CZoTs2M": {"text": "xadrez"}, "BQhqx1PuF94jwT0ySTlbJ": {"text": "refeição"}, "BQm-YCPc0lfD1-mhecCTL": {"text": "EU"}, "Bebnh8-UWwtYLnK6p3fKi": {"text": "pão preto"}, "BjqWZnzLlxdOo4KEzZ46j": {"text": "oito"}, "BqS7d4PMhGRqPYlZQzUbR": {"text": "porta"}, "Bub9ZYygLcly15D7_wYks": {"text": "amigo"}, "ByrvXHEN9Mb8D--7MQAjM": {"text": "Urso de pelúcia"}, "C12mJ1W11fODI3pv1QOnx": {"text": "geléia"}, "C29KJ8BTFavhj_R9UfnSv": {"text": "por"}, "C2bgADoxmINRnAiYxZHqd": {"text": "taxista"}, "CBTemIvgIN1UAtftkc3sz": {"text": "colar"}, "CCWCtXdMuQBJRmaFOAlfQ": {"text": "Natal"}, "CY-IQvUehkaiGFCdKf9bf": {"text": "salsicha"}, "CYH_6DL9q1iLLetuWeR9A": {"text": "ter"}, "CZrETqLgQlvDkLHvw1t_w": {"text": "para"}, "C_JKGNCxOI5x_f2C4qAyZ": {"text": "amendoim"}, "CbO32RkDdf9aCucv6BnGS": {"text": "cabra"}, "ChBc7LjL8dgzZ6LUCAHGh": {"text": "por favor"}, "CkTiaqBY3jf86JRq636lt": {"text": "qual?"}, "CsKZSNiJw5Q48b26Kskf-": {"text": "herói"}, "CxFmyJYmy6gMRqP9U0cBP": {"text": "Estou perdido"}, "CyKtU9yC0Jy7Ypb4WFp6w": {"text": "cachorro"}, "D1gCni2jXpCvKZe4qCtQN": {"text": "peixe"}, "D2tSkngqbQmdKLNhn9xWV": {"text": "balões"}, "D7dt_hFX5DScV_ssm1nKz": {"text": "toranja"}, "D85FU-Wqr2u53tfTXAtHo": {"text": "chute"}, "DAq2J_xXHsSCSNPp9qVsk": {"text": "cheiro"}, "DBd09yUlbkaYLsemjFXEs": {"text": "congeladas"}, "DG1RiDjDfwWRhpAiIpPqA": {"text": "Vomitou"}, "DSgrhLHauub-gBqMGwacO": {"text": "assustado"}, "DXb0FpjVM9q8LVl9vvSHn": {"text": "Aulas"}, "DXpjgLKTdx9eLLohVdmWM": {"text": "quitanda"}, "D_4Weq7iyi7GMEsgP0xy6": {"text": "chá"}, "Djs1QsLNf8Q5LBIFV5zNC": {"text": "partitura"}, "DkeHJFtqAS005fYUrl1Xz": {"text": "calça"}, "Dm3yiKSB134LrjtW_KrO7": {"text": "bom Dia"}, "DqGa4gqd2ABDi45BT43x4": {"text": "princesa"}, "Dv9MSCRYbR4Q3K114wXki": {"text": "alto"}, "E-vUPARie8MmfgZwv3Omr": {"text": "galo"}, "EM8VyonJ7WNdvmRyE3nhZ": {"text": "lento"}, "EO4O-s7oafi6QJdxTFNkd": {"text": "descongestionante"}, "ETZNYbrG5wveDl6c9k2_k": {"text": "cotovelo"}, "EUsNyf5bDdSLqvZKH1Ltx": {"text": "não entendo"}, "EVmt43vDI3NHFfbbkqokF": {"text": "pizza"}, "Erg6LuA8IOQ5V8RTP3pPi": {"text": "abelha"}, "F4cGnA_QHsVKTjUE6MAu9": {"text": "mameluco"}, "F7kJ8VM31BWB4K4T4USzs": {"text": "abuso físico"}, "F8roVYxKZi88UUGfOvTwl": {"text": "professor"}, "F90bXbc0tz9nuzTT7SgqV": {"text": "quatro"}, "FBPIabyaoCK-Y0BziQdji": {"text": "dor de barriga"}, "FBTheEQmZZfJRiYjd_Np_": {"text": "interpretar"}, "FO77qpzyz28knodNtILCA": {"text": "lave a corrente"}, "FTngK946O8S8bYc0g7vM2": {"text": "mãe"}, "FaVvbVzZivuxTwxJTPubK": {"text": "irmãos"}, "FfNU04I4mZ54gWcBXqo2c": {"text": "bacon"}, "FgTird367surh-vxXyAK6": {"text": "bilhete"}, "FkC5DtSV81OvFMU99qZGg": {"text": "bola"}, "FnCBoLSE19WsbUypUKvFc": {"text": "Hamburger"}, "Fogupb264IyCtbZ-Q2D6w": {"text": "bêbado"}, "Fvm2C5NBq01tm0QK9d9QM": {"text": "crianças"}, "G09TvOzDSG5m3hTQD9Tej": {"text": "excluir"}, "G2i9LSK4A19237Zp1vXqF": {"text": "gordinho"}, "G6KKVMvPDnjdD9TfBd-B9": {"text": "praia"}, "GAxX7EIz1TTLtMX08RRGr": {"text": "Hambúrguer"}, "GJlUSznzEHCgoAOrVrkp9": {"text": "feliz"}, "GSEumxiyeVKRRiaY_c8HW": {"text": "arrastar"}, "GY_flM-6uR6X3L4AwsiwU": {"text": "para"}, "G_CRpzxWO5XdEMh01O1eJ": {"text": "embora"}, "Gj7THa6XFHDfYL5H19lwj": {"text": "Manhã"}, "Gm_qAGnL4OawmlYmTs7K5": {"text": "nao vejo"}, "GoJuWnn72TCXONXKtYHMm": {"text": "trem"}, "Gvmy--9DiUn_tkQYWeWhA": {"text": "canelone"}, "GxrDtsdGcLepdsQr6V9DT": {"text": "verde"}, "H2zMVtjvqi7aUtCypiVKr": {"text": "sentar"}, "H8Bsrr2NK9Q3WGbEp8PMe": {"text": "prata"}, "H9SWPnWbR8qcZA-iu5Mz0": {"text": "dor de ouvido"}, "HBZNu6m3FELU9eg3OeLdx": {"text": "cortina"}, "HKfLJS8aCBtKuKJeSBQUW": {"text": "bang"}, "HMPabuHqgtyiCmTLzg-rM": {"text": "Entrem"}, "HQiQh4PPBvO1n-d7JGVj8": {"text": "ninguém"}, "HTBNWax6FCSGXuboGsVUW": {"text": "salgado"}, "HnuZA0UTlnuIfFAN7saxl": {"text": "coelho"}, "Hvb4JdDHX_vNMck_US2UN": {"text": "teste"}, "I5AJgba5GTdEjdpFB-LBf": {"text": "chocolate"}, "IAdQsjTsbBUAMjlwW34cw": {"text": "Eu adoraria"}, "IEeIvawUD2GIAr1Wypr9i": {"text": "pessoas"}, "IF3R7tLVAkd4RbL8R07K9": {"text": "ator"}, "IM8OUKCzHwnjAQWPFgnn6": {"text": "distante"}, "INxOSvKbBNOXwruIpuNho": {"text": "umbigo"}, "IO8uTb1K7ElENgp2ujZoK": {"text": "robusto"}, "IXRWmFmtqfnHQRcBf1Idl": {"text": "Pombo"}, "IZbfYRzu2cxxDWdbmQeqw": {"text": "cabeça"}, "Ig1oypuwndODbmKh_NEXs": {"text": "traje de banho"}, "IsWUeiPnDEnzxePKclBNp": {"text": "feio"}, "J3qQMp0OMr5LC9ebfArxH": {"text": "nenhum"}, "J3rDL96c2zfBQzP45VRCp": {"text": "limão"}, "J4UUPR-WP0qo1y14bUVI-": {"text": "veterinario"}, "J7MmgugOu20UtMcMPj59r": {"text": "canção"}, "J7wLwBLVx4UANh_x5HdXd": {"text": "de acordo com"}, "JB9SIxWzxWFjrbmMuksrY": {"text": "rir"}, "JBIehRNmDbK2ALcRN0u9i": {"text": "galo"}, "JBKQaBezKuSDaMsnbJMTB": {"text": "bar"}, "JBU2hMw9gbIy9-wGF4mjD": {"text": "quadro"}, "JDbBWMB5No0pK6HvntLt4": {"text": "Lavo minhas mãos"}, "JEDIYq1BDA23ac9TNhON-": {"text": "ajuda"}, "JFldbhjqxK3fD6D2K4HY4": {"text": "pai"}, "JGm4BL7HAfuxX_PGe6Jzk": {"text": "presente"}, "JQOpcZSCPGMOWZsN8w_yb": {"text": "que horas são?"}, "JSFuEHlP-CFvuqvFKMumC": {"text": "carros de brinquedo"}, "JVtu9W3AumOwjUedwhUGE": {"text": "reabilitação"}, "JZRBfIXBkeuobtDXbLt5t": {"text": "tchau"}, "JawnUo-pseWb3FDVMtxrQ": {"text": "iogurte"}, "JblWXW8TKDCuYu2yTnFBA": {"text": "mesa"}, "Ji5OVFX-uNDewL8eX8Cin": {"text": "pensar"}, "Jjq8CM8JrYHIMziuQy-WN": {"text": "diário"}, "JziaulL-lrAPGNVvwBPK9": {"text": "verão"}, "K382TlNZjdMLLpAhCCXLG": {"text": "amêndoas"}, "K6hd20tWZfwwlYYi7jctt": {"text": "delicioso"}, "K8cMIDL0ubQvWhhDtr65F": {"text": "chorar"}, "K8e2-KkvZfFOQaXnhR37x": {"text": "cansado"}, "KC18_sTEqKucPQ-iwEKYY": {"text": "lápis"}, "KK_i8H9qTfDVYZkQGwd2v": {"text": "desligar"}, "KNH4sLRpVKtHXQa-0y84K": {"text": "altamente tenso"}, "KWYVDZiERE8jtRsL0faHH": {"text": "nadar"}, "KXHW4m6vXxQU-AEOR4pZ4": {"text": "bola de futebol"}, "Khdk8mWpyxgLqfC-6lyT9": {"text": "burro"}, "KhyTKtiL4ZT4Z1saU1eJh": {"text": "escutar musica"}, "Kn9vE07FK1LrzoD_YxrJD": {"text": "metro"}, "KpLFOrpuhFKaIbBbFwVVu": {"text": "borboleta"}, "KrOPANVpdkBWdEZoUwxKf": {"text": "sério"}, "KvY6Taigm4Va_cVjXAfGR": {"text": "curto"}, "L0hfYADgzghRVsZLZHRxE": {"text": "dançarino"}, "L19r487_d3RqWXiNuh3gE": {"text": "que cor é?"}, "L6YLAEsbYcTq-ycQJTvt4": {"text": "frango"}, "LAuEISciEf1Wc1j4fERz8": {"text": "ano Novo"}, "LDoi3cxodn_AVKSG-Bf_1": {"text": "olhos"}, "LEVKlDlJ0wHo5QEjCNAGa": {"text": "cola"}, "LEg8z-Q-ONLAAXd-aH_Hb": {"text": "baixo"}, "LNBTW0qQtHYQEHatkWGtc": {"text": "mercado"}, "LRIKzfm9ZsdNe1u7CUuW_": {"text": "quantos?"}, "LRfh-4RAZTj7cnnDwBmqj": {"text": "flutuador"}, "LU7IoUksATEBhd8PaHS1R": {"text": "retirar"}, "LaKT8VTw0_6rvordp5-R8": {"text": "rosa"}, "LiBr37yi-YBgQDx4unjyc": {"text": "dar"}, "LjTGOcyG7DkTs1lJqNr8w": {"text": "cabelo"}, "LksmOMPPOMArbrFsscqOW": {"text": "música"}, "LmGq1AZs2a0x26r7E9GUj": {"text": "professor"}, "LngEMJa_ihV8mB7afZX-h": {"text": "eles"}, "LrDai7jXlGAdZ3e8ZQezj": {"text": "urina"}, "M5q2CXmK0_WVaVUB_HJB3": {"text": "quente"}, "MEqo2TROHyroK318sm84f": {"text": "massa"}, "MKR-ukiUlJy4uuqO30UU6": {"text": "abuso verbal"}, "MMzjhHID8HMqyPjii5o-h": {"text": "cozinha"}, "MNCcHiImRS8tmvhBhzCKj": {"text": "salada"}, "MQHnvvU48NnEptP8a9w8C": {"text": "não gosto"}, "MWIzTM6zhTWL1V-brLtBx": {"text": "confortável"}, "MYqfOzKx2qMHop8GaHs0I": {"text": "verde claro"}, "MiOe5_Djf-pE9V9aDZ_1G": {"text": "abacaxi"}, "MqQgYn5B0uV-DMORCBOmV": {"text": "triste"}, "Mw6WRebMAKWwXfAvDA7vu": {"text": "seja quente"}, "N2baGNTOapSaFDo1GURiW": {"text": "não escuto"}, "N7n4zQIkJZOhaYESk2GgH": {"text": "cair"}, "NFdUTit6Ff-4S7Nzf92U5": {"text": "constipação"}, "NFgGqhEtl0HqipCGGEvwU": {"text": "penteie meu cabelo"}, "NKQwWPAsVHwFBWuksqfns": {"text": "banho"}, "NLi5ODIzyMAwr2HpDXACp": {"text": "nariz"}, "NQayjogCYiimP_0OxIfFj": {"text": "sapato"}, "NVe4u7BTAVfLk3xkDqLnZ": {"text": "forno"}, "NVjfEut567uXpTaQUNI2i": {"text": "jaqueta"}, "N_893wsadpGg3Ip5sEThe": {"text": "azul"}, "NaJxTPq9Ld8I4fwAltyEC": {"text": "milho"}, "NjulpZ9x63ZqxtLMoRjkx": {"text": "acender a luz"}, "Njz8DrErsexBu8mAI6mnr": {"text": "peixe"}, "NmNouLLx13jzE27jliI_v": {"text": "dentes"}, "NuhUikdCxP0NgsbO0wvAU": {"text": "linha"}, "O-CLnVuXAUapOn6TbdhKx": {"text": "querer"}, "O450x4W3OOacvJIy4QicJ": {"text": "leguminosas"}, "OHyrmD5US1rHEAEwLQaII": {"text": "animais"}, "OKXIGnLh-i1ydTNj450Q8": {"text": "rainha"}, "OUcfOOReAfQroBKlBdDb-": {"text": "solução salina"}, "OWLDc7Hn3neBAf_V_N27n": {"text": "prender"}, "O_ZfCPZSxGMPT6orCt-O6": {"text": "porco"}, "OblxxVFC-LKPq-8oC9FpE": {"text": "sentimentos"}, "OdCdTUAlbN6kvsPjby_Bi": {"text": "Esportes"}, "OeA63q6LpqGvXW-cJXEym": {"text": "presunto"}, "OeytAsSiEAWC10tXhxbTa": {"text": "personagens"}, "OhrHu-xLo8hcn5plWfoX4": {"text": "caro"}, "Om1Bvqu8nmGuNGwV8hndM": {"text": "baixo"}, "OvyFC1GHkvJZ0dAAF1QkY": {"text": "ele"}, "OwHzJdOQTFOA8daCVRwm6": {"text": "Escovar"}, "P5zdq4x58yp5TA_soKQEJ": {"text": "bicicleta"}, "PAlC0XSZNru3-LXtfvGjo": {"text": "fazer o amor"}, "PBqpK7LL1HQPwowPitrss": {"text": "ler"}, "PFAi3SdvH9vL7_Bg3MhCA": {"text": "semáforo"}, "PIBHv5VueBi-sf5qFCN_Y": {"text": "tendo em vista"}, "PIPQnVS2UiS7kGbucJP8l": {"text": "cura"}, "PLXxIPYyztaztLf4sPCst": {"text": "garganta"}, "PbtM3htZocZb8YifuPoY5": {"text": "caranguejo"}, "PfNLmlHKFT9d1w6IgeXbU": {"text": "controle remoto"}, "Pl-M4bc6k2rdhu6FHEbkA": {"text": "quintal"}, "PogTYrGfa2WNfBRuA8O4e": {"text": "ruim"}, "PszHdOxMsS_tAzSrN52Wa": {"text": "argila"}, "Pw3GgPwp7fpDVC6wJjgPn": {"text": "aumentar"}, "Q6LQqdLcvNOiCFjC0DVo2": {"text": "tambor"}, "Q6nNH4AIoSeDHODC_Ip8O": {"text": "vizinho"}, "Q9Ra0aJaQnOJQ1Kqdc43-": {"text": "bebê"}, "QCQRmsQY6AggjreY9Z0MF": {"text": "declínio"}, "QGf1Tb1roL7HAXUSrRqRJ": {"text": "laranja"}, "QJhkOh48xapiTObEDQLB9": {"text": "piano"}, "QTkFHWp9KEDgfCjoQjBY2": {"text": "plurais"}, "QUTQLuD2Gv7fHh0V_O5tg": {"text": "envergonhado"}, "QVqSPPgA89whFTJ0HTphK": {"text": "abrir"}, "QZNQOaf0SdHDbx1otCmrH": {"text": "Menino"}, "QcGJ9u_JqmrW0X47PXWH4": {"text": "desgrenhado"}, "QclUM2p3iexSjFZI8OU4-": {"text": "febre"}, "QeqA20MCXB-zNfuKIssMY": {"text": "lata de atum"}, "QllvOUe8utZrcBRGw_0vc": {"text": "Atadura"}, "QnlQ1HOEB9yNjuW3Dd6fc": {"text": "celebração"}, "Qo3Qn_nMe3E6EqNw0UdNZ": {"text": "ensolarado"}, "QohNih4wgqjnpWt3kSwtd": {"text": "treinador"}, "QvaMxPy-3iixHAJFyIrN-": {"text": "sanduíche"}, "R06chAQYswLtQK46OInW7": {"text": "leite e biscoitos"}, "R9ECa_HQRtpFrb59ebMTQ": {"text": "escola"}, "RBCjBvNXQSZOOpg-5lBlK": {"text": "Bem"}, "RZfMOtjw0DoGHWaRfCEc4": {"text": "calça"}, "Ra2rxEEohwxRqDsW2AT3C": {"text": "videogame"}, "RbZetbSC5064rZccOFD1D": {"text": "televisão"}, "RkpoG4KB8m_TJFJf2v3EG": {"text": "mudar de canal"}, "RwlZ1jr2Ix3evzrW71lN0": {"text": "maçã"}, "S3um53pcko7_BPHy7R6FL": {"text": "nós"}, "SE-71I_ahm3oKROReyJHE": {"text": "defecar"}, "SOyGnJXLPeVRoZy3vBgpK": {"text": "exame"}, "SXz8iA1Qn_BlgLTAG6Epl": {"text": "jantar"}, "SiOmZdwX8Hf2nE2v6HfCp": {"text": "sapato"}, "Sp2Ias_Y1HplkHWjIb7Mp": {"text": "sem"}, "TAbuXSnSHU6C3CQ4kbKVh": {"text": "triângulo"}, "TBV2BhoZVgl1jMV_jWZYi": {"text": "certo"}, "TIgoS-YONIwzbrImXetaD": {"text": "ameixa"}, "TIsM6aTTZ9W8j6UhW9Qqj": {"text": "Refrão"}, "TLxsYdrBdHgFZkNJtVTmK": {"text": "tartaruga"}, "TP-gGRcpcFyx1SrNRsdRV": {"text": "desculpe"}, "TR5CXN8-pfbWkshdxSBSV": {"text": "ovelha"}, "TS9z8ZmMEwn0MGSfr9amH": {"text": "abacate"}, "TZF-7m8VKZ7IL6pyv0Daf": {"text": "escovar os dentes"}, "T_Q5c4XAfkhkclmnCGHo5": {"text": "até"}, "Td5pgVQDTFOftUgOJ-bD-": {"text": "apimentado"}, "Te_jJfeU8Xwa9St2RihBq": {"text": "sangue"}, "ThqkHs4az5tgLqLcfFPaZ": {"text": "longo"}, "TpPNZLsh5jrN9RdPFwmA7": {"text": "brilhante!"}, "Tpj-Fs8LQ566TM0bYlZ6H": {"text": "Sexta-feira"}, "TuAjBKPp3-PSdQuooSWZi": {"text": "sapo"}, "TyqVzfOniQNa9WKQRXqr-": {"text": "irmã"}, "U1KQsrvTa2E00-ugc-Iy6": {"text": "ausente"}, "U6PoeH-cMdO3ttnLkN7_3": {"text": "andar de"}, "U7GiGcYacowWi4MWrCYyj": {"text": "anti-inflamatório"}, "UQ-5wOfR0tDzljoDjj2xU": {"text": "outono"}, "UQ5B5K-tpk1XmQC1B9TjQ": {"text": "Não"}, "US8_vYTnDfxBw2Ung_J38": {"text": "partes íntimas"}, "UVzdJiqY36fqgBYyz880c": {"text": "presunto cru"}, "UXJDiwb3j_zyfGa26ByJL": {"text": "peito"}, "Ubaq6h7wasdP_YRombm2c": {"text": "açúcar"}, "Ugs9V9c2c5iHrVC6p17zr": {"text": "analgésico"}, "Uk1Emn5IovsTfFzpQX5Jw": {"text": "apoiar"}, "UkLF5sKtVKW0D8RzVCoue": {"text": "bombeiro"}, "UnQJwWfWCe40DJYR1Er0o": {"text": "dor"}, "UssSOEEKutvzB_B4fAQE-": {"text": "Ouça novamente"}, "Ust3oadA0PUGViYo28Mf3": {"text": "andar"}, "UvRS0KmtZn3dq7e8L5RcE": {"text": "nervoso"}, "UwvZVcX_CAQFrI6U4LsNT": {"text": "ovo"}, "VJ9AU_y7CqsONR6TvhdLh": {"text": "onde é?"}, "VKrLGgYjc-nLPGsyESDgb": {"text": "Canário"}, "VL4pd0vnJ-CNfMg9bCNed": {"text": "aspirina"}, "VUJ-zrdsyL9MOuFbdMCAx": {"text": "tontura"}, "Vioyf8EXJfY5t34NnN0WO": {"text": "comprimidos"}, "Vjlet5P7XuqTrc22nt_Zz": {"text": "água"}, "Vmnu5eormo-_TOCgF4YzG": {"text": "xarope para tosse"}, "VoZumy5GtnRdqSOmXAw7j": {"text": "preparado"}, "VrC7AnovfA7VzmYESVc8L": {"text": "discutir"}, "VwZ4EKSggYWxlnAbp-pNB": {"text": "doente"}, "Vzov0z9acB-I1_W_CcFcY": {"text": "vermelho"}, "WDUIQV43zghFQq_rSk1Z4": {"text": "filé"}, "WL3ZN-W_zgnuTJpuqz0YQ": {"text": "o príncipe"}, "WNhpmD_XlTaNEBo7GsFXu": {"text": "diarréia"}, "WQ0CNIQ_gjaCxg4tEIsOo": {"text": "pregado"}, "WRzleD-mI84LaimFH8h6P": {"text": "ouvir"}, "WUt3I-NkdbqlSVcwuLfFx": {"text": "skate"}, "WWK2v56LM-zWqujabk9bM": {"text": "plástico"}, "W_f7h3qOLl2uEd_OYpMfQ": {"text": "polícia"}, "WasZ5bKZZy5Jt4Y-JipxS": {"text": "bikini"}, "Wgh5iCzUmx4Je-B85-pra": {"text": "frigorífico"}, "WjXQhSFPpz42ZUyHvurYG": {"text": "Grilo"}, "WtYSntcy2CijEORmROeaj": {"text": "um quarto"}, "Wu47Qs6Zupu1Ox2gUhkxn": {"text": "sala"}, "Wva5W8GA0dHzyt2_0FPdm": {"text": "irmão"}, "X0-Tf-KR24qEkpGDzG2Z-": {"text": "ontem"}, "X3u4pXTWKcGc43lOkgSBt": {"text": "conformidade"}, "XA952Z60D0-cesNCVA-OX": {"text": "tchau"}, "XC5fIljJ819OYpllYTjpE": {"text": "girafa"}, "XN0nzhQyHVOhuYuNqrp8g": {"text": "pêssego"}, "XOoGN6huCjVHxH8hRFAw1": {"text": "branco"}, "XY6ZCNzeJIEzLtWJcufJm": {"text": "camisa de manga longa"}, "XYY8SV1IAMHjdGjMZxbdy": {"text": "quadra de basquete"}, "XeVaDdUWSEkhfJvTVvUHR": {"text": "sair"}, "XnocVMEeUGCSnlnusP44O": {"text": "pegar"}, "XuAtFop5_JNSYiZkUBzaU": {"text": "cozinhar"}, "Y5HQq_4crSF2lpwH-KUrt": {"text": "dois"}, "YCu-B26PqjE30AhikHdkI": {"text": "desenhos animados"}, "YIP0Xc4aJsfv0s8BpiQnn": {"text": "cinco"}, "YLKXFZ9ze9K9NvJiAx8w0": {"text": "que?"}, "YbrNtdUmyMNdAF5CfvY1A": {"text": "toalha"}, "YbvMRsCtMbww8OQgF45QF": {"text": "frio"}, "YeT-jstVSA7-mD9t99Isg": {"text": "quebra-cabeça"}, "YusWY8GwdO43bSp1o3BWC": {"text": "chato"}, "Yvxm8RGoFYKUsIXOl33yR": {"text": "apagar a luz"}, "Z5-sBklfLIWE00CJ_T_ZK": {"text": "colher"}, "Z8xp3kxXuhMVoNm7ddQSX": {"text": "lançar"}, "ZA2C4bJaL90lBxsTemYWZ": {"text": "piscina"}, "ZAnmv4CLb7hldYUlp2wJU": {"text": "nenhum"}, "ZBIFtTq-BH1jv5jLbzrhj": {"text": "repita"}, "ZQEXAf10BkoTvCJx3Ox39": {"text": "surpresa"}, "ZR-NXJk3SD351W-95cf_T": {"text": "pintar"}, "ZRYQmYRGKzheBqk11eGRZ": {"text": "baleia"}, "Zm4OIanIKTigDGIsInO7o": {"text": "um supermercado"}, "ZnMba2r4XIg9lPi_H2d_Z": {"text": "Sim"}, "_1lOt0C0MQhvU8QWC6_oZ": {"text": "boa noite"}, "_2SjbH-xHZq173EU4J65c": {"text": "Parque"}, "_3ihCSMQCokXNo8pXii-h": {"text": "Ligar para alguém"}, "_8RIOebHpkr9nCy0_9qhP": {"text": "chamar"}, "_CsJMxqGcNSaujXwRZcpu": {"text": "ansioso"}, "_FNTsoEjTMV3Uas-gggi2": {"text": "estresse"}, "_HUf6SR0mTP7v72Y9_4gw": {"text": "carro de bombeiros"}, "_Lc2-NNL69ZX-aVnUNzgx": {"text": "Morango"}, "_S9Eck14cdOTr0QH4i7sQ": {"text": "banheiro"}, "_WIT6qs1kaiJqB1Ild5Xs": {"text": "andar"}, "_eug92AvR1UXpYlfm6o_Q": {"text": "dourado"}, "_hqTU9A7I3RFDVrcIEK-L": {"text": "%null%"}, "_lU200bb9Sjv0b_iJKgU2": {"text": "uma loja de bicicletas"}, "_tDZtalMxKSNpWydJ1aeW": {"text": "zero"}, "aC_XP9Ch5PqWoCmcJwI77": {"text": "algodão"}, "aMs2YNnWkw4XN0gAm-jI3": {"text": "gaveta"}, "aP9QisUdxhgOKIQ2kHNb3": {"text": "acelga"}, "aSzpwNza22HZp46Sh6wfx": {"text": "sujo"}, "aTwzShtP_zR9x6bSGSzEB": {"text": "coxa de frango"}, "aXLBXkENJqTYkyZOP8TNS": {"text": "você"}, "aa3xDW6F9YUKyX0fe5uX8": {"text": "costas"}, "ajesFjbC7hwCNLKdif-ix": {"text": "contra"}, "ak5fBauJzapC4JIf0lT8N": {"text": "colina"}, "alsoa_V3wz3vPpG1TKRZc": {"text": "transporte"}, "amk4WRd1sNEIp24pnFw8j": {"text": "joelho"}, "armmpopt2RLsVDlqLrQ94": {"text": "restaurante"}, "atVEXuftxSiDDj8rzUlFg": {"text": "giz de cera"}, "atWxG3KTHB5moW1dylLJc": {"text": "brinquedo"}, "avzcTznCsQCISYJsLC-w_": {"text": "notas musicais"}, "b1XpSC0ndnm0ZewNXC3pp": {"text": "Açougueiro"}, "b5OdBMMzkf1FlQbUR5-m7": {"text": "guardanapos"}, "b9Y5MrR-jn8fh77gAkLZy": {"text": "pintar"}, "bAoK85XLNb7p0ebevYZ6O": {"text": "olhe no espelho"}, "bDnuS19hfd9GhJ-6rjNPD": {"text": "ser"}, "bFodvUraUhJeq4waMdlxv": {"text": "Domingo"}, "bNJfccUvG2DQfR1iZP3eR": {"text": "cobra"}, "bVN3R44VuZDw3IdQMolca": {"text": "mudar"}, "beNprvNb0UztxR4JLxDFm": {"text": "aniversário"}, "bge6qR6NzsD5Vk4ifPsSO": {"text": "ketchup"}, "bpSuQQRlIcSse40OAxNSG": {"text": "Segunda-feira"}, "bqjKW_qBtRzIThWxdZx2s": {"text": "copos de água"}, "buyy_2ydocKoi9TnBhZ1N": {"text": "amigo"}, "bw3rqHXD1TJ53xbNggEqH": {"text": "Café da manhã"}, "c7kK5ROVbO3DHrwSFEawq": {"text": "doce"}, "cI0JxwhkWU-YA7E7rmJtp": {"text": "pescoço"}, "cJMQi3SVmqvWJ00VxI6gy": {"text": "Como vai?"}, "cJw2i319mzBUpEfBRDxc9": {"text": "peixe"}, "cJzHrV_PsV-PwwyFN9jka": {"text": "%null%"}, "cS3g4KXf39akVFHCG5AwL": {"text": "caminhão de brinquedo"}, "cTiw7_Yjxu_Kg90q7PdYl": {"text": "gripe"}, "cb0rJJEYOeEoRU5fDdQQq": {"text": "ele"}, "ccGASDOGtty6GfQMEEBEU": {"text": "três"}, "cj6OuVw4Nob8jxP-E4rZc": {"text": "mudar minhas roupas"}, "cnyLFMkJu2i3cqOY0e9kl": {"text": "passas de uva"}, "curstMeuThu2KUph-8rkB": {"text": "Jogar com"}, "cxMNBGV3LytDXgwDMCiga": {"text": "tolet"}, "d4zNoj2BAFG9B7J3KAlLE": {"text": "botões"}, "d6s8fLFBiQ3KEJlNdJfUW": {"text": "um pouco louco"}, "dHM0qnbmtJAkZY0WBsqaY": {"text": "lilás"}, "dLHDzm0rfgL-vXTx14HSm": {"text": "procurar"}, "dNvN5P787hAPE7ZYNgwkw": {"text": "passeio turístico"}, "dR72liRxC3qmoSa6Dz2a2": {"text": "xarope"}, "dS-KyYREUQIk7sDlmsvoa": {"text": "aproximar"}, "d_I8jNfbkQD0CHgZn7hyB": {"text": "camisa"}, "dgm3NCKuz7L39PX8LYxj7": {"text": "brinquedos"}, "djgKI9embnk95PAtFcn45": {"text": "troco minha fralda"}, "dn41o5K_1fo-qHO-YLoQn": {"text": "Sábado"}, "dnXsSOeVG7mq37uciIi2J": {"text": "pausa"}, "e5sCl246xFMESEfFy2PhX": {"text": "cama"}, "e5un1yrIuZHQi048e5kD6": {"text": "doces"}, "e8zl_ecIloo4Vk-OZPJWe": {"text": "brincar com o tablet"}, "eDX2HSkGaY2TeVwPjR07S": {"text": "fácil"}, "eGJ8MC1xPE6ueF82jCmVg": {"text": "escovar"}, "eKJCZc-kD0-m6cVLorFzO": {"text": "pera"}, "eWSI1NInbQowtO99phhGA": {"text": "boca"}, "eZEqRZjRK8JJMsfHo4Y7w": {"text": "do"}, "ebo03xnkyiHD2pKUKULmr": {"text": "desenhos animados"}, "ecUOs24Pp5ZTRt_ZvED5W": {"text": "acompanhar"}, "eduqLSyC3m4uB1Oee6dt6": {"text": "metade"}, "eji-M2j5eHkG71DCksleY": {"text": "ovo duro"}, "emm_RirDsO30Enax5Q4gd": {"text": "com"}, "eo3Q5AjHJz5kp1EbdALwh": {"text": "você"}, "eoYtISVZl3mdwoE_HW-Mv": {"text": "guitarra"}, "et1KiL5-zob_EcGlj7tLN": {"text": "depois"}, "f2dl12fMZbRdQ7STpcTdk": {"text": "futebol"}, "fF3ijeQzetfSn6EGcs1yY": {"text": "cerejas"}, "fL_4POdbPVL9-lvQVWSqY": {"text": "avião de brinquedo"}, "fNAlqbgrpirQZO_LhrkXY": {"text": "primavera"}, "fNv4Nb6Vafxk0JxXr-iDo": {"text": "investigar"}, "fUUj_4pKPflmJlxZfk0cX": {"text": "discoteca"}, "ff7ES190q1dmFYZ7lo6x0": {"text": "pão branco"}, "fjCOcN-PKP6F07IZcI71X": {"text": "quadrado"}, "fkNwVm56PSe-qh-QoM0vm": {"text": "lá"}, "fk_z_HrvcUh8XIq8D6gQP": {"text": "nozes"}, "g1Cj6HW8kg8yPE1XX9pxa": {"text": "de"}, "g1TLUpuQX2Zs1ob9gqYui": {"text": "boné"}, "g2MhHawoIC9oFNEv5_w63": {"text": "vida"}, "g2sQSxCcoZuKJ3TabK6oT": {"text": "veio"}, "g75y4E53ViakV-s5UfnIF": {"text": "bagagem"}, "gFEnqFhYoXF7QN-n0ONad": {"text": "montanha"}, "gYrIz3R13-BC_pYcvQ9BL": {"text": "inverno"}, "gaem1LHTtfQdnnqYi-sOm": {"text": "carteira"}, "gff2FqDlgXknRld7YMLWl": {"text": "todo"}, "gsU8pE9ozhR73xS2icwJ0": {"text": "livro"}, "gvPwrzDSSEPwcxY878T_c": {"text": "Gato"}, "gzCjycNS8Cf0vNlo1klji": {"text": "chato"}, "gzb-RNDLMNkgk9wnPILJi": {"text": "avó"}, "hAZhogJSH3bL1iL237N8J": {"text": "Pipoca"}, "hDvpMlPw-chcuxEisBJTl": {"text": "castanhas"}, "hKJhXxultsxm0TJl1P8-L": {"text": "obrigado"}, "hOyjT1JgOYB-mGLFMaNJR": {"text": "dor no peito"}, "hT3Lrjn5-q7YIM1loG4MN": {"text": "palestrante"}, "hUYfE_vmNBT_7E60YZsSu": {"text": "pintar"}, "hWWOw1gWjWwN7wQJkHrTu": {"text": "percorrer"}, "hXgGhazQ_nA5uqpRD6Qwq": {"text": "ganho"}, "hmhAUgqvGp7nc1w25sRSx": {"text": "espere"}, "hwzwfMyJsvB42F_QWQWyi": {"text": "suco de uva"}, "hyUaYltGVJU-wRrAjhhPa": {"text": "cantor"}, "i0wB--S4sdL8Q4H9b93UY": {"text": "ácido"}, "i2mlV3zGS6nrH2l6N2BlZ": {"text": "trompete"}, "iAqItRUQL_YpbMn2pgjsA": {"text": "loja de pizza"}, "ibtmTEP3QGDY8TyVLteuX": {"text": "macio"}, "ifd0M0pAlFm7aPt1A0ze_": {"text": "amor"}, "iiA1u1JKRmhe2jWVE_W79": {"text": "amigos"}, "iimGxVoFWlq_THThR3vmF": {"text": "notícias"}, "ijn-QwQuTxRFFVe-7WlSX": {"text": "coceira"}, "iowxE4MxcV6PR2Uhtvxqs": {"text": "hospital"}, "irbOv2dHA7G969dnJMfJn": {"text": "caderno"}, "islCzqFq1SYrZAh63dLhQ": {"text": "ovo frito"}, "j5xZZev5nTNa-p088Oqnp": {"text": "beijo"}, "jBqD3qhhcrioLlCU-xq5b": {"text": "instrumentos musicais"}, "jOALQbfxdXmJVyY6P5gZG": {"text": "Damasco"}, "jTEb3A5ZEKEy2ojuq2vO_": {"text": "osso"}, "jeO9YZ22LfSObUNhQDRAz": {"text": "janela"}, "jfly9fZ3x1da4SGCCNcV2": {"text": "lenço"}, "jfvreGZv-e8rD4-01wZ5H": {"text": "banda"}, "jhJ2TOfdaRAcVeHGOjwua": {"text": "leite"}, "jmzg4EiC7JEHwe9gNP3C3": {"text": "arroz"}, "jpKPg3hn6_GO1HSkeLNGz": {"text": "garotinha"}, "jprAsdXWGQKPlUWwgBBot": {"text": "filme"}, "jtKc2q2n5an342ZkiMB9R": {"text": "higiene pessoal"}, "k-iDOTk5uO7ZK5OB3v8It": {"text": "velho"}, "k41gkf6A_bDtQAJDOrWpP": {"text": "pasta de dentes"}, "k7dZhQtwDPFlOk1iPjEOz": {"text": "aumenta o volume"}, "k8tJx6PikRcnVuZEqrXRM": {"text": "viagem"}, "k9ZpWM4oRb1q20c0qWCsg": {"text": "casaco"}, "kDzHKO8eIwNsyKWDw7M0c": {"text": "uva"}, "kIn8SeGURyvu49EsRqDs7": {"text": "pijama"}, "kN85Lb_C4dLnww7sz1afK": {"text": "café"}, "kaiWPbXxjHXlqcpBaBp4l": {"text": "viagem"}, "khUUL_1JQGngApqBRDh_q": {"text": "Consertado"}, "kpghvJtujlt4vPI2N6vsg": {"text": "qualquer"}, "kxuGlfYjS6puO2xD1QvxO": {"text": "vamos"}, "lKA4b7I3iFkqNzPcAXyBc": {"text": "chefe de cozinha"}, "lKMW_xTZzCrCHRcGp-Z-n": {"text": "biscoito"}, "lR84gCk8OM-oYoLAV7tar": {"text": "campainha"}, "lXH68vGIuZdfA8xVrS8iw": {"text": "bastante"}, "l_ncJLRdVGBzzQc9yqBqs": {"text": "banana"}, "lrUuPKco_O8FXDuclzpKE": {"text": "precisar"}, "m0434KkjeTv8SGN7WxR2C": {"text": "preto"}, "m0Fkio76HZHS2HguPOTn5": {"text": "seis"}, "m17b6MazSk6M4gb51_cCy": {"text": "pulmões"}, "m39xTdgaenoi4mWGEa-Ew": {"text": "prato"}, "m3qTT8tiGZQheKIWREzMT": {"text": "vai"}, "mC9Nb7zVdEUpjEBODw_gL": {"text": "você"}, "mFfylZ8yoLvtkVSDTlVEN": {"text": "pomada"}, "mJqzbxYeIDQciPkeHA1Ao": {"text": "faca"}, "mK4AXXhoIVirBz5dr_xLA": {"text": "peru"}, "mRK--C5Q1aGe8MMPJJLYi": {"text": "preocupado"}, "mTklFAI-FVVLsMKoASZ7T": {"text": "um estranho"}, "mWXxPPvhSHf9hyb-VyuZH": {"text": "e"}, "mZFwH8xY_OeVDWCdvPZBy": {"text": "pé"}, "miPmA2tOQiLxOW7D_V_x6": {"text": "cubos"}, "ms97ZsgQOvD-Z8qpSW4oN": {"text": "quem é esse?"}, "mx6dmRLXA_lkN1QlP71vq": {"text": "todos"}, "n5bZClAB6jXAZnwxIwH-1": {"text": "brinde"}, "nK7DRpxalLBHL9OnRjSim": {"text": "framboesa"}, "nMQUtS-kFHViOKyop1FdS": {"text": "arco de cabelo"}, "nQSk6_KCEVdO7oC_uxLXN": {"text": "orelha"}, "nQdbkRVcwpQB_hFNPbe6M": {"text": "cavalo"}, "nUg2M7p5sUPlGdbBev2-G": {"text": "tornozelos"}, "nm6e_s01gWHzdVj25BHyq": {"text": "que lindo!"}, "nnTJQMJWfd2nuTSlFNEOy": {"text": "meu"}, "ntzBlFkDMTKEUHoGNc65u": {"text": "banheiro"}, "o0oxaoUFpOLiGsoQBlalI": {"text": "bolo"}, "oAxNCJufVUqZMyWRGdZl9": {"text": "seu"}, "oEHzYcfxDGGcsL-deud1j": {"text": "lanche"}, "oEyUWrQj1iYUnlEUdQQ5Z": {"text": "flauta"}, "oO21zLMEtHEakvnuTohLu": {"text": "que divertido!"}, "oOkD8Wmvb4t9I2EWqT1Nr": {"text": "amargo"}, "oSBFO8Ka0PN4bgX0QuWxL": {"text": "viajar de carro"}, "oYwoiRDWlIjSTbYdC2vG6": {"text": "saia"}, "oa-MShota2L8n2pU8hIsm": {"text": "jogar"}, "okr5oAG2U8Er1XwQ8XbWD": {"text": "grande"}, "oqQWeoWBr5N0LrPGY62Og": {"text": "seios"}, "otTWzTaTAmweNCozT8tn9": {"text": "alergia"}, "p1qK47wwLwF8S0Fy8-2Mt": {"text": "mão"}, "pHBnmCFpM7oZf0O78CBIz": {"text": "doce"}, "pM-bC77hbj-w44A0HFRDZ": {"text": "assopre meu nariz"}, "p_XyUXRmeUk_bdjRTMtkz": {"text": "diários"}, "p_qpVEd677b2Bk56yhvj6": {"text": "jardim"}, "paPpjw1XVC9-6xcueJsrY": {"text": "todos"}, "pgPlWKk-oww2fua5zYuue": {"text": "pão"}, "phZ4F4uzi1TrhjeDMuMsn": {"text": "travesseiro"}, "pkuppr1jMH7SMpa2hrIWQ": {"text": "Suco de pêssego"}, "pliNY9oMQh1iSidkEhhDO": {"text": "abraçar"}, "pptyFMhLrbC6lN6zmc7D0": {"text": "sala de jantar"}, "ptQZXjMQyXWycUD1kAkQo": {"text": "conto"}, "pv8eYkxczIevQqEGwDz6V": {"text": "mochila"}, "pvXSy-5M4i8kysUppvdME": {"text": "que"}, "pwltOTDn2OyABTlD4-27W": {"text": "vegetais"}, "px0jKQDj7r9pOYs4ZrvcT": {"text": "tomate"}, "q22wRFF21EigV8YzQ_MfV": {"text": "me ajude?"}, "q6F-qJ7mTxvwa43F6vwun": {"text": "escondido"}, "q7Pz4UqqZUlXeFfXrwXDR": {"text": "limpar"}, "qA4v2JWQU0zzBBZgvW7Vt": {"text": "tremores"}, "qOsbXyvBTMDAwvvnI0iFn": {"text": "pequeno"}, "qU5IvFLD8d16iIHSs_9TM": {"text": "cebola"}, "qWhpDTMd8eAEoq7yTKc57": {"text": "roupa interior"}, "qYA2U_BFOZtFLClxuCIBJ": {"text": "dor de dente"}, "qeJdrxKIIcUctIjo8wWhc": {"text": "afiado"}, "qn-7ERrcZxJTqfW6hwNs8": {"text": "correr"}, "qsA1zm1DOlItK7DCWzAw8": {"text": "entediado"}, "qscoBbrWu7tQbpNj9XUPt": {"text": "papel higiênico"}, "quE_RA9abVvtG-Fo4Jx8f": {"text": "dez"}, "qy3c7gvRU7shWuJYr1kBk": {"text": "bebida"}, "r7eJgCF_b_ktkztv4-oda": {"text": "meias"}, "r808IO3I6j3os_uix6O63": {"text": "jogos de tabuleiro"}, "r9qUBQwgY8eycnU2OVey0": {"text": "comer um sanduíche"}, "rBwDn3PcJGqytqnOZTJMV": {"text": "táxi"}, "rMFGfzFobfGsH3_qrLHXU": {"text": "peixe"}, "rU9cpWF0I4wnJjzTXpGtO": {"text": "hoje"}, "rgyV6CvFe98OGnWut6QCZ": {"text": "turista"}, "rlGO5jGKPL1vW-VF4nRqZ": {"text": "Entrada"}, "rnjJyPTabH_Xpmy4Z4O3U": {"text": "comemoro"}, "rtHwq5WN9KElX3V3SKBmS": {"text": "batata frita"}, "rwyX2YemNEx_Mh64IArDQ": {"text": "escuro"}, "rxdfuk6egO7VmZEB3JrUN": {"text": "o"}, "ry_jOegpMf4nB3spGf4d2": {"text": "eu gosto"}, "s0BXoyn7AqUAlZ9BOHY6S": {"text": "triste"}, "sAsTkky29uEVC9vo3Ofbo": {"text": "braço"}, "sDKIldL3tit328Joneo_7": {"text": "copo"}, "sFNUgvnglgrm6cbYiM0di": {"text": "quando?"}, "sP6uvKmY5kA_yuYR8H21c": {"text": "dia das Bruxas"}, "sPtazVgymXESdS-BcHqU_": {"text": "aves"}, "sSTGRl6DpYGZXp8vtTNbm": {"text": "comprar"}, "sbv5HLPUR6gHo-EJR2S7S": {"text": "camelo"}, "sc0hr3jQ80yXRFDlAn56V": {"text": "fadiga"}, "sixdpB8hTOhlUr4loz3RB": {"text": "boneca"}, "sjGytpiPjwqJfPaRUJ-Iw": {"text": "Quarta-feira"}, "sysOciGqtL7y4ULuyYVc-": {"text": "canal de culinária"}, "t-w8e69GwxLyfxlWwHk9f": {"text": "geléia"}, "t34TbvjJ3zG2jcgJaCeHa": {"text": "tocar"}, "tGyUfSljuc7A5Do5B9GuN": {"text": "suéter"}, "tQwMPLvqAMAstcqvnOERE": {"text": "cinza"}, "tWxC4hR6di5zQC-Hujlev": {"text": "volume baixo"}, "tYwEpd2EOtH8wEUr-jwHk": {"text": "caro"}, "tw1doIY-jFPofZjlPFj4z": {"text": "qual o seu nome?"}, "txj22hip0CE9qp_z-daIK": {"text": "nebulizador"}, "u1nIt_oFH426g1IVhlYk5": {"text": "sedento"}, "u2e4Zh8qwJF7zKkohQ8df": {"text": "borracha"}, "u3BufiTZTK6AylGh80ZFd": {"text": "ela"}, "u8HfFvMPkogdWk-URj9hv": {"text": "escrever"}, "uDg7Yy86PlwsAd-U96vJR": {"text": "Acima"}, "uFoytOG4qsXzBk979t63y": {"text": "limpar"}, "uMhOF9ZvWnjW-Zrjbjfhs": {"text": "mais baixo"}, "uOA82KFAVtjoYRTuYFgpr": {"text": "sobremesa"}, "uPL5NMeXTmD1iU6ZoiROu": {"text": "pássaro"}, "uYElWOlSOSoQap-d5gsYF": {"text": "chocolate"}, "uZRwbLa1lEG7ol0UJKRBj": {"text": "velho"}, "ubP5GM7_0vPkRc6zbD9Ez": {"text": "antiácido"}, "uiVc5R86QCZkhraEFlrNz": {"text": "museu"}, "ujyHgmlPIs7UdtndbYd8S": {"text": "amizade"}, "upWXctTSKBtFNSXnXDK_u": {"text": "fruta"}, "uzSwgQNnV8ZrjxpN5Bz_a": {"text": "difícil"}, "v-E2GE1DpCkNAxsfA0f4M": {"text": "apagador"}, "vHzfvEgIkQ0e73ryfWP2F": {"text": "ordem"}, "vKGLQIas9RdBnPGsaYtr2": {"text": "Pipa"}, "vOgqHjpHgrUGERIHtVqDe": {"text": "lixo"}, "vPicdKLrhT2wmAAPPukKP": {"text": "rápido"}, "vPnmrsRou1ihosdVXS_Op": {"text": "tênis"}, "vZ9JaTnoj8C0ILYxMNB73": {"text": "abóbora"}, "vaYJPAsTRvslo2qFOJt60": {"text": "costas"}, "vazatQ7CrYJFsorVDC5AC": {"text": "leão"}, "viAHJeLRr_6j9dEi5klj_": {"text": "amarelo"}, "vlh1Pa6eA0ZrBs3vHzWH7": {"text": "urso"}, "vmb_RMIB20QND6VcS0deY": {"text": "barriga"}, "vq3T-UQGTjX3Z9TlEF12e": {"text": "maionese"}, "vy-O5Zc5kxY8d-7RROvQI": {"text": "presunto"}, "w4cVxbBDZjeNyHwpBARHQ": {"text": "ombro"}, "wBLnDZStKj8YLkg2pTCfh": {"text": "sentir"}, "wCGb6D4xSVr4UeKXzGIlP": {"text": "fantasias"}, "wcpXeLMBRusfqfrz9s4mF": {"text": "purê de batata"}, "whHwNRVnqeM7BMx6nppiW": {"text": "tigre"}, "wkrNPLGWTqMIy4PJRW9QR": {"text": "em"}, "wnfSUkF8-tQiRTVou1_pd": {"text": "frio"}, "x3PNiU1NIeQ3zQa31C8WX": {"text": "favo de mel"}, "xGsyYCjDzQugVzSaK8CuA": {"text": "duro"}, "xIgPo3N-aKXhVcjultMiY": {"text": "fatura"}, "xPUYlxRxgFVn1FHQFz6Ic": {"text": "secar"}, "xQblStUfyBGO27j15Sda3": {"text": "pato"}, "xT4BPNmF-5WAQLfs3cUpS": {"text": "apaixonado"}, "xXtjQktuAq1bmxTc0HSQT": {"text": "refrigerante"}, "xbPnUL4qxvm30VFYNphh-": {"text": "tios"}, "xiaTdHGInqfm4rD6XzSeZ": {"text": "luz"}, "xnPF8fvkC1TvgETI1JcC9": {"text": "órgãos"}, "xqGzZJIHBeVfSzRfm3rmg": {"text": "um"}, "xxr0MRGYRmmoNC_gsD9uy": {"text": "Passaporte"}, "y0SViQxW8Y-yiX1Z7gXWt": {"text": "Super-herói"}, "y5W21CKOkLWnYJo1OC700": {"text": "tosse"}, "yJoivIPHOm1Y1lj-hGN1J": {"text": "dormir"}, "yNag8CK0wV_iRMnFznsXk": {"text": "bola"}, "yR9FTtOimFwZG5g5tgpRk": {"text": "Visita"}, "y_5OURnKxFcv4UiMKntUi": {"text": "e"}, "yihsjW9ON0Fr9Yy4ZlP9c": {"text": "axila"}, "yk2wDVqHEKKwupgm87OJ2": {"text": "nádegas"}, "yo00Ci8bSRFYPU6HxGVwX": {"text": "cantar"}, "yqlmoVGItXqaeazw3M3eg": {"text": "cadeirão"}, "yvtvSsBLhabkcpeYGbxQr": {"text": "bota"}, "yxa6QVSrmWUKH2PZHKaVl": {"text": "alface"}, "zANp2EnhT6n0Jcl1Xra6K": {"text": "dança"}, "zAmesi1FcIWLXE3WVa9WS": {"text": "antialérgico"}, "zRTTg5x_P1E8Z3CU-oWXa": {"text": "qualquer"}, "zcibOHpRbSmz1hVNSjPTj": {"text": "garfo"}, "zdFC3vpgjcyUWB9a4ghRW": {"text": "descrição"}, "zi_wcT10fxgn72ZJhVx18": {"text": "vestir"}, "zm_6R89hr4wjuVkifiYrk": {"text": "desgrenhado"}, "zrR1DbO_szgKvxLyrZquw": {"text": "aquecimento"}, "zw-o9pDectP5bxFnUjrJO": {"text": "porco"}, "zxhRDSHXtV63Sp3c2fjrI": {"text": "alfândega"}, "-k6dUC6thWPyULq8MVSe6": {"text": "PRONOMES"}, "0geft4arn_A8kL-rfUPYc": {"text": "PESSOAS"}, "1aM3sTxyb8yLSWtkn2MoO": {"text": "INSTRUMENTOS MUSICAIS"}, "384rVetrrLX4x4pJ0Y0Na": {"text": "INTERAÇÕES SOCIAIS"}, "4e6iVOPLAjnM6wCMUm5P4": {"text": "CAFÉ DA MANHà E LANCHE"}, "6vmRBH4shBk3UQEUM6APX": {"text": "CINEMA E FILMES"}, "7Jm3bDhPInSlwhdy20dKF": {"text": "AULA DE ARTE"}, "7ngCuvmAnM_7ygpFQgLpk": {"text": "CORES"}, "7w5ACMFdOCTkBrS911MA1": {"text": "ADJETIVOS E ADVÉRBIOS"}, "8FPdnkMzOIBVTW5-TQxWX": {"text": "PERSONAGENS"}, "8t8CAggTj3HuznkKhfXle": {"text": "RESTAURANTE LIVRO"}, "9JRv4X68pAtwsFT3Ss0iJ": {"text": "LIVRO DE NATAÇÃO"}, "ByBvBUS7dcXldjzZOVFFP": {"text": "CORPO"}, "C7ClEHF5-Mcico4FvRxEV": {"text": "PREPOSIÇÕES"}, "GD9YHeLktSsdZQvcoua6x": {"text": "LIVRO DA CARNEGA"}, "HzPl-HvsrXL_QkGT38Ohd": {"text": "LIVRO DE ESTUFA"}, "JKEk5TYykBK6ZeYND3Ron": {"text": "CONJUNÇÕES"}, "LWyfHr8Oui5HIShtZ_huo": {"text": "FRUTA"}, "PYTnUqCLwAbngR2Ozroc2": {"text": "AÇÕES"}, "QQszyYRLL-otCQtRfbLzm": {"text": "TEMPO"}, "V6K3TniptOApMMGa8TspR": {"text": "TODOS"}, "VhfGFlHDcPor996rCzoK9": {"text": "CELEBRAÇÕES"}, "WZYuZd331Hm5gHXJtUmBN": {"text": "ANIMAIS"}, "ZgZoyOg5K-LscXdfl6kQG": {"text": "AULA DE MÚSICA"}, "_Cw7FcJSYiterkLSDJH8V": {"text": "LAR"}, "ah257x5jssDmLIOrcSGn6": {"text": "NÚMEROS"}, "berI6X2_pAVCNOrcHAL6y": {"text": "SENTIMENTOS"}, "ce2z_EeEG2nH0ZS4KVAkA": {"text": "ESCOLA"}, "dQXaeM3Uul1yEvRwJ4w9t": {"text": "ROUPA"}, "ejXQZAiYjrcSFGXb1pz7M": {"text": "TRANSPORTE"}, "gybgILOLxmIVfeQtb1f94": {"text": "LIVRO DE HIGIENE"}, "iHS1HpUBBadzgmbum_bdD": {"text": "PROFISSÕES E COMÉRCIO"}, "jatDsecioVAxRph-WOg4f": {"text": "LIVRO DE FARMÁCIA"}, "puOOrKWbYzH0B_8uGkxYX": {"text": "LIVRO DE VIAGEM"}, "puda9fUGjqvm9oSM6CpTk": {"text": "COMIDA"}, "rH7zhJzNVIcEIRyvaYLoi": {"text": "ESPORTES"}, "uv4tWMRHfewaEQ_pH0dnV": {"text": "LIVRO DE SAÚDE"}, "wAhDHMrZ850dHTwgAXrMY": {"text": "CONCEITOS"}, "xjfPlDs-AcFV9LCyY-v9j": {"text": "JOGOS E BRINQUEDOS"}, "y545pM8pvB3WgukIac6NT": {"text": "LUGARES"}, "zwf7qmSEi7PBwsNaqciA-": {"text": "ARMAZENAR LIVRO"}} \ No newline at end of file diff --git a/assets/languages/ur_PK.json b/assets/languages/ur_PK.json new file mode 100644 index 00000000..9ee69822 --- /dev/null +++ b/assets/languages/ur_PK.json @@ -0,0 +1,2504 @@ +{ + "-2UbAou9ydr8XeN-jtIz4": { + "text": "limpiar" + }, + "-GL2iAgykP10Ae3AKsVOX": { + "text": "sal" + }, + "-LE2iv3Pwr5KuIyM5bYb3": { + "text": "bien" + }, + "-LwAKwgCdVkzwM579zRMo": { + "text": "más" + }, + "-aePI8WknXpxEpz19Lu48": { + "text": "suyos" + }, + "-msU3yor4qJYQHJtWrdk8": { + "text": "pastas" + }, + "00AkNJ4YLpbRD_mLmQjtp": { + "text": "almuerzo" + }, + "0IrLGI8Ebm8rcS3ymUXqS": { + "text": "hambre" + }, + "0THELgiQ7rvA-orESXJfV": { + "text": "avión" + }, + "0Vkmy6BZcJn3pFurEevL9": { + "text": "estudiar" + }, + "0Z7uFXpp-XRXmqM8ILhIC": { + "text": "poco" + }, + "0_SK41wNOk6mw2qX_eHXM": { + "text": "cine" + }, + "0cdYDZ5HPaTmqTTN0_Ee8": { + "text": "suerte" + }, + "0fHziRVxg0oNDp5pyiI8M": { + "text": "permiso" + }, + "0fcYcD_r0jNWXTTAx8Ph7": { + "text": "aeropuerto" + }, + "0gAyTD6sImo0jpD_bYGVv": { + "text": "jueves" + }, + "0huLn-H32Cbwba28IZ3tc": { + "text": "burbujas" + }, + "0jpMJu8isUmOZKxhZ_yaj": { + "text": "equipo" + }, + "0pFtmDZdlnLrUkT_XZDXQ": { + "text": "antes" + }, + "0qoQs8WyLVONnu3_eBGfD": { + "text": "dolor de cabeza" + }, + "0v5fqIp8GmXsIHO0SPhtt": { + "text": "dale" + }, + "0vttFf3nAGDW6g5wVStcH": { + "text": "disculpa" + }, + "1-VwcvzNfvrwDWRGxRPre": { + "text": "ni" + }, + "10X4OKR5xmNhSj86sbyE_": { + "text": "salchichas" + }, + "14aCIW665UZtuwNsKKV5s": { + "text": "cartuchera" + }, + "17AkRFlfC_koV-lywmDE8": { + "text": "pantalones cortos" + }, + "1B1WmC-V0PglDeRAeINcT": { + "text": "mirar" + }, + "1DjW-XvWN7iOqoJPRSWwY": { + "text": "mal" + }, + "1IjenNwPwsMIWZ4aYBk8S": { + "text": "partido" + }, + "1Ph13Z_Ya6p-q0WA7pSl3": { + "text": "pájaro" + }, + "1QEfLU_S7TM0iMr9VZVtP": { + "text": "ronda" + }, + "1Rv9-SSJjHptwvzqLbdbx": { + "text": "divertido" + }, + "1WJZO-pUkTaQvyxz41iB-": { + "text": "picado" + }, + "1YOlJCovdcnnqVihqHVmq": { + "text": "acá" + }, + "1b71P9YjaNWnX8AWjstqG": { + "text": "remera" + }, + "1mS8kgJIod1cyUFH-msnM": { + "text": "estación" + }, + "1mU2ZosZXSJrxkh1NmxJT": { + "text": "izquierda" + }, + "1nhsReHG-f-bW-xaZBsxY": { + "text": "abajo" + }, + "1pb6S-RR_3zdCq77YFiZ-": { + "text": "¡qué mal!" + }, + "1zU7kolOKsHP9-oomQW1Q": { + "text": "rey" + }, + "27GbVOZ-szdnzsy92oY-X": { + "text": "manteca" + }, + "2CgcUkvJUskv982FvG54A": { + "text": "plata" + }, + "2HkB0WZYP7cvWLD39GMQj": { + "text": "bañar" + }, + "2KO0BFtB4B6fu1feuAZLt": { + "text": "verbos" + }, + "2RZTRMX56BFLrW7tLJ3Hy": { + "text": "mismo" + }, + "2Vc2H462cutVtUC-5omJk": { + "text": "pocos" + }, + "2dwtZO2wCm520GPD1i6dl": { + "text": "dolor de garganta" + }, + "2t_eq1JmgHa0R3eu8LMmI": { + "text": "ventilador" + }, + "2u2-AFuI245I7bZ6tsSPh": { + "text": "¿quién?" + }, + "2y9pxVOBQ2tMdPHcsqQb8": { + "text": "martes" + }, + "3-ueUrnwmIIj0BMP8_Ntb": { + "text": "uña" + }, + "32PnZjlnQbTJo4nL9YJYe": { + "text": "feliz" + }, + "3932Zm0xgk1hKB2hhBAUa": { + "text": "colectivo" + }, + "3KbwCHGooNLySWOBlFFuG": { + "text": "cocinita" + }, + "3KgKNNnuYMrysEDs3Pu4Z": { + "text": "subtítulo" + }, + "3VEnVjaGFCImBAZ3wEChu": { + "text": "ropa" + }, + "3arbCGI6fMOWALLanZcg3": { + "text": "capuchino" + }, + "3dtvYLjbl5oDyhZO9eFRY": { + "text": "ellos" + }, + "3mwcdenOurU_e59ChLqb0": { + "text": "fuera" + }, + "3w62N9b7Cvb6JMjB9Wphi": { + "text": "beber" + }, + "40q0NJ6vsziJDNFBqho7Y": { + "text": "dentro" + }, + "4A_FNkGH1EDu0oabPurrL": { + "text": "cereales" + }, + "4J1bWl6BbbEdZsRGsgYH2": { + "text": "queso" + }, + "4X7OXm35OSHoSlPxGUi_f": { + "text": "mueble" + }, + "4bHGIoQmDN8LptpdNN4v6": { + "text": "vacaciones" + }, + "4f1vqDoAvUu2XYk_JlQdC": { + "text": "siete" + }, + "4rctwNiN4UaU9lqU48MHG": { + "text": "computadora" + }, + "4rzonBodQXfs77gALnAP_": { + "text": "cerveza" + }, + "50wJdR0-3YLnv9y_2Gx_e": { + "text": "saltar" + }, + "54BVjn2seJWdBNGI20-yJ": { + "text": "computadora" + }, + "54taab8z9ziXt0IqXHkV9": { + "text": "dedos" + }, + "5L5UzBHOzuHRoO-jyPuEx": { + "text": "ciudad" + }, + "5LYjhk-N87Ov9NrQcGbLQ": { + "text": "aceite" + }, + "5Tdy0Gu9SiLsPfWwd-Y2E": { + "text": "lindo" + }, + "5VBtwEswIjrv1zbXP-oFn": { + "text": "sopa" + }, + "5W5_sCAyGTkVzguCEg1d1": { + "text": "jugo" + }, + "5dvq344JstkxUpHszaPfp": { + "text": "delfín" + }, + "5gPT9lrNgpRkF07lP6zOq": { + "text": "jugo de manzana" + }, + "5i3kSsCKF7Oa9iJQvXiTe": { + "text": "más o menos" + }, + "5kjlzqb9Rf3zzqZROaZ9p": { + "text": "perder" + }, + "5mGrGHzdw_vCwYCRNPcPw": { + "text": "pasear" + }, + "5vxTXbPl4Y0yezGu7p1f6": { + "text": "hacer" + }, + "6KicPX6y_u2i6tPBZAtvA": { + "text": "lavar" + }, + "6jLkKc9OL5btNOmjJem6S": { + "text": "poner" + }, + "6lYN4qSZx3_tKDClp4Iyr": { + "text": "entre" + }, + "6nhNeVjDfDi-GmreaqfVo": { + "text": "nublado" + }, + "6rcOXG6yxpzHLzMJ9IayI": { + "text": "cerrar" + }, + "6t2sPdapSNJrOziDozTWW": { + "text": "vaca" + }, + "71l2at-8480bvijxn3uBl": { + "text": "durante" + }, + "75gujwNXJdAiNmK6Ffhia": { + "text": "jugo" + }, + "79xBF6cKgKeD4GeBPe_Ds": { + "text": "bolsa" + }, + "7EsVGfapPc_38mHCBy3C3": { + "text": "enamorado" + }, + "7Hz61-WzV62FHsedOwz6q": { + "text": "flan" + }, + "7Q4Zc0cenSF5U4eKyje1f": { + "text": "hacia" + }, + "7Q9sNljseWjwSPW4in1ga": { + "text": "recepción" + }, + "7VL_MgnLDY6hi8sbvcGIg": { + "text": "silencio" + }, + "7WxUVoVQfQOzARU2bf6HP": { + "text": "casa" + }, + "7iAXKVm22uMgr6aqZ1rr7": { + "text": "abuelo" + }, + "8-4M30dTtmuUJus9MtGqV": { + "text": "moco" + }, + "81UJI7xOa5l9mVceqkIP5": { + "text": "tener frío" + }, + "82LicIQc3K2xCTEt-iMpu": { + "text": "caracol" + }, + "86gNdF6aTepa0Y9zkD1VQ": { + "text": "campo" + }, + "8FFwIw7rJri79BITZBUzm": { + "text": "hotel" + }, + "8KlFB3an1mzdQd6-LGCCE": { + "text": "merienda" + }, + "8LddDqylw-51wHhx9_Qad": { + "text": "libro" + }, + "8MV4ZFthtUeoxLAIbqGTc": { + "text": "carne" + }, + "8cOIYr-hcK54qWpuT-41e": { + "text": "cuento" + }, + "8fGingRAd8idw4qcxyZ-Q": { + "text": "vergüenza" + }, + "8iFdjRTQU7ONGnigRTlm8": { + "text": "¿cuánto sale?" + }, + "8vR0HYniXtrrQqqSIN_JQ": { + "text": "familia" + }, + "904w9Je6oDwGXUCIcrUZX": { + "text": "lengua" + }, + "93YmZA7VfAT7TTNTsDE1W": { + "text": "serie" + }, + "93hsW10TmX3Vcq_4IvcZ0": { + "text": "blanco" + }, + "93tHieC_CgZqN998y5gAv": { + "text": "chuleta" + }, + "97nIv-aoc51T8kKTZV5cM": { + "text": "saliva" + }, + "9EqfwMNtATh1fwMhyn_B1": { + "text": "buena" + }, + "9FiWvg197C-Riid-DVysN": { + "text": "claro" + }, + "9GqE148SFZqMIft4evAk2": { + "text": "comer" + }, + "9MzeUcz1nRqleTkmS_-g2": { + "text": "barco" + }, + "9QyJdpUn0f6g7FxWs5qpO": { + "text": "cortar" + }, + "9U8MzceIsqKhG86oNx9zV": { + "text": "coche" + }, + "9UwpyOnOBoqr4mX3Juqm2": { + "text": "buenas tardes" + }, + "9ZnzbKMDwGEwC3hXOhXFe": { + "text": "pastillas" + }, + "9dvSIpeXa2_12Jip6noJP": { + "text": "deportista" + }, + "9kgRI3KlOIVSuylKffW9g": { + "text": "colores" + }, + "9lS0mNuKIS0olyDwoIJBR": { + "text": "médico" + }, + "9mLx-YMK81AflitELQFqk": { + "text": "papel" + }, + "9s5zV3_oGyDx_NEvsKCxX": { + "text": "violín" + }, + "9wE9Py6ztyqDrtaypsltA": { + "text": "naranja" + }, + "AOp6VGyjYIV0Ym9d0basJ": { + "text": "dibujar" + }, + "APXF-lEplPOloppSeIjAY": { + "text": "menos" + }, + "AQKGKdoX5CYycZ2YqBZVW": { + "text": "barato" + }, + "AT_rDWsr6xRBgrvgw9Zih": { + "text": "nueve" + }, + "AWJXh6URGN0Vwm66i6IvL": { + "text": "hola" + }, + "AeFbJQ0M9uTObAlKEX3zr": { + "text": "pierna" + }, + "Akf0xlH8UJdXn8BJzPV2A": { + "text": "radio" + }, + "B1845IfYfPMz2FWpVFIQv": { + "text": "de" + }, + "BKmATW2uBk4pxnmOaARyq": { + "text": "documentos" + }, + "BNjZz9MGLJEKZ4CZoTs2M": { + "text": "ajedrez" + }, + "BQhqx1PuF94jwT0ySTlbJ": { + "text": "comida" + }, + "BQm-YCPc0lfD1-mhecCTL": { + "text": "yo" + }, + "Bebnh8-UWwtYLnK6p3fKi": { + "text": "pan negro" + }, + "BjqWZnzLlxdOo4KEzZ46j": { + "text": "ocho" + }, + "BqS7d4PMhGRqPYlZQzUbR": { + "text": "puerta" + }, + "Bub9ZYygLcly15D7_wYks": { + "text": "amigo" + }, + "ByrvXHEN9Mb8D--7MQAjM": { + "text": "peluche" + }, + "C12mJ1W11fODI3pv1QOnx": { + "text": "gelatina" + }, + "C29KJ8BTFavhj_R9UfnSv": { + "text": "por" + }, + "C2bgADoxmINRnAiYxZHqd": { + "text": "taxista" + }, + "CBTemIvgIN1UAtftkc3sz": { + "text": "pegar" + }, + "CCWCtXdMuQBJRmaFOAlfQ": { + "text": "navidad" + }, + "CY-IQvUehkaiGFCdKf9bf": { + "text": "chorizo" + }, + "CYH_6DL9q1iLLetuWeR9A": { + "text": "tener" + }, + "CZrETqLgQlvDkLHvw1t_w": { + "text": "a" + }, + "C_JKGNCxOI5x_f2C4qAyZ": { + "text": "maní" + }, + "CbO32RkDdf9aCucv6BnGS": { + "text": "cabra" + }, + "ChBc7LjL8dgzZ6LUCAHGh": { + "text": "por favor" + }, + "CkTiaqBY3jf86JRq636lt": { + "text": "¿cuál?" + }, + "CsKZSNiJw5Q48b26Kskf-": { + "text": "heroe" + }, + "CxFmyJYmy6gMRqP9U0cBP": { + "text": "estoy perdido" + }, + "CyKtU9yC0Jy7Ypb4WFp6w": { + "text": "perro" + }, + "D1gCni2jXpCvKZe4qCtQN": { + "text": "peces" + }, + "D2tSkngqbQmdKLNhn9xWV": { + "text": "globos" + }, + "D7dt_hFX5DScV_ssm1nKz": { + "text": "pomelo" + }, + "D85FU-Wqr2u53tfTXAtHo": { + "text": "patalear" + }, + "DAq2J_xXHsSCSNPp9qVsk": { + "text": "oler" + }, + "DBd09yUlbkaYLsemjFXEs": { + "text": "helado" + }, + "DG1RiDjDfwWRhpAiIpPqA": { + "text": "vómito" + }, + "DSgrhLHauub-gBqMGwacO": { + "text": "asustado" + }, + "DXb0FpjVM9q8LVl9vvSHn": { + "text": "clases" + }, + "DXpjgLKTdx9eLLohVdmWM": { + "text": "verdulería" + }, + "D_4Weq7iyi7GMEsgP0xy6": { + "text": "té" + }, + "Djs1QsLNf8Q5LBIFV5zNC": { + "text": "partituras" + }, + "DkeHJFtqAS005fYUrl1Xz": { + "text": "pantalon" + }, + "Dm3yiKSB134LrjtW_KrO7": { + "text": "buen día" + }, + "DqGa4gqd2ABDi45BT43x4": { + "text": "princesa" + }, + "Dv9MSCRYbR4Q3K114wXki": { + "text": "alto" + }, + "E-vUPARie8MmfgZwv3Omr": { + "text": "gallo" + }, + "EM8VyonJ7WNdvmRyE3nhZ": { + "text": "lento" + }, + "EO4O-s7oafi6QJdxTFNkd": { + "text": "anticongestivo" + }, + "ETZNYbrG5wveDl6c9k2_k": { + "text": "codo" + }, + "EUsNyf5bDdSLqvZKH1Ltx": { + "text": "no entiendo" + }, + "EVmt43vDI3NHFfbbkqokF": { + "text": "pizza" + }, + "Erg6LuA8IOQ5V8RTP3pPi": { + "text": "abeja" + }, + "F4cGnA_QHsVKTjUE6MAu9": { + "text": "mameluco" + }, + "F7kJ8VM31BWB4K4T4USzs": { + "text": "maltrato físico" + }, + "F8roVYxKZi88UUGfOvTwl": { + "text": "maestra" + }, + "F90bXbc0tz9nuzTT7SgqV": { + "text": "cuatro" + }, + "FBPIabyaoCK-Y0BziQdji": { + "text": "dolor de panza" + }, + "FBTheEQmZZfJRiYjd_Np_": { + "text": "interpretar" + }, + "FO77qpzyz28knodNtILCA": { + "text": "tirar la cadena" + }, + "FTngK946O8S8bYc0g7vM2": { + "text": "mamá" + }, + "FaVvbVzZivuxTwxJTPubK": { + "text": "hermanos" + }, + "FfNU04I4mZ54gWcBXqo2c": { + "text": "panceta" + }, + "FgTird367surh-vxXyAK6": { + "text": "ticket" + }, + "FkC5DtSV81OvFMU99qZGg": { + "text": "pelota" + }, + "FnCBoLSE19WsbUypUKvFc": { + "text": "hamburguesa" + }, + "Fogupb264IyCtbZ-Q2D6w": { + "text": "borracho" + }, + "Fvm2C5NBq01tm0QK9d9QM": { + "text": "hijos" + }, + "G09TvOzDSG5m3hTQD9Tej": { + "text": "borrar" + }, + "G2i9LSK4A19237Zp1vXqF": { + "text": "gordito" + }, + "G6KKVMvPDnjdD9TfBd-B9": { + "text": "playo" + }, + "GAxX7EIz1TTLtMX08RRGr": { + "text": "hamburguesería" + }, + "GJlUSznzEHCgoAOrVrkp9": { + "text": "feliz" + }, + "GSEumxiyeVKRRiaY_c8HW": { + "text": "crol" + }, + "GY_flM-6uR6X3L4AwsiwU": { + "text": "para" + }, + "G_CRpzxWO5XdEMh01O1eJ": { + "text": "aunque" + }, + "Gj7THa6XFHDfYL5H19lwj": { + "text": "mañana" + }, + "Gm_qAGnL4OawmlYmTs7K5": { + "text": "no veo" + }, + "GoJuWnn72TCXONXKtYHMm": { + "text": "tren" + }, + "Gvmy--9DiUn_tkQYWeWhA": { + "text": "canelones" + }, + "GxrDtsdGcLepdsQr6V9DT": { + "text": "verde" + }, + "H2zMVtjvqi7aUtCypiVKr": { + "text": "sentar" + }, + "H8Bsrr2NK9Q3WGbEp8PMe": { + "text": "plateado" + }, + "H9SWPnWbR8qcZA-iu5Mz0": { + "text": "dolor de Oido" + }, + "HBZNu6m3FELU9eg3OeLdx": { + "text": "cortina" + }, + "HKfLJS8aCBtKuKJeSBQUW": { + "text": "golpe" + }, + "HMPabuHqgtyiCmTLzg-rM": { + "text": "entrar" + }, + "HQiQh4PPBvO1n-d7JGVj8": { + "text": "nadie" + }, + "HTBNWax6FCSGXuboGsVUW": { + "text": "salado" + }, + "HnuZA0UTlnuIfFAN7saxl": { + "text": "conejo" + }, + "Hvb4JdDHX_vNMck_US2UN": { + "text": "ensayar" + }, + "I5AJgba5GTdEjdpFB-LBf": { + "text": "chocolatada" + }, + "IAdQsjTsbBUAMjlwW34cw": { + "text": "me encantaría" + }, + "IEeIvawUD2GIAr1Wypr9i": { + "text": "personas" + }, + "IF3R7tLVAkd4RbL8R07K9": { + "text": "actor" + }, + "IM8OUKCzHwnjAQWPFgnn6": { + "text": "lejos" + }, + "INxOSvKbBNOXwruIpuNho": { + "text": "ombligo" + }, + "IO8uTb1K7ElENgp2ujZoK": { + "text": "robusto" + }, + "IXRWmFmtqfnHQRcBf1Idl": { + "text": "paloma" + }, + "IZbfYRzu2cxxDWdbmQeqw": { + "text": "cabeza" + }, + "Ig1oypuwndODbmKh_NEXs": { + "text": "malla" + }, + "IsWUeiPnDEnzxePKclBNp": { + "text": "feo" + }, + "J3qQMp0OMr5LC9ebfArxH": { + "text": "ninguno" + }, + "J3rDL96c2zfBQzP45VRCp": { + "text": "limón" + }, + "J4UUPR-WP0qo1y14bUVI-": { + "text": "veterinario" + }, + "J7MmgugOu20UtMcMPj59r": { + "text": "canción" + }, + "J7wLwBLVx4UANh_x5HdXd": { + "text": "según" + }, + "JB9SIxWzxWFjrbmMuksrY": { + "text": "reir" + }, + "JBIehRNmDbK2ALcRN0u9i": { + "text": "gallo" + }, + "JBKQaBezKuSDaMsnbJMTB": { + "text": "bar" + }, + "JBU2hMw9gbIy9-wGF4mjD": { + "text": "pizarrón" + }, + "JDbBWMB5No0pK6HvntLt4": { + "text": "lavarme las manos" + }, + "JEDIYq1BDA23ac9TNhON-": { + "text": "ayuda" + }, + "JFldbhjqxK3fD6D2K4HY4": { + "text": "papá" + }, + "JGm4BL7HAfuxX_PGe6Jzk": { + "text": "presente" + }, + "JQOpcZSCPGMOWZsN8w_yb": { + "text": "¿qué hora es?" + }, + "JSFuEHlP-CFvuqvFKMumC": { + "text": "autos de juguete" + }, + "JVtu9W3AumOwjUedwhUGE": { + "text": "rehabilitación" + }, + "JZRBfIXBkeuobtDXbLt5t": { + "text": "adiós" + }, + "JawnUo-pseWb3FDVMtxrQ": { + "text": "yogur" + }, + "JblWXW8TKDCuYu2yTnFBA": { + "text": "mesa" + }, + "Ji5OVFX-uNDewL8eX8Cin": { + "text": "pensar" + }, + "Jjq8CM8JrYHIMziuQy-WN": { + "text": "agenda" + }, + "JziaulL-lrAPGNVvwBPK9": { + "text": "verano" + }, + "K382TlNZjdMLLpAhCCXLG": { + "text": "almendras" + }, + "K6hd20tWZfwwlYYi7jctt": { + "text": "rica" + }, + "K8cMIDL0ubQvWhhDtr65F": { + "text": "llorar" + }, + "K8e2-KkvZfFOQaXnhR37x": { + "text": "cansado" + }, + "KC18_sTEqKucPQ-iwEKYY": { + "text": "lapiz" + }, + "KK_i8H9qTfDVYZkQGwd2v": { + "text": "apagar" + }, + "KNH4sLRpVKtHXQa-0y84K": { + "text": "nervioso" + }, + "KWYVDZiERE8jtRsL0faHH": { + "text": "nadar" + }, + "KXHW4m6vXxQU-AEOR4pZ4": { + "text": "balón de fútbol" + }, + "Khdk8mWpyxgLqfC-6lyT9": { + "text": "burro" + }, + "KhyTKtiL4ZT4Z1saU1eJh": { + "text": "escuchar música" + }, + "Kn9vE07FK1LrzoD_YxrJD": { + "text": "subte" + }, + "KpLFOrpuhFKaIbBbFwVVu": { + "text": "mariposa" + }, + "KrOPANVpdkBWdEZoUwxKf": { + "text": "grave" + }, + "KvY6Taigm4Va_cVjXAfGR": { + "text": "corto" + }, + "L0hfYADgzghRVsZLZHRxE": { + "text": "bailarín" + }, + "L19r487_d3RqWXiNuh3gE": { + "text": "¿qué color es?" + }, + "L6YLAEsbYcTq-ycQJTvt4": { + "text": "pollo" + }, + "LAuEISciEf1Wc1j4fERz8": { + "text": "año nuevo" + }, + "LDoi3cxodn_AVKSG-Bf_1": { + "text": "ojos" + }, + "LEVKlDlJ0wHo5QEjCNAGa": { + "text": "pegamento" + }, + "LEg8z-Q-ONLAAXd-aH_Hb": { + "text": "bajo" + }, + "LNBTW0qQtHYQEHatkWGtc": { + "text": "mercado" + }, + "LRIKzfm9ZsdNe1u7CUuW_": { + "text": "¿cuántos?" + }, + "LRfh-4RAZTj7cnnDwBmqj": { + "text": "flotador" + }, + "LU7IoUksATEBhd8PaHS1R": { + "text": "sacar" + }, + "LaKT8VTw0_6rvordp5-R8": { + "text": "rosa" + }, + "LiBr37yi-YBgQDx4unjyc": { + "text": "dá" + }, + "LjTGOcyG7DkTs1lJqNr8w": { + "text": "cabellera" + }, + "LksmOMPPOMArbrFsscqOW": { + "text": "música" + }, + "LmGq1AZs2a0x26r7E9GUj": { + "text": "maestro" + }, + "LngEMJa_ihV8mB7afZX-h": { + "text": "ellas" + }, + "LrDai7jXlGAdZ3e8ZQezj": { + "text": "hacer pis" + }, + "M5q2CXmK0_WVaVUB_HJB3": { + "text": "caliente" + }, + "MEqo2TROHyroK318sm84f": { + "text": "pasta" + }, + "MKR-ukiUlJy4uuqO30UU6": { + "text": "maltrato verbal" + }, + "MMzjhHID8HMqyPjii5o-h": { + "text": "cocina" + }, + "MNCcHiImRS8tmvhBhzCKj": { + "text": "ensalada" + }, + "MQHnvvU48NnEptP8a9w8C": { + "text": "no me gusta" + }, + "MWIzTM6zhTWL1V-brLtBx": { + "text": "cómodo" + }, + "MYqfOzKx2qMHop8GaHs0I": { + "text": "verde Claro" + }, + "MiOe5_Djf-pE9V9aDZ_1G": { + "text": "ananá" + }, + "MqQgYn5B0uV-DMORCBOmV": { + "text": "triste" + }, + "Mw6WRebMAKWwXfAvDA7vu": { + "text": "tener calor" + }, + "N2baGNTOapSaFDo1GURiW": { + "text": "no escucho" + }, + "N7n4zQIkJZOhaYESk2GgH": { + "text": "caer" + }, + "NFdUTit6Ff-4S7Nzf92U5": { + "text": "estreñimiento" + }, + "NFgGqhEtl0HqipCGGEvwU": { + "text": "peinarme" + }, + "NKQwWPAsVHwFBWuksqfns": { + "text": "ducha" + }, + "NLi5ODIzyMAwr2HpDXACp": { + "text": "nariz" + }, + "NQayjogCYiimP_0OxIfFj": { + "text": "zapatos" + }, + "NVe4u7BTAVfLk3xkDqLnZ": { + "text": "horno" + }, + "NVjfEut567uXpTaQUNI2i": { + "text": "campera" + }, + "N_893wsadpGg3Ip5sEThe": { + "text": "azul" + }, + "NaJxTPq9Ld8I4fwAltyEC": { + "text": "maiz" + }, + "NjulpZ9x63ZqxtLMoRjkx": { + "text": "prender la luz" + }, + "Njz8DrErsexBu8mAI6mnr": { + "text": "pescado" + }, + "NmNouLLx13jzE27jliI_v": { + "text": "diente" + }, + "NuhUikdCxP0NgsbO0wvAU": { + "text": "cola" + }, + "O-CLnVuXAUapOn6TbdhKx": { + "text": "querer" + }, + "O450x4W3OOacvJIy4QicJ": { + "text": "verduras" + }, + "OHyrmD5US1rHEAEwLQaII": { + "text": "animales" + }, + "OKXIGnLh-i1ydTNj450Q8": { + "text": "reina" + }, + "OUcfOOReAfQroBKlBdDb-": { + "text": "solución salina" + }, + "OWLDc7Hn3neBAf_V_N27n": { + "text": "abrochar" + }, + "O_ZfCPZSxGMPT6orCt-O6": { + "text": "chancho" + }, + "OblxxVFC-LKPq-8oC9FpE": { + "text": "sentimientos" + }, + "OdCdTUAlbN6kvsPjby_Bi": { + "text": "deportes" + }, + "OeA63q6LpqGvXW-cJXEym": { + "text": "jamón" + }, + "OeytAsSiEAWC10tXhxbTa": { + "text": "personajes" + }, + "OhrHu-xLo8hcn5plWfoX4": { + "text": "caro" + }, + "Om1Bvqu8nmGuNGwV8hndM": { + "text": "bajo" + }, + "OvyFC1GHkvJZ0dAAF1QkY": { + "text": "él" + }, + "OwHzJdOQTFOA8daCVRwm6": { + "text": "pincel" + }, + "P5zdq4x58yp5TA_soKQEJ": { + "text": "bicicleta" + }, + "PAlC0XSZNru3-LXtfvGjo": { + "text": "hacer el amor" + }, + "PBqpK7LL1HQPwowPitrss": { + "text": "leer" + }, + "PFAi3SdvH9vL7_Bg3MhCA": { + "text": "semáforo" + }, + "PIBHv5VueBi-sf5qFCN_Y": { + "text": "ante" + }, + "PIPQnVS2UiS7kGbucJP8l": { + "text": "curar" + }, + "PLXxIPYyztaztLf4sPCst": { + "text": "garganta" + }, + "PbtM3htZocZb8YifuPoY5": { + "text": "cangrejo" + }, + "PfNLmlHKFT9d1w6IgeXbU": { + "text": "control remoto" + }, + "Pl-M4bc6k2rdhu6FHEbkA": { + "text": "patio" + }, + "PogTYrGfa2WNfBRuA8O4e": { + "text": "malo" + }, + "PszHdOxMsS_tAzSrN52Wa": { + "text": "plastilina" + }, + "Pw3GgPwp7fpDVC6wJjgPn": { + "text": "subir" + }, + "Q6LQqdLcvNOiCFjC0DVo2": { + "text": "tambor" + }, + "Q6nNH4AIoSeDHODC_Ip8O": { + "text": "vecino" + }, + "Q9Ra0aJaQnOJQ1Kqdc43-": { + "text": "bebé" + }, + "QCQRmsQY6AggjreY9Z0MF": { + "text": "rechazar" + }, + "QGf1Tb1roL7HAXUSrRqRJ": { + "text": "naranja" + }, + "QJhkOh48xapiTObEDQLB9": { + "text": "piano" + }, + "QTkFHWp9KEDgfCjoQjBY2": { + "text": "plurales" + }, + "QUTQLuD2Gv7fHh0V_O5tg": { + "text": "avergonzado" + }, + "QVqSPPgA89whFTJ0HTphK": { + "text": "abrir" + }, + "QZNQOaf0SdHDbx1otCmrH": { + "text": "niño" + }, + "QcGJ9u_JqmrW0X47PXWH4": { + "text": "despeinada" + }, + "QclUM2p3iexSjFZI8OU4-": { + "text": "fiebre" + }, + "QeqA20MCXB-zNfuKIssMY": { + "text": "lata de atún" + }, + "QllvOUe8utZrcBRGw_0vc": { + "text": "curita" + }, + "QnlQ1HOEB9yNjuW3Dd6fc": { + "text": "celebración" + }, + "Qo3Qn_nMe3E6EqNw0UdNZ": { + "text": "soleado" + }, + "QohNih4wgqjnpWt3kSwtd": { + "text": "entrenador" + }, + "QvaMxPy-3iixHAJFyIrN-": { + "text": "sandwich" + }, + "R06chAQYswLtQK46OInW7": { + "text": "leche con galletas" + }, + "R9ECa_HQRtpFrb59ebMTQ": { + "text": "escuela" + }, + "RBCjBvNXQSZOOpg-5lBlK": { + "text": "bueno" + }, + "RZfMOtjw0DoGHWaRfCEc4": { + "text": "pantalón" + }, + "Ra2rxEEohwxRqDsW2AT3C": { + "text": "videojuegos" + }, + "RbZetbSC5064rZccOFD1D": { + "text": "televisión" + }, + "RkpoG4KB8m_TJFJf2v3EG": { + "text": "cambiar de canal" + }, + "RwlZ1jr2Ix3evzrW71lN0": { + "text": "manzana" + }, + "S3um53pcko7_BPHy7R6FL": { + "text": "nosotros" + }, + "SE-71I_ahm3oKROReyJHE": { + "text": "hacer caca" + }, + "SOyGnJXLPeVRoZy3vBgpK": { + "text": "examen" + }, + "SXz8iA1Qn_BlgLTAG6Epl": { + "text": "cena" + }, + "SiOmZdwX8Hf2nE2v6HfCp": { + "text": "zapato" + }, + "Sp2Ias_Y1HplkHWjIb7Mp": { + "text": "sin" + }, + "TAbuXSnSHU6C3CQ4kbKVh": { + "text": "triángulo" + }, + "TBV2BhoZVgl1jMV_jWZYi": { + "text": "derecha" + }, + "TIgoS-YONIwzbrImXetaD": { + "text": "ciruela" + }, + "TIsM6aTTZ9W8j6UhW9Qqj": { + "text": "coro" + }, + "TLxsYdrBdHgFZkNJtVTmK": { + "text": "tortuga" + }, + "TP-gGRcpcFyx1SrNRsdRV": { + "text": "perdón" + }, + "TR5CXN8-pfbWkshdxSBSV": { + "text": "oveja" + }, + "TS9z8ZmMEwn0MGSfr9amH": { + "text": "palta" + }, + "TZF-7m8VKZ7IL6pyv0Daf": { + "text": "cepillarme los dientes" + }, + "T_Q5c4XAfkhkclmnCGHo5": { + "text": "hasta" + }, + "Td5pgVQDTFOftUgOJ-bD-": { + "text": "picante" + }, + "Te_jJfeU8Xwa9St2RihBq": { + "text": "sangre" + }, + "ThqkHs4az5tgLqLcfFPaZ": { + "text": "largo" + }, + "TpPNZLsh5jrN9RdPFwmA7": { + "text": "¡genial!" + }, + "Tpj-Fs8LQ566TM0bYlZ6H": { + "text": "viernes" + }, + "TuAjBKPp3-PSdQuooSWZi": { + "text": "rana" + }, + "TyqVzfOniQNa9WKQRXqr-": { + "text": "hermana" + }, + "U1KQsrvTa2E00-ugc-Iy6": { + "text": "ausente" + }, + "U6PoeH-cMdO3ttnLkN7_3": { + "text": "cabalgar" + }, + "U7GiGcYacowWi4MWrCYyj": { + "text": "antiinflamatorio" + }, + "UQ-5wOfR0tDzljoDjj2xU": { + "text": "otoño" + }, + "UQ5B5K-tpk1XmQC1B9TjQ": { + "text": "no" + }, + "US8_vYTnDfxBw2Ung_J38": { + "text": "partes íntimas" + }, + "UVzdJiqY36fqgBYyz880c": { + "text": "jamón crudo" + }, + "UXJDiwb3j_zyfGa26ByJL": { + "text": "pecho" + }, + "Ubaq6h7wasdP_YRombm2c": { + "text": "azúcar" + }, + "Ugs9V9c2c5iHrVC6p17zr": { + "text": "analgésico" + }, + "Uk1Emn5IovsTfFzpQX5Jw": { + "text": "sosten" + }, + "UkLF5sKtVKW0D8RzVCoue": { + "text": "bombero" + }, + "UnQJwWfWCe40DJYR1Er0o": { + "text": "dolor" + }, + "UssSOEEKutvzB_B4fAQE-": { + "text": "escuchar de nuevo" + }, + "Ust3oadA0PUGViYo28Mf3": { + "text": "caminar" + }, + "UvRS0KmtZn3dq7e8L5RcE": { + "text": "enojado" + }, + "UwvZVcX_CAQFrI6U4LsNT": { + "text": "huevo" + }, + "VJ9AU_y7CqsONR6TvhdLh": { + "text": "¿dónde es?" + }, + "VKrLGgYjc-nLPGsyESDgb": { + "text": "canario" + }, + "VL4pd0vnJ-CNfMg9bCNed": { + "text": "aspirina" + }, + "VUJ-zrdsyL9MOuFbdMCAx": { + "text": "mareo" + }, + "Vioyf8EXJfY5t34NnN0WO": { + "text": "tablet" + }, + "Vjlet5P7XuqTrc22nt_Zz": { + "text": "agua" + }, + "Vmnu5eormo-_TOCgF4YzG": { + "text": "jarabe para la tos" + }, + "VoZumy5GtnRdqSOmXAw7j": { + "text": "preparado" + }, + "VrC7AnovfA7VzmYESVc8L": { + "text": "conversar" + }, + "VwZ4EKSggYWxlnAbp-pNB": { + "text": "enfermo" + }, + "Vzov0z9acB-I1_W_CcFcY": { + "text": "rojo" + }, + "WDUIQV43zghFQq_rSk1Z4": { + "text": "churrasco" + }, + "WL3ZN-W_zgnuTJpuqz0YQ": { + "text": "príncipe" + }, + "WNhpmD_XlTaNEBo7GsFXu": { + "text": "diarrea" + }, + "WQ0CNIQ_gjaCxg4tEIsOo": { + "text": "clavado" + }, + "WRzleD-mI84LaimFH8h6P": { + "text": "escuchar" + }, + "WUt3I-NkdbqlSVcwuLfFx": { + "text": "patines" + }, + "WWK2v56LM-zWqujabk9bM": { + "text": "plástica" + }, + "W_f7h3qOLl2uEd_OYpMfQ": { + "text": "policía" + }, + "WasZ5bKZZy5Jt4Y-JipxS": { + "text": "bikini" + }, + "Wgh5iCzUmx4Je-B85-pra": { + "text": "heladera" + }, + "WjXQhSFPpz42ZUyHvurYG": { + "text": "grillo" + }, + "WtYSntcy2CijEORmROeaj": { + "text": "un cuarto" + }, + "Wu47Qs6Zupu1Ox2gUhkxn": { + "text": "cuarto" + }, + "Wva5W8GA0dHzyt2_0FPdm": { + "text": "hermano" + }, + "X0-Tf-KR24qEkpGDzG2Z-": { + "text": "ayer" + }, + "X3u4pXTWKcGc43lOkgSBt": { + "text": "cumplimiento" + }, + "XA952Z60D0-cesNCVA-OX": { + "text": "chau" + }, + "XC5fIljJ819OYpllYTjpE": { + "text": "jirafa" + }, + "XN0nzhQyHVOhuYuNqrp8g": { + "text": "durazno" + }, + "XOoGN6huCjVHxH8hRFAw1": { + "text": "blanca" + }, + "XY6ZCNzeJIEzLtWJcufJm": { + "text": "camiseta manga larga" + }, + "XYY8SV1IAMHjdGjMZxbdy": { + "text": "cancha" + }, + "XeVaDdUWSEkhfJvTVvUHR": { + "text": "salir" + }, + "XnocVMEeUGCSnlnusP44O": { + "text": "agarrar" + }, + "XuAtFop5_JNSYiZkUBzaU": { + "text": "cocinar" + }, + "Y5HQq_4crSF2lpwH-KUrt": { + "text": "dos" + }, + "YCu-B26PqjE30AhikHdkI": { + "text": "dibujos animados" + }, + "YIP0Xc4aJsfv0s8BpiQnn": { + "text": "cinco" + }, + "YLKXFZ9ze9K9NvJiAx8w0": { + "text": "¿qué?" + }, + "YbrNtdUmyMNdAF5CfvY1A": { + "text": "toalla" + }, + "YbvMRsCtMbww8OQgF45QF": { + "text": "resfrío" + }, + "YeT-jstVSA7-mD9t99Isg": { + "text": "rompecabeza" + }, + "YusWY8GwdO43bSp1o3BWC": { + "text": "molesto" + }, + "Yvxm8RGoFYKUsIXOl33yR": { + "text": "apagar la luz" + }, + "Z5-sBklfLIWE00CJ_T_ZK": { + "text": "cuchara" + }, + "Z8xp3kxXuhMVoNm7ddQSX": { + "text": "lanzar" + }, + "ZA2C4bJaL90lBxsTemYWZ": { + "text": "piscina" + }, + "ZAnmv4CLb7hldYUlp2wJU": { + "text": "ninguno" + }, + "ZBIFtTq-BH1jv5jLbzrhj": { + "text": "repetir" + }, + "ZQEXAf10BkoTvCJx3Ox39": { + "text": "sorpresa" + }, + "ZR-NXJk3SD351W-95cf_T": { + "text": "pintar" + }, + "ZRYQmYRGKzheBqk11eGRZ": { + "text": "ballena" + }, + "Zm4OIanIKTigDGIsInO7o": { + "text": "un supermercado" + }, + "ZnMba2r4XIg9lPi_H2d_Z": { + "text": "sí" + }, + "_1lOt0C0MQhvU8QWC6_oZ": { + "text": "buenas noches" + }, + "_2SjbH-xHZq173EU4J65c": { + "text": "parque" + }, + "_3ihCSMQCokXNo8pXii-h": { + "text": "llamar a alguien" + }, + "_8RIOebHpkr9nCy0_9qhP": { + "text": "llamar" + }, + "_CsJMxqGcNSaujXwRZcpu": { + "text": "ansioso" + }, + "_FNTsoEjTMV3Uas-gggi2": { + "text": "estrés" + }, + "_HUf6SR0mTP7v72Y9_4gw": { + "text": "coche de bomberos" + }, + "_Lc2-NNL69ZX-aVnUNzgx": { + "text": "frutilla" + }, + "_S9Eck14cdOTr0QH4i7sQ": { + "text": "cuarto de baño" + }, + "_WIT6qs1kaiJqB1Ild5Xs": { + "text": "paseo" + }, + "_eug92AvR1UXpYlfm6o_Q": { + "text": "dorado" + }, + "_hqTU9A7I3RFDVrcIEK-L": { + "text": "%null%" + }, + "_lU200bb9Sjv0b_iJKgU2": { + "text": "una bicicletería" + }, + "_tDZtalMxKSNpWydJ1aeW": { + "text": "cero" + }, + "aC_XP9Ch5PqWoCmcJwI77": { + "text": "algodón" + }, + "aMs2YNnWkw4XN0gAm-jI3": { + "text": "cajón" + }, + "aP9QisUdxhgOKIQ2kHNb3": { + "text": "acelga" + }, + "aSzpwNza22HZp46Sh6wfx": { + "text": "súcio" + }, + "aTwzShtP_zR9x6bSGSzEB": { + "text": "muslo de pollo" + }, + "aXLBXkENJqTYkyZOP8TNS": { + "text": "tú" + }, + "aa3xDW6F9YUKyX0fe5uX8": { + "text": "espaldas" + }, + "ajesFjbC7hwCNLKdif-ix": { + "text": "contra" + }, + "ak5fBauJzapC4JIf0lT8N": { + "text": "cerro" + }, + "alsoa_V3wz3vPpG1TKRZc": { + "text": "transportes" + }, + "amk4WRd1sNEIp24pnFw8j": { + "text": "rodilla" + }, + "armmpopt2RLsVDlqLrQ94": { + "text": "restaurante" + }, + "atVEXuftxSiDDj8rzUlFg": { + "text": "crayones" + }, + "atWxG3KTHB5moW1dylLJc": { + "text": "juguete" + }, + "avzcTznCsQCISYJsLC-w_": { + "text": "notas musicales" + }, + "b1XpSC0ndnm0ZewNXC3pp": { + "text": "carnicero" + }, + "b5OdBMMzkf1FlQbUR5-m7": { + "text": "servilletas" + }, + "b9Y5MrR-jn8fh77gAkLZy": { + "text": "pintar" + }, + "bAoK85XLNb7p0ebevYZ6O": { + "text": "mirarme al espejo" + }, + "bDnuS19hfd9GhJ-6rjNPD": { + "text": "estar" + }, + "bFodvUraUhJeq4waMdlxv": { + "text": "domingo" + }, + "bNJfccUvG2DQfR1iZP3eR": { + "text": "serpiente" + }, + "bVN3R44VuZDw3IdQMolca": { + "text": "cambiar" + }, + "beNprvNb0UztxR4JLxDFm": { + "text": "cumpleaños" + }, + "bge6qR6NzsD5Vk4ifPsSO": { + "text": "ketchup" + }, + "bpSuQQRlIcSse40OAxNSG": { + "text": "lunes" + }, + "bqjKW_qBtRzIThWxdZx2s": { + "text": "gafas de sol" + }, + "buyy_2ydocKoi9TnBhZ1N": { + "text": "amiga" + }, + "bw3rqHXD1TJ53xbNggEqH": { + "text": "desayuno" + }, + "c7kK5ROVbO3DHrwSFEawq": { + "text": "dulce" + }, + "cI0JxwhkWU-YA7E7rmJtp": { + "text": "cuello" + }, + "cJMQi3SVmqvWJ00VxI6gy": { + "text": "¿cómo estás?" + }, + "cJw2i319mzBUpEfBRDxc9": { + "text": "pez" + }, + "cJzHrV_PsV-PwwyFN9jka": { + "text": "%null%" + }, + "cS3g4KXf39akVFHCG5AwL": { + "text": "camión de juguete" + }, + "cTiw7_Yjxu_Kg90q7PdYl": { + "text": "gripe" + }, + "cb0rJJEYOeEoRU5fDdQQq": { + "text": "el" + }, + "ccGASDOGtty6GfQMEEBEU": { + "text": "tres" + }, + "cj6OuVw4Nob8jxP-E4rZc": { + "text": "cambiarme la ropa" + }, + "cnyLFMkJu2i3cqOY0e9kl": { + "text": "pasas" + }, + "curstMeuThu2KUph-8rkB": { + "text": "jugar con" + }, + "cxMNBGV3LytDXgwDMCiga": { + "text": "violeta" + }, + "d4zNoj2BAFG9B7J3KAlLE": { + "text": "botones" + }, + "d6s8fLFBiQ3KEJlNdJfUW": { + "text": "un poco loco" + }, + "dHM0qnbmtJAkZY0WBsqaY": { + "text": "lila" + }, + "dLHDzm0rfgL-vXTx14HSm": { + "text": "buscar" + }, + "dNvN5P787hAPE7ZYNgwkw": { + "text": "pasear" + }, + "dR72liRxC3qmoSa6Dz2a2": { + "text": "jarabe" + }, + "dS-KyYREUQIk7sDlmsvoa": { + "text": "cerca" + }, + "d_I8jNfbkQD0CHgZn7hyB": { + "text": "camisa" + }, + "dgm3NCKuz7L39PX8LYxj7": { + "text": "juguetes" + }, + "djgKI9embnk95PAtFcn45": { + "text": "cambiarme el pañal" + }, + "dn41o5K_1fo-qHO-YLoQn": { + "text": "sábado" + }, + "dnXsSOeVG7mq37uciIi2J": { + "text": "recreo" + }, + "e5sCl246xFMESEfFy2PhX": { + "text": "coche" + }, + "e5un1yrIuZHQi048e5kD6": { + "text": "alfajores" + }, + "e8zl_ecIloo4Vk-OZPJWe": { + "text": "jugar con la tablet" + }, + "eDX2HSkGaY2TeVwPjR07S": { + "text": "fácil" + }, + "eGJ8MC1xPE6ueF82jCmVg": { + "text": "cepillar" + }, + "eKJCZc-kD0-m6cVLorFzO": { + "text": "pera" + }, + "eWSI1NInbQowtO99phhGA": { + "text": "boca" + }, + "eZEqRZjRK8JJMsfHo4Y7w": { + "text": "del" + }, + "ebo03xnkyiHD2pKUKULmr": { + "text": "dibujos animados" + }, + "ecUOs24Pp5ZTRt_ZvED5W": { + "text": "acompañar" + }, + "eduqLSyC3m4uB1Oee6dt6": { + "text": "mitad" + }, + "eji-M2j5eHkG71DCksleY": { + "text": "huevo duro" + }, + "emm_RirDsO30Enax5Q4gd": { + "text": "con" + }, + "eo3Q5AjHJz5kp1EbdALwh": { + "text": "ustedes" + }, + "eoYtISVZl3mdwoE_HW-Mv": { + "text": "guitarra" + }, + "et1KiL5-zob_EcGlj7tLN": { + "text": "despues" + }, + "f2dl12fMZbRdQ7STpcTdk": { + "text": "fútbol" + }, + "fF3ijeQzetfSn6EGcs1yY": { + "text": "cerezas" + }, + "fL_4POdbPVL9-lvQVWSqY": { + "text": "avión de juguete" + }, + "fNAlqbgrpirQZO_LhrkXY": { + "text": "primavera" + }, + "fNv4Nb6Vafxk0JxXr-iDo": { + "text": "investigar" + }, + "fUUj_4pKPflmJlxZfk0cX": { + "text": "discoteca" + }, + "ff7ES190q1dmFYZ7lo6x0": { + "text": "pan blanco" + }, + "fjCOcN-PKP6F07IZcI71X": { + "text": "plaza" + }, + "fkNwVm56PSe-qh-QoM0vm": { + "text": "allá" + }, + "fk_z_HrvcUh8XIq8D6gQP": { + "text": "nueces" + }, + "g1Cj6HW8kg8yPE1XX9pxa": { + "text": "desde" + }, + "g1TLUpuQX2Zs1ob9gqYui": { + "text": "gorro" + }, + "g2MhHawoIC9oFNEv5_w63": { + "text": "vida" + }, + "g2sQSxCcoZuKJ3TabK6oT": { + "text": "vino" + }, + "g75y4E53ViakV-s5UfnIF": { + "text": "equipaje" + }, + "gFEnqFhYoXF7QN-n0ONad": { + "text": "montaña" + }, + "gYrIz3R13-BC_pYcvQ9BL": { + "text": "invierno" + }, + "gaem1LHTtfQdnnqYi-sOm": { + "text": "billetera" + }, + "gff2FqDlgXknRld7YMLWl": { + "text": "entero" + }, + "gsU8pE9ozhR73xS2icwJ0": { + "text": "libro" + }, + "gvPwrzDSSEPwcxY878T_c": { + "text": "gato" + }, + "gzCjycNS8Cf0vNlo1klji": { + "text": "molesto" + }, + "gzb-RNDLMNkgk9wnPILJi": { + "text": "abuela" + }, + "hAZhogJSH3bL1iL237N8J": { + "text": "pochoclos" + }, + "hDvpMlPw-chcuxEisBJTl": { + "text": "castañas" + }, + "hKJhXxultsxm0TJl1P8-L": { + "text": "chau" + }, + "hOyjT1JgOYB-mGLFMaNJR": { + "text": "dolor de pecho" + }, + "hT3Lrjn5-q7YIM1loG4MN": { + "text": "parlante" + }, + "hUYfE_vmNBT_7E60YZsSu": { + "text": "pintura" + }, + "hWWOw1gWjWwN7wQJkHrTu": { + "text": "tour" + }, + "hXgGhazQ_nA5uqpRD6Qwq": { + "text": "ganar" + }, + "hmhAUgqvGp7nc1w25sRSx": { + "text": "esperar" + }, + "hwzwfMyJsvB42F_QWQWyi": { + "text": "jugo de uva" + }, + "hyUaYltGVJU-wRrAjhhPa": { + "text": "cantante" + }, + "i0wB--S4sdL8Q4H9b93UY": { + "text": "ácido" + }, + "i2mlV3zGS6nrH2l6N2BlZ": { + "text": "trompeta" + }, + "iAqItRUQL_YpbMn2pgjsA": { + "text": "pizzería" + }, + "ibtmTEP3QGDY8TyVLteuX": { + "text": "blando" + }, + "ifd0M0pAlFm7aPt1A0ze_": { + "text": "amar" + }, + "iiA1u1JKRmhe2jWVE_W79": { + "text": "amigos" + }, + "iimGxVoFWlq_THThR3vmF": { + "text": "noticias" + }, + "ijn-QwQuTxRFFVe-7WlSX": { + "text": "picazón" + }, + "iowxE4MxcV6PR2Uhtvxqs": { + "text": "hospital" + }, + "irbOv2dHA7G969dnJMfJn": { + "text": "cuaderno" + }, + "islCzqFq1SYrZAh63dLhQ": { + "text": "huevo frito" + }, + "j5xZZev5nTNa-p088Oqnp": { + "text": "besar" + }, + "jBqD3qhhcrioLlCU-xq5b": { + "text": "instrumentos musicales" + }, + "jOALQbfxdXmJVyY6P5gZG": { + "text": "damasco" + }, + "jTEb3A5ZEKEy2ojuq2vO_": { + "text": "hueso" + }, + "jeO9YZ22LfSObUNhQDRAz": { + "text": "ventana" + }, + "jfly9fZ3x1da4SGCCNcV2": { + "text": "bufanda" + }, + "jfvreGZv-e8rD4-01wZ5H": { + "text": "venda" + }, + "jhJ2TOfdaRAcVeHGOjwua": { + "text": "leche" + }, + "jmzg4EiC7JEHwe9gNP3C3": { + "text": "arroz" + }, + "jpKPg3hn6_GO1HSkeLNGz": { + "text": "niña" + }, + "jprAsdXWGQKPlUWwgBBot": { + "text": "película" + }, + "jtKc2q2n5an342ZkiMB9R": { + "text": "higiene personal" + }, + "k-iDOTk5uO7ZK5OB3v8It": { + "text": "viejo" + }, + "k41gkf6A_bDtQAJDOrWpP": { + "text": "pasta de dientes" + }, + "k7dZhQtwDPFlOk1iPjEOz": { + "text": "subir volumen" + }, + "k8tJx6PikRcnVuZEqrXRM": { + "text": "viajar" + }, + "k9ZpWM4oRb1q20c0qWCsg": { + "text": "abrigo" + }, + "kDzHKO8eIwNsyKWDw7M0c": { + "text": "uva" + }, + "kIn8SeGURyvu49EsRqDs7": { + "text": "pijama" + }, + "kN85Lb_C4dLnww7sz1afK": { + "text": "café" + }, + "kaiWPbXxjHXlqcpBaBp4l": { + "text": "viajar" + }, + "khUUL_1JQGngApqBRDh_q": { + "text": "arreglado" + }, + "kpghvJtujlt4vPI2N6vsg": { + "text": "o" + }, + "kxuGlfYjS6puO2xD1QvxO": { + "text": "vamos" + }, + "lKA4b7I3iFkqNzPcAXyBc": { + "text": "cocinero" + }, + "lKMW_xTZzCrCHRcGp-Z-n": { + "text": "galleta" + }, + "lR84gCk8OM-oYoLAV7tar": { + "text": "timbre" + }, + "lXH68vGIuZdfA8xVrS8iw": { + "text": "mucho" + }, + "l_ncJLRdVGBzzQc9yqBqs": { + "text": "banana" + }, + "lrUuPKco_O8FXDuclzpKE": { + "text": "necesitar" + }, + "m0434KkjeTv8SGN7WxR2C": { + "text": "negro" + }, + "m0Fkio76HZHS2HguPOTn5": { + "text": "seis" + }, + "m17b6MazSk6M4gb51_cCy": { + "text": "pulmones" + }, + "m39xTdgaenoi4mWGEa-Ew": { + "text": "plato" + }, + "m3qTT8tiGZQheKIWREzMT": { + "text": "ir a" + }, + "mC9Nb7zVdEUpjEBODw_gL": { + "text": "vos" + }, + "mFfylZ8yoLvtkVSDTlVEN": { + "text": "pomada" + }, + "mJqzbxYeIDQciPkeHA1Ao": { + "text": "cuchillo" + }, + "mK4AXXhoIVirBz5dr_xLA": { + "text": "pavo" + }, + "mRK--C5Q1aGe8MMPJJLYi": { + "text": "preocupado" + }, + "mTklFAI-FVVLsMKoASZ7T": { + "text": "desconocido" + }, + "mWXxPPvhSHf9hyb-VyuZH": { + "text": "e" + }, + "mZFwH8xY_OeVDWCdvPZBy": { + "text": "pie" + }, + "miPmA2tOQiLxOW7D_V_x6": { + "text": "cubos" + }, + "ms97ZsgQOvD-Z8qpSW4oN": { + "text": "¿quiénes?" + }, + "mx6dmRLXA_lkN1QlP71vq": { + "text": "todas" + }, + "n5bZClAB6jXAZnwxIwH-1": { + "text": "tostada" + }, + "nK7DRpxalLBHL9OnRjSim": { + "text": "frambuesa" + }, + "nMQUtS-kFHViOKyop1FdS": { + "text": "vincha" + }, + "nQSk6_KCEVdO7oC_uxLXN": { + "text": "oreja" + }, + "nQdbkRVcwpQB_hFNPbe6M": { + "text": "caballo" + }, + "nUg2M7p5sUPlGdbBev2-G": { + "text": "tobillos" + }, + "nm6e_s01gWHzdVj25BHyq": { + "text": "¡qué lindo!" + }, + "nnTJQMJWfd2nuTSlFNEOy": { + "text": "mío" + }, + "ntzBlFkDMTKEUHoGNc65u": { + "text": "baño" + }, + "o0oxaoUFpOLiGsoQBlalI": { + "text": "torta" + }, + "oAxNCJufVUqZMyWRGdZl9": { + "text": "tuyo" + }, + "oEHzYcfxDGGcsL-deud1j": { + "text": "snack" + }, + "oEyUWrQj1iYUnlEUdQQ5Z": { + "text": "flauta" + }, + "oO21zLMEtHEakvnuTohLu": { + "text": "¡qué divertido!" + }, + "oOkD8Wmvb4t9I2EWqT1Nr": { + "text": "amargo" + }, + "oSBFO8Ka0PN4bgX0QuWxL": { + "text": "viajar en auto" + }, + "oYwoiRDWlIjSTbYdC2vG6": { + "text": "falda" + }, + "oa-MShota2L8n2pU8hIsm": { + "text": "jugar" + }, + "okr5oAG2U8Er1XwQ8XbWD": { + "text": "grande" + }, + "oqQWeoWBr5N0LrPGY62Og": { + "text": "senos" + }, + "otTWzTaTAmweNCozT8tn9": { + "text": "alergia" + }, + "p1qK47wwLwF8S0Fy8-2Mt": { + "text": "mano" + }, + "pHBnmCFpM7oZf0O78CBIz": { + "text": "golosina" + }, + "pM-bC77hbj-w44A0HFRDZ": { + "text": "sonarme la nariz" + }, + "p_XyUXRmeUk_bdjRTMtkz": { + "text": "revistas" + }, + "p_qpVEd677b2Bk56yhvj6": { + "text": "jardín" + }, + "paPpjw1XVC9-6xcueJsrY": { + "text": "todos" + }, + "pgPlWKk-oww2fua5zYuue": { + "text": "mono" + }, + "phZ4F4uzi1TrhjeDMuMsn": { + "text": "almohada" + }, + "pkuppr1jMH7SMpa2hrIWQ": { + "text": "jugo de durazno" + }, + "pliNY9oMQh1iSidkEhhDO": { + "text": "abrazar" + }, + "pptyFMhLrbC6lN6zmc7D0": { + "text": "comedor" + }, + "ptQZXjMQyXWycUD1kAkQo": { + "text": "cuento" + }, + "pv8eYkxczIevQqEGwDz6V": { + "text": "mochila" + }, + "pvXSy-5M4i8kysUppvdME": { + "text": "que" + }, + "pwltOTDn2OyABTlD4-27W": { + "text": "verduras" + }, + "px0jKQDj7r9pOYs4ZrvcT": { + "text": "tomate" + }, + "q22wRFF21EigV8YzQ_MfV": { + "text": "¿me ayudas?" + }, + "q6F-qJ7mTxvwa43F6vwun": { + "text": "escondidas" + }, + "q7Pz4UqqZUlXeFfXrwXDR": { + "text": "enjuagar" + }, + "qA4v2JWQU0zzBBZgvW7Vt": { + "text": "temblores" + }, + "qOsbXyvBTMDAwvvnI0iFn": { + "text": "pequeño" + }, + "qU5IvFLD8d16iIHSs_9TM": { + "text": "cebolla" + }, + "qWhpDTMd8eAEoq7yTKc57": { + "text": "calzón" + }, + "qYA2U_BFOZtFLClxuCIBJ": { + "text": "dolor de muelas" + }, + "qeJdrxKIIcUctIjo8wWhc": { + "text": "aguda" + }, + "qn-7ERrcZxJTqfW6hwNs8": { + "text": "correr" + }, + "qsA1zm1DOlItK7DCWzAw8": { + "text": "aburrido" + }, + "qscoBbrWu7tQbpNj9XUPt": { + "text": "papel higiénica" + }, + "quE_RA9abVvtG-Fo4Jx8f": { + "text": "diez" + }, + "qy3c7gvRU7shWuJYr1kBk": { + "text": "bebida" + }, + "r7eJgCF_b_ktkztv4-oda": { + "text": "medias" + }, + "r808IO3I6j3os_uix6O63": { + "text": "juegos de salón" + }, + "r9qUBQwgY8eycnU2OVey0": { + "text": "comer un sándwich" + }, + "rBwDn3PcJGqytqnOZTJMV": { + "text": "taxi" + }, + "rMFGfzFobfGsH3_qrLHXU": { + "text": "pescado" + }, + "rU9cpWF0I4wnJjzTXpGtO": { + "text": "hoy mismo" + }, + "rgyV6CvFe98OGnWut6QCZ": { + "text": "turista" + }, + "rlGO5jGKPL1vW-VF4nRqZ": { + "text": "entrada" + }, + "rnjJyPTabH_Xpmy4Z4O3U": { + "text": "celebrar" + }, + "rtHwq5WN9KElX3V3SKBmS": { + "text": "papas fritas" + }, + "rwyX2YemNEx_Mh64IArDQ": { + "text": "oscuro" + }, + "rxdfuk6egO7VmZEB3JrUN": { + "text": "la" + }, + "ry_jOegpMf4nB3spGf4d2": { + "text": "me gusta" + }, + "s0BXoyn7AqUAlZ9BOHY6S": { + "text": "tríste" + }, + "sAsTkky29uEVC9vo3Ofbo": { + "text": "brazo" + }, + "sDKIldL3tit328Joneo_7": { + "text": "vaso" + }, + "sFNUgvnglgrm6cbYiM0di": { + "text": "¿cuándo?" + }, + "sP6uvKmY5kA_yuYR8H21c": { + "text": "halloween" + }, + "sPtazVgymXESdS-BcHqU_": { + "text": "pollería" + }, + "sSTGRl6DpYGZXp8vtTNbm": { + "text": "comprar" + }, + "sbv5HLPUR6gHo-EJR2S7S": { + "text": "camello" + }, + "sc0hr3jQ80yXRFDlAn56V": { + "text": "cansancio" + }, + "sixdpB8hTOhlUr4loz3RB": { + "text": "muñeca" + }, + "sjGytpiPjwqJfPaRUJ-Iw": { + "text": "miércoles" + }, + "sysOciGqtL7y4ULuyYVc-": { + "text": "canal de cocina" + }, + "t-w8e69GwxLyfxlWwHk9f": { + "text": "mermelada" + }, + "t34TbvjJ3zG2jcgJaCeHa": { + "text": "tocar" + }, + "tGyUfSljuc7A5Do5B9GuN": { + "text": "sweater" + }, + "tQwMPLvqAMAstcqvnOERE": { + "text": "gris" + }, + "tWxC4hR6di5zQC-Hujlev": { + "text": "bajar volumen" + }, + "tYwEpd2EOtH8wEUr-jwHk": { + "text": "caro" + }, + "tw1doIY-jFPofZjlPFj4z": { + "text": "¿cómo te llamas?" + }, + "txj22hip0CE9qp_z-daIK": { + "text": "nebulizador" + }, + "u1nIt_oFH426g1IVhlYk5": { + "text": "sediento" + }, + "u2e4Zh8qwJF7zKkohQ8df": { + "text": "goma de borrar" + }, + "u3BufiTZTK6AylGh80ZFd": { + "text": "ella" + }, + "u8HfFvMPkogdWk-URj9hv": { + "text": "escribir" + }, + "uDg7Yy86PlwsAd-U96vJR": { + "text": "arriba" + }, + "uFoytOG4qsXzBk979t63y": { + "text": "limpio" + }, + "uMhOF9ZvWnjW-Zrjbjfhs": { + "text": "bajar" + }, + "uOA82KFAVtjoYRTuYFgpr": { + "text": "postre" + }, + "uPL5NMeXTmD1iU6ZoiROu": { + "text": "pájaro" + }, + "uYElWOlSOSoQap-d5gsYF": { + "text": "chocolate" + }, + "uZRwbLa1lEG7ol0UJKRBj": { + "text": "viejo" + }, + "ubP5GM7_0vPkRc6zbD9Ez": { + "text": "antiácido" + }, + "uiVc5R86QCZkhraEFlrNz": { + "text": "museo" + }, + "ujyHgmlPIs7UdtndbYd8S": { + "text": "amistad" + }, + "upWXctTSKBtFNSXnXDK_u": { + "text": "frutas" + }, + "uzSwgQNnV8ZrjxpN5Bz_a": { + "text": "difícil" + }, + "v-E2GE1DpCkNAxsfA0f4M": { + "text": "goma" + }, + "vHzfvEgIkQ0e73ryfWP2F": { + "text": "ordenar" + }, + "vKGLQIas9RdBnPGsaYtr2": { + "text": "cometa" + }, + "vOgqHjpHgrUGERIHtVqDe": { + "text": "basurero" + }, + "vPicdKLrhT2wmAAPPukKP": { + "text": "veloz" + }, + "vPnmrsRou1ihosdVXS_Op": { + "text": "zapatitos" + }, + "vZ9JaTnoj8C0ILYxMNB73": { + "text": "calabaza" + }, + "vaYJPAsTRvslo2qFOJt60": { + "text": "lomo" + }, + "vazatQ7CrYJFsorVDC5AC": { + "text": "león" + }, + "viAHJeLRr_6j9dEi5klj_": { + "text": "amarillo" + }, + "vlh1Pa6eA0ZrBs3vHzWH7": { + "text": "oso" + }, + "vmb_RMIB20QND6VcS0deY": { + "text": "panza" + }, + "vq3T-UQGTjX3Z9TlEF12e": { + "text": "mayonesa" + }, + "vy-O5Zc5kxY8d-7RROvQI": { + "text": "jamón" + }, + "w4cVxbBDZjeNyHwpBARHQ": { + "text": "hombro" + }, + "wBLnDZStKj8YLkg2pTCfh": { + "text": "sentir" + }, + "wCGb6D4xSVr4UeKXzGIlP": { + "text": "disfraces" + }, + "wcpXeLMBRusfqfrz9s4mF": { + "text": "puré" + }, + "whHwNRVnqeM7BMx6nppiW": { + "text": "tigre" + }, + "wkrNPLGWTqMIy4PJRW9QR": { + "text": "en" + }, + "wnfSUkF8-tQiRTVou1_pd": { + "text": "frío" + }, + "x3PNiU1NIeQ3zQa31C8WX": { + "text": "pañal" + }, + "xGsyYCjDzQugVzSaK8CuA": { + "text": "duro" + }, + "xIgPo3N-aKXhVcjultMiY": { + "text": "factura" + }, + "xPUYlxRxgFVn1FHQFz6Ic": { + "text": "secar" + }, + "xQblStUfyBGO27j15Sda3": { + "text": "pato" + }, + "xT4BPNmF-5WAQLfs3cUpS": { + "text": "enamorado" + }, + "xXtjQktuAq1bmxTc0HSQT": { + "text": "gaseosa" + }, + "xbPnUL4qxvm30VFYNphh-": { + "text": "tíos" + }, + "xiaTdHGInqfm4rD6XzSeZ": { + "text": "encender" + }, + "xnPF8fvkC1TvgETI1JcC9": { + "text": "órganos" + }, + "xqGzZJIHBeVfSzRfm3rmg": { + "text": "uno" + }, + "xxr0MRGYRmmoNC_gsD9uy": { + "text": "pasaporte" + }, + "y0SViQxW8Y-yiX1Z7gXWt": { + "text": "superhéroe" + }, + "y5W21CKOkLWnYJo1OC700": { + "text": "tos" + }, + "yJoivIPHOm1Y1lj-hGN1J": { + "text": "dormir" + }, + "yNag8CK0wV_iRMnFznsXk": { + "text": "pelota" + }, + "yR9FTtOimFwZG5g5tgpRk": { + "text": "visita" + }, + "y_5OURnKxFcv4UiMKntUi": { + "text": "y" + }, + "yihsjW9ON0Fr9Yy4ZlP9c": { + "text": "axila" + }, + "yk2wDVqHEKKwupgm87OJ2": { + "text": "nalgas" + }, + "yo00Ci8bSRFYPU6HxGVwX": { + "text": "cantar" + }, + "yqlmoVGItXqaeazw3M3eg": { + "text": "sillón" + }, + "yvtvSsBLhabkcpeYGbxQr": { + "text": "bota" + }, + "yxa6QVSrmWUKH2PZHKaVl": { + "text": "lechuga" + }, + "zANp2EnhT6n0Jcl1Xra6K": { + "text": "bailarín" + }, + "zAmesi1FcIWLXE3WVa9WS": { + "text": "antihistamínico" + }, + "zRTTg5x_P1E8Z3CU-oWXa": { + "text": "cualquiera" + }, + "zcibOHpRbSmz1hVNSjPTj": { + "text": "tenedor" + }, + "zdFC3vpgjcyUWB9a4ghRW": { + "text": "descripción" + }, + "zi_wcT10fxgn72ZJhVx18": { + "text": "vestido" + }, + "zm_6R89hr4wjuVkifiYrk": { + "text": "despeinado" + }, + "zrR1DbO_szgKvxLyrZquw": { + "text": "calefacción" + }, + "zw-o9pDectP5bxFnUjrJO": { + "text": "chancho" + }, + "zxhRDSHXtV63Sp3c2fjrI": { + "text": "aduana" + }, + "-k6dUC6thWPyULq8MVSe6": { + "text": "PRONOMBRES" + }, + "0geft4arn_A8kL-rfUPYc": { + "text": "PERSONAS" + }, + "1aM3sTxyb8yLSWtkn2MoO": { + "text": "INSTRUMENTOS MUSICALES" + }, + "384rVetrrLX4x4pJ0Y0Na": { + "text": "INTERACCIONES SOCIALES" + }, + "4e6iVOPLAjnM6wCMUm5P4": { + "text": "DESAYUNO Y MERIENDA" + }, + "6vmRBH4shBk3UQEUM6APX": { + "text": "CINE Y PELÍCULAS" + }, + "7Jm3bDhPInSlwhdy20dKF": { + "text": "CLASE DE ARTE" + }, + "7ngCuvmAnM_7ygpFQgLpk": { + "text": "COLORES" + }, + "7w5ACMFdOCTkBrS911MA1": { + "text": "ADJETIVOS Y ADVERBIOS" + }, + "8FPdnkMzOIBVTW5-TQxWX": { + "text": "PERSONAJES" + }, + "8t8CAggTj3HuznkKhfXle": { + "text": "LIBRO DEL RESTAURANTE" + }, + "9JRv4X68pAtwsFT3Ss0iJ": { + "text": "LIBRO DE NATACIÓN" + }, + "ByBvBUS7dcXldjzZOVFFP": { + "text": "CUERPO" + }, + "C7ClEHF5-Mcico4FvRxEV": { + "text": "PREPOSICIONES" + }, + "GD9YHeLktSsdZQvcoua6x": { + "text": "LIBRO DE LA CARNICERÍA" + }, + "HzPl-HvsrXL_QkGT38Ohd": { + "text": "LIBRO DE VERDULERÍA" + }, + "JKEk5TYykBK6ZeYND3Ron": { + "text": "CONJUNCIONES" + }, + "LWyfHr8Oui5HIShtZ_huo": { + "text": "FRUTAS" + }, + "PYTnUqCLwAbngR2Ozroc2": { + "text": "ACCIONES" + }, + "QQszyYRLL-otCQtRfbLzm": { + "text": "TIEMPO" + }, + "V6K3TniptOApMMGa8TspR": { + "text": "TODO" + }, + "VhfGFlHDcPor996rCzoK9": { + "text": "CELEBRACIONES" + }, + "WZYuZd331Hm5gHXJtUmBN": { + "text": "ANIMALES" + }, + "ZgZoyOg5K-LscXdfl6kQG": { + "text": "CLASE DE MÚSICA" + }, + "_Cw7FcJSYiterkLSDJH8V": { + "text": "CASA" + }, + "ah257x5jssDmLIOrcSGn6": { + "text": "NÚMEROS" + }, + "berI6X2_pAVCNOrcHAL6y": { + "text": "SENTIMIENTOS" + }, + "ce2z_EeEG2nH0ZS4KVAkA": { + "text": "COLEGIO" + }, + "dQXaeM3Uul1yEvRwJ4w9t": { + "text": "VESTIMENTA" + }, + "ejXQZAiYjrcSFGXb1pz7M": { + "text": "TRANSPORTE" + }, + "gybgILOLxmIVfeQtb1f94": { + "text": "LIBRO DE HIGIENE" + }, + "iHS1HpUBBadzgmbum_bdD": { + "text": "PROFESIONES Y OFICIOS" + }, + "jatDsecioVAxRph-WOg4f": { + "text": "LIBRO DE LA FARMACIA" + }, + "puOOrKWbYzH0B_8uGkxYX": { + "text": "LIBRO DE VIAJE" + }, + "puda9fUGjqvm9oSM6CpTk": { + "text": "ALIMENTOS" + }, + "rH7zhJzNVIcEIRyvaYLoi": { + "text": "DEPORTES" + }, + "uv4tWMRHfewaEQ_pH0dnV": { + "text": "LIBRO DE LA SALUD" + }, + "wAhDHMrZ850dHTwgAXrMY": { + "text": "CONCEPTOS" + }, + "xjfPlDs-AcFV9LCyY-v9j": { + "text": "JUEGOS Y JUGUETES" + }, + "y545pM8pvB3WgukIac6NT": { + "text": "LUGARES" + }, + "zwf7qmSEi7PBwsNaqciA-": { + "text": "libro de la biblioteca" + } +} \ No newline at end of file diff --git a/assets/old_grupos.json b/assets/old_grupos.json new file mode 100644 index 00000000..556e71f7 --- /dev/null +++ b/assets/old_grupos.json @@ -0,0 +1,15683 @@ +[ + { + "id": 0, + "texto": { + "en": "Actions", + "es": "ACCIONES" + }, + "tipo": 0, + "imagen": { + "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fverbos.webp?alt=media&token=f32aaaf1-44aa-49d3-a0ed-981ba01564d5" + }, + "relacion": [ + { + "id": 1, + "frec": 1 + }, + { + "id": 2, + "frec": 1 + }, + { + "id": 3, + "frec": 1 + }, + { + "id": 4, + "frec": 1 + }, + { + "id": 5, + "frec": 1 + }, + { + "id": 6, + "frec": 1 + }, + { + "id": 7, + "frec": 1 + }, + { + "id": 8, + "frec": 1 + }, + { + "id": 9, + "frec": 1 + }, + { + "id": 10, + "frec": 1 + }, + { + "id": 11, + "frec": 1 + }, + { + "id": 12, + "frec": 1 + }, + { + "id": 13, + "frec": 1 + }, + { + "id": 14, + "frec": 1 + }, + { + "id": 15, + "frec": 1 + }, + { + "id": 17, + "frec": 1 + }, + { + "id": 18, + "frec": 1 + }, + { + "id": 19, + "frec": 1 + }, + { + "id": 20, + "frec": 1 + }, + { + "id": 21, + "frec": 1 + }, + { + "id": 22, + "frec": 1 + }, + { + "id": 23, + "frec": 1 + }, + { + "id": 26, + "frec": 1 + }, + { + "id": 28, + "frec": 1 + }, + { + "id": 29, + "frec": 1 + }, + { + "id": 30, + "frec": 1 + }, + { + "id": 31, + "frec": 1 + }, + { + "id": 32, + "frec": 1 + }, + { + "id": 33, + "frec": 1 + }, + { + "id": 34, + "frec": 1 + }, + { + "id": 35, + "frec": 1 + }, + { + "id": 38, + "frec": 1 + }, + { + "id": 39, + "frec": 1 + }, + { + "id": 41, + "frec": 1 + }, + { + "id": 43, + "frec": 1 + }, + { + "id": 44, + "frec": 1 + }, + { + "id": 49, + "frec": 2 + }, + { + "id": 51, + "frec": 1 + }, + { + "id": 52, + "frec": 1 + }, + { + "id": 53, + "frec": 1 + }, + { + "id": 54, + "frec": 1 + }, + { + "id": 57, + "frec": 1 + }, + { + "id": 61, + "frec": 1 + }, + { + "id": 64, + "frec": 1 + }, + { + "id": 65, + "frec": 1 + }, + { + "id": 66, + "frec": 1 + }, + { + "id": 68, + "frec": 1 + }, + { + "id": 69, + "frec": 1 + }, + { + "id": 70, + "frec": 1 + }, + { + "id": 71, + "frec": 1 + }, + { + "id": 76, + "frec": 1 + }, + { + "id": 78, + "frec": 1 + }, + { + "id": 79, + "frec": 1 + }, + { + "id": 81, + "frec": 1 + }, + { + "id": 82, + "frec": 1 + }, + { + "id": 85, + "frec": 1 + }, + { + "id": 86, + "frec": 1 + }, + { + "id": 87, + "frec": 1 + }, + { + "id": 88, + "frec": 1 + }, + { + "id": 90, + "frec": 1 + }, + { + "id": 92, + "frec": 1 + }, + { + "id": 93, + "frec": 1 + }, + { + "id": 94, + "frec": 1 + }, + { + "id": 95, + "frec": 1 + }, + { + "id": 97, + "frec": 1 + }, + { + "id": 98, + "frec": 1 + }, + { + "id": 100, + "frec": 1 + }, + { + "id": 101, + "frec": 1 + }, + { + "id": 103, + "frec": 1 + }, + { + "id": 104, + "frec": 1 + }, + { + "id": 107, + "frec": 1 + }, + { + "id": 108, + "frec": 1 + }, + { + "id": 112, + "frec": 1 + }, + { + "id": 113, + "frec": 1 + }, + { + "id": 116, + "frec": 1 + }, + { + "id": 117, + "frec": 1 + }, + { + "id": 118, + "frec": 1 + }, + { + "id": 1029, + "frec": 1 + } + ], + "frecuencia": 1 + }, + { + "id": 1, + "texto": { + "en": "Adjectives", + "es": "ADJETIVOS" + }, + "tipo": 0, + "imagen": { + "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fdescripcion.webp?alt=media&token=4dbde8ba-f144-4a12-90f6-013bf68d912d" + }, + "relacion": [ + { + "id": 119, + "frec": 1 + }, + { + "id": 121, + "frec": 1 + }, + { + "id": 122, + "frec": 1 + }, + { + "id": 123, + "frec": 1 + }, + { + "id": 124, + "frec": 1 + }, + { + "id": 125, + "frec": 1 + }, + { + "id": 126, + "frec": 1 + }, + { + "id": 129, + "frec": 1 + }, + { + "id": 130, + "frec": 1 + }, + { + "id": 131, + "frec": 1 + }, + { + "id": 132, + "frec": 1 + }, + { + "id": 133, + "frec": 1 + }, + { + "id": 134, + "frec": 1 + }, + { + "id": 135, + "frec": 1 + }, + { + "id": 136, + "frec": 1 + }, + { + "id": 137, + "frec": 1 + }, + { + "id": 138, + "frec": 1 + }, + { + "id": 139, + "frec": 1 + }, + { + "id": 140, + "frec": 1 + }, + { + "id": 141, + "frec": 1 + }, + { + "id": 144, + "frec": 1 + }, + { + "id": 147, + "frec": 1 + }, + { + "id": 149, + "frec": 1 + }, + { + "id": 153, + "frec": 1 + }, + { + "id": 156, + "frec": 1 + }, + { + "id": 158, + "frec": 1 + }, + { + "id": 159, + "frec": 1 + }, + { + "id": 161, + "frec": 1 + }, + { + "id": 162, + "frec": 1 + }, + { + "id": 164, + "frec": 1 + }, + { + "id": 165, + "frec": 1 + }, + { + "id": 167, + "frec": 1 + }, + { + "id": 171, + "frec": 1 + }, + { + "id": 172, + "frec": 1 + }, + { + "id": 177, + "frec": 1 + }, + { + "id": 178, + "frec": 1 + }, + { + "id": 179, + "frec": 1 + }, + { + "id": 181, + "frec": 1 + }, + { + "id": 194, + "frec": 1 + }, + { + "id": 199, + "frec": 1 + }, + { + "id": 200, + "frec": 1 + }, + { + "id": 203, + "frec": 1 + }, + { + "id": 204, + "frec": 1 + }, + { + "id": 205, + "frec": 1 + }, + { + "id": 207, + "frec": 1 + }, + { + "id": 208, + "frec": 1 + }, + { + "id": 210, + "frec": 1 + }, + { + "id": 212, + "frec": 1 + }, + { + "id": 213, + "frec": 1 + }, + { + "id": 217, + "frec": 1 + }, + { + "id": 218, + "frec": 1 + }, + { + "id": 219, + "frec": 1 + }, + { + "id": 233, + "frec": 1 + }, + { + "id": 234, + "frec": 1 + }, + { + "id": 237, + "frec": 1 + }, + { + "id": 238, + "frec": 1 + }, + { + "id": 242, + "frec": 1 + }, + { + "id": 244, + "frec": 1 + }, + { + "id": 245, + "frec": 1 + }, + { + "id": 248, + "frec": 1 + }, + { + "id": 253, + "frec": 1 + }, + { + "id": 256, + "frec": 1 + }, + { + "id": 263, + "frec": 1 + }, + { + "id": 267, + "frec": 1 + }, + { + "id": 268, + "frec": 1 + }, + { + "id": 272, + "frec": 1 + }, + { + "id": 274, + "frec": 1 + }, + { + "id": 280, + "frec": 1 + }, + { + "id": 281, + "frec": 1 + }, + { + "id": 282, + "frec": 1 + } + ] + }, + { + "id": 2, + "texto": { + "en": "Animals", + "es": "ANIMALES" + }, + "tipo": 0, + "imagen": { + "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fanimales.webp?alt=media&token=de80d51b-647a-4860-9233-74b0925e053e" + }, + "relacion": [ + { + "id": 283, + "frec": 1 + }, + { + "id": 286, + "frec": 1 + }, + { + "id": 288, + "frec": 1 + }, + { + "id": 290, + "frec": 1 + }, + { + "id": 293, + "frec": 1 + }, + { + "id": 294, + "frec": 1 + }, + { + "id": 296, + "frec": 1 + }, + { + "id": 297, + "frec": 1 + }, + { + "id": 298, + "frec": 1 + }, + { + "id": 299, + "frec": 1 + }, + { + "id": 301, + "frec": 1 + }, + { + "id": 310, + "frec": 1 + }, + { + "id": 313, + "frec": 1 + }, + { + "id": 314, + "frec": 1 + }, + { + "id": 320, + "frec": 1 + }, + { + "id": 323, + "frec": 1 + }, + { + "id": 327, + "frec": 1 + }, + { + "id": 331, + "frec": 1 + }, + { + "id": 332, + "frec": 1 + }, + { + "id": 333, + "frec": 1 + }, + { + "id": 334, + "frec": 1 + }, + { + "id": 335, + "frec": 1 + }, + { + "id": 337, + "frec": 1 + }, + { + "id": 340, + "frec": 1 + }, + { + "id": 342, + "frec": 1 + }, + { + "id": 342, + "frec": 1 + }, + { + "id": 348, + "frec": 1 + }, + { + "id": 354, + "frec": 1 + }, + { + "id": 356, + "frec": 1 + }, + { + "id": 357, + "frec": 1 + }, + { + "id": 359, + "frec": 1 + }, + { + "id": 362, + "frec": 1 + }, + { + "id": 363, + "frec": 1 + }, + { + "id": 367, + "frec": 1 + }, + { + "id": 374, + "frec": 1 + }, + { + "id": 375, + "frec": 1 + }, + { + "id": 376, + "frec": 1 + } + ] + }, + { + "id": 3, + "texto": { + "en": "Food", + "es": "ALIMENTOS" + }, + "tipo": 0, + "imagen": { + "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcomidas.webp?alt=media&token=9e4bc673-e0d9-4e75-bb78-ea9b0dd294e2" + }, + "relacion": [ + { + "id": 391, + "texto": { + "en": "chard", + "es": "acelga" + }, + "tipo": 2, + "imagen": { + "picto": "acelga" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 393, + "texto": { + "en": "almond", + "es": "almendras" + }, + "tipo": 2, + "imagen": { + "picto": "almendras" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 396, + "texto": { + "en": "sugar", + "es": "azúcar" + }, + "tipo": 2, + "imagen": { + "picto": "azucar" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 394, + "texto": { + "en": "pineapple", + "es": "ananá" + }, + "tipo": 2, + "imagen": { + "picto": "anana" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 398, + "texto": { + "en": "sandwich", + "es": "bocadillo" + }, + "tipo": 2, + "imagen": { + "picto": "bocadillo" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 399, + "texto": { + "en": "pumpkin", + "es": "calabaza" + }, + "tipo": 2, + "imagen": { + "picto": "calabaza" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 400, + "texto": { + "en": "caneloni", + "es": "canelones" + }, + "tipo": 2, + "imagen": { + "picto": "canelones" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 401, + "texto": { + "en": "cappchino", + "es": "capuchino" + }, + "tipo": 2, + "imagen": { + "picto": "capuchino" + }, + "relacion": [], + "agenda": 0, + "gps": 0, + "esSugerencia": false + }, + { + "id": 402, + "texto": { + "en": "chestnuts", + "es": "castañas" + }, + "tipo": 2, + "imagen": { + "picto": "castanas" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 403, + "texto": { + "en": "onion", + "es": "cebolla" + }, + "tipo": 2, + "imagen": { + "picto": "cebolla" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 404, + "texto": { + "en": "cherry", + "es": "cerezas" + }, + "tipo": 2, + "imagen": { + "picto": "cerezas" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 406, + "texto": { + "en": "chupetin", + "es": "chupetin" + }, + "tipo": 2, + "imagen": { + "picto": "chupetin" + }, + "relacion": [], + "agenda": 0, + "gps": 0, + "edad": [ + "NINO" + ] + }, + { + "id": 407, + "texto": { + "en": "plum", + "es": "ciruela" + }, + "tipo": 2, + "imagen": { + "picto": "ciruela" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 408, + "texto": { + "en": "apricot", + "es": "damasco" + }, + "tipo": 2, + "imagen": { + "picto": "damasco" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 412, + "texto": { + "en": "creme caramel", + "es": "flan" + }, + "tipo": 2, + "imagen": { + "picto": "flan" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 413, + "texto": { + "en": "raspberry", + "es": "frambuesa" + }, + "tipo": 2, + "imagen": { + "picto": "frambuesas" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 414, + "texto": { + "en": "strawberry", + "es": "frutilla" + }, + "tipo": 2, + "imagen": { + "picto": "fresa" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 415, + "texto": { + "en": "cookie", + "es": "galleta" + }, + "tipo": 2, + "imagen": { + "picto": "galletas" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 417, + "texto": { + "en": "jelly", + "es": "gelatina" + }, + "tipo": 2, + "imagen": { + "picto": "gelatina" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 420, + "texto": { + "en": "boiled egg", + "es": "huevo duro" + }, + "tipo": 2, + "imagen": { + "picto": "huevo_duro" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 421, + "texto": { + "en": "fried eg", + "es": "huevo frito" + }, + "tipo": 2, + "imagen": { + "picto": "huevo_frito" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 424, + "texto": { + "en": "canned tuna", + "es": "lata de atún" + }, + "tipo": 2, + "imagen": { + "picto": "atun" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 425, + "texto": { + "en": "canned sardine", + "es": "lata de sardinas" + }, + "tipo": 2, + "imagen": { + "picto": "lata_de_sardinas" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 426, + "texto": { + "en": "milk with cacao", + "es": "leche con cacáo" + }, + "tipo": 2, + "imagen": { + "picto": "leche_con_cacao" + }, + "relacion": [], + "agenda": 0, + "gps": 0, + "edad": [ + "NINO" + ] + }, + { + "id": 427, + "texto": { + "en": "milk and cookies", + "es": "leche y galletas" + }, + "tipo": 2, + "imagen": { + "picto": "leche_y_galletas" + }, + "relacion": [], + "agenda": 0, + "gps": 0, + "esSugerencia": false + }, + { + "id": 428, + "texto": { + "en": "lettuce", + "es": "lechuga" + }, + "tipo": 2, + "imagen": { + "picto": "lechuga" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 430, + "texto": { + "en": "corn", + "es": "maiz" + }, + "tipo": 2, + "imagen": { + "picto": "maiz" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 431, + "texto": { + "en": "butter", + "es": "manteca" + }, + "tipo": 2, + "imagen": { + "picto": "manteca" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 432, + "texto": { + "en": "peach", + "es": "durazno" + }, + "tipo": 2, + "imagen": { + "picto": "melocoton" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 435, + "texto": { + "en": "orange", + "es": "naranja" + }, + "tipo": 2, + "imagen": { + "picto": "naranja" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 438, + "texto": { + "en": "white bread", + "es": "pan blanco" + }, + "tipo": 2, + "imagen": { + "picto": "pan_blanco" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 439, + "texto": { + "en": "black bread", + "es": "pan negro" + }, + "tipo": 2, + "imagen": { + "picto": "pan_negro" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 447, + "texto": { + "en": "grapefruit", + "es": "pomelo" + }, + "tipo": 2, + "imagen": { + "picto": "pomelo" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 449, + "texto": { + "en": "smashed potatoes", + "es": "puré" + }, + "tipo": 2, + "imagen": { + "picto": "pure" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 458, + "texto": { + "en": "sandwich", + "es": "sandwich" + }, + "tipo": 2, + "imagen": { + "picto": "sandwich" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 462, + "texto": { + "en": "pie", + "es": "tarta" + }, + "tipo": 2, + "imagen": { + "picto": "tarta" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 463, + "texto": { + "en": "tomato", + "es": "tomate" + }, + "tipo": 2, + "imagen": { + "picto": "tomate" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 465, + "texto": { + "en": "toast", + "es": "tostada" + }, + "tipo": 2, + "imagen": { + "picto": "tostada" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 468, + "texto": { + "en": "apple juice", + "es": "jugo de manzana" + }, + "tipo": 2, + "imagen": { + "picto": "zumo_de_manzana" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 469, + "texto": { + "en": "peach juice", + "es": "jugo de durazno" + }, + "tipo": 2, + "imagen": { + "picto": "melocoton" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 471, + "texto": { + "en": "grape juice", + "es": "jugo de uva" + }, + "tipo": 2, + "imagen": { + "picto": "zumo_de_uva" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 472, + "texto": { + "en": "soup", + "es": "Sopa" + }, + "tipo": 2, + "imagen": { + "picto": "sopa" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 473, + "texto": { + "en": "banana", + "es": "banana" + }, + "tipo": 2, + "imagen": { + "picto": "banana" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 474, + "texto": { + "en": "apple", + "es": "manzana" + }, + "tipo": 2, + "imagen": { + "picto": "manzana" + }, + "relacion": [], + "agenda": 0, + "gps": 0, + "esSugerencia": false + }, + { + "id": 475, + "texto": { + "en": "pear", + "es": "pera" + }, + "tipo": 2, + "imagen": { + "picto": "pera" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 476, + "texto": { + "en": "fish", + "es": "pescado" + }, + "tipo": 2, + "imagen": { + "picto": "zid_pescado" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 477, + "texto": { + "en": "salad", + "es": "ensalada" + }, + "tipo": 2, + "imagen": { + "picto": "zid_ensalada" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 478, + "texto": { + "en": "vegetables", + "es": "verduras" + }, + "tipo": 2, + "imagen": { + "picto": "zid_verduras" + }, + "relacion": [], + "agenda": 0, + "gps": 0, + "esSugerencia": false + }, + { + "id": 480, + "texto": { + "en": "pasta", + "es": "pasta" + }, + "tipo": 2, + "imagen": { + "picto": "zid_pasta" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 481, + "texto": { + "en": "rice", + "es": "arroz" + }, + "tipo": 2, + "imagen": { + "picto": "zid_arroz" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 482, + "texto": { + "en": "beef", + "es": "carne" + }, + "tipo": 2, + "imagen": { + "picto": "zid_carne" + }, + "relacion": [], + "agenda": 0, + "gps": 0, + "esSugerencia": false + }, + { + "id": 483, + "texto": { + "en": "fruit", + "es": "fruta" + }, + "tipo": 2, + "imagen": { + "picto": "zid_fruta" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 484, + "texto": { + "en": "yoghurt", + "es": "yogur" + }, + "tipo": 2, + "imagen": { + "picto": "zid_yogurt" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 485, + "texto": { + "en": "cake", + "es": "torta" + }, + "tipo": 2, + "imagen": { + "picto": "zid_tarta" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 486, + "texto": { + "en": "ice cream", + "es": "helado" + }, + "tipo": 2, + "imagen": { + "picto": "zid_helado" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 487, + "texto": { + "en": "oil", + "es": "aceite" + }, + "tipo": 2, + "imagen": { + "picto": "aceite" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 489, + "texto": { + "en": "salt", + "es": "sal" + }, + "tipo": 2, + "imagen": { + "picto": "sal" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 490, + "texto": { + "en": "mayo", + "es": "mayonesa" + }, + "tipo": 2, + "imagen": { + "picto": "mayonesa" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 492, + "texto": { + "en": "ketchup", + "es": "ketchup" + }, + "tipo": 2, + "imagen": { + "picto": "ketchup" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 494, + "texto": { + "en": "Candy", + "es": "Golosina" + }, + "tipo": 2, + "imagen": { + "picto": "ic_dulces" + }, + "relacion": [], + "agenda": 0, + "gps": 0, + "edad": [ + "JOVEN", + "NINO" + ], + "esSugerencia": false + }, + { + "id": 495, + "texto": { + "en": "milk", + "es": "leche" + }, + "tipo": 2, + "imagen": { + "picto": "leche" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 496, + "texto": { + "en": "coffee", + "es": "café" + }, + "tipo": 2, + "imagen": { + "picto": "cafe" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 497, + "texto": { + "en": "juice", + "es": "jugo" + }, + "tipo": 2, + "imagen": { + "picto": "ic_bebida" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 498, + "texto": { + "en": "chocolate", + "es": "chocolate" + }, + "tipo": 2, + "imagen": { + "picto": "chocolate" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 499, + "texto": { + "en": "te", + "es": "té" + }, + "tipo": 2, + "imagen": { + "picto": "te" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 500, + "texto": { + "en": "water", + "es": "agua" + }, + "tipo": 2, + "imagen": { + "picto": "agua" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 501, + "texto": { + "en": "soda", + "es": "gaseosa" + }, + "tipo": 2, + "imagen": { + "picto": "cocacola" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 502, + "texto": { + "en": "beer", + "es": "cerveza" + }, + "tipo": 2, + "imagen": { + "picto": "cerveza" + }, + "relacion": [], + "agenda": 0, + "gps": 0, + "edad": [ + "ADULTO" + ] + }, + { + "id": 503, + "texto": { + "en": "wine", + "es": "vino" + }, + "tipo": 2, + "imagen": { + "picto": "vino" + }, + "relacion": [], + "agenda": 0, + "gps": 0, + "edad": [ + "ADULTO" + ] + }, + { + "id": 504, + "texto": { + "en": "poultry", + "es": "pollo" + }, + "tipo": 2, + "imagen": { + "picto": "zid_pollo" + }, + "relacion": [], + "agenda": 0, + "gps": 0, + "esSugerencia": false + }, + { + "id": 505, + "texto": { + "en": "chicken thigh", + "es": "muslo de pollo" + }, + "tipo": 2, + "imagen": { + "picto": "muslo_de_pollo" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 507, + "texto": { + "en": "egg", + "es": "huevo" + }, + "tipo": 2, + "imagen": { + "picto": "zid_huevo" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 510, + "texto": { + "en": "fish", + "es": "pescado" + }, + "tipo": 2, + "imagen": { + "picto": "zid_pescado" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 512, + "texto": { + "en": "steak", + "es": "filete" + }, + "tipo": 2, + "imagen": { + "picto": "filete" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 515, + "texto": { + "en": "hamburguer", + "es": "hamburguesa" + }, + "tipo": 2, + "imagen": { + "picto": "hamburguesa" + }, + "relacion": [], + "agenda": 0, + "gps": 0, + "esSugerencia": false + }, + { + "id": 516, + "texto": { + "en": "raw ham", + "es": "jamón crudo" + }, + "tipo": 2, + "imagen": { + "picto": "jamon" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 517, + "texto": { + "en": "cooked ham", + "es": "jamón cocido" + }, + "tipo": 2, + "imagen": { + "picto": "jamon_de_york" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 521, + "texto": { + "en": "cheese", + "es": "queso" + }, + "tipo": 2, + "imagen": { + "picto": "queso" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 524, + "texto": { + "en": "sausage", + "es": "salchichas" + }, + "tipo": 2, + "imagen": { + "picto": "salchichas" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + } + ], + "frecuencia": 1 + }, + { + "id": 4, + "texto": { + "en": "House", + "es": "CASA" + }, + "tipo": 0, + "imagen": { + "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_casa.webp?alt=media&token=f1d197b6-db37-44e6-b4bc-8ba31b0fa4aa" + }, + "relacion": [ + { + "id": 2, + "frec": 1 + }, + { + "id": 3, + "frec": 1 + }, + { + "id": 5, + "frec": 1 + }, + { + "id": 8, + "frec": 1 + }, + { + "id": 17, + "frec": 1 + }, + { + "id": 20, + "frec": 1 + }, + { + "id": 199, + "frec": 1 + }, + { + "id": 263, + "frec": 1 + }, + { + "id": 599, + "frec": 1 + }, + { + "id": 605, + "frec": 1 + }, + { + "id": 653, + "frec": 1 + }, + { + "id": 678, + "frec": 1 + }, + { + "id": 731, + "frec": 1 + }, + { + "id": 755, + "frec": 1 + }, + { + "id": 758, + "frec": 1 + }, + { + "id": 773, + "frec": 1 + }, + { + "id": 774, + "frec": 1 + }, + { + "id": 1012, + "frec": 1 + }, + { + "id": 1019, + "frec": 1 + }, + { + "id": 1023, + "frec": 1 + }, + { + "id": 1024, + "frec": 1 + }, + { + "id": 1025, + "frec": 1 + }, + { + "id": 1026, + "frec": 1 + }, + { + "id": 1027, + "frec": 1 + }, + { + "id": 1030, + "frec": 1 + }, + { + "id": 1032, + "frec": 1 + } + ] + }, + { + "id": 5, + "texto": { + "en": "School", + "es": "COLEGIO" + }, + "tipo": 0, + "imagen": { + "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_escuela.webp?alt=media&token=05c5460c-c3a5-4404-9389-d6a67e79bb5d" + }, + "relacion": [ + { + "id": 4, + "frec": 1 + }, + { + "id": 15, + "frec": 1 + }, + { + "id": 14, + "frec": 1 + }, + { + "id": 18, + "frec": 1 + }, + { + "id": 21, + "frec": 1 + }, + { + "id": 32, + "frec": 1 + }, + { + "id": 43, + "frec": 1 + }, + { + "id": 101, + "frec": 1 + }, + { + "id": 662, + "frec": 1 + }, + { + "id": 678, + "frec": 1 + }, + { + "id": 751, + "frec": 1 + }, + { + "id": 752, + "frec": 1 + }, + { + "id": 753, + "frec": 1 + }, + { + "id": 754, + "frec": 1 + }, + { + "id": 755, + "frec": 1 + }, + { + "id": 756, + "frec": 1 + }, + { + "id": 757, + "frec": 1 + }, + { + "id": 760, + "frec": 1 + }, + { + "id": 762, + "frec": 1 + }, + { + "id": 766, + "frec": 1 + }, + { + "id": 768, + "frec": 1 + }, + { + "id": 770, + "frec": 1 + }, + { + "id": 771, + "frec": 1 + }, + { + "id": 769, + "frec": 1 + } + ] + }, + { + "id": 6, + "texto": { + "en": "Colors", + "es": "COLORES" + }, + "tipo": 0, + "imagen": { + "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_colores.webp?alt=media&token=04309e00-d682-43f3-9605-bde0b5b4ab9a" + }, + "relacion": [ + { + "id": 733, + "frec": 1 + }, + { + "id": 734, + "frec": 1 + }, + { + "id": 736, + "frec": 1 + }, + { + "id": 737, + "frec": 1 + }, + { + "id": 738, + "frec": 1 + }, + { + "id": 739, + "frec": 1 + }, + { + "id": 740, + "frec": 1 + }, + { + "id": 742, + "frec": 1 + }, + { + "id": 743, + "frec": 1 + }, + { + "id": 744, + "frec": 1 + }, + { + "id": 745, + "frec": 1 + }, + { + "id": 746, + "frec": 1 + }, + { + "id": 747, + "frec": 1 + }, + { + "id": 748, + "frec": 1 + }, + { + "id": 749, + "frec": 1 + }, + { + "id": 750, + "frec": 1 + } + ] + }, + { + "id": 7, + "texto": { + "en": "Concepts", + "es": "CONCEPTOS" + }, + "tipo": 0, + "imagen": { + "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fconceptos.webp?alt=media&token=544d07e2-680b-427f-a657-9a1438529627" + }, + "relacion": [ + { + "id": 702, + "frec": 1 + }, + { + "id": 703, + "frec": 1 + }, + { + "id": 704, + "frec": 1 + }, + { + "id": 706, + "frec": 1 + }, + { + "id": 707, + "frec": 1 + }, + { + "id": 708, + "frec": 1 + }, + { + "id": 712, + "frec": 1 + }, + { + "id": 713, + "frec": 1 + }, + { + "id": 714, + "frec": 1 + }, + { + "id": 718, + "frec": 1 + }, + { + "id": 721, + "frec": 1 + }, + { + "id": 722, + "frec": 1 + }, + { + "id": 725, + "frec": 1 + }, + { + "id": 728, + "frec": 1 + }, + { + "id": 729, + "frec": 1 + }, + { + "id": 730, + "frec": 1 + }, + { + "id": 731, + "frec": 1 + }, + { + "id": 732, + "frec": 1 + } + ] + }, + { + "id": 8, + "texto": { + "en": "Conjunctions", + "es": "CONJUNCIONES" + }, + "tipo": 0, + "imagen": { + "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fconjunciones.webp?alt=media&token=bd3a504d-d5ca-45cc-a29f-869a6b578174" + }, + "relacion": [ + { + "id": 889, + "frec": 1 + }, + { + "id": 898, + "frec": 1 + }, + { + "id": 904, + "frec": 1 + }, + { + "id": 910, + "frec": 1 + }, + { + "id": 912, + "frec": 1 + }, + { + "id": 923, + "frec": 1 + } + ], + "frecuencia": 1 + }, + { + "id": 9, + "texto": { + "en": "Body", + "es": "CUERPO" + }, + "tipo": 0, + "imagen": { + "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpartes_del_cuerpo.webp?alt=media&token=b09b6919-2789-46a6-a883-d21c55859e08" + }, + "relacion": [ + { + "id": 776, + "frec": 1 + }, + { + "id": 777, + "frec": 1 + }, + { + "id": 778, + "frec": 1 + }, + { + "id": 780, + "frec": 1 + }, + { + "id": 781, + "frec": 1 + }, + { + "id": 782, + "frec": 1 + }, + { + "id": 783, + "frec": 1 + }, + { + "id": 784, + "frec": 1 + }, + { + "id": 785, + "frec": 1 + }, + { + "id": 786, + "frec": 1 + }, + { + "id": 787, + "frec": 1 + }, + { + "id": 788, + "frec": 1 + }, + { + "id": 789, + "frec": 1 + }, + { + "id": 790, + "frec": 1 + }, + { + "id": 791, + "frec": 1 + }, + { + "id": 792, + "frec": 1 + }, + { + "id": 793, + "frec": 1 + }, + { + "id": 794, + "frec": 1 + }, + { + "id": 795, + "frec": 1 + }, + { + "id": 797, + "frec": 1 + }, + { + "id": 799, + "frec": 1 + }, + { + "id": 800, + "frec": 1 + }, + { + "id": 802, + "frec": 1 + }, + { + "id": 803, + "frec": 1 + }, + { + "id": 804, + "frec": 1 + }, + { + "id": 806, + "frec": 1 + }, + { + "id": 807, + "frec": 1 + }, + { + "id": 809, + "frec": 1 + } + ] + }, + { + "id": 10, + "texto": { + "en": "Music instruments", + "es": "INSTRUMENTOS MUSICALES" + }, + "tipo": 0, + "imagen": { + "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Finstrumentos.webp?alt=media&token=b58a39b2-6c69-4b19-8658-8a6a4fe7ca2a" + }, + "relacion": [ + { + "id": 850, + "frec": 1 + }, + { + "id": 851, + "frec": 1 + }, + { + "id": 853, + "frec": 1 + }, + { + "id": 855, + "frec": 1 + }, + { + "id": 857, + "frec": 1 + }, + { + "id": 860, + "frec": 1 + }, + { + "id": 865, + "frec": 1 + }, + { + "id": 870, + "frec": 1 + }, + { + "id": 871, + "frec": 1 + }, + { + "id": 874, + "frec": 1 + }, + { + "id": 876, + "frec": 1 + } + ] + }, + { + "id": 11, + "texto": { + "en": "Social interactions", + "es": "INTERACCIONES SOCIALES" + }, + "tipo": 0, + "imagen": { + "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fsociales.webp?alt=media&token=4bf39b77-0fdb-4d79-a407-14f5d66281d2" + }, + "relacion": [ + { + "id": 377, + "frec": 11 + }, + { + "id": 378, + "frec": 3 + }, + { + "id": 379, + "frec": 7 + }, + { + "id": 380, + "frec": 1 + }, + { + "id": 381, + "frec": 1 + }, + { + "id": 382, + "frec": 1 + }, + { + "id": 383, + "frec": 1 + }, + { + "id": 384, + "frec": 1 + }, + { + "id": 385, + "frec": 1 + }, + { + "id": 386, + "frec": 1 + }, + { + "id": 387, + "frec": 1 + }, + { + "id": 388, + "frec": 1 + }, + { + "id": 389, + "frec": 1 + }, + { + "id": 390, + "frec": 1 + } + ] + }, + { + "id": 12, + "texto": { + "en": "GAMES AND TOYS", + "es": "JUEGOS Y JUGUETES" + }, + "tipo": 0, + "imagen": { + "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fjuguetes.webp?alt=media&token=046c8f8b-7518-4aac-9c56-6ac6fe4a03ef" + }, + "relacion": [ + { + "id": 975, + "frec": 1 + }, + { + "id": 976, + "frec": 1 + }, + { + "id": 977, + "frec": 1 + }, + { + "id": 980, + "frec": 1 + }, + { + "id": 981, + "frec": 1 + }, + { + "id": 982, + "frec": 1 + }, + { + "id": 986, + "frec": 1 + }, + { + "id": 987, + "frec": 1 + }, + { + "id": 989, + "frec": 1 + }, + { + "id": 996, + "frec": 1 + }, + { + "id": 1001, + "frec": 1 + }, + { + "id": 1005, + "frec": 1 + }, + { + "id": 1012, + "frec": 1 + }, + { + "id": 1013, + "frec": 1 + }, + { + "id": 1014, + "frec": 1 + }, + { + "id": 1016, + "frec": 1 + }, + { + "id": 1017, + "frec": 1 + }, + { + "id": 1019, + "frec": 1 + }, + { + "id": 1020, + "frec": 1 + } + ], + "tags": [ + "NINO" + ] + }, + { + "id": 13, + "texto": { + "en": "Places", + "es": "LUGARES" + }, + "tipo": 0, + "imagen": { + "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Flugares.webp?alt=media&token=fa4c9b84-7f78-49d3-8fe7-b67335365b94" + }, + "relacion": [ + { + "id": 644, + "frec": 1 + }, + { + "id": 646, + "frec": 1 + }, + { + "id": 648, + "frec": 1 + }, + { + "id": 649, + "frec": 1 + }, + { + "id": 650, + "frec": 1 + }, + { + "id": 651, + "frec": 1 + }, + { + "id": 653, + "frec": 1 + }, + { + "id": 656, + "frec": 1 + }, + { + "id": 657, + "frec": 1 + }, + { + "id": 660, + "frec": 1 + }, + { + "id": 661, + "frec": 1 + }, + { + "id": 662, + "frec": 1 + }, + { + "id": 666, + "frec": 1 + }, + { + "id": 668, + "frec": 1 + }, + { + "id": 672, + "frec": 1 + }, + { + "id": 675, + "frec": 1 + }, + { + "id": 678, + "frec": 1 + }, + { + "id": 679, + "frec": 1 + }, + { + "id": 680, + "frec": 1 + }, + { + "id": 682, + "frec": 1 + }, + { + "id": 685, + "frec": 1 + }, + { + "id": 687, + "frec": 1 + }, + { + "id": 688, + "frec": 1 + }, + { + "id": 698, + "frec": 1 + }, + { + "id": 700, + "frec": 1 + } + ] + }, + { + "id": 15, + "texto": { + "en": "Numbers", + "es": "NúMEROS" + }, + "tipo": 0, + "imagen": { + "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fnumeros.webp?alt=media&token=51f29b27-7998-4db5-bcad-ecc7979beea5" + }, + "relacion": [ + { + "id": 836, + "frec": 1 + }, + { + "id": 837, + "frec": 1 + }, + { + "id": 838, + "frec": 1 + }, + { + "id": 839, + "frec": 1 + }, + { + "id": 840, + "frec": 1 + }, + { + "id": 841, + "frec": 1 + }, + { + "id": 842, + "frec": 1 + }, + { + "id": 843, + "frec": 1 + }, + { + "id": 844, + "frec": 1 + }, + { + "id": 845, + "frec": 1 + }, + { + "id": 846, + "frec": 1 + } + ] + }, + { + "id": 16, + "texto": { + "en": "Clothing", + "es": "VESTIMENTA" + }, + "tipo": 0, + "imagen": { + "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fropa.webp?alt=media&token=52aa7f5e-5b8e-4cf2-9e2b-451f9e06e042" + }, + "relacion": [ + { + "id": 924, + "frec": 1 + }, + { + "id": 928, + "frec": 1 + }, + { + "id": 930, + "frec": 1 + }, + { + "id": 931, + "frec": 1 + }, + { + "id": 934, + "frec": 1 + }, + { + "id": 936, + "frec": 1 + }, + { + "id": 938, + "frec": 1 + }, + { + "id": 939, + "frec": 1 + }, + { + "id": 940, + "frec": 1 + }, + { + "id": 941, + "frec": 1 + }, + { + "id": 954, + "frec": 1 + }, + { + "id": 951, + "frec": 1 + }, + { + "id": 956, + "frec": 1 + }, + { + "id": 960, + "frec": 1 + }, + { + "id": 962, + "frec": 1 + }, + { + "id": 968, + "frec": 1 + }, + { + "id": 969, + "frec": 1 + }, + { + "id": 971, + "frec": 1 + }, + { + "id": 972, + "frec": 1 + }, + { + "id": 973, + "frec": 1 + }, + { + "id": 974, + "frec": 1 + } + ] + }, + { + "id": 17, + "texto": { + "en": "People", + "es": "PERSONAS" + }, + "tipo": 0, + "imagen": { + "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpersonas.webp?alt=media&token=a5223e39-5426-4728-beda-8579fbc82adf" + }, + "relacion": [ + { + "id": 614, + "frec": 2 + }, + { + "id": 615, + "frec": 1 + }, + { + "id": 617, + "frec": 1 + }, + { + "id": 619, + "frec": 1 + }, + { + "id": 620, + "frec": 1 + }, + { + "id": 621, + "frec": 1 + }, + { + "id": 622, + "frec": 1 + }, + { + "id": 623, + "frec": 1 + }, + { + "id": 624, + "frec": 1 + }, + { + "id": 626, + "frec": 1 + }, + { + "id": 627, + "frec": 1 + }, + { + "id": 628, + "frec": 1 + }, + { + "id": 629, + "frec": 1 + }, + { + "id": 630, + "frec": 1 + }, + { + "id": 631, + "frec": 1 + }, + { + "id": 632, + "frec": 1 + }, + { + "id": 633, + "frec": 1 + }, + { + "id": 635, + "frec": 1 + }, + { + "id": 638, + "frec": 1 + }, + { + "id": 639, + "frec": 1 + }, + { + "id": 640, + "frec": 1 + }, + { + "id": 642, + "frec": 1 + }, + { + "id": 643, + "frec": 2 + } + ] + }, + { + "id": 18, + "texto": { + "en": "Prepositions", + "es": "PREPOSICIONES" + }, + "tipo": 0, + "imagen": { + "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpreposiciones.webp?alt=media&token=73b3d814-e509-4ed4-b4f7-cde7c0b4c2a5" + }, + "relacion": [ + { + "id": 525, + "frec": 1 + }, + { + "id": 526, + "frec": 1 + }, + { + "id": 527, + "frec": 1 + }, + { + "id": 528, + "frec": 1 + }, + { + "id": 529, + "frec": 1 + }, + { + "id": 530, + "frec": 1 + }, + { + "id": 531, + "frec": 1 + }, + { + "id": 532, + "frec": 1 + }, + { + "id": 533, + "frec": 1 + }, + { + "id": 534, + "frec": 1 + }, + { + "id": 535, + "frec": 1 + }, + { + "id": 536, + "frec": 1 + }, + { + "id": 537, + "frec": 1 + }, + { + "id": 538, + "frec": 1 + }, + { + "id": 539, + "frec": 1 + }, + { + "id": 540, + "frec": 1 + } + ] + }, + { + "id": 19, + "texto": { + "en": "Pronouns", + "es": "PRONOMBRE" + }, + "tipo": 0, + "imagen": { + "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpronombres.webp?alt=media&token=fde2895a-c02f-464c-b487-ec4826cca6bd" + }, + "relacion": [ + { + "id": 889, + "frec": 1 + }, + { + "id": 890, + "frec": 1 + }, + { + "id": 891, + "frec": 1 + }, + { + "id": 892, + "frec": 1 + }, + { + "id": 893, + "frec": 1 + }, + { + "id": 894, + "frec": 1 + }, + { + "id": 895, + "frec": 1 + }, + { + "id": 896, + "frec": 1 + }, + { + "id": 897, + "frec": 1 + }, + { + "id": 898, + "frec": 1 + }, + { + "id": 899, + "frec": 1 + }, + { + "id": 900, + "frec": 1 + }, + { + "id": 901, + "frec": 1 + }, + { + "id": 903, + "frec": 1 + }, + { + "id": 904, + "frec": 1 + }, + { + "id": 905, + "frec": 1 + }, + { + "id": 906, + "frec": 1 + }, + { + "id": 907, + "frec": 1 + }, + { + "id": 910, + "frec": 1 + }, + { + "id": 911, + "frec": 1 + }, + { + "id": 912, + "frec": 1 + }, + { + "id": 913, + "frec": 1 + }, + { + "id": 914, + "frec": 1 + }, + { + "id": 915, + "frec": 1 + }, + { + "id": 918, + "frec": 1 + }, + { + "id": 919, + "frec": 1 + }, + { + "id": 920, + "frec": 1 + }, + { + "id": 923, + "frec": 1 + } + ] + }, + { + "id": 20, + "texto": { + "en": "Feelings", + "es": "SENTIMIENTOS" + }, + "tipo": 0, + "imagen": { + "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fsentimientos.webp?alt=media&token=90954fb0-bf68-48fe-8f12-d9dfc21963da" + }, + "relacion": [ + { + "id": 119, + "texto": { + "en": "dull", + "es": "aburrido" + }, + "tipo": 4, + "imagen": { + "picto": "ic_aburrido" + }, + "relacion": [ + { + "id": 44, + "frec": 1 + } + ], + "agenda": 0, + "gps": 0 + }, + { + "id": 121, + "texto": { + "en": "scared", + "es": "asustado" + }, + "tipo": 4, + "imagen": { + "picto": "asustado" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 124, + "texto": { + "en": "anxious", + "es": "ansioso" + }, + "tipo": 4, + "imagen": { + "picto": "ansioso" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 125, + "texto": { + "en": "grieved", + "es": "apenado" + }, + "tipo": 4, + "imagen": { + "picto": "apenado" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 133, + "texto": { + "en": "good", + "es": "bien" + }, + "tipo": 4, + "imagen": { + "picto": "ic_estoy_bien" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 137, + "texto": { + "en": "tired", + "es": "Cansado" + }, + "tipo": 4, + "imagen": { + "picto": "ic_cansado" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 161, + "texto": { + "en": "funny", + "es": "divertido" + }, + "tipo": 4, + "imagen": { + "picto": "divertido" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 164, + "texto": { + "en": "in love", + "es": "enamorado" + }, + "tipo": 4, + "imagen": { + "picto": "enamorado" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 167, + "texto": { + "en": "angry", + "es": "enojado" + }, + "tipo": 4, + "imagen": { + "picto": "ic_enojado" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 171, + "texto": { + "en": "happy", + "es": "feliz" + }, + "tipo": 4, + "imagen": { + "picto": "feliz" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 194, + "texto": { + "en": "irritated", + "es": "irritado" + }, + "tipo": 4, + "imagen": { + "picto": "irritado" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 212, + "texto": { + "en": "upset", + "es": "molesto" + }, + "tipo": 4, + "imagen": { + "picto": "molesto" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 217, + "texto": { + "en": "nervous", + "es": "nervioso" + }, + "tipo": 4, + "imagen": { + "picto": "nervioso" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 237, + "texto": { + "en": "worried", + "es": "preocupada" + }, + "tipo": 4, + "imagen": { + "picto": "preocupada" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 272, + "texto": { + "en": "sad", + "es": "tríste" + }, + "tipo": 4, + "imagen": { + "picto": "ic_triste" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + } + ] + }, + { + "id": 21, + "texto": { + "en": "Stores", + "es": "TIENDAS" + }, + "tipo": 0, + "imagen": { + "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Flibro_tiendas.webp?alt=media&token=4f4f3669-ad33-4baa-8a6e-bace7f17b45f" + }, + "relacion": [ + { + "id": 650, + "frec": 1 + }, + { + "id": 661, + "frec": 1 + }, + { + "id": 666, + "frec": 1 + }, + { + "id": 675, + "frec": 1 + }, + { + "id": 679, + "frec": 1 + }, + { + "id": 680, + "frec": 1 + }, + { + "id": 688, + "frec": 1 + }, + { + "id": 698, + "frec": 1 + }, + { + "id": 700, + "frec": 1 + } + ] + }, + { + "id": 22, + "texto": { + "en": "Time", + "es": "TIEMPO" + }, + "tipo": 0, + "imagen": { + "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ftiempos.webp?alt=media&token=a9cba0e5-1635-4d9c-8f1b-9db6243f7e5f" + }, + "relacion": [ + { + "id": 812, + "frec": 1 + }, + { + "id": 811, + "frec": 1 + }, + { + "id": 815, + "frec": 1 + }, + { + "id": 816, + "frec": 1 + }, + { + "id": 817, + "frec": 1 + }, + { + "id": 818, + "frec": 1 + }, + { + "id": 810, + "frec": 1 + } + ] + }, + { + "id": 23, + "texto": { + "en": "Transport", + "es": "TRANSPORTE" + }, + "tipo": 0, + "imagen": { + "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ftransportes.webp?alt=media&token=94bd980f-eeed-4310-8fe7-09148e19612f" + }, + "relacion": [ + { + "id": 606, + "frec": 1 + }, + { + "id": 607, + "frec": 1 + }, + { + "id": 608, + "frec": 1 + }, + { + "id": 609, + "frec": 1 + }, + { + "id": 610, + "frec": 1 + }, + { + "id": 611, + "frec": 1 + } + ] + }, + { + "id": 24, + "texto": { + "en": "ALL", + "es": "TODO" + }, + "tipo": 0, + "imagen": { + "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ftodos.webp?alt=media&token=694aae8b-22c8-4274-b9f1-b3bbdd15d061" + }, + "relacion": [ + { + "id": 1, + "texto": { + "en": "escort", + "es": "acompañar" + }, + "tipo": 3, + "imagen": { + "picto": "ic_acompanar" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 2, + "texto": { + "en": "turn off", + "es": "apagar" + }, + "tipo": 3, + "imagen": { + "picto": "ic_apagar_television" + }, + "relacion": [ + { + "id": 1016, + "frec": 2 + }, + { + "id": 1019, + "frec": 1 + }, + { + "id": 773, + "frec": 2 + }, + { + "id": 774, + "frec": 2 + } + ], + "agenda": 0, + "gps": 0 + }, + { + "id": 3, + "texto": { + "en": "turn the volume down", + "es": "bajar volumen" + }, + "tipo": 3, + "imagen": { + "picto": "ic_volumen_menos" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 4, + "texto": { + "en": "erase", + "es": "borrar" + }, + "tipo": 3, + "imagen": { + "picto": "ic_borrar" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 5, + "texto": { + "en": "search", + "es": "buscar" + }, + "tipo": 3, + "imagen": { + "picto": "ic_buscar" + }, + "relacion": [ + { + "id": 996, + "frec": 1 + }, + { + "id": 500, + "frec": 1 + }, + { + "id": 989, + "frec": 1 + }, + { + "id": 737, + "frec": 2 + }, + { + "id": 385, + "frec": 3 + }, + { + "id": 628, + "frec": 3 + }, + { + "id": 1014, + "frec": 2 + } + ], + "agenda": 0, + "gps": 0 + }, + { + "id": 6, + "texto": { + "en": "sing", + "es": "cantar" + }, + "tipo": 3, + "imagen": { + "picto": "ic_cantar" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 7, + "texto": { + "en": "change", + "es": "cambiar" + }, + "tipo": 3, + "imagen": { + "picto": "ic_cambiar" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 8, + "texto": { + "en": "change channel", + "es": "cambiar de canal" + }, + "tipo": 3, + "imagen": { + "picto": "ic_cambiar_canal" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 9, + "texto": { + "en": "change diapper", + "es": "cambiarme el pañal" + }, + "tipo": 3, + "imagen": { + "picto": "ic_cambiarpanal" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 10, + "texto": { + "en": "change clothes", + "es": "cambiarme la ropa" + }, + "tipo": 3, + "imagen": { + "picto": "ic_cambiarropa" + }, + "relacion": [ + { + "id": 385, + "frec": 1 + } + ], + "agenda": 0, + "gps": 0 + }, + { + "id": 11, + "texto": { + "en": "brush my teeth", + "es": "cepillarme los dientes" + }, + "tipo": 3, + "imagen": { + "picto": "ic_cepillar" + }, + "relacion": [ + { + "id": 385, + "frec": 4 + } + ], + "agenda": 0, + "gps": 0 + }, + { + "id": 12, + "texto": { + "en": "eat a sandwich", + "es": "comer un sandwich" + }, + "tipo": 3, + "imagen": { + "picto": "comer_un_bocadillo" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 13, + "texto": { + "en": "buy", + "es": "comprar" + }, + "tipo": 3, + "imagen": { + "picto": "ic_comprar" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 14, + "texto": { + "en": "give", + "es": "dame" + }, + "tipo": 3, + "imagen": { + "picto": "ic_dar" + }, + "relacion": [ + { + "id": 427, + "frec": 1 + }, + { + "id": 989, + "frec": 1 + }, + { + "id": 500, + "frec": 1 + }, + { + "id": 774, + "frec": 2 + }, + { + "id": 986, + "frec": 2 + }, + { + "id": 857, + "frec": 1 + } + ], + "agenda": 0, + "gps": 0 + }, + { + "id": 15, + "texto": { + "en": "draw", + "es": "dibujar" + }, + "tipo": 3, + "imagen": { + "picto": "ic_dibujar" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 17, + "texto": { + "en": "turn on", + "es": "encender" + }, + "tipo": 3, + "imagen": { + "picto": "encender_la_television" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 18, + "texto": { + "en": "write", + "es": "escribir" + }, + "tipo": 3, + "imagen": { + "picto": "ic_escribir" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 19, + "texto": { + "en": "listen again", + "es": "escuchar de nuevo" + }, + "tipo": 3, + "imagen": { + "picto": "ic_de_nuevo" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 20, + "texto": { + "en": "listen to music", + "es": "escuchar música" + }, + "tipo": 3, + "imagen": { + "picto": "ic_escuchar_musica" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 21, + "texto": { + "en": "listen", + "es": "escuchar" + }, + "tipo": 3, + "imagen": { + "picto": "ic_escuchar" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 22, + "texto": { + "en": "be", + "es": "estoy" + }, + "tipo": 3, + "imagen": { + "picto": "ic_estoy" + }, + "relacion": [ + { + "id": 133, + "frec": 6 + }, + { + "id": 205, + "frec": 2 + }, + { + "id": 204, + "frec": 4 + }, + { + "id": 181, + "frec": 1 + }, + { + "id": 272, + "frec": 1 + }, + { + "id": 274, + "frec": 1 + }, + { + "id": 819, + "frec": 1 + }, + { + "id": 831, + "frec": 1 + }, + { + "id": 119, + "frec": 6 + } + ], + "agenda": 0, + "gps": 0, + "esSugerencia": false + }, + { + "id": 23, + "texto": { + "en": "wait", + "es": "esperar" + }, + "tipo": 3, + "imagen": { + "picto": "esperar" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 26, + "texto": { + "en": "win", + "es": "ganar" + }, + "tipo": 3, + "imagen": { + "picto": "ic_ganar" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 28, + "texto": { + "en": "do", + "es": "hacer" + }, + "tipo": 3, + "imagen": { + "picto": "ic_haciendo" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 29, + "texto": { + "en": "pee", + "es": "hacer pis" + }, + "tipo": 3, + "imagen": { + "picto": "ic_hacerpis" + }, + "relacion": [ + { + "id": 385, + "frec": 3 + } + ], + "agenda": 0, + "gps": 0 + }, + { + "id": 30, + "texto": { + "en": "go", + "es": "ir a" + }, + "tipo": 3, + "imagen": { + "picto": "ir" + }, + "relacion": [ + { + "id": 653, + "frec": 5 + }, + { + "id": 118, + "frec": 5 + }, + { + "id": 650, + "frec": 4 + }, + { + "id": 651, + "frec": 3 + }, + { + "id": 682, + "frec": 1 + }, + { + "id": 688, + "frec": 5 + }, + { + "id": 668, + "frec": 5 + }, + { + "id": 87, + "frec": 1 + }, + { + "id": 51, + "frec": 1 + } + ], + "agenda": 0, + "gps": 0 + }, + { + "id": 31, + "texto": { + "en": "wash hands", + "es": "lavarme las manos" + }, + "tipo": 3, + "imagen": { + "picto": "ic_lavamano" + }, + "relacion": [ + { + "id": 385, + "frec": 1 + } + ], + "agenda": 0, + "gps": 0 + }, + { + "id": 32, + "texto": { + "en": "read", + "es": "leer" + }, + "tipo": 3, + "imagen": { + "picto": "leer" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 33, + "texto": { + "en": "call someone", + "es": "llamar a alguien" + }, + "tipo": 3, + "imagen": { + "picto": "ic_llamaralguien" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 34, + "texto": { + "en": "play with", + "es": "jugar con" + }, + "tipo": 3, + "imagen": { + "picto": "ic_jugar" + }, + "relacion": [ + { + "id": 996, + "frec": 13 + }, + { + "id": 761, + "frec": 15 + }, + { + "id": 615, + "frec": 5 + }, + { + "id": 632, + "frec": 10 + }, + { + "id": 628, + "frec": 3 + }, + { + "id": 977, + "frec": 1 + }, + { + "id": 982, + "frec": 1 + }, + { + "id": 1005, + "frec": 1 + } + ], + "agenda": 0, + "gps": 0, + "edad": [ + "NINO" + ] + }, + { + "id": 35, + "texto": { + "en": "look at the mirror", + "es": "mirarme al espejo" + }, + "tipo": 3, + "imagen": { + "picto": "ic_espejo" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 38, + "texto": { + "en": "take a walk", + "es": "pasear" + }, + "tipo": 3, + "imagen": { + "picto": "ic_pasear" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 39, + "texto": { + "en": "comb", + "es": "peinarme" + }, + "tipo": 3, + "imagen": { + "picto": "ic_peinar" + }, + "relacion": [ + { + "id": 385, + "frec": 2 + } + ], + "agenda": 0, + "gps": 0 + }, + { + "id": 41, + "texto": { + "en": "lose", + "es": "perder" + }, + "tipo": 3, + "imagen": { + "picto": "ic_perder" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 43, + "texto": { + "en": "paint", + "es": "pintar" + }, + "tipo": 3, + "imagen": { + "picto": "ic_pintar" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 44, + "texto": { + "en": "want", + "es": "quiero" + }, + "tipo": 3, + "imagen": { + "picto": "ic_quiero" + }, + "relacion": [ + { + "id": 118, + "frec": 20 + }, + { + "id": 34, + "frec": 43 + }, + { + "id": 29, + "frec": 8 + }, + { + "id": 11, + "frec": 3 + }, + { + "id": 31, + "frec": 3 + }, + { + "id": 39, + "frec": 10 + }, + { + "id": 10, + "frec": 3 + }, + { + "id": 35, + "frec": 4 + }, + { + "id": 5, + "frec": 19 + }, + { + "id": 30, + "frec": 28 + }, + { + "id": 51, + "frec": 16 + }, + { + "id": 2, + "frec": 11 + } + ], + "agenda": 0, + "gps": 0, + "esSugerencia": false + }, + { + "id": 49, + "texto": { + "en": "have", + "es": "tengo" + }, + "tipo": 3, + "imagen": { + "picto": "ic_tengo" + }, + "relacion": [ + { + "id": 177, + "frec": 3 + }, + { + "id": 597, + "frec": 4 + }, + { + "id": 662, + "frec": 2 + }, + { + "id": 754, + "frec": 1 + }, + { + "id": 729, + "frec": 2 + }, + { + "id": 572, + "frec": 2 + }, + { + "id": 277, + "frec": 1 + } + ], + "agenda": 0, + "gps": 0, + "esSugerencia": false + }, + { + "id": 51, + "texto": { + "en": "drink", + "es": "tomar" + }, + "tipo": 3, + "imagen": { + "picto": "beber" + }, + "relacion": [ + { + "id": 500, + "frec": 1 + }, + { + "id": 497, + "frec": 1 + }, + { + "id": 467, + "frec": 1 + }, + { + "id": 468, + "frec": 1 + }, + { + "id": 469, + "frec": 1 + }, + { + "id": 471, + "frec": 1 + }, + { + "id": 495, + "frec": 3 + }, + { + "id": 501, + "frec": 5 + }, + { + "id": 484, + "frec": 2 + }, + { + "id": 486, + "frec": 1 + } + ], + "agenda": 0, + "gps": 0 + }, + { + "id": 52, + "texto": { + "en": "hug", + "es": "abrazar" + }, + "tipo": 3, + "imagen": { + "picto": "abrazar" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 53, + "texto": { + "en": "open", + "es": "abrir" + }, + "tipo": 3, + "imagen": { + "picto": "abrir" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 54, + "texto": { + "en": "hook up", + "es": "abrochar" + }, + "tipo": 3, + "imagen": { + "picto": "abrochar" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 57, + "texto": { + "en": "love", + "es": "amar" + }, + "tipo": 3, + "imagen": { + "picto": "amar" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 61, + "texto": { + "en": "get down", + "es": "bajar" + }, + "tipo": 3, + "imagen": { + "picto": "bajar" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 64, + "texto": { + "en": "kiss", + "es": "besar" + }, + "tipo": 3, + "imagen": { + "picto": "besar" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 65, + "texto": { + "en": "ride", + "es": "cabalgar" + }, + "tipo": 3, + "imagen": { + "picto": "cabalgar" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 66, + "texto": { + "en": "fall", + "es": "caer" + }, + "tipo": 3, + "imagen": { + "picto": "caer" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 68, + "texto": { + "en": "close", + "es": "cerrar" + }, + "tipo": 3, + "imagen": { + "picto": "cerrar" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 69, + "texto": { + "en": "grab", + "es": "agarrar" + }, + "tipo": 3, + "imagen": { + "picto": "coger" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 70, + "texto": { + "en": "run", + "es": "correr" + }, + "tipo": 3, + "imagen": { + "picto": "correr" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 71, + "texto": { + "en": "cut", + "es": "cortar" + }, + "tipo": 3, + "imagen": { + "picto": "cortar" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 76, + "texto": { + "en": "get in", + "es": "entrar" + }, + "tipo": 3, + "imagen": { + "picto": "entrar" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 78, + "texto": { + "en": "hacer el amor", + "es": "hacer el amor" + }, + "tipo": 3, + "imagen": { + "picto": "hacer_el_amor" + }, + "relacion": [], + "agenda": 0, + "gps": 0, + "edad": [ + "ADULTO" + ] + }, + { + "id": 79, + "texto": { + "en": "smell", + "es": "oler" + }, + "tipo": 3, + "imagen": { + "picto": "husmear" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 81, + "texto": { + "en": "investigate", + "es": "investigar" + }, + "tipo": 3, + "imagen": { + "picto": "investigar" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 82, + "texto": { + "en": "play with the tablet", + "es": "jugar con la tablet" + }, + "tipo": 3, + "imagen": { + "picto": "jugar_con_la_tablet" + }, + "relacion": [], + "agenda": 0, + "gps": 0, + "edad": [ + "JOVEN" + ] + }, + { + "id": 85, + "texto": { + "en": "look", + "es": "mirar" + }, + "tipo": 3, + "imagen": { + "picto": "mirar" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 86, + "texto": { + "en": "swim", + "es": "nadar" + }, + "tipo": 3, + "imagen": { + "picto": "nadar" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 87, + "texto": { + "en": "take a walk", + "es": "pasear" + }, + "tipo": 3, + "imagen": { + "picto": "pasear" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 88, + "texto": { + "en": "beat legs", + "es": "patalear" + }, + "tipo": 3, + "imagen": { + "picto": "patalear" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 90, + "texto": { + "en": "paint", + "es": "pintar" + }, + "tipo": 3, + "imagen": { + "picto": "pintar" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 92, + "texto": { + "en": "put", + "es": "poner" + }, + "tipo": 3, + "imagen": { + "picto": "poner" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 93, + "texto": { + "en": "reject", + "es": "rechazar" + }, + "tipo": 3, + "imagen": { + "picto": "rechazar" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 94, + "texto": { + "en": "laugh", + "es": "reir" + }, + "tipo": 3, + "imagen": { + "picto": "reir" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 95, + "texto": { + "en": "repeat", + "es": "repetir" + }, + "tipo": 3, + "imagen": { + "picto": "repetir" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 97, + "texto": { + "en": "take out", + "es": "sacar" + }, + "tipo": 3, + "imagen": { + "picto": "sacar" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 98, + "texto": { + "en": "go out", + "es": "salir" + }, + "tipo": 3, + "imagen": { + "picto": "salir" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 100, + "texto": { + "en": "dry", + "es": "secar" + }, + "tipo": 3, + "imagen": { + "picto": "secar" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 101, + "texto": { + "en": "seat", + "es": "sentarme" + }, + "tipo": 3, + "imagen": { + "picto": "sentar" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 103, + "texto": { + "en": "blow your nose", + "es": "sonarme la nariz" + }, + "tipo": 3, + "imagen": { + "picto": "sonarse_los_mocos" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 104, + "texto": { + "en": "go up", + "es": "subir" + }, + "tipo": 3, + "imagen": { + "picto": "subir" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 107, + "texto": { + "en": "travel", + "es": "viajar" + }, + "tipo": 3, + "imagen": { + "picto": "viajar" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 108, + "texto": { + "en": "travel by car", + "es": "viajar en auto" + }, + "tipo": 3, + "imagen": { + "picto": "viajar_en_auto" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 112, + "texto": { + "en": "clean", + "es": "limpiar" + }, + "tipo": 3, + "imagen": { + "picto": "limpiar" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 113, + "texto": { + "en": "heal", + "es": "curar" + }, + "tipo": 3, + "imagen": { + "picto": "curar" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 116, + "texto": { + "en": "travel", + "es": "viajar" + }, + "tipo": 3, + "imagen": { + "picto": "viajar" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 117, + "texto": { + "en": "touch", + "es": "tocar" + }, + "tipo": 3, + "imagen": { + "picto": "tocar" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 118, + "texto": { + "en": "eat", + "es": "comer" + }, + "tipo": 3, + "imagen": { + "picto": "comer" + }, + "relacion": [ + { + "id": 474, + "frec": 3 + }, + { + "id": 504, + "frec": 4 + }, + { + "id": 494, + "frec": 1 + }, + { + "id": 515, + "frec": 4 + }, + { + "id": 478, + "frec": 4 + }, + { + "id": 482, + "frec": 4 + }, + { + "id": 481, + "frec": 4 + }, + { + "id": 521, + "frec": 4 + }, + { + "id": 480, + "frec": 2 + }, + { + "id": 483, + "frec": 1 + }, + { + "id": 600, + "frec": 1 + }, + { + "id": 400, + "frec": 2 + } + ], + "agenda": 0, + "gps": 0 + }, + { + "id": 119, + "texto": { + "en": "dull", + "es": "aburrido" + }, + "tipo": 4, + "imagen": { + "picto": "ic_aburrido" + }, + "relacion": [ + { + "id": 44, + "frec": 1 + } + ], + "agenda": 0, + "gps": 0 + }, + { + "id": 121, + "texto": { + "en": "scared", + "es": "asustado" + }, + "tipo": 4, + "imagen": { + "picto": "asustado" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 122, + "texto": { + "en": "acid", + "es": "ácido" + }, + "tipo": 4, + "imagen": { + "picto": "acido" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 123, + "texto": { + "en": "tall", + "es": "alto" + }, + "tipo": 4, + "imagen": { + "picto": "alto" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 124, + "texto": { + "en": "anxious", + "es": "ansioso" + }, + "tipo": 4, + "imagen": { + "picto": "ansioso" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 125, + "texto": { + "en": "grieved", + "es": "apenado" + }, + "tipo": 4, + "imagen": { + "picto": "apenado" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 126, + "texto": { + "en": "fixed", + "es": "arreglado" + }, + "tipo": 4, + "imagen": { + "picto": "arreglado" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 129, + "texto": { + "en": "absent", + "es": "ausente" + }, + "tipo": 4, + "imagen": { + "picto": "ausente" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 130, + "texto": { + "en": "short", + "es": "bajo" + }, + "tipo": 4, + "imagen": { + "picto": "bajo" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 131, + "texto": { + "en": "cheap", + "es": "barato" + }, + "tipo": 4, + "imagen": { + "picto": "barato" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 132, + "texto": { + "en": "soft", + "es": "blando" + }, + "tipo": 4, + "imagen": { + "picto": "blando" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 133, + "texto": { + "en": "good", + "es": "bien" + }, + "tipo": 4, + "imagen": { + "picto": "ic_estoy_bien" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 134, + "texto": { + "en": "drunk", + "es": "borracho" + }, + "tipo": 4, + "imagen": { + "picto": "borracho" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 135, + "texto": { + "en": "nice", + "es": "buena" + }, + "tipo": 4, + "imagen": { + "picto": "buena" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 136, + "texto": { + "en": "nice", + "es": "bueno" + }, + "tipo": 4, + "imagen": { + "picto": "bueno" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 137, + "texto": { + "en": "tired", + "es": "Cansado" + }, + "tipo": 4, + "imagen": { + "picto": "ic_cansado" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 138, + "texto": { + "en": "expensive", + "es": "caro" + }, + "tipo": 4, + "imagen": { + "picto": "caro" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 139, + "texto": { + "en": "hot", + "es": "caliente" + }, + "tipo": 4, + "imagen": { + "picto": "caliente" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 140, + "texto": { + "en": "hot", + "es": "caliente" + }, + "tipo": 4, + "imagen": { + "picto": "caliente_cosa" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 141, + "texto": { + "en": "warm", + "es": "caluroso" + }, + "tipo": 4, + "imagen": { + "picto": "caluroso" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 144, + "texto": { + "en": "expensive", + "es": "caro" + }, + "tipo": 4, + "imagen": { + "picto": "caro" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 147, + "texto": { + "en": "clear", + "es": "claro" + }, + "tipo": 4, + "imagen": { + "picto": "claros" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 149, + "texto": { + "en": "comfortable", + "es": "cómodo" + }, + "tipo": 4, + "imagen": { + "picto": "comodo" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 153, + "texto": { + "en": "quarter", + "es": "cuarto" + }, + "tipo": 4, + "imagen": { + "picto": "cuarto" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 156, + "texto": { + "en": "unkwown", + "es": "desconocido" + }, + "tipo": 4, + "imagen": { + "picto": "desconocida" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 158, + "texto": { + "en": "tousled", + "es": "despeinada" + }, + "tipo": 4, + "imagen": { + "picto": "despeinada" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 159, + "texto": { + "en": "tousled", + "es": "despeinado" + }, + "tipo": 4, + "imagen": { + "picto": "despeinado" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 161, + "texto": { + "en": "funny", + "es": "divertido" + }, + "tipo": 4, + "imagen": { + "picto": "divertido" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 162, + "texto": { + "en": "hard", + "es": "duro" + }, + "tipo": 4, + "imagen": { + "picto": "duro" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 164, + "texto": { + "en": "in love", + "es": "enamorado" + }, + "tipo": 4, + "imagen": { + "picto": "enamorado" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 165, + "texto": { + "en": "full", + "es": "entero" + }, + "tipo": 4, + "imagen": { + "picto": "entero" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 167, + "texto": { + "en": "angry", + "es": "enojado" + }, + "tipo": 4, + "imagen": { + "picto": "ic_enojado" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 171, + "texto": { + "en": "happy", + "es": "feliz" + }, + "tipo": 4, + "imagen": { + "picto": "feliz" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 172, + "texto": { + "en": "ugly", + "es": "feo" + }, + "tipo": 4, + "imagen": { + "picto": "feo" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 177, + "texto": { + "en": "cold", + "es": "frío" + }, + "tipo": 4, + "imagen": { + "picto": "frio_cosa" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 178, + "texto": { + "en": "chilly", + "es": "frío" + }, + "tipo": 4, + "imagen": { + "picto": "frio" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 179, + "texto": { + "en": "chilly", + "es": "frío" + }, + "tipo": 4, + "imagen": { + "picto": "frio_bebida" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 181, + "texto": { + "en": "happy", + "es": "feliz" + }, + "tipo": 4, + "imagen": { + "picto": "ic_feliz" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 194, + "texto": { + "en": "irritated", + "es": "irritado" + }, + "tipo": 4, + "imagen": { + "picto": "irritado" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 199, + "texto": { + "en": "lean", + "es": "límpio" + }, + "tipo": 4, + "imagen": { + "picto": "limpio" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 200, + "texto": { + "en": "nice", + "es": "lindo" + }, + "tipo": 4, + "imagen": { + "picto": "lindo" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 203, + "texto": { + "en": "bad", + "es": "malo" + }, + "tipo": 4, + "imagen": { + "picto": "malo" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 204, + "texto": { + "en": "so so", + "es": "mas o menos" + }, + "tipo": 4, + "imagen": { + "picto": "ic_estoy_masomenos" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 205, + "texto": { + "en": "bad", + "es": "mal" + }, + "tipo": 4, + "imagen": { + "picto": "ic_estoy_mal" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 207, + "texto": { + "en": "annoying", + "es": "molesto" + }, + "tipo": 4, + "imagen": { + "picto": "me_molesta_el_ruido" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 208, + "texto": { + "en": "half", + "es": "medio" + }, + "tipo": 4, + "imagen": { + "picto": "media" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 210, + "texto": { + "en": "equals", + "es": "mismo" + }, + "tipo": 4, + "imagen": { + "picto": "mismo" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 212, + "texto": { + "en": "upset", + "es": "molesto" + }, + "tipo": 4, + "imagen": { + "picto": "molesto" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 213, + "texto": { + "en": "a lot", + "es": "mucho" + }, + "tipo": 4, + "imagen": { + "picto": "mucho" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 217, + "texto": { + "en": "nervous", + "es": "nervioso" + }, + "tipo": 4, + "imagen": { + "picto": "nervioso" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 218, + "texto": { + "en": "none", + "es": "ninguno" + }, + "tipo": 4, + "imagen": { + "picto": "ninguno" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 219, + "texto": { + "en": "cloudy", + "es": "nublado" + }, + "tipo": 4, + "imagen": { + "picto": "nublado" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 233, + "texto": { + "en": "few", + "es": "poco" + }, + "tipo": 4, + "imagen": { + "picto": "poco" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 234, + "texto": { + "en": "few", + "es": "pocos" + }, + "tipo": 4, + "imagen": { + "picto": "pocos" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 237, + "texto": { + "en": "worried", + "es": "preocupada" + }, + "tipo": 4, + "imagen": { + "picto": "preocupada" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 238, + "texto": { + "en": "ready", + "es": "preparado" + }, + "tipo": 4, + "imagen": { + "picto": "preparado" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 242, + "texto": { + "en": "wealthy", + "es": "rica" + }, + "tipo": 4, + "imagen": { + "picto": "rica" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 244, + "texto": { + "en": "sturdy", + "es": "robusto" + }, + "tipo": 4, + "imagen": { + "picto": "robusto" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 245, + "texto": { + "en": "chubby", + "es": "gordito" + }, + "tipo": 4, + "imagen": { + "picto": "rollizo" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 248, + "texto": { + "en": "salty", + "es": "salado" + }, + "tipo": 4, + "imagen": { + "picto": "salado" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 253, + "texto": { + "en": "thirsty", + "es": "sediento" + }, + "tipo": 4, + "imagen": { + "picto": "sed" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 256, + "texto": { + "en": "sunny", + "es": "soleado" + }, + "tipo": 4, + "imagen": { + "picto": "soleado" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 263, + "texto": { + "en": "dirty", + "es": "súcio" + }, + "tipo": 4, + "imagen": { + "picto": "sucio" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 267, + "texto": { + "en": "all", + "es": "todos" + }, + "tipo": 4, + "imagen": { + "picto": "todos" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 268, + "texto": { + "en": "all", + "es": "todas" + }, + "tipo": 4, + "imagen": { + "picto": "todas" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 272, + "texto": { + "en": "sad", + "es": "tríste" + }, + "tipo": 4, + "imagen": { + "picto": "ic_triste" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 274, + "texto": { + "en": "crazy", + "es": "un poco loco" + }, + "tipo": 4, + "imagen": { + "picto": "ic_loco" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 280, + "texto": { + "en": "shamefaced", + "es": "vergonzante" + }, + "tipo": 4, + "imagen": { + "picto": "vergonzante" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 281, + "texto": { + "en": "old", + "es": "viejo" + }, + "tipo": 4, + "imagen": { + "picto": "viejo_cosa" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 282, + "texto": { + "en": "elderly", + "es": "viejo" + }, + "tipo": 4, + "imagen": { + "picto": "viejo" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 283, + "texto": { + "en": "bee", + "es": "abeja" + }, + "tipo": 2, + "imagen": { + "picto": "abeja" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 286, + "texto": { + "en": "animals", + "es": "animales" + }, + "tipo": 2, + "imagen": { + "picto": "animales" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 288, + "texto": { + "en": "donkey", + "es": "asno" + }, + "tipo": 2, + "imagen": { + "picto": "asno" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 290, + "texto": { + "en": "whale", + "es": "ballena" + }, + "tipo": 2, + "imagen": { + "picto": "ballena" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 293, + "texto": { + "en": "horse", + "es": "caballo" + }, + "tipo": 2, + "imagen": { + "picto": "caballo" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 294, + "texto": { + "en": "goat", + "es": "cabra" + }, + "tipo": 2, + "imagen": { + "picto": "cabra" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 296, + "texto": { + "en": "camel", + "es": "camello" + }, + "tipo": 2, + "imagen": { + "picto": "camello" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 297, + "texto": { + "en": "bird", + "es": "canario" + }, + "tipo": 2, + "imagen": { + "picto": "canario" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 298, + "texto": { + "en": "crab", + "es": "cangrejo" + }, + "tipo": 2, + "imagen": { + "picto": "cangrejo" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 299, + "texto": { + "en": "snail", + "es": "caracol" + }, + "tipo": 2, + "imagen": { + "picto": "caracol" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 301, + "texto": { + "en": "pig", + "es": "cerdo" + }, + "tipo": 2, + "imagen": { + "picto": "cerdo" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 310, + "texto": { + "en": "cock", + "es": "gallo" + }, + "tipo": 2, + "imagen": { + "picto": "gallo" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 313, + "texto": { + "en": "cat", + "es": "gato" + }, + "tipo": 2, + "imagen": { + "picto": "gato" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 314, + "texto": { + "en": "cricket", + "es": "grillo" + }, + "tipo": 2, + "imagen": { + "picto": "grillo" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 320, + "texto": { + "en": "giraffe", + "es": "jirafa" + }, + "tipo": 2, + "imagen": { + "picto": "jirafa" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 323, + "texto": { + "en": "lion", + "es": "león" + }, + "tipo": 2, + "imagen": { + "picto": "leon" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 327, + "texto": { + "en": "butterfly", + "es": "mariposa" + }, + "tipo": 2, + "imagen": { + "picto": "mariposa" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 331, + "texto": { + "en": "bear", + "es": "oso" + }, + "tipo": 2, + "imagen": { + "picto": "oso" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 332, + "texto": { + "en": "sheep", + "es": "oveja" + }, + "tipo": 2, + "imagen": { + "picto": "oveja" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 333, + "texto": { + "en": "bird", + "es": "pájaro" + }, + "tipo": 2, + "imagen": { + "picto": "pajaro" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 334, + "texto": { + "en": "birdie", + "es": "pájarito" + }, + "tipo": 2, + "imagen": { + "picto": "pajarito" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 335, + "texto": { + "en": "pidgeon", + "es": "paloma" + }, + "tipo": 2, + "imagen": { + "picto": "paloma" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 337, + "texto": { + "en": "duck", + "es": "pato" + }, + "tipo": 2, + "imagen": { + "picto": "pato" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 340, + "texto": { + "en": "fish", + "es": "peces" + }, + "tipo": 2, + "imagen": { + "picto": "peces" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 342, + "texto": { + "en": "dog", + "es": "perro" + }, + "tipo": 2, + "imagen": { + "picto": "perro" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 348, + "texto": { + "en": "frog", + "es": "rana" + }, + "tipo": 2, + "imagen": { + "picto": "rana" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 354, + "texto": { + "en": "tiger", + "es": "tigre" + }, + "tipo": 2, + "imagen": { + "picto": "tigre" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 356, + "texto": { + "en": "tortoise", + "es": "tortuga" + }, + "tipo": 2, + "imagen": { + "picto": "tortuga" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 357, + "texto": { + "en": "cow", + "es": "vaca" + }, + "tipo": 2, + "imagen": { + "picto": "vaca" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 359, + "texto": { + "en": "snake", + "es": "víbora" + }, + "tipo": 2, + "imagen": { + "picto": "vibora" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 362, + "texto": { + "en": "cock", + "es": "gallo" + }, + "tipo": 2, + "imagen": { + "picto": "gallo" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 363, + "texto": { + "en": "tuna", + "es": "atún" + }, + "tipo": 2, + "imagen": { + "picto": "atun" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 367, + "texto": { + "en": "duck", + "es": "pato" + }, + "tipo": 2, + "imagen": { + "picto": "pato" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 374, + "texto": { + "en": "veal", + "es": "ternera" + }, + "tipo": 2, + "imagen": { + "picto": "ternera" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 375, + "texto": { + "en": "pig", + "es": "cerdo" + }, + "tipo": 2, + "imagen": { + "picto": "cerdo" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 376, + "texto": { + "en": "rabbit", + "es": "conejo" + }, + "tipo": 2, + "imagen": { + "picto": "conejo" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 377, + "texto": { + "en": "Hello", + "es": "Hola" + }, + "tipo": 5, + "imagen": { + "picto": "ic_hola" + }, + "relacion": [ + { + "id": 378, + "frec": 12 + }, + { + "id": 49, + "frec": 4 + }, + { + "id": 44, + "frec": 1 + }, + { + "id": 380, + "frec": 8 + }, + { + "id": 632, + "frec": 3 + }, + { + "id": 628, + "frec": 2 + }, + { + "id": 381, + "frec": 2 + }, + { + "id": 379, + "frec": 5 + }, + { + "id": 22, + "frec": 1 + } + ], + "agenda": 0, + "gps": 0 + }, + { + "id": 378, + "texto": { + "en": "How are you?", + "es": "¿Cómo estás?" + }, + "tipo": 5, + "imagen": { + "picto": "ic_como_estas" + }, + "relacion": [ + { + "id": 22, + "frec": 2 + }, + { + "id": 49, + "frec": 1 + }, + { + "id": 44, + "frec": 1 + } + ], + "agenda": 0, + "gps": 0, + "esSugerencia": false + }, + { + "id": 379, + "texto": { + "en": "Good morning", + "es": "Buen día" + }, + "tipo": 5, + "imagen": { + "picto": "ic_buenos_dias" + }, + "relacion": [ + { + "id": 22, + "frec": 1 + }, + { + "id": 44, + "frec": 1 + }, + { + "id": 49, + "frec": 1 + } + ], + "agenda": 0, + "horario": [ + "MANANA" + ], + "gps": 0, + "esSugerencia": false + }, + { + "id": 380, + "texto": { + "en": "Good afternoon", + "es": "Buenas tardes" + }, + "tipo": 5, + "imagen": { + "picto": "ic_buenas_tardes" + }, + "relacion": [ + { + "id": 22, + "frec": 1 + }, + { + "id": 49, + "frec": 1 + }, + { + "id": 44, + "frec": 1 + } + ], + "agenda": 0, + "horario": [ + "MEDIODIA", + "TARDE" + ], + "gps": 0, + "esSugerencia": false + }, + { + "id": 381, + "texto": { + "en": "Good night", + "es": "Buenas noches" + }, + "tipo": 5, + "imagen": { + "picto": "ic_buenas_noches" + }, + "relacion": [ + { + "id": 22, + "frec": 1 + }, + { + "id": 49, + "frec": 1 + }, + { + "id": 44, + "frec": 1 + } + ], + "agenda": 0, + "horario": [ + "NOCHE" + ], + "gps": 0 + }, + { + "id": 382, + "texto": { + "en": "bye", + "es": "Adiós" + }, + "tipo": 5, + "imagen": { + "picto": "ic_adios" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 383, + "texto": { + "en": "Please", + "es": "Por favor" + }, + "tipo": 5, + "imagen": { + "picto": "por_favor" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 384, + "texto": { + "en": "Thank you", + "es": "Gracias" + }, + "tipo": 5, + "imagen": { + "picto": "ic_gracias" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 385, + "texto": { + "en": "Help", + "es": ". ¿me ayudas?" + }, + "tipo": 5, + "imagen": { + "picto": "ic_ayuda" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 386, + "texto": { + "en": "Luck", + "es": "suerte" + }, + "tipo": 5, + "imagen": { + "picto": "ic_suerte" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 387, + "texto": { + "en": "Good bye", + "es": "Chau" + }, + "tipo": 5, + "imagen": { + "picto": "ic_adios" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 388, + "texto": { + "en": "Yes", + "es": "Si" + }, + "tipo": 5, + "imagen": { + "picto": "ic_si" + }, + "relacion": [ + { + "id": 49, + "frec": 5 + }, + { + "id": 44, + "frec": 1 + }, + { + "id": 22, + "frec": 1 + } + ], + "agenda": 0, + "gps": 0 + }, + { + "id": 389, + "texto": { + "en": "No", + "es": "No" + }, + "tipo": 5, + "imagen": { + "picto": "ic_no" + }, + "relacion": [ + { + "id": 49, + "frec": 13 + }, + { + "id": 22, + "frec": 6 + }, + { + "id": 44, + "frec": 1 + } + ], + "agenda": 0, + "gps": 0 + }, + { + "id": 390, + "texto": { + "en": "I would love to", + "es": "Me encantaría" + }, + "tipo": 5, + "imagen": { + "picto": "ic_genial" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 391, + "texto": { + "en": "chard", + "es": "acelga" + }, + "tipo": 2, + "imagen": { + "picto": "acelga" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 393, + "texto": { + "en": "almond", + "es": "almendras" + }, + "tipo": 2, + "imagen": { + "picto": "almendras" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 394, + "texto": { + "en": "pineapple", + "es": "ananá" + }, + "tipo": 2, + "imagen": { + "picto": "anana" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 396, + "texto": { + "en": "sugar", + "es": "azúcar" + }, + "tipo": 2, + "imagen": { + "picto": "azucar" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 398, + "texto": { + "en": "sandwich", + "es": "bocadillo" + }, + "tipo": 2, + "imagen": { + "picto": "bocadillo" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 399, + "texto": { + "en": "pumpkin", + "es": "calabaza" + }, + "tipo": 2, + "imagen": { + "picto": "calabaza" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 400, + "texto": { + "en": "caneloni", + "es": "canelones" + }, + "tipo": 2, + "imagen": { + "picto": "canelones" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 401, + "texto": { + "en": "cappchino", + "es": "capuchino" + }, + "tipo": 2, + "imagen": { + "picto": "capuchino" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 402, + "texto": { + "en": "chestnuts", + "es": "castañas" + }, + "tipo": 2, + "imagen": { + "picto": "castanas" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 403, + "texto": { + "en": "onion", + "es": "cebolla" + }, + "tipo": 2, + "imagen": { + "picto": "cebolla" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 404, + "texto": { + "en": "cherry", + "es": "cerezas" + }, + "tipo": 2, + "imagen": { + "picto": "cerezas" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 406, + "texto": { + "en": "chupetin", + "es": "chupetin" + }, + "tipo": 2, + "imagen": { + "picto": "chupetin" + }, + "relacion": [], + "agenda": 0, + "gps": 0, + "edad": [ + "NINO" + ] + }, + { + "id": 407, + "texto": { + "en": "plum", + "es": "ciruela" + }, + "tipo": 2, + "imagen": { + "picto": "ciruela" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 408, + "texto": { + "en": "apricot", + "es": "damasco" + }, + "tipo": 2, + "imagen": { + "picto": "damasco" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 412, + "texto": { + "en": "creme caramel", + "es": "flan" + }, + "tipo": 2, + "imagen": { + "picto": "flan" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 413, + "texto": { + "en": "raspberry", + "es": "frambuesa" + }, + "tipo": 2, + "imagen": { + "picto": "frambuesas" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 414, + "texto": { + "en": "strawberry", + "es": "frutilla" + }, + "tipo": 2, + "imagen": { + "picto": "fresa" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 415, + "texto": { + "en": "cookie", + "es": "galleta" + }, + "tipo": 2, + "imagen": { + "picto": "galletas" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 417, + "texto": { + "en": "jelly", + "es": "gelatina" + }, + "tipo": 2, + "imagen": { + "picto": "gelatina" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 420, + "texto": { + "en": "boiled egg", + "es": "huevo duro" + }, + "tipo": 2, + "imagen": { + "picto": "huevo_duro" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 421, + "texto": { + "en": "fried eg", + "es": "huevo frito" + }, + "tipo": 2, + "imagen": { + "picto": "huevo_frito" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 424, + "texto": { + "en": "canned tuna", + "es": "lata de atún" + }, + "tipo": 2, + "imagen": { + "picto": "atun" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 425, + "texto": { + "en": "canned sardine", + "es": "lata de sardinas" + }, + "tipo": 2, + "imagen": { + "picto": "lata_de_sardinas" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 426, + "texto": { + "en": "milk with cacao", + "es": "leche con cacáo" + }, + "tipo": 2, + "imagen": { + "picto": "leche_con_cacao" + }, + "relacion": [], + "agenda": 0, + "gps": 0, + "edad": [ + "NINO" + ] + }, + { + "id": 427, + "texto": { + "en": "milk and cookies", + "es": "leche y galletas" + }, + "tipo": 2, + "imagen": { + "picto": "leche_y_galletas" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 428, + "texto": { + "en": "lettuce", + "es": "lechuga" + }, + "tipo": 2, + "imagen": { + "picto": "lechuga" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 430, + "texto": { + "en": "corn", + "es": "maiz" + }, + "tipo": 2, + "imagen": { + "picto": "maiz" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 431, + "texto": { + "en": "butter", + "es": "manteca" + }, + "tipo": 2, + "imagen": { + "picto": "manteca" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 432, + "texto": { + "en": "peach", + "es": "durazno" + }, + "tipo": 2, + "imagen": { + "picto": "melocoton" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 435, + "texto": { + "en": "orange", + "es": "naranja" + }, + "tipo": 2, + "imagen": { + "picto": "naranja" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 438, + "texto": { + "en": "white bread", + "es": "pan blanco" + }, + "tipo": 2, + "imagen": { + "picto": "pan_blanco" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 439, + "texto": { + "en": "black bread", + "es": "pan negro" + }, + "tipo": 2, + "imagen": { + "picto": "pan_negro" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 447, + "texto": { + "en": "grapefruit", + "es": "pomelo" + }, + "tipo": 2, + "imagen": { + "picto": "pomelo" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 449, + "texto": { + "en": "smashed potatoes", + "es": "puré" + }, + "tipo": 2, + "imagen": { + "picto": "pure" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 458, + "texto": { + "en": "sandwich", + "es": "sandwich" + }, + "tipo": 2, + "imagen": { + "picto": "sandwich" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 462, + "texto": { + "en": "pie", + "es": "tarta" + }, + "tipo": 2, + "imagen": { + "picto": "tarta" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 463, + "texto": { + "en": "tomato", + "es": "tomate" + }, + "tipo": 2, + "imagen": { + "picto": "tomate" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 465, + "texto": { + "en": "toast", + "es": "tostada" + }, + "tipo": 2, + "imagen": { + "picto": "tostada" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 468, + "texto": { + "en": "apple juice", + "es": "jugo de manzana" + }, + "tipo": 2, + "imagen": { + "picto": "zumo_de_manzana" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 469, + "texto": { + "en": "peach juice", + "es": "jugo de durazno" + }, + "tipo": 2, + "imagen": { + "picto": "melocoton" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 471, + "texto": { + "en": "grape juice", + "es": "jugo de uva" + }, + "tipo": 2, + "imagen": { + "picto": "zumo_de_uva" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 472, + "texto": { + "en": "soup", + "es": "Sopa" + }, + "tipo": 2, + "imagen": { + "picto": "sopa" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 473, + "texto": { + "en": "banana", + "es": "banana" + }, + "tipo": 2, + "imagen": { + "picto": "banana" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 474, + "texto": { + "en": "apple", + "es": "manzana" + }, + "tipo": 2, + "imagen": { + "picto": "manzana" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 475, + "texto": { + "en": "pear", + "es": "pera" + }, + "tipo": 2, + "imagen": { + "picto": "pera" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 476, + "texto": { + "en": "fish", + "es": "pescado" + }, + "tipo": 2, + "imagen": { + "picto": "zid_pescado" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 477, + "texto": { + "en": "salad", + "es": "ensalada" + }, + "tipo": 2, + "imagen": { + "picto": "zid_ensalada" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 478, + "texto": { + "en": "vegetables", + "es": "verduras" + }, + "tipo": 2, + "imagen": { + "picto": "zid_verduras" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 480, + "texto": { + "en": "pasta", + "es": "pasta" + }, + "tipo": 2, + "imagen": { + "picto": "zid_pasta" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 481, + "texto": { + "en": "rice", + "es": "arroz" + }, + "tipo": 2, + "imagen": { + "picto": "zid_arroz" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 482, + "texto": { + "en": "beef", + "es": "carne" + }, + "tipo": 2, + "imagen": { + "picto": "zid_carne" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 483, + "texto": { + "en": "fruit", + "es": "fruta" + }, + "tipo": 2, + "imagen": { + "picto": "zid_fruta" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 484, + "texto": { + "en": "yoghurt", + "es": "yogur" + }, + "tipo": 2, + "imagen": { + "picto": "zid_yogurt" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 485, + "texto": { + "en": "cake", + "es": "torta" + }, + "tipo": 2, + "imagen": { + "picto": "zid_tarta" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 486, + "texto": { + "en": "ice cream", + "es": "helado" + }, + "tipo": 2, + "imagen": { + "picto": "zid_helado" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 487, + "texto": { + "en": "oil", + "es": "aceite" + }, + "tipo": 2, + "imagen": { + "picto": "aceite" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 489, + "texto": { + "en": "salt", + "es": "sal" + }, + "tipo": 2, + "imagen": { + "picto": "sal" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 490, + "texto": { + "en": "mayo", + "es": "mayonesa" + }, + "tipo": 2, + "imagen": { + "picto": "mayonesa" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 492, + "texto": { + "en": "ketchup", + "es": "ketchup" + }, + "tipo": 2, + "imagen": { + "picto": "ketchup" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 494, + "texto": { + "en": "Candy", + "es": "Golosina" + }, + "tipo": 2, + "imagen": { + "picto": "ic_dulces" + }, + "relacion": [], + "agenda": 0, + "gps": 0, + "edad": [ + "JOVEN", + "NINO" + ] + }, + { + "id": 495, + "texto": { + "en": "milk", + "es": "leche" + }, + "tipo": 2, + "imagen": { + "picto": "leche" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 496, + "texto": { + "en": "coffee", + "es": "café" + }, + "tipo": 2, + "imagen": { + "picto": "cafe" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 497, + "texto": { + "en": "juice", + "es": "jugo" + }, + "tipo": 2, + "imagen": { + "picto": "ic_bebida" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 498, + "texto": { + "en": "chocolate", + "es": "chocolate" + }, + "tipo": 2, + "imagen": { + "picto": "chocolate" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 499, + "texto": { + "en": "te", + "es": "té" + }, + "tipo": 2, + "imagen": { + "picto": "te" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 500, + "texto": { + "en": "water", + "es": "agua" + }, + "tipo": 2, + "imagen": { + "picto": "agua" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 501, + "texto": { + "en": "soda", + "es": "gaseosa" + }, + "tipo": 2, + "imagen": { + "picto": "cocacola" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 502, + "texto": { + "en": "beer", + "es": "cerveza" + }, + "tipo": 2, + "imagen": { + "picto": "cerveza" + }, + "relacion": [], + "agenda": 0, + "gps": 0, + "edad": [ + "ADULTO" + ] + }, + { + "id": 503, + "texto": { + "en": "wine", + "es": "vino" + }, + "tipo": 2, + "imagen": { + "picto": "vino" + }, + "relacion": [], + "agenda": 0, + "gps": 0, + "edad": [ + "ADULTO" + ] + }, + { + "id": 504, + "texto": { + "en": "poultry", + "es": "pollo" + }, + "tipo": 2, + "imagen": { + "picto": "zid_pollo" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 505, + "texto": { + "en": "chicken thigh", + "es": "muslo de pollo" + }, + "tipo": 2, + "imagen": { + "picto": "muslo_de_pollo" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 507, + "texto": { + "en": "egg", + "es": "huevo" + }, + "tipo": 2, + "imagen": { + "picto": "zid_huevo" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 510, + "texto": { + "en": "fish", + "es": "pescado" + }, + "tipo": 2, + "imagen": { + "picto": "zid_pescado" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 512, + "texto": { + "en": "steak", + "es": "filete" + }, + "tipo": 2, + "imagen": { + "picto": "filete" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 515, + "texto": { + "en": "hamburguer", + "es": "hamburguesa" + }, + "tipo": 2, + "imagen": { + "picto": "hamburguesa" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 516, + "texto": { + "en": "raw ham", + "es": "jamón crudo" + }, + "tipo": 2, + "imagen": { + "picto": "jamon" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 517, + "texto": { + "en": "cooked ham", + "es": "jamón cocido" + }, + "tipo": 2, + "imagen": { + "picto": "jamon_de_york" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 521, + "texto": { + "en": "cheese", + "es": "queso" + }, + "tipo": 2, + "imagen": { + "picto": "queso" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 524, + "texto": { + "en": "sausage", + "es": "salchichas" + }, + "tipo": 2, + "imagen": { + "picto": "salchichas" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 525, + "texto": { + "en": "a", + "es": "a" + }, + "tipo": 6, + "imagen": { + "picto": "a" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 526, + "texto": { + "en": "before", + "es": "ante" + }, + "tipo": 6, + "imagen": { + "picto": "ante" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 527, + "texto": { + "en": "beneath", + "es": "bajo" + }, + "tipo": 6, + "imagen": { + "picto": "bajo_prep" + }, + "relacion": [ + { + "id": 528, + "frec": 1 + } + ], + "agenda": 0, + "gps": 0 + }, + { + "id": 528, + "texto": { + "en": "with", + "es": "con" + }, + "tipo": 6, + "imagen": { + "picto": "con_prep" + }, + "relacion": [ + { + "id": 1001, + "frec": 1 + } + ], + "agenda": 0, + "gps": 0 + }, + { + "id": 529, + "texto": { + "en": "against", + "es": "contra" + }, + "tipo": 6, + "imagen": { + "picto": "contra" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 530, + "texto": { + "en": "of", + "es": "de" + }, + "tipo": 6, + "imagen": { + "picto": "de" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 531, + "texto": { + "en": "from", + "es": "desde" + }, + "tipo": 6, + "imagen": { + "picto": "desde" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 532, + "texto": { + "en": "during", + "es": "durante" + }, + "tipo": 6, + "imagen": { + "picto": "durante" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 533, + "texto": { + "en": "in", + "es": "en" + }, + "tipo": 6, + "imagen": { + "picto": "en" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 534, + "texto": { + "en": "between", + "es": "entre" + }, + "tipo": 6, + "imagen": { + "picto": "entre" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 535, + "texto": { + "en": "towards", + "es": "hacia" + }, + "tipo": 6, + "imagen": { + "picto": "hacia" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 536, + "texto": { + "en": "until", + "es": "hasta" + }, + "tipo": 6, + "imagen": { + "picto": "hasta" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 537, + "texto": { + "en": "for", + "es": "para" + }, + "tipo": 6, + "imagen": { + "picto": "para" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 538, + "texto": { + "en": "by", + "es": "por" + }, + "tipo": 6, + "imagen": { + "picto": "por" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 539, + "texto": { + "en": "according", + "es": "según" + }, + "tipo": 6, + "imagen": { + "picto": "segun" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 540, + "texto": { + "en": "without", + "es": "sin" + }, + "tipo": 6, + "imagen": { + "picto": "sin" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 544, + "texto": { + "en": "hero", + "es": "heroe" + }, + "tipo": 2, + "imagen": { + "picto": "spiderman" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 552, + "texto": { + "en": "story", + "es": "cuento" + }, + "tipo": 2, + "imagen": { + "picto": "cuento" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 553, + "texto": { + "en": "book", + "es": "libro" + }, + "tipo": 2, + "imagen": { + "picto": "libro" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 554, + "texto": { + "en": "movie", + "es": "película" + }, + "tipo": 2, + "imagen": { + "picto": "pelicula" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 557, + "texto": { + "en": "in love", + "es": "enamorado" + }, + "tipo": 4, + "imagen": { + "picto": "enamorados" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 560, + "texto": { + "en": "cartoons", + "es": "dibujos animados" + }, + "tipo": 2, + "imagen": { + "picto": "ic_dibujos_animados" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 561, + "texto": { + "en": "ticket", + "es": "entrada" + }, + "tipo": 2, + "imagen": { + "picto": "ic_entrada" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 563, + "texto": { + "en": "row", + "es": "fila" + }, + "tipo": 2, + "imagen": { + "picto": "fila" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 564, + "texto": { + "en": "drink", + "es": "bebida" + }, + "tipo": 2, + "imagen": { + "picto": "bebida" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 565, + "texto": { + "en": "popcorn", + "es": "pochoclos" + }, + "tipo": 2, + "imagen": { + "picto": "ic_palomitas" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 567, + "texto": { + "en": "money", + "es": "dinero" + }, + "tipo": 2, + "imagen": { + "picto": "ic_dinero" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 568, + "texto": { + "en": "remote", + "es": "control remoto" + }, + "tipo": 2, + "imagen": { + "picto": "ic_control_remoto" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 572, + "texto": { + "en": "news", + "es": "noticias" + }, + "tipo": 2, + "imagen": { + "picto": "ic_canal_noticiero" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 573, + "texto": { + "en": "music", + "es": "música" + }, + "tipo": 2, + "imagen": { + "picto": "ic_escuchar_musica" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 575, + "texto": { + "en": "cooking channel", + "es": "canal de cocina" + }, + "tipo": 2, + "imagen": { + "picto": "programa_de_cocina" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 580, + "texto": { + "en": "cartoons", + "es": "dibujos animados" + }, + "tipo": 2, + "imagen": { + "picto": "ic_canal_dibujos_animados" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 583, + "texto": { + "en": "sport channel", + "es": "deportes" + }, + "tipo": 2, + "imagen": { + "picto": "ic_canal_deportes" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 587, + "texto": { + "en": "How much is it?", + "es": "¿cuánto sale?" + }, + "tipo": 2, + "imagen": { + "picto": "ic_precio" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 588, + "texto": { + "en": "invoice", + "es": "factura" + }, + "tipo": 2, + "imagen": { + "picto": "factura" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 589, + "texto": { + "en": "lunch", + "es": "almuerzo" + }, + "tipo": 2, + "imagen": { + "picto": "ic_almuerzo" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 590, + "texto": { + "en": "dinner", + "es": "cena" + }, + "tipo": 2, + "imagen": { + "picto": "ic_cena" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 594, + "texto": { + "en": "breakfast", + "es": "desayuno" + }, + "tipo": 2, + "imagen": { + "picto": "ic_desayuno" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 595, + "texto": { + "en": "Where?", + "es": "¿Dónde es?" + }, + "tipo": 6, + "imagen": { + "picto": "donde" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 597, + "texto": { + "en": "hungry", + "es": "hambre" + }, + "tipo": 2, + "imagen": { + "picto": "ic_hambre" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 598, + "texto": { + "en": "afternoon snack", + "es": "merienda" + }, + "tipo": 2, + "imagen": { + "picto": "ic_merienda" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 599, + "texto": { + "en": "dish", + "es": "plato" + }, + "tipo": 2, + "imagen": { + "picto": "plato" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 600, + "texto": { + "en": "desert", + "es": "postre" + }, + "tipo": 2, + "imagen": { + "picto": "postre" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 602, + "texto": { + "en": "What time is it?", + "es": "¿Qué hora es?" + }, + "tipo": 5, + "imagen": { + "picto": "que_hora_es" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 604, + "texto": { + "en": "napkin", + "es": "servilletas" + }, + "tipo": 2, + "imagen": { + "picto": "servilleta" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 605, + "texto": { + "en": "glass", + "es": "vaso" + }, + "tipo": 2, + "imagen": { + "picto": "vaso" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 606, + "texto": { + "en": "plane", + "es": "avión" + }, + "tipo": 2, + "imagen": { + "picto": "avion" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 607, + "texto": { + "en": "Bus", + "es": "autobús" + }, + "tipo": 2, + "imagen": { + "picto": "autobus" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 608, + "texto": { + "en": "car", + "es": "coche" + }, + "tipo": 2, + "imagen": { + "picto": "coche" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 609, + "texto": { + "en": "Metro", + "es": "metro" + }, + "tipo": 2, + "imagen": { + "picto": "metro" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 610, + "texto": { + "en": "taxi", + "es": "taxi" + }, + "tipo": 2, + "imagen": { + "picto": "taxi" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 611, + "texto": { + "en": "transportation", + "es": "transportes" + }, + "tipo": 2, + "imagen": { + "picto": "transportes" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 614, + "texto": { + "en": "grandpa", + "es": "abuelo" + }, + "tipo": 1, + "imagen": { + "picto": "ic_abuelo" + }, + "relacion": [ + { + "id": 22, + "frec": 4 + }, + { + "id": 14, + "frec": 1 + }, + { + "id": 44, + "frec": 1 + }, + { + "id": 49, + "frec": 1 + }, + { + "id": 378, + "frec": 1 + } + ], + "agenda": 0, + "gps": 0 + }, + { + "id": 615, + "texto": { + "en": "friends", + "es": "amigos" + }, + "tipo": 1, + "imagen": { + "picto": "ic_amigos" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 617, + "texto": { + "en": "Butcher", + "es": "carnicero" + }, + "tipo": 1, + "imagen": { + "picto": "carnicero" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 619, + "texto": { + "en": "chef", + "es": "cocinero" + }, + "tipo": 1, + "imagen": { + "picto": "cocinero" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 620, + "texto": { + "en": "team", + "es": "equipo" + }, + "tipo": 1, + "imagen": { + "picto": "equipo" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 621, + "texto": { + "en": "family", + "es": "familia" + }, + "tipo": 1, + "imagen": { + "picto": "ic_familia" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 622, + "texto": { + "en": "futbol player", + "es": "futbolista" + }, + "tipo": 1, + "imagen": { + "picto": "ic_futbolista" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 623, + "texto": { + "en": "brother", + "es": "hermano" + }, + "tipo": 1, + "imagen": { + "picto": "ic_hermano" + }, + "relacion": [ + { + "id": 22, + "frec": 1 + }, + { + "id": 49, + "frec": 1 + }, + { + "id": 44, + "frec": 1 + }, + { + "id": 14, + "frec": 1 + }, + { + "id": 378, + "frec": 1 + } + ], + "agenda": 0, + "gps": 0 + }, + { + "id": 624, + "texto": { + "en": "sister", + "es": "hermana" + }, + "tipo": 1, + "imagen": { + "picto": "hermana" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 626, + "texto": { + "en": "teacher", + "es": "maestra" + }, + "tipo": 1, + "imagen": { + "picto": "ic_maestra" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 627, + "texto": { + "en": "teacher", + "es": "maestro" + }, + "tipo": 1, + "imagen": { + "picto": "maestro" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 628, + "texto": { + "en": "mom", + "es": "mamá" + }, + "tipo": 1, + "imagen": { + "picto": "ic_mama" + }, + "relacion": [ + { + "id": 44, + "frec": 18 + }, + { + "id": 22, + "frec": 4 + }, + { + "id": 49, + "frec": 6 + }, + { + "id": 378, + "frec": 6 + }, + { + "id": 14, + "frec": 10 + } + ], + "agenda": 0, + "gps": 0 + }, + { + "id": 629, + "texto": { + "en": "medic", + "es": "médico" + }, + "tipo": 1, + "imagen": { + "picto": "ic_medico" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 630, + "texto": { + "en": "boy", + "es": "niño" + }, + "tipo": 1, + "imagen": { + "picto": "nino" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 631, + "texto": { + "en": "girl", + "es": "niña" + }, + "tipo": 1, + "imagen": { + "picto": "nina" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 632, + "texto": { + "en": "dad", + "es": "papá" + }, + "tipo": 1, + "imagen": { + "picto": "ic_papa" + }, + "relacion": [ + { + "id": 44, + "frec": 16 + }, + { + "id": 22, + "frec": 5 + }, + { + "id": 378, + "frec": 1 + }, + { + "id": 14, + "frec": 1 + } + ], + "agenda": 0, + "gps": 0 + }, + { + "id": 633, + "texto": { + "en": "people", + "es": "personas" + }, + "tipo": 1, + "imagen": { + "picto": "personas" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 635, + "texto": { + "en": "princess", + "es": "princesa" + }, + "tipo": 1, + "imagen": { + "picto": "princesa" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 638, + "texto": { + "en": "Queen", + "es": "reina" + }, + "tipo": 1, + "imagen": { + "picto": "reina" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 639, + "texto": { + "en": "King", + "es": "rey" + }, + "tipo": 1, + "imagen": { + "picto": "rey" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 640, + "texto": { + "en": "taxi driver", + "es": "taxista" + }, + "tipo": 1, + "imagen": { + "picto": "taxista" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 642, + "texto": { + "en": "you", + "es": "vos" + }, + "tipo": 1, + "imagen": { + "picto": "ic_tu" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 643, + "texto": { + "en": "I", + "es": "yo" + }, + "tipo": 1, + "imagen": { + "picto": "ic_yo" + }, + "relacion": [ + { + "id": 22, + "frec": 4 + }, + { + "id": 44, + "frec": 20 + }, + { + "id": 49, + "frec": 10 + } + ], + "agenda": 0, + "gps": 0 + }, + { + "id": 644, + "texto": { + "en": "here", + "es": "acá" + }, + "tipo": 2, + "imagen": { + "picto": "ic_aca" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 646, + "texto": { + "en": "airport", + "es": "aeropuerto" + }, + "tipo": 2, + "imagen": { + "picto": "aeropuerto" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 648, + "texto": { + "en": "there", + "es": "allá" + }, + "tipo": 2, + "imagen": { + "picto": "ic_alla" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 649, + "texto": { + "en": "Pub", + "es": "bar" + }, + "tipo": 2, + "imagen": { + "picto": "bar" + }, + "relacion": [], + "agenda": 0, + "gps": 0, + "edad": [ + "ADULTO" + ] + }, + { + "id": 650, + "texto": { + "en": "bike shop", + "es": "una bicicletería" + }, + "tipo": 2, + "imagen": { + "picto": "tienda_de_bicicletas" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 651, + "texto": { + "en": "field", + "es": "la cancha" + }, + "tipo": 2, + "imagen": { + "picto": "cancha" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 653, + "texto": { + "en": "house", + "es": "casa" + }, + "tipo": 2, + "imagen": { + "picto": "ic_casa" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 656, + "texto": { + "en": "city", + "es": "ciudad" + }, + "tipo": 2, + "imagen": { + "picto": "ciudad" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 657, + "texto": { + "en": "dinning room", + "es": "comedor" + }, + "tipo": 2, + "imagen": { + "picto": "ic_comedor" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 660, + "texto": { + "en": "bathroom", + "es": "cuarto de baño" + }, + "tipo": 2, + "imagen": { + "picto": "ic_lugarbanio" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 661, + "texto": { + "en": "disco", + "es": "la discoteca" + }, + "tipo": 2, + "imagen": { + "picto": "discoteca" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 662, + "texto": { + "en": "school", + "es": "escuela" + }, + "tipo": 2, + "imagen": { + "picto": "ic_escuela" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 666, + "texto": { + "en": "Burger shop", + "es": "hamburguesería" + }, + "tipo": 2, + "imagen": { + "picto": "hamburgueseria" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 668, + "texto": { + "en": "hospital", + "es": "hospital" + }, + "tipo": 2, + "imagen": { + "picto": "hospital" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 672, + "texto": { + "en": "garden", + "es": "jardín" + }, + "tipo": 2, + "imagen": { + "picto": "jardin" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 675, + "texto": { + "en": "market", + "es": "mercado" + }, + "tipo": 2, + "imagen": { + "picto": "mercado" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 678, + "texto": { + "en": "yard", + "es": "patio" + }, + "tipo": 2, + "imagen": { + "picto": "ic_patio" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 679, + "texto": { + "en": "Pizza shop", + "es": "pizzería" + }, + "tipo": 2, + "imagen": { + "picto": "pizzeria" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 680, + "texto": { + "en": "Poultry shop", + "es": "pollería" + }, + "tipo": 2, + "imagen": { + "picto": "polleria" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 682, + "texto": { + "en": "square", + "es": "la plaza" + }, + "tipo": 2, + "imagen": { + "picto": "plaza" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 685, + "texto": { + "en": "Restaurant", + "es": "restaurante" + }, + "tipo": 2, + "imagen": { + "picto": "restaurante" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 687, + "texto": { + "en": "traffic light", + "es": "semáforo" + }, + "tipo": 2, + "imagen": { + "picto": "semaforo" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 688, + "texto": { + "en": "supermarket", + "es": "un supermercado" + }, + "tipo": 2, + "imagen": { + "picto": "supermercado" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 698, + "texto": { + "en": "greengrocery", + "es": "verdulería" + }, + "tipo": 2, + "imagen": { + "picto": "verduleria" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 700, + "texto": { + "en": "Blockbuster", + "es": "videoclub" + }, + "tipo": 2, + "imagen": { + "picto": "videoclub" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 702, + "texto": { + "en": "friendship", + "es": "amistad" + }, + "tipo": 6, + "imagen": { + "picto": "amistad" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 703, + "texto": { + "en": "help", + "es": "ayuda" + }, + "tipo": 6, + "imagen": { + "picto": "ayuda" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 704, + "texto": { + "en": "celebration", + "es": "celebración" + }, + "tipo": 6, + "imagen": { + "picto": "celebracion" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 706, + "texto": { + "en": "fulfillment", + "es": "cumplimiento" + }, + "tipo": 6, + "imagen": { + "picto": "cumplimiento" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 707, + "texto": { + "en": "description", + "es": "descripción" + }, + "tipo": 6, + "imagen": { + "picto": "descripcion" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 708, + "texto": { + "en": "Personal hygiene", + "es": "higiene personal" + }, + "tipo": 6, + "imagen": { + "picto": "higiene_personal" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 712, + "texto": { + "en": "physical abuse", + "es": "maltrato físico" + }, + "tipo": 6, + "imagen": { + "picto": "maltrato_fisico" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 713, + "texto": { + "en": "verbal abuse", + "es": "maltrato verbal" + }, + "tipo": 6, + "imagen": { + "picto": "maltrato_verbal" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 714, + "texto": { + "en": "plural", + "es": "plurales" + }, + "tipo": 6, + "imagen": { + "picto": "plurales" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 718, + "texto": { + "en": "rehab", + "es": "rehabilitación" + }, + "tipo": 6, + "imagen": { + "picto": "rehabilitacion" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 721, + "texto": { + "en": "series", + "es": "serie" + }, + "tipo": 6, + "imagen": { + "picto": "serie" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 722, + "texto": { + "en": "feelings", + "es": "sentimientos" + }, + "tipo": 6, + "imagen": { + "picto": "sentimientos" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 725, + "texto": { + "en": "surprise", + "es": "sorpresa" + }, + "tipo": 6, + "imagen": { + "picto": "sorpresa" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 728, + "texto": { + "en": "verbs", + "es": "verbos" + }, + "tipo": 2, + "imagen": { + "picto": "verbos" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 729, + "texto": { + "en": "shame", + "es": "verguenza" + }, + "tipo": 6, + "imagen": { + "picto": "verguenza" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 730, + "texto": { + "en": "life", + "es": "vida" + }, + "tipo": 6, + "imagen": { + "picto": "vida" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 731, + "texto": { + "en": "visit", + "es": "visita" + }, + "tipo": 6, + "imagen": { + "picto": "visita" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 732, + "texto": { + "en": "tour", + "es": "paseo" + }, + "tipo": 6, + "imagen": { + "picto": "paseo" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 733, + "texto": { + "en": "Yellow", + "es": "amarillo" + }, + "tipo": 4, + "imagen": { + "picto": "ic_amarillo" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 734, + "texto": { + "en": "Blue", + "es": "azul" + }, + "tipo": 4, + "imagen": { + "picto": "ic_azul" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 736, + "texto": { + "en": "White", + "es": "blanco" + }, + "tipo": 4, + "imagen": { + "picto": "ic_blanco" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 737, + "texto": { + "en": "Colors", + "es": "colores" + }, + "tipo": 2, + "imagen": { + "picto": "ic_colores" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 738, + "texto": { + "en": "Gold", + "es": "dorado" + }, + "tipo": 4, + "imagen": { + "picto": "dorado" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 739, + "texto": { + "en": "Gray", + "es": "gris" + }, + "tipo": 4, + "imagen": { + "picto": "ic_gris" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 740, + "texto": { + "en": "Purple", + "es": "lila" + }, + "tipo": 4, + "imagen": { + "picto": "lila" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 742, + "texto": { + "en": "Orange", + "es": "naranja" + }, + "tipo": 4, + "imagen": { + "picto": "ic_naranja" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 743, + "texto": { + "en": "Black", + "es": "negro" + }, + "tipo": 4, + "imagen": { + "picto": "ic_negro" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 744, + "texto": { + "en": "Silver", + "es": "plateado" + }, + "tipo": 4, + "imagen": { + "picto": "plateado" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 745, + "texto": { + "en": "What color it is?", + "es": "¿Qué color es?" + }, + "tipo": 5, + "imagen": { + "picto": "color_pregunta" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 746, + "texto": { + "en": "Red", + "es": "rojo" + }, + "tipo": 4, + "imagen": { + "picto": "ic_rojo" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 747, + "texto": { + "en": "Pink", + "es": "rosa" + }, + "tipo": 4, + "imagen": { + "picto": "ic_rosa" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 748, + "texto": { + "en": "Violet", + "es": "violeta" + }, + "tipo": 4, + "imagen": { + "picto": "ic_violeta" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 749, + "texto": { + "en": "Green", + "es": "verde" + }, + "tipo": 4, + "imagen": { + "picto": "ic_verde" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 750, + "texto": { + "en": "Light green", + "es": "verde Claro" + }, + "tipo": 4, + "imagen": { + "picto": "verde_claro" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 751, + "texto": { + "en": "agenda", + "es": "agenda" + }, + "tipo": 2, + "imagen": { + "picto": "ic_agenda" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 752, + "texto": { + "en": "wallet", + "es": "billetera" + }, + "tipo": 2, + "imagen": { + "picto": "ic_billetera" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 753, + "texto": { + "en": "pencil case", + "es": "cartuchera" + }, + "tipo": 2, + "imagen": { + "picto": "ic_cartuchera" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 754, + "texto": { + "en": "Lessons", + "es": "clases" + }, + "tipo": 2, + "imagen": { + "picto": "ic_clases" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 755, + "texto": { + "en": "computer", + "es": "computadora" + }, + "tipo": 2, + "imagen": { + "picto": "ic_computadora" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 756, + "texto": { + "en": "Crayon", + "es": "crayones" + }, + "tipo": 2, + "imagen": { + "picto": "ic_pinturas_de_colores" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 757, + "texto": { + "en": "notebook", + "es": "cuaderno" + }, + "tipo": 2, + "imagen": { + "picto": "ic_cuaderno" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 758, + "texto": { + "en": "room", + "es": "cuarto" + }, + "tipo": 2, + "imagen": { + "picto": "ic_cuarto" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 760, + "texto": { + "en": "eraser", + "es": "goma" + }, + "tipo": 2, + "imagen": { + "picto": "ic_goma" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 761, + "texto": { + "en": "toy", + "es": "el juguete" + }, + "tipo": 2, + "imagen": { + "picto": "ic_jueguete" + }, + "relacion": [ + { + "id": 734, + "frec": 3 + }, + { + "id": 743, + "frec": 1 + }, + { + "id": 747, + "frec": 1 + }, + { + "id": 736, + "frec": 1 + } + ], + "agenda": 0, + "gps": 0 + }, + { + "id": 762, + "texto": { + "en": "pencil", + "es": "lapiz" + }, + "tipo": 2, + "imagen": { + "picto": "ic_lapices_de_colores" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 766, + "texto": { + "en": "paper", + "es": "papel" + }, + "tipo": 2, + "imagen": { + "picto": "ic_papel" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 767, + "texto": { + "en": "ball", + "es": "pelota" + }, + "tipo": 2, + "imagen": { + "picto": "ic_pelotas" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 768, + "texto": { + "en": "glue", + "es": "pegamento" + }, + "tipo": 2, + "imagen": { + "picto": "ic_pegamento" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 769, + "texto": { + "en": "brush", + "es": "pincel" + }, + "tipo": 2, + "imagen": { + "picto": "ic_pincel" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 770, + "texto": { + "en": "blackboard", + "es": "pizarrón" + }, + "tipo": 2, + "imagen": { + "picto": "ic_pizarron" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 771, + "texto": { + "en": "art class", + "es": "plástica" + }, + "tipo": 2, + "imagen": { + "picto": "ic_plastica" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 772, + "texto": { + "en": "magazines", + "es": "revistas" + }, + "tipo": 2, + "imagen": { + "picto": "ic_revistas" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 773, + "texto": { + "en": "TV", + "es": "la televisión" + }, + "tipo": 2, + "imagen": { + "picto": "ic_televisor" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 774, + "texto": { + "en": "tablet", + "es": "la tablet" + }, + "tipo": 2, + "imagen": { + "picto": "ic_tablet" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 776, + "texto": { + "en": "armpit", + "es": "axila" + }, + "tipo": 2, + "imagen": { + "picto": "sobacos" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 777, + "texto": { + "en": "mouth", + "es": "boca" + }, + "tipo": 2, + "imagen": { + "picto": "boca" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 778, + "texto": { + "en": "arm", + "es": "brazo" + }, + "tipo": 2, + "imagen": { + "picto": "brazo" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 780, + "texto": { + "en": "elbow", + "es": "codo" + }, + "tipo": 2, + "imagen": { + "picto": "codo" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 781, + "texto": { + "en": "neck", + "es": "cuello" + }, + "tipo": 2, + "imagen": { + "picto": "cuello" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 782, + "texto": { + "en": "finger", + "es": "dedos" + }, + "tipo": 2, + "imagen": { + "picto": "dedos" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 783, + "texto": { + "en": "bone", + "es": "hueso" + }, + "tipo": 2, + "imagen": { + "picto": "huesos" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 784, + "texto": { + "en": "shoulder", + "es": "hombro" + }, + "tipo": 2, + "imagen": { + "picto": "hombro" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 785, + "texto": { + "en": "tongue", + "es": "lengua" + }, + "tipo": 2, + "imagen": { + "picto": "lengua" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 786, + "texto": { + "en": "hand", + "es": "mano" + }, + "tipo": 2, + "imagen": { + "picto": "mano" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 787, + "texto": { + "en": "snot", + "es": "moco" + }, + "tipo": 2, + "imagen": { + "picto": "moco" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 788, + "texto": { + "en": "wrist", + "es": "muñeca" + }, + "tipo": 2, + "imagen": { + "picto": "munieca" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 789, + "texto": { + "en": "butt", + "es": "nalgas" + }, + "tipo": 2, + "imagen": { + "picto": "nalgas" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 790, + "texto": { + "en": "nose", + "es": "nariz" + }, + "tipo": 2, + "imagen": { + "picto": "nariz" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 791, + "texto": { + "en": "eyes", + "es": "ojos" + }, + "tipo": 2, + "imagen": { + "picto": "ojos" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 792, + "texto": { + "en": "belly button", + "es": "ombligo" + }, + "tipo": 2, + "imagen": { + "picto": "ombligo" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 793, + "texto": { + "en": "ear", + "es": "oreja" + }, + "tipo": 2, + "imagen": { + "picto": "oreja" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 794, + "texto": { + "en": "organs", + "es": "órganos" + }, + "tipo": 2, + "imagen": { + "picto": "organos" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 795, + "texto": { + "en": "belly", + "es": "panza" + }, + "tipo": 2, + "imagen": { + "picto": "barriga" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 797, + "texto": { + "en": "chest", + "es": "pecho" + }, + "tipo": 2, + "imagen": { + "picto": "pecho" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 799, + "texto": { + "en": "foot", + "es": "pie" + }, + "tipo": 2, + "imagen": { + "picto": "pie" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 800, + "texto": { + "en": "lung", + "es": "pulmones" + }, + "tipo": 2, + "imagen": { + "picto": "pulmones" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 802, + "texto": { + "en": "knee", + "es": "rodilla" + }, + "tipo": 2, + "imagen": { + "picto": "rodilla" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 803, + "texto": { + "en": "saliva", + "es": "saliva" + }, + "tipo": 2, + "imagen": { + "picto": "saliva" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 804, + "texto": { + "en": "blood", + "es": "sangre" + }, + "tipo": 2, + "imagen": { + "picto": "sangre" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 806, + "texto": { + "en": "boobs", + "es": "tetas" + }, + "tipo": 2, + "imagen": { + "picto": "tetas" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 807, + "texto": { + "en": "ankle", + "es": "tobillos" + }, + "tipo": 2, + "imagen": { + "picto": "tobillo" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 809, + "texto": { + "en": "nail", + "es": "uña" + }, + "tipo": 2, + "imagen": { + "picto": "unia" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 810, + "texto": { + "en": "before", + "es": "antes" + }, + "tipo": 6, + "imagen": { + "picto": "antes" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 811, + "texto": { + "en": "yesterday", + "es": "ayer" + }, + "tipo": 6, + "imagen": { + "picto": "ayer" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 812, + "texto": { + "en": "after", + "es": "despues" + }, + "tipo": 6, + "imagen": { + "picto": "despues" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 815, + "texto": { + "en": "tomorrow", + "es": "mañana" + }, + "tipo": 6, + "imagen": { + "picto": "maniana" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 816, + "texto": { + "en": "fall", + "es": "otoño" + }, + "tipo": 2, + "imagen": { + "picto": "otonio" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 817, + "texto": { + "en": "spring", + "es": "primavera" + }, + "tipo": 2, + "imagen": { + "picto": "primavera" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 818, + "texto": { + "en": "summer", + "es": "verano" + }, + "tipo": 2, + "imagen": { + "picto": "verano" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 819, + "texto": { + "en": "sick", + "es": "enfermo" + }, + "tipo": 4, + "imagen": { + "picto": "enfermo" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 820, + "texto": { + "en": "diarrhea", + "es": "diarrea" + }, + "tipo": 2, + "imagen": { + "picto": "zid_diarrea" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 821, + "texto": { + "en": "pain", + "es": "dolor" + }, + "tipo": 2, + "imagen": { + "picto": "zid_dolor" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 822, + "texto": { + "en": "toothache", + "es": "dolor de muela" + }, + "tipo": 2, + "imagen": { + "picto": "zid_dolor_de_muela" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 823, + "texto": { + "en": "chest pain", + "es": "dolor de pecho" + }, + "tipo": 2, + "imagen": { + "picto": "zid_dolor_de_pecho" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 824, + "texto": { + "en": "earache", + "es": "dolor de Oido" + }, + "tipo": 2, + "imagen": { + "picto": "zid_dolor_de_oido" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 825, + "texto": { + "en": "stomachache", + "es": "dolor de Panza" + }, + "tipo": 2, + "imagen": { + "picto": "zid_dolor_de_espalda" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 826, + "texto": { + "en": "throat sore", + "es": "dolor de Garganta" + }, + "tipo": 2, + "imagen": { + "picto": "zid_dolor_de_garganta" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 827, + "texto": { + "en": "headache", + "es": "dolor de cabeza" + }, + "tipo": 2, + "imagen": { + "picto": "zid_dolor_de_cabeza" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 828, + "texto": { + "en": "constipation", + "es": "estreñimiento" + }, + "tipo": 2, + "imagen": { + "picto": "estrenimiento" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 829, + "texto": { + "en": "flu", + "es": "gripe" + }, + "tipo": 2, + "imagen": { + "picto": "zid_gripe" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 831, + "texto": { + "en": "cold", + "es": "resfrío" + }, + "tipo": 2, + "imagen": { + "picto": "zid_resfriado" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 834, + "texto": { + "en": "football match", + "es": "partido de fútbol" + }, + "tipo": 2, + "imagen": { + "picto": "ic_partido" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 835, + "texto": { + "en": "Football", + "es": "fútbol" + }, + "tipo": 2, + "imagen": { + "picto": "ic_futbol" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 836, + "texto": { + "en": "one", + "es": "uno" + }, + "tipo": 6, + "imagen": { + "picto": "uno" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 837, + "texto": { + "en": "two", + "es": "dos" + }, + "tipo": 6, + "imagen": { + "picto": "dos" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 838, + "texto": { + "en": "three", + "es": "tres" + }, + "tipo": 6, + "imagen": { + "picto": "tres" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 839, + "texto": { + "en": "four", + "es": "cuatro" + }, + "tipo": 6, + "imagen": { + "picto": "cuatro" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 840, + "texto": { + "en": "five", + "es": "cinco" + }, + "tipo": 6, + "imagen": { + "picto": "cinco" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 841, + "texto": { + "en": "six", + "es": "seis" + }, + "tipo": 6, + "imagen": { + "picto": "seis" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 842, + "texto": { + "en": "seven", + "es": "siete" + }, + "tipo": 6, + "imagen": { + "picto": "siete" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 843, + "texto": { + "en": "eight", + "es": "ocho" + }, + "tipo": 6, + "imagen": { + "picto": "ocho" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 844, + "texto": { + "en": "nine", + "es": "nueve" + }, + "tipo": 6, + "imagen": { + "picto": "nueve" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 845, + "texto": { + "en": "ten", + "es": "diez" + }, + "tipo": 6, + "imagen": { + "picto": "diez" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 846, + "texto": { + "en": "zero", + "es": "cero" + }, + "tipo": 6, + "imagen": { + "picto": "cero" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 850, + "texto": { + "en": "minim", + "es": "blanca" + }, + "tipo": 2, + "imagen": { + "picto": "blanca" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 851, + "texto": { + "en": "peruvian box", + "es": "el cajón" + }, + "tipo": 2, + "imagen": { + "picto": "cajon" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 853, + "texto": { + "en": "chore", + "es": "el coro" + }, + "tipo": 2, + "imagen": { + "picto": "coro" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 855, + "texto": { + "en": "guitar", + "es": "la guitarra" + }, + "tipo": 2, + "imagen": { + "picto": "guitarra" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 857, + "texto": { + "en": "musical instruments", + "es": "los instrumentos musicales" + }, + "tipo": 2, + "imagen": { + "picto": "instrumentos" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 860, + "texto": { + "en": "music lesson", + "es": "música" + }, + "tipo": 2, + "imagen": { + "picto": "ic_musica_id" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 865, + "texto": { + "en": "piano", + "es": "el piano" + }, + "tipo": 2, + "imagen": { + "picto": "piano" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 870, + "texto": { + "en": "drum", + "es": "el tambor" + }, + "tipo": 2, + "imagen": { + "picto": "tambor" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 871, + "texto": { + "en": "triangle", + "es": "el triángulo" + }, + "tipo": 2, + "imagen": { + "picto": "triangulo" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 874, + "texto": { + "en": "trumpet", + "es": "la trompeta" + }, + "tipo": 2, + "imagen": { + "picto": "trompeta" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 876, + "texto": { + "en": "violin", + "es": "el violín" + }, + "tipo": 2, + "imagen": { + "picto": "violin" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 878, + "texto": { + "en": "aspirine", + "es": "aspirina" + }, + "tipo": 2, + "imagen": { + "picto": "ic_aspirina" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 881, + "texto": { + "en": "descongestant", + "es": "descongestivo" + }, + "tipo": 2, + "imagen": { + "picto": "ic_descongestivo" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 882, + "texto": { + "en": "digestive", + "es": "digestivo" + }, + "tipo": 2, + "imagen": { + "picto": "ic_digestivo" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 884, + "texto": { + "en": "syrup", + "es": "jarabe" + }, + "tipo": 2, + "imagen": { + "picto": "jarabe" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 885, + "texto": { + "en": "nebulizer", + "es": "nebulizador" + }, + "tipo": 2, + "imagen": { + "picto": "nebulizador" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 886, + "texto": { + "en": "pills", + "es": "pastillas" + }, + "tipo": 2, + "imagen": { + "picto": "pastillas" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 887, + "texto": { + "en": "bandage", + "es": "venda" + }, + "tipo": 2, + "imagen": { + "picto": "venda" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 889, + "texto": { + "en": "although", + "es": "aunque" + }, + "tipo": 6, + "imagen": { + "picto": "aunque" + }, + "relacion": [ + { + "id": 22, + "frec": 3 + } + ], + "agenda": 0, + "gps": 0 + }, + { + "id": 890, + "texto": { + "en": "which?", + "es": "¿Cuál?" + }, + "tipo": 6, + "imagen": { + "picto": "cual" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 891, + "texto": { + "en": "anyone", + "es": "cualquiera" + }, + "tipo": 6, + "imagen": { + "picto": "cualquier" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 892, + "texto": { + "en": "when?", + "es": "¿Cuándo?" + }, + "tipo": 6, + "imagen": { + "picto": "cuando" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 893, + "texto": { + "en": "how many?", + "es": "¿Cuántos?" + }, + "tipo": 6, + "imagen": { + "picto": "cuantos" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 894, + "texto": { + "en": "how much", + "es": "¿Cuántas?" + }, + "tipo": 6, + "imagen": { + "picto": "cuantos" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 895, + "texto": { + "en": "his", + "es": "del" + }, + "tipo": 6, + "imagen": { + "picto": "del" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 896, + "texto": { + "en": "hers", + "es": "del" + }, + "tipo": 6, + "imagen": { + "picto": "del" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 897, + "texto": { + "en": "its", + "es": "del" + }, + "tipo": 6, + "imagen": { + "picto": "del" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 898, + "texto": { + "en": "and", + "es": "e" + }, + "tipo": 6, + "imagen": { + "picto": "e" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 899, + "texto": { + "en": "he", + "es": "el" + }, + "tipo": 6, + "imagen": { + "picto": "el" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 900, + "texto": { + "en": "she", + "es": "la" + }, + "tipo": 6, + "imagen": { + "picto": "el" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 901, + "texto": { + "en": "I like", + "es": "me gusta" + }, + "tipo": 6, + "imagen": { + "picto": "gustar" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 903, + "texto": { + "en": "no one", + "es": "nadie" + }, + "tipo": 6, + "imagen": { + "picto": "nadie" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 904, + "texto": { + "en": "neither", + "es": "ni" + }, + "tipo": 6, + "imagen": { + "picto": "ni" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 905, + "texto": { + "en": "none", + "es": "ninguno" + }, + "tipo": 6, + "imagen": { + "picto": "ningunos" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 906, + "texto": { + "en": "none", + "es": "ninguna" + }, + "tipo": 6, + "imagen": { + "picto": "ningunos" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 907, + "texto": { + "en": "I don't like", + "es": "no me gusta" + }, + "tipo": 6, + "imagen": { + "picto": "no_gustar" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 910, + "texto": { + "en": "or", + "es": "o" + }, + "tipo": 6, + "imagen": { + "picto": "o" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 911, + "texto": { + "en": "who?", + "es": "quien?" + }, + "tipo": 6, + "imagen": { + "picto": "quien_es" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 912, + "texto": { + "en": "that", + "es": "que" + }, + "tipo": 6, + "imagen": { + "picto": "que" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 913, + "texto": { + "en": "what?", + "es": "¿Qué?" + }, + "tipo": 6, + "imagen": { + "picto": "que_pregunta" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 914, + "texto": { + "en": "who?", + "es": "¿Quién?" + }, + "tipo": 6, + "imagen": { + "picto": "quien" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 915, + "texto": { + "en": "who?", + "es": "¿Quiénes?" + }, + "tipo": 6, + "imagen": { + "picto": "quienes" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 918, + "texto": { + "en": "theirs", + "es": "suyos" + }, + "tipo": 6, + "imagen": { + "picto": "suyos" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 919, + "texto": { + "en": "yours", + "es": "tuyo" + }, + "tipo": 6, + "imagen": { + "picto": "tuya" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 920, + "texto": { + "en": "yours", + "es": "tuya" + }, + "tipo": 6, + "imagen": { + "picto": "tuya" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 923, + "texto": { + "en": "and", + "es": "y" + }, + "tipo": 6, + "imagen": { + "picto": "y" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 924, + "texto": { + "en": "overcoat", + "es": "abrigo" + }, + "tipo": 2, + "imagen": { + "picto": "abrigos" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 928, + "texto": { + "en": "bikini", + "es": "bikini" + }, + "tipo": 2, + "imagen": { + "picto": "bikinis" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 930, + "texto": { + "en": "bag", + "es": "bolsa" + }, + "tipo": 2, + "imagen": { + "picto": "bolsa" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 931, + "texto": { + "en": "boot", + "es": "bota" + }, + "tipo": 2, + "imagen": { + "picto": "bota" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 934, + "texto": { + "en": "button", + "es": "botones" + }, + "tipo": 2, + "imagen": { + "picto": "botones" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 936, + "texto": { + "en": "scarf", + "es": "bufanda" + }, + "tipo": 2, + "imagen": { + "picto": "bufandas" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 938, + "texto": { + "en": "footwear", + "es": "calzado" + }, + "tipo": 2, + "imagen": { + "picto": "calzado" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 939, + "texto": { + "en": "shirt", + "es": "camisa" + }, + "tipo": 2, + "imagen": { + "picto": "camisas" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 940, + "texto": { + "en": "long sleeve", + "es": "camiseta manga larga" + }, + "tipo": 2, + "imagen": { + "picto": "camiseta_de_manga_larga" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 941, + "texto": { + "en": "jacket", + "es": "campera" + }, + "tipo": 2, + "imagen": { + "picto": "campera" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 951, + "texto": { + "en": "hat", + "es": "gorro" + }, + "tipo": 2, + "imagen": { + "picto": "gorro" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 954, + "texto": { + "en": "jean", + "es": "jean" + }, + "tipo": 2, + "imagen": { + "picto": "jean" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 956, + "texto": { + "en": "overall", + "es": "mono" + }, + "tipo": 2, + "imagen": { + "picto": "mono" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 960, + "texto": { + "en": "trouser", + "es": "pantalon" + }, + "tipo": 2, + "imagen": { + "picto": "pantalon" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 962, + "texto": { + "en": "shorts", + "es": "pantalones cortos" + }, + "tipo": 2, + "imagen": { + "picto": "pantalones_cortos" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 968, + "texto": { + "en": "bra", + "es": "sosten" + }, + "tipo": 2, + "imagen": { + "picto": "sosten" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 969, + "texto": { + "en": "sweater", + "es": "sweater" + }, + "tipo": 2, + "imagen": { + "picto": "sweater" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 971, + "texto": { + "en": "dress", + "es": "vestido" + }, + "tipo": 2, + "imagen": { + "picto": "vestido" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 972, + "texto": { + "en": "bandana", + "es": "vincha" + }, + "tipo": 2, + "imagen": { + "picto": "cinta_de_pelo" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 973, + "texto": { + "en": "shoe", + "es": "zapato" + }, + "tipo": 2, + "imagen": { + "picto": "zapato" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 974, + "texto": { + "en": "snicker", + "es": "zapatilla deportiva" + }, + "tipo": 2, + "imagen": { + "picto": "zapatilla_de_deporte" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 975, + "texto": { + "en": "chess", + "es": "el ajedrez" + }, + "tipo": 2, + "imagen": { + "picto": "ajedrez" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 976, + "texto": { + "en": "kite", + "es": "el barrilete" + }, + "tipo": 2, + "imagen": { + "picto": "cometa" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 977, + "texto": { + "en": "cubes", + "es": "los cubos" + }, + "tipo": 2, + "imagen": { + "picto": "cubos_apilables" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 980, + "texto": { + "en": "truck", + "es": "el camión de juguete" + }, + "tipo": 2, + "imagen": { + "picto": "camion_de_juguete" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 981, + "texto": { + "en": "firetruck", + "es": "el coche de bomberos" + }, + "tipo": 2, + "imagen": { + "picto": "coche_de_bomberos" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 982, + "texto": { + "en": "kitchenet", + "es": "la cocinita" + }, + "tipo": 2, + "imagen": { + "picto": "cocinita" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 986, + "texto": { + "en": "story", + "es": "el cuento" + }, + "tipo": 2, + "imagen": { + "picto": "cuento" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 987, + "texto": { + "en": "ballons", + "es": "los globos" + }, + "tipo": 2, + "imagen": { + "picto": "globos" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 989, + "texto": { + "en": "toys", + "es": "los juguetes" + }, + "tipo": 2, + "imagen": { + "picto": "juguetes" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 996, + "texto": { + "en": "ball", + "es": "la pelota" + }, + "tipo": 2, + "imagen": { + "picto": "pelota" + }, + "relacion": [ + { + "id": 737, + "frec": 2 + }, + { + "id": 736, + "frec": 1 + }, + { + "id": 748, + "frec": 1 + }, + { + "id": 749, + "frec": 1 + }, + { + "id": 746, + "frec": 1 + } + ], + "agenda": 0, + "gps": 0 + }, + { + "id": 1001, + "texto": { + "en": "football", + "es": "la pelota de fútbol" + }, + "tipo": 2, + "imagen": { + "picto": "pelota_de_futbol" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 1005, + "texto": { + "en": "jigsaw", + "es": "el rompecabeza" + }, + "tipo": 2, + "imagen": { + "picto": "rompecabezas" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 1012, + "texto": { + "en": "pillow", + "es": "la almohada" + }, + "tipo": 2, + "imagen": { + "picto": "almohada" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 1013, + "texto": { + "en": "movie theater", + "es": "el cine" + }, + "tipo": 2, + "imagen": { + "picto": "cine" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 1014, + "texto": { + "en": "food", + "es": "comida" + }, + "tipo": 2, + "imagen": { + "picto": "comida" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 1016, + "texto": { + "en": "computer", + "es": "la computadora" + }, + "tipo": 2, + "imagen": { + "picto": "ordenador" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 1017, + "texto": { + "en": "book", + "es": "el libro" + }, + "tipo": 2, + "imagen": { + "picto": "libro" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 1019, + "texto": { + "en": "cd player", + "es": "la radio" + }, + "tipo": 2, + "imagen": { + "picto": "radio_cd" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 1020, + "texto": { + "en": "towel", + "es": "la toalla" + }, + "tipo": 2, + "imagen": { + "picto": "toalla" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 1023, + "texto": { + "en": "kitchen", + "es": "cocina" + }, + "tipo": 2, + "imagen": { + "picto": "cocina" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 1024, + "texto": { + "en": "fridge", + "es": "heladera" + }, + "tipo": 2, + "imagen": { + "picto": "nevera" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 1025, + "texto": { + "en": "oven", + "es": "horno" + }, + "tipo": 2, + "imagen": { + "picto": "horno" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 1026, + "texto": { + "en": "spoon", + "es": "cuchara" + }, + "tipo": 2, + "imagen": { + "picto": "cuchara" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 1027, + "texto": { + "en": "fork", + "es": "tenedor" + }, + "tipo": 2, + "imagen": { + "picto": "tenedor" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 1028, + "texto": { + "en": "knife", + "es": "cuchillo" + }, + "tipo": 2, + "imagen": { + "picto": "cuchillo" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 1029, + "texto": { + "en": "cook", + "es": "cocinar" + }, + "tipo": 1, + "imagen": { + "picto": "cocinar" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 1030, + "texto": { + "en": "sofa", + "es": "sillón" + }, + "tipo": 2, + "imagen": { + "picto": "sofa" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 1032, + "texto": { + "en": "table", + "es": "mesa" + }, + "tipo": 2, + "imagen": { + "picto": "mesa" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": -78935557, + "frec": 0 + }, + { + "id": 205895023, + "frec": 1 + } + ], + "frecuencia": 1 + }, + { + "id": 25, + "texto": { + "en": "Health book", + "es": "LIBRO DE LA SALUD" + }, + "tipo": 0, + "imagen": { + "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Flibro_salud.webp?alt=media&token=c7b4bf4a-38b5-4b09-ac7d-30299ef09d86" + }, + "relacion": [ + { + "id": 377, + "frec": 11 + }, + { + "id": 378, + "frec": 3 + }, + { + "id": 379, + "frec": 7 + }, + { + "id": 380, + "frec": 1 + }, + { + "id": 381, + "frec": 1 + }, + { + "id": 382, + "frec": 1 + }, + { + "id": 383, + "frec": 1 + }, + { + "id": 384, + "frec": 1 + }, + { + "id": 385, + "frec": 1 + }, + { + "id": 388, + "frec": 1 + }, + { + "id": 389, + "frec": 1 + }, + { + "id": 213, + "frec": 1 + }, + { + "id": 234, + "frec": 1 + }, + { + "id": 205, + "frec": 1 + }, + { + "id": 133, + "frec": 1 + }, + { + "id": 30, + "frec": 1 + }, + { + "id": 33, + "frec": 1 + }, + { + "id": 113, + "frec": 1 + }, + { + "id": 112, + "frec": 1 + }, + { + "id": 118, + "frec": 1 + }, + { + "id": 117, + "frec": 1 + }, + { + "id": 101, + "frec": 1 + }, + { + "id": 51, + "frec": 1 + }, + { + "id": 13, + "frec": 1 + }, + { + "id": 621, + "frec": 1 + }, + { + "id": 629, + "frec": 1 + }, + { + "id": 668, + "frec": 1 + }, + { + "id": 819, + "frec": 1 + }, + { + "id": 820, + "frec": 1 + }, + { + "id": 821, + "frec": 1 + }, + { + "id": 822, + "frec": 1 + }, + { + "id": 823, + "frec": 1 + }, + { + "id": 824, + "frec": 1 + }, + { + "id": 825, + "frec": 1 + }, + { + "id": 826, + "frec": 1 + }, + { + "id": 827, + "frec": 1 + }, + { + "id": 828, + "frec": 1 + }, + { + "id": 829, + "frec": 1 + }, + { + "id": 831, + "frec": 1 + }, + { + "id": 878, + "frec": 1 + }, + { + "id": 881, + "frec": 1 + }, + { + "id": 882, + "frec": 1 + }, + { + "id": 884, + "frec": 1 + }, + { + "id": 885, + "frec": 1 + }, + { + "id": 886, + "frec": 1 + }, + { + "id": 887, + "frec": 1 + } + ] + }, + { + "id": 26, + "texto": { + "en": "Fun book I", + "es": "LIBRO DEL OCIO 1" + }, + "tipo": 0, + "imagen": { + "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Flibro_ocio_1.webp?alt=media&token=50186510-bf0a-4416-85a8-fc1b17ff6fd5" + }, + "relacion": [ + { + "id": 2, + "frec": 1 + }, + { + "id": 8, + "frec": 1 + }, + { + "id": 3, + "frec": 1 + }, + { + "id": 17, + "frec": 1 + }, + { + "id": 20, + "frec": 1 + }, + { + "id": 13, + "frec": 1 + }, + { + "id": 119, + "frec": 1 + }, + { + "id": 121, + "frec": 1 + }, + { + "id": 124, + "frec": 1 + }, + { + "id": 138, + "frec": 1 + }, + { + "id": 144, + "frec": 1 + }, + { + "id": 161, + "frec": 1 + }, + { + "id": 164, + "frec": 1 + }, + { + "id": 171, + "frec": 1 + }, + { + "id": 207, + "frec": 1 + }, + { + "id": 544, + "frec": 1 + }, + { + "id": 552, + "frec": 1 + }, + { + "id": 553, + "frec": 1 + }, + { + "id": 554, + "frec": 1 + }, + { + "id": 557, + "frec": 1 + }, + { + "id": 560, + "frec": 1 + }, + { + "id": 561, + "frec": 1 + }, + { + "id": 563, + "frec": 1 + }, + { + "id": 564, + "frec": 1 + }, + { + "id": 565, + "frec": 1 + }, + { + "id": 567, + "frec": 1 + }, + { + "id": 568, + "frec": 1 + }, + { + "id": 572, + "frec": 1 + }, + { + "id": 573, + "frec": 1 + }, + { + "id": 575, + "frec": 1 + }, + { + "id": 580, + "frec": 1 + }, + { + "id": 583, + "frec": 1 + }, + { + "id": 587, + "frec": 1 + }, + { + "id": 615, + "frec": 1 + }, + { + "id": 621, + "frec": 1 + }, + { + "id": 635, + "frec": 1 + }, + { + "id": 638, + "frec": 1 + }, + { + "id": 639, + "frec": 1 + }, + { + "id": 661, + "frec": 1 + }, + { + "id": 1013, + "frec": 1 + } + ] + }, + { + "id": 27, + "texto": { + "en": "Fun book II", + "es": "LIBRO DEL OCIO 2" + }, + "tipo": 0, + "imagen": { + "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Flibro_ocio_2.webp?alt=media&token=fa4aa42c-d12a-4c47-a826-7918e5c23735" + }, + "relacion": [ + { + "id": 1, + "frec": 1 + }, + { + "id": 5, + "frec": 1 + }, + { + "id": 2, + "frec": 1 + }, + { + "id": 8, + "frec": 1 + }, + { + "id": 17, + "frec": 1 + }, + { + "id": 20, + "frec": 1 + }, + { + "id": 28, + "frec": 1 + }, + { + "id": 30, + "frec": 1 + }, + { + "id": 34, + "frec": 1 + }, + { + "id": 32, + "frec": 1 + }, + { + "id": 38, + "frec": 1 + }, + { + "id": 70, + "frec": 1 + }, + { + "id": 82, + "frec": 1 + }, + { + "id": 119, + "frec": 1 + }, + { + "id": 124, + "frec": 1 + }, + { + "id": 137, + "frec": 1 + }, + { + "id": 161, + "frec": 1 + }, + { + "id": 171, + "frec": 1 + }, + { + "id": 615, + "frec": 1 + }, + { + "id": 623, + "frec": 1 + }, + { + "id": 624, + "frec": 1 + }, + { + "id": 672, + "frec": 1 + }, + { + "id": 678, + "frec": 1 + }, + { + "id": 975, + "frec": 1 + }, + { + "id": 976, + "frec": 1 + }, + { + "id": 977, + "frec": 1 + }, + { + "id": 980, + "frec": 1 + }, + { + "id": 981, + "frec": 1 + }, + { + "id": 982, + "frec": 1 + }, + { + "id": 986, + "frec": 1 + }, + { + "id": 987, + "frec": 1 + }, + { + "id": 989, + "frec": 1 + }, + { + "id": 996, + "frec": 1 + }, + { + "id": 1005, + "frec": 1 + } + ] + }, + { + "id": 28, + "texto": { + "en": "Restaurant Book", + "es": "LIBRO DEL RESTAURANTE" + }, + "tipo": 0, + "imagen": { + "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Frestaurante.webp?alt=media&token=57ed6d5c-fa5f-41c1-b779-28294311e772" + }, + "relacion": [ + { + "id": 377, + "frec": 11 + }, + { + "id": 378, + "frec": 3 + }, + { + "id": 379, + "frec": 7 + }, + { + "id": 380, + "frec": 1 + }, + { + "id": 381, + "frec": 1 + }, + { + "id": 382, + "frec": 1 + }, + { + "id": 383, + "frec": 1 + }, + { + "id": 384, + "frec": 1 + }, + { + "id": 388, + "frec": 1 + }, + { + "id": 389, + "frec": 1 + }, + { + "id": 495, + "frec": 1 + }, + { + "id": 497, + "frec": 1 + }, + { + "id": 501, + "frec": 1 + }, + { + "id": 500, + "frec": 1 + }, + { + "id": 503, + "frec": 1 + }, + { + "id": 502, + "frec": 1 + }, + { + "id": 587, + "frec": 1 + }, + { + "id": 588, + "frec": 1 + }, + { + "id": 594, + "frec": 1 + }, + { + "id": 590, + "frec": 1 + }, + { + "id": 589, + "frec": 1 + }, + { + "id": 599, + "frec": 1 + }, + { + "id": 598, + "frec": 1 + }, + { + "id": 597, + "frec": 1 + }, + { + "id": 600, + "frec": 1 + }, + { + "id": 602, + "frec": 1 + }, + { + "id": 595, + "frec": 1 + }, + { + "id": 605, + "frec": 1 + }, + { + "id": 604, + "frec": 1 + }, + { + "id": 400, + "frec": 1 + }, + { + "id": 401, + "frec": 1 + }, + { + "id": 403, + "frec": 1 + }, + { + "id": 399, + "frec": 1 + }, + { + "id": 412, + "frec": 1 + }, + { + "id": 417, + "frec": 1 + }, + { + "id": 421, + "frec": 1 + }, + { + "id": 424, + "frec": 1 + }, + { + "id": 458, + "frec": 1 + }, + { + "id": 462, + "frec": 1 + }, + { + "id": 463, + "frec": 1 + }, + { + "id": 472, + "frec": 1 + }, + { + "id": 476, + "frec": 1 + }, + { + "id": 477, + "frec": 1 + }, + { + "id": 478, + "frec": 1 + }, + { + "id": 480, + "frec": 1 + }, + { + "id": 481, + "frec": 1 + }, + { + "id": 482, + "frec": 1 + }, + { + "id": 483, + "frec": 1 + }, + { + "id": 484, + "frec": 1 + }, + { + "id": 486, + "frec": 1 + }, + { + "id": 487, + "frec": 1 + }, + { + "id": 489, + "frec": 1 + }, + { + "id": 490, + "frec": 1 + }, + { + "id": 492, + "frec": 1 + }, + { + "id": 497, + "frec": 1 + }, + { + "id": 505, + "frec": 1 + }, + { + "id": 512, + "frec": 1 + }, + { + "id": 515, + "frec": 1 + }, + { + "id": 619, + "frec": 1 + }, + { + "id": 679, + "frec": 1 + }, + { + "id": 657, + "frec": 1 + }, + { + "id": 660, + "frec": 1 + }, + { + "id": 649, + "frec": 1 + }, + { + "id": 666, + "frec": 1 + }, + { + "id": 672, + "frec": 1 + }, + { + "id": 685, + "frec": 1 + } + ] + }, + { + "id": 29, + "texto": { + "en": "Travel book", + "es": "LIBRO DE VIAJE" + }, + "tipo": 0, + "imagen": { + "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Flibro_viaje.webp?alt=media&token=1f869b28-34f4-4d1d-8dc7-2edcb5276f16" + }, + "relacion": [ + { + "id": 377, + "frec": 11 + }, + { + "id": 378, + "frec": 3 + }, + { + "id": 379, + "frec": 7 + }, + { + "id": 380, + "frec": 1 + }, + { + "id": 381, + "frec": 1 + }, + { + "id": 382, + "frec": 1 + }, + { + "id": 383, + "frec": 1 + }, + { + "id": 384, + "frec": 1 + }, + { + "id": 385, + "frec": 1 + }, + { + "id": 388, + "frec": 1 + }, + { + "id": 389, + "frec": 1 + }, + { + "id": 5, + "frec": 1 + }, + { + "id": 7, + "frec": 1 + }, + { + "id": 8, + "frec": 1 + }, + { + "id": 1, + "frec": 1 + }, + { + "id": 30, + "frec": 1 + }, + { + "id": 33, + "frec": 1 + }, + { + "id": 38, + "frec": 1 + }, + { + "id": 101, + "frec": 1 + }, + { + "id": 107, + "frec": 1 + }, + { + "id": 108, + "frec": 1 + }, + { + "id": 112, + "frec": 1 + }, + { + "id": 140, + "frec": 1 + }, + { + "id": 133, + "frec": 1 + }, + { + "id": 177, + "frec": 1 + }, + { + "id": 205, + "frec": 1 + }, + { + "id": 499, + "frec": 1 + }, + { + "id": 500, + "frec": 1 + }, + { + "id": 501, + "frec": 1 + }, + { + "id": 568, + "frec": 1 + }, + { + "id": 587, + "frec": 1 + }, + { + "id": 588, + "frec": 1 + }, + { + "id": 589, + "frec": 1 + }, + { + "id": 590, + "frec": 1 + }, + { + "id": 594, + "frec": 1 + }, + { + "id": 595, + "frec": 1 + }, + { + "id": 602, + "frec": 1 + }, + { + "id": 606, + "frec": 1 + }, + { + "id": 607, + "frec": 1 + }, + { + "id": 608, + "frec": 1 + }, + { + "id": 609, + "frec": 1 + }, + { + "id": 610, + "frec": 1 + }, + { + "id": 611, + "frec": 1 + }, + { + "id": 646, + "frec": 1 + }, + { + "id": 656, + "frec": 1 + }, + { + "id": 657, + "frec": 1 + }, + { + "id": 679, + "frec": 1 + }, + { + "id": 685, + "frec": 1 + }, + { + "id": 666, + "frec": 1 + }, + { + "id": 649, + "frec": 1 + }, + { + "id": 773, + "frec": 1 + }, + { + "id": 1020, + "frec": 1 + }, + { + "id": 1019, + "frec": 1 + } + ] + }, + { + "id": 30, + "texto": { + "en": "Hygiene book", + "es": "LIBRO DE HIGIENE" + }, + "tipo": 0, + "imagen": { + "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fhigiene_personal.webp?alt=media&token=d822b484-feb9-4a37-a9f0-ed53e9b3584f" + }, + "relacion": [ + { + "id": 9, + "frec": 1 + }, + { + "id": 10, + "frec": 1 + }, + { + "id": 11, + "frec": 1 + }, + { + "id": 23, + "frec": 1 + }, + { + "id": 29, + "frec": 1 + }, + { + "id": 31, + "frec": 1 + }, + { + "id": 35, + "frec": 1 + }, + { + "id": 39, + "frec": 1 + }, + { + "id": 54, + "frec": 1 + }, + { + "id": 100, + "frec": 1 + }, + { + "id": 133, + "frec": 1 + }, + { + "id": 158, + "frec": 1 + }, + { + "id": 159, + "frec": 1 + }, + { + "id": 200, + "frec": 1 + }, + { + "id": 205, + "frec": 1 + }, + { + "id": 204, + "frec": 1 + }, + { + "id": 263, + "frec": 1 + }, + { + "id": 199, + "frec": 1 + } + ] + }, + { + "id": 31, + "texto": { + "en": "Butcher book", + "es": "LIBRO DE LA CARNICERíA" + }, + "tipo": 0, + "imagen": { + "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Flibro_carnicero.webp?alt=media&token=b3a49a1a-5b29-40a2-a456-6117822efb08" + }, + "relacion": [ + { + "id": 5, + "frec": 1 + }, + { + "id": 7, + "frec": 1 + }, + { + "id": 13, + "frec": 1 + }, + { + "id": 377, + "frec": 11 + }, + { + "id": 378, + "frec": 3 + }, + { + "id": 379, + "frec": 7 + }, + { + "id": 380, + "frec": 1 + }, + { + "id": 381, + "frec": 1 + }, + { + "id": 382, + "frec": 1 + }, + { + "id": 383, + "frec": 1 + }, + { + "id": 384, + "frec": 1 + }, + { + "id": 388, + "frec": 1 + }, + { + "id": 389, + "frec": 1 + }, + { + "id": 482, + "frec": 1 + }, + { + "id": 505, + "frec": 1 + }, + { + "id": 512, + "frec": 1 + }, + { + "id": 515, + "frec": 1 + }, + { + "id": 516, + "frec": 1 + }, + { + "id": 517, + "frec": 1 + }, + { + "id": 524, + "frec": 1 + }, + { + "id": 587, + "frec": 1 + }, + { + "id": 617, + "frec": 1 + } + ] + }, + { + "id": 32, + "texto": { + "en": "Grocery book", + "es": "LIBRO DEL ALMACéN" + }, + "tipo": 0, + "imagen": { + "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Flibro_almacen.webp?alt=media&token=9f5be80c-f5fc-48dd-be44-ba6ea61a8efc" + }, + "relacion": [ + { + "id": 5, + "frec": 1 + }, + { + "id": 13, + "frec": 1 + }, + { + "id": 23, + "frec": 1 + }, + { + "id": 30, + "frec": 1 + }, + { + "id": 138, + "frec": 1 + }, + { + "id": 136, + "frec": 1 + }, + { + "id": 131, + "frec": 1 + }, + { + "id": 213, + "frec": 1 + }, + { + "id": 208, + "frec": 1 + }, + { + "id": 233, + "frec": 1 + }, + { + "id": 234, + "frec": 1 + }, + { + "id": 267, + "frec": 1 + }, + { + "id": 165, + "frec": 1 + }, + { + "id": 153, + "frec": 1 + }, + { + "id": 394, + "frec": 1 + }, + { + "id": 396, + "frec": 1 + }, + { + "id": 400, + "frec": 1 + }, + { + "id": 401, + "frec": 1 + }, + { + "id": 398, + "frec": 1 + }, + { + "id": 406, + "frec": 1 + }, + { + "id": 415, + "frec": 1 + }, + { + "id": 425, + "frec": 1 + }, + { + "id": 426, + "frec": 1 + }, + { + "id": 427, + "frec": 1 + }, + { + "id": 431, + "frec": 1 + }, + { + "id": 439, + "frec": 1 + }, + { + "id": 484, + "frec": 1 + }, + { + "id": 483, + "frec": 1 + }, + { + "id": 487, + "frec": 1 + }, + { + "id": 489, + "frec": 1 + }, + { + "id": 490, + "frec": 1 + }, + { + "id": 492, + "frec": 1 + }, + { + "id": 495, + "frec": 1 + }, + { + "id": 496, + "frec": 1 + }, + { + "id": 500, + "frec": 1 + }, + { + "id": 494, + "frec": 1 + }, + { + "id": 588, + "frec": 1 + }, + { + "id": 587, + "frec": 1 + } + ] + }, + { + "id": 33, + "texto": { + "en": "Greengrocery book", + "es": "LIBRO DE VERDULERíA" + }, + "tipo": 0, + "imagen": { + "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Flibro_verduleria.webp?alt=media&token=533584e7-215a-4ab7-bc2f-aecf13c9c6c1" + }, + "relacion": [ + { + "id": 5, + "frec": 1 + }, + { + "id": 7, + "frec": 1 + }, + { + "id": 13, + "frec": 1 + }, + { + "id": 22, + "frec": 1 + }, + { + "id": 69, + "frec": 1 + }, + { + "id": 391, + "frec": 1 + }, + { + "id": 393, + "frec": 1 + }, + { + "id": 399, + "frec": 1 + }, + { + "id": 402, + "frec": 1 + }, + { + "id": 403, + "frec": 1 + }, + { + "id": 404, + "frec": 1 + }, + { + "id": 407, + "frec": 1 + }, + { + "id": 408, + "frec": 1 + }, + { + "id": 414, + "frec": 1 + }, + { + "id": 413, + "frec": 1 + }, + { + "id": 428, + "frec": 1 + }, + { + "id": 430, + "frec": 1 + }, + { + "id": 432, + "frec": 1 + }, + { + "id": 435, + "frec": 1 + }, + { + "id": 447, + "frec": 1 + }, + { + "id": 463, + "frec": 1 + }, + { + "id": 473, + "frec": 1 + }, + { + "id": 474, + "frec": 1 + }, + { + "id": 475, + "frec": 1 + }, + { + "id": 478, + "frec": 1 + }, + { + "id": 483, + "frec": 1 + }, + { + "id": 507, + "frec": 1 + } + ] + }, + { + "id": 34, + "texto": { + "en": "Music lesson", + "es": "CLASE DE MúSICA" + }, + "tipo": 0, + "imagen": { + "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fclase_musica.webp?alt=media&token=a7a2c34a-9c31-44ad-81d0-b1a4c443aa89" + }, + "relacion": [ + { + "id": 3, + "frec": 1 + }, + { + "id": 6, + "frec": 1 + }, + { + "id": 1, + "frec": 1 + }, + { + "id": 17, + "frec": 1 + }, + { + "id": 2, + "frec": 1 + }, + { + "id": 20, + "frec": 1 + }, + { + "id": 19, + "frec": 1 + }, + { + "id": 573, + "frec": 1 + }, + { + "id": 627, + "frec": 1 + }, + { + "id": 626, + "frec": 1 + }, + { + "id": 850, + "frec": 1 + }, + { + "id": 851, + "frec": 1 + }, + { + "id": 853, + "frec": 1 + }, + { + "id": 855, + "frec": 1 + }, + { + "id": 857, + "frec": 1 + }, + { + "id": 860, + "frec": 1 + }, + { + "id": 865, + "frec": 1 + }, + { + "id": 870, + "frec": 1 + }, + { + "id": 871, + "frec": 1 + }, + { + "id": 874, + "frec": 1 + }, + { + "id": 876, + "frec": 1 + }, + { + "id": 1019, + "frec": 1 + } + ] + }, + { + "id": 35, + "texto": { + "en": "Art lesson", + "es": "CLASE DE PLáSTICA" + }, + "tipo": 0, + "imagen": { + "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fclase_plastica.webp?alt=media&token=fb56f0bd-50d1-4a90-b32d-09e85ce95514" + }, + "relacion": [ + { + "id": 1, + "frec": 1 + }, + { + "id": 5, + "frec": 1 + }, + { + "id": 7, + "frec": 1 + }, + { + "id": 15, + "frec": 1 + }, + { + "id": 28, + "frec": 1 + }, + { + "id": 95, + "frec": 1 + }, + { + "id": 90, + "frec": 1 + }, + { + "id": 200, + "frec": 1 + }, + { + "id": 626, + "frec": 1 + }, + { + "id": 627, + "frec": 1 + }, + { + "id": 733, + "frec": 1 + }, + { + "id": 734, + "frec": 1 + }, + { + "id": 736, + "frec": 1 + }, + { + "id": 737, + "frec": 1 + }, + { + "id": 738, + "frec": 1 + }, + { + "id": 739, + "frec": 1 + }, + { + "id": 740, + "frec": 1 + }, + { + "id": 742, + "frec": 1 + }, + { + "id": 743, + "frec": 1 + }, + { + "id": 744, + "frec": 1 + }, + { + "id": 745, + "frec": 1 + }, + { + "id": 746, + "frec": 1 + }, + { + "id": 747, + "frec": 1 + }, + { + "id": 748, + "frec": 1 + }, + { + "id": 749, + "frec": 1 + }, + { + "id": 750, + "frec": 1 + }, + { + "id": 756, + "frec": 1 + }, + { + "id": 754, + "frec": 1 + }, + { + "id": 762, + "frec": 1 + }, + { + "id": 766, + "frec": 1 + }, + { + "id": 769, + "frec": 1 + }, + { + "id": 771, + "frec": 1 + } + ] + }, + { + "id": 36, + "texto": { + "en": "Lessons", + "es": "CLASES" + }, + "tipo": 0, + "imagen": { + "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Flibro_clases.webp?alt=media&token=d0f51815-d6ec-4d98-972b-8a5e9fbe06e7" + }, + "relacion": [] + }, + { + "id": 37, + "texto": { + "en": "Football game", + "es": "FUTBOL" + }, + "tipo": 0, + "imagen": { + "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_futbol.webp?alt=media&token=50db7655-7aff-4f93-9b68-875cc5706c7a" + }, + "relacion": [ + { + "id": 7, + "frec": 1 + }, + { + "id": 8, + "frec": 1 + }, + { + "id": 2, + "frec": 1 + }, + { + "id": 17, + "frec": 1 + }, + { + "id": 26, + "frec": 1 + }, + { + "id": 34, + "frec": 1 + }, + { + "id": 41, + "frec": 1 + }, + { + "id": 70, + "frec": 1 + }, + { + "id": 85, + "frec": 1 + }, + { + "id": 119, + "frec": 1 + }, + { + "id": 124, + "frec": 1 + }, + { + "id": 125, + "frec": 1 + }, + { + "id": 161, + "frec": 1 + }, + { + "id": 171, + "frec": 1 + }, + { + "id": 386, + "frec": 1 + }, + { + "id": 377, + "frec": 11 + }, + { + "id": 388, + "frec": 1 + }, + { + "id": 389, + "frec": 1 + }, + { + "id": 622, + "frec": 1 + }, + { + "id": 620, + "frec": 1 + }, + { + "id": 651, + "frec": 1 + }, + { + "id": 834, + "frec": 1 + }, + { + "id": 835, + "frec": 1 + } + ] + }, + { + "id": 38, + "texto": { + "en": "Movies", + "es": "CINE y PELíCULAS" + }, + "tipo": 0, + "imagen": { + "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcine.webp?alt=media&token=4109bb74-ab3d-4cda-99fb-34e7030e8762" + }, + "relacion": [ + { + "id": 1, + "frec": 1 + }, + { + "id": 3, + "frec": 1 + }, + { + "id": 7, + "frec": 1 + }, + { + "id": 13, + "frec": 1 + }, + { + "id": 23, + "frec": 1 + }, + { + "id": 30, + "frec": 1 + }, + { + "id": 544, + "frec": 1 + }, + { + "id": 552, + "frec": 1 + }, + { + "id": 553, + "frec": 1 + }, + { + "id": 554, + "frec": 1 + }, + { + "id": 557, + "frec": 1 + }, + { + "id": 560, + "frec": 1 + }, + { + "id": 561, + "frec": 1 + }, + { + "id": 563, + "frec": 1 + }, + { + "id": 564, + "frec": 1 + }, + { + "id": 565, + "frec": 1 + }, + { + "id": 567, + "frec": 1 + }, + { + "id": 572, + "frec": 1 + }, + { + "id": 573, + "frec": 1 + }, + { + "id": 575, + "frec": 1 + }, + { + "id": 580, + "frec": 1 + }, + { + "id": 583, + "frec": 1 + }, + { + "id": 587, + "frec": 1 + }, + { + "id": 602, + "frec": 1 + }, + { + "id": 635, + "frec": 1 + }, + { + "id": 638, + "frec": 1 + }, + { + "id": 639, + "frec": 1 + } + ] + }, + { + "id": 39, + "texto": { + "en": "Pharmacy book", + "es": "LIBRO DE LA FARMACIA" + }, + "tipo": 0, + "imagen": { + "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_farmacia.webp?alt=media&token=0e948284-58e5-4f44-8269-dd5a65ee6558" + }, + "relacion": [ + { + "id": 23, + "frec": 1 + }, + { + "id": 76, + "frec": 1 + }, + { + "id": 98, + "frec": 1 + }, + { + "id": 101, + "frec": 1 + }, + { + "id": 113, + "frec": 1 + }, + { + "id": 131, + "frec": 1 + }, + { + "id": 138, + "frec": 1 + }, + { + "id": 377, + "frec": 1 + }, + { + "id": 378, + "frec": 1 + }, + { + "id": 379, + "frec": 1 + }, + { + "id": 380, + "frec": 1 + }, + { + "id": 384, + "frec": 1 + }, + { + "id": 382, + "frec": 1 + }, + { + "id": 383, + "frec": 1 + }, + { + "id": 381, + "frec": 1 + }, + { + "id": 385, + "frec": 1 + }, + { + "id": 387, + "frec": 1 + }, + { + "id": 388, + "frec": 1 + }, + { + "id": 389, + "frec": 1 + }, + { + "id": 567, + "frec": 1 + }, + { + "id": 587, + "frec": 1 + }, + { + "id": 588, + "frec": 1 + }, + { + "id": 629, + "frec": 1 + }, + { + "id": 708, + "frec": 1 + }, + { + "id": 777, + "frec": 1 + }, + { + "id": 778, + "frec": 1 + }, + { + "id": 780, + "frec": 1 + }, + { + "id": 784, + "frec": 1 + }, + { + "id": 783, + "frec": 1 + }, + { + "id": 782, + "frec": 1 + }, + { + "id": 781, + "frec": 1 + }, + { + "id": 785, + "frec": 1 + }, + { + "id": 786, + "frec": 1 + }, + { + "id": 787, + "frec": 1 + }, + { + "id": 788, + "frec": 1 + }, + { + "id": 789, + "frec": 1 + }, + { + "id": 790, + "frec": 1 + }, + { + "id": 791, + "frec": 1 + }, + { + "id": 792, + "frec": 1 + }, + { + "id": 793, + "frec": 1 + }, + { + "id": 795, + "frec": 1 + }, + { + "id": 799, + "frec": 1 + }, + { + "id": 797, + "frec": 1 + }, + { + "id": 800, + "frec": 1 + }, + { + "id": 802, + "frec": 1 + }, + { + "id": 804, + "frec": 1 + }, + { + "id": 807, + "frec": 1 + }, + { + "id": 809, + "frec": 1 + }, + { + "id": 819, + "frec": 1 + }, + { + "id": 820, + "frec": 1 + }, + { + "id": 821, + "frec": 1 + }, + { + "id": 822, + "frec": 1 + }, + { + "id": 823, + "frec": 1 + }, + { + "id": 824, + "frec": 1 + }, + { + "id": 825, + "frec": 1 + }, + { + "id": 826, + "frec": 1 + }, + { + "id": 827, + "frec": 1 + }, + { + "id": 828, + "frec": 1 + }, + { + "id": 829, + "frec": 1 + }, + { + "id": 831, + "frec": 1 + }, + { + "id": 878, + "frec": 1 + }, + { + "id": 881, + "frec": 1 + }, + { + "id": 882, + "frec": 1 + }, + { + "id": 884, + "frec": 1 + }, + { + "id": 885, + "frec": 1 + }, + { + "id": 886, + "frec": 1 + }, + { + "id": 887, + "frec": 1 + } + ] + }, + { + "id": 40, + "texto": { + "en": "Swimming", + "es": "LIBRO DE NATACIóN" + }, + "tipo": 0, + "imagen": { + "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fnatacion.webp?alt=media&token=f4e987c5-4a65-4499-bf95-ec775a6f17e6" + }, + "relacion": [ + { + "id": 1, + "frec": 1 + }, + { + "id": 7, + "frec": 1 + }, + { + "id": 10, + "frec": 1 + }, + { + "id": 86, + "frec": 1 + }, + { + "id": 88, + "frec": 1 + } + ] + }, + { + "id": -1895165, + "texto": { + "en": "breakfast", + "es": "desayuno" + }, + "tipo": 0, + "imagen": { + "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_desayuno.webp?alt=media&token=25948a6f-b4bd-4958-ad10-3ea868660416" + }, + "relacion": [ + { + "id": 484, + "texto": { + "en": "yoghurt", + "es": "yogur" + }, + "tipo": 2, + "imagen": { + "picto": "zid_yogurt" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 393, + "texto": { + "en": "almond", + "es": "almendras" + }, + "tipo": 2, + "imagen": { + "picto": "almendras" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 396, + "texto": { + "en": "sugar", + "es": "azúcar" + }, + "tipo": 2, + "imagen": { + "picto": "azucar" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 401, + "texto": { + "en": "cappchino", + "es": "capuchino" + }, + "tipo": 2, + "imagen": { + "picto": "capuchino" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 415, + "texto": { + "en": "cookie", + "es": "galleta" + }, + "tipo": 2, + "imagen": { + "picto": "galletas" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 427, + "texto": { + "en": "milk and cookies", + "es": "leche y galletas" + }, + "tipo": 2, + "imagen": { + "picto": "leche_y_galletas" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 426, + "texto": { + "en": "choclote milk", + "es": "leche con cacáo" + }, + "tipo": 2, + "imagen": { + "picto": "leche_con_cacao" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 431, + "texto": { + "en": "butter", + "es": "manteca" + }, + "tipo": 2, + "imagen": { + "picto": "manteca" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 435, + "texto": { + "en": "orange", + "es": "naranja" + }, + "tipo": 2, + "imagen": { + "picto": "naranja" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 438, + "texto": { + "en": "white bread", + "es": "pan blanco" + }, + "tipo": 2, + "imagen": { + "picto": "pan_blanco" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 439, + "texto": { + "en": "black bread", + "es": "pan negro" + }, + "tipo": 2, + "imagen": { + "picto": "pan_negro" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 521, + "texto": { + "en": "cheese", + "es": "queso" + }, + "tipo": 2, + "imagen": { + "picto": "queso" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 465, + "texto": { + "en": "toast", + "es": "tostada" + }, + "tipo": 2, + "imagen": { + "picto": "tostada" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 468, + "texto": { + "en": "apple juice", + "es": "jugo de manzana" + }, + "tipo": 2, + "imagen": { + "picto": "zumo_de_manzana" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 469, + "texto": { + "en": "peach juice", + "es": "jugo de durazno" + }, + "tipo": 2, + "imagen": { + "picto": "melocoton" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 471, + "texto": { + "en": "grape juice", + "es": "jugo de uva" + }, + "tipo": 2, + "imagen": { + "picto": "zumo_de_uva" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 473, + "texto": { + "en": "banana", + "es": "banana" + }, + "tipo": 2, + "imagen": { + "picto": "banana" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 474, + "texto": { + "en": "apple", + "es": "manzana" + }, + "tipo": 2, + "imagen": { + "picto": "manzana" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 483, + "texto": { + "en": "fruit", + "es": "fruta" + }, + "tipo": 2, + "imagen": { + "picto": "zid_fruta" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 495, + "texto": { + "en": "milk", + "es": "leche" + }, + "tipo": 2, + "imagen": { + "picto": "leche" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 499, + "texto": { + "en": "te", + "es": "té" + }, + "tipo": 2, + "imagen": { + "picto": "te" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 498, + "texto": { + "en": "chocolate", + "es": "chocolate" + }, + "tipo": 2, + "imagen": { + "picto": "chocolate" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 496, + "texto": { + "en": "coffee", + "es": "café" + }, + "tipo": 2, + "imagen": { + "picto": "cafe" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + } + ], + "frecuencia": 1, + "tags": [ + "MANANA" + ] + }, + { + "id": 533264, + "texto": { + "en": "lunch", + "es": "almuerzo" + }, + "tipo": 0, + "imagen": { + "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_almuerzo.webp?alt=media&token=b7acb5a2-b170-4c2b-a5b6-341d19db3632" + }, + "relacion": [ + { + "id": 391, + "frec": 1 + }, + { + "id": 398, + "frec": 1 + }, + { + "id": 399, + "frec": 1 + }, + { + "id": 400, + "frec": 1 + }, + { + "id": 403, + "frec": 1 + }, + { + "id": 420, + "frec": 1 + }, + { + "id": 424, + "frec": 1 + }, + { + "id": 421, + "frec": 1 + }, + { + "id": 428, + "frec": 1 + }, + { + "id": 449, + "frec": 1 + }, + { + "id": 458, + "frec": 1 + }, + { + "id": 462, + "frec": 1 + }, + { + "id": 463, + "frec": 1 + }, + { + "id": 472, + "frec": 1 + }, + { + "id": 476, + "frec": 1 + }, + { + "id": 477, + "frec": 1 + }, + { + "id": 478, + "frec": 1 + }, + { + "id": 480, + "frec": 1 + }, + { + "id": 482, + "frec": 1 + }, + { + "id": 481, + "frec": 1 + }, + { + "id": 489, + "frec": 1 + }, + { + "id": 490, + "frec": 1 + }, + { + "id": 492, + "frec": 1 + }, + { + "id": 504, + "frec": 1 + }, + { + "id": 503, + "frec": 1 + }, + { + "id": 502, + "frec": 1 + }, + { + "id": 501, + "frec": 1 + }, + { + "id": 505, + "frec": 1 + }, + { + "id": 507, + "frec": 1 + }, + { + "id": 512, + "frec": 1 + }, + { + "id": 510, + "frec": 1 + }, + { + "id": 515, + "frec": 1 + }, + { + "id": 516, + "frec": 1 + }, + { + "id": 517, + "frec": 1 + }, + { + "id": 524, + "frec": 1 + }, + { + "id": 394, + "frec": 1 + }, + { + "id": 404, + "frec": 1 + }, + { + "id": 407, + "frec": 1 + }, + { + "id": 408, + "frec": 1 + }, + { + "id": 412, + "frec": 1 + }, + { + "id": 414, + "frec": 1 + }, + { + "id": 413, + "frec": 1 + }, + { + "id": 417, + "frec": 1 + }, + { + "id": 432, + "frec": 1 + }, + { + "id": 435, + "frec": 1 + }, + { + "id": 447, + "frec": 1 + }, + { + "id": 475, + "frec": 1 + }, + { + "id": 474, + "frec": 1 + }, + { + "id": 483, + "frec": 1 + }, + { + "id": 486, + "frec": 1 + }, + { + "id": 494, + "frec": 1 + } + ], + "tags": [ + "MEDIODIA" + ] + }, + { + "id": 1377957, + "texto": { + "en": "snack", + "es": "merienda" + }, + "tipo": 0, + "imagen": { + "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_merienda.webp?alt=media&token=93022501-e9f5-412a-aee4-1599f3d80543" + }, + "relacion": [ + { + "id": 393, + "frec": 1 + }, + { + "id": 396, + "frec": 1 + }, + { + "id": 401, + "frec": 1 + }, + { + "id": 415, + "frec": 1 + }, + { + "id": 426, + "frec": 1 + }, + { + "id": 427, + "frec": 1 + }, + { + "id": 431, + "frec": 1 + }, + { + "id": 439, + "frec": 1 + }, + { + "id": 438, + "frec": 1 + }, + { + "id": 465, + "frec": 1 + }, + { + "id": 468, + "frec": 1 + }, + { + "id": 469, + "frec": 1 + }, + { + "id": 471, + "frec": 1 + }, + { + "id": 483, + "frec": 1 + }, + { + "id": 484, + "frec": 1 + }, + { + "id": 485, + "frec": 1 + }, + { + "id": 496, + "frec": 1 + }, + { + "id": 495, + "frec": 1 + }, + { + "id": 497, + "frec": 1 + }, + { + "id": 498, + "frec": 1 + }, + { + "id": 499, + "frec": 1 + }, + { + "id": 521, + "frec": 1 + } + ], + "tags": [ + "TARDE" + ] + }, + { + "id": 1624279, + "texto": { + "en": "Dinner", + "es": "cena" + }, + "tipo": 0, + "imagen": { + "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_cena.webp?alt=media&token=768a1465-9bb2-4f45-895a-29fa7da05086" + }, + "relacion": [ + { + "id": 391, + "frec": 0 + }, + { + "id": 394, + "frec": 1 + }, + { + "id": 398, + "frec": 1 + }, + { + "id": 399, + "frec": 1 + }, + { + "id": 400, + "frec": 1 + }, + { + "id": 404, + "frec": 1 + }, + { + "id": 403, + "frec": 1 + }, + { + "id": 407, + "frec": 1 + }, + { + "id": 408, + "frec": 1 + }, + { + "id": 412, + "frec": 1 + }, + { + "id": 414, + "frec": 1 + }, + { + "id": 413, + "frec": 1 + }, + { + "id": 420, + "frec": 1 + }, + { + "id": 417, + "frec": 1 + }, + { + "id": 421, + "frec": 1 + }, + { + "id": 424, + "frec": 1 + }, + { + "id": 428, + "frec": 1 + }, + { + "id": 425, + "frec": 1 + }, + { + "id": 431, + "frec": 1 + }, + { + "id": 432, + "frec": 1 + }, + { + "id": 435, + "frec": 1 + }, + { + "id": 447, + "frec": 1 + }, + { + "id": 449, + "frec": 1 + }, + { + "id": 458, + "frec": 1 + }, + { + "id": 463, + "frec": 1 + }, + { + "id": 462, + "frec": 1 + }, + { + "id": 472, + "frec": 1 + }, + { + "id": 476, + "frec": 1 + }, + { + "id": 475, + "frec": 1 + }, + { + "id": 474, + "frec": 1 + }, + { + "id": 477, + "frec": 1 + }, + { + "id": 478, + "frec": 1 + }, + { + "id": 483, + "frec": 1 + }, + { + "id": 482, + "frec": 1 + }, + { + "id": 487, + "frec": 1 + }, + { + "id": 489, + "frec": 1 + }, + { + "id": 490, + "frec": 1 + }, + { + "id": 492, + "frec": 1 + }, + { + "id": 500, + "frec": 1 + }, + { + "id": 497, + "frec": 1 + }, + { + "id": 501, + "frec": 1 + }, + { + "id": 502, + "frec": 1 + }, + { + "id": 503, + "frec": 1 + }, + { + "id": 507, + "frec": 1 + }, + { + "id": 510, + "frec": 1 + }, + { + "id": 512, + "frec": 1 + }, + { + "id": 516, + "frec": 1 + }, + { + "id": 517, + "frec": 1 + }, + { + "id": 524, + "frec": 1 + }, + { + "id": 521, + "frec": 1 + } + ], + "tags": [ + "NOCHE" + ] + } +] \ No newline at end of file diff --git a/assets/languages/pictos_pt.json b/assets/old_pictos.json similarity index 89% rename from assets/languages/pictos_pt.json rename to assets/old_pictos.json index 395aa02a..d0bcd938 100644 --- a/assets/languages/pictos_pt.json +++ b/assets/old_pictos.json @@ -3,7 +3,7 @@ "id": 0, "texto": { "en": "", - "pt": "" + "es": "perro" }, "tipo": 2, "imagen": { @@ -12,39 +12,47 @@ "relacion": [ { "id": 377, - "frec": 26 + "frec": 62 }, { "id": 643, - "frec": 17 + "frec": 36 }, { "id": 628, - "frec": 11 - }, - { - "id": 632, - "frec": 1 + "frec": 35 }, { "id": 388, - "frec": 1 + "frec": 11 }, { "id": 389, - "frec": 1 + "frec": 13 }, { "id": 614, - "frec": 3 + "frec": 14 }, { "id": 623, - "frec": 1 + "frec": 10 }, { "id": 44, - "frec": 4 + "frec": 50 + }, + { + "id": 632, + "frec": 16 + }, + { + "id": 382, + "frec": 2 + }, + { + "id": 384, + "frec": 1 } ], "agenda": 0, @@ -54,7 +62,7 @@ "id": 1, "texto": { "en": "escort", - "pt": "escolta" + "es": "acompañar" }, "tipo": 3, "imagen": { @@ -68,13 +76,30 @@ "id": 2, "texto": { "en": "turn off", - "pt": "desligar" + "es": "apagar" }, "tipo": 3, "imagen": { "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_apagar_television.webp?alt=media&token=d4967332-d189-4df5-ba33-ae4ccfc9b400" }, - "relacion": [], + "relacion": [ + { + "id": 1016, + "frec": 2 + }, + { + "id": 1019, + "frec": 1 + }, + { + "id": 773, + "frec": 2 + }, + { + "id": 774, + "frec": 2 + } + ], "agenda": 0, "gps": 0 }, @@ -82,7 +107,7 @@ "id": 3, "texto": { "en": "turn the volume down", - "pt": "baixe o volume" + "es": "bajar volumen" }, "tipo": 3, "imagen": { @@ -96,7 +121,7 @@ "id": 4, "texto": { "en": "erase", - "pt": "apagar" + "es": "borrar" }, "tipo": 3, "imagen": { @@ -110,7 +135,7 @@ "id": 5, "texto": { "en": "search", - "pt": "pesquisa" + "es": "buscar" }, "tipo": 3, "imagen": { @@ -120,16 +145,41 @@ { "id": 996, "frec": 1 + }, + { + "id": 500, + "frec": 1 + }, + { + "id": 989, + "frec": 1 + }, + { + "id": 737, + "frec": 2 + }, + { + "id": 385, + "frec": 3 + }, + { + "id": 628, + "frec": 3 + }, + { + "id": 1014, + "frec": 2 } ], "agenda": 0, - "gps": 0 + "gps": 0, + "esSugerencia": false }, { "id": 6, "texto": { "en": "sing", - "pt": "cantar" + "es": "cantar" }, "tipo": 3, "imagen": { @@ -143,7 +193,7 @@ "id": 7, "texto": { "en": "change", - "pt": "mudança" + "es": "cambiar" }, "tipo": 3, "imagen": { @@ -157,7 +207,7 @@ "id": 8, "texto": { "en": "change channel", - "pt": "mude o canal" + "es": "cambiar de canal" }, "tipo": 3, "imagen": { @@ -171,7 +221,7 @@ "id": 9, "texto": { "en": "change diapper", - "pt": "mudar diapper" + "es": "cambiarme el pañal" }, "tipo": 3, "imagen": { @@ -185,13 +235,18 @@ "id": 10, "texto": { "en": "change clothes", - "pt": "mudar de roupa" + "es": "cambiarme la ropa" }, "tipo": 3, "imagen": { "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_cambiarropa.webp?alt=media&token=2493ba44-ec6a-4811-8960-c3d9bebc608f" }, - "relacion": [], + "relacion": [ + { + "id": 385, + "frec": 1 + } + ], "agenda": 0, "gps": 0 }, @@ -199,13 +254,18 @@ "id": 11, "texto": { "en": "brush my teeth", - "pt": "escovar meus dentes" + "es": "cepillarme los dientes" }, "tipo": 3, "imagen": { "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_cepillar.webp?alt=media&token=5025fba1-67ca-4c00-b61c-18fcee7fbacf" }, - "relacion": [], + "relacion": [ + { + "id": 385, + "frec": 4 + } + ], "agenda": 0, "gps": 0 }, @@ -213,7 +273,7 @@ "id": 12, "texto": { "en": "eat a sandwich", - "pt": "comer um sanduíche" + "es": "comer un sandwich" }, "tipo": 3, "imagen": { @@ -227,7 +287,7 @@ "id": 13, "texto": { "en": "buy", - "pt": "Comprar" + "es": "comprar" }, "tipo": 3, "imagen": { @@ -241,21 +301,47 @@ "id": 14, "texto": { "en": "give", - "pt": "dar" + "es": "dame" }, "tipo": 3, "imagen": { "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_dar.webp?alt=media&token=792b74d2-9da1-4fc2-9c21-14fdae807a67" }, - "relacion": [], + "relacion": [ + { + "id": 427, + "frec": 1 + }, + { + "id": 989, + "frec": 1 + }, + { + "id": 500, + "frec": 1 + }, + { + "id": 774, + "frec": 2 + }, + { + "id": 986, + "frec": 2 + }, + { + "id": 857, + "frec": 1 + } + ], "agenda": 0, - "gps": 0 + "gps": 0, + "esSugerencia": false }, { "id": 15, "texto": { "en": "draw", - "pt": "desenhar" + "es": "dibujar" }, "tipo": 3, "imagen": { @@ -269,7 +355,7 @@ "id": 17, "texto": { "en": "turn on", - "pt": "Ligar" + "es": "encender" }, "tipo": 3, "imagen": { @@ -283,7 +369,7 @@ "id": 18, "texto": { "en": "write", - "pt": "Escreva" + "es": "escribir" }, "tipo": 3, "imagen": { @@ -297,7 +383,7 @@ "id": 19, "texto": { "en": "listen again", - "pt": "Ouça novamente" + "es": "escuchar de nuevo" }, "tipo": 3, "imagen": { @@ -311,7 +397,7 @@ "id": 20, "texto": { "en": "listen to music", - "pt": "escutar musica" + "es": "escuchar música" }, "tipo": 3, "imagen": { @@ -325,7 +411,7 @@ "id": 21, "texto": { "en": "listen", - "pt": "ouço" + "es": "escuchar" }, "tipo": 3, "imagen": { @@ -339,7 +425,7 @@ "id": 22, "texto": { "en": "be", - "pt": "estar" + "es": "estoy" }, "tipo": 3, "imagen": { @@ -348,15 +434,15 @@ "relacion": [ { "id": 133, - "frec": 2 + "frec": 6 }, { "id": 205, - "frec": 1 + "frec": 2 }, { "id": 204, - "frec": 1 + "frec": 4 }, { "id": 181, @@ -380,17 +466,18 @@ }, { "id": 119, - "frec": 1 + "frec": 6 } ], "agenda": 0, - "gps": 0 + "gps": 0, + "esSugerencia": false }, { "id": 23, "texto": { "en": "wait", - "pt": "esperar" + "es": "esperar" }, "tipo": 3, "imagen": { @@ -404,7 +491,7 @@ "id": 26, "texto": { "en": "win", - "pt": "ganhar" + "es": "ganar" }, "tipo": 3, "imagen": { @@ -418,7 +505,7 @@ "id": 28, "texto": { "en": "do", - "pt": "Faz" + "es": "hacer" }, "tipo": 3, "imagen": { @@ -432,13 +519,18 @@ "id": 29, "texto": { "en": "pee", - "pt": "fazer xixi" + "es": "hacer pis" }, "tipo": 3, "imagen": { "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_hacerpis.webp?alt=media&token=4ce82c9c-7cf8-4d10-808f-e06ca0aec6fb" }, - "relacion": [], + "relacion": [ + { + "id": 385, + "frec": 3 + } + ], "agenda": 0, "gps": 0 }, @@ -446,7 +538,7 @@ "id": 30, "texto": { "en": "go", - "pt": "ir" + "es": "ir a" }, "tipo": 3, "imagen": { @@ -455,27 +547,61 @@ "relacion": [ { "id": 653, - "frec": 1 + "frec": 6 }, { "id": 118, + "frec": 7 + }, + { + "id": 650, + "frec": 4 + }, + { + "id": 651, + "frec": 3 + }, + { + "id": 682, + "frec": 1 + }, + { + "id": 688, + "frec": 5 + }, + { + "id": 668, + "frec": 5 + }, + { + "id": 87, + "frec": 1 + }, + { + "id": 51, "frec": 1 } ], "agenda": 0, - "gps": 0 + "gps": 0, + "esSugerencia": false }, { "id": 31, "texto": { "en": "wash hands", - "pt": "lavar as mãos" + "es": "lavarme las manos" }, "tipo": 3, "imagen": { "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_lavamano.webp?alt=media&token=7c486791-926b-4813-8697-d96615f9a1c6" }, - "relacion": [], + "relacion": [ + { + "id": 385, + "frec": 1 + } + ], "agenda": 0, "gps": 0 }, @@ -483,7 +609,7 @@ "id": 32, "texto": { "en": "read", - "pt": "ler" + "es": "leer" }, "tipo": 3, "imagen": { @@ -497,7 +623,7 @@ "id": 33, "texto": { "en": "call someone", - "pt": "chame alguém" + "es": "llamar a alguien" }, "tipo": 3, "imagen": { @@ -510,8 +636,8 @@ { "id": 34, "texto": { - "en": "play", - "pt": "Toque" + "en": "play with", + "es": "jugar con" }, "tipo": 3, "imagen": { @@ -520,25 +646,49 @@ "relacion": [ { "id": 996, - "frec": 4 + "frec": 13 }, { "id": 761, - "frec": 4 + "frec": 15 }, { - "id": 848, - "frec": 2 + "id": 615, + "frec": 5 + }, + { + "id": 632, + "frec": 10 + }, + { + "id": 628, + "frec": 3 + }, + { + "id": 977, + "frec": 1 + }, + { + "id": 982, + "frec": 1 + }, + { + "id": 1005, + "frec": 1 } ], "agenda": 0, - "gps": 0 + "gps": 0, + "edad": [ + "NINO" + ], + "esSugerencia": false }, { "id": 35, "texto": { "en": "look at the mirror", - "pt": "olhe para o espelho" + "es": "mirarme al espejo" }, "tipo": 3, "imagen": { @@ -552,7 +702,7 @@ "id": 38, "texto": { "en": "take a walk", - "pt": "dar um passeio" + "es": "pasear" }, "tipo": 3, "imagen": { @@ -566,13 +716,18 @@ "id": 39, "texto": { "en": "comb", - "pt": "pente" + "es": "peinarme" }, "tipo": 3, "imagen": { "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_peinar.webp?alt=media&token=f97dbc62-edb3-434f-8139-f4f40401caf4" }, - "relacion": [], + "relacion": [ + { + "id": 385, + "frec": 2 + } + ], "agenda": 0, "gps": 0 }, @@ -580,7 +735,7 @@ "id": 41, "texto": { "en": "lose", - "pt": "perder" + "es": "perder" }, "tipo": 3, "imagen": { @@ -594,7 +749,7 @@ "id": 43, "texto": { "en": "paint", - "pt": "pintura" + "es": "pintar" }, "tipo": 3, "imagen": { @@ -608,7 +763,7 @@ "id": 44, "texto": { "en": "want", - "pt": "quer" + "es": "quiero" }, "tipo": 3, "imagen": { @@ -617,53 +772,62 @@ "relacion": [ { "id": 118, - "frec": 3 + "frec": 20 }, { "id": 34, - "frec": 7 + "frec": 43 }, { "id": 29, - "frec": 2 + "frec": 8 }, { "id": 11, - "frec": 1 + "frec": 3 }, { "id": 31, - "frec": 2 + "frec": 3 }, { "id": 39, - "frec": 3 + "frec": 10 }, { "id": 10, - "frec": 1 + "frec": 3 }, { "id": 35, - "frec": 2 + "frec": 4 }, { "id": 5, - "frec": 2 + "frec": 19 }, { "id": 30, - "frec": 2 + "frec": 32 + }, + { + "id": 51, + "frec": 16 + }, + { + "id": 2, + "frec": 11 } ], "agenda": 0, - "gps": 0 + "gps": 0, + "esSugerencia": false }, { "id": 49, "texto": { "en": "have", - "pt": "ter" + "es": "tengo" }, "tipo": 3, "imagen": { @@ -672,35 +836,94 @@ "relacion": [ { "id": 177, - "frec": 1 + "frec": 3 }, { "id": 597, - "frec": 3 + "frec": 4 + }, + { + "id": 662, + "frec": 2 + }, + { + "id": 754, + "frec": 1 + }, + { + "id": 729, + "frec": 2 + }, + { + "id": 572, + "frec": 2 + }, + { + "id": 8, + "frec": 1 } ], "agenda": 0, - "gps": 0 + "gps": 0, + "esSugerencia": false }, { "id": 51, "texto": { "en": "drink", - "pt": "beber" + "es": "tomar" }, "tipo": 3, "imagen": { "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fbeber.webp?alt=media&token=95642655-8bd4-47d7-8222-0244e7491598" }, - "relacion": [], + "relacion": [ + { + "id": 500, + "frec": 1 + }, + { + "id": 497, + "frec": 1 + }, + { + "id": 468, + "frec": 1 + }, + { + "id": 469, + "frec": 1 + }, + { + "id": 471, + "frec": 1 + }, + { + "id": 495, + "frec": 3 + }, + { + "id": 501, + "frec": 5 + }, + { + "id": 484, + "frec": 2 + }, + { + "id": 486, + "frec": 1 + } + ], "agenda": 0, - "gps": 0 + "gps": 0, + "esSugerencia": false }, { "id": 52, "texto": { "en": "hug", - "pt": "abraço" + "es": "abrazar" }, "tipo": 3, "imagen": { @@ -714,7 +937,7 @@ "id": 53, "texto": { "en": "open", - "pt": "aberto" + "es": "abrir" }, "tipo": 3, "imagen": { @@ -728,7 +951,7 @@ "id": 54, "texto": { "en": "hook up", - "pt": "ligar" + "es": "abrochar" }, "tipo": 3, "imagen": { @@ -742,7 +965,7 @@ "id": 57, "texto": { "en": "love", - "pt": "amor" + "es": "amar" }, "tipo": 3, "imagen": { @@ -756,7 +979,7 @@ "id": 61, "texto": { "en": "get down", - "pt": "abaixe-se" + "es": "bajar" }, "tipo": 3, "imagen": { @@ -770,7 +993,7 @@ "id": 64, "texto": { "en": "kiss", - "pt": "beijo" + "es": "besar" }, "tipo": 3, "imagen": { @@ -784,7 +1007,7 @@ "id": 65, "texto": { "en": "ride", - "pt": "passeio" + "es": "cabalgar" }, "tipo": 3, "imagen": { @@ -798,7 +1021,7 @@ "id": 66, "texto": { "en": "fall", - "pt": "cair" + "es": "caer" }, "tipo": 3, "imagen": { @@ -812,7 +1035,7 @@ "id": 68, "texto": { "en": "close", - "pt": "fechar" + "es": "cerrar" }, "tipo": 3, "imagen": { @@ -826,7 +1049,7 @@ "id": 69, "texto": { "en": "grab", - "pt": "agarrar" + "es": "agarrar" }, "tipo": 3, "imagen": { @@ -840,7 +1063,7 @@ "id": 70, "texto": { "en": "run", - "pt": "corre" + "es": "correr" }, "tipo": 3, "imagen": { @@ -854,7 +1077,7 @@ "id": 71, "texto": { "en": "cut", - "pt": "cortar" + "es": "cortar" }, "tipo": 3, "imagen": { @@ -868,7 +1091,7 @@ "id": 76, "texto": { "en": "get in", - "pt": "entrar" + "es": "entrar" }, "tipo": 3, "imagen": { @@ -881,8 +1104,8 @@ { "id": 78, "texto": { - "en": "make love", - "pt": "fazer amor" + "en": "hacer el amor", + "es": "hacer el amor" }, "tipo": 3, "imagen": { @@ -890,13 +1113,16 @@ }, "relacion": [], "agenda": 0, - "gps": 0 + "gps": 0, + "edad": [ + "ADULTO" + ] }, { "id": 79, "texto": { "en": "smell", - "pt": "cheiro" + "es": "oler" }, "tipo": 3, "imagen": { @@ -910,7 +1136,7 @@ "id": 81, "texto": { "en": "investigate", - "pt": "investigar" + "es": "investigar" }, "tipo": 3, "imagen": { @@ -924,7 +1150,7 @@ "id": 82, "texto": { "en": "play with the tablet", - "pt": "brincar com o tablet" + "es": "jugar con la tablet" }, "tipo": 3, "imagen": { @@ -932,13 +1158,16 @@ }, "relacion": [], "agenda": 0, - "gps": 0 + "gps": 0, + "edad": [ + "JOVEN" + ] }, { "id": 85, "texto": { "en": "look", - "pt": "Veja" + "es": "mirar" }, "tipo": 3, "imagen": { @@ -952,7 +1181,7 @@ "id": 86, "texto": { "en": "swim", - "pt": "nadar" + "es": "nadar" }, "tipo": 3, "imagen": { @@ -966,7 +1195,7 @@ "id": 87, "texto": { "en": "take a walk", - "pt": "dar um passeio" + "es": "pasear" }, "tipo": 3, "imagen": { @@ -980,7 +1209,7 @@ "id": 88, "texto": { "en": "beat legs", - "pt": "bater pernas" + "es": "patalear" }, "tipo": 3, "imagen": { @@ -994,7 +1223,7 @@ "id": 90, "texto": { "en": "paint", - "pt": "pintura" + "es": "pintar" }, "tipo": 3, "imagen": { @@ -1008,7 +1237,7 @@ "id": 92, "texto": { "en": "put", - "pt": "colocar" + "es": "poner" }, "tipo": 3, "imagen": { @@ -1022,7 +1251,7 @@ "id": 93, "texto": { "en": "reject", - "pt": "rejeitar" + "es": "rechazar" }, "tipo": 3, "imagen": { @@ -1036,7 +1265,7 @@ "id": 94, "texto": { "en": "laugh", - "pt": "rir" + "es": "reir" }, "tipo": 3, "imagen": { @@ -1050,7 +1279,7 @@ "id": 95, "texto": { "en": "repeat", - "pt": "repetir" + "es": "repetir" }, "tipo": 3, "imagen": { @@ -1064,7 +1293,7 @@ "id": 97, "texto": { "en": "take out", - "pt": "tirar" + "es": "sacar" }, "tipo": 3, "imagen": { @@ -1078,7 +1307,7 @@ "id": 98, "texto": { "en": "go out", - "pt": "saia" + "es": "salir" }, "tipo": 3, "imagen": { @@ -1092,7 +1321,7 @@ "id": 100, "texto": { "en": "dry", - "pt": "seco" + "es": "secar" }, "tipo": 3, "imagen": { @@ -1106,7 +1335,7 @@ "id": 101, "texto": { "en": "seat", - "pt": "assento" + "es": "sentarme" }, "tipo": 3, "imagen": { @@ -1120,7 +1349,7 @@ "id": 103, "texto": { "en": "blow your nose", - "pt": "assoar o nariz" + "es": "sonarme la nariz" }, "tipo": 3, "imagen": { @@ -1134,7 +1363,7 @@ "id": 104, "texto": { "en": "go up", - "pt": "ir para cima" + "es": "subir" }, "tipo": 3, "imagen": { @@ -1148,7 +1377,7 @@ "id": 107, "texto": { "en": "travel", - "pt": "viagem" + "es": "viajar" }, "tipo": 3, "imagen": { @@ -1162,7 +1391,7 @@ "id": 108, "texto": { "en": "travel by car", - "pt": "viajar de carro" + "es": "viajar en auto" }, "tipo": 3, "imagen": { @@ -1176,7 +1405,7 @@ "id": 112, "texto": { "en": "clean", - "pt": "limpar \\ limpo" + "es": "limpiar" }, "tipo": 3, "imagen": { @@ -1190,7 +1419,7 @@ "id": 113, "texto": { "en": "heal", - "pt": "curar" + "es": "curar" }, "tipo": 3, "imagen": { @@ -1204,7 +1433,7 @@ "id": 116, "texto": { "en": "travel", - "pt": "viagem" + "es": "viajar" }, "tipo": 3, "imagen": { @@ -1218,7 +1447,7 @@ "id": 117, "texto": { "en": "touch", - "pt": "tocar" + "es": "tocar" }, "tipo": 3, "imagen": { @@ -1232,7 +1461,7 @@ "id": 118, "texto": { "en": "eat", - "pt": "comer" + "es": "comer" }, "tipo": 3, "imagen": { @@ -1241,11 +1470,11 @@ "relacion": [ { "id": 474, - "frec": 1 + "frec": 3 }, { "id": 504, - "frec": 3 + "frec": 5 }, { "id": 494, @@ -1253,27 +1482,61 @@ }, { "id": 515, - "frec": 1 + "frec": 5 }, { "id": 478, + "frec": 4 + }, + { + "id": 482, + "frec": 4 + }, + { + "id": 481, + "frec": 4 + }, + { + "id": 521, + "frec": 4 + }, + { + "id": 480, + "frec": 2 + }, + { + "id": 483, + "frec": 1 + }, + { + "id": 600, "frec": 1 + }, + { + "id": 400, + "frec": 2 } ], "agenda": 0, - "gps": 0 + "gps": 0, + "esSugerencia": false }, { "id": 119, "texto": { "en": "dull", - "pt": "maçante" + "es": "aburrido" }, "tipo": 4, "imagen": { "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_aburrido.webp?alt=media&token=e307839a-58fe-4c57-8f59-9ede484d2c53" }, - "relacion": [], + "relacion": [ + { + "id": 44, + "frec": 1 + } + ], "agenda": 0, "gps": 0 }, @@ -1281,7 +1544,7 @@ "id": 121, "texto": { "en": "scared", - "pt": "assustada" + "es": "asustado" }, "tipo": 4, "imagen": { @@ -1295,7 +1558,7 @@ "id": 122, "texto": { "en": "acid", - "pt": "ácido" + "es": "ácido" }, "tipo": 4, "imagen": { @@ -1309,7 +1572,7 @@ "id": 123, "texto": { "en": "tall", - "pt": "alta" + "es": "alto" }, "tipo": 4, "imagen": { @@ -1323,7 +1586,7 @@ "id": 124, "texto": { "en": "anxious", - "pt": "ansioso" + "es": "ansioso" }, "tipo": 4, "imagen": { @@ -1337,7 +1600,7 @@ "id": 125, "texto": { "en": "grieved", - "pt": "sofrido" + "es": "apenado" }, "tipo": 4, "imagen": { @@ -1351,7 +1614,7 @@ "id": 126, "texto": { "en": "fixed", - "pt": "fixo" + "es": "arreglado" }, "tipo": 4, "imagen": { @@ -1365,7 +1628,7 @@ "id": 129, "texto": { "en": "absent", - "pt": "ausente" + "es": "ausente" }, "tipo": 4, "imagen": { @@ -1379,7 +1642,7 @@ "id": 130, "texto": { "en": "short", - "pt": "curto" + "es": "bajo" }, "tipo": 4, "imagen": { @@ -1393,7 +1656,7 @@ "id": 131, "texto": { "en": "cheap", - "pt": "barato" + "es": "barato" }, "tipo": 4, "imagen": { @@ -1407,7 +1670,7 @@ "id": 132, "texto": { "en": "soft", - "pt": "suave" + "es": "blando" }, "tipo": 4, "imagen": { @@ -1421,7 +1684,7 @@ "id": 133, "texto": { "en": "good", - "pt": "Boa" + "es": "bien" }, "tipo": 4, "imagen": { @@ -1435,7 +1698,7 @@ "id": 134, "texto": { "en": "drunk", - "pt": "bêbado" + "es": "borracho" }, "tipo": 4, "imagen": { @@ -1449,7 +1712,7 @@ "id": 135, "texto": { "en": "nice", - "pt": "bom" + "es": "buena" }, "tipo": 4, "imagen": { @@ -1463,7 +1726,7 @@ "id": 136, "texto": { "en": "nice", - "pt": "bom" + "es": "bueno" }, "tipo": 4, "imagen": { @@ -1477,7 +1740,7 @@ "id": 137, "texto": { "en": "tired", - "pt": "cansado" + "es": "Cansado" }, "tipo": 4, "imagen": { @@ -1491,7 +1754,7 @@ "id": 138, "texto": { "en": "expensive", - "pt": "caro" + "es": "caro" }, "tipo": 4, "imagen": { @@ -1505,7 +1768,7 @@ "id": 139, "texto": { "en": "hot", - "pt": "quente" + "es": "caliente" }, "tipo": 4, "imagen": { @@ -1519,7 +1782,7 @@ "id": 140, "texto": { "en": "hot", - "pt": "quente" + "es": "caliente" }, "tipo": 4, "imagen": { @@ -1533,7 +1796,7 @@ "id": 141, "texto": { "en": "warm", - "pt": "caloroso" + "es": "caluroso" }, "tipo": 4, "imagen": { @@ -1547,7 +1810,7 @@ "id": 144, "texto": { "en": "expensive", - "pt": "caro" + "es": "caro" }, "tipo": 4, "imagen": { @@ -1561,7 +1824,7 @@ "id": 147, "texto": { "en": "clear", - "pt": "Claro" + "es": "claro" }, "tipo": 4, "imagen": { @@ -1575,7 +1838,7 @@ "id": 149, "texto": { "en": "comfortable", - "pt": "confortável" + "es": "cómodo" }, "tipo": 4, "imagen": { @@ -1589,7 +1852,7 @@ "id": 153, "texto": { "en": "quarter", - "pt": "trimestre" + "es": "cuarto" }, "tipo": 4, "imagen": { @@ -1603,7 +1866,7 @@ "id": 156, "texto": { "en": "unkwown", - "pt": "despreocupado" + "es": "desconocido" }, "tipo": 4, "imagen": { @@ -1617,7 +1880,7 @@ "id": 158, "texto": { "en": "tousled", - "pt": "despenteado" + "es": "despeinada" }, "tipo": 4, "imagen": { @@ -1631,7 +1894,7 @@ "id": 159, "texto": { "en": "tousled", - "pt": "despenteado" + "es": "despeinado" }, "tipo": 4, "imagen": { @@ -1645,7 +1908,7 @@ "id": 161, "texto": { "en": "funny", - "pt": "engraçado" + "es": "divertido" }, "tipo": 4, "imagen": { @@ -1659,7 +1922,7 @@ "id": 162, "texto": { "en": "hard", - "pt": "Difícil" + "es": "duro" }, "tipo": 4, "imagen": { @@ -1673,7 +1936,7 @@ "id": 164, "texto": { "en": "in love", - "pt": "apaixonado" + "es": "enamorado" }, "tipo": 4, "imagen": { @@ -1687,7 +1950,7 @@ "id": 165, "texto": { "en": "full", - "pt": "cheio" + "es": "entero" }, "tipo": 4, "imagen": { @@ -1701,7 +1964,7 @@ "id": 167, "texto": { "en": "angry", - "pt": "Bravo" + "es": "enojado" }, "tipo": 4, "imagen": { @@ -1715,7 +1978,7 @@ "id": 171, "texto": { "en": "happy", - "pt": "feliz" + "es": "feliz" }, "tipo": 4, "imagen": { @@ -1729,7 +1992,7 @@ "id": 172, "texto": { "en": "ugly", - "pt": "feio" + "es": "feo" }, "tipo": 4, "imagen": { @@ -1743,7 +2006,7 @@ "id": 177, "texto": { "en": "cold", - "pt": "frio" + "es": "frío" }, "tipo": 4, "imagen": { @@ -1751,13 +2014,14 @@ }, "relacion": [], "agenda": 0, - "gps": 0 + "gps": 0, + "esSugerencia": false }, { "id": 178, "texto": { "en": "chilly", - "pt": "frio" + "es": "frío" }, "tipo": 4, "imagen": { @@ -1771,7 +2035,7 @@ "id": 179, "texto": { "en": "chilly", - "pt": "frio" + "es": "frío" }, "tipo": 4, "imagen": { @@ -1785,7 +2049,7 @@ "id": 181, "texto": { "en": "happy", - "pt": "feliz" + "es": "feliz" }, "tipo": 4, "imagen": { @@ -1799,7 +2063,7 @@ "id": 194, "texto": { "en": "irritated", - "pt": "irritado" + "es": "irritado" }, "tipo": 4, "imagen": { @@ -1813,7 +2077,7 @@ "id": 199, "texto": { "en": "lean", - "pt": "inclinar-se" + "es": "límpio" }, "tipo": 4, "imagen": { @@ -1827,7 +2091,7 @@ "id": 200, "texto": { "en": "nice", - "pt": "bom" + "es": "lindo" }, "tipo": 4, "imagen": { @@ -1841,7 +2105,7 @@ "id": 203, "texto": { "en": "bad", - "pt": "mau" + "es": "malo" }, "tipo": 4, "imagen": { @@ -1855,7 +2119,7 @@ "id": 204, "texto": { "en": "so so", - "pt": "mais ou menos" + "es": "mas o menos" }, "tipo": 4, "imagen": { @@ -1869,7 +2133,7 @@ "id": 205, "texto": { "en": "bad", - "pt": "mau" + "es": "mal" }, "tipo": 4, "imagen": { @@ -1883,7 +2147,7 @@ "id": 207, "texto": { "en": "annoying", - "pt": "irritante" + "es": "molesto" }, "tipo": 4, "imagen": { @@ -1897,7 +2161,7 @@ "id": 208, "texto": { "en": "half", - "pt": "metade" + "es": "medio" }, "tipo": 4, "imagen": { @@ -1911,7 +2175,7 @@ "id": 210, "texto": { "en": "equals", - "pt": "é igual a" + "es": "mismo" }, "tipo": 4, "imagen": { @@ -1925,7 +2189,7 @@ "id": 212, "texto": { "en": "upset", - "pt": "chateado" + "es": "molesto" }, "tipo": 4, "imagen": { @@ -1939,7 +2203,7 @@ "id": 213, "texto": { "en": "a lot", - "pt": "muito" + "es": "mucho" }, "tipo": 4, "imagen": { @@ -1953,7 +2217,7 @@ "id": 217, "texto": { "en": "nervous", - "pt": "nervoso" + "es": "nervioso" }, "tipo": 4, "imagen": { @@ -1967,7 +2231,7 @@ "id": 218, "texto": { "en": "none", - "pt": "Nenhum" + "es": "ninguno" }, "tipo": 4, "imagen": { @@ -1981,7 +2245,7 @@ "id": 219, "texto": { "en": "cloudy", - "pt": "nublado" + "es": "nublado" }, "tipo": 4, "imagen": { @@ -1995,7 +2259,7 @@ "id": 233, "texto": { "en": "few", - "pt": "poucos" + "es": "poco" }, "tipo": 4, "imagen": { @@ -2009,7 +2273,7 @@ "id": 234, "texto": { "en": "few", - "pt": "poucos" + "es": "pocos" }, "tipo": 4, "imagen": { @@ -2023,7 +2287,7 @@ "id": 237, "texto": { "en": "worried", - "pt": "preocupado" + "es": "preocupada" }, "tipo": 4, "imagen": { @@ -2037,7 +2301,7 @@ "id": 238, "texto": { "en": "ready", - "pt": "pronto" + "es": "preparado" }, "tipo": 4, "imagen": { @@ -2051,7 +2315,7 @@ "id": 242, "texto": { "en": "wealthy", - "pt": "rico" + "es": "rica" }, "tipo": 4, "imagen": { @@ -2065,7 +2329,7 @@ "id": 244, "texto": { "en": "sturdy", - "pt": "robusto" + "es": "robusto" }, "tipo": 4, "imagen": { @@ -2079,7 +2343,7 @@ "id": 245, "texto": { "en": "chubby", - "pt": "gordo" + "es": "gordito" }, "tipo": 4, "imagen": { @@ -2093,7 +2357,7 @@ "id": 248, "texto": { "en": "salty", - "pt": "salgado" + "es": "salado" }, "tipo": 4, "imagen": { @@ -2107,7 +2371,7 @@ "id": 253, "texto": { "en": "thirsty", - "pt": "com sede" + "es": "sediento" }, "tipo": 4, "imagen": { @@ -2121,7 +2385,7 @@ "id": 256, "texto": { "en": "sunny", - "pt": "ensolarado" + "es": "soleado" }, "tipo": 4, "imagen": { @@ -2135,7 +2399,7 @@ "id": 263, "texto": { "en": "dirty", - "pt": "sujo" + "es": "súcio" }, "tipo": 4, "imagen": { @@ -2149,7 +2413,7 @@ "id": 267, "texto": { "en": "all", - "pt": "todos" + "es": "todos" }, "tipo": 4, "imagen": { @@ -2163,7 +2427,7 @@ "id": 268, "texto": { "en": "all", - "pt": "todos" + "es": "todas" }, "tipo": 4, "imagen": { @@ -2177,7 +2441,7 @@ "id": 272, "texto": { "en": "sad", - "pt": "triste" + "es": "tríste" }, "tipo": 4, "imagen": { @@ -2191,7 +2455,7 @@ "id": 274, "texto": { "en": "crazy", - "pt": "louco" + "es": "un poco loco" }, "tipo": 4, "imagen": { @@ -2205,7 +2469,7 @@ "id": 280, "texto": { "en": "shamefaced", - "pt": "envergonhado" + "es": "vergonzante" }, "tipo": 4, "imagen": { @@ -2219,7 +2483,7 @@ "id": 281, "texto": { "en": "old", - "pt": "velho" + "es": "viejo" }, "tipo": 4, "imagen": { @@ -2233,7 +2497,7 @@ "id": 282, "texto": { "en": "elderly", - "pt": "idosos" + "es": "viejo" }, "tipo": 4, "imagen": { @@ -2247,7 +2511,7 @@ "id": 283, "texto": { "en": "bee", - "pt": "abelha" + "es": "abeja" }, "tipo": 2, "imagen": { @@ -2261,7 +2525,7 @@ "id": 286, "texto": { "en": "animals", - "pt": "animais" + "es": "animales" }, "tipo": 2, "imagen": { @@ -2275,7 +2539,7 @@ "id": 288, "texto": { "en": "donkey", - "pt": "asno" + "es": "asno" }, "tipo": 2, "imagen": { @@ -2289,7 +2553,7 @@ "id": 290, "texto": { "en": "whale", - "pt": "baleia" + "es": "ballena" }, "tipo": 2, "imagen": { @@ -2303,7 +2567,7 @@ "id": 293, "texto": { "en": "horse", - "pt": "cavalo" + "es": "caballo" }, "tipo": 2, "imagen": { @@ -2317,7 +2581,7 @@ "id": 294, "texto": { "en": "goat", - "pt": "bode" + "es": "cabra" }, "tipo": 2, "imagen": { @@ -2331,7 +2595,7 @@ "id": 296, "texto": { "en": "camel", - "pt": "camelo" + "es": "camello" }, "tipo": 2, "imagen": { @@ -2345,7 +2609,7 @@ "id": 297, "texto": { "en": "bird", - "pt": "pássaro" + "es": "canario" }, "tipo": 2, "imagen": { @@ -2359,7 +2623,7 @@ "id": 298, "texto": { "en": "crab", - "pt": "caranguejo" + "es": "cangrejo" }, "tipo": 2, "imagen": { @@ -2373,7 +2637,7 @@ "id": 299, "texto": { "en": "snail", - "pt": "Caracol" + "es": "caracol" }, "tipo": 2, "imagen": { @@ -2387,7 +2651,7 @@ "id": 301, "texto": { "en": "pig", - "pt": "porco" + "es": "cerdo" }, "tipo": 2, "imagen": { @@ -2401,7 +2665,7 @@ "id": 310, "texto": { "en": "cock", - "pt": "galo" + "es": "gallo" }, "tipo": 2, "imagen": { @@ -2415,7 +2679,7 @@ "id": 313, "texto": { "en": "cat", - "pt": "gato" + "es": "gato" }, "tipo": 2, "imagen": { @@ -2429,7 +2693,7 @@ "id": 314, "texto": { "en": "cricket", - "pt": "Grilo" + "es": "grillo" }, "tipo": 2, "imagen": { @@ -2443,7 +2707,7 @@ "id": 320, "texto": { "en": "giraffe", - "pt": "girafa" + "es": "jirafa" }, "tipo": 2, "imagen": { @@ -2457,7 +2721,7 @@ "id": 323, "texto": { "en": "lion", - "pt": "leão" + "es": "león" }, "tipo": 2, "imagen": { @@ -2471,7 +2735,7 @@ "id": 327, "texto": { "en": "butterfly", - "pt": "borboleta" + "es": "mariposa" }, "tipo": 2, "imagen": { @@ -2485,7 +2749,7 @@ "id": 331, "texto": { "en": "bear", - "pt": "Urso" + "es": "oso" }, "tipo": 2, "imagen": { @@ -2499,7 +2763,7 @@ "id": 332, "texto": { "en": "sheep", - "pt": "ovelha" + "es": "oveja" }, "tipo": 2, "imagen": { @@ -2513,7 +2777,7 @@ "id": 333, "texto": { "en": "bird", - "pt": "pássaro" + "es": "pájaro" }, "tipo": 2, "imagen": { @@ -2527,7 +2791,7 @@ "id": 334, "texto": { "en": "birdie", - "pt": "passarinho" + "es": "pájarito" }, "tipo": 2, "imagen": { @@ -2541,7 +2805,7 @@ "id": 335, "texto": { "en": "pidgeon", - "pt": "pidgeon" + "es": "paloma" }, "tipo": 2, "imagen": { @@ -2555,7 +2819,7 @@ "id": 337, "texto": { "en": "duck", - "pt": "Pato" + "es": "pato" }, "tipo": 2, "imagen": { @@ -2569,7 +2833,7 @@ "id": 340, "texto": { "en": "fish", - "pt": "peixe" + "es": "peces" }, "tipo": 2, "imagen": { @@ -2583,7 +2847,7 @@ "id": 342, "texto": { "en": "dog", - "pt": "cachorro" + "es": "perro" }, "tipo": 2, "imagen": { @@ -2597,7 +2861,7 @@ "id": 348, "texto": { "en": "frog", - "pt": "rã" + "es": "rana" }, "tipo": 2, "imagen": { @@ -2611,7 +2875,7 @@ "id": 354, "texto": { "en": "tiger", - "pt": "tigre" + "es": "tigre" }, "tipo": 2, "imagen": { @@ -2625,7 +2889,7 @@ "id": 356, "texto": { "en": "tortoise", - "pt": "tartaruga" + "es": "tortuga" }, "tipo": 2, "imagen": { @@ -2639,7 +2903,7 @@ "id": 357, "texto": { "en": "cow", - "pt": "vaca" + "es": "vaca" }, "tipo": 2, "imagen": { @@ -2653,7 +2917,7 @@ "id": 359, "texto": { "en": "snake", - "pt": "serpente" + "es": "víbora" }, "tipo": 2, "imagen": { @@ -2667,7 +2931,7 @@ "id": 362, "texto": { "en": "cock", - "pt": "galo" + "es": "gallo" }, "tipo": 2, "imagen": { @@ -2681,7 +2945,7 @@ "id": 363, "texto": { "en": "tuna", - "pt": "atum" + "es": "atún" }, "tipo": 2, "imagen": { @@ -2695,7 +2959,7 @@ "id": 374, "texto": { "en": "veal", - "pt": "vitela" + "es": "ternera" }, "tipo": 2, "imagen": { @@ -2709,7 +2973,7 @@ "id": 375, "texto": { "en": "pig", - "pt": "porco" + "es": "cerdo" }, "tipo": 2, "imagen": { @@ -2723,7 +2987,7 @@ "id": 376, "texto": { "en": "rabbit", - "pt": "Coelho" + "es": "conejo" }, "tipo": 2, "imagen": { @@ -2737,7 +3001,7 @@ "id": 377, "texto": { "en": "Hello", - "pt": "Olá" + "es": "Hola" }, "tipo": 5, "imagen": { @@ -2746,11 +3010,11 @@ "relacion": [ { "id": 378, - "frec": 5 + "frec": 15 }, { "id": 49, - "frec": 3 + "frec": 5 }, { "id": 44, @@ -2758,88 +3022,158 @@ }, { "id": 380, - "frec": 1 + "frec": 6 }, { "id": 632, - "frec": 1 + "frec": 3 }, { "id": 628, - "frec": 1 + "frec": 2 }, { "id": 381, - "frec": 1 + "frec": 2 }, { "id": 379, + "frec": 8 + }, + { + "id": 22, "frec": 1 } ], "agenda": 0, - "gps": 0 + "gps": 0, + "esSugerencia": false }, { "id": 378, "texto": { "en": "How are you?", - "pt": "Como você está?" + "es": "¿Cómo estás?" }, "tipo": 5, "imagen": { "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_como_estas.webp?alt=media&token=5580c46b-0516-413e-9c94-87a6c4d47410" }, - "relacion": [], + "relacion": [ + { + "id": 22, + "frec": 2 + }, + { + "id": 49, + "frec": 1 + }, + { + "id": 44, + "frec": 1 + }, + { + "id": 401, + "frec": 1 + } + ], "agenda": 0, - "gps": 0 + "gps": 0, + "esSugerencia": false }, { "id": 379, "texto": { - "en": "Good morning", - "pt": "Bom Dia" + "en": "Good day", + "es": "Buen día" }, "tipo": 5, "imagen": { "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_buenos_dias.webp?alt=media&token=0d7fe795-3024-45fb-8ba5-bd361d2c61ee" }, - "relacion": [], + "relacion": [ + { + "id": 22, + "frec": 1 + }, + { + "id": 44, + "frec": 1 + }, + { + "id": 49, + "frec": 1 + } + ], "agenda": 0, "horario": [ "MANANA" ], - "gps": 0 + "gps": 0, + "esSugerencia": false, + "hora": [ + "MANANA" + ] }, { "id": 380, "texto": { "en": "Good afternoon", - "pt": "Boa tarde" + "es": "Buenas tardes" }, "tipo": 5, "imagen": { "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_buenas_tardes.webp?alt=media&token=b42a7da3-eb59-4685-8d2d-5402cb3bbddb" }, - "relacion": [], + "relacion": [ + { + "id": 22, + "frec": 1 + }, + { + "id": 49, + "frec": 1 + }, + { + "id": 44, + "frec": 1 + } + ], "agenda": 0, "horario": [ "MEDIODIA", "TARDE" ], - "gps": 0 + "gps": 0, + "esSugerencia": false, + "hora": [ + "TARDE" + ] }, { "id": 381, "texto": { "en": "Good night", - "pt": "Boa noite" + "es": "Buenas noches" }, "tipo": 5, "imagen": { "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_buenas_noches.webp?alt=media&token=ed63a9b2-8617-48d0-ad6b-4c699eb2bce6" }, - "relacion": [], + "relacion": [ + { + "id": 22, + "frec": 1 + }, + { + "id": 49, + "frec": 1 + }, + { + "id": 44, + "frec": 1 + } + ], "agenda": 0, "horario": [ "NOCHE" @@ -2850,7 +3184,7 @@ "id": 382, "texto": { "en": "bye", - "pt": "tchau" + "es": "Adiós" }, "tipo": 5, "imagen": { @@ -2858,13 +3192,14 @@ }, "relacion": [], "agenda": 0, - "gps": 0 + "gps": 0, + "esSugerencia": false }, { "id": 383, "texto": { "en": "Please", - "pt": "Por favor" + "es": "Por favor" }, "tipo": 5, "imagen": { @@ -2878,7 +3213,7 @@ "id": 384, "texto": { "en": "Thank you", - "pt": "Obrigado" + "es": "Gracias" }, "tipo": 5, "imagen": { @@ -2886,13 +3221,14 @@ }, "relacion": [], "agenda": 0, - "gps": 0 + "gps": 0, + "esSugerencia": false }, { "id": 385, "texto": { "en": "Help", - "pt": "Socorro" + "es": ". ¿me ayudas?" }, "tipo": 5, "imagen": { @@ -2906,7 +3242,7 @@ "id": 386, "texto": { "en": "Luck", - "pt": "Sorte" + "es": "suerte" }, "tipo": 5, "imagen": { @@ -2920,7 +3256,7 @@ "id": 387, "texto": { "en": "Good bye", - "pt": "Adeus" + "es": "Chau" }, "tipo": 5, "imagen": { @@ -2934,35 +3270,63 @@ "id": 388, "texto": { "en": "Yes", - "pt": "sim" + "es": "Si" }, "tipo": 5, "imagen": { "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_si.webp?alt=media&token=c55c8d1d-d5ff-4e1a-9283-e0ed5c1e587d" }, - "relacion": [], + "relacion": [ + { + "id": 49, + "frec": 5 + }, + { + "id": 44, + "frec": 1 + }, + { + "id": 22, + "frec": 1 + } + ], "agenda": 0, - "gps": 0 + "gps": 0, + "esSugerencia": false }, { "id": 389, "texto": { "en": "No", - "pt": "Não" + "es": "No" }, "tipo": 5, "imagen": { "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_no.webp?alt=media&token=a8446260-23d3-4a04-83da-3119d521bb70" }, - "relacion": [], + "relacion": [ + { + "id": 49, + "frec": 13 + }, + { + "id": 22, + "frec": 6 + }, + { + "id": 44, + "frec": 1 + } + ], "agenda": 0, - "gps": 0 + "gps": 0, + "esSugerencia": false }, { "id": 390, "texto": { "en": "I would love to", - "pt": "eu adoraria" + "es": "Me encantaría" }, "tipo": 5, "imagen": { @@ -2976,7 +3340,7 @@ "id": 391, "texto": { "en": "chard", - "pt": "acelga" + "es": "acelga" }, "tipo": 2, "imagen": { @@ -2990,7 +3354,7 @@ "id": 393, "texto": { "en": "almond", - "pt": "amêndoa" + "es": "almendras" }, "tipo": 2, "imagen": { @@ -3004,7 +3368,7 @@ "id": 394, "texto": { "en": "pineapple", - "pt": "abacaxi" + "es": "ananá" }, "tipo": 2, "imagen": { @@ -3018,7 +3382,7 @@ "id": 396, "texto": { "en": "sugar", - "pt": "açúcar" + "es": "azúcar" }, "tipo": 2, "imagen": { @@ -3032,7 +3396,7 @@ "id": 398, "texto": { "en": "sandwich", - "pt": "sanduíche" + "es": "bocadillo" }, "tipo": 2, "imagen": { @@ -3046,7 +3410,7 @@ "id": 399, "texto": { "en": "pumpkin", - "pt": "abóbora" + "es": "calabaza" }, "tipo": 2, "imagen": { @@ -3060,7 +3424,7 @@ "id": 400, "texto": { "en": "caneloni", - "pt": "caneloni" + "es": "canelones" }, "tipo": 2, "imagen": { @@ -3074,7 +3438,7 @@ "id": 401, "texto": { "en": "cappchino", - "pt": "cappchino" + "es": "capuchino" }, "tipo": 2, "imagen": { @@ -3088,7 +3452,7 @@ "id": 402, "texto": { "en": "chestnuts", - "pt": "chestnuts" + "es": "castañas" }, "tipo": 2, "imagen": { @@ -3102,7 +3466,7 @@ "id": 403, "texto": { "en": "onion", - "pt": "onion" + "es": "cebolla" }, "tipo": 2, "imagen": { @@ -3116,7 +3480,7 @@ "id": 404, "texto": { "en": "cherry", - "pt": "cherry" + "es": "cerezas" }, "tipo": 2, "imagen": { @@ -3129,8 +3493,8 @@ { "id": 406, "texto": { - "en": "lollipop", - "pt": "lollipop" + "en": "chupetin", + "es": "chupetin" }, "tipo": 2, "imagen": { @@ -3138,13 +3502,16 @@ }, "relacion": [], "agenda": 0, - "gps": 0 + "gps": 0, + "edad": [ + "NINO" + ] }, { "id": 407, "texto": { "en": "plum", - "pt": "plum" + "es": "ciruela" }, "tipo": 2, "imagen": { @@ -3158,7 +3525,7 @@ "id": 408, "texto": { "en": "apricot", - "pt": "apricot" + "es": "damasco" }, "tipo": 2, "imagen": { @@ -3172,7 +3539,7 @@ "id": 412, "texto": { "en": "creme caramel", - "pt": "creme caramel" + "es": "flan" }, "tipo": 2, "imagen": { @@ -3186,7 +3553,7 @@ "id": 413, "texto": { "en": "raspberry", - "pt": "raspberry" + "es": "frambuesa" }, "tipo": 2, "imagen": { @@ -3200,7 +3567,7 @@ "id": 414, "texto": { "en": "strawberry", - "pt": "strawberry" + "es": "frutilla" }, "tipo": 2, "imagen": { @@ -3214,7 +3581,7 @@ "id": 415, "texto": { "en": "cookie", - "pt": "cookie" + "es": "galleta" }, "tipo": 2, "imagen": { @@ -3228,7 +3595,7 @@ "id": 417, "texto": { "en": "jelly", - "pt": "jelly" + "es": "gelatina" }, "tipo": 2, "imagen": { @@ -3242,7 +3609,7 @@ "id": 420, "texto": { "en": "boiled egg", - "pt": "boiled egg" + "es": "huevo duro" }, "tipo": 2, "imagen": { @@ -3256,7 +3623,7 @@ "id": 421, "texto": { "en": "fried eg", - "pt": "fried eg" + "es": "huevo frito" }, "tipo": 2, "imagen": { @@ -3270,7 +3637,7 @@ "id": 424, "texto": { "en": "canned tuna", - "pt": "canned tuna" + "es": "lata de atún" }, "tipo": 2, "imagen": { @@ -3284,7 +3651,7 @@ "id": 425, "texto": { "en": "canned sardine", - "pt": "canned sardine" + "es": "lata de sardinas" }, "tipo": 2, "imagen": { @@ -3297,8 +3664,8 @@ { "id": 426, "texto": { - "en": "choclote milk", - "pt": "choclote milk" + "en": "milk with cacao", + "es": "leche con cacáo" }, "tipo": 2, "imagen": { @@ -3306,13 +3673,16 @@ }, "relacion": [], "agenda": 0, - "gps": 0 + "gps": 0, + "edad": [ + "NINO" + ] }, { "id": 427, "texto": { "en": "milk and cookies", - "pt": "milk and cookies" + "es": "leche y galletas" }, "tipo": 2, "imagen": { @@ -3326,7 +3696,7 @@ "id": 428, "texto": { "en": "lettuce", - "pt": "lettuce" + "es": "lechuga" }, "tipo": 2, "imagen": { @@ -3340,7 +3710,7 @@ "id": 430, "texto": { "en": "corn", - "pt": "corn" + "es": "maiz" }, "tipo": 2, "imagen": { @@ -3354,7 +3724,7 @@ "id": 431, "texto": { "en": "butter", - "pt": "butter" + "es": "manteca" }, "tipo": 2, "imagen": { @@ -3368,7 +3738,7 @@ "id": 432, "texto": { "en": "peach", - "pt": "peach" + "es": "durazno" }, "tipo": 2, "imagen": { @@ -3382,7 +3752,7 @@ "id": 435, "texto": { "en": "orange", - "pt": "orange" + "es": "naranja" }, "tipo": 2, "imagen": { @@ -3396,7 +3766,7 @@ "id": 438, "texto": { "en": "white bread", - "pt": "white bread" + "es": "pan blanco" }, "tipo": 2, "imagen": { @@ -3410,7 +3780,7 @@ "id": 439, "texto": { "en": "black bread", - "pt": "black bread" + "es": "pan negro" }, "tipo": 2, "imagen": { @@ -3424,7 +3794,7 @@ "id": 447, "texto": { "en": "grapefruit", - "pt": "grapefruit" + "es": "pomelo" }, "tipo": 2, "imagen": { @@ -3438,7 +3808,7 @@ "id": 449, "texto": { "en": "smashed potatoes", - "pt": "smashed potatoes" + "es": "puré" }, "tipo": 2, "imagen": { @@ -3452,7 +3822,7 @@ "id": 458, "texto": { "en": "sandwich", - "pt": "sandwich" + "es": "sandwich" }, "tipo": 2, "imagen": { @@ -3466,7 +3836,7 @@ "id": 462, "texto": { "en": "pie", - "pt": "pie" + "es": "tarta" }, "tipo": 2, "imagen": { @@ -3480,7 +3850,7 @@ "id": 463, "texto": { "en": "tomato", - "pt": "tomato" + "es": "tomate" }, "tipo": 2, "imagen": { @@ -3494,7 +3864,7 @@ "id": 465, "texto": { "en": "toast", - "pt": "toast" + "es": "tostada" }, "tipo": 2, "imagen": { @@ -3508,7 +3878,7 @@ "id": 468, "texto": { "en": "apple juice", - "pt": "apple juice" + "es": "jugo de manzana" }, "tipo": 2, "imagen": { @@ -3522,7 +3892,7 @@ "id": 469, "texto": { "en": "peach juice", - "pt": "peach juice" + "es": "jugo de durazno" }, "tipo": 2, "imagen": { @@ -3536,7 +3906,7 @@ "id": 471, "texto": { "en": "grape juice", - "pt": "grape juice" + "es": "jugo de uva" }, "tipo": 2, "imagen": { @@ -3550,7 +3920,7 @@ "id": 472, "texto": { "en": "soup", - "pt": "soup" + "es": "Sopa" }, "tipo": 2, "imagen": { @@ -3564,7 +3934,7 @@ "id": 473, "texto": { "en": "banana", - "pt": "banana" + "es": "banana" }, "tipo": 2, "imagen": { @@ -3578,7 +3948,7 @@ "id": 474, "texto": { "en": "apple", - "pt": "apple" + "es": "manzana" }, "tipo": 2, "imagen": { @@ -3592,7 +3962,7 @@ "id": 475, "texto": { "en": "pear", - "pt": "pear" + "es": "pera" }, "tipo": 2, "imagen": { @@ -3606,7 +3976,7 @@ "id": 476, "texto": { "en": "fish", - "pt": "fish" + "es": "pescado" }, "tipo": 2, "imagen": { @@ -3620,7 +3990,7 @@ "id": 477, "texto": { "en": "salad", - "pt": "salad" + "es": "ensalada" }, "tipo": 2, "imagen": { @@ -3634,7 +4004,7 @@ "id": 478, "texto": { "en": "vegetables", - "pt": "vegetables" + "es": "verduras" }, "tipo": 2, "imagen": { @@ -3642,13 +4012,14 @@ }, "relacion": [], "agenda": 0, - "gps": 0 + "gps": 0, + "esSugerencia": false }, { "id": 480, "texto": { "en": "pasta", - "pt": "pasta" + "es": "pasta" }, "tipo": 2, "imagen": { @@ -3662,7 +4033,7 @@ "id": 481, "texto": { "en": "rice", - "pt": "rice" + "es": "arroz" }, "tipo": 2, "imagen": { @@ -3676,7 +4047,7 @@ "id": 482, "texto": { "en": "beef", - "pt": "beef" + "es": "carne" }, "tipo": 2, "imagen": { @@ -3684,13 +4055,14 @@ }, "relacion": [], "agenda": 0, - "gps": 0 + "gps": 0, + "esSugerencia": false }, { "id": 483, "texto": { "en": "fruit", - "pt": "fruit" + "es": "fruta" }, "tipo": 2, "imagen": { @@ -3704,7 +4076,7 @@ "id": 484, "texto": { "en": "yoghurt", - "pt": "yoghurt" + "es": "yogur" }, "tipo": 2, "imagen": { @@ -3718,7 +4090,7 @@ "id": 485, "texto": { "en": "cake", - "pt": "cake" + "es": "torta" }, "tipo": 2, "imagen": { @@ -3732,7 +4104,7 @@ "id": 486, "texto": { "en": "ice cream", - "pt": "ice cream" + "es": "helado" }, "tipo": 2, "imagen": { @@ -3746,7 +4118,7 @@ "id": 487, "texto": { "en": "oil", - "pt": "oil" + "es": "aceite" }, "tipo": 2, "imagen": { @@ -3760,7 +4132,7 @@ "id": 489, "texto": { "en": "salt", - "pt": "salt" + "es": "sal" }, "tipo": 2, "imagen": { @@ -3774,7 +4146,7 @@ "id": 490, "texto": { "en": "mayo", - "pt": "mayo" + "es": "mayonesa" }, "tipo": 2, "imagen": { @@ -3788,7 +4160,7 @@ "id": 492, "texto": { "en": "ketchup", - "pt": "ketchup" + "es": "ketchup" }, "tipo": 2, "imagen": { @@ -3801,8 +4173,8 @@ { "id": 494, "texto": { - "en": "candy", - "pt": "candy" + "en": "Candy", + "es": "Golosina" }, "tipo": 2, "imagen": { @@ -3810,13 +4182,17 @@ }, "relacion": [], "agenda": 0, - "gps": 0 + "gps": 0, + "edad": [ + "JOVEN", + "NINO" + ] }, { "id": 495, "texto": { "en": "milk", - "pt": "milk" + "es": "leche" }, "tipo": 2, "imagen": { @@ -3830,7 +4206,7 @@ "id": 496, "texto": { "en": "coffee", - "pt": "coffee" + "es": "café" }, "tipo": 2, "imagen": { @@ -3844,7 +4220,7 @@ "id": 497, "texto": { "en": "juice", - "pt": "juice" + "es": "jugo" }, "tipo": 2, "imagen": { @@ -3858,7 +4234,7 @@ "id": 498, "texto": { "en": "chocolate", - "pt": "chocolate" + "es": "chocolate" }, "tipo": 2, "imagen": { @@ -3872,7 +4248,7 @@ "id": 499, "texto": { "en": "te", - "pt": "te" + "es": "té" }, "tipo": 2, "imagen": { @@ -3886,7 +4262,7 @@ "id": 500, "texto": { "en": "water", - "pt": "agua" + "es": "agua" }, "tipo": 2, "imagen": { @@ -3900,7 +4276,7 @@ "id": 501, "texto": { "en": "soda", - "pt": "refrigerante" + "es": "gaseosa" }, "tipo": 2, "imagen": { @@ -3914,7 +4290,7 @@ "id": 502, "texto": { "en": "beer", - "pt": "Cerveja" + "es": "cerveza" }, "tipo": 2, "imagen": { @@ -3922,13 +4298,16 @@ }, "relacion": [], "agenda": 0, - "gps": 0 + "gps": 0, + "edad": [ + "ADULTO" + ] }, { "id": 503, "texto": { "en": "wine", - "pt": "vinho" + "es": "vino" }, "tipo": 2, "imagen": { @@ -3936,13 +4315,16 @@ }, "relacion": [], "agenda": 0, - "gps": 0 + "gps": 0, + "edad": [ + "ADULTO" + ] }, { "id": 504, "texto": { "en": "poultry", - "pt": "aves de capoeira" + "es": "pollo" }, "tipo": 2, "imagen": { @@ -3950,13 +4332,14 @@ }, "relacion": [], "agenda": 0, - "gps": 0 + "gps": 0, + "esSugerencia": false }, { "id": 505, "texto": { "en": "chicken thigh", - "pt": "coxa de frango" + "es": "muslo de pollo" }, "tipo": 2, "imagen": { @@ -3970,7 +4353,7 @@ "id": 507, "texto": { "en": "egg", - "pt": "ovo" + "es": "huevo" }, "tipo": 2, "imagen": { @@ -3984,7 +4367,7 @@ "id": 510, "texto": { "en": "fish", - "pt": "peixe" + "es": "pescado" }, "tipo": 2, "imagen": { @@ -3998,7 +4381,7 @@ "id": 512, "texto": { "en": "steak", - "pt": "bife" + "es": "filete" }, "tipo": 2, "imagen": { @@ -4012,7 +4395,7 @@ "id": 515, "texto": { "en": "hamburguer", - "pt": "hambúrguer" + "es": "hamburguesa" }, "tipo": 2, "imagen": { @@ -4020,13 +4403,14 @@ }, "relacion": [], "agenda": 0, - "gps": 0 + "gps": 0, + "esSugerencia": false }, { "id": 516, "texto": { "en": "raw ham", - "pt": "presunto cru" + "es": "jamón crudo" }, "tipo": 2, "imagen": { @@ -4040,7 +4424,7 @@ "id": 517, "texto": { "en": "cooked ham", - "pt": "presunto cozido" + "es": "jamón cocido" }, "tipo": 2, "imagen": { @@ -4054,7 +4438,7 @@ "id": 521, "texto": { "en": "cheese", - "pt": "queijo" + "es": "queso" }, "tipo": 2, "imagen": { @@ -4068,7 +4452,7 @@ "id": 524, "texto": { "en": "sausage", - "pt": "linguiça" + "es": "salchichas" }, "tipo": 2, "imagen": { @@ -4082,7 +4466,7 @@ "id": 525, "texto": { "en": "a", - "pt": "uma" + "es": "a" }, "tipo": 6, "imagen": { @@ -4096,7 +4480,7 @@ "id": 526, "texto": { "en": "before", - "pt": "antes" + "es": "ante" }, "tipo": 6, "imagen": { @@ -4110,13 +4494,18 @@ "id": 527, "texto": { "en": "beneath", - "pt": "abaixo" + "es": "bajo" }, "tipo": 6, "imagen": { "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fbajo_prep.webp?alt=media&token=86a87969-ff5a-4c9e-9642-9fc7b8592ef1" }, - "relacion": [], + "relacion": [ + { + "id": 528, + "frec": 1 + } + ], "agenda": 0, "gps": 0 }, @@ -4124,13 +4513,18 @@ "id": 528, "texto": { "en": "with", - "pt": "com" + "es": "con" }, "tipo": 6, "imagen": { "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcon_prep.webp?alt=media&token=4649b3b9-e248-4048-8949-fd75c423a3e3" }, - "relacion": [], + "relacion": [ + { + "id": 1001, + "frec": 1 + } + ], "agenda": 0, "gps": 0 }, @@ -4138,7 +4532,7 @@ "id": 529, "texto": { "en": "against", - "pt": "contra" + "es": "contra" }, "tipo": 6, "imagen": { @@ -4152,7 +4546,7 @@ "id": 530, "texto": { "en": "of", - "pt": "do" + "es": "de" }, "tipo": 6, "imagen": { @@ -4166,7 +4560,7 @@ "id": 531, "texto": { "en": "from", - "pt": "a partir de" + "es": "desde" }, "tipo": 6, "imagen": { @@ -4180,7 +4574,7 @@ "id": 532, "texto": { "en": "during", - "pt": "durante" + "es": "durante" }, "tipo": 6, "imagen": { @@ -4194,7 +4588,7 @@ "id": 533, "texto": { "en": "in", - "pt": "dentro" + "es": "en" }, "tipo": 6, "imagen": { @@ -4208,7 +4602,7 @@ "id": 534, "texto": { "en": "between", - "pt": "entre" + "es": "entre" }, "tipo": 6, "imagen": { @@ -4222,7 +4616,7 @@ "id": 535, "texto": { "en": "towards", - "pt": "em direção" + "es": "hacia" }, "tipo": 6, "imagen": { @@ -4236,7 +4630,7 @@ "id": 536, "texto": { "en": "until", - "pt": "até" + "es": "hasta" }, "tipo": 6, "imagen": { @@ -4250,7 +4644,7 @@ "id": 537, "texto": { "en": "for", - "pt": "para" + "es": "para" }, "tipo": 6, "imagen": { @@ -4264,7 +4658,7 @@ "id": 538, "texto": { "en": "by", - "pt": "de" + "es": "por" }, "tipo": 6, "imagen": { @@ -4278,7 +4672,7 @@ "id": 539, "texto": { "en": "according", - "pt": "de acordo com" + "es": "según" }, "tipo": 6, "imagen": { @@ -4292,7 +4686,7 @@ "id": 540, "texto": { "en": "without", - "pt": "sem" + "es": "sin" }, "tipo": 6, "imagen": { @@ -4306,7 +4700,7 @@ "id": 544, "texto": { "en": "hero", - "pt": "herói" + "es": "heroe" }, "tipo": 2, "imagen": { @@ -4320,7 +4714,7 @@ "id": 552, "texto": { "en": "story", - "pt": "história" + "es": "cuento" }, "tipo": 2, "imagen": { @@ -4334,7 +4728,7 @@ "id": 553, "texto": { "en": "book", - "pt": "livro" + "es": "libro" }, "tipo": 2, "imagen": { @@ -4348,7 +4742,7 @@ "id": 554, "texto": { "en": "movie", - "pt": "filme" + "es": "película" }, "tipo": 2, "imagen": { @@ -4362,7 +4756,7 @@ "id": 557, "texto": { "en": "in love", - "pt": "apaixonado" + "es": "enamorado" }, "tipo": 4, "imagen": { @@ -4376,7 +4770,7 @@ "id": 560, "texto": { "en": "cartoons", - "pt": "desenhos animados" + "es": "dibujos animados" }, "tipo": 2, "imagen": { @@ -4390,7 +4784,7 @@ "id": 561, "texto": { "en": "ticket", - "pt": "bilhete" + "es": "entrada" }, "tipo": 2, "imagen": { @@ -4404,7 +4798,7 @@ "id": 563, "texto": { "en": "row", - "pt": "linha" + "es": "fila" }, "tipo": 2, "imagen": { @@ -4418,7 +4812,7 @@ "id": 564, "texto": { "en": "drink", - "pt": "beber" + "es": "bebida" }, "tipo": 2, "imagen": { @@ -4432,7 +4826,7 @@ "id": 565, "texto": { "en": "popcorn", - "pt": "Pipoca" + "es": "pochoclos" }, "tipo": 2, "imagen": { @@ -4446,7 +4840,7 @@ "id": 567, "texto": { "en": "money", - "pt": "dinheiro" + "es": "dinero" }, "tipo": 2, "imagen": { @@ -4460,7 +4854,7 @@ "id": 568, "texto": { "en": "remote", - "pt": "controlo remoto" + "es": "control remoto" }, "tipo": 2, "imagen": { @@ -4474,7 +4868,7 @@ "id": 572, "texto": { "en": "news", - "pt": "notícia" + "es": "noticias" }, "tipo": 2, "imagen": { @@ -4488,7 +4882,7 @@ "id": 573, "texto": { "en": "music", - "pt": "música" + "es": "música" }, "tipo": 2, "imagen": { @@ -4502,7 +4896,7 @@ "id": 575, "texto": { "en": "cooking channel", - "pt": "canal de cozinha" + "es": "canal de cocina" }, "tipo": 2, "imagen": { @@ -4516,7 +4910,7 @@ "id": 580, "texto": { "en": "cartoons", - "pt": "desenhos animados" + "es": "dibujos animados" }, "tipo": 2, "imagen": { @@ -4530,7 +4924,7 @@ "id": 583, "texto": { "en": "sport channel", - "pt": "canal esportivo" + "es": "deportes" }, "tipo": 2, "imagen": { @@ -4544,7 +4938,7 @@ "id": 587, "texto": { "en": "How much is it?", - "pt": "Quanto isso custa?" + "es": "¿cuánto sale?" }, "tipo": 2, "imagen": { @@ -4558,7 +4952,7 @@ "id": 588, "texto": { "en": "invoice", - "pt": "fatura" + "es": "factura" }, "tipo": 2, "imagen": { @@ -4572,7 +4966,7 @@ "id": 589, "texto": { "en": "lunch", - "pt": "almoço" + "es": "almuerzo" }, "tipo": 2, "imagen": { @@ -4586,7 +4980,7 @@ "id": 590, "texto": { "en": "dinner", - "pt": "jantar" + "es": "cena" }, "tipo": 2, "imagen": { @@ -4600,7 +4994,7 @@ "id": 594, "texto": { "en": "breakfast", - "pt": "café da manhã" + "es": "desayuno" }, "tipo": 2, "imagen": { @@ -4614,7 +5008,7 @@ "id": 595, "texto": { "en": "Where?", - "pt": "Onde?" + "es": "¿Dónde es?" }, "tipo": 6, "imagen": { @@ -4628,7 +5022,7 @@ "id": 597, "texto": { "en": "hungry", - "pt": "com fome" + "es": "hambre" }, "tipo": 2, "imagen": { @@ -4636,13 +5030,14 @@ }, "relacion": [], "agenda": 0, - "gps": 0 + "gps": 0, + "esSugerencia": false }, { "id": 598, "texto": { "en": "afternoon snack", - "pt": "lanche da tarde" + "es": "merienda" }, "tipo": 2, "imagen": { @@ -4656,7 +5051,7 @@ "id": 599, "texto": { "en": "dish", - "pt": "prato" + "es": "plato" }, "tipo": 2, "imagen": { @@ -4670,7 +5065,7 @@ "id": 600, "texto": { "en": "desert", - "pt": "deserto" + "es": "postre" }, "tipo": 2, "imagen": { @@ -4684,7 +5079,7 @@ "id": 602, "texto": { "en": "What time is it?", - "pt": "Que horas são?" + "es": "¿Qué hora es?" }, "tipo": 5, "imagen": { @@ -4698,7 +5093,7 @@ "id": 604, "texto": { "en": "napkin", - "pt": "guardanapo" + "es": "servilletas" }, "tipo": 2, "imagen": { @@ -4712,7 +5107,7 @@ "id": 605, "texto": { "en": "glass", - "pt": "vidro" + "es": "vaso" }, "tipo": 2, "imagen": { @@ -4726,7 +5121,7 @@ "id": 606, "texto": { "en": "plane", - "pt": "avião" + "es": "avión" }, "tipo": 2, "imagen": { @@ -4740,7 +5135,7 @@ "id": 607, "texto": { "en": "Bus", - "pt": "Ônibus" + "es": "autobús" }, "tipo": 2, "imagen": { @@ -4754,7 +5149,7 @@ "id": 608, "texto": { "en": "car", - "pt": "carro" + "es": "coche" }, "tipo": 2, "imagen": { @@ -4768,7 +5163,7 @@ "id": 609, "texto": { "en": "Metro", - "pt": "Metrô" + "es": "metro" }, "tipo": 2, "imagen": { @@ -4782,7 +5177,7 @@ "id": 610, "texto": { "en": "taxi", - "pt": "Táxi" + "es": "taxi" }, "tipo": 2, "imagen": { @@ -4796,7 +5191,7 @@ "id": 611, "texto": { "en": "transportation", - "pt": "transporte" + "es": "transportes" }, "tipo": 2, "imagen": { @@ -4810,7 +5205,7 @@ "id": 614, "texto": { "en": "grandpa", - "pt": "Vovô" + "es": "abuelo" }, "tipo": 1, "imagen": { @@ -4819,17 +5214,34 @@ "relacion": [ { "id": 22, - "frec": 2 + "frec": 4 + }, + { + "id": 14, + "frec": 1 + }, + { + "id": 44, + "frec": 1 + }, + { + "id": 49, + "frec": 1 + }, + { + "id": 378, + "frec": 1 } ], "agenda": 0, - "gps": 0 + "gps": 0, + "esSugerencia": false }, { "id": 615, "texto": { "en": "friends", - "pt": "amigos" + "es": "amigos" }, "tipo": 1, "imagen": { @@ -4842,10 +5254,10 @@ { "id": 617, "texto": { - "en": "butcher", - "pt": "açougueiro" + "en": "Butcher", + "es": "carnicero" }, - "tipo": 2, + "tipo": 1, "imagen": { "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcarnicero.webp?alt=media&token=8922d169-5277-40f3-a3e4-07925112592f" }, @@ -4857,7 +5269,7 @@ "id": 619, "texto": { "en": "chef", - "pt": "chefe de cozinha" + "es": "cocinero" }, "tipo": 1, "imagen": { @@ -4871,7 +5283,7 @@ "id": 620, "texto": { "en": "team", - "pt": "equipe" + "es": "equipo" }, "tipo": 1, "imagen": { @@ -4885,7 +5297,7 @@ "id": 621, "texto": { "en": "family", - "pt": "família" + "es": "familia" }, "tipo": 1, "imagen": { @@ -4899,7 +5311,7 @@ "id": 622, "texto": { "en": "futbol player", - "pt": "Jogador futbol" + "es": "futbolista" }, "tipo": 1, "imagen": { @@ -4913,21 +5325,43 @@ "id": 623, "texto": { "en": "brother", - "pt": "irmão" + "es": "hermano" }, "tipo": 1, "imagen": { "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_hermano.webp?alt=media&token=9783e15c-f073-4dc0-b556-9e69fd522058" }, - "relacion": [], + "relacion": [ + { + "id": 22, + "frec": 1 + }, + { + "id": 49, + "frec": 1 + }, + { + "id": 44, + "frec": 1 + }, + { + "id": 14, + "frec": 1 + }, + { + "id": 378, + "frec": 1 + } + ], "agenda": 0, - "gps": 0 + "gps": 0, + "esSugerencia": false }, { "id": 624, "texto": { "en": "sister", - "pt": "irmã" + "es": "hermana" }, "tipo": 1, "imagen": { @@ -4941,7 +5375,7 @@ "id": 626, "texto": { "en": "teacher", - "pt": "professor" + "es": "maestra" }, "tipo": 1, "imagen": { @@ -4955,7 +5389,7 @@ "id": 627, "texto": { "en": "teacher", - "pt": "professor" + "es": "maestro" }, "tipo": 1, "imagen": { @@ -4969,7 +5403,7 @@ "id": 628, "texto": { "en": "mom", - "pt": "mamãe" + "es": "mamá" }, "tipo": 1, "imagen": { @@ -4978,17 +5412,34 @@ "relacion": [ { "id": 44, + "frec": 18 + }, + { + "id": 22, + "frec": 4 + }, + { + "id": 49, + "frec": 6 + }, + { + "id": 378, "frec": 6 + }, + { + "id": 14, + "frec": 10 } ], "agenda": 0, - "gps": 0 + "gps": 0, + "esSugerencia": false }, { "id": 629, "texto": { "en": "medic", - "pt": "médico" + "es": "médico" }, "tipo": 1, "imagen": { @@ -5002,7 +5453,7 @@ "id": 630, "texto": { "en": "boy", - "pt": "Garoto" + "es": "niño" }, "tipo": 1, "imagen": { @@ -5016,7 +5467,7 @@ "id": 631, "texto": { "en": "girl", - "pt": "menina" + "es": "niña" }, "tipo": 1, "imagen": { @@ -5030,21 +5481,39 @@ "id": 632, "texto": { "en": "dad", - "pt": "Papai" + "es": "papá" }, "tipo": 1, "imagen": { "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_papa.webp?alt=media&token=47ca6188-b568-4a92-bbcd-138781aff945" }, - "relacion": [], + "relacion": [ + { + "id": 44, + "frec": 16 + }, + { + "id": 22, + "frec": 5 + }, + { + "id": 378, + "frec": 1 + }, + { + "id": 14, + "frec": 1 + } + ], "agenda": 0, - "gps": 0 + "gps": 0, + "esSugerencia": false }, { "id": 633, "texto": { "en": "people", - "pt": "pessoas" + "es": "personas" }, "tipo": 1, "imagen": { @@ -5058,7 +5527,7 @@ "id": 635, "texto": { "en": "princess", - "pt": "Princesa" + "es": "princesa" }, "tipo": 1, "imagen": { @@ -5072,7 +5541,7 @@ "id": 638, "texto": { "en": "Queen", - "pt": "Rainha" + "es": "reina" }, "tipo": 1, "imagen": { @@ -5086,7 +5555,7 @@ "id": 639, "texto": { "en": "King", - "pt": "Rei" + "es": "rey" }, "tipo": 1, "imagen": { @@ -5100,7 +5569,7 @@ "id": 640, "texto": { "en": "taxi driver", - "pt": "taxista" + "es": "taxista" }, "tipo": 1, "imagen": { @@ -5114,7 +5583,7 @@ "id": 642, "texto": { "en": "you", - "pt": "você" + "es": "vos" }, "tipo": 1, "imagen": { @@ -5128,7 +5597,7 @@ "id": 643, "texto": { "en": "I", - "pt": "Eu" + "es": "yo" }, "tipo": 1, "imagen": { @@ -5137,29 +5606,26 @@ "relacion": [ { "id": 22, - "frec": 3 + "frec": 4 }, { "id": 44, - "frec": 8 + "frec": 22 }, { "id": 49, - "frec": 6 - }, - { - "id": 14, - "frec": 1 + "frec": 10 } ], "agenda": 0, - "gps": 0 + "gps": 0, + "esSugerencia": false }, { "id": 644, "texto": { "en": "here", - "pt": "Aqui" + "es": "acá" }, "tipo": 2, "imagen": { @@ -5173,7 +5639,7 @@ "id": 646, "texto": { "en": "airport", - "pt": "aeroporto" + "es": "aeropuerto" }, "tipo": 2, "imagen": { @@ -5187,7 +5653,7 @@ "id": 648, "texto": { "en": "there", - "pt": "há" + "es": "allá" }, "tipo": 2, "imagen": { @@ -5200,8 +5666,8 @@ { "id": 649, "texto": { - "en": "bar", - "pt": "Barra" + "en": "Pub", + "es": "bar" }, "tipo": 2, "imagen": { @@ -5209,13 +5675,16 @@ }, "relacion": [], "agenda": 0, - "gps": 0 + "gps": 0, + "edad": [ + "ADULTO" + ] }, { "id": 650, "texto": { "en": "bike shop", - "pt": "loja de bicicleta" + "es": "una bicicletería" }, "tipo": 2, "imagen": { @@ -5229,7 +5698,7 @@ "id": 651, "texto": { "en": "field", - "pt": "campo" + "es": "la cancha" }, "tipo": 2, "imagen": { @@ -5243,7 +5712,7 @@ "id": 653, "texto": { "en": "house", - "pt": "casa" + "es": "casa" }, "tipo": 2, "imagen": { @@ -5251,13 +5720,14 @@ }, "relacion": [], "agenda": 0, - "gps": 0 + "gps": 0, + "esSugerencia": false }, { "id": 656, "texto": { "en": "city", - "pt": "cidade" + "es": "ciudad" }, "tipo": 2, "imagen": { @@ -5271,7 +5741,7 @@ "id": 657, "texto": { "en": "dinning room", - "pt": "sala de jantar" + "es": "comedor" }, "tipo": 2, "imagen": { @@ -5285,7 +5755,7 @@ "id": 660, "texto": { "en": "bathroom", - "pt": "banheiro" + "es": "cuarto de baño" }, "tipo": 2, "imagen": { @@ -5299,7 +5769,7 @@ "id": 661, "texto": { "en": "disco", - "pt": "discoteca" + "es": "la discoteca" }, "tipo": 2, "imagen": { @@ -5313,7 +5783,7 @@ "id": 662, "texto": { "en": "school", - "pt": "escola" + "es": "escuela" }, "tipo": 2, "imagen": { @@ -5321,13 +5791,14 @@ }, "relacion": [], "agenda": 0, - "gps": 0 + "gps": 0, + "esSugerencia": false }, { "id": 666, "texto": { "en": "Burger shop", - "pt": "loja de hambúrguer" + "es": "hamburguesería" }, "tipo": 2, "imagen": { @@ -5341,7 +5812,7 @@ "id": 668, "texto": { "en": "hospital", - "pt": "hospital" + "es": "hospital" }, "tipo": 2, "imagen": { @@ -5349,13 +5820,14 @@ }, "relacion": [], "agenda": 0, - "gps": 0 + "gps": 0, + "esSugerencia": false }, { "id": 672, "texto": { "en": "garden", - "pt": "jardim" + "es": "jardín" }, "tipo": 2, "imagen": { @@ -5369,7 +5841,7 @@ "id": 675, "texto": { "en": "market", - "pt": "mercado" + "es": "mercado" }, "tipo": 2, "imagen": { @@ -5383,7 +5855,7 @@ "id": 678, "texto": { "en": "yard", - "pt": "jarda" + "es": "patio" }, "tipo": 2, "imagen": { @@ -5397,7 +5869,7 @@ "id": 679, "texto": { "en": "Pizza shop", - "pt": "loja de pizza" + "es": "pizzería" }, "tipo": 2, "imagen": { @@ -5411,7 +5883,7 @@ "id": 680, "texto": { "en": "Poultry shop", - "pt": "Poultry shop" + "es": "pollería" }, "tipo": 2, "imagen": { @@ -5425,7 +5897,7 @@ "id": 682, "texto": { "en": "square", - "pt": "quadrado" + "es": "la plaza" }, "tipo": 2, "imagen": { @@ -5439,7 +5911,7 @@ "id": 685, "texto": { "en": "Restaurant", - "pt": "Restaurante" + "es": "restaurante" }, "tipo": 2, "imagen": { @@ -5453,7 +5925,7 @@ "id": 687, "texto": { "en": "traffic light", - "pt": "semáforo" + "es": "semáforo" }, "tipo": 2, "imagen": { @@ -5467,7 +5939,7 @@ "id": 688, "texto": { "en": "supermarket", - "pt": "supermercado" + "es": "un supermercado" }, "tipo": 2, "imagen": { @@ -5475,13 +5947,14 @@ }, "relacion": [], "agenda": 0, - "gps": 0 + "gps": 0, + "esSugerencia": false }, { "id": 698, "texto": { "en": "greengrocery", - "pt": "greengrocery" + "es": "verdulería" }, "tipo": 2, "imagen": { @@ -5495,7 +5968,7 @@ "id": 700, "texto": { "en": "Blockbuster", - "pt": "Blockbuster" + "es": "videoclub" }, "tipo": 2, "imagen": { @@ -5509,7 +5982,7 @@ "id": 702, "texto": { "en": "friendship", - "pt": "amizade" + "es": "amistad" }, "tipo": 6, "imagen": { @@ -5523,7 +5996,7 @@ "id": 703, "texto": { "en": "help", - "pt": "Socorro" + "es": "ayuda" }, "tipo": 6, "imagen": { @@ -5537,7 +6010,7 @@ "id": 704, "texto": { "en": "celebration", - "pt": "celebração" + "es": "celebración" }, "tipo": 6, "imagen": { @@ -5551,7 +6024,7 @@ "id": 706, "texto": { "en": "fulfillment", - "pt": "cumprimento" + "es": "cumplimiento" }, "tipo": 6, "imagen": { @@ -5565,7 +6038,7 @@ "id": 707, "texto": { "en": "description", - "pt": "descrição" + "es": "descripción" }, "tipo": 6, "imagen": { @@ -5579,7 +6052,7 @@ "id": 708, "texto": { "en": "Personal hygiene", - "pt": "Higiene pessoal" + "es": "higiene personal" }, "tipo": 6, "imagen": { @@ -5593,7 +6066,7 @@ "id": 712, "texto": { "en": "physical abuse", - "pt": "abuso físico" + "es": "maltrato físico" }, "tipo": 6, "imagen": { @@ -5607,7 +6080,7 @@ "id": 713, "texto": { "en": "verbal abuse", - "pt": "abuso verbal" + "es": "maltrato verbal" }, "tipo": 6, "imagen": { @@ -5621,7 +6094,7 @@ "id": 714, "texto": { "en": "plural", - "pt": "plural" + "es": "plurales" }, "tipo": 6, "imagen": { @@ -5635,7 +6108,7 @@ "id": 718, "texto": { "en": "rehab", - "pt": "reabilitação" + "es": "rehabilitación" }, "tipo": 6, "imagen": { @@ -5649,7 +6122,7 @@ "id": 721, "texto": { "en": "series", - "pt": "Series" + "es": "serie" }, "tipo": 6, "imagen": { @@ -5663,7 +6136,7 @@ "id": 722, "texto": { "en": "feelings", - "pt": "sentimentos" + "es": "sentimientos" }, "tipo": 6, "imagen": { @@ -5677,7 +6150,7 @@ "id": 725, "texto": { "en": "surprise", - "pt": "surpresa" + "es": "sorpresa" }, "tipo": 6, "imagen": { @@ -5691,7 +6164,7 @@ "id": 728, "texto": { "en": "verbs", - "pt": "verbos" + "es": "verbos" }, "tipo": 2, "imagen": { @@ -5705,7 +6178,7 @@ "id": 729, "texto": { "en": "shame", - "pt": "vergonha" + "es": "vergüenza" }, "tipo": 6, "imagen": { @@ -5713,13 +6186,14 @@ }, "relacion": [], "agenda": 0, - "gps": 0 + "gps": 0, + "esSugerencia": false }, { "id": 730, "texto": { "en": "life", - "pt": "vida" + "es": "vida" }, "tipo": 6, "imagen": { @@ -5733,7 +6207,7 @@ "id": 731, "texto": { "en": "visit", - "pt": "Visita" + "es": "visita" }, "tipo": 6, "imagen": { @@ -5747,7 +6221,7 @@ "id": 732, "texto": { "en": "tour", - "pt": "Tour" + "es": "paseo" }, "tipo": 6, "imagen": { @@ -5761,7 +6235,7 @@ "id": 733, "texto": { "en": "Yellow", - "pt": "Amarelo" + "es": "amarillo" }, "tipo": 4, "imagen": { @@ -5775,7 +6249,7 @@ "id": 734, "texto": { "en": "Blue", - "pt": "Azul" + "es": "azul" }, "tipo": 4, "imagen": { @@ -5789,7 +6263,7 @@ "id": 736, "texto": { "en": "White", - "pt": "Branco" + "es": "blanco" }, "tipo": 4, "imagen": { @@ -5803,7 +6277,7 @@ "id": 737, "texto": { "en": "Colors", - "pt": "Cores" + "es": "colores" }, "tipo": 2, "imagen": { @@ -5817,7 +6291,7 @@ "id": 738, "texto": { "en": "Gold", - "pt": "Ouro" + "es": "dorado" }, "tipo": 4, "imagen": { @@ -5831,7 +6305,7 @@ "id": 739, "texto": { "en": "Gray", - "pt": "cinzento" + "es": "gris" }, "tipo": 4, "imagen": { @@ -5845,7 +6319,7 @@ "id": 740, "texto": { "en": "Purple", - "pt": "Roxa" + "es": "lila" }, "tipo": 4, "imagen": { @@ -5859,7 +6333,7 @@ "id": 742, "texto": { "en": "Orange", - "pt": "laranja" + "es": "naranja" }, "tipo": 4, "imagen": { @@ -5873,7 +6347,7 @@ "id": 743, "texto": { "en": "Black", - "pt": "Preto" + "es": "negro" }, "tipo": 4, "imagen": { @@ -5887,7 +6361,7 @@ "id": 744, "texto": { "en": "Silver", - "pt": "Prata" + "es": "plateado" }, "tipo": 4, "imagen": { @@ -5901,7 +6375,7 @@ "id": 745, "texto": { "en": "What color it is?", - "pt": "De que cor é?" + "es": "¿Qué color es?" }, "tipo": 5, "imagen": { @@ -5915,7 +6389,7 @@ "id": 746, "texto": { "en": "Red", - "pt": "Vermelho" + "es": "rojo" }, "tipo": 4, "imagen": { @@ -5929,7 +6403,7 @@ "id": 747, "texto": { "en": "Pink", - "pt": "Rosa" + "es": "rosa" }, "tipo": 4, "imagen": { @@ -5943,7 +6417,7 @@ "id": 748, "texto": { "en": "Violet", - "pt": "Tolet" + "es": "violeta" }, "tipo": 4, "imagen": { @@ -5957,7 +6431,7 @@ "id": 749, "texto": { "en": "Green", - "pt": "Verde" + "es": "verde" }, "tipo": 4, "imagen": { @@ -5971,7 +6445,7 @@ "id": 750, "texto": { "en": "Light green", - "pt": "Luz verde" + "es": "verde Claro" }, "tipo": 4, "imagen": { @@ -5985,7 +6459,7 @@ "id": 751, "texto": { "en": "agenda", - "pt": "agenda" + "es": "agenda" }, "tipo": 2, "imagen": { @@ -5999,7 +6473,7 @@ "id": 752, "texto": { "en": "wallet", - "pt": "carteira" + "es": "billetera" }, "tipo": 2, "imagen": { @@ -6013,7 +6487,7 @@ "id": 753, "texto": { "en": "pencil case", - "pt": "estojo" + "es": "cartuchera" }, "tipo": 2, "imagen": { @@ -6027,7 +6501,7 @@ "id": 754, "texto": { "en": "Lessons", - "pt": "Lições" + "es": "clases" }, "tipo": 2, "imagen": { @@ -6041,7 +6515,7 @@ "id": 755, "texto": { "en": "computer", - "pt": "computador" + "es": "computadora" }, "tipo": 2, "imagen": { @@ -6055,7 +6529,7 @@ "id": 756, "texto": { "en": "Crayon", - "pt": "GIS de cera" + "es": "crayones" }, "tipo": 2, "imagen": { @@ -6069,7 +6543,7 @@ "id": 757, "texto": { "en": "notebook", - "pt": "caderno" + "es": "cuaderno" }, "tipo": 2, "imagen": { @@ -6083,7 +6557,7 @@ "id": 758, "texto": { "en": "room", - "pt": "quarto" + "es": "cuarto" }, "tipo": 2, "imagen": { @@ -6097,7 +6571,7 @@ "id": 760, "texto": { "en": "eraser", - "pt": "apagador" + "es": "goma" }, "tipo": 2, "imagen": { @@ -6111,13 +6585,30 @@ "id": 761, "texto": { "en": "toy", - "pt": "brinquedo" + "es": "el juguete" }, "tipo": 2, "imagen": { "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_jueguete.jpg?alt=media&token=4c74d182-45e0-4642-87e5-645aa1a9dda6" }, - "relacion": [], + "relacion": [ + { + "id": 734, + "frec": 3 + }, + { + "id": 743, + "frec": 1 + }, + { + "id": 747, + "frec": 1 + }, + { + "id": 736, + "frec": 1 + } + ], "agenda": 0, "gps": 0 }, @@ -6125,7 +6616,7 @@ "id": 762, "texto": { "en": "pencil", - "pt": "lápis" + "es": "lapiz" }, "tipo": 2, "imagen": { @@ -6139,7 +6630,7 @@ "id": 766, "texto": { "en": "paper", - "pt": "papel" + "es": "papel" }, "tipo": 2, "imagen": { @@ -6153,7 +6644,7 @@ "id": 767, "texto": { "en": "ball", - "pt": "bola" + "es": "pelota" }, "tipo": 2, "imagen": { @@ -6167,7 +6658,7 @@ "id": 768, "texto": { "en": "glue", - "pt": "cola" + "es": "pegamento" }, "tipo": 2, "imagen": { @@ -6181,7 +6672,7 @@ "id": 769, "texto": { "en": "brush", - "pt": "escova" + "es": "pincel" }, "tipo": 2, "imagen": { @@ -6195,7 +6686,7 @@ "id": 770, "texto": { "en": "blackboard", - "pt": "quadro-negro" + "es": "pizarrón" }, "tipo": 2, "imagen": { @@ -6209,7 +6700,7 @@ "id": 771, "texto": { "en": "art class", - "pt": "aula de arte" + "es": "plástica" }, "tipo": 2, "imagen": { @@ -6223,7 +6714,7 @@ "id": 772, "texto": { "en": "magazines", - "pt": "revistas" + "es": "revistas" }, "tipo": 2, "imagen": { @@ -6237,7 +6728,7 @@ "id": 773, "texto": { "en": "TV", - "pt": "televisão" + "es": "la televisión" }, "tipo": 2, "imagen": { @@ -6251,7 +6742,7 @@ "id": 774, "texto": { "en": "tablet", - "pt": "comprimido" + "es": "la tablet" }, "tipo": 2, "imagen": { @@ -6265,7 +6756,7 @@ "id": 776, "texto": { "en": "armpit", - "pt": "axila" + "es": "axila" }, "tipo": 2, "imagen": { @@ -6279,7 +6770,7 @@ "id": 777, "texto": { "en": "mouth", - "pt": "boca" + "es": "boca" }, "tipo": 2, "imagen": { @@ -6293,7 +6784,7 @@ "id": 778, "texto": { "en": "arm", - "pt": "braço" + "es": "brazo" }, "tipo": 2, "imagen": { @@ -6307,7 +6798,7 @@ "id": 780, "texto": { "en": "elbow", - "pt": "cotovelo" + "es": "codo" }, "tipo": 2, "imagen": { @@ -6321,7 +6812,7 @@ "id": 781, "texto": { "en": "neck", - "pt": "pescoço" + "es": "cuello" }, "tipo": 2, "imagen": { @@ -6335,7 +6826,7 @@ "id": 782, "texto": { "en": "finger", - "pt": "dedo" + "es": "dedos" }, "tipo": 2, "imagen": { @@ -6349,7 +6840,7 @@ "id": 783, "texto": { "en": "bone", - "pt": "osso" + "es": "hueso" }, "tipo": 2, "imagen": { @@ -6363,7 +6854,7 @@ "id": 784, "texto": { "en": "shoulder", - "pt": "ombro" + "es": "hombro" }, "tipo": 2, "imagen": { @@ -6377,7 +6868,7 @@ "id": 785, "texto": { "en": "tongue", - "pt": "língua" + "es": "lengua" }, "tipo": 2, "imagen": { @@ -6391,7 +6882,7 @@ "id": 786, "texto": { "en": "hand", - "pt": "mão" + "es": "mano" }, "tipo": 2, "imagen": { @@ -6405,7 +6896,7 @@ "id": 787, "texto": { "en": "snot", - "pt": "snot" + "es": "moco" }, "tipo": 2, "imagen": { @@ -6419,7 +6910,7 @@ "id": 788, "texto": { "en": "wrist", - "pt": "pulso" + "es": "muñeca" }, "tipo": 2, "imagen": { @@ -6433,7 +6924,7 @@ "id": 789, "texto": { "en": "butt", - "pt": "butt" + "es": "nalgas" }, "tipo": 2, "imagen": { @@ -6447,7 +6938,7 @@ "id": 790, "texto": { "en": "nose", - "pt": "nariz" + "es": "nariz" }, "tipo": 2, "imagen": { @@ -6461,7 +6952,7 @@ "id": 791, "texto": { "en": "eyes", - "pt": "olhos" + "es": "ojos" }, "tipo": 2, "imagen": { @@ -6475,7 +6966,7 @@ "id": 792, "texto": { "en": "belly button", - "pt": "umbigo" + "es": "ombligo" }, "tipo": 2, "imagen": { @@ -6489,7 +6980,7 @@ "id": 793, "texto": { "en": "ear", - "pt": "orelha" + "es": "oreja" }, "tipo": 2, "imagen": { @@ -6503,7 +6994,7 @@ "id": 794, "texto": { "en": "organs", - "pt": "órgãos" + "es": "órganos" }, "tipo": 2, "imagen": { @@ -6517,7 +7008,7 @@ "id": 795, "texto": { "en": "belly", - "pt": "barriga" + "es": "panza" }, "tipo": 2, "imagen": { @@ -6531,7 +7022,7 @@ "id": 797, "texto": { "en": "chest", - "pt": "peito" + "es": "pecho" }, "tipo": 2, "imagen": { @@ -6545,7 +7036,7 @@ "id": 799, "texto": { "en": "foot", - "pt": "pé" + "es": "pie" }, "tipo": 2, "imagen": { @@ -6559,7 +7050,7 @@ "id": 800, "texto": { "en": "lung", - "pt": "pulmão" + "es": "pulmones" }, "tipo": 2, "imagen": { @@ -6573,7 +7064,7 @@ "id": 802, "texto": { "en": "knee", - "pt": "joelho" + "es": "rodilla" }, "tipo": 2, "imagen": { @@ -6587,7 +7078,7 @@ "id": 803, "texto": { "en": "saliva", - "pt": "saliva" + "es": "saliva" }, "tipo": 2, "imagen": { @@ -6601,7 +7092,7 @@ "id": 804, "texto": { "en": "blood", - "pt": "sangue" + "es": "sangre" }, "tipo": 2, "imagen": { @@ -6615,7 +7106,7 @@ "id": 806, "texto": { "en": "boobs", - "pt": "mamas" + "es": "tetas" }, "tipo": 2, "imagen": { @@ -6629,7 +7120,7 @@ "id": 807, "texto": { "en": "ankle", - "pt": "tornozelo" + "es": "tobillos" }, "tipo": 2, "imagen": { @@ -6643,7 +7134,7 @@ "id": 809, "texto": { "en": "nail", - "pt": "unha" + "es": "uña" }, "tipo": 2, "imagen": { @@ -6657,7 +7148,7 @@ "id": 810, "texto": { "en": "before", - "pt": "antes" + "es": "antes" }, "tipo": 6, "imagen": { @@ -6671,7 +7162,7 @@ "id": 811, "texto": { "en": "yesterday", - "pt": "ontem" + "es": "ayer" }, "tipo": 6, "imagen": { @@ -6685,7 +7176,7 @@ "id": 812, "texto": { "en": "after", - "pt": "depois de" + "es": "despues" }, "tipo": 6, "imagen": { @@ -6699,7 +7190,7 @@ "id": 815, "texto": { "en": "tomorrow", - "pt": "amanhã" + "es": "mañana" }, "tipo": 6, "imagen": { @@ -6713,7 +7204,7 @@ "id": 816, "texto": { "en": "fall", - "pt": "cair" + "es": "otoño" }, "tipo": 2, "imagen": { @@ -6727,7 +7218,7 @@ "id": 817, "texto": { "en": "spring", - "pt": "Primavera" + "es": "primavera" }, "tipo": 2, "imagen": { @@ -6741,7 +7232,7 @@ "id": 818, "texto": { "en": "summer", - "pt": "verão" + "es": "verano" }, "tipo": 2, "imagen": { @@ -6755,7 +7246,7 @@ "id": 819, "texto": { "en": "sick", - "pt": "doente" + "es": "enfermo" }, "tipo": 4, "imagen": { @@ -6769,7 +7260,7 @@ "id": 820, "texto": { "en": "diarrhea", - "pt": "diarréia" + "es": "diarrea" }, "tipo": 2, "imagen": { @@ -6783,7 +7274,7 @@ "id": 821, "texto": { "en": "pain", - "pt": "dor" + "es": "dolor" }, "tipo": 2, "imagen": { @@ -6797,7 +7288,7 @@ "id": 822, "texto": { "en": "toothache", - "pt": "dor de dente" + "es": "dolor de muela" }, "tipo": 2, "imagen": { @@ -6811,7 +7302,7 @@ "id": 823, "texto": { "en": "chest pain", - "pt": "dor no peito" + "es": "dolor de pecho" }, "tipo": 2, "imagen": { @@ -6825,7 +7316,7 @@ "id": 824, "texto": { "en": "earache", - "pt": "dor de ouvido" + "es": "dolor de Oido" }, "tipo": 2, "imagen": { @@ -6839,7 +7330,7 @@ "id": 825, "texto": { "en": "stomachache", - "pt": "dor de estômago" + "es": "dolor de Panza" }, "tipo": 2, "imagen": { @@ -6853,7 +7344,7 @@ "id": 826, "texto": { "en": "throat sore", - "pt": "dor de garganta" + "es": "dolor de Garganta" }, "tipo": 2, "imagen": { @@ -6867,7 +7358,7 @@ "id": 827, "texto": { "en": "headache", - "pt": "dor de cabeça" + "es": "dolor de cabeza" }, "tipo": 2, "imagen": { @@ -6881,7 +7372,7 @@ "id": 828, "texto": { "en": "constipation", - "pt": "Prisão de ventre" + "es": "estreñimiento" }, "tipo": 2, "imagen": { @@ -6895,7 +7386,7 @@ "id": 829, "texto": { "en": "flu", - "pt": "gripe" + "es": "gripe" }, "tipo": 2, "imagen": { @@ -6909,7 +7400,7 @@ "id": 831, "texto": { "en": "cold", - "pt": "frio" + "es": "resfrío" }, "tipo": 2, "imagen": { @@ -6923,7 +7414,7 @@ "id": 834, "texto": { "en": "football match", - "pt": "partida de futebol" + "es": "partido de fútbol" }, "tipo": 2, "imagen": { @@ -6937,7 +7428,7 @@ "id": 835, "texto": { "en": "Football", - "pt": "Futebol" + "es": "fútbol" }, "tipo": 2, "imagen": { @@ -6951,7 +7442,7 @@ "id": 836, "texto": { "en": "one", - "pt": "1" + "es": "uno" }, "tipo": 6, "imagen": { @@ -6965,7 +7456,7 @@ "id": 837, "texto": { "en": "two", - "pt": "dois" + "es": "dos" }, "tipo": 6, "imagen": { @@ -6979,7 +7470,7 @@ "id": 838, "texto": { "en": "three", - "pt": "três" + "es": "tres" }, "tipo": 6, "imagen": { @@ -6993,7 +7484,7 @@ "id": 839, "texto": { "en": "four", - "pt": "quatro" + "es": "cuatro" }, "tipo": 6, "imagen": { @@ -7007,7 +7498,7 @@ "id": 840, "texto": { "en": "five", - "pt": "cinco" + "es": "cinco" }, "tipo": 6, "imagen": { @@ -7021,7 +7512,7 @@ "id": 841, "texto": { "en": "six", - "pt": "seis" + "es": "seis" }, "tipo": 6, "imagen": { @@ -7035,7 +7526,7 @@ "id": 842, "texto": { "en": "seven", - "pt": "Sete" + "es": "siete" }, "tipo": 6, "imagen": { @@ -7049,7 +7540,7 @@ "id": 843, "texto": { "en": "eight", - "pt": "oito" + "es": "ocho" }, "tipo": 6, "imagen": { @@ -7063,7 +7554,7 @@ "id": 844, "texto": { "en": "nine", - "pt": "nove" + "es": "nueve" }, "tipo": 6, "imagen": { @@ -7077,7 +7568,7 @@ "id": 845, "texto": { "en": "ten", - "pt": "dez" + "es": "diez" }, "tipo": 6, "imagen": { @@ -7091,7 +7582,7 @@ "id": 846, "texto": { "en": "zero", - "pt": "zero" + "es": "cero" }, "tipo": 6, "imagen": { @@ -7105,7 +7596,7 @@ "id": 850, "texto": { "en": "minim", - "pt": "mínima" + "es": "blanca" }, "tipo": 2, "imagen": { @@ -7119,7 +7610,7 @@ "id": 851, "texto": { "en": "peruvian box", - "pt": "caixa peruana" + "es": "el cajón" }, "tipo": 2, "imagen": { @@ -7133,7 +7624,7 @@ "id": 853, "texto": { "en": "chore", - "pt": "tarefa" + "es": "el coro" }, "tipo": 2, "imagen": { @@ -7147,7 +7638,7 @@ "id": 855, "texto": { "en": "guitar", - "pt": "violão" + "es": "la guitarra" }, "tipo": 2, "imagen": { @@ -7161,7 +7652,7 @@ "id": 857, "texto": { "en": "musical instruments", - "pt": "instrumentos musicais" + "es": "los instrumentos musicales" }, "tipo": 2, "imagen": { @@ -7175,7 +7666,7 @@ "id": 860, "texto": { "en": "music lesson", - "pt": "aula de música" + "es": "música" }, "tipo": 2, "imagen": { @@ -7189,7 +7680,7 @@ "id": 865, "texto": { "en": "piano", - "pt": "piano" + "es": "el piano" }, "tipo": 2, "imagen": { @@ -7203,7 +7694,7 @@ "id": 870, "texto": { "en": "drum", - "pt": "tambor" + "es": "el tambor" }, "tipo": 2, "imagen": { @@ -7217,7 +7708,7 @@ "id": 871, "texto": { "en": "triangle", - "pt": "triângulo" + "es": "el triángulo" }, "tipo": 2, "imagen": { @@ -7231,7 +7722,7 @@ "id": 874, "texto": { "en": "trumpet", - "pt": "trombeta" + "es": "la trompeta" }, "tipo": 2, "imagen": { @@ -7245,7 +7736,7 @@ "id": 876, "texto": { "en": "violin", - "pt": "violino" + "es": "el violín" }, "tipo": 2, "imagen": { @@ -7259,7 +7750,7 @@ "id": 878, "texto": { "en": "aspirine", - "pt": "aspirina" + "es": "aspirina" }, "tipo": 2, "imagen": { @@ -7273,7 +7764,7 @@ "id": 881, "texto": { "en": "descongestant", - "pt": "descongestionante" + "es": "descongestivo" }, "tipo": 2, "imagen": { @@ -7287,7 +7778,7 @@ "id": 882, "texto": { "en": "digestive", - "pt": "digestivo" + "es": "digestivo" }, "tipo": 2, "imagen": { @@ -7301,7 +7792,7 @@ "id": 884, "texto": { "en": "syrup", - "pt": "xarope" + "es": "jarabe" }, "tipo": 2, "imagen": { @@ -7315,7 +7806,7 @@ "id": 885, "texto": { "en": "nebulizer", - "pt": "nebulizador" + "es": "nebulizador" }, "tipo": 2, "imagen": { @@ -7329,7 +7820,7 @@ "id": 886, "texto": { "en": "pills", - "pt": "pílulas" + "es": "pastillas" }, "tipo": 2, "imagen": { @@ -7343,7 +7834,7 @@ "id": 887, "texto": { "en": "bandage", - "pt": "curativo" + "es": "venda" }, "tipo": 2, "imagen": { @@ -7357,13 +7848,18 @@ "id": 889, "texto": { "en": "although", - "pt": "Apesar" + "es": "aunque" }, "tipo": 6, "imagen": { "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Faunque.webp?alt=media&token=3391538b-22f9-4361-b227-245c79d6c2e3" }, - "relacion": [], + "relacion": [ + { + "id": 22, + "frec": 3 + } + ], "agenda": 0, "gps": 0 }, @@ -7371,7 +7867,7 @@ "id": 890, "texto": { "en": "which?", - "pt": "qual?" + "es": "¿Cuál?" }, "tipo": 6, "imagen": { @@ -7385,7 +7881,7 @@ "id": 891, "texto": { "en": "anyone", - "pt": "alguém" + "es": "cualquiera" }, "tipo": 6, "imagen": { @@ -7399,7 +7895,7 @@ "id": 892, "texto": { "en": "when?", - "pt": "quando?" + "es": "¿Cuándo?" }, "tipo": 6, "imagen": { @@ -7413,7 +7909,7 @@ "id": 893, "texto": { "en": "how many?", - "pt": "quantos?" + "es": "¿Cuántos?" }, "tipo": 6, "imagen": { @@ -7427,7 +7923,7 @@ "id": 894, "texto": { "en": "how much", - "pt": "quantos" + "es": "¿Cuántas?" }, "tipo": 6, "imagen": { @@ -7441,7 +7937,7 @@ "id": 895, "texto": { "en": "his", - "pt": "dele" + "es": "del" }, "tipo": 6, "imagen": { @@ -7455,7 +7951,7 @@ "id": 896, "texto": { "en": "hers", - "pt": "dela" + "es": "del" }, "tipo": 6, "imagen": { @@ -7469,7 +7965,7 @@ "id": 897, "texto": { "en": "its", - "pt": "Está" + "es": "del" }, "tipo": 6, "imagen": { @@ -7483,7 +7979,7 @@ "id": 898, "texto": { "en": "and", - "pt": "e" + "es": "e" }, "tipo": 6, "imagen": { @@ -7497,7 +7993,7 @@ "id": 899, "texto": { "en": "he", - "pt": "ele" + "es": "el" }, "tipo": 6, "imagen": { @@ -7511,7 +8007,7 @@ "id": 900, "texto": { "en": "she", - "pt": "ela" + "es": "la" }, "tipo": 6, "imagen": { @@ -7525,7 +8021,7 @@ "id": 901, "texto": { "en": "I like", - "pt": "Eu gosto" + "es": "me gusta" }, "tipo": 6, "imagen": { @@ -7539,7 +8035,7 @@ "id": 903, "texto": { "en": "no one", - "pt": "ninguém" + "es": "nadie" }, "tipo": 6, "imagen": { @@ -7553,7 +8049,7 @@ "id": 904, "texto": { "en": "neither", - "pt": "nem" + "es": "ni" }, "tipo": 6, "imagen": { @@ -7567,7 +8063,7 @@ "id": 905, "texto": { "en": "none", - "pt": "Nenhum" + "es": "ninguno" }, "tipo": 6, "imagen": { @@ -7581,7 +8077,7 @@ "id": 906, "texto": { "en": "none", - "pt": "Nenhum" + "es": "ninguna" }, "tipo": 6, "imagen": { @@ -7595,7 +8091,7 @@ "id": 907, "texto": { "en": "I don't like", - "pt": "Eu não gosto" + "es": "no me gusta" }, "tipo": 6, "imagen": { @@ -7609,7 +8105,7 @@ "id": 910, "texto": { "en": "or", - "pt": "ou" + "es": "o" }, "tipo": 6, "imagen": { @@ -7623,7 +8119,7 @@ "id": 911, "texto": { "en": "who?", - "pt": "quem?" + "es": "quien?" }, "tipo": 6, "imagen": { @@ -7637,7 +8133,7 @@ "id": 912, "texto": { "en": "that", - "pt": "aquele" + "es": "que" }, "tipo": 6, "imagen": { @@ -7651,7 +8147,7 @@ "id": 913, "texto": { "en": "what?", - "pt": "o que?" + "es": "¿Qué?" }, "tipo": 6, "imagen": { @@ -7665,7 +8161,7 @@ "id": 914, "texto": { "en": "who?", - "pt": "quem?" + "es": "¿Quién?" }, "tipo": 6, "imagen": { @@ -7679,7 +8175,7 @@ "id": 915, "texto": { "en": "who?", - "pt": "quem?" + "es": "¿Quiénes?" }, "tipo": 6, "imagen": { @@ -7693,7 +8189,7 @@ "id": 918, "texto": { "en": "theirs", - "pt": "deles" + "es": "suyos" }, "tipo": 6, "imagen": { @@ -7707,7 +8203,7 @@ "id": 919, "texto": { "en": "yours", - "pt": "Sua" + "es": "tuyo" }, "tipo": 6, "imagen": { @@ -7721,7 +8217,7 @@ "id": 920, "texto": { "en": "yours", - "pt": "Sua" + "es": "tuya" }, "tipo": 6, "imagen": { @@ -7735,7 +8231,7 @@ "id": 923, "texto": { "en": "and", - "pt": "e" + "es": "y" }, "tipo": 6, "imagen": { @@ -7749,7 +8245,7 @@ "id": 924, "texto": { "en": "overcoat", - "pt": "sobretudo" + "es": "abrigo" }, "tipo": 2, "imagen": { @@ -7763,7 +8259,7 @@ "id": 928, "texto": { "en": "bikini", - "pt": "bikini" + "es": "bikini" }, "tipo": 2, "imagen": { @@ -7777,7 +8273,7 @@ "id": 930, "texto": { "en": "bag", - "pt": "Bolsa" + "es": "bolsa" }, "tipo": 2, "imagen": { @@ -7791,7 +8287,7 @@ "id": 931, "texto": { "en": "boot", - "pt": "inicialização" + "es": "bota" }, "tipo": 2, "imagen": { @@ -7805,7 +8301,7 @@ "id": 934, "texto": { "en": "button", - "pt": "botão" + "es": "botones" }, "tipo": 2, "imagen": { @@ -7819,7 +8315,7 @@ "id": 936, "texto": { "en": "scarf", - "pt": "cachecol" + "es": "bufanda" }, "tipo": 2, "imagen": { @@ -7833,7 +8329,7 @@ "id": 938, "texto": { "en": "footwear", - "pt": "calçados" + "es": "calzado" }, "tipo": 2, "imagen": { @@ -7847,7 +8343,7 @@ "id": 939, "texto": { "en": "shirt", - "pt": "camisa" + "es": "camisa" }, "tipo": 2, "imagen": { @@ -7861,7 +8357,7 @@ "id": 940, "texto": { "en": "long sleeve", - "pt": "manga comprida" + "es": "camiseta manga larga" }, "tipo": 2, "imagen": { @@ -7875,7 +8371,7 @@ "id": 941, "texto": { "en": "jacket", - "pt": "Jaqueta" + "es": "campera" }, "tipo": 2, "imagen": { @@ -7889,7 +8385,7 @@ "id": 951, "texto": { "en": "hat", - "pt": "chapéu" + "es": "gorro" }, "tipo": 2, "imagen": { @@ -7903,7 +8399,7 @@ "id": 954, "texto": { "en": "jean", - "pt": "jean" + "es": "jean" }, "tipo": 2, "imagen": { @@ -7917,7 +8413,7 @@ "id": 956, "texto": { "en": "overall", - "pt": "No geral" + "es": "mono" }, "tipo": 2, "imagen": { @@ -7931,7 +8427,7 @@ "id": 960, "texto": { "en": "trouser", - "pt": "calça" + "es": "pantalon" }, "tipo": 2, "imagen": { @@ -7945,7 +8441,7 @@ "id": 962, "texto": { "en": "shorts", - "pt": "calção" + "es": "pantalones cortos" }, "tipo": 2, "imagen": { @@ -7959,7 +8455,7 @@ "id": 968, "texto": { "en": "bra", - "pt": "sutiã" + "es": "sosten" }, "tipo": 2, "imagen": { @@ -7973,7 +8469,7 @@ "id": 969, "texto": { "en": "sweater", - "pt": "suéter" + "es": "sweater" }, "tipo": 2, "imagen": { @@ -7987,7 +8483,7 @@ "id": 971, "texto": { "en": "dress", - "pt": "vestir" + "es": "vestido" }, "tipo": 2, "imagen": { @@ -8001,7 +8497,7 @@ "id": 972, "texto": { "en": "bandana", - "pt": "bandana" + "es": "vincha" }, "tipo": 2, "imagen": { @@ -8015,7 +8511,7 @@ "id": 973, "texto": { "en": "shoe", - "pt": "sapato" + "es": "zapato" }, "tipo": 2, "imagen": { @@ -8029,7 +8525,7 @@ "id": 974, "texto": { "en": "snicker", - "pt": "snicker" + "es": "zapatilla deportiva" }, "tipo": 2, "imagen": { @@ -8043,7 +8539,7 @@ "id": 975, "texto": { "en": "chess", - "pt": "xadrez" + "es": "el ajedrez" }, "tipo": 2, "imagen": { @@ -8057,7 +8553,7 @@ "id": 976, "texto": { "en": "kite", - "pt": "pipa" + "es": "el barrilete" }, "tipo": 2, "imagen": { @@ -8071,7 +8567,7 @@ "id": 977, "texto": { "en": "cubes", - "pt": "cubos" + "es": "los cubos" }, "tipo": 2, "imagen": { @@ -8085,7 +8581,7 @@ "id": 980, "texto": { "en": "truck", - "pt": "caminhão" + "es": "el camión de juguete" }, "tipo": 2, "imagen": { @@ -8099,7 +8595,7 @@ "id": 981, "texto": { "en": "firetruck", - "pt": "caminhão de bombeiros" + "es": "el coche de bomberos" }, "tipo": 2, "imagen": { @@ -8113,7 +8609,7 @@ "id": 982, "texto": { "en": "kitchenet", - "pt": "kitchenet" + "es": "la cocinita" }, "tipo": 2, "imagen": { @@ -8127,7 +8623,7 @@ "id": 986, "texto": { "en": "story", - "pt": "história" + "es": "el cuento" }, "tipo": 2, "imagen": { @@ -8141,7 +8637,7 @@ "id": 987, "texto": { "en": "ballons", - "pt": "balões" + "es": "los globos" }, "tipo": 2, "imagen": { @@ -8155,7 +8651,7 @@ "id": 989, "texto": { "en": "toys", - "pt": "brinquedos" + "es": "los juguetes" }, "tipo": 2, "imagen": { @@ -8169,13 +8665,34 @@ "id": 996, "texto": { "en": "ball", - "pt": "bola" + "es": "la pelota" }, "tipo": 2, "imagen": { "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpelota.webp?alt=media&token=ae1475c3-af87-493d-8843-3ad0720b6fb8" }, - "relacion": [], + "relacion": [ + { + "id": 737, + "frec": 2 + }, + { + "id": 736, + "frec": 1 + }, + { + "id": 748, + "frec": 1 + }, + { + "id": 749, + "frec": 1 + }, + { + "id": 746, + "frec": 1 + } + ], "agenda": 0, "gps": 0 }, @@ -8183,7 +8700,7 @@ "id": 1001, "texto": { "en": "football", - "pt": "futebol" + "es": "la pelota de fútbol" }, "tipo": 2, "imagen": { @@ -8197,7 +8714,7 @@ "id": 1005, "texto": { "en": "jigsaw", - "pt": "quebra-cabeça" + "es": "el rompecabeza" }, "tipo": 2, "imagen": { @@ -8211,7 +8728,7 @@ "id": 1012, "texto": { "en": "pillow", - "pt": "travesseiro" + "es": "la almohada" }, "tipo": 2, "imagen": { @@ -8225,7 +8742,7 @@ "id": 1013, "texto": { "en": "movie theater", - "pt": "cinema" + "es": "el cine" }, "tipo": 2, "imagen": { @@ -8239,7 +8756,7 @@ "id": 1014, "texto": { "en": "food", - "pt": "Comida" + "es": "comida" }, "tipo": 2, "imagen": { @@ -8253,7 +8770,7 @@ "id": 1016, "texto": { "en": "computer", - "pt": "computador" + "es": "la computadora" }, "tipo": 2, "imagen": { @@ -8267,7 +8784,7 @@ "id": 1017, "texto": { "en": "book", - "pt": "livro" + "es": "el libro" }, "tipo": 2, "imagen": { @@ -8281,7 +8798,7 @@ "id": 1019, "texto": { "en": "cd player", - "pt": "tocador de CD" + "es": "la radio" }, "tipo": 2, "imagen": { @@ -8295,7 +8812,7 @@ "id": 1020, "texto": { "en": "towel", - "pt": "toalha" + "es": "la toalla" }, "tipo": 2, "imagen": { @@ -8308,13 +8825,12 @@ { "id": 1023, "texto": { - "en": "", - "pt": "" + "en": "kitchen", + "es": "cocina" }, "tipo": 2, "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcocina.webp?alt=media&token=0f13280e-6377-482b-80f8-88b87659718c", - "pictoEditado": "/storage/emulated/0/Android/data/com.stonefacesoft.ottaa/Files/MI_03082016_181141.png" + "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcocina.webp?alt=media&token=0f13280e-6377-482b-80f8-88b87659718c" }, "relacion": [], "agenda": 0, @@ -8323,16 +8839,113 @@ { "id": 1024, "texto": { - "en": "", - "pt": "" + "en": "fridge", + "es": "heladera" + }, + "tipo": 2, + "imagen": { + "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fnevera.webp?alt=media&token=26ab2e17-fa2b-49cc-875d-1eb22929b367" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 1025, + "texto": { + "en": "oven", + "es": "horno" + }, + "tipo": 2, + "imagen": { + "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fhorno.webp?alt=media&token=6134b9d8-da69-4b8c-932d-082424a641d1" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 1026, + "texto": { + "en": "spoon", + "es": "cuchara" + }, + "tipo": 2, + "imagen": { + "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcuchara.webp?alt=media&token=a985b2d4-a436-4a16-a5a1-74d46a653ac1" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 1027, + "texto": { + "en": "fork", + "es": "tenedor" + }, + "tipo": 2, + "imagen": { + "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ftenedor.webp?alt=media&token=102c4878-a046-429a-8210-6ae3428a6cd6" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 1028, + "texto": { + "en": "knife", + "es": "cuchillo" + }, + "tipo": 2, + "imagen": { + "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcuchillo.webp?alt=media&token=4899f059-2a50-48f5-93af-4cc644e3b935" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 1029, + "texto": { + "en": "cook", + "es": "cocinar" + }, + "tipo": 1, + "imagen": { + "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcocinar.webp?alt=media&token=14d1dd93-0ef8-4a5b-966d-572a34f19697" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 1030, + "texto": { + "en": "sofa", + "es": "sillón" + }, + "tipo": 2, + "imagen": { + "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fsofa.webp?alt=media&token=cf5c392c-1c39-469b-bcac-2d32664a210a" + }, + "relacion": [], + "agenda": 0, + "gps": 0 + }, + { + "id": 1032, + "texto": { + "en": "table", + "es": "mesa" }, "tipo": 2, "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fnevera.webp?alt=media&token=26ab2e17-fa2b-49cc-875d-1eb22929b367", - "pictoEditado": "/storage/emulated/0/Android/data/com.stonefacesoft.ottaa/Files/MI_03082016_181219.jpg" + "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fmesa.webp?alt=media&token=3c0f72fe-94eb-411c-a430-a1dd34d529c7" }, "relacion": [], "agenda": 0, "gps": 0 } -] \ No newline at end of file +] diff --git a/assets/onboarding/1.png b/assets/onboarding/1.png new file mode 100644 index 00000000..bdb8e0bf Binary files /dev/null and b/assets/onboarding/1.png differ diff --git a/assets/onboarding/2.png b/assets/onboarding/2.png new file mode 100644 index 00000000..26370cf4 Binary files /dev/null and b/assets/onboarding/2.png differ diff --git a/assets/onboarding/3.png b/assets/onboarding/3.png new file mode 100644 index 00000000..e076b18d Binary files /dev/null and b/assets/onboarding/3.png differ diff --git a/assets/ottaa_tablet.png b/assets/ottaa_tablet.png new file mode 100644 index 00000000..c712c536 Binary files /dev/null and b/assets/ottaa_tablet.png differ diff --git a/assets/pictos.json b/assets/pictos.json index d0bcd938..0fd0d2ae 100644 --- a/assets/pictos.json +++ b/assets/pictos.json @@ -1,8951 +1,12080 @@ [ { - "id": 0, - "texto": { - "en": "", - "es": "perro" + "id": "-2UbAou9ydr8XeN-jtIz4", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Flimpiar.webp?alt=media&token=a68c1cfd-0df4-4ab2-a733-536631bb3080" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_action_previous.webp?alt=media&token=a6feccd4-fd34-4b5a-ac1d-a5f027551d44" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] }, - "relacion": [ - { - "id": 377, - "frec": 62 - }, - { - "id": 643, - "frec": 36 - }, - { - "id": 628, - "frec": 35 - }, - { - "id": 388, - "frec": 11 - }, + "text": "limpiar", + "type": 3 + }, + { + "id": "-GL2iAgykP10Ae3AKsVOX", + "relations": [ { - "id": 389, - "frec": 13 - }, + "id": "-GL2iAgykP10Ae3AKsVOX", + "value": 4 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fsal.webp?alt=media&token=ea989d3f-c52a-443a-a6a0-41b9f9094936" + }, + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] + }, + "text": "sal", + "type": 2 + }, + { + "id": "-LE2iv3Pwr5KuIyM5bYb3", + "relations": [ { - "id": 614, - "frec": 14 + "id": "y_5OURnKxFcv4UiMKntUi", + "value": 7 }, { - "id": 623, - "frec": 10 + "id": "CYH_6DL9q1iLLetuWeR9A", + "value": 3 }, { - "id": 44, - "frec": 50 + "id": "bDnuS19hfd9GhJ-6rjNPD", + "value": 3 }, { - "id": 632, - "frec": 16 + "id": "wkrNPLGWTqMIy4PJRW9QR", + "value": 2 }, { - "id": 382, - "frec": 2 + "id": "cb0rJJEYOeEoRU5fDdQQq", + "value": 2 }, { - "id": 384, - "frec": 1 + "id": "g1Cj6HW8kg8yPE1XX9pxa", + "value": 2 } ], - "agenda": 0, - "gps": 0 + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_estoy_bien.webp?alt=media&token=11f656c5-d219-43b5-93e7-09f9697f2d65" + }, + "text": "bien", + "type": 4 + }, + { + "id": "-LwAKwgCdVkzwM579zRMo", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fopenmoji_plus.webp?alt=media&token=dfef971d-6e14-4db7-bfd4-0e298162373d" + }, + "text": "más", + "type": 6 + }, + { + "id": "-aePI8WknXpxEpz19Lu48", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fsuyos.webp?alt=media&token=1265f18e-c7f5-4f94-852a-76c1f9841d25" + }, + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] + }, + "text": "suyos", + "type": 6 + }, + { + "id": "-msU3yor4qJYQHJtWrdk8", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/8652/8652_500.png" + }, + "text": "pastas", + "type": 2 }, { - "id": 1, - "texto": { - "en": "escort", - "es": "acompañar" + "id": "00AkNJ4YLpbRD_mLmQjtp", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_almuerzo.webp?alt=media&token=b7acb5a2-b170-4c2b-a5b6-341d19db3632" }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_acompanar.webp?alt=media&token=dcd36ffa-bfb6-412e-a368-d6a60815e93b" + "tags": { + "HORA": [ + "MEDIODIA" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "almuerzo", + "type": 2 }, { - "id": 2, - "texto": { - "en": "turn off", - "es": "apagar" + "id": "0IrLGI8Ebm8rcS3ymUXqS", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_hambre.webp?alt=media&token=3af9b051-508f-4a4d-9969-2c9e393283d2" + }, + "text": "hambre", + "type": 2 + }, + { + "id": "0THELgiQ7rvA-orESXJfV", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Favion.webp?alt=media&token=c46dbcaa-99a0-4605-8eb5-8907dfd0e43f" + }, + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_apagar_television.webp?alt=media&token=d4967332-d189-4df5-ba33-ae4ccfc9b400" + "text": "avión", + "type": 2 + }, + { + "id": "0Vkmy6BZcJn3pFurEevL9", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/6495/6495_500.png" }, - "relacion": [ + "text": "estudiar", + "type": 3 + }, + { + "id": "0Z7uFXpp-XRXmqM8ILhIC", + "relations": [ { - "id": 1016, - "frec": 2 + "id": "B1845IfYfPMz2FWpVFIQv", + "value": 11 }, { - "id": 1019, - "frec": 1 + "id": "CZrETqLgQlvDkLHvw1t_w", + "value": 2 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpoco.webp?alt=media&token=1d232fd6-f131-48b3-9457-7d8310e9c88e" + }, + "text": "poco", + "type": 4 + }, + { + "id": "0_SK41wNOk6mw2qX_eHXM", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcine.webp?alt=media&token=4109bb74-ab3d-4cda-99fb-34e7030e8762" + }, + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] + }, + "text": "cine", + "type": 2 + }, + { + "id": "0cdYDZ5HPaTmqTTN0_Ee8", + "relations": [ + { + "id": "wkrNPLGWTqMIy4PJRW9QR", + "value": 6 }, { - "id": 773, - "frec": 2 + "id": "cb0rJJEYOeEoRU5fDdQQq", + "value": 2 }, { - "id": 774, - "frec": 2 + "id": "GY_flM-6uR6X3L4AwsiwU", + "value": 2 } ], - "agenda": 0, - "gps": 0 + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_suerte.webp?alt=media&token=d5dd1d50-6740-46f2-9b51-0f1b0cc09ee5" + }, + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] + }, + "text": "suerte", + "type": 5 }, { - "id": 3, - "texto": { - "en": "turn the volume down", - "es": "bajar volumen" + "id": "0fHziRVxg0oNDp5pyiI8M", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/34697/34697_500.png" }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_volumen_menos.webp?alt=media&token=a96a4d6a-55fc-4b35-87f3-6e5a995efabc" - }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "permiso", + "type": 5 }, { - "id": 4, - "texto": { - "en": "erase", - "es": "borrar" + "id": "0fcYcD_r0jNWXTTAx8Ph7", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Faeropuerto.webp?alt=media&token=2f7b5699-6a42-43ec-bcdb-e4bb6283fe4f" }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_borrar.webp?alt=media&token=8141651f-d10e-41c3-800e-ebcd444f0665" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "aeropuerto", + "type": 2 }, { - "id": 5, - "texto": { - "en": "search", - "es": "buscar" + "id": "0gAyTD6sImo0jpD_bYGVv", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/6536/6536_500.png" }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_buscar.webp?alt=media&token=ee3aa171-1a16-4563-a8c5-a9c4c32c8748" + "text": "jueves", + "type": 6 + }, + { + "id": "0huLn-H32Cbwba28IZ3tc", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/8389/8389_500.png" }, - "relacion": [ - { - "id": 996, - "frec": 1 - }, - { - "id": 500, - "frec": 1 - }, - { - "id": 989, - "frec": 1 - }, + "text": "burbujas", + "type": 2 + }, + { + "id": "0jpMJu8isUmOZKxhZ_yaj", + "relations": [ { - "id": 737, - "frec": 2 - }, + "id": "B1845IfYfPMz2FWpVFIQv", + "value": 3 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fequipo.webp?alt=media&token=fe87fc4f-4e88-41a3-90ce-a6104a538091" + }, + "tags": { + "EDAD": [ + "JOVEN", + "NINO" + ], + "GENERO": [ + "HOMBRE", + "MUJER" + ] + }, + "text": "equipo", + "type": 1 + }, + { + "id": "0pFtmDZdlnLrUkT_XZDXQ", + "relations": [ { - "id": 385, - "frec": 3 + "id": "B1845IfYfPMz2FWpVFIQv", + "value": 34 }, { - "id": 628, - "frec": 3 + "id": "pvXSy-5M4i8kysUppvdME", + "value": 3 }, { - "id": 1014, - "frec": 2 + "id": "eZEqRZjRK8JJMsfHo4Y7w", + "value": 2 } ], - "agenda": 0, - "gps": 0, - "esSugerencia": false + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fantes.webp?alt=media&token=3dd6363e-4ce8-439b-ade7-79d2988c5d3d" + }, + "text": "antes", + "type": 6 }, { - "id": 6, - "texto": { - "en": "sing", - "es": "cantar" - }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_cantar.webp?alt=media&token=b0a7dbc5-47be-4c86-a6be-9811415ce329" + "id": "0qoQs8WyLVONnu3_eBGfD", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fzid_dolor_de_cabeza.webp?alt=media&token=20980fc1-4310-482a-89c1-1a37141fcacd" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "dolor de cabeza", + "type": 2 }, { - "id": 7, - "texto": { - "en": "change", - "es": "cambiar" + "id": "0v5fqIp8GmXsIHO0SPhtt", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/5397/5397_500.png" }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_cambiar.webp?alt=media&token=c5512652-c864-4bf1-bce2-3b6cd0290462" + "text": "dale", + "type": 5 + }, + { + "id": "0vttFf3nAGDW6g5wVStcH", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fopenmoji_excuseme.webp?alt=media&token=09305fc2-2d6c-4b69-a82f-79db2b0f7485" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "disculpa", + "type": 5 }, { - "id": 8, - "texto": { - "en": "change channel", - "es": "cambiar de canal" + "id": "1-VwcvzNfvrwDWRGxRPre", + "relations": [ + { + "id": "bDnuS19hfd9GhJ-6rjNPD", + "value": 2 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fni.webp?alt=media&token=d2bafbdf-863b-4f34-b4c8-6cddc8031062" }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_cambiar_canal.webp?alt=media&token=bb216f15-f686-4f31-ba31-c20dc370a538" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "ni", + "type": 6 }, { - "id": 9, - "texto": { - "en": "change diapper", - "es": "cambiarme el pañal" + "id": "10X4OKR5xmNhSj86sbyE_", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fsalchichas.webp?alt=media&token=aee011c3-8381-4e88-b47d-45677eebf67e" }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_cambiarpanal.webp?alt=media&token=42b1f845-854d-4b29-aaf9-f228302deb64" + "tags": { + "HORA": [ + "MEDIODIA", + "NOCHE" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "salchichas", + "type": 2 }, { - "id": 10, - "texto": { - "en": "change clothes", - "es": "cambiarme la ropa" + "id": "14aCIW665UZtuwNsKKV5s", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_cartuchera.webp?alt=media&token=60a16199-fb91-4ba6-9b40-939237b6a84c" }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_cambiarropa.webp?alt=media&token=2493ba44-ec6a-4811-8960-c3d9bebc608f" + "tags": { + "EDAD": [ + "JOVEN", + "NINO" + ] }, - "relacion": [ + "text": "cartuchera", + "type": 2 + }, + { + "id": "17AkRFlfC_koV-lywmDE8", + "relations": [ { - "id": 385, - "frec": 1 + "id": "GY_flM-6uR6X3L4AwsiwU", + "value": 2 } ], - "agenda": 0, - "gps": 0 - }, - { - "id": 11, - "texto": { - "en": "brush my teeth", - "es": "cepillarme los dientes" + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpantalones_cortos.webp?alt=media&token=48ca7ec7-555a-40c9-b325-34eddf840149" }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_cepillar.webp?alt=media&token=5025fba1-67ca-4c00-b61c-18fcee7fbacf" + "tags": { + "EDAD": [ + "JOVEN", + "NINO" + ] }, - "relacion": [ + "text": "pantalones cortos", + "type": 2 + }, + { + "id": "1B1WmC-V0PglDeRAeINcT", + "relations": [ { - "id": 385, - "frec": 4 + "id": "Sp2Ias_Y1HplkHWjIb7Mp", + "value": 2 } ], - "agenda": 0, - "gps": 0 + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/6564/6564_500.png" + }, + "text": "mirar", + "type": 3 }, { - "id": 12, - "texto": { - "en": "eat a sandwich", - "es": "comer un sandwich" + "id": "1DjW-XvWN7iOqoJPRSWwY", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_estoy_mal.webp?alt=media&token=cbd50a8b-74cc-48ac-b1c3-c3accf49bc62" }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcomer_un_bocadillo.webp?alt=media&token=051a6f68-0ab9-40fb-90fe-03eedefc72ef" + "tags": { + "EDAD": [ + "ADULTO" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "mal", + "type": 4 }, { - "id": 13, - "texto": { - "en": "buy", - "es": "comprar" + "id": "1IjenNwPwsMIWZ4aYBk8S", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_partido.webp?alt=media&token=75c30e48-e4d6-4cf9-abb3-a35cfbdc2043" }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_comprar.webp?alt=media&token=9d2bdbfc-8e58-4d9b-a7e5-47eea780fc37" + "tags": { + "EDAD": [ + "JOVEN" + ], + "GENERO": [ + "HOMBRE" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "partido", + "type": 2 }, { - "id": 14, - "texto": { - "en": "give", - "es": "dame" + "id": "1Ph13Z_Ya6p-q0WA7pSl3", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpajarito.webp?alt=media&token=70c9bceb-f954-4b83-8889-40bbdee3ad5b" }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_dar.webp?alt=media&token=792b74d2-9da1-4fc2-9c21-14fdae807a67" + "tags": { + "EDAD": [ + "JOVEN", + "NINO" + ] }, - "relacion": [ - { - "id": 427, - "frec": 1 - }, - { - "id": 989, - "frec": 1 - }, - { - "id": 500, - "frec": 1 - }, - { - "id": 774, - "frec": 2 - }, - { - "id": 986, - "frec": 2 - }, - { - "id": 857, - "frec": 1 - } - ], - "agenda": 0, - "gps": 0, - "esSugerencia": false + "text": "pájaro", + "type": 2 }, { - "id": 15, - "texto": { - "en": "draw", - "es": "dibujar" - }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_dibujar.webp?alt=media&token=caaec230-be41-40f5-b252-45ef3027ece1" + "id": "1QEfLU_S7TM0iMr9VZVtP", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/16739/16739_500.png" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "ronda", + "type": 2 }, { - "id": 17, - "texto": { - "en": "turn on", - "es": "encender" + "id": "1Rv9-SSJjHptwvzqLbdbx", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fdivertido.webp?alt=media&token=2efe9347-c828-4946-bd51-d84815185caa" }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fencender_la_television.webp?alt=media&token=de8e299d-f53d-40cd-a04f-4d3e5614d84c" + "tags": { + "EDAD": [ + "JOVEN", + "NINO" + ] + }, + "text": "divertido", + "type": 4 + }, + { + "id": "1WJZO-pUkTaQvyxz41iB-", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/35635/35635_500.png" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "picado", + "type": 4 }, { - "id": 18, - "texto": { - "en": "write", - "es": "escribir" + "id": "1YOlJCovdcnnqVihqHVmq", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_aca.webp?alt=media&token=0758a4e6-5f77-4dd8-a599-075c1823a9ce" }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_escribir.webp?alt=media&token=56300bbc-6082-4d71-bdae-4e7ae02540d1" + "text": "acá", + "type": 2 + }, + { + "id": "1b71P9YjaNWnX8AWjstqG", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/2309/2309_500.png" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "remera", + "type": 2 }, { - "id": 19, - "texto": { - "en": "listen again", - "es": "escuchar de nuevo" + "id": "1mS8kgJIod1cyUFH-msnM", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/3099/3099_500.png" }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_de_nuevo.webp?alt=media&token=925fbdb2-67aa-48d8-b023-5c8bd8dcbc75" + "text": "estación", + "type": 2 + }, + { + "id": "1mU2ZosZXSJrxkh1NmxJT", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/9203/9203_500.png" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "izquierda", + "type": 2 }, { - "id": 20, - "texto": { - "en": "listen to music", - "es": "escuchar música" + "id": "1nhsReHG-f-bW-xaZBsxY", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/5355/5355_500.png" }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_escuchar_musica.webp?alt=media&token=258720fc-5ba7-44e4-b03e-2b3575a56784" + "text": "abajo", + "type": 4 + }, + { + "id": "1pb6S-RR_3zdCq77YFiZ-", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/5504/5504_500.png" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "¡qué mal!", + "type": 5 }, { - "id": 21, - "texto": { - "en": "listen", - "es": "escuchar" + "id": "1zU7kolOKsHP9-oomQW1Q", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Frey.webp?alt=media&token=6c6b9e6f-f61e-40b2-ab1b-9e2c52988a76" }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_escuchar.webp?alt=media&token=768c54e4-d18b-463f-9cf4-e5c6e9d715b9" + "tags": { + "EDAD": [ + "JOVEN" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "rey", + "type": 1 }, { - "id": 22, - "texto": { - "en": "be", - "es": "estoy" + "id": "27GbVOZ-szdnzsy92oY-X", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fmanteca.webp?alt=media&token=abb20bfc-1da4-4f2a-8a1b-2ba8154cb138" }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_estoy.webp?alt=media&token=d46357be-23e9-44e0-8fd5-430f9542c817" + "tags": { + "HORA": [ + "MANANA" + ] }, - "relacion": [ - { - "id": 133, - "frec": 6 - }, - { - "id": 205, - "frec": 2 - }, - { - "id": 204, - "frec": 4 - }, - { - "id": 181, - "frec": 1 - }, - { - "id": 272, - "frec": 1 - }, - { - "id": 274, - "frec": 1 - }, + "text": "manteca", + "type": 2 + }, + { + "id": "2CgcUkvJUskv982FvG54A", + "relations": [ { - "id": 819, - "frec": 1 + "id": "emm_RirDsO30Enax5Q4gd", + "value": 3 }, { - "id": 831, - "frec": 1 + "id": "B1845IfYfPMz2FWpVFIQv", + "value": 3 }, { - "id": 119, - "frec": 6 + "id": "GY_flM-6uR6X3L4AwsiwU", + "value": 2 } ], - "agenda": 0, - "gps": 0, - "esSugerencia": false - }, - { - "id": 23, - "texto": { - "en": "wait", - "es": "esperar" + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_dinero.webp?alt=media&token=511fcf7d-fc11-40fa-b28f-6afea1e470bf" }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fesperar.webp?alt=media&token=c877c0c0-b425-4f97-8650-7b5c22b5c0c2" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "plata", + "type": 2 }, { - "id": 26, - "texto": { - "en": "win", - "es": "ganar" - }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_ganar.webp?alt=media&token=07cd9657-3510-44de-9bdd-16544b5bf73f" + "id": "2HkB0WZYP7cvWLD39GMQj", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/26803/26803_500.png" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "bañar", + "type": 3 }, { - "id": 28, - "texto": { - "en": "do", - "es": "hacer" + "id": "2KO0BFtB4B6fu1feuAZLt", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fverbos.webp?alt=media&token=f32aaaf1-44aa-49d3-a0ed-981ba01564d5" }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_haciendo.webp?alt=media&token=d3b4e1aa-97d0-41a3-aa83-aa8004ce75f2" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "verbos", + "type": 2 }, { - "id": 29, - "texto": { - "en": "pee", - "es": "hacer pis" - }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_hacerpis.webp?alt=media&token=4ce82c9c-7cf8-4d10-808f-e06ca0aec6fb" - }, - "relacion": [ + "id": "2RZTRMX56BFLrW7tLJ3Hy", + "relations": [ { - "id": 385, - "frec": 3 + "id": "Wu47Qs6Zupu1Ox2gUhkxn", + "value": 2 } ], - "agenda": 0, - "gps": 0 + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fmismo.webp?alt=media&token=afcd67dc-37f1-4ee6-8651-4776cdccb259" + }, + "text": "mismo", + "type": 4 }, { - "id": 30, - "texto": { - "en": "go", - "es": "ir a" - }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fir.webp?alt=media&token=087da971-16b1-4d6c-855c-f7481e0840db" + "id": "2Vc2H462cutVtUC-5omJk", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpocos.webp?alt=media&token=3db8f233-9a11-47b3-9894-9cde18678671" }, - "relacion": [ - { - "id": 653, - "frec": 6 - }, - { - "id": 118, - "frec": 7 - }, - { - "id": 650, - "frec": 4 - }, - { - "id": 651, - "frec": 3 - }, - { - "id": 682, - "frec": 1 - }, - { - "id": 688, - "frec": 5 - }, - { - "id": 668, - "frec": 5 - }, - { - "id": 87, - "frec": 1 - }, - { - "id": 51, - "frec": 1 - } - ], - "agenda": 0, - "gps": 0, - "esSugerencia": false + "text": "pocos", + "type": 4 }, { - "id": 31, - "texto": { - "en": "wash hands", - "es": "lavarme las manos" + "id": "2dwtZO2wCm520GPD1i6dl", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fzid_dolor_de_garganta.webp?alt=media&token=1f994ca1-0abf-4377-93f1-520004a95ec2" }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_lavamano.webp?alt=media&token=7c486791-926b-4813-8697-d96615f9a1c6" + "tags": { + "EDAD": [ + "JOVEN", + "NINO" + ] }, - "relacion": [ - { - "id": 385, - "frec": 1 - } - ], - "agenda": 0, - "gps": 0 + "text": "dolor de garganta", + "type": 2 }, { - "id": 32, - "texto": { - "en": "read", - "es": "leer" + "id": "2t_eq1JmgHa0R3eu8LMmI", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/2612/2612_500.png" }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fleer.webp?alt=media&token=2008ecda-fb99-4cfd-be06-3ac1cb1d2100" - }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "ventilador", + "type": 2 }, { - "id": 33, - "texto": { - "en": "call someone", - "es": "llamar a alguien" + "id": "2u2-AFuI245I7bZ6tsSPh", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fquien.webp?alt=media&token=94d5cbe4-5aab-4898-b2b3-d335741935ab" }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_llamaralguien.webp?alt=media&token=1bc21620-5b70-467f-9680-9d18d15f30e5" + "text": "¿quién?", + "type": 6 + }, + { + "id": "2y9pxVOBQ2tMdPHcsqQb8", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/6557/6557_500.png" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "martes", + "type": 6 }, { - "id": 34, - "texto": { - "en": "play with", - "es": "jugar con" + "id": "3-ueUrnwmIIj0BMP8_Ntb", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Funia.webp?alt=media&token=5d43c3a6-52bf-4a22-90b5-cf4f7e42fd9c" }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_jugar.webp?alt=media&token=aba130c0-3439-4bcb-97b2-80adaaa645b5" + "text": "uña", + "type": 2 + }, + { + "id": "32PnZjlnQbTJo4nL9YJYe", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ffeliz.webp?alt=media&token=6e0556fc-0825-4e02-a428-758ac7a42686" }, - "relacion": [ - { - "id": 996, - "frec": 13 - }, - { - "id": 761, - "frec": 15 - }, - { - "id": 615, - "frec": 5 - }, - { - "id": 632, - "frec": 10 - }, - { - "id": 628, - "frec": 3 - }, - { - "id": 977, - "frec": 1 - }, + "text": "feliz", + "type": 4 + }, + { + "id": "3932Zm0xgk1hKB2hhBAUa", + "relations": [ { - "id": 982, - "frec": 1 + "id": "kpghvJtujlt4vPI2N6vsg", + "value": 3 }, { - "id": 1005, - "frec": 1 + "id": "CZrETqLgQlvDkLHvw1t_w", + "value": 2 } ], - "agenda": 0, - "gps": 0, - "edad": [ - "NINO" - ], - "esSugerencia": false - }, - { - "id": 35, - "texto": { - "en": "look at the mirror", - "es": "mirarme al espejo" + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fautobus.webp?alt=media&token=15a4c091-c8fb-4c00-8cc3-dfe53becfc8f" }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_espejo.webp?alt=media&token=64b31994-8493-4f77-b978-dff642f1e685" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "colectivo", + "type": 2 }, { - "id": 38, - "texto": { - "en": "take a walk", - "es": "pasear" + "id": "3KbwCHGooNLySWOBlFFuG", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcocinita.webp?alt=media&token=5cd82ee3-0664-4aa6-b819-665c6c02fd2f" }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_pasear.webp?alt=media&token=8ce622f4-a514-462a-bdb1-792e0c85863b" + "tags": { + "EDAD": [ + "NINO" + ], + "GENERO": [ + "MUJER" + ], + "HORA": [ + "MEDIODIA" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "cocinita", + "type": 2 }, { - "id": 39, - "texto": { - "en": "comb", - "es": "peinarme" + "id": "3KgKNNnuYMrysEDs3Pu4Z", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/28091/28091_500.png" }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_peinar.webp?alt=media&token=f97dbc62-edb3-434f-8139-f4f40401caf4" - }, - "relacion": [ - { - "id": 385, - "frec": 2 - } - ], - "agenda": 0, - "gps": 0 + "text": "subtítulo", + "type": 2 }, { - "id": 41, - "texto": { - "en": "lose", - "es": "perder" + "id": "3VEnVjaGFCImBAZ3wEChu", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/7233/7233_500.png" }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_perder.webp?alt=media&token=6262e1ba-75d3-4a44-b365-8ed676102c8e" - }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "ropa", + "type": 2 }, { - "id": 43, - "texto": { - "en": "paint", - "es": "pintar" + "id": "3arbCGI6fMOWALLanZcg3", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcapuchino.webp?alt=media&token=f01e2fe2-206a-45f2-b689-51a8fff98f50" }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_pintar.webp?alt=media&token=5dd94837-f3fb-4f86-a82d-03cc7dff54bf" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ], + "HORA": [ + "MANANA" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "capuchino", + "type": 2 }, { - "id": 44, - "texto": { - "en": "want", - "es": "quiero" + "id": "3dtvYLjbl5oDyhZO9eFRY", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/7032/7032_500.png" }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_quiero.webp?alt=media&token=0012395e-71a4-453f-aafb-d58c0ebf70b6" + "text": "ellos", + "type": 1 + }, + { + "id": "3mwcdenOurU_e59ChLqb0", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/5475/5475_500.png" }, - "relacion": [ + "text": "fuera", + "type": 4 + }, + { + "id": "3w62N9b7Cvb6JMjB9Wphi", + "relations": [ { - "id": 118, - "frec": 20 + "id": "Vjlet5P7XuqTrc22nt_Zz", + "value": 1 }, { - "id": 34, - "frec": 43 + "id": "75gujwNXJdAiNmK6Ffhia", + "value": 1 }, { - "id": 29, - "frec": 8 + "id": "5gPT9lrNgpRkF07lP6zOq", + "value": 1 }, { - "id": 11, - "frec": 3 + "id": "pkuppr1jMH7SMpa2hrIWQ", + "value": 1 }, { - "id": 31, - "frec": 3 + "id": "hwzwfMyJsvB42F_QWQWyi", + "value": 1 }, { - "id": 39, - "frec": 10 + "id": "jhJ2TOfdaRAcVeHGOjwua", + "value": 3 }, { - "id": 10, - "frec": 3 + "id": "xXtjQktuAq1bmxTc0HSQT", + "value": 5 }, { - "id": 35, - "frec": 4 + "id": "JawnUo-pseWb3FDVMtxrQ", + "value": 2 }, { - "id": 5, - "frec": 19 + "id": "DBd09yUlbkaYLsemjFXEs", + "value": 1 }, { - "id": 30, - "frec": 32 + "id": "cb0rJJEYOeEoRU5fDdQQq", + "value": 6 }, { - "id": 51, - "frec": 16 + "id": "kN85Lb_C4dLnww7sz1afK", + "value": 2 }, { - "id": 2, - "frec": 11 + "id": "rxdfuk6egO7VmZEB3JrUN", + "value": 2 } ], - "agenda": 0, - "gps": 0, - "esSugerencia": false - }, - { - "id": 49, - "texto": { - "en": "have", - "es": "tengo" - }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_tengo.webp?alt=media&token=860f02bc-61ee-4fb7-a120-53a15e5b59a7" + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/6061/6061_500.png" }, - "relacion": [ - { - "id": 177, - "frec": 3 - }, - { - "id": 597, - "frec": 4 - }, - { - "id": 662, - "frec": 2 - }, - { - "id": 754, - "frec": 1 - }, - { - "id": 729, - "frec": 2 - }, - { - "id": 572, - "frec": 2 - }, - { - "id": 8, - "frec": 1 - } - ], - "agenda": 0, - "gps": 0, - "esSugerencia": false + "text": "beber", + "type": 3 }, { - "id": 51, - "texto": { - "en": "drink", - "es": "tomar" - }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fbeber.webp?alt=media&token=95642655-8bd4-47d7-8222-0244e7491598" + "id": "40q0NJ6vsziJDNFBqho7Y", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/5439/5439_500.png" }, - "relacion": [ - { - "id": 500, - "frec": 1 - }, - { - "id": 497, - "frec": 1 - }, - { - "id": 468, - "frec": 1 - }, - { - "id": 469, - "frec": 1 - }, - { - "id": 471, - "frec": 1 - }, - { - "id": 495, - "frec": 3 - }, - { - "id": 501, - "frec": 5 - }, - { - "id": 484, - "frec": 2 - }, - { - "id": 486, - "frec": 1 - } - ], - "agenda": 0, - "gps": 0, - "esSugerencia": false + "text": "dentro", + "type": 4 }, { - "id": 52, - "texto": { - "en": "hug", - "es": "abrazar" - }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fabrazar.webp?alt=media&token=e60acc80-b7b7-4ee6-a0ff-f81b6ee5fda3" + "id": "4A_FNkGH1EDu0oabPurrL", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/2328/2328_500.png" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "cereales", + "type": 2 }, { - "id": 53, - "texto": { - "en": "open", - "es": "abrir" + "id": "4J1bWl6BbbEdZsRGsgYH2", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fqueso.webp?alt=media&token=f36923ae-193d-4e9f-bbd3-60557ac52629" }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fabrir.webp?alt=media&token=f4eef053-9555-4bc5-9c98-027004815311" + "tags": { + "HORA": [ + "MEDIODIA", + "NOCHE" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "queso", + "type": 2 }, { - "id": 54, - "texto": { - "en": "hook up", - "es": "abrochar" + "id": "4X7OXm35OSHoSlPxGUi_f", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/32594/32594_500.png" }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fabrochar.webp?alt=media&token=ee1e45ea-b017-4dec-ac58-eafea2d644f5" - }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "mueble", + "type": 2 }, { - "id": 57, - "texto": { - "en": "love", - "es": "amar" - }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Famar.webp?alt=media&token=4080adb7-3ce9-4759-864c-7f676f3a95b1" + "id": "4bHGIoQmDN8LptpdNN4v6", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/3166/3166_500.png" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "vacaciones", + "type": 6 }, { - "id": 61, - "texto": { - "en": "get down", - "es": "bajar" + "id": "4f1vqDoAvUu2XYk_JlQdC", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fsiete.webp?alt=media&token=6e7d62b1-62b9-4eaf-acc2-5ec55eb46d9b" }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fbajar.webp?alt=media&token=2247bc63-785c-4290-87ee-93ca136dbed3" - }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "siete", + "type": 6 }, { - "id": 64, - "texto": { - "en": "kiss", - "es": "besar" + "id": "4rctwNiN4UaU9lqU48MHG", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_computadora.webp?alt=media&token=a8231494-9cd4-4214-957c-0f0cac0bf51a" }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fbesar.webp?alt=media&token=ac69b6b5-e23a-4199-a576-88196d37ca01" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "computadora", + "type": 2 }, { - "id": 65, - "texto": { - "en": "ride", - "es": "cabalgar" + "id": "4rzonBodQXfs77gALnAP_", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcerveza.webp?alt=media&token=923077ac-4f46-47b6-a98e-60fb98e63522" }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcabalgar.webp?alt=media&token=54b54202-50bf-4472-8768-e14da82265ab" + "tags": { + "EDAD": [ + "ADULTO" + ], + "HORA": [ + "TARDE", + "NOCHE" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "cerveza", + "type": 2 }, { - "id": 66, - "texto": { - "en": "fall", - "es": "caer" - }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcaer.webp?alt=media&token=5bdb209f-082b-442d-82bb-429359e504d1" + "id": "50wJdR0-3YLnv9y_2Gx_e", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/6607/6607_500.png" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "saltar", + "type": 3 }, { - "id": 68, - "texto": { - "en": "close", - "es": "cerrar" + "id": "54BVjn2seJWdBNGI20-yJ", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fordenador.webp?alt=media&token=9452b67d-5e5c-456a-bb33-1398701f7f00" }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcerrar.webp?alt=media&token=ee470cae-e15f-4522-a0ae-2434efc3f2fc" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "computadora", + "type": 2 }, { - "id": 69, - "texto": { - "en": "grab", - "es": "agarrar" - }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcoger.webp?alt=media&token=a2949664-3aa3-43f7-bf88-eafb8818bc53" + "id": "54taab8z9ziXt0IqXHkV9", + "relations": [ + { + "id": "C29KJ8BTFavhj_R9UfnSv", + "value": 2 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fdedos.webp?alt=media&token=9aa0483f-ec5b-405b-a2d5-1100dd29c4d0" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "dedos", + "type": 2 }, { - "id": 70, - "texto": { - "en": "run", - "es": "correr" + "id": "5L5UzBHOzuHRoO-jyPuEx", + "relations": [ + { + "id": "wkrNPLGWTqMIy4PJRW9QR", + "value": 3 + }, + { + "id": "B1845IfYfPMz2FWpVFIQv", + "value": 2 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fciudad.webp?alt=media&token=e57e17e4-6d75-47fe-9fc9-5465ca130261" }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcorrer.webp?alt=media&token=a4439f93-1f23-4bbe-ac63-b0a26711da1d" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "ciudad", + "type": 2 }, { - "id": 71, - "texto": { - "en": "cut", - "es": "cortar" + "id": "5LYjhk-N87Ov9NrQcGbLQ", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Faceite.webp?alt=media&token=a2c953be-6ccc-4dce-9665-7d099e0542de" }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcortar.webp?alt=media&token=0d88cafb-a552-4dec-b675-ccc9f3c5f5ee" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ], + "HORA": [ + "MEDIODIA", + "NOCHE" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "aceite", + "type": 2 }, { - "id": 76, - "texto": { - "en": "get in", - "es": "entrar" + "id": "5Tdy0Gu9SiLsPfWwd-Y2E", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Flindo.webp?alt=media&token=b708bf7e-50e2-4d1c-89d6-ebbb7ec92e81" }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fentrar.webp?alt=media&token=f968b6e8-3694-4813-9b97-644e0e630826" + "tags": { + "HORA": [ + "NOCHE" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "lindo", + "type": 4 }, { - "id": 78, - "texto": { - "en": "hacer el amor", - "es": "hacer el amor" + "id": "5VBtwEswIjrv1zbXP-oFn", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fsopa.webp?alt=media&token=2add9150-6bf8-4d89-a250-3c7a79fc4c7e" }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fhacer_el_amor.webp?alt=media&token=f7e8141e-8325-4564-bcc4-7c75e59152a9" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ], + "HORA": [ + "MEDIODIA", + "NOCHE" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0, - "edad": [ - "ADULTO" - ] + "text": "sopa", + "type": 2 }, { - "id": 79, - "texto": { - "en": "smell", - "es": "oler" - }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fhusmear.webp?alt=media&token=e1bdad48-76a9-4de9-9246-a0d9e60c8c2d" + "id": "5W5_sCAyGTkVzguCEg1d1", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/11461/11461_500.png" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "jugo", + "type": 2 }, { - "id": 81, - "texto": { - "en": "investigate", - "es": "investigar" + "id": "5dvq344JstkxUpHszaPfp", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/2732/2732_500.png" }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Finvestigar.webp?alt=media&token=30a04dc5-cd12-4eaf-bb84-690f12b997ee" - }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "delfín", + "type": 2 }, { - "id": 82, - "texto": { - "en": "play with the tablet", - "es": "jugar con la tablet" + "id": "5gPT9lrNgpRkF07lP6zOq", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fzumo_de_manzana.webp?alt=media&token=0512a2bb-b7b1-41e5-ac98-a124816536cb" }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fjugar_con_la_tablet.webp?alt=media&token=9e30d1b6-ab88-463f-a30f-c1d4b199dcdc" + "tags": { + "EDAD": [ + "NINO" + ], + "HORA": [ + "MEDIODIA", + "NOCHE" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0, - "edad": [ - "JOVEN" - ] + "text": "jugo de manzana", + "type": 2 }, { - "id": 85, - "texto": { - "en": "look", - "es": "mirar" - }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fmirar.webp?alt=media&token=e4a59c5c-b538-4074-8e97-4e08a1b5a6d2" + "id": "5i3kSsCKF7Oa9iJQvXiTe", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_estoy_masomenos.webp?alt=media&token=f18a2305-333c-4b02-bcc2-8dac84c0f56c" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "más o menos", + "type": 4 }, { - "id": 86, - "texto": { - "en": "swim", - "es": "nadar" + "id": "5kjlzqb9Rf3zzqZROaZ9p", + "relations": [ + { + "id": "cb0rJJEYOeEoRU5fDdQQq", + "value": 3 + }, + { + "id": "wkrNPLGWTqMIy4PJRW9QR", + "value": 2 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_perder.webp?alt=media&token=6262e1ba-75d3-4a44-b365-8ed676102c8e" }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fnadar.webp?alt=media&token=d861abe6-d581-4cf9-97d7-24f56578e504" + "tags": { + "EDAD": [ + "JOVEN", + "NINO" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "perder", + "type": 3 }, { - "id": 87, - "texto": { - "en": "take a walk", - "es": "pasear" - }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpasear.webp?alt=media&token=1de7c440-8578-45bf-8d39-dd1b6d8a40d9" + "id": "5mGrGHzdw_vCwYCRNPcPw", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpasear.webp?alt=media&token=1de7c440-8578-45bf-8d39-dd1b6d8a40d9" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "pasear", + "type": 3 }, { - "id": 88, - "texto": { - "en": "beat legs", - "es": "patalear" - }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpatalear.webp?alt=media&token=30c83c44-61e3-45d0-82d2-8ff832657153" + "id": "5vxTXbPl4Y0yezGu7p1f6", + "relations": [ + { + "id": "GY_flM-6uR6X3L4AwsiwU", + "value": 79 + }, + { + "id": "rxdfuk6egO7VmZEB3JrUN", + "value": 3 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_haciendo.webp?alt=media&token=d3b4e1aa-97d0-41a3-aa83-aa8004ce75f2" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "hacer", + "type": 3 }, { - "id": 90, - "texto": { - "en": "paint", - "es": "pintar" + "id": "6KicPX6y_u2i6tPBZAtvA", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/34826/34826_500.png" }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpintar.webp?alt=media&token=02634a91-0bef-46f5-b8a7-561d1fca2b33" - }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "lavar", + "type": 3 }, { - "id": 92, - "texto": { - "en": "put", - "es": "poner" - }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fponer.webp?alt=media&token=f21e413f-f1d6-4d6c-bf94-b825fa5badb2" + "id": "6jLkKc9OL5btNOmjJem6S", + "relations": [ + { + "id": "rxdfuk6egO7VmZEB3JrUN", + "value": 3 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fponer.webp?alt=media&token=f21e413f-f1d6-4d6c-bf94-b825fa5badb2" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "poner", + "type": 3 }, { - "id": 93, - "texto": { - "en": "reject", - "es": "rechazar" + "id": "6lYN4qSZx3_tKDClp4Iyr", + "relations": [ + { + "id": "wkrNPLGWTqMIy4PJRW9QR", + "value": 2 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fentre.webp?alt=media&token=68f3c53e-8d7b-41fa-9d72-44edd964f6b2" }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Frechazar.webp?alt=media&token=3b1e10e1-25a3-445c-a302-63a3ea2ad511" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ], + "GENERO": [ + "MUJER" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "entre", + "type": 6 }, { - "id": 94, - "texto": { - "en": "laugh", - "es": "reir" + "id": "6nhNeVjDfDi-GmreaqfVo", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fnublado.webp?alt=media&token=35741aaa-92c9-44b7-baae-3fa886348ac9" }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Freir.webp?alt=media&token=d6341292-b530-4e2e-9423-c187996470f0" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "nublado", + "type": 4 }, { - "id": 95, - "texto": { - "en": "repeat", - "es": "repetir" + "id": "6rcOXG6yxpzHLzMJ9IayI", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcerrar.webp?alt=media&token=ee470cae-e15f-4522-a0ae-2434efc3f2fc" }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Frepetir.webp?alt=media&token=14874d12-fd73-4cfc-a27f-09c987a04b33" + "tags": { + "EDAD": [ + "ADULTO" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "cerrar", + "type": 3 }, { - "id": 97, - "texto": { - "en": "take out", - "es": "sacar" + "id": "6t2sPdapSNJrOziDozTWW", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fvaca.webp?alt=media&token=169415f8-b6e6-473b-9421-8c036350a451" }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fsacar.webp?alt=media&token=c7e6ed51-5ff9-42a1-b3b7-dabf51ddf266" + "tags": { + "EDAD": [ + "NINO" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "vaca", + "type": 2 }, { - "id": 98, - "texto": { - "en": "go out", - "es": "salir" + "id": "71l2at-8480bvijxn3uBl", + "relations": [ + { + "id": "rxdfuk6egO7VmZEB3JrUN", + "value": 4 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fdurante.webp?alt=media&token=c10ae87d-faff-4424-8878-5b19f3685c7c" }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fsalir.webp?alt=media&token=8b81f386-fd97-42bb-8ef8-87814b1148c9" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "durante", + "type": 6 }, { - "id": 100, - "texto": { - "en": "dry", - "es": "secar" + "id": "75gujwNXJdAiNmK6Ffhia", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_bebida.webp?alt=media&token=6a37edef-b1a1-4727-a5a3-d6b0d8c0a305" }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fsecar.webp?alt=media&token=a1539795-90ff-4aaa-b26c-a58016b7683c" + "tags": { + "EDAD": [ + "JOVEN", + "NINO" + ], + "HORA": [ + "MEDIODIA", + "NOCHE" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "jugo", + "type": 2 }, { - "id": 101, - "texto": { - "en": "seat", - "es": "sentarme" - }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fsentar.webp?alt=media&token=ea6097b0-55a0-45f9-b85e-df3ea858158d" + "id": "79xBF6cKgKeD4GeBPe_Ds", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fbolsa.webp?alt=media&token=e9b61c73-7dfc-4425-8005-56267ca563a4" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "bolsa", + "type": 2 }, { - "id": 103, - "texto": { - "en": "blow your nose", - "es": "sonarme la nariz" - }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fsonarse_los_mocos.webp?alt=media&token=53e05413-9fd2-451b-86f6-4d953cf4abed" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 104, - "texto": { - "en": "go up", - "es": "subir" - }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fsubir.webp?alt=media&token=0d1f10bf-924a-4ac0-bbb5-e2269d8fa39c" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 107, - "texto": { - "en": "travel", - "es": "viajar" - }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fviajar.webp?alt=media&token=ccfef1e5-8011-4c79-8b69-f2b136b1b0b9" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 108, - "texto": { - "en": "travel by car", - "es": "viajar en auto" - }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fviajar_en_auto.webp?alt=media&token=fc534378-43da-411b-a070-c9e8dc5cab52" + "id": "7EsVGfapPc_38mHCBy3C3", + "relations": [ + { + "id": "B1845IfYfPMz2FWpVFIQv", + "value": 2 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fenamorados.webp?alt=media&token=10dcfa22-c4a8-4c38-b71a-886cd0d56f3b" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "enamorado", + "type": 4 }, { - "id": 112, - "texto": { - "en": "clean", - "es": "limpiar" + "id": "7Hz61-WzV62FHsedOwz6q", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fflan.webp?alt=media&token=c4cbe053-d065-47a3-a317-a9ff710ee5a0" }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Flimpiar.webp?alt=media&token=a68c1cfd-0df4-4ab2-a733-536631bb3080" + "tags": { + "EDAD": [ + "JOVEN", + "NINO" + ], + "HORA": [ + "MEDIODIA", + "NOCHE" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "flan", + "type": 2 }, { - "id": 113, - "texto": { - "en": "heal", - "es": "curar" + "id": "7Q4Zc0cenSF5U4eKyje1f", + "relations": [ + { + "id": "rxdfuk6egO7VmZEB3JrUN", + "value": 3 + }, + { + "id": "cb0rJJEYOeEoRU5fDdQQq", + "value": 3 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fhacia.webp?alt=media&token=2ab6617b-974d-4f81-ac2b-de2dcf4e69de" }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcurar.webp?alt=media&token=f975cb51-cc90-4f59-a3c2-e8b4dff82501" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "hacia", + "type": 6 }, { - "id": 116, - "texto": { - "en": "travel", - "es": "viajar" - }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fviajar.webp?alt=media&token=ccfef1e5-8011-4c79-8b69-f2b136b1b0b9" + "id": "7Q9sNljseWjwSPW4in1ga", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/31328/31328_500.png" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "recepción", + "type": 2 }, { - "id": 117, - "texto": { - "en": "touch", - "es": "tocar" + "id": "7VL_MgnLDY6hi8sbvcGIg", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/6071/6071_500.png" }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ftocar.webp?alt=media&token=d6a78a59-63c8-423c-b0ec-59c3ece6da56" - }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "silencio", + "type": 5 }, { - "id": 118, - "texto": { - "en": "eat", - "es": "comer" - }, - "tipo": 3, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcomer.webp?alt=media&token=c2db19af-5cd9-4b28-8786-bec02bec2e95" - }, - "relacion": [ - { - "id": 474, - "frec": 3 - }, + "id": "7WxUVoVQfQOzARU2bf6HP", + "relations": [ { - "id": 504, - "frec": 5 + "id": "wkrNPLGWTqMIy4PJRW9QR", + "value": 7 }, { - "id": 494, - "frec": 1 + "id": "B1845IfYfPMz2FWpVFIQv", + "value": 7 }, { - "id": 515, - "frec": 5 + "id": "y_5OURnKxFcv4UiMKntUi", + "value": 4 }, { - "id": 478, - "frec": 4 + "id": "CZrETqLgQlvDkLHvw1t_w", + "value": 3 }, { - "id": 482, - "frec": 4 + "id": "kpghvJtujlt4vPI2N6vsg", + "value": 2 }, { - "id": 481, - "frec": 4 - }, + "id": "GY_flM-6uR6X3L4AwsiwU", + "value": 2 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_casa.webp?alt=media&token=f1d197b6-db37-44e6-b4bc-8ba31b0fa4aa" + }, + "text": "casa", + "type": 2 + }, + { + "id": "7iAXKVm22uMgr6aqZ1rr7", + "relations": [ { - "id": 521, - "frec": 4 + "id": "bDnuS19hfd9GhJ-6rjNPD", + "value": 4 }, { - "id": 480, - "frec": 2 + "id": "LiBr37yi-YBgQDx4unjyc", + "value": 1 }, { - "id": 483, - "frec": 1 + "id": "O-CLnVuXAUapOn6TbdhKx", + "value": 1 }, { - "id": 600, - "frec": 1 + "id": "CYH_6DL9q1iLLetuWeR9A", + "value": 1 }, { - "id": 400, - "frec": 2 + "id": "cJMQi3SVmqvWJ00VxI6gy", + "value": 1 } ], - "agenda": 0, - "gps": 0, - "esSugerencia": false - }, - { - "id": 119, - "texto": { - "en": "dull", - "es": "aburrido" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_aburrido.webp?alt=media&token=e307839a-58fe-4c57-8f59-9ede484d2c53" + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_abuelo.webp?alt=media&token=a699f1b0-1b85-4932-a32a-b07c570e2547" }, - "relacion": [ - { - "id": 44, - "frec": 1 - } - ], - "agenda": 0, - "gps": 0 + "text": "abuelo", + "type": 1 }, { - "id": 121, - "texto": { - "en": "scared", - "es": "asustado" + "id": "8-4M30dTtmuUJus9MtGqV", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fmoco.webp?alt=media&token=1b0893a9-a04a-483e-b3b3-421205246d55" }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fasustado.webp?alt=media&token=adba1b85-d3aa-44c6-80a2-873d8bc7806e" + "tags": { + "EDAD": [ + "JOVEN", + "NINO" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "moco", + "type": 2 }, { - "id": 122, - "texto": { - "en": "acid", - "es": "ácido" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Facido.webp?alt=media&token=472e6bbd-dc9b-4ab1-86f1-8f66dea4e558" + "id": "81UJI7xOa5l9mVceqkIP5", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ffrio.webp?alt=media&token=9b56d164-cb41-47b9-9281-de7bc09aafc4" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "tener frío", + "type": 4 }, { - "id": 123, - "texto": { - "en": "tall", - "es": "alto" + "id": "82LicIQc3K2xCTEt-iMpu", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcaracol.webp?alt=media&token=69284140-729e-4e25-918c-9d544a7f7426" }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Falto.webp?alt=media&token=f8bf46a1-c6c6-409b-98e9-ee795ee15de8" - }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "caracol", + "type": 2 }, { - "id": 124, - "texto": { - "en": "anxious", - "es": "ansioso" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fansioso.webp?alt=media&token=c9934785-ceaa-438b-9e02-cc0e49d25aef" + "id": "86gNdF6aTepa0Y9zkD1VQ", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/2683/2683_500.png" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "campo", + "type": 2 }, { - "id": 125, - "texto": { - "en": "grieved", - "es": "apenado" + "id": "8FFwIw7rJri79BITZBUzm", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/15728/15728_500.png" }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fapenado.webp?alt=media&token=1121ff0c-c2e7-4119-bc3e-a03a393f264b" - }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "hotel", + "type": 2 }, { - "id": 126, - "texto": { - "en": "fixed", - "es": "arreglado" + "id": "8KlFB3an1mzdQd6-LGCCE", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_merienda.webp?alt=media&token=93022501-e9f5-412a-aee4-1599f3d80543" }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Farreglado.webp?alt=media&token=f71281ba-0a11-4f1e-9eee-fe0fbe34d2ae" + "tags": { + "HORA": [ + "TARDE" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "merienda", + "type": 2 }, { - "id": 129, - "texto": { - "en": "absent", - "es": "ausente" + "id": "8LddDqylw-51wHhx9_Qad", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Flibro.webp?alt=media&token=ce9ae11b-a7e1-48ae-bc73-36358db5e1ec" }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fausente.webp?alt=media&token=b83de519-06a7-40ef-bc2c-3e7256275e24" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "libro", + "type": 2 }, { - "id": 130, - "texto": { - "en": "short", - "es": "bajo" + "id": "8MV4ZFthtUeoxLAIbqGTc", + "relations": [ + { + "id": "B1845IfYfPMz2FWpVFIQv", + "value": 3 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fzid_carne.webp?alt=media&token=1bc65494-6f49-4389-bb81-fae3e7591240" }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fbajo.webp?alt=media&token=6f4344d4-866a-4a2d-b33b-ef7f658e6521" + "tags": { + "HORA": [ + "MEDIODIA", + "NOCHE" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "carne", + "type": 2 }, { - "id": 131, - "texto": { - "en": "cheap", - "es": "barato" + "id": "8cOIYr-hcK54qWpuT-41e", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcuento.webp?alt=media&token=2f3fa4f7-9f55-424e-a587-8974d1728f84" }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fbarato.webp?alt=media&token=d088ad6b-3126-4ab3-af01-82ee565df5cf" + "tags": { + "EDAD": [ + "NINO" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "cuento", + "type": 2 }, { - "id": 132, - "texto": { - "en": "soft", - "es": "blando" + "id": "8fGingRAd8idw4qcxyZ-Q", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fverguenza.webp?alt=media&token=fec28338-c19b-4c65-ac5b-766011b26e46" }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fblando.webp?alt=media&token=075e9135-a115-4836-acde-c098d21cc4a4" - }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "vergüenza", + "type": 6 }, { - "id": 133, - "texto": { - "en": "good", - "es": "bien" + "id": "8iFdjRTQU7ONGnigRTlm8", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_precio.webp?alt=media&token=b31b9ab7-69e3-4476-a843-885bee00a080" }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_estoy_bien.webp?alt=media&token=11f656c5-d219-43b5-93e7-09f9697f2d65" + "tags": { + "EDAD": [ + "ADULTO" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "¿cuánto sale?", + "type": 2 }, { - "id": 134, - "texto": { - "en": "drunk", - "es": "borracho" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fborracho.webp?alt=media&token=b0478e6a-157b-4109-be3e-64f64b926815" + "id": "8vR0HYniXtrrQqqSIN_JQ", + "relations": [ + { + "id": "B1845IfYfPMz2FWpVFIQv", + "value": 3 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_familia.webp?alt=media&token=577a591a-1df9-48f3-87dd-6548498130c5" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "familia", + "type": 1 }, { - "id": 135, - "texto": { - "en": "nice", - "es": "buena" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fbuena.webp?alt=media&token=622125ee-a972-4419-8aac-3fc01c70f437" + "id": "904w9Je6oDwGXUCIcrUZX", + "relations": [ + { + "id": "cb0rJJEYOeEoRU5fDdQQq", + "value": 2 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Flengua.webp?alt=media&token=2709f72b-2c75-4b13-8c8b-cfb383e7eb1f" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "lengua", + "type": 2 }, { - "id": 136, - "texto": { - "en": "nice", - "es": "bueno" + "id": "93YmZA7VfAT7TTNTsDE1W", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fserie.webp?alt=media&token=1388c38c-f90f-429d-b241-f4cd45987736" }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fbueno.webp?alt=media&token=ce7bc25a-b814-43f3-a0e4-f89925cc3a40" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "serie", + "type": 6 }, { - "id": 137, - "texto": { - "en": "tired", - "es": "Cansado" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_cansado.webp?alt=media&token=0485b40d-800e-4ae8-8f1a-af38ab2c79b7" + "id": "93hsW10TmX3Vcq_4IvcZ0", + "relations": [ + { + "id": "kpghvJtujlt4vPI2N6vsg", + "value": 4 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_blanco.webp?alt=media&token=1f42fc7a-4032-41c3-a9ce-976ff07012ad" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "blanco", + "type": 4 }, { - "id": 138, - "texto": { - "en": "expensive", - "es": "caro" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcaro.webp?alt=media&token=bf0e37f5-b5e2-4f91-824f-e9644af0dc4f" + "id": "93tHieC_CgZqN998y5gAv", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/6976/6976_500.png" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "chuleta", + "type": 2 }, { - "id": 139, - "texto": { - "en": "hot", - "es": "caliente" + "id": "97nIv-aoc51T8kKTZV5cM", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fsaliva.webp?alt=media&token=5db48872-d5c5-40f7-95cc-7232d323b873" }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcaliente.webp?alt=media&token=1a683cf4-d621-4bf1-9fa5-419c3a699a94" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "saliva", + "type": 2 }, { - "id": 140, - "texto": { - "en": "hot", - "es": "caliente" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcaliente_cosa.webp?alt=media&token=85612726-a786-41f7-aa5e-169ec0f86b6d" + "id": "9EqfwMNtATh1fwMhyn_B1", + "relations": [ + { + "id": "0cdYDZ5HPaTmqTTN0_Ee8", + "value": 10 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fbuena.webp?alt=media&token=622125ee-a972-4419-8aac-3fc01c70f437" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "buena", + "type": 4 }, { - "id": 141, - "texto": { - "en": "warm", - "es": "caluroso" + "id": "9FiWvg197C-Riid-DVysN", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fclaros.webp?alt=media&token=c1fd7615-c8ca-496f-99aa-d869de08e27f" }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcaluroso.webp?alt=media&token=1e1aa29c-b682-42ec-abd9-610d903fa020" - }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "claro", + "type": 4 }, { - "id": 144, - "texto": { - "en": "expensive", - "es": "caro" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcaro.webp?alt=media&token=bf0e37f5-b5e2-4f91-824f-e9644af0dc4f" + "id": "9GqE148SFZqMIft4evAk2", + "relations": [ + { + "id": "RwlZ1jr2Ix3evzrW71lN0", + "value": 3 + }, + { + "id": "L6YLAEsbYcTq-ycQJTvt4", + "value": 5 + }, + { + "id": "pHBnmCFpM7oZf0O78CBIz", + "value": 1 + }, + { + "id": "FnCBoLSE19WsbUypUKvFc", + "value": 5 + }, + { + "id": "pwltOTDn2OyABTlD4-27W", + "value": 4 + }, + { + "id": "8MV4ZFthtUeoxLAIbqGTc", + "value": 4 + }, + { + "id": "jmzg4EiC7JEHwe9gNP3C3", + "value": 4 + }, + { + "id": "4J1bWl6BbbEdZsRGsgYH2", + "value": 4 + }, + { + "id": "MEqo2TROHyroK318sm84f", + "value": 2 + }, + { + "id": "upWXctTSKBtFNSXnXDK_u", + "value": 1 + }, + { + "id": "uOA82KFAVtjoYRTuYFgpr", + "value": 1 + }, + { + "id": "Gvmy--9DiUn_tkQYWeWhA", + "value": 2 + } + ], + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/6456/6456_500.png" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "comer", + "type": 3 }, { - "id": 147, - "texto": { - "en": "clear", - "es": "claro" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fclaros.webp?alt=media&token=c1fd7615-c8ca-496f-99aa-d869de08e27f" + "id": "9MzeUcz1nRqleTkmS_-g2", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/6932/6932_500.png" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "barco", + "type": 2 }, { - "id": 149, - "texto": { - "en": "comfortable", - "es": "cómodo" + "id": "9QyJdpUn0f6g7FxWs5qpO", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcortar.webp?alt=media&token=0d88cafb-a552-4dec-b675-ccc9f3c5f5ee" }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcomodo.webp?alt=media&token=8d46e93a-b3aa-46e8-8726-80b097f612b1" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ], + "GENERO": [ + "HOMBRE", + "MUJER" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "cortar", + "type": 3 }, { - "id": 153, - "texto": { - "en": "quarter", - "es": "cuarto" + "id": "9U8MzceIsqKhG86oNx9zV", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcoche.webp?alt=media&token=7d0e03da-0698-4e7a-9db1-5b812740a944" }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcuarto.webp?alt=media&token=745ef84d-1934-48bc-a279-657b1d63c7d7" + "tags": { + "EDAD": [ + "ADULTO" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "coche", + "type": 2 }, { - "id": 156, - "texto": { - "en": "unkwown", - "es": "desconocido" + "id": "9UwpyOnOBoqr4mX3Juqm2", + "relations": [ + { + "id": "bDnuS19hfd9GhJ-6rjNPD", + "value": 1 + }, + { + "id": "CYH_6DL9q1iLLetuWeR9A", + "value": 1 + }, + { + "id": "O-CLnVuXAUapOn6TbdhKx", + "value": 1 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_buenas_tardes.webp?alt=media&token=b42a7da3-eb59-4685-8d2d-5402cb3bbddb" }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fdesconocida.webp?alt=media&token=e8545797-ce84-463d-8c9c-97b39c5d9a03" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ], + "HORA": [ + "TARDE" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "buenas tardes", + "type": 5 }, { - "id": 158, - "texto": { - "en": "tousled", - "es": "despeinada" + "id": "9ZnzbKMDwGEwC3hXOhXFe", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpastillas.webp?alt=media&token=074e4198-f3ba-4790-b525-aaaeade3366b" }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fdespeinada.webp?alt=media&token=dd507db6-7f92-40cb-982d-47e4fa9381c3" + "tags": { + "EDAD": [ + "ADULTO" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "pastillas", + "type": 2 }, { - "id": 159, - "texto": { - "en": "tousled", - "es": "despeinado" + "id": "9dvSIpeXa2_12Jip6noJP", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_futbolista.webp?alt=media&token=f08a6396-a149-400e-8f8b-8fb62c6205d8" }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fdespeinado.webp?alt=media&token=8c85ff0d-8102-40e3-a09d-9fc4a0ebf2f1" + "tags": { + "GENERO": [ + "HOMBRE" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "deportista", + "type": 1 }, { - "id": 161, - "texto": { - "en": "funny", - "es": "divertido" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fdivertido.webp?alt=media&token=2efe9347-c828-4946-bd51-d84815185caa" + "id": "9kgRI3KlOIVSuylKffW9g", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_colores.webp?alt=media&token=04309e00-d682-43f3-9605-bde0b5b4ab9a" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "colores", + "type": 2 }, { - "id": 162, - "texto": { - "en": "hard", - "es": "duro" + "id": "9lS0mNuKIS0olyDwoIJBR", + "relations": [ + { + "id": "GY_flM-6uR6X3L4AwsiwU", + "value": 12 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_medico.webp?alt=media&token=a89f8154-0460-4e0b-b350-d447325021d3" }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fduro.webp?alt=media&token=f20a39e0-6a1e-4ac5-9735-cea0cc23bd2c" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "médico", + "type": 1 }, { - "id": 164, - "texto": { - "en": "in love", - "es": "enamorado" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fenamorado.webp?alt=media&token=4c7e4801-3d0d-4a28-8faf-747e2087b6af" + "id": "9mLx-YMK81AflitELQFqk", + "relations": [ + { + "id": "B1845IfYfPMz2FWpVFIQv", + "value": 3 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_papel.webp?alt=media&token=08b182e0-e3c7-451c-bc15-1c97aaeede75" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "papel", + "type": 2 }, { - "id": 165, - "texto": { - "en": "full", - "es": "entero" + "id": "9s5zV3_oGyDx_NEvsKCxX", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fviolin.webp?alt=media&token=6db738b3-f616-412c-9c83-1fba5996c080" }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fentero.webp?alt=media&token=0007ed58-3331-4cac-accf-7a00491abac0" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "violín", + "type": 2 }, { - "id": 167, - "texto": { - "en": "angry", - "es": "enojado" + "id": "9wE9Py6ztyqDrtaypsltA", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fnaranja.webp?alt=media&token=17f79963-266e-4032-b9fb-ddbba417e802" }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_enojado.webp?alt=media&token=0cf1e573-341e-4f1c-a2b1-8e407b6f2ea3" + "tags": { + "HORA": [ + "MEDIODIA", + "TARDE", + "NOCHE" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "naranja", + "type": 2 }, { - "id": 171, - "texto": { - "en": "happy", - "es": "feliz" + "id": "AOp6VGyjYIV0Ym9d0basJ", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_dibujar.webp?alt=media&token=caaec230-be41-40f5-b252-45ef3027ece1" }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ffeliz.webp?alt=media&token=6e0556fc-0825-4e02-a428-758ac7a42686" + "tags": { + "EDAD": [ + "JOVEN", + "NINO" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "dibujar", + "type": 3 }, { - "id": 172, - "texto": { - "en": "ugly", - "es": "feo" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ffeo.webp?alt=media&token=323fb303-2787-4186-afc7-7281bee66317" + "id": "APXF-lEplPOloppSeIjAY", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fopenmoji_minus.webp?alt=media&token=9ef3c7ca-9918-4237-a397-80de67528ec3" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "menos", + "type": 6 }, { - "id": 177, - "texto": { - "en": "cold", - "es": "frío" + "id": "AQKGKdoX5CYycZ2YqBZVW", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fbarato.webp?alt=media&token=d088ad6b-3126-4ab3-af01-82ee565df5cf" }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ffrio_cosa.webp?alt=media&token=d1f315da-7d2b-4894-9123-83e69a3bf671" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0, - "esSugerencia": false + "text": "barato", + "type": 4 }, { - "id": 178, - "texto": { - "en": "chilly", - "es": "frío" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ffrio.webp?alt=media&token=9b56d164-cb41-47b9-9281-de7bc09aafc4" + "id": "AT_rDWsr6xRBgrvgw9Zih", + "relations": [ + { + "id": "B1845IfYfPMz2FWpVFIQv", + "value": 2 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fnueve.webp?alt=media&token=0ae70911-b2ac-47ab-8efc-c2d048819b53" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "nueve", + "type": 6 }, { - "id": 179, - "texto": { - "en": "chilly", - "es": "frío" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ffrio_bebida.webp?alt=media&token=aab2a538-aeff-41f7-bbac-97c164d2a5a6" + "id": "AWJXh6URGN0Vwm66i6IvL", + "relations": [ + { + "id": "cJMQi3SVmqvWJ00VxI6gy", + "value": 15 + }, + { + "id": "CYH_6DL9q1iLLetuWeR9A", + "value": 5 + }, + { + "id": "O-CLnVuXAUapOn6TbdhKx", + "value": 1 + }, + { + "id": "9UwpyOnOBoqr4mX3Juqm2", + "value": 6 + }, + { + "id": "JFldbhjqxK3fD6D2K4HY4", + "value": 3 + }, + { + "id": "FTngK946O8S8bYc0g7vM2", + "value": 2 + }, + { + "id": "_1lOt0C0MQhvU8QWC6_oZ", + "value": 2 + }, + { + "id": "Dm3yiKSB134LrjtW_KrO7", + "value": 8 + }, + { + "id": "bDnuS19hfd9GhJ-6rjNPD", + "value": 1 + }, + { + "id": "CZrETqLgQlvDkLHvw1t_w", + "value": 2 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_hola.webp?alt=media&token=747ec011-4e60-4f0a-9ec5-b548eea2f49c" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "hola", + "type": 5 }, { - "id": 181, - "texto": { - "en": "happy", - "es": "feliz" + "id": "AeFbJQ0M9uTObAlKEX3zr", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/8666/8666_500.png" }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_feliz.webp?alt=media&token=9ec37b34-ac24-4da9-b90d-e4f23f727358" - }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "pierna", + "type": 2 }, { - "id": 194, - "texto": { - "en": "irritated", - "es": "irritado" + "id": "Akf0xlH8UJdXn8BJzPV2A", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fradio_cd.webp?alt=media&token=be52e6f8-9f19-444c-aa13-a1a63c8bae42" }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Firritado.webp?alt=media&token=67d39162-7ffc-40cf-869d-4ce59cc9d1e8" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ], + "GENERO": [ + "HOMBRE" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "radio", + "type": 2 }, { - "id": 199, - "texto": { - "en": "lean", - "es": "límpio" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Flimpio.webp?alt=media&token=47decee5-b701-48b3-876f-58900d8270f8" + "id": "B1845IfYfPMz2FWpVFIQv", + "relations": [ + { + "id": "rxdfuk6egO7VmZEB3JrUN", + "value": 114 + }, + { + "id": "pvXSy-5M4i8kysUppvdME", + "value": 18 + }, + { + "id": "Ubaq6h7wasdP_YRombm2c", + "value": 10 + }, + { + "id": "kN85Lb_C4dLnww7sz1afK", + "value": 8 + }, + { + "id": "cI0JxwhkWU-YA7E7rmJtp", + "value": 8 + }, + { + "id": "XeVaDdUWSEkhfJvTVvUHR", + "value": 7 + }, + { + "id": "amk4WRd1sNEIp24pnFw8j", + "value": 7 + }, + { + "id": "UXJDiwb3j_zyfGa26ByJL", + "value": 7 + }, + { + "id": "w4cVxbBDZjeNyHwpBARHQ", + "value": 6 + }, + { + "id": "UnQJwWfWCe40DJYR1Er0o", + "value": 5 + }, + { + "id": "ETZNYbrG5wveDl6c9k2_k", + "value": 5 + }, + { + "id": "TIgoS-YONIwzbrImXetaD", + "value": 4 + }, + { + "id": "1YOlJCovdcnnqVihqHVmq", + "value": 4 + }, + { + "id": "sixdpB8hTOhlUr4loz3RB", + "value": 4 + }, + { + "id": "mZFwH8xY_OeVDWCdvPZBy", + "value": 4 + }, + { + "id": "LDoi3cxodn_AVKSG-Bf_1", + "value": 4 + }, + { + "id": "Vjlet5P7XuqTrc22nt_Zz", + "value": 3 + }, + { + "id": "m3qTT8tiGZQheKIWREzMT", + "value": 3 + }, + { + "id": "YIP0Xc4aJsfv0s8BpiQnn", + "value": 3 + }, + { + "id": "9GqE148SFZqMIft4evAk2", + "value": 3 + }, + { + "id": "PogTYrGfa2WNfBRuA8O4e", + "value": 3 + }, + { + "id": "hXgGhazQ_nA5uqpRD6Qwq", + "value": 3 + }, + { + "id": "2CgcUkvJUskv982FvG54A", + "value": 3 + }, + { + "id": "RwlZ1jr2Ix3evzrW71lN0", + "value": 3 + }, + { + "id": "C29KJ8BTFavhj_R9UfnSv", + "value": 3 + }, + { + "id": "paPpjw1XVC9-6xcueJsrY", + "value": 3 + }, + { + "id": "f2dl12fMZbRdQ7STpcTdk", + "value": 3 + }, + { + "id": "5kjlzqb9Rf3zzqZROaZ9p", + "value": 3 + }, + { + "id": "PBqpK7LL1HQPwowPitrss", + "value": 2 + }, + { + "id": "7WxUVoVQfQOzARU2bf6HP", + "value": 2 + }, + { + "id": "jhJ2TOfdaRAcVeHGOjwua", + "value": 2 + }, + { + "id": "px0jKQDj7r9pOYs4ZrvcT", + "value": 2 + }, + { + "id": "1B1WmC-V0PglDeRAeINcT", + "value": 2 + }, + { + "id": "JEDIYq1BDA23ac9TNhON-", + "value": 2 + }, + { + "id": "HMPabuHqgtyiCmTLzg-rM", + "value": 2 + }, + { + "id": "FTngK946O8S8bYc0g7vM2", + "value": 2 + }, + { + "id": "Dv9MSCRYbR4Q3K114wXki", + "value": 2 + }, + { + "id": "Te_jJfeU8Xwa9St2RihBq", + "value": 2 + }, + { + "id": "54taab8z9ziXt0IqXHkV9", + "value": 2 + }, + { + "id": "5vxTXbPl4Y0yezGu7p1f6", + "value": 2 + }, + { + "id": "mx6dmRLXA_lkN1QlP71vq", + "value": 2 + }, + { + "id": "cb0rJJEYOeEoRU5fDdQQq", + "value": 2 + }, + { + "id": "XYY8SV1IAMHjdGjMZxbdy", + "value": 2 + }, + { + "id": "X0-Tf-KR24qEkpGDzG2Z-", + "value": 2 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fde.webp?alt=media&token=d388d233-8798-4143-81de-74dcae1e14be" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "de", + "type": 6 }, { - "id": 200, - "texto": { - "en": "nice", - "es": "lindo" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Flindo.webp?alt=media&token=b708bf7e-50e2-4d1c-89d6-ebbb7ec92e81" + "id": "BKmATW2uBk4pxnmOaARyq", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/16169/16169_500.png" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "documentos", + "type": 2 }, { - "id": 203, - "texto": { - "en": "bad", - "es": "malo" + "id": "BNjZz9MGLJEKZ4CZoTs2M", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fajedrez.webp?alt=media&token=0a869cce-d01f-4275-b7b2-eb0b91490175" }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fmalo.webp?alt=media&token=0c04538d-6ffb-4edf-8097-7e4b69d8d87c" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "ajedrez", + "type": 2 }, { - "id": 204, - "texto": { - "en": "so so", - "es": "mas o menos" + "id": "BQhqx1PuF94jwT0ySTlbJ", + "relations": [ + { + "id": "GY_flM-6uR6X3L4AwsiwU", + "value": 2 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcomida.webp?alt=media&token=20c3c26a-3091-40c6-87b2-6e38230a0e94" }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_estoy_masomenos.webp?alt=media&token=f18a2305-333c-4b02-bcc2-8dac84c0f56c" + "tags": { + "HORA": [ + "MEDIODIA", + "NOCHE" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "comida", + "type": 2 }, { - "id": 205, - "texto": { - "en": "bad", - "es": "mal" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_estoy_mal.webp?alt=media&token=cbd50a8b-74cc-48ac-b1c3-c3accf49bc62" + "id": "BQm-YCPc0lfD1-mhecCTL", + "relations": [ + { + "id": "bDnuS19hfd9GhJ-6rjNPD", + "value": 4 + }, + { + "id": "O-CLnVuXAUapOn6TbdhKx", + "value": 22 + }, + { + "id": "CYH_6DL9q1iLLetuWeR9A", + "value": 10 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_yo.webp?alt=media&token=9860a758-6779-438b-9ca3-49dfb28607e0" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "yo", + "type": 1 }, { - "id": 207, - "texto": { - "en": "annoying", - "es": "molesto" + "id": "Bebnh8-UWwtYLnK6p3fKi", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpan_negro.webp?alt=media&token=ce94f5bd-135c-4b77-9f78-7bdff71ede10" }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fme_molesta_el_ruido.webp?alt=media&token=1614de99-ce1d-4536-b826-7e79108d0526" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ], + "HORA": [ + "MANANA", + "MEDIODIA" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "pan negro", + "type": 2 }, { - "id": 208, - "texto": { - "en": "half", - "es": "medio" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fmedia.webp?alt=media&token=810240c1-a6a0-4c66-972f-9201c730dd4c" + "id": "BjqWZnzLlxdOo4KEzZ46j", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Focho.webp?alt=media&token=e52965f6-188c-4b34-b973-b2d45b962e9d" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "ocho", + "type": 6 }, { - "id": 210, - "texto": { - "en": "equals", - "es": "mismo" + "id": "BqS7d4PMhGRqPYlZQzUbR", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/3244/3244_500.png" }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fmismo.webp?alt=media&token=afcd67dc-37f1-4ee6-8651-4776cdccb259" - }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "puerta", + "type": 2 }, { - "id": 212, - "texto": { - "en": "upset", - "es": "molesto" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fmolesto.webp?alt=media&token=f7186ab0-583a-43da-9d07-ec34822ed0ed" + "id": "Bub9ZYygLcly15D7_wYks", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/8487/8487_500.png" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "amigo", + "type": 1 }, { - "id": 213, - "texto": { - "en": "a lot", - "es": "mucho" + "id": "ByrvXHEN9Mb8D--7MQAjM", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/4945/4945_500.png" }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fmucho.webp?alt=media&token=6566212e-9051-411c-8825-a88189a218ad" - }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "peluche", + "type": 2 }, { - "id": 217, - "texto": { - "en": "nervous", - "es": "nervioso" + "id": "C12mJ1W11fODI3pv1QOnx", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fgelatina.webp?alt=media&token=90951f93-c68c-44f5-8855-bab89935ea72" }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fnervioso.webp?alt=media&token=7bd9407c-d980-42bc-bd0d-3b0b49bb0baa" + "tags": { + "EDAD": [ + "JOVEN", + "NINO" + ], + "HORA": [ + "MEDIODIA", + "NOCHE" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "gelatina", + "type": 2 }, { - "id": 218, - "texto": { - "en": "none", - "es": "ninguno" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fa.webp?alt=media&token=3e8a5652-be09-49bc-9bfa-3511eebfd9e8" + "id": "C29KJ8BTFavhj_R9UfnSv", + "relations": [ + { + "id": "rxdfuk6egO7VmZEB3JrUN", + "value": 45 + }, + { + "id": "cb0rJJEYOeEoRU5fDdQQq", + "value": 12 + }, + { + "id": "3932Zm0xgk1hKB2hhBAUa", + "value": 2 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpor.webp?alt=media&token=62c20067-7143-44cc-89e5-3cfb834f5a48" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "por", + "type": 6 }, { - "id": 219, - "texto": { - "en": "cloudy", - "es": "nublado" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fnublado.webp?alt=media&token=35741aaa-92c9-44b7-baae-3fa886348ac9" + "id": "C2bgADoxmINRnAiYxZHqd", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ftaxista.webp?alt=media&token=b4ac3631-1c95-47ed-a3f2-2dde435b3448" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "taxista", + "type": 1 }, { - "id": 233, - "texto": { - "en": "few", - "es": "poco" + "id": "CBTemIvgIN1UAtftkc3sz", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/2511/2511_500.png" }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpoco.webp?alt=media&token=1d232fd6-f131-48b3-9457-7d8310e9c88e" - }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "pegar", + "type": 3 }, { - "id": 234, - "texto": { - "en": "few", - "es": "pocos" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpocos.webp?alt=media&token=3db8f233-9a11-47b3-9894-9cde18678671" + "id": "CCWCtXdMuQBJRmaFOAlfQ", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/3134/3134_500.png" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "navidad", + "type": 6 }, { - "id": 237, - "texto": { - "en": "worried", - "es": "preocupada" + "id": "CY-IQvUehkaiGFCdKf9bf", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/2335/2335_500.png" }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpreocupada.webp?alt=media&token=c7ee4743-cca8-4478-a69e-ea2393a5a0b1" - }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "chorizo", + "type": 2 }, { - "id": 238, - "texto": { - "en": "ready", - "es": "preparado" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpreparado.webp?alt=media&token=20acd627-34f7-4115-9a7a-37245ed069ce" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 242, - "texto": { - "en": "wealthy", - "es": "rica" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Frica.webp?alt=media&token=1b58ab93-2b20-44fb-999d-ee76b1d32e66" + "id": "CYH_6DL9q1iLLetuWeR9A", + "relations": [ + { + "id": "wnfSUkF8-tQiRTVou1_pd", + "value": 3 + }, + { + "id": "0IrLGI8Ebm8rcS3ymUXqS", + "value": 4 + }, + { + "id": "R9ECa_HQRtpFrb59ebMTQ", + "value": 2 + }, + { + "id": "DXb0FpjVM9q8LVl9vvSHn", + "value": 1 + }, + { + "id": "8fGingRAd8idw4qcxyZ-Q", + "value": 2 + }, + { + "id": "iimGxVoFWlq_THThR3vmF", + "value": 2 + }, + { + "id": "RkpoG4KB8m_TJFJf2v3EG", + "value": 1 + }, + { + "id": "pvXSy-5M4i8kysUppvdME", + "value": 48 + }, + { + "id": "1-VwcvzNfvrwDWRGxRPre", + "value": 8 + }, + { + "id": "rxdfuk6egO7VmZEB3JrUN", + "value": 7 + }, + { + "id": "lXH68vGIuZdfA8xVrS8iw", + "value": 3 + }, + { + "id": "UnQJwWfWCe40DJYR1Er0o", + "value": 3 + }, + { + "id": "2CgcUkvJUskv982FvG54A", + "value": 2 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_tengo.webp?alt=media&token=860f02bc-61ee-4fb7-a120-53a15e5b59a7" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "tener", + "type": 3 }, { - "id": 244, - "texto": { - "en": "sturdy", - "es": "robusto" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Frobusto.webp?alt=media&token=a3e17c83-5cf6-468a-a5fb-6c0fb7dc62ea" + "id": "CZrETqLgQlvDkLHvw1t_w", + "relations": [ + { + "id": "rxdfuk6egO7VmZEB3JrUN", + "value": 57 + }, + { + "id": "5vxTXbPl4Y0yezGu7p1f6", + "value": 12 + }, + { + "id": "7WxUVoVQfQOzARU2bf6HP", + "value": 8 + }, + { + "id": "XeVaDdUWSEkhfJvTVvUHR", + "value": 5 + }, + { + "id": "9GqE148SFZqMIft4evAk2", + "value": 5 + }, + { + "id": "paPpjw1XVC9-6xcueJsrY", + "value": 4 + }, + { + "id": "hmhAUgqvGp7nc1w25sRSx", + "value": 3 + }, + { + "id": "KWYVDZiERE8jtRsL0faHH", + "value": 3 + }, + { + "id": "m3qTT8tiGZQheKIWREzMT", + "value": 3 + }, + { + "id": "HMPabuHqgtyiCmTLzg-rM", + "value": 3 + }, + { + "id": "XYY8SV1IAMHjdGjMZxbdy", + "value": 3 + }, + { + "id": "sSTGRl6DpYGZXp8vtTNbm", + "value": 2 + }, + { + "id": "3w62N9b7Cvb6JMjB9Wphi", + "value": 2 + }, + { + "id": "pvXSy-5M4i8kysUppvdME", + "value": 2 + }, + { + "id": "mZFwH8xY_OeVDWCdvPZBy", + "value": 2 + }, + { + "id": "xqGzZJIHBeVfSzRfm3rmg", + "value": 2 + }, + { + "id": "5kjlzqb9Rf3zzqZROaZ9p", + "value": 2 + }, + { + "id": "GxrDtsdGcLepdsQr6V9DT", + "value": 2 + }, + { + "id": "FTngK946O8S8bYc0g7vM2", + "value": 2 + }, + { + "id": "hXgGhazQ_nA5uqpRD6Qwq", + "value": 2 + }, + { + "id": "_tDZtalMxKSNpWydJ1aeW", + "value": 2 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fa.webp?alt=media&token=3e8a5652-be09-49bc-9bfa-3511eebfd9e8" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "a", + "type": 6 }, { - "id": 245, - "texto": { - "en": "chubby", - "es": "gordito" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Frollizo.webp?alt=media&token=513c2520-3ebb-4a01-9652-471b147ab87e" + "id": "C_JKGNCxOI5x_f2C4qAyZ", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/8338/8338_500.png" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "maní", + "type": 2 }, { - "id": 248, - "texto": { - "en": "salty", - "es": "salado" + "id": "CbO32RkDdf9aCucv6BnGS", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcabra.webp?alt=media&token=6e21add4-63cb-424b-8b67-913ba96b509b" }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fsalado.webp?alt=media&token=64004dbf-110a-4faf-8ab0-ea27d30dcd54" + "tags": { + "EDAD": [ + "NINO" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "cabra", + "type": 2 }, { - "id": 253, - "texto": { - "en": "thirsty", - "es": "sediento" + "id": "ChBc7LjL8dgzZ6LUCAHGh", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpor_favor.webp?alt=media&token=5de541ca-cc32-45f9-8f24-d5af9f44bca9" }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fsed.webp?alt=media&token=3c0d95f9-623a-43d6-bccd-b15697ab4d6e" - }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "por favor", + "type": 5 }, { - "id": 256, - "texto": { - "en": "sunny", - "es": "soleado" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fsoleado.webp?alt=media&token=cd13634a-16d4-4ca1-80d7-6937f0c63e50" + "id": "CkTiaqBY3jf86JRq636lt", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcual.webp?alt=media&token=30542648-4e68-4cb3-b4e4-beccc65f2a1c" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "¿cuál?", + "type": 6 }, { - "id": 263, - "texto": { - "en": "dirty", - "es": "súcio" + "id": "CsKZSNiJw5Q48b26Kskf-", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fspiderman.webp?alt=media&token=118e61bb-843e-427b-86b9-9dcb559cd496" }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fsucio.webp?alt=media&token=7e883539-03c3-4d06-b22f-26c417886cec" + "tags": { + "EDAD": [ + "JOVEN", + "NINO" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "heroe", + "type": 2 }, { - "id": 267, - "texto": { - "en": "all", - "es": "todos" + "id": "CxFmyJYmy6gMRqP9U0cBP", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/36295/36295_500.png" }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ftodos.webp?alt=media&token=694aae8b-22c8-4274-b9f1-b3bbdd15d061" - }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "estoy perdido", + "type": 5 }, { - "id": 268, - "texto": { - "en": "all", - "es": "todas" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ftodas.webp?alt=media&token=dcdb7025-41d9-4230-8871-51612bf8bfec" + "id": "CyKtU9yC0Jy7Ypb4WFp6w", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fperro.webp?alt=media&token=efaf7bd3-68cb-46e7-b239-5dd43e674cb2" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "perro", + "type": 2 }, { - "id": 272, - "texto": { - "en": "sad", - "es": "tríste" + "id": "D1gCni2jXpCvKZe4qCtQN", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpeces.webp?alt=media&token=c9e8c8d9-ac35-4b91-a3c2-0ab94c1c5a13" }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_triste.webp?alt=media&token=8f49d913-1dbb-48df-a07b-614fa3188ad8" - }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "peces", + "type": 2 }, { - "id": 274, - "texto": { - "en": "crazy", - "es": "un poco loco" + "id": "D2tSkngqbQmdKLNhn9xWV", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fglobos.webp?alt=media&token=1ad716c7-890b-477b-9a8d-c904a0c2c401" }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_loco.webp?alt=media&token=ad86fdf3-5b8c-4af1-aed0-81052e3a6c96" + "tags": { + "EDAD": [ + "JOVEN", + "NINO" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "globos", + "type": 2 }, { - "id": 280, - "texto": { - "en": "shamefaced", - "es": "vergonzante" + "id": "D7dt_hFX5DScV_ssm1nKz", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpomelo.webp?alt=media&token=4b112d85-10dd-4d9f-b9af-4e0c221fa896" }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fvergonzante.webp?alt=media&token=0d7f7e5e-3e27-468b-bcac-663410387c39" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ], + "HORA": [ + "MEDIODIA", + "TARDE" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "pomelo", + "type": 2 }, { - "id": 281, - "texto": { - "en": "old", - "es": "viejo" + "id": "D85FU-Wqr2u53tfTXAtHo", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpatalear.webp?alt=media&token=30c83c44-61e3-45d0-82d2-8ff832657153" }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fviejo_cosa.webp?alt=media&token=501e0dae-62bd-44e2-9025-f1aa3008c602" + "tags": { + "EDAD": [ + "NINO" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "patalear", + "type": 3 }, { - "id": 282, - "texto": { - "en": "elderly", - "es": "viejo" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fviejo.webp?alt=media&token=da1f540c-5a60-4370-8804-d4bd7bc8a114" + "id": "DAq2J_xXHsSCSNPp9qVsk", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fhusmear.webp?alt=media&token=e1bdad48-76a9-4de9-9246-a0d9e60c8c2d" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "oler", + "type": 3 }, { - "id": 283, - "texto": { - "en": "bee", - "es": "abeja" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fabeja.webp?alt=media&token=c6b4cea3-73ad-40e2-a7ce-2c897667eda7" + "id": "DBd09yUlbkaYLsemjFXEs", + "relations": [ + { + "id": "B1845IfYfPMz2FWpVFIQv", + "value": 2 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fzid_helado.webp?alt=media&token=18fc2aae-6651-47b7-9d86-b654606bb863" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "helado", + "type": 2 }, { - "id": 286, - "texto": { - "en": "animals", - "es": "animales" + "id": "DG1RiDjDfwWRhpAiIpPqA", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/7303/7303_500.png" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fanimales.webp?alt=media&token=a9f8b76e-61ab-4c70-aef4-ec4e6549da60" - }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "vómito", + "type": 2 }, { - "id": 288, - "texto": { - "en": "donkey", - "es": "asno" + "id": "DSgrhLHauub-gBqMGwacO", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fasustado.webp?alt=media&token=adba1b85-d3aa-44c6-80a2-873d8bc7806e" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fasno.webp?alt=media&token=78f9eab7-8cfa-402f-b6b6-457dc3bf8594" + "tags": { + "EDAD": [ + "JOVEN", + "NINO" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "asustado", + "type": 4 }, { - "id": 290, - "texto": { - "en": "whale", - "es": "ballena" + "id": "DXb0FpjVM9q8LVl9vvSHn", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_clases.webp?alt=media&token=bbf3f869-948b-4be0-93fb-44b637a651b0" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fballena.webp?alt=media&token=89bbc0a0-5fb0-4102-b5b4-16f1e3f429f6" + "tags": { + "EDAD": [ + "JOVEN", + "NINO" + ], + "HORA": [ + "MANANA", + "TARDE" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "clases", + "type": 2 }, { - "id": 293, - "texto": { - "en": "horse", - "es": "caballo" + "id": "DXpjgLKTdx9eLLohVdmWM", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fverduleria.webp?alt=media&token=be70aebe-bc45-4ab1-9dcf-a0531a26a7be" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcaballo.webp?alt=media&token=9c065f9b-ca24-4eb0-b76c-7e505e8f0b44" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ], + "HORA": [ + "MEDIODIA" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "verdulería", + "type": 2 }, { - "id": 294, - "texto": { - "en": "goat", - "es": "cabra" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcabra.webp?alt=media&token=6e21add4-63cb-424b-8b67-913ba96b509b" + "id": "D_4Weq7iyi7GMEsgP0xy6", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fte.webp?alt=media&token=a27a3bc5-9899-42e3-a69c-0ab3ed23f331" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "té", + "type": 2 }, { - "id": 296, - "texto": { - "en": "camel", - "es": "camello" + "id": "Djs1QsLNf8Q5LBIFV5zNC", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/24791/24791_500.png" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcamello.webp?alt=media&token=d06d45dc-4b22-4d06-9312-6a9b5cc8bf02" - }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "partituras", + "type": 2 }, { - "id": 297, - "texto": { - "en": "bird", - "es": "canario" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcanario.webp?alt=media&token=a5c74e04-d7d8-44a2-8ef6-3b418cb088f5" + "id": "DkeHJFtqAS005fYUrl1Xz", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpantalon.webp?alt=media&token=313784be-798d-44ee-8347-7b8b0ae797f2" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "pantalon", + "type": 2 }, { - "id": 298, - "texto": { - "en": "crab", - "es": "cangrejo" + "id": "Dm3yiKSB134LrjtW_KrO7", + "relations": [ + { + "id": "bDnuS19hfd9GhJ-6rjNPD", + "value": 1 + }, + { + "id": "O-CLnVuXAUapOn6TbdhKx", + "value": 1 + }, + { + "id": "CYH_6DL9q1iLLetuWeR9A", + "value": 1 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_buenos_dias.webp?alt=media&token=0d7fe795-3024-45fb-8ba5-bd361d2c61ee" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcangrejo.webp?alt=media&token=39083c10-717e-4ac4-80ed-0b213978884b" + "tags": { + "HORA": [ + "MANANA", + "MEDIODIA" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "buen día", + "type": 5 }, { - "id": 299, - "texto": { - "en": "snail", - "es": "caracol" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcaracol.webp?alt=media&token=69284140-729e-4e25-918c-9d544a7f7426" + "id": "DqGa4gqd2ABDi45BT43x4", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fprincesa.webp?alt=media&token=73c9d26b-a83c-4f75-9c1d-ae8661899d86" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "princesa", + "type": 1 }, { - "id": 301, - "texto": { - "en": "pig", - "es": "cerdo" + "id": "Dv9MSCRYbR4Q3K114wXki", + "relations": [ + { + "id": "B1845IfYfPMz2FWpVFIQv", + "value": 2 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Falto.webp?alt=media&token=f8bf46a1-c6c6-409b-98e9-ee795ee15de8" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcerdo.webp?alt=media&token=741f2ba1-fe2a-43b2-be72-3a7f30f861d8" + "tags": { + "GENERO": [ + "HOMBRE" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "alto", + "type": 4 }, { - "id": 310, - "texto": { - "en": "cock", - "es": "gallo" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fgallo.webp?alt=media&token=f7eeb656-0122-4522-a795-630b90749f8a" + "id": "E-vUPARie8MmfgZwv3Omr", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fgallo.webp?alt=media&token=f7eeb656-0122-4522-a795-630b90749f8a" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "gallo", + "type": 2 }, { - "id": 313, - "texto": { - "en": "cat", - "es": "gato" + "id": "EM8VyonJ7WNdvmRyE3nhZ", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/4676/4676_500.png" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fgato.webp?alt=media&token=49aa560c-4b75-4bba-84dd-7829fec81abe" - }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "lento", + "type": 4 }, { - "id": 314, - "texto": { - "en": "cricket", - "es": "grillo" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fgrillo.webp?alt=media&token=74055068-db86-47f3-bda0-972078777797" + "id": "EO4O-s7oafi6QJdxTFNkd", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/26571/26571_500.png" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "anticongestivo", + "type": 2 }, { - "id": 320, - "texto": { - "en": "giraffe", - "es": "jirafa" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fjirafa.webp?alt=media&token=5e9950fc-00dc-4d7a-90b3-cee9f55a2dc0" + "id": "ETZNYbrG5wveDl6c9k2_k", + "relations": [ + { + "id": "y_5OURnKxFcv4UiMKntUi", + "value": 2 + }, + { + "id": "B1845IfYfPMz2FWpVFIQv", + "value": 2 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcodo.webp?alt=media&token=63ba0037-61a2-43a6-8667-98a165d9c693" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "codo", + "type": 2 }, { - "id": 323, - "texto": { - "en": "lion", - "es": "león" + "id": "EUsNyf5bDdSLqvZKH1Ltx", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/37827/37827_500.png" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fleon.webp?alt=media&token=ea99f84a-e3e8-46a5-a24c-d3a81fa0a10e" - }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "no entiendo", + "type": 5 }, { - "id": 327, - "texto": { - "en": "butterfly", - "es": "mariposa" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fmariposa.webp?alt=media&token=eb75c2c3-871e-42ed-a893-0142c9eb6c05" + "id": "EVmt43vDI3NHFfbbkqokF", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/2527/2527_500.png" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "pizza", + "type": 2 }, { - "id": 331, - "texto": { - "en": "bear", - "es": "oso" + "id": "Erg6LuA8IOQ5V8RTP3pPi", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fabeja.webp?alt=media&token=c6b4cea3-73ad-40e2-a7ce-2c897667eda7" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Foso.webp?alt=media&token=47e35861-59b3-499a-9e8b-c10d52e6451e" - }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "abeja", + "type": 2 }, { - "id": 332, - "texto": { - "en": "sheep", - "es": "oveja" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Foveja.webp?alt=media&token=11981786-fded-4f20-8d7a-8b2cef80e782" + "id": "F4cGnA_QHsVKTjUE6MAu9", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/24276/24276_500.png" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "mameluco", + "type": 2 }, { - "id": 333, - "texto": { - "en": "bird", - "es": "pájaro" + "id": "F7kJ8VM31BWB4K4T4USzs", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fmaltrato_fisico.webp?alt=media&token=dbf253eb-4088-4bb6-ab66-42069cdc3ae9" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpajaro.webp?alt=media&token=be98ebb6-6c77-46e4-93aa-5f999363d793" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "maltrato físico", + "type": 6 }, { - "id": 334, - "texto": { - "en": "birdie", - "es": "pájarito" + "id": "F8roVYxKZi88UUGfOvTwl", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_maestra.webp?alt=media&token=4ee47174-ea96-46df-9f02-c35642dfaf31" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpajarito.webp?alt=media&token=70c9bceb-f954-4b83-8889-40bbdee3ad5b" + "tags": { + "EDAD": [ + "JOVEN", + "NINO" + ], + "HORA": [ + "MANANA", + "TARDE" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "maestra", + "type": 1 }, { - "id": 335, - "texto": { - "en": "pidgeon", - "es": "paloma" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpaloma.webp?alt=media&token=2f011521-d2b1-4834-a7fc-18ef1b8a6837" + "id": "F90bXbc0tz9nuzTT7SgqV", + "relations": [ + { + "id": "YIP0Xc4aJsfv0s8BpiQnn", + "value": 2 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcuatro.webp?alt=media&token=2b9cb275-8a39-45cb-bce7-6bf2f3bbeb4b" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "cuatro", + "type": 6 }, { - "id": 337, - "texto": { - "en": "duck", - "es": "pato" + "id": "FBPIabyaoCK-Y0BziQdji", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fzid_dolor_de_espalda.webp?alt=media&token=b8ed9cd5-04d7-4d51-87a4-2ff15b5ca7bb" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpato.webp?alt=media&token=d828454d-109a-4321-8348-a029423823a0" + "tags": { + "EDAD": [ + "JOVEN", + "NINO" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "dolor de panza", + "type": 2 }, { - "id": 340, - "texto": { - "en": "fish", - "es": "peces" + "id": "FBTheEQmZZfJRiYjd_Np_", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/35711/35711_500.png" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpeces.webp?alt=media&token=c9e8c8d9-ac35-4b91-a3c2-0ab94c1c5a13" - }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "interpretar", + "type": 3 }, { - "id": 342, - "texto": { - "en": "dog", - "es": "perro" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fperro.webp?alt=media&token=efaf7bd3-68cb-46e7-b239-5dd43e674cb2" + "id": "FO77qpzyz28knodNtILCA", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/10184/10184_500.png" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "tirar la cadena", + "type": 3 }, { - "id": 348, - "texto": { - "en": "frog", - "es": "rana" + "id": "FTngK946O8S8bYc0g7vM2", + "relations": [ + { + "id": "O-CLnVuXAUapOn6TbdhKx", + "value": 18 + }, + { + "id": "bDnuS19hfd9GhJ-6rjNPD", + "value": 4 + }, + { + "id": "CYH_6DL9q1iLLetuWeR9A", + "value": 6 + }, + { + "id": "cJMQi3SVmqvWJ00VxI6gy", + "value": 6 + }, + { + "id": "LiBr37yi-YBgQDx4unjyc", + "value": 10 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_mama.webp?alt=media&token=190be130-d7dd-4e30-80cb-d010a247ff67" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Frana.webp?alt=media&token=8f852e14-de74-4088-b4ee-313b37373e48" + "tags": { + "EDAD": [ + "JOVEN", + "NINO" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "mamá", + "type": 1 }, { - "id": 354, - "texto": { - "en": "tiger", - "es": "tigre" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ftigre.webp?alt=media&token=8eb90cc1-2275-4d7d-b109-e051c165fd0f" + "id": "FaVvbVzZivuxTwxJTPubK", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/34511/34511_500.png" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "hermanos", + "type": 1 }, { - "id": 356, - "texto": { - "en": "tortoise", - "es": "tortuga" + "id": "FfNU04I4mZ54gWcBXqo2c", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/2994/2994_500.png" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ftortuga.webp?alt=media&token=992b3a94-8af0-42d7-998a-ab7cf9f9649a" - }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "panceta", + "type": 2 }, { - "id": 357, - "texto": { - "en": "cow", - "es": "vaca" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fvaca.webp?alt=media&token=169415f8-b6e6-473b-9421-8c036350a451" + "id": "FgTird367surh-vxXyAK6", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/38374/38374_500.png" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "ticket", + "type": 2 }, { - "id": 359, - "texto": { - "en": "snake", - "es": "víbora" + "id": "FkC5DtSV81OvFMU99qZGg", + "relations": [ + { + "id": "wkrNPLGWTqMIy4PJRW9QR", + "value": 6 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_pelotas.webp?alt=media&token=2b17cead-37bc-40c1-9933-8320836adeb0" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fvibora.webp?alt=media&token=54e9f484-0f32-4510-8615-396956d6bb0c" + "tags": { + "EDAD": [ + "JOVEN", + "NINO" + ], + "GENERO": [ + "HOMBRE" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "pelota", + "type": 2 }, { - "id": 362, - "texto": { - "en": "cock", - "es": "gallo" + "id": "FnCBoLSE19WsbUypUKvFc", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fhamburguesa.webp?alt=media&token=1f1ac265-9d7e-4aeb-afec-16b4b70185e1" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fgallo.webp?alt=media&token=f7eeb656-0122-4522-a795-630b90749f8a" + "tags": { + "HORA": [ + "MEDIODIA", + "NOCHE" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "hamburguesa", + "type": 2 }, { - "id": 363, - "texto": { - "en": "tuna", - "es": "atún" + "id": "Fogupb264IyCtbZ-Q2D6w", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fborracho.webp?alt=media&token=b0478e6a-157b-4109-be3e-64f64b926815" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fatun.webp?alt=media&token=3268b4fa-6306-468c-b56e-dc3253ebaa6e" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ], + "HORA": [ + "NOCHE" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "borracho", + "type": 4 }, { - "id": 374, - "texto": { - "en": "veal", - "es": "ternera" + "id": "Fvm2C5NBq01tm0QK9d9QM", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/9887/9887_500.png" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fternera.webp?alt=media&token=6a044f56-c3c8-456b-b59b-788a90d61d62" + "text": "hijos", + "type": 1 + }, + { + "id": "G09TvOzDSG5m3hTQD9Tej", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_borrar.webp?alt=media&token=8141651f-d10e-41c3-800e-ebcd444f0665" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "borrar", + "type": 3 }, { - "id": 375, - "texto": { - "en": "pig", - "es": "cerdo" + "id": "G2i9LSK4A19237Zp1vXqF", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Frollizo.webp?alt=media&token=513c2520-3ebb-4a01-9652-471b147ab87e" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcerdo.webp?alt=media&token=741f2ba1-fe2a-43b2-be72-3a7f30f861d8" + "tags": { + "EDAD": [ + "ADULTO", + "NINO" + ], + "GENERO": [ + "HOMBRE" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "gordito", + "type": 4 }, { - "id": 376, - "texto": { - "en": "rabbit", - "es": "conejo" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fconejo.webp?alt=media&token=b5eac151-aecb-458f-b8c4-eb911037dab7" + "id": "G6KKVMvPDnjdD9TfBd-B9", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/30518/30518_500.png" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "playo", + "type": 2 }, { - "id": 377, - "texto": { - "en": "Hello", - "es": "Hola" + "id": "GAxX7EIz1TTLtMX08RRGr", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fhamburgueseria.webp?alt=media&token=54beeb1d-8901-472f-ac33-aa906e18627a" }, - "tipo": 5, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_hola.webp?alt=media&token=747ec011-4e60-4f0a-9ec5-b548eea2f49c" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ], + "HORA": [ + "MEDIODIA", + "NOCHE" + ] }, - "relacion": [ + "text": "hamburguesería", + "type": 2 + }, + { + "id": "GJlUSznzEHCgoAOrVrkp9", + "relations": [ { - "id": 378, - "frec": 15 + "id": "B1845IfYfPMz2FWpVFIQv", + "value": 10 }, { - "id": 49, - "frec": 5 + "id": "C29KJ8BTFavhj_R9UfnSv", + "value": 9 }, { - "id": 44, - "frec": 1 - }, + "id": "emm_RirDsO30Enax5Q4gd", + "value": 5 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_feliz.webp?alt=media&token=9ec37b34-ac24-4da9-b90d-e4f23f727358" + }, + "text": "feliz", + "type": 4 + }, + { + "id": "GSEumxiyeVKRRiaY_c8HW", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/25038/25038_500.png" + }, + "text": "crol", + "type": 2 + }, + { + "id": "GY_flM-6uR6X3L4AwsiwU", + "relations": [ { - "id": 380, - "frec": 6 + "id": "cb0rJJEYOeEoRU5fDdQQq", + "value": 81 }, { - "id": 632, - "frec": 3 + "id": "rxdfuk6egO7VmZEB3JrUN", + "value": 35 }, { - "id": 628, - "frec": 2 + "id": "3w62N9b7Cvb6JMjB9Wphi", + "value": 4 }, { - "id": 381, - "frec": 2 + "id": "pvXSy-5M4i8kysUppvdME", + "value": 4 }, { - "id": 379, - "frec": 8 + "id": "9GqE148SFZqMIft4evAk2", + "value": 2 }, { - "id": 22, - "frec": 1 - } - ], - "agenda": 0, - "gps": 0, - "esSugerencia": false - }, - { - "id": 378, - "texto": { - "en": "How are you?", - "es": "¿Cómo estás?" - }, - "tipo": 5, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_como_estas.webp?alt=media&token=5580c46b-0516-413e-9c94-87a6c4d47410" - }, - "relacion": [ - { - "id": 22, - "frec": 2 + "id": "m3qTT8tiGZQheKIWREzMT", + "value": 2 }, { - "id": 49, - "frec": 1 + "id": "sSTGRl6DpYGZXp8vtTNbm", + "value": 2 }, { - "id": 44, - "frec": 1 + "id": "Gj7THa6XFHDfYL5H19lwj", + "value": 2 }, { - "id": 401, - "frec": 1 - } - ], - "agenda": 0, - "gps": 0, - "esSugerencia": false - }, - { - "id": 379, - "texto": { - "en": "Good day", - "es": "Buen día" - }, - "tipo": 5, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_buenos_dias.webp?alt=media&token=0d7fe795-3024-45fb-8ba5-bd361d2c61ee" - }, - "relacion": [ - { - "id": 22, - "frec": 1 + "id": "hXgGhazQ_nA5uqpRD6Qwq", + "value": 2 }, { - "id": 44, - "frec": 1 + "id": "bVN3R44VuZDw3IdQMolca", + "value": 2 }, { - "id": 49, - "frec": 1 + "id": "paPpjw1XVC9-6xcueJsrY", + "value": 2 } ], - "agenda": 0, - "horario": [ - "MANANA" - ], - "gps": 0, - "esSugerencia": false, - "hora": [ - "MANANA" - ] + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpara.webp?alt=media&token=b1a11e96-a245-477a-996e-4890d4c3f9ba" + }, + "text": "para", + "type": 6 }, { - "id": 380, - "texto": { - "en": "Good afternoon", - "es": "Buenas tardes" - }, - "tipo": 5, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_buenas_tardes.webp?alt=media&token=b42a7da3-eb59-4685-8d2d-5402cb3bbddb" - }, - "relacion": [ - { - "id": 22, - "frec": 1 - }, - { - "id": 49, - "frec": 1 - }, + "id": "G_CRpzxWO5XdEMh01O1eJ", + "relations": [ { - "id": 44, - "frec": 1 + "id": "bDnuS19hfd9GhJ-6rjNPD", + "value": 3 } ], - "agenda": 0, - "horario": [ - "MEDIODIA", - "TARDE" - ], - "gps": 0, - "esSugerencia": false, - "hora": [ - "TARDE" - ] + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Faunque.webp?alt=media&token=3391538b-22f9-4361-b227-245c79d6c2e3" + }, + "text": "aunque", + "type": 6 }, { - "id": 381, - "texto": { - "en": "Good night", - "es": "Buenas noches" - }, - "tipo": 5, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_buenas_noches.webp?alt=media&token=ed63a9b2-8617-48d0-ad6b-4c699eb2bce6" - }, - "relacion": [ + "id": "Gj7THa6XFHDfYL5H19lwj", + "relations": [ { - "id": 22, - "frec": 1 + "id": "C29KJ8BTFavhj_R9UfnSv", + "value": 10 }, { - "id": 49, - "frec": 1 + "id": "CZrETqLgQlvDkLHvw1t_w", + "value": 6 }, { - "id": 44, - "frec": 1 + "id": "wkrNPLGWTqMIy4PJRW9QR", + "value": 2 } ], - "agenda": 0, - "horario": [ - "NOCHE" - ], - "gps": 0 - }, - { - "id": 382, - "texto": { - "en": "bye", - "es": "Adiós" + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fmaniana.webp?alt=media&token=ed816c6e-a76b-457d-898d-684ae82d70f1" }, - "tipo": 5, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_adios.webp?alt=media&token=94e8b976-f724-417e-b921-1800c14f8e5a" + "tags": { + "HORA": [ + "MANANA" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0, - "esSugerencia": false + "text": "mañana", + "type": 6 }, { - "id": 383, - "texto": { - "en": "Please", - "es": "Por favor" + "id": "Gm_qAGnL4OawmlYmTs7K5", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/25716/25716_500.png" }, - "tipo": 5, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpor_favor.webp?alt=media&token=5de541ca-cc32-45f9-8f24-d5af9f44bca9" - }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "no veo", + "type": 5 }, { - "id": 384, - "texto": { - "en": "Thank you", - "es": "Gracias" - }, - "tipo": 5, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_gracias.webp?alt=media&token=520ea249-7aa3-407e-99b7-259e1e44ec41" + "id": "GoJuWnn72TCXONXKtYHMm", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/2603/2603_500.png" }, - "relacion": [], - "agenda": 0, - "gps": 0, - "esSugerencia": false + "text": "tren", + "type": 2 }, { - "id": 385, - "texto": { - "en": "Help", - "es": ". ¿me ayudas?" + "id": "Gvmy--9DiUn_tkQYWeWhA", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcanelones.webp?alt=media&token=86ac56b1-ac2d-44f1-a80d-b0cf65b35968" }, - "tipo": 5, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_ayuda.webp?alt=media&token=52542e12-7482-4409-b5e1-ce4fb61af996" + "tags": { + "HORA": [ + "MEDIODIA", + "NOCHE" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "canelones", + "type": 2 }, { - "id": 386, - "texto": { - "en": "Luck", - "es": "suerte" + "id": "GxrDtsdGcLepdsQr6V9DT", + "relations": [ + { + "id": "kpghvJtujlt4vPI2N6vsg", + "value": 3 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_verde.webp?alt=media&token=b0bb5586-ca8e-4ff9-89a1-25be6ffb1fe3" }, - "tipo": 5, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_suerte.webp?alt=media&token=d5dd1d50-6740-46f2-9b51-0f1b0cc09ee5" + "text": "verde", + "type": 4 + }, + { + "id": "H2zMVtjvqi7aUtCypiVKr", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fsentar.webp?alt=media&token=ea6097b0-55a0-45f9-b85e-df3ea858158d" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "sentar", + "type": 3 }, { - "id": 387, - "texto": { - "en": "Good bye", - "es": "Chau" + "id": "H8Bsrr2NK9Q3WGbEp8PMe", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fplateado.webp?alt=media&token=b0286d9e-a044-4045-9ece-113d2e3547a5" }, - "tipo": 5, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_adios.webp?alt=media&token=94e8b976-f724-417e-b921-1800c14f8e5a" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "plateado", + "type": 4 }, { - "id": 388, - "texto": { - "en": "Yes", - "es": "Si" + "id": "H9SWPnWbR8qcZA-iu5Mz0", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fzid_dolor_de_oido.webp?alt=media&token=53457290-15a6-4afb-9a67-6a251f8d17ea" }, - "tipo": 5, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_si.webp?alt=media&token=c55c8d1d-d5ff-4e1a-9283-e0ed5c1e587d" + "tags": { + "EDAD": [ + "ADULTO", + "NINO" + ] }, - "relacion": [ - { - "id": 49, - "frec": 5 - }, - { - "id": 44, - "frec": 1 - }, - { - "id": 22, - "frec": 1 - } - ], - "agenda": 0, - "gps": 0, - "esSugerencia": false + "text": "dolor de Oido", + "type": 2 }, { - "id": 389, - "texto": { - "en": "No", - "es": "No" + "id": "HBZNu6m3FELU9eg3OeLdx", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/8344/8344_500.png" }, - "tipo": 5, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_no.webp?alt=media&token=a8446260-23d3-4a04-83da-3119d521bb70" + "text": "cortina", + "type": 2 + }, + { + "id": "HKfLJS8aCBtKuKJeSBQUW", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/38768/38768_500.png" }, - "relacion": [ - { - "id": 49, - "frec": 13 - }, + "text": "golpe", + "type": 2 + }, + { + "id": "HMPabuHqgtyiCmTLzg-rM", + "relations": [ { - "id": 22, - "frec": 6 + "id": "wkrNPLGWTqMIy4PJRW9QR", + "value": 7 }, { - "id": 44, - "frec": 1 + "id": "CZrETqLgQlvDkLHvw1t_w", + "value": 2 } ], - "agenda": 0, - "gps": 0, - "esSugerencia": false - }, - { - "id": 390, - "texto": { - "en": "I would love to", - "es": "Me encantaría" + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fentrar.webp?alt=media&token=f968b6e8-3694-4813-9b97-644e0e630826" }, - "tipo": 5, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_genial.webp?alt=media&token=b9203a83-25ce-4da4-bc52-5c8ee7ed9f2b" - }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "entrar", + "type": 3 }, { - "id": 391, - "texto": { - "en": "chard", - "es": "acelga" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Facelga.webp?alt=media&token=efcd0769-fa2f-4730-9b33-a4fc5c62c533" + "id": "HQiQh4PPBvO1n-d7JGVj8", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fnadie.webp?alt=media&token=af36278a-a443-4d56-9d03-78a072f0aa56" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "nadie", + "type": 6 }, { - "id": 393, - "texto": { - "en": "almond", - "es": "almendras" + "id": "HTBNWax6FCSGXuboGsVUW", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fsalado.webp?alt=media&token=64004dbf-110a-4faf-8ab0-ea27d30dcd54" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Falmendras.webp?alt=media&token=8a49e474-bfec-4ee7-8bae-d4f46ec22400" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ], + "HORA": [ + "MEDIODIA", + "NOCHE" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "salado", + "type": 4 }, { - "id": 394, - "texto": { - "en": "pineapple", - "es": "ananá" + "id": "HnuZA0UTlnuIfFAN7saxl", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fconejo.webp?alt=media&token=b5eac151-aecb-458f-b8c4-eb911037dab7" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fanana.webp?alt=media&token=c9c88c38-b210-495f-88d5-1e840bd036f6" - }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "conejo", + "type": 2 }, { - "id": 396, - "texto": { - "en": "sugar", - "es": "azúcar" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fazucar.webp?alt=media&token=788bb77b-e6e0-4cd4-84c3-eddfeffa3e3c" + "id": "Hvb4JdDHX_vNMck_US2UN", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/35625/35625_500.png" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "ensayar", + "type": 3 }, { - "id": 398, - "texto": { - "en": "sandwich", - "es": "bocadillo" + "id": "I5AJgba5GTdEjdpFB-LBf", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fleche_con_cacao.webp?alt=media&token=83b77847-9dd6-416c-9100-8fee10be0174" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fbocadillo.webp?alt=media&token=48edafdd-3303-40a7-94fa-6800e3c94e0c" + "tags": { + "EDAD": [ + "JOVEN", + "NINO" + ], + "HORA": [ + "MANANA", + "TARDE" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "chocolatada", + "type": 2 }, { - "id": 399, - "texto": { - "en": "pumpkin", - "es": "calabaza" + "id": "IAdQsjTsbBUAMjlwW34cw", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_genial.webp?alt=media&token=b9203a83-25ce-4da4-bc52-5c8ee7ed9f2b" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcalabaza.webp?alt=media&token=c353fe3f-6b3a-48d5-9f2c-3ffdc2db9d18" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "me encantaría", + "type": 5 }, { - "id": 400, - "texto": { - "en": "caneloni", - "es": "canelones" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcanelones.webp?alt=media&token=86ac56b1-ac2d-44f1-a80d-b0cf65b35968" + "id": "IEeIvawUD2GIAr1Wypr9i", + "relations": [ + { + "id": "emm_RirDsO30Enax5Q4gd", + "value": 2 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpersonas.webp?alt=media&token=a5223e39-5426-4728-beda-8579fbc82adf" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "personas", + "type": 1 }, { - "id": 401, - "texto": { - "en": "cappchino", - "es": "capuchino" + "id": "IF3R7tLVAkd4RbL8R07K9", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/36075/36075_500.png" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcapuchino.webp?alt=media&token=f01e2fe2-206a-45f2-b689-51a8fff98f50" - }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "actor", + "type": 1 }, { - "id": 402, - "texto": { - "en": "chestnuts", - "es": "castañas" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcastanas.webp?alt=media&token=604b50af-9328-4c81-bae0-57674e510117" + "id": "IM8OUKCzHwnjAQWPFgnn6", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/30385/30385_500.png" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "lejos", + "type": 4 }, { - "id": 403, - "texto": { - "en": "onion", - "es": "cebolla" + "id": "INxOSvKbBNOXwruIpuNho", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fombligo.webp?alt=media&token=67d379bf-68c6-4261-8f3b-73d8ae2d42e4" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcebolla.webp?alt=media&token=af1f0474-59b3-4bf7-8b49-c18c61393813" - }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "ombligo", + "type": 2 }, { - "id": 404, - "texto": { - "en": "cherry", - "es": "cerezas" + "id": "IO8uTb1K7ElENgp2ujZoK", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Frobusto.webp?alt=media&token=a3e17c83-5cf6-468a-a5fb-6c0fb7dc62ea" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcerezas.webp?alt=media&token=5f66d7cb-c4c8-4c5e-b05f-7d48ac3f05e6" + "tags": { + "EDAD": [ + "ADULTO" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "robusto", + "type": 4 }, { - "id": 406, - "texto": { - "en": "chupetin", - "es": "chupetin" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fchupetin.webp?alt=media&token=b3f95f54-d2b4-4827-ab7a-a44ebc6d5f3e" + "id": "IXRWmFmtqfnHQRcBf1Idl", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpaloma.webp?alt=media&token=2f011521-d2b1-4834-a7fc-18ef1b8a6837" }, - "relacion": [], - "agenda": 0, - "gps": 0, - "edad": [ - "NINO" - ] + "text": "paloma", + "type": 2 }, { - "id": 407, - "texto": { - "en": "plum", - "es": "ciruela" + "id": "IZbfYRzu2cxxDWdbmQeqw", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/2673/2673_500.png" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fciruela.webp?alt=media&token=c0beef71-79dc-4cc5-8906-a1c27f37bed8" - }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "cabeza", + "type": 2 }, { - "id": 408, - "texto": { - "en": "apricot", - "es": "damasco" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fdamasco.webp?alt=media&token=0abf4e01-36e5-441f-8e1b-a60e6dd56809" + "id": "Ig1oypuwndODbmKh_NEXs", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcustom_swimsuit.webp?alt=media&token=637ef56f-4727-488f-9a05-4f2f0dbd6d2d" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "malla", + "type": 2 }, { - "id": 412, - "texto": { - "en": "creme caramel", - "es": "flan" + "id": "IsWUeiPnDEnzxePKclBNp", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ffeo.webp?alt=media&token=323fb303-2787-4186-afc7-7281bee66317" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fflan.webp?alt=media&token=c4cbe053-d065-47a3-a317-a9ff710ee5a0" - }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "feo", + "type": 4 }, { - "id": 413, - "texto": { - "en": "raspberry", - "es": "frambuesa" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fframbuesas.webp?alt=media&token=5b377f0a-a7cd-4904-8da7-09ba5191671c" + "id": "J3qQMp0OMr5LC9ebfArxH", + "relations": [ + { + "id": "B1845IfYfPMz2FWpVFIQv", + "value": 4 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fningunos.webp?alt=media&token=0a10497d-0497-462a-bb53-ed6f227bb7b6" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "ninguno", + "type": 6 }, { - "id": 414, - "texto": { - "en": "strawberry", - "es": "frutilla" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ffresa.webp?alt=media&token=cd851af7-e7fc-4842-ac66-7ef2d6fe4018" + "id": "J3rDL96c2zfBQzP45VRCp", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/10235/10235_500.png" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "limón", + "type": 2 }, { - "id": 415, - "texto": { - "en": "cookie", - "es": "galleta" + "id": "J4UUPR-WP0qo1y14bUVI-", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/11392/11392_500.png" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fgalletas.webp?alt=media&token=0a5b87dc-2b95-49f6-9433-0f8955beec29" - }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "veterinario", + "type": 1 }, { - "id": 417, - "texto": { - "en": "jelly", - "es": "gelatina" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fgelatina.webp?alt=media&token=90951f93-c68c-44f5-8855-bab89935ea72" + "id": "J7MmgugOu20UtMcMPj59r", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/38000/38000_500.png" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "canción", + "type": 6 }, { - "id": 420, - "texto": { - "en": "boiled egg", - "es": "huevo duro" + "id": "J7wLwBLVx4UANh_x5HdXd", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fsegun.webp?alt=media&token=3eaba42f-d343-48a6-96f6-92945a8b91bf" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fhuevo_duro.webp?alt=media&token=ad859492-0aaf-4e9e-aba7-58035b34b92e" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "según", + "type": 6 }, { - "id": 421, - "texto": { - "en": "fried eg", - "es": "huevo frito" + "id": "JB9SIxWzxWFjrbmMuksrY", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Freir.webp?alt=media&token=d6341292-b530-4e2e-9423-c187996470f0" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fhuevo_frito.webp?alt=media&token=481b1c1d-6856-4c97-b41d-90500a683e99" - }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "reir", + "type": 3 }, { - "id": 424, - "texto": { - "en": "canned tuna", - "es": "lata de atún" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fatun.webp?alt=media&token=3268b4fa-6306-468c-b56e-dc3253ebaa6e" + "id": "JBIehRNmDbK2ALcRN0u9i", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fgallo.webp?alt=media&token=f7eeb656-0122-4522-a795-630b90749f8a" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "gallo", + "type": 2 }, { - "id": 425, - "texto": { - "en": "canned sardine", - "es": "lata de sardinas" + "id": "JBKQaBezKuSDaMsnbJMTB", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fbar.webp?alt=media&token=ee953361-583a-4181-8fe7-735b7814e951" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Flata_de_sardinas.webp?alt=media&token=98ed3763-4987-464a-9139-d060e6433a4c" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "bar", + "type": 2 }, { - "id": 426, - "texto": { - "en": "milk with cacao", - "es": "leche con cacáo" + "id": "JBU2hMw9gbIy9-wGF4mjD", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_pizarron.webp?alt=media&token=9a9cc7f1-8a76-4cff-9c4a-c77cb73663b9" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fleche_con_cacao.webp?alt=media&token=83b77847-9dd6-416c-9100-8fee10be0174" + "tags": { + "EDAD": [ + "JOVEN", + "NINO" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0, - "edad": [ - "NINO" - ] + "text": "pizarrón", + "type": 2 }, { - "id": 427, - "texto": { - "en": "milk and cookies", - "es": "leche y galletas" + "id": "JDbBWMB5No0pK6HvntLt4", + "relations": [ + { + "id": "q22wRFF21EigV8YzQ_MfV", + "value": 1 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_lavamano.webp?alt=media&token=7c486791-926b-4813-8697-d96615f9a1c6" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fleche_y_galletas.webp?alt=media&token=8bae8aa0-60be-4d0e-aa71-1b336ad89a26" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "lavarme las manos", + "type": 3 }, { - "id": 428, - "texto": { - "en": "lettuce", - "es": "lechuga" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Flechuga.webp?alt=media&token=5c996973-d151-4065-b7ca-cdfcc56e4d4f" + "id": "JEDIYq1BDA23ac9TNhON-", + "relations": [ + { + "id": "CZrETqLgQlvDkLHvw1t_w", + "value": 6 + }, + { + "id": "emm_RirDsO30Enax5Q4gd", + "value": 2 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fayuda.webp?alt=media&token=a952e524-1a73-4105-ad7b-38925f2abe45" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "ayuda", + "type": 6 }, { - "id": 430, - "texto": { - "en": "corn", - "es": "maiz" + "id": "JFldbhjqxK3fD6D2K4HY4", + "relations": [ + { + "id": "O-CLnVuXAUapOn6TbdhKx", + "value": 16 + }, + { + "id": "bDnuS19hfd9GhJ-6rjNPD", + "value": 5 + }, + { + "id": "cJMQi3SVmqvWJ00VxI6gy", + "value": 1 + }, + { + "id": "LiBr37yi-YBgQDx4unjyc", + "value": 1 + }, + { + "id": "kpghvJtujlt4vPI2N6vsg", + "value": 2 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_papa.webp?alt=media&token=47ca6188-b568-4a92-bbcd-138781aff945" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fmaiz.webp?alt=media&token=9e88d99c-4748-4001-b468-52ba9e318356" + "tags": { + "EDAD": [ + "JOVEN", + "NINO" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "papá", + "type": 1 }, { - "id": 431, - "texto": { - "en": "butter", - "es": "manteca" + "id": "JGm4BL7HAfuxX_PGe6Jzk", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/7063/7063_500.png" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fmanteca.webp?alt=media&token=abb20bfc-1da4-4f2a-8a1b-2ba8154cb138" - }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "presente", + "type": 2 }, { - "id": 432, - "texto": { - "en": "peach", - "es": "durazno" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fmelocoton.webp?alt=media&token=b00db9ca-225c-4867-8c54-ed3754e15c04" + "id": "JQOpcZSCPGMOWZsN8w_yb", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fque_hora_es.webp?alt=media&token=44e9f414-a3da-4401-82c8-bb12fc1c7102" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "¿qué hora es?", + "type": 5 }, { - "id": 435, - "texto": { - "en": "orange", - "es": "naranja" + "id": "JSFuEHlP-CFvuqvFKMumC", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/6981/6981_500.png" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fnaranja.webp?alt=media&token=17f79963-266e-4032-b9fb-ddbba417e802" - }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "autos de juguete", + "type": 2 }, { - "id": 438, - "texto": { - "en": "white bread", - "es": "pan blanco" + "id": "JVtu9W3AumOwjUedwhUGE", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Frehabilitacion.webp?alt=media&token=da4746ed-7fe5-48b5-afde-a59d382c5024" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpan_blanco.webp?alt=media&token=ee91777b-6221-4dfa-a962-8307735c83bc" + "tags": { + "EDAD": [ + "ADULTO" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "rehabilitación", + "type": 6 }, { - "id": 439, - "texto": { - "en": "black bread", - "es": "pan negro" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpan_negro.webp?alt=media&token=ce94f5bd-135c-4b77-9f78-7bdff71ede10" + "id": "JZRBfIXBkeuobtDXbLt5t", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_adios.webp?alt=media&token=94e8b976-f724-417e-b921-1800c14f8e5a" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "adiós", + "type": 5 }, { - "id": 447, - "texto": { - "en": "grapefruit", - "es": "pomelo" + "id": "JawnUo-pseWb3FDVMtxrQ", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fzid_yogurt.webp?alt=media&token=b3831fe0-1846-4012-aa6b-35c76f25c3ad" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpomelo.webp?alt=media&token=4b112d85-10dd-4d9f-b9af-4e0c221fa896" + "tags": { + "HORA": [ + "MANANA" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "yogur", + "type": 2 }, { - "id": 449, - "texto": { - "en": "smashed potatoes", - "es": "puré" + "id": "JblWXW8TKDCuYu2yTnFBA", + "relations": [ + { + "id": "B1845IfYfPMz2FWpVFIQv", + "value": 3 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fmesa.webp?alt=media&token=3c0f72fe-94eb-411c-a430-a1dd34d529c7" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpure.webp?alt=media&token=676f1e4f-eac9-4980-bcac-b72f2feefdae" + "tags": { + "HORA": [ + "MEDIODIA", + "NOCHE" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "mesa", + "type": 2 }, { - "id": 458, - "texto": { - "en": "sandwich", - "es": "sandwich" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fsandwich.webp?alt=media&token=7fc5f532-18d1-4b03-a06f-8008fb0c8434" + "id": "Ji5OVFX-uNDewL8eX8Cin", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/38796/38796_500.png" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "pensar", + "type": 3 }, { - "id": 462, - "texto": { - "en": "pie", - "es": "tarta" + "id": "Jjq8CM8JrYHIMziuQy-WN", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_agenda.webp?alt=media&token=6c163ede-8b50-4330-8bb1-86a8709c2df3" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ftarta.webp?alt=media&token=14e0eb74-1ad9-45f0-92cf-b7983100cae6" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "agenda", + "type": 2 }, { - "id": 463, - "texto": { - "en": "tomato", - "es": "tomate" + "id": "JziaulL-lrAPGNVvwBPK9", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fverano.webp?alt=media&token=ec7103a4-ece7-47e3-988d-3ed2075f5f65" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ftomate.webp?alt=media&token=c41dbeb9-419d-45f7-a621-d4d40dc027d4" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "verano", + "type": 2 }, { - "id": 465, - "texto": { - "en": "toast", - "es": "tostada" + "id": "K382TlNZjdMLLpAhCCXLG", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Falmendras.webp?alt=media&token=8a49e474-bfec-4ee7-8bae-d4f46ec22400" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ftostada.webp?alt=media&token=a07b7217-cf65-42ae-a72f-327b8ba13f66" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ], + "HORA": [ + "MANANA" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "almendras", + "type": 2 }, { - "id": 468, - "texto": { - "en": "apple juice", - "es": "jugo de manzana" + "id": "K6hd20tWZfwwlYYi7jctt", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Frica.webp?alt=media&token=1b58ab93-2b20-44fb-999d-ee76b1d32e66" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fzumo_de_manzana.webp?alt=media&token=0512a2bb-b7b1-41e5-ac98-a124816536cb" - }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "rica", + "type": 4 }, { - "id": 469, - "texto": { - "en": "peach juice", - "es": "jugo de durazno" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fmelocoton.webp?alt=media&token=b00db9ca-225c-4867-8c54-ed3754e15c04" + "id": "K8cMIDL0ubQvWhhDtr65F", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/7147/7147_500.png" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "llorar", + "type": 3 }, { - "id": 471, - "texto": { - "en": "grape juice", - "es": "jugo de uva" + "id": "K8e2-KkvZfFOQaXnhR37x", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_cansado.webp?alt=media&token=0485b40d-800e-4ae8-8f1a-af38ab2c79b7" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fzumo_de_uva.webp?alt=media&token=15b7e370-22b3-41b8-9946-8fb91f053c48" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "cansado", + "type": 4 }, { - "id": 472, - "texto": { - "en": "soup", - "es": "Sopa" + "id": "KC18_sTEqKucPQ-iwEKYY", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_lapices_de_colores.webp?alt=media&token=1662d13d-3aaf-45d7-b3cf-921499a43030" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fsopa.webp?alt=media&token=2add9150-6bf8-4d89-a250-3c7a79fc4c7e" - }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "lapiz", + "type": 2 }, { - "id": 473, - "texto": { - "en": "banana", - "es": "banana" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fbanana.webp?alt=media&token=b01c35ae-502a-47dc-804d-b99bc870230f" + "id": "KK_i8H9qTfDVYZkQGwd2v", + "relations": [ + { + "id": "54BVjn2seJWdBNGI20-yJ", + "value": 2 + }, + { + "id": "Akf0xlH8UJdXn8BJzPV2A", + "value": 1 + }, + { + "id": "RbZetbSC5064rZccOFD1D", + "value": 2 + }, + { + "id": "Vioyf8EXJfY5t34NnN0WO", + "value": 2 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_apagar_television.webp?alt=media&token=d4967332-d189-4df5-ba33-ae4ccfc9b400" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "apagar", + "type": 3 }, { - "id": 474, - "texto": { - "en": "apple", - "es": "manzana" + "id": "KNH4sLRpVKtHXQa-0y84K", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fnervioso.webp?alt=media&token=7bd9407c-d980-42bc-bd0d-3b0b49bb0baa" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fmanzana.webp?alt=media&token=d7e920bb-54b7-4159-8401-d917395942f2" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "nervioso", + "type": 4 }, { - "id": 475, - "texto": { - "en": "pear", - "es": "pera" + "id": "KWYVDZiERE8jtRsL0faHH", + "relations": [ + { + "id": "wkrNPLGWTqMIy4PJRW9QR", + "value": 4 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fnadar.webp?alt=media&token=d861abe6-d581-4cf9-97d7-24f56578e504" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpera.webp?alt=media&token=2feac2ab-b589-4815-96d9-366a2a2a4c4e" + "tags": { + "EDAD": [ + "JOVEN", + "NINO" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "nadar", + "type": 3 }, { - "id": 476, - "texto": { - "en": "fish", - "es": "pescado" + "id": "KXHW4m6vXxQU-AEOR4pZ4", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpelota_de_futbol.webp?alt=media&token=7cad69b4-d5bc-4464-89b3-f411d7de08bc" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fzid_pescado.webp?alt=media&token=c61c5906-1c00-425f-af6f-63c50b9a005a" + "tags": { + "EDAD": [ + "JOVEN", + "NINO" + ], + "GENERO": [ + "HOMBRE" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "balón de fútbol", + "type": 2 }, { - "id": 477, - "texto": { - "en": "salad", - "es": "ensalada" + "id": "Khdk8mWpyxgLqfC-6lyT9", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fasno.webp?alt=media&token=78f9eab7-8cfa-402f-b6b6-457dc3bf8594" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fzid_ensalada.webp?alt=media&token=a7c8ec3f-130b-4988-862c-1af0d209ef75" + "tags": { + "EDAD": [ + "ADULTO" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "burro", + "type": 2 }, { - "id": 478, - "texto": { - "en": "vegetables", - "es": "verduras" + "id": "KhyTKtiL4ZT4Z1saU1eJh", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_escuchar_musica.webp?alt=media&token=258720fc-5ba7-44e4-b03e-2b3575a56784" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fzid_verduras.webp?alt=media&token=e74f9d18-10ee-47f4-947c-1ab02b13f5df" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0, - "esSugerencia": false + "text": "escuchar música", + "type": 3 }, { - "id": 480, - "texto": { - "en": "pasta", - "es": "pasta" + "id": "Kn9vE07FK1LrzoD_YxrJD", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fmetro.webp?alt=media&token=32eebc33-69af-416c-9596-ba7f0e33655a" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fzid_pasta.webp?alt=media&token=f118a1c6-859f-47a5-8ab2-d4ca29106455" + "tags": { + "EDAD": [ + "ADULTO" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "subte", + "type": 2 }, { - "id": 481, - "texto": { - "en": "rice", - "es": "arroz" + "id": "KpLFOrpuhFKaIbBbFwVVu", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fmariposa.webp?alt=media&token=eb75c2c3-871e-42ed-a893-0142c9eb6c05" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fzid_arroz.webp?alt=media&token=fd394581-3a2b-4875-bd2c-f907496ebd9b" + "tags": { + "EDAD": [ + "NINO" + ], + "GENERO": [ + "MUJER" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "mariposa", + "type": 2 }, { - "id": 482, - "texto": { - "en": "beef", - "es": "carne" + "id": "KrOPANVpdkBWdEZoUwxKf", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcustom_grave.webp?alt=media&token=e356a3db-1ca0-45da-828f-d74c4d176b5d" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fzid_carne.webp?alt=media&token=1bc65494-6f49-4389-bb81-fae3e7591240" + "text": "grave", + "type": 4 + }, + { + "id": "KvY6Taigm4Va_cVjXAfGR", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/26002/26002_500.png" }, - "relacion": [], - "agenda": 0, - "gps": 0, - "esSugerencia": false + "text": "corto", + "type": 4 }, { - "id": 483, - "texto": { - "en": "fruit", - "es": "fruta" + "id": "L0hfYADgzghRVsZLZHRxE", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/11186/11186_500.png" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fzid_fruta.webp?alt=media&token=11397b4e-44e3-4d03-a4ea-1409c209b4e6" + "text": "bailarín", + "type": 1 + }, + { + "id": "L19r487_d3RqWXiNuh3gE", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcolor_pregunta.webp?alt=media&token=323d5f57-fc0b-4178-810a-dceef199c4c1" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "¿qué color es?", + "type": 5 }, { - "id": 484, - "texto": { - "en": "yoghurt", - "es": "yogur" + "id": "L6YLAEsbYcTq-ycQJTvt4", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fzid_pollo.webp?alt=media&token=2e79ffa9-57e4-4456-85be-77789e3876fd" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fzid_yogurt.webp?alt=media&token=b3831fe0-1846-4012-aa6b-35c76f25c3ad" + "tags": { + "HORA": [ + "MEDIODIA", + "NOCHE" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "pollo", + "type": 2 }, { - "id": 485, - "texto": { - "en": "cake", - "es": "torta" + "id": "LAuEISciEf1Wc1j4fERz8", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/32536/32536_500.png" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fzid_tarta.webp?alt=media&token=648ebcaa-13fd-48a2-8649-844260914a2d" + "text": "año nuevo", + "type": 6 + }, + { + "id": "LDoi3cxodn_AVKSG-Bf_1", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fojos.webp?alt=media&token=0cd2a2d8-83aa-45b0-9e6c-2ad9105c2c80" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "ojos", + "type": 2 }, { - "id": 486, - "texto": { - "en": "ice cream", - "es": "helado" + "id": "LEVKlDlJ0wHo5QEjCNAGa", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_pegamento.webp?alt=media&token=4d4468d0-6cb2-4054-bdd7-40c4b5db74b3" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fzid_helado.webp?alt=media&token=18fc2aae-6651-47b7-9d86-b654606bb863" + "text": "pegamento", + "type": 2 + }, + { + "id": "LEg8z-Q-ONLAAXd-aH_Hb", + "relations": [ + { + "id": "emm_RirDsO30Enax5Q4gd", + "value": 1 + }, + { + "id": "B1845IfYfPMz2FWpVFIQv", + "value": 3 + }, + { + "id": "cb0rJJEYOeEoRU5fDdQQq", + "value": 2 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fbajo_prep.webp?alt=media&token=86a87969-ff5a-4c9e-9642-9fc7b8592ef1" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "bajo", + "type": 6 }, { - "id": 487, - "texto": { - "en": "oil", - "es": "aceite" + "id": "LNBTW0qQtHYQEHatkWGtc", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fmercado.webp?alt=media&token=bd72176b-1f7d-453b-9f33-dbc5ad38ae7e" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Faceite.webp?alt=media&token=a2c953be-6ccc-4dce-9665-7d099e0542de" + "text": "mercado", + "type": 2 + }, + { + "id": "LRIKzfm9ZsdNe1u7CUuW_", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcuantos.webp?alt=media&token=3907d69b-e474-4ab8-a7ad-97eb99823477" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "¿cuántos?", + "type": 6 }, { - "id": 489, - "texto": { - "en": "salt", - "es": "sal" + "id": "LRfh-4RAZTj7cnnDwBmqj", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/4650/4650_500.png" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fsal.webp?alt=media&token=ea989d3f-c52a-443a-a6a0-41b9f9094936" + "text": "flotador", + "type": 2 + }, + { + "id": "LU7IoUksATEBhd8PaHS1R", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fsacar.webp?alt=media&token=c7e6ed51-5ff9-42a1-b3b7-dabf51ddf266" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "sacar", + "type": 3 }, { - "id": 490, - "texto": { - "en": "mayo", - "es": "mayonesa" + "id": "LaKT8VTw0_6rvordp5-R8", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_rosa.webp?alt=media&token=7d6813b9-27af-4c7c-839f-52b8332bbcba" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fmayonesa.webp?alt=media&token=1c7844ec-5a64-490a-a59b-e94840792d05" + "tags": { + "GENERO": [ + "MUJER" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "rosa", + "type": 4 }, { - "id": 492, - "texto": { - "en": "ketchup", - "es": "ketchup" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fketchup.webp?alt=media&token=5a6dcbbf-994c-4c27-aa9c-75a4e808465d" + "id": "LiBr37yi-YBgQDx4unjyc", + "relations": [ + { + "id": "R06chAQYswLtQK46OInW7", + "value": 1 + }, + { + "id": "dgm3NCKuz7L39PX8LYxj7", + "value": 1 + }, + { + "id": "Vjlet5P7XuqTrc22nt_Zz", + "value": 1 + }, + { + "id": "Vioyf8EXJfY5t34NnN0WO", + "value": 2 + }, + { + "id": "8cOIYr-hcK54qWpuT-41e", + "value": 2 + }, + { + "id": "jBqD3qhhcrioLlCU-xq5b", + "value": 1 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_dar.webp?alt=media&token=792b74d2-9da1-4fc2-9c21-14fdae807a67" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "dá", + "type": 3 }, { - "id": 494, - "texto": { - "en": "Candy", - "es": "Golosina" + "id": "LjTGOcyG7DkTs1lJqNr8w", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/2851/2851_500.png" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_dulces.webp?alt=media&token=3ee8a703-20b4-454c-8254-1c0c1b66873d" + "text": "cabellera", + "type": 2 + }, + { + "id": "LksmOMPPOMArbrFsscqOW", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_musica_id.webp?alt=media&token=7256f5b2-50d3-404c-b028-d3d4e81276bd" }, - "relacion": [], - "agenda": 0, - "gps": 0, - "edad": [ - "JOVEN", - "NINO" - ] + "text": "música", + "type": 2 }, { - "id": 495, - "texto": { - "en": "milk", - "es": "leche" + "id": "LmGq1AZs2a0x26r7E9GUj", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fmaestro.webp?alt=media&token=00e6a3c7-c0da-4de3-9ac0-82642de9f4e9" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fleche.webp?alt=media&token=819236fb-c7ba-4624-a964-194f9197bc1f" + "tags": { + "EDAD": [ + "JOVEN", + "NINO" + ], + "HORA": [ + "MANANA", + "TARDE" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "maestro", + "type": 1 }, { - "id": 496, - "texto": { - "en": "coffee", - "es": "café" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcafe.webp?alt=media&token=d3c77313-ac4a-4df2-8be1-a4d01697a80b" + "id": "LngEMJa_ihV8mB7afZX-h", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/7030/7030_500.png" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "ellas", + "type": 1 }, { - "id": 497, - "texto": { - "en": "juice", - "es": "jugo" + "id": "LrDai7jXlGAdZ3e8ZQezj", + "relations": [ + { + "id": "q22wRFF21EigV8YzQ_MfV", + "value": 3 + } + ], + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/37457/37457_500.png" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_bebida.webp?alt=media&token=6a37edef-b1a1-4727-a5a3-d6b0d8c0a305" + "text": "hacer pis", + "type": 3 + }, + { + "id": "M5q2CXmK0_WVaVUB_HJB3", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcaliente_cosa.webp?alt=media&token=85612726-a786-41f7-aa5e-169ec0f86b6d" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "caliente", + "type": 4 }, { - "id": 498, - "texto": { - "en": "chocolate", - "es": "chocolate" + "id": "MEqo2TROHyroK318sm84f", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fzid_pasta.webp?alt=media&token=f118a1c6-859f-47a5-8ab2-d4ca29106455" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fchocolate.webp?alt=media&token=ad78a202-7ab5-43bb-8069-fa86ec267938" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "pasta", + "type": 2 }, { - "id": 499, - "texto": { - "en": "te", - "es": "té" + "id": "MKR-ukiUlJy4uuqO30UU6", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fmaltrato_verbal.webp?alt=media&token=7fe36de4-c1f4-4ac9-ad65-9a24c137cfce" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fte.webp?alt=media&token=a27a3bc5-9899-42e3-a69c-0ab3ed23f331" + "tags": { + "EDAD": [ + "ADULTO" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "maltrato verbal", + "type": 6 }, { - "id": 500, - "texto": { - "en": "water", - "es": "agua" + "id": "MMzjhHID8HMqyPjii5o-h", + "relations": [ + { + "id": "y_5OURnKxFcv4UiMKntUi", + "value": 2 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcocina.webp?alt=media&token=0f13280e-6377-482b-80f8-88b87659718c" + }, + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ], + "GENERO": [ + "MUJER" + ], + "HORA": [ + "MEDIODIA", + "NOCHE" + ] + }, + "text": "cocina", + "type": 2 + }, + { + "id": "MNCcHiImRS8tmvhBhzCKj", + "relations": [ + { + "id": "B1845IfYfPMz2FWpVFIQv", + "value": 2 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fzid_ensalada.webp?alt=media&token=a7c8ec3f-130b-4988-862c-1af0d209ef75" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fagua.webp?alt=media&token=b7a9b14c-ecf5-4647-a364-21cab9feb013" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ], + "GENERO": [ + "MUJER" + ], + "HORA": [ + "MEDIODIA", + "NOCHE" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "ensalada", + "type": 2 }, { - "id": 501, - "texto": { - "en": "soda", - "es": "gaseosa" + "id": "MQHnvvU48NnEptP8a9w8C", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fno_gustar.webp?alt=media&token=e2b175cd-9167-4be8-9b9a-4cffafb7403b" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcocacola.webp?alt=media&token=e2196ddc-639b-499e-ab5f-c6d02bae6110" + "tags": { + "HORA": [ + "TARDE" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "no me gusta", + "type": 6 }, { - "id": 502, - "texto": { - "en": "beer", - "es": "cerveza" + "id": "MWIzTM6zhTWL1V-brLtBx", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcomodo.webp?alt=media&token=8d46e93a-b3aa-46e8-8726-80b097f612b1" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcerveza.webp?alt=media&token=923077ac-4f46-47b6-a98e-60fb98e63522" - }, - "relacion": [], - "agenda": 0, - "gps": 0, - "edad": [ - "ADULTO" - ] + "text": "cómodo", + "type": 4 }, { - "id": 503, - "texto": { - "en": "wine", - "es": "vino" + "id": "MYqfOzKx2qMHop8GaHs0I", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fverde_claro.webp?alt=media&token=61212a6e-41a5-4ca6-ac01-c927b148ba21" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fvino.webp?alt=media&token=e1cadaf5-7b3c-444b-bb61-3d971efb0991" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0, - "edad": [ - "ADULTO" - ] + "text": "verde Claro", + "type": 4 }, { - "id": 504, - "texto": { - "en": "poultry", - "es": "pollo" + "id": "MiOe5_Djf-pE9V9aDZ_1G", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fanana.webp?alt=media&token=c9c88c38-b210-495f-88d5-1e840bd036f6" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fzid_pollo.webp?alt=media&token=2e79ffa9-57e4-4456-85be-77789e3876fd" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0, - "esSugerencia": false + "text": "ananá", + "type": 2 }, { - "id": 505, - "texto": { - "en": "chicken thigh", - "es": "muslo de pollo" + "id": "MqQgYn5B0uV-DMORCBOmV", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fapenado.webp?alt=media&token=1121ff0c-c2e7-4119-bc3e-a03a393f264b" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fmuslo_de_pollo.webp?alt=media&token=86df988a-e631-426d-ab68-69afb702b85c" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "triste", + "type": 4 }, { - "id": 507, - "texto": { - "en": "egg", - "es": "huevo" + "id": "Mw6WRebMAKWwXfAvDA7vu", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcaluroso.webp?alt=media&token=1e1aa29c-b682-42ec-abd9-610d903fa020" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fzid_huevo.webp?alt=media&token=ca26cfcd-56e8-4b77-8ef0-5f66236ab6c0" + "tags": { + "HORA": [ + "MEDIODIA", + "TARDE" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "tener calor", + "type": 4 }, { - "id": 510, - "texto": { - "en": "fish", - "es": "pescado" + "id": "N2baGNTOapSaFDo1GURiW", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/37795/37795_500.png" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fzid_pescado.webp?alt=media&token=c61c5906-1c00-425f-af6f-63c50b9a005a" + "text": "no escucho", + "type": 5 + }, + { + "id": "N7n4zQIkJZOhaYESk2GgH", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcaer.webp?alt=media&token=5bdb209f-082b-442d-82bb-429359e504d1" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "caer", + "type": 3 }, { - "id": 512, - "texto": { - "en": "steak", - "es": "filete" + "id": "NFdUTit6Ff-4S7Nzf92U5", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Festrenimiento.webp?alt=media&token=c7741445-f298-403a-95a9-291596fac8f6" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ffilete.webp?alt=media&token=03537ace-c649-4720-86ef-949b7dc58542" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "estreñimiento", + "type": 2 }, { - "id": 515, - "texto": { - "en": "hamburguer", - "es": "hamburguesa" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fhamburguesa.webp?alt=media&token=1f1ac265-9d7e-4aeb-afec-16b4b70185e1" + "id": "NFgGqhEtl0HqipCGGEvwU", + "relations": [ + { + "id": "q22wRFF21EigV8YzQ_MfV", + "value": 2 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_peinar.webp?alt=media&token=f97dbc62-edb3-434f-8139-f4f40401caf4" }, - "relacion": [], - "agenda": 0, - "gps": 0, - "esSugerencia": false + "text": "peinarme", + "type": 3 }, { - "id": 516, - "texto": { - "en": "raw ham", - "es": "jamón crudo" + "id": "NKQwWPAsVHwFBWuksqfns", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/27802/27802_500.png" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fjamon.webp?alt=media&token=9f8df889-6aa9-4f38-bc9d-6ffe0a368900" + "text": "ducha", + "type": 2 + }, + { + "id": "NLi5ODIzyMAwr2HpDXACp", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fnariz.webp?alt=media&token=63d5ec69-287f-4c90-be26-0ab914885f7a" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "nariz", + "type": 2 }, { - "id": 517, - "texto": { - "en": "cooked ham", - "es": "jamón cocido" + "id": "NQayjogCYiimP_0OxIfFj", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcalzado.webp?alt=media&token=aae778c8-0b55-4c4c-9907-e943ef51f77d" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fjamon_de_york.webp?alt=media&token=5a7c91e0-8fe6-4072-b01d-6db1b67e5d6b" + "tags": { + "EDAD": [ + "ADULTO" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "zapatos", + "type": 2 }, { - "id": 521, - "texto": { - "en": "cheese", - "es": "queso" + "id": "NVe4u7BTAVfLk3xkDqLnZ", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fhorno.webp?alt=media&token=6134b9d8-da69-4b8c-932d-082424a641d1" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fqueso.webp?alt=media&token=f36923ae-193d-4e9f-bbd3-60557ac52629" + "tags": { + "EDAD": [ + "ADULTO" + ], + "GENERO": [ + "MUJER" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "horno", + "type": 2 }, { - "id": 524, - "texto": { - "en": "sausage", - "es": "salchichas" + "id": "NVjfEut567uXpTaQUNI2i", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcampera.webp?alt=media&token=a0569880-f80b-452d-a88c-d7b52d803e0c" + }, + "tags": { + "EDAD": [ + "ADULTO" + ] }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fsalchichas.webp?alt=media&token=aee011c3-8381-4e88-b47d-45677eebf67e" + "text": "campera", + "type": 2 + }, + { + "id": "N_893wsadpGg3Ip5sEThe", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_azul.webp?alt=media&token=9661fb07-6a30-4b2d-9b0d-38cc305fc6e0" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "azul", + "type": 4 }, { - "id": 525, - "texto": { - "en": "a", - "es": "a" + "id": "NaJxTPq9Ld8I4fwAltyEC", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fmaiz.webp?alt=media&token=9e88d99c-4748-4001-b468-52ba9e318356" }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fa.webp?alt=media&token=3e8a5652-be09-49bc-9bfa-3511eebfd9e8" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] + }, + "text": "maiz", + "type": 2 + }, + { + "id": "NjulpZ9x63ZqxtLMoRjkx", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/8103/8103_500.png" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "prender la luz", + "type": 3 }, { - "id": 526, - "texto": { - "en": "before", - "es": "ante" + "id": "Njz8DrErsexBu8mAI6mnr", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fzid_pescado.webp?alt=media&token=c61c5906-1c00-425f-af6f-63c50b9a005a" }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fante.webp?alt=media&token=9a02d561-8472-473c-b508-0b090b8f2669" + "text": "pescado", + "type": 2 + }, + { + "id": "NmNouLLx13jzE27jliI_v", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/2737/2737_500.png" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "diente", + "type": 2 }, { - "id": 527, - "texto": { - "en": "beneath", - "es": "bajo" + "id": "NuhUikdCxP0NgsbO0wvAU", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ffila.webp?alt=media&token=4679780c-e3c4-4da7-b6fc-4e14a05a20eb" }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fbajo_prep.webp?alt=media&token=86a87969-ff5a-4c9e-9642-9fc7b8592ef1" + "tags": { + "EDAD": [ + "ADULTO" + ] }, - "relacion": [ + "text": "cola", + "type": 2 + }, + { + "id": "O-CLnVuXAUapOn6TbdhKx", + "relations": [ + { + "id": "9GqE148SFZqMIft4evAk2", + "value": 20 + }, + { + "id": "curstMeuThu2KUph-8rkB", + "value": 43 + }, + { + "id": "LrDai7jXlGAdZ3e8ZQezj", + "value": 8 + }, + { + "id": "TZF-7m8VKZ7IL6pyv0Daf", + "value": 3 + }, + { + "id": "JDbBWMB5No0pK6HvntLt4", + "value": 3 + }, + { + "id": "NFgGqhEtl0HqipCGGEvwU", + "value": 10 + }, + { + "id": "cj6OuVw4Nob8jxP-E4rZc", + "value": 3 + }, + { + "id": "bAoK85XLNb7p0ebevYZ6O", + "value": 4 + }, + { + "id": "dLHDzm0rfgL-vXTx14HSm", + "value": 19 + }, + { + "id": "m3qTT8tiGZQheKIWREzMT", + "value": 34 + }, + { + "id": "3w62N9b7Cvb6JMjB9Wphi", + "value": 16 + }, + { + "id": "KK_i8H9qTfDVYZkQGwd2v", + "value": 11 + }, { - "id": 528, - "frec": 1 + "id": "5vxTXbPl4Y0yezGu7p1f6", + "value": 4 } ], - "agenda": 0, - "gps": 0 + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_quiero.webp?alt=media&token=0012395e-71a4-453f-aafb-d58c0ebf70b6" + }, + "text": "querer", + "type": 3 + }, + { + "id": "O450x4W3OOacvJIy4QicJ", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/24805/24805_500.png" + }, + "text": "verduras", + "type": 2 }, { - "id": 528, - "texto": { - "en": "with", - "es": "con" + "id": "OHyrmD5US1rHEAEwLQaII", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fanimales.webp?alt=media&token=a9f8b76e-61ab-4c70-aef4-ec4e6549da60" }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcon_prep.webp?alt=media&token=4649b3b9-e248-4048-8949-fd75c423a3e3" + "tags": { + "EDAD": [ + "NINO" + ] }, - "relacion": [ + "text": "animales", + "type": 2 + }, + { + "id": "OKXIGnLh-i1ydTNj450Q8", + "relations": [ { - "id": 1001, - "frec": 1 + "id": "eZEqRZjRK8JJMsfHo4Y7w", + "value": 2 } ], - "agenda": 0, - "gps": 0 + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Freina.webp?alt=media&token=4c3c92ca-ab20-4bb3-b800-229033025084" + }, + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ], + "GENERO": [ + "MUJER" + ] + }, + "text": "reina", + "type": 1 }, { - "id": 529, - "texto": { - "en": "against", - "es": "contra" + "id": "OUcfOOReAfQroBKlBdDb-", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/6220/6220_500.png" }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcontra.webp?alt=media&token=7cf1b7cc-6d1d-4a9f-b099-e1d4ac4dbc4c" + "text": "solución salina", + "type": 2 + }, + { + "id": "OWLDc7Hn3neBAf_V_N27n", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fabrochar.webp?alt=media&token=ee1e45ea-b017-4dec-ac58-eafea2d644f5" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "abrochar", + "type": 3 }, { - "id": 530, - "texto": { - "en": "of", - "es": "de" + "id": "O_ZfCPZSxGMPT6orCt-O6", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcerdo.webp?alt=media&token=741f2ba1-fe2a-43b2-be72-3a7f30f861d8" }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fde.webp?alt=media&token=d388d233-8798-4143-81de-74dcae1e14be" + "text": "chancho", + "type": 2 + }, + { + "id": "OblxxVFC-LKPq-8oC9FpE", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fsentimientos.webp?alt=media&token=90954fb0-bf68-48fe-8f12-d9dfc21963da" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "sentimientos", + "type": 6 }, { - "id": 531, - "texto": { - "en": "from", - "es": "desde" + "id": "OdCdTUAlbN6kvsPjby_Bi", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_canal_deportes.webp?alt=media&token=83ff30a5-1672-4d60-bc80-8851a3608c9b" }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fdesde.webp?alt=media&token=005cccd6-1a3d-4a79-a1df-c3be054e023c" + "tags": { + "EDAD": [ + "JOVEN", + "NINO" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "deportes", + "type": 2 }, { - "id": 532, - "texto": { - "en": "during", - "es": "durante" + "id": "OeA63q6LpqGvXW-cJXEym", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fjamon_de_york.webp?alt=media&token=5a7c91e0-8fe6-4072-b01d-6db1b67e5d6b" }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fdurante.webp?alt=media&token=c10ae87d-faff-4424-8878-5b19f3685c7c" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ], + "HORA": [ + "MEDIODIA", + "NOCHE" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "jamón", + "type": 2 }, { - "id": 533, - "texto": { - "en": "in", - "es": "en" + "id": "OeytAsSiEAWC10tXhxbTa", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/6472/6472_500.png" }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fen.webp?alt=media&token=0cfe18f8-3a5d-429f-bf01-0e8e8426249e" + "text": "personajes", + "type": 1 + }, + { + "id": "OhrHu-xLo8hcn5plWfoX4", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcaro.webp?alt=media&token=bf0e37f5-b5e2-4f91-824f-e9644af0dc4f" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "caro", + "type": 4 }, { - "id": 534, - "texto": { - "en": "between", - "es": "entre" + "id": "Om1Bvqu8nmGuNGwV8hndM", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fbajo.webp?alt=media&token=6f4344d4-866a-4a2d-b33b-ef7f658e6521" }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fentre.webp?alt=media&token=68f3c53e-8d7b-41fa-9d72-44edd964f6b2" + "text": "bajo", + "type": 4 + }, + { + "id": "OvyFC1GHkvJZ0dAAF1QkY", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/6480/6480_500.png" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "él", + "type": 1 }, { - "id": 535, - "texto": { - "en": "towards", - "es": "hacia" + "id": "OwHzJdOQTFOA8daCVRwm6", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_pincel.webp?alt=media&token=61071c3c-12af-43dc-addd-cf9e15635637" }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fhacia.webp?alt=media&token=2ab6617b-974d-4f81-ac2b-de2dcf4e69de" + "tags": { + "EDAD": [ + "JOVEN", + "NINO" + ], + "GENERO": [ + "MUJER" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "pincel", + "type": 2 }, { - "id": 536, - "texto": { - "en": "until", - "es": "hasta" - }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fhasta.webp?alt=media&token=ce288b3a-16ca-4754-8e1c-27764f7801f9" + "id": "P5zdq4x58yp5TA_soKQEJ", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/6935/6935_500.png" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "bicicleta", + "type": 2 }, { - "id": 537, - "texto": { - "en": "for", - "es": "para" + "id": "PAlC0XSZNru3-LXtfvGjo", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fhacer_el_amor.webp?alt=media&token=f7e8141e-8325-4564-bcc4-7c75e59152a9" }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpara.webp?alt=media&token=b1a11e96-a245-477a-996e-4890d4c3f9ba" + "tags": { + "EDAD": [ + "ADULTO" + ], + "HORA": [ + "NOCHE" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "hacer el amor", + "type": 3 }, { - "id": 538, - "texto": { - "en": "by", - "es": "por" + "id": "PBqpK7LL1HQPwowPitrss", + "relations": [ + { + "id": "cb0rJJEYOeEoRU5fDdQQq", + "value": 3 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fleer.webp?alt=media&token=2008ecda-fb99-4cfd-be06-3ac1cb1d2100" }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpor.webp?alt=media&token=62c20067-7143-44cc-89e5-3cfb834f5a48" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "leer", + "type": 3 }, { - "id": 539, - "texto": { - "en": "according", - "es": "según" + "id": "PFAi3SdvH9vL7_Bg3MhCA", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fsemaforo.webp?alt=media&token=eb4320ad-dc97-4847-941a-d2b055da30cc" }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fsegun.webp?alt=media&token=3eaba42f-d343-48a6-96f6-92945a8b91bf" + "tags": { + "EDAD": [ + "ADULTO" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "semáforo", + "type": 2 }, { - "id": 540, - "texto": { - "en": "without", - "es": "sin" - }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fsin.webp?alt=media&token=94983140-df48-4734-ac04-479ad98c5b26" + "id": "PIBHv5VueBi-sf5qFCN_Y", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fante.webp?alt=media&token=9a02d561-8472-473c-b508-0b090b8f2669" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "ante", + "type": 6 }, { - "id": 544, - "texto": { - "en": "hero", - "es": "heroe" + "id": "PIPQnVS2UiS7kGbucJP8l", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcurar.webp?alt=media&token=f975cb51-cc90-4f59-a3c2-e8b4dff82501" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fspiderman.webp?alt=media&token=118e61bb-843e-427b-86b9-9dcb559cd496" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "curar", + "type": 3 }, { - "id": 552, - "texto": { - "en": "story", - "es": "cuento" + "id": "PLXxIPYyztaztLf4sPCst", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/3332/3332_500.png" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcuento.webp?alt=media&token=2f3fa4f7-9f55-424e-a587-8974d1728f84" + "text": "garganta", + "type": 2 + }, + { + "id": "PbtM3htZocZb8YifuPoY5", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcangrejo.webp?alt=media&token=39083c10-717e-4ac4-80ed-0b213978884b" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "cangrejo", + "type": 2 }, { - "id": 553, - "texto": { - "en": "book", - "es": "libro" + "id": "PfNLmlHKFT9d1w6IgeXbU", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_control_remoto.webp?alt=media&token=cc3d03f5-5051-410d-8edf-74e46fe7d138" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Flibro.webp?alt=media&token=ce9ae11b-a7e1-48ae-bc73-36358db5e1ec" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "control remoto", + "type": 2 }, { - "id": 554, - "texto": { - "en": "movie", - "es": "película" + "id": "Pl-M4bc6k2rdhu6FHEbkA", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_patio.webp?alt=media&token=776f4a4a-6d91-4221-90ac-3325636f908e" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpelicula.webp?alt=media&token=0668824c-95f4-4e4b-a7df-7c062b988073" + "tags": { + "EDAD": [ + "JOVEN", + "NINO" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "patio", + "type": 2 }, { - "id": 557, - "texto": { - "en": "in love", - "es": "enamorado" + "id": "PogTYrGfa2WNfBRuA8O4e", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fmalo.webp?alt=media&token=0c04538d-6ffb-4edf-8097-7e4b69d8d87c" }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fenamorados.webp?alt=media&token=10dcfa22-c4a8-4c38-b71a-886cd0d56f3b" - }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "malo", + "type": 4 }, { - "id": 560, - "texto": { - "en": "cartoons", - "es": "dibujos animados" + "id": "PszHdOxMsS_tAzSrN52Wa", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/2529/2529_500.png" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_dibujos_animados.webp?alt=media&token=7849908a-4329-4361-ac52-f583f345b9d7" + "text": "plastilina", + "type": 2 + }, + { + "id": "Pw3GgPwp7fpDVC6wJjgPn", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/24725/24725_500.png" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "subir", + "type": 3 }, { - "id": 561, - "texto": { - "en": "ticket", - "es": "entrada" + "id": "Q6LQqdLcvNOiCFjC0DVo2", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ftambor.webp?alt=media&token=f5b6ecd0-a046-4281-bff7-a4d9b43e812a" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_entrada.webp?alt=media&token=3c3f1754-1512-4658-923b-3486a794d797" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN", + "NINO" + ], + "GENERO": [ + "HOMBRE" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "tambor", + "type": 2 }, { - "id": 563, - "texto": { - "en": "row", - "es": "fila" + "id": "Q6nNH4AIoSeDHODC_Ip8O", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/37228/37228_500.png" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ffila.webp?alt=media&token=4679780c-e3c4-4da7-b6fc-4e14a05a20eb" + "text": "vecino", + "type": 1 + }, + { + "id": "Q9Ra0aJaQnOJQ1Kqdc43-", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/2275/2275_500.png" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "bebé", + "type": 2 }, { - "id": 564, - "texto": { - "en": "drink", - "es": "bebida" + "id": "QCQRmsQY6AggjreY9Z0MF", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Frechazar.webp?alt=media&token=3b1e10e1-25a3-445c-a302-63a3ea2ad511" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fbebida.webp?alt=media&token=70276811-03c6-4072-89e2-c07fea37652f" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "rechazar", + "type": 3 }, { - "id": 565, - "texto": { - "en": "popcorn", - "es": "pochoclos" + "id": "QGf1Tb1roL7HAXUSrRqRJ", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_naranja.webp?alt=media&token=72d9eae2-64ae-41e4-94ad-45b57e3e0c6f" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_palomitas.webp?alt=media&token=f85af19c-2583-4c1a-83d0-bf55b275a45c" + "text": "naranja", + "type": 4 + }, + { + "id": "QJhkOh48xapiTObEDQLB9", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpiano.webp?alt=media&token=e07c1a80-4bb9-455d-b249-75f1731bb974" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "piano", + "type": 2 }, { - "id": 567, - "texto": { - "en": "money", - "es": "dinero" + "id": "QTkFHWp9KEDgfCjoQjBY2", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fplurales.webp?alt=media&token=99818cbc-fc14-4a3c-ada6-b113b53542ec" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_dinero.webp?alt=media&token=511fcf7d-fc11-40fa-b28f-6afea1e470bf" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "plurales", + "type": 6 }, { - "id": 568, - "texto": { - "en": "remote", - "es": "control remoto" + "id": "QUTQLuD2Gv7fHh0V_O5tg", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fvergonzante.webp?alt=media&token=0d7f7e5e-3e27-468b-bcac-663410387c39" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_control_remoto.webp?alt=media&token=cc3d03f5-5051-410d-8edf-74e46fe7d138" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "avergonzado", + "type": 4 }, { - "id": 572, - "texto": { - "en": "news", - "es": "noticias" + "id": "QVqSPPgA89whFTJ0HTphK", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fabrir.webp?alt=media&token=f4eef053-9555-4bc5-9c98-027004815311" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_canal_noticiero.webp?alt=media&token=94107da2-251c-41eb-9a7c-2a41971e9a11" + "text": "abrir", + "type": 3 + }, + { + "id": "QZNQOaf0SdHDbx1otCmrH", + "relations": [ + { + "id": "kpghvJtujlt4vPI2N6vsg", + "value": 2 + }, + { + "id": "wkrNPLGWTqMIy4PJRW9QR", + "value": 2 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fnino.webp?alt=media&token=f9c17702-4712-41f1-b72f-31e9919a0b5d" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "niño", + "type": 1 }, { - "id": 573, - "texto": { - "en": "music", - "es": "música" + "id": "QcGJ9u_JqmrW0X47PXWH4", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fdespeinada.webp?alt=media&token=dd507db6-7f92-40cb-982d-47e4fa9381c3" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_escuchar_musica.webp?alt=media&token=258720fc-5ba7-44e4-b03e-2b3575a56784" + "tags": { + "GENERO": [ + "MUJER" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "despeinada", + "type": 4 }, { - "id": 575, - "texto": { - "en": "cooking channel", - "es": "canal de cocina" + "id": "QclUM2p3iexSjFZI8OU4-", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/32530/32530_500.png" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fprograma_de_cocina.webp?alt=media&token=902c0c03-0d97-4426-9ba6-6bdc9307ab29" - }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "fiebre", + "type": 2 }, { - "id": 580, - "texto": { - "en": "cartoons", - "es": "dibujos animados" + "id": "QeqA20MCXB-zNfuKIssMY", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fatun.webp?alt=media&token=3268b4fa-6306-468c-b56e-dc3253ebaa6e" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_canal_dibujos_animados.webp?alt=media&token=64a8bf60-3076-41a1-80fa-035278796067" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ], + "HORA": [ + "MEDIODIA", + "NOCHE" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "lata de atún", + "type": 2 }, { - "id": 583, - "texto": { - "en": "sport channel", - "es": "deportes" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_canal_deportes.webp?alt=media&token=83ff30a5-1672-4d60-bc80-8851a3608c9b" + "id": "QllvOUe8utZrcBRGw_0vc", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/3404/3404_500.png" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "curita", + "type": 2 }, { - "id": 587, - "texto": { - "en": "How much is it?", - "es": "¿cuánto sale?" + "id": "QnlQ1HOEB9yNjuW3Dd6fc", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcelebracion.webp?alt=media&token=41b124b1-e168-4f46-a3d9-5ee24c13649d" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_precio.webp?alt=media&token=b31b9ab7-69e3-4476-a843-885bee00a080" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "celebración", + "type": 6 }, { - "id": 588, - "texto": { - "en": "invoice", - "es": "factura" + "id": "Qo3Qn_nMe3E6EqNw0UdNZ", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fsoleado.webp?alt=media&token=cd13634a-16d4-4ca1-80d7-6937f0c63e50" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ffactura.webp?alt=media&token=f2d735fa-3b58-438b-90dc-e32e8cb2c276" + "tags": { + "HORA": [ + "MEDIODIA", + "TARDE" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "soleado", + "type": 4 }, { - "id": 589, - "texto": { - "en": "lunch", - "es": "almuerzo" + "id": "QohNih4wgqjnpWt3kSwtd", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/38542/38542_500.png" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_almuerzo.webp?alt=media&token=b7acb5a2-b170-4c2b-a5b6-341d19db3632" - }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "entrenador", + "type": 1 }, { - "id": 590, - "texto": { - "en": "dinner", - "es": "cena" + "id": "QvaMxPy-3iixHAJFyIrN-", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fsandwich.webp?alt=media&token=7fc5f532-18d1-4b03-a06f-8008fb0c8434" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_cena.webp?alt=media&token=768a1465-9bb2-4f45-895a-29fa7da05086" + "tags": { + "HORA": [ + "MEDIODIA", + "NOCHE" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "sandwich", + "type": 2 }, { - "id": 594, - "texto": { - "en": "breakfast", - "es": "desayuno" + "id": "R06chAQYswLtQK46OInW7", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fleche_y_galletas.webp?alt=media&token=8bae8aa0-60be-4d0e-aa71-1b336ad89a26" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_desayuno.webp?alt=media&token=25948a6f-b4bd-4958-ad10-3ea868660416" + "tags": { + "EDAD": [ + "JOVEN", + "NINO" + ], + "HORA": [ + "MANANA", + "TARDE" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "leche con galletas", + "type": 2 }, { - "id": 595, - "texto": { - "en": "Where?", - "es": "¿Dónde es?" + "id": "R9ECa_HQRtpFrb59ebMTQ", + "relations": [ + { + "id": "wkrNPLGWTqMIy4PJRW9QR", + "value": 4 + }, + { + "id": "CZrETqLgQlvDkLHvw1t_w", + "value": 3 + }, + { + "id": "X0-Tf-KR24qEkpGDzG2Z-", + "value": 2 + }, + { + "id": "C29KJ8BTFavhj_R9UfnSv", + "value": 2 + }, + { + "id": "paPpjw1XVC9-6xcueJsrY", + "value": 2 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_escuela.webp?alt=media&token=05c5460c-c3a5-4404-9389-d6a67e79bb5d" }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fdonde.webp?alt=media&token=9e13c203-dc99-4345-aba7-8e2ce243627b" + "tags": { + "EDAD": [ + "JOVEN", + "NINO" + ], + "HORA": [ + "MANANA" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "escuela", + "type": 2 }, { - "id": 597, - "texto": { - "en": "hungry", - "es": "hambre" + "id": "RBCjBvNXQSZOOpg-5lBlK", + "relations": [ + { + "id": "C29KJ8BTFavhj_R9UfnSv", + "value": 2 + }, + { + "id": "pvXSy-5M4i8kysUppvdME", + "value": 2 + }, + { + "id": "bDnuS19hfd9GhJ-6rjNPD", + "value": 2 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fbueno.webp?alt=media&token=ce7bc25a-b814-43f3-a0e4-f89925cc3a40" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_hambre.webp?alt=media&token=3af9b051-508f-4a4d-9969-2c9e393283d2" + "text": "bueno", + "type": 4 + }, + { + "id": "RZfMOtjw0DoGHWaRfCEc4", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fjean.webp?alt=media&token=63fd1bde-8163-458a-a66c-6843038ec3f6" }, - "relacion": [], - "agenda": 0, - "gps": 0, - "esSugerencia": false + "text": "pantalón", + "type": 2 }, { - "id": 598, - "texto": { - "en": "afternoon snack", - "es": "merienda" + "id": "Ra2rxEEohwxRqDsW2AT3C", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/37464/37464_500.png" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_merienda.webp?alt=media&token=93022501-e9f5-412a-aee4-1599f3d80543" + "text": "videojuegos", + "type": 2 + }, + { + "id": "RbZetbSC5064rZccOFD1D", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_televisor.webp?alt=media&token=2575675b-b3c4-4e35-9cde-17bba27623ee" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "televisión", + "type": 2 }, { - "id": 599, - "texto": { - "en": "dish", - "es": "plato" + "id": "RkpoG4KB8m_TJFJf2v3EG", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_cambiar_canal.webp?alt=media&token=bb216f15-f686-4f31-ba31-c20dc370a538" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fplato.webp?alt=media&token=0a96d1d6-45dc-4a45-8e94-318ce29d32cb" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ], + "GENERO": [ + "HOMBRE" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "cambiar de canal", + "type": 3 }, { - "id": 600, - "texto": { - "en": "desert", - "es": "postre" + "id": "RwlZ1jr2Ix3evzrW71lN0", + "relations": [ + { + "id": "kpghvJtujlt4vPI2N6vsg", + "value": 2 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fmanzana.webp?alt=media&token=d7e920bb-54b7-4159-8401-d917395942f2" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpostre.webp?alt=media&token=5ba3ed23-b812-4e40-8693-7972e8671b86" + "tags": { + "HORA": [ + "MANANA", + "MEDIODIA", + "TARDE" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "manzana", + "type": 2 }, { - "id": 602, - "texto": { - "en": "What time is it?", - "es": "¿Qué hora es?" + "id": "S3um53pcko7_BPHy7R6FL", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/7186/7186_500.png" }, - "tipo": 5, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fque_hora_es.webp?alt=media&token=44e9f414-a3da-4401-82c8-bb12fc1c7102" - }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "nosotros", + "type": 1 }, { - "id": 604, - "texto": { - "en": "napkin", - "es": "servilletas" + "id": "SE-71I_ahm3oKROReyJHE", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/35347/35347_500.png" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fservilleta.webp?alt=media&token=6a5049bc-046d-4d64-b7a1-a8fc0687d9a2" + "text": "hacer caca", + "type": 3 + }, + { + "id": "SOyGnJXLPeVRoZy3vBgpK", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/38462/38462_500.png" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "examen", + "type": 2 }, { - "id": 605, - "texto": { - "en": "glass", - "es": "vaso" + "id": "SXz8iA1Qn_BlgLTAG6Epl", + "relations": [ + { + "id": "B1845IfYfPMz2FWpVFIQv", + "value": 3 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_cena.webp?alt=media&token=768a1465-9bb2-4f45-895a-29fa7da05086" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fvaso.webp?alt=media&token=0e374ed3-0fe4-4d0c-aaa8-e62dd900a2cc" + "tags": { + "HORA": [ + "NOCHE" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "cena", + "type": 2 }, { - "id": 606, - "texto": { - "en": "plane", - "es": "avión" + "id": "SiOmZdwX8Hf2nE2v6HfCp", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fzapato.webp?alt=media&token=a51da690-0fca-4643-bc09-9c79079e25c5" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Favion.webp?alt=media&token=c46dbcaa-99a0-4605-8eb5-8907dfd0e43f" + "tags": { + "EDAD": [ + "ADULTO" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "zapato", + "type": 2 }, { - "id": 607, - "texto": { - "en": "Bus", - "es": "autobús" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fautobus.webp?alt=media&token=15a4c091-c8fb-4c00-8cc3-dfe53becfc8f" + "id": "Sp2Ias_Y1HplkHWjIb7Mp", + "relations": [ + { + "id": "1B1WmC-V0PglDeRAeINcT", + "value": 3 + }, + { + "id": "Ubaq6h7wasdP_YRombm2c", + "value": 2 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fsin.webp?alt=media&token=94983140-df48-4734-ac04-479ad98c5b26" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "sin", + "type": 6 }, { - "id": 608, - "texto": { - "en": "car", - "es": "coche" + "id": "TAbuXSnSHU6C3CQ4kbKVh", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ftriangulo.webp?alt=media&token=6c36ca91-d690-4221-a208-4bf0ab4229db" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcoche.webp?alt=media&token=7d0e03da-0698-4e7a-9db1-5b812740a944" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN", + "NINO" + ] + }, + "text": "triángulo", + "type": 2 + }, + { + "id": "TBV2BhoZVgl1jMV_jWZYi", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/9202/9202_500.png" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "derecha", + "type": 2 }, { - "id": 609, - "texto": { - "en": "Metro", - "es": "metro" + "id": "TIgoS-YONIwzbrImXetaD", + "relations": [ + { + "id": "kpghvJtujlt4vPI2N6vsg", + "value": 2 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fciruela.webp?alt=media&token=c0beef71-79dc-4cc5-8906-a1c27f37bed8" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fmetro.webp?alt=media&token=32eebc33-69af-416c-9596-ba7f0e33655a" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ], + "HORA": [ + "MEDIODIA", + "TARDE" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "ciruela", + "type": 2 }, { - "id": 610, - "texto": { - "en": "taxi", - "es": "taxi" + "id": "TIsM6aTTZ9W8j6UhW9Qqj", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcoro.webp?alt=media&token=bb964d61-b045-4569-a9fa-43df344f7444" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ftaxi.webp?alt=media&token=2809dbe3-07a6-4ef4-90b1-f8725c91be44" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "coro", + "type": 2 }, { - "id": 611, - "texto": { - "en": "transportation", - "es": "transportes" + "id": "TLxsYdrBdHgFZkNJtVTmK", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ftortuga.webp?alt=media&token=992b3a94-8af0-42d7-998a-ab7cf9f9649a" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ftransportes.webp?alt=media&token=94bd980f-eeed-4310-8fe7-09148e19612f" + "text": "tortuga", + "type": 2 + }, + { + "id": "TP-gGRcpcFyx1SrNRsdRV", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/11625/11625_500.png" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "perdón", + "type": 5 }, { - "id": 614, - "texto": { - "en": "grandpa", - "es": "abuelo" + "id": "TR5CXN8-pfbWkshdxSBSV", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Foveja.webp?alt=media&token=11981786-fded-4f20-8d7a-8b2cef80e782" }, - "tipo": 1, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_abuelo.webp?alt=media&token=a699f1b0-1b85-4932-a32a-b07c570e2547" + "tags": { + "EDAD": [ + "NINO" + ] + }, + "text": "oveja", + "type": 2 + }, + { + "id": "TS9z8ZmMEwn0MGSfr9amH", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/8009/8009_500.png" }, - "relacion": [ + "text": "palta", + "type": 2 + }, + { + "id": "TZF-7m8VKZ7IL6pyv0Daf", + "relations": [ { - "id": 22, - "frec": 4 - }, + "id": "q22wRFF21EigV8YzQ_MfV", + "value": 4 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_cepillar.webp?alt=media&token=5025fba1-67ca-4c00-b61c-18fcee7fbacf" + }, + "tags": { + "HORA": [ + "MANANA", + "NOCHE" + ] + }, + "text": "cepillarme los dientes", + "type": 3 + }, + { + "id": "T_Q5c4XAfkhkclmnCGHo5", + "relations": [ { - "id": 14, - "frec": 1 + "id": "Gj7THa6XFHDfYL5H19lwj", + "value": 6 }, { - "id": 44, - "frec": 1 + "id": "pvXSy-5M4i8kysUppvdME", + "value": 5 }, { - "id": 49, - "frec": 1 + "id": "cb0rJJEYOeEoRU5fDdQQq", + "value": 3 }, { - "id": 378, - "frec": 1 + "id": "rxdfuk6egO7VmZEB3JrUN", + "value": 2 } ], - "agenda": 0, - "gps": 0, - "esSugerencia": false + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fhasta.webp?alt=media&token=ce288b3a-16ca-4754-8e1c-27764f7801f9" + }, + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] + }, + "text": "hasta", + "type": 6 }, { - "id": 615, - "texto": { - "en": "friends", - "es": "amigos" + "id": "Td5pgVQDTFOftUgOJ-bD-", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/37834/37834_500.png" }, - "tipo": 1, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_amigos.webp?alt=media&token=01d03271-5536-4654-ab0d-a938a1b432db" - }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "picante", + "type": 4 }, { - "id": 617, - "texto": { - "en": "Butcher", - "es": "carnicero" + "id": "Te_jJfeU8Xwa9St2RihBq", + "relations": [ + { + "id": "wkrNPLGWTqMIy4PJRW9QR", + "value": 5 + }, + { + "id": "y_5OURnKxFcv4UiMKntUi", + "value": 3 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fsangre.webp?alt=media&token=48399efe-6a12-4413-b61d-28ffa8dc5576" }, - "tipo": 1, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcarnicero.webp?alt=media&token=8922d169-5277-40f3-a3e4-07925112592f" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "sangre", + "type": 2 }, { - "id": 619, - "texto": { - "en": "chef", - "es": "cocinero" + "id": "ThqkHs4az5tgLqLcfFPaZ", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/4675/4675_500.png" }, - "tipo": 1, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcocinero.webp?alt=media&token=982eabfe-1544-4ff1-adb1-6eeac3937f1f" + "text": "largo", + "type": 4 + }, + { + "id": "TpPNZLsh5jrN9RdPFwmA7", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/11599/11599_500.png" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "¡genial!", + "type": 5 }, { - "id": 620, - "texto": { - "en": "team", - "es": "equipo" + "id": "Tpj-Fs8LQ566TM0bYlZ6H", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/6629/6629_500.png" }, - "tipo": 1, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fequipo.webp?alt=media&token=fe87fc4f-4e88-41a3-90ce-a6104a538091" + "text": "viernes", + "type": 6 + }, + { + "id": "TuAjBKPp3-PSdQuooSWZi", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Frana.webp?alt=media&token=8f852e14-de74-4088-b4ee-313b37373e48" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "rana", + "type": 2 }, { - "id": 621, - "texto": { - "en": "family", - "es": "familia" + "id": "TyqVzfOniQNa9WKQRXqr-", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fhermana.webp?alt=media&token=1eb4b2d7-fe8b-487e-b36a-4340352e79ce" }, - "tipo": 1, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_familia.webp?alt=media&token=577a591a-1df9-48f3-87dd-6548498130c5" + "tags": { + "EDAD": [ + "JOVEN", + "NINO" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "hermana", + "type": 1 }, { - "id": 622, - "texto": { - "en": "futbol player", - "es": "futbolista" + "id": "U1KQsrvTa2E00-ugc-Iy6", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fausente.webp?alt=media&token=b83de519-06a7-40ef-bc2c-3e7256275e24" }, - "tipo": 1, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_futbolista.webp?alt=media&token=f08a6396-a149-400e-8f8b-8fb62c6205d8" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] + }, + "text": "ausente", + "type": 4 + }, + { + "id": "U6PoeH-cMdO3ttnLkN7_3", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcabalgar.webp?alt=media&token=54b54202-50bf-4472-8768-e14da82265ab" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "cabalgar", + "type": 3 }, { - "id": 623, - "texto": { - "en": "brother", - "es": "hermano" + "id": "U7GiGcYacowWi4MWrCYyj", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/38992/38992_500.png" }, - "tipo": 1, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_hermano.webp?alt=media&token=9783e15c-f073-4dc0-b556-9e69fd522058" + "text": "antiinflamatorio", + "type": 2 + }, + { + "id": "UQ-5wOfR0tDzljoDjj2xU", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fotonio.webp?alt=media&token=1d1a0c5b-e4c7-4976-879b-357f3c84ee62" }, - "relacion": [ + "text": "otoño", + "type": 2 + }, + { + "id": "UQ5B5K-tpk1XmQC1B9TjQ", + "relations": [ + { + "id": "CYH_6DL9q1iLLetuWeR9A", + "value": 47 + }, + { + "id": "bDnuS19hfd9GhJ-6rjNPD", + "value": 56 + }, + { + "id": "O-CLnVuXAUapOn6TbdhKx", + "value": 13 + }, { - "id": 22, - "frec": 1 + "id": "ry_jOegpMf4nB3spGf4d2", + "value": 6 }, { - "id": 49, - "frec": 1 + "id": "wkrNPLGWTqMIy4PJRW9QR", + "value": 5 }, { - "id": 44, - "frec": 1 + "id": "17AkRFlfC_koV-lywmDE8", + "value": 2 }, { - "id": 14, - "frec": 1 + "id": "C29KJ8BTFavhj_R9UfnSv", + "value": 2 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_no.webp?alt=media&token=a8446260-23d3-4a04-83da-3119d521bb70" + }, + "text": "no", + "type": 5 + }, + { + "id": "US8_vYTnDfxBw2Ung_J38", + "resource": { + "asset": "", + "network": "https://globalsymbols.com/uploads/production/image/imagefile/28956/81_28957_8f92f43e-bc7b-4397-952d-4f69ba6b64f5.png" + }, + "text": "partes íntimas", + "type": 2 + }, + { + "id": "UVzdJiqY36fqgBYyz880c", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fjamon.webp?alt=media&token=9f8df889-6aa9-4f38-bc9d-6ffe0a368900" + }, + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ], + "HORA": [ + "MEDIODIA", + "NOCHE" + ] + }, + "text": "jamón crudo", + "type": 2 + }, + { + "id": "UXJDiwb3j_zyfGa26ByJL", + "relations": [ + { + "id": "y_5OURnKxFcv4UiMKntUi", + "value": 3 }, { - "id": 378, - "frec": 1 + "id": "pvXSy-5M4i8kysUppvdME", + "value": 2 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpecho.webp?alt=media&token=55d7a439-26c1-48b6-82ae-8d749d0142d7" + }, + "text": "pecho", + "type": 2 + }, + { + "id": "Ubaq6h7wasdP_YRombm2c", + "relations": [ + { + "id": "wkrNPLGWTqMIy4PJRW9QR", + "value": 16 } ], - "agenda": 0, - "gps": 0, - "esSugerencia": false + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fazucar.webp?alt=media&token=788bb77b-e6e0-4cd4-84c3-eddfeffa3e3c" + }, + "tags": { + "HORA": [ + "MANANA", + "TARDE" + ] + }, + "text": "azúcar", + "type": 2 }, { - "id": 624, - "texto": { - "en": "sister", - "es": "hermana" + "id": "Ugs9V9c2c5iHrVC6p17zr", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/31306/31306_500.png" }, - "tipo": 1, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fhermana.webp?alt=media&token=1eb4b2d7-fe8b-487e-b36a-4340352e79ce" + "text": "analgésico", + "type": 2 + }, + { + "id": "Uk1Emn5IovsTfFzpQX5Jw", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fsosten.webp?alt=media&token=1a3d73cc-5ee1-4f01-ab48-45ca047a5443" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ], + "GENERO": [ + "MUJER" + ] + }, + "text": "sosten", + "type": 2 }, { - "id": 626, - "texto": { - "en": "teacher", - "es": "maestra" + "id": "UkLF5sKtVKW0D8RzVCoue", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/2664/2664_500.png" }, - "tipo": 1, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_maestra.webp?alt=media&token=4ee47174-ea96-46df-9f02-c35642dfaf31" + "text": "bombero", + "type": 1 + }, + { + "id": "UnQJwWfWCe40DJYR1Er0o", + "relations": [ + { + "id": "B1845IfYfPMz2FWpVFIQv", + "value": 64 + }, + { + "id": "wkrNPLGWTqMIy4PJRW9QR", + "value": 17 + }, + { + "id": "y_5OURnKxFcv4UiMKntUi", + "value": 2 + }, + { + "id": "kpghvJtujlt4vPI2N6vsg", + "value": 2 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fzid_dolor.webp?alt=media&token=fa664a43-d014-4cdf-aa74-bfe5a48bbbfa" + }, + "text": "dolor", + "type": 2 + }, + { + "id": "UssSOEEKutvzB_B4fAQE-", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_de_nuevo.webp?alt=media&token=925fbdb2-67aa-48d8-b023-5c8bd8dcbc75" + }, + "tags": { + "EDAD": [ + "ADULTO" + ] + }, + "text": "escuchar de nuevo", + "type": 3 + }, + { + "id": "Ust3oadA0PUGViYo28Mf3", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/6044/6044_500.png" + }, + "text": "caminar", + "type": 3 + }, + { + "id": "UvRS0KmtZn3dq7e8L5RcE", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_enojado.webp?alt=media&token=0cf1e573-341e-4f1c-a2b1-8e407b6f2ea3" + }, + "text": "enojado", + "type": 4 + }, + { + "id": "UwvZVcX_CAQFrI6U4LsNT", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fzid_huevo.webp?alt=media&token=ca26cfcd-56e8-4b77-8ef0-5f66236ab6c0" + }, + "tags": { + "HORA": [ + "MEDIODIA", + "NOCHE" + ] + }, + "text": "huevo", + "type": 2 + }, + { + "id": "VJ9AU_y7CqsONR6TvhdLh", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fdonde.webp?alt=media&token=9e13c203-dc99-4345-aba7-8e2ce243627b" + }, + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] + }, + "text": "¿dónde es?", + "type": 6 + }, + { + "id": "VKrLGgYjc-nLPGsyESDgb", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcanario.webp?alt=media&token=a5c74e04-d7d8-44a2-8ef6-3b418cb088f5" + }, + "text": "canario", + "type": 2 + }, + { + "id": "VL4pd0vnJ-CNfMg9bCNed", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_aspirina.jpg?alt=media&token=1104fe22-4f42-4bba-a75d-bb25af56333e" + }, + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] + }, + "text": "aspirina", + "type": 2 + }, + { + "id": "VUJ-zrdsyL9MOuFbdMCAx", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/35569/35569_500.png" + }, + "text": "mareo", + "type": 2 + }, + { + "id": "Vioyf8EXJfY5t34NnN0WO", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_tablet.webp?alt=media&token=b7eaaf47-0194-4491-8377-f593b85a48a0" + }, + "tags": { + "EDAD": [ + "JOVEN", + "NINO" + ] + }, + "text": "tablet", + "type": 2 + }, + { + "id": "Vjlet5P7XuqTrc22nt_Zz", + "relations": [ + { + "id": "M5q2CXmK0_WVaVUB_HJB3", + "value": 3 + }, + { + "id": "B1845IfYfPMz2FWpVFIQv", + "value": 2 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fagua.webp?alt=media&token=b7a9b14c-ecf5-4647-a364-21cab9feb013" + }, + "text": "agua", + "type": 2 + }, + { + "id": "Vmnu5eormo-_TOCgF4YzG", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/2962/2962_500.png" + }, + "text": "jarabe para la tos", + "type": 2 + }, + { + "id": "VoZumy5GtnRdqSOmXAw7j", + "relations": [ + { + "id": "GY_flM-6uR6X3L4AwsiwU", + "value": 3 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpreparado.webp?alt=media&token=20acd627-34f7-4115-9a7a-37245ed069ce" + }, + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] + }, + "text": "preparado", + "type": 4 + }, + { + "id": "VrC7AnovfA7VzmYESVc8L", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/6517/6517_500.png" + }, + "text": "conversar", + "type": 3 + }, + { + "id": "VwZ4EKSggYWxlnAbp-pNB", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fenfermo.webp?alt=media&token=764245fa-4e99-479e-8b3b-d7a08264a54a" + }, + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] + }, + "text": "enfermo", + "type": 4 + }, + { + "id": "Vzov0z9acB-I1_W_CcFcY", + "relations": [ + { + "id": "kpghvJtujlt4vPI2N6vsg", + "value": 2 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_rojo.webp?alt=media&token=db03a6d8-b224-4c3e-95ae-b9726acbb4a9" + }, + "text": "rojo", + "type": 4 + }, + { + "id": "WDUIQV43zghFQq_rSk1Z4", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ffilete.webp?alt=media&token=03537ace-c649-4720-86ef-949b7dc58542" + }, + "tags": { + "HORA": [ + "MEDIODIA", + "NOCHE" + ] + }, + "text": "churrasco", + "type": 2 + }, + { + "id": "WL3ZN-W_zgnuTJpuqz0YQ", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/5555/5555_500.png" + }, + "text": "príncipe", + "type": 1 + }, + { + "id": "WNhpmD_XlTaNEBo7GsFXu", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fzid_diarrea.webp?alt=media&token=1ebef72f-8be3-40e9-8acb-baf64842e986" + }, + "text": "diarrea", + "type": 2 + }, + { + "id": "WQ0CNIQ_gjaCxg4tEIsOo", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/26493/26493_500.png" + }, + "text": "clavado", + "type": 2 + }, + { + "id": "WRzleD-mI84LaimFH8h6P", + "relations": [ + { + "id": "0pFtmDZdlnLrUkT_XZDXQ", + "value": 2 + } + ], + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/6572/6572_500.png" + }, + "text": "escuchar", + "type": 3 + }, + { + "id": "WUt3I-NkdbqlSVcwuLfFx", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/2506/2506_500.png" + }, + "text": "patines", + "type": 2 + }, + { + "id": "WWK2v56LM-zWqujabk9bM", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_plastica.webp?alt=media&token=f07c00ef-d42e-48dc-a115-6958e289006b" + }, + "tags": { + "EDAD": [ + "NINO" + ] + }, + "text": "plástica", + "type": 2 + }, + { + "id": "W_f7h3qOLl2uEd_OYpMfQ", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/2824/2824_500.png" + }, + "text": "policía", + "type": 1 + }, + { + "id": "WasZ5bKZZy5Jt4Y-JipxS", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fbikinis.webp?alt=media&token=f901e863-6e71-4b05-8275-859616e7f2fe" + }, + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ], + "GENERO": [ + "MUJER" + ] + }, + "text": "bikini", + "type": 2 + }, + { + "id": "Wgh5iCzUmx4Je-B85-pra", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fnevera.webp?alt=media&token=26ab2e17-fa2b-49cc-875d-1eb22929b367" + }, + "tags": { + "HORA": [ + "MEDIODIA", + "NOCHE" + ] + }, + "text": "heladera", + "type": 2 + }, + { + "id": "WjXQhSFPpz42ZUyHvurYG", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fgrillo.webp?alt=media&token=74055068-db86-47f3-bda0-972078777797" + }, + "text": "grillo", + "type": 2 + }, + { + "id": "WtYSntcy2CijEORmROeaj", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcuarto.webp?alt=media&token=745ef84d-1934-48bc-a279-657b1d63c7d7" + }, + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] + }, + "text": "un cuarto", + "type": 4 + }, + { + "id": "Wu47Qs6Zupu1Ox2gUhkxn", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_cuarto.webp?alt=media&token=71b775de-e204-4136-97f9-f8b7346073ed" + }, + "text": "cuarto", + "type": 2 + }, + { + "id": "Wva5W8GA0dHzyt2_0FPdm", + "relations": [ + { + "id": "bDnuS19hfd9GhJ-6rjNPD", + "value": 1 + }, + { + "id": "CYH_6DL9q1iLLetuWeR9A", + "value": 1 + }, + { + "id": "O-CLnVuXAUapOn6TbdhKx", + "value": 1 + }, + { + "id": "LiBr37yi-YBgQDx4unjyc", + "value": 1 + }, + { + "id": "cJMQi3SVmqvWJ00VxI6gy", + "value": 1 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_hermano.webp?alt=media&token=9783e15c-f073-4dc0-b556-9e69fd522058" + }, + "tags": { + "EDAD": [ + "JOVEN", + "NINO" + ] + }, + "text": "hermano", + "type": 1 + }, + { + "id": "X0-Tf-KR24qEkpGDzG2Z-", + "relations": [ + { + "id": "C29KJ8BTFavhj_R9UfnSv", + "value": 4 + }, + { + "id": "wkrNPLGWTqMIy4PJRW9QR", + "value": 2 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fayer.webp?alt=media&token=651e6c3e-091b-4586-91e3-666afc9be72e" + }, + "text": "ayer", + "type": 6 + }, + { + "id": "X3u4pXTWKcGc43lOkgSBt", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcumplimiento.webp?alt=media&token=971b0f6d-fec4-4155-aca0-3145f1a8c8bf" + }, + "tags": { + "EDAD": [ + "ADULTO" + ] + }, + "text": "cumplimiento", + "type": 6 + }, + { + "id": "XA952Z60D0-cesNCVA-OX", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_adios.webp?alt=media&token=94e8b976-f724-417e-b921-1800c14f8e5a" + }, + "text": "chau", + "type": 5 + }, + { + "id": "XC5fIljJ819OYpllYTjpE", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fjirafa.webp?alt=media&token=5e9950fc-00dc-4d7a-90b3-cee9f55a2dc0" + }, + "text": "jirafa", + "type": 2 + }, + { + "id": "XN0nzhQyHVOhuYuNqrp8g", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fmelocoton.webp?alt=media&token=b00db9ca-225c-4867-8c54-ed3754e15c04" + }, + "tags": { + "HORA": [ + "MANANA", + "TARDE" + ] + }, + "text": "durazno", + "type": 2 + }, + { + "id": "XOoGN6huCjVHxH8hRFAw1", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fblanca.webp?alt=media&token=29601eda-4a20-47a7-b271-dd003afaa6d9" + }, + "text": "blanca", + "type": 2 + }, + { + "id": "XY6ZCNzeJIEzLtWJcufJm", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcamiseta_de_manga_larga.webp?alt=media&token=89da6e32-4371-471a-b8cf-d86a43c6e78c" + }, + "tags": { + "EDAD": [ + "ADULTO" + ] + }, + "text": "camiseta manga larga", + "type": 2 + }, + { + "id": "XYY8SV1IAMHjdGjMZxbdy", + "relations": [ + { + "id": "y_5OURnKxFcv4UiMKntUi", + "value": 5 + }, + { + "id": "wkrNPLGWTqMIy4PJRW9QR", + "value": 2 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcancha.webp?alt=media&token=bd539ba6-3e6c-4441-b5d2-cd52a7922a69" + }, + "text": "cancha", + "type": 2 + }, + { + "id": "XeVaDdUWSEkhfJvTVvUHR", + "relations": [ + { + "id": "B1845IfYfPMz2FWpVFIQv", + "value": 7 + }, + { + "id": "CZrETqLgQlvDkLHvw1t_w", + "value": 5 + }, + { + "id": "Gj7THa6XFHDfYL5H19lwj", + "value": 2 + }, + { + "id": "eZEqRZjRK8JJMsfHo4Y7w", + "value": 2 + }, + { + "id": "emm_RirDsO30Enax5Q4gd", + "value": 2 + }, + { + "id": "y_5OURnKxFcv4UiMKntUi", + "value": 2 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fsalir.webp?alt=media&token=8b81f386-fd97-42bb-8ef8-87814b1148c9" + }, + "text": "salir", + "type": 3 + }, + { + "id": "XnocVMEeUGCSnlnusP44O", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcoger.webp?alt=media&token=a2949664-3aa3-43f7-bf88-eafb8818bc53" + }, + "text": "agarrar", + "type": 3 + }, + { + "id": "XuAtFop5_JNSYiZkUBzaU", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcocinar.webp?alt=media&token=14d1dd93-0ef8-4a5b-966d-572a34f19697" + }, + "tags": { + "HORA": [ + "MEDIODIA", + "NOCHE" + ] + }, + "text": "cocinar", + "type": 2 + }, + { + "id": "Y5HQq_4crSF2lpwH-KUrt", + "relations": [ + { + "id": "kpghvJtujlt4vPI2N6vsg", + "value": 3 + }, + { + "id": "ccGASDOGtty6GfQMEEBEU", + "value": 2 + }, + { + "id": "B1845IfYfPMz2FWpVFIQv", + "value": 2 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fdos.webp?alt=media&token=e1040518-cecd-4ff2-a1d2-ff2bcbfd42ba" + }, + "text": "dos", + "type": 6 + }, + { + "id": "YCu-B26PqjE30AhikHdkI", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_canal_dibujos_animados.webp?alt=media&token=64a8bf60-3076-41a1-80fa-035278796067" + }, + "text": "dibujos animados", + "type": 2 + }, + { + "id": "YIP0Xc4aJsfv0s8BpiQnn", + "relations": [ + { + "id": "m0Fkio76HZHS2HguPOTn5", + "value": 2 + }, + { + "id": "54taab8z9ziXt0IqXHkV9", + "value": 2 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcinco.webp?alt=media&token=62c2628b-899f-4e6b-991e-57e58f7083da" + }, + "text": "cinco", + "type": 6 + }, + { + "id": "YLKXFZ9ze9K9NvJiAx8w0", + "relations": [ + { + "id": "5vxTXbPl4Y0yezGu7p1f6", + "value": 32 + }, + { + "id": "CYH_6DL9q1iLLetuWeR9A", + "value": 20 + }, + { + "id": "pvXSy-5M4i8kysUppvdME", + "value": 4 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fque_pregunta.webp?alt=media&token=746d6a83-4d91-4be2-8a20-3cdbf6ecdd0b" + }, + "text": "¿qué?", + "type": 6 + }, + { + "id": "YbrNtdUmyMNdAF5CfvY1A", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ftoalla.webp?alt=media&token=2364b04f-3636-42c0-b40f-06fca87b6477" + }, + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] + }, + "text": "toalla", + "type": 2 + }, + { + "id": "YbvMRsCtMbww8OQgF45QF", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fzid_resfriado.webp?alt=media&token=88ccba98-7926-49f5-b376-aac36faecd74" + }, + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] + }, + "text": "resfrío", + "type": 2 + }, + { + "id": "YeT-jstVSA7-mD9t99Isg", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Frompecabezas.webp?alt=media&token=a1901342-85d3-4e93-9b0d-2ef3b599d05b" + }, + "tags": { + "EDAD": [ + "JOVEN", + "NINO" + ] + }, + "text": "rompecabeza", + "type": 2 + }, + { + "id": "YusWY8GwdO43bSp1o3BWC", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fmolesto.webp?alt=media&token=f7186ab0-583a-43da-9d07-ec34822ed0ed" + }, + "text": "molesto", + "type": 4 + }, + { + "id": "Yvxm8RGoFYKUsIXOl33yR", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/8027/8027_500.png" + }, + "text": "apagar la luz", + "type": 3 + }, + { + "id": "Z5-sBklfLIWE00CJ_T_ZK", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcuchara.webp?alt=media&token=a985b2d4-a436-4a16-a5a1-74d46a653ac1" + }, + "text": "cuchara", + "type": 2 + }, + { + "id": "Z8xp3kxXuhMVoNm7ddQSX", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/6543/6543_500.png" + }, + "text": "lanzar", + "type": 3 + }, + { + "id": "ZA2C4bJaL90lBxsTemYWZ", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/3142/3142_500.png" + }, + "text": "piscina", + "type": 2 + }, + { + "id": "ZAnmv4CLb7hldYUlp2wJU", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fa.webp?alt=media&token=3e8a5652-be09-49bc-9bfa-3511eebfd9e8" + }, + "text": "ninguno", + "type": 4 + }, + { + "id": "ZBIFtTq-BH1jv5jLbzrhj", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Frepetir.webp?alt=media&token=14874d12-fd73-4cfc-a27f-09c987a04b33" + }, + "text": "repetir", + "type": 3 + }, + { + "id": "ZQEXAf10BkoTvCJx3Ox39", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fsorpresa.webp?alt=media&token=27ad6998-250d-4aa3-8e2b-8f0c55525c2d" + }, + "tags": { + "EDAD": [ + "JOVEN", + "NINO" + ] + }, + "text": "sorpresa", + "type": 6 + }, + { + "id": "ZR-NXJk3SD351W-95cf_T", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_pintar.webp?alt=media&token=5dd94837-f3fb-4f86-a82d-03cc7dff54bf" + }, + "tags": { + "EDAD": [ + "NINO" + ] + }, + "text": "pintar", + "type": 3 + }, + { + "id": "ZRYQmYRGKzheBqk11eGRZ", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fballena.webp?alt=media&token=89bbc0a0-5fb0-4102-b5b4-16f1e3f429f6" + }, + "tags": { + "EDAD": [ + "NINO" + ] + }, + "text": "ballena", + "type": 2 + }, + { + "id": "Zm4OIanIKTigDGIsInO7o", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fsupermercado.webp?alt=media&token=f5c6e8ce-3c97-40b0-860a-ad5d02a0bf7e" + }, + "text": "un supermercado", + "type": 2 + }, + { + "id": "ZnMba2r4XIg9lPi_H2d_Z", + "relations": [ + { + "id": "CYH_6DL9q1iLLetuWeR9A", + "value": 5 + }, + { + "id": "O-CLnVuXAUapOn6TbdhKx", + "value": 1 + }, + { + "id": "bDnuS19hfd9GhJ-6rjNPD", + "value": 4 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_si.webp?alt=media&token=c55c8d1d-d5ff-4e1a-9283-e0ed5c1e587d" + }, + "text": "sí", + "type": 5 + }, + { + "id": "_1lOt0C0MQhvU8QWC6_oZ", + "relations": [ + { + "id": "bDnuS19hfd9GhJ-6rjNPD", + "value": 1 + }, + { + "id": "CYH_6DL9q1iLLetuWeR9A", + "value": 1 + }, + { + "id": "O-CLnVuXAUapOn6TbdhKx", + "value": 1 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_buenas_noches.webp?alt=media&token=ed63a9b2-8617-48d0-ad6b-4c699eb2bce6" + }, + "tags": { + "HORA": [ + "NOCHE" + ] + }, + "text": "buenas noches", + "type": 5 + }, + { + "id": "_2SjbH-xHZq173EU4J65c", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/2859/2859_500.png" + }, + "text": "parque", + "type": 2 + }, + { + "id": "_3ihCSMQCokXNo8pXii-h", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_llamaralguien.webp?alt=media&token=1bc21620-5b70-467f-9680-9d18d15f30e5" + }, + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] + }, + "text": "llamar a alguien", + "type": 3 + }, + { + "id": "_8RIOebHpkr9nCy0_9qhP", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/32669/32669_500.png" + }, + "text": "llamar", + "type": 3 + }, + { + "id": "_CsJMxqGcNSaujXwRZcpu", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fansioso.webp?alt=media&token=c9934785-ceaa-438b-9e02-cc0e49d25aef" + }, + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] + }, + "text": "ansioso", + "type": 4 + }, + { + "id": "_FNTsoEjTMV3Uas-gggi2", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/26986/26986_300.png" + }, + "text": "estrés", + "type": 2 + }, + { + "id": "_HUf6SR0mTP7v72Y9_4gw", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcoche_de_bomberos.webp?alt=media&token=259f65d9-b5bd-4b8d-91cd-df0fca11b6a1" + }, + "text": "coche de bomberos", + "type": 2 + }, + { + "id": "_Lc2-NNL69ZX-aVnUNzgx", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ffresa.webp?alt=media&token=cd851af7-e7fc-4842-ac66-7ef2d6fe4018" + }, + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ], + "HORA": [ + "MEDIODIA" + ] + }, + "text": "frutilla", + "type": 2 + }, + { + "id": "_S9Eck14cdOTr0QH4i7sQ", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_lugarbanio.webp?alt=media&token=d0a972ae-70d9-4636-9fc1-9da26af74026" + }, + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] + }, + "text": "cuarto de baño", + "type": 2 + }, + { + "id": "_WIT6qs1kaiJqB1Ild5Xs", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpaseo.webp?alt=media&token=2cc070cb-cb0b-4491-9a5b-0fdb66bf00ab" + }, + "text": "paseo", + "type": 6 + }, + { + "id": "_eug92AvR1UXpYlfm6o_Q", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fdorado.webp?alt=media&token=2da74e47-082e-40a8-a5e8-9f17d2ad06c0" + }, + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] + }, + "text": "dorado", + "type": 4 + }, + { + "id": "_hqTU9A7I3RFDVrcIEK-L", + "relations": [ + { + "id": "AWJXh6URGN0Vwm66i6IvL", + "value": 62 + }, + { + "id": "BQm-YCPc0lfD1-mhecCTL", + "value": 36 + }, + { + "id": "FTngK946O8S8bYc0g7vM2", + "value": 35 + }, + { + "id": "ZnMba2r4XIg9lPi_H2d_Z", + "value": 11 + }, + { + "id": "UQ5B5K-tpk1XmQC1B9TjQ", + "value": 13 + }, + { + "id": "7iAXKVm22uMgr6aqZ1rr7", + "value": 14 + }, + { + "id": "Wva5W8GA0dHzyt2_0FPdm", + "value": 10 + }, + { + "id": "O-CLnVuXAUapOn6TbdhKx", + "value": 50 + }, + { + "id": "JFldbhjqxK3fD6D2K4HY4", + "value": 16 + }, + { + "id": "JZRBfIXBkeuobtDXbLt5t", + "value": 2 + }, + { + "id": "hKJhXxultsxm0TJl1P8-L", + "value": 1 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_action_previous.webp?alt=media&token=a6feccd4-fd34-4b5a-ac1d-a5f027551d44" + }, + "text": "%null%", + "type": 2 + }, + { + "id": "_lU200bb9Sjv0b_iJKgU2", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ftienda_de_bicicletas.webp?alt=media&token=ee06d1a7-260f-4eab-bf25-831be398cd64" + }, + "tags": { + "EDAD": [ + "JOVEN", + "NINO" + ] + }, + "text": "una bicicletería", + "type": 2 + }, + { + "id": "_tDZtalMxKSNpWydJ1aeW", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcero.webp?alt=media&token=f21cba0a-a49b-4d7c-9f49-adde729892c6" + }, + "text": "cero", + "type": 6 + }, + { + "id": "aC_XP9Ch5PqWoCmcJwI77", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/2985/2985_500.png" + }, + "text": "algodón", + "type": 2 + }, + { + "id": "aMs2YNnWkw4XN0gAm-jI3", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcajon.webp?alt=media&token=65cd501e-2856-4424-a0a9-a3395494520d" + }, + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] + }, + "text": "cajón", + "type": 2 + }, + { + "id": "aP9QisUdxhgOKIQ2kHNb3", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Facelga.webp?alt=media&token=efcd0769-fa2f-4730-9b33-a4fc5c62c533" + }, + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] + }, + "text": "acelga", + "type": 2 + }, + { + "id": "aSzpwNza22HZp46Sh6wfx", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fsucio.webp?alt=media&token=7e883539-03c3-4d06-b22f-26c417886cec" + }, + "text": "súcio", + "type": 4 + }, + { + "id": "aTwzShtP_zR9x6bSGSzEB", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fmuslo_de_pollo.webp?alt=media&token=86df988a-e631-426d-ab68-69afb702b85c" + }, + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ], + "HORA": [ + "MEDIODIA", + "NOCHE" + ] + }, + "text": "muslo de pollo", + "type": 2 + }, + { + "id": "aXLBXkENJqTYkyZOP8TNS", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/6625/6625_500.png" + }, + "text": "tú", + "type": 1 + }, + { + "id": "aa3xDW6F9YUKyX0fe5uX8", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/25075/25075_500.png" + }, + "text": "espaldas", + "type": 2 + }, + { + "id": "ajesFjbC7hwCNLKdif-ix", + "relations": [ + { + "id": "B1845IfYfPMz2FWpVFIQv", + "value": 2 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcontra.webp?alt=media&token=7cf1b7cc-6d1d-4a9f-b099-e1d4ac4dbc4c" + }, + "text": "contra", + "type": 6 + }, + { + "id": "ak5fBauJzapC4JIf0lT8N", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/6532/6532_500.png" + }, + "text": "cerro", + "type": 2 + }, + { + "id": "alsoa_V3wz3vPpG1TKRZc", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ftransportes.webp?alt=media&token=94bd980f-eeed-4310-8fe7-09148e19612f" + }, + "text": "transportes", + "type": 2 + }, + { + "id": "amk4WRd1sNEIp24pnFw8j", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Frodilla.webp?alt=media&token=abca8679-496e-42ac-8d16-7bf963ccd560" + }, + "text": "rodilla", + "type": 2 + }, + { + "id": "armmpopt2RLsVDlqLrQ94", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Frestaurante.webp?alt=media&token=57ed6d5c-fa5f-41c1-b779-28294311e772" + }, + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ], + "HORA": [ + "MEDIODIA", + "NOCHE" + ] + }, + "text": "restaurante", + "type": 2 + }, + { + "id": "atVEXuftxSiDDj8rzUlFg", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_pinturas_de_colores.webp?alt=media&token=a9216975-c04c-458e-ab37-f25c8845ff68" + }, + "tags": { + "EDAD": [ + "NINO" + ] + }, + "text": "crayones", + "type": 2 + }, + { + "id": "atWxG3KTHB5moW1dylLJc", + "relations": [ + { + "id": "N_893wsadpGg3Ip5sEThe", + "value": 3 + }, + { + "id": "m0434KkjeTv8SGN7WxR2C", + "value": 1 + }, + { + "id": "LaKT8VTw0_6rvordp5-R8", + "value": 1 + }, + { + "id": "93hsW10TmX3Vcq_4IvcZ0", + "value": 1 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_jueguete.jpg?alt=media&token=4c74d182-45e0-4642-87e5-645aa1a9dda6" + }, + "tags": { + "EDAD": [ + "JOVEN", + "NINO" + ] + }, + "text": "juguete", + "type": 2 + }, + { + "id": "avzcTznCsQCISYJsLC-w_", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/24795/24795_500.png" + }, + "text": "notas musicales", + "type": 2 + }, + { + "id": "b1XpSC0ndnm0ZewNXC3pp", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcarnicero.webp?alt=media&token=8922d169-5277-40f3-a3e4-07925112592f" + }, + "tags": { + "EDAD": [ + "ADULTO" + ], + "HORA": [ + "MEDIODIA", + "NOCHE" + ] + }, + "text": "carnicero", + "type": 1 + }, + { + "id": "b5OdBMMzkf1FlQbUR5-m7", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fservilleta.webp?alt=media&token=6a5049bc-046d-4d64-b7a1-a8fc0687d9a2" + }, + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] + }, + "text": "servilletas", + "type": 2 + }, + { + "id": "b9Y5MrR-jn8fh77gAkLZy", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpintar.webp?alt=media&token=02634a91-0bef-46f5-b8a7-561d1fca2b33" + }, + "text": "pintar", + "type": 3 + }, + { + "id": "bAoK85XLNb7p0ebevYZ6O", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_espejo.webp?alt=media&token=64b31994-8493-4f77-b978-dff642f1e685" + }, + "text": "mirarme al espejo", + "type": 3 + }, + { + "id": "bDnuS19hfd9GhJ-6rjNPD", + "relations": [ + { + "id": "-LE2iv3Pwr5KuIyM5bYb3", + "value": 11 + }, + { + "id": "1DjW-XvWN7iOqoJPRSWwY", + "value": 2 + }, + { + "id": "5i3kSsCKF7Oa9iJQvXiTe", + "value": 4 + }, + { + "id": "32PnZjlnQbTJo4nL9YJYe", + "value": 1 + }, + { + "id": "s0BXoyn7AqUAlZ9BOHY6S", + "value": 1 + }, + { + "id": "d6s8fLFBiQ3KEJlNdJfUW", + "value": 1 + }, + { + "id": "VwZ4EKSggYWxlnAbp-pNB", + "value": 3 + }, + { + "id": "YbvMRsCtMbww8OQgF45QF", + "value": 1 + }, + { + "id": "qsA1zm1DOlItK7DCWzAw8", + "value": 6 + }, + { + "id": "wkrNPLGWTqMIy4PJRW9QR", + "value": 17 + }, + { + "id": "GJlUSznzEHCgoAOrVrkp9", + "value": 13 + }, + { + "id": "B1845IfYfPMz2FWpVFIQv", + "value": 3 + }, + { + "id": "bDnuS19hfd9GhJ-6rjNPD", + "value": 3 + }, + { + "id": "CZrETqLgQlvDkLHvw1t_w", + "value": 3 + }, + { + "id": "7EsVGfapPc_38mHCBy3C3", + "value": 2 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_estoy.webp?alt=media&token=d46357be-23e9-44e0-8fd5-430f9542c817" + }, + "text": "estar", + "type": 3 + }, + { + "id": "bFodvUraUhJeq4waMdlxv", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/6478/6478_500.png" + }, + "text": "domingo", + "type": 6 + }, + { + "id": "bNJfccUvG2DQfR1iZP3eR", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fvibora.webp?alt=media&token=54e9f484-0f32-4510-8615-396956d6bb0c" + }, + "text": "serpiente", + "type": 2 + }, + { + "id": "bVN3R44VuZDw3IdQMolca", + "relations": [ + { + "id": "B1845IfYfPMz2FWpVFIQv", + "value": 2 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_cambiar.webp?alt=media&token=c5512652-c864-4bf1-bce2-3b6cd0290462" + }, + "text": "cambiar", + "type": 3 + }, + { + "id": "beNprvNb0UztxR4JLxDFm", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/37363/37363_500.png" + }, + "text": "cumpleaños", + "type": 6 + }, + { + "id": "bge6qR6NzsD5Vk4ifPsSO", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fketchup.webp?alt=media&token=5a6dcbbf-994c-4c27-aa9c-75a4e808465d" + }, + "tags": { + "HORA": [ + "MEDIODIA", + "NOCHE" + ] + }, + "text": "ketchup", + "type": 2 + }, + { + "id": "bpSuQQRlIcSse40OAxNSG", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/6554/6554_500.png" + }, + "text": "lunes", + "type": 6 + }, + { + "id": "bqjKW_qBtRzIThWxdZx2s", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/3105/3105_500.png" + }, + "text": "gafas de sol", + "type": 2 + }, + { + "id": "buyy_2ydocKoi9TnBhZ1N", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/8486/8486_500.png" + }, + "text": "amiga", + "type": 1 + }, + { + "id": "bw3rqHXD1TJ53xbNggEqH", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_desayuno.webp?alt=media&token=25948a6f-b4bd-4958-ad10-3ea868660416" + }, + "tags": { + "HORA": [ + "MANANA" + ] + }, + "text": "desayuno", + "type": 2 + }, + { + "id": "c7kK5ROVbO3DHrwSFEawq", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/32440/32440_500.png" + }, + "text": "dulce", + "type": 4 + }, + { + "id": "cI0JxwhkWU-YA7E7rmJtp", + "relations": [ + { + "id": "y_5OURnKxFcv4UiMKntUi", + "value": 2 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcuello.webp?alt=media&token=f84d7986-8ce0-4769-961b-33bc3d124434" + }, + "text": "cuello", + "type": 2 + }, + { + "id": "cJMQi3SVmqvWJ00VxI6gy", + "relations": [ + { + "id": "bDnuS19hfd9GhJ-6rjNPD", + "value": 2 + }, + { + "id": "CYH_6DL9q1iLLetuWeR9A", + "value": 1 + }, + { + "id": "O-CLnVuXAUapOn6TbdhKx", + "value": 1 + }, + { + "id": "3arbCGI6fMOWALLanZcg3", + "value": 1 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_como_estas.webp?alt=media&token=5580c46b-0516-413e-9c94-87a6c4d47410" + }, + "text": "¿cómo estás?", + "type": 5 + }, + { + "id": "cJw2i319mzBUpEfBRDxc9", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fatun.webp?alt=media&token=3268b4fa-6306-468c-b56e-dc3253ebaa6e" + }, + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ], + "HORA": [ + "MEDIODIA", + "NOCHE" + ] + }, + "text": "pez", + "type": 2 + }, + { + "id": "cJzHrV_PsV-PwwyFN9jka", + "relations": [ + { + "id": "AWJXh6URGN0Vwm66i6IvL", + "value": 62 + }, + { + "id": "BQm-YCPc0lfD1-mhecCTL", + "value": 36 + }, + { + "id": "FTngK946O8S8bYc0g7vM2", + "value": 35 + }, + { + "id": "ZnMba2r4XIg9lPi_H2d_Z", + "value": 11 + }, + { + "id": "UQ5B5K-tpk1XmQC1B9TjQ", + "value": 13 + }, + { + "id": "7iAXKVm22uMgr6aqZ1rr7", + "value": 14 + }, + { + "id": "Wva5W8GA0dHzyt2_0FPdm", + "value": 10 + }, + { + "id": "O-CLnVuXAUapOn6TbdhKx", + "value": 50 + }, + { + "id": "JFldbhjqxK3fD6D2K4HY4", + "value": 16 + }, + { + "id": "JZRBfIXBkeuobtDXbLt5t", + "value": 2 + }, + { + "id": "hKJhXxultsxm0TJl1P8-L", + "value": 1 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_action_previous.webp?alt=media&token=a6feccd4-fd34-4b5a-ac1d-a5f027551d44" + }, + "text": "%null%", + "type": 2 + }, + { + "id": "cS3g4KXf39akVFHCG5AwL", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcamion_de_juguete.webp?alt=media&token=95137b41-ea78-4a82-8fcc-9effdb9f08e5" + }, + "tags": { + "EDAD": [ + "NINO" + ] + }, + "text": "camión de juguete", + "type": 2 + }, + { + "id": "cTiw7_Yjxu_Kg90q7PdYl", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fzid_gripe.webp?alt=media&token=561b5a4b-f721-40e8-93d1-c4f73acc0044" + }, + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] + }, + "text": "gripe", + "type": 2 + }, + { + "id": "cb0rJJEYOeEoRU5fDdQQq", + "relations": [ + { + "id": "UnQJwWfWCe40DJYR1Er0o", + "value": 75 + }, + { + "id": "gsU8pE9ozhR73xS2icwJ0", + "value": 18 + }, + { + "id": "2CgcUkvJUskv982FvG54A", + "value": 10 + }, + { + "id": "UXJDiwb3j_zyfGa26ByJL", + "value": 9 + }, + { + "id": "2RZTRMX56BFLrW7tLJ3Hy", + "value": 8 + }, + { + "id": "kN85Lb_C4dLnww7sz1afK", + "value": 7 + }, + { + "id": "cI0JxwhkWU-YA7E7rmJtp", + "value": 7 + }, + { + "id": "3932Zm0xgk1hKB2hhBAUa", + "value": 6 + }, + { + "id": "pvXSy-5M4i8kysUppvdME", + "value": 6 + }, + { + "id": "0jpMJu8isUmOZKxhZ_yaj", + "value": 6 + }, + { + "id": "9U8MzceIsqKhG86oNx9zV", + "value": 5 + }, + { + "id": "Wu47Qs6Zupu1Ox2gUhkxn", + "value": 5 + }, + { + "id": "gvPwrzDSSEPwcxY878T_c", + "value": 4 + }, + { + "id": "g2sQSxCcoZuKJ3TabK6oT", + "value": 4 + }, + { + "id": "iowxE4MxcV6PR2Uhtvxqs", + "value": 4 + }, + { + "id": "mJqzbxYeIDQciPkeHA1Ao", + "value": 4 + }, + { + "id": "Vjlet5P7XuqTrc22nt_Zz", + "value": 4 + }, + { + "id": "Njz8DrErsexBu8mAI6mnr", + "value": 4 + }, + { + "id": "QZNQOaf0SdHDbx1otCmrH", + "value": 4 + }, + { + "id": "mZFwH8xY_OeVDWCdvPZBy", + "value": 4 + }, + { + "id": "ETZNYbrG5wveDl6c9k2_k", + "value": 4 + }, + { + "id": "Vzov0z9acB-I1_W_CcFcY", + "value": 3 + }, + { + "id": "N_893wsadpGg3Ip5sEThe", + "value": 3 + }, + { + "id": "CyKtU9yC0Jy7Ypb4WFp6w", + "value": 3 + }, + { + "id": "bw3rqHXD1TJ53xbNggEqH", + "value": 3 + }, + { + "id": "9mLx-YMK81AflitELQFqk", + "value": 3 + }, + { + "id": "PFAi3SdvH9vL7_Bg3MhCA", + "value": 3 + }, + { + "id": "1DjW-XvWN7iOqoJPRSWwY", + "value": 3 + }, + { + "id": "75gujwNXJdAiNmK6Ffhia", + "value": 3 + }, + { + "id": "Ubaq6h7wasdP_YRombm2c", + "value": 3 + }, + { + "id": "w4cVxbBDZjeNyHwpBARHQ", + "value": 3 + }, + { + "id": "UwvZVcX_CAQFrI6U4LsNT", + "value": 2 + }, + { + "id": "93hsW10TmX3Vcq_4IvcZ0", + "value": 2 + }, + { + "id": "xqGzZJIHBeVfSzRfm3rmg", + "value": 2 + }, + { + "id": "JziaulL-lrAPGNVvwBPK9", + "value": 2 + }, + { + "id": "PfNLmlHKFT9d1w6IgeXbU", + "value": 2 + }, + { + "id": "k9ZpWM4oRb1q20c0qWCsg", + "value": 2 + }, + { + "id": "jmzg4EiC7JEHwe9gNP3C3", + "value": 2 + }, + { + "id": "-LE2iv3Pwr5KuIyM5bYb3", + "value": 2 + }, + { + "id": "UQ-5wOfR0tDzljoDjj2xU", + "value": 2 + }, + { + "id": "LEg8z-Q-ONLAAXd-aH_Hb", + "value": 2 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fel.webp?alt=media&token=dafa6e53-8f89-4722-9fd5-ca4d1c942aea" + }, + "text": "el", + "type": 6 + }, + { + "id": "ccGASDOGtty6GfQMEEBEU", + "relations": [ + { + "id": "F90bXbc0tz9nuzTT7SgqV", + "value": 2 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ftres.webp?alt=media&token=52b1eca2-d7b8-470a-b252-bc815998c32e" + }, + "text": "tres", + "type": 6 + }, + { + "id": "cj6OuVw4Nob8jxP-E4rZc", + "relations": [ + { + "id": "q22wRFF21EigV8YzQ_MfV", + "value": 1 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_cambiarropa.webp?alt=media&token=2493ba44-ec6a-4811-8960-c3d9bebc608f" + }, + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] + }, + "text": "cambiarme la ropa", + "type": 3 + }, + { + "id": "cnyLFMkJu2i3cqOY0e9kl", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/8648/8648_500.png" + }, + "text": "pasas", + "type": 2 + }, + { + "id": "curstMeuThu2KUph-8rkB", + "relations": [ + { + "id": "yNag8CK0wV_iRMnFznsXk", + "value": 13 + }, + { + "id": "atWxG3KTHB5moW1dylLJc", + "value": 15 + }, + { + "id": "iiA1u1JKRmhe2jWVE_W79", + "value": 5 + }, + { + "id": "JFldbhjqxK3fD6D2K4HY4", + "value": 10 + }, + { + "id": "FTngK946O8S8bYc0g7vM2", + "value": 3 + }, + { + "id": "miPmA2tOQiLxOW7D_V_x6", + "value": 1 + }, + { + "id": "3KbwCHGooNLySWOBlFFuG", + "value": 1 + }, + { + "id": "YeT-jstVSA7-mD9t99Isg", + "value": 1 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_jugar.webp?alt=media&token=aba130c0-3439-4bcb-97b2-80adaaa645b5" + }, + "tags": { + "EDAD": [ + "JOVEN", + "NINO" + ] + }, + "text": "jugar con", + "type": 3 + }, + { + "id": "cxMNBGV3LytDXgwDMCiga", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_violeta.webp?alt=media&token=11f96684-2a3e-45b1-a014-36d9af8fc0fd" + }, + "tags": { + "EDAD": [ + "JOVEN", + "NINO" + ] + }, + "text": "violeta", + "type": 4 + }, + { + "id": "d4zNoj2BAFG9B7J3KAlLE", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fbotones.webp?alt=media&token=4ebeb788-7618-46be-9aaf-016d66fc298b" + }, + "tags": { + "EDAD": [ + "JOVEN", + "NINO" + ] + }, + "text": "botones", + "type": 2 + }, + { + "id": "d6s8fLFBiQ3KEJlNdJfUW", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_loco.webp?alt=media&token=ad86fdf3-5b8c-4af1-aed0-81052e3a6c96" + }, + "tags": { + "EDAD": [ + "JOVEN", + "NINO" + ] + }, + "text": "un poco loco", + "type": 4 + }, + { + "id": "dHM0qnbmtJAkZY0WBsqaY", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Flila.webp?alt=media&token=3b380965-52f2-4529-846f-45cf1c4fdf9c" + }, + "tags": { + "EDAD": [ + "JOVEN", + "NINO" + ], + "GENERO": [ + "MUJER" + ] + }, + "text": "lila", + "type": 4 + }, + { + "id": "dLHDzm0rfgL-vXTx14HSm", + "relations": [ + { + "id": "yNag8CK0wV_iRMnFznsXk", + "value": 1 + }, + { + "id": "Vjlet5P7XuqTrc22nt_Zz", + "value": 1 + }, + { + "id": "dgm3NCKuz7L39PX8LYxj7", + "value": 1 + }, + { + "id": "9kgRI3KlOIVSuylKffW9g", + "value": 2 + }, + { + "id": "q22wRFF21EigV8YzQ_MfV", + "value": 3 + }, + { + "id": "FTngK946O8S8bYc0g7vM2", + "value": 3 + }, + { + "id": "BQhqx1PuF94jwT0ySTlbJ", + "value": 2 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_buscar.webp?alt=media&token=ee3aa171-1a16-4563-a8c5-a9c4c32c8748" + }, + "text": "buscar", + "type": 3 + }, + { + "id": "dNvN5P787hAPE7ZYNgwkw", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_pasear.webp?alt=media&token=8ce622f4-a514-462a-bdb1-792e0c85863b" + }, + "text": "pasear", + "type": 3 + }, + { + "id": "dR72liRxC3qmoSa6Dz2a2", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fjarabe.webp?alt=media&token=b806ca7f-fa06-4b8d-830b-ff601799ed55" + }, + "text": "jarabe", + "type": 2 + }, + { + "id": "dS-KyYREUQIk7sDlmsvoa", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/30383/30383_500.png" + }, + "text": "cerca", + "type": 4 + }, + { + "id": "d_I8jNfbkQD0CHgZn7hyB", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcamisas.webp?alt=media&token=77ef1c19-9414-4fa7-b3e4-b0e304c724c2" + }, + "text": "camisa", + "type": 2 + }, + { + "id": "dgm3NCKuz7L39PX8LYxj7", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fjuguetes.webp?alt=media&token=046c8f8b-7518-4aac-9c56-6ac6fe4a03ef" + }, + "tags": { + "EDAD": [ + "NINO" + ] + }, + "text": "juguetes", + "type": 2 + }, + { + "id": "djgKI9embnk95PAtFcn45", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_cambiarpanal.webp?alt=media&token=42b1f845-854d-4b29-aaf9-f228302deb64" + }, + "tags": { + "EDAD": [ + "NINO" + ] + }, + "text": "cambiarme el pañal", + "type": 3 + }, + { + "id": "dn41o5K_1fo-qHO-YLoQn", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/6605/6605_500.png" + }, + "text": "sábado", + "type": 6 + }, + { + "id": "dnXsSOeVG7mq37uciIi2J", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/38213/38213_500.png" + }, + "text": "recreo", + "type": 2 + }, + { + "id": "e5sCl246xFMESEfFy2PhX", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/2304/2304_500.png" + }, + "text": "coche", + "type": 2 + }, + { + "id": "e5un1yrIuZHQi048e5kD6", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/4636/4636_500.png" + }, + "text": "alfajores", + "type": 2 + }, + { + "id": "e8zl_ecIloo4Vk-OZPJWe", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fjugar_con_la_tablet.webp?alt=media&token=9e30d1b6-ab88-463f-a30f-c1d4b199dcdc" + }, + "tags": { + "EDAD": [ + "JOVEN", + "NINO" + ] + }, + "text": "jugar con la tablet", + "type": 3 + }, + { + "id": "eDX2HSkGaY2TeVwPjR07S", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/4645/4645_500.png" + }, + "text": "fácil", + "type": 4 + }, + { + "id": "eGJ8MC1xPE6ueF82jCmVg", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/5425/5425_500.png" + }, + "text": "cepillar", + "type": 3 + }, + { + "id": "eKJCZc-kD0-m6cVLorFzO", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpera.webp?alt=media&token=2feac2ab-b589-4815-96d9-366a2a2a4c4e" + }, + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ], + "HORA": [ + "MEDIODIA", + "NOCHE" + ] + }, + "text": "pera", + "type": 2 + }, + { + "id": "eWSI1NInbQowtO99phhGA", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fboca.webp?alt=media&token=7e81102f-105b-4d12-9aaa-75ad145bbf4a" + }, + "tags": { + "EDAD": [ + "JOVEN", + "NINO" + ] + }, + "text": "boca", + "type": 2 + }, + { + "id": "eZEqRZjRK8JJMsfHo4Y7w", + "relations": [ + { + "id": "mZFwH8xY_OeVDWCdvPZBy", + "value": 5 + }, + { + "id": "9U8MzceIsqKhG86oNx9zV", + "value": 2 + }, + { + "id": "pvXSy-5M4i8kysUppvdME", + "value": 2 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fdel.webp?alt=media&token=b3f31b71-2488-4636-a036-e420dc519c2f" + }, + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] + }, + "text": "del", + "type": 6 + }, + { + "id": "ebo03xnkyiHD2pKUKULmr", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_dibujos_animados.webp?alt=media&token=7849908a-4329-4361-ac52-f583f345b9d7" + }, + "tags": { + "EDAD": [ + "NINO" + ] + }, + "text": "dibujos animados", + "type": 2 + }, + { + "id": "ecUOs24Pp5ZTRt_ZvED5W", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_acompanar.webp?alt=media&token=dcd36ffa-bfb6-412e-a368-d6a60815e93b" + }, + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] + }, + "text": "acompañar", + "type": 3 + }, + { + "id": "eduqLSyC3m4uB1Oee6dt6", + "relations": [ + { + "id": "B1845IfYfPMz2FWpVFIQv", + "value": 3 + }, + { + "id": "eZEqRZjRK8JJMsfHo4Y7w", + "value": 2 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fmedia.webp?alt=media&token=810240c1-a6a0-4c66-972f-9201c730dd4c" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "mitad", + "type": 4 }, { - "id": 627, - "texto": { - "en": "teacher", - "es": "maestro" + "id": "eji-M2j5eHkG71DCksleY", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fhuevo_duro.webp?alt=media&token=ad859492-0aaf-4e9e-aba7-58035b34b92e" }, - "tipo": 1, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fmaestro.webp?alt=media&token=00e6a3c7-c0da-4de3-9ac0-82642de9f4e9" + "tags": { + "HORA": [ + "MEDIODIA", + "NOCHE" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "huevo duro", + "type": 2 }, { - "id": 628, - "texto": { - "en": "mom", - "es": "mamá" - }, - "tipo": 1, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_mama.webp?alt=media&token=190be130-d7dd-4e30-80cb-d010a247ff67" - }, - "relacion": [ + "id": "emm_RirDsO30Enax5Q4gd", + "relations": [ + { + "id": "KXHW4m6vXxQU-AEOR4pZ4", + "value": 1 + }, + { + "id": "cb0rJJEYOeEoRU5fDdQQq", + "value": 20 + }, + { + "id": "rxdfuk6egO7VmZEB3JrUN", + "value": 11 + }, { - "id": 44, - "frec": 18 + "id": "Vjlet5P7XuqTrc22nt_Zz", + "value": 3 }, { - "id": 22, - "frec": 4 + "id": "paPpjw1XVC9-6xcueJsrY", + "value": 2 }, { - "id": 49, - "frec": 6 + "id": "Y5HQq_4crSF2lpwH-KUrt", + "value": 2 }, { - "id": 378, - "frec": 6 + "id": "UnQJwWfWCe40DJYR1Er0o", + "value": 2 }, { - "id": 14, - "frec": 10 + "id": "0cdYDZ5HPaTmqTTN0_Ee8", + "value": 2 } ], - "agenda": 0, - "gps": 0, - "esSugerencia": false + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcon_prep.webp?alt=media&token=4649b3b9-e248-4048-8949-fd75c423a3e3" + }, + "text": "con", + "type": 6 }, { - "id": 629, - "texto": { - "en": "medic", - "es": "médico" - }, - "tipo": 1, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_medico.webp?alt=media&token=a89f8154-0460-4e0b-b350-d447325021d3https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_medico.webp?alt=media&token=a89f8154-0460-4e0b-b350-d447325021d3" + "id": "eo3Q5AjHJz5kp1EbdALwh", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/7307/7307_500.png" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "ustedes", + "type": 1 }, { - "id": 630, - "texto": { - "en": "boy", - "es": "niño" + "id": "eoYtISVZl3mdwoE_HW-Mv", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fguitarra.webp?alt=media&token=702e15f5-2020-43b4-a4a0-339de944b32c" }, - "tipo": 1, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fnino.webp?alt=media&token=f9c17702-4712-41f1-b72f-31e9919a0b5d" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "guitarra", + "type": 2 }, { - "id": 631, - "texto": { - "en": "girl", - "es": "niña" + "id": "et1KiL5-zob_EcGlj7tLN", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fdespues.webp?alt=media&token=5e7ca0db-5aa6-40d1-a0f2-6fa71c76e76e" }, - "tipo": 1, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fnina.webp?alt=media&token=6c9fe38c-bcda-432d-9ec6-5fb53b127f69" - }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "despues", + "type": 6 }, { - "id": 632, - "texto": { - "en": "dad", - "es": "papá" + "id": "f2dl12fMZbRdQ7STpcTdk", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_futbol.webp?alt=media&token=50db7655-7aff-4f93-9b68-875cc5706c7a" }, - "tipo": 1, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_papa.webp?alt=media&token=47ca6188-b568-4a92-bbcd-138781aff945" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ], + "GENERO": [ + "HOMBRE" + ] }, - "relacion": [ - { - "id": 44, - "frec": 16 - }, - { - "id": 22, - "frec": 5 - }, - { - "id": 378, - "frec": 1 - }, - { - "id": 14, - "frec": 1 - } - ], - "agenda": 0, - "gps": 0, - "esSugerencia": false + "text": "fútbol", + "type": 2 }, { - "id": 633, - "texto": { - "en": "people", - "es": "personas" + "id": "fF3ijeQzetfSn6EGcs1yY", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcerezas.webp?alt=media&token=5f66d7cb-c4c8-4c5e-b05f-7d48ac3f05e6" }, - "tipo": 1, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpersonas.webp?alt=media&token=a5223e39-5426-4728-beda-8579fbc82adf" + "tags": { + "HORA": [ + "MEDIODIA", + "NOCHE" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "cerezas", + "type": 2 }, { - "id": 635, - "texto": { - "en": "princess", - "es": "princesa" + "id": "fL_4POdbPVL9-lvQVWSqY", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/6924/6924_500.png" }, - "tipo": 1, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fprincesa.webp?alt=media&token=73c9d26b-a83c-4f75-9c1d-ae8661899d86" + "text": "avión de juguete", + "type": 2 + }, + { + "id": "fNAlqbgrpirQZO_LhrkXY", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fprimavera.webp?alt=media&token=aaea64e6-61c9-4c6d-8357-ec36fb5e9031" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] + }, + "text": "primavera", + "type": 2 }, { - "id": 638, - "texto": { - "en": "Queen", - "es": "reina" + "id": "fNv4Nb6Vafxk0JxXr-iDo", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Finvestigar.webp?alt=media&token=30a04dc5-cd12-4eaf-bb84-690f12b997ee" }, - "tipo": 1, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Freina.webp?alt=media&token=4c3c92ca-ab20-4bb3-b800-229033025084" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "investigar", + "type": 3 }, { - "id": 639, - "texto": { - "en": "King", - "es": "rey" + "id": "fUUj_4pKPflmJlxZfk0cX", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fdiscoteca.webp?alt=media&token=e24b6b94-cc28-4cf0-b694-e59ad19adbec" }, - "tipo": 1, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Frey.webp?alt=media&token=6c6b9e6f-f61e-40b2-ab1b-9e2c52988a76" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ], + "HORA": [ + "NOCHE" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "discoteca", + "type": 2 }, { - "id": 640, - "texto": { - "en": "taxi driver", - "es": "taxista" + "id": "ff7ES190q1dmFYZ7lo6x0", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpan_blanco.webp?alt=media&token=ee91777b-6221-4dfa-a962-8307735c83bc" }, - "tipo": 1, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ftaxista.webp?alt=media&token=b4ac3631-1c95-47ed-a3f2-2dde435b3448" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ], + "HORA": [ + "MANANA", + "MEDIODIA" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "pan blanco", + "type": 2 }, { - "id": 642, - "texto": { - "en": "you", - "es": "vos" + "id": "fjCOcN-PKP6F07IZcI71X", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fplaza.webp?alt=media&token=ad247196-bec9-4017-ae34-7a7b62a5ab32" }, - "tipo": 1, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_tu.webp?alt=media&token=6e51dc01-7d7f-48b2-80e9-8e3930009a9b" + "tags": { + "EDAD": [ + "JOVEN", + "NINO" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "plaza", + "type": 2 }, { - "id": 643, - "texto": { - "en": "I", - "es": "yo" + "id": "fkNwVm56PSe-qh-QoM0vm", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_alla.webp?alt=media&token=1c3baab3-4166-47fe-8e37-ade8bcf2c564" }, - "tipo": 1, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_yo.webp?alt=media&token=9860a758-6779-438b-9ca3-49dfb28607e0" + "text": "allá", + "type": 2 + }, + { + "id": "fk_z_HrvcUh8XIq8D6gQP", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/2880/2880_500.png" }, - "relacion": [ - { - "id": 22, - "frec": 4 - }, - { - "id": 44, - "frec": 22 - }, + "text": "nueces", + "type": 2 + }, + { + "id": "g1Cj6HW8kg8yPE1XX9pxa", + "relations": [ { - "id": 49, - "frec": 10 + "id": "cb0rJJEYOeEoRU5fDdQQq", + "value": 4 } ], - "agenda": 0, - "gps": 0, - "esSugerencia": false + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fdesde.webp?alt=media&token=005cccd6-1a3d-4a79-a1df-c3be054e023c" + }, + "text": "desde", + "type": 6 }, { - "id": 644, - "texto": { - "en": "here", - "es": "acá" + "id": "g1TLUpuQX2Zs1ob9gqYui", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fgorro.webp?alt=media&token=7d67441b-5c98-4de4-b963-9dbcaed92805" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_aca.webp?alt=media&token=0758a4e6-5f77-4dd8-a599-075c1823a9ce" + "tags": { + "EDAD": [ + "JOVEN", + "NINO" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "gorro", + "type": 2 }, { - "id": 646, - "texto": { - "en": "airport", - "es": "aeropuerto" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Faeropuerto.webp?alt=media&token=2f7b5699-6a42-43ec-bcdb-e4bb6283fe4f" + "id": "g2MhHawoIC9oFNEv5_w63", + "relations": [ + { + "id": "wkrNPLGWTqMIy4PJRW9QR", + "value": 2 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fvida.webp?alt=media&token=4082f898-9a1c-4dcc-b77c-d9908df532af" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "vida", + "type": 6 }, { - "id": 648, - "texto": { - "en": "there", - "es": "allá" + "id": "g2sQSxCcoZuKJ3TabK6oT", + "relations": [ + { + "id": "93hsW10TmX3Vcq_4IvcZ0", + "value": 5 + }, + { + "id": "B1845IfYfPMz2FWpVFIQv", + "value": 3 + }, + { + "id": "CZrETqLgQlvDkLHvw1t_w", + "value": 2 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fvino.webp?alt=media&token=e1cadaf5-7b3c-444b-bb61-3d971efb0991" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_alla.webp?alt=media&token=1c3baab3-4166-47fe-8e37-ade8bcf2c564" + "tags": { + "EDAD": [ + "ADULTO" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "vino", + "type": 2 }, { - "id": 649, - "texto": { - "en": "Pub", - "es": "bar" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fbar.webp?alt=media&token=ee953361-583a-4181-8fe7-735b7814e951" + "id": "g75y4E53ViakV-s5UfnIF", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/8562/8562_500.png" }, - "relacion": [], - "agenda": 0, - "gps": 0, - "edad": [ - "ADULTO" - ] + "text": "equipaje", + "type": 2 }, { - "id": 650, - "texto": { - "en": "bike shop", - "es": "una bicicletería" + "id": "gFEnqFhYoXF7QN-n0ONad", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/2909/2909_500.png" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ftienda_de_bicicletas.webp?alt=media&token=ee06d1a7-260f-4eab-bf25-831be398cd64" - }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "montaña", + "type": 2 }, { - "id": 651, - "texto": { - "en": "field", - "es": "la cancha" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcancha.webp?alt=media&token=bd539ba6-3e6c-4441-b5d2-cd52a7922a69" + "id": "gYrIz3R13-BC_pYcvQ9BL", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/5493/5493_500.png" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "invierno", + "type": 6 }, { - "id": 653, - "texto": { - "en": "house", - "es": "casa" + "id": "gaem1LHTtfQdnnqYi-sOm", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_billetera.webp?alt=media&token=287d976d-97fa-4d7f-a67b-a01e884f1539" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_casa.webp?alt=media&token=f1d197b6-db37-44e6-b4bc-8ba31b0fa4aa" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0, - "esSugerencia": false + "text": "billetera", + "type": 2 }, { - "id": 656, - "texto": { - "en": "city", - "es": "ciudad" + "id": "gff2FqDlgXknRld7YMLWl", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fentero.webp?alt=media&token=0007ed58-3331-4cac-accf-7a00491abac0" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fciudad.webp?alt=media&token=e57e17e4-6d75-47fe-9fc9-5465ca130261" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "entero", + "type": 4 }, { - "id": 657, - "texto": { - "en": "dinning room", - "es": "comedor" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_comedor.webp?alt=media&token=eb71846a-eef3-4c0d-aabd-026e7b716e00" + "id": "gsU8pE9ozhR73xS2icwJ0", + "relations": [ + { + "id": "wkrNPLGWTqMIy4PJRW9QR", + "value": 5 + }, + { + "id": "B1845IfYfPMz2FWpVFIQv", + "value": 2 + }, + { + "id": "pvXSy-5M4i8kysUppvdME", + "value": 2 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Flibro.webp?alt=media&token=ce9ae11b-a7e1-48ae-bc73-36358db5e1ec" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "libro", + "type": 2 }, { - "id": 660, - "texto": { - "en": "bathroom", - "es": "cuarto de baño" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_lugarbanio.webp?alt=media&token=d0a972ae-70d9-4636-9fc1-9da26af74026" + "id": "gvPwrzDSSEPwcxY878T_c", + "relations": [ + { + "id": "wkrNPLGWTqMIy4PJRW9QR", + "value": 2 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fgato.webp?alt=media&token=49aa560c-4b75-4bba-84dd-7829fec81abe" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "gato", + "type": 2 }, { - "id": 661, - "texto": { - "en": "disco", - "es": "la discoteca" + "id": "gzCjycNS8Cf0vNlo1klji", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fme_molesta_el_ruido.webp?alt=media&token=1614de99-ce1d-4536-b826-7e79108d0526" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fdiscoteca.webp?alt=media&token=e24b6b94-cc28-4cf0-b694-e59ad19adbec" - }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "molesto", + "type": 4 }, { - "id": 662, - "texto": { - "en": "school", - "es": "escuela" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_escuela.webp?alt=media&token=05c5460c-c3a5-4404-9389-d6a67e79bb5d" + "id": "gzb-RNDLMNkgk9wnPILJi", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/23710/23710_500.png" }, - "relacion": [], - "agenda": 0, - "gps": 0, - "esSugerencia": false + "text": "abuela", + "type": 1 }, { - "id": 666, - "texto": { - "en": "Burger shop", - "es": "hamburguesería" + "id": "hAZhogJSH3bL1iL237N8J", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_palomitas.webp?alt=media&token=f85af19c-2583-4c1a-83d0-bf55b275a45c" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fhamburgueseria.webp?alt=media&token=54beeb1d-8901-472f-ac33-aa906e18627a" + "tags": { + "EDAD": [ + "JOVEN", + "NINO" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "pochoclos", + "type": 2 }, { - "id": 668, - "texto": { - "en": "hospital", - "es": "hospital" + "id": "hDvpMlPw-chcuxEisBJTl", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcastanas.webp?alt=media&token=604b50af-9328-4c81-bae0-57674e510117" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fhospital.webp?alt=media&token=03e15e0e-b1ee-4446-adf5-f13fc1cab51d" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ], + "HORA": [ + "MANANA" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0, - "esSugerencia": false + "text": "castañas", + "type": 2 }, { - "id": 672, - "texto": { - "en": "garden", - "es": "jardín" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fjardin.webp?alt=media&token=cbca3a9b-3073-4eb3-8b68-ef2bcf079d76" + "id": "hKJhXxultsxm0TJl1P8-L", + "relations": [ + { + "id": "C29KJ8BTFavhj_R9UfnSv", + "value": 33 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_gracias.webp?alt=media&token=520ea249-7aa3-407e-99b7-259e1e44ec41" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "chau", + "type": 5 }, { - "id": 675, - "texto": { - "en": "market", - "es": "mercado" + "id": "hOyjT1JgOYB-mGLFMaNJR", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fzid_dolor_de_pecho.webp?alt=media&token=90df8549-8eb6-4006-959a-b51b4a8481d7" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fmercado.webp?alt=media&token=bd72176b-1f7d-453b-9f33-dbc5ad38ae7e" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ], + "GENERO": [ + "HOMBRE" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "dolor de pecho", + "type": 2 }, { - "id": 678, - "texto": { - "en": "yard", - "es": "patio" + "id": "hT3Lrjn5-q7YIM1loG4MN", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/37438/37438_500.png" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_patio.webp?alt=media&token=776f4a4a-6d91-4221-90ac-3325636f908e" - }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "parlante", + "type": 2 }, { - "id": 679, - "texto": { - "en": "Pizza shop", - "es": "pizzería" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpizzeria.webp?alt=media&token=c8b53f71-6c9d-4084-92e1-46b148ee00c0" + "id": "hUYfE_vmNBT_7E60YZsSu", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/35137/35137_500.png" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "pintura", + "type": 2 }, { - "id": 680, - "texto": { - "en": "Poultry shop", - "es": "pollería" + "id": "hWWOw1gWjWwN7wQJkHrTu", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/9002/9002_500.png" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpolleria.webp?alt=media&token=e4684ecb-a406-4b62-8940-4daced7e368d" - }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "tour", + "type": 2 }, { - "id": 682, - "texto": { - "en": "square", - "es": "la plaza" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fplaza.webp?alt=media&token=ad247196-bec9-4017-ae34-7a7b62a5ab32" + "id": "hXgGhazQ_nA5uqpRD6Qwq", + "relations": [ + { + "id": "2CgcUkvJUskv982FvG54A", + "value": 2 + }, + { + "id": "cb0rJJEYOeEoRU5fDdQQq", + "value": 2 + }, + { + "id": "ajesFjbC7hwCNLKdif-ix", + "value": 2 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_ganar.webp?alt=media&token=07cd9657-3510-44de-9bdd-16544b5bf73f" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "ganar", + "type": 3 }, { - "id": 685, - "texto": { - "en": "Restaurant", - "es": "restaurante" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Frestaurante.webp?alt=media&token=57ed6d5c-fa5f-41c1-b779-28294311e772" + "id": "hmhAUgqvGp7nc1w25sRSx", + "relations": [ + { + "id": "T_Q5c4XAfkhkclmnCGHo5", + "value": 4 + }, + { + "id": "wkrNPLGWTqMIy4PJRW9QR", + "value": 2 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fesperar.webp?alt=media&token=c877c0c0-b425-4f97-8650-7b5c22b5c0c2" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "esperar", + "type": 3 }, { - "id": 687, - "texto": { - "en": "traffic light", - "es": "semáforo" + "id": "hwzwfMyJsvB42F_QWQWyi", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fzumo_de_uva.webp?alt=media&token=15b7e370-22b3-41b8-9946-8fb91f053c48" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fsemaforo.webp?alt=media&token=eb4320ad-dc97-4847-941a-d2b055da30cc" + "tags": { + "EDAD": [ + "NINO" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "jugo de uva", + "type": 2 }, { - "id": 688, - "texto": { - "en": "supermarket", - "es": "un supermercado" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fsupermercado.webp?alt=media&token=f5c6e8ce-3c97-40b0-860a-ad5d02a0bf7e" + "id": "hyUaYltGVJU-wRrAjhhPa", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/4585/4585_500.png" }, - "relacion": [], - "agenda": 0, - "gps": 0, - "esSugerencia": false + "text": "cantante", + "type": 1 }, { - "id": 698, - "texto": { - "en": "greengrocery", - "es": "verdulería" + "id": "i0wB--S4sdL8Q4H9b93UY", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Facido.webp?alt=media&token=472e6bbd-dc9b-4ab1-86f1-8f66dea4e558" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fverduleria.webp?alt=media&token=be70aebe-bc45-4ab1-9dcf-a0531a26a7be" + "tags": { + "EDAD": [ + "ADULTO" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "ácido", + "type": 4 }, { - "id": 700, - "texto": { - "en": "Blockbuster", - "es": "videoclub" + "id": "i2mlV3zGS6nrH2l6N2BlZ", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ftrompeta.webp?alt=media&token=e670470a-5b54-4e66-a80e-bf6a11e10863" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fvideoclub.webp?alt=media&token=c1b47059-a6c9-4fb2-ac5f-38cfaf94a82d" + "tags": { + "EDAD": [ + "JOVEN" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "trompeta", + "type": 2 }, { - "id": 702, - "texto": { - "en": "friendship", - "es": "amistad" + "id": "iAqItRUQL_YpbMn2pgjsA", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpizzeria.webp?alt=media&token=c8b53f71-6c9d-4084-92e1-46b148ee00c0" }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Famistad.webp?alt=media&token=4ac81414-1b57-4607-89d0-1dcb7f066355" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ], + "HORA": [ + "NOCHE" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "pizzería", + "type": 2 }, { - "id": 703, - "texto": { - "en": "help", - "es": "ayuda" + "id": "ibtmTEP3QGDY8TyVLteuX", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fblando.webp?alt=media&token=075e9135-a115-4836-acde-c098d21cc4a4" }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fayuda.webp?alt=media&token=a952e524-1a73-4105-ad7b-38925f2abe45" - }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "blando", + "type": 4 }, { - "id": 704, - "texto": { - "en": "celebration", - "es": "celebración" + "id": "ifd0M0pAlFm7aPt1A0ze_", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Famar.webp?alt=media&token=4080adb7-3ce9-4759-864c-7f676f3a95b1" }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcelebracion.webp?alt=media&token=41b124b1-e168-4f46-a3d9-5ee24c13649d" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "amar", + "type": 3 }, { - "id": 706, - "texto": { - "en": "fulfillment", - "es": "cumplimiento" - }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcumplimiento.webp?alt=media&token=971b0f6d-fec4-4155-aca0-3145f1a8c8bf" + "id": "iiA1u1JKRmhe2jWVE_W79", + "relations": [ + { + "id": "B1845IfYfPMz2FWpVFIQv", + "value": 2 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_amigos.webp?alt=media&token=01d03271-5536-4654-ab0d-a938a1b432db" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "amigos", + "type": 1 }, { - "id": 707, - "texto": { - "en": "description", - "es": "descripción" + "id": "iimGxVoFWlq_THThR3vmF", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_canal_noticiero.webp?alt=media&token=94107da2-251c-41eb-9a7c-2a41971e9a11" }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fdescripcion.webp?alt=media&token=4dbde8ba-f144-4a12-90f6-013bf68d912d" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "noticias", + "type": 2 }, { - "id": 708, - "texto": { - "en": "Personal hygiene", - "es": "higiene personal" - }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fhigiene_personal.webp?alt=media&token=d822b484-feb9-4a37-a9f0-ed53e9b3584f" + "id": "ijn-QwQuTxRFFVe-7WlSX", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/11356/11356_500.png" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "picazón", + "type": 2 }, { - "id": 712, - "texto": { - "en": "physical abuse", - "es": "maltrato físico" + "id": "iowxE4MxcV6PR2Uhtvxqs", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fhospital.webp?alt=media&token=03e15e0e-b1ee-4446-adf5-f13fc1cab51d" }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fmaltrato_fisico.webp?alt=media&token=dbf253eb-4088-4bb6-ab66-42069cdc3ae9" + "tags": { + "EDAD": [ + "ADULTO" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "hospital", + "type": 2 }, { - "id": 713, - "texto": { - "en": "verbal abuse", - "es": "maltrato verbal" + "id": "irbOv2dHA7G969dnJMfJn", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_cuaderno.webp?alt=media&token=8a9f694c-56c6-4050-86cc-88a2e8f339e2" }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fmaltrato_verbal.webp?alt=media&token=7fe36de4-c1f4-4ac9-ad65-9a24c137cfce" + "tags": { + "EDAD": [ + "JOVEN", + "NINO" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "cuaderno", + "type": 2 }, { - "id": 714, - "texto": { - "en": "plural", - "es": "plurales" + "id": "islCzqFq1SYrZAh63dLhQ", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fhuevo_frito.webp?alt=media&token=481b1c1d-6856-4c97-b41d-90500a683e99" }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fplurales.webp?alt=media&token=99818cbc-fc14-4a3c-ada6-b113b53542ec" + "tags": { + "EDAD": [ + "ADULTO" + ], + "HORA": [ + "MEDIODIA", + "NOCHE" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "huevo frito", + "type": 2 }, { - "id": 718, - "texto": { - "en": "rehab", - "es": "rehabilitación" + "id": "j5xZZev5nTNa-p088Oqnp", + "relations": [ + { + "id": "CZrETqLgQlvDkLHvw1t_w", + "value": 2 + } + ], + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/6062/6062_500.png" }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Frehabilitacion.webp?alt=media&token=da4746ed-7fe5-48b5-afde-a59d382c5024" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "besar", + "type": 3 }, { - "id": 721, - "texto": { - "en": "series", - "es": "serie" + "id": "jBqD3qhhcrioLlCU-xq5b", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Finstrumentos.webp?alt=media&token=b58a39b2-6c69-4b19-8658-8a6a4fe7ca2a" }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fserie.webp?alt=media&token=1388c38c-f90f-429d-b241-f4cd45987736" + "tags": { + "EDAD": [ + "JOVEN", + "NINO" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "instrumentos musicales", + "type": 2 }, { - "id": 722, - "texto": { - "en": "feelings", - "es": "sentimientos" + "id": "jOALQbfxdXmJVyY6P5gZG", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fdamasco.webp?alt=media&token=0abf4e01-36e5-441f-8e1b-a60e6dd56809" }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fsentimientos.webp?alt=media&token=90954fb0-bf68-48fe-8f12-d9dfc21963da" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ], + "HORA": [ + "TARDE" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "damasco", + "type": 2 }, { - "id": 725, - "texto": { - "en": "surprise", - "es": "sorpresa" + "id": "jTEb3A5ZEKEy2ojuq2vO_", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fhuesos.webp?alt=media&token=5a5cf2e5-3784-4bd4-981a-8a1f4b0ea629" }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fsorpresa.webp?alt=media&token=27ad6998-250d-4aa3-8e2b-8f0c55525c2d" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "hueso", + "type": 2 }, { - "id": 728, - "texto": { - "en": "verbs", - "es": "verbos" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fverbos.webp?alt=media&token=f32aaaf1-44aa-49d3-a0ed-981ba01564d5" + "id": "jeO9YZ22LfSObUNhQDRAz", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/24465/24465_500.png" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "ventana", + "type": 2 }, { - "id": 729, - "texto": { - "en": "shame", - "es": "vergüenza" + "id": "jfly9fZ3x1da4SGCCNcV2", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fbufandas.webp?alt=media&token=2a6e67eb-235e-4668-9b7f-2c656f174ffc" }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fverguenza.webp?alt=media&token=fec28338-c19b-4c65-ac5b-766011b26e46" + "tags": { + "HORA": [ + "NOCHE" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0, - "esSugerencia": false + "text": "bufanda", + "type": 2 }, { - "id": 730, - "texto": { - "en": "life", - "es": "vida" + "id": "jfvreGZv-e8rD4-01wZ5H", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fvenda.webp?alt=media&token=e72b4a6f-825c-47bd-bd4b-5aae4ebd0ed1" }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fvida.webp?alt=media&token=4082f898-9a1c-4dcc-b77c-d9908df532af" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "venda", + "type": 2 }, { - "id": 731, - "texto": { - "en": "visit", - "es": "visita" + "id": "jhJ2TOfdaRAcVeHGOjwua", + "relations": [ + { + "id": "wkrNPLGWTqMIy4PJRW9QR", + "value": 3 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fleche.webp?alt=media&token=819236fb-c7ba-4624-a964-194f9197bc1f" }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fvisita.webp?alt=media&token=4767c963-69f9-4565-b120-b25e2a09dd62" + "tags": { + "HORA": [ + "MANANA", + "TARDE" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "leche", + "type": 2 }, { - "id": 732, - "texto": { - "en": "tour", - "es": "paseo" + "id": "jmzg4EiC7JEHwe9gNP3C3", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fzid_arroz.webp?alt=media&token=fd394581-3a2b-4875-bd2c-f907496ebd9b" }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpaseo.webp?alt=media&token=2cc070cb-cb0b-4491-9a5b-0fdb66bf00ab" + "tags": { + "HORA": [ + "MEDIODIA", + "NOCHE" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "arroz", + "type": 2 }, { - "id": 733, - "texto": { - "en": "Yellow", - "es": "amarillo" + "id": "jpKPg3hn6_GO1HSkeLNGz", + "relations": [ + { + "id": "B1845IfYfPMz2FWpVFIQv", + "value": 2 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fnina.webp?alt=media&token=6c9fe38c-bcda-432d-9ec6-5fb53b127f69" }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_amarillo.webp?alt=media&token=26bb22a3-04f2-4cb6-b185-06bcdf430c97" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "niña", + "type": 1 }, { - "id": 734, - "texto": { - "en": "Blue", - "es": "azul" + "id": "jprAsdXWGQKPlUWwgBBot", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpelicula.webp?alt=media&token=0668824c-95f4-4e4b-a7df-7c062b988073" }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_azul.webp?alt=media&token=9661fb07-6a30-4b2d-9b0d-38cc305fc6e0" - }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "película", + "type": 2 }, { - "id": 736, - "texto": { - "en": "White", - "es": "blanco" + "id": "jtKc2q2n5an342ZkiMB9R", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fhigiene_personal.webp?alt=media&token=d822b484-feb9-4a37-a9f0-ed53e9b3584f" }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_blanco.webp?alt=media&token=1f42fc7a-4032-41c3-a9ce-976ff07012ad" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "higiene personal", + "type": 6 }, { - "id": 737, - "texto": { - "en": "Colors", - "es": "colores" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_colores.webp?alt=media&token=04309e00-d682-43f3-9605-bde0b5b4ab9a" + "id": "k-iDOTk5uO7ZK5OB3v8It", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fviejo.webp?alt=media&token=da1f540c-5a60-4370-8804-d4bd7bc8a114" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "viejo", + "type": 4 }, { - "id": 738, - "texto": { - "en": "Gold", - "es": "dorado" + "id": "k41gkf6A_bDtQAJDOrWpP", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/30086/30086_500.png" }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fdorado.webp?alt=media&token=2da74e47-082e-40a8-a5e8-9f17d2ad06c0" - }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "pasta de dientes", + "type": 2 }, { - "id": 739, - "texto": { - "en": "Gray", - "es": "gris" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_gris.webp?alt=media&token=9075f69e-3085-4894-b7a3-2f556bc6bb27" + "id": "k7dZhQtwDPFlOk1iPjEOz", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/6218/6218_500.png" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "subir volumen", + "type": 3 }, { - "id": 740, - "texto": { - "en": "Purple", - "es": "lila" + "id": "k8tJx6PikRcnVuZEqrXRM", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fviajar.webp?alt=media&token=ccfef1e5-8011-4c79-8b69-f2b136b1b0b9" }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Flila.webp?alt=media&token=3b380965-52f2-4529-846f-45cf1c4fdf9c" - }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "viajar", + "type": 3 }, { - "id": 742, - "texto": { - "en": "Orange", - "es": "naranja" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_naranja.webp?alt=media&token=72d9eae2-64ae-41e4-94ad-45b57e3e0c6f" + "id": "k9ZpWM4oRb1q20c0qWCsg", + "relations": [ + { + "id": "wkrNPLGWTqMIy4PJRW9QR", + "value": 2 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fabrigos.webp?alt=media&token=64ed9ddd-1b04-40b4-922e-3280d633c0fe" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "abrigo", + "type": 2 }, { - "id": 743, - "texto": { - "en": "Black", - "es": "negro" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_negro.webp?alt=media&token=4a94ed36-a674-4a54-835d-5e53b49c2a79" + "id": "kDzHKO8eIwNsyKWDw7M0c", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/34120/34120_500.png" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "uva", + "type": 2 }, { - "id": 744, - "texto": { - "en": "Silver", - "es": "plateado" + "id": "kIn8SeGURyvu49EsRqDs7", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/2522/2522_500.png" }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fplateado.webp?alt=media&token=b0286d9e-a044-4045-9ece-113d2e3547a5" - }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "pijama", + "type": 2 }, { - "id": 745, - "texto": { - "en": "What color it is?", - "es": "¿Qué color es?" + "id": "kN85Lb_C4dLnww7sz1afK", + "relations": [ + { + "id": "emm_RirDsO30Enax5Q4gd", + "value": 3 + }, + { + "id": "C29KJ8BTFavhj_R9UfnSv", + "value": 2 + }, + { + "id": "kpghvJtujlt4vPI2N6vsg", + "value": 2 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcafe.webp?alt=media&token=d3c77313-ac4a-4df2-8be1-a4d01697a80b" }, - "tipo": 5, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcolor_pregunta.webp?alt=media&token=323d5f57-fc0b-4178-810a-dceef199c4c1" + "tags": { + "EDAD": [ + "ADULTO" + ], + "HORA": [ + "MANANA" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "café", + "type": 2 }, { - "id": 746, - "texto": { - "en": "Red", - "es": "rojo" + "id": "kaiWPbXxjHXlqcpBaBp4l", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fviajar.webp?alt=media&token=ccfef1e5-8011-4c79-8b69-f2b136b1b0b9" }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_rojo.webp?alt=media&token=db03a6d8-b224-4c3e-95ae-b9726acbb4a9" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "viajar", + "type": 3 }, { - "id": 747, - "texto": { - "en": "Pink", - "es": "rosa" + "id": "khUUL_1JQGngApqBRDh_q", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Farreglado.webp?alt=media&token=f71281ba-0a11-4f1e-9eee-fe0fbe34d2ae" }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_rosa.webp?alt=media&token=7d6813b9-27af-4c7c-839f-52b8332bbcba" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ], + "GENERO": [ + "HOMBRE" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "arreglado", + "type": 4 }, { - "id": 748, - "texto": { - "en": "Violet", - "es": "violeta" - }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_violeta.webp?alt=media&token=11f96684-2a3e-45b1-a014-36d9af8fc0fd" + "id": "kpghvJtujlt4vPI2N6vsg", + "relations": [ + { + "id": "rxdfuk6egO7VmZEB3JrUN", + "value": 14 + }, + { + "id": "cb0rJJEYOeEoRU5fDdQQq", + "value": 14 + }, + { + "id": "wkrNPLGWTqMIy4PJRW9QR", + "value": 5 + }, + { + "id": "B1845IfYfPMz2FWpVFIQv", + "value": 4 + }, + { + "id": "eZEqRZjRK8JJMsfHo4Y7w", + "value": 4 + }, + { + "id": "g2sQSxCcoZuKJ3TabK6oT", + "value": 2 + }, + { + "id": "Sp2Ias_Y1HplkHWjIb7Mp", + "value": 2 + }, + { + "id": "ccGASDOGtty6GfQMEEBEU", + "value": 2 + }, + { + "id": "jpKPg3hn6_GO1HSkeLNGz", + "value": 2 + }, + { + "id": "O_ZfCPZSxGMPT6orCt-O6", + "value": 2 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fo.webp?alt=media&token=30bbee61-26e4-42b4-8663-40f542478523" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "o", + "type": 6 }, { - "id": 749, - "texto": { - "en": "Green", - "es": "verde" + "id": "kxuGlfYjS6puO2xD1QvxO", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/32954/32954_500.png" }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_verde.webp?alt=media&token=b0bb5586-ca8e-4ff9-89a1-25be6ffb1fe3" - }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "vamos", + "type": 5 }, { - "id": 750, - "texto": { - "en": "Light green", - "es": "verde Claro" + "id": "lKA4b7I3iFkqNzPcAXyBc", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcocinero.webp?alt=media&token=982eabfe-1544-4ff1-adb1-6eeac3937f1f" }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fverde_claro.webp?alt=media&token=61212a6e-41a5-4ca6-ac01-c927b148ba21" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "cocinero", + "type": 1 }, { - "id": 751, - "texto": { - "en": "agenda", - "es": "agenda" + "id": "lKMW_xTZzCrCHRcGp-Z-n", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fgalletas.webp?alt=media&token=0a5b87dc-2b95-49f6-9433-0f8955beec29" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_agenda.webp?alt=media&token=6c163ede-8b50-4330-8bb1-86a8709c2df3" + "tags": { + "HORA": [ + "TARDE" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "galleta", + "type": 2 }, { - "id": 752, - "texto": { - "en": "wallet", - "es": "billetera" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_billetera.webp?alt=media&token=287d976d-97fa-4d7f-a67b-a01e884f1539" + "id": "lR84gCk8OM-oYoLAV7tar", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/2592/2592_500.png" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "timbre", + "type": 2 }, { - "id": 753, - "texto": { - "en": "pencil case", - "es": "cartuchera" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_cartuchera.webp?alt=media&token=60a16199-fb91-4ba6-9b40-939237b6a84c" + "id": "lXH68vGIuZdfA8xVrS8iw", + "relations": [ + { + "id": "B1845IfYfPMz2FWpVFIQv", + "value": 4 + }, + { + "id": "rxdfuk6egO7VmZEB3JrUN", + "value": 4 + }, + { + "id": "pvXSy-5M4i8kysUppvdME", + "value": 3 + }, + { + "id": "lXH68vGIuZdfA8xVrS8iw", + "value": 3 + }, + { + "id": "GY_flM-6uR6X3L4AwsiwU", + "value": 2 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fmucho.webp?alt=media&token=6566212e-9051-411c-8825-a88189a218ad" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "mucho", + "type": 4 }, { - "id": 754, - "texto": { - "en": "Lessons", - "es": "clases" + "id": "l_ncJLRdVGBzzQc9yqBqs", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fbanana.webp?alt=media&token=b01c35ae-502a-47dc-804d-b99bc870230f" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_clases.webp?alt=media&token=bbf3f869-948b-4be0-93fb-44b637a651b0" + "tags": { + "HORA": [ + "MANANA" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "banana", + "type": 2 }, { - "id": 755, - "texto": { - "en": "computer", - "es": "computadora" + "id": "lrUuPKco_O8FXDuclzpKE", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/37160/37160_500.png" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_computadora.webp?alt=media&token=a8231494-9cd4-4214-957c-0f0cac0bf51a" - }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "necesitar", + "type": 3 }, { - "id": 756, - "texto": { - "en": "Crayon", - "es": "crayones" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_pinturas_de_colores.webp?alt=media&token=a9216975-c04c-458e-ab37-f25c8845ff68" + "id": "m0434KkjeTv8SGN7WxR2C", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_negro.webp?alt=media&token=4a94ed36-a674-4a54-835d-5e53b49c2a79" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "negro", + "type": 4 }, { - "id": 757, - "texto": { - "en": "notebook", - "es": "cuaderno" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_cuaderno.webp?alt=media&token=8a9f694c-56c6-4050-86cc-88a2e8f339e2" + "id": "m0Fkio76HZHS2HguPOTn5", + "relations": [ + { + "id": "B1845IfYfPMz2FWpVFIQv", + "value": 3 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fseis.webp?alt=media&token=b7811c3a-4c9b-4f54-93da-fe6fd12e84d8" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "seis", + "type": 6 }, { - "id": 758, - "texto": { - "en": "room", - "es": "cuarto" + "id": "m17b6MazSk6M4gb51_cCy", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpulmones.webp?alt=media&token=9fd10e4a-561e-4140-892b-164b87c3859e" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_cuarto.webp?alt=media&token=71b775de-e204-4136-97f9-f8b7346073ed" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "pulmones", + "type": 2 }, { - "id": 760, - "texto": { - "en": "eraser", - "es": "goma" + "id": "m39xTdgaenoi4mWGEa-Ew", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fplato.webp?alt=media&token=0a96d1d6-45dc-4a45-8e94-318ce29d32cb" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_goma.webp?alt=media&token=3ae9dee2-fd64-41ca-9278-015438dc0bc1" - }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "plato", + "type": 2 }, { - "id": 761, - "texto": { - "en": "toy", - "es": "el juguete" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_jueguete.jpg?alt=media&token=4c74d182-45e0-4642-87e5-645aa1a9dda6" - }, - "relacion": [ + "id": "m3qTT8tiGZQheKIWREzMT", + "relations": [ + { + "id": "7WxUVoVQfQOzARU2bf6HP", + "value": 10 + }, + { + "id": "9GqE148SFZqMIft4evAk2", + "value": 7 + }, + { + "id": "_lU200bb9Sjv0b_iJKgU2", + "value": 4 + }, + { + "id": "XYY8SV1IAMHjdGjMZxbdy", + "value": 3 + }, + { + "id": "fjCOcN-PKP6F07IZcI71X", + "value": 1 + }, + { + "id": "Zm4OIanIKTigDGIsInO7o", + "value": 5 + }, + { + "id": "iowxE4MxcV6PR2Uhtvxqs", + "value": 5 + }, { - "id": 734, - "frec": 3 + "id": "5mGrGHzdw_vCwYCRNPcPw", + "value": 1 }, { - "id": 743, - "frec": 1 + "id": "3w62N9b7Cvb6JMjB9Wphi", + "value": 1 }, { - "id": 747, - "frec": 1 + "id": "rxdfuk6egO7VmZEB3JrUN", + "value": 8 }, { - "id": 736, - "frec": 1 + "id": "KWYVDZiERE8jtRsL0faHH", + "value": 2 } ], - "agenda": 0, - "gps": 0 + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fir.webp?alt=media&token=087da971-16b1-4d6c-855c-f7481e0840db" + }, + "text": "ir a", + "type": 3 }, { - "id": 762, - "texto": { - "en": "pencil", - "es": "lapiz" + "id": "mC9Nb7zVdEUpjEBODw_gL", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_tu.webp?alt=media&token=6e51dc01-7d7f-48b2-80e9-8e3930009a9b" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_lapices_de_colores.webp?alt=media&token=1662d13d-3aaf-45d7-b3cf-921499a43030" - }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "vos", + "type": 1 }, { - "id": 766, - "texto": { - "en": "paper", - "es": "papel" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_papel.webp?alt=media&token=08b182e0-e3c7-451c-bc15-1c97aaeede75" + "id": "mFfylZ8yoLvtkVSDTlVEN", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/3376/3376_500.png" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "pomada", + "type": 2 }, { - "id": 767, - "texto": { - "en": "ball", - "es": "pelota" + "id": "mJqzbxYeIDQciPkeHA1Ao", + "relations": [ + { + "id": "wkrNPLGWTqMIy4PJRW9QR", + "value": 2 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcuchillo.webp?alt=media&token=4899f059-2a50-48f5-93af-4cc644e3b935" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_pelotas.webp?alt=media&token=2b17cead-37bc-40c1-9933-8320836adeb0" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "cuchillo", + "type": 2 }, { - "id": 768, - "texto": { - "en": "glue", - "es": "pegamento" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_pegamento.webp?alt=media&token=4d4468d0-6cb2-4054-bdd7-40c4b5db74b3" + "id": "mK4AXXhoIVirBz5dr_xLA", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/2509/2509_500.png" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "pavo", + "type": 2 }, { - "id": 769, - "texto": { - "en": "brush", - "es": "pincel" + "id": "mRK--C5Q1aGe8MMPJJLYi", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/26986/26986_500.png" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_pincel.webp?alt=media&token=61071c3c-12af-43dc-addd-cf9e15635637" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ], + "GENERO": [ + "MUJER" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "preocupado", + "type": 4 }, { - "id": 770, - "texto": { - "en": "blackboard", - "es": "pizarrón" + "id": "mTklFAI-FVVLsMKoASZ7T", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fdesconocida.webp?alt=media&token=e8545797-ce84-463d-8c9c-97b39c5d9a03" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_pizarron.webp?alt=media&token=9a9cc7f1-8a76-4cff-9c4a-c77cb73663b9" - }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "desconocido", + "type": 4 }, { - "id": 771, - "texto": { - "en": "art class", - "es": "plástica" + "id": "mWXxPPvhSHf9hyb-VyuZH", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fe.webp?alt=media&token=4b5833d7-9d6a-40f1-a90a-ef23d13ece1b" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_plastica.webp?alt=media&token=f07c00ef-d42e-48dc-a115-6958e289006b" + "tags": { + "EDAD": [ + "ADULTO" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "e", + "type": 6 }, { - "id": 772, - "texto": { - "en": "magazines", - "es": "revistas" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_revistas.webp?alt=media&token=201c8e17-b30d-43dc-aeee-f0df613ea313" + "id": "mZFwH8xY_OeVDWCdvPZBy", + "relations": [ + { + "id": "y_5OURnKxFcv4UiMKntUi", + "value": 6 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpie.webp?alt=media&token=461fd01a-1ce2-49e7-9d95-c1b07079734b" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "pie", + "type": 2 }, { - "id": 773, - "texto": { - "en": "TV", - "es": "la televisión" + "id": "miPmA2tOQiLxOW7D_V_x6", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcubos_apilables.webp?alt=media&token=2b2fa371-b481-4aa8-b1b0-072a4fa934bb" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_televisor.webp?alt=media&token=2575675b-b3c4-4e35-9cde-17bba27623ee" + "tags": { + "EDAD": [ + "NINO" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "cubos", + "type": 2 }, { - "id": 774, - "texto": { - "en": "tablet", - "es": "la tablet" + "id": "ms97ZsgQOvD-Z8qpSW4oN", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fquienes.webp?alt=media&token=52dd1ebb-74ef-4b1a-9cff-0180ed85ea3d" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_tablet.webp?alt=media&token=b7eaaf47-0194-4491-8377-f593b85a48a0" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "¿quiénes?", + "type": 6 }, { - "id": 776, - "texto": { - "en": "armpit", - "es": "axila" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fsobacos.webp?alt=media&token=50574607-d2a3-4f19-bb41-8bfa08b9ea5c" + "id": "mx6dmRLXA_lkN1QlP71vq", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ftodas.webp?alt=media&token=dcdb7025-41d9-4230-8871-51612bf8bfec" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "todas", + "type": 4 }, { - "id": 777, - "texto": { - "en": "mouth", - "es": "boca" + "id": "n5bZClAB6jXAZnwxIwH-1", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ftostada.webp?alt=media&token=a07b7217-cf65-42ae-a72f-327b8ba13f66" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fboca.webp?alt=media&token=7e81102f-105b-4d12-9aaa-75ad145bbf4a" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ], + "HORA": [ + "MANANA", + "TARDE" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "tostada", + "type": 2 }, { - "id": 778, - "texto": { - "en": "arm", - "es": "brazo" + "id": "nK7DRpxalLBHL9OnRjSim", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fframbuesas.webp?alt=media&token=5b377f0a-a7cd-4904-8da7-09ba5191671c" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fbrazo.webp?alt=media&token=7e37e062-4e54-4226-80a1-ad131b7ea8a3" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ], + "HORA": [ + "MANANA", + "MEDIODIA", + "TARDE" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "frambuesa", + "type": 2 }, { - "id": 780, - "texto": { - "en": "elbow", - "es": "codo" + "id": "nMQUtS-kFHViOKyop1FdS", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcinta_de_pelo.webp?alt=media&token=77776f51-148a-40ca-b3d5-761364ca7003" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcodo.webp?alt=media&token=63ba0037-61a2-43a6-8667-98a165d9c693" - }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "vincha", + "type": 2 }, { - "id": 781, - "texto": { - "en": "neck", - "es": "cuello" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcuello.webp?alt=media&token=f84d7986-8ce0-4769-961b-33bc3d124434" + "id": "nQSk6_KCEVdO7oC_uxLXN", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Foreja.webp?alt=media&token=63fccce7-1454-4e0a-a725-6d3feddf8c72" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "oreja", + "type": 2 }, { - "id": 782, - "texto": { - "en": "finger", - "es": "dedos" + "id": "nQdbkRVcwpQB_hFNPbe6M", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcaballo.webp?alt=media&token=9c065f9b-ca24-4eb0-b76c-7e505e8f0b44" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fdedos.webp?alt=media&token=9aa0483f-ec5b-405b-a2d5-1100dd29c4d0" + "tags": { + "EDAD": [ + "JOVEN", + "NINO" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "caballo", + "type": 2 }, { - "id": 783, - "texto": { - "en": "bone", - "es": "hueso" + "id": "nUg2M7p5sUPlGdbBev2-G", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ftobillo.webp?alt=media&token=077938b4-f18b-4d2e-b386-ea9e35be9539" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fhuesos.webp?alt=media&token=5a5cf2e5-3784-4bd4-981a-8a1f4b0ea629" - }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "tobillos", + "type": 2 }, { - "id": 784, - "texto": { - "en": "shoulder", - "es": "hombro" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fhombro.webp?alt=media&token=3dd8a8f7-1112-481f-bb85-5bc7f1906efe" + "id": "nm6e_s01gWHzdVj25BHyq", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/11194/11194_500.png" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "¡qué lindo!", + "type": 5 }, { - "id": 785, - "texto": { - "en": "tongue", - "es": "lengua" + "id": "nnTJQMJWfd2nuTSlFNEOy", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/12264/12264_500.png" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Flengua.webp?alt=media&token=2709f72b-2c75-4b13-8c8b-cfb383e7eb1f" - }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "mío", + "type": 2 }, { - "id": 786, - "texto": { - "en": "hand", - "es": "mano" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fmano.webp?alt=media&token=9c37784a-1416-44e0-9e4f-66b91a14ccdf" + "id": "ntzBlFkDMTKEUHoGNc65u", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/15905/15905_500.png" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "baño", + "type": 2 }, { - "id": 787, - "texto": { - "en": "snot", - "es": "moco" + "id": "o0oxaoUFpOLiGsoQBlalI", + "relations": [ + { + "id": "B1845IfYfPMz2FWpVFIQv", + "value": 4 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fzid_tarta.webp?alt=media&token=648ebcaa-13fd-48a2-8649-844260914a2d" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fmoco.webp?alt=media&token=1b0893a9-a04a-483e-b3b3-421205246d55" + "tags": { + "HORA": [ + "MEDIODIA", + "NOCHE" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "torta", + "type": 2 }, { - "id": 788, - "texto": { - "en": "wrist", - "es": "muñeca" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fmunieca.webp?alt=media&token=93fdb3d3-f6bf-462d-bdd7-969b56e610da" + "id": "oAxNCJufVUqZMyWRGdZl9", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ftuya.webp?alt=media&token=e38d6e6e-0e88-4374-8d9c-8dc5725de50e" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "tuyo", + "type": 6 }, { - "id": 789, - "texto": { - "en": "butt", - "es": "nalgas" + "id": "oEHzYcfxDGGcsL-deud1j", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/5400/5400_500.png" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fnalgas.webp?alt=media&token=f30a68d3-fffd-4a9e-a852-8c7ae5f690ff" - }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "snack", + "type": 2 }, { - "id": 790, - "texto": { - "en": "nose", - "es": "nariz" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fnariz.webp?alt=media&token=63d5ec69-287f-4c90-be26-0ab914885f7a" + "id": "oEyUWrQj1iYUnlEUdQQ5Z", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/2396/2396_500.png" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "flauta", + "type": 2 }, { - "id": 791, - "texto": { - "en": "eyes", - "es": "ojos" + "id": "oO21zLMEtHEakvnuTohLu", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/16647/16647_500.png" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fojos.webp?alt=media&token=0cd2a2d8-83aa-45b0-9e6c-2ad9105c2c80" - }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "¡qué divertido!", + "type": 5 }, { - "id": 792, - "texto": { - "en": "belly button", - "es": "ombligo" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fombligo.webp?alt=media&token=67d379bf-68c6-4261-8f3b-73d8ae2d42e4" + "id": "oOkD8Wmvb4t9I2EWqT1Nr", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/37832/37832_500.png" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "amargo", + "type": 4 }, { - "id": 793, - "texto": { - "en": "ear", - "es": "oreja" + "id": "oSBFO8Ka0PN4bgX0QuWxL", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fviajar_en_auto.webp?alt=media&token=fc534378-43da-411b-a070-c9e8dc5cab52" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Foreja.webp?alt=media&token=63fccce7-1454-4e0a-a725-6d3feddf8c72" - }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "viajar en auto", + "type": 3 }, { - "id": 794, - "texto": { - "en": "organs", - "es": "órganos" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Forganos.webp?alt=media&token=65032cca-fd5c-4b8b-9f09-438818366c48" + "id": "oYwoiRDWlIjSTbYdC2vG6", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/2391/2391_500.png" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "falda", + "type": 2 }, { - "id": 795, - "texto": { - "en": "belly", - "es": "panza" + "id": "oa-MShota2L8n2pU8hIsm", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/23392/23392_500.png" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fbarriga.webp?alt=media&token=485c7a63-7546-4f0a-9da4-0d8fc1b97be0" + "text": "jugar", + "type": 3 + }, + { + "id": "okr5oAG2U8Er1XwQ8XbWD", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/7099/7099_500.png" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "grande", + "type": 4 }, { - "id": 797, - "texto": { - "en": "chest", - "es": "pecho" + "id": "oqQWeoWBr5N0LrPGY62Og", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ftetas.webp?alt=media&token=e99632cc-4c1c-4855-baf3-31f28b80bce4" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpecho.webp?alt=media&token=55d7a439-26c1-48b6-82ae-8d749d0142d7" + "tags": { + "EDAD": [ + "ADULTO" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "senos", + "type": 2 }, { - "id": 799, - "texto": { - "en": "foot", - "es": "pie" + "id": "otTWzTaTAmweNCozT8tn9", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/5372/5372_500.png" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpie.webp?alt=media&token=461fd01a-1ce2-49e7-9d95-c1b07079734b" + "text": "alergia", + "type": 2 + }, + { + "id": "p1qK47wwLwF8S0Fy8-2Mt", + "relations": [ + { + "id": "kpghvJtujlt4vPI2N6vsg", + "value": 4 + }, + { + "id": "emm_RirDsO30Enax5Q4gd", + "value": 2 + }, + { + "id": "y_5OURnKxFcv4UiMKntUi", + "value": 2 + }, + { + "id": "B1845IfYfPMz2FWpVFIQv", + "value": 2 + }, + { + "id": "LEg8z-Q-ONLAAXd-aH_Hb", + "value": 2 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fmano.webp?alt=media&token=9c37784a-1416-44e0-9e4f-66b91a14ccdf" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "mano", + "type": 2 }, { - "id": 800, - "texto": { - "en": "lung", - "es": "pulmones" + "id": "pHBnmCFpM7oZf0O78CBIz", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_dulces.webp?alt=media&token=3ee8a703-20b4-454c-8254-1c0c1b66873d" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpulmones.webp?alt=media&token=9fd10e4a-561e-4140-892b-164b87c3859e" + "tags": { + "EDAD": [ + "NINO" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "golosina", + "type": 2 }, { - "id": 802, - "texto": { - "en": "knee", - "es": "rodilla" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Frodilla.webp?alt=media&token=abca8679-496e-42ac-8d16-7bf963ccd560" + "id": "pM-bC77hbj-w44A0HFRDZ", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fsonarse_los_mocos.webp?alt=media&token=53e05413-9fd2-451b-86f6-4d953cf4abed" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "sonarme la nariz", + "type": 3 }, { - "id": 803, - "texto": { - "en": "saliva", - "es": "saliva" + "id": "p_XyUXRmeUk_bdjRTMtkz", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_revistas.webp?alt=media&token=201c8e17-b30d-43dc-aeee-f0df613ea313" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fsaliva.webp?alt=media&token=5db48872-d5c5-40f7-95cc-7232d323b873" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ], + "GENERO": [ + "MUJER" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "revistas", + "type": 2 }, { - "id": 804, - "texto": { - "en": "blood", - "es": "sangre" + "id": "p_qpVEd677b2Bk56yhvj6", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fjardin.webp?alt=media&token=cbca3a9b-3073-4eb3-8b68-ef2bcf079d76" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fsangre.webp?alt=media&token=48399efe-6a12-4413-b61d-28ffa8dc5576" + "tags": { + "EDAD": [ + "NINO" + ], + "GENERO": [ + "MUJER" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "jardín", + "type": 2 }, { - "id": 806, - "texto": { - "en": "boobs", - "es": "tetas" + "id": "paPpjw1XVC9-6xcueJsrY", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ftodos.webp?alt=media&token=694aae8b-22c8-4274-b9f1-b3bbdd15d061" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ftetas.webp?alt=media&token=e99632cc-4c1c-4855-baf3-31f28b80bce4" - }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "todos", + "type": 4 }, { - "id": 807, - "texto": { - "en": "ankle", - "es": "tobillos" + "id": "pgPlWKk-oww2fua5zYuue", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/2477/2477_500.png" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ftobillo.webp?alt=media&token=077938b4-f18b-4d2e-b386-ea9e35be9539" + "tags": { + "EDAD": [ + "NINO" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "mono", + "type": 2 }, { - "id": 809, - "texto": { - "en": "nail", - "es": "uña" + "id": "phZ4F4uzi1TrhjeDMuMsn", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Falmohada.webp?alt=media&token=ad78fd9b-ae55-4372-a510-ab4944730826" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Funia.webp?alt=media&token=5d43c3a6-52bf-4a22-90b5-cf4f7e42fd9c" + "tags": { + "EDAD": [ + "JOVEN", + "NINO" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "almohada", + "type": 2 }, { - "id": 810, - "texto": { - "en": "before", - "es": "antes" + "id": "pkuppr1jMH7SMpa2hrIWQ", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fmelocoton.webp?alt=media&token=b00db9ca-225c-4867-8c54-ed3754e15c04" }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fantes.webp?alt=media&token=3dd6363e-4ce8-439b-ade7-79d2988c5d3d" + "tags": { + "EDAD": [ + "JOVEN", + "NINO" + ], + "HORA": [ + "MEDIODIA", + "TARDE" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "jugo de durazno", + "type": 2 }, { - "id": 811, - "texto": { - "en": "yesterday", - "es": "ayer" + "id": "pliNY9oMQh1iSidkEhhDO", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fabrazar.webp?alt=media&token=e60acc80-b7b7-4ee6-a0ff-f81b6ee5fda3" }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fayer.webp?alt=media&token=651e6c3e-091b-4586-91e3-666afc9be72e" + "tags": { + "EDAD": [ + "NINO" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "abrazar", + "type": 3 }, { - "id": 812, - "texto": { - "en": "after", - "es": "despues" - }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fdespues.webp?alt=media&token=5e7ca0db-5aa6-40d1-a0f2-6fa71c76e76e" + "id": "pptyFMhLrbC6lN6zmc7D0", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_comedor.webp?alt=media&token=eb71846a-eef3-4c0d-aabd-026e7b716e00" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "comedor", + "type": 2 }, { - "id": 815, - "texto": { - "en": "tomorrow", - "es": "mañana" + "id": "ptQZXjMQyXWycUD1kAkQo", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcuento.webp?alt=media&token=2f3fa4f7-9f55-424e-a587-8974d1728f84" }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fmaniana.webp?alt=media&token=ed816c6e-a76b-457d-898d-684ae82d70f1" + "tags": { + "EDAD": [ + "NINO" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "cuento", + "type": 2 }, { - "id": 816, - "texto": { - "en": "fall", - "es": "otoño" + "id": "pv8eYkxczIevQqEGwDz6V", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/2475/2475_500.png" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fotonio.webp?alt=media&token=1d1a0c5b-e4c7-4976-879b-357f3c84ee62" + "text": "mochila", + "type": 2 + }, + { + "id": "pvXSy-5M4i8kysUppvdME", + "relations": [ + { + "id": "5vxTXbPl4Y0yezGu7p1f6", + "value": 32 + }, + { + "id": "bDnuS19hfd9GhJ-6rjNPD", + "value": 24 + }, + { + "id": "m3qTT8tiGZQheKIWREzMT", + "value": 11 + }, + { + "id": "rxdfuk6egO7VmZEB3JrUN", + "value": 11 + }, + { + "id": "cb0rJJEYOeEoRU5fDdQQq", + "value": 10 + }, + { + "id": "CYH_6DL9q1iLLetuWeR9A", + "value": 10 + }, + { + "id": "hmhAUgqvGp7nc1w25sRSx", + "value": 3 + }, + { + "id": "HQiQh4PPBvO1n-d7JGVj8", + "value": 3 + }, + { + "id": "sSTGRl6DpYGZXp8vtTNbm", + "value": 3 + }, + { + "id": "XeVaDdUWSEkhfJvTVvUHR", + "value": 3 + }, + { + "id": "pvXSy-5M4i8kysUppvdME", + "value": 3 + }, + { + "id": "BQm-YCPc0lfD1-mhecCTL", + "value": 2 + }, + { + "id": "6lYN4qSZx3_tKDClp4Iyr", + "value": 2 + }, + { + "id": "3w62N9b7Cvb6JMjB9Wphi", + "value": 2 + }, + { + "id": "LU7IoUksATEBhd8PaHS1R", + "value": 2 + }, + { + "id": "paPpjw1XVC9-6xcueJsrY", + "value": 2 + }, + { + "id": "5kjlzqb9Rf3zzqZROaZ9p", + "value": 2 + }, + { + "id": "hXgGhazQ_nA5uqpRD6Qwq", + "value": 2 + }, + { + "id": "JEDIYq1BDA23ac9TNhON-", + "value": 2 + }, + { + "id": "g2sQSxCcoZuKJ3TabK6oT", + "value": 2 + } + ], + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/11351/11351_500.png" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "que", + "type": 6 }, { - "id": 817, - "texto": { - "en": "spring", - "es": "primavera" + "id": "pwltOTDn2OyABTlD4-27W", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fzid_verduras.webp?alt=media&token=e74f9d18-10ee-47f4-947c-1ab02b13f5df" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fprimavera.webp?alt=media&token=aaea64e6-61c9-4c6d-8357-ec36fb5e9031" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ], + "HORA": [ + "MEDIODIA", + "NOCHE" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "verduras", + "type": 2 }, { - "id": 818, - "texto": { - "en": "summer", - "es": "verano" + "id": "px0jKQDj7r9pOYs4ZrvcT", + "relations": [ + { + "id": "wkrNPLGWTqMIy4PJRW9QR", + "value": 2 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ftomate.webp?alt=media&token=c41dbeb9-419d-45f7-a621-d4d40dc027d4" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fverano.webp?alt=media&token=ec7103a4-ece7-47e3-988d-3ed2075f5f65" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ], + "HORA": [ + "MEDIODIA", + "NOCHE" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "tomate", + "type": 2 }, { - "id": 819, - "texto": { - "en": "sick", - "es": "enfermo" + "id": "q22wRFF21EigV8YzQ_MfV", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_ayuda.webp?alt=media&token=52542e12-7482-4409-b5e1-ce4fb61af996" }, - "tipo": 4, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fenfermo.webp?alt=media&token=764245fa-4e99-479e-8b3b-d7a08264a54a" - }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "¿me ayudas?", + "type": 5 }, { - "id": 820, - "texto": { - "en": "diarrhea", - "es": "diarrea" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fzid_diarrea.webp?alt=media&token=1ebef72f-8be3-40e9-8acb-baf64842e986" + "id": "q6F-qJ7mTxvwa43F6vwun", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/21845/21845_500.png" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "escondidas", + "type": 2 }, { - "id": 821, - "texto": { - "en": "pain", - "es": "dolor" + "id": "q7Pz4UqqZUlXeFfXrwXDR", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/8560/8560_500.png" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fzid_dolor.webp?alt=media&token=fa664a43-d014-4cdf-aa74-bfe5a48bbbfa" - }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "enjuagar", + "type": 3 }, { - "id": 822, - "texto": { - "en": "toothache", - "es": "dolor de muela" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fzid_dolor_de_muela.webp?alt=media&token=296042a8-304b-49f4-8dc3-eecf5c7e4ef1" + "id": "qA4v2JWQU0zzBBZgvW7Vt", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/7109/7109_500.png" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "temblores", + "type": 2 }, { - "id": 823, - "texto": { - "en": "chest pain", - "es": "dolor de pecho" + "id": "qOsbXyvBTMDAwvvnI0iFn", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/4716/4716_500.png" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fzid_dolor_de_pecho.webp?alt=media&token=90df8549-8eb6-4006-959a-b51b4a8481d7" - }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "pequeño", + "type": 4 }, { - "id": 824, - "texto": { - "en": "earache", - "es": "dolor de Oido" + "id": "qU5IvFLD8d16iIHSs_9TM", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcebolla.webp?alt=media&token=af1f0474-59b3-4bf7-8b49-c18c61393813" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fzid_dolor_de_oido.webp?alt=media&token=53457290-15a6-4afb-9a67-6a251f8d17ea" + "tags": { + "HORA": [ + "MEDIODIA", + "NOCHE" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "cebolla", + "type": 2 }, { - "id": 825, - "texto": { - "en": "stomachache", - "es": "dolor de Panza" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fzid_dolor_de_espalda.webp?alt=media&token=b8ed9cd5-04d7-4d51-87a4-2ff15b5ca7bb" + "id": "qWhpDTMd8eAEoq7yTKc57", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/25680/25680_500.png" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "calzón", + "type": 2 }, { - "id": 826, - "texto": { - "en": "throat sore", - "es": "dolor de Garganta" + "id": "qYA2U_BFOZtFLClxuCIBJ", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fzid_dolor_de_muela.webp?alt=media&token=296042a8-304b-49f4-8dc3-eecf5c7e4ef1" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fzid_dolor_de_garganta.webp?alt=media&token=1f994ca1-0abf-4377-93f1-520004a95ec2" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "dolor de muelas", + "type": 2 }, { - "id": 827, - "texto": { - "en": "headache", - "es": "dolor de cabeza" + "id": "qeJdrxKIIcUctIjo8wWhc", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcustom_agudo.webp?alt=media&token=e927ccab-8672-409e-8bcc-3a00493bb0a1" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fzid_dolor_de_cabeza.webp?alt=media&token=20980fc1-4310-482a-89c1-1a37141fcacd" - }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "agudo", + "type": 4 }, { - "id": 828, - "texto": { - "en": "constipation", - "es": "estreñimiento" + "id": "qn-7ERrcZxJTqfW6hwNs8", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcorrer.webp?alt=media&token=a4439f93-1f23-4bbe-ac63-b0a26711da1d" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Festrenimiento.webp?alt=media&token=c7741445-f298-403a-95a9-291596fac8f6" + "tags": { + "EDAD": [ + "JOVEN" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "correr", + "type": 3 }, { - "id": 829, - "texto": { - "en": "flu", - "es": "gripe" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fzid_gripe.webp?alt=media&token=561b5a4b-f721-40e8-93d1-c4f73acc0044" + "id": "qsA1zm1DOlItK7DCWzAw8", + "relations": [ + { + "id": "O-CLnVuXAUapOn6TbdhKx", + "value": 1 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_aburrido.webp?alt=media&token=e307839a-58fe-4c57-8f59-9ede484d2c53" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "aburrido", + "type": 4 }, { - "id": 831, - "texto": { - "en": "cold", - "es": "resfrío" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fzid_resfriado.webp?alt=media&token=88ccba98-7926-49f5-b376-aac36faecd74" + "id": "qscoBbrWu7tQbpNj9XUPt", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/37261/37261_500.png" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "papel higiénica", + "type": 2 }, { - "id": 834, - "texto": { - "en": "football match", - "es": "partido de fútbol" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_partido.webp?alt=media&token=75c30e48-e4d6-4cf9-abb3-a35cfbdc2043" + "id": "quE_RA9abVvtG-Fo4Jx8f", + "relations": [ + { + "id": "y_5OURnKxFcv4UiMKntUi", + "value": 4 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fdiez.webp?alt=media&token=8684b962-ecf3-48e7-8f36-fe065caea19b" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "diez", + "type": 6 }, { - "id": 835, - "texto": { - "en": "Football", - "es": "fútbol" + "id": "qy3c7gvRU7shWuJYr1kBk", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fbebida.webp?alt=media&token=70276811-03c6-4072-89e2-c07fea37652f" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_futbol.webp?alt=media&token=50db7655-7aff-4f93-9b68-875cc5706c7a" + "tags": { + "HORA": [ + "MEDIODIA", + "NOCHE" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "bebida", + "type": 2 }, { - "id": 836, - "texto": { - "en": "one", - "es": "uno" + "id": "r7eJgCF_b_ktkztv4-oda", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/2466/2466_500.png" }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Funo.webp?alt=media&token=86499f4d-0702-4d07-beab-c235b500de25" - }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "medias", + "type": 2 }, { - "id": 837, - "texto": { - "en": "two", - "es": "dos" - }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fdos.webp?alt=media&token=e1040518-cecd-4ff2-a1d2-ff2bcbfd42ba" + "id": "r808IO3I6j3os_uix6O63", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/9810/9810_500.png" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "juegos de salón", + "type": 2 }, { - "id": 838, - "texto": { - "en": "three", - "es": "tres" + "id": "r9qUBQwgY8eycnU2OVey0", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcomer_un_bocadillo.webp?alt=media&token=051a6f68-0ab9-40fb-90fe-03eedefc72ef" }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ftres.webp?alt=media&token=52b1eca2-d7b8-470a-b252-bc815998c32e" + "tags": { + "HORA": [ + "MEDIODIA" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "comer un sándwich", + "type": 3 }, { - "id": 839, - "texto": { - "en": "four", - "es": "cuatro" + "id": "rBwDn3PcJGqytqnOZTJMV", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ftaxi.webp?alt=media&token=2809dbe3-07a6-4ef4-90b1-f8725c91be44" }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcuatro.webp?alt=media&token=2b9cb275-8a39-45cb-bce7-6bf2f3bbeb4b" - }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "taxi", + "type": 2 }, { - "id": 840, - "texto": { - "en": "five", - "es": "cinco" + "id": "rMFGfzFobfGsH3_qrLHXU", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fzid_pescado.webp?alt=media&token=c61c5906-1c00-425f-af6f-63c50b9a005a" }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcinco.webp?alt=media&token=62c2628b-899f-4e6b-991e-57e58f7083da" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ], + "HORA": [ + "MEDIODIA", + "NOCHE" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "pescado", + "type": 2 }, { - "id": 841, - "texto": { - "en": "six", - "es": "seis" - }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fseis.webp?alt=media&token=b7811c3a-4c9b-4f54-93da-fe6fd12e84d8" + "id": "rU9cpWF0I4wnJjzTXpGtO", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/7131/7131_500.png" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "hoy mismo", + "type": 6 }, { - "id": 842, - "texto": { - "en": "seven", - "es": "siete" + "id": "rgyV6CvFe98OGnWut6QCZ", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/6236/6236_500.png" }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fsiete.webp?alt=media&token=6e7d62b1-62b9-4eaf-acc2-5ec55eb46d9b" - }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "turista", + "type": 2 }, { - "id": 843, - "texto": { - "en": "eight", - "es": "ocho" - }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Focho.webp?alt=media&token=e52965f6-188c-4b34-b973-b2d45b962e9d" + "id": "rlGO5jGKPL1vW-VF4nRqZ", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_entrada.webp?alt=media&token=3c3f1754-1512-4658-923b-3486a794d797" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "entrada", + "type": 2 }, { - "id": 844, - "texto": { - "en": "nine", - "es": "nueve" + "id": "rnjJyPTabH_Xpmy4Z4O3U", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/16475/16475_500.png" }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fnueve.webp?alt=media&token=0ae70911-b2ac-47ab-8efc-c2d048819b53" - }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "celebrar", + "type": 3 }, { - "id": 845, - "texto": { - "en": "ten", - "es": "diez" - }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fdiez.webp?alt=media&token=8684b962-ecf3-48e7-8f36-fe065caea19b" + "id": "rtHwq5WN9KElX3V3SKBmS", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/8653/8653_500.png" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "papas fritas", + "type": 2 }, { - "id": 846, - "texto": { - "en": "zero", - "es": "cero" + "id": "rwyX2YemNEx_Mh64IArDQ", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/4710/4710_500.png" }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcero.webp?alt=media&token=f21cba0a-a49b-4d7c-9f49-adde729892c6" - }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "oscuro", + "type": 4 }, { - "id": 850, - "texto": { - "en": "minim", - "es": "blanca" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fblanca.webp?alt=media&token=29601eda-4a20-47a7-b271-dd003afaa6d9" + "id": "rxdfuk6egO7VmZEB3JrUN", + "relations": [ + { + "id": "R9ECa_HQRtpFrb59ebMTQ", + "value": 28 + }, + { + "id": "Te_jJfeU8Xwa9St2RihBq", + "value": 21 + }, + { + "id": "7WxUVoVQfQOzARU2bf6HP", + "value": 17 + }, + { + "id": "rxdfuk6egO7VmZEB3JrUN", + "value": 17 + }, + { + "id": "p1qK47wwLwF8S0Fy8-2Mt", + "value": 15 + }, + { + "id": "JblWXW8TKDCuYu2yTnFBA", + "value": 13 + }, + { + "id": "5L5UzBHOzuHRoO-jyPuEx", + "value": 10 + }, + { + "id": "BQhqx1PuF94jwT0ySTlbJ", + "value": 9 + }, + { + "id": "pvXSy-5M4i8kysUppvdME", + "value": 9 + }, + { + "id": "FkC5DtSV81OvFMU99qZGg", + "value": 9 + }, + { + "id": "amk4WRd1sNEIp24pnFw8j", + "value": 7 + }, + { + "id": "WNhpmD_XlTaNEBo7GsFXu", + "value": 7 + }, + { + "id": "Gj7THa6XFHDfYL5H19lwj", + "value": 6 + }, + { + "id": "SXz8iA1Qn_BlgLTAG6Epl", + "value": 6 + }, + { + "id": "8MV4ZFthtUeoxLAIbqGTc", + "value": 6 + }, + { + "id": "zdFC3vpgjcyUWB9a4ghRW", + "value": 6 + }, + { + "id": "eWSI1NInbQowtO99phhGA", + "value": 5 + }, + { + "id": "MMzjhHID8HMqyPjii5o-h", + "value": 5 + }, + { + "id": "mZFwH8xY_OeVDWCdvPZBy", + "value": 5 + }, + { + "id": "OKXIGnLh-i1ydTNj450Q8", + "value": 4 + }, + { + "id": "904w9Je6oDwGXUCIcrUZX", + "value": 4 + }, + { + "id": "RwlZ1jr2Ix3evzrW71lN0", + "value": 4 + }, + { + "id": "0cdYDZ5HPaTmqTTN0_Ee8", + "value": 4 + }, + { + "id": "g2MhHawoIC9oFNEv5_w63", + "value": 4 + }, + { + "id": "8vR0HYniXtrrQqqSIN_JQ", + "value": 4 + }, + { + "id": "LksmOMPPOMArbrFsscqOW", + "value": 3 + }, + { + "id": "d_I8jNfbkQD0CHgZn7hyB", + "value": 3 + }, + { + "id": "NLi5ODIzyMAwr2HpDXACp", + "value": 3 + }, + { + "id": "JEDIYq1BDA23ac9TNhON-", + "value": 3 + }, + { + "id": "4rzonBodQXfs77gALnAP_", + "value": 2 + }, + { + "id": "9EqfwMNtATh1fwMhyn_B1", + "value": 2 + }, + { + "id": "MNCcHiImRS8tmvhBhzCKj", + "value": 2 + }, + { + "id": "Wgh5iCzUmx4Je-B85-pra", + "value": 2 + }, + { + "id": "jprAsdXWGQKPlUWwgBBot", + "value": 2 + }, + { + "id": "FTngK946O8S8bYc0g7vM2", + "value": 2 + }, + { + "id": "sixdpB8hTOhlUr4loz3RB", + "value": 2 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fel.webp?alt=media&token=dafa6e53-8f89-4722-9fd5-ca4d1c942aea" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "la", + "type": 6 }, { - "id": 851, - "texto": { - "en": "peruvian box", - "es": "el cajón" + "id": "ry_jOegpMf4nB3spGf4d2", + "relations": [ + { + "id": "lXH68vGIuZdfA8xVrS8iw", + "value": 3 + }, + { + "id": "cb0rJJEYOeEoRU5fDdQQq", + "value": 3 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fgustar.webp?alt=media&token=fe83aa9b-071b-44c6-9a1c-e2e892e0d8b3" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcajon.webp?alt=media&token=65cd501e-2856-4424-a0a9-a3395494520d" + "tags": { + "EDAD": [ + "JOVEN" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "me gusta", + "type": 6 }, { - "id": 853, - "texto": { - "en": "chore", - "es": "el coro" + "id": "s0BXoyn7AqUAlZ9BOHY6S", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_triste.webp?alt=media&token=8f49d913-1dbb-48df-a07b-614fa3188ad8" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcoro.webp?alt=media&token=bb964d61-b045-4569-a9fa-43df344f7444" - }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "tríste", + "type": 4 }, { - "id": 855, - "texto": { - "en": "guitar", - "es": "la guitarra" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fguitarra.webp?alt=media&token=702e15f5-2020-43b4-a4a0-339de944b32c" + "id": "sAsTkky29uEVC9vo3Ofbo", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fbrazo.webp?alt=media&token=7e37e062-4e54-4226-80a1-ad131b7ea8a3" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "brazo", + "type": 2 }, { - "id": 857, - "texto": { - "en": "musical instruments", - "es": "los instrumentos musicales" + "id": "sDKIldL3tit328Joneo_7", + "relations": [ + { + "id": "B1845IfYfPMz2FWpVFIQv", + "value": 2 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fvaso.webp?alt=media&token=0e374ed3-0fe4-4d0c-aaa8-e62dd900a2cc" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Finstrumentos.webp?alt=media&token=b58a39b2-6c69-4b19-8658-8a6a4fe7ca2a" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "vaso", + "type": 2 }, { - "id": 860, - "texto": { - "en": "music lesson", - "es": "música" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_musica_id.webp?alt=media&token=7256f5b2-50d3-404c-b028-d3d4e81276bd" + "id": "sFNUgvnglgrm6cbYiM0di", + "relations": [ + { + "id": "cb0rJJEYOeEoRU5fDdQQq", + "value": 2 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcuando.webp?alt=media&token=de1e2647-da8a-4e65-ba6e-2abbfdd1636e" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "¿cuándo?", + "type": 6 }, { - "id": 865, - "texto": { - "en": "piano", - "es": "el piano" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpiano.webp?alt=media&token=e07c1a80-4bb9-455d-b249-75f1731bb974" + "id": "sP6uvKmY5kA_yuYR8H21c", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/6951/6951_500.png" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "halloween", + "type": 6 }, { - "id": 870, - "texto": { - "en": "drum", - "es": "el tambor" + "id": "sPtazVgymXESdS-BcHqU_", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpolleria.webp?alt=media&token=e4684ecb-a406-4b62-8940-4daced7e368d" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ftambor.webp?alt=media&token=f5b6ecd0-a046-4281-bff7-a4d9b43e812a" + "tags": { + "EDAD": [ + "ADULTO" + ], + "HORA": [ + "MANANA" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "pollería", + "type": 2 }, { - "id": 871, - "texto": { - "en": "triangle", - "es": "el triángulo" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ftriangulo.webp?alt=media&token=6c36ca91-d690-4221-a208-4bf0ab4229db" + "id": "sSTGRl6DpYGZXp8vtTNbm", + "relations": [ + { + "id": "cb0rJJEYOeEoRU5fDdQQq", + "value": 5 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_comprar.webp?alt=media&token=9d2bdbfc-8e58-4d9b-a7e5-47eea780fc37" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "comprar", + "type": 3 }, { - "id": 874, - "texto": { - "en": "trumpet", - "es": "la trompeta" + "id": "sbv5HLPUR6gHo-EJR2S7S", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcamello.webp?alt=media&token=d06d45dc-4b22-4d06-9312-6a9b5cc8bf02" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ftrompeta.webp?alt=media&token=e670470a-5b54-4e66-a80e-bf6a11e10863" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN", + "NINO" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "camello", + "type": 2 }, { - "id": 876, - "texto": { - "en": "violin", - "es": "el violín" + "id": "sc0hr3jQ80yXRFDlAn56V", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/35573/35573_500.png" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fviolin.webp?alt=media&token=6db738b3-f616-412c-9c83-1fba5996c080" - }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "cansancio", + "type": 2 }, { - "id": 878, - "texto": { - "en": "aspirine", - "es": "aspirina" + "id": "sixdpB8hTOhlUr4loz3RB", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fmunieca.webp?alt=media&token=93fdb3d3-f6bf-462d-bdd7-969b56e610da" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_aspirina.jpg?alt=media&token=1104fe22-4f42-4bba-a75d-bb25af56333e" + "tags": { + "EDAD": [ + "NINO" + ], + "GENERO": [ + "MUJER" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "muñeca", + "type": 2 }, { - "id": 881, - "texto": { - "en": "descongestant", - "es": "descongestivo" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_descongestivo.jpg?alt=media&token=30ce525c-874f-4c72-af98-23ac6609dab5" + "id": "sjGytpiPjwqJfPaRUJ-Iw", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/6563/6563_500.png" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "miércoles", + "type": 6 }, { - "id": 882, - "texto": { - "en": "digestive", - "es": "digestivo" + "id": "sysOciGqtL7y4ULuyYVc-", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fprograma_de_cocina.webp?alt=media&token=902c0c03-0d97-4426-9ba6-6bdc9307ab29" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_digestivo.webp?alt=media&token=0a2a998d-5647-4676-b38d-4ec2b5e89d0e" + "tags": { + "EDAD": [ + "ADULTO" + ], + "HORA": [ + "MANANA", + "MEDIODIA" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "canal de cocina", + "type": 2 }, { - "id": 884, - "texto": { - "en": "syrup", - "es": "jarabe" + "id": "t-w8e69GwxLyfxlWwHk9f", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/2470/2470_500.png" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fjarabe.webp?alt=media&token=b806ca7f-fa06-4b8d-830b-ff601799ed55" - }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "mermelada", + "type": 2 }, { - "id": 885, - "texto": { - "en": "nebulizer", - "es": "nebulizador" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fnebulizador.webp?alt=media&token=9632dea8-ba4a-4546-850b-22a310ed3070" + "id": "t34TbvjJ3zG2jcgJaCeHa", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ftocar.webp?alt=media&token=d6a78a59-63c8-423c-b0ec-59c3ece6da56" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "tocar", + "type": 3 }, { - "id": 886, - "texto": { - "en": "pills", - "es": "pastillas" + "id": "tGyUfSljuc7A5Do5B9GuN", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fsweater.webp?alt=media&token=9998eaa9-ac10-4469-a5a4-b4f1a4f7ae11" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpastillas.webp?alt=media&token=074e4198-f3ba-4790-b525-aaaeade3366b" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "sweater", + "type": 2 }, { - "id": 887, - "texto": { - "en": "bandage", - "es": "venda" + "id": "tQwMPLvqAMAstcqvnOERE", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_gris.webp?alt=media&token=9075f69e-3085-4894-b7a3-2f556bc6bb27" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fvenda.webp?alt=media&token=e72b4a6f-825c-47bd-bd4b-5aae4ebd0ed1" - }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "gris", + "type": 4 }, { - "id": 889, - "texto": { - "en": "although", - "es": "aunque" - }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Faunque.webp?alt=media&token=3391538b-22f9-4361-b227-245c79d6c2e3" + "id": "tWxC4hR6di5zQC-Hujlev", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_volumen_menos.webp?alt=media&token=a96a4d6a-55fc-4b35-87f3-6e5a995efabc" }, - "relacion": [ - { - "id": 22, - "frec": 3 - } - ], - "agenda": 0, - "gps": 0 + "text": "bajar volumen", + "type": 3 }, { - "id": 890, - "texto": { - "en": "which?", - "es": "¿Cuál?" + "id": "tYwEpd2EOtH8wEUr-jwHk", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcaro.webp?alt=media&token=bf0e37f5-b5e2-4f91-824f-e9644af0dc4f" }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcual.webp?alt=media&token=30542648-4e68-4cb3-b4e4-beccc65f2a1c" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "caro", + "type": 4 }, { - "id": 891, - "texto": { - "en": "anyone", - "es": "cualquiera" - }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcualquier.webp?alt=media&token=acf40755-f64a-428e-8222-44e1f474ba69" + "id": "tw1doIY-jFPofZjlPFj4z", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/7061/7061_500.png" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "¿cómo te llamas?", + "type": 5 }, { - "id": 892, - "texto": { - "en": "when?", - "es": "¿Cuándo?" + "id": "txj22hip0CE9qp_z-daIK", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fnebulizador.webp?alt=media&token=9632dea8-ba4a-4546-850b-22a310ed3070" }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcuando.webp?alt=media&token=de1e2647-da8a-4e65-ba6e-2abbfdd1636e" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "nebulizador", + "type": 2 }, { - "id": 893, - "texto": { - "en": "how many?", - "es": "¿Cuántos?" + "id": "u1nIt_oFH426g1IVhlYk5", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fsed.webp?alt=media&token=3c0d95f9-623a-43d6-bccd-b15697ab4d6e" }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcuantos.webp?alt=media&token=3907d69b-e474-4ab8-a7ad-97eb99823477" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "sediento", + "type": 4 }, { - "id": 894, - "texto": { - "en": "how much", - "es": "¿Cuántas?" + "id": "u2e4Zh8qwJF7zKkohQ8df", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/2409/2409_500.png" }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcuantos.webp?alt=media&token=3907d69b-e474-4ab8-a7ad-97eb99823477" - }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "goma de borrar", + "type": 2 }, { - "id": 895, - "texto": { - "en": "his", - "es": "del" - }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fdel.webp?alt=media&token=b3f31b71-2488-4636-a036-e420dc519c2f" + "id": "u3BufiTZTK6AylGh80ZFd", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/7028/7028_500.png" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "ella", + "type": 1 }, { - "id": 896, - "texto": { - "en": "hers", - "es": "del" + "id": "u8HfFvMPkogdWk-URj9hv", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_escribir.webp?alt=media&token=56300bbc-6082-4d71-bdae-4e7ae02540d1" }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fdel.webp?alt=media&token=b3f31b71-2488-4636-a036-e420dc519c2f" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "escribir", + "type": 3 }, { - "id": 897, - "texto": { - "en": "its", - "es": "del" + "id": "uDg7Yy86PlwsAd-U96vJR", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/5388/5388_500.png" }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fdel.webp?alt=media&token=b3f31b71-2488-4636-a036-e420dc519c2f" - }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "arriba", + "type": 4 }, { - "id": 898, - "texto": { - "en": "and", - "es": "e" + "id": "uFoytOG4qsXzBk979t63y", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Flimpio.webp?alt=media&token=47decee5-b701-48b3-876f-58900d8270f8" }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fe.webp?alt=media&token=4b5833d7-9d6a-40f1-a90a-ef23d13ece1b" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "limpio", + "type": 4 }, { - "id": 899, - "texto": { - "en": "he", - "es": "el" - }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fel.webp?alt=media&token=dafa6e53-8f89-4722-9fd5-ca4d1c942aea" + "id": "uMhOF9ZvWnjW-Zrjbjfhs", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/24723/24723_500.png" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "bajar", + "type": 3 }, { - "id": 900, - "texto": { - "en": "she", - "es": "la" + "id": "uOA82KFAVtjoYRTuYFgpr", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpostre.webp?alt=media&token=5ba3ed23-b812-4e40-8693-7972e8671b86" }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fel.webp?alt=media&token=dafa6e53-8f89-4722-9fd5-ca4d1c942aea" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ], + "HORA": [ + "MEDIODIA", + "NOCHE" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "postre", + "type": 2 }, { - "id": 901, - "texto": { - "en": "I like", - "es": "me gusta" + "id": "uPL5NMeXTmD1iU6ZoiROu", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpajaro.webp?alt=media&token=be98ebb6-6c77-46e4-93aa-5f999363d793" }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fgustar.webp?alt=media&token=fe83aa9b-071b-44c6-9a1c-e2e892e0d8b3" - }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "pájaro", + "type": 2 }, { - "id": 903, - "texto": { - "en": "no one", - "es": "nadie" - }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fnadie.webp?alt=media&token=af36278a-a443-4d56-9d03-78a072f0aa56" + "id": "uYElWOlSOSoQap-d5gsYF", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/25940/25940_500.png" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "chocolate", + "type": 2 }, { - "id": 904, - "texto": { - "en": "neither", - "es": "ni" + "id": "uZRwbLa1lEG7ol0UJKRBj", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fviejo_cosa.webp?alt=media&token=501e0dae-62bd-44e2-9025-f1aa3008c602" }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fni.webp?alt=media&token=d2bafbdf-863b-4f34-b4c8-6cddc8031062" + "tags": { + "EDAD": [ + "ADULTO" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "viejo", + "type": 4 }, { - "id": 905, - "texto": { - "en": "none", - "es": "ninguno" + "id": "ubP5GM7_0vPkRc6zbD9Ez", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/8359/8359_500.png" }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fningunos.webp?alt=media&token=0a10497d-0497-462a-bb53-ed6f227bb7b6" - }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "antiácido", + "type": 2 }, { - "id": 906, - "texto": { - "en": "none", - "es": "ninguna" - }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fningunos.webp?alt=media&token=0a10497d-0497-462a-bb53-ed6f227bb7b6" + "id": "uiVc5R86QCZkhraEFlrNz", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/3132/3132_500.png" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "museo", + "type": 2 }, { - "id": 907, - "texto": { - "en": "I don't like", - "es": "no me gusta" + "id": "ujyHgmlPIs7UdtndbYd8S", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Famistad.webp?alt=media&token=4ac81414-1b57-4607-89d0-1dcb7f066355" }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fno_gustar.webp?alt=media&token=e2b175cd-9167-4be8-9b9a-4cffafb7403b" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "amistad", + "type": 6 }, { - "id": 910, - "texto": { - "en": "or", - "es": "o" + "id": "upWXctTSKBtFNSXnXDK_u", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fzid_fruta.webp?alt=media&token=11397b4e-44e3-4d03-a4ea-1409c209b4e6" }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fo.webp?alt=media&token=30bbee61-26e4-42b4-8663-40f542478523" + "tags": { + "GENERO": [ + "HOMBRE", + "MUJER" + ], + "HORA": [ + "MEDIODIA", + "TARDE" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "frutas", + "type": 2 }, { - "id": 911, - "texto": { - "en": "who?", - "es": "quien?" + "id": "uzSwgQNnV8ZrjxpN5Bz_a", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/4629/4629_500.png" }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fquien_es.webp?alt=media&token=c30b2009-2039-4ffb-a85c-12ddf5e68908" - }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "difícil", + "type": 4 }, { - "id": 912, - "texto": { - "en": "that", - "es": "que" + "id": "v-E2GE1DpCkNAxsfA0f4M", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_goma.webp?alt=media&token=3ae9dee2-fd64-41ca-9278-015438dc0bc1" }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fque.webp?alt=media&token=f87f3317-4166-4243-ae02-8dbea7c7e695" + "tags": { + "EDAD": [ + "JOVEN", + "NINO" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "goma", + "type": 2 }, { - "id": 913, - "texto": { - "en": "what?", - "es": "¿Qué?" - }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fque_pregunta.webp?alt=media&token=746d6a83-4d91-4be2-8a20-3cdbf6ecdd0b" + "id": "vHzfvEgIkQ0e73ryfWP2F", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/2872/2872_500.png" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "ordenar", + "type": 3 }, { - "id": 914, - "texto": { - "en": "who?", - "es": "¿Quién?" + "id": "vKGLQIas9RdBnPGsaYtr2", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcometa.webp?alt=media&token=a22a7840-294f-4fe2-aec1-6328f7dfe09c" }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fquien.webp?alt=media&token=94d5cbe4-5aab-4898-b2b3-d335741935ab" + "tags": { + "EDAD": [ + "JOVEN", + "NINO" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "cometa", + "type": 2 }, { - "id": 915, - "texto": { - "en": "who?", - "es": "¿Quiénes?" + "id": "vOgqHjpHgrUGERIHtVqDe", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/8499/8499_500.png" }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fquienes.webp?alt=media&token=52dd1ebb-74ef-4b1a-9cff-0180ed85ea3d" - }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "basurero", + "type": 2 }, { - "id": 918, - "texto": { - "en": "theirs", - "es": "suyos" - }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fsuyos.webp?alt=media&token=1265f18e-c7f5-4f94-852a-76c1f9841d25" + "id": "vPicdKLrhT2wmAAPPukKP", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/5306/5306_500.png" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "veloz", + "type": 4 }, { - "id": 919, - "texto": { - "en": "yours", - "es": "tuyo" + "id": "vPnmrsRou1ihosdVXS_Op", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fzapatilla_de_deporte.webp?alt=media&token=b6c013b5-a117-41ac-b0fc-1ca3754abdf0" }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ftuya.webp?alt=media&token=e38d6e6e-0e88-4374-8d9c-8dc5725de50e" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "zapatitos", + "type": 2 }, { - "id": 920, - "texto": { - "en": "yours", - "es": "tuya" + "id": "vZ9JaTnoj8C0ILYxMNB73", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcalabaza.webp?alt=media&token=c353fe3f-6b3a-48d5-9f2c-3ffdc2db9d18" }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ftuya.webp?alt=media&token=f0b677b3-7fbe-4d02-8e31-ecae0ba9b0da" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ], + "HORA": [ + "MEDIODIA" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "calabaza", + "type": 2 }, { - "id": 923, - "texto": { - "en": "and", - "es": "y" + "id": "vaYJPAsTRvslo2qFOJt60", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/2748/2748_500.png" }, - "tipo": 6, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fy.webp?alt=media&token=a6efd48e-4961-43ff-9827-b72b6b8403d8" - }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "lomo", + "type": 2 }, { - "id": 924, - "texto": { - "en": "overcoat", - "es": "abrigo" + "id": "vazatQ7CrYJFsorVDC5AC", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fleon.webp?alt=media&token=ea99f84a-e3e8-46a5-a24c-d3a81fa0a10e" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fabrigos.webp?alt=media&token=64ed9ddd-1b04-40b4-922e-3280d633c0fe" + "tags": { + "EDAD": [ + "NINO" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "león", + "type": 2 }, { - "id": 928, - "texto": { - "en": "bikini", - "es": "bikini" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fbikinis.webp?alt=media&token=f901e863-6e71-4b05-8275-859616e7f2fe" + "id": "viAHJeLRr_6j9dEi5klj_", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_amarillo.webp?alt=media&token=26bb22a3-04f2-4cb6-b185-06bcdf430c97" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "amarillo", + "type": 4 }, { - "id": 930, - "texto": { - "en": "bag", - "es": "bolsa" + "id": "vlh1Pa6eA0ZrBs3vHzWH7", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Foso.webp?alt=media&token=47e35861-59b3-499a-9e8b-c10d52e6451e" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fbolsa.webp?alt=media&token=e9b61c73-7dfc-4425-8005-56267ca563a4" - }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "oso", + "type": 2 }, { - "id": 931, - "texto": { - "en": "boot", - "es": "bota" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fbota.webp?alt=media&token=8c87ccb0-c105-4fed-8ea6-e126c3000beb" + "id": "vmb_RMIB20QND6VcS0deY", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fbarriga.webp?alt=media&token=485c7a63-7546-4f0a-9da4-0d8fc1b97be0" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "panza", + "type": 2 }, { - "id": 934, - "texto": { - "en": "button", - "es": "botones" + "id": "vq3T-UQGTjX3Z9TlEF12e", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fmayonesa.webp?alt=media&token=1c7844ec-5a64-490a-a59b-e94840792d05" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fbotones.webp?alt=media&token=4ebeb788-7618-46be-9aaf-016d66fc298b" + "tags": { + "HORA": [ + "MEDIODIA", + "NOCHE" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "mayonesa", + "type": 2 }, { - "id": 936, - "texto": { - "en": "scarf", - "es": "bufanda" + "id": "vy-O5Zc5kxY8d-7RROvQI", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/2963/2963_500.png" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fbufandas.webp?alt=media&token=2a6e67eb-235e-4668-9b7f-2c656f174ffc" - }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "jamón", + "type": 2 }, { - "id": 938, - "texto": { - "en": "footwear", - "es": "calzado" + "id": "w4cVxbBDZjeNyHwpBARHQ", + "relations": [ + { + "id": "B1845IfYfPMz2FWpVFIQv", + "value": 2 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fhombro.webp?alt=media&token=3dd8a8f7-1112-481f-bb85-5bc7f1906efe" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcalzado.webp?alt=media&token=aae778c8-0b55-4c4c-9907-e943ef51f77d" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ], + "GENERO": [ + "HOMBRE" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "hombro", + "type": 2 }, { - "id": 939, - "texto": { - "en": "shirt", - "es": "camisa" + "id": "wBLnDZStKj8YLkg2pTCfh", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/30196/30196_500.png" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcamisas.webp?alt=media&token=77ef1c19-9414-4fa7-b3e4-b0e304c724c2" - }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "sentir", + "type": 3 }, { - "id": 940, - "texto": { - "en": "long sleeve", - "es": "camiseta manga larga" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcamiseta_de_manga_larga.webp?alt=media&token=89da6e32-4371-471a-b8cf-d86a43c6e78c" + "id": "wCGb6D4xSVr4UeKXzGIlP", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/5985/5985_500.png" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "disfraces", + "type": 2 }, { - "id": 941, - "texto": { - "en": "jacket", - "es": "campera" + "id": "wcpXeLMBRusfqfrz9s4mF", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpure.webp?alt=media&token=676f1e4f-eac9-4980-bcac-b72f2feefdae" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcampera.webp?alt=media&token=a0569880-f80b-452d-a88c-d7b52d803e0c" - }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "puré", + "type": 2 }, { - "id": 951, - "texto": { - "en": "hat", - "es": "gorro" + "id": "whHwNRVnqeM7BMx6nppiW", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ftigre.webp?alt=media&token=8eb90cc1-2275-4d7d-b109-e051c165fd0f" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fgorro.webp?alt=media&token=7d67441b-5c98-4de4-b963-9dbcaed92805" + "tags": { + "EDAD": [ + "NINO" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "tigre", + "type": 2 }, { - "id": 954, - "texto": { - "en": "jean", - "es": "jean" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fjean.webp?alt=media&token=63fd1bde-8163-458a-a66c-6843038ec3f6" + "id": "wkrNPLGWTqMIy4PJRW9QR", + "relations": [ + { + "id": "rxdfuk6egO7VmZEB3JrUN", + "value": 106 + }, + { + "id": "cb0rJJEYOeEoRU5fDdQQq", + "value": 105 + }, + { + "id": "7WxUVoVQfQOzARU2bf6HP", + "value": 20 + }, + { + "id": "pvXSy-5M4i8kysUppvdME", + "value": 11 + }, + { + "id": "XYY8SV1IAMHjdGjMZxbdy", + "value": 6 + }, + { + "id": "3932Zm0xgk1hKB2hhBAUa", + "value": 5 + }, + { + "id": "9U8MzceIsqKhG86oNx9zV", + "value": 4 + }, + { + "id": "eduqLSyC3m4uB1Oee6dt6", + "value": 4 + }, + { + "id": "Ubaq6h7wasdP_YRombm2c", + "value": 3 + }, + { + "id": "1DjW-XvWN7iOqoJPRSWwY", + "value": 2 + }, + { + "id": "QZNQOaf0SdHDbx1otCmrH", + "value": 2 + }, + { + "id": "ajesFjbC7hwCNLKdif-ix", + "value": 2 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fen.webp?alt=media&token=0cfe18f8-3a5d-429f-bf01-0e8e8426249e" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "en", + "type": 6 }, { - "id": 956, - "texto": { - "en": "overall", - "es": "mono" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fmono.webp?alt=media&token=7a7422c4-a218-41c5-ae87-1f27be86fca5" + "id": "wnfSUkF8-tQiRTVou1_pd", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ffrio_cosa.webp?alt=media&token=d1f315da-7d2b-4894-9123-83e69a3bf671" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "frío", + "type": 4 }, { - "id": 960, - "texto": { - "en": "trouser", - "es": "pantalon" + "id": "x3PNiU1NIeQ3zQa31C8WX", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/22017/22017_500.png" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpantalon.webp?alt=media&token=313784be-798d-44ee-8347-7b8b0ae797f2" - }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "pañal", + "type": 2 }, { - "id": 962, - "texto": { - "en": "shorts", - "es": "pantalones cortos" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpantalones_cortos.webp?alt=media&token=48ca7ec7-555a-40c9-b325-34eddf840149" + "id": "xGsyYCjDzQugVzSaK8CuA", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fduro.webp?alt=media&token=f20a39e0-6a1e-4ac5-9735-cea0cc23bd2c" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "duro", + "type": 4 }, { - "id": 968, - "texto": { - "en": "bra", - "es": "sosten" + "id": "xIgPo3N-aKXhVcjultMiY", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ffactura.webp?alt=media&token=f2d735fa-3b58-438b-90dc-e32e8cb2c276" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fsosten.webp?alt=media&token=1a3d73cc-5ee1-4f01-ab48-45ca047a5443" + "tags": { + "EDAD": [ + "ADULTO" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "factura", + "type": 2 }, { - "id": 969, - "texto": { - "en": "sweater", - "es": "sweater" + "id": "xPUYlxRxgFVn1FHQFz6Ic", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fsecar.webp?alt=media&token=a1539795-90ff-4aaa-b26c-a58016b7683c" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fsweater.webp?alt=media&token=9998eaa9-ac10-4469-a5a4-b4f1a4f7ae11" - }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "secar", + "type": 3 }, { - "id": 971, - "texto": { - "en": "dress", - "es": "vestido" + "id": "xQblStUfyBGO27j15Sda3", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpato.webp?alt=media&token=d828454d-109a-4321-8348-a029423823a0" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fvestido.webp?alt=media&token=d3b3e62b-5471-4bf4-b71a-9c941c4d65f6" + "tags": { + "HORA": [ + "MEDIODIA" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "pato", + "type": 2 }, { - "id": 972, - "texto": { - "en": "bandana", - "es": "vincha" + "id": "xT4BPNmF-5WAQLfs3cUpS", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fenamorado.webp?alt=media&token=4c7e4801-3d0d-4a28-8faf-747e2087b6af" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcinta_de_pelo.webp?alt=media&token=77776f51-148a-40ca-b3d5-761364ca7003" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "enamorado", + "type": 4 }, { - "id": 973, - "texto": { - "en": "shoe", - "es": "zapato" + "id": "xXtjQktuAq1bmxTc0HSQT", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcocacola.webp?alt=media&token=e2196ddc-639b-499e-ab5f-c6d02bae6110" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fzapato.webp?alt=media&token=a51da690-0fca-4643-bc09-9c79079e25c5" + "tags": { + "HORA": [ + "MEDIODIA", + "NOCHE" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "gaseosa", + "type": 2 }, { - "id": 974, - "texto": { - "en": "snicker", - "es": "zapatilla deportiva" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fzapatilla_de_deporte.webp?alt=media&token=b6c013b5-a117-41ac-b0fc-1ca3754abdf0" + "id": "xbPnUL4qxvm30VFYNphh-", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/34841/34841_500.png" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "tíos", + "type": 1 }, { - "id": 975, - "texto": { - "en": "chess", - "es": "el ajedrez" + "id": "xiaTdHGInqfm4rD6XzSeZ", + "relations": [ + { + "id": "RbZetbSC5064rZccOFD1D", + "value": 2 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fencender_la_television.webp?alt=media&token=de8e299d-f53d-40cd-a04f-4d3e5614d84c" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fajedrez.webp?alt=media&token=0a869cce-d01f-4275-b7b2-eb0b91490175" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "encender", + "type": 3 }, { - "id": 976, - "texto": { - "en": "kite", - "es": "el barrilete" + "id": "xnPF8fvkC1TvgETI1JcC9", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Forganos.webp?alt=media&token=65032cca-fd5c-4b8b-9f09-438818366c48" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcometa.webp?alt=media&token=a22a7840-294f-4fe2-aec1-6328f7dfe09c" + "tags": { + "EDAD": [ + "ADULTO" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "órganos", + "type": 2 }, { - "id": 977, - "texto": { - "en": "cubes", - "es": "los cubos" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcubos_apilables.webp?alt=media&token=2b2fa371-b481-4aa8-b1b0-072a4fa934bb" + "id": "xqGzZJIHBeVfSzRfm3rmg", + "relations": [ + { + "id": "wkrNPLGWTqMIy4PJRW9QR", + "value": 3 + }, + { + "id": "B1845IfYfPMz2FWpVFIQv", + "value": 2 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Funo.webp?alt=media&token=86499f4d-0702-4d07-beab-c235b500de25" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "uno", + "type": 6 }, { - "id": 980, - "texto": { - "en": "truck", - "es": "el camión de juguete" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcamion_de_juguete.webp?alt=media&token=95137b41-ea78-4a82-8fcc-9effdb9f08e5" + "id": "xxr0MRGYRmmoNC_gsD9uy", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/6171/6171_500.png" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "pasaporte", + "type": 2 }, { - "id": 981, - "texto": { - "en": "firetruck", - "es": "el coche de bomberos" + "id": "y0SViQxW8Y-yiX1Z7gXWt", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/36728/36728_500.png" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcoche_de_bomberos.webp?alt=media&token=259f65d9-b5bd-4b8d-91cd-df0fca11b6a1" - }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "superhéroe", + "type": 1 }, { - "id": 982, - "texto": { - "en": "kitchenet", - "es": "la cocinita" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcocinita.webp?alt=media&token=5cd82ee3-0664-4aa6-b819-665c6c02fd2f" + "id": "y5W21CKOkLWnYJo1OC700", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/35585/35585_500.png" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "tos", + "type": 2 }, { - "id": 986, - "texto": { - "en": "story", - "es": "el cuento" + "id": "yJoivIPHOm1Y1lj-hGN1J", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/6479/6479_500.png" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcuento.webp?alt=media&token=2f3fa4f7-9f55-424e-a587-8974d1728f84" - }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "dormir", + "type": 3 }, { - "id": 987, - "texto": { - "en": "ballons", - "es": "los globos" + "id": "yNag8CK0wV_iRMnFznsXk", + "relations": [ + { + "id": "9kgRI3KlOIVSuylKffW9g", + "value": 2 + }, + { + "id": "93hsW10TmX3Vcq_4IvcZ0", + "value": 1 + }, + { + "id": "cxMNBGV3LytDXgwDMCiga", + "value": 1 + }, + { + "id": "GxrDtsdGcLepdsQr6V9DT", + "value": 1 + }, + { + "id": "Vzov0z9acB-I1_W_CcFcY", + "value": 1 + } + ], + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpelota.webp?alt=media&token=ae1475c3-af87-493d-8843-3ad0720b6fb8" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fglobos.webp?alt=media&token=1ad716c7-890b-477b-9a8d-c904a0c2c401" + "tags": { + "EDAD": [ + "JOVEN", + "NINO" + ], + "GENERO": [ + "HOMBRE" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "pelota", + "type": 2 }, { - "id": 989, - "texto": { - "en": "toys", - "es": "los juguetes" + "id": "yR9FTtOimFwZG5g5tgpRk", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fvisita.webp?alt=media&token=4767c963-69f9-4565-b120-b25e2a09dd62" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fjuguetes.webp?alt=media&token=046c8f8b-7518-4aac-9c56-6ac6fe4a03ef" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "visita", + "type": 6 }, { - "id": 996, - "texto": { - "en": "ball", - "es": "la pelota" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpelota.webp?alt=media&token=ae1475c3-af87-493d-8843-3ad0720b6fb8" - }, - "relacion": [ + "id": "y_5OURnKxFcv4UiMKntUi", + "relations": [ + { + "id": "cb0rJJEYOeEoRU5fDdQQq", + "value": 23 + }, + { + "id": "rxdfuk6egO7VmZEB3JrUN", + "value": 22 + }, { - "id": 737, - "frec": 2 + "id": "bDnuS19hfd9GhJ-6rjNPD", + "value": 6 }, { - "id": 736, - "frec": 1 + "id": "BQm-YCPc0lfD1-mhecCTL", + "value": 5 }, { - "id": 748, - "frec": 1 + "id": "wkrNPLGWTqMIy4PJRW9QR", + "value": 5 }, { - "id": 749, - "frec": 1 + "id": "CYH_6DL9q1iLLetuWeR9A", + "value": 5 }, { - "id": 746, - "frec": 1 + "id": "CZrETqLgQlvDkLHvw1t_w", + "value": 3 + }, + { + "id": "XeVaDdUWSEkhfJvTVvUHR", + "value": 3 + }, + { + "id": "4f1vqDoAvUu2XYk_JlQdC", + "value": 2 + }, + { + "id": "xqGzZJIHBeVfSzRfm3rmg", + "value": 2 + }, + { + "id": "7Q4Zc0cenSF5U4eKyje1f", + "value": 2 + }, + { + "id": "C29KJ8BTFavhj_R9UfnSv", + "value": 2 + }, + { + "id": "3w62N9b7Cvb6JMjB9Wphi", + "value": 2 + }, + { + "id": "B1845IfYfPMz2FWpVFIQv", + "value": 2 + }, + { + "id": "J3qQMp0OMr5LC9ebfArxH", + "value": 2 + }, + { + "id": "emm_RirDsO30Enax5Q4gd", + "value": 2 } ], - "agenda": 0, - "gps": 0 - }, - { - "id": 1001, - "texto": { - "en": "football", - "es": "la pelota de fútbol" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fpelota_de_futbol.webp?alt=media&token=7cad69b4-d5bc-4464-89b3-f411d7de08bc" - }, - "relacion": [], - "agenda": 0, - "gps": 0 - }, - { - "id": 1005, - "texto": { - "en": "jigsaw", - "es": "el rompecabeza" + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fy.webp?alt=media&token=a6efd48e-4961-43ff-9827-b72b6b8403d8" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Frompecabezas.webp?alt=media&token=a1901342-85d3-4e93-9b0d-2ef3b599d05b" - }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "y", + "type": 6 }, { - "id": 1012, - "texto": { - "en": "pillow", - "es": "la almohada" + "id": "yihsjW9ON0Fr9Yy4ZlP9c", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fsobacos.webp?alt=media&token=50574607-d2a3-4f19-bb41-8bfa08b9ea5c" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Falmohada.webp?alt=media&token=ad78fd9b-ae55-4372-a510-ab4944730826" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "axila", + "type": 2 }, { - "id": 1013, - "texto": { - "en": "movie theater", - "es": "el cine" + "id": "yk2wDVqHEKKwupgm87OJ2", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fnalgas.webp?alt=media&token=f30a68d3-fffd-4a9e-a852-8c7ae5f690ff" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcine.webp?alt=media&token=4109bb74-ab3d-4cda-99fb-34e7030e8762" + "tags": { + "EDAD": [ + "ADULTO" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "nalgas", + "type": 2 }, { - "id": 1014, - "texto": { - "en": "food", - "es": "comida" + "id": "yo00Ci8bSRFYPU6HxGVwX", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_cantar.webp?alt=media&token=b0a7dbc5-47be-4c86-a6be-9811415ce329" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcomida.webp?alt=media&token=20c3c26a-3091-40c6-87b2-6e38230a0e94" + "tags": { + "EDAD": [ + "JOVEN", + "NINO" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "cantar", + "type": 3 }, { - "id": 1016, - "texto": { - "en": "computer", - "es": "la computadora" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fordenador.webp?alt=media&token=9452b67d-5e5c-456a-bb33-1398701f7f00" + "id": "yqlmoVGItXqaeazw3M3eg", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fsofa.webp?alt=media&token=cf5c392c-1c39-469b-bcac-2d32664a210a" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "sillón", + "type": 2 }, { - "id": 1017, - "texto": { - "en": "book", - "es": "el libro" + "id": "yvtvSsBLhabkcpeYGbxQr", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fbota.webp?alt=media&token=8c87ccb0-c105-4fed-8ea6-e126c3000beb" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Flibro.webp?alt=media&token=ce9ae11b-a7e1-48ae-bc73-36358db5e1ec" + "tags": { + "GENERO": [ + "MUJER" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "bota", + "type": 2 }, { - "id": 1019, - "texto": { - "en": "cd player", - "es": "la radio" + "id": "yxa6QVSrmWUKH2PZHKaVl", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Flechuga.webp?alt=media&token=5c996973-d151-4065-b7ca-cdfcc56e4d4f" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fradio_cd.webp?alt=media&token=be52e6f8-9f19-444c-aa13-a1a63c8bae42" + "tags": { + "HORA": [ + "MEDIODIA", + "NOCHE" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "lechuga", + "type": 2 }, { - "id": 1020, - "texto": { - "en": "towel", - "es": "la toalla" + "id": "zANp2EnhT6n0Jcl1Xra6K", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/35747/35747_500.png" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ftoalla.webp?alt=media&token=2364b04f-3636-42c0-b40f-06fca87b6477" - }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "bailarín", + "type": 3 }, { - "id": 1023, - "texto": { - "en": "kitchen", - "es": "cocina" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcocina.webp?alt=media&token=0f13280e-6377-482b-80f8-88b87659718c" + "id": "zAmesi1FcIWLXE3WVa9WS", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/31823/31823_500.png" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "antihistamínico", + "type": 2 }, { - "id": 1024, - "texto": { - "en": "fridge", - "es": "heladera" + "id": "zRTTg5x_P1E8Z3CU-oWXa", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcualquier.webp?alt=media&token=acf40755-f64a-428e-8222-44e1f474ba69" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fnevera.webp?alt=media&token=26ab2e17-fa2b-49cc-875d-1eb22929b367" - }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "cualquiera", + "type": 6 }, { - "id": 1025, - "texto": { - "en": "oven", - "es": "horno" + "id": "zcibOHpRbSmz1hVNSjPTj", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ftenedor.webp?alt=media&token=102c4878-a046-429a-8210-6ae3428a6cd6" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fhorno.webp?alt=media&token=6134b9d8-da69-4b8c-932d-082424a641d1" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ], + "HORA": [ + "MEDIODIA", + "NOCHE" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "tenedor", + "type": 2 }, { - "id": 1026, - "texto": { - "en": "spoon", - "es": "cuchara" + "id": "zdFC3vpgjcyUWB9a4ghRW", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fdescripcion.webp?alt=media&token=4dbde8ba-f144-4a12-90f6-013bf68d912d" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcuchara.webp?alt=media&token=a985b2d4-a436-4a16-a5a1-74d46a653ac1" + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "descripción", + "type": 6 }, { - "id": 1027, - "texto": { - "en": "fork", - "es": "tenedor" + "id": "zi_wcT10fxgn72ZJhVx18", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fvestido.webp?alt=media&token=d3b3e62b-5471-4bf4-b71a-9c941c4d65f6" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Ftenedor.webp?alt=media&token=102c4878-a046-429a-8210-6ae3428a6cd6" + "tags": { + "GENERO": [ + "MUJER" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "vestido", + "type": 2 }, { - "id": 1028, - "texto": { - "en": "knife", - "es": "cuchillo" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcuchillo.webp?alt=media&token=4899f059-2a50-48f5-93af-4cc644e3b935" + "id": "zm_6R89hr4wjuVkifiYrk", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fdespeinado.webp?alt=media&token=8c85ff0d-8102-40e3-a09d-9fc4a0ebf2f1" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "despeinado", + "type": 4 }, { - "id": 1029, - "texto": { - "en": "cook", - "es": "cocinar" + "id": "zrR1DbO_szgKvxLyrZquw", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/34872/34872_500.png" }, - "tipo": 1, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcocinar.webp?alt=media&token=14d1dd93-0ef8-4a5b-966d-572a34f19697" - }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "calefacción", + "type": 2 }, { - "id": 1030, - "texto": { - "en": "sofa", - "es": "sillón" + "id": "zw-o9pDectP5bxFnUjrJO", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fcerdo.webp?alt=media&token=741f2ba1-fe2a-43b2-be72-3a7f30f861d8" }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fsofa.webp?alt=media&token=cf5c392c-1c39-469b-bcac-2d32664a210a" + "tags": { + "HORA": [ + "MEDIODIA", + "NOCHE" + ] }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "chancho", + "type": 2 }, { - "id": 1032, - "texto": { - "en": "table", - "es": "mesa" - }, - "tipo": 2, - "imagen": { - "picto": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fmesa.webp?alt=media&token=3c0f72fe-94eb-411c-a430-a1dd34d529c7" + "id": "zxhRDSHXtV63Sp3c2fjrI", + "resource": { + "asset": "", + "network": "https://static.arasaac.org/pictograms/8483/8483_500.png" }, - "relacion": [], - "agenda": 0, - "gps": 0 + "text": "aduana", + "type": 2 } -] +] \ No newline at end of file diff --git a/assets/profile/profile_help_screen_icon_1.png b/assets/profile/profile_help_screen_icon_1.png new file mode 100644 index 00000000..c4be22e8 Binary files /dev/null and b/assets/profile/profile_help_screen_icon_1.png differ diff --git a/assets/profile/profile_help_screen_icon_2.png b/assets/profile/profile_help_screen_icon_2.png new file mode 100644 index 00000000..348e0087 Binary files /dev/null and b/assets/profile/profile_help_screen_icon_2.png differ diff --git a/assets/profile/tips_icon.png b/assets/profile/tips_icon.png new file mode 100644 index 00000000..a9e21197 Binary files /dev/null and b/assets/profile/tips_icon.png differ diff --git a/assets/profile/user_profile_icon_1.png b/assets/profile/user_profile_icon_1.png new file mode 100644 index 00000000..c8f5cbf8 Binary files /dev/null and b/assets/profile/user_profile_icon_1.png differ diff --git a/assets/profile/user_profile_icon_2.png b/assets/profile/user_profile_icon_2.png new file mode 100644 index 00000000..b8954645 Binary files /dev/null and b/assets/profile/user_profile_icon_2.png differ diff --git a/assets/refresh-Orange.png b/assets/refresh-Orange.png new file mode 100644 index 00000000..f310e08c Binary files /dev/null and b/assets/refresh-Orange.png differ diff --git a/assets/refresh.png b/assets/refresh.png new file mode 100644 index 00000000..09de8a6f Binary files /dev/null and b/assets/refresh.png differ diff --git a/assets/rive/loading_ottaa.riv b/assets/rive/loading_ottaa.riv new file mode 100644 index 00000000..662b9b8e Binary files /dev/null and b/assets/rive/loading_ottaa.riv differ diff --git a/assets/user_settings/accessibility_icon_1.png b/assets/user_settings/accessibility_icon_1.png new file mode 100644 index 00000000..a40e489c Binary files /dev/null and b/assets/user_settings/accessibility_icon_1.png differ diff --git a/assets/user_settings/accessibility_icon_2.png b/assets/user_settings/accessibility_icon_2.png new file mode 100644 index 00000000..b7834aa2 Binary files /dev/null and b/assets/user_settings/accessibility_icon_2.png differ diff --git a/assets/user_settings/accessibility_photo_1.png b/assets/user_settings/accessibility_photo_1.png new file mode 100644 index 00000000..638597b1 Binary files /dev/null and b/assets/user_settings/accessibility_photo_1.png differ diff --git a/assets/user_settings/accessibility_photo_2.png b/assets/user_settings/accessibility_photo_2.png new file mode 100644 index 00000000..1617fc22 Binary files /dev/null and b/assets/user_settings/accessibility_photo_2.png differ diff --git a/assets/user_settings/accessibility_photo_3.png b/assets/user_settings/accessibility_photo_3.png new file mode 100644 index 00000000..7d2cd1ce Binary files /dev/null and b/assets/user_settings/accessibility_photo_3.png differ diff --git a/assets/user_settings/main_settings_icon_1.png b/assets/user_settings/main_settings_icon_1.png new file mode 100644 index 00000000..2748cf64 Binary files /dev/null and b/assets/user_settings/main_settings_icon_1.png differ diff --git a/assets/user_settings/main_settings_icon_2.png b/assets/user_settings/main_settings_icon_2.png new file mode 100644 index 00000000..55e4f5be Binary files /dev/null and b/assets/user_settings/main_settings_icon_2.png differ diff --git a/build.yaml b/build.yaml new file mode 100644 index 00000000..f19d7a8f --- /dev/null +++ b/build.yaml @@ -0,0 +1,12 @@ +targets: + $default: + builders: + injectable_generator:injectable_builder: + options: + auto_register: true + # auto registers any class with a name matches the given pattern + class_name_pattern: + "Service$|Impl$" + # auto registers any class inside a file with a + # name matches the given pattern + file_name_pattern: "_service$|_repository$|_bloc$|_impl$" diff --git a/codemagic.yaml b/codemagic.yaml new file mode 100644 index 00000000..d3d0dada --- /dev/null +++ b/codemagic.yaml @@ -0,0 +1,150 @@ +# Automatically generated on 2023-01-03 UTC from https://codemagic.io/app/633ae2406e6d53fd76823f7f/settings +# Note that this configuration is not an exact match to UI settings. Review and adjust as necessary. + +workflows: + dev-workflow: + name: dev workflow + max_build_duration: 20 + environment: + groups: + - ottaa-flutter + + flutter: 3.7.11 + xcode: latest + cocoapods: default + triggering: + events: + - push + branch_patterns: + - pattern: development + include: true + source: true + tag_patterns: + - pattern: '*' + include: true + scripts: + - name: Setting up the environment + script: | + flutter upgrade + flutter packages pub get + flutter config --enable-web + echo $FIREBASE_JSON | base64 --decode > $FCI_BUILD_DIR/firebase.json + echo $GOOGLE_SERVICES | base64 --decode > $FCI_BUILD_DIR/android/app/google-services.json + echo $ENV | base64 --decode > $FCI_BUILD_DIR/.env + + - name: Testing + script: + flutter test + + - name: Building + script: | + flutter build web --release --web-renderer canvaskit + cd build/web + 7z a -r ../web.zip ./* + + - name: Deploying web + script: + firebase deploy --only hosting:dev-ottaaproject --token "$FIREBASE_TOKEN" + + artifacts: + - build/web.zip + - '*.snap' + - build/windows/**/*.msix + - flutter_drive.log + publishing: + email: + recipients: + - hectoritr@hotmail.com + + + master-workflow: + name: master workflow + max_build_duration: 30 + integrations: + app_store_connect: OTTAAAppStore + environment: + groups: + - ottaa-flutter + flutter: default + xcode: latest + cocoapods: default + ios_signing: + distribution_type: app_store + bundle_identifier: com.ottaaproject.ottaa + vars: + APP_ID: 1668864533 + triggering: + events: + - push + branch_patterns: + - pattern: master + include: true + source: true + tag_patterns: + - pattern: '*' + include: true + + scripts: + - name: Set up key.properties + script: | + echo $FCI_KEYSTORE | base64 --decode > $FCI_KEYSTORE_PATH + cat >> "$FCI_BUILD_DIR/android/key.properties" < "$FCI_BUILD_DIR/android/local.properties" + + - name: Setting up the environment + script: + flutter upgrade + flutter packages pub get + flutter config --enable-web + echo $FIREBASE_JSON | base64 --decode > $FCI_BUILD_DIR/firebase.json + echo $GOOGLE_SERVICES | base64 --decode > $FCI_BUILD_DIR/android/app/google-services.json + echo $ENV | base64 --decode > $FCI_BUILD_DIR/.env + flutter packages pub run build_runner build --delete-conflicting-outputs + + - name: Set up code signing settings on Xcode project + script: xcode-project use-profiles + + - name: Install pods + script: | + find . -name "Podfile" -execdir pod install \; + + - name: Build Android & Web + script: + flutter build appbundle --release --build-name=1.0.$(($BUILD_NUMBER + 1)) --build-number=$(($BUILD_NUMBER + 1)) + flutter build web --release --web-renderer canvaskit + cd build/web + 7z a -r ../web.zip ./* + + - name: Build iOS + script: | + BUILD_NUMBER=$(($(app-store-connect get-latest-app-store-build-number "$APP_ID") + 1)) + flutter build ipa --release \ + --build-name=1.0.$BUILD_NUMBER \ + --build-number=$BUILD_NUMBER + + - name: Deploying web + script: + firebase deploy --only hosting:ottaaproject --token "$FIREBASE_TOKEN" + + artifacts: + - build/**/outputs/apk/**/*.apk + - build/**/outputs/bundle/**/*.aab + - build/**/outputs/**/mapping.txt + - build/web.zip + - '*.snap' + - build/windows/**/*.msix + - build/ios/ipa/*.ipa + - /tmp/xcodebuild_logs/*.log + - flutter_drive.log + publishing: + email: + recipients: + - hectoritr@hotmail.com diff --git a/crowdin.yml b/crowdin.yml index 64732ffe..a99cf7cb 100644 --- a/crowdin.yml +++ b/crowdin.yml @@ -1,3 +1,5 @@ files: - - source: /assets/i18n/es.json + - source: /assets/i18n/es_AR.json translation: /assets/i18n/%locale_with_underscore%.json + - source: /assets/languages/es_AR.json + translation: /assets/languages/%locale_with_underscore%.json diff --git a/firebase.json b/firebase.json index adaa1a42..2f2715fb 100644 --- a/firebase.json +++ b/firebase.json @@ -1,6 +1,7 @@ { - "hosting":[ - { "site":"ottaaproject-flutter", + "hosting": [ + { + "site": "ottaaproject-flutter", "public": "build/web", "ignore": [ "firebase.json", @@ -14,7 +15,8 @@ } ] }, - { "site":"dev-ottaaproject", + { + "site": "dev-ottaaproject", "public": "build/web", "ignore": [ "firebase.json", @@ -29,6 +31,4 @@ ] } ] - -} - +} \ No newline at end of file diff --git a/ios/.gitignore b/ios/.gitignore index 151026b9..7a7f9873 100644 --- a/ios/.gitignore +++ b/ios/.gitignore @@ -1,3 +1,4 @@ +**/dgph *.mode1v3 *.mode2v3 *.moved-aside diff --git a/ios/Flutter/AppFrameworkInfo.plist b/ios/Flutter/AppFrameworkInfo.plist index 8d4492f9..9625e105 100644 --- a/ios/Flutter/AppFrameworkInfo.plist +++ b/ios/Flutter/AppFrameworkInfo.plist @@ -21,6 +21,6 @@ CFBundleVersion 1.0 MinimumOSVersion - 9.0 + 11.0 diff --git a/ios/Podfile b/ios/Podfile new file mode 100644 index 00000000..8a07e80f --- /dev/null +++ b/ios/Podfile @@ -0,0 +1,42 @@ +# Uncomment this line to define a global platform for your project + platform :ios, '16.0' + +# CocoaPods analytics sends network stats synchronously affecting flutter build latency. +ENV['COCOAPODS_DISABLE_STATS'] = 'true' + +project 'Runner', { + 'Debug' => :debug, + 'Profile' => :release, + 'Release' => :release, +} + +def flutter_root + generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__) + unless File.exist?(generated_xcode_build_settings_path) + raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first" + end + + File.foreach(generated_xcode_build_settings_path) do |line| + matches = line.match(/FLUTTER_ROOT\=(.*)/) + return matches[1].strip if matches + end + raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get" +end + +require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) + +flutter_ios_podfile_setup + +target 'Runner' do + use_frameworks! + use_modular_headers! + + flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) +end + +post_install do |installer| + installer.pods_project.targets.each do |target| + flutter_additional_ios_build_settings(target) + + end +end diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index e956e4bc..be5b4937 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -3,15 +3,15 @@ archiveVersion = 1; classes = { }; - objectVersion = 51; + objectVersion = 54; objects = { /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; - 411C52A9E7C511044368DE79 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 34EA2C355246212C8C072E08 /* Pods_Runner.framework */; }; - 729855B127AACC5300FE7578 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 729855B027AACC5300FE7578 /* GoogleService-Info.plist */; }; + 7234228F2A18F13300342D88 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 7234228E2A18F13200342D88 /* GoogleService-Info.plist */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; + 79D983F69E8B8A0D19E497EE /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FF399D1209334B04009F121B /* Pods_Runner.framework */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; @@ -31,16 +31,16 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 141DBC16CC80A9B0A175ED0D /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; - 34EA2C355246212C8C072E08 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 729855B027AACC5300FE7578 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; + 4A5A7451D36DE31D979FD8FA /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + 5403D70F87245BF217C05FCB /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 7234228E2A18F13200342D88 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; + 72EA9CAB2A30A8CF0022AB08 /* Runner.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Runner.entitlements; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; - 96781113B1DD4166E3EDE877 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -48,7 +48,8 @@ 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - A8CA4C6FDEB24B7079A44988 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + DEDD5A724870E0F55D89F2B6 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + FF399D1209334B04009F121B /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -56,27 +57,19 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 411C52A9E7C511044368DE79 /* Pods_Runner.framework in Frameworks */, + 79D983F69E8B8A0D19E497EE /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 41E4637D620F93C68546A490 /* Frameworks */ = { + 1B9C197EF024164A5E251CF2 /* Pods */ = { isa = PBXGroup; children = ( - 34EA2C355246212C8C072E08 /* Pods_Runner.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; - 548EC9CF274625B7894C879E /* Pods */ = { - isa = PBXGroup; - children = ( - 96781113B1DD4166E3EDE877 /* Pods-Runner.debug.xcconfig */, - 141DBC16CC80A9B0A175ED0D /* Pods-Runner.release.xcconfig */, - A8CA4C6FDEB24B7079A44988 /* Pods-Runner.profile.xcconfig */, + 4A5A7451D36DE31D979FD8FA /* Pods-Runner.debug.xcconfig */, + 5403D70F87245BF217C05FCB /* Pods-Runner.release.xcconfig */, + DEDD5A724870E0F55D89F2B6 /* Pods-Runner.profile.xcconfig */, ); path = Pods; sourceTree = ""; @@ -98,8 +91,8 @@ 9740EEB11CF90186004384FC /* Flutter */, 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, - 548EC9CF274625B7894C879E /* Pods */, - 41E4637D620F93C68546A490 /* Frameworks */, + 1B9C197EF024164A5E251CF2 /* Pods */, + 9E60A7492E09F88D4218E14F /* Frameworks */, ); sourceTree = ""; }; @@ -114,7 +107,8 @@ 97C146F01CF9000F007C117D /* Runner */ = { isa = PBXGroup; children = ( - 729855B027AACC5300FE7578 /* GoogleService-Info.plist */, + 72EA9CAB2A30A8CF0022AB08 /* Runner.entitlements */, + 7234228E2A18F13200342D88 /* GoogleService-Info.plist */, 97C146FA1CF9000F007C117D /* Main.storyboard */, 97C146FD1CF9000F007C117D /* Assets.xcassets */, 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, @@ -127,6 +121,14 @@ path = Runner; sourceTree = ""; }; + 9E60A7492E09F88D4218E14F /* Frameworks */ = { + isa = PBXGroup; + children = ( + FF399D1209334B04009F121B /* Pods_Runner.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -134,15 +136,14 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 226D57371B40B5525F940D73 /* [CP] Check Pods Manifest.lock */, + F14CCD00FD72D66B735AADEA /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - 8A7E9B05BDBE9C0B3ECD5318 /* [CP] Embed Pods Frameworks */, - D0E0B4EE0AA30CC34DFFDF55 /* [CP] Copy Pods Resources */, + EF9B596E0A8FEBCDB2EFF1A6 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -159,7 +160,7 @@ 97C146E61CF9000F007C117D /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 1320; + LastUpgradeCheck = 1300; ORGANIZATIONNAME = ""; TargetAttributes = { 97C146ED1CF9000F007C117D = { @@ -193,52 +194,46 @@ files = ( 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, + 7234228F2A18F13300342D88 /* GoogleService-Info.plist in Resources */, 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, - 729855B127AACC5300FE7578 /* GoogleService-Info.plist in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 226D57371B40B5525F940D73 /* [CP] Check Pods Manifest.lock */ = { + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputFileListPaths = ( - ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( ); + name = "Thin Binary"; outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; - 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); inputPaths = ( ); - name = "Thin Binary"; + name = "Run Script"; outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build\n"; }; - 8A7E9B05BDBE9C0B3ECD5318 /* [CP] Embed Pods Frameworks */ = { + EF9B596E0A8FEBCDB2EFF1A6 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -255,35 +250,26 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; - 9740EEB61CF901F6004384FC /* Run Script */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 12; - files = ( - ); - inputPaths = ( - ); - name = "Run Script"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build\n"; - }; - D0E0B4EE0AA30CC34DFFDF55 /* [CP] Copy Pods Resources */ = { + F14CCD00FD72D66B735AADEA /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-input-files.xcfilelist", ); - name = "[CP] Copy Pods Resources"; + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-output-files.xcfilelist", + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; /* End PBXShellScriptBuildPhase section */ @@ -343,7 +329,6 @@ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; @@ -362,7 +347,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; @@ -376,16 +361,19 @@ baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + BUILD_LIBRARY_FOR_DISTRIBUTION = NO; CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = B8F23B5Y2B; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 15.2; + INFOPLIST_KEY_CFBundleDisplayName = "OTTAA PROJECT"; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = com.ottaaproject.flutter; + PRODUCT_BUNDLE_IDENTIFIER = com.ottaaproject.ottaa; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_VERSION = 5.0; @@ -416,7 +404,6 @@ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; @@ -441,7 +428,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -472,7 +459,6 @@ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; @@ -491,7 +477,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; @@ -507,16 +493,19 @@ baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + BUILD_LIBRARY_FOR_DISTRIBUTION = NO; CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = B8F23B5Y2B; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 15.2; + INFOPLIST_KEY_CFBundleDisplayName = "OTTAA PROJECT"; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = com.ottaaproject.flutter; + PRODUCT_BUNDLE_IDENTIFIER = com.ottaaproject.ottaa; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; @@ -530,16 +519,19 @@ baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + BUILD_LIBRARY_FOR_DISTRIBUTION = NO; CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = B8F23B5Y2B; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 15.2; + INFOPLIST_KEY_CFBundleDisplayName = "OTTAA PROJECT"; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = com.ottaaproject.flutter; + PRODUCT_BUNDLE_IDENTIFIER = com.ottaaproject.ottaa; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_VERSION = 5.0; diff --git a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 2852ce3a..c87d15a3 100644 --- a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -1,6 +1,6 @@ Bool { GeneratedPluginRegistrant.register(with: self) + // This function registers the desired plugins to be used within a notification background action + SwiftAwesomeNotificationsPlugin.setPluginRegistrantCallback { registry in + SwiftAwesomeNotificationsPlugin.register( + with: registry.registrar(forPlugin: "io.flutter.plugins.awesomenotifications.AwesomeNotificationsPlugin")!) + } return super.application(application, didFinishLaunchingWithOptions: launchOptions) } } diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-20@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-20@2x.png new file mode 100644 index 00000000..1ffcd118 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-20@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-20@2x~ipad.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-20@2x~ipad.png new file mode 100644 index 00000000..1ffcd118 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-20@2x~ipad.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-20@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-20@3x.png new file mode 100644 index 00000000..417ee46c Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-20@3x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-20~ipad.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-20~ipad.png new file mode 100644 index 00000000..d6863bff Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-20~ipad.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-29.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-29.png new file mode 100644 index 00000000..0d16f044 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-29.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-29@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-29@2x.png new file mode 100644 index 00000000..be4f7a58 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-29@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-29@2x~ipad.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-29@2x~ipad.png new file mode 100644 index 00000000..be4f7a58 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-29@2x~ipad.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-29@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-29@3x.png new file mode 100644 index 00000000..fdab9fa9 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-29@3x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-29~ipad.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-29~ipad.png new file mode 100644 index 00000000..0d16f044 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-29~ipad.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-40@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-40@2x.png new file mode 100644 index 00000000..1b65d31c Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-40@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-40@2x~ipad.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-40@2x~ipad.png new file mode 100644 index 00000000..1b65d31c Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-40@2x~ipad.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-40@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-40@3x.png new file mode 100644 index 00000000..645acbee Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-40@3x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-40~ipad.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-40~ipad.png new file mode 100644 index 00000000..1ffcd118 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-40~ipad.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-60@2x~car.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-60@2x~car.png new file mode 100644 index 00000000..645acbee Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-60@2x~car.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-60@3x~car.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-60@3x~car.png new file mode 100644 index 00000000..03486385 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-60@3x~car.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-83.5@2x~ipad.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-83.5@2x~ipad.png new file mode 100644 index 00000000..0ecbea38 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-83.5@2x~ipad.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon@2x.png new file mode 100644 index 00000000..645acbee Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon@2x~ipad.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon@2x~ipad.png new file mode 100644 index 00000000..4cc0a0f8 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon@2x~ipad.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon@3x.png new file mode 100644 index 00000000..03486385 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon@3x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon~ios-marketing.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon~ios-marketing.png new file mode 100644 index 00000000..3f1d3c90 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon~ios-marketing.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon~ipad.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon~ipad.png new file mode 100644 index 00000000..ede3cb42 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon~ipad.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json index d36b1fab..bd04914a 100644 --- a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json +++ b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -1,122 +1,134 @@ { - "images" : [ + "images": [ { - "size" : "20x20", - "idiom" : "iphone", - "filename" : "Icon-App-20x20@2x.png", - "scale" : "2x" + "filename": "AppIcon@2x.png", + "idiom": "iphone", + "scale": "2x", + "size": "60x60" }, { - "size" : "20x20", - "idiom" : "iphone", - "filename" : "Icon-App-20x20@3x.png", - "scale" : "3x" + "filename": "AppIcon@3x.png", + "idiom": "iphone", + "scale": "3x", + "size": "60x60" }, { - "size" : "29x29", - "idiom" : "iphone", - "filename" : "Icon-App-29x29@1x.png", - "scale" : "1x" + "filename": "AppIcon~ipad.png", + "idiom": "ipad", + "scale": "1x", + "size": "76x76" }, { - "size" : "29x29", - "idiom" : "iphone", - "filename" : "Icon-App-29x29@2x.png", - "scale" : "2x" + "filename": "AppIcon@2x~ipad.png", + "idiom": "ipad", + "scale": "2x", + "size": "76x76" }, { - "size" : "29x29", - "idiom" : "iphone", - "filename" : "Icon-App-29x29@3x.png", - "scale" : "3x" + "filename": "AppIcon-83.5@2x~ipad.png", + "idiom": "ipad", + "scale": "2x", + "size": "83.5x83.5" }, { - "size" : "40x40", - "idiom" : "iphone", - "filename" : "Icon-App-40x40@2x.png", - "scale" : "2x" + "filename": "AppIcon-40@2x.png", + "idiom": "iphone", + "scale": "2x", + "size": "40x40" }, { - "size" : "40x40", - "idiom" : "iphone", - "filename" : "Icon-App-40x40@3x.png", - "scale" : "3x" + "filename": "AppIcon-40@3x.png", + "idiom": "iphone", + "scale": "3x", + "size": "40x40" }, { - "size" : "60x60", - "idiom" : "iphone", - "filename" : "Icon-App-60x60@2x.png", - "scale" : "2x" + "filename": "AppIcon-40~ipad.png", + "idiom": "ipad", + "scale": "1x", + "size": "40x40" }, { - "size" : "60x60", - "idiom" : "iphone", - "filename" : "Icon-App-60x60@3x.png", - "scale" : "3x" + "filename": "AppIcon-40@2x~ipad.png", + "idiom": "ipad", + "scale": "2x", + "size": "40x40" }, { - "size" : "20x20", - "idiom" : "ipad", - "filename" : "Icon-App-20x20@1x.png", - "scale" : "1x" + "filename": "AppIcon-20@2x.png", + "idiom": "iphone", + "scale": "2x", + "size": "20x20" }, { - "size" : "20x20", - "idiom" : "ipad", - "filename" : "Icon-App-20x20@2x.png", - "scale" : "2x" + "filename": "AppIcon-20@3x.png", + "idiom": "iphone", + "scale": "3x", + "size": "20x20" }, { - "size" : "29x29", - "idiom" : "ipad", - "filename" : "Icon-App-29x29@1x.png", - "scale" : "1x" + "filename": "AppIcon-20~ipad.png", + "idiom": "ipad", + "scale": "1x", + "size": "20x20" }, { - "size" : "29x29", - "idiom" : "ipad", - "filename" : "Icon-App-29x29@2x.png", - "scale" : "2x" + "filename": "AppIcon-20@2x~ipad.png", + "idiom": "ipad", + "scale": "2x", + "size": "20x20" }, { - "size" : "40x40", - "idiom" : "ipad", - "filename" : "Icon-App-40x40@1x.png", - "scale" : "1x" + "filename": "AppIcon-29.png", + "idiom": "iphone", + "scale": "1x", + "size": "29x29" }, { - "size" : "40x40", - "idiom" : "ipad", - "filename" : "Icon-App-40x40@2x.png", - "scale" : "2x" + "filename": "AppIcon-29@2x.png", + "idiom": "iphone", + "scale": "2x", + "size": "29x29" }, { - "size" : "76x76", - "idiom" : "ipad", - "filename" : "Icon-App-76x76@1x.png", - "scale" : "1x" + "filename": "AppIcon-29@3x.png", + "idiom": "iphone", + "scale": "3x", + "size": "29x29" }, { - "size" : "76x76", - "idiom" : "ipad", - "filename" : "Icon-App-76x76@2x.png", - "scale" : "2x" + "filename": "AppIcon-29~ipad.png", + "idiom": "ipad", + "scale": "1x", + "size": "29x29" }, { - "size" : "83.5x83.5", - "idiom" : "ipad", - "filename" : "Icon-App-83.5x83.5@2x.png", - "scale" : "2x" + "filename": "AppIcon-29@2x~ipad.png", + "idiom": "ipad", + "scale": "2x", + "size": "29x29" }, { - "size" : "1024x1024", - "idiom" : "ios-marketing", - "filename" : "Icon-App-1024x1024@1x.png", - "scale" : "1x" + "filename": "AppIcon-60@2x~car.png", + "idiom": "car", + "scale": "2x", + "size": "60x60" + }, + { + "filename": "AppIcon-60@3x~car.png", + "idiom": "car", + "scale": "3x", + "size": "60x60" + }, + { + "filename": "AppIcon~ios-marketing.png", + "idiom": "ios-marketing", + "scale": "1x", + "size": "1024x1024" } ], - "info" : { - "version" : 1, - "author" : "xcode" + "info": { + "author": "iconkitchen", + "version": 1 } -} +} \ No newline at end of file diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist new file mode 100644 index 00000000..e681db0b --- /dev/null +++ b/ios/Runner/Info.plist @@ -0,0 +1,75 @@ + + + + + CADisableMinimumFrameDurationOnPhone + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleDisplayName + OTTAA PROJECT + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + com.ottaaproject.ottaa + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleSignature + ???? + CFBundleURLTypes + + + CFBundleTypeRole + Editor + CFBundleURLSchemes + + + + + + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + FirebaseMessagingAutoInitEnabled + + LSRequiresIPhoneOS + + NSMicrophoneUsageDescription + Microphone allows you to record custom voices & sounds. + NSCameraUsageDescription + Camera allows user to take pictures and use them in app. + NSPhotoLibraryUsageDescription + Photos & Images allows you to create customized pictograms. + UIApplicationSupportsIndirectInputEvents + + UIBackgroundModes + + fetch + remote-notification + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UIViewControllerBasedStatusBarAppearance + + + diff --git a/ios/Runner/Runner.entitlements b/ios/Runner/Runner.entitlements new file mode 100644 index 00000000..a430a85e --- /dev/null +++ b/ios/Runner/Runner.entitlements @@ -0,0 +1,14 @@ + + + + + aps-environment + development + com.apple.developer.applesignin + + Default + + com.apple.developer.user-fonts + + + diff --git a/lib/application/adapters/datetime_adapter.dart b/lib/application/adapters/datetime_adapter.dart new file mode 100644 index 00000000..d3b3dbdb --- /dev/null +++ b/lib/application/adapters/datetime_adapter.dart @@ -0,0 +1,17 @@ +import 'package:hive_flutter/hive_flutter.dart'; + +class DateTimeAdapter extends TypeAdapter { + @override + final typeId = 16; + + @override + DateTime read(BinaryReader reader) { + final micros = reader.readInt(); + return DateTime.fromMillisecondsSinceEpoch(micros); + } + + @override + void write(BinaryWriter writer, DateTime obj) { + writer.writeInt(obj.millisecondsSinceEpoch); + } +} diff --git a/lib/application/application.dart b/lib/application/application.dart index 4c777d93..97a28ddd 100644 --- a/lib/application/application.dart +++ b/lib/application/application.dart @@ -1,16 +1,31 @@ import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:ottaa_project_flutter/application/common/i18n.dart'; +import 'package:ottaa_project_flutter/application/locator.dart'; import 'package:ottaa_project_flutter/application/router/app_router.dart'; -import 'package:ottaa_project_flutter/application/theme/app_theme.dart'; +import 'package:ottaa_ui_kit/theme.dart'; -class Application extends StatelessWidget { +final appRouter = AppRouter.instance.buildRouter(); + +class Application extends ConsumerStatefulWidget { const Application({super.key}); + @override + ConsumerState createState() => _ApplicationState(); +} + +class _ApplicationState extends ConsumerState { @override Widget build(BuildContext context) { - return MaterialApp.router( - debugShowCheckedModeBanner: false, - routerConfig: appRouterSingleton.router, - theme: AppTheme.instance.defaultThemeData(), + return I18nNotifier( + notifier: getIt.get(), + child: MaterialApp.router( + title: "OTTAA Project", + debugShowCheckedModeBanner: false, + routerConfig: appRouter, + theme: kOttaaLightThemeData, + restorationScopeId: 'root', + ), ); } } diff --git a/lib/application/common/app_images.dart b/lib/application/common/app_images.dart index a19e6464..fb4a33bc 100644 --- a/lib/application/common/app_images.dart +++ b/lib/application/common/app_images.dart @@ -179,8 +179,7 @@ class AppImages { static const kCamisas = "assets/imgs/camisas.webp"; - static const kCamisetaDeMangaLarga = - "assets/imgs/camiseta_de_manga_larga.webp"; + static const kCamisetaDeMangaLarga = "assets/imgs/camiseta_de_manga_larga.webp"; static const kCampera = "assets/imgs/campera.webp"; @@ -382,8 +381,7 @@ class AppImages { static const kEnamorados = "assets/imgs/enamorados.webp"; - static const kEncenderLaTelevision = - "assets/imgs/encender_la_television.webp"; + static const kEncenderLaTelevision = "assets/imgs/encender_la_television.webp"; static const kEnfermo = "assets/imgs/enfermo.webp"; @@ -571,8 +569,7 @@ class AppImages { static const kIcCanalDeportes = "assets/imgs/ic_canal_deportes.webp"; - static const kIcCanalDibujosAnimados = - "assets/imgs/ic_canal_dibujos_animados.webp"; + static const kIcCanalDibujosAnimados = "assets/imgs/ic_canal_dibujos_animados.webp"; static const kIcCanalNoticiero = "assets/imgs/ic_canal_noticiero.webp"; @@ -600,8 +597,7 @@ class AppImages { static const kIcClases = "assets/imgs/ic_clases.webp"; - static const kIcCloudDownloadBlack24dp = - "assets/imgs/ic_cloud_download_black_24dp.webp"; + static const kIcCloudDownloadBlack24dp = "assets/imgs/ic_cloud_download_black_24dp.webp"; static const kIcColores = "assets/imgs/ic_colores.webp"; @@ -617,8 +613,7 @@ class AppImages { static const kIcControlRemoto = "assets/imgs/ic_control_remoto.webp"; - static const kIcControlarTelevision = - "assets/imgs/ic_controlar_television.webp"; + static const kIcControlarTelevision = "assets/imgs/ic_controlar_television.webp"; static const kIcCorner = "assets/imgs/ic_corner.webp"; @@ -744,8 +739,7 @@ class AppImages { static const kIcHambre = "assets/imgs/ic_hambre.webp"; - static const kIcHelpOutlineWhite24dp = - "assets/imgs/ic_help_outline_white_24dp.webp"; + static const kIcHelpOutlineWhite24dp = "assets/imgs/ic_help_outline_white_24dp.webp"; static const kIcHermano = "assets/imgs/ic_hermano.webp"; @@ -821,8 +815,7 @@ class AppImages { static const kIcModifiers = "assets/imgs/ic_modifiers.webp"; - static const kIcMoreVertWhite24dp = - "assets/imgs/ic_more_vert_white_24dp.webp"; + static const kIcMoreVertWhite24dp = "assets/imgs/ic_more_vert_white_24dp.webp"; static const kIcMujer = "assets/imgs/ic_mujer.webp"; @@ -954,11 +947,9 @@ class AppImages { static const kIcVioleta = "assets/imgs/ic_violeta.webp"; - static const kIcVolumeOffWhite24dp = - "assets/imgs/ic_volume_off_white_24dp.webp"; + static const kIcVolumeOffWhite24dp = "assets/imgs/ic_volume_off_white_24dp.webp"; - static const kIcVolumeUpWhite24dp = - "assets/imgs/ic_volume_up_white_24dp.webp"; + static const kIcVolumeUpWhite24dp = "assets/imgs/ic_volume_up_white_24dp.webp"; static const kIcVolumenMenos = "assets/imgs/ic_volumen_menos.webp"; @@ -1058,8 +1049,7 @@ class AppImages { static const kLibroViaje = "assets/imgs/libro_viaje.webp"; - static const kLicenciaAccesibilidad = - "assets/imgs/licencia_accesibilidad.webp"; + static const kLicenciaAccesibilidad = "assets/imgs/licencia_accesibilidad.webp"; static const kLicenciaGames = "assets/imgs/licencia_games.webp"; @@ -1453,8 +1443,7 @@ class AppImages { static const kSweater = "assets/imgs/sweater.webp"; - static const kTableroDeComunicacion = - "assets/imgs/tablero_de_comunicacion.webp"; + static const kTableroDeComunicacion = "assets/imgs/tablero_de_comunicacion.webp"; static const kTagHorarioWhite = "assets/imgs/tag_horario_white.webp"; @@ -1572,8 +1561,7 @@ class AppImages { static const kZapato = "assets/imgs/zapato.webp"; - static const kZicAddCircleOutlineWhite24dp = - "assets/imgs/zic_add_circle_outline_white_24dp.webp"; + static const kZicAddCircleOutlineWhite24dp = "assets/imgs/zic_add_circle_outline_white_24dp.webp"; static const kZicV1Perdonar = "assets/imgs/zic_v1_perdonar.webp"; @@ -1605,8 +1593,7 @@ class AppImages { static const kZidGripe = "assets/imgs/zid_gripe.webp"; - static const kZidHamburguesaYPatatasFritas = - "assets/imgs/zid_hamburguesa_y_patatas_fritas.webp"; + static const kZidHamburguesaYPatatasFritas = "assets/imgs/zid_hamburguesa_y_patatas_fritas.webp"; static const kZidHelado = "assets/imgs/zid_helado.webp"; @@ -1644,16 +1631,13 @@ class AppImages { static const kOttaaDrawerLogo = "assets/otta_drawer_logo.png"; - static const kProfileIcon1 = - "assets/profile/profile_chooser_screen_icon_1.png"; + static const kProfileIcon1 = "assets/profile/profile_chooser_screen_icon_1.png"; - static const kProfileIcon2 = - "assets/profile/profile_chooser_screen_icon_2.png"; + static const kProfileIcon2 = "assets/profile/profile_chooser_screen_icon_2.png"; static const kNotificationIcon = "assets/profile/notification_icon.png"; - static const kProfileMainScreenIcon = - "assets/profile/profile_main_screen_icon2.png"; + static const kProfileMainScreenIcon = "assets/profile/profile_main_screen_icon2.png"; static const kProfileAddIcon = "assets/profile/profile_add_icon.png"; @@ -1661,20 +1645,81 @@ class AppImages { static const kProfileOttaalogo = "assets/profile/profile_ottaa_logo.png"; - static const kProfileSettingsIcon1 = - "assets/profile/profile_settings_icon_1.png"; - - static const kProfileSettingsIcon2 = - "assets/profile/profile_settings_icon_2.png"; - - static const kProfileSettingsIcon3 = - "assets/profile/profile_settings_icon_3.png"; - - static const kProfileSettingsIcon4 = - "assets/profile/profile_settings_icon_4.png"; - - static const kProfileSettingsIcon5 = - "assets/profile/profile_settings_icon_5.png"; - static const kTestImage = - 'https://cdn.pixabay.com/photo/2020/05/25/17/21/link-5219567_1280.jpg'; + static const kProfileSettingsIcon1 = "assets/profile/profile_settings_icon_1.png"; + + static const kProfileSettingsIcon2 = "assets/profile/profile_settings_icon_2.png"; + + static const kProfileSettingsIcon3 = "assets/profile/profile_settings_icon_3.png"; + + static const kProfileSettingsIcon4 = "assets/profile/profile_settings_icon_4.png"; + + static const kProfileSettingsIcon5 = "assets/profile/profile_settings_icon_5.png"; + static const kTestImage = 'https://cdn.pixabay.com/photo/2020/05/25/17/21/link-5219567_1280.jpg'; + static const kProfileHelpIcon1 = 'assets/profile/profile_help_screen_icon_1.png'; + + static const kProfileHelpIcon2 = 'assets/profile/profile_help_screen_icon_2.png'; + + static const kOnboardingFirstScreen = 'assets/onboarding/1.png'; + static const kOnboardingSecondScreen = 'assets/onboarding/2.png'; + static const kOnboardingThirdScreen = 'assets/onboarding/3.png'; + + static const kOttaaTablet = 'assets/ottaa_tablet.png'; + + static const kBoardImageEdit1 = 'assets/board/board_edit_image_1.png'; + + static const kBoardImageEdit2 = 'assets/board/board_edit_image_2.png'; + + static const kBoardFavouriteIcon = "assets/board/icons/icons_not_selected/favourite.png"; + static const kBoardHistoryIcon = "assets/board/icons/icons_not_selected/history.png"; + static const kBoardCameraIcon = "assets/board/icons/icons_not_selected/camara.png"; + static const kBoardDiceIcon = "assets/board/icons/icons_not_selected/dice.png"; + static const kBoardYesIcon = "assets/board/icons/icons_not_selected/yes.png"; + static const kBoardNoIcon = "assets/board/icons/icons_not_selected/no.png"; + static const kBoardShareIcon = "assets/board/icons/icons_not_selected/share.png"; + + static const kBoardFavouriteIconSelected = "assets/board/icons/icons_selected/favourite.png"; + static const kBoardHistoryIconSelected = "assets/board/icons/icons_selected/history.png"; + static const kBoardDiceIconSelected = "assets/board/icons/icons_selected/dice.png"; + static const kBoardCameraIconSelected = "assets/board/icons/icons_selected/camara.png"; + static const kBoardYesIconSelected = "assets/board/icons/icons_selected/yes.png"; + static const kBoardNoIconSelected = "assets/board/icons/icons_selected/no.png"; + static const kBoardShareIconSelected = "assets/board/icons/icons_selected/share.png"; + static const kBoardCustomizeWaitIcon = "assets/board/customize_wait_icon.png"; + static const kProfileTipsIcon = 'assets/profile/icon_tips.png'; + static const kCustomizePictoIcon = 'assets/edit/picto/picto_edit_icon.png'; + static const kDeletePictoIcon = 'assets/edit/picto/delete_picto_icon.png'; + static const kProfileUserIcon1 = 'assets/profile/user_profile_icon_1.png'; + static const kProfileUserIcon2 = 'assets/profile/user_profile_icon_2.png'; + + static const kOttaaMinimalist = 'assets/Ottaa.png'; + static const kOttaaMinimalistOrange = 'assets/Ottaa-orange.png'; + static const kDelete = 'assets/Delete.png'; + static const kDeleteOrange = 'assets/Delete-orange.png'; + + static const kSearch = 'assets/Buscar.png'; + static const kSearchOrange = 'assets/Buscar-Orange.png'; + static const kRefresh = 'assets/refresh.png'; + static const kRefreshOrange = 'assets/refresh-Orange.png'; + static const kAccessibilityIcon1 = 'assets/user_settings/accessibility_icon_1.png'; + static const kAccessibilityIcon2 = 'assets/user_settings/accessibility_icon_2.png'; + static const kAccessibilityPhoto1 = 'assets/user_settings/accessibility_photo_1.png'; + static const kAccessibilityPhoto2 = 'assets/user_settings/accessibility_photo_2.png'; + static const kAccessibilityPhoto3 = 'assets/user_settings/accessibility_photo_3.png'; + static const kMainSettingsIcon1 = 'assets/user_settings/main_settings_icon_1.png'; + static const kMainSettingsIcon2 = 'assets/user_settings/main_settings_icon_2.png'; + static const kGameBackgroundIcon = 'assets/games_images/game_icon.png'; + static const kGameSelectPhoto = 'assets/games_images/game_select_photo'; + static const kGameSearch = 'assets/games_images/game_search.png'; + static const kGamesMark = 'assets/games_images/mark.png'; + static const kGamesTrophy = 'assets/games_images/trophy.png'; + static const kAddIcon = 'assets/games_images/icon_add.png'; + static const kOttaa = 'assets/games_images/speak_logo.png'; + static const kSaveIcon = 'assets/games_images/save_icon.png'; + static const kShareIcon = 'assets/games_images/share_icon.png'; + + static const kArsacImage = 'assets/edit/arsac_image.png'; + static const kCameraIcon = 'assets/edit/camera_icon.png'; + static const kGalleryIcon = 'assets/edit/gallery_icon.png'; + static const kSearchPhoto = 'assets/edit/search_data.png'; + static const kBoardSelectImage = 'assets/edit/board_select_image.png'; } diff --git a/lib/application/common/constants.dart b/lib/application/common/constants.dart index a29e8381..b03b5a33 100644 --- a/lib/application/common/constants.dart +++ b/lib/application/common/constants.dart @@ -9,4 +9,4 @@ const kPortuguesePictoName = 'pt-BR'; const kFrenchGrupoName = 'fr-FR'; const kPortugueseGrupoName = 'pt-BR'; const kMostUsedSentences = 'MostUsedFrases'; -const kFavouriteSentences = 'FavouriteFrases'; \ No newline at end of file +const kFavouriteSentences = 'FavouriteFrases'; diff --git a/lib/application/common/extensions/translate_string.dart b/lib/application/common/extensions/translate_string.dart index 77bdd01a..1465ba30 100644 --- a/lib/application/common/extensions/translate_string.dart +++ b/lib/application/common/extensions/translate_string.dart @@ -3,6 +3,32 @@ import 'package:ottaa_project_flutter/application/locator.dart'; extension TranslateString on String { String get trl { - return locator.get().currentLanguage.translations[this] ?? this; + final currentTree = getIt.get().currentLanguage; + + if (currentTree == null) { + return this; + } + + return currentTree.translate(this) ?? this; + } + + String trlf([Map? args]) { + final translation = trl; + + if (args == null) { + return translation; + } + + if (args.isEmpty) { + return translation; + } + + String result = translation; + + args.forEach((key, value) { + result = result.replaceAll("{$key}", value.toString()); + }); + + return result; } } diff --git a/lib/application/common/extensions/user_extension.dart b/lib/application/common/extensions/user_extension.dart new file mode 100644 index 00000000..c48ecc20 --- /dev/null +++ b/lib/application/common/extensions/user_extension.dart @@ -0,0 +1,31 @@ +import 'package:ottaa_project_flutter/core/abstracts/user_model.dart'; +import 'package:ottaa_project_flutter/core/enums/user_types.dart'; +import 'package:ottaa_project_flutter/core/models/base_user_model.dart'; +import 'package:ottaa_project_flutter/core/models/caregiver_user_model.dart'; +import 'package:ottaa_project_flutter/core/models/patient_user_model.dart'; + +extension User on UserModel { + PatientUserModel get patient { + return this as PatientUserModel; + } + + bool get isPatient { + return type == UserType.user; + } + + bool get isCaregiver { + return type == UserType.caregiver; + } + + bool get isNone { + return type == UserType.none; + } + + CaregiverUserModel get caregiver { + return this as CaregiverUserModel; + } + + BaseUserModel get base { + return this as BaseUserModel; + } +} diff --git a/lib/application/common/extensions/validator_string.dart b/lib/application/common/extensions/validator_string.dart new file mode 100644 index 00000000..071282ea --- /dev/null +++ b/lib/application/common/extensions/validator_string.dart @@ -0,0 +1,19 @@ +extension ValidatorString on String { + bool get isEmail { + final RegExp regex = RegExp( + r'^[a-zA-Z0-9.]+@[a-zA-Z0-9]+\.[a-zA-Z]+', + caseSensitive: false, + multiLine: false, + ); + return regex.hasMatch(this); + } + + bool get isPassword { + final RegExp regex = RegExp( + r'^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d]{8,}$', + caseSensitive: false, + multiLine: false, + ); + return regex.hasMatch(this); + } +} diff --git a/lib/application/common/i18n.dart b/lib/application/common/i18n.dart index 0e9326de..d1c106e2 100644 --- a/lib/application/common/i18n.dart +++ b/lib/application/common/i18n.dart @@ -1,47 +1,87 @@ import 'dart:convert'; +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import 'package:ottaa_project_flutter/application/language/file_language.dart'; -import 'package:ottaa_project_flutter/application/language/spanish.dart'; -import 'package:ottaa_project_flutter/core/abstracts/language.dart'; +import 'package:injectable/injectable.dart'; +import 'package:ottaa_project_flutter/application/language/translation_tree.dart'; +import 'package:universal_io/io.dart'; -const defaultFallbackLanguage = SpanishLanguage(); +const Map supportedLocales = { + "es_AR": Locale("es", "AR"), + "en_US": Locale("en", "US"), + "it_IT": Locale("it", "IT"), + "pt_BR": Locale("pt", "BR"), + "ca_ES": Locale("ca", "ES"), + "es_CL": Locale("es", "CL"), + "es_CO": Locale("es", "CO"), + "es_ES": Locale("es", "ES"), + "ur_PK": Locale("ur", "PK"), +}; -class I18N { - final Map _languages = {"es": defaultFallbackLanguage}; +@Singleton() +class I18N extends ChangeNotifier { + final Map _languages = {}; + final platformLanguages = { + "es": const Locale("es", "CO"), + "en": const Locale("en", "US"), + "it": const Locale("it", "IT"), + "pt": const Locale("pt", "BR"), + }; - final String languageCode; - late Language _currentLanguage; + late Locale currentLocale; + TranslationTree? _currentLanguage; - I18N(this.languageCode); + TranslationTree? get currentLanguage => _currentLanguage; + + @FactoryMethod(preResolve: true) + static Future start() => I18N().init(); Future init() async { + final List deviceLanguage = Platform.localeName.split('_'); + + if (deviceLanguage.length == 2) { + currentLocale = Locale(deviceLanguage[0], deviceLanguage[1]); + } else { + currentLocale = platformLanguages[deviceLanguage[0]] ?? const Locale("es", "CO"); + } + + String languageCode = "${currentLocale.languageCode}_${currentLocale.countryCode}"; + + if (!supportedLocales.containsKey(languageCode)) { + languageCode = platformLanguages[currentLocale.languageCode]?.toString() ?? "es_CO"; + } + if (_languages.containsKey(languageCode)) { _currentLanguage = _languages[languageCode]!; return this; } - final newLanguage = await loadLanguage(languageCode); + TranslationTree? newLanguage = await loadTranslation(currentLocale); + newLanguage ??= await loadTranslation(const Locale("es", "CO")); - if (newLanguage != null) { - _languages[languageCode] = newLanguage; - _currentLanguage = newLanguage; - } else { - _currentLanguage = defaultFallbackLanguage; - } + _languages.putIfAbsent(languageCode, () => newLanguage!); + _currentLanguage = newLanguage; return this; } - Future loadLanguage(String languageCode) async { + Future loadTranslation(Locale locale) async { try { + final languageCode = "${locale.languageCode}_${locale.countryCode}"; + + if (_languages.containsKey(languageCode)) { + return _languages[languageCode]; + } + final languageString = await rootBundle.loadString("assets/i18n/$languageCode.json"); - FileLanguage newLanguage = FileLanguage( - languageCode: languageCode, - translations: Map.from(json.decode(languageString)), - ); + //We execute this in a compute function to avoid blocking the UI thread + final languageJson = await compute(json.decode, languageString) as Map; + + final newLanguage = TranslationTree(locale); + + newLanguage.addTranslations(languageJson); return newLanguage; } catch (e) { @@ -49,13 +89,52 @@ class I18N { } } - Language get currentLanguage => _currentLanguage; + Future changeLanguage(String languageCode) async { + if (languageCode == 'en_US') { + final languageString = await rootBundle.loadString("assets/i18n/$languageCode.json"); + final languageJson = json.decode(languageString) as Map; + Locale locale = const Locale('en', 'US'); + final newLanguage = TranslationTree(locale); + newLanguage.addTranslations(languageJson); + _languages[locale.toString()] = newLanguage; + _currentLanguage = _languages[locale.toString()]; + currentLocale = locale; + notify(); + return; + } + var split = languageCode.split("_"); + assert(split.length == 2, "Language code must be in the format: languageCode_countryCode (en_US)"); + Locale locale = Locale(split[0], split[1]); + await changeLanguageFromLocale(locale); + notify(); + } + + Future changeLanguageFromLocale(Locale locale) async { + assert(locale.countryCode != null, "Locale must have a country code"); - void changeLanguage(String languageCode) { - _currentLanguage = _languages[languageCode] ?? const SpanishLanguage(); + if (!supportedLocales.containsKey(locale.toString())) return; + TranslationTree? newLanguage = _languages[locale.toString()] ?? await loadTranslation(locale); + if (newLanguage == null) { + throw Exception("Language not found"); + } + _languages[locale.toString()] ??= newLanguage; + _currentLanguage = _languages[locale.toString()]; + currentLocale = locale; + notify(); + } + + void notify() { + notifyListeners(); } - void changeLanguageFromLocale(Locale locale) { - changeLanguage(locale.languageCode); + static I18N of(BuildContext context) => (context.dependOnInheritedWidgetOfExactType())!.notifier!; +} + +class I18nNotifier extends InheritedNotifier { + const I18nNotifier({super.key, super.notifier, required super.child}); + + @override + bool updateShouldNotify(I18nNotifier oldWidget) { + return true; } } diff --git a/lib/application/common/screen_helpers.dart b/lib/application/common/screen_helpers.dart new file mode 100644 index 00000000..0e605068 --- /dev/null +++ b/lib/application/common/screen_helpers.dart @@ -0,0 +1,19 @@ +import 'package:flutter/services.dart'; + +Future blockPortraitMode() async { + await SystemChrome.setPreferredOrientations([ + DeviceOrientation.portraitUp, + DeviceOrientation.portraitDown, + ]); +} + +Future blockLandscapeMode() async { + await SystemChrome.setPreferredOrientations([ + DeviceOrientation.landscapeLeft, + DeviceOrientation.landscapeRight, + ]); +} + +Future unblockRotation() async { + await SystemChrome.setPreferredOrientations([]); +} diff --git a/lib/application/common/time_helper.dart b/lib/application/common/time_helper.dart new file mode 100644 index 00000000..e7d04a4b --- /dev/null +++ b/lib/application/common/time_helper.dart @@ -0,0 +1,14 @@ +import 'package:intl/intl.dart'; + +extension TimeHelper on DateTime { + String get timeString { + return DateFormat("dd/MM/yy HH:mm").format(this); + } + + DateTime get timezonedDate { + final timeZoneOffset = DateTime.now().timeZoneOffset; + return DateTime.fromMillisecondsSinceEpoch(millisecondsSinceEpoch) + .add(timeZoneOffset) + .toLocal(); + } +} diff --git a/lib/application/language/file_language.dart b/lib/application/language/file_language.dart deleted file mode 100644 index f81e76ea..00000000 --- a/lib/application/language/file_language.dart +++ /dev/null @@ -1,11 +0,0 @@ -import 'package:ottaa_project_flutter/core/abstracts/language.dart'; - -class FileLanguage implements Language { - const FileLanguage({required this.languageCode, required this.translations}); - - @override - final String languageCode; - - @override - final Map translations; -} diff --git a/lib/application/language/spanish.dart b/lib/application/language/spanish.dart deleted file mode 100644 index 06ebf7ff..00000000 --- a/lib/application/language/spanish.dart +++ /dev/null @@ -1,177 +0,0 @@ -import 'package:ottaa_project_flutter/core/abstracts/language.dart'; - -class SpanishLanguage implements Language { - const SpanishLanguage(); - - @override - String get languageCode => "es"; - - @override - Map get translations => { - "hello_world": "Hola Mundo", - "we_are_preparing_everything": "Estamos preparando todo...", - "Hello": "Hola", - "Continue": "Continuar", - "Please_register_to": "Por favor regístrese en", - "Login_with_google": "Acceder con Google", - "Login_with_facebook": "Acceder con Facebook", - "Welcome_this_is_ottaa": "Bienvenidos, esto es OTTAA", - "We_help_thousands_of_children_with_speech_problems_to_communicate_improving_their_quality_of_life": - "Ayudamos a miles de niños con problemas de habla a comunicarse, mejorando su calidad de vida", - "Previous": "Anterior", - "Next": "Siguiente", - "Thank_you_for_choosing_ottaa_project": - "Gracias por elegir OTTAA PROJECT", - "please_enter_some_text": "Por favor ingrese un texto", - "Name": "Nombre", - "Gender": "Genero", - "Date_of_birth": "Fecha de Nacimiento", - "Lets_get_to_knwo_each_other_first": "Vamos a conocernos primero", - "We_are_going_to_collect_some_data_to_get_to_know_you_better": - "Vamos a recolectar algunos datos para conocerte mejor", - "Launch_short_tutorial": "TUTORIAL CORTO", - "Do_a_guided_workshop": "HACER UN TALLER GUIADO", - "Book_a_demo": "RESERVA UNA DEMO", - "Ottaa_is_a_powerful_communication_tool": - "OTTAA es una potente\nherramienta de comunicación", - "We_offer_you_different_options_so_that_you_learn_how_to_use_it_and_get_the_most_out_of_it": - "Te ofrecemos diferentes opciones para que aprendas a usarla y sques el mayor provecho", - "Choose_your_avatar": "Escoge tu Avatar", - "Final_step_join": "Paso final, unete", - "Create_your_avatar_to_be_able_to_recognize_you_all_the_time": - "Crea tu Avatar para poder reconocerte todo el tiempo", - "Create_your_phrase": "CREA TUS FRASES", - "step1_long": - "Toca uno o más de los pictogramas para crear una frase tan larga cómo quieras. Los pictogramas se relacionan automáticamente y siempre tendrás un pictograma más para agregar", - "Talk_to_the_world": "HABLA CON EL MUNDO", - "step2_long": - "Una vez creada la frase, toca el logo de OTTAA par hablar en voz alta o usando el ícono de compartir, podrás enviar tu frase a través de las redes sociales más usadas", - "Access_thousands_of_pictograms": "ACCEDE A MILES DE PICTOGRAMAS", - "Step3_long": - "En OTTAA tenés acceso a miles de pictogramas para que hables de lo que quieras. Encuentra la Galería de Pîctos en la esquina inferior izquierda de la pantalla principal", - "Ready": "Listo", - "Step4_long": - "Entra a la selección de juegos para aprender jugando. OTTAA cuenta con juegos didácticos para aprender vocabulario, conceptos y mucho más. Además, pronto habrá más juegos disponibles", - "Play_and_learn": "JUEGA Y APRENDE", - "Male": "Masculino", - "Female": "Femenino", - "Binary": "Binary", - "Fluid": "Fluid", - "Other": "Other", - "hola_nnos_conozcamos_un_poco": "Hola,\nNos conozcamos un poco", - "vamos_a_pedirte_cierta_informaci_n_para_nmejorar_tu_experiencia_con_ottaa": - "Vamos a pedirte cierta información para\nmejorar tu experiencia con OTTAA", - "check_if_the_info_is_correct_nif_not_change_it_as_you_wish_this_will_help_us_to_personalize_the_app_for_you": - "Comprueba si la información es correcta,\nsi no, cámbiala como quieras. Esto nos ayudará a personalizar la aplicación para ti.", - "te_ofrecemos_varias_opciones_para_naprender_a_utilizarla_y_sacarle_el_maximo_provecho": - "Te ofrecemos varias opciones para\naprender a utilizarla y sacarle el maximo provecho", - "por_ltimo": "Por Ultimo!", - "elige_un_personaje_que_nmejor_te_represente": - "Elige un personaje que mejor te represente", - "edit_pictogram": "Editar pictograma", - "text": "Texto", - "frame": "Marco", - "tags": "Tag", - "keep_your_ottaa_up_to_date": "Mantenga su OTTAA actualizada", - "account_info": "Informacion de cuenta", - "account": "Cuenta", - "account_type": "Tipo de cuenta", - "current_ottaa_installed": "OTTAA actual instalado", - "current_ottaa_version": "Versión actual de OTTAA", - "device_name": "Nombre del dispositivo", - "contact_support": "Soporte de contacto", - "edit": "Editar", - "delete": "Borrar", - "fitzgerald_key": "clave fitzgerald", - "actions": "Comportamiento", - "interactions": "Interacciones", - "people": "gente", - "nouns": "Sustantivos", - "adjectives": "adjetivos", - "miscellaneous": "Diverso", - "choose_a_tag": "Elige una ETIQUETA", - "tags_widget_long_1": - "Al elegir las ETIQUETAS, necesita predecir mejor cuándo mostrar ciertos pictogramas, según la hora, la ubicación, el calendario o el clima.", - "text_widget_long_1": - "Ingrese el texto para decirlo en voz alta, puede ser una sola palabra o una oración completa. ¡Depende de ti!", - "important": "Importante", - "do_you_want_to_save_changes": "Quieres guardar los cambios", - "no": "No", - "yes": "sí", - "go_back": "Regresa", - "choose_an_option": "Elige una opcion", - "camera": "Cámara", - "gallery": "Galería", - "download_from_arasaac": "Descargar desde ARASAAC", - "tags_will_come_in_next_release": - "Los TAG aparecerán en la próxima versión", - "mute": "Silenciar", - "about_ottaa": "Acerca de OTTAA", - "configuration": "Configuración", - "tutorial": "Tutorial", - "close_application": "Cierra la aplicación", - "sign_out": "Desconectar", - "language": "Idioma", - "ottaa_labs": "Laboratorios OTTAa", - "language_page_long_1": - "Usa la inteligencia artificial para generar una oración más rica. Necesitas una conexión a Internet estable.", - "settings": "Ajustes", - "SETTINGS": "AJUSTES", - "pictograms": "Pictogramas", - "prediction": "Predicción", - "accessibility": "Accesibilidad", - "voice_and_subtitles": "Voz y subtítulos", - "all_phrases": "Todas las frases", - "search": "Búsqueda", - "please_enter_a_valid_search": "Por favor ingrese una búsqueda válida", - "choose_a_picto_to_speak": "Elige un Picto para hablar", - "we_are_working_on_this_feature": - "Estamos trabajando en esta funcionalidad", - "most_used_sentences": "Oraciones más usadas", - "price_one": - "Obtenga acceso hoy a todas las funciones útiles que OTTAA Premium tiene para ofrecer por solo 990 ARS al mes.", - "purchase_subscription": "COMPRAR SUSCRIPCIÓN", - "sentence_1": - "Accede a juegos educativos que te permiten evaluar vocabulario de una manera divertida", - "sentence_2": - "Use OTTAA Project con escaneo de pantalla, conéctese accesible Botones y mucho más.", - "sentence_3": - "Con la versión premium puedes usar el GPS para tener una mejor predicción basada en el comercio o lugar donde te encuentres", - "whats_the_picto": "¿Cual es el Picto ?", - "report": "Reporte", - "game1": - "Responde a las preguntas eligiendo el pictograma adecuado. ¡Aprende jugando!", - "match_picto": "Igualar pictogramas", - "game2": "Adjunta el pictograma correctamente", - "memory_game": "Juego de memoria", - "game3": "Prueba tu memoria", - "play": "JUGAR", - "select_a_category_to_play": "Seleccione una categoría para jugar", - "image": "Imagen", - "share_text": - "por favor, crea una frase y selecciona el botón de compartir", - "text_to_speche_engine": "MOTOR DE TEXTO A VOZ", - "enable_custom_tts": "Habilitar TTS personalizado", - "speech_rate": "Nivel de conversación", - "speech_pitch": "Tono de voz", - "SUBTITLE": "SUBTITULAR", - "customized_subtitle": "subtítulo personalizado", - "size": "Tamaño", - "upperCase": "Mayúsculas", - "it_allows_uppercase_subtitles": "Permite subtítulos en mayúsculas", - "login_screen": - "Hola, bienvenido a OTTAA Project, la primera plataforma de comunicación predictiva para personas con problemas del habla, inicie sesión con su cuenta y complete algunos datos para beneficiarse de nuestra predicción.", - "ottaa_score": "OTTAA Score", - "most_used_groups": "Grupos más usados", - "score_text_1": - "OTTAA Score es una medida del uso en general de la aplicación, usando datos como uso en los últimos días y promedio de pictos por frase", - "phrases_last_seven_days": "Frases creadas en los últimos 7 días", - "pictogram_by_sentence_on_average": - "Pictogramas por frases en promedio", - "most_used_phrases": "Frases Mas Usadas", - "vocabulary": "Vocabulario", - "add_group": "Añadir grupo", - "add_pict": "Agregar imagen", - "galeria_grupos": "Galeria Grupos", - }; -} diff --git a/lib/application/language/translation_tree.dart b/lib/application/language/translation_tree.dart new file mode 100644 index 00000000..3dcf6619 --- /dev/null +++ b/lib/application/language/translation_tree.dart @@ -0,0 +1,65 @@ +import 'dart:ui'; + +import 'package:ottaa_project_flutter/application/language/translation_tree_node.dart'; + +class TranslationTree { + final Locale locale; + final TranslationTreeNode root = TranslationTreeNode(); + + TranslationTree(this.locale); + + void addTranslation(String key, String translation) { + final sections = key.split("."); + TranslationTreeNode currentNode = root; + + for (final section in sections) { + currentNode.children ??= {}; + currentNode.children!.putIfAbsent(section, () => TranslationTreeNode()); + currentNode = currentNode.children![section]!; + } + + currentNode.translation = translation; + } + + String buildKeyFromMap(Map map, String key) { + String newKey = ""; + map.forEach((key, value) { + if (value is Map) { + newKey = buildKeyFromMap(value, key); + } else { + newKey = key; + } + }); + return "$key.$newKey"; + } + + void processMap(Map translations, String? parentKey) { + translations.forEach((key, value) { + final String fullKey = parentKey != null ? "$parentKey.$key" : key; + if (value is String) { + addTranslation(fullKey, value); + } else { + processMap(value, fullKey); + } + }); + } + + void addTranslations(Map translations) { + processMap(translations, null); + } + + String? translate(String key) { + final sections = key.split("."); + TranslationTreeNode currentNode = root; + + for (final section in sections) { + if (currentNode.children == null || currentNode.children!.isEmpty || !currentNode.children!.containsKey(section)) { + return null; + } + + currentNode = currentNode.children![section]!; + } + + return currentNode.translation; + } +} diff --git a/lib/application/language/translation_tree_node.dart b/lib/application/language/translation_tree_node.dart new file mode 100644 index 00000000..bb2e9161 --- /dev/null +++ b/lib/application/language/translation_tree_node.dart @@ -0,0 +1,9 @@ +class TranslationTreeNode { + Map? children; + String? translation; + + TranslationTreeNode({ + this.translation, + this.children, + }); +} diff --git a/lib/application/locator.config.dart b/lib/application/locator.config.dart new file mode 100644 index 00000000..c6c84989 --- /dev/null +++ b/lib/application/locator.config.dart @@ -0,0 +1,204 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +// ************************************************************************** +// InjectableConfigGenerator +// ************************************************************************** + +// ignore_for_file: unnecessary_lambdas +// ignore_for_file: lines_longer_than_80_chars +// coverage:ignore-file + +// ignore_for_file: no_leading_underscores_for_library_prefixes +import 'package:get_it/get_it.dart' as _i1; +import 'package:injectable/injectable.dart' as _i2; +import 'package:ottaa_project_flutter/application/common/i18n.dart' as _i3; +import 'package:ottaa_project_flutter/application/service/about_service.dart' + as _i48; +import 'package:ottaa_project_flutter/application/service/auth_service.dart' + as _i21; +import 'package:ottaa_project_flutter/application/service/chatgpt_service.dart' + as _i23; +import 'package:ottaa_project_flutter/application/service/create_picto_services.dart' + as _i33; +import 'package:ottaa_project_flutter/application/service/customise_service.dart' + as _i35; +import 'package:ottaa_project_flutter/application/service/groups_service.dart' + as _i50; +import 'package:ottaa_project_flutter/application/service/hive_database.dart' + as _i5; +import 'package:ottaa_project_flutter/application/service/local_storage_service.dart' + as _i7; +import 'package:ottaa_project_flutter/application/service/notifications_service_impl.dart' + as _i9; +import 'package:ottaa_project_flutter/application/service/pictograms_service.dart' + as _i52; +import 'package:ottaa_project_flutter/application/service/profile_services.dart' + as _i41; +import 'package:ottaa_project_flutter/application/service/remote_config_service.dart' + as _i11; +import 'package:ottaa_project_flutter/application/service/remote_storage_service.dart' + as _i43; +import 'package:ottaa_project_flutter/application/service/report_service.dart' + as _i45; +import 'package:ottaa_project_flutter/application/service/sentences_service.dart' + as _i47; +import 'package:ottaa_project_flutter/application/service/server_service.dart' + as _i13; +import 'package:ottaa_project_flutter/application/service/tts_service.dart' + as _i15; +import 'package:ottaa_project_flutter/application/service/user_settings_service.dart' + as _i17; +import 'package:ottaa_project_flutter/application/use_cases/create_email_token_impl.dart' + as _i25; +import 'package:ottaa_project_flutter/application/use_cases/create_group_impl.dart' + as _i27; +import 'package:ottaa_project_flutter/application/use_cases/create_phrase_impl.dart' + as _i29; +import 'package:ottaa_project_flutter/application/use_cases/create_picto_impl.dart' + as _i31; +import 'package:ottaa_project_flutter/application/use_cases/learn_pictogram_impl.dart' + as _i37; +import 'package:ottaa_project_flutter/application/use_cases/predict_pictogram_impl.dart' + as _i39; +import 'package:ottaa_project_flutter/application/use_cases/verify_email_token_impl.dart' + as _i19; +import 'package:ottaa_project_flutter/core/repositories/auth_repository.dart' + as _i20; +import 'package:ottaa_project_flutter/core/repositories/create_picto_repository.dart' + as _i32; +import 'package:ottaa_project_flutter/core/repositories/customise_repository.dart' + as _i34; +import 'package:ottaa_project_flutter/core/repositories/groups_repository.dart' + as _i49; +import 'package:ottaa_project_flutter/core/repositories/local_database_repository.dart' + as _i4; +import 'package:ottaa_project_flutter/core/repositories/local_storage_repository.dart' + as _i6; +import 'package:ottaa_project_flutter/core/repositories/pictograms_repository.dart' + as _i51; +import 'package:ottaa_project_flutter/core/repositories/profile_repository.dart' + as _i40; +import 'package:ottaa_project_flutter/core/repositories/remote_config_repository.dart' + as _i10; +import 'package:ottaa_project_flutter/core/repositories/remote_storage_repository.dart' + as _i42; +import 'package:ottaa_project_flutter/core/repositories/report_repository.dart' + as _i44; +import 'package:ottaa_project_flutter/core/repositories/repositories.dart' + as _i22; +import 'package:ottaa_project_flutter/core/repositories/sentences_repository.dart' + as _i46; +import 'package:ottaa_project_flutter/core/repositories/server_repository.dart' + as _i12; +import 'package:ottaa_project_flutter/core/repositories/tts_repository.dart' + as _i14; +import 'package:ottaa_project_flutter/core/repositories/user_settings_repository.dart' + as _i16; +import 'package:ottaa_project_flutter/core/service/notifications_service.dart' + as _i8; +import 'package:ottaa_project_flutter/core/use_cases/create_email_token.dart' + as _i24; +import 'package:ottaa_project_flutter/core/use_cases/create_group_data.dart' + as _i26; +import 'package:ottaa_project_flutter/core/use_cases/create_phrase_data.dart' + as _i28; +import 'package:ottaa_project_flutter/core/use_cases/create_picto_data.dart' + as _i30; +import 'package:ottaa_project_flutter/core/use_cases/learn_pictogram.dart' + as _i36; +import 'package:ottaa_project_flutter/core/use_cases/predict_pictogram.dart' + as _i38; +import 'package:ottaa_project_flutter/core/use_cases/verify_email_token.dart' + as _i18; + +extension GetItInjectableX on _i1.GetIt { + // initializes the registration of main-scope dependencies inside of GetIt + Future<_i1.GetIt> init({ + String? environment, + _i2.EnvironmentFilter? environmentFilter, + }) async { + final gh = _i2.GetItHelper( + this, + environment, + environmentFilter, + ); + await gh.singletonAsync<_i3.I18N>( + () => _i3.I18N.start(), + preResolve: true, + ); + await gh.singletonAsync<_i4.LocalDatabaseRepository>( + () => _i5.HiveDatabase.start(), + preResolve: true, + ); + gh.singleton<_i6.LocalStorageRepository>(_i7.LocalStorageService.start()); + await gh.singletonAsync<_i8.NotificationsService>( + () => _i9.NotificationsServiceImpl.onInit(gh<_i3.I18N>()), + preResolve: true, + ); + await gh.singletonAsync<_i10.RemoteConfigRepository>( + () => _i11.RemoteConfigService.start(), + preResolve: true, + ); + gh.singleton<_i12.ServerRepository>(_i13.ServerService.create()); + gh.singleton<_i14.TTSRepository>(_i15.TTSService.create(gh<_i3.I18N>())); + gh.singleton<_i16.UserSettingRepository>( + _i17.UserSettingsService(gh<_i12.ServerRepository>())); + gh.singleton<_i18.VerifyEmailToken>( + _i19.VerifyEmailTokenImpl(gh<_i12.ServerRepository>())); + gh.singleton<_i20.AuthRepository>(_i21.AuthService.from( + gh<_i4.LocalDatabaseRepository>(), + gh<_i12.ServerRepository>(), + gh<_i3.I18N>(), + )); + gh.singleton<_i22.ChatGPTRepository>(_i23.ChatGPTService( + gh<_i22.ServerRepository>(), + gh<_i22.RemoteConfigRepository>(), + )); + gh.singleton<_i24.CreateEmailToken>( + _i25.CreateEmailTokenImpl(gh<_i12.ServerRepository>())); + gh.singleton<_i26.CreateGroupData>( + _i27.CreateGroupDataImpl(gh<_i12.ServerRepository>())); + gh.singleton<_i28.CreatePhraseData>( + _i29.CreatePhraseDataImpl(gh<_i12.ServerRepository>())); + gh.singleton<_i30.CreatePictoData>( + _i31.CreatePictoDataImpl(gh<_i12.ServerRepository>())); + gh.singleton<_i32.CreatePictoRepository>( + _i33.CreatePictoServices(gh<_i22.ServerRepository>())); + gh.singleton<_i34.CustomiseRepository>( + _i35.CustomiseService(gh<_i12.ServerRepository>())); + gh.singleton<_i36.LearnPictogram>( + _i37.LearnPictogramImpl(serverRepository: gh<_i22.ServerRepository>())); + gh.singleton<_i38.PredictPictogram>(_i39.PredictPictogramImpl( + serverRepository: gh<_i22.ServerRepository>())); + gh.singleton<_i40.ProfileRepository>( + _i41.ProfileService(gh<_i12.ServerRepository>())); + gh.singleton<_i42.RemoteStorageRepository>(_i43.RemoteStorageService.from( + gh<_i20.AuthRepository>(), + gh<_i12.ServerRepository>(), + gh<_i3.I18N>(), + )); + gh.singleton<_i44.ReportRepository>( + _i45.ReportService(gh<_i12.ServerRepository>())); + gh.singleton<_i46.SentencesRepository>(_i47.SentencesService( + gh<_i20.AuthRepository>(), + gh<_i12.ServerRepository>(), + )); + gh.singleton<_i22.AboutRepository>(_i48.AboutService( + gh<_i22.AuthRepository>(), + gh<_i22.ServerRepository>(), + gh<_i22.LocalDatabaseRepository>(), + )); + gh.singleton<_i49.GroupsRepository>(_i50.GroupsService( + gh<_i20.AuthRepository>(), + gh<_i42.RemoteStorageRepository>(), + gh<_i12.ServerRepository>(), + )); + gh.singleton<_i51.PictogramsRepository>(_i52.PictogramsService( + gh<_i20.AuthRepository>(), + gh<_i12.ServerRepository>(), + gh<_i42.RemoteStorageRepository>(), + gh<_i6.LocalStorageRepository>(), + )); + return this; + } +} diff --git a/lib/application/locator.dart b/lib/application/locator.dart index 402dbc20..b5639230 100644 --- a/lib/application/locator.dart +++ b/lib/application/locator.dart @@ -1,68 +1,16 @@ import 'package:flutter/foundation.dart'; import 'package:get_it/get_it.dart'; -import 'package:intl/intl.dart'; -import 'package:ottaa_project_flutter/application/common/i18n.dart'; -import 'package:ottaa_project_flutter/application/service/server_service.dart'; -import 'package:ottaa_project_flutter/application/service/sql_database.dart'; -import 'package:ottaa_project_flutter/application/service/auth_service.dart'; -import 'package:ottaa_project_flutter/application/service/groups_service.dart'; -import 'package:ottaa_project_flutter/application/service/local_storage_service.dart'; -import 'package:ottaa_project_flutter/application/service/mobile_remote_storage_service.dart'; -import 'package:ottaa_project_flutter/application/service/pictograms_service.dart'; -import 'package:ottaa_project_flutter/application/service/sentences_service.dart'; -import 'package:ottaa_project_flutter/application/service/tts_service.dart'; -import 'package:ottaa_project_flutter/application/service/web_remote_storage_service.dart'; -import 'package:ottaa_project_flutter/core/repositories/about_repository.dart'; -import 'package:ottaa_project_flutter/core/repositories/auth_repository.dart'; -import 'package:ottaa_project_flutter/core/repositories/groups_repository.dart'; -import 'package:ottaa_project_flutter/core/repositories/local_database_repository.dart'; -import 'package:ottaa_project_flutter/core/repositories/local_storage_repository.dart'; -import 'package:ottaa_project_flutter/core/repositories/pictograms_repository.dart'; -import 'package:ottaa_project_flutter/core/repositories/remote_storage_repository.dart'; -import 'package:ottaa_project_flutter/core/repositories/sentences_repository.dart'; -import 'package:ottaa_project_flutter/core/repositories/server_repository.dart'; -import 'package:ottaa_project_flutter/core/repositories/tts_repository.dart'; -import 'service/about_service.dart'; +import 'package:injectable/injectable.dart'; +import 'package:ottaa_project_flutter/application/locator.config.dart'; -final locator = GetIt.instance; +final getIt = GetIt.instance; -Future setupServices() async { - final deviceLocale = Intl.getCurrentLocale().split("_")[0]; +const desktop = Environment('desktop'); - final LocalDatabaseRepository databaseRepository = SqlDatabase(); - await databaseRepository.init(); +// const bool _kIsDesktop = bool.fromEnvironment('dart.vm.product'); - final ServerRepository serverRepository = ServerService(); - - final i18n = await I18N(deviceLocale).init(); - - final AuthRepository authService = AuthService(databaseRepository, serverRepository); - final LocalStorageRepository localStorageService = LocalStorageService(); - late final RemoteStorageRepository remoteStorageService; - - if (kIsWeb) { - remoteStorageService = WebRemoteStorageService(authService, serverRepository, i18n); - } else { - remoteStorageService = MobileRemoteStorageService(authService, serverRepository, i18n); - } - - final PictogramsRepository pictogramsService = PictogramsService(authService, serverRepository, remoteStorageService); - - final GroupsRepository groupsService = GroupsService(authService, remoteStorageService, serverRepository); - - final AboutRepository aboutService = AboutService(authService, serverRepository); - final SentencesRepository sentencesService = SentencesService(authService, serverRepository); - final TTSRepository ttsService = TTSService(); - - locator.registerSingleton(i18n); - locator.registerSingleton(databaseRepository); - locator.registerSingleton(serverRepository); - locator.registerSingleton(ttsService); - locator.registerSingleton(authService); - locator.registerSingleton(localStorageService); - locator.registerSingleton(remoteStorageService); - locator.registerSingleton(pictogramsService); - locator.registerSingleton(groupsService); - locator.registerSingleton(aboutService); - locator.registerSingleton(sentencesService); -} +@InjectableInit( + preferRelativeImports: false, + throwOnMissingDependencies: true, +) +Future configureDependencies() => getIt.init(); diff --git a/lib/application/notifiers/auth_notifier.dart b/lib/application/notifiers/auth_notifier.dart index a81b38a8..49c362e7 100644 --- a/lib/application/notifiers/auth_notifier.dart +++ b/lib/application/notifiers/auth_notifier.dart @@ -16,7 +16,6 @@ class AuthNotifier extends StateNotifier { void setSignedOut() { state = false; } - } final authNotifier = StateNotifierProvider((ref) { diff --git a/lib/application/notifiers/loading_notifier.dart b/lib/application/notifiers/loading_notifier.dart index 289fcae0..ea31fbaf 100644 --- a/lib/application/notifiers/loading_notifier.dart +++ b/lib/application/notifiers/loading_notifier.dart @@ -14,7 +14,8 @@ class LoadingNotifier extends StateNotifier { void toggleLoading() { state = !state; } - bool getState() => state; + + bool getState() => state; } final loadingProvider = StateNotifierProvider((ref) { diff --git a/lib/application/notifiers/patient_notifier.dart b/lib/application/notifiers/patient_notifier.dart new file mode 100644 index 00000000..0e50b742 --- /dev/null +++ b/lib/application/notifiers/patient_notifier.dart @@ -0,0 +1,22 @@ +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:ottaa_project_flutter/core/models/patient_user_model.dart'; + +class PatientNotifier extends StateNotifier { + PatientNotifier() : super(null); + + void setUser(PatientUserModel? user) { + state = user; + } + + PatientUserModel get user { + return state!; + } + + PatientUserModel? get patient { + return state; + } +} + +final patientNotifier = StateNotifierProvider((ref) { + return PatientNotifier(); +}); diff --git a/lib/application/notifiers/user_avatar_notifier.dart b/lib/application/notifiers/user_avatar_notifier.dart deleted file mode 100644 index 65a0ffc1..00000000 --- a/lib/application/notifiers/user_avatar_notifier.dart +++ /dev/null @@ -1,17 +0,0 @@ -import 'package:flutter_riverpod/flutter_riverpod.dart'; - -class UserAvatarNotifier extends StateNotifier { - UserAvatarNotifier() : super(615); - - void changeAvatar(int imageId) { - state = imageId; - } - - String getAvatar() { - return state.toString(); - } -} - -final userAvatarNotifier = StateNotifierProvider((ref) { - return UserAvatarNotifier(); -}); diff --git a/lib/application/providers/about_provider.dart b/lib/application/providers/about_provider.dart index bd905c7a..bc7b04c6 100644 --- a/lib/application/providers/about_provider.dart +++ b/lib/application/providers/about_provider.dart @@ -1,7 +1,8 @@ import 'package:flutter/widgets.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:get_it/get_it.dart'; -import 'package:ottaa_project_flutter/core/enums/user_types.dart'; +import 'package:ottaa_project_flutter/core/enums/user_payment.dart'; +import 'package:ottaa_project_flutter/core/models/assets_image.dart'; import 'package:ottaa_project_flutter/core/repositories/about_repository.dart'; class AboutProvider extends ChangeNotifier { @@ -11,8 +12,7 @@ class AboutProvider extends ChangeNotifier { Future getAppVersion() => aboutService.getAppVersion(); - Future getAvailableAppVersion() => - aboutService.getAvailableAppVersion(); + Future getAvailableAppVersion() => aboutService.getAvailableAppVersion(); Future getDeviceName() => aboutService.getDeviceName(); @@ -20,12 +20,11 @@ class AboutProvider extends ChangeNotifier { Future getProfilePicture() => aboutService.getProfilePicture(); - Future getUserType() => aboutService.getUserType(); + Future getUserType() => aboutService.getUserType(); Future sendSupportEmail() => aboutService.sendSupportEmail(); - Future uploadProfilePicture(String photo) => - aboutService.uploadProfilePicture(photo); + Future uploadProfilePicture(String network, String asset) => aboutService.uploadProfilePicture(AssetsImage(asset: asset, network: network)); Future uploadUserInformation() => aboutService.uploadUserInformation(); } diff --git a/lib/application/providers/auth_provider.dart b/lib/application/providers/auth_provider.dart index 7bb0ed12..b514c981 100644 --- a/lib/application/providers/auth_provider.dart +++ b/lib/application/providers/auth_provider.dart @@ -4,8 +4,9 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:get_it/get_it.dart'; import 'package:ottaa_project_flutter/application/notifiers/auth_notifier.dart'; import 'package:ottaa_project_flutter/application/notifiers/loading_notifier.dart'; +import 'package:ottaa_project_flutter/application/providers/user_provider.dart'; import 'package:ottaa_project_flutter/core/enums/sign_in_types.dart'; -import 'package:ottaa_project_flutter/core/models/user_model.dart'; +import 'package:ottaa_project_flutter/core/abstracts/user_model.dart'; import 'package:ottaa_project_flutter/core/repositories/about_repository.dart'; import 'dart:async'; @@ -19,51 +20,79 @@ class AuthProvider extends ChangeNotifier { final AboutRepository _aboutService; final LocalDatabaseRepository _localDatabaseRepository; final AuthNotifier authData; + final UserNotifier _userNotifier; - AuthProvider(this._loadingNotifier, this._authService, this._aboutService, - this._localDatabaseRepository, this.authData); + AuthProvider( + this._loadingNotifier, + this._authService, + this._aboutService, + this._localDatabaseRepository, + this.authData, + this._userNotifier, + ); + + Future isUserLoggedIn() async { + return await _authService.isLoggedIn(); + } Future logout() async { await _authService.logout(); - + await _localDatabaseRepository.setIntro(false); authData.setSignedOut(); notifyListeners(); + + // _userNotifier.setUser(null); + } + + Future deleteAccount() async { + await _authService.logout(); + await _localDatabaseRepository.setIntro(false); + authData.setSignedOut(); + return await _authService.deleteAccount(userId: _userNotifier.user!.id); } - Future> signIn(SignInType type) async { + Future> signIn(SignInType type, [String? email, String? password]) async { _loadingNotifier.showLoading(); + try { + Either result = await _authService.signIn(type, email, password); - Either result = await _authService.signIn(type); + if (result.isRight) { + await _localDatabaseRepository.setUser(result.right); + //todo: talk with Emir about this and resolve it + await _aboutService.getUserInformation(); - if (result.isRight) { - await _localDatabaseRepository.setUser(result.right); - //todo: talk with Emir about this and resolve it - final res = await _aboutService.getUserInformation(); - if (res.isRight) { - final re = await _authService.runToGetDataFromOtherPlatform( - email: res.right.email, id: res.right.id); - print('here is the result $re'); + _userNotifier.setUser(result.right); + authData.setSignedIn(); + } else { + throw Exception(result.left); } - authData.setSignedIn(); + // notifyListeners(); + return result; + } catch (e) { + return Left(e.toString()); + } finally { + _loadingNotifier.hideLoading(); } - - _loadingNotifier.hideLoading(); - notifyListeners(); - return result; } } -final authProvider = ChangeNotifierProvider((ref) { +final ChangeNotifierProvider authProvider = ChangeNotifierProvider((ref) { final loadingNotifier = ref.watch(loadingProvider.notifier); final AuthRepository authService = GetIt.I.get(); final AboutRepository aboutService = GetIt.I.get(); - final LocalDatabaseRepository localDatabaseRepository = - GetIt.I.get(); + final LocalDatabaseRepository localDatabaseRepository = GetIt.I.get(); final AuthNotifier authData = ref.watch(authNotifier.notifier); + final UserNotifier userState = ref.watch(userProvider); - return AuthProvider(loadingNotifier, authService, aboutService, - localDatabaseRepository, authData); + return AuthProvider( + loadingNotifier, + authService, + aboutService, + localDatabaseRepository, + authData, + userState, + ); }); diff --git a/lib/application/providers/chat_gpt_game_provider.dart b/lib/application/providers/chat_gpt_game_provider.dart new file mode 100644 index 00000000..6be50fb7 --- /dev/null +++ b/lib/application/providers/chat_gpt_game_provider.dart @@ -0,0 +1,147 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:get_it/get_it.dart'; +import 'package:ottaa_project_flutter/application/common/extensions/translate_string.dart'; +import 'package:ottaa_project_flutter/application/providers/games_provider.dart'; +import 'package:ottaa_project_flutter/application/providers/tts_provider.dart'; +import 'package:ottaa_project_flutter/application/providers/user_provider.dart'; +import 'package:ottaa_project_flutter/core/models/picto_model.dart'; +import 'package:ottaa_project_flutter/core/repositories/repositories.dart'; + +class ChatGptGameProvider extends ChangeNotifier { + final ChatGPTRepository _chatGPTServices; + String generatedStory = ''; + int sentencePhase = 0; + List gptPictos = []; + final GamesProvider _gamesProvider; + final PictogramsRepository _pictogramsService; + final UserNotifier userState; + final TTSProvider _tts; + List gptBoards = []; + bool isBoard = true; + ScrollController boardScrollController = ScrollController(); + ScrollController pictoScrollController = ScrollController(); + List chatGptPictos = []; + bool btnText = false; + bool isStoryFetched = false; + final Map pictosTranslations = {}; + final List nounBoards = ['0geft4arn_A8kL-rfUPYc', 'WZYuZd331Hm5gHXJtUmBN', 'puda9fUGjqvm9oSM6CpTk', 'xjfPlDs-AcFV9LCyY-v9j']; + final List modifierBoards = ['7ngCuvmAnM_7ygpFQgLpk', '7w5ACMFdOCTkBrS911MA1', 'berI6X2_pAVCNOrcHAL6y']; + final List actionBoards = ['PYTnUqCLwAbngR2Ozroc2']; + final List placeBoards = ['y545pM8pvB3WgukIac6NT']; + + ChatGptGameProvider(this._chatGPTServices, this._gamesProvider, this._tts, this._pictogramsService, this.userState); + + void scrollUpBoards() { + int currentPosition = boardScrollController.position.pixels.toInt(); + + if (currentPosition == 0) return; + + boardScrollController.animateTo( + currentPosition - 96, + duration: const Duration(milliseconds: 500), + curve: Curves.easeOut, + ); + } + + void scrollDownBoards() { + int currentPosition = boardScrollController.position.pixels.toInt(); + + if (currentPosition >= boardScrollController.position.maxScrollExtent + 96) return; + + boardScrollController.animateTo( + currentPosition + 96, + duration: const Duration(milliseconds: 500), + curve: Curves.easeOut, + ); + } + + void scrollUpPictos() { + int currentPosition = pictoScrollController.position.pixels.toInt(); + + if (currentPosition == 0) return; + + pictoScrollController.animateTo( + currentPosition - 96, + duration: const Duration(milliseconds: 500), + curve: Curves.easeOut, + ); + } + + void scrollDownPictos() { + int currentPosition = pictoScrollController.position.pixels.toInt(); + + if (currentPosition >= (pictoScrollController.position.maxScrollExtent + 96)) return; + + pictoScrollController.animateTo( + currentPosition + 96, + duration: const Duration(milliseconds: 500), + curve: Curves.easeOut, + ); + } + + void notify() { + notifyListeners(); + } + + Future createStory() async { + final String prompt = 'game.prompt'.trl; + final finalPrompt = '$prompt ${gptPictos[0].text}, ${gptPictos[1].text}, ${gptPictos[2].text}, ${gptPictos[3].text}.'; + final res = await _chatGPTServices.getGPTStory(prompt: finalPrompt); + if (res.isRight) { + isStoryFetched = true; + generatedStory = res.right; + } else { + isStoryFetched = false; + } + notifyListeners(); + } + + Future fetchGptPictos({required String id}) async { + List picts = []; + final gro = _gamesProvider.groups[id]; + int i = 0; + for (var e in gro!.relations) { + picts.add( + _gamesProvider.pictograms[e.id]!, + ); + picts[i].text = pictosTranslations[e.id] ?? picts[i].text; + i++; + } + chatGptPictos.clear(); + chatGptPictos.addAll(picts); + } + + Future loadTranslations() async { + pictosTranslations.clear(); + final translations = await _pictogramsService.loadTranslations(language: userState.user!.settings.language.language); + pictosTranslations.addAll(translations); + } + + Future speakStory() async { + if (_gamesProvider.backgroundMusicPlayer.playing) { + _gamesProvider.backgroundMusicPlayer.pause(); + } + _tts.speak(generatedStory); + } + + void resetStoryGame() { + gptPictos.clear(); + gptBoards = []; + sentencePhase = 0; + notifyListeners(); + } + + Future stopTTS() async { + await _tts.ttsStop(); + } +} + +final chatGptGameProvider = ChangeNotifierProvider.autoDispose((ref) { + final pictogramService = GetIt.I(); + final userState = ref.watch(userProvider); + final chatGpt = GetIt.I(); + final gamesProvider = ref.watch(gameProvider); + final tts = ref.watch(ttsProvider); + return ChatGptGameProvider(chatGpt, gamesProvider, tts, pictogramService, userState); +}); diff --git a/lib/application/providers/chatgpt_provider.dart b/lib/application/providers/chatgpt_provider.dart new file mode 100644 index 00000000..8595b3e4 --- /dev/null +++ b/lib/application/providers/chatgpt_provider.dart @@ -0,0 +1,55 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:get_it/get_it.dart'; +import 'package:ottaa_project_flutter/application/common/extensions/user_extension.dart'; +import 'package:ottaa_project_flutter/application/notifiers/patient_notifier.dart'; +import 'package:ottaa_project_flutter/application/providers/user_provider.dart'; +import 'package:ottaa_project_flutter/core/models/picto_model.dart'; +import 'package:ottaa_project_flutter/core/repositories/chatgpt_repository.dart'; + +class ChatGPTNotifier extends ChangeNotifier { + final UserNotifier _userNotifier; + final PatientNotifier _patientNotifier; + final ChatGPTRepository _chatGPTRepository; + + ChatGPTNotifier(this._userNotifier, this._patientNotifier, this._chatGPTRepository); + + Future generatePhrase(List pictograms) async { + final user = _patientNotifier.patient ?? _userNotifier.user!.patient; + + int age = (user.settings.data.birthDate.difference(DateTime.now()).inDays / 365).round().abs(); + + String gender = user.settings.data.genderPref; + + String pictogramsString = pictograms.map((e) => e.text).join(", "); + + int maxTokens = (pictograms.length * 10).round().clamp(300, 5100); + + final String lang = user.settings.language.language; + + final response = await _chatGPTRepository.getCompletion( + age: age, + gender: gender, + pictograms: pictogramsString, + maxTokens: maxTokens, + language: lang.split('_')[0], + ); + + return response.fold( + (l) => l, + (r) => r, + ); + } + + void notify() { + notifyListeners(); + } +} + +final ChangeNotifierProvider chatGPTProvider = ChangeNotifierProvider((ref) { + final chatGPTRepository = GetIt.I.get(); + + final userState = ref.watch(userProvider); + final patientState = ref.watch(patientNotifier.notifier); + return ChatGPTNotifier(userState, patientState, chatGPTRepository); +}); diff --git a/lib/application/providers/create_picto_provider.dart b/lib/application/providers/create_picto_provider.dart new file mode 100644 index 00000000..e852ad05 --- /dev/null +++ b/lib/application/providers/create_picto_provider.dart @@ -0,0 +1,458 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:get_it/get_it.dart'; +import 'package:image_picker/image_picker.dart'; +import 'package:ottaa_project_flutter/application/common/extensions/user_extension.dart'; +import 'package:ottaa_project_flutter/application/common/i18n.dart'; +import 'package:ottaa_project_flutter/application/providers/tts_provider.dart'; +import 'package:ottaa_project_flutter/application/providers/user_provider.dart'; +import 'package:ottaa_project_flutter/application/providers/view_board_provider.dart'; +import 'package:ottaa_project_flutter/core/enums/user_types.dart'; +import 'package:ottaa_project_flutter/core/models/arsaac_data_model.dart'; +import 'package:ottaa_project_flutter/core/models/assets_image.dart'; +import 'package:ottaa_project_flutter/core/models/group_model.dart'; +import 'package:ottaa_project_flutter/core/models/picto_model.dart'; +import 'package:ottaa_project_flutter/core/repositories/create_picto_repository.dart'; +import 'package:ottaa_project_flutter/core/repositories/groups_repository.dart'; +import 'package:ottaa_project_flutter/core/repositories/local_database_repository.dart'; +import 'package:ottaa_project_flutter/core/repositories/pictograms_repository.dart'; +import 'package:path/path.dart'; + +class CreatePictoProvider extends ChangeNotifier { + final Map dataSetMapId = { + 0: 0, + 1: 17, + 2: 84, + 3: 14, + 4: 13, + 5: 82, + 6: 83, + 7: 81, + 8: 66, + 9: 95, + 10: 75, + 11: 16, + 12: 67, + 13: 74, + 14: 86, + 15: 88, + 16: 15, + 17: 97, + 18: 76, + }; + + final Map dataSetMapStrings = { + 0: 'All', + 17: 'ARASAAC', + 84: 'Gumeil', + 14: 'Jellow', + 13: 'mulberry', + 82: 'OCHA Humanitarian Icons', + 83: 'OpenMoji', + 81: 'Sclera Symbols', + 66: 'Srbija Simboli', + 95: 'Typical Bulgarian Symbols', + 75: 'Adam Urdu Symbols', + 16: 'Blissymbolics', + 67: 'Cma Gora', + 74: 'Hrvatski simboli za PK', + 86: 'Mulberry Plus', + 88: 'Otsmin Turkish', + 15: 'Tawasol', + 97: 'Typical Bulgarian Symbols SVG', + 76: 'DoeDY', + }; + final CreatePictoRepository _createPictoServices; + final GroupsRepository _groupsService; + final LocalDatabaseRepository _localDatabaseRepository; + final I18N _i18n; + final PictogramsRepository _pictogramsService; + final UserNotifier userState; + final TTSProvider _ttsProvider; + final ViewBoardProvider _viewBoardProvider; + + PageController controller = PageController(initialPage: 0); + + int currentIndex = 0; + bool isImageSelected = false; + String userID = ''; + int selectedBoardID = -1; + bool isBoardFetched = false; + List searchedData = []; + bool isArsaacSearched = false; + bool isEditBoard = false; + bool isUrl = false; + List daysToUsePicto = []; + List timeForPicto = []; + String daysString = ''; + String timeString = ''; + String selectedPictoForEditId = ''; + String userIdByCareGiver = ''; + List pictoInBoards = []; + + /// 6 is the default color for black and Miscellaneous + int borderColor = 6; + List boards = []; + List pictograms = []; + List filteredPictograms = []; + XFile imageForPicto = XFile(''); + String imageUrlForPicto = ''; + final ImagePicker _imagePicker = ImagePicker(); + final TextEditingController nameController = TextEditingController(); + final TextEditingController arsaacController = TextEditingController(); + + CreatePictoProvider(this._createPictoServices, this._i18n, this._groupsService, this._pictogramsService, this.userState, this._localDatabaseRepository, this._ttsProvider, this._viewBoardProvider); + + Future init({required String userId, bool isFromBoard = false}) async { + userID = userId; + await fetchUserGroups(userId: userId); + await fetchUserPictos(userId: userId); + if (isFromBoard) { + controller = PageController(initialPage: 1); + currentIndex = 1; + } else {} + controller.addListener(setIndex); + } + + void setToSecondPage() async { + controller.jumpToPage(1); + } + + Future captureImageFromCamera() async { + final image = await _imagePicker.pickImage( + source: ImageSource.camera, + preferredCameraDevice: CameraDevice.rear, + maxHeight: 300, + maxWidth: 300, + ); + if (image != null) { + imageForPicto = image; + isImageSelected = true; + return true; + } else { + //todo:handle the error if image is not picked + return false; + } + } + + Future captureImageFromGallery() async { + // todo: implement for web too + final image = await _imagePicker.pickImage(source: ImageSource.gallery); + if (image != null) { + imageForPicto = image; + isImageSelected = true; + return true; + } else { + //todo:handle the error if image is not picked + return false; + } + } + + void resetCreateBoardScreen() { + isImageSelected = false; + nameController.text = ''; + timeForPicto.clear(); + daysToUsePicto.clear(); + } + + Future speakWord() async { + await _ttsProvider.speak(nameController.text); + } + + @override + void dispose() { + controller.removeListener(setIndex); + controller.dispose(); + super.dispose(); + } + + setIndex() { + final index = controller.page; + currentIndex = (index ?? 0).toInt(); + notifyListeners(); + } + + void nextPage() { + controller.nextPage( + duration: const Duration(milliseconds: 300), + curve: Curves.easeIn, + ); + } + + void previousPage() { + controller.previousPage( + duration: const Duration(milliseconds: 300), + curve: Curves.easeIn, + ); + } + + void goToPage(int index) { + controller.animateToPage( + index, + duration: const Duration(milliseconds: 300), + curve: Curves.easeIn, + ); + } + + Future fetchUserGroups({required String userId}) async { + final res = await _createPictoServices.fetchUserGroups(languageCode: _i18n.currentLocale.toString(), userId: userId); + if (res.isEmpty) { + final res = await _createPictoServices.fetchDefaultGroups(languageCode: _i18n.currentLocale.toString()); + boards = res; + } else { + boards = res; + } + isBoardFetched = true; + notifyListeners(); + } + + Future fetchUserPictos({required String userId}) async { + pictograms = await _createPictoServices.fetchUserPictos(languageCode: _i18n.currentLocale.toString(), userId: userId); + if (pictograms.isEmpty) { + pictograms = await _createPictoServices.fetchDefaultPictos(languageCode: _i18n.currentLocale.toString()); + } + } + + void notify() { + notifyListeners(); + } + + Future fetchPhotoFromGlobalSymbols({required String text}) async { + isArsaacSearched = false; + searchedData.clear(); + final res = await _createPictoServices.fetchPhotosFromGlobalSymbols( + searchText: text, + languageCode: _i18n.currentLocale.languageCode, + ); + if (res.isRight) { + searchedData = res.right; + } else { + searchedData = []; + } + isArsaacSearched = true; + notifyListeners(); + } + + Future saveAndUploadPictogram() async { + final id = '$userID-${pictograms.length.toString()}'; + final url = await getImageUrl(); + Picto pict = Picto( + id: id, + type: borderColor, + resource: AssetsImage(asset: '', network: url), + tags: { + "WEEKDAY": daysToUsePicto, + "HORA": timeForPicto, + }, + text: nameController.text, + ); + pictograms.add(pict); + _viewBoardProvider.pictograms.add(pict); + _viewBoardProvider.filteredPictos.add(pict); + _viewBoardProvider.boards[selectedBoardID].relations.add( + GroupRelation(id: id, value: 0), + ); + _viewBoardProvider.notify(); + boards[selectedBoardID].relations.add( + GroupRelation(id: id, value: 0), + ); + await _pictogramsService.uploadPictograms(pictograms, _i18n.currentLocale.toString(), userId: userID); + await _groupsService.uploadGroups(boards, _i18n.currentLocale.toString(), 'type', userId: userID); + + if (userState.user!.type == UserType.user) { + //todo: emir can you check this + final newUser = userState.user!.patient; + newUser.pictos[_i18n.currentLocale.toString()] = pictograms; + newUser.groups[_i18n.currentLocale.toString()] = boards; + await _localDatabaseRepository.setUser(newUser); + } + } + + Future saveAndUploadGroup() async { + final url = await getImageUrl(isPicto: false); + Group group = Group( + id: '$userID-${boards.length.toString()}', + block: false, + resource: AssetsImage(asset: '', network: url), + text: nameController.text, + relations: [], + freq: 0, + ); + boards.add(group); + _viewBoardProvider.boards.add(group); + _viewBoardProvider.notify(); + await _groupsService.uploadGroups(boards, 'type', _i18n.currentLocale.toString(), userId: userID); + + if (userState.user!.type == UserType.user) { + final newUser = userState.user!.patient; + newUser.groups[_i18n.currentLocale.toString()] = boards; + userState.user!.patient.groups[_i18n.currentLocale.toString()] = boards; + await _localDatabaseRepository.setUser(newUser); + } + } + + Future saveChangesInPicto({required String id}) async { + final url = await getImageUrl(); + int index = -1; + final res = pictograms.firstWhere((element) { + index++; + return element.id == id; + }); + pictograms[index].tags["WEEKDAY"] = daysToUsePicto; + pictograms[index].tags["HORA"] = timeForPicto; + Picto pict = Picto( + id: id, + type: borderColor, + resource: AssetsImage(asset: pictograms[index].resource.asset, network: url), + tags: pictograms[index].tags, + text: nameController.text, + freq: pictograms[index].freq, + ); + + pictograms[index] = pict; + _viewBoardProvider.pictograms[index] = pict; + _viewBoardProvider.notify(); + await _pictogramsService.uploadPictograms(pictograms, _i18n.currentLocale.toString(), userId: userID); + + if (userState.user!.type == UserType.user) { + //todo: emir can you check this + final newUser = userState.user!.patient; + newUser.pictos[_i18n.currentLocale.toString()] = pictograms; + await _localDatabaseRepository.setUser(newUser); + } + } + + Future saveChangesInBoard() async { + final url = await getImageUrl(isPicto: false); + final oldBoard = boards[selectedBoardID]; + Group newBoard = Group( + id: oldBoard.id, + relations: oldBoard.relations, + text: nameController.text, + resource: AssetsImage( + asset: oldBoard.resource.asset, + network: url, + ), + freq: oldBoard.freq, + block: oldBoard.block, + ); + boards[selectedBoardID] = newBoard; + _viewBoardProvider.boards[selectedBoardID] = newBoard; + _viewBoardProvider.notify(); + await _groupsService.uploadGroups(boards, 'type', _i18n.currentLocale.toString(), userId: userID); + + if (userState.user!.type == UserType.user) { + final newUser = userState.user!.patient; + newUser.groups[_i18n.currentLocale.toString()] = boards; + userState.user!.patient.groups[_i18n.currentLocale.toString()] = boards; + await _localDatabaseRepository.setUser(newUser); + } + isEditBoard = false; + } + + Future getImageUrl({bool isPicto = true}) async { + final userId = userIdByCareGiver.isEmpty ? userState.user!.id : userIdByCareGiver; + + String pictoPath = isPicto ? "images/$userId/pictos" : "images/$userId/boards"; + + if (imageForPicto.path.isNotEmpty) { + return await _createPictoServices.uploadOtherImages( + imagePath: imageForPicto.path, + directoryPath: pictoPath, + name: imageForPicto.name, + userId: userId, + ); + } else { + return imageUrlForPicto; + } + // Asim, please stop of repeat yourself :c + // if (userIdByCareGiver.isEmpty) { + // if (imageUrlForPicto.isNotEmpty) { + // return imageUrlForPicto; + // } else { + // return _createPictoServices.uploadOtherImages( + // imagePath: imageForPicto.path, + // directoryPath: 'images/${userState.user!.id}/pictos', + // name: imageForPicto.name, + // userId: userState.user!.id, + // ); + // } + // } else { + // if (imageUrlForPicto.isNotEmpty) { + // return imageUrlForPicto; + // } else { + // return _createPictoServices.uploadOtherImages( + // imagePath: imageForPicto.path, + // directoryPath: 'images/$userIdByCareGiver/pictos', + // name: imageForPicto.name, + // userId: userIdByCareGiver, + // ); + // } + // } + } + + /* Future hideCurrentPicto({required String id, required int index}) async { + int i = -1; + final res = pictograms.firstWhere((element) { + i++; + return element.id == id; + }); + pictograms[i].block = !pictograms[i].block; + filteredPictograms[index].block = !filteredPictograms[index].block; + notifyListeners(); + }*/ + + Future setForPictoEdit({required Picto pict}) async { + daysToUsePicto.clear(); + timeForPicto.clear(); + selectedPictoForEditId = pict.id; + borderColor = pict.type; + imageUrlForPicto = pict.resource.network!; + nameController.text = pict.text; + isImageSelected = true; + if (pict.tags.containsKey('WEEKDAY')) { + daysToUsePicto = pict.tags['WEEKDAY']!; + } + if (pict.tags.containsKey('HORA')) { + timeForPicto = pict.tags['HORA']!; + } + await searchBoard(id: pict.id); + notifyListeners(); + } + + Future setForBoardEdit({required int index}) async { + selectedBoardID = index; + final board = boards[index]; + isImageSelected = true; + isUrl = true; + isEditBoard = true; + imageUrlForPicto = board.resource.network!; + nameController.text = board.text; + } + + Future searchBoard({required String id}) async { + pictoInBoards.clear(); + int boardIndex = -1; + for (var board in boards) { + boardIndex++; + for (var relation in board.relations) { + if (relation.id == id) { + pictoInBoards.add(boardIndex); + } + } + } + } +} + +final createPictoProvider = ChangeNotifierProvider((ref) { + final CreatePictoRepository createPictoServices = GetIt.I.get(); + final pictogramService = GetIt.I(); + final groupService = GetIt.I(); + final i18N = GetIt.I(); + final tts = ref.watch(ttsProvider); + final viewBoard = ref.watch(viewBoardProvider); + final localDatabase = GetIt.I(); + + final userState = ref.watch(userProvider); + return CreatePictoProvider(createPictoServices, i18N, groupService, pictogramService, userState, localDatabase, tts, viewBoard); +}); diff --git a/lib/application/providers/customise_provider.dart b/lib/application/providers/customise_provider.dart new file mode 100644 index 00000000..afa4c1af --- /dev/null +++ b/lib/application/providers/customise_provider.dart @@ -0,0 +1,224 @@ +import 'package:flutter/material.dart' hide Shortcuts; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:get_it/get_it.dart'; +import 'package:ottaa_project_flutter/application/common/extensions/user_extension.dart'; +import 'package:ottaa_project_flutter/application/common/i18n.dart'; +import 'package:ottaa_project_flutter/application/providers/user_provider.dart'; +import 'package:ottaa_project_flutter/core/enums/customise_data_type.dart'; +import 'package:ottaa_project_flutter/core/enums/user_types.dart'; +import 'package:ottaa_project_flutter/core/models/group_model.dart'; +import 'package:ottaa_project_flutter/core/models/picto_model.dart'; +import 'package:ottaa_project_flutter/core/models/shortcuts_model.dart'; +import 'package:ottaa_project_flutter/core/repositories/repositories.dart'; + +class CustomiseProvider extends ChangeNotifier { + final PictogramsRepository _pictogramsService; + final GroupsRepository _groupsService; + final CustomiseRepository _customiseService; + final LocalDatabaseRepository _localDatabaseRepository; + final I18N _i18n; + List pictograms = []; + List groups = []; + List selectedGruposPicts = []; + bool groupsFetched = false; + int selectedGroup = 00; + String selectedGroupName = ''; + String selectedGroupImage = ''; + bool selectedGroupStatus = false; + Map pictosMap = {}; + CustomiseDataType type = CustomiseDataType.defaultCase; + + final UserNotifier userState; + + // userId for other use cases + String userId = ''; + bool dataExist = true; + + CustomiseProvider( + this._pictogramsService, + this._groupsService, + this._customiseService, + this._i18n, + this.userState, + this._localDatabaseRepository, + ); + + List selectedShortcuts = List.generate(7, (index) => true); + + Future setGroupData({required int index}) async { + selectedGroup = index; + selectedGroupImage = (groups[index].resource.network ?? groups[index].resource.asset); + selectedGroupName = groups[index].text; + selectedGroupStatus = groups[index].block; + notifyListeners(); + } + + Future setShortcutsForUser({required String userId}) async { + ShortcutsModel model = ShortcutsModel( + enable: true, + favs: selectedShortcuts[0], + history: selectedShortcuts[1], + camera: selectedShortcuts[2], + games: selectedShortcuts[3], + yes: selectedShortcuts[4], + no: selectedShortcuts[5], + share: selectedShortcuts[6], + ); + + await _customiseService.setShortcutsForUser( + shortcuts: model, + userId: userId, + ); + + return model; + } + + Future fetchDesiredPictos() async { + selectedGruposPicts = []; + for (int i = 0; i < groups[selectedGroup].relations.length; i++) { + for (var e in pictograms) { + if (e.id == groups[selectedGroup].relations[i].id) { + selectedGruposPicts.add(e); + } + } + } + } + + Future inIt({String? userId}) async { + switch (type) { + case CustomiseDataType.careGiver: + case CustomiseDataType.user: + await fetchUserCaseValues(userId: userId!); + break; + case CustomiseDataType.defaultCase: + await fetchDefaultCaseValues(); + break; + } + } + + Future fetchDefaultCaseValues() async { + await getDefaultGroups(); + groupsFetched = true; + notifyListeners(); + await getDefaultPictos(); + await createMapForPictos(); + if (!dataExist) { + type = CustomiseDataType.user; + notifyListeners(); + } + } + + Future fetchUserCaseValues({required String userId}) async { + await fetchShortcutsForUser(userId: userId); + await fetchUserGroups(userId: userId); + groupsFetched = true; + notifyListeners(); + + await fetchUserPictos(userId: userId); + await createMapForPictos(); + } + + Future uploadData({required String userId, required bool savePictograms, required bool saveGroups, required bool saveShortcuts}) async { + final locale = _i18n.currentLocale; + + final languageCode = locale.toString(); + + if (savePictograms) await _pictogramsService.uploadPictograms(pictograms, languageCode, userId: userId); + if (saveGroups) await _groupsService.uploadGroups(groups, 'type', languageCode, userId: userId); + + ShortcutsModel? shortcutsModel; + + if (saveShortcuts) shortcutsModel = await setShortcutsForUser(userId: userId); + + if (userState.user!.type == UserType.user) { + final newUser = userState.user!.patient; + newUser.groups[languageCode] = groups; + newUser.pictos[languageCode] = pictograms; + if (saveShortcuts && shortcutsModel != null) { + newUser.patientSettings.layout.shortcuts = shortcutsModel; + } + + await _localDatabaseRepository.setUser(newUser); + userState.setUser(newUser); + } + } + + void notify() { + notifyListeners(); + } + + Future getDefaultGroups() async { + final locale = _i18n.currentLocale; + + final languageCode = locale.toString(); + + final res = await _customiseService.fetchDefaultGroups(languageCode: languageCode); + groups = res; + } + + Future getDefaultPictos() async { + final locale = _i18n.currentLocale; + + final languageCode = locale.toString(); + pictograms = await _customiseService.fetchDefaultPictos(languageCode: languageCode); + } + + Future createMapForPictos() async { + int i = 0; + for (var element in pictograms) { + pictosMap[element.id.toString()] = i; + } + } + + void block({required int index}) async { + selectedGruposPicts[index].block = !selectedGruposPicts[index].block; + pictograms[pictosMap[selectedGruposPicts[index].id]!].block = !pictograms[pictosMap[selectedGruposPicts[index].id]!].block; + notifyListeners(); + } + + Future fetchShortcutsForUser({required String userId}) async { + final res = await _customiseService.fetchShortcutsForUser(userId: userId); + selectedShortcuts[0] = res.favs; + selectedShortcuts[1] = res.history; + selectedShortcuts[2] = res.camera; + selectedShortcuts[3] = res.games; + selectedShortcuts[4] = res.yes; + selectedShortcuts[5] = res.no; + selectedShortcuts[6] = res.share; + notifyListeners(); + } + + Future fetchUserGroups({required String userId}) async { + final res = await _customiseService.fetchUserGroups(languageCode: _i18n.currentLocale.toString(), userId: userId); + groups = res; + notifyListeners(); + } + + Future fetchUserPictos({required String userId}) async { + final locale = _i18n.currentLocale; + + final languageCode = "${locale.languageCode}_${locale.countryCode}"; + pictograms = await _customiseService.fetchUserPictos(languageCode: languageCode, userId: userId); + } + + Future dataExistOrNot({required String userId}) async { + final locale = _i18n.currentLocale; + + final languageCode = "${locale.languageCode}_${locale.countryCode}"; + final bool = _customiseService.valuesExistOrNot(languageCode: languageCode, userId: userId); + this.userId = userId; + return bool; + } +} + +final customiseProvider = ChangeNotifierProvider((ref) { + final CustomiseRepository customiseService = GetIt.I.get(); + final pictogramService = GetIt.I(); + final groupService = GetIt.I(); + final i18N = GetIt.I(); + + final localDatabase = GetIt.I(); + + final userState = ref.watch(userProvider); + return CustomiseProvider(pictogramService, groupService, customiseService, i18N, userState, localDatabase); +}); diff --git a/lib/application/providers/games_provider.dart b/lib/application/providers/games_provider.dart new file mode 100644 index 00000000..ba0b33d8 --- /dev/null +++ b/lib/application/providers/games_provider.dart @@ -0,0 +1,278 @@ +import 'dart:async'; +import 'dart:math'; + +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:get_it/get_it.dart'; +import 'package:just_audio/just_audio.dart'; +import 'package:ottaa_project_flutter/application/notifiers/patient_notifier.dart'; +import 'package:ottaa_project_flutter/core/models/group_model.dart'; +import 'package:ottaa_project_flutter/core/models/picto_model.dart'; +import 'package:ottaa_project_flutter/core/repositories/repositories.dart'; + +class GamesProvider extends ChangeNotifier { + int numberOfGroups = 45; + int completedGroups = 0; + int activeGroups = 00; + int selectedGame = 0; + String selectedGroupName = ''; + final PageController mainPageController = PageController(initialPage: 0); + ScrollController gridScrollController = ScrollController(); + Map pictograms = {}; + Map groups = {}; + int correctScore = 0; + int incorrectScore = 0; + List selectedPicts = []; + int useTime = 00; + int streak = 0; + List matchPictoTop = List.filled(4, false); + List matchPictoBottom = List.filled(4, false); + bool isMute = false; + List gamePictsWTP = []; + List gamePictsMP = []; + int correctPictoWTP = 99; + bool hintsBtn = false; + late Timer hintTimer1, hintTimer2, gameTimer; + bool hintsEnabled = false; + + /// 0 == 2 pictos, 1 == 3 pictos, 2 == 4 pictos + int difficultyLevel = 0; + + late final AudioPlayer backgroundMusicPlayer; + late final AudioPlayer clicksPlayer; + + Map bottomPositionsMP = {}; + Map topPositionsMP = {}; + + final PictogramsRepository _pictogramsService; + final GroupsRepository _groupsService; + final PatientNotifier patientState; + + GamesProvider( + this._groupsService, + this._pictogramsService, + this.patientState, { + AudioPlayer? backgroundMusicPlayer, + AudioPlayer? clicksPlayer, + }) { + this.backgroundMusicPlayer = backgroundMusicPlayer ?? AudioPlayer(); + this.clicksPlayer = clicksPlayer ?? AudioPlayer(); + } + + Future createRandomForGameWTP() async { + gamePictsWTP.clear(); + List numbers = []; + Random random = Random(); + while (numbers.length < difficultyLevel + 2) { + int randomNum = random.nextInt(selectedPicts.length - 1); + if (!numbers.contains(randomNum)) { + numbers.add(randomNum); + } + } + for (var element in numbers) { + gamePictsWTP.add(selectedPicts[element]); + } + + correctPictoWTP = Random().nextInt(difficultyLevel + 2); + + notifyListeners(); + } + + resetScore() { + incorrectScore = 0; + correctScore = 0; + gameTimer.cancel(); + useTime = 0; + streak = 0; + difficultyLevel = 0; + } + + Future createRandomForGameMP() async { + topPositionsMP.clear(); + bottomPositionsMP.clear(); + List topNumbers = []; + List bottomNumbers = []; + Random random = Random(); + while (topNumbers.length < difficultyLevel + 2) { + int num = random.nextInt(selectedPicts.length - 1); + if (!topNumbers.contains(num)) { + topNumbers.add(num); + } + } + while (bottomNumbers.length < difficultyLevel + 2) { + int num = random.nextInt(topNumbers.length); + if (!bottomNumbers.contains(num)) { + bottomNumbers.add(num); + } + } + int i = 0; + for (var element in topNumbers) { + topPositionsMP[i] = selectedPicts[element]; + i++; + } + i = 0; + for (var element in bottomNumbers) { + bottomPositionsMP[i] = topPositionsMP[element]!; + i++; + } + notifyListeners(); + } + + Future fetchSelectedPictos() async { + List picts = []; + final gro = groups.values.where((element) => !element.block).toList(); + int i = 0; + int selectedGroup = 0; + for (var e in gro) { + if (e.text == selectedGroupName) { + selectedGroup = i; + } + i++; + } + for (var e in gro[selectedGroup].relations) { + picts.add( + pictograms[e.id]!, + ); + } + selectedPicts.clear(); + selectedPicts.addAll(picts); + } + + void moveForward() { + mainPageController.nextPage(duration: const Duration(milliseconds: 300), curve: Curves.easeIn); + notifyListeners(); + } + + void moveBackward() { + mainPageController.previousPage(duration: const Duration(milliseconds: 300), curve: Curves.easeIn); + notifyListeners(); + } + + void scrollUp() { + int currentPosition = gridScrollController.position.pixels.toInt(); + + if (currentPosition == 0) return; + + gridScrollController.animateTo( + currentPosition - 96, + duration: const Duration(milliseconds: 500), + curve: Curves.easeOut, + ); + } + + void scrollDown() { + int currentPosition = gridScrollController.position.pixels.toInt(); + + if (currentPosition >= gridScrollController.position.maxScrollExtent + 96) { + return; + } + + gridScrollController.animateTo( + currentPosition + 96, + duration: const Duration(milliseconds: 500), + curve: Curves.easeOut, + ); + } + + Future fetchPictograms() async { + if (pictograms.isNotEmpty && groups.isNotEmpty) return; + + List? pictos; + List? groupsData; + + if (patientState.state != null) { + pictos = patientState.user.pictos[patientState.user.settings.language]; + + groupsData = patientState.user.groups[patientState.user.settings.language]; + } + + pictos ??= (await _pictogramsService.getAllPictograms()).where((element) => !element.block).toList(); + groupsData ??= (await _groupsService.getAllGroups()).where((element) => !element.block).toList(); + + for (var e in groupsData) { + if (!e.block) { + activeGroups++; + } + } + + pictograms = Map.fromIterables(pictos.map((e) => e.id), pictos); + groups = Map.fromIterables(groupsData.map((e) => e.id), groupsData); + + notifyListeners(); + } + + // Future checkAnswerMatchPicto({required bool upper, required int index}) async {} + + Future init() async { + gameTimer = Timer.periodic(const Duration(seconds: 1), (timer) { + useTime = useTime + 1; + }); + await initializeBackgroundMusic(); + if (hintsBtn) { + showHints(); + } + } + + Future showHints() async { + hintTimer1 = Timer.periodic(const Duration(seconds: 4), (timer) { + hintTimer2 = Timer(const Duration(seconds: 2), () { + hintsEnabled = true; + notify(); + }); + hintsEnabled = false; + notify(); + }); + } + + Future cancelHints() async { + hintTimer1.cancel(); + hintTimer1.cancel(); + hintTimer2.cancel(); + hintTimer2.cancel(); + hintsEnabled = false; + // notifyListeners(); + } + + void notify() { + notifyListeners(); + } + + Future playClickSounds({required String assetName}) async { + await clicksPlayer.setAsset('assets/audios/$assetName.mp3'); + await clicksPlayer.play(); + } + + Future changeMusic({required bool mute}) async { + if (mute) { + await backgroundMusicPlayer.pause(); + } else { + await backgroundMusicPlayer.play(); + } + } + + Future initializeBackgroundMusic() async { + ///check if we can buffer the audios before even loading the properties of the given class + // backgroundMusicPlayer.setAudioSource(); + if (!isMute) { + await backgroundMusicPlayer.setAsset('assets/audios/funckygroove.mp3'); + await backgroundMusicPlayer.setLoopMode(LoopMode.one); + await backgroundMusicPlayer.setVolume(0.2); + await backgroundMusicPlayer.play(); + } + } + + @override + void dispose() { + hintTimer1.cancel(); + hintTimer2.cancel(); + super.dispose(); + } +} + +final ChangeNotifierProvider gameProvider = ChangeNotifierProvider((ref) { + final pictogramService = GetIt.I(); + final groupsService = GetIt.I(); + final patientState = ref.watch(patientNotifier.notifier); + // final tts = ref.watch(ttsProvider); + return GamesProvider(groupsService, pictogramService, patientState); +}); diff --git a/lib/application/providers/home_provider.dart b/lib/application/providers/home_provider.dart index 31e85f17..6d26f8e8 100644 --- a/lib/application/providers/home_provider.dart +++ b/lib/application/providers/home_provider.dart @@ -1,117 +1,363 @@ +import 'dart:math' show min; +import 'package:collection/collection.dart'; +import 'package:dio/dio.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:get_it/get_it.dart'; import 'package:ottaa_project_flutter/application/common/constants.dart'; +import 'package:ottaa_project_flutter/application/common/extensions/translate_string.dart'; +import 'package:ottaa_project_flutter/application/common/extensions/user_extension.dart'; +import 'package:ottaa_project_flutter/application/notifiers/patient_notifier.dart'; +import 'package:ottaa_project_flutter/application/providers/chatgpt_provider.dart'; import 'package:ottaa_project_flutter/application/providers/tts_provider.dart'; -import 'package:ottaa_project_flutter/core/models/groups_model.dart'; -import 'package:ottaa_project_flutter/core/models/pictogram_model.dart'; -import 'package:ottaa_project_flutter/core/models/sentence_model.dart'; -import 'package:ottaa_project_flutter/core/repositories/groups_repository.dart'; -import 'package:ottaa_project_flutter/core/repositories/pictograms_repository.dart'; -import 'package:ottaa_project_flutter/core/repositories/sentences_repository.dart'; +import 'package:ottaa_project_flutter/application/providers/user_provider.dart'; +import 'package:ottaa_project_flutter/core/enums/display_types.dart'; +import 'package:ottaa_project_flutter/core/enums/home_screen_status.dart'; +import 'package:ottaa_project_flutter/core/models/assets_image.dart'; +import 'package:ottaa_project_flutter/core/models/group_model.dart'; +import 'package:ottaa_project_flutter/core/models/learn_token.dart'; +import 'package:ottaa_project_flutter/core/models/patient_user_model.dart'; +import 'package:ottaa_project_flutter/core/models/phrase_model.dart'; +import 'package:ottaa_project_flutter/core/models/picto_model.dart'; +import 'package:ottaa_project_flutter/core/repositories/repositories.dart'; +import 'package:ottaa_project_flutter/core/use_cases/learn_pictogram.dart'; +import 'package:ottaa_project_flutter/core/use_cases/predict_pictogram.dart'; + +const String kStarterPictoId = "_hqTU9A7I3RFDVrcIEK-L"; class HomeProvider extends ChangeNotifier { + List basicPictograms = []; + final PictogramsRepository _pictogramsService; final GroupsRepository _groupsService; final SentencesRepository _sentencesService; + final PatientNotifier patientState; + final UserNotifier userState; + final LocalDatabaseRepository _hiveRepository; final TTSProvider _tts; - HomeProvider(this._pictogramsService, this._groupsService, this._sentencesService, this._tts); + final PredictPictogram predictPictogram; + final LearnPictogram learnPictogram; + + final ChatGPTNotifier _chatGPTNotifier; - List mostUsedSentences = []; + HomeProvider( + this._pictogramsService, + this._groupsService, + this._sentencesService, + this._tts, + this.patientState, + this.predictPictogram, + this.learnPictogram, + this.userState, + this._chatGPTNotifier, + this._hiveRepository, + ); + + List mostUsedSentences = []; int indexForMostUsed = 0; - List pictograms = []; - List groups = []; + Map pictograms = {}; + Map groups = {}; + + List? suggestedPicts; - List suggestedPicts = []; + List pictoWords = []; - int suggestedIndex = 0; + String suggestedIndex = kStarterPictoId; int suggestedQuantity = 4; + int indexPage = 0; + + bool confirmExit = false; + + bool talkEnabled = true; + bool isSpeakWidget = false; + bool isExit = false; + bool isLongClick = false; + int? selectedWord; + bool isExitLong = false; + bool isLongClickCheck = false; + String subtitleText = ''; + ScrollController scrollController = ScrollController(); + + HomeScreenStatus status = HomeScreenStatus.pictos; + + // Home Tabs + String currentTabGroup = ""; + ScrollController groupTabsScrollController = ScrollController(); + ScrollController pictoTabsScrollController = ScrollController(); + + //Home grids + String? currentGridGroup; + ScrollController gridScrollController = ScrollController(); + + final List _cancelsToken = []; + + final Map pictosTranslations = {}; + + void setCurrentGroup(String group) { + currentTabGroup = group; + pictoTabsScrollController.jumpTo(0); + notifyListeners(); + } + + Future isLongClickEnabled() async { + return await _hiveRepository.getLongClick(); + } + + Future setLongClickEnabled({required bool isLongClick}) async { + await _hiveRepository.setLongClick(isLongClick: isLongClick); + } + Future init() async { await fetchPictograms(); - buildSuggestion(0); + await loadTranslations(); + + basicPictograms = predictiveAlgorithm(list: pictograms[kStarterPictoId]!.relations); + + currentTabGroup = groups.keys.first; + isExitLong = await isLongClickEnabled(); + await buildSuggestion(); notifyListeners(); } + Future loadTranslations() async { + pictosTranslations.clear(); + final translations = await _pictogramsService.loadTranslations(language: userState.user!.settings.language.language); + + pictosTranslations.addAll(translations); + notify(); + } + + void switchToPictograms() { + final currentUser = patientState.patient ?? userState.user!; + + bool isGrid = currentUser.isPatient && currentUser.patient.patientSettings.layout.display == DisplayTypes.grid; + + if (isGrid) { + status = HomeScreenStatus.grid; + } else { + status = HomeScreenStatus.tabs; + } + + notify(); + } + Future fetchMostUsedSentences() async { - mostUsedSentences = await _sentencesService.fetchSentences( - language: "es-AR", //TODO!: Fetch language code LANG-CODE + final res = await _sentencesService.fetchSentences( + language: "es_AR", //TODO!: Fetch language code LANG-CODE type: kMostUsedSentences, ); + if (res.isRight) { + mostUsedSentences = res.right; + } else { + mostUsedSentences = []; + } - // if (result.isRight) { - // mostUsedSentences = result.right; - // } + notifyListeners(); + } + void notify() { + notifyListeners(); + } + + void setSuggedtedQuantity(int quantity) { + suggestedQuantity = quantity; + notifyListeners(); + } + + void addPictogram(Picto picto) { + pictoWords.add(picto); + suggestedPicts = null; + + if (pictoWords.length > 5) { + scrollController.jumpTo(scrollController.offset + 100); + } + + buildSuggestion(picto.id); + notifyListeners(); + } + + void removeLastPictogram() { + pictoWords.removeLast(); + if (pictoWords.isEmpty) { + for (var element in _cancelsToken) { + element.cancel(); + } + + _cancelsToken.clear(); + } + notify(); + suggestedPicts = null; + Picto? lastPicto = pictoWords.lastOrNull; + + buildSuggestion(lastPicto?.id); notifyListeners(); } Future fetchPictograms() async { - pictograms = await _pictogramsService.getAllPictograms(); - groups = await _groupsService.getAllGroups(); + List? pictos; + List? groupsData; + + if (patientState.patient != null) { + pictos = patientState.user.pictos[patientState.user.settings.language.language]; + + groupsData = patientState.user.groups[patientState.user.settings.language.language]; + } + + pictos ??= (await _pictogramsService.getAllPictograms()).where((element) => !element.block).toList(); + groupsData ??= (await _groupsService.getAllGroups()).where((element) => !element.block).toList(); + + pictograms = Map.fromIterables(pictos.map((e) => e.id), pictos); + groups = Map.fromIterables(groupsData.map((e) => e.id), groupsData); + notifyListeners(); } - void buildSuggestion(int id) { - suggestedPicts = []; - suggestedIndex = 0; + Future buildSuggestion([String? id]) async { + indexPage = 0; - final Pict addPict = Pict( - id: 0, - texto: Texto(en: "add", es: "agregar"), - tipo: 6, - imagen: Imagen(picto: "ic_agregar_nuevo"), - localImg: true, - ); + if (patientState.patient != null) { + PatientUserModel user = patientState.user; + final cancelToken = CancelToken(); - final Pict pict = pictograms.firstWhere((pict) => pict.id == id); - print('the id of the pict is ${pict.id}'); + cancelToken.whenCancel.then((value) { + _cancelsToken.remove(cancelToken); + }); - if (pict.relacion!.isNotEmpty) { - final List recomendedPicts = pict.relacion!.toList(); - recomendedPicts.sort((b, a) => a.frec!.compareTo(b.frec!)); - suggestedPicts = predictiveAlgorithm(list: recomendedPicts); - } else { + for (var element in _cancelsToken) { + element.cancel(); + } + + _cancelsToken.clear(); + + _cancelsToken.add(cancelToken); + + String hour = ""; + + int time = DateTime.now().hour; + + if (time >= 5 && time <= 11) { + hour = 'MANANA'; + } else if (time > 11 && time <= 14) { + hour = 'MEDIODIA'; + } else if (time > 14 && time < 20) { + hour = 'TARDE'; + } else { + hour = 'NOCHE'; + } + + final response = await predictPictogram.call( + sentence: pictoWords.map((e) => e.text).join(" "), + uid: user.id, + language: user.settings.language.language, + model: "test", + groups: (user.groups[user.settings.language.language] ?? []).where((element) => !element.block).map((e) => e.id).toList(), + tags: { + "HORA": [hour] + }, + reduced: true, + chunk: suggestedQuantity, + cancelToken: cancelToken, + ); + + _cancelsToken.remove(cancelToken); + + if (response.isRight) { + suggestedPicts = response.right.map((e) => pictograms[e.id["local"]]!).toList(); + notifyListeners(); + return; + } + } + id ??= kStarterPictoId; + + if (id == kStarterPictoId) { suggestedPicts = []; + suggestedPicts!.addAll(basicPictograms); + notify(); + + return; } - /// - /// predictive algorithm will replace teh code from here + Picto? pict = pictograms[id]; + + if (pict == null) return; + + if (pict.relations.isNotEmpty) { + final List recomendedPicts = pict.relations.toList(); + recomendedPicts.sortBy((element) => element.value); + List requiredPictos = predictiveAlgorithm(list: recomendedPicts); + suggestedPicts ??= []; + suggestedPicts!.addAll(requiredPictos); + suggestedPicts = suggestedPicts!.toSet().toList(); + } - // recomendedPicts.forEach((recommendedPict) { - // this._suggestedPicts.add(picts.firstWhere( - // (suggestedPict) => suggestedPict.id == recommendedPict.id)); - // }); + suggestedIndex = id; - /// to here - /// - suggestedPicts.add(addPict); + // suggestedPicts = suggestedPicts.sublist(0, min(suggestedPicts.length, suggestedQuantity)); + return notifyListeners(); + } - while (suggestedPicts.isEmpty || suggestedPicts.length % suggestedQuantity != 0) { - suggestedPicts.add(addPict); + List getPictograms() { + if (suggestedPicts == null) { + return List.generate(4, (index) { + return Picto( + id: "-777", + text: "", + type: 0, + resource: AssetsImage( + asset: "", + network: null, + ), + ); + }); } - notifyListeners(); + int currentPage = (suggestedPicts!.length / suggestedQuantity).round(); + + if (indexPage > currentPage) { + indexPage = currentPage; + } + + if (indexPage < 0) { + indexPage = 0; + } + int start = indexPage * suggestedQuantity; + List pictos = suggestedPicts!.sublist(start, min(suggestedPicts!.length, (indexPage * suggestedQuantity) + suggestedQuantity)); + + if (pictos.length < suggestedQuantity) { + int pictosLeft = suggestedQuantity - pictos.length; + pictos.addAll( + List.generate( + pictosLeft, + (index) => Picto( + id: "777", + text: "", + type: 0, + resource: AssetsImage( + asset: "", + network: null, + ), + ), + ), + ); + } + + return pictos; } - List predictiveAlgorithm({required List list}) { - const int pesoFrec = 2, - // pesoAgenda = 8, - // pesoGps = 12, - // pesoEdad = 5, - // pesoSexo = 3, - pesoHora = 50; + List predictiveAlgorithm({required List list}) { + const int pesoFrec = 2, pesoHora = 50; final time = DateTime.now().hour; - List requiredPicts = []; + List requiredPicts = []; for (var recommendedPict in list) { requiredPicts.add( - pictograms.firstWhere((suggestedPict) => suggestedPict.id == recommendedPict.id), + pictograms[recommendedPict.id]!, ); } late String tag; @@ -130,30 +376,150 @@ class HomeProvider extends ChangeNotifier { int hora = 0; /// '0' should be replaced by the value of HORA - if (e.hora == null) { + if (e.tags["hour"] == null) { hora = 0; } else { - for (var e in e.hora!) { + for (var e in e.tags["hour"]!) { if (tag == e) { hora = 1; } } } - e.score = (list[i].frec! * pesoFrec) + (hora * pesoHora); - // print(e.score); + e.freq = (list[i].value * pesoFrec) + (hora * pesoHora); } - requiredPicts.sort((b, a) => a.score!.compareTo(b.score!)); + requiredPicts.sort((b, a) => a.freq.compareTo(b.freq)); return requiredPicts; } + + Future speakSentence() async { + isSpeakWidget = true; + subtitleText = ''; + notifyListeners(); + if (patientState.state != null) { + learnPictogram.call( + uid: patientState.user.id, + language: patientState.user.patientSettings.language.language, + model: "", //TODO: Change to the current model later uwu + tokens: pictoWords.map((e) => LearnToken(name: pictosTranslations[e.id] ?? e.text, id: e.id)).toList(), + ); + } + + if (patientState.state != null && !patientState.user.patientSettings.layout.oneToOne) { + notifyListeners(); + String? sentence; + scrollController.jumpTo(0); + if (patientState.user.patientSettings.language.labs) { + final picts = pictoWords.map((e) => e.copyWith(text: pictosTranslations[e.id] ?? e.text)).toList(); + sentence = await _chatGPTNotifier.generatePhrase(picts); + if (sentence != null && sentence.startsWith(".")) sentence = sentence.replaceFirst(".", ""); + } + + sentence ??= pictoWords.map((e) => pictosTranslations[e.id] ?? e.text).join(' '); + subtitleText = sentence; + subtitleText = subtitleText.replaceAll('\n', ''); + notifyListeners(); + await _tts.speak(sentence); + + isSpeakWidget = false; + notifyListeners(); + } else { + for (var i = 0; i < pictoWords.length; i++) { + selectedWord = i; + scrollController.animateTo( + i == 0 ? 0 : i * 45, + duration: const Duration(microseconds: 50), + curve: Curves.easeIn, + ); + final e = pictoWords[i]; + subtitleText = "$subtitleText ${pictosTranslations[e.id] ?? e.text}"; + notifyListeners(); + await _tts.speak(pictosTranslations[e.id] ?? e.text); + } + isSpeakWidget = false; + notifyListeners(); + } + + isSpeakWidget = false; + notifyListeners(); + + if (patientState.state != null && patientState.user.patientSettings.layout.cleanup) { + pictoWords.clear(); + await buildSuggestion(); + notify(); + } + } + + void refreshPictograms() { + if (suggestedPicts == null) return; + + int currentPage = suggestedPicts!.length ~/ suggestedQuantity; + + indexPage++; + + if (indexPage > currentPage) { + indexPage = 0; + } + if (indexPage < 0) { + indexPage = 0; + } + + notifyListeners(); + } + + void scrollUp(ScrollController controller, double amount) { + int currentPosition = controller.position.pixels.toInt(); + + if (currentPosition == 0) return; + + controller.animateTo( + currentPosition - amount, + duration: const Duration(milliseconds: 500), + curve: Curves.easeOut, + ); + } + + void scrollDown(ScrollController controller, double amount) { + int currentPosition = controller.position.pixels.toInt(); + + if (currentPosition >= controller.position.maxScrollExtent + amount) return; + + controller.animateTo( + currentPosition + amount, + duration: const Duration(milliseconds: 500), + curve: Curves.easeOut, + ); + } + + Future speakYes() async { + await _tts.speak("global.yes".trl); + } + + Future speakNo() async { + await _tts.speak("global.no".trl); + } + + @override + void dispose() { + patientState.setUser(null); + + super.dispose(); + } } -final homeProvider = ChangeNotifierProvider((ref) { +final AutoDisposeChangeNotifierProvider homeProvider = ChangeNotifierProvider.autoDispose((ref) { final pictogramService = GetIt.I(); final groupsService = GetIt.I(); final sentencesService = GetIt.I(); final tts = ref.watch(ttsProvider); + final patientState = ref.watch(patientNotifier.notifier); + final userState = ref.watch(userProvider); + + final predictPictogram = GetIt.I(); + final learnPictogram = GetIt.I(); + final hiveService = GetIt.I(); + final chatGptNotifier = ref.watch(chatGPTProvider.notifier); - return HomeProvider(pictogramService, groupsService, sentencesService, tts); + return HomeProvider(pictogramService, groupsService, sentencesService, tts, patientState, predictPictogram, learnPictogram, userState, chatGptNotifier, hiveService); }); diff --git a/lib/application/providers/link_provider.dart b/lib/application/providers/link_provider.dart new file mode 100644 index 00000000..08105eee --- /dev/null +++ b/lib/application/providers/link_provider.dart @@ -0,0 +1,122 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:collection/collection.dart'; +import 'package:ottaa_project_flutter/application/locator.dart'; +import 'package:ottaa_project_flutter/application/providers/profile_provider.dart'; +import 'package:ottaa_project_flutter/core/abstracts/user_model.dart'; +import 'package:ottaa_project_flutter/core/models/base_user_model.dart'; +import 'package:ottaa_project_flutter/core/repositories/auth_repository.dart'; +import 'package:ottaa_project_flutter/core/repositories/profile_repository.dart'; +import 'package:ottaa_project_flutter/core/use_cases/create_email_token.dart'; +import 'package:ottaa_project_flutter/core/use_cases/verify_email_token.dart'; + +class LinkNotifier extends ChangeNotifier { + final GlobalKey formKey = GlobalKey(); + final TextEditingController emailController = TextEditingController(); + + final GlobalKey codeFormKey = GlobalKey(); + + List focusNodes = List.generate(4, (index) => FocusNode()); + List controllers = List.generate(4, (index) => TextEditingController()); + + final CreateEmailToken createEmailToken; + final VerifyEmailToken verifyEmailToken; + + final AuthRepository _auth; + + final ProfileRepository _profileService; + + final ProfileNotifier _profileNotifier; + + LinkNotifier(this.createEmailToken, this.verifyEmailToken, this._profileService, this._auth, this._profileNotifier); + + String? userId; + UserModel? user; + + void tokenChanged(int id, String value) { + if (value.length > 2) { + value.characters.take(4).toList().forEachIndexed((index, element) { + controllers[index].text = element; + }); + return; + } + + if (value.isEmpty) { + if (id == 0) return; + + focusNodes[id].unfocus(); + focusNodes[id - 1].requestFocus(); + return; + } + + final code = value.characters.last; + + controllers[id].text = code; + + if (id != 3) { + focusNodes[id].unfocus(); + focusNodes[id + 1].requestFocus(); + } else { + focusNodes[id].unfocus(); + } + } + + Future sendEmail() async { + if (formKey.currentState?.validate() ?? false) { + final currentUser = await _auth.getCurrentUser(); + if (currentUser.isRight) { + final email = currentUser.right.email; + return await createEmailToken.createEmailToken(email, emailController.text); + } + } + + return "Error"; + } + + bool isValidCode() { + final code = controllers.map((e) => e.text).join(); + return code.length == 4 && (codeFormKey.currentState?.validate() ?? false); + } + + Future validateCode() async { + final code = controllers.map((e) => e.text).join(); + final currentUser = await _auth.getCurrentUser(); + if (currentUser.isRight) { + final email = currentUser.right.email; + final result = await verifyEmailToken.verifyEmailToken( + email, + emailController.text, + code, + ); + + if (result.isLeft) { + return result.left; + } + + userId = result.right; + + user = await _profileNotifier.fetchUserById(userId!); + + return null; + } + + return "Error"; + } + + void reset() { + focusNodes = List.generate(4, (index) => FocusNode()); + controllers = List.generate(4, (index) => TextEditingController()); + + formKey.currentState?.reset(); + codeFormKey.currentState?.reset(); + notifyListeners(); + } +} + +final linkProvider = ChangeNotifierProvider.autoDispose((ref) { + final createEmailToken = getIt(); + final verifyEmailToken = getIt(); + final authRepository = getIt(); + final profileRepository = getIt(); + return LinkNotifier(createEmailToken, verifyEmailToken, profileRepository, authRepository, ref.read(profileProvider)); +}); diff --git a/lib/application/providers/match_pictogram_provider.dart b/lib/application/providers/match_pictogram_provider.dart new file mode 100644 index 00000000..2b908d7b --- /dev/null +++ b/lib/application/providers/match_pictogram_provider.dart @@ -0,0 +1,129 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:ottaa_project_flutter/application/providers/games_provider.dart'; +import 'package:ottaa_project_flutter/application/providers/tts_provider.dart'; +import 'package:ottaa_project_flutter/core/models/picto_model.dart'; + +class MatchPictogramProvider extends ChangeNotifier { + final GamesProvider _gamesProvider; + final TTSProvider _tts; + List upperPictos = []; + List lowerPictos = []; + List show = List.filled(8, false, growable: true); + List hideFlags = List.filled(8, true, growable: true); + List rightOrWrong = List.filled(8, true, growable: true); + + int pick1 = 99; + int pick2 = 99; + late Picto picto1; + late Picto picto2; + int correctCounter = 0; + bool showResult = false; + bool trueOrFalse = false; + + Future checkAnswerMatchPicto({required int index, required Picto picto}) async { + _tts.speak(picto.text); + if (pick1 == 99) { + pick1 = index; + picto1 = picto; + show[pick1] = true; + notifyListeners(); + } else { + pick2 = index; + picto2 = picto; + show[pick2] = true; + + ///check if both matches or not + + if (picto1.text == picto2.text) { + showResult = true; + hideFlags[pick1] = false; + hideFlags[pick2] = false; + trueOrFalse = true; + rightOrWrong[pick1] = true; + rightOrWrong[pick2] = true; + notifyListeners(); + await _gamesProvider.playClickSounds(assetName: 'yay'); + _gamesProvider.correctScore++; + _gamesProvider.streak++; + correctCounter++; + pick1 = 99; + pick2 = 99; + showResult = false; + notifyListeners(); + if (correctCounter == _gamesProvider.difficultyLevel + 2) { + if (_gamesProvider.correctScore >= 10 && _gamesProvider.difficultyLevel < 1) { + _gamesProvider.difficultyLevel++; + } + if (_gamesProvider.correctScore >= 20 && _gamesProvider.difficultyLevel < 2) { + _gamesProvider.difficultyLevel++; + } + await Future.delayed(const Duration(milliseconds: 1500)); + correctCounter = 0; + hideFlags = List.filled(8, true, growable: true); + rightOrWrong = List.filled(8, true, growable: true); + show = List.filled(8, false, growable: true); + pick1 = 99; + pick2 = 99; + await _gamesProvider.createRandomForGameMP(); + } + } else { + showResult = true; + trueOrFalse = false; + hideFlags[pick1] = false; + hideFlags[pick2] = false; + rightOrWrong[pick1] = false; + rightOrWrong[pick2] = false; + notifyListeners(); + _gamesProvider.incorrectScore++; + await _gamesProvider.playClickSounds(assetName: 'ohoh'); + if (_gamesProvider.correctScore == 9) { + _gamesProvider.difficultyLevel--; + } + if (_gamesProvider.correctScore == 19) { + _gamesProvider.difficultyLevel--; + } + _gamesProvider.streak = 0; + showResult = false; + + ///kind of act as a reset for whole thing + hideFlags[pick1] = true; + hideFlags[pick2] = true; + show[pick1] = false; + show[pick2] = false; + pick1 = 99; + pick2 = 99; + notifyListeners(); + } + } + } + + Future check({required String text, bool top = true}) async { + int i = 0; + if (top) { + _gamesProvider.topPositionsMP.forEach((key, value) { + if (value.text == text) { + return; + } + i++; + }); + return i; + } else { + _gamesProvider.bottomPositionsMP.forEach((key, value) { + if (value.text == text) { + return; + } + i++; + }); + return i; + } + } + + MatchPictogramProvider(this._gamesProvider, this._tts); +} + +final matchPictogramProvider = ChangeNotifierProvider((ref) { + final gamesProvider = ref.watch(gameProvider); + final tts = ref.watch(ttsProvider); + return MatchPictogramProvider(gamesProvider, tts); +}); diff --git a/lib/application/providers/memory_game_provider.dart b/lib/application/providers/memory_game_provider.dart new file mode 100644 index 00000000..d2d9cd65 --- /dev/null +++ b/lib/application/providers/memory_game_provider.dart @@ -0,0 +1,118 @@ +import 'dart:math'; + +import 'package:collection/collection.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:ottaa_project_flutter/application/providers/games_provider.dart'; +import 'package:ottaa_project_flutter/core/models/picto_model.dart'; +import 'package:ottaa_project_flutter/presentation/screens/games/ui/memory_picto_widget.dart'; + +class MemoryGameNotifier extends ChangeNotifier { + final GamesProvider _gamesProvider; + + List pictos = []; + + List openedPictos = []; + List matchedPictos = []; + List rightPictos = []; + + List controllers = []; + + MemoryGameNotifier(this._gamesProvider); + + void createRandomPictos() { + pictos.clear(); + List numbers = []; + Random random = Random(); + while (numbers.length < _gamesProvider.difficultyLevel + 2) { + int num = random.nextInt(_gamesProvider.selectedPicts.length - 1); + if (!numbers.contains(num)) { + numbers.add(num); + } + } + + for (var element in numbers) { + pictos.add(_gamesProvider.selectedPicts[element]); + pictos.add(_gamesProvider.selectedPicts[element]); + } + + pictos.shuffle(random); + + openedPictos.clear(); + matchedPictos.clear(); + rightPictos.clear(); + notifyListeners(); + } + + void addAnimationController(AnimationController controller, int index) { + controllers.add(controller); + } + + void openPicto(int index) async { + if (matchedPictos.contains(index) || openedPictos.length == 2 || openedPictos.contains(index)) return; + + if (openedPictos.length > 2) { + notifyListeners(); + return; + } + + + openedPictos.add(index); + controllers[index].reverse(); + + if (openedPictos.length == 2) { + bool isRightPictos = pictos[openedPictos[0]].id == pictos[openedPictos[1]].id; + + await _gamesProvider.playClickSounds(assetName: isRightPictos ? "yay" : "ohoh"); + + if (isRightPictos) { + rightPictos.addAll(openedPictos); + matchedPictos.addAll(openedPictos); + } + + Future.delayed(const Duration(seconds: 2), () { + if (isRightPictos) { + _gamesProvider.correctScore++; + _gamesProvider.streak++; + + if (_gamesProvider.correctScore >= 10 && _gamesProvider.difficultyLevel < 1) { + _gamesProvider.difficultyLevel++; + } else if (_gamesProvider.correctScore >= 20 && _gamesProvider.difficultyLevel < 2) { + _gamesProvider.difficultyLevel++; + } + } else { + if (_gamesProvider.streak == 0) { + _gamesProvider.incorrectScore++; + } else { + _gamesProvider.streak = 0; + } + controllers[openedPictos[0]].reverse(); + controllers[openedPictos[1]].reverse(); + } + + rightPictos.clear(); + openedPictos.clear(); + + notifyListeners(); + if (matchedPictos.length == pictos.length) { + createRandomPictos(); + } + }); + } + + notifyListeners(); + } + + void clear() { + pictos.clear(); + openedPictos.clear(); + rightPictos.clear(); + matchedPictos.clear(); + controllers.clear(); + } +} + +final memoryGameProvider = ChangeNotifierProvider((ref) { + final gameNotifier = ref.watch(gameProvider); + return MemoryGameNotifier(gameNotifier); +}); diff --git a/lib/application/providers/onboarding_provider.dart b/lib/application/providers/onboarding_provider.dart index 37bc4967..57602fb5 100644 --- a/lib/application/providers/onboarding_provider.dart +++ b/lib/application/providers/onboarding_provider.dart @@ -1,36 +1,27 @@ -import 'package:either_dart/either.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:get_it/get_it.dart'; -import 'package:ottaa_project_flutter/application/common/extensions/translate_string.dart'; -import 'package:ottaa_project_flutter/application/notifiers/loading_notifier.dart'; -import 'package:ottaa_project_flutter/application/notifiers/user_avatar_notifier.dart'; -import 'package:ottaa_project_flutter/core/models/user_model.dart'; -import 'package:ottaa_project_flutter/core/repositories/about_repository.dart'; -import 'package:ottaa_project_flutter/core/repositories/auth_repository.dart'; -import 'package:ottaa_project_flutter/core/repositories/local_database_repository.dart'; class OnBoardingNotifier extends ChangeNotifier { final PageController controller = PageController(initialPage: 0); - final List> formKeys = [ - GlobalKey(), - GlobalKey(), - GlobalKey(), - ]; + double currentIndex = 0; - final TextEditingController nameController = TextEditingController(); - final TextEditingController genderController = TextEditingController(); - final TextEditingController birthDateController = TextEditingController(); - - final AuthRepository _auth; - final LoadingNotifier _loading; - final AboutRepository _about; + OnBoardingNotifier() { + controller.addListener(setIndex); + } - final UserAvatarNotifier _userAvatar; - final LocalDatabaseRepository _localDatabase; + @override + void dispose() { + controller.removeListener(setIndex); + controller.dispose(); + super.dispose(); + } - OnBoardingNotifier(this._auth, this._about, this._localDatabase, this._loading, this._userAvatar); + setIndex() { + final index = controller.page; + currentIndex = (index ?? 0).roundToDouble(); + notifyListeners(); + } void nextPage() { controller.nextPage( @@ -53,82 +44,9 @@ class OnBoardingNotifier extends ChangeNotifier { curve: Curves.easeIn, ); } - - Future signOut() async { - _loading.showLoading(); - await _auth.logout(); - _loading.hideLoading(); - } - - Future> saveUserInformation() async { - _loading.showLoading(); - - bool isValid = formKeys[0].currentState!.validate(); - - if (!isValid) { - _loading.hideLoading(); - return Left('please_enter_some_text'.trl); - } - - final result = await _auth.getCurrentUser(); - - if (result.isLeft) { - _loading.hideLoading(); - return Left(result.left); - } - - final user = result.right; - - List dates = birthDateController.text.split('-'); - - DateTime time = DateTime.parse(dates.reversed.join("-")); - - UserModel newUser = user.copyWith( - name: nameController.text.trim(), - gender: genderController.text.trim(), - birthdate: time.millisecondsSinceEpoch, - ); - - _localDatabase.setUser(newUser); - - await _about.uploadUserInformation(); - - _loading.hideLoading(); - return const Right(true); - } - - void changeAvatar(int imageId) { - _userAvatar.changeAvatar(imageId); - notifyListeners(); - } - - Future updateUserAvatar() async { - _loading.showLoading(); - final result = await _auth.getCurrentUser(); - - if (result.isLeft) { - _loading.hideLoading(); - return; - } - - final user = result.right; - await _about.uploadProfilePicture(_userAvatar.getAvatar()); - UserModel newUser = user.copyWith( - avatar: _userAvatar.getAvatar(), - ); - - await _localDatabase.setUser(newUser); - - await _about.uploadUserInformation(); - _loading.hideLoading(); - } } -final onBoardingProvider = Provider((ref) { - final auth = GetIt.I(); - final about = GetIt.I(); - final localDatabase = GetIt.I(); - final loadingNotifier = ref.watch(loadingProvider.notifier); - final avatarNotifier = ref.watch(userAvatarNotifier.notifier); - return OnBoardingNotifier(auth, about, localDatabase, loadingNotifier, avatarNotifier); +final onBoardingProvider = + ChangeNotifierProvider.autoDispose((ref) { + return OnBoardingNotifier(); }); diff --git a/lib/application/providers/pictograms_provider.dart b/lib/application/providers/pictograms_provider.dart index a18e8e8b..2df6a905 100644 --- a/lib/application/providers/pictograms_provider.dart +++ b/lib/application/providers/pictograms_provider.dart @@ -1,15 +1,11 @@ import 'package:flutter/widgets.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:get_it/get_it.dart'; -import 'package:ottaa_project_flutter/core/repositories/pictograms_repository.dart'; class PictogramsProvider extends ChangeNotifier { - final PictogramsRepository _pictogramsService; - - PictogramsProvider(this._pictogramsService); + PictogramsProvider(); } final pictogramProvider = ChangeNotifierProvider((ref) { - final pictogramService = GetIt.I(); - return PictogramsProvider(pictogramService); + // final pictogramService = GetIt.I(); + return PictogramsProvider(); }); diff --git a/lib/application/providers/profile_provider.dart b/lib/application/providers/profile_provider.dart new file mode 100644 index 00000000..d839e795 --- /dev/null +++ b/lib/application/providers/profile_provider.dart @@ -0,0 +1,256 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:get_it/get_it.dart'; +import 'package:image_picker/image_picker.dart'; +import 'package:ottaa_project_flutter/application/common/extensions/user_extension.dart'; +import 'package:ottaa_project_flutter/application/providers/user_provider.dart'; +import 'package:ottaa_project_flutter/core/abstracts/user_model.dart'; +import 'package:ottaa_project_flutter/core/enums/user_types.dart'; +import 'package:ottaa_project_flutter/core/models/base_user_model.dart'; +import 'package:ottaa_project_flutter/core/models/caregiver_user_model.dart'; +import 'package:ottaa_project_flutter/core/models/patient_user_model.dart'; +import 'package:ottaa_project_flutter/core/repositories/about_repository.dart'; +import 'package:ottaa_project_flutter/core/repositories/local_database_repository.dart'; +import 'package:ottaa_project_flutter/core/repositories/profile_repository.dart'; +import 'package:url_launcher/url_launcher.dart'; + +class ProfileNotifier extends ChangeNotifier { + final ProfileRepository _profileService; + final AboutRepository _aboutService; + final LocalDatabaseRepository _localDatabaseRepository; + final UserNotifier _userNotifier; + + ProfileNotifier( + this._profileService, + this._localDatabaseRepository, + this._userNotifier, + this._aboutService, + ); + + bool isCaregiver = false; + bool isUser = false; + + bool imageSelected = false; + XFile? profileEditImage; + late String imageUrl; + final ImagePicker _picker = ImagePicker(); + bool isLinkAccountOpen = false; + bool connectedUsersFetched = false; + List connectedUsersProfileDataExpanded = []; + final TextEditingController profileEditNameController = TextEditingController(); + final TextEditingController profileEditSurnameController = TextEditingController(); + final TextEditingController profileEditEmailController = TextEditingController(); + + //profile chooser screen + bool professionalSelected = false; + bool userSelected = false; + + //profile edit screen + int day = 0, month = 0, year = DateTime.now().year; + String yearForDropDown = "0"; + + //connected users screen + List connectedUsersData = []; + + List expasionList = []; + bool dataFetched = false; + + //profile email send + String currentOTTAAInstalled = ''; + String deviceName = ''; + + void notify() { + notifyListeners(); + } + + Future setDate() async { + final date = _userNotifier.user!.settings.data.birthDate; + day = date.day; + month = date.month; + year = date.year; + notifyListeners(); + } + + Future openDialer() async { + Uri callUrl = Uri.parse('tel:=+5493518102353'); + if (await canLaunchUrl(callUrl)) { + await launchUrl(callUrl); + } else { + throw 'Could not open the dialler.'; + } + } + + int convertDate() { + final date = DateTime(year, month, day); + return date.millisecondsSinceEpoch; + } + + Future settingUpUserType() async { + final user = _userNotifier.user; + + if (user == null) return; + + UserModel? newUser; + + if (isCaregiver || isUser) { + if (isCaregiver) { + newUser = CaregiverUserModel.fromMap(user.toMap()).copyWith(type: UserType.caregiver); + } else { + newUser = PatientUserModel.fromMap(user.toMap()).copyWith(type: UserType.user); + } + } else { + if (user is CaregiverUserModel) { + isCaregiver = true; + } else if (user is PatientUserModel) { + isUser = true; + } + } + + //Update the user type at the realtime database + await _aboutService.updateUserType(id: user.id, userType: (newUser ?? user).type); + if (newUser != null) { + await _profileService.updateUser(data: newUser.toMap(), userId: user.id); + } + + await _localDatabaseRepository.setUser(newUser ?? user); + _userNotifier.setUser(newUser ?? user); + + notifyListeners(); + } + + Future updateChanges() async { + final user = _userNotifier.user; + if (user == null) return; + + if (imageSelected) { + /// upload the image and fetch its url + imageUrl = await _profileService.uploadUserImage( + name: user.settings.data.name, + path: profileEditImage!.path, + userId: user.id, + ); + } + + /// create the data for the upload + final birthdate = convertDate(); + + user.settings.data = user.settings.data.copyWith( + name: profileEditNameController.text, + birthDate: DateTime.fromMillisecondsSinceEpoch(birthdate), + lastName: profileEditSurnameController.text, + avatar: imageSelected + ? user.settings.data.avatar.copyWith( + network: imageUrl, + ) + : user.settings.data.avatar, + ); + + await _profileService.updateUserSettings(data: user.settings.data.toMap(), userId: user.id); + + await _localDatabaseRepository.setUser(user); + _userNotifier.setUser(user); + + notifyListeners(); + } + + Future pickImage({required bool cameraOrGallery}) async { + //todo: can be improved for later + if (cameraOrGallery) { + profileEditImage = await _picker.pickImage( + source: ImageSource.camera, + maxWidth: 1800, + maxHeight: 1800, + ); + } else { + profileEditImage = await _picker.pickImage( + source: ImageSource.gallery, + maxWidth: 1800, + maxHeight: 1800, + ); + } + if (profileEditImage != null) { + imageSelected = true; + notify(); + } + } + + Future fetchConnectedUsersData() async { + connectedUsersData = []; + final connectedUsers = await _profileService.getConnectedUsers(userId: _userNotifier.user!.id); + if (connectedUsers.isLeft) return; + + await Future.wait(connectedUsers.right.keys.map((e) async { + final res = await _profileService.fetchConnectedUserData(userId: e); + if (res.isRight) { + dynamic json = res.right; + Map settingsData = json["settings"]; + + if (settingsData["language"].runtimeType == String) { + settingsData["language"] = { + "language": settingsData["language"] ?? "es_AR", + "labs": false, + }; + } + + json["settings"] = settingsData; + + connectedUsersData.add( + PatientUserModel.fromMap(json), + ); + connectedUsersProfileDataExpanded.add(false); + } + })); + + dataFetched = true; + connectedUsersFetched = true; + notifyListeners(); + } + + Future fetchUserById(String id) async { + final userFetch = await _profileService.getProfileById(id: id); + + if (userFetch.isLeft) return null; + + final userData = userFetch.right; + + int currentIndex = connectedUsersData.indexWhere((element) => element.id == id); + + PatientUserModel model = PatientUserModel.fromMap(userData); + + if (currentIndex == -1) { + connectedUsersData.add(model); + } else { + connectedUsersData[currentIndex] = model; + } + + notify(); + + return model; + } + + Future removeCurrentUser({required String userId, required String careGiverId}) async { + await _profileService.removeCurrentUser(userId: userId, careGiverId: careGiverId); + + // update the whole list again + dataFetched = false; + _userNotifier.user!.caregiver.users.removeWhere((key, value) => key == userId); + _localDatabaseRepository.setUser(_userNotifier.user!); + await fetchConnectedUsersData(); + dataFetched = true; + notify(); + } +} + +final profileProvider = ChangeNotifierProvider((ref) { + final ProfileRepository profileService = GetIt.I.get(); + final LocalDatabaseRepository localDatabaseRepository = GetIt.I.get(); + final userNot = ref.read(userProvider); + + final AboutRepository aboutRepository = GetIt.I.get(); + return ProfileNotifier( + profileService, + localDatabaseRepository, + userNot, + aboutRepository, + ); +}); diff --git a/lib/application/providers/report_provider.dart b/lib/application/providers/report_provider.dart index 5c369954..ad3d2911 100644 --- a/lib/application/providers/report_provider.dart +++ b/lib/application/providers/report_provider.dart @@ -1,13 +1,12 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:get_it/get_it.dart'; import 'package:ottaa_project_flutter/application/service/report_service.dart'; +import 'package:ottaa_project_flutter/core/models/chart_model.dart'; +import 'package:ottaa_project_flutter/core/models/phrases_statistics_model.dart'; +import 'package:ottaa_project_flutter/core/models/picto_model.dart'; import 'package:ottaa_project_flutter/core/models/picto_statistics_model.dart'; -import 'package:ottaa_project_flutter/core/models/pictogram_model.dart'; import 'dart:async'; -import 'dart:convert'; import 'package:flutter/material.dart'; -import 'package:ottaa_project_flutter/core/models/report_chart_data_model.dart'; -import 'package:ottaa_project_flutter/core/models/sentence_statistics_model.dart'; import 'package:ottaa_project_flutter/core/repositories/auth_repository.dart'; import 'package:ottaa_project_flutter/core/repositories/pictograms_repository.dart'; import 'package:ottaa_project_flutter/core/repositories/report_repository.dart'; @@ -37,9 +36,9 @@ class ReportProvider extends ChangeNotifier { String fourthValueText = 'fourth'; List> mostUsedSentences = []; late PictoStatisticsModel pictoStatisticsModel; - late FrasesStatisticsModel frasesStatisticsModel; + late PhraseStatisticModel frasesStatisticsModel; late List randomPictos; - late List _pictos; + late List _pictos; double averagePictoFrase = 0.00; bool loadingMostUsedSentences = false; int frases7Days = 0; @@ -52,7 +51,7 @@ class ReportProvider extends ChangeNotifier { _pictos = await _pictogramsService.getAllPictograms(); final user = await _auth.getCurrentUser(); uid = user.right.id; - photoUrl = user.right.photoUrl; + photoUrl = user.right.settings.data.avatar.network!; await fetchPictoStatisticsData(); await fetchMostUsedSentences(); calculateScoreForProfile(); @@ -66,7 +65,8 @@ class ReportProvider extends ChangeNotifier { } Future fetchPictoStatisticsData() async { - final pictosResponse = await _reportService.getPictogramsStatistics(uid, "ES-AR"); //TODO: Connect to service + final pictosResponse = await _reportService.getPictogramsStatistics( + uid, "es_AR"); //TODO: Connect to service if (pictosResponse == null) return; @@ -77,7 +77,8 @@ class ReportProvider extends ChangeNotifier { Future fetchMostUsedSentences() async { // print(res.body); - final sentencesResponse = await _reportService.getMostUsedSentences(uid, "ES-AR"); //TODO: Connect to service + final sentencesResponse = await _reportService.getMostUsedSentences( + uid, "es_AR"); //TODO: Connect to service if (sentencesResponse == null) return; @@ -89,9 +90,9 @@ class ReportProvider extends ChangeNotifier { Future makeMostUsedSentencesList() async { /// creating a list to add all of the ids - List> pictosIds = []; + List> pictosIds = []; for (var element in pictoStatisticsModel.mostUsedSentences) { - List res = []; + List res = []; for (var element in element.pictoComponentes) { res.add(element.id); // print(element.id); @@ -106,7 +107,7 @@ class ReportProvider extends ChangeNotifier { for (var id in element) { for (var element in _pictos) { if (element.id == id) { - final val = element.imagen.pictoEditado ?? element.imagen.picto; + final val = element.resource.network!; res.add(val); } } @@ -166,7 +167,10 @@ class ReportProvider extends ChangeNotifier { last7DaysUsage = last7DaysUsage + value; }); double score = 0; - score = (last7DaysUsage * a) + (frasesStatisticsModel.frases7Days * b) + (averagePictoFrase * c) + (usedGrupos * d); + score = (last7DaysUsage * a) + + (frasesStatisticsModel.frases7Days * b) + + (averagePictoFrase * c) + + (usedGrupos * d); scoreProfile = score; String val = score.toString(); val = val.substring(1); @@ -189,7 +193,7 @@ class ReportProvider extends ChangeNotifier { } values.sort((a, b) => b.compareTo(a)); //todo: add here the language too - final language = 'ES-AR'; + const language = 'es_AR'; firstValueProgress = values[0]; secondValueProgress = values[1]; thirdValueProgress = values[2]; @@ -198,7 +202,7 @@ class ReportProvider extends ChangeNotifier { for (var element in pictoStatisticsModel.pictoUsagePerGroup) { if (element.percentage == firstValueProgress) { switch (language) { - case "es-AR": + case "es_AR": firstValueText = element.name.es; break; case "en-US": @@ -216,7 +220,7 @@ class ReportProvider extends ChangeNotifier { } if (element.percentage == secondValueProgress) { switch (language) { - case "es-AR": + case "es_AR": secondValueText = element.name.es; break; case "en-US": @@ -234,7 +238,7 @@ class ReportProvider extends ChangeNotifier { } if (element.percentage == thirdValueProgress) { switch (language) { - case "es-AR": + case "es_AR": thirdValueText = element.name.es; break; case "en-US": @@ -252,7 +256,7 @@ class ReportProvider extends ChangeNotifier { } if (element.percentage == fourthValueProgress) { switch (language) { - case "es-AR": + case "es_AR": fourthValueText = element.name.es; break; case "en-US": diff --git a/lib/application/providers/sentences_provider.dart b/lib/application/providers/sentences_provider.dart index f6e84aa1..046b5ece 100644 --- a/lib/application/providers/sentences_provider.dart +++ b/lib/application/providers/sentences_provider.dart @@ -4,9 +4,8 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:get_it/get_it.dart'; import 'package:ottaa_project_flutter/application/common/constants.dart'; import 'package:ottaa_project_flutter/application/providers/tts_provider.dart'; -import 'package:ottaa_project_flutter/core/models/pictogram_model.dart'; -import 'package:ottaa_project_flutter/core/models/search_indexed_sentences_model.dart'; -import 'package:ottaa_project_flutter/core/models/sentence_model.dart'; +import 'package:ottaa_project_flutter/core/models/phrase_model.dart'; +import 'package:ottaa_project_flutter/core/models/picto_model.dart'; import 'package:ottaa_project_flutter/core/repositories/pictograms_repository.dart'; import 'package:ottaa_project_flutter/core/repositories/sentences_repository.dart'; @@ -31,21 +30,21 @@ class SentencesProvider extends ChangeNotifier { bool searchOrIcon = false; - List _picts = []; - List sentences = []; - List _sentencePicts = []; - List> favouritePicts = []; - List favouriteSentences = []; + List _picts = []; + List sentences = []; + List _sentencePicts = []; + List> favouritePicts = []; + List favouriteSentences = []; int currentFavIndex = 0; - List> favouriteOrNotPicts = []; - List favouriteOrNotSentences = []; + List> favouriteOrNotPicts = []; + List favouriteOrNotSentences = []; int currentFavOrNotIndex = 0; ScrollController favouriteSelectionController = ScrollController(); - final List> _sentencesPicts = []; + final List> _sentencesPicts = []; int _selectedIndexFavSelection = 0; int _selectedIndexFav = 0; - List> get sentencesPicts => _sentencesPicts; + List> get sentencesPicts => _sentencesPicts; int _sentencesIndex = 0; int searchIndex = 0; @@ -94,8 +93,8 @@ class SentencesProvider extends ChangeNotifier { int get selectedIndexFav => _selectedIndexFav; // sentences for searching list - List sentencesForSearch = []; - List sentencesForList = []; + // List sentencesForSearch = []; + // List sentencesForList = []; Future inIt() async { await _loadSentences(); @@ -104,73 +103,74 @@ class SentencesProvider extends ChangeNotifier { showCircular = false; } - void setAnimationController(AnimationController anim) => sentenceAnimationController = anim; + void setAnimationController(AnimationController anim) => + sentenceAnimationController = anim; Future saveFavourite() async { - List toBeSaved = []; - for (var element in sentences) { - if (element.favouriteOrNot) { - toBeSaved.add(element); - } - } - await sentenceService.uploadSentences( - //todo: add the language here - language: 'es-AR', - data: toBeSaved, - type: kFavouriteSentences, - ); - await fetchFavourites(); - notifyListeners(); - _selectedIndexFav = 0; - _selectedIndexFavSelection = 0; + // List toBeSaved = []; + // for (var element in sentences) { + // if (element.favouriteOrNot) { + // toBeSaved.add(element); + // } + // } + // await sentenceService.uploadSentences( + // //todo: add the language here + // language: 'es_AR', + // data: toBeSaved, + // type: kFavouriteSentences, + // ); + // await fetchFavourites(); + // notifyListeners(); + // _selectedIndexFav = 0; + // _selectedIndexFavSelection = 0; } Future _loadSentences() async { _picts = await _pictogramsService.getAllPictograms(); //todo: add the language here - final language = 'es-AR'; + const language = 'es_AR'; switch (language) { - case "es-AR": - sentences = await sentenceService.fetchSentences( - language: language, - type: kMostUsedSentences, - ); + case "es_AR": + // sentences = await sentenceService.fetchSentences( + // language: language, + // type: kMostUsedSentences, + // ); // if (res.isRight) { // sentences = res.right; // } break; case "en-US": - sentences = await sentenceService.fetchSentences( - language: language, - type: kMostUsedSentences, - ); + // sentences = await sentenceService.fetchSentences( + // language: language, + // type: kMostUsedSentences, + // ); // if (res.isRight) { // sentences = res.right; // } break; case "fr-FR": - sentences = await sentenceService.fetchSentences( - language: language, - type: kMostUsedSentences, - ); + // sentences = await sentenceService.fetchSentences( + // language: language, + // type: kMostUsedSentences, + // ); // if (res.isRight) { // sentences = res.right; // } break; case "pt-BR": - sentences = await sentenceService.fetchSentences( - language: language, - type: kMostUsedSentences, - ); + // sentences = await sentenceService.fetchSentences( + // language: language, + // type: kMostUsedSentences, + // ); // if (res.isRight) { // sentences = res.right; // } break; default: - sentences = await sentenceService.fetchSentences( - language: language, - type: kMostUsedSentences, - ); + // sentences = await sentenceService.fetchSentences( + // language: language, + // type: kMostUsedSentences, + // ); // if (res.isRight) { // sentences = res.right; // } @@ -178,36 +178,36 @@ class SentencesProvider extends ChangeNotifier { } ///sorting - Comparator sortById = (a, b) => a.frecuencia.compareTo(b.frecuencia); - sentences.sort(sortById); + // Comparator sortById = (a, b) => a.frecuencia.compareTo(b.frecuencia); + // sentences.sort(sortById); sentences = sentences.reversed.toList(); if (sentences.length >= 10) { for (int i = 0; i <= 9; i++) { _sentencePicts = []; - for (var pictoComponente in sentences[i].complejidad.pictosComponentes) { - _sentencePicts.add(_picts.firstWhere((pict) => pict.id == pictoComponente.id)); - } + // for (var pictoComponente in sentences[i].complejidad.pictosComponentes) { + // _sentencePicts.add(_picts.firstWhere((pict) => pict.id == pictoComponente.id)); + // } _sentencesPicts.add(_sentencePicts); } } else { - for (var sentence in sentences) { - _sentencePicts = []; - for (var pictoComponente in sentence.complejidad.pictosComponentes) { - _sentencePicts.add(_picts.firstWhere((pict) => pict.id == pictoComponente.id)); - } - _sentencesPicts.add(_sentencePicts); - } + // for (var sentence in sentences) { + // _sentencePicts = []; + // // for (var pictoComponente in sentence.complejidad.pictosComponentes) { + // // _sentencePicts.add(_picts.firstWhere((pict) => pict.id == pictoComponente.id)); + // // } + // _sentencesPicts.add(_sentencePicts); + // } } notifyListeners(); } void fetchFavOrNot() { - Comparator sortById = (a, b) => a.frecuencia.compareTo(b.frecuencia); - sentences.sort(sortById); + // Comparator sortById = (a, b) => a.frecuencia.compareTo(b.frecuencia); + // sentences.sort(sortById); sentences = sentences.reversed.toList(); for (var element in sentences) { _sentencePicts = []; - for (var pictoComponente in element.complejidad.pictosComponentes) { + for (var pictoComponente in element.sequence) { // if() //todo: will fix it when we will be working on the new UI, For now it is juts a lazy fix bool found = false; @@ -225,60 +225,59 @@ class SentencesProvider extends ChangeNotifier { } favouriteOrNotPicts.add(_sentencePicts); } - print('the size is this: ${favouriteOrNotPicts.length}'); } Future fetchFavourites() async { //todo: - final language = 'es-AR'; + const language = 'es_AR'; switch (language) { - case "es-AR": - favouriteSentences = await sentenceService.fetchSentences( - language: language, - type: kFavouriteSentences, - isFavorite: true, - ); + case "es_AR": + // favouriteSentences = await sentenceService.fetchSentences( + // language: language, + // type: kFavouriteSentences, + // isFavorite: true, + // ); // if (res.isRight) { // favouriteSentences = res.right; // } break; case "en-US": - favouriteSentences = await sentenceService.fetchSentences( - language: language, - type: kFavouriteSentences, - isFavorite: true, - ); + // favouriteSentences = await sentenceService.fetchSentences( + // language: language, + // type: kFavouriteSentences, + // isFavorite: true, + // ); // if (res.isRight) { // favouriteSentences = res.right; // } break; case "fr-FR": - favouriteSentences = await sentenceService.fetchSentences( - language: language, - type: kFavouriteSentences, - isFavorite: true, - ); + // favouriteSentences = await sentenceService.fetchSentences( + // language: language, + // type: kFavouriteSentences, + // isFavorite: true, + // ); // if (res.isRight) { // favouriteSentences = res.right; // } break; case "pt-BR": - favouriteSentences = await sentenceService.fetchSentences( - language: language, - type: kFavouriteSentences, - isFavorite: true, - ); + // favouriteSentences = await sentenceService.fetchSentences( + // language: language, + // type: kFavouriteSentences, + // isFavorite: true, + // ); // if (res.isRight) { // favouriteSentences = res.right; // } break; default: - favouriteSentences = await sentenceService.fetchSentences( - language: language, - type: kFavouriteSentences, - isFavorite: true, - ); + // favouriteSentences = await sentenceService.fetchSentences( + // language: language, + // type: kFavouriteSentences, + // isFavorite: true, + // ); // if (res.isRight) { // favouriteSentences = res.right; // } @@ -288,16 +287,18 @@ class SentencesProvider extends ChangeNotifier { if (favouriteSentences.length >= 10) { for (int i = 0; i <= 9; i++) { _sentencePicts = []; - for (var pictoComponente in favouriteSentences[i].complejidad.pictosComponentes) { - _sentencePicts.add(_picts.firstWhere((pict) => pict.id == pictoComponente.id)); + for (var pictoComponente in favouriteSentences[i].sequence) { + _sentencePicts + .add(_picts.firstWhere((pict) => pict.id == pictoComponente.id)); } favouritePicts.add(_sentencePicts); } } else { for (var sentence in favouriteSentences) { _sentencePicts = []; - for (var pictoComponente in sentence.complejidad.pictosComponentes) { - _sentencePicts.add(_picts.firstWhere((pict) => pict.id == pictoComponente.id)); + for (var pictoComponente in sentence.sequence) { + _sentencePicts + .add(_picts.firstWhere((pict) => pict.id == pictoComponente.id)); } favouritePicts.add(_sentencePicts); } @@ -309,32 +310,12 @@ class SentencesProvider extends ChangeNotifier { String voiceText = ""; for (var pict in _sentencesPicts[_sentencesIndex]) { //todo: add the language here too - final language = 'es-AR'; //FUCK THE POLICE!!! - - switch (language) { - // case "es-AR": - // voiceText += ' ' + pict.texto.es; - // break; - case "es-AR": - voiceText += ' ${pict.texto.es}'; - break; - case "en-US": - voiceText += ' ${pict.texto.en}'; - break; - case "fr-FR": - voiceText += ' ${pict.texto.fr}'; - break; - case "pt-BR": - voiceText += ' ${pict.texto.pt}'; - break; - default: - voiceText += ' ${pict.texto.es}'; - } + // const language = 'es_AR'; //FUCK THE POLICE!!! + voiceText += ' ${pict.text}'; } await _tts.speak(voiceText); - print(sentencesForSearch[_sentencesIndex].sentence); - print(_sentencesIndex); + // print(sentencesForSearch[_sentencesIndex].sentence); } } @@ -343,29 +324,12 @@ class SentencesProvider extends ChangeNotifier { String voiceText = ""; for (var pict in favouriteOrNotPicts[_selectedIndexFavSelection]) { //todo: add teh language here - switch ('es-AR') { - // case "es-AR": - // voiceText += ' ' + pict.texto.es; - // break; - case "es-AR": - voiceText += ' ${pict.texto.es}'; - break; - case "en-US": - voiceText += ' ${pict.texto.en}'; - break; - case "fr-FR": - voiceText += ' ${pict.texto.fr}'; - break; - case "pt-BR": - voiceText += ' ${pict.texto.pt}'; - break; - default: - voiceText += ' ${pict.texto.es}'; - } + voiceText += ' ${pict.text}'; + + ///TODO: Update this } await _tts.speak(voiceText); - print(voiceText); notifyListeners(); // print(favouriteOrNotPicts[this._selectedIndexFavSelection]); // print(favouriteOrNotPicts[this._sel); @@ -377,29 +341,12 @@ class SentencesProvider extends ChangeNotifier { String voiceText = ""; for (var pict in favouritePicts[_selectedIndexFav]) { //todo: add teh language here - switch ('es-AR') { - // case "es-AR": - // voiceText += ' ' + pict.texto.es; - // break; - case "es-AR": - voiceText += ' ${pict.texto.es}'; - break; - case "en-US": - voiceText += ' ${pict.texto.en}'; - break; - case "fr-FR": - voiceText += ' ${pict.texto.fr}'; - break; - case "pt-BR": - voiceText += ' ${pict.texto.pt}'; - break; - default: - voiceText += ' ${pict.texto.es}'; - } + voiceText += ' ${pict.text}'; + + ///TODO: Update this } await _tts.speak(voiceText); - print(voiceText); notifyListeners(); // print(favouriteOrNotPicts[this._selectedIndexFavSelection]); // print(favouriteOrNotPicts[this._sel); @@ -407,96 +354,96 @@ class SentencesProvider extends ChangeNotifier { } Future searchSpeak() async { - if (_sentencesPicts[sentencesForList[searchIndex].index].isNotEmpty) { - String voiceText = ""; - for (var pict in _sentencesPicts[sentencesForList[searchIndex].index]) { - //todo: add the language here - switch ('es-AR') { - // case "es-AR": - // voiceText += ' ' + pict.texto.es; - // break; - case "es-AR": - voiceText += ' ${pict.texto.es}'; - break; - case "en-US": - voiceText += ' ${pict.texto.en}'; - break; - case "fr-FR": - voiceText += ' ${pict.texto.fr}'; - break; - case "pt-BR": - voiceText += ' ${pict.texto.pt}'; - break; - default: - voiceText += ' ${pict.texto.es}'; - } - } - - await _tts.speak(voiceText); - print(sentencesForList[searchIndex].sentence); - print('search index is $searchIndex'); - print('the index from controller is ${sentencesForList[searchIndex].index}'); - } + // if (_sentencesPicts[sentencesForList[searchIndex].index].isNotEmpty) { + // String voiceText = ""; + // for (var pict in _sentencesPicts[sentencesForList[searchIndex].index]) { + // //todo: add the language here + // switch ('es_AR') { + // // case "es_AR": + // // voiceText += ' ' + pict.texto.es; + // // break; + // case "es_AR": + // voiceText += ' ${pict.texto.es}'; + // break; + // case "en-US": + // voiceText += ' ${pict.texto.en}'; + // break; + // case "fr-FR": + // voiceText += ' ${pict.texto.fr}'; + // break; + // case "pt-BR": + // voiceText += ' ${pict.texto.pt}'; + // break; + // default: + // voiceText += ' ${pict.texto.es}'; + // } + // } + + // await _tts.speak(voiceText); + // print(sentencesForList[searchIndex].sentence); + // print('search index is $searchIndex'); + // print('the index from controller is ${sentencesForList[searchIndex].index}'); + // } } Future createListForSearching() async { - int i = 0; - for (var e1 in _sentencesPicts) { - String sentence = ''; - for (var e2 in e1) { - //todo: add the language here - switch ('es-AR') { - // case "es": - // sentence += ' ' + e2.texto.es; - // break; - case "es-AR": - sentence += ' ${e2.texto.es}'; - break; - case "en-US": - sentence += ' ${e2.texto.en}'; - break; - case "fr-FR": - sentence += ' ${e2.texto.fr}'; - break; - case "pt-BR": - sentence += ' ${e2.texto.pt}'; - break; - default: - sentence += ' ${e2.texto.es}'; - } - } - - sentencesForSearch.add( - SearchIndexedSentences(sentence: sentence, index: i), - ); - i++; - } - for (var element in sentencesForSearch) { - print(element.sentence); - } - sentencesForList.addAll(sentencesForSearch); + // int i = 0; + // for (var e1 in _sentencesPicts) { + // String sentence = ''; + // // for (var e2 in e1) { + // // //todo: add the language here + // // switch ('es_AR') { + // // // case "es": + // // // sentence += ' ' + e2.texto.es; + // // // break; + // // case "es_AR": + // // sentence += ' ${e2.texto.es}'; + // // break; + // // case "en-US": + // // sentence += ' ${e2.texto.en}'; + // // break; + // // case "fr-FR": + // // sentence += ' ${e2.texto.fr}'; + // // break; + // // case "pt-BR": + // // sentence += ' ${e2.texto.pt}'; + // // break; + // // default: + // // sentence += ' ${e2.texto.es}'; + // // } + // // } + + // // sentencesForSearch.add( + // // SearchIndexedSentences(sentence: sentence, index: i), + // // ); + // i++; + // } + // for (var element in sentencesForSearch) { + // print(element.sentence); + // } + // sentencesForList.addAll(sentencesForSearch); } Future onChangedText(String v) async { - List listData = []; - if (v.isNotEmpty) { - for (var element in sentencesForSearch) { - final b = element.sentence.toUpperCase().contains(v.toString().toUpperCase(), 0); - if (b) { - listData.add(element); - } - } - sentencesForList.clear(); - sentencesForList.addAll(listData); - searchIndex = 0; - print(sentencesForList.length); - notifyListeners(); - } else { - sentencesForList.addAll(sentencesForSearch); - searchIndex = 0; - print(sentencesForList.length); - notifyListeners(); - } + // List listData = []; + // if (v.isNotEmpty) { + // for (var element in sentencesForSearch) { + // final b = element.sentence.toUpperCase().contains(v.toString().toUpperCase(), 0); + // if (b) { + // listData.add(element); + // } + // } + // sentencesForList.clear(); + // sentencesForList.addAll(listData); + // searchIndex = 0; + // print(sentencesForList.length); + // notifyListeners(); + // } else { + // sentencesForList.addAll(sentencesForSearch); + // searchIndex = 0; + // print(sentencesForList.length); + // notifyListeners(); + // } } void decrementOne() { @@ -504,15 +451,10 @@ class SentencesProvider extends ChangeNotifier { searchIndex--; } notifyListeners(); - print(searchIndex); } void incrementOne() { - if (sentencesForList.length - 1 != searchIndex) { - searchIndex++; - } - notifyListeners(); - print(searchIndex); + // s } void changeSelectedIndexFavSelection(int index) { diff --git a/lib/application/providers/splash_provider.dart b/lib/application/providers/splash_provider.dart index 45eef88d..6c636a63 100644 --- a/lib/application/providers/splash_provider.dart +++ b/lib/application/providers/splash_provider.dart @@ -1,37 +1,74 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:get_it/get_it.dart'; -import 'package:ottaa_project_flutter/application/notifiers/user_avatar_notifier.dart'; +import 'package:ottaa_project_flutter/application/providers/user_provider.dart'; import 'package:ottaa_project_flutter/core/repositories/about_repository.dart'; import 'package:ottaa_project_flutter/core/repositories/auth_repository.dart'; +import 'package:ottaa_project_flutter/core/repositories/local_database_repository.dart'; class SplashProvider extends ChangeNotifier { final AboutRepository _aboutRepository; final AuthRepository _auth; - final UserAvatarNotifier _avatarNotifier; + final UserNotifier _userNotifier; + final LocalDatabaseRepository _hiveRepository; - SplashProvider(this._aboutRepository, this._auth, this._avatarNotifier); + SplashProvider( + this._aboutRepository, + this._auth, + this._userNotifier, + this._hiveRepository, + ); Future checkUserAvatar() => _aboutRepository.isCurrentUserAvatarExist(); - Future isFirstTime() => _aboutRepository.isFirstTime(); + Future isFirstTime() async { + return await _hiveRepository.getIntro(); + } + + Future setFirstTime() async { + await _hiveRepository.setIntro(false); + } Future fetchUserInformation() async { final result = await _aboutRepository.getUserInformation(); - + // print(result); if (result.isLeft) { await _auth.logout(); return false; } - _avatarNotifier.changeAvatar(int.tryParse(result.right.avatar ?? "615") ?? 615); - + // _avatarNotifier.changeAvatar(int.tryParse(result.right.settings.data.avatar.asset) ?? 615); + _userNotifier.setUser(result.right); return result.isRight; } + + Future updateLastConnectionTime({ + required String userId, + required int time, + }) async { + await _aboutRepository.updateUserLastConnectionTime( + userId: userId, + time: time, + ); + } + + Future hasUser() async { + final result = await _auth.getCurrentUser(); + if (result.isLeft) { + return false; + } + return true; + } } final splashProvider = ChangeNotifierProvider((ref) { final AboutRepository aboutService = GetIt.I.get(); final AuthRepository authService = GetIt.I.get(); - final UserAvatarNotifier avatarNotifier = ref.read(userAvatarNotifier.notifier); - return SplashProvider(aboutService, authService, avatarNotifier); + final LocalDatabaseRepository localDatabaseRepository = GetIt.I.get(); + final UserNotifier userState = ref.read(userProvider); + return SplashProvider( + aboutService, + authService, + userState, + localDatabaseRepository, + ); }); diff --git a/lib/application/providers/tts_provider.dart b/lib/application/providers/tts_provider.dart index fe13234c..f853fe19 100644 --- a/lib/application/providers/tts_provider.dart +++ b/lib/application/providers/tts_provider.dart @@ -1,14 +1,40 @@ import 'package:flutter/widgets.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:get_it/get_it.dart'; -import 'package:ottaa_project_flutter/core/repositories/tts_repository.dart'; +import 'package:ottaa_project_flutter/core/models/voices_model.dart'; +import 'package:ottaa_project_flutter/core/repositories/repositories.dart'; +import 'package:async/async.dart'; class TTSProvider extends ChangeNotifier { final TTSRepository tts; + Future? speakOperation; + TTSProvider(this.tts); - Future speak(String text) => tts.speak(text); + Future speak(String text) async => tts.speak(text); + + Future> fetchVoices(String languageCode) async { + return await tts.fetchVoices(); + } + + Future changeVoiceSpeed(double speed) async { + tts.changeVoiceSpeed(speed); + } + + Future changeCustomTTs(bool value) async { + tts.changeCustomTTs(value); + } + + Future ttsStop() => tts.ttsStop(); + + Future changeTTSVoice(String voice) async { + await tts.changeTTSVoice(voice); + } + + Future init() async { + //todo: fetch the settings from hive if they are custom or not. + } } final ttsProvider = ChangeNotifierProvider((ref) { diff --git a/lib/application/providers/user_provider.dart b/lib/application/providers/user_provider.dart new file mode 100644 index 00000000..52e284e1 --- /dev/null +++ b/lib/application/providers/user_provider.dart @@ -0,0 +1,27 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:ottaa_project_flutter/core/abstracts/user_model.dart'; + +class UserNotifier extends ChangeNotifier { + UserModel? _userModel; + + UserModel? get user => _userModel; + + set user(UserModel? userModel) { + _userModel = userModel; + } + + void setUser(UserModel? userModel) { + _userModel = userModel; + notifyListeners(); + } + + void clearUser() { + _userModel = null; + notifyListeners(); + } +} + +final userProvider = ChangeNotifierProvider((ref) { + return UserNotifier(); +}); diff --git a/lib/application/providers/user_settings_provider.dart b/lib/application/providers/user_settings_provider.dart new file mode 100644 index 00000000..3e9991bd --- /dev/null +++ b/lib/application/providers/user_settings_provider.dart @@ -0,0 +1,420 @@ +import 'dart:convert'; +import 'dart:io'; + +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:get_it/get_it.dart'; +import 'package:ottaa_project_flutter/application/common/extensions/translate_string.dart'; +import 'package:ottaa_project_flutter/application/common/extensions/user_extension.dart'; +import 'package:ottaa_project_flutter/application/common/i18n.dart'; +import 'package:ottaa_project_flutter/application/notifiers/patient_notifier.dart'; +import 'package:ottaa_project_flutter/application/providers/profile_provider.dart'; +import 'package:ottaa_project_flutter/application/providers/tts_provider.dart'; +import 'package:ottaa_project_flutter/application/providers/user_provider.dart'; +import 'package:ottaa_project_flutter/core/enums/devices_accessibility.dart'; +import 'package:ottaa_project_flutter/core/enums/display_types.dart'; +import 'package:ottaa_project_flutter/core/enums/size_types.dart'; +import 'package:ottaa_project_flutter/core/enums/sweep_modes.dart'; +import 'package:ottaa_project_flutter/core/enums/velocity_types.dart'; +import 'package:ottaa_project_flutter/core/models/accessibility_setting.dart'; +import 'package:ottaa_project_flutter/core/models/language_setting.dart'; +import 'package:ottaa_project_flutter/core/models/layout_setting.dart'; +import 'package:ottaa_project_flutter/core/models/patient_user_model.dart'; +import 'package:ottaa_project_flutter/core/models/tts_setting.dart'; +import 'package:ottaa_project_flutter/core/models/voices_model.dart'; +import 'package:ottaa_project_flutter/core/repositories/repositories.dart'; +import 'package:ottaa_project_flutter/core/repositories/user_settings_repository.dart'; + +class UserSettingsProvider extends ChangeNotifier { + final I18N _i18n; + + final UserSettingRepository _userSettingRepository; + final TTSRepository _ttsServices; + final TTSProvider _ttsProvider; + + final UserNotifier _userNotifier; + final PatientNotifier _patientNotifier; + + final LocalDatabaseRepository _localDatabaseRepository; + + final ProfileNotifier _profileNotifier; + + UserSettingsProvider( + this._i18n, + this._userSettingRepository, + this._userNotifier, + this._patientNotifier, + this._localDatabaseRepository, + this._profileNotifier, + this._ttsServices, + this._ttsProvider, + ); + + bool deleteText = true; + bool shortcut = true; + List selectedShortcuts = [true, true, true, true, true, true, true]; + DisplayTypes boardView = DisplayTypes.grid; + bool ottaaLabs = false; + bool accessibility = true; + double sliderValue = 1.0; + DevicesAccessibility selectedAccessibility = DevicesAccessibility.press; + SweepModes selectionType = SweepModes.elements; + VelocityTypes accessibilitySpeed = VelocityTypes.mid; + String voiceType = 'default1'; + String voiceRate = VelocityTypes.mid.name; + bool mute = false; + bool show = false; + SizeTypes size = SizeTypes.small; + bool capital = true; + String language = 'es_AR'; + final List enVoices = ['Ava', 'Nathan', 'Albert', 'Whisper', 'Jester', 'Samantha']; + final List itVoices = ['Alice', 'Luca', 'Paola']; + final List esVoices = ['Diego', 'Isabela']; + late AccessibilitySetting accessibilitySetting; + late LanguageSetting languageSetting; + late LayoutSetting layoutSetting; + late TTSSetting ttsSetting; + List voices = []; + List filteredVoices = []; + String voiceName = "es-ES-language"; + + PatientUserModel get currentUser => _patientNotifier.patient ?? _userNotifier.user!.patient; + + void notify() { + notifyListeners(); + } + + Future fetchUserSettings() async { + return await _userSettingRepository.fetchUserSettings(userId: currentUser.id); + } + + Future init() async { + language = _i18n.currentLanguage!.locale.toString(); + await fetchAllVoices(language: language); + await initialiseSettings(); + } + + Future initialiseSettings() async { + final res = await fetchUserSettings(); + if (res.isRight) { + final data = res.right; + accessibilitySetting = data['accessibility'] != null ? AccessibilitySetting.fromJson(jsonEncode(data['accessibility'])) : AccessibilitySetting.empty(); + languageSetting = data['language'] != null && data['language'].runtimeType != String ? LanguageSetting.fromJson(jsonEncode(data['language'])) : LanguageSetting.empty(language: data['language']); + ttsSetting = data['tts'] != null + ? TTSSetting.fromJson(jsonEncode(data['tts'])) + : TTSSetting.empty( + language: languageSetting.language, + ); + layoutSetting = data['layout'] != null ? LayoutSetting.fromJson((jsonEncode(data['layout']))) : LayoutSetting.empty(); + + // if (ttsSetting.voiceSetting.voicesSpeed[language]!.name != null) { + // voiceRate = ttsSetting.voiceSetting.voicesSpeed[language]!.name; + // } + } else { + accessibilitySetting = AccessibilitySetting.empty(); + languageSetting = LanguageSetting.empty(); + layoutSetting = LayoutSetting.empty(); + ttsSetting = TTSSetting.empty(); + } + + notify(); + } + + Future changeOttaaLabs({required bool value}) async { + ottaaLabs = value; + languageSetting.labs = value; + notifyListeners(); + } + + Future updateLanguageSettings() async { + _userSettingRepository.updateLanguageSettings( + map: languageSetting.toMap(), + userId: currentUser.id, + ); + + if (_userNotifier.user!.isCaregiver) { + int patientIndex = _profileNotifier.connectedUsersData.indexWhere((element) => element.id == _patientNotifier.user.id); + + if (patientIndex != -1) { + _profileNotifier.connectedUsersData[patientIndex].patientSettings.language = languageSetting; + } + } else { + currentUser.patientSettings.language = languageSetting; + + _localDatabaseRepository.setUser(currentUser); + } + } + + Future updateVoiceAndSubtitleSettings() async { + _userSettingRepository.updateVoiceAndSubtitleSettings( + map: ttsSetting.toMap(), + userId: currentUser.id, + ); + + if (_userNotifier.user!.isCaregiver) { + int patientIndex = _profileNotifier.connectedUsersData.indexWhere((element) => element.id == _patientNotifier.user.id); + + if (patientIndex != -1) { + _profileNotifier.connectedUsersData[patientIndex].patientSettings.tts = ttsSetting; + } + } else { + currentUser.patientSettings.tts = ttsSetting; + + _localDatabaseRepository.setUser(currentUser); + } + } + + Future updateAccessibilitySettings() async { + _userSettingRepository.updateAccessibilitySettings( + map: accessibilitySetting.toMap(), + userId: currentUser.id, + ); + + if (_userNotifier.user!.isCaregiver) { + int patientIndex = _profileNotifier.connectedUsersData.indexWhere((element) => element.id == _patientNotifier.user.id); + + if (patientIndex != -1) { + _profileNotifier.connectedUsersData[patientIndex].patientSettings.accessibility = accessibilitySetting; + } + } else { + currentUser.patientSettings.accessibility = accessibilitySetting; + + _localDatabaseRepository.setUser(currentUser); + } + } + + Future updateMainSettings() async { + _userSettingRepository.updateMainSettings( + map: layoutSetting.toMap(), + userId: currentUser.id, + ); + + if (_userNotifier.user!.isCaregiver) { + int patientIndex = _profileNotifier.connectedUsersData.indexWhere((element) => element.id == _patientNotifier.user.id); + + if (patientIndex != -1) { + _profileNotifier.connectedUsersData[patientIndex].patientSettings.layout = layoutSetting; + } + } else { + currentUser.patientSettings.layout = layoutSetting; + _localDatabaseRepository.setUser(currentUser); + } + } + + Future changeLanguage({required String languageCode}) async { + language = languageCode; + languageSetting.language = languageCode; + if (_userNotifier.user?.isPatient ?? false) { + await _i18n.changeLanguage(languageCode); + } + await fetchAllVoices(language: language); + await changeLanguageWithoutTTSSPeaking(name: filteredVoices.isNotEmpty ? filteredVoices.first.name : ''); + notifyListeners(); + } + + Future changeLanguageWithoutTTSSPeaking({required String name}) async { + voiceType = name; + voiceName = name; + await _ttsServices.changeCustomTTs(true); + await _ttsServices.changeTTSVoice(name); + ttsSetting.voiceSetting.voicesNames[language] = name; + _localDatabaseRepository.setVoice(name: name); + notifyListeners(); + } + + Future changeVoiceType({required String type}) async { + voiceType = type; + await changeTTSVoice(value: type); + ttsSetting.voiceSetting.voicesNames[language] = type; + _localDatabaseRepository.setVoice(name: type); + notifyListeners(); + } + + void changeVoiceSpeed({required VelocityTypes type}) { + switch (type) { + case VelocityTypes.slow: + _ttsServices.changeCustomTTs(true); + _ttsServices.changeVoiceSpeed(Platform.isIOS ? 0.3 : 1.0); + break; + case VelocityTypes.mid: + _ttsServices.changeCustomTTs(false); + _ttsServices.changeVoiceSpeed(Platform.isIOS ? 0.5 : .8); + break; + case VelocityTypes.fast: + _ttsServices.changeCustomTTs(true); + _ttsServices.changeVoiceSpeed(Platform.isIOS ? 0.65 : 1.0); + break; + } + voiceRate = type.name; + ttsSetting.voiceSetting.voicesSpeed[language] = type; + notifyListeners(); + } + + Future changeTTSVoice({required String value}) async { + voiceName = value; + await _ttsServices.changeCustomTTs(true); + await _ttsServices.changeTTSVoice(value); + print(value); + await _ttsProvider.speak('global.test'.trl); + notifyListeners(); + } + + Future saveUserVoiceChoice() async { + await _localDatabaseRepository.setVoice(name: 'name'); + } + + void changeMute({required bool value}) { + ttsSetting.voiceSetting.mutePict = value; + mute = value; + notifyListeners(); + } + + void changeSubtitle({required bool value}) { + ttsSetting.subtitlesSetting.show = value; + show = value; + notifyListeners(); + } + + void changeTextType({required SizeTypes type}) { + size = type; + ttsSetting.subtitlesSetting.size = type; + notifyListeners(); + } + + void changeCapital({required bool value}) { + capital = value; + ttsSetting.subtitlesSetting.caps = value; + notifyListeners(); + } + + void changeSpeed({required double value}) { + ///change it after doing some other work + if (value >= 3.0) {} + accessibilitySetting.clickTime = VelocityTypes.mid; + sliderValue = value; + notifyListeners(); + } + + void changeDeviceOnOff({required bool mode}) { + if (mode) { + accessibilitySetting.device = DevicesAccessibility.press; + } else { + accessibilitySetting.device = DevicesAccessibility.none; + } + notifyListeners(); + } + + void changeDevice({required DevicesAccessibility devicesAccessibility}) { + accessibilitySetting.device = devicesAccessibility; + selectedAccessibility = devicesAccessibility; + notifyListeners(); + } + + void changeSelection({required SweepModes modes}) { + accessibilitySetting.sweepMode = modes; + selectionType = modes; + notifyListeners(); + } + + void changeAccessibilitySpeed({required VelocityTypes speed}) { + accessibilitySetting.sweepSpeed = speed; + accessibilitySpeed = speed; + notifyListeners(); + } + + void changeDeleteText({required bool value}) { + layoutSetting.cleanup = value; + deleteText = value; + notifyListeners(); + } + + void changeOneToOne({required bool value}) { + layoutSetting.oneToOne = value; + notifyListeners(); + } + + changeEnableShortcuts({required bool value}) { + layoutSetting.shortcuts.enable = value; + shortcut = value; + notifyListeners(); + } + + void changeTablet({required DisplayTypes value}) { + layoutSetting.display = value; + boardView = value; + notifyListeners(); + } + + Future fetchAllVoices({String language = ''}) async { + voices = await _ttsServices.fetchVoices(); + filteredVoices = []; + final splittedLanguage = language.split('_'); + + if (Platform.isIOS) { + switch (language) { + case 'en_US': + for (var element in enVoices) { + for (var voice in voices) { + if (voice.name.toUpperCase() == element.toUpperCase()) { + filteredVoices.add(voice); + } + } + } + break; + case 'es_AR': + for (var element in esVoices) { + for (var voice in voices) { + if (voice.name.toUpperCase() == element.toUpperCase()) { + filteredVoices.add(voice); + } + } + } + break; + case 'it_IT': + for (var element in itVoices) { + for (var voice in voices) { + if (voice.name.toUpperCase() == element.toUpperCase()) { + filteredVoices.add(voice); + } + } + } + break; + default: + for (var voice in voices) { + if (voice.locale == '${splittedLanguage.first}-${splittedLanguage.last}' && !voice.name.contains('network')) { + filteredVoices.add(voice); + } + } + } + } else { + for (var voice in voices) { + if (voice.locale == '${splittedLanguage.first}-${splittedLanguage.last}' && !voice.name.contains('network')) { + filteredVoices.add(voice); + } + } + if (language.toLowerCase().contains('es') || filteredVoices.isEmpty) { + for (var voice in voices) { + if (voice.locale.toUpperCase() == 'ES-US' && !voice.name.contains('network')) { + filteredVoices.add(voice); + } + } + } + } + } +} + +final userSettingsProvider = ChangeNotifierProvider((ref) { + final i18N = GetIt.I(); + final userSettingsService = GetIt.I(); + + final UserNotifier userNotifierState = ref.watch(userProvider); + final PatientNotifier patientNotifierState = ref.watch(patientNotifier.notifier); + + final ProfileNotifier profileNotifier = ref.watch(profileProvider); + final TTSRepository ttsNotifier = GetIt.I(); + + final LocalDatabaseRepository localDatabaseRepository = GetIt.I.get(); + final tts = ref.watch(ttsProvider); + + return UserSettingsProvider(i18N, userSettingsService, userNotifierState, patientNotifierState, localDatabaseRepository, profileNotifier, ttsNotifier, tts); +}); diff --git a/lib/application/providers/view_board_provider.dart b/lib/application/providers/view_board_provider.dart new file mode 100644 index 00000000..8df8cae2 --- /dev/null +++ b/lib/application/providers/view_board_provider.dart @@ -0,0 +1,159 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:get_it/get_it.dart'; +import 'package:ottaa_project_flutter/application/common/extensions/user_extension.dart'; +import 'package:ottaa_project_flutter/application/common/i18n.dart'; +import 'package:ottaa_project_flutter/application/providers/user_provider.dart'; +import 'package:ottaa_project_flutter/core/enums/user_types.dart'; +import 'package:ottaa_project_flutter/core/models/group_model.dart'; +import 'package:ottaa_project_flutter/core/models/picto_model.dart'; +import 'package:ottaa_project_flutter/core/repositories/create_picto_repository.dart'; +import 'package:ottaa_project_flutter/core/repositories/repositories.dart'; + +class ViewBoardProvider extends ChangeNotifier { + final GroupsRepository _groupsService; + final LocalDatabaseRepository _localDatabaseRepository; + final I18N _i18n; + final UserNotifier userState; + final PictogramsRepository _pictogramsService; + final CreatePictoRepository _createPictoServices; + + ViewBoardProvider(this._i18n, this._groupsService, this._pictogramsService, this._localDatabaseRepository, this._createPictoServices, this.userState); + + String userID = ''; + bool isUser = true; + String selectedAlphabet = 'A'; + bool isSearching = false; + bool isDataFetched = false; + int selectedBoardID = -1; + List boards = []; + List pictograms = []; + List filteredPictos = []; + List filteredSearchPictos = []; + List filteredBoards = []; + String selectedType = ''; + + Future init({required String userId}) async { + await fetchUserGroups(userId: userId); + await fetchUserPictos(userId: userId); + await filterPictosForView(); + userID = userId; + notifyListeners(); + } + + Future fetchDesiredPictos() async { + filteredPictos = []; + for (int i = 0; i < boards[selectedBoardID].relations.length; i++) { + for (var e in pictograms) { + if (e.id == boards[selectedBoardID].relations[i].id) { + filteredPictos.add(e); + } + } + } + } + + Future filterPictosForView() async { + filteredPictos.clear(); + for (var pict in pictograms) { + if (pict.text.toUpperCase().startsWith(selectedAlphabet.toUpperCase())) { + filteredPictos.add(pict); + } + } + notifyListeners(); + } + + Future hideCurrentPicto({required String id, required int index}) async { + int i = -1; + final res = pictograms.firstWhere((element) { + i++; + return element.id == id; + }); + pictograms[i].block = !pictograms[i].block; + filteredPictos[index].block = filteredPictos[index].block; + notifyListeners(); + } + + Future searchForMatchingData({required String text}) async { + isSearching = true; + isDataFetched = false; + filteredSearchPictos.clear(); + filteredBoards.clear(); + for (var pict in pictograms) { + if (pict.text.toUpperCase().contains( + text.toUpperCase(), + )) { + filteredSearchPictos.add(pict); + } + } + for (var board in boards) { + if (board.text.toUpperCase().contains(text.toUpperCase())) { + filteredBoards.add(board); + } + } + isDataFetched = true; + print(filteredSearchPictos.length); + print(filteredBoards.length); + notifyListeners(); + } + + Future fetchUserGroups({required String userId}) async { + final res = await _createPictoServices.fetchUserGroups(languageCode: _i18n.currentLocale.toString(), userId: userId); + if (res.isEmpty) { + final res = await _createPictoServices.fetchDefaultGroups(languageCode: _i18n.currentLocale.toString()); + boards = res; + } else { + boards = res; + } + notifyListeners(); + } + + Future fetchUserPictos({required String userId}) async { + final locale = _i18n.currentLocale.toString(); + pictograms = await _createPictoServices.fetchUserPictos(languageCode: locale, userId: userId); + if (pictograms.isEmpty) { + pictograms = await _createPictoServices.fetchDefaultPictos(languageCode: locale); + } + } + + void notify() { + notifyListeners(); + } + + Future uploadGroups() async { + await _groupsService.uploadGroups(boards, 'type', _i18n.currentLocale.toString(), userId: userID); + + if (userState.user!.type == UserType.user) { + final newUser = userState.user!.patient; + newUser.groups[_i18n.currentLocale.toString()] = boards; + userState.user!.patient.groups[_i18n.currentLocale.toString()] = boards; + await _localDatabaseRepository.setUser(newUser); + } + } + + Future uploadPictos() async { + await _pictogramsService.uploadPictograms(pictograms, _i18n.currentLocale.toString(), userId: userID); + + if (userState.user!.type == UserType.user) { + //todo: emir can you check this + final newUser = userState.user!.patient; + newUser.pictos[_i18n.currentLocale.toString()] = pictograms; + newUser.groups[_i18n.currentLocale.toString()] = boards; + await _localDatabaseRepository.setUser(newUser); + } + } + + Future deleteBoard() async { + boards.removeAt(selectedBoardID); + await uploadGroups(); + } +} + +final viewBoardProvider = ChangeNotifierProvider((ref) { + final pictogramService = GetIt.I(); + final groupService = GetIt.I(); + final i18N = GetIt.I(); + final CreatePictoRepository createPictoServices = GetIt.I.get(); + final localDatabase = GetIt.I(); + final userState = ref.watch(userProvider); + return ViewBoardProvider(i18N, groupService, pictogramService, localDatabase, createPictoServices, userState); +}); diff --git a/lib/application/providers/whats_the_picto_provider.dart b/lib/application/providers/whats_the_picto_provider.dart new file mode 100644 index 00000000..972acd3c --- /dev/null +++ b/lib/application/providers/whats_the_picto_provider.dart @@ -0,0 +1,107 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:get_it/get_it.dart'; +import 'package:ottaa_project_flutter/application/common/extensions/translate_string.dart'; +import 'package:ottaa_project_flutter/application/providers/games_provider.dart'; +import 'package:ottaa_project_flutter/application/providers/tts_provider.dart'; +import 'package:ottaa_project_flutter/application/notifiers/patient_notifier.dart'; +import 'package:ottaa_project_flutter/application/providers/games_provider.dart'; +import 'package:ottaa_project_flutter/application/providers/tts_provider.dart'; +import 'package:ottaa_project_flutter/application/providers/user_provider.dart'; +import 'package:ottaa_project_flutter/core/repositories/chatgpt_repository.dart'; + +class WhatsThePictoProvider extends ChangeNotifier { + final GamesProvider _gamesProvider; + final TTSProvider _tts; + + List pictoShowWhatsThePict = [false, false, false, false]; + int selectedPicto = 0; + + ScrollController boardScrollController = ScrollController(); + bool showText = false; + + Future checkAnswerWhatThePicto({required int index}) async { + //todo: show the text that it is correct + selectedPicto = index; + pictoShowWhatsThePict[index] = !pictoShowWhatsThePict[index]; + showText = !showText; + notifyListeners(); + + if (_gamesProvider.correctPictoWTP == index) { + await _gamesProvider.playClickSounds(assetName: 'yay'); + } else { + await _gamesProvider.playClickSounds(assetName: 'ohoh'); + } + //todo: remove the text around + pictoShowWhatsThePict[index] = !pictoShowWhatsThePict[index]; + showText = !showText; + //todo: create the new question + if (_gamesProvider.correctPictoWTP == index) { + _gamesProvider.correctScore++; + if (_gamesProvider.correctScore == 10) { + _gamesProvider.difficultyLevel++; + } + if (_gamesProvider.correctScore == 20) { + _gamesProvider.difficultyLevel++; + } + _gamesProvider.streak++; + await _gamesProvider.createRandomForGameWTP(); + speakNameWhatsThePicto(); + } else { + _gamesProvider.incorrectScore++; + if (_gamesProvider.correctScore == 9) { + _gamesProvider.difficultyLevel--; + } + if (_gamesProvider.correctScore == 19) { + _gamesProvider.difficultyLevel--; + } + _gamesProvider.streak = 0; + } + _gamesProvider.clicksPlayer.stop(); + + // notifyListeners(); + } + + WhatsThePictoProvider(this._gamesProvider, this._tts); + + void speakNameWhatsThePicto() async { + await _tts.speak('game.speak_what'.trlf({'name': _gamesProvider.gamePictsWTP[_gamesProvider.correctPictoWTP].text})); + } + + void notify() { + notifyListeners(); + } + + void scrollUpBoards() { + int currentPosition = boardScrollController.position.pixels.toInt(); + + if (currentPosition == 0) return; + + boardScrollController.animateTo( + currentPosition - 96, + duration: const Duration(milliseconds: 500), + curve: Curves.easeOut, + ); + } + + void scrollDownBoards() { + int currentPosition = boardScrollController.position.pixels.toInt(); + + if (currentPosition >= boardScrollController.position.maxScrollExtent) return; + + boardScrollController.animateTo( + currentPosition + 96, + duration: const Duration(milliseconds: 500), + curve: Curves.easeOut, + ); + } +} + +final whatsThePictoProvider = ChangeNotifierProvider((ref) { + final userState = ref.watch(userProvider.notifier); + final patientState = ref.watch(patientNotifier.notifier); + final chatGPTRepository = GetIt.I(); + final gamesProvider = ref.watch(gameProvider); + final tts = ref.watch(ttsProvider); + return WhatsThePictoProvider(gamesProvider, tts); +}); diff --git a/lib/application/router/app_router.dart b/lib/application/router/app_router.dart index 9f4aa74f..3eed1fa2 100644 --- a/lib/application/router/app_router.dart +++ b/lib/application/router/app_router.dart @@ -1,51 +1,408 @@ +import 'package:flutter/foundation.dart'; +import 'package:flutter/widgets.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:get_it/get_it.dart'; import 'package:go_router/go_router.dart'; -import 'package:ottaa_project_flutter/application/router/app_routes.dart'; -import 'package:ottaa_project_flutter/core/repositories/auth_repository.dart'; +import 'package:ottaa_project_flutter/application/providers/auth_provider.dart'; +import 'package:ottaa_project_flutter/application/providers/user_provider.dart'; +import 'package:ottaa_project_flutter/core/enums/user_types.dart'; +import 'package:ottaa_project_flutter/presentation/screens/create_picto/choose_arsaac_photo_screen.dart'; +import 'package:ottaa_project_flutter/presentation/screens/create_picto/create_picto_page_viewer_screen.dart'; +import 'package:ottaa_project_flutter/core/repositories/repositories.dart'; +import 'package:ottaa_project_flutter/presentation/screens/customized_board/customize_picto_screen.dart'; +import 'package:ottaa_project_flutter/presentation/screens/customized_board/customized_board_tab_screen.dart'; +import 'package:ottaa_project_flutter/presentation/screens/customized_board/customized_main_tab_screen.dart'; +import 'package:ottaa_project_flutter/presentation/screens/customized_board/customized_wait_screen.dart'; +import 'package:ottaa_project_flutter/presentation/screens/edit/edit_picto_screen.dart'; import 'package:ottaa_project_flutter/presentation/screens/error/error_screen.dart'; +import 'package:ottaa_project_flutter/presentation/screens/games/chatgpt_game.dart'; +import 'package:ottaa_project_flutter/presentation/screens/games/game_screen.dart'; +import 'package:ottaa_project_flutter/presentation/screens/games/match_pictogram_screen.dart'; +import 'package:ottaa_project_flutter/presentation/screens/games/memory_game_screen.dart'; +import 'package:ottaa_project_flutter/presentation/screens/games/search_screen.dart'; +import 'package:ottaa_project_flutter/presentation/screens/games/select_group_screen.dart'; +import 'package:ottaa_project_flutter/presentation/screens/games/ui/board_widget.dart'; +import 'package:ottaa_project_flutter/presentation/screens/games/ui/select_board_and_picto.dart'; +import 'package:ottaa_project_flutter/presentation/screens/games/ui/show_created_story.dart'; +import 'package:ottaa_project_flutter/presentation/screens/games/whats_the_picto_screen.dart'; import 'package:ottaa_project_flutter/presentation/screens/home/home_screen.dart'; +import 'package:ottaa_project_flutter/presentation/screens/link/link_mail_screen.dart'; +import 'package:ottaa_project_flutter/presentation/screens/link/link_success_screen.dart'; +import 'package:ottaa_project_flutter/presentation/screens/link/link_token_screen.dart'; import 'package:ottaa_project_flutter/presentation/screens/login/login_screen.dart'; import 'package:ottaa_project_flutter/presentation/screens/onboarding/onboarding_screen.dart'; import 'package:ottaa_project_flutter/presentation/screens/profile/profile_chooser_screen.dart'; +import 'package:ottaa_project_flutter/presentation/screens/profile/profile_chooser_screen_selected_screen.dart'; +import 'package:ottaa_project_flutter/presentation/screens/profile/profile_faq_screen.dart'; +import 'package:ottaa_project_flutter/presentation/screens/profile/profile_help_screen.dart'; +import 'package:ottaa_project_flutter/presentation/screens/profile/profile_linked_account_screen.dart'; import 'package:ottaa_project_flutter/presentation/screens/profile/profile_main_screen.dart'; +import 'package:ottaa_project_flutter/presentation/screens/profile/profile_main_screen_user.dart'; +import 'package:ottaa_project_flutter/presentation/screens/profile/profile_ottaa_tips_screen.dart'; +import 'package:ottaa_project_flutter/presentation/screens/profile/profile_settings_edit_screen.dart'; import 'package:ottaa_project_flutter/presentation/screens/profile/profile_settings_screen.dart'; import 'package:ottaa_project_flutter/presentation/screens/profile/ui/profile_waiting_screen.dart'; -import 'package:ottaa_project_flutter/presentation/screens/report/report_screen.dart'; -import 'package:ottaa_project_flutter/presentation/screens/sentences/add_or_remove%20_favourites_screen.dart'; -import 'package:ottaa_project_flutter/presentation/screens/sentences/favourites_screen.dart'; -import 'package:ottaa_project_flutter/presentation/screens/sentences/sentences_screen.dart'; -import 'package:ottaa_project_flutter/presentation/screens/sentences/ui/search_sentence.dart'; import 'package:ottaa_project_flutter/presentation/screens/splash/splash_screen.dart'; import 'package:ottaa_project_flutter/presentation/screens/tutorial/tutorial_screen.dart'; +import 'package:ottaa_project_flutter/presentation/screens/user_settings/accessibility_screen.dart'; +import 'package:ottaa_project_flutter/presentation/screens/user_settings/language_screen.dart'; +import 'package:ottaa_project_flutter/presentation/screens/user_settings/main_setting_screen.dart'; +import 'package:ottaa_project_flutter/presentation/screens/user_settings/setting_screen.dart'; +import 'package:ottaa_project_flutter/presentation/screens/user_settings/voice_and_subtitle_screen.dart'; +import 'package:ottaa_project_flutter/presentation/screens/view_board/boards_pictogram_screen.dart'; +import 'package:ottaa_project_flutter/presentation/screens/view_board/create_board_screen.dart'; +import 'package:ottaa_project_flutter/presentation/screens/view_board/search_screen.dart'; +import 'package:ottaa_project_flutter/presentation/screens/view_board/show_pictos_screen.dart'; +import 'package:ottaa_project_flutter/presentation/screens/waiting/link_waiting_screen.dart'; +import 'package:ottaa_project_flutter/presentation/screens/waiting/login_waiting_screen.dart'; -final AppRouter appRouterSingleton = AppRouter(); +/*final appRouterNavigator = StateProvider>((ref) => GlobalKey()); + +final goRouterProvider = Provider((ref) { + final navigatorKey = ref.watch(appRouterNavigator); + final authState = ref.read(authProvider.select((value) => value.isUserLoggedIn)); + final userState = ref.watch(userProvider); + + return GoRouter( + navigatorKey: navigatorKey, + debugLogDiagnostics: kDebugMode, + errorBuilder: (context, state) => const ErrorScreen(), + initialLocation: "/", + restorationScopeId: "root", + // refreshListenable: userState, + routes: [ + GoRoute( + path: "/", + name: "ottaa", + builder: (context, state) => const SplashScreen(), + ), + GoRoute( + path: "/onboarding", + name: "onboarding", + builder: (context, state) { + int? pageIndex = state.extra as int?; + + return OnBoardingScreen(defaultIndex: pageIndex ?? 0); + }, + ), + GoRoute( + path: "/login", + name: "login", + builder: (context, state) => const LoginScreen(), + routes: [ + GoRoute( + path: "waiting", + name: "waiting", + builder: (context, state) => const LoginWaitingScreen(), + ), + ], + ), + GoRoute( + path: "/tutorial", + name: "tutorial", + builder: (context, state) => const TutorialScreen(), + ), + GoRoute( + path: "/home", + name: "home", + redirect: (_, __) async { + bool isLoggedIn = await authState(); + final user = userState.user; + if (!isLoggedIn) { + return "/login"; + } + + if (user == null) { + return '/'; + } + return null; + }, + builder: (context, state) { + final user = userState.user; + + if (user == null) return Container(); //WAiting for the fetching + + switch (user.type) { + case UserType.caregiver: + return const ProfileMainScreen(); + case UserType.user: + return const ProfileMainScreenUser(); + case UserType.none: + return const ProfileChooserScreen(); + } + }, + routes: [ + GoRoute( + path: "loading", + name: "loading", + builder: (context, state) => const ProfileWaitingScreen(), + ), + GoRoute( + path: "profile", + name: "profile", + builder: (context, state) => const ProfileSettingsScreen(), + routes: [ + GoRoute( + path: "role", + name: "role", + builder: (context, state) => const ProfileChooserScreenSelected(), + ), + GoRoute( + path: "accounts", + name: "accounts", + builder: (context, state) => const ProfileLinkedAccountScreen(), + ), + GoRoute( + path: "tips", + name: "tips", + builder: (context, state) => const ProfileOTTAATipsScreen(), + ), + GoRoute( + path: "edit", + name: "edit", + builder: (context, state) => const ProfileSettingsEditScreen(), + ), + GoRoute( + path: "help", + name: "help", + builder: (context, state) => const ProfileHelpScreen(), + routes: [ + GoRoute( + path: "faq", + name: "faq", + builder: (context, state) => const ProfileFAQScreen(), + ), + ], + ), + ], + ), + GoRoute( + path: "customize", + name: "customize", + builder: (context, state) => const CustomizedMainTabScreen(), + routes: [ + GoRoute( + path: "board", + name: "board", + builder: (context, state) => const CustomizedBoardTabScreen(), + ), + GoRoute( + path: "picto", + name: "picto", + builder: (context, state) => const CustomizePictoScreen(), + ), + GoRoute( + path: "wait", + name: "wait", + builder: (context, state) => const CustomizeWaitScreen(), + ), + ], + ), + GoRoute( + path: "talk", + name: "talk", + builder: (context, state) => const HomeScreen(), + ), + + GoRoute( + path: "account", + name: "account", + redirect: (_, __) { + if (userState.user?.type == UserType.caregiver) { + return null; + } + + return "/home"; + }, + builder: (context, state) => const SettingScreenUser(), + routes: [ + GoRoute( + path: "layout", + builder: (context, state) => const MainSettingScreen(), + ), + GoRoute( + path: "accessibility", + builder: (context, state) => const AccessibilityScreen(), + ), + GoRoute( + path: "tts", + builder: (context, state) => const VoiceAndSubtitleScreen(), + ), + GoRoute( + path: "language", + builder: (context, state) => const LanguageScreen(), + ), + ], + ), + //TODO*: Use ShellRoute instead of GoRoute + GoRoute( + path: "link", + redirect: (_, __) async { + final user = await databaseRepository.getUser(); + if (userState.user?.type == UserType.caregiver) { + return null; + } + + return "/home"; + }, + builder: (context, state) => const LinkMailScreen(), + routes: [ + GoRoute( + path: "token", + builder: (context, state) => const LinkTokenScreen(), + ), + GoRoute( + path: "wait", + builder: (context, state) => const LinkWaitingScreen(), + ), + GoRoute( + path: "success", + builder: (context, state) => const LinkSuccessScreen(), + ) + ], + ), + + GoRoute( + path: "settings", + name: "settings", + redirect: (context, state) async { + final user = await databaseRepository.getUser(); + + if (state.location.startsWith("/home/settings") && userState.user?.type == UserType.caregiver) { + return "/home"; + } + + return null; + }, + builder: (context, state) => const SettingScreenUser(), + routes: [ + GoRoute( + path: "layout", + builder: (context, state) => const MainSettingScreen(), + ), + GoRoute( + path: "accessibility", + builder: (context, state) => const AccessibilityScreen(), + ), + GoRoute( + path: "tts", + builder: (context, state) => const VoiceAndSubtitleScreen(), + ), + GoRoute( + path: "language", + builder: (context, state) => const LanguageScreen(), + ), + ], + ), + + GoRoute( + path: "games", + name: "games", + builder: (_, __) => const GameScreen(), + routes: [ + GoRoute( + path: 'groups', + builder: (_, __) => const SelectGroupScreen(), + routes: [ + GoRoute( + path: 'search', + builder: (_, __) => const SearchScreen(), + ), + ], + ), + GoRoute( + path: 'match', + builder: (_, __) => const MatchPictogramScreen(), + ), + GoRoute( + path: 'story', + builder: (_, __) => const ChatGptGame(), + routes: [ + GoRoute( + path: 'show', + builder: (_, __) => const ShowCreatedStory(), + ), + GoRoute( + path: 'selectBoard', + builder: (_, __) => const SelectBoardAndPicto(), + ), + ], + ), + GoRoute( + path: 'memory', + builder: (_, __) => const MemoryGameScreen(), + ), + GoRoute( + path: 'wtp', + builder: (_, __) => const WhatsThePictoScreen(), + ), + ], + ), + GoRoute( + path: 'viewBoardsAndPictos', + builder: (_, __) => const BoardsPictogramScreen(), + routes: [ + GoRoute( + path: 'search', + builder: (_, __) => const SearchDataScreen(), + ), + GoRoute( + path: 'editPicto', + builder: (_, __) => const EditPictoScreen(), + routes: [ + GoRoute( + path: 'arsaac', + builder: (_, __) => const ChooseArsaacPhotoScreen(), + ), + ], + ), + GoRoute( + path: 'createPicto', + builder: (_, __) => const CreatePictoPageViewerScreen(), + routes: [ + GoRoute( + path: 'arsaac', + builder: (_, __) => const ChooseArsaacPhotoScreen(), + ), + ], + ), + ], + ), + ], + ), + ], + ); +});*/ class AppRouter { - String get initialAppResolver { - final authService = GetIt.I.get(); - - if (!authService.isLogged) { - return AppRoutes.login; - } - //todo: talk with emir about it - if(authService.isLogged){ - return AppRoutes.home; - } - - return AppRoutes.splash; - } + final GlobalKey navigatorKey = GlobalKey(); + + LocalDatabaseRepository databaseRepository; + AuthRepository authRepository; + + static AppRouter instance = AppRouter._(GetIt.I(), GetIt.I()); - late final GoRouter router; + AppRouter._(this.databaseRepository, this.authRepository); - AppRouter() { - router = GoRouter( + GoRouter buildRouter() { + final user = databaseRepository.user; + + return GoRouter( + navigatorKey: navigatorKey, + debugLogDiagnostics: kDebugMode, + errorBuilder: (context, state) => const ErrorScreen(), + initialLocation: "/", + restorationScopeId: "root", + // refreshListenable: user != null ? databaseRepository.getListeneableFromName(user.type.name) : null, routes: [ GoRoute( - path: AppRoutes.splash, + path: "/", + name: "ottaa", builder: (context, state) => const SplashScreen(), ), GoRoute( - path: AppRoutes.onboarding, + path: "/onboarding", + name: "onboarding", builder: (context, state) { int? pageIndex = state.extra as int?; @@ -53,56 +410,299 @@ class AppRouter { }, ), GoRoute( - path: AppRoutes.login, + path: "/login", + name: "login", builder: (context, state) => const LoginScreen(), + routes: [ + GoRoute( + path: "waiting", + name: "waiting", + builder: (context, state) => const LoginWaitingScreen(), + ), + ], ), GoRoute( - path: AppRoutes.home, - builder: (context, state) => const HomeScreen(), - ), - GoRoute( - path: AppRoutes.tutorial, + path: "/tutorial", + name: "tutorial", builder: (context, state) => const TutorialScreen(), ), GoRoute( - path: AppRoutes.report, - builder: (context, state) => const ReportScreen(), - ), - GoRoute( - path: AppRoutes.sentences, - builder: (context, state) => const SentencesScreen(), - ), - GoRoute( - path: AppRoutes.favouriteSentences, - builder: (context, state) => const FavouriteScreen(), - ), - GoRoute( - path: AppRoutes.addOrRemoveFavouriteSentences, - builder: (context, state) => const AddOrRemoveFavouriteScreen(), - ), - GoRoute( - path: AppRoutes.searchSentences, - builder: (context, state) => const SearchSentenceScreen(), - ), - GoRoute( - path: AppRoutes.profileWaitingScreen, - builder: (context, state) => const ProfileWaitingScreen(), - ), - GoRoute( - path: AppRoutes.profileMainScreen, - builder: (context, state) => const ProfileMainScreen(), - ), - GoRoute( - path: AppRoutes.profileSettingsScreen, - builder: (context, state) => const ProfileSettingsScreen(), - ), - GoRoute( - path: AppRoutes.profileChooserScreen, - builder: (context, state) => const ProfileChooserScreen(), + path: "/home", + name: "home", + redirect: (_, __) async { + bool isLoggedIn = await authRepository.isLoggedIn(); + final user = await databaseRepository.getUser(); + if (!isLoggedIn) { + return "/login"; + } + + if (user == null) { + return '/'; + } + return null; + }, + builder: (context, state) { + final user = databaseRepository.user; + + if (user == null) return Container(); //WAiting for the fetching + + switch (user.type) { + case UserType.caregiver: + return const ProfileMainScreen(); + case UserType.user: + return const ProfileMainScreenUser(); + case UserType.none: + return const ProfileChooserScreen(); + } + }, + routes: [ + GoRoute( + path: "loading", + name: "loading", + builder: (context, state) => const ProfileWaitingScreen(), + ), + GoRoute( + path: "profile", + name: "profile", + builder: (context, state) => const ProfileSettingsScreen(), + routes: [ + GoRoute( + path: "role", + name: "role", + builder: (context, state) => const ProfileChooserScreenSelected(), + ), + GoRoute( + path: "accounts", + name: "accounts", + builder: (context, state) => const ProfileLinkedAccountScreen(), + ), + GoRoute( + path: "tips", + name: "tips", + builder: (context, state) => const ProfileOTTAATipsScreen(), + ), + GoRoute( + path: "edit", + name: "edit", + builder: (context, state) => const ProfileSettingsEditScreen(), + ), + GoRoute( + path: "help", + name: "help", + builder: (context, state) => const ProfileHelpScreen(), + routes: [ + GoRoute( + path: "faq", + name: "faq", + builder: (context, state) => const ProfileFAQScreen(), + ), + ], + ), + ], + ), + GoRoute( + path: "customize", + name: "customize", + builder: (context, state) => const CustomizedMainTabScreen(), + routes: [ + GoRoute( + path: "board", + name: "board", + builder: (context, state) => const CustomizedBoardTabScreen(), + ), + GoRoute( + path: "picto", + name: "picto", + builder: (context, state) => const CustomizePictoScreen(), + ), + GoRoute( + path: "wait", + name: "wait", + builder: (context, state) => const CustomizeWaitScreen(), + ), + ], + ), + GoRoute( + path: "talk", + name: "talk", + builder: (context, state) => const HomeScreen(), + ), + + GoRoute( + path: "account", + name: "account", + redirect: (_, __) { + if (user?.type == UserType.caregiver) { + return null; + } + + return "/home"; + }, + builder: (context, state) => const SettingScreenUser(), + routes: [ + GoRoute( + path: "layout", + builder: (context, state) => const MainSettingScreen(), + ), + GoRoute( + path: "accessibility", + builder: (context, state) => const AccessibilityScreen(), + ), + GoRoute( + path: "tts", + builder: (context, state) => const VoiceAndSubtitleScreen(), + ), + GoRoute( + path: "language", + builder: (context, state) => const LanguageScreen(), + ), + ], + ), + //TODO*: Use ShellRoute instead of GoRoute + GoRoute( + path: "link", + redirect: (_, __) async { + final user = await databaseRepository.getUser(); + if (user?.type == UserType.caregiver) { + return null; + } + + return "/home"; + }, + builder: (context, state) => const LinkMailScreen(), + routes: [ + GoRoute( + path: "token", + builder: (context, state) => const LinkTokenScreen(), + ), + GoRoute( + path: "wait", + builder: (context, state) => const LinkWaitingScreen(), + ), + GoRoute( + path: "success", + builder: (context, state) => const LinkSuccessScreen(), + ) + ], + ), + + GoRoute( + path: "settings", + name: "settings", + redirect: (context, state) async { + final user = await databaseRepository.getUser(); + + if (state.location.startsWith("/home/settings") && user?.type == UserType.caregiver) { + return "/home"; + } + + return null; + }, + builder: (context, state) => const SettingScreenUser(), + routes: [ + GoRoute( + path: "layout", + builder: (context, state) => const MainSettingScreen(), + ), + GoRoute( + path: "accessibility", + builder: (context, state) => const AccessibilityScreen(), + ), + GoRoute( + path: "tts", + builder: (context, state) => const VoiceAndSubtitleScreen(), + ), + GoRoute( + path: "language", + builder: (context, state) => const LanguageScreen(), + ), + ], + ), + + GoRoute( + path: "games", + name: "games", + builder: (_, __) => const GameScreen(), + routes: [ + GoRoute( + path: 'groups', + builder: (_, __) => const SelectGroupScreen(), + routes: [ + GoRoute( + path: 'search', + builder: (_, __) => const SearchScreen(), + ), + ], + ), + GoRoute( + path: 'match', + builder: (_, __) => const MatchPictogramScreen(), + ), + GoRoute( + path: 'story', + builder: (_, __) => const ChatGptGame(), + routes: [ + GoRoute( + path: 'show', + builder: (_, __) => const ShowCreatedStory(), + ), + GoRoute( + path: 'selectBoard', + builder: (_, __) => const SelectBoardAndPicto(), + ), + ], + ), + GoRoute( + path: 'memory', + builder: (_, __) => const MemoryGameScreen(), + ), + GoRoute( + path: 'wtp', + builder: (_, __) => const WhatsThePictoScreen(), + ), + ], + ), + GoRoute( + path: 'viewBoardsAndPictos', + builder: (_, __) => const BoardsPictogramScreen(), + routes: [ + GoRoute( + path: 'search', + builder: (_, __) => const SearchDataScreen(), + ), + GoRoute( + path: 'createBoard', + builder: (_, __) => const CreateBoardScreen(), + ), + GoRoute( + path: 'showPictos', + builder: (_, __) => const ShowPictosScreen(), + ), + GoRoute( + path: 'editPicto', + builder: (_, __) => const EditPictoScreen(), + routes: [ + GoRoute( + path: 'arsaac', + builder: (_, __) => const ChooseArsaacPhotoScreen(), + ), + ], + ), + GoRoute( + path: 'createPicto', + builder: (_, __) => const CreatePictoPageViewerScreen(), + routes: [ + GoRoute( + path: 'arsaac', + builder: (_, __) => const ChooseArsaacPhotoScreen(), + ), + ], + ), + ], + ), + ], ), ], - errorBuilder: (context, state) => const ErrorScreen(), - initialLocation: initialAppResolver, ); } } diff --git a/lib/application/router/app_routes.dart b/lib/application/router/app_routes.dart index 3b9f0efb..724b32c5 100644 --- a/lib/application/router/app_routes.dart +++ b/lib/application/router/app_routes.dart @@ -1,19 +1,74 @@ class AppRoutes { - static const splash = "/splash"; + /// + /// General Routes + /// + + static const splash = "/"; static const login = "/login"; + static const loginWait = "/login/waiting"; static const home = "/home"; - static const sentences = "/sentences"; - static const settings = "/settings"; - static const settingslang = "/settings_lang"; - static const settingsvoice = "/settings_voice"; + static const onboarding = "/onboarding"; - static const tutorial = "/tutorial"; - static const report = "/report"; - static const profileChooserScreen = "/profile_chooser_screen"; - static const profileMainScreen = "/profile_main_screen"; - static const profileSettingsScreen = "/profile_settings_screen"; - static const profileWaitingScreen = "/profile_waiting_screen"; - static const favouriteSentences = "/favourite_sentences"; - static const addOrRemoveFavouriteSentences = "/add_or_remove_favourite_sentences"; - static const searchSentences = "/search_sentences"; + + /// + /// User General Routes + /// + + static const userWait = "/home/loading"; + static const userProfile = "/home/profile"; + static const userProfileRole = "/home/profile/role"; + static const userProfileAccounts = "/home/profile/accounts"; + static const userProfileTips = "/home/profile/tips"; + static const userProfileEdit = "/home/profile/edit"; + static const userProfileHelp = "/home/profile/help"; + static const userProfileHelpFaq = "/home/profile/help/faq"; + static const userCustomize = "/home/customize"; + static const userCustomizeBoard = "/home/customize/board"; + static const userCustomizePicto = "/home/customize/picto"; + static const userCustomizeWait = "/home/customize/wait"; + static const userTalk = "/home/talk"; + + /// + /// User Caregiver Routes + /// + static const caregiverAccount = "/home/account"; + static const caregiverAccountLayout = "/home/account/layout"; + static const caregiverAccountAccessibility = "/home/account/accessibility"; + static const caregiverAccountTTS = "/home/account/tts"; + static const caregiverAccountLanguage = "/home/account/language"; + static const caregiverLink = "/home/link"; + static const caregiverLinkToken = "/home/link/token"; + static const caregiverLinkWait = "/home/link/wait"; + static const caregiverLinkSuccess = "/home/link/success"; + + /// + /// User Patient routes + /// + static const patientSettings = "/home/settings"; + static const patientSettingsLayout = "/home/settings/layout"; + static const patientSettingsAccessibility = "/home/settings/accessibility"; + static const patientSettingsTTS = "/home/settings/tts"; + static const patientSettingsLanguage = "/home/settings/language"; + + static const patientGame = "/home/games"; + static const patientGameGroupSelection = "/home/games/groups"; + static const patientGameSearchGroup = "/home/games/groups/search"; + static const patientMatchPictogramGame = "/home/games/match"; + static const patientMemoryGame = "/home/games/memory"; + static const patientWhatsThePictoGame = "/home/games/wtp"; + static const patientStoryGame = "/home/games/story"; + static const patientShowStory = "/home/games/story/show"; + static const selectBoardPicto = "/home/games/story/selectBoard"; + static const patientHistorySelectPicto = "/home/games/history/pictos"; + static const patientHistoryReview = "/home/games/history/review"; + + static const patientCreatePicto = "/home/viewBoardsAndPictos/createPicto"; + static const patientViewBoardsAndPictos = "/home/viewBoardsAndPictos"; + + static const patientCreatePictoarsaac = "/home/viewBoardsAndPictos/createPicto/arsaac"; + static const patientEditPicto = "/home/viewBoardsAndPictos/editPicto"; + static const patientSearch = "/home/viewBoardsAndPictos/search"; + static const patientShowPictos = "/home/viewBoardsAndPictos/showPictos"; + static const patientCreateBoard = "/home/viewBoardsAndPictos/createBoard"; + static const patientEditPictoarsaac = "/home/viewBoardsAndPictos/editPicto/arsaac"; } diff --git a/lib/application/service/about_service.dart b/lib/application/service/about_service.dart index ddee3f16..51428ccf 100644 --- a/lib/application/service/about_service.dart +++ b/lib/application/service/about_service.dart @@ -1,24 +1,32 @@ -import 'dart:io'; - import 'package:device_info_plus/device_info_plus.dart'; import 'package:either_dart/either.dart'; import 'package:flutter/foundation.dart'; +import 'package:injectable/injectable.dart'; +import 'package:ottaa_project_flutter/core/enums/user_payment.dart'; import 'package:ottaa_project_flutter/core/enums/user_types.dart'; -import 'package:ottaa_project_flutter/core/models/user_model.dart'; +import 'package:ottaa_project_flutter/core/abstracts/user_model.dart'; +import 'package:ottaa_project_flutter/core/models/assets_image.dart'; +import 'package:ottaa_project_flutter/core/models/base_user_model.dart'; +import 'package:ottaa_project_flutter/core/models/caregiver_user_model.dart'; +import 'package:ottaa_project_flutter/core/models/patient_user_model.dart'; import 'dart:async'; -import 'package:ottaa_project_flutter/core/repositories/about_repository.dart'; -import 'package:ottaa_project_flutter/core/repositories/auth_repository.dart'; -import 'package:ottaa_project_flutter/core/repositories/server_repository.dart'; +import 'package:ottaa_project_flutter/core/repositories/repositories.dart'; import 'package:package_info_plus/package_info_plus.dart'; +import 'package:universal_io/io.dart'; import 'package:url_launcher/url_launcher.dart'; +@Singleton( + as: AboutRepository, +) class AboutService extends AboutRepository { final ServerRepository _serverRepository; + final LocalDatabaseRepository _databaseRepository; + final AuthRepository _auth; - AboutService(this._auth, this._serverRepository); + AboutService(this._auth, this._serverRepository, this._databaseRepository); @override Future getAppVersion() async { @@ -62,22 +70,23 @@ class AboutService extends AboutRepository { if (result.isRight) { final user = result.right; return user.email; + // return user.settings.data.; } return result.left; } @override - Future getUserType() async { + Future getUserType() async { final result = await _auth.getCurrentUser(); - if (result.isLeft) { - return UserType.free; + if (result.isLeft || result.right.type == UserType.caregiver) { + return UserPayment.free; } - final user = result.right; - - return _serverRepository.getUserType(user.id); + return (result.right as PatientUserModel).patientSettings.payment.payment + ? UserPayment.premium + : UserPayment.free; } @override @@ -100,7 +109,7 @@ class AboutService extends AboutRepository { if (await canLaunchUrl(params)) { await launchUrl(params); } else { - print('Could not launch ${params.toString()}'); + debugPrint('Could not launch ${params.toString()}'); } } @@ -117,18 +126,22 @@ class AboutService extends AboutRepository { } @override - Future uploadProfilePicture(String photo) async { + Future uploadProfilePicture(AssetsImage image) async { final userResult = await _auth.getCurrentUser(); if (userResult.isLeft) return; final UserModel user = userResult.right; - await _serverRepository.uploadUserPicture(user.id, photo, user.photoUrl); + await _serverRepository.uploadUserPicture( + user.id, + user.settings.data.avatar + .copyWith(asset: image.asset, network: image.network)); } @override Future> getUserInformation() async { final userResult = await _auth.getCurrentUser(); + if (userResult.isLeft) return Left(userResult.left); final UserModel user = userResult.right; @@ -137,9 +150,32 @@ class AboutService extends AboutRepository { if (userData.isLeft) return const Left("no_user_found"); - final UserModel newUser = UserModel.fromRemote(userData.right); + UserModel model; + + switch (userData.right["type"]) { + case "caregiver": + model = CaregiverUserModel.fromMap({ + "email": user.email, + ...userData.right, + }); + break; + case "user": + model = PatientUserModel.fromMap({ + "email": user.email, + ...userData.right, + }); + break; + case "none": + default: + model = BaseUserModel.fromMap({ + "email": user.email, + ...userData.right, + }); + } + + await _databaseRepository.setUser(model); - return Right(newUser); + return Right(model); } @override @@ -149,7 +185,7 @@ class AboutService extends AboutRepository { final UserModel user = userResult.right; - await _serverRepository.uploadUserInformation(user.id, user.toRemote()); + await _serverRepository.uploadUserInformation(user.id, user.toMap()); } @override @@ -159,7 +195,7 @@ class AboutService extends AboutRepository { return false; } - return result.right.avatar != null || result.right.photoUrl == "0"; + return result.right.settings.data.avatar.network != null; } @override @@ -169,7 +205,24 @@ class AboutService extends AboutRepository { if (result.isLeft) { return false; } + //TODO: Check for first time! + return result.right.settings.data.birthDate == DateTime(0); + } - return result.right.birthdate == 0; + @override + Future updateUserType( + {required String id, required UserType userType}) async { + await _serverRepository.updateUserType(id: id, userType: userType); + } + + @override + Future updateUserLastConnectionTime({ + required String userId, + required int time, + }) async { + await _serverRepository.updateUserLastConnectionTime( + userId: userId, + time: time, + ); } } diff --git a/lib/application/service/auth_service.dart b/lib/application/service/auth_service.dart index 5bf7b738..eb23fe90 100644 --- a/lib/application/service/auth_service.dart +++ b/lib/application/service/auth_service.dart @@ -1,28 +1,65 @@ +import 'dart:io'; + import 'package:either_dart/either.dart'; import 'package:firebase_auth/firebase_auth.dart'; -import 'package:flutter_facebook_auth/flutter_facebook_auth.dart'; +import 'package:firebase_messaging/firebase_messaging.dart'; +import 'package:flutter/foundation.dart'; import 'package:google_sign_in/google_sign_in.dart'; +import 'package:injectable/injectable.dart'; +import 'package:ottaa_project_flutter/application/common/i18n.dart'; import 'package:ottaa_project_flutter/core/enums/sign_in_types.dart'; -import 'package:ottaa_project_flutter/core/models/user_model.dart'; +import 'package:ottaa_project_flutter/core/abstracts/user_model.dart'; import 'dart:async'; -import 'package:http/http.dart' as http; +import 'package:ottaa_project_flutter/core/models/assets_image.dart'; +import 'package:ottaa_project_flutter/core/models/base_settings_model.dart'; +import 'package:ottaa_project_flutter/core/models/base_user_model.dart'; +import 'package:ottaa_project_flutter/core/models/caregiver_user_model.dart'; +import 'package:ottaa_project_flutter/core/models/devices_token.dart'; +import 'package:ottaa_project_flutter/core/models/language_setting.dart'; +import 'package:ottaa_project_flutter/core/models/patient_user_model.dart'; +import 'package:ottaa_project_flutter/core/models/user_data_model.dart'; import 'package:ottaa_project_flutter/core/repositories/auth_repository.dart'; import 'package:ottaa_project_flutter/core/repositories/local_database_repository.dart'; import 'package:ottaa_project_flutter/core/repositories/server_repository.dart'; +import 'package:sign_in_with_apple/sign_in_with_apple.dart'; +@Singleton(as: AuthRepository) class AuthService extends AuthRepository { - final FirebaseAuth _authProvider = FirebaseAuth.instance; - final GoogleSignIn _googleSignIn = GoogleSignIn(); - final FacebookAuth _facebookAuth = FacebookAuth.instance; - + late final FirebaseAuth _authProvider; + late final GoogleSignIn _googleSignIn; + late final FirebaseMessaging _firebaseMessaging; + String lastName = ''; + String name = ''; final LocalDatabaseRepository _databaseRepository; final ServerRepository _serverRepository; + late AuthorizationCredentialAppleID result; + final I18N _i18n; + bool isSignInApple = false; + + AuthService( + this._databaseRepository, + this._serverRepository, + this._i18n, { + FirebaseAuth? firebaseAuth, + GoogleSignIn? googleSignIn, + FirebaseMessaging? firebaseMessaging, + }) { + _authProvider = firebaseAuth ?? FirebaseAuth.instance; + _googleSignIn = googleSignIn ?? + GoogleSignIn(scopes: [ + 'email', + ]); + _firebaseMessaging = firebaseMessaging ?? FirebaseMessaging.instance; + } - AuthService(this._databaseRepository, this._serverRepository); + @factoryMethod + factory AuthService.from(LocalDatabaseRepository databaseRepository, ServerRepository serverRepository, I18N i18n) { + return AuthService(databaseRepository, serverRepository, i18n); + } @override Future> getCurrentUser() async { - UserModel? userDb = _databaseRepository.user; + UserModel? userDb = await _databaseRepository.getUser(); if (userDb == null) { return const Left("No user logged"); } @@ -30,84 +67,135 @@ class AuthService extends AuthRepository { return Right(userDb); } - @override - Future runToGetDataFromOtherPlatform({ - required String email, - required String id, - }) async { - final uri = Uri.parse( - 'https://us-central1-ottaaproject-flutter.cloudfunctions.net/getOldUserDataHttp?email=$email&uid=$id', - ); - final res = await http.get( - uri, - ); - return res.body; - } - @override Future isLoggedIn() async { + final currentAuthUser = _authProvider.currentUser; + + UserModel? userModel = _databaseRepository.user; + + if (currentAuthUser == null && userModel == null) { + return false; + } + + if (currentAuthUser != null && userModel == null) { + userModel = await buildUserModel(currentAuthUser); + if (userModel != null) { + await _databaseRepository.setUser(userModel); + + return true; + } + } + return _databaseRepository.user != null; } @override Future logout() async { - await _authProvider.signOut(); - await _googleSignIn.signOut(); + if (_authProvider.currentUser != null) { + await _authProvider.signOut(); + } // await _facebookAuth.logOut(); //TODO!: Comment this line due a [MissingPluginException] error await _databaseRepository.deleteUser(); } + Future buildUserModel(user) async { + EitherMap userInfo = await _serverRepository.getUserInformation(user.uid); + UserModel? userModel; + if (userInfo.isLeft) { + return null; + } + switch (userInfo.right["type"]) { + case "caregiver": + userModel = CaregiverUserModel.fromMap({ + ...userInfo.right, + "email": user.email ?? user.providerData[0].email, + }); + break; + case "user": + userModel = PatientUserModel.fromMap({ + ...userInfo.right, + "email": user.email ?? user.providerData[0].email, + }); + break; + case "none": + default: + userModel = BaseUserModel.fromMap({ + ...userInfo.right, + "email": user.email ?? user.providerData[0].email, + }); + break; + } + + userModel.currentToken = DeviceToken(deviceToken: await getDeviceId(), lastUsage: DateTime.now()); + if (userModel.currentToken != null) { + await _serverRepository.updateDevicesId( + userId: userModel.id, + deviceToken: userModel.currentToken!, + ); + } + + return userModel; + } + @override - Future> signIn(SignInType type) async { + Future> signIn(SignInType type, [String? email, String? password]) async { Either result; + final appleData = await _databaseRepository.getAppleUserData(); switch (type) { case SignInType.google: result = await _signInWithGoogle(); break; - case SignInType.facebook: - result = await _signInWithFacebook(); - break; case SignInType.apple: - case SignInType.email: + result = await _signInWithApple(); + break; default: - return const Left( - "error_no_implement_auth_method"); //TODO: Implement translate method. + return const Left("error_no_implement_auth_method"); //TODO: Implement translate method. } if (result.isRight) { - final User user = result.right; - - ///sometimes the email does not come with the user.email, it is given in the providedData, - - EitherMap userInfo = await _serverRepository.getUserInformation(user.uid); - UserModel? userModel; - if (userInfo.isLeft) { - await signUp(); - - final nameRetriever = - user.displayName ?? user.providerData[0].displayName; - final emailRetriever = user.email ?? user.providerData[0].email; - - userModel = UserModel( - id: user.uid, - name: nameRetriever ?? "", - email: emailRetriever ?? "", - photoUrl: user.photoURL ?? "", - isFirstTime: true, - language: "es", - ); - } else { - userModel = UserModel.fromRemote(userInfo.right); - } + try { + final User user = result.right; + + UserModel? userModel = await buildUserModel(user); + + if (userModel == null) { + await signUp(); + + final nameRetriever = user.displayName ?? user.providerData[0].displayName; + final emailRetriever = user.email ?? user.providerData[0].email; + + userModel = BaseUserModel( + id: user.uid, + settings: BaseSettingsModel( + data: UserData( + avatar: AssetsImage(asset: "671", network: user.photoURL), + birthDate: DateTime.fromMillisecondsSinceEpoch(0), + genderPref: "n/a", + lastConnection: DateTime.now(), + lastName: (Platform.isIOS && isSignInApple) ? appleData['lastname']! : lastName, + name: (Platform.isIOS && isSignInApple) ? appleData['name']! : nameRetriever!, + ), + language: LanguageSetting.empty( + language: _i18n.currentLocale.toString(), + ), + ), + email: emailRetriever ?? "", + ); + } - return Right(userModel); + return Right(userModel); + } on Exception catch (e) { + await _authProvider.signOut(); + return Left("Error interno: ${e.toString()}"); + } } return Left(result.left); } Future> _signInWithGoogle() async { + isSignInApple = false; try { final GoogleSignInAccount? googleUser = await _googleSignIn.signIn(); @@ -115,22 +203,22 @@ class AuthService extends AuthRepository { return const Left("error_google_sign_in_cancelled"); } - final GoogleSignInAuthentication googleAuth = - await googleUser.authentication; + final GoogleSignInAuthentication googleAuth = await googleUser.authentication; final AuthCredential credential = GoogleAuthProvider.credential( accessToken: googleAuth.accessToken, idToken: googleAuth.idToken, ); - final UserCredential userCredential = - await _authProvider.signInWithCredential(credential); + final UserCredential userCredential = await _authProvider.signInWithCredential(credential); if (userCredential.user == null) { return const Left("error_google_sign_in_cancelled"); } final User user = userCredential.user!; + // lastName = userCredential.additionalUserInfo?.profile?['family_name'] ?? ""; + // name = userCredential.additionalUserInfo?.profile?['given_name'] ?? ""; return Right(user); } catch (e) { @@ -138,18 +226,16 @@ class AuthService extends AuthRepository { } } - Future> _signInWithFacebook() async { + /* Future> _signInWithFacebook() async { try { final LoginResult result = await _facebookAuth.login(); if (result.status == LoginStatus.success) { final AccessToken accessToken = result.accessToken!; - final AuthCredential credential = - FacebookAuthProvider.credential(accessToken.token); + final AuthCredential credential = FacebookAuthProvider.credential(accessToken.token); - final UserCredential userCredential = - await _authProvider.signInWithCredential(credential); + final UserCredential userCredential = await _authProvider.signInWithCredential(credential); if (userCredential.user == null) { return const Left("error_facebook_sign_in_cancelled"); @@ -163,6 +249,40 @@ class AuthService extends AuthRepository { } catch (e) { return Left(e.toString()); } + }*/ + Future> _signInWithApple() async { + isSignInApple = true; + try { + result = await SignInWithApple.getAppleIDCredential( + scopes: [ + AppleIDAuthorizationScopes.email, + AppleIDAuthorizationScopes.fullName, + ], + ); + if (result.givenName != null) { + _databaseRepository.setAppleUserDara(data: { + 'name': result.givenName!, + 'lastname': result.familyName ?? '', + 'email': result.email!, + }); + } + final credential = OAuthProvider('apple.com').credential( + idToken: result.identityToken, + accessToken: result.authorizationCode, + ); + + final UserCredential userCredential = await _authProvider.signInWithCredential(credential); + + if (userCredential.user == null) { + return const Left("error_apple_sign_in_cancelled"); + } + + final User user = userCredential.user!; + + return Right(user); + } catch (e) { + return Left(e.toString()); + } } @override @@ -171,26 +291,47 @@ class AuthService extends AuthRepository { @override Future> signUp() async { final user = _authProvider.currentUser; + final appleData = await _databaseRepository.getAppleUserData(); if (user == null) { return const Left("error_user_not_logged"); } final nameRetriever = user.displayName ?? user.providerData[0].displayName; - final emailRetriever = user.email ?? user.providerData[0].email; + final String emailRetriever = user.email ?? user.providerData[0].email!; - final userModel = UserModel( + final userModel = BaseUserModel( id: user.uid, - name: nameRetriever ?? "", - email: emailRetriever ?? "", - photoUrl: user.photoURL ?? "", - isFirstTime: true, - language: "es", + settings: BaseSettingsModel( + data: UserData( + avatar: AssetsImage(asset: "671", network: user.photoURL), + birthDate: DateTime.fromMillisecondsSinceEpoch(0), + genderPref: "n/a", + lastConnection: DateTime.now(), + lastName: (Platform.isIOS && isSignInApple) ? appleData['lastname']! : '', + name: (Platform.isIOS && isSignInApple) ? appleData['name']! : nameRetriever!, + ), + language: LanguageSetting.empty( + language: _i18n.currentLocale.toString(), + ), + ), + email: emailRetriever, ); - - await _serverRepository.uploadUserInformation( - user.uid, userModel.toRemote()); + await _serverRepository.uploadUserInformation(user.uid, userModel.toMap()); return const Right(true); } + + @override + Future getDeviceId() async { + return await _firebaseMessaging.getToken( + vapidKey: kIsWeb ? "BM1DJoICvUa0DM7SYOJE4aDc_Odtlbq5QKXRgB5XoeHEY7EIIP-39WnCqr-QNmNSDoRJEbNyq6LV7bUE6FoGWVE" : null, + ) ?? + ""; + } + + @override + Future deleteAccount({required String userId}) async { + return await _serverRepository.deleteTheAccount(userId: userId); + } } diff --git a/lib/application/service/chatgpt_service.dart b/lib/application/service/chatgpt_service.dart new file mode 100644 index 00000000..baca7270 --- /dev/null +++ b/lib/application/service/chatgpt_service.dart @@ -0,0 +1,67 @@ +import 'package:either_dart/either.dart'; +import 'package:injectable/injectable.dart'; +import 'package:ottaa_project_flutter/application/common/extensions/translate_string.dart'; +import 'package:ottaa_project_flutter/core/repositories/repositories.dart'; + +@Singleton(as: ChatGPTRepository) +class ChatGPTService extends ChatGPTRepository { + final ServerRepository serverService; + + final RemoteConfigRepository remoteConfigService; + + const ChatGPTService(this.serverService, this.remoteConfigService); + + @override + Future> getCompletion({ + required int age, + required String gender, + required String pictograms, + required String language, + int maxTokens = 500, + }) async { + String? remotePrompt = await remoteConfigService.getString("ChatGPTPromt"); + String type; + + if (age <= 13) { + type = "niño"; + } else if (age > 13 && age < 18) { + type = "adolescente"; + } else { + type = "adulto"; + } + + if (remotePrompt != null && remotePrompt.isNotEmpty) { + remotePrompt = remotePrompt.replaceAll("{AGE}", type).replaceAll("{SEX}", gender).replaceAll("{PHRASE}", pictograms).replaceAll("{LANG}", language); + } + String prompt = ''; + if (remotePrompt != null && remotePrompt.isNotEmpty) { + prompt = remotePrompt; + } else { + prompt = "chatgpt.prompt".trlf({"age": type, "gender": gender, "pictograms": pictograms, "language": language}); + } + + final response = await serverService.generatePhraseGPT( + prompt: prompt, + maxTokens: maxTokens, + ); + + return response.fold( + (l) => Left(l), + (r) => Right(r), + ); + } + + @override + Future> getGPTStory({ + required String prompt, + int maxTokens = 1000, + }) async { + String? remotePrompt = await remoteConfigService.getString("ChatGPTPromt"); + + final response = await serverService.generatePhraseGPT(prompt: prompt, maxTokens: maxTokens, temperature: 0.7); + return response.fold( + (l) => Left(l), + (r) => Right(r), + ); + } +} diff --git a/lib/application/service/create_picto_services.dart b/lib/application/service/create_picto_services.dart new file mode 100644 index 00000000..3468ee0d --- /dev/null +++ b/lib/application/service/create_picto_services.dart @@ -0,0 +1,111 @@ +import 'package:either_dart/src/either.dart'; +import 'package:injectable/injectable.dart'; +import 'package:ottaa_project_flutter/core/models/arsaac_data_model.dart'; +import 'package:ottaa_project_flutter/core/models/group_model.dart'; +import 'package:ottaa_project_flutter/core/models/picto_model.dart'; +import 'package:ottaa_project_flutter/core/repositories/create_picto_repository.dart'; +import 'package:ottaa_project_flutter/core/repositories/repositories.dart'; + +@Singleton(as: CreatePictoRepository) +class CreatePictoServices implements CreatePictoRepository { + final ServerRepository _serverRepository; + + CreatePictoServices(this._serverRepository); + + @override + Future> fetchUserGroups({required String languageCode, required String userId}) async { + final res = await _serverRepository.fetchUserGroups(languageCode: languageCode, userId: userId); + if (res.isRight) { + final json = res.right; + final List groups = json.keys.map((e) { + final data = Map.from(json[e] as Map); + return Group.fromMap({ + "id": e, + ...data, + }); + }).toList(); + + return groups; + } else { + return []; + } + } + + @override + Future>> fetchPhotosFromGlobalSymbols({required String searchText, required String languageCode}) async { + return await _serverRepository.fetchPhotosFromGlobalSymbols(searchText: searchText, languageCode: languageCode); + } + + @override + Future> fetchUserPictos({required String languageCode, required String userId}) async { + final res = await _serverRepository.fetchUserPictos(languageCode: languageCode, userId: userId); + if (res.isRight) { + final json = res.right; + final List pictos = json.keys.map((e) { + final data = Map.from(json[e] as Map); + return Picto.fromMap({ + "id": e, + ...data, + }); + }).toList(); + + return pictos; + } else { + return []; + } + } + + @override + Future> fetchDefaultGroups({required String languageCode}) async { + final res = await _serverRepository.getDefaultGroups(languageCode); + if (res.isRight) { + final json = res.right; + final List groups = json.keys.map((e) { + final data = Map.from(json[e] as Map); + return Group.fromMap({ + "id": e, + ...data, + }); + }).toList(); + + return groups; + } else { + return []; + } + } + + @override + Future> fetchDefaultPictos({required String languageCode}) async { + final res = await _serverRepository.getDefaultPictos(languageCode); + + if (res.isRight) { + final json = res.right; + final List pictos = json.keys.map((e) { + final data = Map.from(json[e] as Map); + return Picto.fromMap({ + "id": e, + ...data, + }); + }).toList(); + + return pictos; + } else { + return []; + } + } + + @override + Future uploadOtherImages({ + required String imagePath, + required String directoryPath, + required String name, + required String userId, + }) async { + return await _serverRepository.uploadOtherImages( + imagePath: imagePath, + directoryPath: directoryPath, + name: name, + userId: userId, + ); + } +} diff --git a/lib/application/service/customise_service.dart b/lib/application/service/customise_service.dart new file mode 100644 index 00000000..3f0468e7 --- /dev/null +++ b/lib/application/service/customise_service.dart @@ -0,0 +1,123 @@ +import 'package:injectable/injectable.dart'; +import 'package:ottaa_project_flutter/core/models/group_model.dart'; +import 'package:ottaa_project_flutter/core/models/picto_model.dart'; +import 'package:ottaa_project_flutter/core/models/shortcuts_model.dart'; +import 'package:ottaa_project_flutter/core/repositories/customise_repository.dart'; +import 'package:ottaa_project_flutter/core/repositories/server_repository.dart'; + +@Singleton(as: CustomiseRepository) +class CustomiseService implements CustomiseRepository { + final ServerRepository _serverRepository; + + CustomiseService(this._serverRepository); + + @override + Future setShortcutsForUser({required ShortcutsModel shortcuts, required String userId}) async => await _serverRepository.setShortcutsForUser(shortcuts: shortcuts, userId: userId); + + @override + Future> fetchDefaultGroups({required String languageCode}) async { + final res = await _serverRepository.getDefaultGroups(languageCode); + if (res.isRight) { + final json = res.right; + final List groups = json.keys.map((e) { + final data = Map.from(json[e] as Map); + return Group.fromMap({ + "id": e, + ...data, + }); + }).toList(); + + return groups; + } else { + return []; + } + } + + @override + Future> fetchDefaultPictos({required String languageCode}) async { + final res = await _serverRepository.getDefaultPictos(languageCode); + + if (res.isRight) { + final json = res.right; + final List pictos = json.keys.map((e) { + final data = Map.from(json[e] as Map); + return Picto.fromMap({ + "id": e, + ...data, + }); + }).toList(); + + return pictos; + } else { + return []; + } + } + + @override + Future fetchShortcutsForUser({required String userId}) async { + final res = await _serverRepository.fetchShortcutsForUser(userId: userId); + if (res.isRight) { + return ShortcutsModel.fromMap(res.right); + } else { + return ShortcutsModel( + enable: false, + favs: false, + history: false, + camera: false, + share: false, + games: false, + no: false, + yes: false, + ); + } + } + + @override + Future> fetchUserGroups({required String languageCode, required String userId}) async { + final res = await _serverRepository.fetchUserGroups(languageCode: languageCode, userId: userId); + if (res.isRight) { + final json = res.right; + final List groups = json.keys.map((e) { + final data = Map.from(json[e] as Map); + return Group.fromMap({ + "id": e, + ...data, + }); + }).toList(); + + return groups; + } else { + return []; + } + } + + @override + Future valuesExistOrNot({required String languageCode, required String userId}) async { + final res = await _serverRepository.fetchUserGroups(languageCode: languageCode, userId: userId); + if (res.isRight) { + return true; + } else { + return false; + } + } + + @override + Future> fetchUserPictos({required String languageCode, required String userId}) async { + final res = await _serverRepository.fetchUserPictos(languageCode: languageCode, userId: userId); + + if (res.isRight) { + final json = res.right; + final List pictos = json.keys.map((e) { + final data = Map.from(json[e] as Map); + return Picto.fromMap({ + "id": e, + ...data, + }); + }).toList(); + + return pictos; + } else { + return []; + } + } +} diff --git a/lib/application/service/groups_service.dart b/lib/application/service/groups_service.dart index 2ca9ca98..b3b1a235 100644 --- a/lib/application/service/groups_service.dart +++ b/lib/application/service/groups_service.dart @@ -1,14 +1,16 @@ import 'dart:convert'; import 'package:flutter/foundation.dart'; -import 'package:ottaa_project_flutter/core/models/groups_model.dart'; +import 'package:injectable/injectable.dart'; +import 'package:ottaa_project_flutter/core/models/group_model.dart'; import 'package:ottaa_project_flutter/core/abstracts/basic_search.dart'; -import 'package:ottaa_project_flutter/core/models/user_model.dart'; +import 'package:ottaa_project_flutter/core/abstracts/user_model.dart'; import 'package:ottaa_project_flutter/core/repositories/auth_repository.dart'; import 'package:ottaa_project_flutter/core/repositories/groups_repository.dart'; import 'package:ottaa_project_flutter/core/repositories/remote_storage_repository.dart'; import 'package:ottaa_project_flutter/core/repositories/server_repository.dart'; +@Singleton(as: GroupsRepository) class GroupsService extends GroupsRepository { final AuthRepository _authService; final RemoteStorageRepository _remoteStorageService; @@ -17,7 +19,7 @@ class GroupsService extends GroupsRepository { GroupsService(this._authService, this._remoteStorageService, this._serverRepository); @override - Future> getAllGroups() async { + Future> getAllGroups({bool defaultGroups = false}) async { await Future.delayed( const Duration(seconds: kIsWeb ? 2 : 1), ); @@ -25,62 +27,50 @@ class GroupsService extends GroupsRepository { final result = await _authService.getCurrentUser(); if (result.isLeft) return []; - final String data = await _remoteStorageService.readRemoteFile(path: "Grupos", fileName: 'assets/grupos.json'); + final String data = await _remoteStorageService.readRemoteFile( + path: "groups", + fileName: 'assets/grupos.json', + ); final List json = jsonDecode(data); - final List groups = json.map((e) => Groups.fromJson(e)).toList(); + final List groups = json.map((e) => Group.fromMap(e)).toList(); return groups; } @override - Future> getGroups(BasicSearch search) { + Future> getGroups(BasicSearch search) { // TODO: implement getPictograms throw UnimplementedError(); } @override - Future uploadGroups(List data, String type, String language) async { + Future uploadGroups(List data, String type, String language, {String? userId}) async { final result = await _authService.getCurrentUser(); if (result.isLeft) return; - dynamic jsonData = List.empty(growable: true); + List> jsonData = List.empty(growable: true); + for (var e in data) { - final relactions = e.relacion.map((e) => e.toJson()).toList(); - jsonData.add({ - 'id': e.id, - 'texto': e.texto.toJson(), - 'tipo': e.tipo, - 'imagen': e.imagen.toJson(), - 'relacion': relactions, - 'frecuencia': e.frecuencia, - 'tags': e.tags, - }); + jsonData.add(e.toMap()); } final UserModel auth = result.right; - - await _serverRepository.uploadGroups(auth.id, language, data: jsonData); + await _serverRepository.uploadGroups(userId ?? auth.id, language, data: jsonData); } @override - Future updateGroups(Groups data, String type, String language, int index) async { + Future updateGroups(Group data, String type, String language, int index, {String? userId}) async { final result = await _authService.getCurrentUser(); if (result.isLeft) return; final UserModel auth = result.right; - final relactions = data.relacion.map((e) => e.toJson()).toList(); - - final payload = { - 'id': data.id, - 'texto': data.texto.toJson(), - 'tipo': data.tipo, - 'imagen': data.imagen.toJson(), - 'relacion': relactions, - 'frecuencia': data.frecuencia, - 'tags': data.tags, - }; + await _serverRepository.updateGroup(userId ?? auth.id, language, index, data: data.toMap()); + } - await _serverRepository.updateGroup(auth.id, language, index, data: payload); + @override + Future> getDefaultGroups() { + // TODO: implement getDefaultGroups + throw UnimplementedError(); } } diff --git a/lib/application/service/hive_database.dart b/lib/application/service/hive_database.dart new file mode 100644 index 00000000..94295dfc --- /dev/null +++ b/lib/application/service/hive_database.dart @@ -0,0 +1,194 @@ +import 'package:hive_flutter/hive_flutter.dart'; +import 'package:ottaa_project_flutter/core/enums/devices_accessibility.dart'; +import 'package:ottaa_project_flutter/core/enums/display_types.dart'; +import 'package:ottaa_project_flutter/core/enums/size_types.dart'; +import 'package:ottaa_project_flutter/core/enums/sweep_modes.dart'; +import 'package:injectable/injectable.dart'; +import 'package:ottaa_project_flutter/core/enums/user_types.dart'; +import 'package:ottaa_project_flutter/core/enums/velocity_types.dart'; +import 'package:ottaa_project_flutter/core/models/accessibility_setting.dart'; +import 'package:ottaa_project_flutter/core/models/assets_image.dart'; +import 'package:ottaa_project_flutter/core/models/base_settings_model.dart'; +import 'package:ottaa_project_flutter/core/models/base_user_model.dart'; +import 'package:ottaa_project_flutter/core/models/caregiver_user_model.dart'; +import 'package:ottaa_project_flutter/core/models/devices_token.dart'; +import 'package:ottaa_project_flutter/core/models/group_model.dart'; +import 'package:ottaa_project_flutter/core/models/language_setting.dart'; +import 'package:ottaa_project_flutter/core/models/layout_setting.dart'; +import 'package:ottaa_project_flutter/core/models/patient_user_model.dart'; +import 'package:ottaa_project_flutter/core/models/payment_model.dart'; +import 'package:ottaa_project_flutter/core/models/phrase_model.dart'; +import 'package:ottaa_project_flutter/core/models/picto_model.dart'; +import 'package:ottaa_project_flutter/core/models/shortcuts_model.dart'; +import 'package:ottaa_project_flutter/core/models/subtitles_setting.dart'; +import 'package:ottaa_project_flutter/core/models/tts_setting.dart'; +import 'package:ottaa_project_flutter/core/models/user_data_model.dart'; +import 'package:ottaa_project_flutter/core/abstracts/user_model.dart'; +import 'package:ottaa_project_flutter/core/models/voice_setting.dart'; +import 'package:ottaa_project_flutter/core/repositories/local_database_repository.dart'; + +@Singleton(as: LocalDatabaseRepository) +class HiveDatabase extends LocalDatabaseRepository { + late final HiveInterface iHive; + + HiveDatabase({HiveInterface? hive}) { + iHive = hive ?? Hive; + } + + @override + UserModel? user; + + @override + Future close() async { + await iHive.close(); + } + + @override + Future deleteUser() async { + await iHive.box('user').clear(); + await iHive.box('caregiver').clear(); + await iHive.box('none').clear(); + } + + @override + Future getUser() async { + UserModel? user; + + user ??= iHive.box(UserType.user.name).get(UserType.user.name); + + user ??= iHive.box(UserType.caregiver.name).get(UserType.caregiver.name); + + user ??= iHive.box(UserType.none.name).get(UserType.none.name); + + this.user = user; + + return this.user; + } + + @FactoryMethod(preResolve: true) + static Future start() async { + HiveDatabase db = HiveDatabase(); + await db.init(); + + return db; + } + + @override + Future init() async { + await iHive.initFlutter(); + + iHive.registerAdapter(PatientUserModelAdapter()); + iHive.registerAdapter(BaseSettingsModelAdapter()); + iHive.registerAdapter(UserDataAdapter()); + iHive.registerAdapter(AssetsImageAdapter()); + iHive.registerAdapter(PhraseAdapter()); + iHive.registerAdapter(PaymentAdapter()); + iHive.registerAdapter(ShortcutsModelAdapter()); + iHive.registerAdapter(PictoAdapter()); + iHive.registerAdapter(PictoRelationAdapter()); + iHive.registerAdapter(SequenceAdapter()); + // Hive.registerAdapter(TagsAdapter()); + iHive.registerAdapter(GroupAdapter()); + iHive.registerAdapter(GroupRelationAdapter()); + iHive.registerAdapter(CaregiverUserModelAdapter()); + iHive.registerAdapter(PatientSettingsAdapter()); + iHive.registerAdapter(CaregiverUsersAdapter()); + iHive.registerAdapter(BaseUserModelAdapter()); + iHive.registerAdapter(UserTypeAdapter()); + iHive.registerAdapter(DevicesAccessibilityAdapter()); + iHive.registerAdapter(DisplayTypesAdapter()); + iHive.registerAdapter(SizeTypesAdapter()); + iHive.registerAdapter(SweepModesAdapter()); + iHive.registerAdapter(VelocityTypesAdapter()); + + iHive.registerAdapter(AccessibilitySettingAdapter()); + iHive.registerAdapter(LanguageSettingAdapter()); + iHive.registerAdapter(LayoutSettingAdapter()); + iHive.registerAdapter(SubtitlesSettingAdapter()); + iHive.registerAdapter(TTSSettingAdapter()); + + iHive.registerAdapter(VoiceSettingAdapter()); + + iHive.registerAdapter(DeviceTokenAdapter()); + + await iHive.openBox(UserType.user.name); + + await iHive.openBox(UserType.caregiver.name); + + await iHive.openBox(UserType.none.name); + + await iHive.openBox('intro'); + + await iHive.openBox('tts'); + + await iHive.openBox('longClick'); + + await iHive.openBox('apple'); + + await getUser(); + } + + @override + Future setUser(UserModel user) async { + Box box = (await secureBox(user.type.name)); + await box.put(user.type.name, user); + user = box.get(user.type.name); + this.user = user; + } + + Future> secureBox(String boxName) async { + Box box; + + if (iHive.isBoxOpen(boxName)) { + box = iHive.box(boxName); + } else { + box = await iHive.openBox(boxName); + } + + return box; + } + + @override + Future setIntro([bool? value]) async { + await iHive.box('intro').put('first', value ?? true); + } + + @override + Future getIntro() async { + final res = iHive.box('intro').get('first'); + return res ?? true; + } + + @override + Future getVoice() async { + final res = iHive.box('tts').get('name'); + return res ?? ''; + } + + @override + Future setVoice({required String name}) async { + await iHive.box('tts').put('name', name); + } + + @override + Future setLongClick({required bool isLongClick}) async { + await iHive.box('longClick').put('isLongClick', isLongClick); + } + + @override + Future getLongClick() async { + final res = iHive.box('longClick').get('isLongClick'); + return res ?? false; + } + + @override + Future setAppleUserDara({required Map data}) async { + await iHive.box('apple').put('data', data); + } + + @override + Future> getAppleUserData() async { + final res = iHive.box('apple').get('data'); + return res ?? {}; + } +} diff --git a/lib/application/service/local_storage_service.dart b/lib/application/service/local_storage_service.dart index 5ed3dc95..b977ebaa 100644 --- a/lib/application/service/local_storage_service.dart +++ b/lib/application/service/local_storage_service.dart @@ -1,143 +1,26 @@ import 'dart:convert'; -import 'dart:io'; - -import 'package:ottaa_project_flutter/core/models/pictogram_model.dart'; -import 'package:ottaa_project_flutter/core/models/groups_model.dart'; +import 'package:flutter/services.dart'; +import 'package:injectable/injectable.dart'; +import 'package:ottaa_project_flutter/core/models/group_model.dart'; +import 'package:ottaa_project_flutter/core/models/picto_model.dart'; import 'package:ottaa_project_flutter/core/repositories/local_storage_repository.dart'; import 'package:path_provider/path_provider.dart'; +import 'package:universal_io/io.dart'; +@Singleton(as: LocalStorageRepository, dependsOn: []) class LocalStorageService extends LocalStorageRepository { - Future get _directoryPath async { - Directory directory = await getApplicationDocumentsDirectory(); - return directory.path; - } - - Future get _gruposFile async { - final path = await _directoryPath; - return File('$path/gruposFile.json'); - } - - Future get _gruposFrenchFile async { - final path = await _directoryPath; - return File('$path/grupos_fr_file.json'); - } - - Future get _gruposPortugueseFile async { - final path = await _directoryPath; - return File('$path/grupos_pt_file.json'); - } - - Future get _pictoFile async { - final path = await _directoryPath; - return File('$path/pictoFile.json'); - } + late final AssetBundle assetBundler; - Future get _pictoFrenchFile async { - final path = await _directoryPath; - return File('$path/pictos_fr_file.json'); - } - - Future get _pictoPortugueseFile async { - final path = await _directoryPath; - return File('$path/pictos_pt_file.json'); - } - - @override - Future writeGruposToFile({ - required String data, - required String language, - }) async { - // final file = await _gruposFile; - late File file; - switch (language) { - case "es-AR": - file = await _gruposFile; - break; - case "en-US": - file = await _gruposFile; - break; - case "fr-FR": - file = await _gruposFrenchFile; - break; - case "pt-BR": - file = await _gruposPortugueseFile; - break; - default: - file = await _gruposFile; - } - await file.writeAsString(data); - } + @FactoryMethod() + factory LocalStorageService.start() => LocalStorageService(); - @override - Future> readGruposFromFile({ - required String language, - }) async { - // final File file = await _gruposFile; - late File file; - switch (language) { - case "es-AR": - file = await _gruposFile; - break; - case "en-US": - file = await _gruposFile; - break; - case "fr-FR": - file = await _gruposFrenchFile; - break; - case "pt-BR": - file = await _gruposPortugueseFile; - break; - default: - file = await _gruposFile; - } - final response = await file.readAsString(); - return (jsonDecode(response) as List).map((e) => Groups.fromJson(e)).toList(); - } - - @override - Future writePictoToFile({required String data, required String language}) async { - // final file = await _pictoFile; - late File file; - switch (language) { - case "es-AR": - file = await _pictoFile; - break; - case "en-US": - file = await _pictoFile; - break; - case "fr-FR": - file = await _pictoFrenchFile; - break; - case "pt-BR": - file = await _pictoPortugueseFile; - break; - default: - file = await _pictoFile; - } - await file.writeAsString(data); + LocalStorageService({AssetBundle? assetBundler}) { + this.assetBundler = assetBundler ?? rootBundle; } @override - Future> readPictoFromFile({required String language}) async { - // final file = await _pictoFile; - late File file; - switch (language) { - case "es-AR": - file = await _pictoFile; - break; - case "en-US": - file = await _pictoFile; - break; - case "fr-FR": - file = await _pictoFrenchFile; - break; - case "pt-BR": - file = await _pictoPortugueseFile; - break; - default: - file = await _pictoFile; - } - final response = await file.readAsString(); - return (jsonDecode(response) as List).map((e) => Pict.fromJson(e)).toList(); + Future> readPictosFromLocal({required String locale}) async { + final fileBundle = await assetBundler.loadString('assets/languages/$locale.json'); + return jsonDecode(fileBundle); } } diff --git a/lib/application/service/mobile_remote_storage_service.dart b/lib/application/service/mobile_remote_storage_service.dart deleted file mode 100644 index 7b24db2b..00000000 --- a/lib/application/service/mobile_remote_storage_service.dart +++ /dev/null @@ -1,57 +0,0 @@ -import 'dart:convert'; - -import 'package:firebase_storage/firebase_storage.dart'; -import 'package:flutter/services.dart'; -import 'package:ottaa_project_flutter/application/common/i18n.dart'; -import 'package:ottaa_project_flutter/core/models/user_model.dart'; -import 'package:ottaa_project_flutter/core/repositories/auth_repository.dart'; -import 'package:ottaa_project_flutter/core/repositories/remote_storage_repository.dart'; -import 'package:ottaa_project_flutter/core/repositories/server_repository.dart'; - -class MobileRemoteStorageService implements RemoteStorageRepository { - final AuthRepository _authService; - final ServerRepository _serverRepository; - final I18N _i18n; - - MobileRemoteStorageService(this._authService, this._serverRepository, this._i18n); - - @override - Future deleteFile(String path, String fileName) { - // TODO: implement deleteFile - throw UnimplementedError(); - } - - @override - Future readRemoteFile({required String path, required String fileName}) async { - final result = await _authService.getCurrentUser(); - - if (result.isLeft) return ""; - - final UserModel auth = result.right; - final languageCode = _i18n.languageCode; - - EitherListMap? fetchedData; - - if (path == "Pictos") { - fetchedData = await _serverRepository.getAllPictograms(auth.id, languageCode); - } else if (path == "Grupos") { - fetchedData = await _serverRepository.getAllGroups(auth.id, languageCode); - } - - if (fetchedData != null && fetchedData.isRight) { - final encode = jsonEncode(fetchedData.right); - return encode; - } - - final cachedData = await rootBundle.loadString(fileName); - return cachedData; - } - - @override - Future uploadFile(String path, String fileName, Uint8List file) async { - Reference ref = FirebaseStorage.instance.ref().child(path).child(fileName); - final UploadTask uploadTask = ref.putData(file, SettableMetadata(contentType: 'image/png')); - final TaskSnapshot taskSnapshot = await uploadTask.whenComplete(() {}); - return await taskSnapshot.ref.getDownloadURL(); - } -} diff --git a/lib/application/service/notifications_service_impl.dart b/lib/application/service/notifications_service_impl.dart new file mode 100644 index 00000000..4fdaa73d --- /dev/null +++ b/lib/application/service/notifications_service_impl.dart @@ -0,0 +1,130 @@ +import 'dart:async'; +import 'dart:math'; + +import 'package:awesome_notifications/awesome_notifications.dart'; +import 'package:firebase_messaging/firebase_messaging.dart'; +import 'package:flutter/material.dart'; +import 'package:injectable/injectable.dart'; +import 'package:ottaa_project_flutter/application/common/extensions/translate_string.dart'; +import 'package:ottaa_project_flutter/application/common/i18n.dart'; +import 'package:ottaa_project_flutter/application/locator.dart'; +import 'package:ottaa_project_flutter/core/service/notifications_service.dart'; + +@Singleton( + as: NotificationsService, +) +class NotificationsServiceImpl implements NotificationsService { + late final AwesomeNotifications _awesomeNotifications; + + @override + StreamSubscription? onMessageOpenedAppSubscription; + + @override + StreamSubscription? onMessageReceived; + + @override + StreamSubscription? onMessageSubscription; + + final I18N i18n; + + late FirebaseMessaging firebaseMessaging; + + NotificationsServiceImpl( + this.i18n, { + FirebaseMessaging? firebaseMessaging, + AwesomeNotifications? awesomeNotifications, + }) { + this.firebaseMessaging = firebaseMessaging ?? FirebaseMessaging.instance; + _awesomeNotifications = awesomeNotifications ?? AwesomeNotifications(); + } + + @FactoryMethod(preResolve: true) + static Future onInit(I18N i18n) async { + final service = NotificationsServiceImpl(i18n); + await service.init(); + return service; + } + + @override + Future init() async { + NotificationSettings settings = await firebaseMessaging.requestPermission( + alert: true, + announcement: false, + badge: true, + carPlay: false, + criticalAlert: false, + provisional: false, + sound: true, + ); + + await _awesomeNotifications.initialize( + 'resource://mipmap/ic_launcher', + [ + NotificationChannel( + channelKey: 'basic_channel', + channelName: 'Basic notifications', + channelDescription: 'Notification channel for basic tests', + defaultColor: const Color(0xFF9D50DD), + ledColor: Colors.white, + ), + ], + ); + + if (settings.authorizationStatus == AuthorizationStatus.denied) { + print('User declined or has not accepted permission'); + } + + await onMessageSubscription?.cancel(); + await onMessageOpenedAppSubscription?.cancel(); + await onMessageReceived?.cancel(); + + onMessageSubscription = FirebaseMessaging.onMessage.listen((RemoteMessage message) async { + print(message); + print('Got a message whilst in the foreground!'); + print('Message data: ${message.data}'); + if (message.notification != null) { + print('Message also contained a notification: ${message.notification?.title} ${message.notification?.body}'); + await showNotification( + title: message.notification!.title ?? "", + description: message.notification!.body ?? "", + payload: message.data.map((key, value) => MapEntry(key, value.toString())), + ); + } + }); + onMessageOpenedAppSubscription = FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) async { + print(message); + print('A new onMessageOpenedApp event was published!'); + print('Message data: ${message.data}'); + if (message.notification != null) { + await showNotification( + title: message.notification!.title ?? "", + description: message.notification!.body ?? "", + payload: message.data as Map?, + ); + } + }); + + return this; + } + + @override + Future showNotification({ + required String title, + required String description, + Map? payload, + }) async { + title = title.trlf(payload); + description = description.trlf(payload); + + await _awesomeNotifications.createNotification( + content: NotificationContent( + id: Random().nextInt(1000), + channelKey: 'basic_channel', + title: title, + payload: payload, + body: description, + notificationLayout: NotificationLayout.BigText, + ), + ); + } +} diff --git a/lib/application/service/pictograms_service.dart b/lib/application/service/pictograms_service.dart index 001deb89..ff8acfcc 100644 --- a/lib/application/service/pictograms_service.dart +++ b/lib/application/service/pictograms_service.dart @@ -1,22 +1,26 @@ import 'dart:convert'; import 'package:flutter/foundation.dart'; -import 'package:ottaa_project_flutter/core/models/pictogram_model.dart'; +import 'package:injectable/injectable.dart'; import 'package:ottaa_project_flutter/core/abstracts/basic_search.dart'; -import 'package:ottaa_project_flutter/core/models/user_model.dart'; +import 'package:ottaa_project_flutter/core/abstracts/user_model.dart'; +import 'package:ottaa_project_flutter/core/models/picto_model.dart'; import 'package:ottaa_project_flutter/core/repositories/auth_repository.dart'; +import 'package:ottaa_project_flutter/core/repositories/local_storage_repository.dart'; import 'package:ottaa_project_flutter/core/repositories/pictograms_repository.dart'; import 'package:ottaa_project_flutter/core/repositories/remote_storage_repository.dart'; import 'package:ottaa_project_flutter/core/repositories/server_repository.dart'; +@Singleton(as: PictogramsRepository) class PictogramsService extends PictogramsRepository { final AuthRepository _authService; final RemoteStorageRepository _remoteStorageService; final ServerRepository _serverRepository; + final LocalStorageRepository _localStorageServices; - PictogramsService(this._authService, this._serverRepository, this._remoteStorageService); + PictogramsService(this._authService, this._serverRepository, this._remoteStorageService, this._localStorageServices); @override - Future> getAllPictograms() async { + Future> getAllPictograms() async { await Future.delayed( const Duration(seconds: kIsWeb ? 2 : 1), ); @@ -24,75 +28,46 @@ class PictogramsService extends PictogramsRepository { final String data = await _remoteStorageService.readRemoteFile(path: "Pictos", fileName: 'assets/pictos.json'); final List json = jsonDecode(data); - final List pictograms = json.map((e) => Pict.fromJson(e)).toList(); + final List pictograms = json.map((e) => Picto.fromMap(e)).toList(); return pictograms; } @override - Future> getPictograms(BasicSearch search) { - // TODO: implement getPictograms - throw UnimplementedError(); + Future> getPictograms(BasicSearch search) async { + return []; } @override - Future uploadPictograms(List data, String language) async { - dynamic jsonData = List.empty(growable: true); + Future uploadPictograms(List data, String language, {String? userId}) async { + List> jsonData = List.empty(growable: true); for (var e in data) { - final relactions = e.relacion?.map((e) => e.toJson()).toList(); - jsonData.add({ - 'id': e.id, - 'texto': e.texto.toJson(), - 'tipo': e.tipo, - 'imagen': e.imagen.toJson(), - 'relacion': relactions, - 'agenda': e.agenda, - 'gps': e.gps, - 'hora': e.hora, - 'edad': e.edad, - 'sexo': e.sexo, - 'esSugerencia': e.esSugerencia, - 'horario': e.horario, - 'ubicacion': e.ubicacion, - 'score': e.score, - }); + jsonData.add(e.toMap()); } final result = await _authService.getCurrentUser(); if (result.isLeft) return; final UserModel auth = result.right; - await _serverRepository.uploadPictograms( - auth.id, + userId ?? auth.id, language, data: jsonData, ); } @override - Future updatePictogram(Pict pictogram, String language, int index) async { - final relactions = pictogram.relacion?.map((e) => e.toJson()).toList(); + Future updatePictogram(Picto pictogram, String language, int index) async { + final relactions = pictogram.relations.map((e) => e.toJson()).toList(); final result = await _authService.getCurrentUser(); if (result.isLeft) return; + } - final String id = result.right.id; - - await _serverRepository.updatePictogram(id, language, index, data: { - 'id': pictogram.id, - 'texto': pictogram.texto.toJson(), - 'tipo': pictogram.tipo, - 'imagen': pictogram.imagen.toJson(), - 'relacion': relactions, - 'agenda': pictogram.agenda, - 'gps': pictogram.gps, - 'hora': pictogram.hora, - 'edad': pictogram.edad, - 'sexo': pictogram.sexo, - 'esSugerencia': pictogram.esSugerencia, - 'horario': pictogram.horario, - 'ubicacion': pictogram.ubicacion, - 'score': pictogram.score, + @override + Future> loadTranslations({required String language}) async { + final pictosTranslations = await _localStorageServices.readPictosFromLocal(locale: language); + return pictosTranslations.map((key, value) { + return MapEntry(key, value["text"]); }); } } diff --git a/lib/application/service/profile_services.dart b/lib/application/service/profile_services.dart new file mode 100644 index 00000000..9bf73a54 --- /dev/null +++ b/lib/application/service/profile_services.dart @@ -0,0 +1,48 @@ +import 'dart:convert'; + +import 'package:either_dart/either.dart'; +import 'package:injectable/injectable.dart'; +import 'package:ottaa_project_flutter/core/repositories/profile_repository.dart'; +import 'package:ottaa_project_flutter/core/repositories/server_repository.dart'; + +@Singleton(as: ProfileRepository) +class ProfileService implements ProfileRepository { + final ServerRepository _serverRepository; + + ProfileService(this._serverRepository); + + @override + Future updateUserSettings({required Map data, required String userId}) async { + return await _serverRepository.updateUserSettings(data: data, userId: userId); + } + + @override + Future uploadUserImage({required String path, required String name, required String userId}) async { + return await _serverRepository.uploadUserImage(path: path, name: name, userId: userId); + } + + @override + Future>> getConnectedUsers({required String userId}) async { + return await _serverRepository.getConnectedUsers(userId: userId); + } + + @override + Future>> fetchConnectedUserData({required String userId}) async { + return await _serverRepository.fetchConnectedUserData(userId: userId); + } + + @override + Future removeCurrentUser({required String userId, required String careGiverId}) async { + return await _serverRepository.removeCurrentUser(userId: userId, careGiverId: careGiverId); + } + + @override + Future>> getProfileById({required String id}) { + return _serverRepository.getProfileById(id: id); + } + + @override + Future updateUser({required Map data, required String userId}) async { + await _serverRepository.uploadUserInformation(userId, data); + } +} diff --git a/lib/application/service/remote_config_service.dart b/lib/application/service/remote_config_service.dart new file mode 100644 index 00000000..1df350b4 --- /dev/null +++ b/lib/application/service/remote_config_service.dart @@ -0,0 +1,45 @@ +import 'package:firebase_remote_config/firebase_remote_config.dart'; +import 'package:injectable/injectable.dart'; +import 'package:ottaa_project_flutter/core/repositories/remote_config_repository.dart'; + +@Singleton( + as: RemoteConfigRepository, +) +class RemoteConfigService extends RemoteConfigRepository { + late final FirebaseRemoteConfig _remoteConfig; + + @FactoryMethod( + preResolve: true, + ) + static Future start() => RemoteConfigService().init(); + + RemoteConfigService({ + FirebaseRemoteConfig? remoteConfig, + }) { + _remoteConfig = remoteConfig ?? FirebaseRemoteConfig.instance; + } + + @override + Future init() async { + await _remoteConfig.setConfigSettings(RemoteConfigSettings( + fetchTimeout: const Duration(seconds: 10), + minimumFetchInterval: const Duration(seconds: 10), + )); + + // await _remoteConfig.fetchAndActivate(); + + return this; + } + + @override + Future getBool(String key) async => _remoteConfig.getBool(key); + + @override + Future getDouble(String key) async => _remoteConfig.getDouble(key); + + @override + Future getInt(String key) async => _remoteConfig.getInt(key); + + @override + Future getString(String key) async => _remoteConfig.getString(key); +} diff --git a/lib/application/service/web_remote_storage_service.dart b/lib/application/service/remote_storage_service.dart similarity index 56% rename from lib/application/service/web_remote_storage_service.dart rename to lib/application/service/remote_storage_service.dart index ce152641..3047339e 100644 --- a/lib/application/service/web_remote_storage_service.dart +++ b/lib/application/service/remote_storage_service.dart @@ -2,19 +2,38 @@ import 'dart:convert'; import 'package:firebase_storage/firebase_storage.dart'; import 'package:flutter/services.dart'; +import 'package:injectable/injectable.dart'; import 'package:ottaa_project_flutter/application/common/i18n.dart'; -import 'package:ottaa_project_flutter/core/models/user_model.dart'; +import 'package:ottaa_project_flutter/application/locator.dart'; +import 'package:ottaa_project_flutter/core/abstracts/user_model.dart'; import 'package:ottaa_project_flutter/core/repositories/auth_repository.dart'; import 'package:ottaa_project_flutter/core/repositories/remote_storage_repository.dart'; import 'package:ottaa_project_flutter/core/repositories/server_repository.dart'; -class WebRemoteStorageService implements RemoteStorageRepository { - final ServerRepository _serverRepository; - +@Singleton(as: RemoteStorageRepository) +class RemoteStorageService implements RemoteStorageRepository { final AuthRepository _authService; + final ServerRepository _serverRepository; final I18N _i18n; - WebRemoteStorageService(this._authService, this._serverRepository, this._i18n); + late final FirebaseStorage _firebaseStorage; + late final AssetBundle _assetBundle; + + @FactoryMethod() + factory RemoteStorageService.from(AuthRepository authService, ServerRepository serverRepository, I18N i18n) { + return RemoteStorageService(authService, serverRepository, i18n); + } + + RemoteStorageService( + this._authService, + this._serverRepository, + this._i18n, { + FirebaseStorage? firebaseStorage, + AssetBundle? assetBundle, + }) { + _firebaseStorage = firebaseStorage ?? FirebaseStorage.instance; + _assetBundle = assetBundle ?? rootBundle; + } @override Future deleteFile(String path, String fileName) { @@ -29,10 +48,13 @@ class WebRemoteStorageService implements RemoteStorageRepository { if (result.isLeft) return ""; final UserModel auth = result.right; - final languageCode = _i18n.languageCode; + final locale = _i18n.currentLocale; + + final languageCode = "${locale.languageCode}_${locale.countryCode}"; EitherListMap? fetchedData; + //TODO: Fetch for cached info from serverRepository :3 if (path == "Pictos") { fetchedData = await _serverRepository.getAllPictograms(auth.id, languageCode); } else if (path == "Grupos") { @@ -40,17 +62,16 @@ class WebRemoteStorageService implements RemoteStorageRepository { } if (fetchedData != null && fetchedData.isRight) { - final encode = jsonEncode(fetchedData.right); - return encode; + return jsonEncode(fetchedData.right); } - final cachedData = await rootBundle.loadString(fileName); + final cachedData = await _assetBundle.loadString(fileName); return cachedData; } @override Future uploadFile(String path, String fileName, Uint8List file) async { - Reference ref = FirebaseStorage.instance.ref().child(path).child(fileName); + Reference ref = _firebaseStorage.ref().child(path).child(fileName); final UploadTask uploadTask = ref.putData(file, SettableMetadata(contentType: 'image/png')); final TaskSnapshot taskSnapshot = await uploadTask.whenComplete(() {}); return await taskSnapshot.ref.getDownloadURL(); diff --git a/lib/application/service/report_service.dart b/lib/application/service/report_service.dart index 59f38559..a8014684 100644 --- a/lib/application/service/report_service.dart +++ b/lib/application/service/report_service.dart @@ -1,27 +1,33 @@ -import 'package:ottaa_project_flutter/core/models/sentence_statistics_model.dart'; +import 'package:injectable/injectable.dart'; +import 'package:ottaa_project_flutter/core/models/phrases_statistics_model.dart'; import 'package:ottaa_project_flutter/core/models/picto_statistics_model.dart'; import 'package:ottaa_project_flutter/core/repositories/report_repository.dart'; import 'package:ottaa_project_flutter/core/repositories/server_repository.dart'; +@Singleton(as: ReportRepository) class ReportService implements ReportRepository { final ServerRepository _serverRepository; ReportService(this._serverRepository); @override - Future getMostUsedSentences(String userId, String languageCode) async { - final response = await _serverRepository.getMostUsedSentences(userId, languageCode); + Future getMostUsedSentences( + String userId, String languageCode) async { + final response = + await _serverRepository.getMostUsedSentences(userId, languageCode); if (response.isRight) { - return FrasesStatisticsModel.fromJson(response.right); + return PhraseStatisticModel.fromJson(response.right); } return null; } @override - Future getPictogramsStatistics(String userId, String languageCode) async { - final response = await _serverRepository.getPictogramsStatistics(userId, languageCode); + Future getPictogramsStatistics( + String userId, String languageCode) async { + final response = + await _serverRepository.getPictogramsStatistics(userId, languageCode); if (response.isRight) { return PictoStatisticsModel.fromJson(response.right); diff --git a/lib/application/service/sentences_service.dart b/lib/application/service/sentences_service.dart index 7a7074bd..b82e3227 100644 --- a/lib/application/service/sentences_service.dart +++ b/lib/application/service/sentences_service.dart @@ -1,8 +1,11 @@ -import 'package:ottaa_project_flutter/core/models/sentence_model.dart'; +import 'package:either_dart/either.dart'; +import 'package:injectable/injectable.dart'; +import 'package:ottaa_project_flutter/core/models/phrase_model.dart'; import 'package:ottaa_project_flutter/core/repositories/auth_repository.dart'; import 'package:ottaa_project_flutter/core/repositories/sentences_repository.dart'; import 'package:ottaa_project_flutter/core/repositories/server_repository.dart'; +@Singleton(as: SentencesRepository) class SentencesService implements SentencesRepository { final AuthRepository _auth; final ServerRepository _serverRepository; @@ -10,39 +13,39 @@ class SentencesService implements SentencesRepository { SentencesService(this._auth, this._serverRepository); @override - Future> fetchSentences( - {required String language, - required String type, - bool isFavorite = false}) async { + Future>> fetchSentences({required String language, required String type, bool isFavorite = false}) async { final authResult = await _auth.getCurrentUser(); - if (authResult.isLeft) return []; + if (authResult.isLeft) return const Left('no data'); final user = authResult.right; - return await _serverRepository.getUserSentences( + final response = await _serverRepository.getUserSentences( user.id, language: language, type: type, ); + + if (response.isEmpty) return const Left('no data'); + List data = response.map((e) => Phrase.fromMap(e)).toList(); + + return Right(data); } @override - Future uploadSentences( - {required String language, - required List data, - required String type}) async { + Future uploadSentences({required String language, required List data, required String type}) async { final authResult = await _auth.getCurrentUser(); - if (authResult.isLeft) return; + if (authResult.isLeft) return const Left("no user"); final user = authResult.right; final List> jsonData = List.empty(growable: true); for (var e in data) { - jsonData.add(e.toJson()); + jsonData.add(e.toMap()); } _serverRepository.uploadUserSentences(user.id, language, type, jsonData); + return const Right(null); } } diff --git a/lib/application/service/server_service.dart b/lib/application/service/server_service.dart index c2f2cd78..29260041 100644 --- a/lib/application/service/server_service.dart +++ b/lib/application/service/server_service.dart @@ -1,85 +1,94 @@ import 'dart:convert'; - +import 'dart:io'; +import 'package:cloud_functions/cloud_functions.dart'; +import 'package:collection/collection.dart'; +import 'package:dio/dio.dart'; import 'package:either_dart/either.dart'; import 'package:firebase_database/firebase_database.dart'; +import 'package:firebase_storage/firebase_storage.dart'; +import 'package:injectable/injectable.dart'; +import 'package:http/http.dart' as http; +import 'package:ottaa_project_flutter/core/enums/board_data_type.dart'; import 'package:ottaa_project_flutter/core/enums/user_types.dart'; -import 'package:ottaa_project_flutter/core/models/sentence_model.dart'; +import 'package:ottaa_project_flutter/core/models/arsaac_data_model.dart'; +import 'package:ottaa_project_flutter/core/models/assets_image.dart'; +import 'package:ottaa_project_flutter/core/models/devices_token.dart'; +import 'package:ottaa_project_flutter/core/models/phrase_model.dart'; +import 'package:ottaa_project_flutter/core/models/shortcuts_model.dart'; import 'package:ottaa_project_flutter/core/repositories/server_repository.dart'; -import 'package:http/http.dart' as http; +import 'package:universal_io/io.dart'; -class ServerService implements ServerRepository { - final DatabaseReference _database = FirebaseDatabase.instance.ref(); +const String kBaseURL = "https://us-central1-ottaaproject-flutter.cloudfunctions.net"; - @override - Future init() async {} +@Singleton(as: ServerRepository) +class ServerService implements ServerRepository { + late final FirebaseDatabase _database; + late final FirebaseStorage _storage; + late final FirebaseFunctions _functions; + late final Dio _dio; + + //We need to inject the dio instance, database instance, storage instance and functions isntace to be able to use it in the server service + ServerService({Dio? dio, FirebaseDatabase? database, FirebaseStorage? storage, FirebaseFunctions? functions}) { + _dio = dio ?? Dio(); + _dio.options.baseUrl = kBaseURL; + _database = database ?? FirebaseDatabase.instance; + _storage = storage ?? FirebaseStorage.instance; + _functions = functions ?? FirebaseFunctions.instance; + } - @override - Future close() async {} + @FactoryMethod() + factory ServerService.create() => ServerService(); @override Future getUserType(String userId) async { - final ref = _database.child('$userId/Pago/Pago'); + final ref = _database.ref().child('$userId/type'); final res = await ref.get(); - if (res.value == null || res.value.toString() == "0") return UserType.free; - return UserType.premium; + return UserType.values.firstWhere( + (element) => element.name == res.value.toString(), + orElse: () => UserType.none, + ); } @override Future getAllGroups(String userId, String languageCode) async { //Fetch new data from server - final refNew = _database.child('$userId/Grupos/$languageCode'); - final resNew = await refNew.get(); - - if (resNew.exists && resNew.value != null) { - return Right(resNew.value as dynamic); - } - - //Fetch old data from serve (for compatibility) - final refOld = _database.child('Grupos/$userId/$languageCode'); - final resOld = await refOld.get(); + final ref = _database.ref().child('$userId/groups/$languageCode'); + final res = await ref.get(); - if (resOld.exists && resOld.value != null) { - return Right(resOld.value as dynamic); + if (res.exists && res.value != null) { + final valu = jsonEncode((res.value as dynamic)); + return Right(List.from(jsonDecode(valu).values.toList() as List)); } - return const Left("no_data_found"); } @override Future getAllPictograms(String userId, String languageCode) async { //Fetch new data from server - final refNew = _database.child('$userId/Pictos/$languageCode'); - final resNew = await refNew.get(); - - if (resNew.exists && resNew.value != null) { - return Right(resNew.value as dynamic); - } - - //Fetch old data from serve (for compatibility) - final refOld = _database.child('Pictos/$userId/$languageCode'); - final resOld = await refOld.get(); + final ref = _database.ref().child('$userId/pictos/$languageCode'); + final res = await ref.get(); - if (resOld.exists && resOld.value != null) { - return Right(resOld.value as dynamic); + if (res.exists && res.value != null) { + final valu = jsonEncode((res.value as dynamic)); + return Right(List.from(jsonDecode(valu).values.toList() as List)); } - return const Left("no_data_found"); } @override Future getAvailableAppVersion(String platform) async { - final DatabaseReference ref = _database.child('version/'); + final DatabaseReference ref = _database.ref().child('version/'); final DataSnapshot res = await ref.get(); if (!res.exists || res.value == null) return const Left("no_data_found"); - return Right(res.toString()); + return Right(res.value.toString()); } @override Future getUserInformation(String id) async { - final userRef = _database.child('$id/Usuarios/'); + final userRef = _database.ref().child(id); final userValue = await userRef.get(); @@ -87,46 +96,49 @@ class ServerService implements ServerRepository { final dynamic user = userValue.value as dynamic; + Map settingsData = user["settings"]; + + if (settingsData["language"].runtimeType == String) { + settingsData["language"] = { + "language": settingsData["language"] ?? "es_AR", + "labs": false, + }; + } + + user["settings"] = settingsData; + return Right(Map.from(user)); } @override Future getUserProfilePicture(String userId) async { - final refNew = _database.child('$userId/Usuarios/Avatar/urlFoto/'); + final refNew = _database.ref().child('$userId/settings/data/avatar/'); final resNew = await refNew.get(); if (resNew.exists && resNew.value != null) { - return Right(resNew.value.toString()); - } - - /// Get the profile picture from the database at the old path - final refOld = _database.child('Avatar/$userId/urlFoto/'); - final resOld = await refOld.get(); - - if (resOld.exists && resOld.value != null) { - return Right(resOld.value.toString()); + return Right(Map.from(resNew.value as Map)["network"]); } return const Left("no_data_found"); } @override - Future> getUserSentences(String userId, {required String language, required String type, bool isFavorite = false}) async { - final refNew = _database.child('$userId/Frases/$language/$type'); + Future>> getUserSentences(String userId, {required String language, required String type, bool isFavorite = false}) async { + final refNew = _database.ref().child('$userId/Frases/$language/$type'); final resNew = await refNew.get(); if (resNew.exists && resNew.value != null) { final encode = jsonEncode(resNew.value); + print(encode); // print('returned from bew'); - return (jsonDecode(encode) as List).map((e) => SentenceModel.fromJson(e)).toList(); - // print('returned from bew'); - // return Right(jsonDecode(data)); + return List.from(jsonDecode(encode)); } - final refOld = _database.child('Frases/$userId/$language/$type'); + final refOld = _database.ref().child('Frases/$userId/$language/$type'); final resOld = await refOld.get(); if (resOld.exists && resOld.value != null) { - final data = resOld.children.first.value as String; - return (jsonDecode(data) as List).map((e) => SentenceModel.fromJson(e)).toList(); + final encode = jsonEncode(resOld.value); + // print('returned from bew'); + return List.from(jsonDecode(encode)); } return const []; @@ -134,9 +146,11 @@ class ServerService implements ServerRepository { @override Future updateGroup(String userId, String language, int index, {required Map data}) async { - final ref = _database.child('$userId/Grupos/$language/$index'); + final ref = _database.ref().child('$userId/Grupos/$language/$index'); + final group = await ref.get(); try { + if (!group.exists) throw Exception('Group does not exist'); await ref.update(data); return const Right(null); } catch (e) { @@ -146,9 +160,11 @@ class ServerService implements ServerRepository { @override Future updatePictogram(String userId, String language, int index, {required Map data}) async { - final ref = _database.child('$userId/Pictos/$language/$index'); + final ref = _database.ref().child('$userId/Pictos/$language/$index'); + final picto = await ref.get(); try { + if (!picto.exists) throw Exception('Picto does not exist'); await ref.update(data); return const Right(null); } catch (e) { @@ -156,11 +172,36 @@ class ServerService implements ServerRepository { } } + @override + Future updateUserLastConnectionTime({ + required String userId, + required int time, + }) async { + final ref = _database.ref().child('$userId/settings/data'); + + final data = await ref.get(); + + try { + if (!data.exists) throw Exception('User does not exist'); + await ref.update({'lastConnection': time}); + return const Right(null); + } catch (e) { + return Left(e.toString()); + } + } + @override Future uploadGroups(String userId, String language, {required List> data}) async { - final ref = _database.child('$userId/Grupos/$language'); + final ref = _database.ref().child('$userId/groups/$language'); try { - await ref.set(data); + if (data.isEmpty) throw Exception('Data is empty'); + final mapData = Map.fromIterables(data.map((e) => e["id"]), data); + bool hasGroups = (await _database.ref().child('$userId/groups').get()).exists; + if (!hasGroups) { + await _database.ref().child('$userId/groups').set({language: mapData}); + } else { + await ref.set(mapData); + } return const Right(null); } catch (e) { return Left(e.toString()); @@ -169,10 +210,12 @@ class ServerService implements ServerRepository { @override Future uploadPictograms(String userId, String language, {required List> data}) async { - final ref = _database.child('$userId/Pictos/$language'); + final ref = _database.ref().child('$userId/pictos/$language'); try { - await ref.set(data); + if (data.isEmpty) throw Exception('Data is empty'); + final mapData = Map.fromIterables(data.map((e) => e["id"]), data); + await ref.set(mapData); return const Right(null); } catch (e) { return Left(e.toString()); @@ -181,9 +224,10 @@ class ServerService implements ServerRepository { @override Future uploadUserInformation(String userId, Map data) async { - final ref = _database.child('$userId/Usuarios/'); + final ref = _database.ref().child(userId); try { + if (data.isEmpty) throw Exception('Data is empty'); await ref.update(data); return const Right(null); } catch (e) { @@ -192,14 +236,11 @@ class ServerService implements ServerRepository { } @override - Future uploadUserPicture(String userId, String picture, String photoUrl) async { - final ref = _database.child('$userId/Usuarios/Avatar/'); - + Future uploadUserPicture(String userId, AssetsImage image) async { + final ref = _database.ref().child('$userId/settings/data/avatar'); try { - await ref.update({ - 'name': photoUrl, - 'urlFoto': picture, - }); + if (image.asset.trim().isEmpty) throw Exception('Image is empty'); + await ref.update(image.toMap()); return const Right(null); } catch (e) { return Left(e.toString()); @@ -208,9 +249,10 @@ class ServerService implements ServerRepository { @override Future uploadUserSentences(String userId, String language, String type, List> data) async { - final ref = _database.child('$userId/Frases/$language/$type'); + final ref = _database.ref().child('$userId/Frases/$language/$type'); try { + if (data.isEmpty) throw Exception('Data is empty'); await ref.set(data); return const Right(null); } catch (e) { @@ -219,48 +261,516 @@ class ServerService implements ServerRepository { } @override - Future getMostUsedSentences(String userId, String languageCode) async { - final uri = Uri.parse( - 'https://us-central1-ottaaproject-flutter.cloudfunctions.net/onReqFunc', - ); + Future getMostUsedSentences(String userId, String languageCode, [CancelToken? cancelToken]) async { //todo: get the language here after talking with Emir final body = { 'UserID': userId, 'Language': languageCode, }; - final res = await http.post( - uri, - body: jsonEncode(body), - headers: {"Content-Type": "application/json"}, - ); - if (res.statusCode == 200) { - final data = jsonDecode(res.body) as Map; - return Right(data); - } else { - return Left("an error occurred"); //TODO: Handle the main error + try { + final res = await _dio.post( + '/onReqFunc', + data: jsonEncode(body), + cancelToken: cancelToken, + options: Options( + contentType: 'application/json', + ), + ); + + if (res.statusCode == 200) { + final data = jsonDecode(res.data) as Map; + return Right(data); + } else { + return const Left("an error occurred"); //TODO: Handle the main error + } + } catch (e) { + return Left(e.toString()); } } @override - Future getPictogramsStatistics(String userId, String languageCode) async { - final uri = Uri.parse('https://us-central1-ottaaproject-flutter.cloudfunctions.net/readFile'); + Future getPictogramsStatistics(String userId, String languageCode, [CancelToken? cancelToken]) async { final body = { 'UserID': userId, //todo: add here the language too - 'Language': 'ES-AR', + 'Language': 'es_AR', }; - final res = await http.post( - uri, - body: jsonEncode(body), - headers: {"Content-Type": "application/json"}, + try { + final res = await _dio.post( + '/readFile', + data: jsonEncode(body), + cancelToken: cancelToken, + options: Options( + headers: {"Content-Type": "application/json"}, + ), + ); + + if (res.statusCode == 200) { + final data = jsonDecode(res.data) as Map; + + return Right(data); + } else { + return const Left("an error occurred"); //TODO: Handle the main error + } + } catch (e) { + return Left(e.toString()); + } + } + + @override + Future updateUserSettings({ + required Map data, + required String userId, + }) async { + final ref = _database.ref().child('$userId/settings/data/'); + await ref.update(data); + } + + @override + Future uploadUserImage({ + required String path, + required String name, + required String userId, + }) async { + Reference ref = _storage.ref().child('userProfilePics').child('$name.jpg'); + final metadata = SettableMetadata( + contentType: 'image/jpeg', + customMetadata: {'picked-file-path': path}, + ); + + var uploadTask = await ref.putFile(File(path), metadata); + + return await uploadTask.ref.getDownloadURL(); + } + + @override + Future uploadOtherImages({ + required String imagePath, + required String directoryPath, + required String name, + required String userId, + }) async { + Reference ref = _storage.ref().child(directoryPath).child('$name.jpg'); + final metadata = SettableMetadata( + contentType: 'image/jpeg', + customMetadata: {'picked-file-path': imagePath}, ); - if (res.statusCode == 200) { - final data = jsonDecode(res.body) as Map; - return Right(data); + var uploadTask = await ref.putFile(File(imagePath), metadata); + + return await uploadTask.ref.getDownloadURL(); + } + + @override + Future getConnectedUsers({required String userId}) async { + final ref = _database.ref().child('$userId/users'); //TODO: Change this to the real path + final res = await ref.get(); + + if (res.exists && res.value != null) { + return Right(Map.from(res.value as Map)); + } else { + return const Left("No Data found"); //TODO: Handle the main error + } + } + + @override + Future fetchConnectedUserData({required String userId}) async { + final ref = _database.ref().child(userId); //TODO: Change to real path + final res = await ref.get(); + + if (res.exists && res.value != null) { + return Right(Map.from(res.value as Map)); + } else { + return const Left("No Data found"); //TODO: Handle the main error + } + } + + @override + Future removeCurrentUser({required String userId, required String careGiverId}) async { + await _database.ref().child('$careGiverId/users/$userId').remove(); + } + + @override + Future setShortcutsForUser({required ShortcutsModel shortcuts, required String userId}) async { + final ref = _database.ref().child('$userId/settings/layout/shortcuts/'); + final shortcutData = await ref.get(); + try { + if (!shortcutData.exists) throw Exception('user does not exist'); + final data = shortcuts.toMap(); + await ref.update(data); + return const Right(null); + } catch (e) { + return Left(e.toString()); + } + } + + @override + Future fetchShortcutsForUser({ + required String userId, + }) async { + final ref = _database.ref().child('$userId/settings/layout/shortcuts'); + + final res = await ref.get(); + + if (res.exists && res.value != null) { + return Right(Map.from(res.value as Map)); + } else { + return const Left("No Data found"); //TODO: Handle the main error + } + } + + @override + Future getEmailToken(String ownEmail, String email, [CancelToken? cancelToken]) async { + final body = { + 'src': ownEmail, + 'dst': email, + }; + + try { + final res = await _dio.post( + '/linkUserRequest', + data: jsonEncode(body), + cancelToken: cancelToken, + ); + + final data = res.data as Map; + + if (res.statusCode == 200) { + return Right(data); + } else { + return Left(data["code"] ?? res.statusCode.toString()); //TODO: Handle the main error + } + } catch (e) { + return Left(e.toString()); + } + } + + @override + Future verifyEmailToken(String ownEmail, String email, String token, [CancelToken? cancelToken]) async { + final body = { + 'src': ownEmail, + 'dst': email, + 'token': token, + }; + + try { + final res = await _dio.post( + "/linkUserConfirm", + data: jsonEncode(body), + cancelToken: cancelToken, + options: Options( + headers: {"Content-Type": "application/json"}, + ), + ); + + final data = res.data as Map; + if (res.statusCode == 200) { + return Right(data); + } else { + return Left(data["code"] ?? res.statusMessage); //TODO: Handle the main error + } + } catch (e) { + return Left(e.toString()); + } + } + + @override + Future updateUserData({ + required Map data, + required String userId, + }) async { + final ref = _database.ref().child('$userId/settings/data/'); + + await ref.update(data); + } + + @override + Future getProfileById({required String id}) async { + final ref = _database.ref().child(id); + + final res = await ref.get(); + + if (res.exists && res.value != null) { + return Right(Map.from(res.value as Map)); + } else { + return const Left("No Data found"); //TODO: Handle the main error + } + } + + @override + Future getDefaultGroups(String languageCode) async { + final ref = _database.ref().child('default/groups/$languageCode'); + final DataSnapshot res = await ref.get(); + + if (res.exists && res.value != null) { + return Right(Map.from(res.value as Map)); + } + + return const Left("no_data_found"); + } + + @override + Future fetchUserGroups({required String languageCode, required String userId}) async { + final ref = _database.ref().child('$userId/groups/$languageCode'); + final DataSnapshot res = await ref.get(); + + if (res.exists && res.value != null) { + return Right(Map.from(res.value as Map)); + } + + return const Left("no_data_found"); + } + + @override + Future getDefaultPictos(String languageCode) async { + final ref = _database.ref().child('default/pictos/$languageCode'); + final res = await ref.get(); + + if (res.exists && res.value != null) { + return Right(Map.from(res.value as Map)); + } + + return const Left("no_data_found"); + } + + @override + Future fetchUserPictos({required String languageCode, required String userId}) async { + final ref = _database.ref().child('$userId/pictos/$languageCode'); + final res = await ref.get(); + + if (res.exists && res.value != null) { + return Right(Map.from(res.value as Map)); + } + + return const Left("no_data_found"); + } + + @override + Future updateUserType({required String id, required UserType userType}) async { + final ref = _database.ref().child("$id/type"); + + await ref.set(userType.name); + } + + @override + Future?> createPictoGroupData({ + required String userId, + required String language, + required BoardDataType type, + required Map data, + CancelToken? cancelToken, + }) async { + final body = {"uid": userId, "lang": language, "type": type.name, "data": data}; + try { + final res = await _dio.post( + '/newCustomData', + data: jsonEncode(body), + cancelToken: cancelToken, + ); + + return res.data as Map; + } catch (e) { + return { + "error": e.toString(), + }; + } + } + + @override + Future updateDevicesId({required String userId, required DeviceToken deviceToken}) async { + final ref = _database.ref().child("$userId/settings/devices"); + + final currentList = (await ref.get()).value; + + List list = List.from((currentList ?? []) as List); + + final existsElement = list.firstWhereOrNull((element) => element != null ? element["deviceToken"] == deviceToken.deviceToken : false); + + final index = list.indexOf(existsElement); + + if (index == -1) { + list.add(deviceToken.toMap()); + } else { + existsElement["lastUsage"] = DateTime.now().millisecondsSinceEpoch; + list[index] = deviceToken.toMap(); + } + list = list.where((element) => element != null).toList(); + + await ref.set(list); + } + + @override + Future learnPictograms({ + required String uid, + required String language, + required String model, + required List> tokens, + CancelToken? cancelToken, + }) async { + final body = { + "uid": uid, + "language": language, + "model": model, + "tokens": tokens, + }; + + try { + final res = await _dio.post( + '/speako/users/learn', + data: jsonEncode(body), + cancelToken: cancelToken, + ); + + return Right(jsonDecode(res.data) as Map); + } catch (e) { + return const Left("learn_error"); + } + } + + @override + Future predictPictogram({ + required String sentence, + required String uid, + required String language, + required String model, + required List groups, + required Map> tags, + bool reduced = false, + int limit = 10, + int chunk = 4, + CancelToken? cancelToken, + }) async { + String url = '/speako/predict'; + + final body = { + "sentence": sentence, + "uid": uid, + "language": language, + "model": model, + "groups": groups, + "tags": tags, + }; + + try { + final res = await _dio.post( + url, + data: jsonEncode(body), + queryParameters: { + "limit": limit, + "chunk": chunk, + if (reduced) "reduced": true, + }, + options: Options( + contentType: Headers.jsonContentType, + ), + cancelToken: cancelToken, + ); + + return Right(res.data); + } catch (e) { + return const Left("learn_error"); + } + } + + @override + Future generatePhraseGPT({required String prompt, required int maxTokens, double temperature = 0}) async { + try { + final response = await _functions.httpsCallable("openai").call>({ + "model": "text-davinci-003", + "prompt": prompt, + "temperature": temperature, + "max_tokens": maxTokens, + }); + + if (response.data["choices"] == null || response.data["choices"][0] == null) { + return const Left("no_data_found"); + } + return Right(response.data["choices"][0]["text"].toString()); + } catch (e) { + return Left(e.toString()); + } + } + + @override + Future updateLanguageSettings({required Map map, required String userId}) async { + final ref = _database.ref().child("$userId/settings/language/"); + + ref.set(map); + } + + @override + Future updateVoiceAndSubtitleSettings({required Map map, required String userId}) async { + final ref = _database.ref().child("$userId/settings/tts/"); + + ref.update(map); + } + + @override + Future updateAccessibilitySettings({required Map map, required String userId}) async { + final ref = _database.ref().child("$userId/settings/accessibility/"); + + ref.update(map); + } + + @override + Future updateMainSettings({required Map map, required String userId}) async { + final ref = _database.ref().child("$userId/settings/layout/"); + + ref.update(map); + } + + @override + Future deleteTheAccount({required String userId}) async { + try { + final response = await _functions.httpsCallable("removeUserData").call>({"uid": userId}); + print(response.toString()); + if (response.data["code"] == null || response.data['message'] == null) { + return false; + } + return true; + } catch (e) { + return false; + } + } + + @override + Future fetchUserSettings({required String userId}) async { + final ref = _database.ref().child('$userId/settings/'); + final res = await ref.get(); + + if (res.exists && res.value != null) { + return Right(Map.from(res.value as Map)); + } + return const Left("no_data_found"); + } + + @override + Future>> fetchPhotosFromGlobalSymbols({required String searchText, required String languageCode}) async { + String languageFormat = languageCode == 'en' ? '639-3' : '639-1'; + String language = languageCode == 'en' ? 'eng' : languageCode; + String url = 'https://globalsymbols.com/api/v1/labels/search?query=${searchText.replaceAll(' ', '+')}&language=$language&language_iso_format=$languageFormat&limit=60'; + http.Response response = await http.get( + Uri.parse(url), + headers: {"Accept": "application/json"}, + ); + // print(url); + if (response.statusCode == 200) { + var data = jsonDecode(response.body); + print(data.toString()); + final List res = (jsonDecode(response.body) as List).map((e) => ArsaacDataModel.fromJson(e)).toList(); + print(res.length); + print(res.last.text); + print(res.first.text); + // print(data['symbols'][0]['name']); + // final res = (jsonDecode(response.body) as List).map((e) => SearchModel.fromJson(e)).toList(); + // SearchModel searchModel = SearchModel.fromJson(jsonDecode(response.body)); + // print(searchModel.itemCount); + // print(searchModel.symbols[0].name); + // print(jsonDecode(response.body)); + return Right(res); } else { - return Left("an error occurred"); //TODO: Handle the main error + return const Left('Error While loading'); } } } diff --git a/lib/application/service/service.dart b/lib/application/service/service.dart new file mode 100644 index 00000000..13630c86 --- /dev/null +++ b/lib/application/service/service.dart @@ -0,0 +1,17 @@ +library service; + +export 'about_service.dart'; +export 'auth_service.dart'; +export 'customise_service.dart'; +export 'groups_service.dart'; +export 'hive_database.dart'; +export 'local_storage_service.dart'; +export 'remote_storage_service.dart'; +export 'pictograms_service.dart'; +export 'profile_services.dart'; +export 'report_service.dart'; +export 'sentences_service.dart'; +export 'server_service.dart'; +export 'tts_service.dart'; + +export 'service.dart'; diff --git a/lib/application/service/sql_database.dart b/lib/application/service/sql_database.dart deleted file mode 100644 index 3fc37ff0..00000000 --- a/lib/application/service/sql_database.dart +++ /dev/null @@ -1,106 +0,0 @@ -import 'dart:async'; - -import 'package:ottaa_project_flutter/core/models/user_model.dart'; -import 'package:ottaa_project_flutter/core/repositories/local_database_repository.dart'; -import 'package:sqflite/sqflite.dart'; - -import 'package:path/path.dart'; - -class SqlDatabase implements LocalDatabaseRepository { - Database? _database; - - @override - UserModel? user; - - Future get database async { - if (_database != null) return _database!; - - await init(); - return _database!; - } - - @override - Future init() async { - _database = await initDB(); - } - - Future initDB() async { - return await openDatabase( - join(await getDatabasesPath(), 'ottaa_database.db'), - version: 2, - onConfigure: _onConfigure, - onUpgrade: _onUpgrade, - onDowngrade: _onUpgrade, - onCreate: _onCreate, - onOpen: (db) async { - _database = db; - user = await getUser(); - }, - ); - } - - Future _onConfigure(db) async { - await db.execute('PRAGMA foreign_keys = ON'); - } - - FutureOr _onCreate(Database db, int version) async { - await db.execute(''' - CREATE TABLE IF NOT EXISTS user ( - id TEXT PRIMARY KEY, - name TEXT, - email TEXT, - photoUrl TEXT, - birthdate INTEGER, - gender TEXT, - language TEXT, - isFirstTime INTEGER, - avatar TEXT - ) - '''); - } - - Future _onUpgrade(Database db, int oldVersion, int newVersion) async { - await db.transaction((txn) { - return _drop(txn, deleteUser: newVersion % 2 == 0); - }); - - await _onCreate(db, newVersion); - } - - Future _drop(Transaction db, {bool deleteUser = false}) async { - if (deleteUser) db.execute('''DROP TABLE IF EXISTS user'''); - } - - @override - Future close() async { - final db = await database; - await db.transaction((txn) => _drop(txn, deleteUser: true)); - } - - @override - Future setUser(UserModel user) async { - final db = await database; - await db.delete('user'); - await db.insert('user', user.toMap()); - - this.user = user; - } - - @override - Future getUser() async { - final db = await database; - final List> maps = await db.query('user'); - - if (maps.isEmpty) return null; - - return UserModel.fromJson(maps.first); - } - - @override - Future deleteUser() async { - final db = await database; - await db.delete('user'); - - user = null; - } -} diff --git a/lib/application/service/tts_service.dart b/lib/application/service/tts_service.dart index 7eb6dc01..55acd753 100644 --- a/lib/application/service/tts_service.dart +++ b/lib/application/service/tts_service.dart @@ -1,39 +1,135 @@ +import 'package:flutter/foundation.dart'; import 'package:flutter_tts/flutter_tts.dart'; +import 'package:injectable/injectable.dart'; +import 'package:ottaa_project_flutter/application/common/i18n.dart'; +import 'package:ottaa_project_flutter/core/models/voices_model.dart'; import 'package:ottaa_project_flutter/core/repositories/tts_repository.dart'; +import 'package:universal_io/io.dart'; +@Singleton(as: TTSRepository) class TTSService extends TTSRepository { - final tts = FlutterTts(); + FlutterTts _tts = FlutterTts(); - String language = 'es-AR'; //TODO: Detect + @override + FlutterTts get tts => _tts; + + final I18N _i18n; + + @override + String language = 'es_AR'; + @override List availableTTS = []; + @override + String voice = ''; + @override + String name = ''; + @override + String locale = ''; + + @override bool customTTSEnable = false; - double speechRate = 0.4; + @override + double speechRate = Platform.isIOS ? .5 : .8; + @override double pitch = 1.0; - TTSService() { + List voices = []; + + TTSService(this._i18n, {FlutterTts? tts}) { + if (tts != null) { + _tts = tts; + } initTTS(); } + @FactoryMethod() + factory TTSService.create(I18N i18n) => TTSService(i18n); + @override Future speak(String text) async { if (text.isNotEmpty) { + // tts.cancelHandler?.call(); + language = _i18n.currentLocale.toString(); + final split = language.split('_'); + language = '${split[0]}-${split[1]}'; if (customTTSEnable) { + language = _i18n.currentLocale.toString(); + await tts.setLanguage(language); + await tts.setVolume(1.0); await tts.setSpeechRate(speechRate); await tts.setPitch(pitch); } - + await tts.setVoice({"name": name, "locale": locale}); await tts.speak(text); + // await tts.awaitSpeakCompletion(false); } } Future initTTS() async { + if (Platform.isIOS) { + await tts.setIosAudioCategory( + IosTextToSpeechAudioCategory.ambient, + [ + IosTextToSpeechAudioCategoryOptions.allowBluetooth, + IosTextToSpeechAudioCategoryOptions.allowBluetoothA2DP, + IosTextToSpeechAudioCategoryOptions.mixWithOthers, + ], + IosTextToSpeechAudioMode.voicePrompt, + ); + } + language = _i18n.currentLocale.toString(); + final split = language.split('_'); + language = '${split[0]}-${split[1]}'; + voices = await fetchVoices(); await tts.setPitch(pitch); await tts.setSpeechRate(speechRate); await tts.setVolume(1.0); await tts.setLanguage(language); await tts.awaitSpeakCompletion(true); + if (!kIsWeb) { + await tts.awaitSynthCompletion(true); + } availableTTS = await tts.getLanguages; } + + @override + Future changeVoiceSpeed(double speed) async { + speechRate = speed; + } + + @override + Future> fetchVoices() async { + final voices = await tts.getVoices; + + return voices.map((e) => Voices.fromJson(Map.from(e))).toList(); + } + + @override + Future changeCustomTTs(bool value) async { + customTTSEnable = value; + } + + @override + Future changeTTSVoice(String voice) async { + for (var element in voices) { + if (element.name == voice) { + locale = element.locale; + name = element.name; + print("here: ${element.name} == $voice, "); + print(language); + print(element.locale); + } + } + } + + Future pause() async { + await tts.pause(); + } + + @override + Future ttsStop() async { + await tts.stop(); + } } diff --git a/lib/application/service/user_settings_service.dart b/lib/application/service/user_settings_service.dart new file mode 100644 index 00000000..1c7fd66f --- /dev/null +++ b/lib/application/service/user_settings_service.dart @@ -0,0 +1,35 @@ +import 'package:injectable/injectable.dart'; +import 'package:ottaa_project_flutter/core/repositories/server_repository.dart'; +import 'package:ottaa_project_flutter/core/repositories/user_settings_repository.dart'; + +@Singleton(as: UserSettingRepository) +class UserSettingsService extends UserSettingRepository { + final ServerRepository _serverRepository; + + UserSettingsService(this._serverRepository); + + @override + Future updateLanguageSettings({required Map map, required String userId}) async { + _serverRepository.updateLanguageSettings(map: map, userId: userId); + } + + @override + Future updateVoiceAndSubtitleSettings({required Map map, required String userId}) async { + _serverRepository.updateVoiceAndSubtitleSettings(map: map, userId: userId); + } + + @override + Future updateAccessibilitySettings({required Map map, required String userId}) async { + _serverRepository.updateAccessibilitySettings(map: map, userId: userId); + } + + @override + Future updateMainSettings({required Map map, required String userId}) async { + _serverRepository.updateMainSettings(map: map, userId: userId); + } + + @override + Future fetchUserSettings({required String userId}) async { + return _serverRepository.fetchUserSettings(userId: userId); + } +} diff --git a/lib/application/theme/app_theme_data.dart b/lib/application/theme/app_theme_data.dart index 4c230709..923d0b65 100644 --- a/lib/application/theme/app_theme_data.dart +++ b/lib/application/theme/app_theme_data.dart @@ -8,7 +8,37 @@ class AppThemeData { "brightness": "light", "buttonTheme": { "alignedDropdown": false, - "colorScheme": {"background": "#fffffbff", "brightness": "light", "error": "#ffba1a1a", "errorContainer": "#ffffdad6", "inversePrimary": "#ffffb691", "inverseSurface": "#ff362f2c", "onBackground": "#ff201a18", "onError": "#ffffffff", "onErrorContainer": "#ff410002", "onInverseSurface": "#fffbeee9", "onPrimary": "#ffffffff", "onPrimaryContainer": "#ff341100", "onSecondary": "#ffffffff", "onSecondaryContainer": "#ff2c160b", "onSurface": "#ff201a18", "onSurfaceVariant": "#ff52443d", "onTertiary": "#ffffffff", "onTertiaryContainer": "#ff1f1c00", "outline": "#ff85736c", "primary": "#ffff8138", "primaryContainer": "#ffffdbcb", "secondary": "#ff765849", "secondaryContainer": "#ffffdbcb", "shadow": "#ff000000", "surface": "#fffffbff", "surfaceTint": "#ff9f4200", "surfaceVariant": "#fff4ded5", "tertiary": "#ff656031", "tertiaryContainer": "#ffece4aa"}, + "colorScheme": { + "background": "#fffffbff", + "brightness": "light", + "error": "#ffba1a1a", + "errorContainer": "#ffffdad6", + "inversePrimary": "#ffffb691", + "inverseSurface": "#ff362f2c", + "onBackground": "#ff201a18", + "onError": "#ffffffff", + "onErrorContainer": "#ff410002", + "onInverseSurface": "#fffbeee9", + "onPrimary": "#ffffffff", + "onPrimaryContainer": "#ff341100", + "onSecondary": "#ffffffff", + "onSecondaryContainer": "#ff2c160b", + "onSurface": "#ff201a18", + "onSurfaceVariant": "#ff52443d", + "onTertiary": "#ffffffff", + "onTertiaryContainer": "#ff1f1c00", + "outline": "#ff85736c", + "primary": "#ffff8138", + "primaryContainer": "#ffffdbcb", + "secondary": "#ff765849", + "secondaryContainer": "#ffffdbcb", + "shadow": "#ff000000", + "surface": "#fffffbff", + "surfaceTint": "#ff9f4200", + "surfaceVariant": "#fff4ded5", + "tertiary": "#ff656031", + "tertiaryContainer": "#ffece4aa" + }, "height": 36, "layoutBehavior": "padded", "minWidth": 88, @@ -28,7 +58,37 @@ class AppThemeData { }, "canvasColor": "#fffffbff", "cardColor": "#fffffbff", - "colorScheme": {"background": "#fffffbff", "brightness": "light", "error": "#ffba1a1a", "errorContainer": "#ffffdad6", "inversePrimary": "#ffffb691", "inverseSurface": "#ff362f2c", "onBackground": "#ff201a18", "onError": "#ffffffff", "onErrorContainer": "#ff410002", "onInverseSurface": "#fffbeee9", "onPrimary": "#ffffffff", "onPrimaryContainer": "#ff341100", "onSecondary": "#ffffffff", "onSecondaryContainer": "#ff2c160b", "onSurface": "#ff201a18", "onSurfaceVariant": "#ff52443d", "onTertiary": "#ffffffff", "onTertiaryContainer": "#ff1f1c00", "outline": "#ff85736c", "primary": "#ffff8138", "primaryContainer": "#ffffdbcb", "secondary": "#ff765849", "secondaryContainer": "#ffffdbcb", "shadow": "#ff000000", "surface": "#fffffbff", "surfaceTint": "#ff9f4200", "surfaceVariant": "#fff4ded5", "tertiary": "#ff656031", "tertiaryContainer": "#ffece4aa"}, + "colorScheme": { + "background": "#fffffbff", + "brightness": "light", + "error": "#ffba1a1a", + "errorContainer": "#ffffdad6", + "inversePrimary": "#ffffb691", + "inverseSurface": "#ff362f2c", + "onBackground": "#ff201a18", + "onError": "#ffffffff", + "onErrorContainer": "#ff410002", + "onInverseSurface": "#fffbeee9", + "onPrimary": "#ffffffff", + "onPrimaryContainer": "#ff341100", + "onSecondary": "#ffffffff", + "onSecondaryContainer": "#ff2c160b", + "onSurface": "#ff201a18", + "onSurfaceVariant": "#ff52443d", + "onTertiary": "#ffffffff", + "onTertiaryContainer": "#ff1f1c00", + "outline": "#ff85736c", + "primary": "#ffff8138", + "primaryContainer": "#ffffdbcb", + "secondary": "#ff765849", + "secondaryContainer": "#ffffdbcb", + "shadow": "#ff000000", + "surface": "#fffffbff", + "surfaceTint": "#ff9f4200", + "surfaceVariant": "#fff4ded5", + "tertiary": "#ff656031", + "tertiaryContainer": "#ffece4aa" + }, "dialogBackgroundColor": "#fffffbff", "disabledColor": "#61000000", "dividerColor": "#1f201a18", @@ -39,7 +99,14 @@ class AppThemeData { "hoverColor": "#0a000000", "iconTheme": {"color": "#dd000000"}, "indicatorColor": "#ffffffff", - "inputDecorationTheme": {"alignLabelWithHint": false, "filled": false, "floatingLabelAlignment": "start", "floatingLabelBehavior": "auto", "isCollapsed": false, "isDense": false}, + "inputDecorationTheme": { + "alignLabelWithHint": false, + "filled": false, + "floatingLabelAlignment": "start", + "floatingLabelBehavior": "auto", + "isCollapsed": false, + "isDense": false + }, "materialTapTargetSize": "shrinkWrap", "platform": "linux", "primaryColor": "#ffff8138", @@ -51,7 +118,13 @@ class AppThemeData { "color": "#dd000000", "decoration": "none", "fontFamily": "Roboto", - "fontFamilyFallback": ["Ubuntu", "Cantarell", "DejaVu Sans", "Liberation Sans", "Arial"], + "fontFamilyFallback": [ + "Ubuntu", + "Cantarell", + "DejaVu Sans", + "Liberation Sans", + "Arial" + ], "fontWeight": "w400", "fontSize": 16, "inherit": true, @@ -62,7 +135,13 @@ class AppThemeData { "color": "#dd000000", "decoration": "none", "fontFamily": "Roboto", - "fontFamilyFallback": ["Ubuntu", "Cantarell", "DejaVu Sans", "Liberation Sans", "Arial"], + "fontFamilyFallback": [ + "Ubuntu", + "Cantarell", + "DejaVu Sans", + "Liberation Sans", + "Arial" + ], "fontWeight": "w400", "fontSize": 14, "inherit": true, @@ -73,7 +152,13 @@ class AppThemeData { "color": "#8a000000", "decoration": "none", "fontFamily": "Roboto", - "fontFamilyFallback": ["Ubuntu", "Cantarell", "DejaVu Sans", "Liberation Sans", "Arial"], + "fontFamilyFallback": [ + "Ubuntu", + "Cantarell", + "DejaVu Sans", + "Liberation Sans", + "Arial" + ], "fontWeight": "w400", "fontSize": 12, "inherit": true, @@ -84,7 +169,13 @@ class AppThemeData { "color": "#8a000000", "decoration": "none", "fontFamily": "Roboto", - "fontFamilyFallback": ["Ubuntu", "Cantarell", "DejaVu Sans", "Liberation Sans", "Arial"], + "fontFamilyFallback": [ + "Ubuntu", + "Cantarell", + "DejaVu Sans", + "Liberation Sans", + "Arial" + ], "fontWeight": "w300", "fontSize": 96, "inherit": true, @@ -95,7 +186,13 @@ class AppThemeData { "color": "#8a000000", "decoration": "none", "fontFamily": "Roboto", - "fontFamilyFallback": ["Ubuntu", "Cantarell", "DejaVu Sans", "Liberation Sans", "Arial"], + "fontFamilyFallback": [ + "Ubuntu", + "Cantarell", + "DejaVu Sans", + "Liberation Sans", + "Arial" + ], "fontWeight": "w300", "fontSize": 60, "inherit": true, @@ -106,7 +203,13 @@ class AppThemeData { "color": "#8a000000", "decoration": "none", "fontFamily": "Roboto", - "fontFamilyFallback": ["Ubuntu", "Cantarell", "DejaVu Sans", "Liberation Sans", "Arial"], + "fontFamilyFallback": [ + "Ubuntu", + "Cantarell", + "DejaVu Sans", + "Liberation Sans", + "Arial" + ], "fontWeight": "w400", "fontSize": 48, "inherit": true, @@ -117,7 +220,13 @@ class AppThemeData { "color": "#8a000000", "decoration": "none", "fontFamily": "Roboto", - "fontFamilyFallback": ["Ubuntu", "Cantarell", "DejaVu Sans", "Liberation Sans", "Arial"], + "fontFamilyFallback": [ + "Ubuntu", + "Cantarell", + "DejaVu Sans", + "Liberation Sans", + "Arial" + ], "fontWeight": "w400", "fontSize": 40, "inherit": true, @@ -128,7 +237,13 @@ class AppThemeData { "color": "#8a000000", "decoration": "none", "fontFamily": "Roboto", - "fontFamilyFallback": ["Ubuntu", "Cantarell", "DejaVu Sans", "Liberation Sans", "Arial"], + "fontFamilyFallback": [ + "Ubuntu", + "Cantarell", + "DejaVu Sans", + "Liberation Sans", + "Arial" + ], "fontWeight": "w400", "fontSize": 34, "inherit": true, @@ -139,7 +254,13 @@ class AppThemeData { "color": "#dd000000", "decoration": "none", "fontFamily": "Roboto", - "fontFamilyFallback": ["Ubuntu", "Cantarell", "DejaVu Sans", "Liberation Sans", "Arial"], + "fontFamilyFallback": [ + "Ubuntu", + "Cantarell", + "DejaVu Sans", + "Liberation Sans", + "Arial" + ], "fontWeight": "w400", "fontSize": 24, "inherit": true, @@ -150,7 +271,13 @@ class AppThemeData { "color": "#dd000000", "decoration": "none", "fontFamily": "Roboto", - "fontFamilyFallback": ["Ubuntu", "Cantarell", "DejaVu Sans", "Liberation Sans", "Arial"], + "fontFamilyFallback": [ + "Ubuntu", + "Cantarell", + "DejaVu Sans", + "Liberation Sans", + "Arial" + ], "fontWeight": "w500", "fontSize": 14, "inherit": true, @@ -161,7 +288,13 @@ class AppThemeData { "color": "#ff000000", "decoration": "none", "fontFamily": "Roboto", - "fontFamilyFallback": ["Ubuntu", "Cantarell", "DejaVu Sans", "Liberation Sans", "Arial"], + "fontFamilyFallback": [ + "Ubuntu", + "Cantarell", + "DejaVu Sans", + "Liberation Sans", + "Arial" + ], "fontWeight": "w400", "fontSize": 11, "inherit": true, @@ -172,7 +305,13 @@ class AppThemeData { "color": "#ff000000", "decoration": "none", "fontFamily": "Roboto", - "fontFamilyFallback": ["Ubuntu", "Cantarell", "DejaVu Sans", "Liberation Sans", "Arial"], + "fontFamilyFallback": [ + "Ubuntu", + "Cantarell", + "DejaVu Sans", + "Liberation Sans", + "Arial" + ], "fontWeight": "w400", "fontSize": 10, "inherit": true, @@ -183,7 +322,13 @@ class AppThemeData { "color": "#dd000000", "decoration": "none", "fontFamily": "Roboto", - "fontFamilyFallback": ["Ubuntu", "Cantarell", "DejaVu Sans", "Liberation Sans", "Arial"], + "fontFamilyFallback": [ + "Ubuntu", + "Cantarell", + "DejaVu Sans", + "Liberation Sans", + "Arial" + ], "fontWeight": "w500", "fontSize": 20, "inherit": true, @@ -194,7 +339,13 @@ class AppThemeData { "color": "#dd000000", "decoration": "none", "fontFamily": "Roboto", - "fontFamilyFallback": ["Ubuntu", "Cantarell", "DejaVu Sans", "Liberation Sans", "Arial"], + "fontFamilyFallback": [ + "Ubuntu", + "Cantarell", + "DejaVu Sans", + "Liberation Sans", + "Arial" + ], "fontWeight": "w400", "fontSize": 16, "inherit": true, @@ -205,7 +356,13 @@ class AppThemeData { "color": "#ff000000", "decoration": "none", "fontFamily": "Roboto", - "fontFamilyFallback": ["Ubuntu", "Cantarell", "DejaVu Sans", "Liberation Sans", "Arial"], + "fontFamilyFallback": [ + "Ubuntu", + "Cantarell", + "DejaVu Sans", + "Liberation Sans", + "Arial" + ], "fontWeight": "w500", "fontSize": 14, "inherit": true, @@ -224,7 +381,13 @@ class AppThemeData { "color": "#dd000000", "decoration": "none", "fontFamily": "Roboto", - "fontFamilyFallback": ["Ubuntu", "Cantarell", "DejaVu Sans", "Liberation Sans", "Arial"], + "fontFamilyFallback": [ + "Ubuntu", + "Cantarell", + "DejaVu Sans", + "Liberation Sans", + "Arial" + ], "fontWeight": "w400", "fontSize": 16, "inherit": true, @@ -235,7 +398,13 @@ class AppThemeData { "color": "#dd000000", "decoration": "none", "fontFamily": "Roboto", - "fontFamilyFallback": ["Ubuntu", "Cantarell", "DejaVu Sans", "Liberation Sans", "Arial"], + "fontFamilyFallback": [ + "Ubuntu", + "Cantarell", + "DejaVu Sans", + "Liberation Sans", + "Arial" + ], "fontWeight": "w400", "fontSize": 14, "inherit": true, @@ -246,7 +415,13 @@ class AppThemeData { "color": "#8a000000", "decoration": "none", "fontFamily": "Roboto", - "fontFamilyFallback": ["Ubuntu", "Cantarell", "DejaVu Sans", "Liberation Sans", "Arial"], + "fontFamilyFallback": [ + "Ubuntu", + "Cantarell", + "DejaVu Sans", + "Liberation Sans", + "Arial" + ], "fontWeight": "w400", "fontSize": 12, "inherit": true, @@ -257,7 +432,13 @@ class AppThemeData { "color": "#8a000000", "decoration": "none", "fontFamily": "Roboto", - "fontFamilyFallback": ["Ubuntu", "Cantarell", "DejaVu Sans", "Liberation Sans", "Arial"], + "fontFamilyFallback": [ + "Ubuntu", + "Cantarell", + "DejaVu Sans", + "Liberation Sans", + "Arial" + ], "fontWeight": "w300", "fontSize": 96, "inherit": true, @@ -268,7 +449,13 @@ class AppThemeData { "color": "#8a000000", "decoration": "none", "fontFamily": "Roboto", - "fontFamilyFallback": ["Ubuntu", "Cantarell", "DejaVu Sans", "Liberation Sans", "Arial"], + "fontFamilyFallback": [ + "Ubuntu", + "Cantarell", + "DejaVu Sans", + "Liberation Sans", + "Arial" + ], "fontWeight": "w300", "fontSize": 60, "inherit": true, @@ -279,7 +466,13 @@ class AppThemeData { "color": "#8a000000", "decoration": "none", "fontFamily": "Roboto", - "fontFamilyFallback": ["Ubuntu", "Cantarell", "DejaVu Sans", "Liberation Sans", "Arial"], + "fontFamilyFallback": [ + "Ubuntu", + "Cantarell", + "DejaVu Sans", + "Liberation Sans", + "Arial" + ], "fontWeight": "w400", "fontSize": 48, "inherit": true, @@ -290,7 +483,13 @@ class AppThemeData { "color": "#8a000000", "decoration": "none", "fontFamily": "Roboto", - "fontFamilyFallback": ["Ubuntu", "Cantarell", "DejaVu Sans", "Liberation Sans", "Arial"], + "fontFamilyFallback": [ + "Ubuntu", + "Cantarell", + "DejaVu Sans", + "Liberation Sans", + "Arial" + ], "fontWeight": "w400", "fontSize": 40, "inherit": true, @@ -301,7 +500,13 @@ class AppThemeData { "color": "#8a000000", "decoration": "none", "fontFamily": "Roboto", - "fontFamilyFallback": ["Ubuntu", "Cantarell", "DejaVu Sans", "Liberation Sans", "Arial"], + "fontFamilyFallback": [ + "Ubuntu", + "Cantarell", + "DejaVu Sans", + "Liberation Sans", + "Arial" + ], "fontWeight": "w400", "fontSize": 34, "inherit": true, @@ -312,7 +517,13 @@ class AppThemeData { "color": "#dd000000", "decoration": "none", "fontFamily": "Roboto", - "fontFamilyFallback": ["Ubuntu", "Cantarell", "DejaVu Sans", "Liberation Sans", "Arial"], + "fontFamilyFallback": [ + "Ubuntu", + "Cantarell", + "DejaVu Sans", + "Liberation Sans", + "Arial" + ], "fontWeight": "w400", "fontSize": 24, "inherit": true, @@ -323,7 +534,13 @@ class AppThemeData { "color": "#dd000000", "decoration": "none", "fontFamily": "Roboto", - "fontFamilyFallback": ["Ubuntu", "Cantarell", "DejaVu Sans", "Liberation Sans", "Arial"], + "fontFamilyFallback": [ + "Ubuntu", + "Cantarell", + "DejaVu Sans", + "Liberation Sans", + "Arial" + ], "fontWeight": "w500", "fontSize": 14, "inherit": true, @@ -334,7 +551,13 @@ class AppThemeData { "color": "#ff000000", "decoration": "none", "fontFamily": "Roboto", - "fontFamilyFallback": ["Ubuntu", "Cantarell", "DejaVu Sans", "Liberation Sans", "Arial"], + "fontFamilyFallback": [ + "Ubuntu", + "Cantarell", + "DejaVu Sans", + "Liberation Sans", + "Arial" + ], "fontWeight": "w400", "fontSize": 11, "inherit": true, @@ -345,7 +568,13 @@ class AppThemeData { "color": "#ff000000", "decoration": "none", "fontFamily": "Roboto", - "fontFamilyFallback": ["Ubuntu", "Cantarell", "DejaVu Sans", "Liberation Sans", "Arial"], + "fontFamilyFallback": [ + "Ubuntu", + "Cantarell", + "DejaVu Sans", + "Liberation Sans", + "Arial" + ], "fontWeight": "w400", "fontSize": 10, "inherit": true, @@ -356,7 +585,13 @@ class AppThemeData { "color": "#dd000000", "decoration": "none", "fontFamily": "Roboto", - "fontFamilyFallback": ["Ubuntu", "Cantarell", "DejaVu Sans", "Liberation Sans", "Arial"], + "fontFamilyFallback": [ + "Ubuntu", + "Cantarell", + "DejaVu Sans", + "Liberation Sans", + "Arial" + ], "fontWeight": "w500", "fontSize": 20, "inherit": true, @@ -367,7 +602,13 @@ class AppThemeData { "color": "#dd000000", "decoration": "none", "fontFamily": "Roboto", - "fontFamilyFallback": ["Ubuntu", "Cantarell", "DejaVu Sans", "Liberation Sans", "Arial"], + "fontFamilyFallback": [ + "Ubuntu", + "Cantarell", + "DejaVu Sans", + "Liberation Sans", + "Arial" + ], "fontWeight": "w400", "fontSize": 16, "inherit": true, @@ -378,7 +619,13 @@ class AppThemeData { "color": "#ff000000", "decoration": "none", "fontFamily": "Roboto", - "fontFamilyFallback": ["Ubuntu", "Cantarell", "DejaVu Sans", "Liberation Sans", "Arial"], + "fontFamilyFallback": [ + "Ubuntu", + "Cantarell", + "DejaVu Sans", + "Liberation Sans", + "Arial" + ], "fontWeight": "w500", "fontSize": 14, "inherit": true, @@ -393,263 +640,670 @@ class AppThemeData { "color": "#dd000000", "decoration": "none", "fontFamily": "Roboto", - "fontFamilyFallback": ["Ubuntu", "Cantarell", "DejaVu Sans", "Liberation Sans", "Arial"], + "fontFamilyFallback": [ + "Ubuntu", + "Cantarell", + "DejaVu Sans", + "Liberation Sans", + "Arial" + ], "inherit": true }, "bodyMedium": { "color": "#dd000000", "decoration": "none", "fontFamily": "Roboto", - "fontFamilyFallback": ["Ubuntu", "Cantarell", "DejaVu Sans", "Liberation Sans", "Arial"], + "fontFamilyFallback": [ + "Ubuntu", + "Cantarell", + "DejaVu Sans", + "Liberation Sans", + "Arial" + ], "inherit": true }, "bodySmall": { "color": "#8a000000", "decoration": "none", "fontFamily": "Roboto", - "fontFamilyFallback": ["Ubuntu", "Cantarell", "DejaVu Sans", "Liberation Sans", "Arial"], + "fontFamilyFallback": [ + "Ubuntu", + "Cantarell", + "DejaVu Sans", + "Liberation Sans", + "Arial" + ], "inherit": true }, "displayLarge": { "color": "#8a000000", "decoration": "none", "fontFamily": "Roboto", - "fontFamilyFallback": ["Ubuntu", "Cantarell", "DejaVu Sans", "Liberation Sans", "Arial"], + "fontFamilyFallback": [ + "Ubuntu", + "Cantarell", + "DejaVu Sans", + "Liberation Sans", + "Arial" + ], "inherit": true }, "displayMedium": { "color": "#8a000000", "decoration": "none", "fontFamily": "Roboto", - "fontFamilyFallback": ["Ubuntu", "Cantarell", "DejaVu Sans", "Liberation Sans", "Arial"], + "fontFamilyFallback": [ + "Ubuntu", + "Cantarell", + "DejaVu Sans", + "Liberation Sans", + "Arial" + ], "inherit": true }, "displaySmall": { "color": "#8a000000", "decoration": "none", "fontFamily": "Roboto", - "fontFamilyFallback": ["Ubuntu", "Cantarell", "DejaVu Sans", "Liberation Sans", "Arial"], + "fontFamilyFallback": [ + "Ubuntu", + "Cantarell", + "DejaVu Sans", + "Liberation Sans", + "Arial" + ], "inherit": true }, "headlineLarge": { "color": "#8a000000", "decoration": "none", "fontFamily": "Roboto", - "fontFamilyFallback": ["Ubuntu", "Cantarell", "DejaVu Sans", "Liberation Sans", "Arial"], + "fontFamilyFallback": [ + "Ubuntu", + "Cantarell", + "DejaVu Sans", + "Liberation Sans", + "Arial" + ], "inherit": true }, "headlineMedium": { "color": "#8a000000", "decoration": "none", "fontFamily": "Roboto", - "fontFamilyFallback": ["Ubuntu", "Cantarell", "DejaVu Sans", "Liberation Sans", "Arial"], + "fontFamilyFallback": [ + "Ubuntu", + "Cantarell", + "DejaVu Sans", + "Liberation Sans", + "Arial" + ], "inherit": true }, "headlineSmall": { "color": "#dd000000", "decoration": "none", "fontFamily": "Roboto", - "fontFamilyFallback": ["Ubuntu", "Cantarell", "DejaVu Sans", "Liberation Sans", "Arial"], + "fontFamilyFallback": [ + "Ubuntu", + "Cantarell", + "DejaVu Sans", + "Liberation Sans", + "Arial" + ], "inherit": true }, "labelLarge": { "color": "#dd000000", "decoration": "none", "fontFamily": "Roboto", - "fontFamilyFallback": ["Ubuntu", "Cantarell", "DejaVu Sans", "Liberation Sans", "Arial"], + "fontFamilyFallback": [ + "Ubuntu", + "Cantarell", + "DejaVu Sans", + "Liberation Sans", + "Arial" + ], "inherit": true }, "labelMedium": { "color": "#ff000000", "decoration": "none", "fontFamily": "Roboto", - "fontFamilyFallback": ["Ubuntu", "Cantarell", "DejaVu Sans", "Liberation Sans", "Arial"], + "fontFamilyFallback": [ + "Ubuntu", + "Cantarell", + "DejaVu Sans", + "Liberation Sans", + "Arial" + ], "inherit": true }, "labelSmall": { "color": "#ff000000", "decoration": "none", "fontFamily": "Roboto", - "fontFamilyFallback": ["Ubuntu", "Cantarell", "DejaVu Sans", "Liberation Sans", "Arial"], + "fontFamilyFallback": [ + "Ubuntu", + "Cantarell", + "DejaVu Sans", + "Liberation Sans", + "Arial" + ], "inherit": true }, "titleLarge": { "color": "#dd000000", "decoration": "none", "fontFamily": "Roboto", - "fontFamilyFallback": ["Ubuntu", "Cantarell", "DejaVu Sans", "Liberation Sans", "Arial"], + "fontFamilyFallback": [ + "Ubuntu", + "Cantarell", + "DejaVu Sans", + "Liberation Sans", + "Arial" + ], "inherit": true }, "titleMedium": { "color": "#dd000000", "decoration": "none", "fontFamily": "Roboto", - "fontFamilyFallback": ["Ubuntu", "Cantarell", "DejaVu Sans", "Liberation Sans", "Arial"], + "fontFamilyFallback": [ + "Ubuntu", + "Cantarell", + "DejaVu Sans", + "Liberation Sans", + "Arial" + ], "inherit": true }, "titleSmall": { "color": "#ff000000", "decoration": "none", "fontFamily": "Roboto", - "fontFamilyFallback": ["Ubuntu", "Cantarell", "DejaVu Sans", "Liberation Sans", "Arial"], + "fontFamilyFallback": [ + "Ubuntu", + "Cantarell", + "DejaVu Sans", + "Liberation Sans", + "Arial" + ], "inherit": true } }, "dense": { - "bodyLarge": {"fontWeight": "w500", "fontSize": 15, "inherit": false, "textBaseline": "ideographic"}, - "bodyMedium": {"fontWeight": "w400", "fontSize": 15, "inherit": false, "textBaseline": "ideographic"}, - "bodySmall": {"fontWeight": "w400", "fontSize": 13, "inherit": false, "textBaseline": "ideographic"}, - "displayLarge": {"fontWeight": "w100", "fontSize": 112, "inherit": false, "textBaseline": "ideographic"}, - "displayMedium": {"fontWeight": "w400", "fontSize": 56, "inherit": false, "textBaseline": "ideographic"}, - "displaySmall": {"fontWeight": "w400", "fontSize": 45, "inherit": false, "textBaseline": "ideographic"}, - "headlineLarge": {"fontWeight": "w400", "fontSize": 40, "inherit": false, "textBaseline": "ideographic"}, - "headlineMedium": {"fontWeight": "w400", "fontSize": 34, "inherit": false, "textBaseline": "ideographic"}, - "headlineSmall": {"fontWeight": "w400", "fontSize": 24, "inherit": false, "textBaseline": "ideographic"}, - "labelLarge": {"fontWeight": "w500", "fontSize": 15, "inherit": false, "textBaseline": "ideographic"}, - "labelMedium": {"fontWeight": "w400", "fontSize": 12, "inherit": false, "textBaseline": "ideographic"}, - "labelSmall": {"fontWeight": "w400", "fontSize": 11, "inherit": false, "textBaseline": "ideographic"}, - "titleLarge": {"fontWeight": "w500", "fontSize": 21, "inherit": false, "textBaseline": "ideographic"}, - "titleMedium": {"fontWeight": "w400", "fontSize": 17, "inherit": false, "textBaseline": "ideographic"}, - "titleSmall": {"fontWeight": "w500", "fontSize": 15, "inherit": false, "textBaseline": "ideographic"} + "bodyLarge": { + "fontWeight": "w500", + "fontSize": 15, + "inherit": false, + "textBaseline": "ideographic" + }, + "bodyMedium": { + "fontWeight": "w400", + "fontSize": 15, + "inherit": false, + "textBaseline": "ideographic" + }, + "bodySmall": { + "fontWeight": "w400", + "fontSize": 13, + "inherit": false, + "textBaseline": "ideographic" + }, + "displayLarge": { + "fontWeight": "w100", + "fontSize": 112, + "inherit": false, + "textBaseline": "ideographic" + }, + "displayMedium": { + "fontWeight": "w400", + "fontSize": 56, + "inherit": false, + "textBaseline": "ideographic" + }, + "displaySmall": { + "fontWeight": "w400", + "fontSize": 45, + "inherit": false, + "textBaseline": "ideographic" + }, + "headlineLarge": { + "fontWeight": "w400", + "fontSize": 40, + "inherit": false, + "textBaseline": "ideographic" + }, + "headlineMedium": { + "fontWeight": "w400", + "fontSize": 34, + "inherit": false, + "textBaseline": "ideographic" + }, + "headlineSmall": { + "fontWeight": "w400", + "fontSize": 24, + "inherit": false, + "textBaseline": "ideographic" + }, + "labelLarge": { + "fontWeight": "w500", + "fontSize": 15, + "inherit": false, + "textBaseline": "ideographic" + }, + "labelMedium": { + "fontWeight": "w400", + "fontSize": 12, + "inherit": false, + "textBaseline": "ideographic" + }, + "labelSmall": { + "fontWeight": "w400", + "fontSize": 11, + "inherit": false, + "textBaseline": "ideographic" + }, + "titleLarge": { + "fontWeight": "w500", + "fontSize": 21, + "inherit": false, + "textBaseline": "ideographic" + }, + "titleMedium": { + "fontWeight": "w400", + "fontSize": 17, + "inherit": false, + "textBaseline": "ideographic" + }, + "titleSmall": { + "fontWeight": "w500", + "fontSize": 15, + "inherit": false, + "textBaseline": "ideographic" + } }, "englishLike": { - "bodyLarge": {"fontWeight": "w500", "fontSize": 14, "inherit": false, "textBaseline": "alphabetic"}, - "bodyMedium": {"fontWeight": "w400", "fontSize": 14, "inherit": false, "textBaseline": "alphabetic"}, - "bodySmall": {"fontWeight": "w400", "fontSize": 12, "inherit": false, "textBaseline": "alphabetic"}, - "displayLarge": {"fontWeight": "w100", "fontSize": 112, "inherit": false, "textBaseline": "alphabetic"}, - "displayMedium": {"fontWeight": "w400", "fontSize": 56, "inherit": false, "textBaseline": "alphabetic"}, - "displaySmall": {"fontWeight": "w400", "fontSize": 45, "inherit": false, "textBaseline": "alphabetic"}, - "headlineLarge": {"fontWeight": "w400", "fontSize": 40, "inherit": false, "textBaseline": "alphabetic"}, - "headlineMedium": {"fontWeight": "w400", "fontSize": 34, "inherit": false, "textBaseline": "alphabetic"}, - "headlineSmall": {"fontWeight": "w400", "fontSize": 24, "inherit": false, "textBaseline": "alphabetic"}, - "labelLarge": {"fontWeight": "w500", "fontSize": 14, "inherit": false, "textBaseline": "alphabetic"}, - "labelMedium": {"fontWeight": "w400", "fontSize": 12, "inherit": false, "textBaseline": "alphabetic"}, - "labelSmall": {"fontWeight": "w400", "fontSize": 10, "inherit": false, "letterSpacing": 1.5, "textBaseline": "alphabetic"}, - "titleLarge": {"fontWeight": "w500", "fontSize": 20, "inherit": false, "textBaseline": "alphabetic"}, - "titleMedium": {"fontWeight": "w400", "fontSize": 16, "inherit": false, "textBaseline": "alphabetic"}, - "titleSmall": {"fontWeight": "w500", "fontSize": 14, "inherit": false, "letterSpacing": 0.1, "textBaseline": "alphabetic"} + "bodyLarge": { + "fontWeight": "w500", + "fontSize": 14, + "inherit": false, + "textBaseline": "alphabetic" + }, + "bodyMedium": { + "fontWeight": "w400", + "fontSize": 14, + "inherit": false, + "textBaseline": "alphabetic" + }, + "bodySmall": { + "fontWeight": "w400", + "fontSize": 12, + "inherit": false, + "textBaseline": "alphabetic" + }, + "displayLarge": { + "fontWeight": "w100", + "fontSize": 112, + "inherit": false, + "textBaseline": "alphabetic" + }, + "displayMedium": { + "fontWeight": "w400", + "fontSize": 56, + "inherit": false, + "textBaseline": "alphabetic" + }, + "displaySmall": { + "fontWeight": "w400", + "fontSize": 45, + "inherit": false, + "textBaseline": "alphabetic" + }, + "headlineLarge": { + "fontWeight": "w400", + "fontSize": 40, + "inherit": false, + "textBaseline": "alphabetic" + }, + "headlineMedium": { + "fontWeight": "w400", + "fontSize": 34, + "inherit": false, + "textBaseline": "alphabetic" + }, + "headlineSmall": { + "fontWeight": "w400", + "fontSize": 24, + "inherit": false, + "textBaseline": "alphabetic" + }, + "labelLarge": { + "fontWeight": "w500", + "fontSize": 14, + "inherit": false, + "textBaseline": "alphabetic" + }, + "labelMedium": { + "fontWeight": "w400", + "fontSize": 12, + "inherit": false, + "textBaseline": "alphabetic" + }, + "labelSmall": { + "fontWeight": "w400", + "fontSize": 10, + "inherit": false, + "letterSpacing": 1.5, + "textBaseline": "alphabetic" + }, + "titleLarge": { + "fontWeight": "w500", + "fontSize": 20, + "inherit": false, + "textBaseline": "alphabetic" + }, + "titleMedium": { + "fontWeight": "w400", + "fontSize": 16, + "inherit": false, + "textBaseline": "alphabetic" + }, + "titleSmall": { + "fontWeight": "w500", + "fontSize": 14, + "inherit": false, + "letterSpacing": 0.1, + "textBaseline": "alphabetic" + } }, "tall": { - "bodyLarge": {"fontWeight": "w700", "fontSize": 15, "inherit": false, "textBaseline": "alphabetic"}, - "bodyMedium": {"fontWeight": "w400", "fontSize": 15, "inherit": false, "textBaseline": "alphabetic"}, - "bodySmall": {"fontWeight": "w400", "fontSize": 13, "inherit": false, "textBaseline": "alphabetic"}, - "displayLarge": {"fontWeight": "w400", "fontSize": 112, "inherit": false, "textBaseline": "alphabetic"}, - "displayMedium": {"fontWeight": "w400", "fontSize": 56, "inherit": false, "textBaseline": "alphabetic"}, - "displaySmall": {"fontWeight": "w400", "fontSize": 45, "inherit": false, "textBaseline": "alphabetic"}, - "headlineLarge": {"fontWeight": "w400", "fontSize": 40, "inherit": false, "textBaseline": "alphabetic"}, - "headlineMedium": {"fontWeight": "w400", "fontSize": 34, "inherit": false, "textBaseline": "alphabetic"}, - "headlineSmall": {"fontWeight": "w400", "fontSize": 24, "inherit": false, "textBaseline": "alphabetic"}, - "labelLarge": {"fontWeight": "w700", "fontSize": 15, "inherit": false, "textBaseline": "alphabetic"}, - "labelMedium": {"fontWeight": "w400", "fontSize": 12, "inherit": false, "textBaseline": "alphabetic"}, - "labelSmall": {"fontWeight": "w400", "fontSize": 11, "inherit": false, "textBaseline": "alphabetic"}, - "titleLarge": {"fontWeight": "w700", "fontSize": 21, "inherit": false, "textBaseline": "alphabetic"}, - "titleMedium": {"fontWeight": "w400", "fontSize": 17, "inherit": false, "textBaseline": "alphabetic"}, - "titleSmall": {"fontWeight": "w500", "fontSize": 15, "inherit": false, "textBaseline": "alphabetic"} + "bodyLarge": { + "fontWeight": "w700", + "fontSize": 15, + "inherit": false, + "textBaseline": "alphabetic" + }, + "bodyMedium": { + "fontWeight": "w400", + "fontSize": 15, + "inherit": false, + "textBaseline": "alphabetic" + }, + "bodySmall": { + "fontWeight": "w400", + "fontSize": 13, + "inherit": false, + "textBaseline": "alphabetic" + }, + "displayLarge": { + "fontWeight": "w400", + "fontSize": 112, + "inherit": false, + "textBaseline": "alphabetic" + }, + "displayMedium": { + "fontWeight": "w400", + "fontSize": 56, + "inherit": false, + "textBaseline": "alphabetic" + }, + "displaySmall": { + "fontWeight": "w400", + "fontSize": 45, + "inherit": false, + "textBaseline": "alphabetic" + }, + "headlineLarge": { + "fontWeight": "w400", + "fontSize": 40, + "inherit": false, + "textBaseline": "alphabetic" + }, + "headlineMedium": { + "fontWeight": "w400", + "fontSize": 34, + "inherit": false, + "textBaseline": "alphabetic" + }, + "headlineSmall": { + "fontWeight": "w400", + "fontSize": 24, + "inherit": false, + "textBaseline": "alphabetic" + }, + "labelLarge": { + "fontWeight": "w700", + "fontSize": 15, + "inherit": false, + "textBaseline": "alphabetic" + }, + "labelMedium": { + "fontWeight": "w400", + "fontSize": 12, + "inherit": false, + "textBaseline": "alphabetic" + }, + "labelSmall": { + "fontWeight": "w400", + "fontSize": 11, + "inherit": false, + "textBaseline": "alphabetic" + }, + "titleLarge": { + "fontWeight": "w700", + "fontSize": 21, + "inherit": false, + "textBaseline": "alphabetic" + }, + "titleMedium": { + "fontWeight": "w400", + "fontSize": 17, + "inherit": false, + "textBaseline": "alphabetic" + }, + "titleSmall": { + "fontWeight": "w500", + "fontSize": 15, + "inherit": false, + "textBaseline": "alphabetic" + } }, "white": { "bodyLarge": { "color": "#ffffffff", "decoration": "none", "fontFamily": "Roboto", - "fontFamilyFallback": ["Ubuntu", "Cantarell", "DejaVu Sans", "Liberation Sans", "Arial"], + "fontFamilyFallback": [ + "Ubuntu", + "Cantarell", + "DejaVu Sans", + "Liberation Sans", + "Arial" + ], "inherit": true }, "bodyMedium": { "color": "#ffffffff", "decoration": "none", "fontFamily": "Roboto", - "fontFamilyFallback": ["Ubuntu", "Cantarell", "DejaVu Sans", "Liberation Sans", "Arial"], + "fontFamilyFallback": [ + "Ubuntu", + "Cantarell", + "DejaVu Sans", + "Liberation Sans", + "Arial" + ], "inherit": true }, "bodySmall": { "color": "#b3ffffff", "decoration": "none", "fontFamily": "Roboto", - "fontFamilyFallback": ["Ubuntu", "Cantarell", "DejaVu Sans", "Liberation Sans", "Arial"], + "fontFamilyFallback": [ + "Ubuntu", + "Cantarell", + "DejaVu Sans", + "Liberation Sans", + "Arial" + ], "inherit": true }, "displayLarge": { "color": "#b3ffffff", "decoration": "none", "fontFamily": "Roboto", - "fontFamilyFallback": ["Ubuntu", "Cantarell", "DejaVu Sans", "Liberation Sans", "Arial"], + "fontFamilyFallback": [ + "Ubuntu", + "Cantarell", + "DejaVu Sans", + "Liberation Sans", + "Arial" + ], "inherit": true }, "displayMedium": { "color": "#b3ffffff", "decoration": "none", "fontFamily": "Roboto", - "fontFamilyFallback": ["Ubuntu", "Cantarell", "DejaVu Sans", "Liberation Sans", "Arial"], + "fontFamilyFallback": [ + "Ubuntu", + "Cantarell", + "DejaVu Sans", + "Liberation Sans", + "Arial" + ], "inherit": true }, "displaySmall": { "color": "#b3ffffff", "decoration": "none", "fontFamily": "Roboto", - "fontFamilyFallback": ["Ubuntu", "Cantarell", "DejaVu Sans", "Liberation Sans", "Arial"], + "fontFamilyFallback": [ + "Ubuntu", + "Cantarell", + "DejaVu Sans", + "Liberation Sans", + "Arial" + ], "inherit": true }, "headlineLarge": { "color": "#b3ffffff", "decoration": "none", "fontFamily": "Roboto", - "fontFamilyFallback": ["Ubuntu", "Cantarell", "DejaVu Sans", "Liberation Sans", "Arial"], + "fontFamilyFallback": [ + "Ubuntu", + "Cantarell", + "DejaVu Sans", + "Liberation Sans", + "Arial" + ], "inherit": true }, "headlineMedium": { "color": "#b3ffffff", "decoration": "none", "fontFamily": "Roboto", - "fontFamilyFallback": ["Ubuntu", "Cantarell", "DejaVu Sans", "Liberation Sans", "Arial"], + "fontFamilyFallback": [ + "Ubuntu", + "Cantarell", + "DejaVu Sans", + "Liberation Sans", + "Arial" + ], "inherit": true }, "headlineSmall": { "color": "#ffffffff", "decoration": "none", "fontFamily": "Roboto", - "fontFamilyFallback": ["Ubuntu", "Cantarell", "DejaVu Sans", "Liberation Sans", "Arial"], + "fontFamilyFallback": [ + "Ubuntu", + "Cantarell", + "DejaVu Sans", + "Liberation Sans", + "Arial" + ], "inherit": true }, "labelLarge": { "color": "#ffffffff", "decoration": "none", "fontFamily": "Roboto", - "fontFamilyFallback": ["Ubuntu", "Cantarell", "DejaVu Sans", "Liberation Sans", "Arial"], + "fontFamilyFallback": [ + "Ubuntu", + "Cantarell", + "DejaVu Sans", + "Liberation Sans", + "Arial" + ], "inherit": true }, "labelMedium": { "color": "#ffffffff", "decoration": "none", "fontFamily": "Roboto", - "fontFamilyFallback": ["Ubuntu", "Cantarell", "DejaVu Sans", "Liberation Sans", "Arial"], + "fontFamilyFallback": [ + "Ubuntu", + "Cantarell", + "DejaVu Sans", + "Liberation Sans", + "Arial" + ], "inherit": true }, "labelSmall": { "color": "#ffffffff", "decoration": "none", "fontFamily": "Roboto", - "fontFamilyFallback": ["Ubuntu", "Cantarell", "DejaVu Sans", "Liberation Sans", "Arial"], + "fontFamilyFallback": [ + "Ubuntu", + "Cantarell", + "DejaVu Sans", + "Liberation Sans", + "Arial" + ], "inherit": true }, "titleLarge": { "color": "#ffffffff", "decoration": "none", "fontFamily": "Roboto", - "fontFamilyFallback": ["Ubuntu", "Cantarell", "DejaVu Sans", "Liberation Sans", "Arial"], + "fontFamilyFallback": [ + "Ubuntu", + "Cantarell", + "DejaVu Sans", + "Liberation Sans", + "Arial" + ], "inherit": true }, "titleMedium": { "color": "#ffffffff", "decoration": "none", "fontFamily": "Roboto", - "fontFamilyFallback": ["Ubuntu", "Cantarell", "DejaVu Sans", "Liberation Sans", "Arial"], + "fontFamilyFallback": [ + "Ubuntu", + "Cantarell", + "DejaVu Sans", + "Liberation Sans", + "Arial" + ], "inherit": true }, "titleSmall": { "color": "#ffffffff", "decoration": "none", "fontFamily": "Roboto", - "fontFamilyFallback": ["Ubuntu", "Cantarell", "DejaVu Sans", "Liberation Sans", "Arial"], + "fontFamilyFallback": [ + "Ubuntu", + "Cantarell", + "DejaVu Sans", + "Liberation Sans", + "Arial" + ], "inherit": true } } diff --git a/lib/application/use_cases/create_email_token_impl.dart b/lib/application/use_cases/create_email_token_impl.dart new file mode 100644 index 00000000..c745e8b1 --- /dev/null +++ b/lib/application/use_cases/create_email_token_impl.dart @@ -0,0 +1,19 @@ +import 'package:injectable/injectable.dart'; +import 'package:ottaa_project_flutter/core/repositories/server_repository.dart'; +import 'package:ottaa_project_flutter/core/use_cases/create_email_token.dart'; + +@Singleton(as: CreateEmailToken) +class CreateEmailTokenImpl extends CreateEmailToken { + const CreateEmailTokenImpl(super.serverService); + + @override + Future createEmailToken(String ownEmail, String email) async { + final result = await serverService.getEmailToken(ownEmail, email); + + if (result.isLeft) { + return result.left; + } + + return null; + } +} diff --git a/lib/application/use_cases/create_group_impl.dart b/lib/application/use_cases/create_group_impl.dart new file mode 100644 index 00000000..ed4cea80 --- /dev/null +++ b/lib/application/use_cases/create_group_impl.dart @@ -0,0 +1,20 @@ +import 'package:injectable/injectable.dart'; +import 'package:ottaa_project_flutter/core/enums/board_data_type.dart'; +import 'package:ottaa_project_flutter/core/models/group_model.dart'; +import 'package:ottaa_project_flutter/core/use_cases/create_group_data.dart'; + +@Singleton(as: CreateGroupData) +class CreateGroupDataImpl extends CreateGroupData { + const CreateGroupDataImpl(super.serverService); + + @override + Future createGroupData({required Group group, required String userId, required String lang}) async { + final response = await serverService.createPictoGroupData(userId: userId, language: lang, type: BoardDataType.groups, data: group.toMap()); + + if (response != null) { + return response["data"]["dataId"] ?? response["code"]; + } + + return null; + } +} diff --git a/lib/application/use_cases/create_phrase_impl.dart b/lib/application/use_cases/create_phrase_impl.dart new file mode 100644 index 00000000..c46e463f --- /dev/null +++ b/lib/application/use_cases/create_phrase_impl.dart @@ -0,0 +1,27 @@ +import 'package:injectable/injectable.dart'; +import 'package:ottaa_project_flutter/core/enums/board_data_type.dart'; +import 'package:ottaa_project_flutter/core/models/phrase_model.dart'; +import 'package:ottaa_project_flutter/core/use_cases/create_phrase_data.dart'; + +@Singleton(as: CreatePhraseData) +class CreatePhraseDataImpl extends CreatePhraseData { + const CreatePhraseDataImpl(super.serverService); + + @override + Future createPhraseData( + {required Phrase phrase, + required String userId, + required String lang}) async { + final response = await serverService.createPictoGroupData( + userId: userId, + language: lang, + type: BoardDataType.phrases, + data: phrase.toMap()); + + if (response != null) { + return response["data"]["dataId"] ?? response["code"]; + } + + return null; + } +} diff --git a/lib/application/use_cases/create_picto_impl.dart b/lib/application/use_cases/create_picto_impl.dart new file mode 100644 index 00000000..124c862d --- /dev/null +++ b/lib/application/use_cases/create_picto_impl.dart @@ -0,0 +1,27 @@ +import 'package:injectable/injectable.dart'; +import 'package:ottaa_project_flutter/core/enums/board_data_type.dart'; +import 'package:ottaa_project_flutter/core/models/picto_model.dart'; +import 'package:ottaa_project_flutter/core/use_cases/create_picto_data.dart'; + +@Singleton(as: CreatePictoData) +class CreatePictoDataImpl extends CreatePictoData { + const CreatePictoDataImpl(super.serverService); + + @override + Future createPictoData( + {required Picto picto, + required String userId, + required String lang}) async { + final response = await serverService.createPictoGroupData( + userId: userId, + language: lang, + type: BoardDataType.pictos, + data: picto.toMap()); + + if (response != null) { + return response["data"]["dataId"] ?? response["code"]; + } + + return null; + } +} diff --git a/lib/application/use_cases/learn_pictogram_impl.dart b/lib/application/use_cases/learn_pictogram_impl.dart new file mode 100644 index 00000000..c5f97f6e --- /dev/null +++ b/lib/application/use_cases/learn_pictogram_impl.dart @@ -0,0 +1,32 @@ +import 'package:either_dart/either.dart'; +import 'package:injectable/injectable.dart'; +import 'package:ottaa_project_flutter/core/models/learn_token.dart'; +import 'package:ottaa_project_flutter/core/repositories/repositories.dart'; +import 'package:ottaa_project_flutter/core/use_cases/learn_pictogram.dart'; + +@Singleton(as: LearnPictogram) +class LearnPictogramImpl extends LearnPictogram { + LearnPictogramImpl({required super.serverRepository}); + + @override + Future call({ + @Deprecated("You should use tokens instead of this") String? sentence = "", + required String uid, + required String language, + required String model, + required List tokens, + }) async { + final response = await serverRepository.learnPictograms( + uid: uid, + language: language, + model: model, + tokens: tokens.map((e) => e.toMap()).toList(), + ); + + if (response.isLeft) return Left(response.left); + + final data = response.right; + + return Right(data["time"]); + } +} diff --git a/lib/application/use_cases/predict_pictogram_impl.dart b/lib/application/use_cases/predict_pictogram_impl.dart new file mode 100644 index 00000000..f6669e86 --- /dev/null +++ b/lib/application/use_cases/predict_pictogram_impl.dart @@ -0,0 +1,48 @@ +import 'package:dio/dio.dart'; +import 'package:either_dart/either.dart'; +import 'package:injectable/injectable.dart'; +import 'package:ottaa_project_flutter/core/models/picto_predicted.dart'; +import 'package:ottaa_project_flutter/core/models/picto_predicted_reduced.dart'; +import 'package:ottaa_project_flutter/core/use_cases/predict_pictogram.dart'; + +@Singleton(as: PredictPictogram) +class PredictPictogramImpl extends PredictPictogram { + PredictPictogramImpl({required super.serverRepository}); + + @override + Future>> call({ + required String sentence, + required String uid, + required String language, + required String model, + List groups = const [], + Map> tags = const {}, + bool reduced = true, + int limit = 10, + int chunk = 4, + CancelToken? cancelToken, + }) async { + final response = await serverRepository.predictPictogram( + sentence: sentence, + uid: uid, + language: language, + model: model, + groups: groups, + tags: tags, + cancelToken: cancelToken, + reduced: reduced, + ); + + if (response.isLeft) { + return Left(response.left); + } + + final map = response.right["data"]; + + if (reduced) { + return Right(map.map((e) => PictoPredictedReduced.fromMap(e)).toList()); + } + + return Right(map.map((e) => PictoPredicted.fromMap(e)).toList()); + } +} diff --git a/lib/application/use_cases/use_cases.dart b/lib/application/use_cases/use_cases.dart new file mode 100644 index 00000000..5d6170f0 --- /dev/null +++ b/lib/application/use_cases/use_cases.dart @@ -0,0 +1,5 @@ +export 'create_email_token_impl.dart'; +export 'create_group_impl.dart'; +export 'create_phrase_impl.dart'; +export 'create_picto_impl.dart'; +export 'verify_email_token_impl.dart'; diff --git a/lib/application/use_cases/verify_email_token_impl.dart b/lib/application/use_cases/verify_email_token_impl.dart new file mode 100644 index 00000000..960f693a --- /dev/null +++ b/lib/application/use_cases/verify_email_token_impl.dart @@ -0,0 +1,20 @@ +import 'package:either_dart/either.dart'; +import 'package:injectable/injectable.dart'; +import 'package:ottaa_project_flutter/core/repositories/server_repository.dart'; +import 'package:ottaa_project_flutter/core/use_cases/verify_email_token.dart'; + +@Singleton(as: VerifyEmailToken) +class VerifyEmailTokenImpl extends VerifyEmailToken { + const VerifyEmailTokenImpl(super.serverService); + + @override + Future> verifyEmailToken(String ownEmail, String email, String token) async { + final result = await serverService.verifyEmailToken(ownEmail, email, token); + + if (result.isLeft) { + return Left(result.left); + } + + return Right(result.right["data"]["userId"]); + } +} diff --git a/lib/core/abstracts/enums/board_data_type.dart b/lib/core/abstracts/enums/board_data_type.dart new file mode 100644 index 00000000..57c974f9 --- /dev/null +++ b/lib/core/abstracts/enums/board_data_type.dart @@ -0,0 +1 @@ +enum BoardDataType { pictos, groups, phrases } diff --git a/lib/core/abstracts/enums/customise_data_type.dart b/lib/core/abstracts/enums/customise_data_type.dart new file mode 100644 index 00000000..d0a53c6e --- /dev/null +++ b/lib/core/abstracts/enums/customise_data_type.dart @@ -0,0 +1,5 @@ +enum CustomiseDataType { + user, + careGiver, + defaultCase, +} diff --git a/lib/core/abstracts/enums/devices_accessibility.dart b/lib/core/abstracts/enums/devices_accessibility.dart new file mode 100644 index 00000000..e9d32092 --- /dev/null +++ b/lib/core/abstracts/enums/devices_accessibility.dart @@ -0,0 +1,19 @@ +import 'package:hive/hive.dart'; +import 'package:ottaa_project_flutter/core/abstracts/hive_type_ids.dart'; + +part 'devices_accessibility.g.dart'; + +@HiveType(typeId: HiveTypesIds.devicesAccessibilityEnumTypeId) +enum DevicesAccessibility { + @HiveField(0) + none, + + @HiveField(1) + press, + + @HiveField(2) + scroll, + + @HiveField(3) + sipuff +} diff --git a/lib/core/abstracts/enums/devices_accessibility.g.dart b/lib/core/abstracts/enums/devices_accessibility.g.dart new file mode 100644 index 00000000..1806cd25 --- /dev/null +++ b/lib/core/abstracts/enums/devices_accessibility.g.dart @@ -0,0 +1,56 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'devices_accessibility.dart'; + +// ************************************************************************** +// TypeAdapterGenerator +// ************************************************************************** + +class DevicesAccessibilityAdapter extends TypeAdapter { + @override + final int typeId = 22; + + @override + DevicesAccessibility read(BinaryReader reader) { + switch (reader.readByte()) { + case 0: + return DevicesAccessibility.none; + case 1: + return DevicesAccessibility.press; + case 2: + return DevicesAccessibility.scroll; + case 3: + return DevicesAccessibility.sipuff; + default: + return DevicesAccessibility.none; + } + } + + @override + void write(BinaryWriter writer, DevicesAccessibility obj) { + switch (obj) { + case DevicesAccessibility.none: + writer.writeByte(0); + break; + case DevicesAccessibility.press: + writer.writeByte(1); + break; + case DevicesAccessibility.scroll: + writer.writeByte(2); + break; + case DevicesAccessibility.sipuff: + writer.writeByte(3); + break; + } + } + + @override + int get hashCode => typeId.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is DevicesAccessibilityAdapter && + runtimeType == other.runtimeType && + typeId == other.typeId; +} diff --git a/lib/core/abstracts/enums/display_types.dart b/lib/core/abstracts/enums/display_types.dart new file mode 100644 index 00000000..a313cc46 --- /dev/null +++ b/lib/core/abstracts/enums/display_types.dart @@ -0,0 +1,13 @@ +import 'package:hive/hive.dart'; +import 'package:ottaa_project_flutter/core/abstracts/hive_type_ids.dart'; + +part 'display_types.g.dart'; + +@HiveType(typeId: HiveTypesIds.displayTypeEnumTypeId) +enum DisplayTypes { + @HiveField(0) + grid, + + @HiveField(1) + tab, +} diff --git a/lib/core/abstracts/enums/display_types.g.dart b/lib/core/abstracts/enums/display_types.g.dart new file mode 100644 index 00000000..6f12896d --- /dev/null +++ b/lib/core/abstracts/enums/display_types.g.dart @@ -0,0 +1,46 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'display_types.dart'; + +// ************************************************************************** +// TypeAdapterGenerator +// ************************************************************************** + +class DisplayTypesAdapter extends TypeAdapter { + @override + final int typeId = 21; + + @override + DisplayTypes read(BinaryReader reader) { + switch (reader.readByte()) { + case 0: + return DisplayTypes.grid; + case 1: + return DisplayTypes.tab; + default: + return DisplayTypes.grid; + } + } + + @override + void write(BinaryWriter writer, DisplayTypes obj) { + switch (obj) { + case DisplayTypes.grid: + writer.writeByte(0); + break; + case DisplayTypes.tab: + writer.writeByte(1); + break; + } + } + + @override + int get hashCode => typeId.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is DisplayTypesAdapter && + runtimeType == other.runtimeType && + typeId == other.typeId; +} diff --git a/lib/core/abstracts/enums/home_screen_status.dart b/lib/core/abstracts/enums/home_screen_status.dart new file mode 100644 index 00000000..feb153fd --- /dev/null +++ b/lib/core/abstracts/enums/home_screen_status.dart @@ -0,0 +1,7 @@ +enum HomeScreenStatus { + pictos, + grid, + tabs, + favorites, + history, +} diff --git a/lib/core/abstracts/enums/sentences_types.dart b/lib/core/abstracts/enums/sentences_types.dart new file mode 100644 index 00000000..ffc23680 --- /dev/null +++ b/lib/core/abstracts/enums/sentences_types.dart @@ -0,0 +1,4 @@ +enum SentencesTypes { + favouriteFrases, + mostUsedFrases, +} diff --git a/lib/core/abstracts/enums/sign_in_types.dart b/lib/core/abstracts/enums/sign_in_types.dart new file mode 100644 index 00000000..b328911d --- /dev/null +++ b/lib/core/abstracts/enums/sign_in_types.dart @@ -0,0 +1,6 @@ +enum SignInType { + google, + facebook, + apple, + email, +} diff --git a/lib/core/abstracts/enums/size_types.dart b/lib/core/abstracts/enums/size_types.dart new file mode 100644 index 00000000..fe7f189a --- /dev/null +++ b/lib/core/abstracts/enums/size_types.dart @@ -0,0 +1,14 @@ +import 'package:hive_flutter/hive_flutter.dart'; +import 'package:ottaa_project_flutter/core/abstracts/hive_type_ids.dart'; + +part 'size_types.g.dart'; + +@HiveType(typeId: HiveTypesIds.sizeTypeEnumTypeId) +enum SizeTypes { + @HiveField(0) + small, + @HiveField(1) + mid, + @HiveField(2) + big, +} diff --git a/lib/core/abstracts/enums/size_types.g.dart b/lib/core/abstracts/enums/size_types.g.dart new file mode 100644 index 00000000..9ed25b58 --- /dev/null +++ b/lib/core/abstracts/enums/size_types.g.dart @@ -0,0 +1,51 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'size_types.dart'; + +// ************************************************************************** +// TypeAdapterGenerator +// ************************************************************************** + +class SizeTypesAdapter extends TypeAdapter { + @override + final int typeId = 25; + + @override + SizeTypes read(BinaryReader reader) { + switch (reader.readByte()) { + case 0: + return SizeTypes.small; + case 1: + return SizeTypes.mid; + case 2: + return SizeTypes.big; + default: + return SizeTypes.small; + } + } + + @override + void write(BinaryWriter writer, SizeTypes obj) { + switch (obj) { + case SizeTypes.small: + writer.writeByte(0); + break; + case SizeTypes.mid: + writer.writeByte(1); + break; + case SizeTypes.big: + writer.writeByte(2); + break; + } + } + + @override + int get hashCode => typeId.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is SizeTypesAdapter && + runtimeType == other.runtimeType && + typeId == other.typeId; +} diff --git a/lib/core/abstracts/enums/sweep_modes.dart b/lib/core/abstracts/enums/sweep_modes.dart new file mode 100644 index 00000000..4117d0ab --- /dev/null +++ b/lib/core/abstracts/enums/sweep_modes.dart @@ -0,0 +1,13 @@ +import 'package:hive/hive.dart'; +import 'package:ottaa_project_flutter/core/abstracts/hive_type_ids.dart'; + +part 'sweep_modes.g.dart'; + +@HiveType(typeId: HiveTypesIds.sweepModesEnumTypeId) +enum SweepModes { + @HiveField(0) + elements, + + @HiveField(1) + sweep, +} diff --git a/lib/core/abstracts/enums/sweep_modes.g.dart b/lib/core/abstracts/enums/sweep_modes.g.dart new file mode 100644 index 00000000..c15491ce --- /dev/null +++ b/lib/core/abstracts/enums/sweep_modes.g.dart @@ -0,0 +1,46 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'sweep_modes.dart'; + +// ************************************************************************** +// TypeAdapterGenerator +// ************************************************************************** + +class SweepModesAdapter extends TypeAdapter { + @override + final int typeId = 23; + + @override + SweepModes read(BinaryReader reader) { + switch (reader.readByte()) { + case 0: + return SweepModes.elements; + case 1: + return SweepModes.sweep; + default: + return SweepModes.elements; + } + } + + @override + void write(BinaryWriter writer, SweepModes obj) { + switch (obj) { + case SweepModes.elements: + writer.writeByte(0); + break; + case SweepModes.sweep: + writer.writeByte(1); + break; + } + } + + @override + int get hashCode => typeId.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is SweepModesAdapter && + runtimeType == other.runtimeType && + typeId == other.typeId; +} diff --git a/lib/core/abstracts/enums/user_payment.dart b/lib/core/abstracts/enums/user_payment.dart new file mode 100644 index 00000000..85be4fbc --- /dev/null +++ b/lib/core/abstracts/enums/user_payment.dart @@ -0,0 +1 @@ +enum UserPayment { free, premium } diff --git a/lib/core/abstracts/enums/user_types.dart b/lib/core/abstracts/enums/user_types.dart new file mode 100644 index 00000000..bae662ad --- /dev/null +++ b/lib/core/abstracts/enums/user_types.dart @@ -0,0 +1,14 @@ +import 'package:hive/hive.dart'; +import 'package:ottaa_project_flutter/core/abstracts/hive_type_ids.dart'; + +part 'user_types.g.dart'; + +@HiveType(typeId: HiveTypesIds.userEnumTypeId) +enum UserType { + @HiveField(0) + caregiver, + @HiveField(1) + user, + @HiveField(2, defaultValue: true) + none, +} diff --git a/lib/core/abstracts/enums/user_types.g.dart b/lib/core/abstracts/enums/user_types.g.dart new file mode 100644 index 00000000..6061916e --- /dev/null +++ b/lib/core/abstracts/enums/user_types.g.dart @@ -0,0 +1,51 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'user_types.dart'; + +// ************************************************************************** +// TypeAdapterGenerator +// ************************************************************************** + +class UserTypeAdapter extends TypeAdapter { + @override + final int typeId = 19; + + @override + UserType read(BinaryReader reader) { + switch (reader.readByte()) { + case 0: + return UserType.caregiver; + case 1: + return UserType.user; + case 2: + return UserType.none; + default: + return UserType.none; + } + } + + @override + void write(BinaryWriter writer, UserType obj) { + switch (obj) { + case UserType.caregiver: + writer.writeByte(0); + break; + case UserType.user: + writer.writeByte(1); + break; + case UserType.none: + writer.writeByte(2); + break; + } + } + + @override + int get hashCode => typeId.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is UserTypeAdapter && + runtimeType == other.runtimeType && + typeId == other.typeId; +} diff --git a/lib/core/abstracts/enums/velocity_types.dart b/lib/core/abstracts/enums/velocity_types.dart new file mode 100644 index 00000000..7976e7fa --- /dev/null +++ b/lib/core/abstracts/enums/velocity_types.dart @@ -0,0 +1,16 @@ +import 'package:hive_flutter/hive_flutter.dart'; +import 'package:ottaa_project_flutter/core/abstracts/hive_type_ids.dart'; + +part 'velocity_types.g.dart'; + +@HiveType(typeId: HiveTypesIds.velocityTypeEnumTypeId) +enum VelocityTypes { + @HiveField(0) + slow, + + @HiveField(1) + mid, + + @HiveField(2) + fast, +} diff --git a/lib/core/abstracts/enums/velocity_types.g.dart b/lib/core/abstracts/enums/velocity_types.g.dart new file mode 100644 index 00000000..69e6b14e --- /dev/null +++ b/lib/core/abstracts/enums/velocity_types.g.dart @@ -0,0 +1,51 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'velocity_types.dart'; + +// ************************************************************************** +// TypeAdapterGenerator +// ************************************************************************** + +class VelocityTypesAdapter extends TypeAdapter { + @override + final int typeId = 24; + + @override + VelocityTypes read(BinaryReader reader) { + switch (reader.readByte()) { + case 0: + return VelocityTypes.slow; + case 1: + return VelocityTypes.mid; + case 2: + return VelocityTypes.fast; + default: + return VelocityTypes.slow; + } + } + + @override + void write(BinaryWriter writer, VelocityTypes obj) { + switch (obj) { + case VelocityTypes.slow: + writer.writeByte(0); + break; + case VelocityTypes.mid: + writer.writeByte(1); + break; + case VelocityTypes.fast: + writer.writeByte(2); + break; + } + } + + @override + int get hashCode => typeId.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is VelocityTypesAdapter && + runtimeType == other.runtimeType && + typeId == other.typeId; +} diff --git a/lib/core/abstracts/hive_type_ids.dart b/lib/core/abstracts/hive_type_ids.dart new file mode 100644 index 00000000..c18a58dc --- /dev/null +++ b/lib/core/abstracts/hive_type_ids.dart @@ -0,0 +1,62 @@ +class HiveTypesIds { + static const int patientTypeId = 0; + static const int patientSettingsTypeId = 1; + static const int userDataTypeId = 2; + // static const int avatarTypeId = 3; + static const int phraseTypeId = 3; + static const int paymentTypeId = 4; + + static const int shortcutsTypeId = 5; + + static const int pictoTypeId = 6; + + static const int pictoTextTypeId = 7; + + static const int pictoRelationTypeId = 8; + + static const int sequenceTypeId = 9; + + static const int tagsTypeId = 10; + + static const int groupTypeId = 11; + + static const int groupTextTypeId = 12; + + static const int groupRelationTypeId = 13; + + static const int caregiverUserTypeId = 14; + + static const int baseSettingsTypeId = 15; + + static const int caregiverUsersTypeId = 16; + + static const int assetsTypeId = 17; + + static const int baseUserTypeId = 18; + + static const int userEnumTypeId = 19; + + static const int layoutTypeId = 20; + + static const int displayTypeEnumTypeId = 21; + + static const int devicesAccessibilityEnumTypeId = 22; + + static const int sweepModesEnumTypeId = 23; + + static const int velocityTypeEnumTypeId = 24; + + static const int sizeTypeEnumTypeId = 25; + + static const int accessibilityTypeId = 26; + + static const int voiceAccessibilityTypeId = 27; + + static const int subtitlesSettingTypeId = 28; + + static const int ttsSettingTypeId = 29; + + static const int languageSettingTypeId = 30; + + static const int userDeviceTypeId = 31; +} diff --git a/lib/core/abstracts/language.dart b/lib/core/abstracts/language.dart deleted file mode 100644 index 81f76146..00000000 --- a/lib/core/abstracts/language.dart +++ /dev/null @@ -1,6 +0,0 @@ -abstract class Language { - const Language(); - - String get languageCode; - Map get translations; -} diff --git a/lib/core/abstracts/user_model.dart b/lib/core/abstracts/user_model.dart new file mode 100644 index 00000000..86977780 --- /dev/null +++ b/lib/core/abstracts/user_model.dart @@ -0,0 +1,23 @@ +import 'package:hive/hive.dart'; +import 'package:ottaa_project_flutter/core/abstracts/user_settings.dart'; +import 'package:ottaa_project_flutter/core/enums/user_types.dart'; +import 'package:ottaa_project_flutter/core/models/devices_token.dart'; + +abstract class UserModel extends HiveObject { + UserModel(); + + DeviceToken? get currentToken; + set currentToken(DeviceToken? token); + + String get id; + UserType get type; + UserSettings get settings; + set settings(UserSettings settings); + String get email; + + UserModel fromJson(Map json); + + String toJson(); + + Map toMap(); +} diff --git a/lib/core/abstracts/user_settings.dart b/lib/core/abstracts/user_settings.dart new file mode 100644 index 00000000..233ffde6 --- /dev/null +++ b/lib/core/abstracts/user_settings.dart @@ -0,0 +1,14 @@ +import 'package:ottaa_project_flutter/core/models/language_setting.dart'; +import 'package:ottaa_project_flutter/core/models/user_data_model.dart'; + +abstract class UserSettings { + const UserSettings(); + + LanguageSetting get language; + set language(LanguageSetting language); + + UserData get data; + set data(UserData data); + + Map toMap(); +} diff --git a/lib/core/enums/board_data_type.dart b/lib/core/enums/board_data_type.dart new file mode 100644 index 00000000..57c974f9 --- /dev/null +++ b/lib/core/enums/board_data_type.dart @@ -0,0 +1 @@ +enum BoardDataType { pictos, groups, phrases } diff --git a/lib/core/enums/customise_data_type.dart b/lib/core/enums/customise_data_type.dart new file mode 100644 index 00000000..d0a53c6e --- /dev/null +++ b/lib/core/enums/customise_data_type.dart @@ -0,0 +1,5 @@ +enum CustomiseDataType { + user, + careGiver, + defaultCase, +} diff --git a/lib/core/enums/devices_accessibility.dart b/lib/core/enums/devices_accessibility.dart new file mode 100644 index 00000000..e9d32092 --- /dev/null +++ b/lib/core/enums/devices_accessibility.dart @@ -0,0 +1,19 @@ +import 'package:hive/hive.dart'; +import 'package:ottaa_project_flutter/core/abstracts/hive_type_ids.dart'; + +part 'devices_accessibility.g.dart'; + +@HiveType(typeId: HiveTypesIds.devicesAccessibilityEnumTypeId) +enum DevicesAccessibility { + @HiveField(0) + none, + + @HiveField(1) + press, + + @HiveField(2) + scroll, + + @HiveField(3) + sipuff +} diff --git a/lib/core/enums/devices_accessibility.g.dart b/lib/core/enums/devices_accessibility.g.dart new file mode 100644 index 00000000..1806cd25 --- /dev/null +++ b/lib/core/enums/devices_accessibility.g.dart @@ -0,0 +1,56 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'devices_accessibility.dart'; + +// ************************************************************************** +// TypeAdapterGenerator +// ************************************************************************** + +class DevicesAccessibilityAdapter extends TypeAdapter { + @override + final int typeId = 22; + + @override + DevicesAccessibility read(BinaryReader reader) { + switch (reader.readByte()) { + case 0: + return DevicesAccessibility.none; + case 1: + return DevicesAccessibility.press; + case 2: + return DevicesAccessibility.scroll; + case 3: + return DevicesAccessibility.sipuff; + default: + return DevicesAccessibility.none; + } + } + + @override + void write(BinaryWriter writer, DevicesAccessibility obj) { + switch (obj) { + case DevicesAccessibility.none: + writer.writeByte(0); + break; + case DevicesAccessibility.press: + writer.writeByte(1); + break; + case DevicesAccessibility.scroll: + writer.writeByte(2); + break; + case DevicesAccessibility.sipuff: + writer.writeByte(3); + break; + } + } + + @override + int get hashCode => typeId.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is DevicesAccessibilityAdapter && + runtimeType == other.runtimeType && + typeId == other.typeId; +} diff --git a/lib/core/enums/display_types.dart b/lib/core/enums/display_types.dart new file mode 100644 index 00000000..a313cc46 --- /dev/null +++ b/lib/core/enums/display_types.dart @@ -0,0 +1,13 @@ +import 'package:hive/hive.dart'; +import 'package:ottaa_project_flutter/core/abstracts/hive_type_ids.dart'; + +part 'display_types.g.dart'; + +@HiveType(typeId: HiveTypesIds.displayTypeEnumTypeId) +enum DisplayTypes { + @HiveField(0) + grid, + + @HiveField(1) + tab, +} diff --git a/lib/core/enums/display_types.g.dart b/lib/core/enums/display_types.g.dart new file mode 100644 index 00000000..6f12896d --- /dev/null +++ b/lib/core/enums/display_types.g.dart @@ -0,0 +1,46 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'display_types.dart'; + +// ************************************************************************** +// TypeAdapterGenerator +// ************************************************************************** + +class DisplayTypesAdapter extends TypeAdapter { + @override + final int typeId = 21; + + @override + DisplayTypes read(BinaryReader reader) { + switch (reader.readByte()) { + case 0: + return DisplayTypes.grid; + case 1: + return DisplayTypes.tab; + default: + return DisplayTypes.grid; + } + } + + @override + void write(BinaryWriter writer, DisplayTypes obj) { + switch (obj) { + case DisplayTypes.grid: + writer.writeByte(0); + break; + case DisplayTypes.tab: + writer.writeByte(1); + break; + } + } + + @override + int get hashCode => typeId.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is DisplayTypesAdapter && + runtimeType == other.runtimeType && + typeId == other.typeId; +} diff --git a/lib/core/enums/home_screen_status.dart b/lib/core/enums/home_screen_status.dart new file mode 100644 index 00000000..feb153fd --- /dev/null +++ b/lib/core/enums/home_screen_status.dart @@ -0,0 +1,7 @@ +enum HomeScreenStatus { + pictos, + grid, + tabs, + favorites, + history, +} diff --git a/lib/core/enums/size_types.dart b/lib/core/enums/size_types.dart new file mode 100644 index 00000000..fe7f189a --- /dev/null +++ b/lib/core/enums/size_types.dart @@ -0,0 +1,14 @@ +import 'package:hive_flutter/hive_flutter.dart'; +import 'package:ottaa_project_flutter/core/abstracts/hive_type_ids.dart'; + +part 'size_types.g.dart'; + +@HiveType(typeId: HiveTypesIds.sizeTypeEnumTypeId) +enum SizeTypes { + @HiveField(0) + small, + @HiveField(1) + mid, + @HiveField(2) + big, +} diff --git a/lib/core/enums/size_types.g.dart b/lib/core/enums/size_types.g.dart new file mode 100644 index 00000000..9ed25b58 --- /dev/null +++ b/lib/core/enums/size_types.g.dart @@ -0,0 +1,51 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'size_types.dart'; + +// ************************************************************************** +// TypeAdapterGenerator +// ************************************************************************** + +class SizeTypesAdapter extends TypeAdapter { + @override + final int typeId = 25; + + @override + SizeTypes read(BinaryReader reader) { + switch (reader.readByte()) { + case 0: + return SizeTypes.small; + case 1: + return SizeTypes.mid; + case 2: + return SizeTypes.big; + default: + return SizeTypes.small; + } + } + + @override + void write(BinaryWriter writer, SizeTypes obj) { + switch (obj) { + case SizeTypes.small: + writer.writeByte(0); + break; + case SizeTypes.mid: + writer.writeByte(1); + break; + case SizeTypes.big: + writer.writeByte(2); + break; + } + } + + @override + int get hashCode => typeId.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is SizeTypesAdapter && + runtimeType == other.runtimeType && + typeId == other.typeId; +} diff --git a/lib/core/enums/sweep_modes.dart b/lib/core/enums/sweep_modes.dart new file mode 100644 index 00000000..4117d0ab --- /dev/null +++ b/lib/core/enums/sweep_modes.dart @@ -0,0 +1,13 @@ +import 'package:hive/hive.dart'; +import 'package:ottaa_project_flutter/core/abstracts/hive_type_ids.dart'; + +part 'sweep_modes.g.dart'; + +@HiveType(typeId: HiveTypesIds.sweepModesEnumTypeId) +enum SweepModes { + @HiveField(0) + elements, + + @HiveField(1) + sweep, +} diff --git a/lib/core/enums/sweep_modes.g.dart b/lib/core/enums/sweep_modes.g.dart new file mode 100644 index 00000000..c15491ce --- /dev/null +++ b/lib/core/enums/sweep_modes.g.dart @@ -0,0 +1,46 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'sweep_modes.dart'; + +// ************************************************************************** +// TypeAdapterGenerator +// ************************************************************************** + +class SweepModesAdapter extends TypeAdapter { + @override + final int typeId = 23; + + @override + SweepModes read(BinaryReader reader) { + switch (reader.readByte()) { + case 0: + return SweepModes.elements; + case 1: + return SweepModes.sweep; + default: + return SweepModes.elements; + } + } + + @override + void write(BinaryWriter writer, SweepModes obj) { + switch (obj) { + case SweepModes.elements: + writer.writeByte(0); + break; + case SweepModes.sweep: + writer.writeByte(1); + break; + } + } + + @override + int get hashCode => typeId.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is SweepModesAdapter && + runtimeType == other.runtimeType && + typeId == other.typeId; +} diff --git a/lib/core/enums/user_payment.dart b/lib/core/enums/user_payment.dart new file mode 100644 index 00000000..85be4fbc --- /dev/null +++ b/lib/core/enums/user_payment.dart @@ -0,0 +1 @@ +enum UserPayment { free, premium } diff --git a/lib/core/enums/user_types.dart b/lib/core/enums/user_types.dart index 088a9f6c..bae662ad 100644 --- a/lib/core/enums/user_types.dart +++ b/lib/core/enums/user_types.dart @@ -1 +1,14 @@ -enum UserType { free, premium } +import 'package:hive/hive.dart'; +import 'package:ottaa_project_flutter/core/abstracts/hive_type_ids.dart'; + +part 'user_types.g.dart'; + +@HiveType(typeId: HiveTypesIds.userEnumTypeId) +enum UserType { + @HiveField(0) + caregiver, + @HiveField(1) + user, + @HiveField(2, defaultValue: true) + none, +} diff --git a/lib/core/enums/user_types.g.dart b/lib/core/enums/user_types.g.dart new file mode 100644 index 00000000..6061916e --- /dev/null +++ b/lib/core/enums/user_types.g.dart @@ -0,0 +1,51 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'user_types.dart'; + +// ************************************************************************** +// TypeAdapterGenerator +// ************************************************************************** + +class UserTypeAdapter extends TypeAdapter { + @override + final int typeId = 19; + + @override + UserType read(BinaryReader reader) { + switch (reader.readByte()) { + case 0: + return UserType.caregiver; + case 1: + return UserType.user; + case 2: + return UserType.none; + default: + return UserType.none; + } + } + + @override + void write(BinaryWriter writer, UserType obj) { + switch (obj) { + case UserType.caregiver: + writer.writeByte(0); + break; + case UserType.user: + writer.writeByte(1); + break; + case UserType.none: + writer.writeByte(2); + break; + } + } + + @override + int get hashCode => typeId.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is UserTypeAdapter && + runtimeType == other.runtimeType && + typeId == other.typeId; +} diff --git a/lib/core/enums/velocity_types.dart b/lib/core/enums/velocity_types.dart new file mode 100644 index 00000000..7976e7fa --- /dev/null +++ b/lib/core/enums/velocity_types.dart @@ -0,0 +1,16 @@ +import 'package:hive_flutter/hive_flutter.dart'; +import 'package:ottaa_project_flutter/core/abstracts/hive_type_ids.dart'; + +part 'velocity_types.g.dart'; + +@HiveType(typeId: HiveTypesIds.velocityTypeEnumTypeId) +enum VelocityTypes { + @HiveField(0) + slow, + + @HiveField(1) + mid, + + @HiveField(2) + fast, +} diff --git a/lib/core/enums/velocity_types.g.dart b/lib/core/enums/velocity_types.g.dart new file mode 100644 index 00000000..69e6b14e --- /dev/null +++ b/lib/core/enums/velocity_types.g.dart @@ -0,0 +1,51 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'velocity_types.dart'; + +// ************************************************************************** +// TypeAdapterGenerator +// ************************************************************************** + +class VelocityTypesAdapter extends TypeAdapter { + @override + final int typeId = 24; + + @override + VelocityTypes read(BinaryReader reader) { + switch (reader.readByte()) { + case 0: + return VelocityTypes.slow; + case 1: + return VelocityTypes.mid; + case 2: + return VelocityTypes.fast; + default: + return VelocityTypes.slow; + } + } + + @override + void write(BinaryWriter writer, VelocityTypes obj) { + switch (obj) { + case VelocityTypes.slow: + writer.writeByte(0); + break; + case VelocityTypes.mid: + writer.writeByte(1); + break; + case VelocityTypes.fast: + writer.writeByte(2); + break; + } + } + + @override + int get hashCode => typeId.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is VelocityTypesAdapter && + runtimeType == other.runtimeType && + typeId == other.typeId; +} diff --git a/lib/core/models/accessibility_setting.dart b/lib/core/models/accessibility_setting.dart new file mode 100644 index 00000000..0da492cf --- /dev/null +++ b/lib/core/models/accessibility_setting.dart @@ -0,0 +1,114 @@ +// coverage:ignore-file + +import 'dart:convert'; + +import 'package:hive/hive.dart'; + +import 'package:ottaa_project_flutter/core/abstracts/hive_type_ids.dart'; +import 'package:ottaa_project_flutter/core/enums/devices_accessibility.dart'; +import 'package:ottaa_project_flutter/core/enums/sweep_modes.dart'; +import 'package:ottaa_project_flutter/core/enums/velocity_types.dart'; + +part 'accessibility_setting.g.dart'; + +@HiveType(typeId: HiveTypesIds.accessibilityTypeId) +class AccessibilitySetting { + @HiveField(0, defaultValue: DevicesAccessibility.none) + DevicesAccessibility device; + + @HiveField(1, defaultValue: SweepModes.elements) + SweepModes sweepMode; + + @HiveField(2, defaultValue: VelocityTypes.mid) + VelocityTypes sweepSpeed; + + @HiveField(3, defaultValue: VelocityTypes.mid) + VelocityTypes clickTime; + AccessibilitySetting({ + required this.device, + required this.sweepMode, + required this.sweepSpeed, + required this.clickTime, + }); + + AccessibilitySetting copyWith({ + DevicesAccessibility? device, + SweepModes? sweepMode, + VelocityTypes? sweepSpeed, + VelocityTypes? clickTime, + }) { + return AccessibilitySetting( + device: device ?? this.device, + sweepMode: sweepMode ?? this.sweepMode, + sweepSpeed: sweepSpeed ?? this.sweepSpeed, + clickTime: clickTime ?? this.clickTime, + ); + } + + factory AccessibilitySetting.empty() { + return AccessibilitySetting( + device: DevicesAccessibility.none, + sweepMode: SweepModes.elements, + sweepSpeed: VelocityTypes.mid, + clickTime: VelocityTypes.mid, + ); + } + + Map toMap() { + return { + 'device': device.name, + 'sweepMode': sweepMode.name, + 'sweepSpeed': sweepSpeed.name, + 'clickTime': clickTime.name, + }; + } + + factory AccessibilitySetting.fromMap(Map map) { + return AccessibilitySetting( + device: DevicesAccessibility.values.firstWhere( + (e) => e.name == map['device'].toString(), + orElse: () => DevicesAccessibility.none, + ), + sweepMode: SweepModes.values.firstWhere( + (e) => e.name == map['sweepMode'].toString(), + orElse: () => SweepModes.elements, + ), + sweepSpeed: VelocityTypes.values.firstWhere( + (e) => e.name == map['sweepSpeed'].toString(), + orElse: () => VelocityTypes.mid, + ), + clickTime: VelocityTypes.values.firstWhere( + (e) => e.name == map['clickTime'].toString(), + orElse: () => VelocityTypes.mid, + ), + ); + } + + String toJson() => json.encode(toMap()); + + factory AccessibilitySetting.fromJson(String source) => + AccessibilitySetting.fromMap(json.decode(source) as Map); + + @override + String toString() { + return 'AccessibilitySetting(device: $device, sweepMode: $sweepMode, sweepSpeed: $sweepSpeed, clickTime: $clickTime)'; + } + + @override + bool operator ==(covariant AccessibilitySetting other) { + if (identical(this, other)) return true; + + return other.device == device && + other.sweepMode == sweepMode && + other.sweepSpeed == sweepSpeed && + other.clickTime == clickTime; + } + + @override + int get hashCode { + return device.hashCode ^ + sweepMode.hashCode ^ + sweepSpeed.hashCode ^ + clickTime.hashCode; + } +} diff --git a/lib/core/models/accessibility_setting.g.dart b/lib/core/models/accessibility_setting.g.dart new file mode 100644 index 00000000..62cce042 --- /dev/null +++ b/lib/core/models/accessibility_setting.g.dart @@ -0,0 +1,55 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'accessibility_setting.dart'; + +// ************************************************************************** +// TypeAdapterGenerator +// ************************************************************************** + +class AccessibilitySettingAdapter extends TypeAdapter { + @override + final int typeId = 26; + + @override + AccessibilitySetting read(BinaryReader reader) { + final numOfFields = reader.readByte(); + final fields = { + for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(), + }; + return AccessibilitySetting( + device: fields[0] == null + ? DevicesAccessibility.none + : fields[0] as DevicesAccessibility, + sweepMode: + fields[1] == null ? SweepModes.elements : fields[1] as SweepModes, + sweepSpeed: + fields[2] == null ? VelocityTypes.mid : fields[2] as VelocityTypes, + clickTime: + fields[3] == null ? VelocityTypes.mid : fields[3] as VelocityTypes, + ); + } + + @override + void write(BinaryWriter writer, AccessibilitySetting obj) { + writer + ..writeByte(4) + ..writeByte(0) + ..write(obj.device) + ..writeByte(1) + ..write(obj.sweepMode) + ..writeByte(2) + ..write(obj.sweepSpeed) + ..writeByte(3) + ..write(obj.clickTime); + } + + @override + int get hashCode => typeId.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is AccessibilitySettingAdapter && + runtimeType == other.runtimeType && + typeId == other.typeId; +} diff --git a/lib/core/models/search_model.dart b/lib/core/models/arsaac_data_model.dart similarity index 80% rename from lib/core/models/search_model.dart rename to lib/core/models/arsaac_data_model.dart index 750f8f6f..a9b43e22 100644 --- a/lib/core/models/search_model.dart +++ b/lib/core/models/arsaac_data_model.dart @@ -1,10 +1,10 @@ import 'package:json_annotation/json_annotation.dart'; -part 'search_model.g.dart'; +part 'arsaac_data_model.g.dart'; @JsonSerializable() -class SearchModel { - SearchModel({ +class ArsaacDataModel { + ArsaacDataModel({ required this.id, required this.text, this.textDiacritised, @@ -21,9 +21,9 @@ class SearchModel { String language; SearchPicto picto; - factory SearchModel.fromJson(Map json) => _$SearchModelFromJson(json); + factory ArsaacDataModel.fromJson(Map json) => _$ArsaacDataModelFromJson(json); - Map toJson() => _$SearchModelToJson(this); + Map toJson() => _$ArsaacDataModelToJson(this); } @JsonSerializable() diff --git a/lib/core/models/search_model.g.dart b/lib/core/models/arsaac_data_model.g.dart similarity index 88% rename from lib/core/models/search_model.g.dart rename to lib/core/models/arsaac_data_model.g.dart index e682be17..4cf192a9 100644 --- a/lib/core/models/search_model.g.dart +++ b/lib/core/models/arsaac_data_model.g.dart @@ -1,12 +1,13 @@ // GENERATED CODE - DO NOT MODIFY BY HAND -part of 'search_model.dart'; +part of 'arsaac_data_model.dart'; // ************************************************************************** // JsonSerializableGenerator // ************************************************************************** -SearchModel _$SearchModelFromJson(Map json) => SearchModel( +ArsaacDataModel _$ArsaacDataModelFromJson(Map json) => + ArsaacDataModel( id: json['id'] as int, text: json['text'] as String, textDiacritised: json['text_diacritised'] as String?, @@ -15,7 +16,7 @@ SearchModel _$SearchModelFromJson(Map json) => SearchModel( picto: SearchPicto.fromJson(json['picto'] as Map), ); -Map _$SearchModelToJson(SearchModel instance) => +Map _$ArsaacDataModelToJson(ArsaacDataModel instance) => { 'id': instance.id, 'text': instance.text, diff --git a/lib/core/models/assets_image.dart b/lib/core/models/assets_image.dart new file mode 100644 index 00000000..3c1e9d3a --- /dev/null +++ b/lib/core/models/assets_image.dart @@ -0,0 +1,65 @@ +// ignore_for_file: public_member_api_docs, sort_constructors_first +// coverage:ignore-file +import 'dart:convert'; + +import 'package:hive_flutter/hive_flutter.dart'; + +import 'package:ottaa_project_flutter/core/abstracts/hive_type_ids.dart'; + +part 'assets_image.g.dart'; + +@HiveType(typeId: HiveTypesIds.assetsTypeId) +class AssetsImage { + @HiveField(0) + String asset; + + @HiveField(1) + String? network; + + AssetsImage({ + required this.asset, + required this.network, + }); + + AssetsImage copyWith({ + String? asset, + String? network, + }) { + return AssetsImage( + asset: asset ?? this.asset, + network: network ?? this.network, + ); + } + + Map toMap() { + return { + 'asset': asset, + 'network': network, + }; + } + + factory AssetsImage.fromMap(Map map) { + return AssetsImage( + asset: map['asset'] as String, + network: map['network'] != null ? map['network'] as String : null, + ); + } + + String toJson() => json.encode(toMap()); + + factory AssetsImage.fromJson(String source) => + AssetsImage.fromMap(json.decode(source) as Map); + + @override + String toString() => 'AssetsImage(asset: $asset, network: $network)'; + + @override + bool operator ==(covariant AssetsImage other) { + if (identical(this, other)) return true; + + return other.asset == asset && other.network == network; + } + + @override + int get hashCode => asset.hashCode ^ network.hashCode; +} diff --git a/lib/core/models/assets_image.g.dart b/lib/core/models/assets_image.g.dart new file mode 100644 index 00000000..6b7d7d2d --- /dev/null +++ b/lib/core/models/assets_image.g.dart @@ -0,0 +1,44 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'assets_image.dart'; + +// ************************************************************************** +// TypeAdapterGenerator +// ************************************************************************** + +class AssetsImageAdapter extends TypeAdapter { + @override + final int typeId = 17; + + @override + AssetsImage read(BinaryReader reader) { + final numOfFields = reader.readByte(); + final fields = { + for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(), + }; + return AssetsImage( + asset: fields[0] as String, + network: fields[1] as String?, + ); + } + + @override + void write(BinaryWriter writer, AssetsImage obj) { + writer + ..writeByte(2) + ..writeByte(0) + ..write(obj.asset) + ..writeByte(1) + ..write(obj.network); + } + + @override + int get hashCode => typeId.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is AssetsImageAdapter && + runtimeType == other.runtimeType && + typeId == other.typeId; +} diff --git a/lib/core/models/base_settings_model.dart b/lib/core/models/base_settings_model.dart new file mode 100644 index 00000000..2a36db92 --- /dev/null +++ b/lib/core/models/base_settings_model.dart @@ -0,0 +1,71 @@ +// coverage:ignore-file +import 'dart:convert'; + +import 'package:hive_flutter/hive_flutter.dart'; +import 'package:ottaa_project_flutter/core/abstracts/hive_type_ids.dart'; +import 'package:ottaa_project_flutter/core/abstracts/user_settings.dart'; +import 'package:ottaa_project_flutter/core/models/language_setting.dart'; +import 'package:ottaa_project_flutter/core/models/user_data_model.dart'; + +part 'base_settings_model.g.dart'; + +@HiveType(typeId: HiveTypesIds.baseSettingsTypeId) +class BaseSettingsModel extends UserSettings { + @override + @HiveField(0) + UserData data; + + @override + @HiveField(1) + LanguageSetting language; + + BaseSettingsModel({ + required this.data, + required this.language, + }); + + BaseSettingsModel copyWith({ + UserData? data, + LanguageSetting? language, + }) { + return BaseSettingsModel( + data: data ?? this.data, + language: language ?? this.language, + ); + } + + @override + Map toMap() { + return { + 'data': data.toMap(), + 'language': language.toMap(), + }; + } + + factory BaseSettingsModel.fromMap(Map map) { + return BaseSettingsModel( + data: UserData.fromMap(Map.from(map['data'] as dynamic)), + language: map['language'] == null + ? LanguageSetting.empty() + : LanguageSetting.fromMap(Map.from(map['language'] as dynamic)), + ); + } + + String toJson() => json.encode(toMap()); + + factory BaseSettingsModel.fromJson(String source) => + BaseSettingsModel.fromMap(json.decode(source) as Map); + + @override + String toString() => 'CaregiverSettings(data: $data, language: $language)'; + + @override + bool operator ==(covariant BaseSettingsModel other) { + if (identical(this, other)) return true; + + return other.data == data && other.language == language; + } + + @override + int get hashCode => data.hashCode ^ language.hashCode; +} diff --git a/lib/core/models/base_settings_model.g.dart b/lib/core/models/base_settings_model.g.dart new file mode 100644 index 00000000..17782083 --- /dev/null +++ b/lib/core/models/base_settings_model.g.dart @@ -0,0 +1,44 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'base_settings_model.dart'; + +// ************************************************************************** +// TypeAdapterGenerator +// ************************************************************************** + +class BaseSettingsModelAdapter extends TypeAdapter { + @override + final int typeId = 15; + + @override + BaseSettingsModel read(BinaryReader reader) { + final numOfFields = reader.readByte(); + final fields = { + for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(), + }; + return BaseSettingsModel( + data: fields[0] as UserData, + language: fields[1] as LanguageSetting, + ); + } + + @override + void write(BinaryWriter writer, BaseSettingsModel obj) { + writer + ..writeByte(2) + ..writeByte(0) + ..write(obj.data) + ..writeByte(1) + ..write(obj.language); + } + + @override + int get hashCode => typeId.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is BaseSettingsModelAdapter && + runtimeType == other.runtimeType && + typeId == other.typeId; +} diff --git a/lib/core/models/base_user_model.dart b/lib/core/models/base_user_model.dart new file mode 100644 index 00000000..ccc7c70c --- /dev/null +++ b/lib/core/models/base_user_model.dart @@ -0,0 +1,83 @@ +// coverage:ignore-file +import 'dart:convert'; + +import 'package:hive_flutter/hive_flutter.dart'; +import 'package:ottaa_project_flutter/core/abstracts/hive_type_ids.dart'; + +import 'package:ottaa_project_flutter/core/abstracts/user_model.dart'; +import 'package:ottaa_project_flutter/core/abstracts/user_settings.dart'; +import 'package:ottaa_project_flutter/core/enums/user_types.dart'; +import 'package:ottaa_project_flutter/core/models/base_settings_model.dart'; +import 'package:ottaa_project_flutter/core/models/devices_token.dart'; + +part 'base_user_model.g.dart'; + +@HiveType(typeId: HiveTypesIds.baseUserTypeId) +class BaseUserModel extends UserModel { + @override + @HiveField(0) + String id; + + @override + @HiveField(3) + UserSettings settings; + + @override + @HiveField(5) + UserType type; + + @override + @HiveField(6) + String email; + + @override + @HiveField(7) + DeviceToken? currentToken; + + BaseUserModel({ + required this.id, + required this.settings, + required this.email, + this.type = UserType.none, + }); + + @override + UserModel fromJson(Map json) => BaseUserModel( + id: json['id'], + settings: BaseSettingsModel.fromMap(json['settings']), + type: UserType.values.firstWhere((element) => element.name == json['type']), + email: json['email'] ?? "", + ); + + factory BaseUserModel.fromMap(Map json) => BaseUserModel( + id: json['id'], + settings: BaseSettingsModel.fromMap(Map.from(json['settings'] as Map)), + type: UserType.values.firstWhere((element) => element.name == json['type']), + email: json['email'] ?? "", + ); + + @override + String toJson() => json.encode(toMap()); + + @override + Map toMap() => { + 'id': id, + 'settings': settings.toMap(), + 'type': type.name, + 'email': email, + }; + + UserModel copyWith({ + String? id, + UserSettings? settings, + UserType? type, + String? email, + }) { + return BaseUserModel( + id: id ?? this.id, + settings: settings ?? this.settings, + type: type ?? this.type, + email: email ?? this.email, + ); + } +} diff --git a/lib/core/models/base_user_model.g.dart b/lib/core/models/base_user_model.g.dart new file mode 100644 index 00000000..3b5e84a4 --- /dev/null +++ b/lib/core/models/base_user_model.g.dart @@ -0,0 +1,52 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'base_user_model.dart'; + +// ************************************************************************** +// TypeAdapterGenerator +// ************************************************************************** + +class BaseUserModelAdapter extends TypeAdapter { + @override + final int typeId = 18; + + @override + BaseUserModel read(BinaryReader reader) { + final numOfFields = reader.readByte(); + final fields = { + for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(), + }; + return BaseUserModel( + id: fields[0] as String, + settings: fields[3] as UserSettings, + email: fields[6] as String, + type: fields[5] as UserType, + )..currentToken = fields[7] as DeviceToken?; + } + + @override + void write(BinaryWriter writer, BaseUserModel obj) { + writer + ..writeByte(5) + ..writeByte(0) + ..write(obj.id) + ..writeByte(3) + ..write(obj.settings) + ..writeByte(5) + ..write(obj.type) + ..writeByte(6) + ..write(obj.email) + ..writeByte(7) + ..write(obj.currentToken); + } + + @override + int get hashCode => typeId.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is BaseUserModelAdapter && + runtimeType == other.runtimeType && + typeId == other.typeId; +} diff --git a/lib/core/models/caregiver_user_model.dart b/lib/core/models/caregiver_user_model.dart new file mode 100644 index 00000000..f9facdd7 --- /dev/null +++ b/lib/core/models/caregiver_user_model.dart @@ -0,0 +1,185 @@ +// coverage:ignore-file +// ignore_for_file: public_member_api_docs, sort_constructors_first +import 'dart:convert'; + +import 'package:flutter/foundation.dart'; +import 'package:hive/hive.dart'; + +import 'package:ottaa_project_flutter/core/abstracts/hive_type_ids.dart'; +import 'package:ottaa_project_flutter/core/abstracts/user_model.dart'; +import 'package:ottaa_project_flutter/core/abstracts/user_settings.dart'; +import 'package:ottaa_project_flutter/core/enums/user_types.dart'; +import 'package:ottaa_project_flutter/core/models/base_settings_model.dart'; +import 'package:ottaa_project_flutter/core/models/devices_token.dart'; + +part 'caregiver_user_model.g.dart'; + +@HiveType(typeId: HiveTypesIds.caregiverUserTypeId) +class CaregiverUserModel extends UserModel { + @override + @HiveField(0) + String id; + + @override + @HiveField(1) + UserSettings settings; + + @override + @HiveField(2) + final UserType type; + + @HiveField(3) + final Map users; + + @override + @HiveField(4) + String email; + + @override + @HiveField(5) + DeviceToken? currentToken; + + CaregiverUserModel({ + required this.id, + required this.settings, + this.type = UserType.caregiver, + required this.users, + required this.email, + }); + + CaregiverUserModel copyWith({ + String? id, + BaseSettingsModel? settings, + UserType? type, + Map? users, + String? email, + }) { + return CaregiverUserModel( + id: id ?? this.id, + settings: settings ?? this.settings, + type: type ?? this.type, + users: users ?? this.users, + email: email ?? this.email, + ); + } + + @override + Map toMap() { + return { + 'id': id, + 'settings': settings.toMap(), + 'type': type.name, + 'users': users.map((key, value) => MapEntry(key, value.toMap())), + 'email': email + }; + } + + factory CaregiverUserModel.fromMap(Map map) { + return CaregiverUserModel( + id: map['id'] as String, + settings: BaseSettingsModel.fromMap( + Map.from(map['settings'] as Map)), + type: UserType.caregiver, + users: (map['users']) != null + ? Map.from((map['users'] as Map).map( + (key, value) => MapEntry( + key, + CaregiverUsers.fromMap( + Map.from(value as Map), + )), + )) + : {}, + email: map['email'] ?? "", + ); + } + + factory CaregiverUserModel.fromJson(String source) => + CaregiverUserModel.fromMap(json.decode(source) as Map); + + @override + String toString() { + return 'CaregiverUserModel(id: $id, settings: $settings, type: $type, users: $users, email: $email)'; + } + + @override + bool operator ==(covariant CaregiverUserModel other) { + if (identical(this, other)) return true; + + return other.id == id && + other.settings == settings && + other.type == type && + mapEquals(other.users, users) && + other.email == email; + } + + @override + int get hashCode { + return id.hashCode ^ + settings.hashCode ^ + type.hashCode ^ + users.hashCode ^ + email.hashCode; + } + + @override + UserModel fromJson(Map json) => + CaregiverUserModel.fromMap(json); + + @override + String toJson() => json.encode(toMap()); +} + +@HiveType(typeId: HiveTypesIds.caregiverUsersTypeId) +class CaregiverUsers { + @HiveField(0) + final String id; + @HiveField(1) + final String alias; + + const CaregiverUsers({ + required this.id, + required this.alias, + }); + + CaregiverUsers copyWith({ + String? id, + String? alias, + }) { + return CaregiverUsers( + alias: alias ?? this.alias, + id: id ?? this.id, + ); + } + + Map toMap() { + return { + 'alias': alias, + 'id': id, + }; + } + + factory CaregiverUsers.fromMap(Map map) { + return CaregiverUsers( + alias: map['alias'] as String, + id: map['id'] as String, + ); + } + + String toJson() => json.encode(toMap()); + + factory CaregiverUsers.fromJson(String source) => + CaregiverUsers.fromMap(json.decode(source) as Map); + + @override + String toString() => 'CaregiverUsers(alias: $alias)'; + + @override + bool operator ==(covariant CaregiverUsers other) { + if (identical(this, other)) return true; + + return other.alias == alias; + } + + @override + int get hashCode => alias.hashCode; +} diff --git a/lib/core/models/caregiver_user_model.g.dart b/lib/core/models/caregiver_user_model.g.dart new file mode 100644 index 00000000..b30b44a4 --- /dev/null +++ b/lib/core/models/caregiver_user_model.g.dart @@ -0,0 +1,92 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'caregiver_user_model.dart'; + +// ************************************************************************** +// TypeAdapterGenerator +// ************************************************************************** + +class CaregiverUserModelAdapter extends TypeAdapter { + @override + final int typeId = 14; + + @override + CaregiverUserModel read(BinaryReader reader) { + final numOfFields = reader.readByte(); + final fields = { + for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(), + }; + return CaregiverUserModel( + id: fields[0] as String, + settings: fields[1] as UserSettings, + type: fields[2] as UserType, + users: (fields[3] as Map).cast(), + email: fields[4] as String, + )..currentToken = fields[5] as DeviceToken?; + } + + @override + void write(BinaryWriter writer, CaregiverUserModel obj) { + writer + ..writeByte(6) + ..writeByte(0) + ..write(obj.id) + ..writeByte(1) + ..write(obj.settings) + ..writeByte(2) + ..write(obj.type) + ..writeByte(3) + ..write(obj.users) + ..writeByte(4) + ..write(obj.email) + ..writeByte(5) + ..write(obj.currentToken); + } + + @override + int get hashCode => typeId.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is CaregiverUserModelAdapter && + runtimeType == other.runtimeType && + typeId == other.typeId; +} + +class CaregiverUsersAdapter extends TypeAdapter { + @override + final int typeId = 16; + + @override + CaregiverUsers read(BinaryReader reader) { + final numOfFields = reader.readByte(); + final fields = { + for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(), + }; + return CaregiverUsers( + id: fields[0] as String, + alias: fields[1] as String, + ); + } + + @override + void write(BinaryWriter writer, CaregiverUsers obj) { + writer + ..writeByte(2) + ..writeByte(0) + ..write(obj.id) + ..writeByte(1) + ..write(obj.alias); + } + + @override + int get hashCode => typeId.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is CaregiverUsersAdapter && + runtimeType == other.runtimeType && + typeId == other.typeId; +} diff --git a/lib/core/models/report_chart_data_model.dart b/lib/core/models/chart_model.dart similarity index 100% rename from lib/core/models/report_chart_data_model.dart rename to lib/core/models/chart_model.dart diff --git a/lib/core/models/devices_token.dart b/lib/core/models/devices_token.dart new file mode 100644 index 00000000..d8bbd35a --- /dev/null +++ b/lib/core/models/devices_token.dart @@ -0,0 +1,63 @@ +// coverage:ignore-file +import 'dart:convert'; + +import 'package:hive/hive.dart'; +import 'package:ottaa_project_flutter/core/abstracts/hive_type_ids.dart'; + +part 'devices_token.g.dart'; + +@HiveType(typeId: HiveTypesIds.userDeviceTypeId) +class DeviceToken { + @HiveField(0) + final String deviceToken; + @HiveField(1) + DateTime lastUsage; + + DeviceToken({ + required this.deviceToken, + required this.lastUsage, + }); + + DeviceToken copyWith({ + String? deviceToken, + DateTime? lastUsage, + }) { + return DeviceToken( + deviceToken: deviceToken ?? this.deviceToken, + lastUsage: lastUsage ?? this.lastUsage, + ); + } + + Map toMap() { + return { + 'deviceToken': deviceToken, + 'lastUsage': lastUsage.millisecondsSinceEpoch, + }; + } + + factory DeviceToken.fromMap(Map map) { + return DeviceToken( + deviceToken: map['deviceToken'] as String, + lastUsage: DateTime.fromMillisecondsSinceEpoch(map['lastUsage'] as int), + ); + } + + String toJson() => json.encode(toMap()); + + factory DeviceToken.fromJson(String source) => + DeviceToken.fromMap(json.decode(source) as Map); + + @override + String toString() => + 'DeviceToken(deviceToken: $deviceToken, lastUsage: $lastUsage)'; + + @override + bool operator ==(covariant DeviceToken other) { + if (identical(this, other)) return true; + + return other.deviceToken == deviceToken; + } + + @override + int get hashCode => deviceToken.hashCode; +} diff --git a/lib/core/models/devices_token.g.dart b/lib/core/models/devices_token.g.dart new file mode 100644 index 00000000..dab13553 --- /dev/null +++ b/lib/core/models/devices_token.g.dart @@ -0,0 +1,44 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'devices_token.dart'; + +// ************************************************************************** +// TypeAdapterGenerator +// ************************************************************************** + +class DeviceTokenAdapter extends TypeAdapter { + @override + final int typeId = 31; + + @override + DeviceToken read(BinaryReader reader) { + final numOfFields = reader.readByte(); + final fields = { + for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(), + }; + return DeviceToken( + deviceToken: fields[0] as String, + lastUsage: fields[1] as DateTime, + ); + } + + @override + void write(BinaryWriter writer, DeviceToken obj) { + writer + ..writeByte(2) + ..writeByte(0) + ..write(obj.deviceToken) + ..writeByte(1) + ..write(obj.lastUsage); + } + + @override + int get hashCode => typeId.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is DeviceTokenAdapter && + runtimeType == other.runtimeType && + typeId == other.typeId; +} diff --git a/lib/core/models/game_data_model.dart b/lib/core/models/game_data_model.dart deleted file mode 100644 index ba8f17a5..00000000 --- a/lib/core/models/game_data_model.dart +++ /dev/null @@ -1,62 +0,0 @@ -import 'package:json_annotation/json_annotation.dart'; - -part 'game_data_model.g.dart'; - -@JsonSerializable() -class GameData { - GameData({ - required this.game, - required this.levelId, - required this.bestStreak, - required this.score, - this.reloj, - required this.timeUse, - }); - - int game; - int levelId; - int bestStreak; - Score score; - List? reloj; - int timeUse; - - factory GameData.fromJson(Map json) => _$GameDataFromJson(json); - - Map toJson() => _$GameDataToJson(this); -} - -@JsonSerializable() -class Score { - Score({ - required this.hit, - required this.mistakes, - required this.score, - required this.tries, - }); - - int hit; - int mistakes; - double score; - int tries; - - factory Score.fromJson(Map json) => _$ScoreFromJson(json); - - Map toJson() => _$ScoreToJson(this); -} - -@JsonSerializable() -class RelojElement { - RelojElement({ - required this.startTime, - required this.endTime, - required this.useTime, - }); - - int startTime; - int endTime; - int useTime; - - factory RelojElement.fromJson(Map json) => _$RelojElementFromJson(json); - - Map toJson() => _$RelojElementToJson(this); -} diff --git a/lib/core/models/game_data_model.g.dart b/lib/core/models/game_data_model.g.dart deleted file mode 100644 index 230cf2d5..00000000 --- a/lib/core/models/game_data_model.g.dart +++ /dev/null @@ -1,54 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'game_data_model.dart'; - -// ************************************************************************** -// JsonSerializableGenerator -// ************************************************************************** - -GameData _$GameDataFromJson(Map json) => GameData( - game: json['game'] as int, - levelId: json['levelId'] as int, - bestStreak: json['bestStreak'] as int, - score: Score.fromJson(json['score'] as Map), - reloj: (json['reloj'] as List?) - ?.map((e) => RelojElement.fromJson(e as Map)) - .toList(), - timeUse: json['timeUse'] as int, - ); - -Map _$GameDataToJson(GameData instance) => { - 'game': instance.game, - 'levelId': instance.levelId, - 'bestStreak': instance.bestStreak, - 'score': instance.score, - 'reloj': instance.reloj, - 'timeUse': instance.timeUse, - }; - -Score _$ScoreFromJson(Map json) => Score( - hit: json['hit'] as int, - mistakes: json['mistakes'] as int, - score: (json['score'] as num).toDouble(), - tries: json['tries'] as int, - ); - -Map _$ScoreToJson(Score instance) => { - 'hit': instance.hit, - 'mistakes': instance.mistakes, - 'score': instance.score, - 'tries': instance.tries, - }; - -RelojElement _$RelojElementFromJson(Map json) => RelojElement( - startTime: json['startTime'] as int, - endTime: json['endTime'] as int, - useTime: json['useTime'] as int, - ); - -Map _$RelojElementToJson(RelojElement instance) => - { - 'startTime': instance.startTime, - 'endTime': instance.endTime, - 'useTime': instance.useTime, - }; diff --git a/lib/core/models/game_question_model.dart b/lib/core/models/game_question_model.dart deleted file mode 100644 index 24c72b06..00000000 --- a/lib/core/models/game_question_model.dart +++ /dev/null @@ -1,11 +0,0 @@ -class GameQuestionModel { - int id; - String text; - String imageUrl; - - GameQuestionModel({ - required this.id, - required this.imageUrl, - required this.text, - }); -} diff --git a/lib/core/models/group_model.dart b/lib/core/models/group_model.dart new file mode 100644 index 00000000..ffb6ad89 --- /dev/null +++ b/lib/core/models/group_model.dart @@ -0,0 +1,160 @@ +// coverage:ignore-file +import 'dart:convert'; + +import 'package:flutter/foundation.dart'; +import 'package:hive/hive.dart'; + +import 'package:ottaa_project_flutter/core/abstracts/hive_type_ids.dart'; +import 'package:ottaa_project_flutter/core/models/assets_image.dart'; + +part 'group_model.g.dart'; + +typedef GroupText = Map; + +@HiveType(typeId: HiveTypesIds.groupTypeId) +class Group { + @HiveField(0, defaultValue: false) + bool block; + @HiveField(1) + final String id; + @HiveField(2) + final List relations; + @HiveField(3) + String text; + + @HiveField(4) + final AssetsImage resource; + + @HiveField(5) + final int freq; + + Group({ + this.block = false, + required this.id, + required this.relations, + required this.text, + required this.resource, + required this.freq, + }); + + Group copyWith({ + bool? block, + String? id, + List? relations, + String? text, + AssetsImage? resource, + int? freq, + }) { + return Group( + block: block ?? this.block, + id: id ?? this.id, + relations: relations ?? this.relations, + text: text ?? this.text, + resource: resource ?? this.resource, + freq: freq ?? this.freq, + ); + } + + Map toMap() { + return { + 'block': block, + 'id': id, + 'relations': relations.map((x) => x.toMap()).toList(), + 'text': text, + 'resource': resource.toMap(), + 'freq': freq, + }; + } + + factory Group.fromMap(Map map) { + return Group( + block: map['block'] != null ? map['block'] as bool : false, + id: map['id'] as String, + relations: map['relations'] != null + ? List.from( + (map['relations'] as List).map( + (k) => GroupRelation.fromMap(Map.from(k as Map)), + ), + ).toList() + : [], + text: map['text'], + resource: AssetsImage.fromMap(map['resource'] != null ? Map.from(map['resource'] as Map) : {}), + freq: map['freq'] != null ? map['freq'] as int : 0, + ); + } + + String toJson() => json.encode(toMap()); + + factory Group.fromJson(String source) => Group.fromMap(json.decode(source) as Map); + + @override + String toString() { + return 'Group(block: $block, id: $id, relations: $relations, text: $text, resource: $resource, freq: $freq)'; + } + + @override + bool operator ==(covariant Group other) { + if (identical(this, other)) return true; + + return other.block == block && other.id == id && listEquals(other.relations, relations) && other.text == text && other.resource == resource && other.freq == freq; + } + + @override + int get hashCode { + return block.hashCode ^ id.hashCode ^ relations.hashCode ^ text.hashCode ^ resource.hashCode ^ freq.hashCode; + } +} + +@HiveType(typeId: HiveTypesIds.groupRelationTypeId) +class GroupRelation { + @HiveField(0) + final String id; + @HiveField(1) + final double value; + + const GroupRelation({ + required this.id, + required this.value, + }); + + GroupRelation copyWith({ + String? id, + double? value, + }) { + return GroupRelation( + id: id ?? this.id, + value: value ?? this.value, + ); + } + + Map toMap() { + return { + 'id': id, + 'value': value, + }; + } + + factory GroupRelation.fromMap(Map map) { + return GroupRelation( + id: map['id'] as String, + value: (map['value'] as num).toDouble(), + ); + } + + String toJson() => json.encode(toMap()); + + factory GroupRelation.fromJson(String source) => GroupRelation.fromMap(json.decode(source) as Map); + + @override + String toString() => 'GroupRelation(id: $id, value: $value)'; + + @override + bool operator ==(covariant GroupRelation other) { + if (identical(this, other)) return true; + + return other.id == id && other.value == value; + } + + @override + int get hashCode => id.hashCode ^ value.hashCode; +} diff --git a/lib/core/models/group_model.g.dart b/lib/core/models/group_model.g.dart new file mode 100644 index 00000000..daf724d3 --- /dev/null +++ b/lib/core/models/group_model.g.dart @@ -0,0 +1,93 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'group_model.dart'; + +// ************************************************************************** +// TypeAdapterGenerator +// ************************************************************************** + +class GroupAdapter extends TypeAdapter { + @override + final int typeId = 11; + + @override + Group read(BinaryReader reader) { + final numOfFields = reader.readByte(); + final fields = { + for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(), + }; + return Group( + block: fields[0] == null ? false : fields[0] as bool, + id: fields[1] as String, + relations: (fields[2] as List).cast(), + text: fields[3] as String, + resource: fields[4] as AssetsImage, + freq: fields[5] as int, + ); + } + + @override + void write(BinaryWriter writer, Group obj) { + writer + ..writeByte(6) + ..writeByte(0) + ..write(obj.block) + ..writeByte(1) + ..write(obj.id) + ..writeByte(2) + ..write(obj.relations) + ..writeByte(3) + ..write(obj.text) + ..writeByte(4) + ..write(obj.resource) + ..writeByte(5) + ..write(obj.freq); + } + + @override + int get hashCode => typeId.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is GroupAdapter && + runtimeType == other.runtimeType && + typeId == other.typeId; +} + +class GroupRelationAdapter extends TypeAdapter { + @override + final int typeId = 13; + + @override + GroupRelation read(BinaryReader reader) { + final numOfFields = reader.readByte(); + final fields = { + for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(), + }; + return GroupRelation( + id: fields[0] as String, + value: fields[1] as double, + ); + } + + @override + void write(BinaryWriter writer, GroupRelation obj) { + writer + ..writeByte(2) + ..writeByte(0) + ..write(obj.id) + ..writeByte(1) + ..write(obj.value); + } + + @override + int get hashCode => typeId.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is GroupRelationAdapter && + runtimeType == other.runtimeType && + typeId == other.typeId; +} diff --git a/lib/core/models/groups_model.dart b/lib/core/models/groups_model.dart deleted file mode 100644 index 6844e991..00000000 --- a/lib/core/models/groups_model.dart +++ /dev/null @@ -1,114 +0,0 @@ -import 'package:json_annotation/json_annotation.dart'; - -part 'groups_model.g.dart'; - -@JsonSerializable() -class Groups { - Groups({ - required this.id, - required this.texto, - this.tipo = 0, - required this.imagen, - required this.relacion, - this.frecuencia, - this.tags, - }); - - int id; - TextGroups texto; - int tipo; - ImageGroups imagen; - List relacion; - int? frecuencia; - List? tags; - - factory Groups.fromJson(Map json) => _$GroupsFromJson(json); - - Map toJson() => _$GroupsToJson(this); -} - -@JsonSerializable() -class ImageGroups { - ImageGroups({ - required this.picto, - this.pictoEditado, - this.urlFoto, - this.pushKey, - }); - - String picto; - String? pictoEditado; - String? urlFoto; - String? pushKey; - - factory ImageGroups.fromJson(Map json) => _$ImageGroupsFromJson(json); - - Map toJson() => _$ImageGroupsToJson(this); -} - -@JsonSerializable() -class GroupRelation { - GroupRelation({ - required this.id, - this.frec, - this.texto, - this.tipo, - this.imagen, - this.relacion, - this.agenda, - this.gps, - this.esSugerencia, - this.edad, - this.horario, - }); - - int id; - int? frec; - TextGroups? texto; - int? tipo; - ImageGroups? imagen; - List? relacion; - int? agenda; - int? gps; - bool? esSugerencia; - List? edad; - List? horario; - - factory GroupRelation.fromJson(Map json) => _$GroupRelationFromJson(json); - - Map toJson() => _$GroupRelationToJson(this); -} - -@JsonSerializable() -class RelationRelation { - RelationRelation({ - required this.id, - required this.frec, - }); - - int id; - int frec; - - factory RelationRelation.fromJson(Map json) => _$RelationRelationFromJson(json); - - Map toJson() => _$RelationRelationToJson(this); -} - -@JsonSerializable() -class TextGroups { - TextGroups({ - this.en = '', - this.es = '', - this.fr = '', - this.pt = '', - }); - - String en; - String es; - String fr; - String pt; - - factory TextGroups.fromJson(Map json) => _$TextGroupsFromJson(json); - - Map toJson() => _$TextGroupsToJson(this); -} diff --git a/lib/core/models/groups_model.g.dart b/lib/core/models/groups_model.g.dart deleted file mode 100644 index 51a255c7..00000000 --- a/lib/core/models/groups_model.g.dart +++ /dev/null @@ -1,108 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'groups_model.dart'; - -// ************************************************************************** -// JsonSerializableGenerator -// ************************************************************************** - -Groups _$GroupsFromJson(Map json) => Groups( - id: json['id'] as int, - texto: TextGroups.fromJson(json['texto'] as Map), - tipo: json['tipo'] as int? ?? 0, - imagen: ImageGroups.fromJson(json['imagen'] as Map), - relacion: (json['relacion'] as List) - .map((e) => GroupRelation.fromJson(e as Map)) - .toList(), - frecuencia: json['frecuencia'] as int?, - tags: (json['tags'] as List?)?.map((e) => e as String).toList(), - ); - -Map _$GroupsToJson(Groups instance) => { - 'id': instance.id, - 'texto': instance.texto, - 'tipo': instance.tipo, - 'imagen': instance.imagen, - 'relacion': instance.relacion, - 'frecuencia': instance.frecuencia, - 'tags': instance.tags, - }; - -ImageGroups _$ImageGroupsFromJson(Map json) => ImageGroups( - picto: json['picto'] as String, - pictoEditado: json['pictoEditado'] as String?, - urlFoto: json['urlFoto'] as String?, - pushKey: json['pushKey'] as String?, - ); - -Map _$ImageGroupsToJson(ImageGroups instance) => - { - 'picto': instance.picto, - 'pictoEditado': instance.pictoEditado, - 'urlFoto': instance.urlFoto, - 'pushKey': instance.pushKey, - }; - -GroupRelation _$GroupRelationFromJson(Map json) => - GroupRelation( - id: json['id'] as int, - frec: json['frec'] as int?, - texto: json['texto'] == null - ? null - : TextGroups.fromJson(json['texto'] as Map), - tipo: json['tipo'] as int?, - imagen: json['imagen'] == null - ? null - : ImageGroups.fromJson(json['imagen'] as Map), - relacion: (json['relacion'] as List?) - ?.map((e) => RelationRelation.fromJson(e as Map)) - .toList(), - agenda: json['agenda'] as int?, - gps: json['gps'] as int?, - esSugerencia: json['esSugerencia'] as bool?, - edad: (json['edad'] as List?)?.map((e) => e as String).toList(), - horario: - (json['horario'] as List?)?.map((e) => e as String).toList(), - ); - -Map _$GroupRelationToJson(GroupRelation instance) => - { - 'id': instance.id, - 'frec': instance.frec, - 'texto': instance.texto, - 'tipo': instance.tipo, - 'imagen': instance.imagen, - 'relacion': instance.relacion, - 'agenda': instance.agenda, - 'gps': instance.gps, - 'esSugerencia': instance.esSugerencia, - 'edad': instance.edad, - 'horario': instance.horario, - }; - -RelationRelation _$RelationRelationFromJson(Map json) => - RelationRelation( - id: json['id'] as int, - frec: json['frec'] as int, - ); - -Map _$RelationRelationToJson(RelationRelation instance) => - { - 'id': instance.id, - 'frec': instance.frec, - }; - -TextGroups _$TextGroupsFromJson(Map json) => TextGroups( - en: json['en'] as String? ?? '', - es: json['es'] as String? ?? '', - fr: json['fr'] as String? ?? '', - pt: json['pt'] as String? ?? '', - ); - -Map _$TextGroupsToJson(TextGroups instance) => - { - 'en': instance.en, - 'es': instance.es, - 'fr': instance.fr, - 'pt': instance.pt, - }; diff --git a/lib/core/models/language_setting.dart b/lib/core/models/language_setting.dart new file mode 100644 index 00000000..f0c045e8 --- /dev/null +++ b/lib/core/models/language_setting.dart @@ -0,0 +1,71 @@ +// coverage:ignore-file +import 'dart:convert'; + +import 'package:hive_flutter/hive_flutter.dart'; + +import 'package:ottaa_project_flutter/core/abstracts/hive_type_ids.dart'; + +part 'language_setting.g.dart'; + +@HiveType(typeId: HiveTypesIds.languageSettingTypeId) +class LanguageSetting { + @HiveField(0) + String language; + + @HiveField(1, defaultValue: false) + bool labs; + + LanguageSetting({ + required this.language, + required this.labs, + }); + + factory LanguageSetting.empty({String? language, bool? labs}) { + return LanguageSetting( + language: language ?? 'es_AR', + labs: labs ?? false, + ); + } + + LanguageSetting copyWith({ + String? language, + bool? labs, + }) { + return LanguageSetting( + language: language ?? this.language, + labs: labs ?? this.labs, + ); + } + + Map toMap() { + return { + 'language': language, + 'labs': labs, + }; + } + + factory LanguageSetting.fromMap(Map map) { + return LanguageSetting( + language: map['language'] as String, + labs: map['labs'] as bool, + ); + } + + String toJson() => json.encode(toMap()); + + factory LanguageSetting.fromJson(String source) => + LanguageSetting.fromMap(json.decode(source) as Map); + + @override + String toString() => 'LanguageSetting(language: $language, labs: $labs)'; + + @override + bool operator ==(covariant LanguageSetting other) { + if (identical(this, other)) return true; + + return other.language == language && other.labs == labs; + } + + @override + int get hashCode => language.hashCode ^ labs.hashCode; +} diff --git a/lib/core/models/language_setting.g.dart b/lib/core/models/language_setting.g.dart new file mode 100644 index 00000000..26baffca --- /dev/null +++ b/lib/core/models/language_setting.g.dart @@ -0,0 +1,44 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'language_setting.dart'; + +// ************************************************************************** +// TypeAdapterGenerator +// ************************************************************************** + +class LanguageSettingAdapter extends TypeAdapter { + @override + final int typeId = 30; + + @override + LanguageSetting read(BinaryReader reader) { + final numOfFields = reader.readByte(); + final fields = { + for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(), + }; + return LanguageSetting( + language: fields[0] as String, + labs: fields[1] == null ? false : fields[1] as bool, + ); + } + + @override + void write(BinaryWriter writer, LanguageSetting obj) { + writer + ..writeByte(2) + ..writeByte(0) + ..write(obj.language) + ..writeByte(1) + ..write(obj.labs); + } + + @override + int get hashCode => typeId.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is LanguageSettingAdapter && + runtimeType == other.runtimeType && + typeId == other.typeId; +} diff --git a/lib/core/models/layout_setting.dart b/lib/core/models/layout_setting.dart new file mode 100644 index 00000000..4d2abbb7 --- /dev/null +++ b/lib/core/models/layout_setting.dart @@ -0,0 +1,95 @@ +// coverage:ignore-file +import 'dart:convert'; + +import 'package:hive/hive.dart'; +import 'package:ottaa_project_flutter/core/abstracts/hive_type_ids.dart'; +import 'package:ottaa_project_flutter/core/enums/display_types.dart'; +import 'package:ottaa_project_flutter/core/models/shortcuts_model.dart'; + +part 'layout_setting.g.dart'; + +@HiveType(typeId: HiveTypesIds.layoutTypeId) +class LayoutSetting { + @HiveField(0, defaultValue: false) + bool cleanup; + + @HiveField(1) + ShortcutsModel shortcuts; + + @HiveField(2, defaultValue: DisplayTypes.grid) + DisplayTypes display; + @HiveField(3, defaultValue: false) + bool oneToOne; + + LayoutSetting({ + required this.display, + required this.cleanup, + required this.shortcuts, + required this.oneToOne, + }); + + factory LayoutSetting.empty() => LayoutSetting( + display: DisplayTypes.grid, + cleanup: false, + shortcuts: ShortcutsModel.all(), + oneToOne: false, + ); + + LayoutSetting copyWith({ + bool? cleanup, + ShortcutsModel? shortcuts, + DisplayTypes? display, + bool? oneToOne, + }) { + return LayoutSetting( + display: display ?? this.display, + cleanup: cleanup ?? this.cleanup, + shortcuts: shortcuts ?? this.shortcuts, + oneToOne: oneToOne ?? this.oneToOne); + } + + Map toMap() { + return { + 'cleanup': cleanup, + 'shortcuts': shortcuts.toMap(), + 'display': display.name, + 'oneToOne': oneToOne + }; + } + + factory LayoutSetting.fromMap(Map map) { + return LayoutSetting( + cleanup: (map['cleanup'] ?? false) as bool, + shortcuts: ShortcutsModel.fromMap(Map.from(map['shortcuts'] as dynamic)), + display: DisplayTypes.values + .firstWhere((e) => e.name == map['display'].toString()), + oneToOne: (map['oneToOne'] ?? false) as bool, + ); + } + + String toJson() => json.encode(toMap()); + + factory LayoutSetting.fromJson(String source) => + LayoutSetting.fromMap(json.decode(source) as Map); + + @override + String toString() => + 'LayoutSettings(cleanup: $cleanup, shortcuts: $shortcuts, display: $display, oneToOne: $oneToOne)'; + + @override + bool operator ==(covariant LayoutSetting other) { + if (identical(this, other)) return true; + + return other.cleanup == cleanup && + other.shortcuts == shortcuts && + other.display == display && + other.oneToOne == oneToOne; + } + + @override + int get hashCode => + cleanup.hashCode ^ + shortcuts.hashCode ^ + display.hashCode ^ + oneToOne.hashCode; +} diff --git a/lib/core/models/layout_setting.g.dart b/lib/core/models/layout_setting.g.dart new file mode 100644 index 00000000..01993e8d --- /dev/null +++ b/lib/core/models/layout_setting.g.dart @@ -0,0 +1,51 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'layout_setting.dart'; + +// ************************************************************************** +// TypeAdapterGenerator +// ************************************************************************** + +class LayoutSettingAdapter extends TypeAdapter { + @override + final int typeId = 20; + + @override + LayoutSetting read(BinaryReader reader) { + final numOfFields = reader.readByte(); + final fields = { + for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(), + }; + return LayoutSetting( + display: + fields[2] == null ? DisplayTypes.grid : fields[2] as DisplayTypes, + cleanup: fields[0] == null ? false : fields[0] as bool, + shortcuts: fields[1] as ShortcutsModel, + oneToOne: fields[3] == null ? false : fields[3] as bool, + ); + } + + @override + void write(BinaryWriter writer, LayoutSetting obj) { + writer + ..writeByte(4) + ..writeByte(0) + ..write(obj.cleanup) + ..writeByte(1) + ..write(obj.shortcuts) + ..writeByte(2) + ..write(obj.display) + ..writeByte(3) + ..write(obj.oneToOne); + } + + @override + int get hashCode => typeId.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is LayoutSettingAdapter && + runtimeType == other.runtimeType && + typeId == other.typeId; +} diff --git a/lib/core/models/learn_token.dart b/lib/core/models/learn_token.dart new file mode 100644 index 00000000..5231db24 --- /dev/null +++ b/lib/core/models/learn_token.dart @@ -0,0 +1,33 @@ +// coverage:ignore-file +// ignore_for_file: public_member_api_docs, sort_constructors_first +import 'dart:convert'; + +class LearnToken { + String name; + + String? id; + + LearnToken({ + required this.name, + this.id, + }); + + Map toMap() { + return { + 'text': name, + ...(id != null ? {'id': id} : {}) + }; + } + + factory LearnToken.fromMap(Map map) { + return LearnToken( + name: map['text'] as String, + id: map['id'] != null ? map['id'] as String : null, + ); + } + + String toJson() => json.encode(toMap()); + + factory LearnToken.fromJson(String source) => + LearnToken.fromMap(json.decode(source) as Map); +} diff --git a/lib/core/models/notification_model.dart b/lib/core/models/notification_model.dart new file mode 100644 index 00000000..642176b1 --- /dev/null +++ b/lib/core/models/notification_model.dart @@ -0,0 +1,64 @@ +import 'dart:convert'; + +import 'package:flutter/foundation.dart'; + +class NotificationModel { + final String title; + final String body; + final Map data; + + const NotificationModel({ + required this.title, + required this.body, + this.data = const {}, + }); + + NotificationModel copyWith({ + String? title, + String? body, + Map? data, + }) { + return NotificationModel( + title: title ?? this.title, + body: body ?? this.body, + data: data ?? this.data, + ); + } + + Map toMap() { + return { + 'title': title, + 'body': body, + 'data': data, + }; + } + + factory NotificationModel.fromMap(Map map) { + return NotificationModel( + title: map['title'] as String, + body: map['body'] as String, + data: Map.from((map['data'] as Map)), + ); + } + + String toJson() => json.encode(toMap()); + + factory NotificationModel.fromJson(String source) => + NotificationModel.fromMap(json.decode(source) as Map); + + @override + String toString() => + 'NotificationModel(title: $title, body: $body, data: $data)'; + + @override + bool operator ==(covariant NotificationModel other) { + if (identical(this, other)) return true; + + return other.title == title && + other.body == body && + mapEquals(other.data, data); + } + + @override + int get hashCode => title.hashCode ^ body.hashCode ^ data.hashCode; +} diff --git a/lib/core/models/patient_user_model.dart b/lib/core/models/patient_user_model.dart new file mode 100644 index 00000000..1a8b8bd3 --- /dev/null +++ b/lib/core/models/patient_user_model.dart @@ -0,0 +1,295 @@ +// coverage:ignore-file +// ignore_for_file: public_member_api_docs, sort_constructors_first +import 'dart:convert'; + +import 'package:flutter/foundation.dart'; +import 'package:hive/hive.dart'; +import 'package:ottaa_project_flutter/core/abstracts/hive_type_ids.dart'; +import 'package:ottaa_project_flutter/core/abstracts/user_model.dart'; +import 'package:ottaa_project_flutter/core/abstracts/user_settings.dart'; +import 'package:ottaa_project_flutter/core/enums/user_types.dart'; +import 'package:ottaa_project_flutter/core/models/accessibility_setting.dart'; +import 'package:ottaa_project_flutter/core/models/devices_token.dart'; +import 'package:ottaa_project_flutter/core/models/group_model.dart'; +import 'package:ottaa_project_flutter/core/models/language_setting.dart'; +import 'package:ottaa_project_flutter/core/models/layout_setting.dart'; +import 'package:ottaa_project_flutter/core/models/payment_model.dart'; +import 'package:ottaa_project_flutter/core/models/phrase_model.dart'; +import 'package:ottaa_project_flutter/core/models/picto_model.dart'; +import 'package:ottaa_project_flutter/core/models/tts_setting.dart'; +import 'package:ottaa_project_flutter/core/models/user_data_model.dart'; + +part 'patient_user_model.g.dart'; + +@HiveType(typeId: HiveTypesIds.patientTypeId) +class PatientUserModel extends UserModel { + @override + @HiveField(0) + String id; + + @HiveField(1) + Map> groups; + + @HiveField(2) + Map> phrases; + + @HiveField(3) + Map> pictos; + + @override + @HiveField(4) + UserSettings settings; + + PatientSettings get patientSettings => settings as PatientSettings; + + @override + @HiveField(5) + UserType type; + + @override + @HiveField(6) + String email; + + @override + @HiveField(7) + DeviceToken? currentToken; + + PatientUserModel({ + required this.id, + required this.groups, + required this.phrases, + required this.pictos, + required this.settings, + this.type = UserType.user, + required this.email, + }); + + PatientUserModel copyWith({ + String? id, + Map>? groups, + Map>? phrases, + Map>? pictos, + PatientSettings? settings, + UserType? type, + String? email, + }) { + return PatientUserModel( + id: id ?? this.id, + groups: groups ?? this.groups, + phrases: phrases ?? this.phrases, + pictos: pictos ?? this.pictos, + settings: settings ?? this.settings, + type: type ?? this.type, + email: email ?? this.email, + ); + } + + @override + Map toMap() { + return { + 'id': id, + 'groups': groups.map( + (k, e) => MapEntry( + k, + e.map((x) => x.toMap()).toList(), + ), + ), + 'phrases': phrases.map( + (k, e) => MapEntry( + k, + e.map((x) => x.toMap()).toList(), + ), + ), + 'pictos': pictos.map( + (k, e) => MapEntry( + k, + e.map((x) => x.toMap()).toList(), + ), + ), + 'settings': settings.toMap(), + 'type': type.name, + 'email': email + }; + } + + factory PatientUserModel.fromMap(Map map) { + return PatientUserModel( + email: "", + id: map['id'] as String, + groups: map['groups'] != null + ? Map>.from((map['groups'] as Map).map((key, value) { + return MapEntry>( + key.toString(), + (value is List ? value : Map.from(value as dynamic).values) + .map( + (e) => Group.fromMap(Map.from(e as dynamic)), + ) + .toList(), + ); + })) + : >{}, + phrases: map['phrases'] != null && map['phrases'].isNotEmpty + ? Map>.from((map['phrases'] as Map).map((key, value) { + return MapEntry>( + key.toString(), + (value is List ? value : Map.from(value as dynamic).values) + .map( + (e) => Phrase.fromMap(Map.from(e as dynamic)), + ) + .toList(), + ); + })) + : >{}, + pictos: map['pictos'] != null && map['pictos'].isNotEmpty + ? Map>.from((map['pictos'] as Map).map((key, value) { + return MapEntry>( + key.toString(), + (value is List ? value : Map.from(value as dynamic).values) + .map( + (e) => Picto.fromMap(Map.from(e as dynamic)), + ) + .toList(), + ); + })) + : >{}, + settings: PatientSettings.fromMap(Map.from(map['settings'] as Map)), + type: UserType.values.firstWhere((element) => element.name == map['type'] as String), + ).copyWith( + email: map['email'], + ); + } + + @override + String toJson() => json.encode(toMap()); + + factory PatientUserModel.fromJson(String source) => PatientUserModel.fromMap( + json.decode(source) as Map, + ); + + @override + String toString() { + return 'UserModel(id: $id, groups: $groups, phrases: $phrases, pictos: $pictos, settings: $settings, type: $type, email: $email)'; + } + + @override + bool operator ==(covariant PatientUserModel other) { + if (identical(this, other)) return true; + + return other.id == id && mapEquals(other.groups, groups) && mapEquals(other.phrases, phrases) && mapEquals(other.pictos, pictos) && other.settings == settings && other.type == type && other.email == email; + } + + @override + int get hashCode { + return id.hashCode ^ groups.hashCode ^ phrases.hashCode ^ pictos.hashCode ^ settings.hashCode ^ type.hashCode ^ email.hashCode; + } + + @override + UserModel fromJson(Map json) => PatientUserModel.fromMap(json); +} + +@HiveType(typeId: HiveTypesIds.patientSettingsTypeId) +class PatientSettings extends UserSettings { + @override + @HiveField(0) + UserData data; + + @override + @HiveField(1) + LanguageSetting language; + + @HiveField(2) + Payment payment; + + @HiveField(3) + LayoutSetting layout; + + @HiveField(4) + AccessibilitySetting accessibility; + + @HiveField(5) + TTSSetting tts; + + PatientSettings({ + required this.data, + required this.language, + required this.payment, + required this.layout, + required this.accessibility, + required this.tts, + }); + + factory PatientSettings.empty(UserData userData) { + return PatientSettings( + data: userData, + language: LanguageSetting.empty(), + payment: Payment.none(), + layout: LayoutSetting.empty(), + accessibility: AccessibilitySetting.empty(), + tts: TTSSetting.empty(), + ); + } + + @override + Map toMap() { + return { + 'data': data.toMap(), + 'language': language.toMap(), + 'payment': payment.toMap(), + 'layout': layout.toMap(), + }; + } + + /// [Deprecated] pastientSettings.language is not more a String + /// Go to the languageSetting + /// + factory PatientSettings.fromMap(Map map) { + return PatientSettings( + data: UserData.fromMap(Map.from(map['data'] as Map)), + payment: map['payment'] != null ? Payment.fromMap(Map.from(map['payment'] as Map)) : Payment.none(), + layout: map['layout'] != null ? LayoutSetting.fromMap(Map.from(map['layout'] as Map)) : LayoutSetting.empty(), + accessibility: map['accessibility'] != null ? AccessibilitySetting.fromMap(Map.from(map['accessibility'] as Map)) : AccessibilitySetting.empty(), + language: map['language'] != null ? LanguageSetting.fromMap(Map.from(map['language'] as Map)) : LanguageSetting.empty(), + tts: map['tts'] != null ? TTSSetting.fromMap(Map.from(map['tts'] as Map)) : TTSSetting.empty(), + ); + } + + String toJson() => json.encode(toMap()); + + factory PatientSettings.fromJson(String source) => PatientSettings.fromMap(json.decode(source) as Map); + + PatientSettings copyWith({ + UserData? data, + String? language, + Payment? payment, + LayoutSetting? layout, + AccessibilitySetting? accessibility, + TTSSetting? tts, + LanguageSetting? languageSetting, + }) { + return PatientSettings( + data: data ?? this.data, + payment: payment ?? this.payment, + layout: layout ?? this.layout, + accessibility: accessibility ?? this.accessibility, + tts: tts ?? this.tts, + language: languageSetting ?? this.language, + ); + } + + @override + String toString() { + return 'PatientSettings(data: $data, language: $language, payment: $payment, layout: $layout, accessibility: $accessibility, tts: $tts, languageSetting: $language)'; + } + + @override + bool operator ==(covariant PatientSettings other) { + if (identical(this, other)) return true; + + return other.data == data && other.language == language && other.payment == payment && other.layout == layout && other.accessibility == accessibility && other.tts == tts && other.language == language; + } + + @override + int get hashCode { + return data.hashCode ^ language.hashCode ^ payment.hashCode ^ layout.hashCode ^ accessibility.hashCode ^ tts.hashCode ^ language.hashCode; + } +} diff --git a/lib/core/models/patient_user_model.g.dart b/lib/core/models/patient_user_model.g.dart new file mode 100644 index 00000000..061c62b5 --- /dev/null +++ b/lib/core/models/patient_user_model.g.dart @@ -0,0 +1,113 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'patient_user_model.dart'; + +// ************************************************************************** +// TypeAdapterGenerator +// ************************************************************************** + +class PatientUserModelAdapter extends TypeAdapter { + @override + final int typeId = 0; + + @override + PatientUserModel read(BinaryReader reader) { + final numOfFields = reader.readByte(); + final fields = { + for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(), + }; + return PatientUserModel( + id: fields[0] as String, + groups: (fields[1] as Map).map((dynamic k, dynamic v) => + MapEntry(k as String, (v as List).cast())), + phrases: (fields[2] as Map).map((dynamic k, dynamic v) => + MapEntry(k as String, (v as List).cast())), + pictos: (fields[3] as Map).map((dynamic k, dynamic v) => + MapEntry(k as String, (v as List).cast())), + settings: fields[4] as UserSettings, + type: fields[5] as UserType, + email: fields[6] as String, + )..currentToken = fields[7] as DeviceToken?; + } + + @override + void write(BinaryWriter writer, PatientUserModel obj) { + writer + ..writeByte(8) + ..writeByte(0) + ..write(obj.id) + ..writeByte(1) + ..write(obj.groups) + ..writeByte(2) + ..write(obj.phrases) + ..writeByte(3) + ..write(obj.pictos) + ..writeByte(4) + ..write(obj.settings) + ..writeByte(5) + ..write(obj.type) + ..writeByte(6) + ..write(obj.email) + ..writeByte(7) + ..write(obj.currentToken); + } + + @override + int get hashCode => typeId.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is PatientUserModelAdapter && + runtimeType == other.runtimeType && + typeId == other.typeId; +} + +class PatientSettingsAdapter extends TypeAdapter { + @override + final int typeId = 1; + + @override + PatientSettings read(BinaryReader reader) { + final numOfFields = reader.readByte(); + final fields = { + for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(), + }; + return PatientSettings( + data: fields[0] as UserData, + language: fields[1] as LanguageSetting, + payment: fields[2] as Payment, + layout: fields[3] as LayoutSetting, + accessibility: fields[4] as AccessibilitySetting, + tts: fields[5] as TTSSetting, + ); + } + + @override + void write(BinaryWriter writer, PatientSettings obj) { + writer + ..writeByte(6) + ..writeByte(0) + ..write(obj.data) + ..writeByte(1) + ..write(obj.language) + ..writeByte(2) + ..write(obj.payment) + ..writeByte(3) + ..write(obj.layout) + ..writeByte(4) + ..write(obj.accessibility) + ..writeByte(5) + ..write(obj.tts); + } + + @override + int get hashCode => typeId.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is PatientSettingsAdapter && + runtimeType == other.runtimeType && + typeId == other.typeId; +} diff --git a/lib/core/models/payment_model.dart b/lib/core/models/payment_model.dart new file mode 100644 index 00000000..9066929a --- /dev/null +++ b/lib/core/models/payment_model.dart @@ -0,0 +1,81 @@ +// coverage:ignore-file +import 'dart:convert'; + +import 'package:hive/hive.dart'; +import 'package:ottaa_project_flutter/core/abstracts/hive_type_ids.dart'; + +part 'payment_model.g.dart'; + +@HiveType(typeId: HiveTypesIds.paymentTypeId) +class Payment { + @HiveField(0, defaultValue: false) + bool payment; + + @HiveField(1, defaultValue: 0) + int paymentDate; + + @HiveField(2, defaultValue: 0) + int paymentExpire; + + Payment({ + required this.payment, + required this.paymentDate, + required this.paymentExpire, + }); + + factory Payment.none() => Payment( + payment: false, + paymentDate: 0, + paymentExpire: 0, + ); + + Payment copyWith({ + bool? payment, + int? paymentDate, + int? paymentExpire, + }) { + return Payment( + payment: payment ?? this.payment, + paymentDate: paymentDate ?? this.paymentDate, + paymentExpire: paymentExpire ?? this.paymentExpire, + ); + } + + Map toMap() { + return { + 'payment': payment, + 'paymentDate': paymentDate, + 'paymentExpire': paymentExpire, + }; + } + + factory Payment.fromMap(Map map) { + return Payment( + payment: map['payment'] as bool, + paymentDate: map['paymentDate'] as int, + paymentExpire: map['paymentExpire'] as int, + ); + } + + String toJson() => json.encode(toMap()); + + factory Payment.fromJson(String source) => + Payment.fromMap(json.decode(source) as Map); + + @override + String toString() => + 'Payment(payment: $payment, paymentDate: $paymentDate, paymentExpire: $paymentExpire)'; + + @override + bool operator ==(covariant Payment other) { + if (identical(this, other)) return true; + + return other.payment == payment && + other.paymentDate == paymentDate && + other.paymentExpire == paymentExpire; + } + + @override + int get hashCode => + payment.hashCode ^ paymentDate.hashCode ^ paymentExpire.hashCode; +} diff --git a/lib/core/models/payment_model.g.dart b/lib/core/models/payment_model.g.dart new file mode 100644 index 00000000..3a28568c --- /dev/null +++ b/lib/core/models/payment_model.g.dart @@ -0,0 +1,47 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'payment_model.dart'; + +// ************************************************************************** +// TypeAdapterGenerator +// ************************************************************************** + +class PaymentAdapter extends TypeAdapter { + @override + final int typeId = 4; + + @override + Payment read(BinaryReader reader) { + final numOfFields = reader.readByte(); + final fields = { + for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(), + }; + return Payment( + payment: fields[0] == null ? false : fields[0] as bool, + paymentDate: fields[1] == null ? 0 : fields[1] as int, + paymentExpire: fields[2] == null ? 0 : fields[2] as int, + ); + } + + @override + void write(BinaryWriter writer, Payment obj) { + writer + ..writeByte(3) + ..writeByte(0) + ..write(obj.payment) + ..writeByte(1) + ..write(obj.paymentDate) + ..writeByte(2) + ..write(obj.paymentExpire); + } + + @override + int get hashCode => typeId.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is PaymentAdapter && + runtimeType == other.runtimeType && + typeId == other.typeId; +} diff --git a/lib/core/models/phrase_model.dart b/lib/core/models/phrase_model.dart new file mode 100644 index 00000000..c187e0be --- /dev/null +++ b/lib/core/models/phrase_model.dart @@ -0,0 +1,136 @@ +// ignore_for_file: public_member_api_docs, sort_constructors_first +// coverage:ignore-file +import 'dart:convert'; + +import 'package:flutter/foundation.dart'; +import 'package:hive_flutter/hive_flutter.dart'; + +import 'package:ottaa_project_flutter/core/abstracts/hive_type_ids.dart'; + +part 'phrase_model.g.dart'; + +@HiveType(typeId: HiveTypesIds.phraseTypeId) +class Phrase { + @HiveField(0) + final DateTime date; + + @HiveField(1) + final String id; + + @HiveField(2) + final List sequence; + + @HiveField(3) + final Map> tags; + + const Phrase({ + required this.date, + required this.id, + required this.sequence, + required this.tags, + }); + + Phrase copyWith({ + DateTime? date, + String? id, + List? sequence, + Map>? tags, + }) { + return Phrase( + date: date ?? this.date, + id: id ?? this.id, + sequence: sequence ?? this.sequence, + tags: tags ?? this.tags, + ); + } + + Map toMap() { + return { + 'date': date.millisecondsSinceEpoch, + 'id': id, + 'sequence': sequence.map((x) => x.toMap()).toList(), + 'tags': tags, + }; + } + + factory Phrase.fromMap(Map map) { + return Phrase( + date: DateTime.fromMillisecondsSinceEpoch(map['date'] as int), + id: map['id'] as String, + sequence: List.from( + (map['sequence'] as List>).map( + (x) => Sequence.fromMap(x), + ), + ), + tags: Map>.from((map['tags'] as Map>)), + ); + } + + String toJson() => json.encode(toMap()); + + factory Phrase.fromJson(String source) => Phrase.fromMap(json.decode(source) as Map); + + @override + String toString() { + return 'Phrase(date: $date, id: $id, sequence: $sequence, tags: $tags)'; + } + + @override + bool operator ==(covariant Phrase other) { + if (identical(this, other)) return true; + + return other.date == date && other.id == id && listEquals(other.sequence, sequence) && mapEquals(other.tags, tags); + } + + @override + int get hashCode { + return date.hashCode ^ id.hashCode ^ sequence.hashCode ^ tags.hashCode; + } +} + +@HiveType(typeId: HiveTypesIds.sequenceTypeId) +class Sequence { + @HiveField(0) + final String id; + + const Sequence({ + required this.id, + }); + + Sequence copyWith({ + String? id, + }) { + return Sequence( + id: id ?? this.id, + ); + } + + Map toMap() { + return { + 'id': id, + }; + } + + factory Sequence.fromMap(Map map) { + return Sequence( + id: map['id'] as String, + ); + } + + String toJson() => json.encode(toMap()); + + factory Sequence.fromJson(String source) => Sequence.fromMap(json.decode(source) as Map); + + @override + String toString() => 'Sequence(id: $id)'; + + @override + bool operator ==(covariant Sequence other) { + if (identical(this, other)) return true; + + return other.id == id; + } + + @override + int get hashCode => id.hashCode; +} diff --git a/lib/core/models/phrase_model.g.dart b/lib/core/models/phrase_model.g.dart new file mode 100644 index 00000000..c0e27ceb --- /dev/null +++ b/lib/core/models/phrase_model.g.dart @@ -0,0 +1,85 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'phrase_model.dart'; + +// ************************************************************************** +// TypeAdapterGenerator +// ************************************************************************** + +class PhraseAdapter extends TypeAdapter { + @override + final int typeId = 3; + + @override + Phrase read(BinaryReader reader) { + final numOfFields = reader.readByte(); + final fields = { + for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(), + }; + return Phrase( + date: fields[0] as DateTime, + id: fields[1] as String, + sequence: (fields[2] as List).cast(), + tags: (fields[3] as Map).map((dynamic k, dynamic v) => + MapEntry(k as String, (v as List).cast())), + ); + } + + @override + void write(BinaryWriter writer, Phrase obj) { + writer + ..writeByte(4) + ..writeByte(0) + ..write(obj.date) + ..writeByte(1) + ..write(obj.id) + ..writeByte(2) + ..write(obj.sequence) + ..writeByte(3) + ..write(obj.tags); + } + + @override + int get hashCode => typeId.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is PhraseAdapter && + runtimeType == other.runtimeType && + typeId == other.typeId; +} + +class SequenceAdapter extends TypeAdapter { + @override + final int typeId = 9; + + @override + Sequence read(BinaryReader reader) { + final numOfFields = reader.readByte(); + final fields = { + for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(), + }; + return Sequence( + id: fields[0] as String, + ); + } + + @override + void write(BinaryWriter writer, Sequence obj) { + writer + ..writeByte(1) + ..writeByte(0) + ..write(obj.id); + } + + @override + int get hashCode => typeId.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is SequenceAdapter && + runtimeType == other.runtimeType && + typeId == other.typeId; +} diff --git a/lib/core/models/sentence_statistics_model.dart b/lib/core/models/phrases_statistics_model.dart similarity index 61% rename from lib/core/models/sentence_statistics_model.dart rename to lib/core/models/phrases_statistics_model.dart index b4252aa0..e377189f 100644 --- a/lib/core/models/sentence_statistics_model.dart +++ b/lib/core/models/phrases_statistics_model.dart @@ -1,10 +1,10 @@ +// coverage:ignore-file import 'package:json_annotation/json_annotation.dart'; - -part 'sentence_statistics_model.g.dart'; +part 'phrases_statistics_model.g.dart'; @JsonSerializable() -class FrasesStatisticsModel { - FrasesStatisticsModel({ +class PhraseStatisticModel { + PhraseStatisticModel({ required this.totalFrases, required this.frases7Days, required this.averagePictoFrase, @@ -19,7 +19,8 @@ class FrasesStatisticsModel { @JsonKey(name: 'frecLast7days') Map frecLast7Days; - factory FrasesStatisticsModel.fromJson(Map json) => _$FrasesStatisticsModelFromJson(json); + factory PhraseStatisticModel.fromJson(Map json) => + _$PhraseStatisticModelFromJson(json); - Map toJson() => _$FrasesStatisticsModelToJson(this); + Map toJson() => _$PhraseStatisticModelToJson(this); } diff --git a/lib/core/models/sentence_statistics_model.g.dart b/lib/core/models/phrases_statistics_model.g.dart similarity index 77% rename from lib/core/models/sentence_statistics_model.g.dart rename to lib/core/models/phrases_statistics_model.g.dart index 9f482ea4..a4c34f4e 100644 --- a/lib/core/models/sentence_statistics_model.g.dart +++ b/lib/core/models/phrases_statistics_model.g.dart @@ -1,22 +1,22 @@ // GENERATED CODE - DO NOT MODIFY BY HAND -part of 'sentence_statistics_model.dart'; +part of 'phrases_statistics_model.dart'; // ************************************************************************** // JsonSerializableGenerator // ************************************************************************** -FrasesStatisticsModel _$FrasesStatisticsModelFromJson( +PhraseStatisticModel _$PhraseStatisticModelFromJson( Map json) => - FrasesStatisticsModel( + PhraseStatisticModel( totalFrases: json['totalFrases'] as int, frases7Days: json['frases7days'] as int? ?? 0, averagePictoFrase: (json['averagePictoFrase'] as num?)?.toDouble() ?? 0.0, frecLast7Days: Map.from(json['frecLast7days'] as Map), ); -Map _$FrasesStatisticsModelToJson( - FrasesStatisticsModel instance) => +Map _$PhraseStatisticModelToJson( + PhraseStatisticModel instance) => { 'totalFrases': instance.totalFrases, 'frases7days': instance.frases7Days, diff --git a/lib/core/models/picto_model.dart b/lib/core/models/picto_model.dart new file mode 100644 index 00000000..d3794088 --- /dev/null +++ b/lib/core/models/picto_model.dart @@ -0,0 +1,202 @@ +// ignore_for_file: public_member_api_docs, sort_constructors_first +// coverage:ignore-file +import 'dart:convert'; + +import 'package:flutter/foundation.dart'; +import 'package:hive/hive.dart'; + +import 'package:ottaa_project_flutter/core/abstracts/hive_type_ids.dart'; +import 'package:ottaa_project_flutter/core/models/assets_image.dart'; + +part 'picto_model.g.dart'; + +@HiveType(typeId: HiveTypesIds.pictoTypeId) +class Picto { + @HiveField(0, defaultValue: false) + bool block; + @HiveField(1) + final String id; + @HiveField(2) + final List relations; + @HiveField(3, defaultValue: "") + String text; + + @HiveField(4) + AssetsImage resource; + + @HiveField(5) + double freq; + + @HiveField(6, defaultValue: >{}) + Map> tags; + + @HiveField(7) + int type; + + Picto({ + required this.id, + required this.type, + required this.resource, + this.text = "", + this.freq = 0, + this.block = false, + this.relations = const [], + this.tags = const >{}, + }); + + Picto copyWith({ + bool? block, + String? id, + List? relations, + String? text, + AssetsImage? resource, + double? freq, + Map>? tags, + int? type, + }) { + return Picto( + block: block ?? this.block, + id: id ?? this.id, + relations: relations ?? this.relations, + text: text ?? this.text, + resource: resource ?? this.resource, + freq: freq ?? this.freq, + tags: tags ?? this.tags, + type: type ?? this.type, + ); + } + + Map toMap() { + return { + 'block': block, + 'id': id, + 'relations': relations.map((x) => x.toMap()).toList(), + 'text': text, + 'resource': resource.toMap(), + 'freq': freq, + 'tags': tags, + 'type': type, + }; + } + + factory Picto.fromMap(Map map) { + return Picto( + block: map['block'] ?? false, + id: map['id'] ?? "", + relations: map['relations'] != null + ? List.from( + (map['relations'] as List).map( + (k) => + PictoRelation.fromMap(Map.from(k as Map)), + ), + ).toList() + : [], + resource: AssetsImage.fromMap( + Map.from((map['resource'] ?? {}) as Map)), + text: map['text'], + freq: map['freq'] != null ? (map['freq'] as num).toDouble() : 0, + type: (map['type'] as num).toInt(), + tags: map['tags'] != null + ? Map>.from( + (map['tags'] as Map).map( + (k, v) => MapEntry( + k as String, + List.from((v as List).map((e) => e as String)), + ), + ), + ) + : >{}, + ); + } + + String toJson() => json.encode(toMap()); + + factory Picto.fromJson(String source) => + Picto.fromMap(json.decode(source) as Map); + + @override + String toString() { + return 'Picto(block: $block, id: $id, relations: $relations, text: $text, resource: $resource, freq: $freq, tags: $tags, type: $type)'; + } + + @override + bool operator ==(covariant Picto other) { + if (identical(this, other)) return true; + + return other.block == block && + other.id == id && + listEquals(other.relations, relations) && + other.text == text && + other.resource == resource && + other.freq == freq && + mapEquals(other.tags, tags) && + other.type == type; + } + + @override + int get hashCode { + return block.hashCode ^ + id.hashCode ^ + relations.hashCode ^ + text.hashCode ^ + resource.hashCode ^ + freq.hashCode ^ + tags.hashCode ^ + type.hashCode; + } +} + +@HiveType(typeId: HiveTypesIds.pictoTextTypeId) +class PictoRelation { + @HiveField(0) + final String id; + @HiveField(1) + final double value; + + const PictoRelation({ + required this.id, + required this.value, + }); + + PictoRelation copyWith({ + String? id, + double? value, + }) { + return PictoRelation( + id: id ?? this.id, + value: value ?? this.value, + ); + } + + Map toMap() { + return { + 'id': id, + 'value': value, + }; + } + + factory PictoRelation.fromMap(Map map) { + return PictoRelation( + id: map['id'] as String, + value: ((map['value'] ?? 0) as num).toDouble(), + ); + } + + String toJson() => json.encode(toMap()); + + factory PictoRelation.fromJson(String source) => + PictoRelation.fromMap(json.decode(source) as Map); + + @override + String toString() => 'PictoRelation(id: $id, value: $value)'; + + @override + bool operator ==(covariant PictoRelation other) { + if (identical(this, other)) return true; + + return other.id == id && other.value == value; + } + + @override + int get hashCode => id.hashCode ^ value.hashCode; +} diff --git a/lib/core/models/picto_model.g.dart b/lib/core/models/picto_model.g.dart new file mode 100644 index 00000000..566ff702 --- /dev/null +++ b/lib/core/models/picto_model.g.dart @@ -0,0 +1,102 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'picto_model.dart'; + +// ************************************************************************** +// TypeAdapterGenerator +// ************************************************************************** + +class PictoAdapter extends TypeAdapter { + @override + final int typeId = 6; + + @override + Picto read(BinaryReader reader) { + final numOfFields = reader.readByte(); + final fields = { + for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(), + }; + return Picto( + id: fields[1] as String, + type: fields[7] as int, + resource: fields[4] as AssetsImage, + text: fields[3] == null ? '' : fields[3] as String, + freq: fields[5] as double, + block: fields[0] == null ? false : fields[0] as bool, + relations: (fields[2] as List).cast(), + tags: fields[6] == null + ? {} + : (fields[6] as Map).map((dynamic k, dynamic v) => + MapEntry(k as String, (v as List).cast())), + ); + } + + @override + void write(BinaryWriter writer, Picto obj) { + writer + ..writeByte(8) + ..writeByte(0) + ..write(obj.block) + ..writeByte(1) + ..write(obj.id) + ..writeByte(2) + ..write(obj.relations) + ..writeByte(3) + ..write(obj.text) + ..writeByte(4) + ..write(obj.resource) + ..writeByte(5) + ..write(obj.freq) + ..writeByte(6) + ..write(obj.tags) + ..writeByte(7) + ..write(obj.type); + } + + @override + int get hashCode => typeId.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is PictoAdapter && + runtimeType == other.runtimeType && + typeId == other.typeId; +} + +class PictoRelationAdapter extends TypeAdapter { + @override + final int typeId = 7; + + @override + PictoRelation read(BinaryReader reader) { + final numOfFields = reader.readByte(); + final fields = { + for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(), + }; + return PictoRelation( + id: fields[0] as String, + value: fields[1] as double, + ); + } + + @override + void write(BinaryWriter writer, PictoRelation obj) { + writer + ..writeByte(2) + ..writeByte(0) + ..write(obj.id) + ..writeByte(1) + ..write(obj.value); + } + + @override + int get hashCode => typeId.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is PictoRelationAdapter && + runtimeType == other.runtimeType && + typeId == other.typeId; +} diff --git a/lib/core/models/picto_predicted.dart b/lib/core/models/picto_predicted.dart new file mode 100644 index 00000000..8aab197d --- /dev/null +++ b/lib/core/models/picto_predicted.dart @@ -0,0 +1,55 @@ +// coverage:ignore-file +import 'dart:convert'; + +import 'package:ottaa_project_flutter/core/models/picto_predicted_reduced.dart'; + +class PictoPredicted extends PictoPredictedReduced { + double value; + int contextScore; + int tagScore; + int nameLength; + int nameSplitLength; + + PictoPredicted({ + required super.name, + required super.id, + required this.value, + required this.contextScore, + required this.tagScore, + required this.nameLength, + required this.nameSplitLength, + }); + + @override + Map toMap() { + return { + 'name': name, + 'id': id, + 'value': value, + 'contextScore': contextScore, + 'tagScore': tagScore, + 'nameLength': nameLength, + 'nameSplitLength': nameSplitLength, + }; + } + + factory PictoPredicted.fromMap(Map map) { + return PictoPredicted( + name: map['name'] as String, + id: ((map['id'] ?? {}) as Map).map((key, value) { + return MapEntry(key as String, value.toString()); + }), + value: (map['value'] as num).toDouble(), + contextScore: ((map['contextScore'] ?? 0) as num).toInt(), + tagScore: ((map['tagScore'] ?? 0) as num).toInt(), + nameLength: ((map['nameLength'] ?? 0) as num).toInt(), + nameSplitLength: ((map['nameSplitLength'] ?? 0) as num).toInt(), + ); + } + + @override + String toJson() => json.encode(toMap()); + + factory PictoPredicted.fromJson(String source) => + PictoPredicted.fromMap(json.decode(source) as Map); +} diff --git a/lib/core/models/picto_predicted_reduced.dart b/lib/core/models/picto_predicted_reduced.dart new file mode 100644 index 00000000..e7e8cff6 --- /dev/null +++ b/lib/core/models/picto_predicted_reduced.dart @@ -0,0 +1,34 @@ +// coverage:ignore-file +import 'dart:convert'; + +class PictoPredictedReduced { + String name; + Map id; + + PictoPredictedReduced({ + required this.name, + required this.id, + }); + + Map toMap() { + return { + 'name': name, + 'id': id, + }; + } + + factory PictoPredictedReduced.fromMap(Map map) { + return PictoPredictedReduced( + name: map['name'] as String, + id: ((map['id'] ?? {}) as Map).map((key, value) { + return MapEntry(key as String, value.toString()); + }), + ); + } + + String toJson() => json.encode(toMap()); + + factory PictoPredictedReduced.fromJson(String source) => + PictoPredictedReduced.fromMap( + json.decode(source) as Map); +} diff --git a/lib/core/models/picto_statistics_model.dart b/lib/core/models/picto_statistics_model.dart index f7936126..0385c2df 100644 --- a/lib/core/models/picto_statistics_model.dart +++ b/lib/core/models/picto_statistics_model.dart @@ -1,6 +1,6 @@ +// coverage:ignore-file import 'package:json_annotation/json_annotation.dart'; - part 'picto_statistics_model.g.dart'; @JsonSerializable() @@ -47,13 +47,13 @@ class PictoComponente { required this.edad, }); - int id; + String id; bool esSugerencia; - @JsonKey(nullable: true,defaultValue: [],name: 'hora') + @JsonKey(nullable: true, defaultValue: [], name: 'hora') List hora; - @JsonKey(nullable: true,defaultValue: [],name: 'sexo') + @JsonKey(nullable: true, defaultValue: [], name: 'sexo') List sexo; - @JsonKey(nullable: true,defaultValue: [],name: 'edad') + @JsonKey(nullable: true, defaultValue: [], name: 'edad') List edad; factory PictoComponente.fromJson(Map json) => _$PictoComponenteFromJson(json); @@ -68,7 +68,7 @@ class PictoUsagePerGroup { required this.percentage, required this.name, }); - @JsonKey(nullable: true,defaultValue: 000,name: 'groupId') + @JsonKey(nullable: true, defaultValue: 000, name: 'groupId') int groupId; double percentage; Name name; @@ -91,8 +91,7 @@ class Name { String es; String fr; String pt; - factory Name.fromJson(Map json) => - _$NameFromJson(json); + factory Name.fromJson(Map json) => _$NameFromJson(json); Map toJson() => _$NameToJson(this); } diff --git a/lib/core/models/picto_statistics_model.g.dart b/lib/core/models/picto_statistics_model.g.dart index 957b9e46..1dd98ccc 100644 --- a/lib/core/models/picto_statistics_model.g.dart +++ b/lib/core/models/picto_statistics_model.g.dart @@ -40,7 +40,7 @@ Map _$MostUsedSentenceToJson(MostUsedSentence instance) => PictoComponente _$PictoComponenteFromJson(Map json) => PictoComponente( - id: json['id'] as int, + id: json['id'] as String, esSugerencia: json['esSugerencia'] as bool, hora: (json['hora'] as List?)?.map((e) => e as String).toList() ?? diff --git a/lib/core/models/pictogram_model.dart b/lib/core/models/pictogram_model.dart deleted file mode 100644 index 8d7c954b..00000000 --- a/lib/core/models/pictogram_model.dart +++ /dev/null @@ -1,99 +0,0 @@ -import 'package:json_annotation/json_annotation.dart'; - -part 'pictogram_model.g.dart'; - -@JsonSerializable() -class Pict { - Pict({ - required this.id, - required this.texto, - required this.tipo, - required this.imagen, - this.relacion, - this.agenda = 0, - this.gps = 0, - this.esSugerencia = false, - this.edad, - this.horario, - this.hora, - this.localImg = false, - this.sexo, - this.ubicacion, - this.score, - }); - - int id; - Texto texto; - int tipo; - Imagen imagen; - List? relacion; - int? agenda; - int? gps; - List? hora; - List? edad; - List? sexo; - bool? esSugerencia; - List? horario; - List? ubicacion; - int? score; - - //local used variables - bool localImg; - - factory Pict.fromJson(Map json) => _$PictFromJson(json); - - Map toJson() => _$PictToJson(this); -} - -@JsonSerializable() -class Imagen { - Imagen({ - required this.picto, - this.pictoEditado, - this.urlFoto, - this.pushKey, - }); - - String picto; - String? pictoEditado; - String? urlFoto; - String? pushKey; - - factory Imagen.fromJson(Map json) => _$ImagenFromJson(json); - - Map toJson() => _$ImagenToJson(this); -} - -@JsonSerializable() -class Relacion { - Relacion({ - required this.id, - this.frec, - }); - - int id; - int? frec; - - factory Relacion.fromJson(Map json) => _$RelacionFromJson(json); - - Map toJson() => _$RelacionToJson(this); -} - -@JsonSerializable() -class Texto { - Texto({ - this.en = '', - this.es = '', - this.pt = '', - this.fr = '', - }); - - String en; - String es; - String fr; - String pt; - - factory Texto.fromJson(Map json) => _$TextoFromJson(json); - - Map toJson() => _$TextoToJson(this); -} diff --git a/lib/core/models/pictogram_model.g.dart b/lib/core/models/pictogram_model.g.dart deleted file mode 100644 index 4043f36d..00000000 --- a/lib/core/models/pictogram_model.g.dart +++ /dev/null @@ -1,86 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'pictogram_model.dart'; - -// ************************************************************************** -// JsonSerializableGenerator -// ************************************************************************** - -Pict _$PictFromJson(Map json) => Pict( - id: json['id'] as int, - texto: Texto.fromJson(json['texto'] as Map), - tipo: json['tipo'] as int, - imagen: Imagen.fromJson(json['imagen'] as Map), - relacion: (json['relacion'] as List?) - ?.map((e) => Relacion.fromJson(e as Map)) - .toList(), - agenda: json['agenda'] as int? ?? 0, - gps: json['gps'] as int? ?? 0, - esSugerencia: json['esSugerencia'] as bool? ?? false, - edad: (json['edad'] as List?)?.map((e) => e as String).toList(), - horario: - (json['horario'] as List?)?.map((e) => e as String).toList(), - hora: (json['hora'] as List?)?.map((e) => e as String).toList(), - localImg: json['localImg'] as bool? ?? false, - sexo: (json['sexo'] as List?)?.map((e) => e as String).toList(), - ubicacion: (json['ubicacion'] as List?) - ?.map((e) => e as String) - .toList(), - score: json['score'] as int?, - ); - -Map _$PictToJson(Pict instance) => { - 'id': instance.id, - 'texto': instance.texto, - 'tipo': instance.tipo, - 'imagen': instance.imagen, - 'relacion': instance.relacion, - 'agenda': instance.agenda, - 'gps': instance.gps, - 'hora': instance.hora, - 'edad': instance.edad, - 'sexo': instance.sexo, - 'esSugerencia': instance.esSugerencia, - 'horario': instance.horario, - 'ubicacion': instance.ubicacion, - 'score': instance.score, - 'localImg': instance.localImg, - }; - -Imagen _$ImagenFromJson(Map json) => Imagen( - picto: json['picto'] as String, - pictoEditado: json['pictoEditado'] as String?, - urlFoto: json['urlFoto'] as String?, - pushKey: json['pushKey'] as String?, - ); - -Map _$ImagenToJson(Imagen instance) => { - 'picto': instance.picto, - 'pictoEditado': instance.pictoEditado, - 'urlFoto': instance.urlFoto, - 'pushKey': instance.pushKey, - }; - -Relacion _$RelacionFromJson(Map json) => Relacion( - id: json['id'] as int, - frec: json['frec'] as int?, - ); - -Map _$RelacionToJson(Relacion instance) => { - 'id': instance.id, - 'frec': instance.frec, - }; - -Texto _$TextoFromJson(Map json) => Texto( - en: json['en'] as String? ?? '', - es: json['es'] as String? ?? '', - pt: json['pt'] as String? ?? '', - fr: json['fr'] as String? ?? '', - ); - -Map _$TextoToJson(Texto instance) => { - 'en': instance.en, - 'es': instance.es, - 'fr': instance.fr, - 'pt': instance.pt, - }; diff --git a/lib/core/models/search_indexed_sentences_model.dart b/lib/core/models/search_indexed_sentences_model.dart deleted file mode 100644 index 743ae666..00000000 --- a/lib/core/models/search_indexed_sentences_model.dart +++ /dev/null @@ -1,10 +0,0 @@ - -class SearchIndexedSentences { - SearchIndexedSentences({ - required this.sentence, - required this.index, - }); - - final String sentence; - final int index; -} \ No newline at end of file diff --git a/lib/core/models/sentence_model.dart b/lib/core/models/sentence_model.dart deleted file mode 100644 index 66f8c21d..00000000 --- a/lib/core/models/sentence_model.dart +++ /dev/null @@ -1,124 +0,0 @@ -// To parse this JSON data, do -// -// final sentence = sentenceFromJson(jsonString); - -import 'dart:convert'; - -SentenceModel sentenceFromJson(String str) => SentenceModel.fromJson(json.decode(str)); - -String sentenceToJson(SentenceModel data) => json.encode(data.toJson()); - -class SentenceModel { - SentenceModel({ - required this.frase, - required this.frecuencia, - required this.complejidad, - required this.fecha, - required this.locale, - required this.id, - this.favouriteOrNot = false, - }); - - final String frase; - int frecuencia; - final Complejidad complejidad; - List fecha; - final String locale; - final int id; - bool favouriteOrNot; - - factory SentenceModel.fromJson(Map json) { - late List fecha; - if (json["fecha"].runtimeType == int) { - fecha = List.empty(growable: true); - fecha.add(json["fecha"]); - } else { - fecha = List.empty(growable: true); - fecha = List.from(json["fecha"].map((x) => x)); - } - return SentenceModel( - frase: json["frase"], - frecuencia: json["frecuencia"], - complejidad: Complejidad.fromJson(json["complejidad"]), - // fecha: json["fecha"] is int - // ? json["fecha"] - // : List.from(json["fecha"].map((x) => x)), - fecha: fecha, - locale: json["locale"], - id: json["id"], - favouriteOrNot: - json['favouriteOrNot'] == null ? false : json['favouriteOrNot'], - ); - } - - Map toJson() => { - "frase": frase, - "frecuencia": frecuencia, - "complejidad": complejidad.toJson(), - "fecha": List.from(fecha.map((x) => x)), - "locale": locale, - "id": id, - }; -} - -class Complejidad { - Complejidad({ - required this.valor, - required this.pictosComponentes, - }); - - final int valor; - final List pictosComponentes; - - factory Complejidad.fromJson(Map json) => Complejidad( - valor: json["valor"], - pictosComponentes: List.from( - json["pictos componentes"] - .map((x) => PictosComponente.fromJson(x))), - ); - - Map toJson() => { - "valor": valor, - "pictos componentes": - List.from(pictosComponentes.map((x) => x.toJson())), - }; -} - -class PictosComponente { - PictosComponente({ - required this.id, - required this.esSugerencia, - this.hora, - this.sexo, - this.edad, - }); - - final int id; - final bool esSugerencia; - final List? hora; - final List? sexo; - final List? edad; - - factory PictosComponente.fromJson(Map json) => - PictosComponente( - id: json["id"], - esSugerencia: json["esSugerencia"] ?? false, - hora: json["hora"] == null - ? null - : List.from(json["hora"].map((x) => x)), - sexo: json["sexo"] == null - ? null - : List.from(json["sexo"].map((x) => x)), - edad: json["edad"] == null - ? null - : List.from(json["edad"].map((x) => x)), - ); - - Map toJson() => { - "id": id, - "esSugerencia": esSugerencia, - "hora": hora == null ? null : List.from(hora!.map((x) => x)), - "sexo": sexo == null ? null : List.from(sexo!.map((x) => x)), - "edad": edad == null ? null : List.from(edad!.map((x) => x)), - }; -} diff --git a/lib/core/models/shortcuts_model.dart b/lib/core/models/shortcuts_model.dart new file mode 100644 index 00000000..06803475 --- /dev/null +++ b/lib/core/models/shortcuts_model.dart @@ -0,0 +1,144 @@ +// coverage:ignore-file +import 'dart:convert'; + +import 'package:hive/hive.dart'; +import 'package:ottaa_project_flutter/core/abstracts/hive_type_ids.dart'; + +part 'shortcuts_model.g.dart'; + +@HiveType(typeId: HiveTypesIds.shortcutsTypeId) +class ShortcutsModel { + @HiveField(0, defaultValue: false) + bool favs; + + @HiveField(1, defaultValue: false) + bool history; + + @HiveField(2, defaultValue: false) + bool camera; + + @HiveField(3, defaultValue: false) + bool share; + + @HiveField(4, defaultValue: false) + bool games; + + @HiveField(5, defaultValue: false) + bool yes; + + @HiveField(6, defaultValue: false) + bool no; + + @HiveField(7, defaultValue: false) + bool enable; + + ShortcutsModel({ + required this.enable, + required this.favs, + required this.history, + required this.camera, + required this.share, + required this.games, + required this.no, + required this.yes, + }); + + factory ShortcutsModel.none() => ShortcutsModel( + enable: false, + favs: false, + history: false, + camera: false, + share: false, + games: false, + yes: false, + no: false, + ); + factory ShortcutsModel.all() => ShortcutsModel( + enable: true, + favs: true, + history: true, + camera: true, + share: true, + games: true, + yes: true, + no: true, + ); + ShortcutsModel copyWith({ + bool? favs, + bool? history, + bool? camera, + bool? share, + bool? games, + bool? yes, + bool? no, + bool? enable, + }) { + return ShortcutsModel( + enable: enable ?? this.enable, + favs: favs ?? this.favs, + history: history ?? this.history, + camera: camera ?? this.camera, + share: share ?? this.share, + games: games ?? this.games, + yes: yes ?? this.yes, + no: no ?? this.no, + ); + } + + Map toMap() { + return { + 'enable': enable, + 'favs': favs, + 'history': history, + 'camera': camera, + 'share': share, + 'games': games, + 'yes': yes, + 'no': no, + }; + } + + factory ShortcutsModel.fromMap(Map map) { + print(map); + return ShortcutsModel.none().copyWith( + enable: map['enable'], + favs: map['favs'], + history: map['history'], + camera: map['camera'], + share: map['share'], + games: map['games'], + yes: map['yes'], + no: map['no'], + ); + } + + String toJson() => json.encode(toMap()); + + factory ShortcutsModel.fromJson(String source) => + ShortcutsModel.fromMap(json.decode(source) as Map); + + @override + String toString() { + return 'Shortcuts(favs: $favs, history: $history, camera: $camera, share: $share, games: $games)'; + } + + @override + bool operator ==(covariant ShortcutsModel other) { + if (identical(this, other)) return true; + + return other.favs == favs && + other.history == history && + other.camera == camera && + other.share == share && + other.games == games; + } + + @override + int get hashCode { + return favs.hashCode ^ + history.hashCode ^ + camera.hashCode ^ + share.hashCode ^ + games.hashCode; + } +} diff --git a/lib/core/models/shortcuts_model.g.dart b/lib/core/models/shortcuts_model.g.dart new file mode 100644 index 00000000..ae206232 --- /dev/null +++ b/lib/core/models/shortcuts_model.g.dart @@ -0,0 +1,62 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'shortcuts_model.dart'; + +// ************************************************************************** +// TypeAdapterGenerator +// ************************************************************************** + +class ShortcutsModelAdapter extends TypeAdapter { + @override + final int typeId = 5; + + @override + ShortcutsModel read(BinaryReader reader) { + final numOfFields = reader.readByte(); + final fields = { + for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(), + }; + return ShortcutsModel( + enable: fields[7] == null ? false : fields[7] as bool, + favs: fields[0] == null ? false : fields[0] as bool, + history: fields[1] == null ? false : fields[1] as bool, + camera: fields[2] == null ? false : fields[2] as bool, + share: fields[3] == null ? false : fields[3] as bool, + games: fields[4] == null ? false : fields[4] as bool, + no: fields[6] == null ? false : fields[6] as bool, + yes: fields[5] == null ? false : fields[5] as bool, + ); + } + + @override + void write(BinaryWriter writer, ShortcutsModel obj) { + writer + ..writeByte(8) + ..writeByte(0) + ..write(obj.favs) + ..writeByte(1) + ..write(obj.history) + ..writeByte(2) + ..write(obj.camera) + ..writeByte(3) + ..write(obj.share) + ..writeByte(4) + ..write(obj.games) + ..writeByte(5) + ..write(obj.yes) + ..writeByte(6) + ..write(obj.no) + ..writeByte(7) + ..write(obj.enable); + } + + @override + int get hashCode => typeId.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is ShortcutsModelAdapter && + runtimeType == other.runtimeType && + typeId == other.typeId; +} diff --git a/lib/core/models/subtitles_setting.dart b/lib/core/models/subtitles_setting.dart new file mode 100644 index 00000000..070b7177 --- /dev/null +++ b/lib/core/models/subtitles_setting.dart @@ -0,0 +1,87 @@ +// ignore_for_file: public_member_api_docs, sort_constructors_first +// coverage:ignore-file +import 'dart:convert'; + +import 'package:hive_flutter/hive_flutter.dart'; + +import 'package:ottaa_project_flutter/core/abstracts/hive_type_ids.dart'; +import 'package:ottaa_project_flutter/core/enums/size_types.dart'; +import 'package:ottaa_project_flutter/core/enums/velocity_types.dart'; + +part 'subtitles_setting.g.dart'; + +@HiveType(typeId: HiveTypesIds.subtitlesSettingTypeId) +class SubtitlesSetting { + @HiveField(0, defaultValue: false) + bool show; + + @HiveField(1, defaultValue: SizeTypes.mid) + SizeTypes size; + + @HiveField(2, defaultValue: false) + bool caps; + + SubtitlesSetting({ + required this.show, + required this.size, + required this.caps, + }); + + factory SubtitlesSetting.empty() { + return SubtitlesSetting( + show: false, + size: SizeTypes.mid, + caps: false, + ); + } + + SubtitlesSetting copyWith({ + bool? show, + SizeTypes? size, + bool? caps, + }) { + return SubtitlesSetting( + show: show ?? this.show, + size: size ?? this.size, + caps: caps ?? this.caps, + ); + } + + Map toMap() { + return { + 'show': show, + 'size': size.name, + 'caps': caps, + }; + } + + factory SubtitlesSetting.fromMap(Map map) { + return SubtitlesSetting( + show: map['show'] as bool, + size: SizeTypes.values.firstWhere( + (e) => e.name == map['size'].toString(), + orElse: () => SizeTypes.mid, + ), + caps: map['caps'] as bool, + ); + } + + String toJson() => json.encode(toMap()); + + factory SubtitlesSetting.fromJson(String source) => + SubtitlesSetting.fromMap(json.decode(source) as Map); + + @override + String toString() => + 'SubtitlesSetting(show: $show, size: $size, caps: $caps)'; + + @override + bool operator ==(covariant SubtitlesSetting other) { + if (identical(this, other)) return true; + + return other.show == show && other.size == size && other.caps == caps; + } + + @override + int get hashCode => show.hashCode ^ size.hashCode ^ caps.hashCode; +} diff --git a/lib/core/models/subtitles_setting.g.dart b/lib/core/models/subtitles_setting.g.dart new file mode 100644 index 00000000..3c2bb962 --- /dev/null +++ b/lib/core/models/subtitles_setting.g.dart @@ -0,0 +1,47 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'subtitles_setting.dart'; + +// ************************************************************************** +// TypeAdapterGenerator +// ************************************************************************** + +class SubtitlesSettingAdapter extends TypeAdapter { + @override + final int typeId = 28; + + @override + SubtitlesSetting read(BinaryReader reader) { + final numOfFields = reader.readByte(); + final fields = { + for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(), + }; + return SubtitlesSetting( + show: fields[0] == null ? false : fields[0] as bool, + size: fields[1] == null ? SizeTypes.mid : fields[1] as SizeTypes, + caps: fields[2] == null ? false : fields[2] as bool, + ); + } + + @override + void write(BinaryWriter writer, SubtitlesSetting obj) { + writer + ..writeByte(3) + ..writeByte(0) + ..write(obj.show) + ..writeByte(1) + ..write(obj.size) + ..writeByte(2) + ..write(obj.caps); + } + + @override + int get hashCode => typeId.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is SubtitlesSettingAdapter && + runtimeType == other.runtimeType && + typeId == other.typeId; +} diff --git a/lib/core/models/tts_setting.dart b/lib/core/models/tts_setting.dart new file mode 100644 index 00000000..c43f1a93 --- /dev/null +++ b/lib/core/models/tts_setting.dart @@ -0,0 +1,78 @@ +// coverage:ignore-file +import 'dart:convert'; + +import 'package:hive/hive.dart'; + +import 'package:ottaa_project_flutter/core/abstracts/hive_type_ids.dart'; +import 'package:ottaa_project_flutter/core/models/subtitles_setting.dart'; +import 'package:ottaa_project_flutter/core/models/voice_setting.dart'; + +part 'tts_setting.g.dart'; + +@HiveType(typeId: HiveTypesIds.ttsSettingTypeId) +class TTSSetting { + @HiveField(0) + VoiceSetting voiceSetting; + + @HiveField(1) + SubtitlesSetting subtitlesSetting; + + TTSSetting({ + required this.voiceSetting, + required this.subtitlesSetting, + }); + + factory TTSSetting.empty({ + String? language, + }) { + return TTSSetting( + voiceSetting: VoiceSetting.empty(language: language), + subtitlesSetting: SubtitlesSetting.empty(), + ); + } + + TTSSetting copyWith({ + VoiceSetting? voiceSetting, + SubtitlesSetting? subtitlesSetting, + }) { + return TTSSetting( + voiceSetting: voiceSetting ?? this.voiceSetting, + subtitlesSetting: subtitlesSetting ?? this.subtitlesSetting, + ); + } + + Map toMap() { + return { + 'voice': voiceSetting.toMap(), + 'subtitles': subtitlesSetting.toMap(), + }; + } + + factory TTSSetting.fromMap(Map map) { + return TTSSetting( + voiceSetting: VoiceSetting.fromMap(Map.from(map['voice'] as dynamic)), + subtitlesSetting: + SubtitlesSetting.fromMap(Map.from(map['subtitles'] as dynamic)), + ); + } + + String toJson() => json.encode(toMap()); + + factory TTSSetting.fromJson(String source) => + TTSSetting.fromMap(json.decode(source) as Map); + + @override + String toString() => + 'TTSSetting(voiceSetting: $voiceSetting, subtitlesSetting: $subtitlesSetting)'; + + @override + bool operator ==(covariant TTSSetting other) { + if (identical(this, other)) return true; + + return other.voiceSetting == voiceSetting && + other.subtitlesSetting == subtitlesSetting; + } + + @override + int get hashCode => voiceSetting.hashCode ^ subtitlesSetting.hashCode; +} diff --git a/lib/core/models/tts_setting.g.dart b/lib/core/models/tts_setting.g.dart new file mode 100644 index 00000000..4d33890c --- /dev/null +++ b/lib/core/models/tts_setting.g.dart @@ -0,0 +1,44 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'tts_setting.dart'; + +// ************************************************************************** +// TypeAdapterGenerator +// ************************************************************************** + +class TTSSettingAdapter extends TypeAdapter { + @override + final int typeId = 29; + + @override + TTSSetting read(BinaryReader reader) { + final numOfFields = reader.readByte(); + final fields = { + for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(), + }; + return TTSSetting( + voiceSetting: fields[0] as VoiceSetting, + subtitlesSetting: fields[1] as SubtitlesSetting, + ); + } + + @override + void write(BinaryWriter writer, TTSSetting obj) { + writer + ..writeByte(2) + ..writeByte(0) + ..write(obj.voiceSetting) + ..writeByte(1) + ..write(obj.subtitlesSetting); + } + + @override + int get hashCode => typeId.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is TTSSettingAdapter && + runtimeType == other.runtimeType && + typeId == other.typeId; +} diff --git a/lib/core/models/user_data_model.dart b/lib/core/models/user_data_model.dart new file mode 100644 index 00000000..56552b96 --- /dev/null +++ b/lib/core/models/user_data_model.dart @@ -0,0 +1,123 @@ +// coverage:ignore-file +import 'dart:convert'; + +import 'package:hive_flutter/hive_flutter.dart'; + +import 'package:ottaa_project_flutter/core/abstracts/hive_type_ids.dart'; +import 'package:ottaa_project_flutter/core/models/assets_image.dart'; + +part 'user_data_model.g.dart'; + +@HiveType(typeId: HiveTypesIds.userDataTypeId) +class UserData { + @HiveField(0) + final AssetsImage avatar; + + @HiveField(1) + final DateTime birthDate; + + @HiveField(2) + final String genderPref; + + @HiveField(3) + final DateTime lastConnection; + + @HiveField(4) + final String lastName; + + @HiveField(5) + final String name; + + @HiveField(6, defaultValue: "") + final String? number; + + const UserData({ + required this.avatar, + required this.birthDate, + required this.genderPref, + required this.lastConnection, + required this.lastName, + required this.name, + this.number = "", + }); + + UserData copyWith({ + AssetsImage? avatar, + DateTime? birthDate, + String? genderPref, + DateTime? lastConnection, + String? lastName, + String? name, + String? number, + }) { + return UserData( + avatar: avatar ?? this.avatar, + birthDate: birthDate ?? this.birthDate, + genderPref: genderPref ?? this.genderPref, + lastConnection: lastConnection ?? this.lastConnection, + lastName: lastName ?? this.lastName, + name: name ?? this.name, + number: number ?? this.number, + ); + } + + Map toMap() { + return { + 'avatar': avatar.toMap(), + 'birthDate': birthDate.millisecondsSinceEpoch, + 'genderPref': genderPref, + 'lastConnection': lastConnection.millisecondsSinceEpoch, + 'lastName': lastName, + 'name': name, + 'number': number, + }; + } + + factory UserData.fromMap(Map map) { + return UserData( + avatar: + AssetsImage.fromMap(Map.from(map['avatar'] as Map)), + birthDate: DateTime.fromMillisecondsSinceEpoch(map['birthDate'] as int), + genderPref: map['genderPref'] as String, + lastConnection: + DateTime.fromMillisecondsSinceEpoch(map['lastConnection'] as int), + lastName: map['lastName'] as String, + name: map['name'] as String, + number: map['number'] as String?, + ); + } + + String toJson() => json.encode(toMap()); + + factory UserData.fromJson(String source) => + UserData.fromMap(json.decode(source) as Map); + + @override + String toString() { + return 'UserData(avatar: $avatar, birthDate: $birthDate, genderPref: $genderPref, lastConnection: $lastConnection, lastName: $lastName, name: $name, number: $number)'; + } + + @override + bool operator ==(covariant UserData other) { + if (identical(this, other)) return true; + + return other.avatar == avatar && + other.birthDate == birthDate && + other.genderPref == genderPref && + other.lastConnection == lastConnection && + other.lastName == lastName && + other.name == name && + other.number == number; + } + + @override + int get hashCode { + return avatar.hashCode ^ + birthDate.hashCode ^ + genderPref.hashCode ^ + lastConnection.hashCode ^ + lastName.hashCode ^ + name.hashCode ^ + number.hashCode; + } +} diff --git a/lib/core/models/user_data_model.g.dart b/lib/core/models/user_data_model.g.dart new file mode 100644 index 00000000..0253e226 --- /dev/null +++ b/lib/core/models/user_data_model.g.dart @@ -0,0 +1,59 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'user_data_model.dart'; + +// ************************************************************************** +// TypeAdapterGenerator +// ************************************************************************** + +class UserDataAdapter extends TypeAdapter { + @override + final int typeId = 2; + + @override + UserData read(BinaryReader reader) { + final numOfFields = reader.readByte(); + final fields = { + for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(), + }; + return UserData( + avatar: fields[0] as AssetsImage, + birthDate: fields[1] as DateTime, + genderPref: fields[2] as String, + lastConnection: fields[3] as DateTime, + lastName: fields[4] as String, + name: fields[5] as String, + number: fields[6] == null ? '' : fields[6] as String?, + ); + } + + @override + void write(BinaryWriter writer, UserData obj) { + writer + ..writeByte(7) + ..writeByte(0) + ..write(obj.avatar) + ..writeByte(1) + ..write(obj.birthDate) + ..writeByte(2) + ..write(obj.genderPref) + ..writeByte(3) + ..write(obj.lastConnection) + ..writeByte(4) + ..write(obj.lastName) + ..writeByte(5) + ..write(obj.name) + ..writeByte(6) + ..write(obj.number); + } + + @override + int get hashCode => typeId.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is UserDataAdapter && + runtimeType == other.runtimeType && + typeId == other.typeId; +} diff --git a/lib/core/models/user_model.dart b/lib/core/models/user_model.dart deleted file mode 100644 index f001c84f..00000000 --- a/lib/core/models/user_model.dart +++ /dev/null @@ -1,85 +0,0 @@ -class UserModel { - final String id; - final String name; - final String email; - final String photoUrl; - final String? avatar; - final int? birthdate; - final String? gender; - final String? language; - final bool isFirstTime; - - const UserModel({required this.id, required this.name, required this.email, required this.photoUrl, this.birthdate, this.gender, this.language, this.isFirstTime = true, this.avatar = "617"}); - - factory UserModel.fromJson(Map json) => UserModel( - id: json['id'], - name: json['name'], - email: json['email'], - photoUrl: json['photoUrl'] ?? 'n/a', - birthdate: json['birthdate'] ?? 0, - gender: json['gender'] ?? 'n/a', - isFirstTime: json['isFirstTime'] == 0 ? false : true, - language: json['language'] ?? 'es', - avatar: json['avatar'] ?? "617", - ); - - factory UserModel.fromRemote(Map json) => UserModel( - id: json['id'], - name: json['Nombre'], - email: json['Email'], - photoUrl: json['Avatar']['name'] ?? 'n/a', - birthdate: json['birth_date'] ?? 0, - gender: json['pref_sexo'] ?? 'n/a', - isFirstTime: false, - language: 'es', - avatar: json['Avatar']['urlFoto'] ?? "617", - ); - - Map toMap() => { - 'id': id, - 'name': name, - 'email': email, - 'photoUrl': photoUrl, - 'birthdate': birthdate ?? 0, - 'gender': gender ?? 'n/a', - 'isFirstTime': isFirstTime ? 1 : 0, - 'language': language ?? 'es', - 'avatar': avatar ?? "617", - }; - - Map toRemote() => { - 'id': id, - 'Nombre': name, - 'Email': email, - 'birth_date': birthdate ?? 0, - 'pref_sexo': gender ?? 'n/a', - 'Avatar': { - 'name': photoUrl, - 'urlFoto': avatar ?? "617", - } - }; - - UserModel copyWith({ - String? id, - String? name, - String? email, - String? photoUrl, - int? birthdate, - String? gender, - String? language, - bool? isFirstTime, - String? avatar, - }) { - return UserModel( - id: id ?? this.id, - name: name ?? this.name, - email: email ?? this.email, - photoUrl: photoUrl ?? this.photoUrl, - birthdate: birthdate ?? this.birthdate, - gender: gender ?? this.gender, - language: language ?? this.language, - isFirstTime: isFirstTime ?? this.isFirstTime, - avatar: avatar ?? this.avatar, - ); - } -} diff --git a/lib/core/models/voice_setting.dart b/lib/core/models/voice_setting.dart new file mode 100644 index 00000000..70f6deca --- /dev/null +++ b/lib/core/models/voice_setting.dart @@ -0,0 +1,103 @@ +// coverage:ignore-file +// ignore_for_file: public_member_api_docs, sort_constructors_first +import 'dart:convert'; + +import 'package:hive_flutter/hive_flutter.dart'; + +import 'package:ottaa_project_flutter/core/abstracts/hive_type_ids.dart'; +import 'package:ottaa_project_flutter/core/enums/velocity_types.dart'; + +part 'voice_setting.g.dart'; + +typedef VoicesNames = Map; + +typedef VoicesSpeed = Map; + +@HiveType(typeId: HiveTypesIds.voiceAccessibilityTypeId) +class VoiceSetting { + @HiveField(0, defaultValue: {}) + VoicesNames voicesNames; + + @HiveField(1, defaultValue: {}) + VoicesSpeed voicesSpeed; + + @HiveField(2, defaultValue: false) + bool mutePict; + VoiceSetting({ + required this.voicesNames, + required this.voicesSpeed, + required this.mutePict, + }); + + factory VoiceSetting.empty({ + String? language, + }) { + return VoiceSetting( + voicesNames: { + language ?? "es_AR": "default2", + }, + voicesSpeed: { + language ?? "es_AR": VelocityTypes.mid, + }, + mutePict: false, + ); + } + + VoiceSetting copyWith({ + VoicesNames? voicesNames, + VoicesSpeed? voicesSpeed, + bool? mutePict, + }) { + return VoiceSetting( + voicesNames: voicesNames ?? this.voicesNames, + voicesSpeed: voicesSpeed ?? this.voicesSpeed, + mutePict: mutePict ?? this.mutePict, + ); + } + + Map toMap() { + return { + 'name': voicesNames, + 'speed': voicesSpeed.map((key, value) { + return MapEntry(key, value.name); + }), + 'mutePict': mutePict, + }; + } + + factory VoiceSetting.fromMap(Map map) { + return VoiceSetting( + voicesNames: Map.from(map['name'] as dynamic), + voicesSpeed: Map.from(map['speed'] as dynamic).map((key, value) { + return MapEntry( + key, + VelocityTypes.values.firstWhere( + (element) => element.name == value.toString(), + orElse: () => VelocityTypes.mid)); + }), + mutePict: map['mutePict'] as bool, + ); + } + + String toJson() => json.encode(toMap()); + + factory VoiceSetting.fromJson(String source) => + VoiceSetting.fromMap(json.decode(source) as Map); + + @override + String toString() => + 'VoiceAccessibilitySetting(name: $voicesNames, speed: $voicesSpeed, mutePict: $mutePict)'; + + @override + bool operator ==(covariant VoiceSetting other) { + if (identical(this, other)) return true; + + return other.voicesNames == voicesNames && + other.voicesSpeed == voicesSpeed && + other.mutePict == mutePict; + } + + @override + int get hashCode => + voicesNames.hashCode ^ voicesSpeed.hashCode ^ mutePict.hashCode; +} diff --git a/lib/core/models/voice_setting.g.dart b/lib/core/models/voice_setting.g.dart new file mode 100644 index 00000000..ec10cc36 --- /dev/null +++ b/lib/core/models/voice_setting.g.dart @@ -0,0 +1,50 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'voice_setting.dart'; + +// ************************************************************************** +// TypeAdapterGenerator +// ************************************************************************** + +class VoiceSettingAdapter extends TypeAdapter { + @override + final int typeId = 27; + + @override + VoiceSetting read(BinaryReader reader) { + final numOfFields = reader.readByte(); + final fields = { + for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(), + }; + return VoiceSetting( + voicesNames: + fields[0] == null ? {} : (fields[0] as Map).cast(), + voicesSpeed: fields[1] == null + ? {} + : (fields[1] as Map).cast(), + mutePict: fields[2] == null ? false : fields[2] as bool, + ); + } + + @override + void write(BinaryWriter writer, VoiceSetting obj) { + writer + ..writeByte(3) + ..writeByte(0) + ..write(obj.voicesNames) + ..writeByte(1) + ..write(obj.voicesSpeed) + ..writeByte(2) + ..write(obj.mutePict); + } + + @override + int get hashCode => typeId.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is VoiceSettingAdapter && + runtimeType == other.runtimeType && + typeId == other.typeId; +} diff --git a/lib/core/models/voices_model.dart b/lib/core/models/voices_model.dart new file mode 100644 index 00000000..bfbee162 --- /dev/null +++ b/lib/core/models/voices_model.dart @@ -0,0 +1,31 @@ +// To parse this JSON data, do +// +// final voices = voicesFromJson(jsonString); +// coverage:ignore-file +import 'dart:convert'; + +List voicesFromJson(String str) => + List.from(json.decode(str).map((x) => Voices.fromJson(x))); + +String voicesToJson(List data) => + json.encode(List.from(data.map((x) => x.toJson()))); + +class Voices { + Voices({ + required this.name, + required this.locale, + }); + + String name; + String locale; + + factory Voices.fromJson(Map json) => Voices( + name: json["name"], + locale: json["locale"], + ); + + Map toJson() => { + "name": name, + "locale": locale, + }; +} diff --git a/lib/core/repositories/about_repository.dart b/lib/core/repositories/about_repository.dart index c93d8b4a..0cff1b7a 100644 --- a/lib/core/repositories/about_repository.dart +++ b/lib/core/repositories/about_repository.dart @@ -1,19 +1,29 @@ +// coverage:ignore-file import 'dart:async'; import 'package:either_dart/either.dart'; +import 'package:ottaa_project_flutter/core/enums/user_payment.dart'; import 'package:ottaa_project_flutter/core/enums/user_types.dart'; -import 'package:ottaa_project_flutter/core/models/user_model.dart'; +import 'package:ottaa_project_flutter/core/abstracts/user_model.dart'; +import 'package:ottaa_project_flutter/core/models/assets_image.dart'; +import 'package:ottaa_project_flutter/core/repositories/repositories.dart'; abstract class AboutRepository { Future getEmail(); + Future getAppVersion(); + Future getDeviceName(); - Future getUserType(); + + Future getUserType(); + Future getAvailableAppVersion(); + Future sendSupportEmail(); + Future uploadUserInformation(); - Future uploadProfilePicture(String photo); + Future uploadProfilePicture(AssetsImage image); Future getProfilePicture(); @@ -22,4 +32,9 @@ abstract class AboutRepository { Future isFirstTime(); Future> getUserInformation(); + + Future updateUserType({required String id, required UserType userType}); + + Future updateUserLastConnectionTime( + {required String userId, required int time}); } diff --git a/lib/core/repositories/auth_repository.dart b/lib/core/repositories/auth_repository.dart index 0619b440..765fc9ec 100644 --- a/lib/core/repositories/auth_repository.dart +++ b/lib/core/repositories/auth_repository.dart @@ -2,12 +2,12 @@ import 'dart:async'; import 'package:either_dart/either.dart'; import 'package:ottaa_project_flutter/core/enums/sign_in_types.dart'; -import 'package:ottaa_project_flutter/core/models/user_model.dart'; +import 'package:ottaa_project_flutter/core/abstracts/user_model.dart'; abstract class AuthRepository { bool get isLogged; - Future> signIn(SignInType type); + Future> signIn(SignInType type, [String? email, String? password]); Future> signUp(); @@ -17,8 +17,7 @@ abstract class AuthRepository { Future logout(); - Future runToGetDataFromOtherPlatform({ - required String email, - required String id, - }); + Future getDeviceId(); + + Future deleteAccount({required String userId}); } diff --git a/lib/core/repositories/chatgpt_repository.dart b/lib/core/repositories/chatgpt_repository.dart new file mode 100644 index 00000000..4f9786c4 --- /dev/null +++ b/lib/core/repositories/chatgpt_repository.dart @@ -0,0 +1,18 @@ +import 'package:either_dart/either.dart'; + +abstract class ChatGPTRepository { + const ChatGPTRepository(); + + Future> getCompletion({ + required int age, + required String gender, + required String pictograms, + required String language, + int maxTokens = 500, + }); + + Future> getGPTStory({ + required String prompt, + int maxTokens = 1000, + }); +} diff --git a/lib/core/repositories/create_picto_repository.dart b/lib/core/repositories/create_picto_repository.dart new file mode 100644 index 00000000..1e4530de --- /dev/null +++ b/lib/core/repositories/create_picto_repository.dart @@ -0,0 +1,18 @@ +import 'package:either_dart/either.dart'; +import 'package:ottaa_project_flutter/core/models/arsaac_data_model.dart'; +import 'package:ottaa_project_flutter/core/models/group_model.dart'; +import 'package:ottaa_project_flutter/core/models/picto_model.dart'; + +abstract class CreatePictoRepository { + Future> fetchUserGroups({required String languageCode, required String userId}); + + Future> fetchUserPictos({required String languageCode, required String userId}); + + Future>> fetchPhotosFromGlobalSymbols({required String searchText, required String languageCode}); + + Future uploadOtherImages({required String imagePath, required String directoryPath, required String name, required String userId}); + + Future> fetchDefaultGroups({required String languageCode}); + + Future> fetchDefaultPictos({required String languageCode}); +} diff --git a/lib/core/repositories/customise_repository.dart b/lib/core/repositories/customise_repository.dart new file mode 100644 index 00000000..979b25c9 --- /dev/null +++ b/lib/core/repositories/customise_repository.dart @@ -0,0 +1,20 @@ +import 'package:ottaa_project_flutter/core/models/group_model.dart'; +import 'package:ottaa_project_flutter/core/models/picto_model.dart'; +import 'package:ottaa_project_flutter/core/models/shortcuts_model.dart'; +import 'package:ottaa_project_flutter/core/repositories/server_repository.dart'; + +abstract class CustomiseRepository { + Future setShortcutsForUser({required ShortcutsModel shortcuts, required String userId}); + + Future> fetchDefaultGroups({required String languageCode}); + + Future> fetchDefaultPictos({required String languageCode}); + + Future fetchShortcutsForUser({required String userId}); + + Future> fetchUserGroups({required String languageCode, required String userId}); + + Future> fetchUserPictos({required String languageCode, required String userId}); + + Future valuesExistOrNot({required String languageCode, required String userId}); +} diff --git a/lib/core/repositories/groups_repository.dart b/lib/core/repositories/groups_repository.dart index 0e389a98..a9ba3e1a 100644 --- a/lib/core/repositories/groups_repository.dart +++ b/lib/core/repositories/groups_repository.dart @@ -1,11 +1,16 @@ import 'package:ottaa_project_flutter/core/abstracts/basic_search.dart'; -import 'package:ottaa_project_flutter/core/models/groups_model.dart'; +import 'package:ottaa_project_flutter/core/models/group_model.dart'; abstract class GroupsRepository { - Future> getAllGroups(); + Future> getAllGroups({bool defaultGroups = false}); - Future uploadGroups(List data, String type, String language); - Future updateGroups(Groups data, String type, String language, int index); + Future> getDefaultGroups(); - Future> getGroups(BasicSearch search); + Future uploadGroups(List data, String type, String language, + {String? userId}); + + Future updateGroups( + Group data, String type, String language, int index); + + Future> getGroups(BasicSearch search); } diff --git a/lib/core/repositories/local_database_repository.dart b/lib/core/repositories/local_database_repository.dart index 180103bf..74d2cf3a 100644 --- a/lib/core/repositories/local_database_repository.dart +++ b/lib/core/repositories/local_database_repository.dart @@ -1,13 +1,33 @@ -import 'package:ottaa_project_flutter/core/models/user_model.dart'; +import 'package:ottaa_project_flutter/core/abstracts/user_model.dart'; abstract class LocalDatabaseRepository { UserModel? get user; + set user(UserModel? user); Future init(); + Future close(); Future setUser(UserModel user); + Future getUser(); + Future deleteUser(); + + Future getIntro(); + + Future setIntro([bool? value]); + + Future getVoice(); + + Future getLongClick(); + + Future setLongClick({required bool isLongClick}); + + Future setVoice({required String name}); + + Future setAppleUserDara({required Map data}); + + Future> getAppleUserData(); } diff --git a/lib/core/repositories/local_storage_repository.dart b/lib/core/repositories/local_storage_repository.dart index 21cff9e7..8930e178 100644 --- a/lib/core/repositories/local_storage_repository.dart +++ b/lib/core/repositories/local_storage_repository.dart @@ -1,17 +1,6 @@ -import 'package:ottaa_project_flutter/core/models/groups_model.dart'; -import 'package:ottaa_project_flutter/core/models/pictogram_model.dart'; +import 'package:ottaa_project_flutter/core/models/group_model.dart'; +import 'package:ottaa_project_flutter/core/models/picto_model.dart'; abstract class LocalStorageRepository { - Future writeGruposToFile({ - required String data, - required String language, - }); - - Future> readGruposFromFile({ - required String language, - }); - - Future writePictoToFile({required String data, required String language}); - - Future> readPictoFromFile({required String language}); + Future> readPictosFromLocal({required String locale}); } diff --git a/lib/core/repositories/pictograms_repository.dart b/lib/core/repositories/pictograms_repository.dart index 7a384fa3..1a18a2e9 100644 --- a/lib/core/repositories/pictograms_repository.dart +++ b/lib/core/repositories/pictograms_repository.dart @@ -1,12 +1,14 @@ import 'package:ottaa_project_flutter/core/abstracts/basic_search.dart'; -import 'package:ottaa_project_flutter/core/models/pictogram_model.dart'; +import 'package:ottaa_project_flutter/core/models/picto_model.dart'; abstract class PictogramsRepository { - Future> getAllPictograms(); + Future> getAllPictograms(); - Future uploadPictograms(List data, String language); + Future uploadPictograms(List data, String language, {String? userId}); - Future updatePictogram(Pict pictogram, String language, int index); + Future updatePictogram(Picto pictogram, String language, int index); - Future> getPictograms(BasicSearch search); + Future> getPictograms(BasicSearch search); + + Future> loadTranslations({required String language}); } diff --git a/lib/core/repositories/profile_repository.dart b/lib/core/repositories/profile_repository.dart new file mode 100644 index 00000000..c81cebb0 --- /dev/null +++ b/lib/core/repositories/profile_repository.dart @@ -0,0 +1,24 @@ +import 'package:either_dart/either.dart'; + +abstract class ProfileRepository { + Future uploadUserImage( + {required String path, required String name, required String userId}); + + Future updateUserSettings( + {required Map data, required String userId}); + + Future updateUser( + {required Map data, required String userId}); + + Future>> getConnectedUsers( + {required String userId}); + + Future>> getProfileById( + {required String id}); + + Future>> fetchConnectedUserData( + {required String userId}); + + Future removeCurrentUser( + {required String userId, required String careGiverId}); +} diff --git a/lib/core/repositories/remote_config_repository.dart b/lib/core/repositories/remote_config_repository.dart new file mode 100644 index 00000000..8912285f --- /dev/null +++ b/lib/core/repositories/remote_config_repository.dart @@ -0,0 +1,11 @@ +abstract class RemoteConfigRepository { + Future init(); + + Future getString(String key); + + Future getInt(String key); + + Future getBool(String key); + + Future getDouble(String key); +} diff --git a/lib/core/repositories/report_repository.dart b/lib/core/repositories/report_repository.dart index 2b1ad726..c971924e 100644 --- a/lib/core/repositories/report_repository.dart +++ b/lib/core/repositories/report_repository.dart @@ -1,8 +1,10 @@ +import 'package:ottaa_project_flutter/core/models/phrases_statistics_model.dart'; import 'package:ottaa_project_flutter/core/models/picto_statistics_model.dart'; -import 'package:ottaa_project_flutter/core/models/sentence_statistics_model.dart'; abstract class ReportRepository { - Future getPictogramsStatistics(String userId, String languageCode); + Future getPictogramsStatistics( + String userId, String languageCode); - Future getMostUsedSentences(String userId, String languageCode); + Future getMostUsedSentences( + String userId, String languageCode); } diff --git a/lib/core/repositories/repositories.dart b/lib/core/repositories/repositories.dart new file mode 100644 index 00000000..8f23a113 --- /dev/null +++ b/lib/core/repositories/repositories.dart @@ -0,0 +1,16 @@ +export 'about_repository.dart'; +export 'auth_repository.dart'; +export 'chatgpt_repository.dart'; +export 'customise_repository.dart'; +export 'groups_repository.dart'; +export 'local_database_repository.dart'; +export 'local_storage_repository.dart'; +export 'pictograms_repository.dart'; +export 'profile_repository.dart'; +export 'remote_config_repository.dart'; +export 'remote_storage_repository.dart'; +export 'report_repository.dart'; +export 'sentences_repository.dart'; +export 'server_repository.dart'; +export 'tts_repository.dart'; +export 'user_settings_repository.dart'; diff --git a/lib/core/repositories/sentences_repository.dart b/lib/core/repositories/sentences_repository.dart index 2507cab9..46edcc8d 100644 --- a/lib/core/repositories/sentences_repository.dart +++ b/lib/core/repositories/sentences_repository.dart @@ -1,16 +1,17 @@ import 'package:either_dart/either.dart'; -import 'package:ottaa_project_flutter/core/models/sentence_model.dart'; +import 'package:ottaa_project_flutter/core/models/phrase_model.dart'; +import 'package:ottaa_project_flutter/core/repositories/server_repository.dart'; abstract class SentencesRepository { - Future> fetchSentences({ + Future>> fetchSentences({ required String language, required String type, bool isFavorite = false, }); - Future uploadSentences({ + Future uploadSentences({ required String language, - required List data, + required List data, required String type, }); } diff --git a/lib/core/repositories/server_repository.dart b/lib/core/repositories/server_repository.dart index 0a7bda6b..6f15bd5e 100644 --- a/lib/core/repositories/server_repository.dart +++ b/lib/core/repositories/server_repository.dart @@ -1,6 +1,11 @@ +import 'package:dio/dio.dart'; import 'package:either_dart/either.dart'; +import 'package:ottaa_project_flutter/core/enums/board_data_type.dart'; import 'package:ottaa_project_flutter/core/enums/user_types.dart'; -import 'package:ottaa_project_flutter/core/models/sentence_model.dart'; +import 'package:ottaa_project_flutter/core/models/arsaac_data_model.dart'; +import 'package:ottaa_project_flutter/core/models/assets_image.dart'; +import 'package:ottaa_project_flutter/core/models/devices_token.dart'; +import 'package:ottaa_project_flutter/core/models/shortcuts_model.dart'; typedef EitherVoid = Either; typedef EitherString = Either; @@ -8,22 +13,19 @@ typedef EitherListMap = Either>>; typedef EitherMap = Either>; abstract class ServerRepository { - Future init(); - Future close(); - Future getAvailableAppVersion(String platform); Future getUserType(String userId); Future getUserProfilePicture(String userId); - Future uploadUserPicture(String userId, String picture, String photoUrl); + Future uploadUserPicture(String userId, AssetsImage image); Future getUserInformation(String id); Future uploadUserInformation(String userId, Map data); - Future> getUserSentences(String userId, {required String language, required String type, bool isFavorite = false}); + Future>> getUserSentences(String userId, {required String language, required String type, bool isFavorite = false}); Future uploadUserSentences(String userId, String language, String type, List> data); @@ -39,7 +41,90 @@ abstract class ServerRepository { Future updateGroup(String userId, String language, int index, {required Map data}); - Future getPictogramsStatistics(String userId, String languageCode); + Future getPictogramsStatistics(String userId, String languageCode, [CancelToken? cancelToken]); + + Future getMostUsedSentences(String userId, String languageCode, [CancelToken? cancelToken]); + + Future generatePhraseGPT({required String prompt, required int maxTokens, double temperature = 0}); + + Future uploadUserImage({required String path, required String name, required String userId}); + + Future updateUserSettings({required Map data, required String userId}); + + Future getConnectedUsers({required String userId}); + + Future fetchConnectedUserData({required String userId}); + + Future removeCurrentUser({required String userId, required String careGiverId}); + + Future setShortcutsForUser({required ShortcutsModel shortcuts, required String userId}); + + Future updateUserData({required Map data, required String userId}); + + Future getEmailToken(String ownEmail, String email, [CancelToken? cancelToken]); + + Future verifyEmailToken(String ownEmail, String email, String token, [CancelToken? cancelToken]); + + Future getProfileById({required String id}); + + Future getDefaultGroups(String languageCode); + + Future getDefaultPictos(String languageCode); + + Future updateUserType({required String id, required UserType userType}); + + Future fetchShortcutsForUser({required String userId}); + + Future?> createPictoGroupData({ + required String userId, + required String language, + required BoardDataType type, + required Map data, + CancelToken? cancelToken, + }); + + Future updateDevicesId({required String userId, required DeviceToken deviceToken}); + + Future learnPictograms({ + required String uid, + required String language, + required String model, + required List> tokens, + CancelToken? cancelToken, + }); + + Future predictPictogram({ + required String sentence, + required String uid, + required String language, + required String model, + required List groups, + required Map> tags, + bool reduced = false, + int limit = 10, + int chunk = 4, + CancelToken? cancelToken, + }); + + Future updateUserLastConnectionTime({required String userId, required int time}); + + Future fetchUserGroups({required String languageCode, required String userId}); + + Future fetchUserPictos({required String languageCode, required String userId}); + + Future updateLanguageSettings({required Map map, required String userId}); + + Future updateVoiceAndSubtitleSettings({required Map map, required String userId}); + + Future updateAccessibilitySettings({required Map map, required String userId}); + + Future updateMainSettings({required Map map, required String userId}); + + Future fetchUserSettings({required String userId}); + + Future>> fetchPhotosFromGlobalSymbols({required String searchText, required String languageCode}); + + Future uploadOtherImages({required String imagePath, required String directoryPath, required String name, required String userId}); - Future getMostUsedSentences(String userId, String languageCode); + Future deleteTheAccount({required String userId}); } diff --git a/lib/core/repositories/tts_repository.dart b/lib/core/repositories/tts_repository.dart index 8be9ce5e..b4fb52d7 100644 --- a/lib/core/repositories/tts_repository.dart +++ b/lib/core/repositories/tts_repository.dart @@ -1,3 +1,41 @@ +import 'package:ottaa_project_flutter/core/models/voices_model.dart'; + abstract class TTSRepository { + get tts; + + bool get customTTSEnable; + set customTTSEnable(bool value); + + String get language; + set language(String value); + + List get availableTTS; + set availableTTS(List value); + + String get voice; + set voice(String value); + + String get name; + set name(String value); + + String get locale; + set locale(String value); + + double get speechRate; + + set speechRate(double value); + + double get pitch; + + set pitch(double value); + Future speak(String text); + + Future> fetchVoices(); + + Future changeVoiceSpeed(double speed); + + Future changeCustomTTs(bool value); + Future changeTTSVoice(String voice); + Future ttsStop(); } diff --git a/lib/core/repositories/user_settings_repository.dart b/lib/core/repositories/user_settings_repository.dart new file mode 100644 index 00000000..1ee1c191 --- /dev/null +++ b/lib/core/repositories/user_settings_repository.dart @@ -0,0 +1,15 @@ +abstract class UserSettingRepository { + Future updateLanguageSettings( + {required Map map, required String userId}); + + Future updateVoiceAndSubtitleSettings( + {required Map map, required String userId}); + + Future updateAccessibilitySettings( + {required Map map, required String userId}); + + Future updateMainSettings( + {required Map map, required String userId}); + + Future fetchUserSettings({required String userId}); +} diff --git a/lib/core/service/notifications_service.dart b/lib/core/service/notifications_service.dart new file mode 100644 index 00000000..a52206d8 --- /dev/null +++ b/lib/core/service/notifications_service.dart @@ -0,0 +1,15 @@ +import 'dart:async'; + +abstract class NotificationsService { + StreamSubscription? onMessageSubscription; + StreamSubscription? onMessageOpenedAppSubscription; + StreamSubscription? onMessageReceived; + + Future init(); + + Future showNotification({ + required String title, + required String description, + Map? payload, + }); +} diff --git a/lib/core/use_cases/create_email_token.dart b/lib/core/use_cases/create_email_token.dart new file mode 100644 index 00000000..1cef2b18 --- /dev/null +++ b/lib/core/use_cases/create_email_token.dart @@ -0,0 +1,9 @@ +import 'package:ottaa_project_flutter/core/repositories/server_repository.dart'; + +abstract class CreateEmailToken { + final ServerRepository serverService; + + const CreateEmailToken(this.serverService); + + Future createEmailToken(String ownEmail, String email); +} diff --git a/lib/core/use_cases/create_group_data.dart b/lib/core/use_cases/create_group_data.dart new file mode 100644 index 00000000..05d83264 --- /dev/null +++ b/lib/core/use_cases/create_group_data.dart @@ -0,0 +1,11 @@ +import 'package:ottaa_project_flutter/core/models/group_model.dart'; +import 'package:ottaa_project_flutter/core/repositories/server_repository.dart'; + +abstract class CreateGroupData { + final ServerRepository serverService; + + const CreateGroupData(this.serverService); + + Future createGroupData( + {required Group group, required String userId, required String lang}); +} diff --git a/lib/core/use_cases/create_phrase_data.dart b/lib/core/use_cases/create_phrase_data.dart new file mode 100644 index 00000000..1abda3d3 --- /dev/null +++ b/lib/core/use_cases/create_phrase_data.dart @@ -0,0 +1,12 @@ +import 'package:ottaa_project_flutter/core/models/group_model.dart'; +import 'package:ottaa_project_flutter/core/models/phrase_model.dart'; +import 'package:ottaa_project_flutter/core/repositories/server_repository.dart'; + +abstract class CreatePhraseData { + final ServerRepository serverService; + + const CreatePhraseData(this.serverService); + + Future createPhraseData( + {required Phrase phrase, required String userId, required String lang}); +} diff --git a/lib/core/use_cases/create_picto_data.dart b/lib/core/use_cases/create_picto_data.dart new file mode 100644 index 00000000..ab17614e --- /dev/null +++ b/lib/core/use_cases/create_picto_data.dart @@ -0,0 +1,11 @@ +import 'package:ottaa_project_flutter/core/models/picto_model.dart'; +import 'package:ottaa_project_flutter/core/repositories/server_repository.dart'; + +abstract class CreatePictoData { + final ServerRepository serverService; + + const CreatePictoData(this.serverService); + + Future createPictoData( + {required Picto picto, required String userId, required String lang}); +} diff --git a/lib/core/use_cases/learn_pictogram.dart b/lib/core/use_cases/learn_pictogram.dart new file mode 100644 index 00000000..c4bb112c --- /dev/null +++ b/lib/core/use_cases/learn_pictogram.dart @@ -0,0 +1,25 @@ +import 'package:either_dart/either.dart'; +import 'package:ottaa_project_flutter/core/models/learn_token.dart'; +import 'package:ottaa_project_flutter/core/repositories/repositories.dart'; + +abstract class LearnPictogram { + ServerRepository serverRepository; + + LearnPictogram({ + required this.serverRepository, + }); + + /// Call for learn pictograms, [sentence] is deprecated, use [tokens] instead + /// [sentence] or [tokens] is the sentence to learn, [uid] is the user id, + /// [language] is the language of the sentence, [model] is the model to use + /// + /// Return a [Either] with the [Left] containing the error message or the [Right] + /// containing the sentence learned + Future> call({ + @Deprecated("You should use tokens instead of this") String? sentence, + required String uid, + required String language, + required String model, + required List tokens, + }); +} diff --git a/lib/core/use_cases/predict_pictogram.dart b/lib/core/use_cases/predict_pictogram.dart new file mode 100644 index 00000000..e836e94a --- /dev/null +++ b/lib/core/use_cases/predict_pictogram.dart @@ -0,0 +1,29 @@ +import 'package:dio/dio.dart'; +import 'package:either_dart/either.dart'; +import 'package:ottaa_project_flutter/core/models/picto_predicted_reduced.dart'; +import 'package:ottaa_project_flutter/core/repositories/repositories.dart'; + +abstract class PredictPictogram { + ServerRepository serverRepository; + + PredictPictogram({ + required this.serverRepository, + }); + + /// Call for predict pictograms, [sentence] is the sentence to predict, + /// [uid] is the user id, [language] is the language of the sentence, + /// [model] is the model to use, [groups] is the list of groups to predict and it is used to filter the pictograms, + /// [tags] is thePictoPredictedReduced map of tags to predict and it is used to filter the pictograms + Future>> call({ + required String sentence, + required String uid, + required String language, + required String model, + required List groups, + required Map> tags, + bool reduced = false, + int limit = 10, + int chunk = 4, + CancelToken? cancelToken, + }); +} diff --git a/lib/core/use_cases/use_cases.dart b/lib/core/use_cases/use_cases.dart new file mode 100644 index 00000000..2d9e9748 --- /dev/null +++ b/lib/core/use_cases/use_cases.dart @@ -0,0 +1,5 @@ +export 'create_email_token.dart'; +export 'create_group_data.dart'; +export 'create_phrase_data.dart'; +export 'create_picto_data.dart'; +export 'verify_email_token.dart'; diff --git a/lib/core/use_cases/verify_email_token.dart b/lib/core/use_cases/verify_email_token.dart new file mode 100644 index 00000000..4741ae9d --- /dev/null +++ b/lib/core/use_cases/verify_email_token.dart @@ -0,0 +1,11 @@ +import 'package:either_dart/either.dart'; +import 'package:ottaa_project_flutter/core/repositories/server_repository.dart'; + +abstract class VerifyEmailToken { + final ServerRepository serverService; + + const VerifyEmailToken(this.serverService); + + Future> verifyEmailToken( + String ownEmail, String email, String token); +} diff --git a/lib/firebase_options.dart b/lib/firebase_options.dart new file mode 100644 index 00000000..07a111f0 --- /dev/null +++ b/lib/firebase_options.dart @@ -0,0 +1,80 @@ +// File generated by FlutterFire CLI. +// coverage:ignore-file +// ignore_for_file: lines_longer_than_80_chars, avoid_classes_with_only_static_members +import 'package:firebase_core/firebase_core.dart' show FirebaseOptions; +import 'package:flutter/foundation.dart' show defaultTargetPlatform, kIsWeb, TargetPlatform; + +/// Default [FirebaseOptions] for use with your Firebase apps. +/// +/// Example: +/// ```dart +/// import 'firebase_options.dart'; +// ... +/// await Firebase.initializeApp( +/// options: DefaultFirebaseOptions.currentPlatform, +/// ); +/// ``` +class DefaultFirebaseOptions { + static FirebaseOptions get currentPlatform { + if (kIsWeb) { + return web; + } + switch (defaultTargetPlatform) { + case TargetPlatform.android: + return android; + case TargetPlatform.iOS: + return ios; + case TargetPlatform.macOS: + throw UnsupportedError( + 'DefaultFirebaseOptions have not been configured for macos - ' + 'you can reconfigure this by running the FlutterFire CLI again.', + ); + case TargetPlatform.windows: + throw UnsupportedError( + 'DefaultFirebaseOptions have not been configured for windows - ' + 'you can reconfigure this by running the FlutterFire CLI again.', + ); + case TargetPlatform.linux: + throw UnsupportedError( + 'DefaultFirebaseOptions have not been configured for linux - ' + 'you can reconfigure this by running the FlutterFire CLI again.', + ); + default: + throw UnsupportedError( + 'DefaultFirebaseOptions are not supported for this platform.', + ); + } + } + + static const FirebaseOptions web = FirebaseOptions( + apiKey: 'AIzaSyCO20tKmBuKOlOstr5X0WHJdATfAxlfma0', + appId: '1:873137795353:web:40e956cef39481653d9588', + messagingSenderId: '873137795353', + projectId: 'ottaaproject-flutter', + authDomain: 'ottaaproject-flutter.firebaseapp.com', + databaseURL: 'https://ottaaproject-flutter-default-rtdb.firebaseio.com', + storageBucket: 'ottaaproject-flutter.appspot.com', + measurementId: 'G-5QCB3QD3PH', + ); + + static const FirebaseOptions android = FirebaseOptions( + apiKey: 'AIzaSyAhrH8ja_uNLfqVzriCwnT3cMc2dYHsHC0', + appId: '1:873137795353:android:d7a950d9817316133d9588', + messagingSenderId: '873137795353', + projectId: 'ottaaproject-flutter', + databaseURL: 'https://ottaaproject-flutter-default-rtdb.firebaseio.com', + storageBucket: 'ottaaproject-flutter.appspot.com', + ); + + static const FirebaseOptions ios = FirebaseOptions( + apiKey: 'AIzaSyCYbal1US11FCM16wQcEpri4azayyS0u2s', + appId: '1:873137795353:ios:f625d933dd6c58e33d9588', + messagingSenderId: '873137795353', + projectId: 'ottaaproject-flutter', + databaseURL: 'https://ottaaproject-flutter-default-rtdb.firebaseio.com', + storageBucket: 'ottaaproject-flutter.appspot.com', + androidClientId: '873137795353-1ttsko6h874bjq935auokrhk9plshtka.apps.googleusercontent.com', + iosClientId: '873137795353-8nf0s1bmivtavhh51h7genlc0aqu1rea.apps.googleusercontent.com', + iosBundleId: 'com.ottaaproject.ottaa', + ); +} diff --git a/lib/main.dart b/lib/main.dart index d4fd2555..1f009fdb 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,15 +1,16 @@ -import 'dart:async'; -import 'package:firebase_crashlytics/firebase_crashlytics.dart'; -import 'package:flutter/material.dart'; +import 'package:awesome_notifications/awesome_notifications.dart'; import 'package:firebase_core/firebase_core.dart'; +import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:flutter/foundation.dart' show kIsWeb; +import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import 'package:flutter_facebook_auth/flutter_facebook_auth.dart'; import 'package:ottaa_project_flutter/application/application.dart'; import 'package:ottaa_project_flutter/application/injector.dart'; import 'package:ottaa_project_flutter/application/locator.dart'; import 'package:ottaa_project_flutter/application/theme/app_theme.dart'; +import 'package:ottaa_project_flutter/firebase_options.dart'; +//Apr 11v1 void main() async { WidgetsFlutterBinding.ensureInitialized(); SystemChrome.setSystemUIOverlayStyle( @@ -19,28 +20,22 @@ void main() async { ), ); - await Firebase.initializeApp(); - - if (kIsWeb) { - // initialiaze the facebook javascript SDK - await FacebookAuth.i.webAndDesktopInitialize( - appId: "658779868360186", //<-- YOUR APP_ID - cookie: true, - xfbml: true, - version: "v9.0", - ); - } + await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform); - await setupServices(); + if (kIsWeb) {} - // await SystemChrome.setPreferredOrientations([ - // DeviceOrientation.landscapeRight, - // DeviceOrientation.landscapeLeft, - // ]); + await configureDependencies(); + FirebaseMessaging.onBackgroundMessage(_firebaseMessagingBackgroundHandler); runApp( const Injector( application: Application(), ), ); } + +@pragma('vm:entry-point') +Future _firebaseMessagingBackgroundHandler(RemoteMessage message) async { + await Firebase.initializeApp(); + AwesomeNotifications().createNotificationFromJsonData(message.data); +} diff --git a/lib/presentation/.gitkeep b/lib/presentation/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/lib/presentation/common/ui/jumping_dots.dart b/lib/presentation/common/ui/jumping_dots.dart index a7387bbe..1d65f31c 100644 --- a/lib/presentation/common/ui/jumping_dots.dart +++ b/lib/presentation/common/ui/jumping_dots.dart @@ -4,13 +4,17 @@ class JumpingDotsProgressIndicator extends StatefulWidget { final int numberOfDots; final Color dotColor; - const JumpingDotsProgressIndicator({Key? key, this.numberOfDots = 3, this.dotColor = Colors.white}) : super(key: key); + const JumpingDotsProgressIndicator( + {Key? key, this.numberOfDots = 3, this.dotColor = Colors.white}) + : super(key: key); @override - JumpingDotsProgressIndicatorState createState() => JumpingDotsProgressIndicatorState(); + JumpingDotsProgressIndicatorState createState() => + JumpingDotsProgressIndicatorState(); } -class JumpingDotsProgressIndicatorState extends State with TickerProviderStateMixin { +class JumpingDotsProgressIndicatorState + extends State with TickerProviderStateMixin { List _animationControllers = []; final List> _animations = []; @@ -35,12 +39,14 @@ class JumpingDotsProgressIndicatorState extends State(begin: 0, end: -10).animate(_animationControllers[i])); + _animations.add( + Tween(begin: 0, end: -10).animate(_animationControllers[i])); } for (int i = 0; i < widget.numberOfDots; i++) { @@ -51,7 +57,8 @@ class JumpingDotsProgressIndicatorState extends State const Center( child: CircularProgressIndicator(), ), diff --git a/lib/presentation/common/widgets/new_text_widget.dart b/lib/presentation/common/widgets/new_text_widget.dart new file mode 100644 index 00000000..80318447 --- /dev/null +++ b/lib/presentation/common/widgets/new_text_widget.dart @@ -0,0 +1,33 @@ +import 'package:flutter/material.dart'; + +class NewTextWidget extends StatelessWidget { + const NewTextWidget({ + Key? key, + required this.hintText, + }) : super(key: key); + final String hintText; + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + final textTheme = theme.textTheme; + final colorScheme = theme.colorScheme; + //todo: add the theme here and also add the text editor here + return TextFormField( + decoration: InputDecoration( + hintText: hintText, + // border: OutlineInputBorder( + // borderRadius: BorderRadius.all(Radius.circular(16.0)), + // borderSide: BorderSide(color: Colors.black, width: 1), + // ), + enabledBorder: const OutlineInputBorder( + borderRadius: BorderRadius.all(Radius.circular(16.0)), + borderSide: BorderSide(color: Colors.black, width: 1), + ), + hintStyle: textTheme.headline3!.copyWith(color: colorScheme.onSurface), + contentPadding: const EdgeInsets.only(left: 16), + ), + style: textTheme.headline3, + ); + } +} diff --git a/lib/presentation/common/widgets/ottaa_loading_animation.dart b/lib/presentation/common/widgets/ottaa_loading_animation.dart new file mode 100644 index 00000000..55495a03 --- /dev/null +++ b/lib/presentation/common/widgets/ottaa_loading_animation.dart @@ -0,0 +1,27 @@ +import 'package:flutter/material.dart'; +import 'package:rive/rive.dart'; + +class OttaaLoadingAnimation extends StatelessWidget { + final double? width; + final double? height; + + const OttaaLoadingAnimation({super.key, this.width, this.height}); + + @override + Widget build(BuildContext context) { + return SizedBox( + width: width ?? 100, + height: height ?? 100, + child: const RiveAnimation.asset('assets/rive/loading_ottaa.riv', + fit: BoxFit.contain, + alignment: Alignment.center, + placeHolder: SizedBox( + width: 100, + height: 100, + child: Center( + child: CircularProgressIndicator(), + ), + )), + ); + } +} diff --git a/lib/presentation/common/widgets/ottaa_textinput.dart b/lib/presentation/common/widgets/ottaa_textinput.dart index 9fd2912e..afcf8a91 100644 --- a/lib/presentation/common/widgets/ottaa_textinput.dart +++ b/lib/presentation/common/widgets/ottaa_textinput.dart @@ -22,7 +22,18 @@ class OTTAATextInput extends StatefulWidget { final TextInputType? keyboardType; - const OTTAATextInput({super.key, this.hintText, this.labelText, this.controller, this.isPassword = false, this.onChanged, this.validator, this.onTap, this.isReadOnly = false, this.enabled = true, this.keyboardType}); + const OTTAATextInput( + {super.key, + this.hintText, + this.labelText, + this.controller, + this.isPassword = false, + this.onChanged, + this.validator, + this.onTap, + this.isReadOnly = false, + this.enabled = true, + this.keyboardType}); @override State createState() => _OTTAATextInputState(); diff --git a/lib/presentation/common/widgets/pictogram_widget.dart b/lib/presentation/common/widgets/pictogram_widget.dart index 31f35240..551992b9 100644 --- a/lib/presentation/common/widgets/pictogram_widget.dart +++ b/lib/presentation/common/widgets/pictogram_widget.dart @@ -1,13 +1,17 @@ import 'package:flutter/material.dart'; -import 'package:ottaa_project_flutter/core/models/pictogram_model.dart'; +import 'package:ottaa_project_flutter/core/models/picto_model.dart'; import 'package:picto_widget/picto_widget.dart'; class PictogramWidget extends StatelessWidget { - final Pict pictogam; + final Picto pictogam; final VoidCallback onTap; final String language; - const PictogramWidget({super.key, required this.pictogam, required this.onTap, this.language = 'es'}); + const PictogramWidget( + {super.key, + required this.pictogam, + required this.onTap, + this.language = 'es'}); @override Widget build(BuildContext context) { @@ -15,12 +19,12 @@ class PictogramWidget extends StatelessWidget { final double height = size.height; final double width = size.width; return PictoWidget( - text: pictogam.texto.toJson()[language], - imageUrl: pictogam.imagen.pictoEditado ?? pictogam.imagen.picto, + text: pictogam.text, + imageUrl: pictogam.resource.network, onTap: onTap, height: height * 0.38, width: width * 0.175, - colorNumber: pictogam.tipo, + colorNumber: pictogam.type, ); } } diff --git a/lib/presentation/common/widgets/resource_image.dart b/lib/presentation/common/widgets/resource_image.dart new file mode 100644 index 00000000..6c1526f5 --- /dev/null +++ b/lib/presentation/common/widgets/resource_image.dart @@ -0,0 +1,42 @@ +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:flutter/material.dart'; +import 'package:ottaa_project_flutter/core/models/assets_image.dart'; + +class ResourceImage extends StatelessWidget { + final double? width; + final double? height; + + final AssetsImage image; + + final BoxFit boxFit; + + const ResourceImage({ + super.key, + required this.image, + this.width, + this.height, + this.boxFit = BoxFit.cover, + }); + + @override + Widget build(BuildContext context) { + if (image.network != null) { + return CachedNetworkImage( + imageUrl: image.network!, + fit: boxFit, + width: width, + height: height, + errorWidget: (context, url, error) => Image.asset( + fit: BoxFit.fill, + "assets/img/${image.asset}.webp", + ), + ); + } + return Image.asset( + fit: boxFit, + width: width, + height: height, + "assets/img/${image.asset}.webp", + ); + } +} diff --git a/lib/presentation/common/widgets/responsive_widget.dart b/lib/presentation/common/widgets/responsive_widget.dart new file mode 100644 index 00000000..d4a631ab --- /dev/null +++ b/lib/presentation/common/widgets/responsive_widget.dart @@ -0,0 +1,48 @@ +import 'dart:math'; + +import 'package:flutter/material.dart'; +import 'package:ottaa_ui_kit/theme.dart'; + +class ResponsiveWidget extends StatelessWidget { + final Widget child; + + const ResponsiveWidget({super.key, required this.child}); + + @override + Widget build(BuildContext context) { + return OrientationBuilder( + builder: (context, orientation) { + return LayoutBuilder( + builder: (context, constraints) { + int maxSide = max(constraints.maxWidth, constraints.maxHeight).toInt(); + + if (constraints.maxWidth > 1000) { + switch (child.runtimeType) { + case Scaffold: + return DecoratedBox( + decoration: const BoxDecoration( + color: Color(kGray), + ), + child: Padding( + padding: EdgeInsets.symmetric(horizontal: maxSide * 0.2), + child: child, + ), + ); + default: + return Align( + alignment: Alignment.topCenter, + child: SizedBox( + width: maxSide * 0.4, + child: child, + ), + ); + } + } else { + return child; + } + }, + ); + }, + ); + } +} diff --git a/lib/presentation/screens/create_picto/choose_arsaac_photo_screen.dart b/lib/presentation/screens/create_picto/choose_arsaac_photo_screen.dart new file mode 100644 index 00000000..143fd2ca --- /dev/null +++ b/lib/presentation/screens/create_picto/choose_arsaac_photo_screen.dart @@ -0,0 +1,117 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:go_router/go_router.dart'; +import 'package:ottaa_project_flutter/application/common/extensions/translate_string.dart'; +import 'package:ottaa_project_flutter/application/providers/create_picto_provider.dart'; +import 'package:ottaa_ui_kit/widgets.dart'; +import 'package:picto_widget/picto_widget.dart'; + +class ChooseArsaacPhotoScreen extends ConsumerWidget { + const ChooseArsaacPhotoScreen({super.key}); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final provider = ref.watch(createPictoProvider); + final textTheme = Theme.of(context).textTheme; + final data = MediaQueryData.fromWindow(WidgetsBinding.instance.window); + final isTablet = data.size.shortestSide < 600 ? false : true; + return Scaffold( + appBar: OTTAAAppBar( + title: Text( + "create.search_arsaac".trl, + style: textTheme.bodyMedium, + ), + ), + body: Padding( + padding: const EdgeInsets.all(24), + child: Column( + children: [ + TextFormField( + controller: provider.arsaacController, + onSaved: (value) async { + showDialog( + context: context, + builder: (context) => const Center( + child: CircularProgressIndicator(), + ), + ); + await provider.fetchPhotoFromGlobalSymbols(text: provider.arsaacController.text); + provider.searchedData.removeWhere((e) => e.picto.imageUrl.contains('.svg')); + context.pop(); + }, + onFieldSubmitted: (value) async { + showDialog( + context: context, + builder: (context) => const Center( + child: CircularProgressIndicator(), + ), + ); + await provider.fetchPhotoFromGlobalSymbols(text: provider.arsaacController.text); + provider.searchedData.removeWhere((e) => e.picto.imageUrl.contains('.svg')); + context.pop(); + }, + decoration: InputDecoration( + suffixIcon: GestureDetector( + onTap: () async { + showDialog( + context: context, + builder: (context) => const Center( + child: CircularProgressIndicator(), + ), + ); + await provider.fetchPhotoFromGlobalSymbols(text: provider.arsaacController.text); + provider.searchedData.removeWhere((e) => e.picto.imageUrl.contains('.svg')); + context.pop(); + }, + child: const Icon( + Icons.search, + color: Colors.black, + ), + ), + hintText: 'global.search'.trl, + ), + ), + const SizedBox( + height: 32, + ), + provider.isArsaacSearched + ? Expanded( + child: GridView.builder( + padding: const EdgeInsets.symmetric(horizontal: 24), + shrinkWrap: true, + itemCount: provider.searchedData.length, + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: isTablet ? 4 : 3, + crossAxisSpacing: 12, + mainAxisSpacing: 12, + childAspectRatio: isTablet ? 1.3 : 1, + ), + itemBuilder: (context, index) => FittedBox( + fit: BoxFit.contain, + child: PictoWidget( + onTap: () { + provider.isImageSelected = true; + provider.isUrl = true; + provider.imageUrlForPicto = provider.searchedData[index].picto.imageUrl; + provider.notify(); + context.pop(); + }, + imageUrl: provider.searchedData[index].picto.imageUrl, + text: '', + ), + ), + ), + ) + : Expanded( + child: Center( + child: Text( + 'global.please_enter_text'.trl, + ), + ), + ), + ], + ), + ), + ); + } +} diff --git a/lib/presentation/screens/create_picto/choose_board_screen.dart b/lib/presentation/screens/create_picto/choose_board_screen.dart new file mode 100644 index 00000000..c78e48e4 --- /dev/null +++ b/lib/presentation/screens/create_picto/choose_board_screen.dart @@ -0,0 +1,67 @@ +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:ottaa_project_flutter/application/common/app_images.dart'; +import 'package:ottaa_project_flutter/application/common/extensions/translate_string.dart'; +import 'package:ottaa_project_flutter/application/providers/create_picto_provider.dart'; +import 'package:ottaa_project_flutter/presentation/common/widgets/simple_button.dart'; +import 'package:ottaa_ui_kit/widgets.dart'; + +class ChooseBoardScreen extends ConsumerWidget { + const ChooseBoardScreen({super.key}); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final provider = ref.watch(createPictoProvider); + final isSelected = ref.watch(createPictoProvider).selectedBoardID; + final colorScheme = Theme.of(context).colorScheme; + return Column( + children: [ + Expanded( + child: provider.isBoardFetched + ? ListView.builder( + itemCount: provider.boards.length, + padding: const EdgeInsets.only(bottom: 16), + itemBuilder: (context, index) { + return Padding( + padding: const EdgeInsets.only(bottom: 16), + child: Container( + decoration: provider.selectedBoardID == index + ? BoxDecoration( + borderRadius: BorderRadius.circular(16), + border: Border.all(color: colorScheme.primary, width: 2), + ) + : const BoxDecoration(), + child: PictogramCard( + title: provider.boards[index].text, + actionText: "customize.board.subtitle".trl, + pictogram: CachedNetworkImageProvider( + provider.boards[index].resource.network!, + ), + onPressed: () async { + provider.selectedBoardID = index; + provider.notify(); + }, + ), + ), + ); + }, + ) + : const Center( + child: CircularProgressIndicator(), + ), + ), + Padding( + padding: const EdgeInsets.symmetric(vertical: 16), + child: SimpleButton( + onTap: provider.selectedBoardID == -1 ? () {} : () => provider.nextPage(), + width: false, + text: 'global.next'.trl, + backgroundColor: isSelected == -1 ? colorScheme.background : colorScheme.primary, + fontColor: isSelected == -1 ? Colors.grey : Colors.white, + ), + ), + ], + ); + } +} diff --git a/lib/presentation/screens/create_picto/choose_color_screen.dart b/lib/presentation/screens/create_picto/choose_color_screen.dart new file mode 100644 index 00000000..114c7c4a --- /dev/null +++ b/lib/presentation/screens/create_picto/choose_color_screen.dart @@ -0,0 +1,131 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:ottaa_project_flutter/application/common/extensions/translate_string.dart'; +import 'package:ottaa_project_flutter/application/providers/create_picto_provider.dart'; +import 'package:ottaa_project_flutter/presentation/common/widgets/simple_button.dart'; +import 'package:ottaa_project_flutter/presentation/screens/create_picto/widgets/image_widget.dart'; + +class ChooseColorScreen extends ConsumerWidget { + const ChooseColorScreen({super.key}); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final textTheme = Theme.of(context).textTheme; + final colorScheme = Theme.of(context).colorScheme; + final provider = ref.read(createPictoProvider); + return Column( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'create.choose_color'.trl, + style: textTheme.bodyMedium!.copyWith(fontWeight: FontWeight.w600), + ), + Padding( + padding: const EdgeInsets.symmetric(vertical: 32), + child: ImageWidget( + onTap: () {}, + ), + ), + Text( + 'global.color'.trl, + style: textTheme.bodyMedium!.copyWith(fontWeight: FontWeight.w600), + ), + const SizedBox( + height: 16, + ), + Wrap( + direction: Axis.horizontal, + spacing: 8, + runSpacing: 8, + children: [ + ColorWidget( + color: Colors.green, + text: 'global.actions'.trl, + number: 3, + ), + ColorWidget( + color: Colors.yellow, + text: 'global.people'.trl, + number: 1, + ), + ColorWidget( + color: Colors.black, + text: 'global.miscellaneous'.trl, + number: 6, + ), + ColorWidget( + color: Colors.purple, + text: 'user.main_setting.interaction'.trl, + number: 5, + ), + ColorWidget( + color: colorScheme.primary, + text: 'global.noun'.trl, + number: 2, + ), + ColorWidget( + color: Colors.blue, + text: 'global.adjective'.trl, + number: 4, + ), + ], + ), + ], + ), + ), + SimpleButton( + width: false, + onTap: () { + provider.nextPage(); + }, + text: 'global.continue'.trl, + ), + const SizedBox( + height: 16, + ), + ], + ); + } +} + +class ColorWidget extends ConsumerWidget { + const ColorWidget({ + super.key, + required this.color, + required this.text, + required this.number, + }); + + final Color color; + final String text; + final int number; + + @override + Widget build(BuildContext context, WidgetRef ref) { + final provider = ref.watch(createPictoProvider); + final textTheme = Theme.of(context).textTheme; + final colorScheme = Theme.of(context).colorScheme; + return GestureDetector( + onTap: () { + provider.borderColor = number; + provider.notify(); + }, + child: Container( + padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 12), + decoration: BoxDecoration( + color: provider.borderColor == number ? colorScheme.primary : Colors.white, + borderRadius: BorderRadius.circular(8), + border: provider.borderColor == number ? Border.all(color: Colors.transparent) : Border.all(color: color, width: 2), + ), + child: Text( + text, + style: textTheme.bodySmall!.copyWith(color: provider.borderColor == number ? Colors.white : color, fontWeight: FontWeight.w500), + ), + ), + ); + } +} diff --git a/lib/presentation/screens/create_picto/choose_picto_day_screen.dart b/lib/presentation/screens/create_picto/choose_picto_day_screen.dart new file mode 100644 index 00000000..efdad790 --- /dev/null +++ b/lib/presentation/screens/create_picto/choose_picto_day_screen.dart @@ -0,0 +1,108 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:ottaa_project_flutter/application/common/extensions/translate_string.dart'; +import 'package:ottaa_project_flutter/application/providers/create_picto_provider.dart'; +import 'package:ottaa_project_flutter/presentation/common/widgets/simple_button.dart'; +import 'package:ottaa_project_flutter/presentation/screens/create_picto/ui/day_widget.dart'; +import 'package:ottaa_project_flutter/presentation/screens/create_picto/ui/time_widget.dart'; +import 'package:ottaa_project_flutter/presentation/screens/create_picto/widgets/image_widget.dart'; + +class ChoosePictoDayScreen extends ConsumerWidget { + const ChoosePictoDayScreen({super.key}); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final provider = ref.read(createPictoProvider); + final textTheme = Theme.of(context).textTheme; + return SingleChildScrollView( + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'create.time_headline'.trl, + style: textTheme.bodyMedium!.copyWith(fontWeight: FontWeight.w600), + ), + Padding( + padding: const EdgeInsets.symmetric(vertical: 32), + child: ImageWidget( + onTap: () {}, + ), + ), + Text( + 'global.predictive'.trl, + style: textTheme.bodyMedium!.copyWith(fontWeight: FontWeight.w600), + ), + Padding( + padding: const EdgeInsets.only(top: 16, bottom: 8), + child: Text( + 'create.time_sub1'.trl, + ), + ), + Wrap( + direction: Axis.horizontal, + spacing: 8, + runSpacing: 8, + children: [ + DayWidget(text: 'global.sunday'.trl), + DayWidget(text: 'global.monday'.trl), + DayWidget(text: 'global.tuesday'.trl), + DayWidget(text: 'global.wednesday'.trl), + DayWidget(text: 'global.thursday'.trl), + DayWidget(text: 'global.friday'.trl), + DayWidget(text: 'global.saturday'.trl), + ], + ), + Padding( + padding: const EdgeInsets.only(top: 16, bottom: 8), + child: Text( + 'create.schedule'.trl, + ), + ), + Wrap( + direction: Axis.horizontal, + spacing: 8, + runSpacing: 8, + children: [ + TimeWidget(text: 'global.tomorrow'.trl), + TimeWidget(text: 'global.noon'.trl), + TimeWidget(text: 'global.late'.trl), + TimeWidget(text: 'global.evening'.trl), + ], + ), + ], + ), + Padding( + padding: const EdgeInsets.symmetric(vertical: 16), + child: SimpleButton( + width: false, + onTap: () { + provider.daysString = ''; + provider.timeString = ''; + for (var element in provider.daysToUsePicto) { + if (provider.daysString.isEmpty) { + provider.daysString = '$element '; + } else { + provider.daysString = '${provider.daysString}, $element '; + } + } + for (var element in provider.timeForPicto) { + if (provider.timeString.isEmpty) { + provider.timeString = '$element '; + } else { + provider.timeString = '${provider.timeString}, $element '; + } + } + provider.notify(); + provider.nextPage(); + }, + text: 'global.continue'.trl, + ), + ), + ], + ), + ); + } +} diff --git a/lib/presentation/screens/create_picto/create_picto_page_viewer_screen.dart b/lib/presentation/screens/create_picto/create_picto_page_viewer_screen.dart new file mode 100644 index 00000000..4e5bb27c --- /dev/null +++ b/lib/presentation/screens/create_picto/create_picto_page_viewer_screen.dart @@ -0,0 +1,80 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:go_router/go_router.dart'; +import 'package:ottaa_project_flutter/application/common/extensions/translate_string.dart'; +import 'package:ottaa_project_flutter/application/providers/create_picto_provider.dart'; +import 'package:ottaa_project_flutter/presentation/screens/create_picto/choose_board_screen.dart'; +import 'package:ottaa_project_flutter/presentation/screens/create_picto/choose_color_screen.dart'; +import 'package:ottaa_project_flutter/presentation/screens/create_picto/choose_picto_day_screen.dart'; +import 'package:ottaa_project_flutter/presentation/screens/create_picto/create_pictogram_initial_screen.dart'; +import 'package:ottaa_project_flutter/presentation/screens/create_picto/picto_final_screen.dart'; +import 'package:ottaa_project_flutter/presentation/screens/create_picto/ui/page_viewer_indicator_widget.dart'; +import 'package:ottaa_ui_kit/widgets.dart'; + +class CreatePictoPageViewerScreen extends ConsumerWidget { + const CreatePictoPageViewerScreen({super.key}); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final provider = ref.watch(createPictoProvider); + final textTheme = Theme.of(context).textTheme; + return WillPopScope( + onWillPop: () async { + if (provider.controller.page != 0) { + provider.previousPage(); + provider.notify(); + return false; + } else { + context.pop(); + return true; + } + }, + child: Scaffold( + resizeToAvoidBottomInset: false, + appBar: OTTAAAppBar( + leading: IconButton( + icon: const Icon(Icons.arrow_back_ios), + onPressed: () { + if (provider.controller.page != 0) { + provider.previousPage(); + provider.notify(); + } else { + context.pop(); + } + }, + splashRadius: 24, + ), + title: Text( + 'create.heading'.trl, + style: textTheme.headlineMedium, + ), + ), + body: Padding( + padding: const EdgeInsets.symmetric(horizontal: 24), + child: Column( + children: [ + const PageViewerIndicatorWidget(), + const SizedBox( + height: 12, + ), + Expanded( + flex: 1, + child: PageView( + physics: const NeverScrollableScrollPhysics(), + controller: provider.controller, + children: const [ + ChooseBoardScreen(), + CreatePictogramInitialScreen(), + ChooseColorScreen(), + ChoosePictoDayScreen(), + PictoFinalScreen(), + ], + ), + ), + ], + ), + ), + ), + ); + } +} diff --git a/lib/presentation/screens/create_picto/create_pictogram_initial_screen.dart b/lib/presentation/screens/create_picto/create_pictogram_initial_screen.dart new file mode 100644 index 00000000..74ad172e --- /dev/null +++ b/lib/presentation/screens/create_picto/create_pictogram_initial_screen.dart @@ -0,0 +1,161 @@ +import 'dart:io'; + +import 'package:auto_size_text/auto_size_text.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:go_router/go_router.dart'; +import 'package:ottaa_project_flutter/application/common/app_images.dart'; +import 'package:ottaa_project_flutter/application/common/extensions/translate_string.dart'; +import 'package:ottaa_project_flutter/application/providers/create_picto_provider.dart'; +import 'package:ottaa_project_flutter/application/router/app_routes.dart'; +import 'package:ottaa_project_flutter/presentation/common/widgets/simple_button.dart'; +import 'package:ottaa_project_flutter/presentation/screens/create_picto/ui/text_widget.dart'; +import 'package:ottaa_project_flutter/presentation/screens/create_picto/widgets/image_widget.dart'; +import 'package:picto_widget/picto_widget.dart'; + +class CreatePictogramInitialScreen extends ConsumerWidget { + const CreatePictogramInitialScreen({super.key}); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final textTheme = Theme.of(context).textTheme; + final size = MediaQuery.of(context).size; + final provider = ref.watch(createPictoProvider); + return Column( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'create.image_selection'.trl, + style: textTheme.bodyLarge!.copyWith(fontWeight: FontWeight.w600), + ), + const SizedBox( + height: 32, + ), + ImageWidget( + onTap: () async { + showDialog( + context: context, + builder: (context) { + return AlertDialog( + contentPadding: const EdgeInsets.all(0), + backgroundColor: Colors.transparent, + content: Row( + children: [ + DialogWidget( + image: AppImages.kArsacImage, + text: 'global.arasaac'.trl, + onTap: () { + context.pop(); + context.push(AppRoutes.patientCreatePictoarsaac); + }, + ), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 16), + child: DialogWidget( + image: AppImages.kCameraIcon, + text: 'shortcut.customize.camera'.trl, + onTap: () async { + final res = await provider.captureImageFromCamera(); + if (res) { + context.pop(); + provider.notify(); + } + }, + ), + ), + DialogWidget( + image: AppImages.kGalleryIcon, + text: 'global.gallery'.trl, + onTap: () async { + final res = await provider.captureImageFromGallery(); + if (res) { + context.pop(); + provider.notify(); + } + }, + ), + ], + ), + ); + }, + ); + }, + ), + const SizedBox( + height: 32, + ), + provider.isImageSelected ? const TextWidget() : const SizedBox.shrink(), + ], + ), + ), + if (provider.nameController.text.length >= 2) ...[ + SimpleButton( + width: false, + onTap: () { + provider.nextPage(); + }, + text: 'global.next'.trl, + ), + const SizedBox( + height: 16, + ), + ] + ], + ); + } +} + +class DialogWidget extends StatelessWidget { + const DialogWidget({ + super.key, + required this.image, + required this.text, + required this.onTap, + }); + + final String image, text; + final void Function()? onTap; + + @override + Widget build(BuildContext context) { + final textTheme = Theme.of(context).textTheme; + return GestureDetector( + onTap: onTap, + child: Container( + width: 92, + // height: 130, + padding: const EdgeInsets.all(16), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(16), + ), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Image.asset( + image, + height: 70, + width: 70, + ), + const SizedBox( + height: 8, + ), + Center( + child: AutoSizeText( + text.toUpperCase(), + style: textTheme.bodySmall!.copyWith( + fontWeight: FontWeight.w600, + ), + maxLines: 1, + ), + ), + ], + ), + ), + ); + } +} diff --git a/lib/presentation/screens/create_picto/picto_final_screen.dart b/lib/presentation/screens/create_picto/picto_final_screen.dart new file mode 100644 index 00000000..32f2d5ff --- /dev/null +++ b/lib/presentation/screens/create_picto/picto_final_screen.dart @@ -0,0 +1,94 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:go_router/go_router.dart'; +import 'package:ottaa_project_flutter/application/common/extensions/translate_string.dart'; +import 'package:ottaa_project_flutter/application/providers/create_picto_provider.dart'; +import 'package:ottaa_project_flutter/presentation/common/widgets/simple_button.dart'; +import 'package:ottaa_project_flutter/presentation/screens/create_picto/widgets/image_widget.dart'; + +class PictoFinalScreen extends ConsumerWidget { + const PictoFinalScreen({super.key}); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final provider = ref.watch(createPictoProvider); + final textTheme = Theme.of(context).textTheme; + return Column( + children: [ + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'create.final_heading'.trl, + style: textTheme.bodyMedium!.copyWith(fontWeight: FontWeight.w600), + ), + Padding( + padding: const EdgeInsets.symmetric(vertical: 32), + child: ImageWidget( + onTap: () {}, + ), + ), + Text( + 'global.predictive'.trl, + style: textTheme.bodyMedium!.copyWith(fontWeight: FontWeight.w600), + ), + const Padding( + padding: EdgeInsets.symmetric(vertical: 16), + child: TimeWidget(), + ), + ], + ), + ), + Padding( + padding: const EdgeInsets.only(bottom: 16), + child: SimpleButton( + width: false, + onTap: () async { + showDialog( + context: context, + builder: (context) => const Center( + child: CircularProgressIndicator(), + ), + ); + await provider.saveAndUploadPictogram(); + context.pop(); + context.pop(); + }, + text: 'create.save'.trl, + ), + ), + ], + ); + } +} + +class TimeWidget extends ConsumerWidget { + const TimeWidget({super.key}); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final provider = ref.watch(createPictoProvider); + final textTheme = Theme.of(context).textTheme; + return Container( + padding: const EdgeInsets.all(16), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(provider.daysString), + const SizedBox( + height: 4, + ), + Text( + provider.timeString, + style: textTheme.bodySmall, + ), + ], + ), + ); + } +} diff --git a/lib/presentation/screens/create_picto/ui/day_widget.dart b/lib/presentation/screens/create_picto/ui/day_widget.dart new file mode 100644 index 00000000..92cf37fa --- /dev/null +++ b/lib/presentation/screens/create_picto/ui/day_widget.dart @@ -0,0 +1,40 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:ottaa_project_flutter/application/providers/create_picto_provider.dart'; + +class DayWidget extends ConsumerWidget { + const DayWidget({ + super.key, + required this.text, + }); + + final String text; + + @override + Widget build(BuildContext context, WidgetRef ref) { + final provider = ref.watch(createPictoProvider); + final textTheme = Theme.of(context).textTheme; + final colorScheme = Theme.of(context).colorScheme; + return GestureDetector( + onTap: () { + if (provider.daysToUsePicto.contains(text)) { + provider.daysToUsePicto.remove(text); + } else { + provider.daysToUsePicto.add(text); + } + provider.notify(); + }, + child: Container( + decoration: BoxDecoration( + color: provider.daysToUsePicto.contains(text) ? colorScheme.primary : Colors.white, + borderRadius: BorderRadius.circular(8), + ), + padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 12), + child: Text( + text, + style: textTheme.bodySmall!.copyWith(color: provider.daysToUsePicto.contains(text) ? Colors.white : Colors.grey), + ), + ), + ); + } +} diff --git a/lib/presentation/screens/create_picto/ui/page_viewer_indicator_widget.dart b/lib/presentation/screens/create_picto/ui/page_viewer_indicator_widget.dart new file mode 100644 index 00000000..e6af9522 --- /dev/null +++ b/lib/presentation/screens/create_picto/ui/page_viewer_indicator_widget.dart @@ -0,0 +1,69 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:ottaa_project_flutter/application/common/extensions/translate_string.dart'; +import 'package:ottaa_project_flutter/application/providers/create_picto_provider.dart'; + +class PageViewerIndicatorWidget extends ConsumerWidget { + const PageViewerIndicatorWidget({super.key}); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final index = ref.watch(createPictoProvider).currentIndex; + final textTheme = Theme.of(context).textTheme; + final colorScheme = Theme.of(context).colorScheme; + return Row( + children: [ + Indicator( + isOn: index == 0 ? true : false, + ), + Indicator( + isOn: index == 1 ? true : false, + ), + Indicator( + isOn: index == 2 ? true : false, + ), + Indicator( + isOn: index == 3 ? true : false, + ), + Indicator( + isOn: index == 4 ? true : false, + ), + const SizedBox( + width: 8, + ), + Text( + '${'global.step'.trl} ${index + 1} / 5', + style: textTheme.bodySmall!.copyWith( + color: Colors.grey, + ), + ), + ], + ); + } +} + +class Indicator extends StatelessWidget { + const Indicator({ + super.key, + this.isOn = false, + }); + + final bool isOn; + + @override + Widget build(BuildContext context) { + final colorScheme = Theme.of(context).colorScheme; + return Padding( + padding: const EdgeInsets.only(right: 8), + child: AnimatedContainer( + duration: const Duration(milliseconds: 300), + height: 4, + width: isOn ? 16 : 8, + decoration: BoxDecoration( + color: isOn ? colorScheme.primary : Colors.grey, + borderRadius: BorderRadius.circular(8), + ), + ), + ); + } +} diff --git a/lib/presentation/screens/create_picto/ui/text_widget.dart b/lib/presentation/screens/create_picto/ui/text_widget.dart new file mode 100644 index 00000000..4f5cd389 --- /dev/null +++ b/lib/presentation/screens/create_picto/ui/text_widget.dart @@ -0,0 +1,67 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:ottaa_project_flutter/application/common/app_images.dart'; +import 'package:ottaa_project_flutter/application/common/extensions/translate_string.dart'; +import 'package:ottaa_project_flutter/application/providers/create_picto_provider.dart'; + +class TextWidget extends ConsumerWidget { + const TextWidget({super.key}); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final provider = ref.watch(createPictoProvider); + final textTheme = Theme.of(context).textTheme; + final colorScheme = Theme.of(context).colorScheme; + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'global.text'.trl, + style: textTheme.bodyMedium!.copyWith(fontWeight: FontWeight.w600), + ), + const SizedBox( + height: 16, + ), + Row( + children: [ + Expanded( + child: TextFormField( + controller: provider.nameController, + onChanged: (text) { + provider.notify(); + }, + ), + ), + const SizedBox(width: 16), + SizedBox( + height: 50, + width: 58, + child: ElevatedButton( + style: ButtonStyle( + backgroundColor: MaterialStateProperty.all(colorScheme.primary), + overlayColor: MaterialStateProperty.all(Colors.white.withOpacity(0.1)), + shape: MaterialStateProperty.all( + const RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(9)), + ), + ), + padding: MaterialStateProperty.all(const EdgeInsets.all(0)), + elevation: MaterialStateProperty.all(0), + ), + onPressed: () async { + await provider.speakWord(); + }, + child: Center( + child: Image.asset( + AppImages.kOttaaMinimalist, + color: Colors.white, + ), + ), + ), + ), + ], + ), + ], + ); + } +} diff --git a/lib/presentation/screens/create_picto/ui/time_widget.dart b/lib/presentation/screens/create_picto/ui/time_widget.dart new file mode 100644 index 00000000..c4521532 --- /dev/null +++ b/lib/presentation/screens/create_picto/ui/time_widget.dart @@ -0,0 +1,40 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:ottaa_project_flutter/application/providers/create_picto_provider.dart'; + +class TimeWidget extends ConsumerWidget { + const TimeWidget({ + super.key, + required this.text, + }); + + final String text; + + @override + Widget build(BuildContext context, WidgetRef ref) { + final provider = ref.watch(createPictoProvider); + final textTheme = Theme.of(context).textTheme; + final colorScheme = Theme.of(context).colorScheme; + return GestureDetector( + onTap: () { + if (provider.timeForPicto.contains(text)) { + provider.timeForPicto.remove(text); + } else { + provider.timeForPicto.add(text); + } + provider.notify(); + }, + child: Container( + decoration: BoxDecoration( + color: provider.timeForPicto.contains(text) ? colorScheme.primary : Colors.white, + borderRadius: BorderRadius.circular(8), + ), + padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 12), + child: Text( + text, + style: textTheme.bodySmall!.copyWith(color: provider.timeForPicto.contains(text) ? Colors.white : Colors.grey), + ), + ), + ); + } +} diff --git a/lib/presentation/screens/create_picto/widgets/image_widget.dart b/lib/presentation/screens/create_picto/widgets/image_widget.dart new file mode 100644 index 00000000..31243c24 --- /dev/null +++ b/lib/presentation/screens/create_picto/widgets/image_widget.dart @@ -0,0 +1,43 @@ +import 'dart:io'; + +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:ottaa_project_flutter/application/common/app_images.dart'; +import 'package:ottaa_project_flutter/application/common/extensions/translate_string.dart'; +import 'package:ottaa_project_flutter/application/providers/create_picto_provider.dart'; +import 'package:picto_widget/picto_widget.dart'; + +class ImageWidget extends ConsumerWidget { + const ImageWidget({ + super.key, + required this.onTap, + }); + + final void Function() onTap; + + @override + Widget build(BuildContext context, WidgetRef ref) { + final provider = ref.watch(createPictoProvider); + final size = MediaQuery.of(context).size; + return Align( + alignment: Alignment.center, + child: SizedBox( + width: size.height * 0.2, + height: size.height * 0.25, + child: FittedBox( + fit: BoxFit.fill, + child: PictoWidget( + colorNumber: provider.borderColor, + image: provider.isImageSelected + ? provider.imageUrlForPicto.isNotEmpty + ? Image.network(provider.imageUrlForPicto) + : Image.file(File(provider.imageForPicto.path)) + : Image.asset(AppImages.kAddIcon), + onTap: onTap, + text: provider.nameController.text.isEmpty ? 'global.add'.trl : provider.nameController.text, + ), + ), + ), + ); + } +} diff --git a/lib/presentation/screens/customized_board/customize_board_screen.dart b/lib/presentation/screens/customized_board/customize_board_screen.dart new file mode 100644 index 00000000..7f55aab6 --- /dev/null +++ b/lib/presentation/screens/customized_board/customize_board_screen.dart @@ -0,0 +1,54 @@ +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:go_router/go_router.dart'; +import 'package:ottaa_project_flutter/application/common/extensions/translate_string.dart'; +import 'package:ottaa_project_flutter/application/providers/customise_provider.dart'; +import 'package:ottaa_project_flutter/application/router/app_routes.dart'; +import 'package:ottaa_ui_kit/widgets.dart'; + +class CustomizeBoardScreen extends ConsumerStatefulWidget { + const CustomizeBoardScreen({Key? key}) : super(key: key); + + @override + ConsumerState createState() => _CustomizeBoardScreenState(); +} + +class _CustomizeBoardScreenState extends ConsumerState { + @override + Widget build(BuildContext context) { + final provider = ref.watch(customiseProvider); + return provider.groupsFetched + ? ListView.builder( + padding: const EdgeInsets.only(left: 24, right: 24, bottom: 16), + shrinkWrap: true, + itemCount: provider.groups.length, + itemBuilder: (context, index) => SizedBox( + width: MediaQuery.of(context).size.width - 48, + child: Padding( + padding: const EdgeInsets.only(bottom: 16), + child: PictogramCard( + title: provider.groups[index].text, + actionText: "customize.board.subtitle".trl, + pictogram: CachedNetworkImageProvider( + provider.groups[index].resource.network!, + ), + status: !provider.groups[index].block, + onChange: (bool a) { + provider.groups[index].block = !provider.groups[index].block; + provider.notify(); + }, + onPressed: () async { + await provider.setGroupData(index: index); + await provider.fetchDesiredPictos(); + context.push(AppRoutes.userCustomizePicto); + }, + ), + ), + ), + ) + : const Center( + child: CircularProgressIndicator(), + ); + } +} diff --git a/lib/presentation/screens/customized_board/customize_picto_screen.dart b/lib/presentation/screens/customized_board/customize_picto_screen.dart new file mode 100644 index 00000000..7893f4d5 --- /dev/null +++ b/lib/presentation/screens/customized_board/customize_picto_screen.dart @@ -0,0 +1,125 @@ +import 'package:auto_size_text/auto_size_text.dart'; +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:go_router/go_router.dart'; +import 'package:ottaa_project_flutter/application/common/app_images.dart'; +import 'package:ottaa_project_flutter/application/common/extensions/translate_string.dart'; +import 'package:ottaa_project_flutter/application/providers/customise_provider.dart'; +import 'package:ottaa_project_flutter/presentation/common/widgets/responsive_widget.dart'; +import 'package:ottaa_project_flutter/presentation/screens/customized_board/ui/board_widget.dart'; +import 'package:ottaa_ui_kit/widgets.dart'; +import 'package:picto_widget/picto_widget.dart'; + +class CustomizePictoScreen extends ConsumerStatefulWidget { + const CustomizePictoScreen({Key? key}) : super(key: key); + + @override + ConsumerState createState() => _CustomizePictoScreenState(); +} + +class _CustomizePictoScreenState extends ConsumerState { + bool status = true; + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + final textTheme = theme.textTheme; + final colorScheme = theme.colorScheme; + final provider = ref.watch(customiseProvider); + return ResponsiveWidget( + child: Scaffold( + appBar: OTTAAAppBar( + title: Row( + children: [ + Expanded( + child: AutoSizeText( + "customize.picto.title".trlf({"name": provider.selectedGroupName}), + style: textTheme.headline3, + ), + ), + IconButton( + icon: const Icon( + Icons.help_outline_rounded, + size: 24, + ), + onPressed: () => BasicBottomSheet.show( + context, + // title: "", + subtitle: "board.customize.helpText".trl, + children: [ + Image.asset( + AppImages.kBoardImageEdit1, + height: 166, + ), + ], + okButtonText: "board.customize.okText".trl, + ), + padding: const EdgeInsets.all(0), + color: colorScheme.onSurface, + ), + ], + ), + ), + body: Column( + children: [ + Padding( + padding: const EdgeInsets.symmetric(horizontal: 24), + child: Column( + children: [ + const SizedBox( + height: 32, + ), + BoardWidget( + title: "customize.picto.title".trlf({"name": provider.selectedGroupName}), + //todo: this one is a placeholder for now + image: CachedNetworkImageProvider(provider.selectedGroupImage), + customizeOnTap: () { + print('customize on tap'); + }, + deleteOnTap: () { + print('delete on tap'); + }, + onChanged: (bool a) { + provider.groups[provider.selectedGroup].block = !a; + provider.selectedGroupStatus = !a; + provider.notify(); + }, + status: !provider.selectedGroupStatus, + ), + const SizedBox( + height: 16, + ), + ], + ), + ), + Expanded( + child: GridView.builder( + padding: const EdgeInsets.symmetric(horizontal: 24), + shrinkWrap: true, + itemCount: provider.selectedGruposPicts.length, + gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 3, + crossAxisSpacing: 12, + mainAxisSpacing: 12, + ), + itemBuilder: (context, index) => FittedBox( + fit: BoxFit.contain, + child: PictoWidget( + onTap: () { + provider.block(index: index); + }, + imageUrl: provider.selectedGruposPicts[index].resource.network, + text: provider.selectedGruposPicts[index].text, + colorNumber: provider.selectedGruposPicts[index].type, + disable: provider.selectedGruposPicts[index].block, + ), + ), + ), + ), + ], + ), + ), + ); + } +} diff --git a/lib/presentation/screens/customized_board/customize_shortcut_screen.dart b/lib/presentation/screens/customized_board/customize_shortcut_screen.dart new file mode 100644 index 00000000..870a1816 --- /dev/null +++ b/lib/presentation/screens/customized_board/customize_shortcut_screen.dart @@ -0,0 +1,122 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:go_router/go_router.dart'; +import 'package:ottaa_project_flutter/application/common/app_images.dart'; +import 'package:ottaa_project_flutter/application/common/extensions/translate_string.dart'; +import 'package:ottaa_project_flutter/application/providers/customise_provider.dart'; +import 'package:ottaa_project_flutter/application/router/app_routes.dart'; +import 'package:ottaa_project_flutter/presentation/screens/customized_board/ui/shortcu_widget.dart'; + +class CustomizeShortcutScreen extends ConsumerStatefulWidget { + const CustomizeShortcutScreen({Key? key}) : super(key: key); + + @override + ConsumerState createState() => _CustomizeShortcutScreenState(); +} + +class _CustomizeShortcutScreenState extends ConsumerState { + @override + Widget build(BuildContext context) { + final provider = ref.watch(customiseProvider); + return Padding( + padding: const EdgeInsets.only(left: 24, right: 24, bottom: 16), + child: SingleChildScrollView( + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + ShortcutWidget( + onTap: () { + setState(() { + provider.selectedShortcuts[0] = !provider.selectedShortcuts[0]; + }); + }, + heading: "customize.shortcut.favorites".trl, + image: AppImages.kBoardFavouriteIcon, + image2: AppImages.kBoardFavouriteIconSelected, + selected: provider.selectedShortcuts[0], + ), + ShortcutWidget( + onTap: () { + setState(() { + provider.selectedShortcuts[1] = !provider.selectedShortcuts[1]; + }); + }, + heading: "customize.shortcut.history".trl, + image: AppImages.kBoardHistoryIcon, + image2: AppImages.kBoardHistoryIconSelected, + selected: provider.selectedShortcuts[1], + ), + ShortcutWidget( + onTap: () { + provider.selectedShortcuts[2] = !provider.selectedShortcuts[2]; + setState(() {}); + }, + heading: "customize.shortcut.camera".trl, + image2: AppImages.kBoardCameraIconSelected, + image: AppImages.kBoardCameraIcon, + selected: provider.selectedShortcuts[2], + ), + ], + ), + Padding( + padding: const EdgeInsets.symmetric(vertical: 24), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + ShortcutWidget( + onTap: () { + provider.selectedShortcuts[3] = !provider.selectedShortcuts[3]; + setState(() {}); + }, + heading: "customize.shortcut.games".trl, + image: AppImages.kBoardDiceIcon, + image2: AppImages.kBoardDiceIconSelected, + selected: provider.selectedShortcuts[3], + ), + ShortcutWidget( + onTap: () { + provider.selectedShortcuts[4] = !provider.selectedShortcuts[4]; + setState(() {}); + }, + heading: "global.yes".trl, + image: AppImages.kBoardYesIcon, + image2: AppImages.kBoardYesIconSelected, + selected: provider.selectedShortcuts[4], + ), + ShortcutWidget( + onTap: () { + provider.selectedShortcuts[5] = !provider.selectedShortcuts[5]; + setState(() {}); + }, + heading: "global.no".trl, + image: AppImages.kBoardNoIcon, + image2: AppImages.kBoardNoIconSelected, + selected: provider.selectedShortcuts[5], + ), + ], + ), + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + ShortcutWidget( + onTap: () { + provider.selectedShortcuts[6] = !provider.selectedShortcuts[6]; + setState(() {}); + }, + heading: "global.share".trl, + image: AppImages.kBoardShareIcon, + image2: AppImages.kBoardShareIconSelected, + selected: provider.selectedShortcuts[6], + ), + ], + ), + ], + ), + ), + ); + } +} diff --git a/lib/presentation/screens/customized_board/customized_board_tab_screen.dart b/lib/presentation/screens/customized_board/customized_board_tab_screen.dart new file mode 100644 index 00000000..41dc6d4c --- /dev/null +++ b/lib/presentation/screens/customized_board/customized_board_tab_screen.dart @@ -0,0 +1,153 @@ +import 'package:auto_size_text/auto_size_text.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:go_router/go_router.dart'; +import 'package:ottaa_project_flutter/application/common/app_images.dart'; +import 'package:ottaa_project_flutter/application/common/extensions/translate_string.dart'; +import 'package:ottaa_project_flutter/application/providers/customise_provider.dart'; +import 'package:ottaa_project_flutter/application/providers/link_provider.dart'; +import 'package:ottaa_project_flutter/application/providers/profile_provider.dart'; +import 'package:ottaa_project_flutter/application/providers/user_provider.dart'; +import 'package:ottaa_project_flutter/application/router/app_routes.dart'; +import 'package:ottaa_project_flutter/core/enums/customise_data_type.dart'; +import 'package:ottaa_project_flutter/presentation/common/widgets/responsive_widget.dart'; +import 'package:ottaa_project_flutter/presentation/screens/customized_board/customize_board_screen.dart'; +import 'package:ottaa_project_flutter/presentation/screens/customized_board/customize_shortcut_screen.dart'; +import 'package:ottaa_ui_kit/widgets.dart'; + +class CustomizedBoardTabScreen extends ConsumerStatefulWidget { + const CustomizedBoardTabScreen({Key? key}) : super(key: key); + + @override + ConsumerState createState() => _CustomizedMainTabScreenState(); +} + +class _CustomizedMainTabScreenState extends ConsumerState { + @override + void initState() { + super.initState(); + + final provider = ref.read(customiseProvider); + + WidgetsBinding.instance.addPostFrameCallback((_) async { + await provider.inIt(userId: provider.userId); + }); + } + + @override + Widget build(BuildContext context) { + final provider = ref.watch(customiseProvider); + final user = ref.read(userProvider.select((value) => value.user)); + final theme = Theme.of(context); + final textTheme = theme.textTheme; + final colorScheme = theme.colorScheme; + + final userID = ref.read(linkProvider); + return ResponsiveWidget( + child: Scaffold( + appBar: OTTAAAppBar( + leading: IconButton( + icon: const Icon(Icons.arrow_back_ios), + onPressed: () { + provider.groupsFetched = false; + context.pop(); + }, + splashRadius: 24, + ), + title: Row( + mainAxisSize: MainAxisSize.max, + children: [ + Expanded( + child: Text( + "customize.board.appbar".trl, + style: textTheme.bodyText2!.copyWith(fontSize: 14), + softWrap: true, + ), + ), + const SizedBox(width: 8), + GestureDetector( + child: Icon( + Icons.help_outline_rounded, + size: 24, + color: colorScheme.onSurface, + ), + onTap: () async { + await BasicBottomSheet.show( + context, + // title: "", + subtitle: "customize.help.boards".trl, + children: [ + Image.asset( + AppImages.kBoardImageEdit1, + height: 166, + ), + ], + okButtonText: "global.done".trl, + ); + }, + ), + ], + ), + ), + backgroundColor: colorScheme.background, + body: Stack( + children: [ + Column( + mainAxisSize: MainAxisSize.min, + children: [ + /// main view is here + const Expanded( + child: CustomizeBoardScreen(), + ), + Container( + width: MediaQuery.of(context).size.width, + padding: const EdgeInsets.all(24), + child: PrimaryButton( + onPressed: () async { + showDialog( + barrierDismissible: false, + context: context, + builder: (context) { + return const Center( + child: CircularProgressIndicator(), + ); + }, + ); + switch (provider.type) { + case CustomiseDataType.user: + await provider.uploadData(userId: user!.id, saveGroups: true, savePictograms: true, saveShortcuts: false); + provider.groupsFetched = false; + provider.type = CustomiseDataType.defaultCase; + + context.pop(); + context.go(AppRoutes.home); + break; + case CustomiseDataType.careGiver: + await provider.uploadData(userId: user!.id, saveGroups: true, savePictograms: true, saveShortcuts: false); + provider.type = CustomiseDataType.defaultCase; + provider.groupsFetched = false; + + await ref.read(profileProvider).fetchUserById(provider.userId); + // provider.notify(); + context.pop(); + context.go(AppRoutes.home); + break; + case CustomiseDataType.defaultCase: + default: + await provider.uploadData(userId: user!.id, saveGroups: true, savePictograms: true, saveShortcuts: false); + context.pop(); + context.go(AppRoutes.userCustomizeWait); + break; + } + }, + text: "global.save_changes".trl, + ), + ), + ], + ), + ], + ), + ), + ); + } +} diff --git a/lib/presentation/screens/customized_board/customized_main_tab_screen.dart b/lib/presentation/screens/customized_board/customized_main_tab_screen.dart new file mode 100644 index 00000000..9160c2f9 --- /dev/null +++ b/lib/presentation/screens/customized_board/customized_main_tab_screen.dart @@ -0,0 +1,243 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:go_router/go_router.dart'; +import 'package:ottaa_project_flutter/application/common/app_images.dart'; +import 'package:ottaa_project_flutter/application/common/extensions/translate_string.dart'; +import 'package:ottaa_project_flutter/application/providers/customise_provider.dart'; +import 'package:ottaa_project_flutter/application/providers/link_provider.dart'; +import 'package:ottaa_project_flutter/application/providers/profile_provider.dart'; +import 'package:ottaa_project_flutter/application/router/app_routes.dart'; +import 'package:ottaa_project_flutter/core/enums/customise_data_type.dart'; +import 'package:ottaa_project_flutter/presentation/common/widgets/responsive_widget.dart'; +import 'package:ottaa_project_flutter/presentation/screens/customized_board/customize_board_screen.dart'; +import 'package:ottaa_project_flutter/presentation/screens/customized_board/customize_shortcut_screen.dart'; +import 'package:ottaa_ui_kit/widgets.dart'; + +class CustomizedMainTabScreen extends ConsumerStatefulWidget { + const CustomizedMainTabScreen({Key? key}) : super(key: key); + + @override + ConsumerState createState() => _CustomizedMainTabScreenState(); +} + +class _CustomizedMainTabScreenState extends ConsumerState { + int index = 1; + final PageController pageController = PageController(initialPage: 0, keepPage: true); + + @override + void initState() { + super.initState(); + + final provider = ref.read(customiseProvider); + + WidgetsBinding.instance.addPostFrameCallback((_) async { + await provider.inIt(userId: provider.userId); + }); + } + + @override + Widget build(BuildContext context) { + final provider = ref.watch(customiseProvider); + final theme = Theme.of(context); + final textTheme = theme.textTheme; + final colorScheme = theme.colorScheme; + + /// using that variable here from the linkProvider + final userID = ref.read(linkProvider); + return ResponsiveWidget( + child: Scaffold( + appBar: OTTAAAppBar( + leading: IconButton( + icon: const Icon(Icons.arrow_back_ios), + onPressed: () { + provider.groupsFetched = false; + context.pop(); + }, + splashRadius: 24, + ), + title: Row( + mainAxisSize: MainAxisSize.max, + children: [ + Expanded( + child: Text( + index == 1 ? "customize.board.appbar".trl : "customize.shortcut.appbar".trl, + style: textTheme.bodyText2!.copyWith(fontSize: 14), + softWrap: true, + ), + ), + const SizedBox(width: 8), + GestureDetector( + child: Icon( + Icons.help_outline_rounded, + size: 24, + color: colorScheme.onSurface, + ), + onTap: () async { + await BasicBottomSheet.show( + context, + // title: "", + subtitle: index == 1 ? "customize.help.boards".trl : "customize.help.shortcut".trl, + children: [ + Image.asset( + index == 1 ? AppImages.kBoardImageEdit1 : AppImages.kBoardImageEdit2, + height: 166, + ), + ], + okButtonText: "global.done".trl, + ); + }, + ), + ], + ), + actions: [ + GestureDetector( + onTap: () async { + final bool? res = await BasicBottomSheet.show( + context, + okButtonText: "global.yes".trl, + cancelButtonText: "global.cancel".trl, + cancelButtonEnabled: true, + title: "customize.board.skip".trl, + ); + if (res != null && res == true) { + // provider.uploadData(userId: user!.id); + context.push(AppRoutes.userCustomizeWait); + } + }, + child: Text( + "global.skip".trl, + style: textTheme.headline4!.copyWith(color: colorScheme.onSurface), + ), + ), + ], + ), + backgroundColor: colorScheme.background, + body: Stack( + children: [ + Column( + mainAxisSize: MainAxisSize.min, + children: [ + Padding( + padding: const EdgeInsets.only(left: 24, right: 24, top: 32), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + AnimatedContainer( + duration: const Duration(milliseconds: 300), + height: 12, + width: index == 1 ? 32 : 16, + decoration: BoxDecoration( + color: index == 1 ? colorScheme.primary : colorScheme.onSurface, + borderRadius: BorderRadius.circular(8), + ), + ), + const SizedBox( + width: 4, + ), + AnimatedContainer( + duration: const Duration(milliseconds: 300), + height: 12, + width: index == 2 ? 32 : 16, + decoration: BoxDecoration( + color: index == 2 ? colorScheme.primary : colorScheme.onSurface, + borderRadius: BorderRadius.circular(8), + ), + ), + const SizedBox( + width: 8, + ), + Text( + "${"global.step".trl} $index / 2", + style: textTheme.headline4!.copyWith(color: colorScheme.onSurface), + ), + ], + ), + const SizedBox( + height: 8, + ), + Text( + index == 1 ? "customize.board.title".trl : "customize.shortcut.title".trl, + style: textTheme.headline3!.copyWith(fontWeight: FontWeight.w600), + ), + const SizedBox( + height: 16, + ), + ], + ), + ), + + /// main view is here + Expanded( + child: PageView( + physics: const NeverScrollableScrollPhysics(), + controller: pageController, + scrollDirection: Axis.horizontal, + children: const [ + CustomizeBoardScreen(), + CustomizeShortcutScreen(), + ], + ), + ), + Container( + width: MediaQuery.of(context).size.width, + padding: const EdgeInsets.all(24), + child: PrimaryButton( + onPressed: () async { + if (pageController.page == 0) { + setState(() { + pageController.nextPage(duration: const Duration(milliseconds: 300), curve: Curves.easeIn); + index = 2; + }); + } else { + showDialog( + barrierDismissible: false, + context: context, + builder: (context) { + return const Center( + child: CircularProgressIndicator(), + ); + }, + ); + switch (provider.type) { + case CustomiseDataType.user: + await provider.uploadData(userId: provider.userId, saveGroups: true, savePictograms: true, saveShortcuts: true); + + provider.groupsFetched = false; + provider.type = CustomiseDataType.defaultCase; + provider.notify(); + context.pop(); + context.pop(); + break; + case CustomiseDataType.careGiver: + await provider.uploadData(userId: provider.userId, saveGroups: true, savePictograms: true, saveShortcuts: true); + provider.type = CustomiseDataType.defaultCase; + provider.groupsFetched = false; + + await ref.read(profileProvider).fetchUserById(provider.userId); + provider.notify(); + context.pop(); + context.pop(); + break; + case CustomiseDataType.defaultCase: + default: + await provider.uploadData(userId: provider.userId, saveGroups: true, savePictograms: true, saveShortcuts: true); + context.pop(); + context.push(AppRoutes.userCustomizeWait); + break; + } + } + }, + text: "global.next".trl, + ), + ), + ], + ), + ], + ), + ), + ); + } +} diff --git a/lib/presentation/screens/customized_board/customized_wait_screen.dart b/lib/presentation/screens/customized_board/customized_wait_screen.dart new file mode 100644 index 00000000..8f6fbc07 --- /dev/null +++ b/lib/presentation/screens/customized_board/customized_wait_screen.dart @@ -0,0 +1,69 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:go_router/go_router.dart'; +import 'package:ottaa_project_flutter/application/common/app_images.dart'; +import 'package:ottaa_project_flutter/application/common/extensions/translate_string.dart'; +import 'package:ottaa_project_flutter/application/providers/link_provider.dart'; +import 'package:ottaa_project_flutter/application/router/app_routes.dart'; +import 'package:ottaa_ui_kit/widgets.dart'; + +class CustomizeWaitScreen extends ConsumerWidget { + const CustomizeWaitScreen({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final theme = Theme.of(context); + final textTheme = theme.textTheme; + final colorScheme = theme.colorScheme; + final provider = ref.read(linkProvider); + return Scaffold( + body: SafeArea( + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const SizedBox( + height: 42, + ), + Image.asset( + AppImages.kBoardCustomizeWaitIcon, + width: 178, + height: 198, + ), + const SizedBox( + height: 68, + ), + Center( + child: Text( + "global.congrats".trl, + style: textTheme.button!.copyWith( + color: colorScheme.onBackground, + ), + ), + ), + const SizedBox( + height: 16, + ), + Center( + child: Text( + "customize.wait.subtitle".trlf({'name': provider.user!.settings.data.name}), + style: textTheme.headline3, + ), + ), + ], + ), + Padding( + padding: const EdgeInsets.only(left: 24, right: 24, bottom: 16), + child: PrimaryButton( + onPressed: () => context.go(AppRoutes.home), + text: "customize.wait.button".trl, + ), + ), + ], + ), + ), + ); + } +} diff --git a/lib/presentation/screens/customized_board/ui/board_widget.dart b/lib/presentation/screens/customized_board/ui/board_widget.dart new file mode 100644 index 00000000..3cd7a30e --- /dev/null +++ b/lib/presentation/screens/customized_board/ui/board_widget.dart @@ -0,0 +1,106 @@ +import 'package:flutter/material.dart'; +import 'package:ottaa_project_flutter/application/common/app_images.dart'; +import 'package:ottaa_project_flutter/application/common/extensions/translate_string.dart'; +import 'package:ottaa_ui_kit/widgets.dart'; + +class BoardWidget extends StatelessWidget { + const BoardWidget({ + Key? key, + required this.title, + required this.image, + required this.customizeOnTap, + required this.deleteOnTap, + required this.onChanged, + required this.status, + }) : super(key: key); + final String title; + final ImageProvider image; + final void Function()? customizeOnTap, deleteOnTap; + final Function(bool)? onChanged; + final bool status; + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + final textTheme = theme.textTheme; + final colorScheme = theme.colorScheme; + return Container( + padding: const EdgeInsets.all(16), + decoration: BoxDecoration( + color: colorScheme.onPrimary, + borderRadius: BorderRadius.circular(16), + ), + child: Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( + children: [ + Image( + image: image, + height: 30, + width: 30, + ), + const SizedBox( + width: 8, + ), + Text( + title.length >= 21 ? '${title.substring(0, 21)}...' : title, + style: textTheme.subtitle2!.copyWith( + // overflow: TextOverflow.ellipsis, + ), + overflow: TextOverflow.ellipsis, + ), + ], + ), + Row( + children: [ + GestureDetector( + onTap: customizeOnTap, + child: Image.asset( + AppImages.kCustomizePictoIcon, + height: 20, + width: 20, + ), + ), + const SizedBox( + width: 20, + ), + GestureDetector( + onTap: deleteOnTap, + child: Image.asset( + AppImages.kDeletePictoIcon, + height: 20, + width: 20, + ), + ), + ], + ), + ], + ), + Padding( + padding: const EdgeInsets.symmetric(vertical: 8.0), + child: Divider( + height: 1, + color: colorScheme.background, + ), + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + "customize.picto.switch".trl, + style: textTheme.subtitle2, + ), + OTTAASwitch( + value: status, + onChanged: onChanged, + ), + ], + ), + ], + ), + ); + } +} diff --git a/lib/presentation/screens/customized_board/ui/shortcu_widget.dart b/lib/presentation/screens/customized_board/ui/shortcu_widget.dart new file mode 100644 index 00000000..56379a4c --- /dev/null +++ b/lib/presentation/screens/customized_board/ui/shortcu_widget.dart @@ -0,0 +1,60 @@ +import 'package:flutter/material.dart'; +import 'package:ottaa_ui_kit/theme.dart'; + +class ShortcutWidget extends StatelessWidget { + const ShortcutWidget({ + Key? key, + required this.heading, + required this.image, + required this.onTap, + required this.selected, + required this.image2, + }) : super(key: key); + + final String image, image2, heading; + final void Function()? onTap; + final bool selected; + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + final textTheme = theme.textTheme; + final colorScheme = theme.colorScheme; + return GestureDetector( + onTap: onTap, + child: Container( + width: 80, + child: Column( + children: [ + Container( + decoration: BoxDecoration( + color: colorScheme.onPrimary, + borderRadius: BorderRadius.circular(8), + border: selected + ? Border.all(color: colorScheme.primary, width: 1) + : Border.all(), + ), + padding: const EdgeInsets.all(18), + child: Image.asset( + selected ? image2 : image, + height: 44, + width: 44, + ), + ), + const SizedBox( + height: 16, + ), + Text( + heading, + style: selected + ? textTheme.headline3 + : textTheme.headline3!.copyWith(color: kDarkenGrayColor), + textAlign: TextAlign.center, + maxLines: 3, + ), + ], + ), + ), + ); + } +} diff --git a/lib/presentation/screens/edit/edit_picto_screen.dart b/lib/presentation/screens/edit/edit_picto_screen.dart new file mode 100644 index 00000000..d82351a8 --- /dev/null +++ b/lib/presentation/screens/edit/edit_picto_screen.dart @@ -0,0 +1,279 @@ +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:go_router/go_router.dart'; +import 'package:ottaa_project_flutter/application/common/app_images.dart'; +import 'package:ottaa_project_flutter/application/common/extensions/translate_string.dart'; +import 'package:ottaa_project_flutter/application/providers/create_picto_provider.dart'; +import 'package:ottaa_project_flutter/application/providers/view_board_provider.dart'; +import 'package:ottaa_project_flutter/application/router/app_routes.dart'; +import 'package:ottaa_project_flutter/presentation/common/widgets/simple_button.dart'; +import 'package:ottaa_project_flutter/presentation/screens/create_picto/choose_color_screen.dart'; +import 'package:ottaa_project_flutter/presentation/screens/create_picto/choose_picto_day_screen.dart'; +import 'package:ottaa_project_flutter/presentation/screens/create_picto/create_pictogram_initial_screen.dart'; +import 'package:ottaa_project_flutter/presentation/screens/create_picto/ui/day_widget.dart'; +import 'package:ottaa_project_flutter/presentation/screens/create_picto/ui/time_widget.dart'; +import 'package:ottaa_project_flutter/presentation/screens/create_picto/widgets/image_widget.dart'; +import 'package:ottaa_ui_kit/widgets.dart'; + +class EditPictoScreen extends ConsumerWidget { + const EditPictoScreen({super.key}); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final textTheme = Theme.of(context).textTheme; + final colorScheme = Theme.of(context).colorScheme; + final provider = ref.watch(createPictoProvider); + return Scaffold( + appBar: OTTAAAppBar( + title: Text('create.edit_picto'.trl), + actions: [ + GestureDetector( + onTap: () { + //todo: add the delete implementation + //todo: add the check for the tags in the pictos + }, + child: const Icon( + Icons.delete_outline_rounded, + size: 24, + ), + ), + ], + ), + body: SingleChildScrollView( + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: const EdgeInsets.symmetric(vertical: 32), + child: ImageWidget( + onTap: () {}, + ), + ), + Text( + 'global.image'.trl, + style: textTheme.bodyMedium!.copyWith(fontWeight: FontWeight.w600), + ), + const SizedBox( + height: 16, + ), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + DialogWidget( + image: AppImages.kArsacImage, + text: 'global.arasaac'.trl, + onTap: () { + context.push(AppRoutes.patientEditPictoarsaac); + }, + ), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 16), + child: DialogWidget( + image: AppImages.kCameraIcon, + text: 'shortcut.customize.camera'.trl, + onTap: () async { + final res = await provider.captureImageFromCamera(); + if (res) { + provider.notify(); + } + }, + ), + ), + DialogWidget( + image: AppImages.kGalleryIcon, + text: 'global.gallery'.trl, + onTap: () async { + final res = await provider.captureImageFromGallery(); + if (res) { + provider.notify(); + } + }, + ), + ], + ), + Padding( + padding: const EdgeInsets.symmetric(vertical: 16), + child: Text( + 'global.text'.trl, + style: textTheme.bodyMedium!.copyWith(fontWeight: FontWeight.w600), + ), + ), + Row( + children: [ + Expanded( + child: TextFormField( + controller: provider.nameController, + onChanged: (text) { + provider.notify(); + }, + ), + ), + const SizedBox(width: 16), + SizedBox( + height: 50, + width: 58, + child: ElevatedButton( + style: ButtonStyle( + backgroundColor: MaterialStateProperty.all(colorScheme.primary), + overlayColor: MaterialStateProperty.all(Colors.white.withOpacity(0.1)), + shape: MaterialStateProperty.all( + const RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(9)), + ), + ), + padding: MaterialStateProperty.all(const EdgeInsets.all(0)), + elevation: MaterialStateProperty.all(0), + ), + onPressed: () async { + await provider.speakWord(); + }, + child: Center( + child: Image.asset( + AppImages.kOttaaMinimalist, + color: Colors.white, + ), + ), + ), + ), + ], + ), + Padding( + padding: const EdgeInsets.symmetric(vertical: 16), + child: Text( + 'global.color'.trl, + style: textTheme.bodyMedium!.copyWith(fontWeight: FontWeight.w600), + ), + ), + Wrap( + direction: Axis.horizontal, + spacing: 8, + runSpacing: 8, + children: [ + ColorWidget( + color: Colors.green, + text: 'global.actions'.trl, + number: 3, + ), + ColorWidget( + color: Colors.yellow, + text: 'global.people'.trl, + number: 1, + ), + ColorWidget( + color: Colors.black, + text: 'global.miscellaneous'.trl, + number: 6, + ), + ColorWidget( + color: Colors.purple, + text: 'user.main_setting.interaction'.trl, + number: 5, + ), + ColorWidget( + color: colorScheme.primary, + text: 'global.noun'.trl, + number: 2, + ), + ColorWidget( + color: Colors.blue, + text: 'global.adjective'.trl, + number: 4, + ), + ], + ), + Padding( + padding: const EdgeInsets.only(top: 16), + child: Text( + 'global.predictive'.trl, + style: textTheme.bodyMedium!.copyWith(fontWeight: FontWeight.w600), + ), + ), + Padding( + padding: const EdgeInsets.only(top: 16, bottom: 8), + child: Text( + 'create.time_sub1'.trl, + ), + ), + Wrap( + direction: Axis.horizontal, + spacing: 8, + runSpacing: 8, + children: [ + DayWidget(text: 'global.sunday'.trl), + DayWidget(text: 'global.monday'.trl), + DayWidget(text: 'global.tuesday'.trl), + DayWidget(text: 'global.wednesday'.trl), + DayWidget(text: 'global.thursday'.trl), + DayWidget(text: 'global.friday'.trl), + DayWidget(text: 'global.saturday'.trl), + ], + ), + Padding( + padding: const EdgeInsets.only(top: 16, bottom: 8), + child: Text( + 'create.schedule'.trl, + ), + ), + Wrap( + direction: Axis.horizontal, + spacing: 8, + runSpacing: 8, + children: [ + TimeWidget(text: 'global.tomorrow'.trl), + TimeWidget(text: 'global.noon'.trl), + TimeWidget(text: 'global.late'.trl), + TimeWidget(text: 'global.evening'.trl), + ], + ), + Padding( + padding: const EdgeInsets.symmetric(vertical: 16), + child: Text( + 'global.saved_in'.trl, + style: textTheme.bodyMedium!.copyWith(fontWeight: FontWeight.w600), + ), + ), + provider.pictoInBoards.isEmpty + ? const SizedBox.shrink() + : Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ...provider.pictoInBoards + .map((e) => Padding( + padding: const EdgeInsets.only(bottom: 8), + child: PictogramCard( + onPressed: () { + //todo: ask from hector + }, + title: provider.boards[e].text, + actionText: '${'global.edit'.trl} ${'global.location'.trl}', + pictogram: CachedNetworkImageProvider(provider.boards[e].resource.network!), + ), + )) + .toList() + ], + ), + Padding( + padding: const EdgeInsets.symmetric(vertical: 16), + child: SimpleButton( + onTap: () async { + final pro = ref.read(viewBoardProvider); + showDialog(context: context, builder: (context) => const Center(child: CircularProgressIndicator())); + await provider.saveChangesInPicto(id: provider.selectedPictoForEditId); + context.pop(); + context.pop(); + pro.filterPictosForView(); + }, + text: 'global.save'.trl, + width: false, + ), + ), + ], + ), + ), + ), + ); + } +} diff --git a/lib/presentation/screens/error/error_screen.dart b/lib/presentation/screens/error/error_screen.dart index 3dfef9c0..3ca83a3a 100644 --- a/lib/presentation/screens/error/error_screen.dart +++ b/lib/presentation/screens/error/error_screen.dart @@ -1,13 +1,31 @@ import 'package:flutter/material.dart'; +import 'package:ottaa_ui_kit/widgets.dart'; class ErrorScreen extends StatelessWidget { const ErrorScreen({super.key}); @override Widget build(BuildContext context) { + final size = MediaQuery.of(context).size; return Scaffold( - body: Center( - child: Text('¿Whot 😀?'), + body: SizedBox.fromSize( + size: size, + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const Text('¿Whot 😀?'), + Padding( + padding: const EdgeInsets.all(24), + child: PrimaryButton( + onPressed: () { + Navigator.of(context).pop(); + }, + text: "Go back", + ), + ), + ], + ), ), ); } diff --git a/lib/presentation/screens/games/chatgpt_game.dart b/lib/presentation/screens/games/chatgpt_game.dart new file mode 100644 index 00000000..eb005c7e --- /dev/null +++ b/lib/presentation/screens/games/chatgpt_game.dart @@ -0,0 +1,85 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:go_router/go_router.dart'; +import 'package:ottaa_project_flutter/application/common/extensions/translate_string.dart'; +import 'package:ottaa_project_flutter/application/providers/chat_gpt_game_provider.dart'; +import 'package:ottaa_project_flutter/application/providers/user_provider.dart'; +import 'package:ottaa_project_flutter/application/router/app_routes.dart'; +import 'package:ottaa_project_flutter/presentation/common/widgets/simple_button.dart'; +import 'package:ottaa_project_flutter/presentation/screens/games/ui/background_widget.dart'; +import 'package:ottaa_project_flutter/presentation/screens/games/ui/header_widget.dart'; +import 'package:ottaa_project_flutter/presentation/screens/games/ui/sentence_widget.dart'; + +class ChatGptGame extends ConsumerWidget { + const ChatGptGame({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final provider = ref.watch(chatGptGameProvider); + final size = MediaQuery.of(context).size; + final textTheme = Theme.of(context).textTheme; + final colorScheme = Theme.of(context).colorScheme; + final user = ref.read(userProvider.select((value) => value.user!)); + return Scaffold( + body: Stack( + children: [ + const BackGroundWidget(), + HeaderWidget( + headline: 'profile.hello'.trlf({'name': user.settings.data.name}), + subtitle: 'game.game_4_line'.trl, + onTap: () { + provider.resetStoryGame(); + }, + ), + const SentenceWidget(), + Positioned( + left: 24, + bottom: 24, + child: Container( + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(4), + ), + padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 12), + child: Icon( + Icons.folder_open, + size: 24, + color: colorScheme.primary, + ), + ), + ), + Positioned( + right: provider.btnText ? 24 : 48, + bottom: provider.btnText ? 24 : 48, + child: provider.gptPictos.length == 4 + ? SimpleButton( + onTap: () async { + /// goto teh screen where you are showing the sentence + if (provider.gptPictos.length == 4) { + showDialog( + context: context, + barrierDismissible: false, + builder: (context) => const Center( + child: CircularProgressIndicator(), + ), + ); + await provider.createStory(); + if (provider.isStoryFetched) { + context.push(AppRoutes.patientShowStory); + } else { + context.pop(); + } + } + }, + text: 'game.gptbtn'.trl, + ) + : Text( + 'game.gptbtn'.trl, + style: textTheme.displaySmall!.copyWith(color: Colors.grey), + ), + ), + ], + ), + ); + } +} diff --git a/lib/presentation/screens/games/game_play_screen.dart b/lib/presentation/screens/games/game_play_screen.dart new file mode 100644 index 00000000..a57c1e51 --- /dev/null +++ b/lib/presentation/screens/games/game_play_screen.dart @@ -0,0 +1,65 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:ottaa_project_flutter/application/providers/games_provider.dart'; +import 'package:ottaa_project_flutter/presentation/screens/games/match_pictogram_screen.dart'; +import 'package:ottaa_project_flutter/presentation/screens/games/memory_game_screen.dart'; +import 'package:ottaa_project_flutter/presentation/screens/games/whats_the_picto_screen.dart'; + +class GamePlayScreen extends ConsumerStatefulWidget { + const GamePlayScreen({Key? key}) : super(key: key); + + @override + ConsumerState createState() => _GamePlayScreenState(); +} + +class _GamePlayScreenState extends ConsumerState with WidgetsBindingObserver { + @override + void initState() { + WidgetsBinding.instance.addObserver(this); + super.initState(); + } + + @override + void dispose() { + WidgetsBinding.instance.removeObserver(this); + super.dispose(); + } + + @override + void didChangeAppLifecycleState(AppLifecycleState state) { + final provider = ref.read(gameProvider); + switch (state) { + case AppLifecycleState.resumed: + print("app in resumed"); + if (provider.isMute) { + } else { + provider.backgroundMusicPlayer.play(); + } + break; + case AppLifecycleState.inactive: + print("app in inactive"); + if (!provider.isMute) { + provider.backgroundMusicPlayer.pause(); + } + break; + case AppLifecycleState.paused: + print("app in paused"); + break; + case AppLifecycleState.detached: + print("app in detached"); + break; + } + } + + @override + Widget build(BuildContext context) { + final provider = ref.read(gameProvider); + return Scaffold( + body: provider.selectedGame == 0 + ? const WhatsThePictoScreen() + : provider.selectedGame == 1 + ? const MatchPictogramScreen() + : const MemoryGameScreen(), + ); + } +} diff --git a/lib/presentation/screens/games/game_screen.dart b/lib/presentation/screens/games/game_screen.dart new file mode 100644 index 00000000..8736656a --- /dev/null +++ b/lib/presentation/screens/games/game_screen.dart @@ -0,0 +1,138 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:go_router/go_router.dart'; +import 'package:ottaa_project_flutter/application/common/app_images.dart'; +import 'package:ottaa_project_flutter/application/common/extensions/translate_string.dart'; +import 'package:ottaa_project_flutter/application/providers/chat_gpt_game_provider.dart'; +import 'package:ottaa_project_flutter/application/providers/games_provider.dart'; +import 'package:ottaa_project_flutter/application/providers/user_provider.dart'; +import 'package:ottaa_project_flutter/application/router/app_routes.dart'; +import 'package:ottaa_project_flutter/presentation/common/widgets/simple_button.dart'; +import 'package:ottaa_project_flutter/presentation/screens/games/ui/ui_widget.dart'; + +class GameScreen extends ConsumerWidget { + const GameScreen({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final user = ref.read(userProvider.select((value) => value.user)); + final provider = ref.read(gameProvider); + return SafeArea( + top: false, + left: false, + child: Scaffold( + extendBody: true, + extendBodyBehindAppBar: true, + body: UIWidget( + headline: 'profile.hello'.trlf({'name': user!.settings.data.name}), + subtitle: 'game.play'.trl, + uiWidget: const GameScreenUI(), + backward: () { + provider.moveBackward(); + }, + forward: () { + provider.moveForward(); + }, + ), + ), + ); + } +} + +class GameScreenUI extends ConsumerWidget { + const GameScreenUI({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final provider = ref.watch(gameProvider); + final textTheme = Theme.of(context).textTheme; + final colorScheme = Theme.of(context).colorScheme; + final size = MediaQuery.of(context).size; + return SizedBox( + width: size.width * 0.6, + child: PageView.builder( + controller: provider.mainPageController, + itemCount: 4, + itemBuilder: (BuildContext context, int index) { + return Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Padding( + padding: const EdgeInsets.only(bottom: 24), + child: Container( + // height: size.height * 0.7, + width: size.width * 0.3, + padding: const EdgeInsets.all(16), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(32), + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Column( + children: [ + Image.asset( + '${AppImages.kGameSelectPhoto}_$index.png', + height: 92, + fit: BoxFit.fill, + ), + Padding( + padding: const EdgeInsets.symmetric(vertical: 16), + child: Text( + 'game.game_header_$index'.trl, + style: textTheme.displayMedium, + ), + ), + Text( + 'game.game_sub_$index'.trl, + textAlign: TextAlign.center, + style: textTheme.displaySmall!.copyWith(fontWeight: FontWeight.w400), + ), + ], + ), + Padding( + padding: const EdgeInsets.only(top: 24), + child: SimpleButton( + /// niceu emir chan + width: false, + onTap: () async { + provider.selectedGame = index; + + if (index == 3) { + final pro = ref.read(chatGptGameProvider); + await pro.loadTranslations(); + context.push(AppRoutes.patientStoryGame); + } else { + context.push(AppRoutes.patientGameGroupSelection); + } + }, + text: 'game.next'.trl, + ), + ), + ], + ), + ), + ), + Wrap( + children: [ + Text( + '${'game.nivel'.trl} ', + style: textTheme.displaySmall!.copyWith( + color: colorScheme.primary, + ), + ), + Text( + '0 / ${provider.activeGroups}', + style: textTheme.displaySmall!.copyWith(color: colorScheme.primary, fontWeight: FontWeight.w600), + ), + ], + ), + ], + ); + }, + ), + ); + } +} diff --git a/lib/presentation/screens/games/match_pictogram_screen.dart b/lib/presentation/screens/games/match_pictogram_screen.dart new file mode 100644 index 00000000..8b5efa30 --- /dev/null +++ b/lib/presentation/screens/games/match_pictogram_screen.dart @@ -0,0 +1,274 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:go_router/go_router.dart'; +import 'package:ottaa_project_flutter/application/common/extensions/translate_string.dart'; +import 'package:ottaa_project_flutter/application/providers/games_provider.dart'; +import 'package:ottaa_project_flutter/application/providers/match_pictogram_provider.dart'; +import 'package:ottaa_project_flutter/presentation/screens/games/ui/background_widget.dart'; +import 'package:ottaa_project_flutter/presentation/screens/games/ui/header_widget.dart'; +import 'package:ottaa_project_flutter/presentation/screens/games/ui/leftside_icons.dart'; +import 'package:ottaa_project_flutter/presentation/screens/games/ui/match_pictogram_picto_widget.dart'; + +class MatchPictogramScreen extends ConsumerWidget { + const MatchPictogramScreen({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final provider = ref.read(gameProvider); + final mpProvider = ref.watch(matchPictogramProvider); + final size = MediaQuery.of(context).size; + final textTheme = Theme.of(context).textTheme; + return Scaffold( + body: Stack( + children: [ + const BackGroundWidget(), + HeaderWidget( + headline: 'game.game_header_${provider.selectedGame}'.trl, + subtitle: 'game.game_2_line'.trl, + onTap: () { + provider.backgroundMusicPlayer.pause(); + provider.resetScore(); + }, + ), + Positioned( + bottom: size.height * 0.01, + left: 0, + right: 0, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + SizedBox( + width: size.width, + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + MPPictoWidget( + pict: provider.topPositionsMP[0]!, + hideFlag: mpProvider.hideFlags[0], + showCorrectOrWrongFlag: mpProvider.show[0], + onTap: !mpProvider.show[0] + ? () async { + showDialog( + barrierColor: Colors.transparent, + barrierDismissible: false, + context: context, + builder: (context) { + return const SizedBox.shrink(); + }); + await mpProvider.checkAnswerMatchPicto(index: 0, picto: provider.topPositionsMP[0]!); + context.pop(); + } + : () {}, + rightOrWrong: mpProvider.rightOrWrong[0], + ), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 24), + child: MPPictoWidget( + pict: provider.topPositionsMP[1]!, + showCorrectOrWrongFlag: mpProvider.show[1], + hideFlag: mpProvider.hideFlags[1], + onTap: !mpProvider.show[1] + ? () async { + showDialog( + barrierColor: Colors.transparent, + barrierDismissible: false, + context: context, + builder: (context) { + return const SizedBox.shrink(); + }); + await mpProvider.checkAnswerMatchPicto(index: 1, picto: provider.topPositionsMP[1]!); + context.pop(); + } + : () {}, + rightOrWrong: mpProvider.rightOrWrong[1], + ), + ), + provider.difficultyLevel >= 1 + ? Padding( + padding: const EdgeInsets.only(right: 24), + child: MPPictoWidget( + pict: provider.topPositionsMP[2]!, + showCorrectOrWrongFlag: mpProvider.show[4], + hideFlag: mpProvider.hideFlags[4], + onTap: !mpProvider.show[4] + ? () async { + showDialog( + barrierColor: Colors.transparent, + barrierDismissible: false, + context: context, + builder: (context) { + return const SizedBox.shrink(); + }); + await mpProvider.checkAnswerMatchPicto(index: 4, picto: provider.topPositionsMP[2]!); + context.pop(); + } + : () {}, + rightOrWrong: mpProvider.rightOrWrong[4], + ), + ) + : const SizedBox.shrink(), + provider.difficultyLevel == 2 + ? MPPictoWidget( + pict: provider.topPositionsMP[3]!, + showCorrectOrWrongFlag: mpProvider.show[6], + hideFlag: mpProvider.hideFlags[6], + onTap: !mpProvider.show[6] + ? () async { + showDialog( + barrierColor: Colors.transparent, + barrierDismissible: false, + context: context, + builder: (context) { + return const SizedBox.shrink(); + }); + await mpProvider.checkAnswerMatchPicto(index: 6, picto: provider.topPositionsMP[3]!); + context.pop(); + } + : () {}, + rightOrWrong: mpProvider.rightOrWrong[6], + ) + : const SizedBox.shrink(), + ], + ), + ), + SizedBox( + height: size.height * 0.05, + ), + + ///bottom + SizedBox( + width: size.width, + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + MPPictoWidget( + pict: provider.bottomPositionsMP[0]!, + showCorrectOrWrongFlag: mpProvider.show[2], + hideFlag: mpProvider.hideFlags[2], + onTap: !mpProvider.show[2] + ? () async { + showDialog( + barrierColor: Colors.transparent, + barrierDismissible: false, + context: context, + builder: (context) { + return const SizedBox.shrink(); + }); + await mpProvider.checkAnswerMatchPicto(index: 2, picto: provider.bottomPositionsMP[0]!); + context.pop(); + } + : () {}, + rightOrWrong: mpProvider.rightOrWrong[2], + hideWidgetEnabled: true, + hideText: provider.bottomPositionsMP[0]!.text, + ), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 24), + child: MPPictoWidget( + pict: provider.bottomPositionsMP[1]!, + showCorrectOrWrongFlag: mpProvider.show[3], + hideFlag: mpProvider.hideFlags[3], + onTap: !mpProvider.show[3] + ? () async { + showDialog( + barrierColor: Colors.transparent, + barrierDismissible: false, + context: context, + builder: (context) { + return const SizedBox.shrink(); + }); + await mpProvider.checkAnswerMatchPicto(index: 3, picto: provider.bottomPositionsMP[1]!); + context.pop(); + } + : () {}, + rightOrWrong: mpProvider.rightOrWrong[3], + hideWidgetEnabled: true, + hideText: provider.bottomPositionsMP[1]!.text, + ), + ), + provider.difficultyLevel >= 1 + ? Padding( + padding: const EdgeInsets.only(right: 24), + child: MPPictoWidget( + pict: provider.bottomPositionsMP[2]!, + showCorrectOrWrongFlag: mpProvider.show[5], + hideFlag: mpProvider.hideFlags[5], + onTap: !mpProvider.show[5] + ? () async { + showDialog( + barrierColor: Colors.transparent, + barrierDismissible: false, + context: context, + builder: (context) { + return const SizedBox.shrink(); + }); + await mpProvider.checkAnswerMatchPicto(index: 5, picto: provider.bottomPositionsMP[2]!); + context.pop(); + } + : () {}, + rightOrWrong: mpProvider.rightOrWrong[5], + hideWidgetEnabled: true, + hideText: provider.bottomPositionsMP[2]!.text, + ), + ) + : const SizedBox.shrink(), + provider.difficultyLevel == 2 + ? MPPictoWidget( + pict: provider.bottomPositionsMP[3]!, + showCorrectOrWrongFlag: mpProvider.show[7], + hideFlag: mpProvider.hideFlags[7], + onTap: !mpProvider.show[7] + ? () async { + showDialog( + barrierColor: Colors.transparent, + barrierDismissible: false, + context: context, + builder: (context) { + return const SizedBox.shrink(); + }); + await mpProvider.checkAnswerMatchPicto(index: 7, picto: provider.bottomPositionsMP[3]!); + context.pop(); + } + : () {}, + rightOrWrong: mpProvider.rightOrWrong[7], + hideWidgetEnabled: true, + hideText: provider.bottomPositionsMP[3]!.text, + ) + : const SizedBox.shrink(), + ], + ), + ), + ], + ), + ), + const LeftSideIcons(), + Positioned( + top: size.height * 0.5, + left: size.width * 0.1, + child: mpProvider.showResult + ? mpProvider.trueOrFalse + ? Text( + 'game.yes'.trl, + style: textTheme.headline1, + ) + : const SizedBox.shrink() + : const SizedBox.shrink(), + ), + Positioned( + top: size.height * 0.5, + right: size.width * 0.1, + child: mpProvider.showResult + ? !mpProvider.trueOrFalse + ? Text( + 'game.no'.trl, + style: textTheme.headline1, + ) + : const SizedBox.shrink() + : const SizedBox.shrink(), + ), + ], + ), + ); + } +} diff --git a/lib/presentation/screens/games/memory_game_screen.dart b/lib/presentation/screens/games/memory_game_screen.dart new file mode 100644 index 00000000..ccc4e399 --- /dev/null +++ b/lib/presentation/screens/games/memory_game_screen.dart @@ -0,0 +1,133 @@ +import 'package:collection/collection.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:ottaa_project_flutter/application/common/extensions/translate_string.dart'; +import 'package:ottaa_project_flutter/application/providers/games_provider.dart'; +import 'package:ottaa_project_flutter/application/providers/memory_game_provider.dart'; +import 'package:ottaa_project_flutter/application/providers/user_provider.dart'; +import 'package:ottaa_project_flutter/presentation/screens/games/ui/background_widget.dart'; +import 'package:ottaa_project_flutter/presentation/screens/games/ui/header_widget.dart'; +import 'package:ottaa_project_flutter/presentation/screens/games/ui/leftside_icons.dart'; +import 'package:ottaa_project_flutter/presentation/screens/games/ui/memory_picto_widget.dart'; +import 'package:ottaa_project_flutter/presentation/screens/games/ui/speak_button.dart'; + +class MemoryGameScreen extends ConsumerStatefulWidget { + const MemoryGameScreen({super.key}); + + @override + ConsumerState createState() => _MemoryGameState(); +} + +class _MemoryGameState extends ConsumerState { + late final MemoryGameNotifier __gameNot = ref.read(memoryGameProvider); + @override + void initState() { + WidgetsBinding.instance.addPostFrameCallback((timeStamp) { + __gameNot.createRandomPictos(); + }); + super.initState(); + } + + @override + void dispose() { + __gameNot.clear(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + final game = ref.watch(gameProvider); + final memoryGame = ref.watch(memoryGameProvider); + final user = ref.read(userProvider.select((value) => value.user!)); + final colorScheme = Theme.of(context).colorScheme; + final textTheme = Theme.of(context).textTheme; + final size = MediaQuery.of(context).size; + + print(memoryGame.pictos.length); + return Scaffold( + extendBodyBehindAppBar: true, + extendBody: true, + body: Stack( + children: [ + const BackGroundWidget(), + HeaderWidget( + headline: 'game.game_header_${game.selectedGame}'.trl, + subtitle: 'game.game_2_line'.trl, + onTap: () { + game.backgroundMusicPlayer.pause(); + game.gameTimer.cancel(); + if (game.hintsBtn) { + game.cancelHints(); + } + }, + ), + const LeftSideIcons(), + memoryGame.pictos.isNotEmpty + ? Positioned( + left: 0, + right: 0, + bottom: size.height * 0.03, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisSize: MainAxisSize.min, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisSize: MainAxisSize.min, + children: memoryGame.pictos.sublist(0, memoryGame.pictos.length - (game.difficultyLevel + 2)).mapIndexed((pictoId, e) { + return MemoryPictoWidget( + isSelected: memoryGame.openedPictos.contains(pictoId), + isVisible: memoryGame.matchedPictos.contains(pictoId), + picto: e, + isRight: memoryGame.openedPictos.length == 2 && memoryGame.openedPictos.contains(pictoId) ? memoryGame.rightPictos.contains(pictoId) : null, + onTap: () { + memoryGame.openPicto(pictoId); + }, + onBuild: (controller) { + memoryGame.addAnimationController(controller, pictoId); + }, + ); + }).toList(), + ), + const SizedBox( + height: 20, + ), + Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisSize: MainAxisSize.min, + children: memoryGame.pictos.sublist(((game.difficultyLevel + 2))).mapIndexed((i, e) { + int pictoId = (i + (game.difficultyLevel + 2)); + + return MemoryPictoWidget( + picto: e, + isRight: memoryGame.openedPictos.length == 2 && memoryGame.openedPictos.contains(pictoId) ? memoryGame.rightPictos.contains(pictoId) : null, + isVisible: memoryGame.matchedPictos.contains(pictoId), + isSelected: memoryGame.openedPictos.contains(pictoId), + onTap: () { + memoryGame.openPicto(pictoId); + }, + onBuild: (controller) { + memoryGame.addAnimationController(controller, pictoId); + }, + ); + }).toList(), + ) + ], + ), + ) + : Positioned( + left: 0, + right: 0, + bottom: size.height * 0.03, + child: CircularProgressIndicator( + color: colorScheme.primary, + ), + ), + ], + ), + ); + } +} diff --git a/lib/presentation/screens/games/search_screen.dart b/lib/presentation/screens/games/search_screen.dart new file mode 100644 index 00000000..ad379fbc --- /dev/null +++ b/lib/presentation/screens/games/search_screen.dart @@ -0,0 +1,84 @@ +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; +import 'package:ottaa_project_flutter/application/common/app_images.dart'; +import 'package:ottaa_project_flutter/application/common/extensions/translate_string.dart'; +import 'package:ottaa_project_flutter/presentation/screens/games/ui/background_widget.dart'; +import 'package:ottaa_project_flutter/presentation/screens/games/ui/header_widget.dart'; + +class SearchScreen extends StatelessWidget { + const SearchScreen({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + final colorScheme = Theme.of(context).colorScheme; + final textTheme = Theme.of(context).textTheme; + final size = MediaQuery.of(context).size; + return Scaffold( + body: Stack( + children: [ + const BackGroundWidget(), + Positioned( + left: 24, + top: 24, + child: Row( + children: [ + GestureDetector( + onTap: () => context.pop(), + child: Card( + child: Container( + padding: const EdgeInsets.all(14), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + ), + child: Icon( + Icons.close_rounded, + color: colorScheme.primary, + size: 20, + ), + ), + ), + ), + GestureDetector( + onTap: () { + context.pop(); + }, + child: const Padding( + padding: EdgeInsets.symmetric(horizontal: 24), + child: Icon( + Icons.arrow_back_ios_rounded, + size: 18, + ), + ), + ), + Text( + 'game.search'.trl, + style: textTheme.headline3, + ), + ], + ), + ), + Positioned( + top: size.height * 0.25, + left: size.width / 4, + child: Column( + children: [ + SizedBox( + width: 400, + child: TextFormField(), + ), + const SizedBox( + height: 36, + ), + Image.asset( + AppImages.kGameSearch, + height: 180, + ), + ], + ), + ), + ], + ), + ); + } +} diff --git a/lib/presentation/screens/games/select_group_screen.dart b/lib/presentation/screens/games/select_group_screen.dart new file mode 100644 index 00000000..4d3d4ffe --- /dev/null +++ b/lib/presentation/screens/games/select_group_screen.dart @@ -0,0 +1,196 @@ +import 'package:auto_size_text/auto_size_text.dart'; +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:go_router/go_router.dart'; +import 'package:ottaa_project_flutter/application/common/extensions/translate_string.dart'; +import 'package:ottaa_project_flutter/application/providers/games_provider.dart'; +import 'package:ottaa_project_flutter/application/providers/home_provider.dart'; +import 'package:ottaa_project_flutter/application/providers/user_provider.dart'; +import 'package:ottaa_project_flutter/application/providers/whats_the_picto_provider.dart'; +import 'package:ottaa_project_flutter/application/router/app_routes.dart'; +import 'package:ottaa_project_flutter/core/models/group_model.dart'; +import 'package:ottaa_project_flutter/presentation/screens/games/ui/background_widget.dart'; +import 'package:ottaa_project_flutter/presentation/screens/games/ui/header_widget.dart'; +import 'package:ottaa_ui_kit/theme.dart'; + +class SelectGroupScreen extends ConsumerWidget { + const SelectGroupScreen({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final size = MediaQuery.of(context).size; + final user = ref.read(userProvider.select((value) => value.user)); + final colorScheme = Theme.of(context).colorScheme; + final groups = ref.watch(homeProvider).groups.values.where((element) => !element.block).toList(); + final provider = ref.watch(gameProvider); + return Scaffold( + body: Stack( + children: [ + const BackGroundWidget(), + HeaderWidget( + headline: 'profile.hello'.trlf({'name': user!.settings.data.name}), + subtitle: 'game.group'.trl, + ), + Positioned( + bottom: size.height * 0.2, + left: 24, + child: SizedBox( + height: size.height * 0.6, + width: size.width * 0.8, + child: GridView.builder( + gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 2, + crossAxisSpacing: 16, + mainAxisSpacing: 16, + childAspectRatio: 1, + mainAxisExtent: 96, + ), + controller: ref.watch(gameProvider.select((value) => value.gridScrollController)), + padding: const EdgeInsets.only(top: 16, bottom: 16, right: 32), + itemCount: groups.length, + itemBuilder: (ctx, index) { + Group group = groups[index]; + + return ElevatedButton( + style: ButtonStyle( + fixedSize: MaterialStateProperty.all(size), + backgroundColor: MaterialStateProperty.all(Colors.white), + foregroundColor: MaterialStateProperty.all(kBlackColor), + iconColor: MaterialStateProperty.all(colorScheme.secondary), + overlayColor: MaterialStateProperty.all(colorScheme.primary.withOpacity(0.1)), + shape: MaterialStateProperty.all( + const RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(16)), + ), + ), + // padding: MaterialStateProperty.all(const EdgeInsets.all(0)), + elevation: MaterialStateProperty.all(0), + ), + onPressed: () async { + provider.selectedGroupName = group.text; + await provider.fetchSelectedPictos(); + provider.init(); + final wtpProvider = ref.read(whatsThePictoProvider); + switch (provider.selectedGame) { + case 0: + await provider.createRandomForGameWTP(); + wtpProvider.speakNameWhatsThePicto(); + context.push(AppRoutes.patientWhatsThePictoGame); + break; + case 1: + await provider.createRandomForGameMP(); + context.push(AppRoutes.patientMatchPictogramGame); + + break; + case 2: + context.push(AppRoutes.patientMemoryGame); + + break; + } + }, + child: Row( + children: [ + Padding( + padding: const EdgeInsets.all(8), + child: group.resource.network != null + ? CachedNetworkImage( + imageUrl: group.resource.network!, + fit: BoxFit.fill, + errorWidget: (context, url, error) => Image.asset( + fit: BoxFit.fill, + "assets/img/${group.text}.webp", + ), + ) + : Image.asset( + fit: BoxFit.fill, + "assets/img/${group.text}.webp", + ), + ), + Expanded( + child: Padding( + padding: const EdgeInsets.only(left: 16, right: 16, top: 16), + child: Align( + alignment: Alignment.topRight, + child: AutoSizeText( + group.text, + maxLines: 1, + ), + ), + ), + ), + ], + ), + ); + }, + ), + ), + ), + Positioned( + right: 24, + top: size.height * 0.3, + child: GestureDetector( + onTap: () { + // context.push(AppRoutes.searchScreen); + }, + child: Container( + padding: const EdgeInsets.all(8), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + ), + child: Icon( + Icons.search, + color: colorScheme.primary, + size: 24, + ), + ), + ), + ), + Positioned( + right: 24, + top: size.height * 0.5, + child: GestureDetector( + onTap: () { + provider.scrollUp(); + }, + child: Container( + padding: const EdgeInsets.all(8), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + ), + child: Icon( + Icons.keyboard_arrow_up_rounded, + color: colorScheme.primary, + size: 24, + ), + ), + ), + ), + Positioned( + right: 24, + top: size.height * 0.7, + child: GestureDetector( + onTap: () { + provider.scrollDown(); + }, + child: Container( + padding: const EdgeInsets.all(8), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + ), + child: Icon( + Icons.keyboard_arrow_down_rounded, + color: colorScheme.primary, + size: 24, + ), + ), + ), + ), + ], + ), + ); + } +} diff --git a/lib/presentation/screens/games/ui/background_widget.dart b/lib/presentation/screens/games/ui/background_widget.dart new file mode 100644 index 00000000..541ffaf4 --- /dev/null +++ b/lib/presentation/screens/games/ui/background_widget.dart @@ -0,0 +1,19 @@ +import 'package:flutter/material.dart'; +import 'package:ottaa_project_flutter/application/common/app_images.dart'; + +class BackGroundWidget extends StatelessWidget { + const BackGroundWidget({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Positioned( + top: 0, + left: 0, + child: Image.asset( + AppImages.kGameBackgroundIcon, + height: 150, + width: 150, + ), + ); + } +} diff --git a/lib/presentation/screens/games/ui/board_widget.dart b/lib/presentation/screens/games/ui/board_widget.dart new file mode 100644 index 00000000..af7197aa --- /dev/null +++ b/lib/presentation/screens/games/ui/board_widget.dart @@ -0,0 +1,103 @@ +import 'package:auto_size_text/auto_size_text.dart'; +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:ottaa_project_flutter/application/providers/chat_gpt_game_provider.dart'; +import 'package:ottaa_project_flutter/application/providers/chatgpt_provider.dart'; +import 'package:ottaa_project_flutter/application/providers/games_provider.dart'; +import 'package:ottaa_project_flutter/core/models/group_model.dart'; +import 'package:ottaa_ui_kit/theme.dart'; + +class BoardWidget extends ConsumerWidget { + const BoardWidget({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final provider = ref.watch(chatGptGameProvider); + final game = ref.watch(gameProvider); + final colorScheme = Theme.of(context).colorScheme; + final groups = provider.gptBoards.map((e) { + var group = game.groups[e]; + group?.text = provider.pictosTranslations[e] ?? group.text; + return group; + }).toList(); + final size = MediaQuery.of(context).size; + return Positioned( + bottom: 72, + left: 24, + child: SizedBox( + height: size.height * 0.6, + width: size.width * 0.8, + child: GridView.builder( + gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 2, + crossAxisSpacing: 16, + mainAxisSpacing: 16, + childAspectRatio: 1, + mainAxisExtent: 96, + ), + // controller: ref.watch(chatGPTProvider.select((value) => value.boardScrollController)), + padding: const EdgeInsets.only(top: 16, bottom: 16, right: 32), + itemCount: groups.length, + itemBuilder: (ctx, index) { + Group group = groups[index]!; + + return ElevatedButton( + style: ButtonStyle( + fixedSize: MaterialStateProperty.all(size), + backgroundColor: MaterialStateProperty.all(Colors.white), + foregroundColor: MaterialStateProperty.all(kBlackColor), + iconColor: MaterialStateProperty.all(colorScheme.secondary), + overlayColor: MaterialStateProperty.all(colorScheme.primary.withOpacity(0.1)), + shape: MaterialStateProperty.all( + const RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(16)), + ), + ), + // padding: MaterialStateProperty.all(const EdgeInsets.all(0)), + elevation: MaterialStateProperty.all(0), + ), + onPressed: () async { + await provider.fetchGptPictos(id: group.id); + provider.isBoard = false; + provider.notify(); + }, + child: Row( + children: [ + Padding( + padding: const EdgeInsets.all(8), + child: group.resource.network != null + ? CachedNetworkImage( + imageUrl: group.resource.network!, + fit: BoxFit.fill, + errorWidget: (context, url, error) => Image.asset( + fit: BoxFit.fill, + "assets/img/${group.text}.webp", + ), + ) + : Image.asset( + fit: BoxFit.fill, + "assets/img/${group.text}.webp", + ), + ), + Expanded( + child: Padding( + padding: const EdgeInsets.only(left: 16, right: 16, top: 16), + child: Align( + alignment: Alignment.topRight, + child: AutoSizeText( + group.text, + maxLines: 1, + ), + ), + ), + ), + ], + ), + ); + }, + ), + ), + ); + } +} diff --git a/lib/presentation/screens/games/ui/header_widget.dart b/lib/presentation/screens/games/ui/header_widget.dart new file mode 100644 index 00000000..671d3936 --- /dev/null +++ b/lib/presentation/screens/games/ui/header_widget.dart @@ -0,0 +1,120 @@ +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; + +class HeaderWidget extends StatelessWidget { + HeaderWidget({ + Key? key, + required this.headline, + required this.subtitle, + this.bold = true, + this.simple = true, + this.onTap, + }) : super(key: key); + final String headline, subtitle; + final bool? bold; + final bool simple; + void Function()? onTap = () {}; + + @override + Widget build(BuildContext context) { + final colorScheme = Theme.of(context).colorScheme; + final textTheme = Theme.of(context).textTheme; + return simple + ? Positioned( + top: 24, + left: 24, + child: Row( + children: [ + GestureDetector( + onTap: () { + if (onTap == null) { + } else { + onTap!(); + } + context.pop(); + }, + child: Card( + child: Container( + padding: const EdgeInsets.all(14), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + ), + child: Icon( + Icons.close_rounded, + color: colorScheme.primary, + size: 20, + ), + ), + ), + ), + const SizedBox( + width: 14, + ), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + headline, + style: textTheme.headline3, + ), + Text( + subtitle, + style: bold! + ? textTheme.headline3!.copyWith( + fontWeight: FontWeight.w600, + ) + : textTheme.headline3!.copyWith( + color: colorScheme.primary, + ), + ), + ], + ), + ], + ), + ) + : Row( + children: [ + GestureDetector( + onTap: onTap, + child: Card( + child: Container( + padding: const EdgeInsets.all(14), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + ), + child: Icon( + Icons.close_rounded, + color: colorScheme.primary, + size: 20, + ), + ), + ), + ), + const SizedBox( + width: 14, + ), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + headline, + style: textTheme.headline3, + ), + Text( + subtitle, + style: bold! + ? textTheme.headline3!.copyWith( + fontWeight: FontWeight.w600, + ) + : textTheme.headline3!.copyWith( + color: colorScheme.primary, + ), + ), + ], + ), + ], + ); + } +} diff --git a/lib/presentation/screens/games/ui/leftside_icons.dart b/lib/presentation/screens/games/ui/leftside_icons.dart new file mode 100644 index 00000000..b251effd --- /dev/null +++ b/lib/presentation/screens/games/ui/leftside_icons.dart @@ -0,0 +1,124 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:ottaa_project_flutter/application/common/app_images.dart'; +import 'package:ottaa_project_flutter/application/providers/games_provider.dart'; +import 'package:ottaa_project_flutter/presentation/screens/games/ui/score_dialouge.dart'; + +class LeftSideIcons extends ConsumerStatefulWidget { + const LeftSideIcons({ + Key? key, + this.hints = false, + }) : super(key: key); + final bool hints; + + @override + ConsumerState createState() => _LeftSideIconsState(); +} + +class _LeftSideIconsState extends ConsumerState { + bool mute = false; + + @override + void initState() { + WidgetsBinding.instance.addPostFrameCallback((timeStamp) async { + final provider = ref.read(gameProvider); + mute = provider.isMute; + }); + super.initState(); + } + + @override + Widget build( + BuildContext context, + ) { + final provider = ref.read(gameProvider); + bool hints = ref.watch(gameProvider).hintsBtn; + print(mute); + final colorScheme = Theme.of(context).colorScheme; + return Positioned( + bottom: 24, + left: 24, + child: Row( + children: [ + GestureDetector( + onTap: () { + showDialog( + context: context, + builder: (context) { + return const ScoreDialouge(); + }, + ); + }, + child: Container( + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + ), + padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8), + child: Image.asset( + AppImages.kGamesTrophy, + height: 24, + ), + ), + ), + GestureDetector( + onTap: () async { + setState(() { + mute = !mute; + provider.isMute = mute; + provider.changeMusic(mute: mute); + }); + }, + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0), + child: Container( + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + ), + padding: + const EdgeInsets.symmetric(horizontal: 16, vertical: 8), + child: Icon( + mute ? Icons.volume_mute_outlined : Icons.volume_up_outlined, + color: colorScheme.primary, + size: 24, + ), + ), + ), + ), + widget.hints + ? GestureDetector( + onTap: () async{ + if (hints) { + provider.hintsBtn = !provider.hintsBtn; + await provider.cancelHints(); + } else { + provider.hintsBtn = !provider.hintsBtn; + await provider.showHints(); + } + provider.notify(); + }, + child: Container( + padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8), + decoration: BoxDecoration( + color: hints ? colorScheme.primary : Colors.white, + borderRadius: BorderRadius.circular(8), + ), + child: hints + ? const Icon( + Icons.help, + color: Colors.white, + size: 24, + ) + : Image.asset( + AppImages.kGamesMark, + height: 24, + ), + ), + ) + : const SizedBox.shrink(), + ], + ), + ); + } +} diff --git a/lib/presentation/screens/games/ui/match_pictogram_picto_widget.dart b/lib/presentation/screens/games/ui/match_pictogram_picto_widget.dart new file mode 100644 index 00000000..6f624913 --- /dev/null +++ b/lib/presentation/screens/games/ui/match_pictogram_picto_widget.dart @@ -0,0 +1,126 @@ +import 'package:auto_size_text/auto_size_text.dart'; +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:flutter/material.dart'; +import 'package:ottaa_project_flutter/application/common/app_images.dart'; +import 'package:ottaa_project_flutter/core/models/picto_model.dart'; +import 'package:picto_widget/picto_widget.dart'; + +class MPPictoWidget extends StatelessWidget { + const MPPictoWidget({ + Key? key, + required this.pict, + required this.onTap, + required this.rightOrWrong, + required this.showCorrectOrWrongFlag, + this.hideWidgetEnabled = false, + this.hideText = '', + this.hideFlag = true, + }) : super(key: key); + final Picto pict; + final void Function() onTap; + final bool rightOrWrong, showCorrectOrWrongFlag, hideWidgetEnabled, hideFlag; + final String hideText; + + @override + Widget build(BuildContext context) { + final colorScheme = Theme.of(context).colorScheme; + final size = MediaQuery.of(context).size; + return Stack( + children: [ + Container( + width: size.height * 0.3, + height: size.height * 0.4, + padding: const EdgeInsets.all(0.5), + decoration: BoxDecoration( + border: hideFlag + ? Border.all(color: Colors.transparent) + : showCorrectOrWrongFlag + ? Border.all(color: rightOrWrong ? Colors.green : Colors.red, width: 4) + : Border.all(color: Colors.transparent), + borderRadius: BorderRadius.circular(24), + ), + child: hideWidgetEnabled + ? GestureDetector( + onTap: onTap, + child: Container( + width: size.height * 0.2, + height: size.height * 0.25, + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(16), + border: Border.all(color: colorScheme.primary, width: 4), + ), + padding: const EdgeInsets.all(0.5), + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + const SizedBox.shrink(), + Center( + child: Image.asset( + AppImages.kGamesMark, + height: 46, + width: 46, + ), + ), + hideText == '' + ? const SizedBox.shrink() + : Padding( + padding: const EdgeInsets.only(bottom: 8), + child: AutoSizeText( + hideText.toUpperCase(), + maxLines: 1, + ), + ), + ], + ), + ), + ) + : FittedBox( + fit: BoxFit.fill, + child: PictoWidget( + onTap: onTap, + image: pict.resource.network != null + ? CachedNetworkImage( + imageUrl: pict.resource.network!, + fit: BoxFit.fill, + errorWidget: (context, url, error) => Image.asset( + fit: BoxFit.fill, + "assets/img/${pict.text}.webp", + ), + ) + : Image.asset( + fit: BoxFit.fill, + "assets/img/${pict.text}.webp", + ), + text: '', + colorNumber: pict.type, + ), + ), + ), + hideFlag + ? const SizedBox.shrink() + : showCorrectOrWrongFlag + ? Positioned( + right: 0, + top: 0, + child: Container( + height: 40, + width: 40, + decoration: BoxDecoration( + color: rightOrWrong ? Colors.green : Colors.red, + borderRadius: BorderRadius.circular(20), + ), + child: Center( + child: Icon( + rightOrWrong ? Icons.check : Icons.close, + color: Colors.white, + size: 24, + ), + ), + ), + ) + : const SizedBox.shrink(), + ], + ); + } +} diff --git a/lib/presentation/screens/games/ui/memory_picto_widget.dart b/lib/presentation/screens/games/ui/memory_picto_widget.dart new file mode 100644 index 00000000..e0b98af4 --- /dev/null +++ b/lib/presentation/screens/games/ui/memory_picto_widget.dart @@ -0,0 +1,156 @@ +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:flutter/material.dart'; +import 'package:ottaa_project_flutter/application/common/app_images.dart'; +import 'package:ottaa_project_flutter/core/models/picto_model.dart'; +import 'package:picto_widget/picto_widget.dart'; + +class MemoryPictoWidget extends StatefulWidget { + final Picto picto; + + final void Function() onTap; + + final void Function(AnimationController) onBuild; + + final bool isSelected; + final bool isVisible; + final bool? isRight; + + const MemoryPictoWidget({ + super.key, + required this.picto, + required this.isSelected, + this.isVisible = false, + this.isRight, + required this.onTap, + required this.onBuild, + }); + + @override + State createState() => _MemoryPictoWidgetState(); +} + +class _MemoryPictoWidgetState extends State with SingleTickerProviderStateMixin { + late final AnimationController _controller = AnimationController(vsync: this, duration: const Duration(milliseconds: 500)); + + late final Animation _animation = CurvedAnimation(parent: _controller, curve: Curves.easeIn); + + @override + void initState() { + widget.onBuild(_controller); + _controller.forward(); + super.initState(); + } + + @override + void dispose() { + _controller.reverse(); + _controller.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + final colorScheme = Theme.of(context).colorScheme; + return Container( + margin: const EdgeInsets.symmetric(horizontal: 8), + child: AnimatedBuilder( + animation: _animation, + builder: (context, child) { + return Transform( + transform: Matrix4.identity() + ..rotateY(widget.isVisible + ? 0 + : widget.isSelected + ? _animation.value * 3.14 + : (_animation.value * 3.14 * 2)), + alignment: Alignment.center, + child: child, + ); + }, + child: Stack( + clipBehavior: Clip.none, + alignment: Alignment.center, + children: [ + if (widget.isRight != null && widget.isSelected) + Container( + width: 96 + 8, + height: 119 + 8, + decoration: BoxDecoration( + color: widget.isRight! ? const Color(0xff3CD039) : const Color(0xffFF0000), + borderRadius: BorderRadius.circular(14), + ), + ), + (widget.isSelected || widget.isVisible) + ? Center( + child: PictoWidget( + onTap: () { + //TODO: Maybe should talk the picto + }, + image: widget.picto.resource.network != null + ? CachedNetworkImage( + imageUrl: widget.picto.resource.network!, + fit: BoxFit.fill, + errorWidget: (context, url, error) => Image.asset( + fit: BoxFit.fill, + "assets/img/${widget.picto.text}.webp", + ), + ) + : Image.asset( + fit: BoxFit.fill, + "assets/img/${widget.picto.text}.webp", + ), + text: widget.picto.text, + colorNumber: widget.picto.type, + width: 96, + height: 119, + ), + ) + : GestureDetector( + onTap: widget.onTap, + child: FittedBox( + fit: BoxFit.contain, + child: Container( + width: 96, + height: 119, + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(16), + border: Border.all(color: colorScheme.primary, width: 4), + ), + padding: const EdgeInsets.all(0.5), + child: Center( + child: Image.asset( + AppImages.kGamesMark, + height: 46, + width: 46, + ), + ), + ), + ), + ), + if (widget.isRight != null && widget.isSelected) + Positioned( + right: -10, + top: -10, + child: Container( + height: 40, + width: 40, + decoration: BoxDecoration( + color: widget.isRight! ? const Color(0xff3CD039) : Colors.redAccent, + borderRadius: BorderRadius.circular(20), + ), + child: Center( + child: Icon( + widget.isRight! ? Icons.check : Icons.close, + color: Colors.white, + size: 24, + ), + ), + ), + ) + ], + ), + ), + ); + } +} diff --git a/lib/presentation/screens/games/ui/pict_widget.dart b/lib/presentation/screens/games/ui/pict_widget.dart new file mode 100644 index 00000000..defdc1de --- /dev/null +++ b/lib/presentation/screens/games/ui/pict_widget.dart @@ -0,0 +1,119 @@ +import 'package:auto_size_text/auto_size_text.dart'; +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:flutter/material.dart'; +import 'package:ottaa_project_flutter/application/common/app_images.dart'; +import 'package:ottaa_project_flutter/core/models/picto_model.dart'; +import 'package:picto_widget/picto_widget.dart'; + +class PictWidget extends StatelessWidget { + const PictWidget({ + Key? key, + required this.pict, + required this.onTap, + required this.rightOrWrong, + required this.show, + this.hideWidgetEnabled = false, + this.hideText = '', + }) : super(key: key); + final Picto pict; + final void Function() onTap; + final bool rightOrWrong, show, hideWidgetEnabled; + final String hideText; + + @override + Widget build(BuildContext context) { + final colorScheme = Theme.of(context).colorScheme; + final size = MediaQuery.of(context).size; + return Stack( + children: [ + Container( + width: size.height * 0.3, + height: size.height * 0.4, + padding: const EdgeInsets.all(0.5), + decoration: BoxDecoration( + border: show ? Border.all(color: rightOrWrong ? Colors.green : Colors.red, width: 4) : Border.all(color: Colors.transparent), + borderRadius: BorderRadius.circular(16), + ), + child: hideWidgetEnabled + ? GestureDetector( + onTap: onTap, + child: Container( + width: 100, + height: 122, + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(16), + border: Border.all(color: colorScheme.primary, width: 4), + ), + padding: const EdgeInsets.all(0.5), + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + const SizedBox.shrink(), + Center( + child: Image.asset( + AppImages.kGamesMark, + height: 46, + width: 46, + ), + ), + hideText == '' + ? const SizedBox.shrink() + : Padding( + padding: const EdgeInsets.only(bottom: 8), + child: AutoSizeText( + hideText.toUpperCase(), + maxLines: 1, + ), + ), + ], + ), + ), + ) + : FittedBox( + fit: BoxFit.fill, + child: PictoWidget( + onTap: onTap, + image: pict.resource.network != null + ? CachedNetworkImage( + imageUrl: pict.resource.network!, + fit: BoxFit.fill, + errorWidget: (context, url, error) => Image.asset( + fit: BoxFit.fill, + "assets/img/${pict.text}.webp", + ), + ) + : Image.asset( + fit: BoxFit.fill, + "assets/img/${pict.text}.webp", + ), + text: pict.text.toUpperCase(), + colorNumber: pict.type, + ), + ), + ), + show + ? Positioned( + right: 0, + top: 0, + child: Container( + height: 40, + width: 40, + decoration: BoxDecoration( + color: rightOrWrong ? Colors.green : Colors.red, + borderRadius: BorderRadius.circular(20), + ), + child: Center( + child: Icon( + rightOrWrong ? Icons.check : Icons.close, + color: Colors.white, + size: 24, + ), + ), + ), + ) + : const SizedBox.shrink(), + ], + ); + } +} diff --git a/lib/presentation/screens/games/ui/picto_select.dart b/lib/presentation/screens/games/ui/picto_select.dart new file mode 100644 index 00000000..55ee0b21 --- /dev/null +++ b/lib/presentation/screens/games/ui/picto_select.dart @@ -0,0 +1,65 @@ +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:go_router/go_router.dart'; +import 'package:ottaa_project_flutter/application/providers/chat_gpt_game_provider.dart'; +import 'package:picto_widget/picto_widget.dart'; + +class PictoSelectWidget extends ConsumerWidget { + const PictoSelectWidget({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final size = MediaQuery.of(context).size; + final provider = ref.watch(chatGptGameProvider); + final colorScheme = Theme.of(context).colorScheme; + return Positioned( + bottom: 72, + left: 24, + child: SizedBox( + height: size.height * 0.6, + width: size.width * 0.8, + child: GridView.builder( + gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 5, + crossAxisSpacing: 16, + mainAxisSpacing: 16, + childAspectRatio: 1, + mainAxisExtent: 150, + ), + controller: ref.watch(chatGptGameProvider.select((value) => value.pictoScrollController)), + padding: const EdgeInsets.only(top: 16, bottom: 16, right: 32), + itemCount: provider.chatGptPictos.length, + itemBuilder: (ctx, index) { + return PictoWidget( + onTap: () { + provider.gptPictos.add(provider.chatGptPictos[index]); + provider.isBoard = !provider.isBoard; + provider.sentencePhase++; + provider.notify(); + context.pop(); + }, + image: provider.chatGptPictos[index].resource.network != null + ? CachedNetworkImage( + imageUrl: provider.chatGptPictos[index].resource.network!, + fit: BoxFit.fill, + errorWidget: (context, url, error) => Image.asset( + fit: BoxFit.fill, + "assets/img/${provider.chatGptPictos[index].text}.webp", + ), + ) + : Image.asset( + fit: BoxFit.fill, + "assets/img/${provider.chatGptPictos[index].text}.webp", + ), + text: provider.chatGptPictos[index].text, + colorNumber: provider.chatGptPictos[index].type, + width: 96, + height: 119, + ); + }, + ), + ), + ); + } +} diff --git a/lib/presentation/screens/games/ui/score_dialouge.dart b/lib/presentation/screens/games/ui/score_dialouge.dart new file mode 100644 index 00000000..71b0d64a --- /dev/null +++ b/lib/presentation/screens/games/ui/score_dialouge.dart @@ -0,0 +1,53 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:ottaa_project_flutter/application/common/extensions/translate_string.dart'; +import 'package:ottaa_project_flutter/application/providers/games_provider.dart'; +import 'package:ottaa_project_flutter/presentation/screens/games/ui/scroe_widget.dart'; + +class ScoreDialouge extends ConsumerWidget { + const ScoreDialouge({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final provider = ref.watch(gameProvider); + final time = ref.watch(gameProvider).useTime; + return Center( + child: AlertDialog( + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.all( + Radius.circular(16), + ), + ), + contentPadding: const EdgeInsets.all(16), + content: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Text('game.score'.trl), + Padding( + padding: const EdgeInsets.symmetric(vertical: 16), + child: ScoreWidget( + number: provider.correctScore.toString(), + title: 'game.correct'.trl, + ), + ), + ScoreWidget( + number: provider.incorrectScore.toString(), + title: 'game.incorrect'.trl, + ), + Padding( + padding: const EdgeInsets.symmetric(vertical: 16), + child: ScoreWidget( + number: '${provider.useTime~/60} m ${provider.useTime%60} s', + title: 'game.use_time'.trl, + ), + ), + ScoreWidget( + number: provider.streak.toString(), + title: 'game.maximum_streak'.trl, + ), + ], + ), + ), + ); + } +} diff --git a/lib/presentation/screens/games/ui/scroe_widget.dart b/lib/presentation/screens/games/ui/scroe_widget.dart new file mode 100644 index 00000000..63480748 --- /dev/null +++ b/lib/presentation/screens/games/ui/scroe_widget.dart @@ -0,0 +1,36 @@ +import 'package:flutter/material.dart'; + +class ScoreWidget extends StatelessWidget { + const ScoreWidget({ + Key? key, + required this.number, + required this.title, + }) : super(key: key); + final String title, number; + + @override + Widget build(BuildContext context) { + final colorScheme = Theme.of(context).colorScheme; + final textTheme = Theme.of(context).textTheme; + return Container( + padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 16), + decoration: BoxDecoration( + color: colorScheme.background, + borderRadius: BorderRadius.circular(8), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + title, + style: textTheme.headline3!.copyWith(fontWeight: FontWeight.w600), + ), + Text( + number, + style: textTheme.headline3!.copyWith(fontWeight: FontWeight.w600), + ), + ], + ), + ); + } +} diff --git a/lib/presentation/screens/games/ui/select_board_and_picto.dart b/lib/presentation/screens/games/ui/select_board_and_picto.dart new file mode 100644 index 00000000..74044027 --- /dev/null +++ b/lib/presentation/screens/games/ui/select_board_and_picto.dart @@ -0,0 +1,109 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:ottaa_project_flutter/application/common/extensions/translate_string.dart'; +import 'package:ottaa_project_flutter/application/providers/chat_gpt_game_provider.dart'; +import 'package:ottaa_project_flutter/application/providers/games_provider.dart'; +import 'package:ottaa_project_flutter/application/providers/chatgpt_provider.dart'; +import 'package:ottaa_project_flutter/application/providers/games_provider.dart'; +import 'package:ottaa_project_flutter/application/providers/user_provider.dart'; +import 'package:ottaa_project_flutter/presentation/screens/games/ui/background_widget.dart'; +import 'package:ottaa_project_flutter/presentation/screens/games/ui/board_widget.dart'; +import 'package:ottaa_project_flutter/presentation/screens/games/ui/header_widget.dart'; +import 'package:ottaa_project_flutter/presentation/screens/games/ui/picto_select.dart'; + +class SelectBoardAndPicto extends ConsumerWidget { + const SelectBoardAndPicto({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final game = ref.watch(gameProvider); + final provider = ref.watch(chatGptGameProvider); + final size = MediaQuery.of(context).size; + final textTheme = Theme.of(context).textTheme; + + final user = ref.read(userProvider.select((value) => value.user!)); + final colorScheme = Theme.of(context).colorScheme; + final groups = []; + return Scaffold( + body: Stack( + children: [ + const BackGroundWidget(), + HeaderWidget( + headline: 'profile.hello'.trlf({'name': user.settings.data.name}), + subtitle: 'game.game_4_line'.trl, + onTap: () { + if (provider.sentencePhase < provider.chatGptPictos.length) { + provider.isBoard = true; + } + }, + ), + provider.isBoard ? const BoardWidget() : const PictoSelectWidget(), + Positioned( + right: 24, + top: size.height * 0.3, + child: GestureDetector( + onTap: () { + //todo: search is disabled for now + // context.push(AppRoutes.searchScreen); + }, + child: Container( + padding: const EdgeInsets.all(8), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + ), + child: Icon( + Icons.search, + color: colorScheme.primary, + size: 24, + ), + ), + ), + ), + Positioned( + right: 24, + top: size.height * 0.5, + child: GestureDetector( + onTap: () { + provider.isBoard ? provider.scrollUpBoards() : provider.scrollUpPictos(); + }, + child: Container( + padding: const EdgeInsets.all(8), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + ), + child: Icon( + Icons.keyboard_arrow_up_rounded, + color: colorScheme.primary, + size: 24, + ), + ), + ), + ), + Positioned( + right: 24, + top: size.height * 0.7, + child: GestureDetector( + onTap: () { + provider.isBoard ? provider.scrollDownBoards() : provider.scrollDownPictos(); + }, + child: Container( + padding: const EdgeInsets.all(8), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + ), + child: Icon( + Icons.keyboard_arrow_down_rounded, + color: colorScheme.primary, + size: 24, + ), + ), + ), + ), + ], + ), + ); + } +} diff --git a/lib/presentation/screens/games/ui/sentence_widget.dart b/lib/presentation/screens/games/ui/sentence_widget.dart new file mode 100644 index 00000000..01bb7cf9 --- /dev/null +++ b/lib/presentation/screens/games/ui/sentence_widget.dart @@ -0,0 +1,109 @@ +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:go_router/go_router.dart'; +import 'package:ottaa_project_flutter/application/common/app_images.dart'; +import 'package:ottaa_project_flutter/application/common/extensions/translate_string.dart'; +import 'package:ottaa_project_flutter/application/providers/chat_gpt_game_provider.dart'; +import 'package:ottaa_project_flutter/application/router/app_routes.dart'; +import 'package:picto_widget/picto_widget.dart'; + +class SentenceWidget extends ConsumerWidget { + const SentenceWidget({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final provider = ref.watch(chatGptGameProvider); + final size = MediaQuery.of(context).size; + return Center( + child: SizedBox( + width: size.width, + height: size.height * 0.4, + child: Padding( + padding: const EdgeInsets.only(left: 24), + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + ...provider.gptPictos + .map( + (e) => Container( + width: size.height * 0.2, + height: size.height * 0.25, + padding: const EdgeInsets.only(left: 24), + child: FittedBox( + fit: BoxFit.fill, + child: PictoWidget( + onTap: () {}, + image: e.resource.network != null + ? CachedNetworkImage( + imageUrl: e.resource.network!, + fit: BoxFit.fill, + errorWidget: (context, url, error) => Image.asset( + fit: BoxFit.fill, + "assets/img/${e.text}.webp", + ), + ) + : Image.asset( + fit: BoxFit.fill, + "assets/img/${e.text}.webp", + ), + text: e.text, + colorNumber: e.type, + ), + ), + ), + ) + .toList(), + const SizedBox( + width: 24, + ), + provider.gptPictos.length == 4 + ? const SizedBox.shrink() + : SizedBox( + width: size.height * 0.2, + height: size.height * 0.25, + child: FittedBox( + fit: BoxFit.fill, + child: PictoWidget( + image: Image.asset(AppImages.kAddIcon), + onTap: () async { + print(provider.sentencePhase); + switch (provider.sentencePhase) { + ///using the same screen with different values + case 0: + provider.gptBoards.clear(); + provider.gptBoards.addAll(provider.nounBoards); + print(provider.nounBoards.last); + provider.notify(); + break; + case 1: + provider.gptBoards.clear(); + provider.gptBoards.addAll(provider.modifierBoards); + provider.notify(); + break; + case 2: + provider.gptBoards.clear(); + provider.gptBoards.addAll(provider.actionBoards); + provider.gptBoards = provider.actionBoards; + provider.notify(); + break; + case 3: + provider.gptBoards.clear(); + provider.gptBoards.addAll(provider.placeBoards); + provider.gptBoards = provider.placeBoards; + provider.notify(); + break; + } + context.push(AppRoutes.selectBoardPicto); + }, + text: 'global.add'.trl, + ), + ), + ), + ], + ), + ), + ), + ); + } +} diff --git a/lib/presentation/screens/games/ui/shaker_widget.dart b/lib/presentation/screens/games/ui/shaker_widget.dart new file mode 100644 index 00000000..ac3b082a --- /dev/null +++ b/lib/presentation/screens/games/ui/shaker_widget.dart @@ -0,0 +1,58 @@ +import 'package:flutter/material.dart'; + +class ShakeError extends StatefulWidget { + const ShakeError({ + Key? key, + required this.child, + this.controller, + this.duration = const Duration(milliseconds: 1500), + this.deltaX = 20, + this.curve = Curves.bounceOut, + }) : super(key: key); + final Widget child; + final Duration duration; + final double deltaX; + final Curve curve; + final Function(AnimationController)? controller; + + @override + State createState() => _ShakeErrorState(); +} + +class _ShakeErrorState extends State with SingleTickerProviderStateMixin { + late AnimationController controller; + late Animation offsetAnimation; + + @override + void initState() { + controller = AnimationController(duration: widget.duration, vsync: this); + offsetAnimation = Tween(begin: 0.0, end: 1.0).chain(CurveTween(curve: widget.curve)).animate(controller); + if (widget.controller is Function) { + widget.controller!(controller); + } + super.initState(); + } + + @override + void dispose() { + controller.dispose(); + super.dispose(); + } + + /// convert 0-1 to 0-1-0 + double shake(double animation) => 2 * (0.5 - (0.5 - widget.curve.transform(animation)).abs()); + + @override + Widget build(BuildContext context) { + return AnimatedBuilder( + animation: offsetAnimation, + builder: (BuildContext context, Widget? child) { + return Transform.translate( + offset: Offset(widget.deltaX * shake(offsetAnimation.value), 0), + child: child, + ); + }, + child: widget.child, + ); + } +} diff --git a/lib/presentation/screens/games/ui/show_created_story.dart b/lib/presentation/screens/games/ui/show_created_story.dart new file mode 100644 index 00000000..2c819a78 --- /dev/null +++ b/lib/presentation/screens/games/ui/show_created_story.dart @@ -0,0 +1,131 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:go_router/go_router.dart'; +import 'package:ottaa_project_flutter/application/common/app_images.dart'; +import 'package:ottaa_project_flutter/application/common/extensions/translate_string.dart'; +import 'package:ottaa_project_flutter/application/providers/chat_gpt_game_provider.dart'; +import 'package:ottaa_project_flutter/application/providers/games_provider.dart'; +import 'package:ottaa_project_flutter/application/providers/user_provider.dart'; +import 'package:ottaa_project_flutter/presentation/screens/games/ui/background_widget.dart'; +import 'package:ottaa_project_flutter/presentation/screens/games/ui/header_widget.dart'; +import 'package:ottaa_project_flutter/presentation/screens/games/ui/storyWidget.dart'; + +class ShowCreatedStory extends ConsumerWidget { + const ShowCreatedStory({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final provider = ref.watch(chatGptGameProvider); + final colorScheme = Theme.of(context).colorScheme; + + final user = ref.read(userProvider.select((value) => value.user!)); + return Scaffold( + body: Stack( + children: [ + const BackGroundWidget(), + Padding( + padding: const EdgeInsets.only(top: 24, left: 24, right: 24), + child: Column( + children: [ + HeaderWidget( + headline: 'profile.hello'.trlf({'name': user.settings.data.name}), + subtitle: 'game.game_4_line'.trl, + simple: false, + onTap: () { + ///reset the whole game + provider.resetStoryGame(); + provider.stopTTS(); + context.pop(); + context.pop(); + }, + ), + const SizedBox( + height: 24, + ), + const StoryWidget(), + ], + ), + ), + Positioned( + bottom: 24, + right: 48, + child: Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + StoryButton( + onTap: () {}, + image: AppImages.kSaveIcon, + ), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 24), + child: StoryButton( + onTap: () {}, + image: AppImages.kShareIcon, + ), + ), + StoryButton( + onTap: () { + provider.speakStory(); + }, + image: AppImages.kOttaa, + orange: true, + ), + const SizedBox( + width: 24, + ), + GestureDetector( + onTap: () { + provider.stopTTS(); + }, + child: Container( + padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + ), + child: Icon( + Icons.stop, + color: colorScheme.primary, + size: 44, + ), + ), + ) + ], + ), + ), + ], + ), + ); + } +} + +class StoryButton extends StatelessWidget { + const StoryButton({ + Key? key, + this.orange = false, + required this.image, + required this.onTap, + }) : super(key: key); + final bool orange; + final String image; + final void Function()? onTap; + + @override + Widget build(BuildContext context) { + final colorScheme = Theme.of(context).colorScheme; + return GestureDetector( + onTap: onTap, + child: Container( + padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12), + decoration: BoxDecoration( + color: orange ? colorScheme.primary : Colors.white, + borderRadius: BorderRadius.circular(8), + ), + child: Image.asset( + image, + height: 40, + ), + ), + ); + } +} diff --git a/lib/presentation/screens/games/ui/speak_button.dart b/lib/presentation/screens/games/ui/speak_button.dart new file mode 100644 index 00000000..a509bd48 --- /dev/null +++ b/lib/presentation/screens/games/ui/speak_button.dart @@ -0,0 +1,42 @@ +import 'package:flutter/material.dart'; +import 'package:ottaa_project_flutter/application/common/app_images.dart'; +import 'package:ottaa_ui_kit/widgets.dart'; + +class SpeakButton extends StatelessWidget { + const SpeakButton({Key? key, required this.onTap}) : super(key: key); + final void Function()? onTap; + + @override + Widget build(BuildContext context) { + final colorScheme = Theme.of(context).colorScheme; + return Positioned( + right: 48, + top: 24, + child: SizedBox( + width: 84, + height: 80, + child: BaseButton( + style: ButtonStyle( + backgroundColor: MaterialStateProperty.all(colorScheme.primary), + overlayColor: + MaterialStateProperty.all(Colors.white.withOpacity(0.1)), + shape: MaterialStateProperty.all( + const RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(9)), + ), + ), + padding: MaterialStateProperty.all(const EdgeInsets.all(0)), + elevation: MaterialStateProperty.all(0), + ), + onPressed: onTap, + child: Image.asset( + AppImages.kOttaaMinimalist, + color: Colors.white, + width: 59, + height: 59, + ), + ), + ), + ); + } +} diff --git a/lib/presentation/screens/games/ui/storyWidget.dart b/lib/presentation/screens/games/ui/storyWidget.dart new file mode 100644 index 00000000..549e8c11 --- /dev/null +++ b/lib/presentation/screens/games/ui/storyWidget.dart @@ -0,0 +1,116 @@ +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:ottaa_project_flutter/application/providers/chat_gpt_game_provider.dart'; +import 'package:ottaa_project_flutter/application/providers/games_provider.dart'; +import 'package:picto_widget/picto_widget.dart'; + +class StoryWidget extends ConsumerWidget { + const StoryWidget({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final provider = ref.watch(chatGptGameProvider); + final colorScheme = Theme.of(context).colorScheme; + final size = MediaQuery.of(context).size; + return SizedBox( + width: size.width, + height: size.height * 0.55, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + SingleChildScrollView( + child: Container( + width: size.width * 0.85, + padding: const EdgeInsets.all(16), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + ), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + height: size.height * 0.3, + width: size.width * 0.6, + child: ListView.builder( + scrollDirection: Axis.horizontal, + itemCount: provider.gptPictos.length, + itemBuilder: (context, index) => Padding( + padding: const EdgeInsets.only(left: 24), + child: PictoWidget( + onTap: () {}, + image: provider.gptPictos[index].resource.network != null + ? CachedNetworkImage( + imageUrl: provider.gptPictos[index].resource.network!, + fit: BoxFit.fill, + errorWidget: (context, url, error) => Image.asset( + fit: BoxFit.fill, + "assets/img/${provider.gptPictos[index].text}.webp", + ), + ) + : Image.asset( + fit: BoxFit.fill, + "assets/img/${provider.gptPictos[index].text}.webp", + ), + text: provider.gptPictos[index].text, + colorNumber: provider.gptPictos[index].type, + width: 96, + height: 119, + ), + ), + ), + ), + Text( + provider.generatedStory, + ), + ], + ), + ), + ), + Column( + mainAxisSize: MainAxisSize.max, + children: [ + GestureDetector( + onTap: () { + //todo: add the functions + }, + child: Container( + padding: const EdgeInsets.all(16), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + ), + child: Icon( + Icons.keyboard_arrow_up_rounded, + color: colorScheme.primary, + size: 32, + ), + ), + ), + const Spacer(), + GestureDetector( + onTap: () { + //todo: add the functions + }, + child: Container( + padding: const EdgeInsets.all(16), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + ), + child: Icon( + Icons.keyboard_arrow_down_rounded, + color: colorScheme.primary, + size: 32, + ), + ), + ), + ], + ), + ], + ), + ); + } +} diff --git a/lib/presentation/screens/games/ui/ui_widget.dart b/lib/presentation/screens/games/ui/ui_widget.dart new file mode 100644 index 00000000..d818a782 --- /dev/null +++ b/lib/presentation/screens/games/ui/ui_widget.dart @@ -0,0 +1,74 @@ +import 'package:flutter/material.dart'; +import 'package:ottaa_project_flutter/presentation/screens/games/ui/background_widget.dart'; +import 'package:ottaa_project_flutter/presentation/screens/games/ui/header_widget.dart'; + +class UIWidget extends StatelessWidget { + const UIWidget({ + Key? key, + required this.subtitle, + required this.headline, + required this.uiWidget, + required this.backward, + required this.forward, + }) : super(key: key); + final String headline, subtitle; + final Widget uiWidget; + final void Function()? forward, backward; + + @override + Widget build(BuildContext context) { + final colorScheme = Theme.of(context).colorScheme; + final size = MediaQuery.of(context).size; + return Stack( + children: [ + const BackGroundWidget(), + HeaderWidget( + headline: headline, + subtitle: subtitle, + bold: false, + ), + Center( + child: uiWidget, + ), + Positioned( + bottom: size.height * 0.2, + left: size.width * 0.13, + child: GestureDetector( + onTap: backward, + child: Container( + padding: const EdgeInsets.all(10), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + ), + child: Icon( + Icons.arrow_back_ios_rounded, + size: size.height*0.03, + color: colorScheme.primary, + ), + ), + ), + ), + Positioned( + bottom: size.height * 0.2, + right: size.width * 0.13, + child: GestureDetector( + onTap: forward, + child: Container( + padding: const EdgeInsets.all(10), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + ), + child: Icon( + Icons.arrow_forward_ios_rounded, + size: size.height*0.03, + color: colorScheme.primary, + ), + ), + ), + ), + ], + ); + } +} diff --git a/lib/presentation/screens/games/whats_the_picto_screen.dart b/lib/presentation/screens/games/whats_the_picto_screen.dart new file mode 100644 index 00000000..eb1cb898 --- /dev/null +++ b/lib/presentation/screens/games/whats_the_picto_screen.dart @@ -0,0 +1,164 @@ +import 'package:animated_widgets/animated_widgets.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:ottaa_project_flutter/application/common/extensions/translate_string.dart'; +import 'package:ottaa_project_flutter/application/providers/games_provider.dart'; +import 'package:ottaa_project_flutter/application/providers/whats_the_picto_provider.dart'; +import 'package:ottaa_project_flutter/presentation/screens/games/ui/background_widget.dart'; +import 'package:ottaa_project_flutter/presentation/screens/games/ui/header_widget.dart'; +import 'package:ottaa_project_flutter/presentation/screens/games/ui/leftside_icons.dart'; +import 'package:ottaa_project_flutter/presentation/screens/games/ui/pict_widget.dart'; +import 'package:ottaa_project_flutter/presentation/screens/games/ui/speak_button.dart'; + +class WhatsThePictoScreen extends ConsumerWidget { + const WhatsThePictoScreen({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final provider = ref.watch(whatsThePictoProvider); + final game = ref.read(gameProvider); + final textTheme = Theme.of(context).textTheme; + final size = MediaQuery.of(context).size; + return Scaffold( + body: Stack( + children: [ + const BackGroundWidget(), + HeaderWidget( + headline: 'game.game_header_${game.selectedGame}'.trl, + subtitle: 'game.game_1_line'.trl, + onTap: () { + game.backgroundMusicPlayer.pause(); + game.resetScore(); + game.gameTimer.cancel(); + if (game.hintsBtn) { + game.cancelHints(); + } + }, + ), + SpeakButton( + onTap: () async => provider.speakNameWhatsThePicto(), + ), + SizedBox( + height: size.height, + child: Center( + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + ///first + ShakeAnimatedWidget( + enabled: game.hintsEnabled + ? game.correctPictoWTP == 0 + ? true + : false + : false, + duration: const Duration(milliseconds: 400), + shakeAngle: Rotation.deg(z: 4), + curve: Curves.linear, + child: PictWidget( + pict: game.gamePictsWTP[0], + show: provider.pictoShowWhatsThePict[0], + onTap: () async { + await provider.checkAnswerWhatThePicto(index: 0); + }, + rightOrWrong: game.correctPictoWTP == 0, + ), + ), + const SizedBox( + width: 24, + ), + + ///second + ShakeAnimatedWidget( + enabled: game.hintsEnabled + ? game.correctPictoWTP == 1 + ? true + : false + : false, + duration: const Duration(milliseconds: 400), + shakeAngle: Rotation.deg(z: 4), + curve: Curves.linear, + child: PictWidget( + pict: game.gamePictsWTP[1], + show: provider.pictoShowWhatsThePict[1], + onTap: () async { + await provider.checkAnswerWhatThePicto(index: 1); + }, + rightOrWrong: game.correctPictoWTP == 1, + ), + ), + + ///third + game.difficultyLevel >= 1 + ? const SizedBox( + width: 24, + ) + : const SizedBox.shrink(), + game.difficultyLevel >= 1 + ? ShakeAnimatedWidget( + enabled: game.hintsEnabled + ? game.correctPictoWTP == 2 + ? true + : false + : false, + duration: const Duration(milliseconds: 400), + shakeAngle: Rotation.deg(z: 4), + curve: Curves.linear, + child: PictWidget( + pict: game.gamePictsWTP[2], + show: provider.pictoShowWhatsThePict[2], + onTap: () async { + await provider.checkAnswerWhatThePicto(index: 2); + }, + rightOrWrong: game.correctPictoWTP == 2, + ), + ) + : const SizedBox.shrink(), + + ///forth + game.difficultyLevel >= 2 + ? const SizedBox( + width: 24, + ) + : const SizedBox.shrink(), + game.difficultyLevel >= 2 + ? ShakeAnimatedWidget( + enabled: game.hintsEnabled + ? game.correctPictoWTP == 3 + ? true + : false + : false, + duration: const Duration(milliseconds: 400), + shakeAngle: Rotation.deg(z: 4), + curve: Curves.linear, + child: PictWidget( + pict: game.gamePictsWTP[3], + show: provider.pictoShowWhatsThePict[3], + onTap: () async { + await provider.checkAnswerWhatThePicto(index: 3); + }, + rightOrWrong: game.correctPictoWTP == 3, + ), + ) + : const SizedBox.shrink(), + ], + ), + ), + ), + provider.showText + ? Positioned( + top: size.height * 0.8, + left: size.width * 0.46, + child: Text( + provider.selectedPicto == game.correctPictoWTP ? 'game.yes'.trl : 'game.no'.trl, + style: textTheme.displayLarge, + ), + ) + : const SizedBox.shrink(), + const LeftSideIcons( + hints: true, + ), + ], + ), + ); + } +} diff --git a/lib/presentation/screens/home/home_screen.dart b/lib/presentation/screens/home/home_screen.dart index 4eea34f9..9788515f 100644 --- a/lib/presentation/screens/home/home_screen.dart +++ b/lib/presentation/screens/home/home_screen.dart @@ -1,18 +1,15 @@ -import 'dart:io'; - import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:ottaa_project_flutter/application/common/app_images.dart'; +import 'package:ottaa_project_flutter/application/common/screen_helpers.dart'; import 'package:ottaa_project_flutter/application/providers/home_provider.dart'; -import 'package:ottaa_project_flutter/application/router/app_routes.dart'; -import 'package:ottaa_project_flutter/application/theme/app_theme.dart'; -import 'package:ottaa_project_flutter/presentation/common/ui/loading_modal.dart'; -import 'package:ottaa_project_flutter/presentation/common/widgets/column_widget.dart'; -import 'package:go_router/go_router.dart'; -import 'package:ottaa_project_flutter/presentation/common/widgets/ottaa_logo_widget.dart'; -import 'package:ottaa_project_flutter/presentation/common/widgets/pictogram_widget.dart'; -import 'package:ottaa_project_flutter/presentation/screens/home/ui/home_drawer.dart'; -import 'package:picto_widget/picto_widget.dart'; +import 'package:ottaa_project_flutter/core/enums/home_screen_status.dart'; +import 'package:ottaa_project_flutter/presentation/screens/home/ui/home_grid.dart'; +import 'package:ottaa_project_flutter/presentation/screens/home/ui/home_tabs.dart'; +import 'package:ottaa_project_flutter/presentation/screens/home/ui/pictos_bar.dart'; +import 'package:ottaa_project_flutter/presentation/screens/home/widgets/home_mobile.dart'; +import 'package:ottaa_project_flutter/presentation/screens/home/widgets/home_tablet.dart'; +import 'package:responsive_builder/responsive_builder.dart'; class HomeScreen extends ConsumerStatefulWidget { const HomeScreen({super.key}); @@ -28,284 +25,84 @@ class _HomeScreenState extends ConsumerState { void initState() { super.initState(); - final provider = ref.read(homeProvider); - WidgetsBinding.instance.addPostFrameCallback((_) async { - await LoadingModal.show(context, future: provider.init); + blockLandscapeMode(); + SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual, overlays: []); + + //We are using size.height because at this time the screen is not rotated + int pictoCount = 4; + + final setSuggested = ref.read(homeProvider.select((value) => value.setSuggedtedQuantity)); + + setSuggested(pictoCount); + + await ref.read(homeProvider.select((value) => value.init))(); + setState(() {}); }); } @override - Widget build(BuildContext context) { + void dispose() { + unblockRotation(); + SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual, overlays: SystemUiOverlay.values); + + super.dispose(); + } + + Widget currentHomeStatus(HomeScreenStatus status) { final Size size = MediaQuery.of(context).size; - final double height = size.height; - final double width = size.width; + switch (status) { + case HomeScreenStatus.pictos: + return Flexible( + fit: FlexFit.tight, + flex: 2, + child: SizedBox( + width: size.width, + child: const PictosBarUI(), + ), + ); + case HomeScreenStatus.grid: + return const Expanded( + flex: 2, + child: HomeGridUI(), + ); + case HomeScreenStatus.tabs: + return const Expanded( + flex: 2, + child: HomeTabsUI(), + ); + case HomeScreenStatus.favorites: - final provider = ref.watch(homeProvider); + case HomeScreenStatus.history: + return Container(); + } + } - print(provider.suggestedPicts); + @override + Widget build(BuildContext context) { + final Size size = MediaQuery.of(context).size; + final provider = ref.watch(homeProvider); - return Scaffold( - backgroundColor: Colors.black, - drawerEdgeDragWidth: 200, - extendBody: true, - key: _scaffoldKey, - drawer: const HomeDrawer(), - body: GestureDetector( - behavior: HitTestBehavior.translucent, - onHorizontalDragEnd: (details) { - if (details.velocity.pixelsPerSecond.dx.abs() > 0) { - //TODO!: WORK FOR ASIM :) (build context: asim told he can do that better than me) - //Another work for asim translate this: papi chulo :( - _scaffoldKey.currentState?.openDrawer(); - } - }, - child: Stack( - children: [ - Align( - alignment: Alignment.bottomLeft, - child: ColumnWidget( - columnType: ColumnType.left, - children: [ - Expanded( - child: ElevatedButton( - style: ElevatedButton.styleFrom( - elevation: 0, - backgroundColor: Colors.transparent, - shadowColor: Colors.transparent, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(16), - ), - ), - onPressed: () async {}, - child: Center( - child: Icon( - Icons.videogame_asset, - color: Colors.white, - size: height / 12, - ), - ), - ), - ), - Expanded( - child: ElevatedButton( - style: ElevatedButton.styleFrom( - elevation: 0, - backgroundColor: Colors.transparent, - shadowColor: Colors.transparent, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(16), - ), - ), - onPressed: () async {}, - child: Center( - child: Icon( - Icons.image, - color: Colors.white, - size: height / 12, - ), - ), - ), - ), - ], - ), - ), - Align( - alignment: Alignment.bottomRight, - child: ColumnWidget( - columnType: ColumnType.right, - children: [ - Expanded( - child: ElevatedButton( - style: ElevatedButton.styleFrom( - elevation: 0, - backgroundColor: Colors.transparent, - shadowColor: Colors.transparent, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(16), - ), - ), - onPressed: () async {}, - child: Center( - child: Icon( - Icons.share, - color: Colors.white, - size: height / 12, - ), - ), - ), - ), - Expanded( - child: ElevatedButton( - style: ElevatedButton.styleFrom( - elevation: 0, - backgroundColor: Colors.transparent, - shadowColor: Colors.transparent, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(16), - ), - ), - onPressed: () async { - context.push(AppRoutes.sentences); - }, - child: Center( - child: Icon( - Icons.favorite, - color: Colors.white, - size: height / 12, - ), - ), - ), - ), - ], - ), - ), - Column( - children: [ - Expanded( - flex: 8, - child: Column( - children: [ - Container(), - ], - ), - ), - Expanded( - flex: 2, - child: Container( - width: width * 0.8, - color: kOTTAAOrangeNew, - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Expanded( - child: Padding( - padding: EdgeInsets.only(top: height * 0.045), - child: SizedBox( - width: width / 4, - child: ElevatedButton( - onPressed: () {}, - style: ElevatedButton.styleFrom( - elevation: 0, - backgroundColor: Colors.transparent, - shadowColor: Colors.transparent, - ), - child: Center( - child: Icon( - Icons.menu_sharp, - color: Colors.white, - size: height / 10, - ), - ), - ), - ), - ), - ), - Container(), - Expanded( - child: Padding( - padding: EdgeInsets.only(top: height * 0.045), - child: SizedBox( - width: width / 4, - child: ElevatedButton( - onPressed: () {}, - style: ElevatedButton.styleFrom( - elevation: 0, - backgroundColor: Colors.transparent, - shadowColor: Colors.transparent, - ), - child: Center( - child: Icon( - Icons.backspace_rounded, - color: Colors.white, - size: height / 10, - ), - ), - ), - ), - ), - ), - ], - ), - ), - ), - ], - ), - Positioned( - left: 0, - right: 0, - bottom: height * 0.16, - child: Padding( - padding: EdgeInsets.symmetric(horizontal: width * 0.099), - child: Container( - height: height * 0.58, - width: width * 0.78, - padding: EdgeInsets.symmetric(vertical: height * 0.02), - decoration: BoxDecoration( - color: Colors.black, - borderRadius: BorderRadius.circular(15), - ), - child: Row( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: provider.suggestedPicts.isNotEmpty - ? provider.suggestedPicts - .sublist(0, 4) - .map( - (picto) => PictogramWidget( - pictogam: picto, onTap: () {}), - ) - .toList() - : [], - ), - ), - ), - ), - /* Align( - alignment: Alignment.bottomCenter, - child: Padding( - padding: EdgeInsets.only(bottom: height * 0.045), - child: ElevatedButton( - style: ElevatedButton.styleFrom( - elevation: 0, - backgroundColor: kOTTAAOrangeNew, - shadowColor: Colors.transparent, - padding: EdgeInsets.zero, - shape: const CircleBorder( - side: BorderSide( - color: Colors.black, - width: 4, - ), - ), - ), - onPressed: () { - //TODO: Add tts function - context.push(AppRoutes.profileChooserScreen); - }, - child: SizedBox( - height: height * 0.16, - width: height * 0.16, - child: Center( - child: Image.asset( - AppImages.kIconoOttaa, - color: Colors.white, - height: height * 0.1, - width: width * 0.1, - ), - ), - ), - ), - ), - ),*/ - OttaaLogoWidget( - onTap: () { - //TODO: Add tts function - context.push(AppRoutes.tutorial); - }, - ), - ], + return WillPopScope( + onWillPop: () async { + return false; + }, + child: Scaffold( + body: ResponsiveBuilder( + builder: (context, sizingInformation) { + switch (sizingInformation.deviceScreenType) { + case DeviceScreenType.desktop: + case DeviceScreenType.tablet: + return HomeTabletLayout( + child: currentHomeStatus(provider.status), + ); + default: + return HomeMobileLayout( + child: currentHomeStatus(provider.status), + ); + } + }, ), ), ); diff --git a/lib/presentation/screens/home/ui/exit_widget.dart b/lib/presentation/screens/home/ui/exit_widget.dart new file mode 100644 index 00000000..cdb0c21c --- /dev/null +++ b/lib/presentation/screens/home/ui/exit_widget.dart @@ -0,0 +1,167 @@ +import 'package:auto_size_text/auto_size_text.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:go_router/go_router.dart'; +import 'package:ottaa_project_flutter/application/common/extensions/translate_string.dart'; +import 'package:ottaa_project_flutter/application/providers/home_provider.dart'; +import 'package:ottaa_project_flutter/presentation/common/widgets/simple_button.dart'; + +class ExitWidget extends StatelessWidget { + const ExitWidget({Key? key, this.isLongClick = false}) : super(key: key); + final bool isLongClick; + + @override + Widget build(BuildContext context) { + return Center( + child: Container( + height: isLongClick ? 280 : 210, + width: 310, + padding: const EdgeInsets.all(24), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(32), + ), + child: isLongClick ? const LongClickWidget() : const TapWidget(), + ), + ); + } +} + +class LongClickWidget extends ConsumerWidget { + const LongClickWidget({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final provider = ref.watch(homeProvider); + final textTheme = Theme.of(context).textTheme; + return Column( + mainAxisSize: MainAxisSize.min, + children: [ + Align( + alignment: Alignment.bottomRight, + child: GestureDetector( + onTap: () { + provider.isExit = false; + provider.notify(); + }, + child: const Icon( + Icons.close, + color: Colors.black, + ), + ), + ), + Padding( + padding: const EdgeInsets.symmetric(vertical: 16), + child: Text( + 'exit.long.headline'.trl, + style: textTheme.headline3!.copyWith(fontWeight: FontWeight.w700), + textAlign: TextAlign.center, + ), + ), + Text( + 'exit.long.body'.trl, + style: textTheme.headline3, + textAlign: TextAlign.center, + ), + Padding( + padding: const EdgeInsets.only(top: 16), + child: SimpleButton( + width: false, + onTap: () async { + provider.isExit = false; + if (provider.isLongClickCheck) { + provider.isExitLong = true; + await provider.setLongClickEnabled(isLongClick: true); + } + provider.notify(); + context.pop(); + }, + text: 'exit.long.btn'.trl, + ), + ), + Row( + children: [ + Checkbox( + value: provider.isLongClickCheck, + onChanged: (value) { + provider.isLongClickCheck = value!; + provider.notify(); + }, + ), + const SizedBox( + width: 8, + ), + Expanded( + child: AutoSizeText( + 'exit.long.check'.trl, + style: textTheme.bodyText1!.copyWith(color: Colors.black38, fontSize: 12), + maxLines: 2, + textAlign: TextAlign.start, + ), + ), + ], + ), + ], + ); + } +} + +class TapWidget extends ConsumerWidget { + const TapWidget({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final textTheme = Theme.of(context).textTheme; + final provider = ref.watch(homeProvider); + return Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Align( + alignment: Alignment.bottomRight, + child: GestureDetector( + onTap: () { + provider.isExit = false; + provider.notify(); + }, + child: const Icon( + Icons.close, + color: Colors.black, + ), + ), + ), + Text( + 'exit.short.headline'.trl, + style: textTheme.headline3, + textAlign: TextAlign.center, + ), + Row( + children: [ + Expanded( + child: SimpleButton( + onTap: () { + provider.isExit = false; + provider.notify(); + }, + text: 'global.cancel'.trl, + ), + ), + const SizedBox( + width: 16, + ), + Expanded( + child: SimpleButton( + onTap: () { + provider.isExit = false; + provider.notify(); + context.pop(); + }, + text: 'global.confirm'.trl, + ), + ), + ], + ), + ], + ); + } +} diff --git a/lib/presentation/screens/home/ui/home_drawer.dart b/lib/presentation/screens/home/ui/home_drawer.dart deleted file mode 100644 index 90b06782..00000000 --- a/lib/presentation/screens/home/ui/home_drawer.dart +++ /dev/null @@ -1,131 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:go_router/go_router.dart'; -import 'package:ottaa_project_flutter/application/common/app_images.dart'; -import 'package:ottaa_project_flutter/application/common/extensions/translate_string.dart'; -import 'package:ottaa_project_flutter/application/service/sql_database.dart'; -import 'package:ottaa_project_flutter/application/notifiers/user_avatar_notifier.dart'; -import 'package:ottaa_project_flutter/application/providers/auth_provider.dart'; -import 'package:ottaa_project_flutter/application/router/app_routes.dart'; -import 'package:ottaa_project_flutter/application/theme/app_theme.dart'; -import 'package:ottaa_project_flutter/presentation/common/ui/loading_modal.dart'; - -class HomeDrawer extends ConsumerWidget { - const HomeDrawer({super.key}); - - @override - Widget build(BuildContext context, WidgetRef ref) { - final size = MediaQuery.of(context).size; - final width = size.width; - final height = size.height; - - final auth = ref.read(authProvider.notifier); - final userAvatar = ref.watch(userAvatarNotifier); - - return SafeArea( - child: Drawer( - width: width / 3, - shape: const RoundedRectangleBorder( - borderRadius: BorderRadius.all(Radius.circular(20)), - ), - child: ListView( - padding: EdgeInsets.zero, - children: [ - SizedBox( - height: height * 0.15, - child: DrawerHeader( - decoration: const BoxDecoration( - borderRadius: BorderRadius.all(Radius.circular(20)), - color: kOTTAAOrangeNew, - ), - child: Center( - child: Row( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - GestureDetector( - onTap: () => context.push(AppRoutes.onboarding, extra: 2), - child: Image.asset( - 'assets/profiles/Group $userAvatar@2x.png', - height: height * 0.05, - ), - ), - Image.asset( - AppImages.kWhiteLogoOttaa, - height: height * 0.05, - ), - ], - ), - ), - ), - ), - ListTile( - leading: const Icon(Icons.location_on), - title: Text('Ubicación'.trl), - onTap: () { - // Update the state of the app. - // ... - }, - ), - ListTile( - leading: const Icon(Icons.volume_up), //TODO*: Toggle between Icons.volume_up and Icons.volume_off - title: Text('mute'.trl), - onTap: () { - // Use tts provider to mute or unmute - }, - ), - const Divider(), - ListTile( - leading: const Icon(Icons.info_outline), - title: Text('about_ottaa'.trl), - onTap: () { - // Update the state of the app. - // ... - }, - ), - ListTile( - leading: const Icon(Icons.view_kanban_outlined), - title: Text('report'.trl), - onTap: () { - context.go(AppRoutes.report); - }, - ), - ListTile( - leading: const Icon(Icons.settings), - title: Text('configuration'.trl), - onTap: () { - // Update the state of the app. - // ... - }, - ), - ListTile( - leading: const Icon(Icons.info_outline), - title: Text('tutorial'.trl), - onTap: () { - // Update the state of the app. - // ... - }, - ), - const Divider(), - ListTile( - leading: const Icon(Icons.highlight_remove), - title: Text('close_application'.trl), - onTap: () { - // Update the state of the app. - // ... - }, - ), - ListTile( - leading: const Icon(Icons.exit_to_app), - title: Text('sign_out'.trl), - onTap: () async { - await LoadingModal.show(context, future: auth.logout); - context.go(AppRoutes.login); - }, - ), - ], - ), - ), - ); - } -} diff --git a/lib/presentation/screens/home/ui/home_grid.dart b/lib/presentation/screens/home/ui/home_grid.dart new file mode 100644 index 00000000..b60393d8 --- /dev/null +++ b/lib/presentation/screens/home/ui/home_grid.dart @@ -0,0 +1,229 @@ + +import 'package:auto_size_text/auto_size_text.dart'; +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:ottaa_project_flutter/application/common/app_images.dart'; +import 'package:ottaa_project_flutter/application/common/extensions/translate_string.dart'; +import 'package:ottaa_project_flutter/application/providers/home_provider.dart'; +import 'package:ottaa_project_flutter/core/enums/home_screen_status.dart'; +import 'package:ottaa_project_flutter/core/models/group_model.dart'; +import 'package:ottaa_project_flutter/core/models/picto_model.dart'; +import 'package:ottaa_project_flutter/presentation/screens/home/widgets/home_button.dart'; +import 'package:ottaa_ui_kit/theme.dart'; +import 'package:picto_widget/picto_widget.dart'; + +class HomeGridUI extends ConsumerStatefulWidget { + const HomeGridUI({super.key}); + + @override + ConsumerState createState() => _GroupsHomeUi(); +} + +class _GroupsHomeUi extends ConsumerState { + @override + Widget build(BuildContext context) { + final size = MediaQuery.of(context).size; + final colorScheme = Theme.of(context).colorScheme; + + final groups = ref.watch(homeProvider).groups.values.where((element) => !element.block).toList(); + + final addPictogram = ref.read(homeProvider.select((value) => value.addPictogram)); + + String? currentGroup = ref.watch(homeProvider).currentGridGroup; + + return Flex( + direction: Axis.vertical, + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + mainAxisSize: MainAxisSize.max, + children: [ + Padding( + padding: const EdgeInsets.only( + left: 24, + ), + child: Text( + (currentGroup == null + ? "home.grid.title".trl + : "home.grid.pictos".trlf({ + "group": ref.watch(homeProvider).groups[currentGroup]!.text, + })), + style: const TextStyle(fontWeight: FontWeight.bold), + ), + ), + Flexible( + fit: FlexFit.tight, + flex: 8, + child: Flex( + direction: Axis.horizontal, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Flexible( + fit: FlexFit.tight, + flex: 8, + child: currentGroup == null + ? GridView.builder( + gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 2, + crossAxisSpacing: 16, + mainAxisSpacing: 16, + childAspectRatio: 1, + mainAxisExtent: 96, + ), + controller: ref.watch(homeProvider.select((value) => value.gridScrollController)), + padding: const EdgeInsets.only(top: 16, bottom: 16, right: 32), + itemCount: groups.length, + itemBuilder: (ctx, index) { + Group group = groups[index]; + + return ElevatedButton( + style: ButtonStyle( + fixedSize: MaterialStateProperty.all(size), + backgroundColor: MaterialStateProperty.all(Colors.white), + foregroundColor: MaterialStateProperty.all(kBlackColor), + iconColor: MaterialStateProperty.all(colorScheme.secondary), + overlayColor: MaterialStateProperty.all(colorScheme.primary.withOpacity(0.1)), + shape: MaterialStateProperty.all( + const RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(16)), + ), + ), + // padding: MaterialStateProperty.all(const EdgeInsets.all(0)), + elevation: MaterialStateProperty.all(0), + ), + onPressed: () { + ref.read(homeProvider).currentGridGroup = group.id; + ref.read(homeProvider).notify(); + }, + child: Row( + children: [ + Padding( + padding: const EdgeInsets.all(8), + child: group.resource.network != null + ? CachedNetworkImage( + imageUrl: group.resource.network!, + fit: BoxFit.fill, + errorWidget: (context, url, error) => Image.asset( + fit: BoxFit.fill, + "assets/img/${group.text}.webp", + ), + ) + : Image.asset( + fit: BoxFit.fill, + "assets/img/${group.text}.webp", + ), + ), + Expanded( + child: Padding( + padding: const EdgeInsets.only(left: 16, right: 16, top: 16), + child: Align( + alignment: Alignment.topRight, + child: AutoSizeText( + group.text, + maxLines: 1, + ), + ), + ), + ), + ], + ), + ); + }, + ) + : GridView.builder( + gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 5, + childAspectRatio: 1, + mainAxisSpacing: 8, + ), + controller: ref.read(homeProvider.select((value) => value.gridScrollController)), + padding: const EdgeInsets.only(top: 16, bottom: 16), + itemCount: ref.watch(homeProvider.select((value) => value.pictograms.values.where((element) => !element.block && value.groups[currentGroup]!.relations.any((group) => group.id == element.id)).toList())).length, + itemBuilder: (ctx, index) { + Picto picto = ref.watch(homeProvider.select((value) => value.pictograms.values.where((element) => !element.block && value.groups[currentGroup]!.relations.any((group) => group.id == element.id)).toList()))[index]; + + return FittedBox( + fit: BoxFit.fitHeight, + child: PictoWidget( + onTap: () { + addPictogram(picto); + }, + colorNumber: picto.type, + image: picto.resource.network != null + ? CachedNetworkImage( + imageUrl: picto.resource.network!, + fit: BoxFit.fill, + errorWidget: (context, url, error) => Image.asset( + fit: BoxFit.fill, + "assets/img/${picto.text}.webp", + ), + ) + : Image.asset( + fit: BoxFit.fill, + "assets/img/${picto.text}.webp", + ), + text: picto.text, + width: 116, + height: 144, + ), + ); + }, + ), + ), + Flexible( + fit: FlexFit.loose, + flex: 1, + child: Flex( + direction: Axis.vertical, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.max, + children: [ + Expanded( + child: HomeButton( + onPressed: () { + final provider = ref.watch(homeProvider); + + provider.status = HomeScreenStatus.pictos; + provider.notify(); + }, + // size: const Size(40, 40), + child: Image.asset( + AppImages.kSearchOrange, + ), + ), + ), + const SizedBox(height: 16), + Expanded( + child: HomeButton( + // size: const Size(40, 40), + onPressed: groups.isEmpty ? null : () => ref.read(homeProvider.select((value) => value.scrollUp))(ref.read(homeProvider).gridScrollController, 96), + child: Icon( + Icons.keyboard_arrow_up, + color: groups.isEmpty ? colorScheme.primary.withOpacity(.12) : colorScheme.primary, + size: 30, + ), + ), + ), + const SizedBox(height: 16), + Expanded( + child: HomeButton( + // size: const Size(40, 40), + onPressed: groups.isEmpty ? null : () => ref.read(homeProvider.select((value) => value.scrollDown))(ref.read(homeProvider).gridScrollController, 96), + child: Icon( + Icons.keyboard_arrow_down, + color: groups.isEmpty ? colorScheme.primary.withOpacity(.12) : colorScheme.primary, + size: 30, + ), + ), + ), + ], + ), + ), + ], + ), + ) + ], + ); + } +} diff --git a/lib/presentation/screens/home/ui/home_tabs.dart b/lib/presentation/screens/home/ui/home_tabs.dart new file mode 100644 index 00000000..27b92f10 --- /dev/null +++ b/lib/presentation/screens/home/ui/home_tabs.dart @@ -0,0 +1,276 @@ + +import 'package:auto_size_text/auto_size_text.dart'; +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:ottaa_project_flutter/application/common/app_images.dart'; +import 'package:ottaa_project_flutter/application/providers/home_provider.dart'; +import 'package:ottaa_project_flutter/core/enums/home_screen_status.dart'; +import 'package:ottaa_project_flutter/core/models/group_model.dart'; +import 'package:ottaa_project_flutter/core/models/picto_model.dart'; +import 'package:ottaa_project_flutter/presentation/common/widgets/resource_image.dart'; +import 'package:ottaa_project_flutter/presentation/screens/home/widgets/home_button.dart'; +import 'package:ottaa_ui_kit/theme.dart'; +import 'package:picto_widget/picto_widget.dart'; + +class HomeTabsUI extends ConsumerStatefulWidget { + const HomeTabsUI({super.key}); + + @override + ConsumerState createState() => _GroupsHomeUi(); +} + +class _GroupsHomeUi extends ConsumerState { + @override + Widget build(BuildContext context) { + final size = MediaQuery.of(context).size; + final colorScheme = Theme.of(context).colorScheme; + + final groups = ref.watch(homeProvider).groups.values.where((element) => !element.block).toList(); + + final currentGroup = ref.watch(homeProvider).groups[ref.watch(homeProvider).currentTabGroup]; + + final pictos = ref.watch(homeProvider).pictograms.values.where((element) => !element.block && currentGroup!.relations.any((group) => group.id == element.id)).toList(); + + final addPictogram = ref.read(homeProvider.select((value) => value.addPictogram)); + + final translations = ref.watch(homeProvider.select((value) => value.pictosTranslations)); + + return Flex( + direction: Axis.vertical, + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + mainAxisSize: MainAxisSize.max, + children: [ + Flexible( + fit: FlexFit.loose, + flex: 2, + child: Flex( + direction: Axis.horizontal, + children: [ + const SizedBox(width: 24), + SizedBox( + width: 40, + height: 40, + child: HomeButton( + onPressed: groups.isEmpty + ? null + : () { + final controller = ref.read(homeProvider.select((value) => value.groupTabsScrollController)); + + double offset = (controller.offset - 168); + + if (offset < 0) { + offset = controller.position.maxScrollExtent; + } + + controller.animateTo( + offset, + duration: const Duration(milliseconds: 300), + curve: Curves.easeInOut, + ); + }, + child: const Icon( + Icons.keyboard_arrow_left, + size: 30, + ), + ), + ), + const SizedBox( + width: 16, + ), + Expanded( + child: SizedBox( + height: 48, + child: ListView.separated( + controller: ref.read(homeProvider.select((value) => value.groupTabsScrollController)), + scrollDirection: Axis.horizontal, + itemCount: groups.length, + separatorBuilder: (ctx, index) => const SizedBox( + width: 16, + ), + cacheExtent: 150, + itemBuilder: (ctx, index) { + Group group = groups.elementAt(index); + + bool isCurrent = ref.watch(homeProvider).currentTabGroup == group.id; + + return GestureDetector( + onTap: () { + ref.read(homeProvider.select((value) => value.setCurrentGroup)).call(group.id); + }, + child: Container( + decoration: BoxDecoration( + color: isCurrent ? kBlackColor : Colors.white, + borderRadius: BorderRadius.circular(9), + ), + height: 48, + width: 150, + padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + ClipRRect( + borderRadius: BorderRadius.circular(4), + child: ResourceImage( + image: group.resource, + width: 32, + height: 32, + ), + ), + const SizedBox(width: 8), + Expanded( + child: AutoSizeText( + group.text, + softWrap: true, + maxLines: 2, + minFontSize: 8, + style: TextStyle( + color: !isCurrent ? kBlackColor : Colors.white, + fontWeight: FontWeight.w500, + ), + ), + ), + ], + ), + ), + ); + }, + ), + ), + ), + const SizedBox(width: 16), + SizedBox( + width: 40, + height: 40, + child: HomeButton( + onPressed: groups.isEmpty + ? null + : () { + final controller = ref.read(homeProvider.select((value) => value.groupTabsScrollController)); + + double offset = controller.offset + 168; + if (offset > controller.position.maxScrollExtent) { + offset = 0; + } + + controller.animateTo( + offset, + duration: const Duration(milliseconds: 300), + curve: Curves.easeInOut, + ); + }, + child: const Icon( + Icons.keyboard_arrow_right, + size: 30, + ), + ), + ), + const SizedBox(width: 24), + ], + ), + ), + Flexible( + fit: FlexFit.tight, + flex: 8, + child: Flex( + direction: Axis.horizontal, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Flexible( + fit: FlexFit.tight, + flex: 8, + child: GridView.builder( + gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 4, + childAspectRatio: 1, + ), + controller: ref.read(homeProvider.select((value) => value.pictoTabsScrollController)), + padding: const EdgeInsets.only(top: 16, bottom: 16), + itemCount: pictos.length, + itemBuilder: (ctx, index) { + Picto picto = pictos[index]; + + return FittedBox( + fit: BoxFit.fitHeight, + child: PictoWidget( + onTap: () { + addPictogram(picto); + }, + colorNumber: picto.type, + image: picto.resource.network != null + ? CachedNetworkImage( + imageUrl: picto.resource.network!, + fit: BoxFit.fill, + errorWidget: (context, url, error) => Image.asset( + fit: BoxFit.fill, + "assets/img/${picto.text}.webp", + ), + ) + : Image.asset( + fit: BoxFit.fill, + "assets/img/${picto.text}.webp", + ), + text: translations[picto.id] ?? picto.text, + width: 116, + height: 144, + ), + ); + }, + ), + ), + Flexible( + fit: FlexFit.loose, + flex: 1, + child: Flex( + direction: Axis.vertical, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.max, + children: [ + Expanded( + child: HomeButton( + onPressed: () { + final provider = ref.watch(homeProvider); + + provider.status = HomeScreenStatus.pictos; + provider.notify(); + }, + child: Image.asset( + AppImages.kSearchOrange, + ), + ), + ), + const SizedBox(height: 16), + Expanded( + child: HomeButton( + onPressed: groups.isEmpty ? null : () => ref.read(homeProvider.select((value) => value.scrollUp))(ref.read(homeProvider).pictoTabsScrollController, 144), + child: Icon( + Icons.keyboard_arrow_up, + color: groups.isEmpty ? colorScheme.primary.withOpacity(.12) : colorScheme.primary, + size: 30, + ), + ), + ), + const SizedBox(height: 16), + Expanded( + child: HomeButton( + onPressed: groups.isEmpty ? null : () => ref.read(homeProvider.select((value) => value.scrollDown))(ref.read(homeProvider).pictoTabsScrollController, 144), + child: Icon( + Icons.keyboard_arrow_down, + color: groups.isEmpty ? colorScheme.primary.withOpacity(.12) : colorScheme.primary, + size: 30, + ), + ), + ), + ], + ), + ), + ], + ), + ) + ], + ); + } +} diff --git a/lib/presentation/screens/home/ui/pictos_bar.dart b/lib/presentation/screens/home/ui/pictos_bar.dart new file mode 100644 index 00000000..fed4ae5a --- /dev/null +++ b/lib/presentation/screens/home/ui/pictos_bar.dart @@ -0,0 +1,204 @@ +import 'dart:math'; + +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:ottaa_project_flutter/application/common/app_images.dart'; +import 'package:ottaa_project_flutter/application/providers/home_provider.dart'; +import 'package:ottaa_project_flutter/application/theme/app_theme.dart'; +import 'package:ottaa_project_flutter/core/models/picto_model.dart'; +import 'package:ottaa_project_flutter/presentation/screens/home/ui/shortcuts_ui.dart'; +import 'package:ottaa_project_flutter/presentation/screens/home/widgets/home_button.dart'; +import 'package:picto_widget/picto_widget.dart'; +import 'package:responsive_builder/responsive_builder.dart'; + +class PictosBarUI extends ConsumerStatefulWidget { + const PictosBarUI({super.key}); + + @override + ConsumerState createState() => _PictosBarState(); +} + +class _PictosBarState extends ConsumerState { + @override + Widget build(BuildContext context) { + final pictos = ref.watch(homeProvider).getPictograms(); + + final hasGroups = ref.watch(homeProvider).groups.isNotEmpty; + + final addPictogram = ref.read(homeProvider.select((value) => value.addPictogram)); + + return ResponsiveBuilder(builder: (context, sizingInformation) { + return Flex( + direction: Axis.vertical, + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Expanded( + flex: kIsWeb ? 8 : 2, + child: Flex( + direction: Axis.horizontal, + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const SizedBox(width: 30), + pictos.isEmpty + ? const Flexible( + fit: FlexFit.tight, + child: Center( + child: CircularProgressIndicator(), + ), + ) + : buildWidgets(pictos, addPictogram: addPictogram), + const SizedBox(width: 30), + Flexible( + fit: FlexFit.tight, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + HomeButton( + size: Size.fromHeight((!sizingInformation.isMobile) ? 125 : 64), + onPressed: pictos.isEmpty && !hasGroups + ? null + : () { + ref.watch(homeProvider).switchToPictograms(); + }, + child: Image.asset( + AppImages.kSearchOrange, + ), + ), + const SizedBox(height: 16), + HomeButton( + size: Size.fromHeight((!sizingInformation.isMobile) ? 125 : 64), + onPressed: pictos.isEmpty && !hasGroups + ? null + : () { + ref.read(homeProvider).refreshPictograms(); + }, + child: Image.asset( + AppImages.kRefreshOrange, + ), + ), + ], + ), + ), + const SizedBox(width: 10), + ], + ), + ), + const SizedBox(height: 30), + const Flexible( + flex: 1, + fit: FlexFit.loose, + child: Align( + alignment: Alignment.center, + child: ShortcutsUI(), + ), + ), + const SizedBox(height: 10), + ], + ); + }); + } + + Flexible buildWidgets( + List pictos, { + required void Function(Picto) addPictogram, + }) { + final size = MediaQuery.of(context).size; + + final maxWidth = max(size.width, size.height); + final maxHeight = min(size.width, size.height); + final translations = ref.watch(homeProvider.select((value) => value.pictosTranslations)); + + return Flexible( + flex: 5, + fit: FlexFit.loose, + child: GridView.builder( + itemCount: 4, + gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 4, crossAxisSpacing: 16, mainAxisSpacing: 16, childAspectRatio: 1), + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + itemBuilder: (context, index) { + final e = pictos[index]; + + switch (e.id) { + case "-777": + return FittedBox( + fit: BoxFit.cover, + child: Container( + width: 116, + height: 144, + padding: const EdgeInsets.all(8), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(9), + border: Border.all( + color: Colors.grey.withOpacity(.12), + width: 1, + ), + ), + child: const Center( + child: CircularProgressIndicator(), + )), + ); + case "777": + return FittedBox( + fit: BoxFit.cover, + child: GestureDetector( + onTap: () { + //TODO: add pictogram + }, + child: Container( + height: 119, + width: 96, + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(9), + border: Border.all( + color: Colors.grey.withOpacity(.12), + width: 1, + ), + ), + child: const Center( + child: Icon( + Icons.add, + size: 33, + color: kOTTAAOrange, + ), + ), + ), + ), + ); + default: + return FittedBox( + fit: BoxFit.cover, + child: PictoWidget( + onTap: () { + addPictogram(e); + }, + image: e.resource.network != null + ? CachedNetworkImage( + imageUrl: e.resource.network!, + fit: BoxFit.fill, + errorWidget: (context, url, error) => Image.asset( + fit: BoxFit.fill, + "assets/img/${e.text}.webp", + ), + ) + : Image.asset( + fit: BoxFit.fill, + "assets/img/${e.text}.webp", + ), + text: translations[e.id] ?? e.text, + colorNumber: e.type, + ), + ); + } + }, + ), + ); + } +} diff --git a/lib/presentation/screens/home/ui/shortcuts_ui.dart b/lib/presentation/screens/home/ui/shortcuts_ui.dart new file mode 100644 index 00000000..ffd61da1 --- /dev/null +++ b/lib/presentation/screens/home/ui/shortcuts_ui.dart @@ -0,0 +1,217 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:go_router/go_router.dart'; +import 'package:ottaa_project_flutter/application/common/app_images.dart'; +import 'package:ottaa_project_flutter/application/common/extensions/translate_string.dart'; +import 'package:ottaa_project_flutter/application/notifiers/patient_notifier.dart'; +import 'package:ottaa_project_flutter/application/providers/games_provider.dart'; +import 'package:ottaa_project_flutter/application/providers/home_provider.dart'; +import 'package:ottaa_project_flutter/application/router/app_routes.dart'; +import 'package:ottaa_project_flutter/core/models/patient_user_model.dart'; +import 'package:ottaa_project_flutter/core/models/shortcuts_model.dart'; +import 'package:ottaa_project_flutter/presentation/common/ui/loading_modal.dart'; +import 'package:ottaa_project_flutter/presentation/screens/home/widgets/home_button.dart'; +import 'package:responsive_builder/responsive_builder.dart'; + +class ShortcutsUI extends ConsumerStatefulWidget { + const ShortcutsUI({super.key}); + + @override + ConsumerState createState() => _ActionsBarState(); +} + +class _ActionsBarState extends ConsumerState { + Future showComingSoon() async { + await showDialog( + context: context, + builder: (context) => AlertDialog( + content: Text("global.comingsoon".trl), + ), + ); + } + + @override + Widget build(BuildContext context) { + final pictos = ref.watch(homeProvider.select((value) => value.suggestedPicts)); + final provider = ref.read(gameProvider); + + final homeProv = ref.read(homeProvider); + + PatientUserModel? patient = ref.watch(patientNotifier); + + final size = MediaQuery.of(context).size; + + int shorcutsCount = patient?.patientSettings.layout.shortcuts.toMap().values.where((element) => element).length ?? 7; + + double shortCutSize = ((size.width - (32 * shorcutsCount)) / shorcutsCount); + + ShortcutsModel shortcuts = patient?.patientSettings.layout.shortcuts ?? ShortcutsModel.all(); + + return ResponsiveBuilder(builder: (context, sizingInformation) { + double iconSize = (shortCutSize * .5).clamp(!sizingInformation.isMobile ? 80 : 30, !sizingInformation.isMobile ? 90 : 38); + return ConstrainedBox( + constraints: const BoxConstraints( + maxHeight: 100, + ), + child: Flex( + direction: Axis.horizontal, + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisSize: MainAxisSize.max, + children: [ + if (patient == null || shortcuts.games) + Flexible( + fit: FlexFit.loose, + child: HomeButton( + size: Size(shortCutSize, shortCutSize), + onPressed: () async { + await LoadingModal.show(context, future: ref.read(gameProvider).fetchPictograms); + + context.push(AppRoutes.patientGame); + }, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Image.asset( + AppImages.kBoardDiceIconSelected, + width: iconSize, + height: iconSize, + ), + ), + ), + ), + if (patient == null || shortcuts.history) + Flexible( + fit: FlexFit.loose, + child: HomeButton( + size: Size(shortCutSize, shortCutSize), + onPressed: pictos == null ? null : showComingSoon, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Image.asset( + AppImages.kBoardHistoryIconSelected, + width: iconSize, + height: iconSize, + ), + ), + ), + ), + if (patient == null || shortcuts.share) + Flexible( + fit: FlexFit.loose, + child: HomeButton( + size: Size(shortCutSize, shortCutSize), + onPressed: pictos == null ? null : showComingSoon, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Image.asset( + AppImages.kBoardShareIconSelected, + width: iconSize, + height: iconSize, + ), + ), + ), + ), + if (patient == null || shortcuts.camera) + Flexible( + fit: FlexFit.loose, + child: HomeButton( + size: Size(shortCutSize, shortCutSize), + onPressed: pictos == null ? null : showComingSoon, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Image.asset( + AppImages.kBoardCameraIconSelected, + width: iconSize, + height: iconSize, + ), + ), + ), + ), + if (patient == null || shortcuts.favs) + Flexible( + fit: FlexFit.loose, + child: HomeButton( + size: Size(shortCutSize, shortCutSize), + onPressed: pictos == null ? null : showComingSoon, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Image.asset( + AppImages.kBoardFavouriteIconSelected, + width: iconSize, + height: iconSize, + ), + ), + ), + ), + if (patient == null || shortcuts.yes) + Flexible( + fit: FlexFit.loose, + child: HomeButton( + size: Size(shortCutSize, shortCutSize), + onPressed: pictos == null + ? null + : () async { + showDialog( + context: context, + barrierDismissible: false, + builder: (context) { + return WillPopScope( + onWillPop: () async { + return false; + }, + child: const SizedBox(), + ); + }); + await homeProv.speakYes(); + context.pop(); + }, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Image.asset( + AppImages.kBoardYesIconSelected, + width: iconSize, + height: iconSize, + ), + ), + ), + ), + if (patient == null || shortcuts.no) + Flexible( + fit: FlexFit.loose, + child: HomeButton( + size: Size(shortCutSize, shortCutSize), + onPressed: pictos == null + ? null + : () async { + showDialog( + context: context, + barrierDismissible: false, + builder: (context) { + return WillPopScope( + onWillPop: () async { + return false; + }, + child: const SizedBox(), + ); + }, + ); + await homeProv.speakNo(); + + context.pop(); + }, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Image.asset( + AppImages.kBoardNoIconSelected, + width: iconSize, + height: iconSize, + ), + ), + ), + ), + ], + ), + ); + }); + } +} diff --git a/lib/presentation/screens/home/ui/talk_widget.dart b/lib/presentation/screens/home/ui/talk_widget.dart new file mode 100644 index 00000000..0dd1790a --- /dev/null +++ b/lib/presentation/screens/home/ui/talk_widget.dart @@ -0,0 +1,137 @@ +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:ottaa_project_flutter/application/notifiers/patient_notifier.dart'; +import 'package:ottaa_project_flutter/application/providers/home_provider.dart'; +import 'package:ottaa_project_flutter/core/models/picto_model.dart'; +import 'package:picto_widget/picto_widget.dart'; +import 'package:responsive_builder/responsive_builder.dart'; + +class TalkWidget extends ConsumerStatefulWidget { + const TalkWidget({super.key}); + + @override + ConsumerState createState() => _TalkWidgetState(); +} + +class _TalkWidgetState extends ConsumerState { + @override + Widget build(BuildContext context) { + final colorScheme = Theme.of(context).colorScheme; + final pictoWords = ref.watch(homeProvider).pictoWords; + final int? currentWord = ref.watch(homeProvider).selectedWord; + final patientNotifierState = ref.watch(patientNotifier); + final scrollCon = ref.watch(homeProvider).scrollController; + final translations = ref.watch(homeProvider.select((value) => value.pictosTranslations)); + + final size = MediaQuery.of(context).size; + + return ResponsiveBuilder( + builder: (context, sizingInformation) { + int pictosWord = ((size.width - (!sizingInformation.isMobile ? 500 : 200)) ~/ 64); + return SizedBox( + width: size.width, + height: !sizingInformation.isMobile ? 140 : 80, + child: Flex( + direction: Axis.horizontal, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + const SizedBox( + width: 20, + height: 80, + ), + const SizedBox(width: 32), + Flexible( + flex: 2, + child: GridView.builder( + clipBehavior: Clip.antiAlias, + scrollDirection: Axis.horizontal, + itemCount: pictoWords.length + pictosWord, + controller: scrollCon, + gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 1, + crossAxisSpacing: 16, + childAspectRatio: 4 / 3, + mainAxisSpacing: 16, + ), + itemBuilder: (context, index) { + Picto? pict = pictoWords.firstWhereIndexedOrNull((elIndex, element) => elIndex == index); + + if (pict == null) { + return FittedBox( + fit: BoxFit.scaleDown, + child: Container( + height: 119, + width: 96, + decoration: const BoxDecoration( + color: Colors.transparent, + ), + ), + ); + } + return PictoWidget( + width: 64, + height: 140, + onTap: () {}, + colorNumber: pict.type, + image: pict.resource.network != null + ? CachedNetworkImage( + imageUrl: pict.resource.network!, + fit: BoxFit.fill, + progressIndicatorBuilder: (context, url, progress) { + return Center( + child: CircularProgressIndicator( + color: colorScheme.primary, + value: progress.totalSize != null ? progress.downloaded / progress.totalSize! : null, + ), + ); + }, + errorWidget: (context, url, error) => Image.asset( + fit: BoxFit.fill, + "assets/img/${pict.text}.webp", + ), + ) + : Image.asset( + fit: BoxFit.fill, + "assets/img/${pict.text}.webp", + ), + text: translations[pict.id] ?? pict.text, + disable: (patientNotifierState != null ? patientNotifierState.patientSettings.layout.oneToOne : false) + ? index == currentWord + ? false + : true + : false, + ); + }, + ), + ), + const SizedBox(width: 16), + ConstrainedBox( + constraints: BoxConstraints( + maxWidth: !sizingInformation.isMobile ? 200 : 150, + ), + child: SizedBox( + height: !sizingInformation.isMobile ? 140 : 80, + child: Container(), + ), + ), + const SizedBox(width: 16), + ConstrainedBox( + constraints: BoxConstraints( + maxWidth: !sizingInformation.isMobile ? 200 : 150, + ), + child: SizedBox( + height: !sizingInformation.isMobile ? 140 : 80, + child: Container(), + ), + ), + const SizedBox(width: 24), + ], + ), + ); + }, + ); + } +} diff --git a/lib/presentation/screens/home/ui/word_bar.dart b/lib/presentation/screens/home/ui/word_bar.dart new file mode 100644 index 00000000..a30c4468 --- /dev/null +++ b/lib/presentation/screens/home/ui/word_bar.dart @@ -0,0 +1,252 @@ +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:go_router/go_router.dart'; +import 'package:ottaa_project_flutter/application/common/app_images.dart'; +import 'package:ottaa_project_flutter/application/providers/home_provider.dart'; +import 'package:ottaa_project_flutter/core/enums/home_screen_status.dart'; +import 'package:ottaa_project_flutter/core/models/picto_model.dart'; +import 'package:ottaa_project_flutter/presentation/screens/home/widgets/home_button.dart'; +import 'package:picto_widget/picto_widget.dart'; +import 'package:responsive_builder/responsive_builder.dart'; + +class WordBarUI extends ConsumerStatefulWidget { + const WordBarUI({super.key}); + + @override + ConsumerState createState() => _WordBarUIState(); +} + +class _WordBarUIState extends ConsumerState { + @override + void initState() { + super.initState(); + } + + Widget buildExitButton({required HomeScreenStatus status}) { + final provider = ref.watch(homeProvider); + final colorScheme = Theme.of(context).colorScheme; + switch (status) { + case HomeScreenStatus.pictos: + return Row( + children: [ + GestureDetector( + onTap: () { + provider.isExit = true; + provider.isLongClick = false; + provider.notify(); + }, + onLongPress: () { + if (provider.isExitLong) { + context.pop(); + } else { + provider.isExit = true; + provider.isLongClick = true; + provider.notify(); + } + }, + child: Container( + width: 20, + height: 80, + decoration: BoxDecoration( + color: colorScheme.primary, + borderRadius: const BorderRadius.only( + topRight: Radius.circular(16), + bottomRight: Radius.circular(16), + ), + ), + ), + ), + const SizedBox(width: 32), + ], + ); + case HomeScreenStatus.grid: + case HomeScreenStatus.tabs: + return Row( + children: [ + const SizedBox(width: 0), + SizedBox( + width: 40, + height: 40, + child: HomeButton( + onPressed: () { + if (status == HomeScreenStatus.tabs) { + ref.read(homeProvider).status = HomeScreenStatus.pictos; + } else { + ref.read(homeProvider).currentGridGroup != null ? ref.read(homeProvider).currentGridGroup = null : ref.read(homeProvider).status = HomeScreenStatus.pictos; + } + ref.read(homeProvider).notify(); + }, + size: const Size(40, 40), + child: const Icon(Icons.close_rounded), + ), + ), + const SizedBox(width: 12), + ], + ); + + default: + return const SizedBox.shrink(); + } + } + + @override + Widget build(BuildContext context) { + final colorScheme = Theme.of(context).colorScheme; + final pictoWords = ref.watch(homeProvider).pictoWords; + final translations = ref.watch(homeProvider.select((value) => value.pictosTranslations)); + final int? selectedWord = ref.watch(homeProvider).selectedWord; + final show = ref.watch(homeProvider).isSpeakWidget; + + final pictosIsEmpty = pictoWords.isEmpty; + final scrollCon = ref.watch(homeProvider).scrollController; + + final removeLastPictogram = ref.read(homeProvider.select((value) => value.removeLastPictogram)); + + final status = ref.watch(homeProvider.select((value) => value.status)); + final size = MediaQuery.of(context).size; + + return ResponsiveBuilder( + builder: (context, sizingInformation) { + int pictosWord = ((size.width - (!sizingInformation.isMobile ? 500 : 200)) ~/ 64); + + return SizedBox( + width: size.width, + height: !sizingInformation.isMobile ? 140 : 80, + child: Flex( + direction: Axis.horizontal, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + buildExitButton(status: status), + Flexible( + flex: 2, + child: Scrollbar( + controller: scrollCon, + child: GridView.builder( + scrollDirection: Axis.horizontal, + itemCount: pictoWords.length + pictosWord, + controller: scrollCon, + gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 1, + crossAxisSpacing: 16, + childAspectRatio: 4 / 3, + mainAxisSpacing: 16, + ), + itemBuilder: (context, index) { + Picto? pict = pictoWords.firstWhereIndexedOrNull((elIndex, element) => elIndex == index); + + if (pict == null) { + return FittedBox( + fit: BoxFit.scaleDown, + child: Container( + height: 119, + width: 96, + decoration: const BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.all(Radius.circular(10)), + ), + ), + ); + } + return PictoWidget( + width: 64, + height: 140, + onTap: () {}, + colorNumber: pict.type, + image: pict.resource.network != null + ? CachedNetworkImage( + imageUrl: pict.resource.network!, + fit: BoxFit.fill, + progressIndicatorBuilder: (context, url, progress) { + return Center( + child: CircularProgressIndicator( + color: colorScheme.primary, + value: progress.totalSize != null ? progress.downloaded / progress.totalSize! : null, + ), + ); + }, + errorWidget: (context, url, error) => Image.asset( + fit: BoxFit.fill, + "assets/img/${pict.text}.webp", + ), + ) + : Image.asset( + fit: BoxFit.fill, + "assets/img/${pict.text}.webp", + ), + text: translations[pict.id] ?? pict.text, + disable: show && selectedWord == index ? true : false, + ); + }, + ), + ), + ), + const SizedBox(width: 16), + ConstrainedBox( + constraints: BoxConstraints( + maxWidth: !sizingInformation.isMobile ? 200 : 150, + ), + child: SizedBox( + height: !sizingInformation.isMobile ? 140 : 80, + child: ElevatedButton( + style: ButtonStyle( + backgroundColor: MaterialStateProperty.all(pictosIsEmpty ? Colors.grey.withOpacity(.12) : Colors.white), + overlayColor: MaterialStateProperty.all(colorScheme.primary.withOpacity(0.1)), + shape: MaterialStateProperty.all( + const RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(9)), + ), + ), + padding: MaterialStateProperty.all(const EdgeInsets.all(0)), + elevation: MaterialStateProperty.all(0), + ), + onPressed: pictosIsEmpty ? null : removeLastPictogram, + child: Center( + child: Image.asset( + pictosIsEmpty ? AppImages.kDelete : AppImages.kDeleteOrange, + ), + ), + ), + ), + ), + const SizedBox(width: 16), + ConstrainedBox( + constraints: BoxConstraints( + maxWidth: !sizingInformation.isMobile ? 200 : 150, + ), + child: SizedBox( + height: !sizingInformation.isMobile ? 140 : 80, + child: ElevatedButton( + style: ButtonStyle( + backgroundColor: MaterialStateProperty.all(pictosIsEmpty ? colorScheme.primary.withOpacity(.12) : colorScheme.primary), + overlayColor: MaterialStateProperty.all(Colors.white.withOpacity(0.1)), + shape: MaterialStateProperty.all( + const RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(9)), + ), + ), + padding: MaterialStateProperty.all(const EdgeInsets.all(0)), + elevation: MaterialStateProperty.all(0), + ), + onPressed: () async { + await ref.read(homeProvider.notifier).speakSentence(); + }, + child: Center( + child: Image.asset( + AppImages.kOttaaMinimalist, + color: Colors.white, + ), + ), + ), + ), + ), + const SizedBox(width: 24), + ], + ), + ); + }, + ); + } +} diff --git a/lib/presentation/screens/home/widgets/home_button.dart b/lib/presentation/screens/home/widgets/home_button.dart new file mode 100644 index 00000000..5b1dad47 --- /dev/null +++ b/lib/presentation/screens/home/widgets/home_button.dart @@ -0,0 +1,57 @@ +import 'dart:math'; + +import 'package:flutter/material.dart'; + +class HomeButton extends StatelessWidget { + final VoidCallback? onPressed; + final Widget child; + final Size size; + + final ButtonStyle Function(ButtonStyle)? buildTheme; + + const HomeButton({ + super.key, + this.onPressed, + required this.child, + this.buildTheme, + this.size = const Size(125, 125), + }); + + @override + Widget build(BuildContext context) { + final colorScheme = Theme.of(context).colorScheme; + + bool disabled = onPressed == null; + + final defaultTheme = ButtonStyle( + // fixedSize: MaterialStateProperty.all(size), + // minimumSize: MaterialStateProperty.all(size), + // maximumSize: MaterialStateProperty.all(size), + + backgroundColor: MaterialStateProperty.all(disabled ? Colors.grey.withOpacity(.12) : Colors.white), + foregroundColor: MaterialStateProperty.all(disabled ? colorScheme.primary.withOpacity(.12) : colorScheme.primary), + iconColor: MaterialStateProperty.all(disabled ? colorScheme.primary.withOpacity(.12) : colorScheme.primary), + overlayColor: MaterialStateProperty.all(colorScheme.primary.withOpacity(0.1)), + shape: MaterialStateProperty.all( + const RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(9)), + ), + ), + padding: MaterialStateProperty.all(const EdgeInsets.all(0)), + elevation: MaterialStateProperty.all(0), + ); + + return SizedBox.square( + dimension: min(size.width, size.height), + child: ElevatedButton( + onPressed: onPressed, + style: buildTheme != null + ? buildTheme!( + defaultTheme, + ) + : defaultTheme, + child: child, + ), + ); + } +} diff --git a/lib/presentation/screens/home/widgets/home_mobile.dart b/lib/presentation/screens/home/widgets/home_mobile.dart new file mode 100644 index 00000000..f3746bf7 --- /dev/null +++ b/lib/presentation/screens/home/widgets/home_mobile.dart @@ -0,0 +1,113 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:ottaa_project_flutter/application/providers/home_provider.dart'; +import 'package:ottaa_project_flutter/core/abstracts/enums/size_types.dart'; +import 'package:ottaa_project_flutter/presentation/screens/home/ui/exit_widget.dart'; +import 'package:ottaa_project_flutter/presentation/screens/home/ui/talk_widget.dart'; +import 'package:ottaa_project_flutter/presentation/screens/home/ui/word_bar.dart'; + +class HomeMobileLayout extends ConsumerStatefulWidget { + final Widget child; + + const HomeMobileLayout({super.key, required this.child}); + + @override + ConsumerState createState() => _HomeMobileState(); +} + +class _HomeMobileState extends ConsumerState { + @override + Widget build(BuildContext context) { + final size = MediaQuery.of(context).size; + final colorScheme = Theme.of(context).colorScheme; + final textTheme = Theme.of(context).textTheme; + final provider = ref.watch(homeProvider); + return Stack( + fit: StackFit.expand, + children: [ + SizedBox.fromSize( + size: size, + child: Flex( + direction: Axis.vertical, + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + SizedBox( + width: size.width, + height: 111, + ), + widget.child, + ], + ), + ), + const Positioned( + top: 10, + child: WordBarUI(), + ), + if (provider.isSpeakWidget) ...[ + Container( + decoration: const BoxDecoration( + color: Colors.black54, + ), + ), + const Positioned( + top: 10, + child: TalkWidget(), + ), + provider.patientState.user.patientSettings.tts.subtitlesSetting.show + ? Positioned( + bottom: 40, + left: 0, + right: 0, + child: Center( + child: Container( + padding: const EdgeInsets.symmetric(vertical: 24, horizontal: 32), + decoration: BoxDecoration( + color: colorScheme.primary, + borderRadius: BorderRadius.circular(32), + ), + child: Text( + provider.patientState.user.patientSettings.tts.subtitlesSetting.caps ? provider.subtitleText.toUpperCase() : provider.subtitleText, + style: provider.patientState.user.patientSettings.tts.subtitlesSetting.size.name == SizeTypes.small.name + ? textTheme.bodySmall!.copyWith(fontWeight: FontWeight.w700, color: Colors.white, fontSize: 14) + : provider.patientState.user.patientSettings.tts.subtitlesSetting.size.name == SizeTypes.mid.name + ? textTheme.bodyMedium!.copyWith(fontWeight: FontWeight.w700, color: Colors.white, fontSize: 20) + : textTheme.bodyLarge!.copyWith(fontWeight: FontWeight.w700, color: Colors.white, fontSize: 26), + maxLines: 2, + textAlign: TextAlign.center, + ), + ), + ), + ) + : const SizedBox.shrink(), + ], + if (provider.isExit) ...[ + Container( + decoration: const BoxDecoration( + color: Colors.black54, + ), + ), + Center( + child: ExitWidget(isLongClick: provider.isLongClick), + ), + provider.isLongClick + ? Positioned( + top: 10, + child: Container( + width: 20, + height: 80, + decoration: BoxDecoration( + color: colorScheme.primary, + borderRadius: const BorderRadius.only( + topRight: Radius.circular(16), + bottomRight: Radius.circular(16), + ), + ), + ), + ) + : const SizedBox.shrink(), + ], + ], + ); + } +} diff --git a/lib/presentation/screens/home/widgets/home_tablet.dart b/lib/presentation/screens/home/widgets/home_tablet.dart new file mode 100644 index 00000000..6589def5 --- /dev/null +++ b/lib/presentation/screens/home/widgets/home_tablet.dart @@ -0,0 +1,113 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:ottaa_project_flutter/application/providers/home_provider.dart'; +import 'package:ottaa_project_flutter/core/enums/size_types.dart'; +import 'package:ottaa_project_flutter/presentation/screens/home/ui/exit_widget.dart'; +import 'package:ottaa_project_flutter/presentation/screens/home/ui/talk_widget.dart'; +import 'package:ottaa_project_flutter/presentation/screens/home/ui/word_bar.dart'; + +class HomeTabletLayout extends ConsumerStatefulWidget { + final Widget child; + + const HomeTabletLayout({super.key, required this.child}); + + @override + ConsumerState createState() => _HomeTabletState(); +} + +class _HomeTabletState extends ConsumerState { + @override + Widget build(BuildContext context) { + final size = MediaQuery.of(context).size; + final provider = ref.watch(homeProvider); + final colorScheme = Theme.of(context).colorScheme; + final textTheme = Theme.of(context).textTheme; + return Stack( + fit: StackFit.expand, + children: [ + SizedBox.fromSize( + size: size, + child: Flex( + direction: Axis.vertical, + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + SizedBox( + width: size.width, + height: 170, + ), + widget.child, + ], + ), + ), + const Positioned( + top: 10, + child: WordBarUI(), + ), + if (provider.isSpeakWidget) ...[ + Container( + decoration: const BoxDecoration( + color: Colors.black54, + ), + ), + const Positioned( + top: 10, + child: TalkWidget(), + ), + provider.patientState.user.patientSettings.tts.subtitlesSetting.show + ? Positioned( + bottom: 40, + left: 0, + right: 0, + child: Center( + child: Container( + padding: const EdgeInsets.symmetric(vertical: 24, horizontal: 32), + decoration: BoxDecoration( + color: colorScheme.primary, + borderRadius: BorderRadius.circular(32), + ), + child: Text( + provider.patientState.user.patientSettings.tts.subtitlesSetting.caps ? provider.subtitleText.toUpperCase() : provider.subtitleText, + style: provider.patientState.user.patientSettings.tts.subtitlesSetting.size.name == SizeTypes.small.name + ? textTheme.bodySmall!.copyWith(fontWeight: FontWeight.w700, color: Colors.white, fontSize: 14) + : provider.patientState.user.patientSettings.tts.subtitlesSetting.size.name == SizeTypes.mid.name + ? textTheme.bodyMedium!.copyWith(fontWeight: FontWeight.w700, color: Colors.white, fontSize: 20) + : textTheme.bodyLarge!.copyWith(fontWeight: FontWeight.w700, color: Colors.white, fontSize: 26), + maxLines: 2, + textAlign: TextAlign.center, + ), + ), + ), + ) + : const SizedBox.shrink(), + ], + if (provider.isExit) ...[ + Container( + decoration: const BoxDecoration( + color: Colors.black54, + ), + ), + Center( + child: ExitWidget(isLongClick: provider.isLongClick), + ), + provider.isLongClick + ? Positioned( + top: 10, + child: Container( + width: 20, + height: 80, + decoration: BoxDecoration( + color: colorScheme.primary, + borderRadius: const BorderRadius.only( + topRight: Radius.circular(16), + bottomRight: Radius.circular(16), + ), + ), + ), + ) + : const SizedBox.shrink(), + ], + ], + ); + } +} diff --git a/lib/presentation/screens/link/link_mail_screen.dart b/lib/presentation/screens/link/link_mail_screen.dart new file mode 100644 index 00000000..f86782bc --- /dev/null +++ b/lib/presentation/screens/link/link_mail_screen.dart @@ -0,0 +1,104 @@ +import 'dart:developer'; + +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:go_router/go_router.dart'; +import 'package:ottaa_project_flutter/application/common/extensions/translate_string.dart'; +import 'package:ottaa_project_flutter/application/common/extensions/validator_string.dart'; +import 'package:ottaa_project_flutter/application/providers/link_provider.dart'; +import 'package:ottaa_project_flutter/application/router/app_routes.dart'; +import 'package:ottaa_project_flutter/presentation/common/ui/loading_modal.dart'; +import 'package:ottaa_ui_kit/widgets.dart'; + +class LinkMailScreen extends ConsumerStatefulWidget { + const LinkMailScreen({super.key}); + + @override + ConsumerState createState() => _LinkMailScreenState(); +} + +class _LinkMailScreenState extends ConsumerState { + @override + Widget build(BuildContext context) { + final size = MediaQuery.of(context).size; + final provider = ref.watch(linkProvider); + final textTheme = Theme.of(context).textTheme; + return Scaffold( + resizeToAvoidBottomInset: false, + appBar: OTTAAAppBar( + title: Text("global.back".trl), + ), + body: Center( + child: SizedBox( + width: size.width * 0.8, + height: size.height, + child: Flex( + direction: Axis.vertical, + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Text( + "profile.link.mail.title".trl, + textAlign: TextAlign.center, + style: textTheme.headline2, + ), + const SizedBox(height: 24), + Form( + key: provider.formKey, + child: OTTAATextInput( + labelText: "global.email".trl, + keyboardType: TextInputType.emailAddress, + controller: provider.emailController, + validator: (value) { + if (value != null && value.trim().isEmpty) { + return "profile.link.mail.input.required".trl; + } + + if (value != null && !value.isEmail) { + return "profile.link.mail.input.invalid".trl; + } + return null; + }, + ), + ), + const SizedBox(height: 32), + Text( + "profile.link.mail.contact".trl, + textAlign: TextAlign.center, + style: textTheme.bodyText2, + ), + const SizedBox(height: 16), + Text( + "profile.link.mail.warn".trl, + textAlign: TextAlign.center, + style: textTheme.bodyText2, + ), + const Spacer(), + PrimaryButton( + text: "global.send".trl, + onPressed: () async { + if (provider.formKey.currentState!.validate()) { + String? result; + await LoadingModal.show(context, future: () async { + result = await provider.sendEmail(); + }); + log(result ?? "ERROR"); + if (mounted) { + if (result != null) { + OTTAANotification.primary(context, + text: "profile.link.error.$result".trl); + } else { + context.push(AppRoutes.caregiverLinkToken); + } + } + } + }, + ), + const SizedBox(height: 48), + ], + ), + ), + ), + ); + } +} diff --git a/lib/presentation/screens/link/link_success_screen.dart b/lib/presentation/screens/link/link_success_screen.dart new file mode 100644 index 00000000..45807f3c --- /dev/null +++ b/lib/presentation/screens/link/link_success_screen.dart @@ -0,0 +1,92 @@ +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:intl/date_symbol_data_local.dart'; +import 'package:intl/intl.dart'; +import 'package:ottaa_project_flutter/application/common/extensions/translate_string.dart'; +import 'package:go_router/go_router.dart'; +import 'package:ottaa_project_flutter/application/providers/customise_provider.dart'; +import 'package:ottaa_project_flutter/application/providers/link_provider.dart'; +import 'package:ottaa_project_flutter/application/router/app_routes.dart'; +import 'package:ottaa_project_flutter/core/enums/customise_data_type.dart'; +import 'package:ottaa_ui_kit/theme.dart'; +import 'package:ottaa_ui_kit/widgets.dart'; + +class LinkSuccessScreen extends ConsumerStatefulWidget { + const LinkSuccessScreen({super.key}); + + @override + ConsumerState createState() => _LinkSuccessScreenState(); +} + +class _LinkSuccessScreenState extends ConsumerState { + @override + void initState() { + WidgetsBinding.instance.addPostFrameCallback((timeStamp) async { + ref.read(customiseProvider).userId = ref.read(linkProvider).userId!; + }); + super.initState(); + } + + @override + Widget build(BuildContext context) { + final size = MediaQuery.of(context).size; + final textTheme = Theme.of(context).textTheme; + + final provider = ref.watch(linkProvider); + + return Scaffold( + body: Column( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const Spacer(), + Text("profile.link.success.title".trl, style: textTheme.headline2), + const SizedBox(height: 16), + Center( + child: SizedBox( + width: 312, + child: ProfileCard( + title: provider.user!.settings.data.name, + subtitle: "profile.link.success.lastTime".trlf( + { + "date": DateFormat( + "dd/MM/yy HH:mm", + provider.user!.settings.language.language, + ).format(provider.user!.settings.data.lastConnection), + }, + ), + //TODO: Re do this u.u + leadingImage: CachedNetworkImageProvider(provider.user!.settings.data.avatar.network!), + actions: IconButton( + onPressed: () {}, + color: kBlackColor, + icon: const Icon( + Icons.keyboard_arrow_down, + color: kBlackColor, + ), + style: IconButton.styleFrom( + foregroundColor: kBlackColor, + ), + splashRadius: 10, + ), + )), + ), + const Spacer(), + SizedBox( + width: size.width * 0.8, + child: PrimaryButton( + onPressed: () { + final provider = ref.watch(customiseProvider); + provider.type = CustomiseDataType.defaultCase; + context.push(AppRoutes.userCustomize); + }, + text: "global.continue".trl, + ), + ), + const SizedBox(height: 48), + ], + ), + ); + } +} diff --git a/lib/presentation/screens/link/link_token_screen.dart b/lib/presentation/screens/link/link_token_screen.dart new file mode 100644 index 00000000..79d8ee74 --- /dev/null +++ b/lib/presentation/screens/link/link_token_screen.dart @@ -0,0 +1,76 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:ottaa_project_flutter/application/common/extensions/translate_string.dart'; +import 'package:ottaa_project_flutter/application/providers/link_provider.dart'; +import 'package:ottaa_project_flutter/presentation/common/ui/loading_modal.dart'; +import 'package:ottaa_project_flutter/presentation/screens/link/ui/otp_widget.dart'; +import 'package:ottaa_project_flutter/presentation/screens/link/ui/token_input.dart'; +import 'package:ottaa_ui_kit/theme.dart'; +import 'package:ottaa_ui_kit/widgets.dart'; + +class LinkTokenScreen extends ConsumerStatefulWidget { + const LinkTokenScreen({super.key}); + + @override + ConsumerState createState() => + _LinkTokenScreenState(); +} + +class _LinkTokenScreenState extends ConsumerState { + @override + Widget build(BuildContext context) { + final size = MediaQuery.of(context).size; + final reset = ref.read(linkProvider.select((value) => value.reset)); + + final sendEmail = ref.read(linkProvider.select((value) => value.sendEmail)); + + return Scaffold( + appBar: OTTAAAppBar( + title: Text("global.back".trl), + ), + resizeToAvoidBottomInset: false, + body: Center( + child: SizedBox( + width: size.width * 0.8, + height: size.height, + child: Flex( + direction: Axis.vertical, + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Text( + "profile.link.token.title".trl, + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.headline2, + ), + const SizedBox(height: 24), + const OTPWidget(), + const Spacer(), + Text( + "profile.link.token.problem".trl, + textAlign: TextAlign.center, + style: textTheme.bodyText2, + ), + const SizedBox(height: 16), + SecondaryButton( + onPressed: () { + LoadingModal.show(context, future: sendEmail); + }, + text: "profile.link.token.resend".trl, + ), + const SizedBox(height: 16), + SecondaryButton( + onPressed: () { + reset(); + Navigator.of(context).pop(); + }, + text: "profile.link.token.back".trl, + ), + const SizedBox(height: 48), + ], + ), + ), + ), + ); + } +} diff --git a/lib/presentation/screens/link/ui/otp_widget.dart b/lib/presentation/screens/link/ui/otp_widget.dart new file mode 100644 index 00000000..6a54fd1a --- /dev/null +++ b/lib/presentation/screens/link/ui/otp_widget.dart @@ -0,0 +1,70 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:go_router/go_router.dart'; +import 'package:ottaa_project_flutter/application/providers/link_provider.dart'; +import 'package:ottaa_project_flutter/application/router/app_routes.dart'; +import 'package:ottaa_project_flutter/presentation/common/ui/loading_modal.dart'; +import 'package:ottaa_project_flutter/presentation/screens/link/ui/token_input.dart'; +import 'package:ottaa_ui_kit/widgets.dart'; +import 'package:ottaa_project_flutter/application/common/extensions/translate_string.dart'; + +class OTPWidget extends ConsumerStatefulWidget { + const OTPWidget({super.key}); + + @override + ConsumerState createState() => _OTPWidgetState(); +} + +class _OTPWidgetState extends ConsumerState { + @override + Widget build(BuildContext context) { + final provider = ref.watch(linkProvider); + final size = MediaQuery.of(context).size; + + return Form( + key: provider.codeFormKey, + child: SizedBox( + height: 100, + width: size.width * 0.8, + child: Flex( + direction: Axis.horizontal, + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: List.generate(7, (index) { + if (index % 2 != 0) { + return const Spacer(); + } + + final tokenId = index ~/ 2; + + return Expanded( + flex: 3, + child: TokenInput( + tokenId: tokenId, + controller: provider.controllers[tokenId], + node: provider.focusNodes[tokenId], + onChanged: (_, value) async { + provider.tokenChanged(tokenId, value); + bool isCode = provider.isValidCode(); + if (isCode) { + bool isValid = false; + await LoadingModal.show(context, future: () async { + isValid = await provider.validateCode() == null; + }); + + if (!isValid) { + OTTAANotification.secondary(context, + text: "profile.link.token.invalid".trl); + return; + } + context.push(AppRoutes.caregiverLinkSuccess); + } + }, + ), + ); + }), + ), + ), + ); + } +} diff --git a/lib/presentation/screens/link/ui/token_input.dart b/lib/presentation/screens/link/ui/token_input.dart new file mode 100644 index 00000000..5214bddc --- /dev/null +++ b/lib/presentation/screens/link/ui/token_input.dart @@ -0,0 +1,33 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; + +class TokenInput extends StatelessWidget { + final TextEditingController controller; + final FocusNode? node; + final int tokenId; + final void Function(int id, String value)? onChanged; + + const TokenInput( + {super.key, + required this.tokenId, + required this.controller, + this.node, + this.onChanged}); + + @override + Widget build(BuildContext context) { + return TextField( + controller: controller, + focusNode: node, + style: const TextStyle( + fontSize: 40, + ), + onChanged: (value) => onChanged?.call(tokenId, value), + textAlign: TextAlign.center, + keyboardType: TextInputType.number, + inputFormatters: [ + FilteringTextInputFormatter.digitsOnly, + ], + ); + } +} diff --git a/lib/presentation/screens/login/login_screen.dart b/lib/presentation/screens/login/login_screen.dart index a29f1a0b..50f1f176 100644 --- a/lib/presentation/screens/login/login_screen.dart +++ b/lib/presentation/screens/login/login_screen.dart @@ -1,72 +1,117 @@ +import 'dart:io'; import 'dart:math'; +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:ottaa_project_flutter/application/common/app_images.dart'; import 'package:ottaa_project_flutter/application/common/extensions/translate_string.dart'; -import 'package:ottaa_project_flutter/application/theme/app_theme.dart'; +import 'package:ottaa_project_flutter/application/common/screen_helpers.dart'; import 'package:ottaa_project_flutter/core/enums/sign_in_types.dart'; +import 'package:ottaa_project_flutter/presentation/screens/login/ui/apple_sign_button.dart'; import 'package:ottaa_project_flutter/presentation/screens/login/ui/sign_in_button.dart'; +import 'package:responsive_builder/responsive_builder.dart'; -class LoginScreen extends StatelessWidget { +class LoginScreen extends StatefulWidget { const LoginScreen({super.key}); + @override + State createState() => _LoginScreenState(); +} + +class _LoginScreenState extends State { + @override + void initState() { + WidgetsBinding.instance.addPostFrameCallback((timeStamp) async { + DeviceScreenType deviceScreenType = getDeviceType(MediaQuery.of(context).size); + if (deviceScreenType == DeviceScreenType.tablet) { + await blockLandscapeMode(); + } else { + await unblockRotation(); + } + setState(() {}); + }); + super.initState(); + } + @override Widget build(BuildContext context) { final size = MediaQuery.of(context).size; - final maxEdge = max(size.width, size.height); + final textTheme = Theme.of(context).textTheme; - return Scaffold( - backgroundColor: const Color(0xffececec), - extendBody: true, - body: SizedBox.fromSize( - size: size, - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisSize: MainAxisSize.max, - children: [ - SizedBox( - width: maxEdge * 0.4, - child: Image.asset( - AppImages.kLogoOttaa, - fit: BoxFit.fitWidth, - ), - ), - const SizedBox(height: 20), - Padding( - padding: EdgeInsets.symmetric(horizontal: maxEdge * 0.2), - child: Text( - 'login_screen'.trl, - textAlign: TextAlign.center, - style: Theme.of(context).textTheme.subtitle1, - ), - ), - const SizedBox(height: 20), - SizedBox( - width: maxEdge * 0.4, - child: SignInButton( - type: SignInType.google, - text: "Login_with_google".trl, - logo: AppImages.kGoogleIcon, - ), - ), - const SizedBox(height: 20), - SizedBox( - width: maxEdge * 0.4, - child: SignInButton( - style: ElevatedButton.styleFrom( - backgroundColor: kFacebookColor, - fixedSize: const Size.fromHeight(50), + return LayoutBuilder(builder: (context, constraints) { + final maxEdge = max(size.width, size.height); + + return Scaffold( + body: Center( + child: SizedBox.fromSize( + size: size, + child: Stack( + children: [ + Positioned( + right: -maxEdge * 0.2, + top: -maxEdge * 0.05, + width: maxEdge / 2, + height: maxEdge / 2, + child: Image.asset( + AppImages.kOttaaTablet, + width: maxEdge / 2, + height: maxEdge / 2, + fit: BoxFit.fitWidth, + ), + ), + Center( + child: ConstrainedBox( + constraints: BoxConstraints( + maxWidth: getDeviceType(MediaQuery.of(context).size) != DeviceScreenType.mobile ? (constraints.maxWidth * 0.4).clamp(200, 800) : maxEdge, + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + "login.title".trl, + style: textTheme.displayMedium, + ), + const SizedBox(height: 20), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 24), + child: SignInButton( + text: "login.google".trl, + logo: AppImages.kGoogleIcon, + type: SignInType.google, + ), + ), + if (defaultTargetPlatform == TargetPlatform.iOS) const AppleSignButton() else const SizedBox.shrink(), + ], + ), + ), ), - type: SignInType.facebook, - text: "Login_with_facebook".trl, - logo: AppImages.kFacebookIcon, - ), + // Align( + // alignment: Alignment.bottomCenter, + // child: TextButton( + // onPressed: () {}, + // style: TextButton.styleFrom( + // padding: const EdgeInsets.symmetric( + // horizontal: 24, + // vertical: 16, + // ), + // foregroundColor: kBlackColor, + // ), + // child: Text( + // "login.register".trl, + // textAlign: TextAlign.center, + // style: textTheme.bodyText1?.copyWith( + // fontWeight: FontWeight.w600, + // ), + // ), + // ), + // ) + ], ), - ], + ), ), - ), - ); + ); + }); } } diff --git a/lib/presentation/screens/login/ui/apple_sign_button.dart b/lib/presentation/screens/login/ui/apple_sign_button.dart new file mode 100644 index 00000000..e4cfc490 --- /dev/null +++ b/lib/presentation/screens/login/ui/apple_sign_button.dart @@ -0,0 +1,66 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:go_router/go_router.dart'; +import 'package:ottaa_project_flutter/application/common/extensions/translate_string.dart'; +import 'package:ottaa_project_flutter/application/providers/auth_provider.dart'; +import 'package:ottaa_project_flutter/application/router/app_routes.dart'; +import 'package:ottaa_project_flutter/core/enums/sign_in_types.dart'; +import 'package:ottaa_ui_kit/widgets.dart'; +import 'package:url_launcher/url_launcher.dart'; +import 'package:sign_in_with_apple/sign_in_with_apple.dart'; + +class AppleSignButton extends ConsumerWidget { + const AppleSignButton({super.key}); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final textTheme = Theme.of(context).textTheme; + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 16), + child: SignInWithAppleButton( + text: "login.apple".trl, + style: SignInWithAppleButtonStyle.whiteOutlined, + onPressed: () async { + final BuildContext localContext = context; + final auth = ref.watch(authProvider); + final result = await auth.signIn(SignInType.apple); + + if (result.isLeft) { + // ignore: use_build_context_synchronously + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text(result.left), + ), + ); + } + + if (result.isRight) { + // ignore: use_build_context_synchronously + await BasicBottomSheet.show( + localContext, + children: [ + GestureDetector( + onTap: () async { + await launchUrl( + mode: LaunchMode.externalApplication, + Uri.parse("https://ottaa-project.github.io/docs/Community/privacypolicy/"), + ); + }, + child: Text( + "terms.text".trl, + textAlign: TextAlign.center, + style: textTheme.bodyText2!, + ), + ) + ], + okButtonText: "terms.button".trl, + ); + + // ignore: use_build_context_synchronously + localContext.go(AppRoutes.loginWait); + } + }, + ), + ); + } +} diff --git a/lib/presentation/screens/login/ui/sign_in_button.dart b/lib/presentation/screens/login/ui/sign_in_button.dart index 735f8e1b..5b9f969b 100644 --- a/lib/presentation/screens/login/ui/sign_in_button.dart +++ b/lib/presentation/screens/login/ui/sign_in_button.dart @@ -1,61 +1,118 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:go_router/go_router.dart'; +import 'package:ottaa_project_flutter/application/common/extensions/translate_string.dart'; import 'package:ottaa_project_flutter/application/notifiers/loading_notifier.dart'; import 'package:ottaa_project_flutter/application/providers/auth_provider.dart'; import 'package:ottaa_project_flutter/application/router/app_routes.dart'; import 'package:ottaa_project_flutter/core/enums/sign_in_types.dart'; import 'package:ottaa_project_flutter/presentation/common/ui/jumping_dots.dart'; +import 'package:ottaa_ui_kit/theme.dart'; +import 'package:ottaa_ui_kit/widgets.dart'; +import 'package:url_launcher/url_launcher.dart'; class SignInButton extends ConsumerWidget { final SignInType type; final String text, logo; final ButtonStyle? style; + final bool enabled; - const SignInButton({super.key, required this.type, required this.text, required this.logo, this.style}); + const SignInButton({ + super.key, + required this.type, + required this.text, + required this.logo, + this.style, + this.enabled = true, + }); @override Widget build(BuildContext context, WidgetRef ref) { final loading = ref.watch(loadingProvider); final auth = ref.watch(authProvider); + final colorSchema = Theme.of(context).colorScheme; + final textTheme = Theme.of(context).textTheme; + return ElevatedButton( style: style ?? ElevatedButton.styleFrom( - fixedSize: const Size.fromHeight(50), + fixedSize: const Size.fromHeight(48), + backgroundColor: kWhiteColor, + elevation: 0, + shadowColor: Colors.transparent, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(16), + side: const BorderSide( + color: Colors.grey, + width: 1, + ), + ), + foregroundColor: Colors.grey, ), - onPressed: () async { - final result = await auth.signIn(type); + onPressed: enabled + ? () async { + final BuildContext localContext = context; - if (result.isLeft) { - // ignore: use_build_context_synchronously - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text(result.left), - ), - ); - } - // ignore: use_build_context_synchronously - context.go(AppRoutes.splash); - }, + final result = await auth.signIn(type); + + if (result.isLeft) { + // ignore: use_build_context_synchronously + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text(result.left), + ), + ); + } + + if (result.isRight) { + // ignore: use_build_context_synchronously + await BasicBottomSheet.show( + localContext, + children: [ + GestureDetector( + onTap: () async { + await launchUrl( + mode: LaunchMode.externalApplication, + Uri.parse("https://ottaa-project.github.io/docs/Community/privacypolicy/"), + ); + }, + child: Text( + "terms.text".trl, + textAlign: TextAlign.center, + style: textTheme.bodyText2!, + ), + ) + ], + okButtonText: "terms.button".trl, + ); + + // ignore: use_build_context_synchronously + localContext.go(AppRoutes.loginWait); + } + } + : null, child: Flex( direction: Axis.horizontal, crossAxisAlignment: CrossAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center, children: loading ? [ - const Expanded( - child: JumpingDotsProgressIndicator(), + Expanded( + child: JumpingDotsProgressIndicator( + dotColor: colorSchema.primary, + ), ), ] : [ - Expanded( + Flexible( flex: 1, child: Image.asset(logo, height: 20), ), - Expanded( + const SizedBox(width: 10), + Flexible( flex: 2, - child: Text(text), + child: Text(text, style: textTheme.headline3), ) ], ), diff --git a/lib/presentation/screens/onboarding/onboarding_screen.dart b/lib/presentation/screens/onboarding/onboarding_screen.dart index 798cea0a..b1970b09 100644 --- a/lib/presentation/screens/onboarding/onboarding_screen.dart +++ b/lib/presentation/screens/onboarding/onboarding_screen.dart @@ -1,47 +1,189 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:go_router/go_router.dart'; +import 'package:ottaa_project_flutter/application/common/app_images.dart'; +import 'package:ottaa_project_flutter/application/common/extensions/translate_string.dart'; +import 'package:ottaa_project_flutter/application/common/screen_helpers.dart'; +import 'package:ottaa_project_flutter/application/providers/auth_provider.dart'; import 'package:ottaa_project_flutter/application/providers/onboarding_provider.dart'; -import 'package:ottaa_project_flutter/presentation/screens/onboarding/ui/tutorial_step.dart'; -import 'package:ottaa_project_flutter/presentation/screens/onboarding/ui/user_avatar_selector_step.dart'; -import 'package:ottaa_project_flutter/presentation/screens/onboarding/ui/user_info_step.dart'; +import 'package:ottaa_project_flutter/application/providers/splash_provider.dart'; +import 'package:ottaa_project_flutter/application/router/app_routes.dart'; +import 'package:ottaa_project_flutter/presentation/screens/onboarding/ui/onboarding_layout.dart'; +import 'package:ottaa_project_flutter/presentation/screens/onboarding/ui/onboarding_page_indicator.dart'; +import 'package:ottaa_ui_kit/widgets.dart'; +import 'package:responsive_builder/responsive_builder.dart'; class OnBoardingScreen extends ConsumerStatefulWidget { final int defaultIndex; const OnBoardingScreen({super.key, this.defaultIndex = 0}); + @override ConsumerState createState() => _OnBoardingScreenState(); } class _OnBoardingScreenState extends ConsumerState { + bool isLogged = false; + @override void initState() { super.initState(); - WidgetsBinding.instance.addPostFrameCallback((timeStamp) { - final provider = ref.read(onBoardingProvider); - provider.goToPage(widget.defaultIndex); + WidgetsBinding.instance.addPostFrameCallback((timeStamp) async { + ref.read(onBoardingProvider.select((value) => value.goToPage))(widget.defaultIndex); + isLogged = await ref.read(authProvider.select((value) => value.isUserLoggedIn())); + DeviceScreenType deviceScreenType = getDeviceType(MediaQuery.of(context).size); + if (deviceScreenType != DeviceScreenType.mobile) { + await blockLandscapeMode(); + } else { + await unblockRotation(); + } + setState(() {}); }); } + @override + void dispose() { + super.dispose(); + } + @override Widget build(BuildContext context) { - final provider = ref.watch(onBoardingProvider); - - return Scaffold( - resizeToAvoidBottomInset: false, - body: SafeArea( - top: false, - child: PageView( - physics: const NeverScrollableScrollPhysics(), - scrollDirection: Axis.horizontal, - controller: provider.controller, - children: const [ - UserInfoStep(), - TutorialStep(), - UserAvatarSelectorStep(), - ], - ), - ), + final provider = ref.read(onBoardingProvider); + final spProvider = ref.read(splashProvider); + + final currentIndex = ref.watch(onBoardingProvider.select((value) => value.currentIndex)); + + return LayoutBuilder( + key: const Key("onboarding_layout_builder"), + builder: (context, constraints) { + bool isMedium = constraints.maxWidth > 800; + + return Scaffold( + appBar: OTTAAAppBar( + leading: (currentIndex) > 0 + ? TextButton.icon( + onPressed: provider.previousPage, + icon: const Icon( + Icons.arrow_back_ios, + ), + label: Text("global.back".trl), + style: TextButton.styleFrom(foregroundColor: Colors.grey), + ) + : null, + actions: [ + if ((currentIndex) < 2) + TextButton( + onPressed: () async { + final bool? skip = await BasicBottomSheet.show( + context, + title: "onboarding.skip.title".trl, + okButtonText: "global.yes".trl, + cancelButtonText: "global.no".trl, + cancelButtonEnabled: true, + ); + + if (skip != null && skip) { + if (mounted) { + await spProvider.setFirstTime(); + context.go(isLogged ? AppRoutes.userProfileRole : AppRoutes.login); + } + } + }, + style: TextButton.styleFrom(foregroundColor: Colors.grey), + child: Text("global.skip".trl), + ), + ], + ), + resizeToAvoidBottomInset: false, + body: Center( + child: SafeArea( + top: true, + left: true, + right: true, + child: SizedBox.fromSize( + size: isMedium ? Size(constraints.maxHeight / 2, constraints.maxHeight) : Size(constraints.maxWidth, constraints.maxHeight), + child: Flex( + direction: Axis.vertical, + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.end, + mainAxisSize: MainAxisSize.min, + children: [ + Flexible( + fit: FlexFit.tight, + flex: 10, + child: PageView( + physics: const NeverScrollableScrollPhysics(), + scrollDirection: Axis.horizontal, + controller: provider.controller, + children: [ + OnboardingLayout( + title: "onboarding.profile.title".trl, + subtitle: "onboarding.profile.subtitle".trl, + description: "onboarding.profile.description".trl, + image: AppImages.kOnboardingFirstScreen, + ), + OnboardingLayout( + title: "onboarding.home.title".trl, + subtitle: "onboarding.home.subtitle".trl, + description: "onboarding.home.description".trl, + image: AppImages.kOnboardingSecondScreen, + ), + OnboardingLayout( + title: "onboarding.customize.title".trl, + subtitle: "onboarding.customize.subtitle".trl, + description: "onboarding.customize.description".trl, + image: AppImages.kOnboardingThirdScreen, + ) + ], + ), + ), + const SizedBox( + height: 16, + ), + Flexible( + flex: 1, + fit: FlexFit.loose, + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.center, + mainAxisSize: MainAxisSize.max, + children: [ + OnboardinPageIndicator(active: currentIndex == 0), + OnboardinPageIndicator(active: currentIndex == 1), + OnboardinPageIndicator(active: currentIndex == 2), + ], + ), + ), + const SizedBox( + height: 30, + ), + Flexible( + flex: 1, + fit: FlexFit.loose, + child: Center( + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 24), + child: PrimaryButton( + onPressed: () async { + if (currentIndex == 2) { + await spProvider.setFirstTime(); + context.go(isLogged ? AppRoutes.home : AppRoutes.login); + return; + } + provider.nextPage(); + }, + text: currentIndex == 2 ? "onboarding.start".trl : "global.next".trl, + ), + ), + ), + ) + ], + ), + ), + ), + ), + ); + }, ); } } diff --git a/lib/presentation/screens/onboarding/ui/onboarding_layout.dart b/lib/presentation/screens/onboarding/ui/onboarding_layout.dart new file mode 100644 index 00000000..e28666ec --- /dev/null +++ b/lib/presentation/screens/onboarding/ui/onboarding_layout.dart @@ -0,0 +1,91 @@ +import 'package:auto_size_text/auto_size_text.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; + +class OnboardingLayout extends ConsumerStatefulWidget { + final String title; + final String subtitle; + + final String description; + + final String image; + + const OnboardingLayout({super.key, required this.title, required this.subtitle, required this.description, required this.image}); + + @override + ConsumerState createState() => _UserInfoStepState(); +} + +class _UserInfoStepState extends ConsumerState with AutomaticKeepAliveClientMixin { + @override + Widget build(BuildContext context) { + super.build(context); + + final size = MediaQuery.of(context).size; + + final textTheme = Theme.of(context).textTheme; + final colorScheme = Theme.of(context).colorScheme; + + return SizedBox.fromSize( + size: size, + child: Flex( + direction: Axis.vertical, + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Flexible( + flex: 1, + fit: FlexFit.loose, + child: Text( + widget.title, + style: textTheme.headline3, + ), + ), + const SizedBox(height: 20), + Flexible( + flex: 1, + fit: FlexFit.loose, + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 24), + child: Text( + widget.subtitle, + textAlign: TextAlign.center, + overflow: TextOverflow.visible, + style: textTheme.headline1?.copyWith( + color: colorScheme.primary, + ), + ), + ), + ), + const SizedBox(height: 20), + Flexible( + fit: FlexFit.tight, + flex: 10, + child: Image.asset( + widget.image, + width: size.width, + fit: BoxFit.fitWidth, + ), + ), + const SizedBox(height: 30), + Flexible( + flex: 2, + fit: FlexFit.loose, + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 24), + child: AutoSizeText( + widget.description, + textAlign: TextAlign.center, + style: textTheme.headline3, + overflow: TextOverflow.visible, + ), + ), + ), + ], + ), + ); + } + + @override + bool get wantKeepAlive => true; +} diff --git a/lib/presentation/screens/onboarding/ui/onboarding_page_indicator.dart b/lib/presentation/screens/onboarding/ui/onboarding_page_indicator.dart new file mode 100644 index 00000000..57863555 --- /dev/null +++ b/lib/presentation/screens/onboarding/ui/onboarding_page_indicator.dart @@ -0,0 +1,28 @@ +import 'package:flutter/material.dart'; + +class OnboardinPageIndicator extends StatelessWidget { + final bool active; + + const OnboardinPageIndicator({super.key, this.active = false}); + + @override + Widget build(BuildContext context) { + final colorSchema = Theme.of(context).colorScheme; + return AnimatedContainer( + duration: const Duration(milliseconds: 300), + margin: const EdgeInsets.symmetric(horizontal: 5), + height: 8, + width: active ? 40 : 8, + decoration: BoxDecoration( + color: active ? colorSchema.primary : colorSchema.background, + borderRadius: BorderRadius.circular( + 5, + ), + border: Border.all( + color: colorSchema.primary, + width: 2, + ), + ), + ); + } +} diff --git a/lib/presentation/screens/onboarding/ui/tutorial_step.dart b/lib/presentation/screens/onboarding/ui/tutorial_step.dart deleted file mode 100644 index 0560cf4c..00000000 --- a/lib/presentation/screens/onboarding/ui/tutorial_step.dart +++ /dev/null @@ -1,206 +0,0 @@ -import 'package:animate_do/animate_do.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:ottaa_project_flutter/application/common/app_images.dart'; -import 'package:ottaa_project_flutter/application/common/extensions/translate_string.dart'; -import 'package:ottaa_project_flutter/application/notifiers/loading_notifier.dart'; -import 'package:ottaa_project_flutter/application/providers/onboarding_provider.dart'; -import 'package:ottaa_project_flutter/application/theme/app_theme.dart'; -import 'package:ottaa_project_flutter/presentation/common/ui/ottaa_wave.dart'; -import 'package:ottaa_project_flutter/presentation/common/widgets/simple_button.dart'; - -class TutorialStep extends ConsumerStatefulWidget { - const TutorialStep({super.key}); - - @override - ConsumerState createState() => _UserInfoStepState(); -} - -class _UserInfoStepState extends ConsumerState with AutomaticKeepAliveClientMixin { - @override - Widget build(BuildContext context) { - super.build(context); - - final size = MediaQuery.of(context).size; - - final width = size.width; - final height = size.height; - - final provider = ref.watch(onBoardingProvider); - - final loading = ref.watch(loadingProvider); - - return SizedBox.fromSize( - size: size, - child: Stack( - children: [ - Align( - alignment: Alignment.centerLeft, - child: FadeInLeft( - child: const OTTAAWave( - color: kOTTAAOrangeNew, - bgColor: kOTTAABackgroundNew, - ), - ), - ), - Positioned( - bottom: 0, - left: width * 0.05, - child: JelloIn( - child: Image.asset( - AppImages.kWheelChairGirl, - width: width * 0.35, - ), - ), - ), - Positioned( - right: width * 0.05, - height: height, - child: Align( - alignment: Alignment.center, - child: FadeInUp( - child: Center( - child: Container( - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(width * 0.02), - ), - width: width * 0.35, - height: height * 0.73, - padding: EdgeInsets.symmetric(horizontal: width * 0.02), - child: SingleChildScrollView( - child: Column( - children: [ - const Image( - image: AssetImage(AppImages.kLogoOttaa), - ), - const SizedBox(height: 20), - SimpleButton( - width: false, - fontColor: Colors.white, - backgroundColor: Colors.grey, - // color: kOTTAAOrange, - // disabledColor: kQuantumGrey, - onTap: () {}, //TODO: Context go to tutorial screen - text: "Launch_short_tutorial".trl, - // shape: GFButtonShape.pills, - // size: verticalSize * 0.07, - // blockButton: true, - ), - Padding( - padding: EdgeInsets.symmetric(vertical: width * 0.05), - child: SimpleButton( - width: false, - fontColor: Colors.white, - backgroundColor: Colors.grey, - // color: kOTTAAOrange, - // disabledColor: kQuantumGrey, - onTap: () {}, - text: "Do_a_guided_workshop".trl, - // shape: GFButtonShape.pills, - // size: verticalSize * 0.07, - // blockButton: true, - ), - ), - SimpleButton( - width: false, - fontColor: Colors.white, - backgroundColor: Colors.grey, - onTap: () {}, - text: "Book_a_demo".trl, - // color: kOTTAAOrange, - // disabledColor: kQuantumGrey, - - // shape: GFButtonShape.pills, - // size: verticalSize * 0.07, - // blockButton: true, - ), - ], - ), - ), - ), - ), - ), - ), - ), - Positioned( - right: width * 0.05, - bottom: height * 0.05, - child: SizedBox( - width: width * 0.35, - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - SimpleButton( - text: "Previous".trl, - // leading: Icons.chevron_left, - onTap: () { - provider.previousPage(); - }, - backgroundColor: kQuantumGrey, - fontColor: Colors.white, - ), - SimpleButton( - text: "Next".trl, - // trailing: Icons.chevron_right, - onTap: () async { - provider.nextPage(); - }, - backgroundColor: kOTTAAOrangeNew, - fontColor: Colors.white, - ), - ], - ), - ), - ), - Positioned( - top: width * 0.045, - left: height * 0.025, - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - SizedBox( - width: width * 0.45, - child: FittedBox( - child: Text( - 'Ottaa_is_a_powerful_communication_tool'.trl, - style: const TextStyle( - color: Colors.white, - fontWeight: FontWeight.bold, - ), - ), - ), - ), - SizedBox( - height: width * 0.02, - ), - SizedBox( - width: height * 0.45, - child: Text( - 'te_ofrecemos_varias_opciones_para_naprender_a_utilizarla_y_sacarle_el_maximo_provecho'.trl, - style: const TextStyle( - color: Colors.white, - ), - maxLines: 2, - ), - ), - ], - ), - ), - if (loading) - Positioned.fill( - child: Container( - color: Colors.black.withOpacity(0.5), - child: const Center( - child: CircularProgressIndicator(), - ), - ), - ) - ], - ), - ); - } - - @override - bool get wantKeepAlive => true; -} diff --git a/lib/presentation/screens/onboarding/ui/user_avatar_selector_step.dart b/lib/presentation/screens/onboarding/ui/user_avatar_selector_step.dart deleted file mode 100644 index e7dbbb68..00000000 --- a/lib/presentation/screens/onboarding/ui/user_avatar_selector_step.dart +++ /dev/null @@ -1,213 +0,0 @@ -import 'package:animate_do/animate_do.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:go_router/go_router.dart'; -import 'package:ottaa_project_flutter/application/common/app_images.dart'; -import 'package:ottaa_project_flutter/application/common/extensions/translate_string.dart'; -import 'package:ottaa_project_flutter/application/notifiers/loading_notifier.dart'; -import 'package:ottaa_project_flutter/application/notifiers/user_avatar_notifier.dart'; -import 'package:ottaa_project_flutter/application/providers/onboarding_provider.dart'; -import 'package:ottaa_project_flutter/application/router/app_routes.dart'; -import 'package:ottaa_project_flutter/application/theme/app_theme.dart'; -import 'package:ottaa_project_flutter/presentation/common/ui/ottaa_wave.dart'; -import 'package:ottaa_project_flutter/presentation/common/widgets/image_avatar.dart'; -import 'package:ottaa_project_flutter/presentation/common/widgets/simple_button.dart'; - -class UserAvatarSelectorStep extends ConsumerStatefulWidget { - const UserAvatarSelectorStep({super.key}); - - @override - ConsumerState createState() => _UserInfoStepState(); -} - -class _UserInfoStepState extends ConsumerState with AutomaticKeepAliveClientMixin { - @override - Widget build(BuildContext context) { - super.build(context); - - final size = MediaQuery.of(context).size; - - final width = size.width; - final height = size.height; - - final provider = ref.watch(onBoardingProvider); - - final avatarNotifier = ref.watch(userAvatarNotifier); - - final loading = ref.watch(loadingProvider); - - return SizedBox.fromSize( - size: size, - child: Stack( - children: [ - Align( - alignment: Alignment.centerLeft, - child: FadeInLeft( - child: const OTTAAWave( - color: kOTTAAOrangeNew, - bgColor: kOTTAABackgroundNew, - ), - ), - ), - Positioned( - bottom: 0, - left: width * 0.05, - child: JelloIn( - child: Image.asset( - 'assets/Group 706.png', - width: width * 0.3, - ), - ), - ), - Positioned( - right: width * 0.05, - top: height * 0.03, - height: height, - child: FadeInUp( - child: Center( - child: SizedBox( - width: width * 0.45, - height: height, - child: Column( - children: [ - Text("Choose_your_avatar".trl), - const SizedBox(height: 20), - Container( - height: height * 0.2, - width: width * 0.16, - child: Stack( - children: [ - Center( - child: Image.asset( - 'assets/profiles/Group $avatarNotifier@2x.png', - fit: BoxFit.fill, - ), - ), - Positioned( - right: 10, - bottom: 0, - child: Container( - clipBehavior: Clip.antiAlias, - padding: const EdgeInsets.symmetric(vertical: 10, horizontal: 10), - decoration: BoxDecoration( - color: kOTTAAOrangeNew, - borderRadius: BorderRadius.circular(100), - ), - child: const Icon( - Icons.edit, - color: Colors.white, - ), - ), - ), - ], - ), - ), - Expanded( - child: GridView.count( - crossAxisCount: 5, - shrinkWrap: true, - // physics: NeverScrollableScrollPhysics(), - // padding: - // EdgeInsets.symmetric(vertical: verticalSize * 0.05), - mainAxisSpacing: height * 0.02, - children: [ - ImageAvatar(imageId: 615, onTap: ref.read(onBoardingProvider).changeAvatar), - ImageAvatar(imageId: 617, onTap: ref.read(onBoardingProvider).changeAvatar), - ImageAvatar(imageId: 639, onTap: ref.read(onBoardingProvider).changeAvatar), - ImageAvatar(imageId: 663, onTap: ref.read(onBoardingProvider).changeAvatar), - ImageAvatar(imageId: 664, onTap: ref.read(onBoardingProvider).changeAvatar), - ImageAvatar(imageId: 665, onTap: ref.read(onBoardingProvider).changeAvatar), - ImageAvatar(imageId: 666, onTap: ref.read(onBoardingProvider).changeAvatar), - ImageAvatar(imageId: 667, onTap: ref.read(onBoardingProvider).changeAvatar), - ImageAvatar(imageId: 668, onTap: ref.read(onBoardingProvider).changeAvatar), - ImageAvatar(imageId: 669, onTap: ref.read(onBoardingProvider).changeAvatar), - ImageAvatar(imageId: 670, onTap: ref.read(onBoardingProvider).changeAvatar), - ImageAvatar(imageId: 674, onTap: ref.read(onBoardingProvider).changeAvatar), - ImageAvatar(imageId: 672, onTap: ref.read(onBoardingProvider).changeAvatar), - ImageAvatar(imageId: 673, onTap: ref.read(onBoardingProvider).changeAvatar), - ImageAvatar(imageId: 671, onTap: ref.read(onBoardingProvider).changeAvatar), - ], - ), - ) - ], - ), - ), - ), - ), - ), - Positioned( - right: width * 0.05, - bottom: height * 0.05, - child: SizedBox( - width: width * 0.35, - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - SimpleButton( - text: "Previous".trl, - // leading: Icons.chevron_left, - onTap: () { - provider.previousPage(); - }, - backgroundColor: kQuantumGrey, - fontColor: Colors.white, - ), - SimpleButton( - text: "Next".trl, - // trailing: Icons.chevron_right, - onTap: () async { - await provider.updateUserAvatar(); - if (mounted) context.go(AppRoutes.home); - }, - backgroundColor: kOTTAAOrangeNew, - fontColor: Colors.white, - ), - ], - ), - ), - ), - Positioned( - top: width * 0.045, - left: height * 0.025, - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - 'por_ltimo'.trl, - style: const TextStyle( - color: Colors.white, - fontWeight: FontWeight.bold, - fontSize: 40, - ), - ), - SizedBox( - height: width * 0.02, - ), - Text( - 'elige_un_personaje_que_nmejor_te_represente'.trl, - style: const TextStyle( - color: Colors.white, - fontSize: 15, - ), - maxLines: 2, - ), - ], - ), - ), - if (loading) - Positioned.fill( - child: Container( - color: Colors.black.withOpacity(0.5), - child: const Center( - child: CircularProgressIndicator(), - ), - ), - ) - ], - ), - ); - } - - @override - bool get wantKeepAlive => true; -} diff --git a/lib/presentation/screens/onboarding/ui/user_info_step.dart b/lib/presentation/screens/onboarding/ui/user_info_step.dart deleted file mode 100644 index 9b83699e..00000000 --- a/lib/presentation/screens/onboarding/ui/user_info_step.dart +++ /dev/null @@ -1,327 +0,0 @@ -import 'package:animate_do/animate_do.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:go_router/go_router.dart'; -import 'package:intl/intl.dart'; -import 'package:ottaa_project_flutter/application/common/app_images.dart'; -import 'package:ottaa_project_flutter/application/common/extensions/translate_string.dart'; -import 'package:ottaa_project_flutter/application/notifiers/loading_notifier.dart'; -import 'package:ottaa_project_flutter/application/providers/onboarding_provider.dart'; -import 'package:ottaa_project_flutter/application/router/app_routes.dart'; -import 'package:ottaa_project_flutter/application/theme/app_theme.dart'; -import 'package:ottaa_project_flutter/presentation/common/ui/ottaa_wave.dart'; -import 'package:ottaa_project_flutter/presentation/common/widgets/ottaa_textinput.dart'; -import 'package:ottaa_project_flutter/presentation/common/widgets/simple_button.dart'; -import 'package:textfield_datepicker/textfield_datepicker.dart'; - -class UserInfoStep extends ConsumerStatefulWidget { - const UserInfoStep({super.key}); - - @override - ConsumerState createState() => _UserInfoStepState(); -} - -class _UserInfoStepState extends ConsumerState with AutomaticKeepAliveClientMixin { - @override - Widget build(BuildContext context) { - super.build(context); - - final size = MediaQuery.of(context).size; - - final width = size.width; - final height = size.height; - - final provider = ref.watch(onBoardingProvider); - - final formKey = provider.formKeys[0]; - - final loading = ref.watch(loadingProvider); - - return SizedBox.fromSize( - size: size, - child: Stack( - children: [ - Align( - alignment: Alignment.centerLeft, - child: FadeInLeft( - child: const OTTAAWave( - color: kOTTAAOrangeNew, - bgColor: kOTTAABackgroundNew, - ), - ), - ), - Positioned( - bottom: 0, - left: width * 0.05, - child: JelloIn( - child: Image.asset( - AppImages.kPeople, - width: width * 0.4, - ), - ), - ), - Positioned( - right: width * 0.05, - height: height, - child: Align( - alignment: Alignment.center, - child: FadeInUp( - child: Center( - child: Container( - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(width * 0.02), - ), - width: width * 0.35, - height: height * 0.73, - padding: EdgeInsets.symmetric(horizontal: width * 0.02), - child: SingleChildScrollView( - child: Column( - children: [ - const Image( - image: AssetImage(AppImages.kLogoOttaa), - ), - Padding( - padding: EdgeInsets.only(bottom: height * 0.05), - child: Text( - "check_if_the_info_is_correct_nif_not_change_it_as_you_wish_this_will_help_us_to_personalize_the_app_for_you".trl, - textAlign: TextAlign.center, - ), - ), - Form( - key: formKey, - child: Column( - children: [ - Row( - children: [ - Text( - "Name".trl, - style: TextStyle(color: Colors.grey[400]), - ), - const SizedBox( - width: 20, - ), - Expanded( - child: OTTAATextInput( - controller: provider.nameController, - validator: (value) { - if (value == null || value.isEmpty) { - return 'please_enter_some_text'.trl; - } - return null; - }, - ), - ), - ], - ), - const SizedBox(height: 50), - Row( - children: [ - Text( - "Gender".trl, - style: TextStyle(color: Colors.grey[400]), - ), - const SizedBox( - width: 20, - ), - Expanded( - child: OTTAATextInput( - controller: provider.genderController, - enabled: true, - isReadOnly: true, - onTap: () async { - final String? gender = await showDialog( - context: context, - builder: (context) => AlertDialog(content: _dialogWidget()), - ); - - print(gender); - if (gender != null) { - provider.genderController.text = gender; - } - }, - validator: (value) { - if (value == null || value.isEmpty) { - return 'please_enter_some_text'.trl; - } - return null; - }, - ), - ), - ], - ), - const SizedBox(height: 50), - Row( - children: [ - Text( - "Date_of_birth".trl, - style: TextStyle(color: Colors.grey[400]), - ), - const SizedBox( - width: 20, - ), - Expanded( - child: TextfieldDatePicker( - cupertinoDatePickerBackgroundColor: Colors.white, - cupertinoDatePickerMaximumDate: DateTime(2099), - cupertinoDatePickerMaximumYear: 2099, - cupertinoDatePickerMinimumYear: 1990, - cupertinoDatePickerMinimumDate: DateTime(1990), - cupertinoDateInitialDateTime: DateTime.now(), - materialDatePickerFirstDate: DateTime(1990), - materialDatePickerInitialDate: DateTime.now(), - materialDatePickerLastDate: DateTime(2099), - preferredDateFormat: DateFormat('dd-MM-' 'yyyy'), - textfieldDatePickerController: provider.birthDateController, - style: const TextStyle( - fontWeight: FontWeight.w400, - color: Colors.black, - ), - textCapitalization: TextCapitalization.sentences, - cursorColor: Colors.black, - decoration: const InputDecoration( - focusColor: kOTTAAOrangeNew, - fillColor: kOTTAAOrangeNew, - isDense: true, - focusedBorder: UnderlineInputBorder( - borderSide: BorderSide(color: kOTTAAOrangeNew), - ), - ), - validator: (value) { - if (value == null || value.isEmpty) { - return 'please_enter_some_text'.trl; - } - return null; - }, - ), - ), - ], - ) - ], - ), - ) - ], - ), - ), - ), - ), - ), - ), - ), - Positioned( - right: width * 0.05, - bottom: height * 0.05, - child: SizedBox( - width: width * 0.35, - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - SimpleButton( - text: "Previous".trl, - // leading: Icons.chevron_left, - onTap: () async { - await provider.signOut(); - if (mounted) context.go(AppRoutes.login); - }, - backgroundColor: kQuantumGrey, - fontColor: Colors.white, - ), - SimpleButton( - text: "Next".trl, - // trailing: Icons.chevron_right, - onTap: () async { - final result = await provider.saveUserInformation(); - if (result.isLeft) { - ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text(result.left))); - return; - } - - provider.nextPage(); - }, - backgroundColor: kOTTAAOrangeNew, - fontColor: Colors.white, - ), - ], - ), - ), - ), - Positioned( - top: width * 0.045, - left: height * 0.025, - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - SizedBox( - width: width * 0.45, - child: FittedBox( - child: Text( - 'hola_nnos_conozcamos_un_poco'.trl, - style: const TextStyle( - color: Colors.white, - fontWeight: FontWeight.bold, - ), - ), - ), - ), - SizedBox( - height: width * 0.02, - ), - SizedBox( - width: height * 0.45, - child: Text( - 'vamos_a_pedirte_cierta_informaci_n_para_nmejorar_tu_experiencia_con_ottaa'.trl, - style: const TextStyle( - color: Colors.white, - ), - maxLines: 2, - ), - ), - ], - ), - ), - if (loading) - Positioned.fill( - child: Container( - color: Colors.black.withOpacity(0.5), - child: const Center( - child: CircularProgressIndicator(), - ), - ), - ) - ], - ), - ); - } - - Widget _dialogWidget() { - return SingleChildScrollView( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisSize: MainAxisSize.min, - children: [ - _textWidget(text: 'Male'.trl), - const Divider(), - _textWidget(text: 'Female'.trl), - const Divider(), - _textWidget(text: 'Binary'.trl), - const Divider(), - _textWidget(text: 'Fluid'.trl), - const Divider(), - _textWidget(text: 'Other'.trl), - ], - ), - ); - } - - Widget _textWidget({required String text}) { - return ListTile( - title: Text(text), - onTap: () { - Navigator.pop(context, text); - }, - ); - } - - @override - bool get wantKeepAlive => true; -} diff --git a/lib/presentation/screens/profile/profile_chooser_screen.dart b/lib/presentation/screens/profile/profile_chooser_screen.dart index 17a3d4d4..00b87457 100644 --- a/lib/presentation/screens/profile/profile_chooser_screen.dart +++ b/lib/presentation/screens/profile/profile_chooser_screen.dart @@ -1,26 +1,25 @@ import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:go_router/go_router.dart'; import 'package:ottaa_project_flutter/application/common/app_images.dart'; import 'package:ottaa_project_flutter/application/common/extensions/translate_string.dart'; +import 'package:ottaa_project_flutter/application/providers/profile_provider.dart'; import 'package:ottaa_project_flutter/application/router/app_routes.dart'; -import 'package:ottaa_project_flutter/application/theme/app_theme.dart'; -import 'package:ottaa_project_flutter/presentation/common/widgets/new_simple_button.dart'; -import 'package:ottaa_project_flutter/presentation/screens/profile/ui/profile_chooser_button_widget.dart'; +import 'package:ottaa_ui_kit/widgets.dart'; -class ProfileChooserScreen extends StatelessWidget { +class ProfileChooserScreen extends ConsumerWidget { const ProfileChooserScreen({Key? key}) : super(key: key); @override - Widget build(BuildContext context) { + Widget build(BuildContext context, WidgetRef ref) { + final textTheme = Theme.of(context).textTheme; + + final provider = ref.watch(profileProvider); + return Scaffold( - //todo: add the color here - backgroundColor: kOTTAABackground, body: SafeArea( child: Padding( - padding: const EdgeInsets.symmetric( - horizontal: 24, - vertical: 16, - ), + padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 16), child: Column( mainAxisAlignment: MainAxisAlignment.spaceBetween, crossAxisAlignment: CrossAxisAlignment.center, @@ -28,14 +27,6 @@ class ProfileChooserScreen extends StatelessWidget { Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Align( - alignment: Alignment.centerRight, - //todo: add text style here after emir has created the theme files - child: Text( - 'profile.omitir'.trl, - ), - ), - //todo: add text style here after emir has created the theme files Padding( padding: const EdgeInsets.only( top: 36, @@ -43,32 +34,43 @@ class ProfileChooserScreen extends StatelessWidget { ), child: Text( 'profile.selection.text1'.trl, + style: textTheme.headline2, ), ), - ProfileChooserButtonWidget( - heading: 'profile.acompanante'.trl, - subtitle: 'profile.profesionales.familiares'.trl, - imagePath: AppImages.kProfileIcon1, - onTap: () {}, - selected: false, + ActionCard( + title: 'profile.caregiver'.trl, + subtitle: 'profile.caregivers_families'.trl, + trailingImage: const AssetImage(AppImages.kProfileIcon1), + onPressed: () { + provider.isCaregiver = !provider.isCaregiver; + provider.isUser = false; + provider.notify(); + }, + focused: provider.isCaregiver, + imageSize: const Size(129, 96), ), const SizedBox( height: 16, ), - ProfileChooserButtonWidget( - heading: 'profile.acompanante'.trl, - subtitle: 'profile.necesita.comunicarse'.trl, - imagePath: AppImages.kProfileIcon2, - onTap: () {}, - selected: false, + ActionCard( + title: 'profile.user'.trl, + subtitle: 'profile.user_description'.trl, + trailingImage: const AssetImage(AppImages.kProfileIcon2), + onPressed: () async { + provider.isUser = !provider.isUser; + provider.isCaregiver = false; + + provider.notify(); + }, + focused: provider.isUser, + imageSize: const Size(129, 96), ), ], ), - NewSimpleButton( + PrimaryButton( //todo: add the proper way for handling the waiting screen, hector said is should be their for 4 seconds at least - onTap: () => context.push(AppRoutes.profileWaitingScreen), - active: false, - text: "profile.continuar", + onPressed: (provider.isCaregiver || provider.isUser) ? () => context.push(AppRoutes.userWait) : null, + text: "global.continue".trl, ), ], ), diff --git a/lib/presentation/screens/profile/profile_chooser_screen_selected_screen.dart b/lib/presentation/screens/profile/profile_chooser_screen_selected_screen.dart new file mode 100644 index 00000000..66e712fb --- /dev/null +++ b/lib/presentation/screens/profile/profile_chooser_screen_selected_screen.dart @@ -0,0 +1,95 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:go_router/go_router.dart'; +import 'package:ottaa_project_flutter/application/common/app_images.dart'; +import 'package:ottaa_project_flutter/application/common/extensions/translate_string.dart'; +import 'package:ottaa_project_flutter/application/providers/profile_provider.dart'; +import 'package:ottaa_project_flutter/presentation/common/widgets/responsive_widget.dart'; +import 'package:ottaa_project_flutter/presentation/screens/profile/ui/profile_chooser_button_widget.dart'; +import 'package:ottaa_ui_kit/widgets.dart'; + +class ProfileChooserScreenSelected extends ConsumerWidget { + const ProfileChooserScreenSelected({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final textTheme = Theme.of(context).textTheme; + final colorScheme = Theme.of(context).colorScheme; + final provider = ref.watch(profileProvider); + return ResponsiveWidget( + child: Scaffold( + appBar: OTTAAAppBar( + title: Text("profile.role".trl), + ), + body: SafeArea( + child: Padding( + padding: const EdgeInsets.symmetric( + horizontal: 24, + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: const EdgeInsets.only( + top: 8, + bottom: 24, + ), + child: Text( + "onboarding.profile.subtitle".trl, + style: textTheme.button! + .copyWith(color: colorScheme.onBackground), + ), + ), + ActionCard( + title: 'profile.caregiver'.trl, + subtitle: 'profile.caregivers_families'.trl, + trailingImage: const AssetImage(AppImages.kProfileIcon1), + onPressed: () { + provider.isCaregiver = !provider.isCaregiver; + provider.notify(); + }, + focused: provider.isCaregiver, + imageSize: const Size(129, 96), + ), + const SizedBox( + height: 16, + ), + ActionCard( + title: 'profile.user'.trl, + subtitle: 'profile.user_description'.trl, + trailingImage: const AssetImage(AppImages.kProfileIcon2), + onPressed: () { + provider.isCaregiver = !provider.isCaregiver; + provider.notify(); + }, + focused: !provider.isCaregiver, + imageSize: const Size(129, 96), + ), + ], + ), + const Spacer(), + PrimaryButton( + //todo: add the proper way for handling the waiting screen, hector said is should be their for 4 seconds at least + onPressed: () { + print(provider.isCaregiver); + provider.notify(); + context.pop(); + }, + enabled: true, + text: "global.save_changes".trl, + ), + const SizedBox( + height: 48, + ), + ], + ), + ), + ), + ), + ); + } +} diff --git a/lib/presentation/screens/profile/profile_faq_screen.dart b/lib/presentation/screens/profile/profile_faq_screen.dart new file mode 100644 index 00000000..12e39254 --- /dev/null +++ b/lib/presentation/screens/profile/profile_faq_screen.dart @@ -0,0 +1,109 @@ +import 'package:flutter/material.dart'; +import 'package:ottaa_project_flutter/application/common/extensions/translate_string.dart'; +import 'package:ottaa_project_flutter/presentation/common/widgets/responsive_widget.dart'; +import 'package:ottaa_ui_kit/widgets.dart'; + +class ProfileFAQScreen extends StatefulWidget { + const ProfileFAQScreen({Key? key}) : super(key: key); + + @override + State createState() => _ProfileFAQScreenState(); +} + +class _ProfileFAQScreenState extends State { + bool selected = false; + final List _data = generateItems(8); + + @override + Widget build(BuildContext context) { + final textTheme = Theme.of(context).textTheme; + final colorScheme = Theme.of(context).colorScheme; + return ResponsiveWidget( + child: Scaffold( + appBar: OTTAAAppBar( + title: Text( + "profile.faq.title".trl, + style: textTheme.headline3, + ), + ), + body: Padding( + padding: const EdgeInsets.symmetric(horizontal: 24), + child: SingleChildScrollView( + child: ExpansionPanelList( + dividerColor: colorScheme.background, + expandedHeaderPadding: const EdgeInsets.symmetric(vertical: 16), + animationDuration: const Duration(milliseconds: 500), + expansionCallback: (int index, bool isExpanded) { + setState(() { + _data[index].isExpanded = !isExpanded; + }); + }, + children: _data.map((Item item) { + return ExpansionPanel( + canTapOnHeader: true, + headerBuilder: (BuildContext context, bool isExpanded) { + return Wrap( + children: [ + Padding( + padding: const EdgeInsets.only(left: 24), + child: Text( + item.headerValue, + style: textTheme.subtitle2! + .copyWith(fontWeight: FontWeight.w600), + textAlign: TextAlign.start, + ), + ), + ], + ); + }, + body: Column( + children: [ + Divider( + height: 2, + color: colorScheme.background, + ), + Container( + decoration: const BoxDecoration( + color: Colors.white, + ), + padding: const EdgeInsets.symmetric( + vertical: 16, horizontal: 24), + child: Text( + item.expandedValue, + style: textTheme.subtitle1, + ), + ), + ], + ), + isExpanded: item.isExpanded, + ); + }).toList(), + ), + ), + ), + ), + ); + } +} + +// stores ExpansionPanel state information +class Item { + Item({ + required this.expandedValue, + required this.headerValue, + this.isExpanded = false, + }); + + String expandedValue; + String headerValue; + bool isExpanded; +} + +List generateItems(int numberOfItems) { + return List.generate(numberOfItems, (int index) { + return Item( + headerValue: 'profile.faq.faq$index'.trl, + expandedValue: 'profile.faq.faq${index}Description'.trl, + ); + }); +} diff --git a/lib/presentation/screens/profile/profile_help_screen.dart b/lib/presentation/screens/profile/profile_help_screen.dart new file mode 100644 index 00000000..83d69474 --- /dev/null +++ b/lib/presentation/screens/profile/profile_help_screen.dart @@ -0,0 +1,109 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:go_router/go_router.dart'; +import 'package:ottaa_project_flutter/application/common/app_images.dart'; +import 'package:ottaa_project_flutter/application/common/extensions/translate_string.dart'; +import 'package:ottaa_project_flutter/application/providers/about_provider.dart'; +import 'package:ottaa_project_flutter/application/providers/profile_provider.dart'; +import 'package:ottaa_project_flutter/application/router/app_routes.dart'; +import 'package:ottaa_project_flutter/presentation/common/widgets/responsive_widget.dart'; +import 'package:ottaa_ui_kit/widgets.dart'; + +class ProfileHelpScreen extends ConsumerWidget { + const ProfileHelpScreen({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final textTheme = Theme.of(context).textTheme; + final provider = ref.watch(profileProvider); + final mailProvider = ref.read(aboutProvider); + return ResponsiveWidget( + child: Scaffold( + appBar: OTTAAAppBar( + title: Text( + "profile.help.help".trl, + style: textTheme.headline3, + ), + ), + body: SafeArea( + child: Padding( + padding: const EdgeInsets.symmetric( + horizontal: 24, + vertical: 16, + ), + child: Column( + // mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ActionCard( + title: "profile.help.title1".trl, + subtitle: '', + trailingImage: const AssetImage(AppImages.kProfileHelpIcon1), + onPressed: () => context.push(AppRoutes.userProfileHelpFaq), + ), + const SizedBox( + height: 16, + ), + ActionCard( + title: "profile.help.title2".trl, + subtitle: '', + trailingImage: const AssetImage(AppImages.kProfileHelpIcon2), + onPressed: () async { + bool? wantsCall = await BasicBottomSheet.show( + context, + title: 'global.support'.trl, + children: [ + GestureDetector( + onTap: () async => + await mailProvider.sendSupportEmail(), + child: Wrap( + alignment: WrapAlignment.center, + children: [ + Text("Mail:", style: textTheme.headline3), + const SizedBox( + width: 4, + ), + GestureDetector( + child: Text( + "support@ottaaproject.com", + style: textTheme.headline3?.copyWith( + decoration: TextDecoration.underline, + ), + ), + ) + ], + ), + ), + const SizedBox( + height: 32, + ), + Text( + "¿Desea comunicarse por teléfono con soporte técnico?", + textAlign: TextAlign.center, + style: textTheme.headline3?.copyWith( + fontWeight: FontWeight.bold, + ), + ), + const SizedBox( + height: 16, + ), + ], + okButtonText: "Llamar", + cancelButtonText: "Cancelar", + cancelButtonEnabled: true, + ); + + if (wantsCall == true) { + await provider.openDialer(); + } + }, + imageSize: const Size(129, 96), + ), + ], + ), + ), + ), + ), + ); + } +} diff --git a/lib/presentation/screens/profile/profile_linked_account_screen.dart b/lib/presentation/screens/profile/profile_linked_account_screen.dart new file mode 100644 index 00000000..2a3ce044 --- /dev/null +++ b/lib/presentation/screens/profile/profile_linked_account_screen.dart @@ -0,0 +1,111 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:ottaa_project_flutter/application/common/extensions/translate_string.dart'; +import 'package:ottaa_project_flutter/application/providers/profile_provider.dart'; +import 'package:ottaa_project_flutter/application/providers/user_provider.dart'; +import 'package:ottaa_project_flutter/presentation/common/widgets/responsive_widget.dart'; +import 'package:ottaa_ui_kit/widgets.dart'; + +class ProfileLinkedAccountScreen extends ConsumerStatefulWidget { + const ProfileLinkedAccountScreen({super.key}); + + @override + ConsumerState createState() => + _ProfileLinkedAccountScreen(); +} + +class _ProfileLinkedAccountScreen + extends ConsumerState { + @override + void initState() { + final provider = ref.read(profileProvider); + + WidgetsBinding.instance.addPostFrameCallback((_) async { + await provider.fetchConnectedUsersData(); + }); + super.initState(); + } + + @override + Widget build(BuildContext context) { + final textTheme = Theme.of(context).textTheme; + final colorScheme = Theme.of(context).colorScheme; + final provider = ref.watch(profileProvider); + final user = ref.read(userProvider.select((value) => value.user)); + print(provider.dataFetched); + return ResponsiveWidget( + child: Scaffold( + appBar: OTTAAAppBar( + title: Text( + "profile.linked_accounts".trl, + style: textTheme.headline3, + ), + ), + body: SafeArea( + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 24), + child: Column( + children: [ + const SizedBox( + height: 36, + ), + //todo: emir need your help + provider.dataFetched + ? Expanded( + child: ListView.builder( + itemCount: provider.connectedUsersData.length, + itemBuilder: (context, index) => Padding( + padding: const EdgeInsets.only(bottom: 16), + child: ProfileCard( + title: provider + .connectedUsersData[index].settings.data.name, + subtitle: "profile.user".trl, + actions: GestureDetector( + onTap: () async { + final bool? cancel = + await BasicBottomSheet.show( + context, + okButtonEnabled: true, + title: "profile.unlink_account".trlf({ + "name": provider.connectedUsersData[index] + .settings.data.name + }), + okButtonText: "global.yes".trl, + cancelButtonText: "global.cancel".trl, + cancelButtonEnabled: true, + ); + if (cancel != null && cancel) { + await provider.removeCurrentUser( + userId: + provider.connectedUsersData[index].id, + careGiverId: user!.id, + ); + } + }, + child: Text( + 'profile.unlink'.trl, + style: textTheme.subtitle1! + .copyWith(color: colorScheme.primary), + ), + ), + leadingImage: NetworkImage( + provider.connectedUsersData[index].settings.data + .avatar.network!, + ), + ), + ), + ), + ) + : const Expanded( + child: Center( + child: CircularProgressIndicator(), + ), + ), + ], + ), + ), + ), + ), + ); + } +} diff --git a/lib/presentation/screens/profile/profile_main_screen.dart b/lib/presentation/screens/profile/profile_main_screen.dart index 0399d644..0df27f2a 100644 --- a/lib/presentation/screens/profile/profile_main_screen.dart +++ b/lib/presentation/screens/profile/profile_main_screen.dart @@ -1,115 +1,167 @@ import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:go_router/go_router.dart'; import 'package:ottaa_project_flutter/application/common/app_images.dart'; import 'package:ottaa_project_flutter/application/common/extensions/translate_string.dart'; +import 'package:ottaa_project_flutter/application/providers/profile_provider.dart'; +import 'package:ottaa_project_flutter/application/providers/user_provider.dart'; import 'package:ottaa_project_flutter/application/router/app_routes.dart'; -import 'package:ottaa_project_flutter/application/theme/app_theme.dart'; +import 'package:ottaa_project_flutter/core/enums/user_types.dart'; +import 'package:ottaa_project_flutter/presentation/common/widgets/responsive_widget.dart'; +import 'package:ottaa_project_flutter/presentation/screens/profile/ui/connected_users_list.dart'; import 'package:ottaa_project_flutter/presentation/screens/profile/ui/drop_down_widget.dart'; import 'package:ottaa_project_flutter/presentation/screens/profile/ui/profile_photo_widget.dart'; -import 'package:ottaa_project_flutter/presentation/screens/profile/ui/profile_chooser_button_widget.dart'; +import 'package:ottaa_ui_kit/widgets.dart'; -bool change = true; - -class ProfileMainScreen extends StatelessWidget { +class ProfileMainScreen extends ConsumerStatefulWidget { const ProfileMainScreen({Key? key}) : super(key: key); + @override + ConsumerState createState() => _ProfileMainScreenState(); +} + +class _ProfileMainScreenState extends ConsumerState { //todo: a jojo reference XD final String userName = 'Dio'; + @override + void initState() { + super.initState(); + final provider = ref.read(profileProvider); + final user = ref.read(userProvider.select((value) => value.user)); + WidgetsBinding.instance.addPostFrameCallback((timeStamp) async { + await provider.setDate(); + if (user!.type == UserType.caregiver) { + await provider.fetchConnectedUsersData(); + } + }); + } + @override Widget build(BuildContext context) { - return Scaffold( - //todo: add the theme here - backgroundColor: kOTTAABackground, - body: SafeArea( - child: Padding( - padding: const EdgeInsets.all(24.0), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, + final textTheme = Theme.of(context).textTheme; + final colorScheme = Theme.of(context).colorScheme; + final provider = ref.watch(profileProvider); + + final user = ref.watch(userProvider.select((value) => value.user)); + + if (user == null) return Container(); + + return ResponsiveWidget( + child: Scaffold( + resizeToAvoidBottomInset: false, + body: SingleChildScrollView( + child: SafeArea( + child: Padding( + padding: const EdgeInsets.all(24.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - //todo: add the link here to go to the profile setting screen + Row( + children: [ + GestureDetector( + onTap: () => context.push(AppRoutes.userProfile), + child: ProfilePhotoWidget( + image: user.settings.data.avatar.network ?? "", + asset: '671', + ), + ), + const SizedBox( + width: 16, + ), + Text( + "profile.hello".trlf({"name": user.settings.data.name}), + ), + ], + ), GestureDetector( - onTap: () => - context.push(AppRoutes.profileSettingsScreen), - child: const ProfilePhotoWidget( - //todo: add the image link here, from the userData - image: AppImages.kTestImage, + onTap: () { + // context.push(AppRoutes.customizedBoardScreen); + }, + child: Image.asset( + AppImages.kNotificationIcon, ), ), - const SizedBox( - width: 16, - ), - //todo: replace it with the name from the userData - Text( - '${"profile.hola".trl} $userName!', - ), ], ), - Image.asset( - AppImages.kNotificationIcon, + const SizedBox( + height: 32, ), - ], - ), - const SizedBox( - height: 32, - ), - Text( - "profile.qué.deseas.hacer".trl, - ), - Padding( - padding: const EdgeInsets.symmetric(vertical: 16.0), - child: ProfileChooserButtonWidget( - subtitle: "profile.nuevo.existente".trl, - selected: !change, - heading: "profile.agregar.cuenta".trl, - imagePath: AppImages.kProfileMainScreenIcon, - onTap: () { - change = !change; - }, - ), - ), - //todo: add the trigger here for the container to show and hide - AnimatedContainer( - decoration: const BoxDecoration( - color: Colors.transparent, - ), - duration: const Duration(milliseconds: 500), - height: change ? 0 : 140, - width: double.maxFinite, - child: SingleChildScrollView( - physics: const NeverScrollableScrollPhysics(), - child: Column( - children: [ - DropDownWidget( - onTap: () {}, - image: AppImages.kProfileAddIcon, - text: "profile.crear.nueva.cuenta".trl, - ), - const SizedBox( - height: 16, - ), - DropDownWidget( - onTap: () {}, - image: AppImages.kProfileLinkIcon, - text: "profile.vincular.con.cuenta".trl, + Text( + "profile.what_do".trl, + style: textTheme.displayMedium, + ), + const SizedBox( + height: 4, + ), + provider.connectedUsersFetched ? const ConnectedUsersList() : const SizedBox.shrink(), + Padding( + padding: const EdgeInsets.symmetric(vertical: 16), + child: ActionCard( + title: "profile.link_account".trl, + subtitle: "profile.new_existant".trl, + trailingImage: const AssetImage(AppImages.kProfileMainScreenIcon), + imageSize: const Size(94, 96), + focused: provider.isLinkAccountOpen, + onPressed: () { + provider.isLinkAccountOpen = !provider.isLinkAccountOpen; + provider.notify(); + }, + ), + ), + //todo: add the trigger here for the container to show and hide + AnimatedContainer( + decoration: const BoxDecoration( + color: Colors.transparent, + ), + duration: const Duration(milliseconds: 500), + height: provider.isLinkAccountOpen ? 65 : 0, + width: double.maxFinite, + child: SingleChildScrollView( + physics: const NeverScrollableScrollPhysics(), + child: Column( + children: [ + // DropDownWidget( + // onTap: () {}, + // image: AppImages.kProfileAddIcon, + // text: "profile.crear.nueva.cuenta".trl, + // ), + // const SizedBox( + // height: 16, + // ), + // DropDownWidget( + // onTap: () {}, + // image: AppImages.kProfileAddIcon, + // text: "profile.crear.nueva.cuenta".trl, + // ), + // const SizedBox( + // height: 16, + // ), + DropDownWidget( + onTap: () => context.push(AppRoutes.caregiverLink), + image: AppImages.kProfileLinkIcon, + text: "profile.link_account".trl, + ), + ], ), - ], + ), ), - ), - ), - ProfileChooserButtonWidget( - subtitle: "profile.modo.sin.perfil".trl, - selected: false, - heading: "profile.usar.ottaa".trl, - imagePath: AppImages.kProfileIcon2, - onTap: () {}, + ActionCard( + subtitle: "profile.no_account".trl, + focused: false, + title: "profile.use.ottaa".trl, + trailingImage: const AssetImage(AppImages.kProfileIcon2), + imageSize: const Size(129, 96), + onPressed: () { + context.push(AppRoutes.userTalk); + }, + ), + ], ), - ], + ), ), ), ), diff --git a/lib/presentation/screens/profile/profile_main_screen_user.dart b/lib/presentation/screens/profile/profile_main_screen_user.dart new file mode 100644 index 00000000..dae608cb --- /dev/null +++ b/lib/presentation/screens/profile/profile_main_screen_user.dart @@ -0,0 +1,173 @@ +import 'package:firebase_database/firebase_database.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:get_it/get_it.dart'; +import 'package:go_router/go_router.dart'; +import 'package:ottaa_project_flutter/application/common/app_images.dart'; +import 'package:ottaa_project_flutter/application/common/extensions/translate_string.dart'; +import 'package:ottaa_project_flutter/application/common/extensions/user_extension.dart'; +import 'package:ottaa_project_flutter/application/notifiers/patient_notifier.dart'; +import 'package:ottaa_project_flutter/application/providers/customise_provider.dart'; +import 'package:ottaa_project_flutter/application/providers/tts_provider.dart'; +import 'package:ottaa_project_flutter/application/providers/user_provider.dart'; +import 'package:ottaa_project_flutter/application/providers/user_settings_provider.dart'; +import 'package:ottaa_project_flutter/application/providers/view_board_provider.dart'; +import 'package:ottaa_project_flutter/application/router/app_routes.dart'; +import 'package:ottaa_project_flutter/core/enums/customise_data_type.dart'; +import 'package:ottaa_project_flutter/presentation/common/widgets/responsive_widget.dart'; +import 'package:ottaa_project_flutter/core/repositories/local_database_repository.dart'; +import 'package:ottaa_project_flutter/presentation/screens/profile/ui/profile_photo_widget.dart'; +import 'package:ottaa_ui_kit/theme.dart'; +import 'package:ottaa_ui_kit/widgets.dart'; + +import '../../../application/providers/create_picto_provider.dart'; + +class ProfileMainScreenUser extends ConsumerStatefulWidget { + const ProfileMainScreenUser({Key? key}) : super(key: key); + + @override + ConsumerState createState() => _ProfileMainScreenUserState(); +} + +class _ProfileMainScreenUserState extends ConsumerState { + @override + void initState() { + super.initState(); + WidgetsBinding.instance.addPostFrameCallback((_) async { + final _ttsProvider = ref.read(ttsProvider); + await _ttsProvider.init(); + }); + } + + @override + Widget build(BuildContext context) { + final user = ref.read(userProvider.select((value) => value.user)); + final textTheme = Theme.of(context).textTheme; + return ResponsiveWidget( + child: Scaffold( + appBar: OTTAAAppBar( + leading: GestureDetector( + onTap: () => context.push(AppRoutes.userProfile), + child: ProfilePhotoWidget( + image: user?.settings.data.avatar.network ?? "", + asset: '671', + ), + ), + title: Padding( + padding: const EdgeInsets.only(left: 24), + child: Text( + 'profile.hello'.trlf({'name': user!.settings.data.name}), + style: textTheme.headline3, + ), + ), + ), + body: Padding( + padding: const EdgeInsets.symmetric(horizontal: 24), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'user.main.title'.trl, + style: textTheme.button!.copyWith( + color: kPrimaryTextColor, + ), + ), + Padding( + padding: const EdgeInsets.symmetric(vertical: 16), + child: ActionCard( + title: '${'profile.tips.title2'.trl} / ${'global.pictogram'.trl}', + subtitle: 'user.main.subtitle2'.trl, + trailingImage: const AssetImage(AppImages.kProfileUserIcon1), + onPressed: () async { + final provider = ref.read(viewBoardProvider); + showDialog( + context: context, + barrierDismissible: false, + builder: (context) { + return const Center( + child: CircularProgressIndicator(), + ); + }, + ); + await provider.init(userId: user.id); + provider.selectedType = 'home.grid.title'.trl; + provider.notify(); + context.pop(); + context.push(AppRoutes.patientViewBoardsAndPictos); + //todo: talk with team about this one + /* final provider = ref.watch(customiseProvider); + showDialog( + context: context, + barrierDismissible: false, + builder: (context) { + return const Center( + child: CircularProgressIndicator(), + ); + }, + ); + + /// checking if the user has its data or not + provider.dataExist = await provider.dataExistOrNot(userId: user.id); + context.pop(); + provider.notify(); + provider.type = provider.dataExist ? CustomiseDataType.user : CustomiseDataType.defaultCase; + + context.push(AppRoutes.userCustomizeBoard);*/ + }, + focused: false, + imageSize: const Size(129, 96), + ), + ), + ActionCard( + title: 'profile.tips.title1'.trl, + subtitle: 'user.main.subtitle1'.trl, + trailingImage: const AssetImage(AppImages.kProfileUserIcon2), + onPressed: () async { + /*final provider = ref.read(createPictoProvider); + showDialog( + context: context, + barrierDismissible: false, + builder: (context) { + return const Center( + child: CircularProgressIndicator(), + ); + }, + ); + await provider.init(userId: user.id); + context.pop(); + context.push(AppRoutes.patientViewBoardsAndPictos);*/ + }, + focused: false, + imageSize: const Size(129, 96), + ), + Padding( + padding: const EdgeInsets.symmetric(vertical: 16), + child: ActionCard( + title: 'global.settings'.trl, + subtitle: 'global.general'.trl, + trailingImage: const AssetImage(AppImages.kProfileIcon1), + onPressed: () { + context.push(AppRoutes.patientSettings); + }, + focused: false, + imageSize: const Size(129, 96), + ), + ), + const Spacer(), + PrimaryButton( + onPressed: () { + ref.watch(patientNotifier.notifier).setUser(user.patient); + context.push(AppRoutes.userTalk); + }, + text: '${'global.user_ottaa'.trl} ${user.settings.data.name}', + ), + const SizedBox( + height: 24, + ), + ], + ), + ), + ), + ); + } +} diff --git a/lib/presentation/screens/profile/profile_ottaa_tips_screen.dart b/lib/presentation/screens/profile/profile_ottaa_tips_screen.dart new file mode 100644 index 00000000..d48facaf --- /dev/null +++ b/lib/presentation/screens/profile/profile_ottaa_tips_screen.dart @@ -0,0 +1,42 @@ +import 'package:flutter/material.dart'; +import 'package:ottaa_project_flutter/application/common/extensions/translate_string.dart'; +import 'package:ottaa_project_flutter/presentation/common/widgets/responsive_widget.dart'; +import 'package:ottaa_project_flutter/presentation/screens/profile/ui/tips_widget.dart'; +import 'package:ottaa_ui_kit/widgets.dart'; + +class ProfileOTTAATipsScreen extends StatelessWidget { + const ProfileOTTAATipsScreen({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return ResponsiveWidget( + child: Scaffold( + appBar: OTTAAAppBar( + title: Text( + "profile.ottaa.tips".trl, + ), + ), + body: SafeArea( + child: Padding( + padding: const EdgeInsets.symmetric( + horizontal: 24, + ), + child: Column( + children: [ + Expanded( + child: ListView.builder( + itemCount: 4, + itemBuilder: (context, index) => TipsWidget( + title: "profile.tips.title${index + 1}".trl, + subtitle: 'profile.tips.text${index + 1}'.trl, + ), + ), + ), + ], + ), + ), + ), + ), + ); + } +} diff --git a/lib/presentation/screens/profile/profile_settings_edit_screen.dart b/lib/presentation/screens/profile/profile_settings_edit_screen.dart new file mode 100644 index 00000000..dfc80e40 --- /dev/null +++ b/lib/presentation/screens/profile/profile_settings_edit_screen.dart @@ -0,0 +1,200 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:go_router/go_router.dart'; +import 'package:ottaa_project_flutter/application/common/app_images.dart'; +import 'package:ottaa_project_flutter/application/common/extensions/translate_string.dart'; +import 'package:ottaa_project_flutter/application/providers/profile_provider.dart'; +import 'package:ottaa_project_flutter/application/providers/user_provider.dart'; +import 'package:ottaa_project_flutter/presentation/common/widgets/responsive_widget.dart'; +import 'package:ottaa_project_flutter/presentation/screens/profile/ui/image_edit_widget.dart'; +import 'package:ottaa_ui_kit/widgets.dart'; + +class ProfileSettingsEditScreen extends ConsumerStatefulWidget { + const ProfileSettingsEditScreen({super.key}); + + @override + ConsumerState createState() => + _ProfileSettingsEditScreenState(); +} + +class _ProfileSettingsEditScreenState + extends ConsumerState { + @override + void initState() { + WidgetsBinding.instance.addPostFrameCallback((timeStamp) { + final provider = ref.read(profileProvider); + provider.setDate(); + final user = ref.read(userProvider.select((value) => value.user)); + final data = user!.settings.data; + provider.profileEditNameController.text = data.name; + provider.profileEditSurnameController.text = data.lastName; + provider.profileEditEmailController.text = user.email; + }); + super.initState(); + } + + @override + Widget build(BuildContext context) { + final int currentYear = DateTime.now().year; + final provider = ref.watch(profileProvider); + final textTheme = Theme.of(context).textTheme; + // final colorScheme = Theme.of(context).colorScheme; + final user = ref.watch(userProvider.select((value) => value.user)); + return ResponsiveWidget( + child: Scaffold( + appBar: OTTAAAppBar( + leading: GestureDetector( + onTap: () { + provider.imageSelected = false; + context.pop(); + }, + child: const Icon( + Icons.arrow_back_ios_new_rounded, + ), + ), + title: Padding( + padding: const EdgeInsets.only(left: 16), + child: Text( + "profile.profile".trl, + style: textTheme.displaySmall, + ), + ), + ), + resizeToAvoidBottomInset: false, + body: SafeArea( + child: SingleChildScrollView( + padding: const EdgeInsets.symmetric( + horizontal: 24, + vertical: 16, + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Center( + child: ImageEditWidget( + cameraOnTap: () => + provider.pickImage(cameraOrGallery: true), + galleryOnTap: () => + provider.pickImage(cameraOrGallery: false), + imagePath: provider.profileEditImage != null + ? provider.profileEditImage!.path + : "", + imageSelected: provider.imageSelected, + imageUrl: user?.settings.data.avatar.network ?? + AppImages.kTestImage, + ), + ), + const SizedBox( + height: 24, + ), + OTTAATextInput( + hintText: 'profile.name'.trl, + controller: provider.profileEditNameController, + ), + Padding( + padding: const EdgeInsets.symmetric(vertical: 16), + child: OTTAATextInput( + hintText: 'profile.last_name'.trl, + controller: provider.profileEditSurnameController, + ), + ), + OTTAATextInput( + isReadOnly: true, + hintText: 'profile.mail'.trl, + controller: provider.profileEditEmailController, + ), + Padding( + padding: const EdgeInsets.only(top: 24, bottom: 8), + child: Text( + "profile.date".trl, + ), + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + //days + Expanded( + child: OTTAADropdown( + selected: provider.day.toString(), + onChanged: (String? a) { + provider.day = int.parse(a!); + provider.notify(); + print("day is $a"); + }, + items: List.generate( + 32, + (index) => (index).toString(), + ), + label: (String item) => Text( + item, + ), + ), + ), + const SizedBox( + width: 16, + ), + //months + Expanded( + child: OTTAADropdown( + selected: provider.month.toString(), + onChanged: (String? a) { + provider.month = int.parse(a!); + provider.notify(); + print("month is $a"); + }, + items: List.generate( + 13, + (index) => index.toString(), + ), + label: (String item) => Text( + item, + ), + ), + ), + const SizedBox( + width: 16, + ), + Expanded( + child: OTTAADropdown( + selected: provider.year.toString(), + onChanged: (String? a) { + provider.year = int.parse(a!); + provider.notify(); + }, + items: List.generate( + 80, + (index) => (currentYear - index).toString(), + ), + label: (String item) => Text( + item, + ), + ), + ), + ], + ), + ], + ), + const SizedBox( + height: 24, + ), + PrimaryButton( + onPressed: () async { + await provider.updateChanges(); + + /// reset to get new image + provider.imageSelected = false; + context.pop(); + }, + text: 'global.continue'.trl, + ), + ], + ), + ), + ), + ), + ); + } +} diff --git a/lib/presentation/screens/profile/profile_settings_screen.dart b/lib/presentation/screens/profile/profile_settings_screen.dart index 8e1831e1..f0ec117e 100644 --- a/lib/presentation/screens/profile/profile_settings_screen.dart +++ b/lib/presentation/screens/profile/profile_settings_screen.dart @@ -1,102 +1,119 @@ import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:go_router/go_router.dart'; import 'package:ottaa_project_flutter/application/common/app_images.dart'; import 'package:ottaa_project_flutter/application/common/extensions/translate_string.dart'; +import 'package:ottaa_project_flutter/application/providers/auth_provider.dart'; +import 'package:ottaa_project_flutter/application/providers/profile_provider.dart'; +import 'package:ottaa_project_flutter/application/providers/user_provider.dart'; +import 'package:ottaa_project_flutter/application/router/app_routes.dart'; +import 'package:ottaa_project_flutter/core/enums/user_types.dart'; +import 'package:ottaa_project_flutter/presentation/common/ui/loading_modal.dart'; +import 'package:ottaa_project_flutter/presentation/common/widgets/responsive_widget.dart'; import 'package:ottaa_project_flutter/presentation/screens/profile/ui/category_widget.dart'; import 'package:ottaa_project_flutter/presentation/screens/profile/ui/profile_photo_widget.dart'; +import 'package:ottaa_ui_kit/widgets.dart'; -class ProfileSettingsScreen extends StatelessWidget { +class ProfileSettingsScreen extends ConsumerWidget { const ProfileSettingsScreen({Key? key}) : super(key: key); @override - Widget build(BuildContext context) { - return Scaffold( - //todo: add the required theme here - body: SafeArea( - child: Padding( - padding: const EdgeInsets.all(24.0), - child: Column( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, + Widget build(BuildContext context, WidgetRef ref) { + final user = ref.read(userProvider.select((value) => value.user)); + final auth = ref.read(authProvider); + final provider = ref.watch(profileProvider); + return ResponsiveWidget( + child: Scaffold( + appBar: OTTAAAppBar( + title: Text( + "profile.profile".trl, + ), + actions: [ + Image.asset( + AppImages.kLogoOttaa, + height: 36, + width: 116, + fit: BoxFit.cover, + ), + ], + ), + body: SafeArea( + child: Padding( + padding: const EdgeInsets.all(24.0), + child: SingleChildScrollView( + child: Column( crossAxisAlignment: CrossAxisAlignment.center, children: [ - Row( - children: [ - GestureDetector( - onTap: () { - context.pop(); - }, - child: const Icon( - Icons.arrow_back_ios_new, - color: Colors.black, - size: 16, + ProfilePhotoWidget( + image: user?.settings.data.avatar.network ?? '', + asset: '671', + height: 120, + width: 120, + ), + const SizedBox( + height: 16, + ), + Text( + user?.settings.data.name ?? "", + ), + const SizedBox( + height: 32, + ), + CategoryWidget( + onTap: () => context.push(AppRoutes.userProfileEdit), + icon: AppImages.kProfileSettingsIcon1, + text: "profile.profile".trl, + ), + provider.isUser + ? Container() + : CategoryWidget( + onTap: () => context.push(AppRoutes.userProfileRole), + icon: AppImages.kProfileSettingsIcon2, + text: "profile.role".trl, + ), + CategoryWidget( + onTap: () => context.push(AppRoutes.userProfileHelp), + icon: AppImages.kProfileSettingsIcon3, + text: "profile.help.help".trl, + ), + provider.isUser + ? Container() + : CategoryWidget( + onTap: () => context.push(AppRoutes.userProfileAccounts), + icon: AppImages.kProfileSettingsIcon4, + text: "profile.linked_accounts".trl, ), - ), - const SizedBox( - width: 24, - ), - Text( - "profile.perfil".trl, - ), - ], + CategoryWidget( + onTap: () => context.push(AppRoutes.userProfileTips), + icon: AppImages.kProfileSettingsIcon5, + text: "profile.ottaa.tips".trl, ), - Image.asset( - AppImages.kProfileOttaalogo, - height: 36, - width: 116, + CategoryWidget( + divider: false, + onTap: () async { + final res = await auth.deleteAccount(); + if (res) { + context.go(AppRoutes.login); + } else { + //todo: show the error message. + context.pop(); + } + }, + icon: null, + text: "profile.delete_account".trl, + ), + CategoryWidget( + divider: false, + onTap: () async { + await LoadingModal.show(context, future: auth.logout); + context.go(AppRoutes.login); + }, + icon: null, + text: "profile.logout".trl, ), ], ), - const SizedBox( - height: 36, - ), - //todo: add the image link here - const ProfilePhotoWidget( - image: AppImages.kTestImage, - height: 120, - width: 120, - ), - const SizedBox( - height: 16, - ), - Text( - "UserName will be here", - ), - const SizedBox( - height: 32, - ), - CategoryWidget( - onTap: () {}, - icon: AppImages.kProfileSettingsIcon1, - text: "profile.perfil".trl, - ), - CategoryWidget( - onTap: () {}, - icon: AppImages.kProfileSettingsIcon2, - text: "profile.rol.de.uso".trl, - ), - CategoryWidget( - onTap: () {}, - icon: AppImages.kProfileSettingsIcon3, - text: "profile.ayuda".trl, - ), - CategoryWidget( - onTap: () {}, - icon: AppImages.kProfileSettingsIcon4, - text: "profile.cuentas.vinculadas".trl, - ), - CategoryWidget( - onTap: () {}, - icon: AppImages.kProfileSettingsIcon5, - text: "profile.ottaa.tips".trl, - ), - Align( - alignment: Alignment.centerLeft, - child: Text("profile.cerrar.sesión".trl,), - ), - ], + ), ), ), ), diff --git a/lib/presentation/screens/profile/ui/category_widget.dart b/lib/presentation/screens/profile/ui/category_widget.dart index 66c2164e..43faea9a 100644 --- a/lib/presentation/screens/profile/ui/category_widget.dart +++ b/lib/presentation/screens/profile/ui/category_widget.dart @@ -6,10 +6,13 @@ class CategoryWidget extends StatelessWidget { required this.onTap, required this.text, required this.icon, + this.divider = true, }) : super(key: key); - final String icon, text; + final String? icon; + final String text; final void Function()? onTap; + final bool divider; @override Widget build(BuildContext context) { @@ -21,11 +24,12 @@ class CategoryWidget extends StatelessWidget { children: [ Row( children: [ - Image.asset( - icon, - height: 24, - width: 24, - ), + if (icon != null) + Image.asset( + icon!, + height: 24, + width: 24, + ), const SizedBox( width: 16, ), @@ -34,12 +38,14 @@ class CategoryWidget extends StatelessWidget { ), ], ), - const SizedBox( - height: 12, - ), - const Divider( - color: Colors.black, - ), + if (divider) ...[ + const SizedBox( + height: 12, + ), + const Divider( + color: Colors.black, + ), + ], const SizedBox( height: 16, ), diff --git a/lib/presentation/screens/profile/ui/connected_user_widget.dart b/lib/presentation/screens/profile/ui/connected_user_widget.dart new file mode 100644 index 00000000..5c791225 --- /dev/null +++ b/lib/presentation/screens/profile/ui/connected_user_widget.dart @@ -0,0 +1,122 @@ +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; +import 'package:ottaa_project_flutter/application/common/extensions/translate_string.dart'; +import 'package:ottaa_project_flutter/application/router/app_routes.dart'; +import 'package:ottaa_project_flutter/presentation/screens/profile/ui/profile_user_widget.dart'; +import 'package:ottaa_ui_kit/widgets.dart'; + +class ConnectedUserWidget extends StatelessWidget { + const ConnectedUserWidget({ + Key? key, + required this.title, + required this.onPressed, + required this.image, + required this.actionTap, + required this.timeText, + required this.show, + required this.settingsTap, + required this.customiseTap, + required this.useOTTAATap, + required this.boardsAndPictosOnTap, + }) : super(key: key); + + final String title, image, timeText; + final void Function()? onPressed, actionTap, customiseTap, settingsTap, useOTTAATap, boardsAndPictosOnTap; + final bool show; + + @override + Widget build(BuildContext context) { + final colorScheme = Theme.of(context).colorScheme; + final textTheme = Theme.of(context).textTheme; + return Container( + decoration: BoxDecoration( + color: colorScheme.background, + ), + child: Column( + children: [ + ProfileCard( + title: title, + leadingImage: CachedNetworkImageProvider( + image, + // provider.connectedUsersProfileData[index].imageUrl, + ), + onPressed: onPressed, + subtitle: timeText, + actions: GestureDetector( + onTap: actionTap, + child: Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + Text( + show ? 'profile.close_profile'.trl : 'profile.open_profile'.trl, + style: textTheme.subtitle1, + ), + Icon( + show ? Icons.keyboard_arrow_up_rounded : Icons.keyboard_arrow_down_rounded, + color: Colors.black, + ), + ], + ), + ), + ), + AnimatedContainer( + duration: const Duration(milliseconds: 500), + height: show ? 362 : 0, + width: double.infinity, + child: SingleChildScrollView( + physics: const NeverScrollableScrollPhysics(), + child: Column( + children: [ + const SizedBox( + height: 16, + ), + Container( + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(16), + ), + padding: const EdgeInsets.all(16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ProfileUserWidget( + title: "${'profile.tips.title2'.trl} / ${'global.pictogram'.trl}", + onTap: customiseTap, + ), + ProfileUserWidget( + title: 'profile.tips.title1'.trl, + onTap: boardsAndPictosOnTap, + ), + ProfileUserWidget( + title: 'global.configuration'.trl, + onTap: settingsTap, + ), + ProfileUserWidget( + title: 'profile.profile'.trl, + onTap: () {}, + ), + ProfileUserWidget( + title: 'profile.help.help'.trl, + onTap: () => context.push(AppRoutes.userProfileHelp), + ), + const SizedBox( + height: 16, + ), + PrimaryButton( + text: 'global.user_ottaa'.trlf({'name': title}), + onPressed: useOTTAATap, + enabled: true, + ), + ], + ), + ), + ], + ), + ), + ), + ], + ), + ); + } +} diff --git a/lib/presentation/screens/profile/ui/connected_users_list.dart b/lib/presentation/screens/profile/ui/connected_users_list.dart new file mode 100644 index 00000000..03c8fa2a --- /dev/null +++ b/lib/presentation/screens/profile/ui/connected_users_list.dart @@ -0,0 +1,87 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:go_router/go_router.dart'; +import 'package:go_router/go_router.dart'; +import 'package:ottaa_project_flutter/application/common/extensions/translate_string.dart'; +import 'package:ottaa_project_flutter/application/common/extensions/user_extension.dart'; +import 'package:intl/intl.dart'; +import 'package:ottaa_project_flutter/application/common/extensions/user_extension.dart'; +import 'package:ottaa_project_flutter/application/common/time_helper.dart'; +import 'package:ottaa_project_flutter/application/notifiers/patient_notifier.dart'; +import 'package:ottaa_project_flutter/application/providers/customise_provider.dart'; +import 'package:ottaa_project_flutter/application/providers/profile_provider.dart'; +import 'package:ottaa_project_flutter/application/providers/view_board_provider.dart'; +import 'package:ottaa_project_flutter/application/router/app_routes.dart'; +import 'package:ottaa_project_flutter/core/enums/customise_data_type.dart'; +import 'package:ottaa_project_flutter/application/providers/user_settings_provider.dart'; +import 'package:ottaa_project_flutter/application/router/app_routes.dart'; +import 'package:ottaa_project_flutter/presentation/screens/profile/ui/connected_user_widget.dart'; + +class ConnectedUsersList extends ConsumerStatefulWidget { + const ConnectedUsersList({Key? key}) : super(key: key); + + @override + ConsumerState createState() => _ConnectedUsersListState(); +} + +class _ConnectedUsersListState extends ConsumerState { + @override + Widget build(BuildContext context) { + final provider = ref.watch(profileProvider); + return ListView.builder( + physics: const NeverScrollableScrollPhysics(), + shrinkWrap: true, + itemCount: provider.connectedUsersData.length, + itemBuilder: (context, index) { + return Padding( + padding: const EdgeInsets.only(top: 16), + child: ConnectedUserWidget( + title: provider.connectedUsersData[index].settings.data.name, + image: provider.connectedUsersData[index].settings.data.avatar.network!, + onPressed: () { + provider.connectedUsersProfileDataExpanded[index] = !provider.connectedUsersProfileDataExpanded[index]; + provider.notify(); + }, + actionTap: () { + provider.connectedUsersProfileDataExpanded[index] = !provider.connectedUsersProfileDataExpanded[index]; + provider.notify(); + }, + timeText: provider.connectedUsersData[index].settings.data.lastConnection.timezonedDate.timeString, + show: provider.connectedUsersProfileDataExpanded[index], + customiseTap: () async { + //todo: discuss with hector + // final customisePro = ref.watch(customiseProvider); + // customisePro.type = CustomiseDataType.careGiver; + // customisePro.userId = provider.connectedUsersData[index].id; + // context.push(AppRoutes.userCustomizeBoard); + final pro = ref.read(viewBoardProvider); + showDialog( + context: context, + barrierDismissible: false, + builder: (context) { + return const Center( + child: CircularProgressIndicator(), + ); + }, + ); + pro.selectedType = 'home.grid.title'.trl; + await pro.init(userId: provider.connectedUsersData[index].id); + context.pop(); + context.push(AppRoutes.patientViewBoardsAndPictos); + }, + settingsTap: () { + ref.read(patientNotifier.notifier).setUser(provider.connectedUsersData[index].patient); + context.push(AppRoutes.caregiverAccount); + }, + useOTTAATap: () { + final user = provider.connectedUsersData[index]; + ref.watch(patientNotifier.notifier).setUser(user.patient); + context.push(AppRoutes.userTalk); + }, + boardsAndPictosOnTap: () async {}, + ), + ); + }, + ); + } +} diff --git a/lib/presentation/screens/profile/ui/date_widget.dart b/lib/presentation/screens/profile/ui/date_widget.dart new file mode 100644 index 00000000..dc92b77d --- /dev/null +++ b/lib/presentation/screens/profile/ui/date_widget.dart @@ -0,0 +1,44 @@ +import 'package:flutter/material.dart'; + +class DateWidget extends StatelessWidget { + const DateWidget({ + Key? key, + required this.text, + required this.onTap, + }) : super(key: key); + final String text; + final void Function()? onTap; + + @override + Widget build(BuildContext context) { + //todo: add the theme here + return GestureDetector( + onTap: onTap, + child: Container( + padding: const EdgeInsets.only( + top: 16, + left: 16, + bottom: 16, + ), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(16), + border: Border.all( + color: Colors.black, + width: 0.5, + ), + ), + child: Row( + children: [ + Text( + text, + ), + Icon( + Icons.keyboard_arrow_down_sharp, + ), + ], + ), + ), + ); + } +} diff --git a/lib/presentation/screens/profile/ui/faq_container_widget.dart b/lib/presentation/screens/profile/ui/faq_container_widget.dart new file mode 100644 index 00000000..2692e86e --- /dev/null +++ b/lib/presentation/screens/profile/ui/faq_container_widget.dart @@ -0,0 +1,94 @@ +import 'package:flutter/material.dart'; + +class FaqContainerWidget extends StatelessWidget { + const FaqContainerWidget({ + Key? key, + required this.selected, + required this.subtitle, + required this.heading, + required this.onTap, + }) : super(key: key); + final bool selected; + final String subtitle, heading; + final void Function()? onTap; + + @override + Widget build(BuildContext context) { + final colorScheme = Theme.of(context).colorScheme; + return Padding( + padding: const EdgeInsets.only(bottom: 16), + child: GestureDetector( + onTap: onTap, + child: Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Container( + padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 20), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: selected + ? const BorderRadius.only( + topLeft: Radius.circular(8), + topRight: Radius.circular(8), + ) + : BorderRadius.circular(8), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + heading, + ), + selected + ? const Icon( + Icons.close, + ) + : const Icon( + Icons.add, + ), + ], + ), + ), + AnimatedContainer( + duration: const Duration(milliseconds: 500), + height: selected ? 104 : 0, + width: MediaQuery.of(context).size.width - 48, + child: selected + ? SingleChildScrollView( + physics: const NeverScrollableScrollPhysics(), + child: Column( + children: [ + Divider( + height: 3, + color: colorScheme.background, + ), + Container( + width: double.infinity, + decoration: BoxDecoration( + color: colorScheme.onPrimary, + borderRadius: const BorderRadius.only( + bottomRight: Radius.circular(8), + bottomLeft: Radius.circular(8), + ), + ), + padding: const EdgeInsets.symmetric( + vertical: 16, + horizontal: 24, + ), + child: Text( + subtitle, + maxLines: 3, + ), + ), + ], + ), + ) + : Container(), + ) + ], + ), + ), + ); + } +} diff --git a/lib/presentation/screens/profile/ui/image_edit_widget.dart b/lib/presentation/screens/profile/ui/image_edit_widget.dart new file mode 100644 index 00000000..ec51ad7a --- /dev/null +++ b/lib/presentation/screens/profile/ui/image_edit_widget.dart @@ -0,0 +1,76 @@ +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:universal_io/io.dart'; + +class ImageEditWidget extends StatelessWidget { + const ImageEditWidget({ + Key? key, + required this.imageUrl, + required this.imageSelected, + required this.imagePath, + required this.cameraOnTap, + required this.galleryOnTap, + }) : super(key: key); + final String imageUrl, imagePath; + final bool imageSelected; + final void Function()? cameraOnTap, galleryOnTap; + + @override + Widget build(BuildContext context) { + //todo: add the proper theme here + return SizedBox( + height: 170, + width: 170, + child: Stack( + children: [ + GestureDetector( + onTap: cameraOnTap, + child: Container( + height: 160, + width: 160, + clipBehavior: Clip.antiAlias, + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(16), + ), + child: imageSelected + ? (kIsWeb + ? Image.network( + imagePath, + fit: BoxFit.fill, + ) + : Image.file( + File(imagePath), + fit: BoxFit.fill, + )) + : CachedNetworkImage( + imageUrl: imageUrl, + fit: BoxFit.fill, + ), + ), + ), + Positioned( + right: 0, + bottom: 0, + child: GestureDetector( + onTap: galleryOnTap, + child: Container( + height: 34, + width: 34, + decoration: BoxDecoration( + color: const Color(0xFFB5B6B8), + borderRadius: BorderRadius.circular(16), + ), + child: const Icon( + Icons.photo_library_rounded, + color: Colors.white, + ), + ), + ), + ), + ], + ), + ); + } +} diff --git a/lib/presentation/screens/profile/ui/profile_chooser_button_widget.dart b/lib/presentation/screens/profile/ui/profile_chooser_button_widget.dart index 0fdecfcb..96d25c33 100644 --- a/lib/presentation/screens/profile/ui/profile_chooser_button_widget.dart +++ b/lib/presentation/screens/profile/ui/profile_chooser_button_widget.dart @@ -17,6 +17,8 @@ class ProfileChooserButtonWidget extends StatelessWidget { @override Widget build(BuildContext context) { + final textTheme = Theme.of(context).textTheme; + final colorScheme = Theme.of(context).colorScheme; return GestureDetector( onTap: onTap, child: Container( @@ -25,41 +27,49 @@ class ProfileChooserButtonWidget extends StatelessWidget { decoration: BoxDecoration( borderRadius: BorderRadius.circular(16), color: Colors.white, - border: selected ? Border.all( - color: kOTTAAOrangeNew, - width: 3, - ) : const Border(), + border: selected + ? Border.all( + color: kOTTAAOrangeNew, + width: 3, + ) + : const Border(), ), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Padding( - padding: const EdgeInsets.only( - left: 16, - top: 16, - ), + const SizedBox( + width: 16, + ), + Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - //todo: add the theme here + const SizedBox( + height: 16, + ), Text( heading, + style: textTheme.subtitle2, ), const SizedBox( height: 4, ), Text( subtitle, - style: TextStyle( - fontSize: 12, - ), + style: textTheme.subtitle1, + maxLines: 2, ), ], ), ), - Image.asset( - imagePath, - fit: BoxFit.fitHeight, + Expanded( + child: Align( + alignment: Alignment.centerRight, + child: Image.asset( + imagePath, + fit: BoxFit.fitHeight, + ), + ), ), ], ), diff --git a/lib/presentation/screens/profile/ui/profile_photo_widget.dart b/lib/presentation/screens/profile/ui/profile_photo_widget.dart index 6b8fdde3..8675e1f9 100644 --- a/lib/presentation/screens/profile/ui/profile_photo_widget.dart +++ b/lib/presentation/screens/profile/ui/profile_photo_widget.dart @@ -3,13 +3,8 @@ import 'package:flutter/material.dart'; import 'package:ottaa_project_flutter/application/theme/app_theme.dart'; class ProfilePhotoWidget extends StatelessWidget { - const ProfilePhotoWidget({ - Key? key, - required this.image, - this.height = 32, - this.width = 32, - }) : super(key: key); - final String image; + const ProfilePhotoWidget({Key? key, required this.image, this.height = 32, this.width = 32, this.asset = '671'}) : super(key: key); + final String image, asset; final double height, width; @override @@ -31,10 +26,12 @@ class ProfilePhotoWidget extends StatelessWidget { borderRadius: BorderRadius.circular(height / 2), ), clipBehavior: Clip.antiAlias, - child: CachedNetworkImage( - fit: BoxFit.contain, - imageUrl: image, - ), + child: image.isEmpty + ? Image.asset('assets/profiles/Group $asset@2x.png') + : CachedNetworkImage( + fit: BoxFit.contain, + imageUrl: image, + ), ), ], ), diff --git a/lib/presentation/screens/profile/ui/profile_user_widget.dart b/lib/presentation/screens/profile/ui/profile_user_widget.dart new file mode 100644 index 00000000..e13852be --- /dev/null +++ b/lib/presentation/screens/profile/ui/profile_user_widget.dart @@ -0,0 +1,36 @@ +import 'package:flutter/material.dart'; + +class ProfileUserWidget extends StatelessWidget { + const ProfileUserWidget({ + Key? key, + required this.title, + required this.onTap, + }) : super(key: key); + final String title; + final void Function()? onTap; + + @override + Widget build(BuildContext context) { + final colorScheme = Theme.of(context).colorScheme; + final textTheme = Theme.of(context).textTheme; + return GestureDetector( + onTap: onTap, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: const EdgeInsets.symmetric(vertical: 16), + child: Text( + title, + style: textTheme.headline3, + ), + ), + Divider( + height: 1, + color: colorScheme.background, + ), + ], + ), + ); + } +} diff --git a/lib/presentation/screens/profile/ui/profile_waiting_screen.dart b/lib/presentation/screens/profile/ui/profile_waiting_screen.dart index 468a9d09..44ef1fb6 100644 --- a/lib/presentation/screens/profile/ui/profile_waiting_screen.dart +++ b/lib/presentation/screens/profile/ui/profile_waiting_screen.dart @@ -1,26 +1,31 @@ import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:go_router/go_router.dart'; import 'package:ottaa_project_flutter/application/common/extensions/translate_string.dart'; +import 'package:ottaa_project_flutter/application/providers/profile_provider.dart'; +import 'package:ottaa_project_flutter/application/providers/user_provider.dart'; import 'package:ottaa_project_flutter/application/router/app_routes.dart'; import 'package:ottaa_project_flutter/application/theme/app_theme.dart'; -class ProfileWaitingScreen extends StatefulWidget { +class ProfileWaitingScreen extends ConsumerStatefulWidget { const ProfileWaitingScreen({Key? key}) : super(key: key); @override - State createState() => _ProfileWaitingScreenState(); + ConsumerState createState() => + _ProfileWaitingScreenState(); } -class _ProfileWaitingScreenState extends State { +class _ProfileWaitingScreenState extends ConsumerState { @override void initState() { super.initState(); + + final provider = ref.read(profileProvider); + final user = ref.read(userProvider.select((value) => value.user)); //todo: or we can use this callback WidgetsBinding.instance.addPostFrameCallback((_) async { - await Future.delayed( - const Duration(seconds: 2), - () => context.replace(AppRoutes.profileMainScreen), - ); + await provider.settingUpUserType(); + context.replace(AppRoutes.home); }); } @@ -36,14 +41,14 @@ class _ProfileWaitingScreenState extends State { children: [ Center( child: Text( - "profile.aguarde".trl, + "profile.wait".trl, ), ), const SizedBox( height: 16, ), Text( - "profile.configurando.su.experiencia".trl, + "profile.setting_exp".trl, textAlign: TextAlign.center, ), ], diff --git a/lib/presentation/screens/profile/ui/tips_widget.dart b/lib/presentation/screens/profile/ui/tips_widget.dart new file mode 100644 index 00000000..c6f55970 --- /dev/null +++ b/lib/presentation/screens/profile/ui/tips_widget.dart @@ -0,0 +1,63 @@ +import 'package:flutter/material.dart'; +import 'package:ottaa_project_flutter/application/common/app_images.dart'; + +class TipsWidget extends StatelessWidget { + const TipsWidget({ + Key? key, + required this.subtitle, + required this.title, + }) : super(key: key); + final String title, subtitle; + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + final textTheme = theme.textTheme; + final colorScheme = theme.colorScheme; + return Column( + mainAxisSize: MainAxisSize.min, + children: [ + Row( + children: [ + Container( + decoration: BoxDecoration( + color: colorScheme.primary, + borderRadius: BorderRadius.circular(8), + ), + padding: const EdgeInsets.all(8), + child: Image.asset( + AppImages.kIconoOttaa, + height: 12, + width: 12, + color: Colors.white, + ), + ), + const SizedBox( + width: 8, + ), + Text( + title, + style: textTheme.headline2, + textAlign: TextAlign.start, + ), + ], + ), + const SizedBox( + height: 8, + ), + Text( + subtitle, + maxLines: 3, + style: textTheme.headline4, + textAlign: TextAlign.start, + ), + Padding( + padding: const EdgeInsets.only(bottom: 16), + child: Divider( + color: colorScheme.onBackground, + ), + ), + ], + ); + } +} diff --git a/lib/presentation/screens/report/report_screen.dart b/lib/presentation/screens/report/report_screen.dart index 56504724..ac7a3190 100644 --- a/lib/presentation/screens/report/report_screen.dart +++ b/lib/presentation/screens/report/report_screen.dart @@ -23,7 +23,7 @@ class _ReportScreenState extends ConsumerState { final provider = ref.read(reportProvider); WidgetsBinding.instance.addPostFrameCallback((_) async { - await provider.init(); + // await provider.init(); }); } @@ -83,7 +83,12 @@ class _ReportScreenState extends ConsumerState { ), BottomWidget( pageController: provider.pageController, - averageSentenceValue: provider.averagePictoFrase == 0.00 ? 0.00 : double.parse(provider.averagePictoFrase.toString().substring(0, 3).toString()), + averageSentenceValue: provider.averagePictoFrase == 0.00 + ? 0.00 + : double.parse(provider.averagePictoFrase + .toString() + .substring(0, 3) + .toString()), sevenDaysValue: provider.frases7Days, ), ], diff --git a/lib/presentation/screens/report/ui/chart_widget.dart b/lib/presentation/screens/report/ui/chart_widget.dart index 8b36f055..b20ae6f2 100644 --- a/lib/presentation/screens/report/ui/chart_widget.dart +++ b/lib/presentation/screens/report/ui/chart_widget.dart @@ -2,7 +2,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:intl/intl.dart'; import 'package:ottaa_project_flutter/application/providers/report_provider.dart'; -import 'package:ottaa_project_flutter/core/models/report_chart_data_model.dart'; +import 'package:ottaa_project_flutter/core/models/chart_model.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; import 'package:syncfusion_flutter_charts/charts.dart' as ch; diff --git a/lib/presentation/screens/report/ui/most_used_phrases_widget.dart b/lib/presentation/screens/report/ui/most_used_phrases_widget.dart index 3e60d4cb..2bcb0389 100644 --- a/lib/presentation/screens/report/ui/most_used_phrases_widget.dart +++ b/lib/presentation/screens/report/ui/most_used_phrases_widget.dart @@ -56,14 +56,18 @@ class MostUsedPhrasesWidget extends ConsumerWidget { provider.loadingMostUsedSentences ? Expanded( child: ListView.builder( - itemCount: provider.mostUsedSentences[indexMain].length, + itemCount: provider + .mostUsedSentences[indexMain].length, scrollDirection: Axis.horizontal, itemBuilder: (context, indexSecond) { return Container( - padding: EdgeInsets.only(left: verticalSize * 0.01), + padding: EdgeInsets.only( + left: verticalSize * 0.01), height: verticalSize * 0.15, width: verticalSize * 0.15, - child: Image.network(provider.mostUsedSentences[indexMain][indexSecond]), + child: Image.network( + provider.mostUsedSentences[indexMain] + [indexSecond]), ); }, ), @@ -78,7 +82,8 @@ class MostUsedPhrasesWidget extends ConsumerWidget { Align( alignment: Alignment.centerRight, child: Padding( - padding: EdgeInsets.only(right: verticalSize * 0.03), + padding: + EdgeInsets.only(right: verticalSize * 0.03), child: Image.asset( AppImages.kOttaaDrawerLogo, height: verticalSize * 0.05, diff --git a/lib/presentation/screens/report/ui/ottaa_score_widget.dart b/lib/presentation/screens/report/ui/ottaa_score_widget.dart index 4e69ac32..371a44b7 100644 --- a/lib/presentation/screens/report/ui/ottaa_score_widget.dart +++ b/lib/presentation/screens/report/ui/ottaa_score_widget.dart @@ -123,7 +123,8 @@ class OTTAAScoreWidget extends StatelessWidget { ), Text( scoreText, - style: TextStyle(color: Colors.black, fontSize: verticalSize * 0.018), + style: TextStyle( + color: Colors.black, fontSize: verticalSize * 0.018), textAlign: TextAlign.center, ), ], diff --git a/lib/presentation/screens/report/ui/progress_painter.dart b/lib/presentation/screens/report/ui/progress_painter.dart index 2b4d70f4..95e55a54 100644 --- a/lib/presentation/screens/report/ui/progress_painter.dart +++ b/lib/presentation/screens/report/ui/progress_painter.dart @@ -16,7 +16,10 @@ class ProgressPainter extends CustomPainter { void paint(Canvas canvas, Size size) { Paint paint = Paint()..color = color; - final rect = Rect.fromCenter(center: Offset(size.height / 2, size.width / 2), width: size.width, height: size.height); + final rect = Rect.fromCenter( + center: Offset(size.height / 2, size.width / 2), + width: size.width, + height: size.height); canvas.drawArc( rect, diff --git a/lib/presentation/screens/report/ui/vocabulary_widget.dart b/lib/presentation/screens/report/ui/vocabulary_widget.dart index 5342b82b..aa3d6b92 100644 --- a/lib/presentation/screens/report/ui/vocabulary_widget.dart +++ b/lib/presentation/screens/report/ui/vocabulary_widget.dart @@ -16,8 +16,16 @@ class VocabularyWidget extends StatelessWidget { required this.vocabularyHeading, }) : super(key: key); - final double firstValueProgress, secondValueProgress, thirdValueProgress, fourthValueProgress; - final String firstValueText, secondValueText, thirdValueText, fourthValueText, heading, vocabularyHeading; + final double firstValueProgress, + secondValueProgress, + thirdValueProgress, + fourthValueProgress; + final String firstValueText, + secondValueText, + thirdValueText, + fourthValueText, + heading, + vocabularyHeading; @override Widget build(BuildContext context) { @@ -54,7 +62,9 @@ class VocabularyWidget extends StatelessWidget { children: [ ///first one Padding( - padding: EdgeInsets.only(left: verticalSize * 0.005, top: verticalSize * 0.005), + padding: EdgeInsets.only( + left: verticalSize * 0.005, + top: verticalSize * 0.005), child: Container( height: verticalSize * 0.29, width: verticalSize * 0.29, @@ -75,7 +85,9 @@ class VocabularyWidget extends StatelessWidget { ), ), Padding( - padding: EdgeInsets.only(left: verticalSize * 0.025, top: verticalSize * 0.025), + padding: EdgeInsets.only( + left: verticalSize * 0.025, + top: verticalSize * 0.025), child: CustomPaint( painter: ProgressPainter( value: 100, @@ -90,7 +102,9 @@ class VocabularyWidget extends StatelessWidget { /// second value Padding( - padding: EdgeInsets.only(top: verticalSize * 0.04, left: verticalSize * 0.04), + padding: EdgeInsets.only( + top: verticalSize * 0.04, + left: verticalSize * 0.04), child: Container( height: verticalSize * 0.22, width: verticalSize * 0.22, @@ -111,7 +125,9 @@ class VocabularyWidget extends StatelessWidget { ), ), Padding( - padding: EdgeInsets.only(left: verticalSize * 0.06, top: verticalSize * 0.06), + padding: EdgeInsets.only( + left: verticalSize * 0.06, + top: verticalSize * 0.06), child: CustomPaint( painter: ProgressPainter( value: 100, @@ -150,7 +166,9 @@ class VocabularyWidget extends StatelessWidget { ), ), Padding( - padding: EdgeInsets.only(left: verticalSize * 0.095, top: verticalSize * 0.095), + padding: EdgeInsets.only( + left: verticalSize * 0.095, + top: verticalSize * 0.095), child: CustomPaint( painter: ProgressPainter( value: 100, @@ -189,7 +207,9 @@ class VocabularyWidget extends StatelessWidget { ), ), Padding( - padding: EdgeInsets.only(left: verticalSize * 0.122, top: verticalSize * 0.122), + padding: EdgeInsets.only( + left: verticalSize * 0.122, + top: verticalSize * 0.122), child: CustomPaint( painter: ProgressPainter( value: 100, @@ -214,7 +234,8 @@ class VocabularyWidget extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.center, children: [ Padding( - padding: EdgeInsets.symmetric(vertical: verticalSize * 0.02), + padding: + EdgeInsets.symmetric(vertical: verticalSize * 0.02), child: Text( heading, ), @@ -231,7 +252,8 @@ class VocabularyWidget extends StatelessWidget { ), ), Padding( - padding: EdgeInsets.symmetric(vertical: verticalSize * 0.01), + padding: + EdgeInsets.symmetric(vertical: verticalSize * 0.01), child: RowWidget( color: Colors.pink, text: thirdValueText, diff --git a/lib/presentation/screens/sentences/add_or_remove _favourites_screen.dart b/lib/presentation/screens/sentences/add_or_remove _favourites_screen.dart index 2421c515..bdf09946 100644 --- a/lib/presentation/screens/sentences/add_or_remove _favourites_screen.dart +++ b/lib/presentation/screens/sentences/add_or_remove _favourites_screen.dart @@ -4,8 +4,6 @@ import 'package:go_router/go_router.dart'; import 'package:ottaa_project_flutter/application/common/extensions/translate_string.dart'; import 'package:ottaa_project_flutter/application/providers/sentences_provider.dart'; import 'package:ottaa_project_flutter/application/theme/app_theme.dart'; -import 'package:ottaa_project_flutter/core/models/pictogram_model.dart'; -import 'package:ottaa_project_flutter/presentation/common/widgets/mini_picto_widget.dart'; import 'package:ottaa_project_flutter/presentation/common/widgets/ottaa_logo_widget.dart'; import 'package:ottaa_project_flutter/presentation/screens/sentences/ui/list_pictos_widget.dart'; @@ -17,17 +15,24 @@ class AddOrRemoveFavouriteScreen extends ConsumerWidget { double verticalSize = MediaQuery.of(context).size.height; double horizontalSize = MediaQuery.of(context).size.width; // final provider = ref.read(sentencesProvider); - final speak = ref.read(sentencesProvider.select((prov) => prov.speakFavOrNot)); - final showCircular = ref.watch(sentencesProvider.select((prov) => prov.showCircular)); + final speak = + ref.read(sentencesProvider.select((prov) => prov.speakFavOrNot)); + final showCircular = + ref.watch(sentencesProvider.select((prov) => prov.showCircular)); - var selectedIndexFavSelection = ref.read(sentencesProvider.select((prov) => prov.selectedIndexFavSelection)); - final changeSentencesIndex = ref.read(sentencesProvider.select((prov) => prov.changeSelectedIndexFavSelection)); + var selectedIndexFavSelection = ref.read( + sentencesProvider.select((prov) => prov.selectedIndexFavSelection)); + final changeSentencesIndex = ref.read(sentencesProvider + .select((prov) => prov.changeSelectedIndexFavSelection)); - final saveFavourite = ref.read(sentencesProvider.select((prov) => prov.saveFavourite)); + final saveFavourite = + ref.read(sentencesProvider.select((prov) => prov.saveFavourite)); - final favouriteOrNotPicts = ref.read(sentencesProvider.select((prov) => prov.favouriteOrNotPicts)); + final favouriteOrNotPicts = + ref.read(sentencesProvider.select((prov) => prov.favouriteOrNotPicts)); - final sentences = ref.read(sentencesProvider.select((prov) => prov.sentences)); + final sentences = + ref.read(sentencesProvider.select((prov) => prov.sentences)); return Scaffold( appBar: AppBar( @@ -117,7 +122,8 @@ class AddOrRemoveFavouriteScreen extends ConsumerWidget { child: Container( height: verticalSize * 0.5, width: horizontalSize * 0.8, - padding: EdgeInsets.symmetric(horizontal: horizontalSize * 0.12), + padding: + EdgeInsets.symmetric(horizontal: horizontalSize * 0.12), child: SingleChildScrollView( scrollDirection: Axis.horizontal, child: Row( @@ -128,8 +134,9 @@ class AddOrRemoveFavouriteScreen extends ConsumerWidget { ? ListPictosWidget( height: verticalSize / 2.5, width: horizontalSize * 0.78, - backgrounColor: sentences[selectedIndexFavSelection].favouriteOrNot ? Colors.blue : Colors.transparent, - padding: EdgeInsets.symmetric(vertical: verticalSize * 0.05), + // backgrounColor: sentences[selectedIndexFavSelection].favouriteOrNot ? Colors.blue : Colors.transparent, TODO: Change this to uncomment code :/ + padding: EdgeInsets.symmetric( + vertical: verticalSize * 0.05), ) : Container() ], diff --git a/lib/presentation/screens/sentences/favourites_screen.dart b/lib/presentation/screens/sentences/favourites_screen.dart index 3b9af294..d0d631ca 100644 --- a/lib/presentation/screens/sentences/favourites_screen.dart +++ b/lib/presentation/screens/sentences/favourites_screen.dart @@ -5,7 +5,6 @@ import 'package:ottaa_project_flutter/application/common/extensions/translate_st import 'package:ottaa_project_flutter/application/providers/sentences_provider.dart'; import 'package:ottaa_project_flutter/application/router/app_routes.dart'; import 'package:ottaa_project_flutter/application/theme/app_theme.dart'; -import 'package:ottaa_project_flutter/core/models/pictogram_model.dart'; import 'package:ottaa_project_flutter/presentation/common/widgets/mini_picto_widget.dart'; import 'package:ottaa_project_flutter/presentation/common/widgets/ottaa_logo_widget.dart'; import 'package:ottaa_project_flutter/presentation/screens/sentences/ui/list_pictos_widget.dart'; @@ -19,12 +18,16 @@ class FavouriteScreen extends ConsumerWidget { double horizontalSize = MediaQuery.of(context).size.width; final speak = ref.read(sentencesProvider.select((prov) => prov.speakFav)); - final showCircular = ref.watch(sentencesProvider.select((prov) => prov.showCircular)); + final showCircular = + ref.watch(sentencesProvider.select((prov) => prov.showCircular)); - var sentencesIndex = ref.read(sentencesProvider.select((prov) => prov.sentencesIndex)); - final changeSentencesIndex = ref.read(sentencesProvider.select((prov) => prov.changeSelectedIndexFav)); + var sentencesIndex = + ref.read(sentencesProvider.select((prov) => prov.sentencesIndex)); + final changeSentencesIndex = ref + .read(sentencesProvider.select((prov) => prov.changeSelectedIndexFav)); - final favouritesList = ref.read(sentencesProvider.select((prov) => prov.favouriteSentences)); + final favouritesList = + ref.read(sentencesProvider.select((prov) => prov.favouriteSentences)); return Scaffold( appBar: AppBar( @@ -35,7 +38,6 @@ class FavouriteScreen extends ConsumerWidget { title: Text('favourite_sentences'.trl), actions: [ GestureDetector( - onTap: () => context.push(AppRoutes.addOrRemoveFavouriteSentences), child: const Icon( Icons.favorite, ), @@ -78,9 +80,6 @@ class FavouriteScreen extends ConsumerWidget { /// for keeping them in order and the button will be in separate Positioned Container(), GestureDetector( - onTap: () { - context.push(AppRoutes.addOrRemoveFavouriteSentences); - }, child: Icon( Icons.edit, size: verticalSize * 0.1, @@ -102,13 +101,15 @@ class FavouriteScreen extends ConsumerWidget { child: Container( height: verticalSize * 0.8, width: horizontalSize * 0.8, - padding: EdgeInsets.symmetric(horizontal: horizontalSize * 0.099), + padding: + EdgeInsets.symmetric(horizontal: horizontalSize * 0.099), child: Container( decoration: BoxDecoration( color: Colors.black, borderRadius: BorderRadius.circular(15), ), - padding: EdgeInsets.symmetric(horizontal: horizontalSize * 0.02), + padding: + EdgeInsets.symmetric(horizontal: horizontalSize * 0.02), child: Center( //todo: update the view according to the things child: SizedBox( @@ -126,7 +127,8 @@ class FavouriteScreen extends ConsumerWidget { ? ListPictosWidget( height: verticalSize / 3, width: horizontalSize * 0.78, - padding: EdgeInsets.symmetric(vertical: verticalSize * 0.05), + padding: EdgeInsets.symmetric( + vertical: verticalSize * 0.05), ) : Container() ], diff --git a/lib/presentation/screens/sentences/sentences_screen.dart b/lib/presentation/screens/sentences/sentences_screen.dart index 39de3c24..d0f78aae 100644 --- a/lib/presentation/screens/sentences/sentences_screen.dart +++ b/lib/presentation/screens/sentences/sentences_screen.dart @@ -6,7 +6,6 @@ import 'package:ottaa_project_flutter/application/common/extensions/translate_st import 'package:ottaa_project_flutter/application/providers/sentences_provider.dart'; import 'package:ottaa_project_flutter/application/router/app_routes.dart'; import 'package:ottaa_project_flutter/application/theme/app_theme.dart'; -import 'package:ottaa_project_flutter/core/models/pictogram_model.dart'; import 'package:ottaa_project_flutter/presentation/common/widgets/mini_picto_widget.dart'; import 'package:ottaa_project_flutter/presentation/common/widgets/ottaa_logo_widget.dart'; import 'package:ottaa_project_flutter/presentation/screens/sentences/ui/list_pictos_widget.dart'; @@ -40,12 +39,16 @@ class _SentencesPageState extends ConsumerState { final speak = ref.read(sentencesProvider.select((prov) => prov.speak)); - final showCircular = ref.watch(sentencesProvider.select((prov) => prov.showCircular)); + final showCircular = + ref.watch(sentencesProvider.select((prov) => prov.showCircular)); - var sentencesIndex = ref.read(sentencesProvider.select((prov) => prov.sentencesIndex)); - final changeSentencesIndex = ref.read(sentencesProvider.select((prov) => prov.changeSelectedIndexFav)); + var sentencesIndex = + ref.read(sentencesProvider.select((prov) => prov.sentencesIndex)); + final changeSentencesIndex = ref + .read(sentencesProvider.select((prov) => prov.changeSelectedIndexFav)); - final fetchFavourites = ref.read(sentencesProvider.select((prov) => prov.fetchFavourites)); + final fetchFavourites = + ref.read(sentencesProvider.select((prov) => prov.fetchFavourites)); return Scaffold( appBar: AppBar( @@ -58,7 +61,6 @@ class _SentencesPageState extends ConsumerState { GestureDetector( onTap: () { fetchFavourites(); - context.push(AppRoutes.favouriteSentences); }, child: const Icon(Icons.star), ), @@ -100,9 +102,7 @@ class _SentencesPageState extends ConsumerState { /// for keeping them in order and the button will be in separate Positioned Container(), GestureDetector( - onTap: () { - context.push(AppRoutes.searchSentences); - }, + onTap: () {}, child: Icon( Icons.search, size: verticalSize * 0.1, @@ -123,16 +123,20 @@ class _SentencesPageState extends ConsumerState { bottom: verticalSize * 0.17, child: Container( height: verticalSize * 0.8, - padding: EdgeInsets.symmetric(horizontal: horizontalSize * 0.099), + padding: + EdgeInsets.symmetric(horizontal: horizontalSize * 0.099), child: Container( decoration: BoxDecoration( color: Colors.black, borderRadius: BorderRadius.circular(15), ), - padding: EdgeInsets.symmetric(horizontal: horizontalSize * 0.02), + padding: + EdgeInsets.symmetric(horizontal: horizontalSize * 0.02), child: Center( child: FadeInDown( - controller: (controller) => ref.read(sentencesProvider.select((prov) => prov.setAnimationController))(controller), + controller: (controller) => ref.read(sentencesProvider + .select((prov) => prov.setAnimationController))( + controller), from: 30, child: SingleChildScrollView( scrollDirection: Axis.horizontal, diff --git a/lib/presentation/screens/sentences/ui/list_pictos_widget.dart b/lib/presentation/screens/sentences/ui/list_pictos_widget.dart index 4a45afa3..0621462b 100644 --- a/lib/presentation/screens/sentences/ui/list_pictos_widget.dart +++ b/lib/presentation/screens/sentences/ui/list_pictos_widget.dart @@ -1,7 +1,8 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:ottaa_project_flutter/application/providers/sentences_provider.dart'; -import 'package:ottaa_project_flutter/core/models/pictogram_model.dart'; +import 'package:ottaa_project_flutter/core/models/assets_image.dart'; +import 'package:ottaa_project_flutter/core/models/picto_model.dart'; import 'package:ottaa_project_flutter/presentation/common/widgets/mini_picto_widget.dart'; class ListPictosWidget extends ConsumerWidget { @@ -10,7 +11,8 @@ class ListPictosWidget extends ConsumerWidget { final EdgeInsets? padding; final Color? backgrounColor; - const ListPictosWidget({super.key, this.width, this.height, this.padding, this.backgrounColor}); + const ListPictosWidget( + {super.key, this.width, this.height, this.padding, this.backgrounColor}); @override Widget build(BuildContext context, WidgetRef ref) { @@ -27,24 +29,30 @@ class ListPictosWidget extends ConsumerWidget { child: ListView.builder( shrinkWrap: true, scrollDirection: Axis.horizontal, - itemCount: provider.favouriteOrNotPicts[provider.selectedIndexFavSelection].length + 1, + itemCount: provider + .favouriteOrNotPicts[provider.selectedIndexFavSelection] + .length + + 1, itemBuilder: (BuildContext context, int index) { - final Pict speakPict = Pict( - localImg: true, - id: 0, - texto: Texto(), - tipo: 6, - imagen: Imagen(picto: "logo_ottaa_dev"), + final Picto speakPict = Picto( + id: "0", + type: 6, + resource: AssetsImage(asset: "logo_ottaa_dev", network: null), ); - if (provider.favouriteOrNotPicts[provider.selectedIndexFavSelection].length > index) { - final Pict pict = provider.favouriteOrNotPicts[provider.selectedIndexFavSelection][index]; + if (provider.favouriteOrNotPicts[provider.selectedIndexFavSelection] + .length > + index) { + final Picto pict = provider + .favouriteOrNotPicts[provider.selectedIndexFavSelection] + [index]; return Container( margin: const EdgeInsets.all(10), child: MiniPicto( - localImg: pict.localImg, + localImg: pict.resource.asset != null, pict: pict, onTap: () { - provider.sentences[provider.selectedIndexFavSelection].favouriteOrNot = !provider.sentences[provider.selectedIndexFavSelection].favouriteOrNot; + // provider.sentences[provider.selectedIndexFavSelection].favouriteOrNot = !provider.sentences[provider.selectedIndexFavSelection].favouriteOrNot; + //TODO: Fix this provider.speakFavOrNot(); }, ), @@ -53,10 +61,11 @@ class ListPictosWidget extends ConsumerWidget { return Container( margin: const EdgeInsets.all(10), child: MiniPicto( - localImg: speakPict.localImg, + localImg: speakPict.resource.asset != null, pict: speakPict, onTap: () { - provider.sentences[provider.selectedIndexFavSelection].favouriteOrNot = !provider.sentences[provider.selectedIndexFavSelection].favouriteOrNot; + // provider.sentences[provider.selectedIndexFavSelection].favouriteOrNot = !provider.sentences[provider.selectedIndexFavSelection].favouriteOrNot; + //TODO: Fix this provider.speakFavOrNot(); }, ), diff --git a/lib/presentation/screens/sentences/ui/search_sentence.dart b/lib/presentation/screens/sentences/ui/search_sentence.dart index 4ea914fc..1b924810 100644 --- a/lib/presentation/screens/sentences/ui/search_sentence.dart +++ b/lib/presentation/screens/sentences/ui/search_sentence.dart @@ -5,7 +5,7 @@ import 'package:go_router/go_router.dart'; import 'package:ottaa_project_flutter/application/common/extensions/translate_string.dart'; import 'package:ottaa_project_flutter/application/providers/sentences_provider.dart'; import 'package:ottaa_project_flutter/application/theme/app_theme.dart'; -import 'package:ottaa_project_flutter/core/models/pictogram_model.dart'; +import 'package:ottaa_project_flutter/core/models/picto_model.dart'; import 'package:ottaa_project_flutter/presentation/common/widgets/column_widget.dart'; import 'package:ottaa_project_flutter/presentation/common/widgets/mini_picto_widget.dart'; import 'package:ottaa_project_flutter/presentation/common/widgets/ottaa_logo_widget.dart'; @@ -86,80 +86,61 @@ class SearchSentenceScreen extends ConsumerWidget { crossAxisAlignment: CrossAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center, children: [ - provider.sentencesForList.isNotEmpty - ? Container( - height: verticalSize / 3, - child: ListView.builder( - shrinkWrap: true, - scrollDirection: Axis.horizontal, - itemCount: provider - .sentencesPicts[provider - .sentencesForList[ - provider.searchIndex] - .index] - .length + - 1, - itemBuilder: - (BuildContext context, int index) { - final Pict speakPict = Pict( - localImg: true, - id: 0, - texto: Texto(), - tipo: 6, - imagen: - Imagen(picto: "logo_ottaa_dev"), - ); - if (provider - .sentencesPicts[provider - .sentencesForList[ - provider.searchIndex] - .index] - .length > - index) { - final Pict pict = - provider.sentencesPicts[provider - .sentencesForList[ - provider.searchIndex] - .index][index]; - return Container( - margin: const EdgeInsets.all(10), - child: MiniPicto( - localImg: pict.localImg, - pict: pict, - onTap: () { - provider.searchSpeak(); - }, - ), - ); - } else { - return Bounce( - from: 6, - infinite: true, - child: Container( - margin: - const EdgeInsets.all(10), - child: MiniPicto( - localImg: speakPict.localImg, - pict: speakPict, - onTap: () { - provider.searchSpeak(); - }, - ), - ), - ); - } - }, - ), - ) - : Center( - child: Text( - 'please_enter_a_valid_search'.trl, - style: const TextStyle( - color: Colors.white, - fontSize: 23, - ), - ), - ), + // provider.sentences.isNotEmpty + // ? Container( + // height: verticalSize / 3, + // child: ListView.builder( + // shrinkWrap: true, + // scrollDirection: Axis.horizontal, + // itemCount: provider.sentencesPicts[provider.sentencesForList[provider.searchIndex].index].length + 1, + // itemBuilder: (BuildContext context, int index) { + // final Picto speakPict = Picto( + // localImg: true, + // id: 0, + // texto: Texto(), + // tipo: 6, + // imagen: Imagen(picto: "logo_ottaa_dev"), + // ); + // if (provider.sentencesPicts[provider.sentencesForList[provider.searchIndex].index].length > index) { + // final Picto pict = provider.sentencesPicts[provider.sentencesForList[provider.searchIndex].index][index]; + // return Container( + // margin: const EdgeInsets.all(10), + // child: MiniPicto( + // localImg: pict.localImg, + // pict: pict, + // onTap: () { + // provider.searchSpeak(); + // }, + // ), + // ); + // } else { + // return Bounce( + // from: 6, + // infinite: true, + // child: Container( + // margin: const EdgeInsets.all(10), + // child: MiniPicto( + // localImg: speakPict.localImg, + // pict: speakPict, + // onTap: () { + // provider.searchSpeak(); + // }, + // ), + // ), + // ); + // } + // }, + // ), + // ) + // : Center( + // child: Text( + // 'please_enter_a_valid_search'.trl, + // style: const TextStyle( + // color: Colors.white, + // fontSize: 23, + // ), + // ), + // ), ], ), ), diff --git a/lib/presentation/screens/splash/splash_screen.dart b/lib/presentation/screens/splash/splash_screen.dart index 9839be4d..689f5346 100644 --- a/lib/presentation/screens/splash/splash_screen.dart +++ b/lib/presentation/screens/splash/splash_screen.dart @@ -1,10 +1,22 @@ +import 'dart:developer'; + import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:go_router/go_router.dart'; +import 'package:intl/date_symbol_data_local.dart'; +import 'package:ottaa_project_flutter/application/common/app_images.dart'; import 'package:ottaa_project_flutter/application/common/extensions/translate_string.dart'; +import 'package:ottaa_project_flutter/application/common/extensions/user_extension.dart'; +import 'package:ottaa_project_flutter/application/common/i18n.dart'; +import 'package:ottaa_project_flutter/application/common/screen_helpers.dart'; import 'package:ottaa_project_flutter/application/notifiers/auth_notifier.dart'; +import 'package:ottaa_project_flutter/application/notifiers/patient_notifier.dart'; import 'package:ottaa_project_flutter/application/providers/splash_provider.dart'; +import 'package:ottaa_project_flutter/application/providers/user_provider.dart'; import 'package:ottaa_project_flutter/application/router/app_routes.dart'; +import 'package:ottaa_project_flutter/core/enums/user_types.dart'; +import 'package:ottaa_project_flutter/presentation/common/widgets/ottaa_loading_animation.dart'; +import 'package:responsive_builder/responsive_builder.dart'; class SplashScreen extends ConsumerStatefulWidget { const SplashScreen({super.key}); @@ -19,25 +31,37 @@ class _SplashScreenState extends ConsumerState { super.initState(); SplashProvider provider = ref.read(splashProvider); - final isLogged = ref.read(authNotifier); + final auth = ref.read(authNotifier.notifier); WidgetsBinding.instance.addPostFrameCallback((timeStamp) async { - print(isLogged); - if (isLogged) { - bool isFirstTime = await provider.isFirstTime(); - bool hasPhoto = await provider.checkUserAvatar(); - bool hasInfo = await provider.fetchUserInformation(); + DeviceScreenType deviceScreenType = getDeviceType(MediaQuery.of(context).size); + if (deviceScreenType != DeviceScreenType.mobile) { + await blockLandscapeMode(); + } else { + await blockPortraitMode(); + } + + setState(() {}); + + bool isLogged = await provider.fetchUserInformation(); + bool isFirstTime = await provider.isFirstTime(); + if (isLogged) { + final user = ref.read(userProvider.select((value) => value.user)); + auth.setSignedIn(); + await I18N.of(context).changeLanguage(user?.settings.language.language ?? "es_AR"); + log(user?.settings.language.language ?? "NO LNG"); if (mounted) { - if (!hasInfo) { - return context.go(AppRoutes.login); - } + initializeDateFormatting(user?.settings.language.language ?? "es_AR"); if (isFirstTime) { - return context.go(AppRoutes.onboarding, extra: 0); + return context.go(AppRoutes.onboarding); } - if (!hasPhoto) { - return context.go(AppRoutes.onboarding, extra: 2); + final time = DateTime.now().millisecondsSinceEpoch; + await provider.updateLastConnectionTime(userId: user!.id, time: time); + + if (user.type == UserType.user) { + ref.read(patientNotifier.notifier).setUser(user.patient); } return context.go(AppRoutes.home); @@ -49,19 +73,34 @@ class _SplashScreenState extends ConsumerState { @override Widget build(BuildContext context) { + final textTheme = Theme.of(context).textTheme; + final size = MediaQuery.of(context).size; + return Scaffold( body: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ - const Image( - image: AssetImage('assets/imgs/logo_ottaa.webp'), + const Spacer(), + Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + const OttaaLoadingAnimation( + width: 40, + height: 100, + ), + const SizedBox(width: 20), + Text( + "global.hello".trl, + style: textTheme.titleMedium?.copyWith(color: Theme.of(context).primaryColor, fontSize: 40, fontWeight: FontWeight.bold), + ), + ], ), - const LinearProgressIndicator( - backgroundColor: Colors.grey, - color: Colors.deepOrange, + const Spacer(), + Padding( + padding: const EdgeInsets.all(8.0), + child: Image(image: const AssetImage(AppImages.kLogoOttaa), width: (size.width * 0.5).clamp(200, 400)), ), - const SizedBox(height: 10), - Text("we_are_preparing_everything".trl) ], ), ); diff --git a/lib/presentation/screens/tutorial/ui/fourth_step.dart b/lib/presentation/screens/tutorial/ui/fourth_step.dart index 141666c0..261bab10 100644 --- a/lib/presentation/screens/tutorial/ui/fourth_step.dart +++ b/lib/presentation/screens/tutorial/ui/fourth_step.dart @@ -38,7 +38,8 @@ class FourthStep extends StatelessWidget { child: FittedBox( child: Text( "Play_and_learn".trl, - style: const TextStyle(color: kOTTAAOrangeNew, fontWeight: FontWeight.w600), + style: const TextStyle( + color: kOTTAAOrangeNew, fontWeight: FontWeight.w600), ), ), ), diff --git a/lib/presentation/screens/tutorial/ui/second_step.dart b/lib/presentation/screens/tutorial/ui/second_step.dart index 9f491e4d..d9eba9b2 100644 --- a/lib/presentation/screens/tutorial/ui/second_step.dart +++ b/lib/presentation/screens/tutorial/ui/second_step.dart @@ -37,7 +37,8 @@ class SecondStep extends StatelessWidget { child: FittedBox( child: Text( "Talk_to_the_world".trl, - style: const TextStyle(color: kOTTAAOrangeNew, fontWeight: FontWeight.w600), + style: const TextStyle( + color: kOTTAAOrangeNew, fontWeight: FontWeight.w600), ), ), ), @@ -61,7 +62,9 @@ class SecondStep extends StatelessWidget { SimpleButton( text: "Previous".trl, leading: Icons.chevron_left, - onTap: () => controller.animateToPage(0, duration: const Duration(milliseconds: 300), curve: Curves.easeInOut), + onTap: () => controller.animateToPage(0, + duration: const Duration(milliseconds: 300), + curve: Curves.easeInOut), backgroundColor: Colors.white, fontColor: Colors.grey, ), diff --git a/lib/presentation/screens/tutorial/ui/third_step.dart b/lib/presentation/screens/tutorial/ui/third_step.dart index ee735acb..40585df7 100644 --- a/lib/presentation/screens/tutorial/ui/third_step.dart +++ b/lib/presentation/screens/tutorial/ui/third_step.dart @@ -38,7 +38,8 @@ class ThirdStep extends StatelessWidget { child: FittedBox( child: Text( "Access_thousands_of_pictograms".trl, - style: const TextStyle(color: Colors.white, fontWeight: FontWeight.w600), + style: const TextStyle( + color: Colors.white, fontWeight: FontWeight.w600), ), ), ), @@ -62,14 +63,18 @@ class ThirdStep extends StatelessWidget { SimpleButton( text: "Previous".trl, leading: Icons.chevron_left, - onTap: () => controller.animateToPage(1, duration: const Duration(milliseconds: 300), curve: Curves.easeInOut), + onTap: () => controller.animateToPage(1, + duration: const Duration(milliseconds: 300), + curve: Curves.easeInOut), backgroundColor: Colors.white, fontColor: Colors.grey, ), SimpleButton( text: "Next".trl, trailing: Icons.chevron_right, - onTap: () => controller.animateToPage(3, duration: const Duration(milliseconds: 300), curve: Curves.easeInOut), + onTap: () => controller.animateToPage(3, + duration: const Duration(milliseconds: 300), + curve: Curves.easeInOut), backgroundColor: Colors.white, fontColor: kOTTAAOrangeNew, ), diff --git a/lib/presentation/screens/user_settings/accessibility_screen.dart b/lib/presentation/screens/user_settings/accessibility_screen.dart new file mode 100644 index 00000000..0ca0c835 --- /dev/null +++ b/lib/presentation/screens/user_settings/accessibility_screen.dart @@ -0,0 +1,260 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:go_router/go_router.dart'; +import 'package:ottaa_project_flutter/application/common/app_images.dart'; +import 'package:ottaa_project_flutter/application/common/extensions/translate_string.dart'; +import 'package:ottaa_project_flutter/application/providers/user_settings_provider.dart'; +import 'package:ottaa_project_flutter/core/enums/devices_accessibility.dart'; +import 'package:ottaa_project_flutter/core/enums/sweep_modes.dart'; +import 'package:ottaa_project_flutter/core/enums/velocity_types.dart'; +import 'package:ottaa_project_flutter/presentation/common/widgets/responsive_widget.dart'; +import 'package:ottaa_project_flutter/presentation/screens/user_settings/ui/accessibility_widget.dart'; +import 'package:ottaa_project_flutter/presentation/screens/user_settings/ui/chooser_widget.dart'; +import 'package:ottaa_project_flutter/presentation/screens/user_settings/ui/divider_widget.dart'; +import 'package:ottaa_project_flutter/presentation/screens/user_settings/ui/switch_widget.dart'; +import 'package:ottaa_project_flutter/presentation/screens/user_settings/ui/tab_widget.dart'; +import 'package:ottaa_ui_kit/widgets.dart'; + +class AccessibilityScreen extends ConsumerWidget { + const AccessibilityScreen({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final textTheme = Theme.of(context).textTheme; + final colorScheme = Theme.of(context).colorScheme; + var sliderValue = ref.watch(userSettingsProvider).sliderValue; + final provider = ref.read(userSettingsProvider); + return WillPopScope( + onWillPop: () async { + provider.updateAccessibilitySettings(); + return true; + }, + child: ResponsiveWidget( + child: Scaffold( + appBar: OTTAAAppBar( + leading: IconButton( + icon: const Icon(Icons.arrow_back_ios), + onPressed: () async { + provider.updateAccessibilitySettings(); + context.pop(); + }, + splashRadius: 24, + ), + title: Text( + 'user.settings.accessibility'.trl, + style: textTheme.headline3, + ), + ), + body: Padding( + padding: const EdgeInsets.symmetric(horizontal: 24), + child: SingleChildScrollView( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'user.accessibility.selection'.trl, + style: + textTheme.headline2!.copyWith(color: colorScheme.primary), + ), + const SizedBox( + height: 8, + ), + Text( + 'user.accessibility.bar_text'.trl, + style: textTheme.headline3, + ), + const SizedBox( + height: 32, + ), + Slider( + label: sliderValue.toStringAsFixed(1), + divisions: 24, + value: sliderValue, + activeColor: Colors.white, + inactiveColor: Colors.white, + thumbColor: colorScheme.primary, + min: 0.2, + max: 5.0, + onChanged: (value) { + provider.changeSpeed(value: value); + }, + ), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 16), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: const [ + Text('0.2'), + Text('5'), + ], + ), + ), + const DividerWidget(), + Text( + 'user.accessibility.connected'.trl, + style: + textTheme.headline2!.copyWith(color: colorScheme.primary), + ), + SwitchWidget( + onChanged: (value) { + provider.changeDeviceOnOff(mode: value); + }, + title: 'user.accessibility.device'.trl, + value: provider.accessibilitySetting.device == + DevicesAccessibility.none + ? false + : true, + ), + const SizedBox( + height: 24, + ), + Stack( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + AccessibilityWidget( + title: 'user.accessibility.press'.trl, + onTap: () { + provider.changeDevice( + devicesAccessibility: + DevicesAccessibility.press); + }, + image: AppImages.kAccessibilityPhoto1, + selected: provider.accessibilitySetting.device == + DevicesAccessibility.press, + ), + AccessibilityWidget( + title: 'user.accessibility.scroll'.trl, + onTap: () { + provider.changeDevice( + devicesAccessibility: + DevicesAccessibility.scroll); + }, + image: AppImages.kAccessibilityPhoto2, + selected: provider.accessibilitySetting.device == + DevicesAccessibility.scroll, + ), + AccessibilityWidget( + title: 'user.accessibility.sip'.trl, + onTap: () { + provider.changeDevice( + devicesAccessibility: + DevicesAccessibility.sipuff); + }, + image: AppImages.kAccessibilityPhoto3, + selected: provider.accessibilitySetting.device == + DevicesAccessibility.sipuff, + ), + ], + ), + provider.accessibilitySetting.device == + DevicesAccessibility.none + ? Container( + height: 100, + width: MediaQuery.of(context).size.width - 48, + decoration: BoxDecoration( + color: Colors.grey.withOpacity(0.4), + ), + ) + : const SizedBox.shrink(), + ], + ), + const DividerWidget(), + Text( + 'user.accessibility.selection_type'.trl, + style: + textTheme.headline2!.copyWith(color: colorScheme.primary), + ), + const SizedBox( + height: 8, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + TabWidget( + title: 'user.accessibility.selection'.trl, + image: AppImages.kAccessibilityIcon1, + selected: provider.accessibilitySetting.sweepMode == + SweepModes.elements + ? true + : false, + onTap: () { + provider.changeSelection(modes: SweepModes.elements); + }, + ), + TabWidget( + title: 'user.accessibility.swept'.trl, + image: AppImages.kAccessibilityIcon2, + selected: provider.accessibilitySetting.sweepMode == + SweepModes.sweep + ? true + : false, + onTap: () { + provider.changeSelection(modes: SweepModes.sweep); + }, + ), + ], + ), + const DividerWidget(), + Text( + 'user.accessibility.speed'.trl, + style: + textTheme.headline2!.copyWith(color: colorScheme.primary), + ), + Padding( + padding: const EdgeInsets.symmetric(vertical: 16), + child: Text( + 'user.accessibility.selection_speed'.trl, + style: textTheme.headline3, + ), + ), + Row( + // mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + ChooserWidget( + selected: provider.accessibilitySetting.sweepSpeed == + VelocityTypes.slow + ? true + : false, + onTap: () { + provider.changeAccessibilitySpeed( + speed: VelocityTypes.slow); + }, + title: 'global.slow'.trl, + ), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 16), + child: ChooserWidget( + selected: provider.accessibilitySetting.sweepSpeed == + VelocityTypes.mid, + onTap: () { + provider.changeAccessibilitySpeed( + speed: VelocityTypes.mid); + }, + title: 'global.default'.trl, + ), + ), + ChooserWidget( + selected: provider.accessibilitySetting.sweepSpeed == + VelocityTypes.fast, + onTap: () { + provider.changeAccessibilitySpeed( + speed: VelocityTypes.fast); + }, + title: 'global.fast'.trl, + ), + ], + ), + const SizedBox( + height: 24, + ), + ], + ), + ), + ), + ), + ), + ); + } +} diff --git a/lib/presentation/screens/user_settings/language_screen.dart b/lib/presentation/screens/user_settings/language_screen.dart new file mode 100644 index 00000000..7aa87f00 --- /dev/null +++ b/lib/presentation/screens/user_settings/language_screen.dart @@ -0,0 +1,285 @@ +import 'dart:io'; + +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:go_router/go_router.dart'; +import 'package:ottaa_project_flutter/application/common/extensions/translate_string.dart'; +import 'package:ottaa_project_flutter/application/providers/user_settings_provider.dart'; +import 'package:ottaa_project_flutter/presentation/common/widgets/responsive_widget.dart'; +import 'package:ottaa_project_flutter/presentation/screens/user_settings/ui/chooser_widget.dart'; +import 'package:ottaa_project_flutter/presentation/screens/user_settings/ui/switch_widget.dart'; +import 'package:ottaa_ui_kit/widgets.dart'; + +class LanguageScreen extends ConsumerWidget { + const LanguageScreen({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final provider = ref.watch(userSettingsProvider); + final textTheme = Theme.of(context).textTheme; + final colorScheme = Theme.of(context).colorScheme; + return WillPopScope( + onWillPop: () async { + provider.updateLanguageSettings(); + return true; + }, + child: ResponsiveWidget( + child: Scaffold( + appBar: OTTAAAppBar( + leading: IconButton( + icon: const Icon(Icons.arrow_back_ios), + onPressed: () async { + provider.updateLanguageSettings(); + context.pop(); + }, + splashRadius: 24, + ), + title: Text( + 'user.settings.language'.trl, + style: textTheme.headline3, + ), + ), + body: Padding( + padding: const EdgeInsets.symmetric(horizontal: 24), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'user.settings.language'.trl, + style: textTheme.headline2!.copyWith( + color: colorScheme.primary, + ), + ), + const SizedBox( + height: 8, + ), + Text( + 'user.language.set'.trl, + style: textTheme.headline3, + ), + const SizedBox( + height: 16, + ), + Wrap( + direction: Axis.horizontal, + spacing: 16, + runSpacing: 16, + children: [ + ChooserWidget( + selected: provider.languageSetting.language.contains('es'), + onTap: () async { + if (Platform.isIOS) { + showDialog( + context: context, + barrierDismissible: false, + builder: (context) { + return AlertDialog( + content: Text( + 'global.voices'.trl, + style: textTheme.bodyMedium!.copyWith(fontWeight: FontWeight.w600), + textAlign: TextAlign.center, + ), + ); + }); + await Future.delayed(const Duration(seconds: 2)); + context.pop(); + } + await provider.changeLanguage(languageCode: 'es_AR'); + }, + title: 'global.spanish'.trl, + ), + ChooserWidget( + selected: provider.languageSetting.language == 'en_US', + onTap: () async { + await provider.changeLanguage(languageCode: 'en_US'); + if (Platform.isIOS) { + showDialog( + context: context, + barrierDismissible: false, + builder: (context) { + return AlertDialog( + content: Text( + 'global.voices'.trl, + style: textTheme.bodyMedium!.copyWith(fontWeight: FontWeight.w600), + textAlign: TextAlign.center, + ), + ); + }); + await Future.delayed(const Duration(seconds: 2)); + context.pop(); + } + }, + title: 'global.english'.trl, + ), + ChooserWidget( + selected: provider.languageSetting.language == 'pt_BR', + onTap: () async { + if (Platform.isIOS) { + showDialog( + context: context, + barrierDismissible: false, + builder: (context) { + return AlertDialog( + content: Text( + 'global.voices'.trl, + style: textTheme.bodyMedium!.copyWith(fontWeight: FontWeight.w600), + textAlign: TextAlign.center, + ), + ); + }); + await Future.delayed(const Duration(seconds: 2)); + context.pop(); + } + await provider.changeLanguage(languageCode: 'pt_BR'); + }, + title: 'global.portuguese'.trl, + ), + ChooserWidget( + selected: provider.languageSetting.language == 'it_IT', + onTap: () async { + if (Platform.isIOS) { + showDialog( + context: context, + barrierDismissible: false, + builder: (context) { + return AlertDialog( + content: Text( + 'global.voices'.trl, + style: textTheme.bodyMedium!.copyWith(fontWeight: FontWeight.w600), + textAlign: TextAlign.center, + ), + ); + }); + await Future.delayed(const Duration(seconds: 2)); + context.pop(); + } + await provider.changeLanguage(languageCode: 'it_IT'); + }, + title: 'global.italian'.trl, + ), + ], + ), + provider.languageSetting.language.contains('es') + ? Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const SizedBox( + height: 16, + ), + Text( + 'global.delicate'.trl, + style: textTheme.headline3, + ), + const SizedBox( + height: 16, + ), + Wrap( + direction: Axis.horizontal, + spacing: 16, + runSpacing: 16, + children: [ + ChooserWidget( + selected: provider.languageSetting.language == 'es_AR', + onTap: () async { + if (Platform.isIOS) { + showDialog( + context: context, + barrierDismissible: false, + builder: (context) { + return AlertDialog( + content: Text( + 'global.voices'.trl, + style: textTheme.bodyMedium!.copyWith(fontWeight: FontWeight.w600), + textAlign: TextAlign.center, + ), + ); + }); + await Future.delayed(const Duration(seconds: 2)); + context.pop(); + } + await provider.changeLanguage(languageCode: 'es_AR'); + }, + title: 'global.argentina'.trl, + ), + ChooserWidget( + selected: provider.languageSetting.language == 'es_CL', + onTap: () async { + if (Platform.isIOS) { + showDialog( + context: context, + barrierDismissible: false, + builder: (context) { + return AlertDialog( + content: Text( + 'please, install voices from setting for better usability'.trl, + style: textTheme.bodyMedium!.copyWith(fontWeight: FontWeight.w600), + textAlign: TextAlign.center, + ), + ); + }); + await Future.delayed(const Duration(seconds: 2)); + context.pop(); + } + await provider.changeLanguage(languageCode: 'es_CL'); + }, + title: 'global.chile'.trl, + ), + ChooserWidget( + selected: provider.languageSetting.language == 'es_CO', + onTap: () async { + if (Platform.isIOS) { + showDialog( + context: context, + barrierDismissible: false, + builder: (context) { + return AlertDialog( + content: Text( + 'please, install voices from setting for better usability'.trl, + style: textTheme.bodyMedium!.copyWith(fontWeight: FontWeight.w600), + textAlign: TextAlign.center, + ), + ); + }); + await Future.delayed(const Duration(seconds: 2)); + context.pop(); + } + await provider.changeLanguage(languageCode: 'es_CO'); + }, + title: 'global.colombia'.trl, + ), + ], + ), + ], + ) + : const SizedBox.shrink(), + const SizedBox( + height: 24, + ), + Text( + 'user.main_setting.ottaa_labs'.trl, + style: textTheme.headline2!.copyWith( + color: colorScheme.primary, + ), + ), + SwitchWidget( + onChanged: (value) async { + await provider.changeOttaaLabs(value: value); + }, + title: 'user.main_setting.labs_text'.trl, + value: provider.languageSetting.labs, + ), + Text( + 'user.main_setting.labs_long'.trl, + style: textTheme.headline2!.copyWith(fontSize: 14), + ), + const SizedBox( + height: 24, + ), + ], + ), + ), + ), + ), + ); + } +} diff --git a/lib/presentation/screens/user_settings/main_setting_screen.dart b/lib/presentation/screens/user_settings/main_setting_screen.dart new file mode 100644 index 00000000..872a69dc --- /dev/null +++ b/lib/presentation/screens/user_settings/main_setting_screen.dart @@ -0,0 +1,139 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:go_router/go_router.dart'; +import 'package:ottaa_project_flutter/application/common/app_images.dart'; +import 'package:ottaa_project_flutter/application/common/extensions/translate_string.dart'; +import 'package:ottaa_project_flutter/application/providers/user_settings_provider.dart'; +import 'package:ottaa_project_flutter/core/enums/display_types.dart'; +import 'package:ottaa_project_flutter/presentation/common/widgets/responsive_widget.dart'; +import 'package:ottaa_project_flutter/presentation/screens/user_settings/ui/divider_widget.dart'; +import 'package:ottaa_project_flutter/presentation/screens/user_settings/ui/shortcut_view.dart'; +import 'package:ottaa_project_flutter/presentation/screens/user_settings/ui/switch_widget.dart'; +import 'package:ottaa_project_flutter/presentation/screens/user_settings/ui/tab_widget.dart'; +import 'package:ottaa_ui_kit/widgets.dart'; + +class MainSettingScreen extends ConsumerWidget { + const MainSettingScreen({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final textTheme = Theme.of(context).textTheme; + final colorScheme = Theme.of(context).colorScheme; + final provider = ref.watch(userSettingsProvider); + return WillPopScope( + onWillPop: () async { + provider.updateMainSettings(); + return true; + }, + child: ResponsiveWidget( + child: Scaffold( + appBar: OTTAAAppBar( + leading: IconButton( + icon: const Icon(Icons.arrow_back_ios), + onPressed: () async { + provider.updateMainSettings(); + context.pop(); + }, + splashRadius: 24, + ), + title: Text( + 'user.settings.main_screen'.trl, + style: textTheme.headline3, + ), + ), + body: Padding( + padding: const EdgeInsets.symmetric(horizontal: 24), + child: SingleChildScrollView( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'user.main_setting.interaction'.trl, + style: textTheme.headline2!.copyWith( + color: colorScheme.primary, + ), + ), + const SizedBox( + height: 8, + ), + SwitchWidget( + onChanged: (value) { + provider.changeDeleteText(value: value); + }, + title: 'user.main_setting.talk_delete'.trl, + value: provider.layoutSetting.cleanup, + ), + const SizedBox( + height: 8, + ), + SwitchWidget( + onChanged: (value) { + provider.changeOneToOne(value: value); + }, + title: 'user.main_setting.one_by_one'.trl, + value: provider.layoutSetting.oneToOne, + ), + const DividerWidget(), + Text( + 'customize.shortcut.appbar'.trl, + style: textTheme.headline2!.copyWith( + color: colorScheme.primary, + ), + ), + const SizedBox( + height: 8, + ), + SwitchWidget( + onChanged: (value) { + provider.changeEnableShortcuts(value: value); + }, + title: 'user.main_setting.shortcut'.trl, + value: provider.layoutSetting.shortcuts.enable, + ), + const SizedBox( + height: 32, + ), + const ShortcutView(), + const DividerWidget(), + Text( + 'user.main_setting.board_view'.trl, + style: textTheme.headline2!.copyWith( + color: colorScheme.primary, + ), + ), + const SizedBox( + height: 8, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + TabWidget( + title: 'user.main_setting.tabs'.trl, + image: AppImages.kMainSettingsIcon1, + selected: + provider.layoutSetting.display == DisplayTypes.tab, + onTap: () { + provider.changeTablet(value: DisplayTypes.tab); + }, + ), + TabWidget( + title: 'user.main_setting.grid'.trl, + image: AppImages.kMainSettingsIcon2, + selected: + provider.layoutSetting.display == DisplayTypes.grid, + onTap: () { + provider.changeTablet(value: DisplayTypes.grid); + }, + ), + ], + ), + const DividerWidget(), + ], + ), + ), + ), + ), + ), + ); + } +} diff --git a/lib/presentation/screens/user_settings/setting_screen.dart b/lib/presentation/screens/user_settings/setting_screen.dart new file mode 100644 index 00000000..94dd5be7 --- /dev/null +++ b/lib/presentation/screens/user_settings/setting_screen.dart @@ -0,0 +1,74 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:go_router/go_router.dart'; +import 'package:ottaa_project_flutter/application/common/extensions/translate_string.dart'; +import 'package:ottaa_project_flutter/application/common/extensions/user_extension.dart'; +import 'package:ottaa_project_flutter/application/providers/user_provider.dart'; +import 'package:ottaa_project_flutter/application/providers/user_settings_provider.dart'; +import 'package:ottaa_project_flutter/application/router/app_routes.dart'; +import 'package:ottaa_project_flutter/presentation/common/widgets/responsive_widget.dart'; +import 'package:ottaa_project_flutter/presentation/screens/profile/ui/profile_user_widget.dart'; +import 'package:ottaa_ui_kit/widgets.dart'; + +class SettingScreenUser extends ConsumerStatefulWidget { + const SettingScreenUser({Key? key}) : super(key: key); + + @override + ConsumerState createState() => _SettingScreenUserState(); +} + +class _SettingScreenUserState extends ConsumerState { + @override + void initState() { + super.initState(); + final provider = ref.read(userSettingsProvider); + WidgetsBinding.instance.addPostFrameCallback((timeStamp) async { + showDialog( + context: context, + builder: (context) { + return const Center( + child: CircularProgressIndicator(), + ); + }); + await provider.init(); + context.pop(); + }); + } + + @override + Widget build(BuildContext context) { + final user = ref.read(userProvider.select((value) => value.user)); + return ResponsiveWidget( + child: Scaffold( + appBar: OTTAAAppBar( + title: Text( + 'global.settings'.trl, + ), + ), + body: Padding( + padding: const EdgeInsets.all(24), + child: Column( + children: [ + ProfileUserWidget( + title: 'user.settings.main_screen'.trl, + onTap: () => context.push(user!.isCaregiver ? AppRoutes.caregiverAccountLayout : AppRoutes.patientSettingsLayout), + ), + ProfileUserWidget( + title: 'user.settings.accessibility'.trl, + onTap: () => context.push(user!.isCaregiver ? AppRoutes.caregiverAccountAccessibility : AppRoutes.patientSettingsAccessibility), + ), + ProfileUserWidget( + title: 'user.settings.voice_and_subtitles'.trl, + onTap: () => context.push(user!.isCaregiver ? AppRoutes.caregiverAccountTTS : AppRoutes.patientSettingsTTS), + ), + ProfileUserWidget( + title: 'user.settings.language'.trl, + onTap: () => context.push(user!.isCaregiver ? AppRoutes.caregiverAccountLanguage : AppRoutes.patientSettingsLanguage), + ), + ], + ), + ), + ), + ); + } +} diff --git a/lib/presentation/screens/user_settings/ui/accessibility_widget.dart b/lib/presentation/screens/user_settings/ui/accessibility_widget.dart new file mode 100644 index 00000000..0cfb4db0 --- /dev/null +++ b/lib/presentation/screens/user_settings/ui/accessibility_widget.dart @@ -0,0 +1,52 @@ +import 'package:flutter/material.dart'; + +class AccessibilityWidget extends StatelessWidget { + const AccessibilityWidget({ + Key? key, + required this.image, + required this.title, + required this.onTap, + required this.selected, + }) : super(key: key); + final String image, title; + final void Function()? onTap; + final bool selected; + + @override + Widget build(BuildContext context) { + final textTheme = Theme.of(context).textTheme; + final colorScheme = Theme.of(context).colorScheme; + return GestureDetector( + onTap: onTap, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Container( + padding: const EdgeInsets.all(4), + height: 94, + width: 94, + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + border: Border.all( + color: selected ? colorScheme.primary : Colors.white, + width: 3, + ), + ), + child: Image.asset( + image, + fit: BoxFit.contain, + ), + ), + const SizedBox( + height: 16, + ), + Text( + title, + style: textTheme.headline3, + ), + ], + ), + ); + } +} diff --git a/lib/presentation/screens/user_settings/ui/board_widget.dart b/lib/presentation/screens/user_settings/ui/board_widget.dart new file mode 100644 index 00000000..3ccb0da0 --- /dev/null +++ b/lib/presentation/screens/user_settings/ui/board_widget.dart @@ -0,0 +1,11 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; + +class BoardWidget extends ConsumerWidget { + const BoardWidget({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + return Row(); + } +} diff --git a/lib/presentation/screens/user_settings/ui/chooser_widget.dart b/lib/presentation/screens/user_settings/ui/chooser_widget.dart new file mode 100644 index 00000000..05bed62b --- /dev/null +++ b/lib/presentation/screens/user_settings/ui/chooser_widget.dart @@ -0,0 +1,41 @@ +import 'package:flutter/material.dart'; +import 'package:ottaa_ui_kit/theme.dart'; + +class ChooserWidget extends StatelessWidget { + const ChooserWidget({ + Key? key, + required this.selected, + required this.onTap, + required this.title, + }) : super(key: key); + final String title; + final bool selected; + final void Function()? onTap; + + @override + Widget build(BuildContext context) { + final textTheme = Theme.of(context).textTheme; + final colorScheme = Theme.of(context).colorScheme; + return GestureDetector( + onTap: onTap, + child: Container( + padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8), + decoration: BoxDecoration( + color: selected ? colorScheme.primary : Colors.white, + borderRadius: BorderRadius.circular(8), + ), + child: Text( + title, + style: selected + ? textTheme.caption!.copyWith( + color: colorScheme.onPrimary, + fontWeight: FontWeight.w600, + ) + : textTheme.caption!.copyWith( + color: kDarkenGrayColor, + ), + ), + ), + ); + } +} diff --git a/lib/presentation/screens/user_settings/ui/divider_widget.dart b/lib/presentation/screens/user_settings/ui/divider_widget.dart new file mode 100644 index 00000000..89c4651a --- /dev/null +++ b/lib/presentation/screens/user_settings/ui/divider_widget.dart @@ -0,0 +1,16 @@ +import 'package:flutter/material.dart'; + +class DividerWidget extends StatelessWidget { + const DividerWidget({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return const Padding( + padding: EdgeInsets.symmetric(vertical: 32), + child: Divider( + height: 1, + color: Colors.black, + ), + ); + } +} diff --git a/lib/presentation/screens/user_settings/ui/shortcut_view.dart b/lib/presentation/screens/user_settings/ui/shortcut_view.dart new file mode 100644 index 00000000..d7d2ecac --- /dev/null +++ b/lib/presentation/screens/user_settings/ui/shortcut_view.dart @@ -0,0 +1,129 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:ottaa_project_flutter/application/common/app_images.dart'; +import 'package:ottaa_project_flutter/application/common/extensions/translate_string.dart'; +import 'package:ottaa_project_flutter/application/providers/user_settings_provider.dart'; +import 'package:ottaa_project_flutter/presentation/screens/customized_board/ui/shortcu_widget.dart'; + +class ShortcutView extends ConsumerWidget { + const ShortcutView({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final provider = ref.watch(userSettingsProvider); + final width = MediaQuery.of(context).size.width; + return Stack( + fit: StackFit.loose, + children: [ + Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + ShortcutWidget( + onTap: () { + provider.layoutSetting.shortcuts.favs = + !provider.layoutSetting.shortcuts.favs; + provider.notify(); + }, + heading: "customize.shortcut.favorites".trl, + image: AppImages.kBoardFavouriteIcon, + image2: AppImages.kBoardFavouriteIconSelected, + selected: provider.layoutSetting.shortcuts.favs, + ), + ShortcutWidget( + onTap: () { + provider.layoutSetting.shortcuts.history = + !provider.layoutSetting.shortcuts.history; + provider.notify(); + }, + heading: "customize.shortcut.history".trl, + image: AppImages.kBoardHistoryIcon, + image2: AppImages.kBoardHistoryIconSelected, + selected: provider.layoutSetting.shortcuts.history, + ), + ShortcutWidget( + onTap: () { + provider.layoutSetting.shortcuts.camera = + !provider.layoutSetting.shortcuts.camera; + provider.notify(); + }, + heading: "customize.shortcut.camera".trl, + image2: AppImages.kBoardCameraIconSelected, + image: AppImages.kBoardCameraIcon, + selected: provider.layoutSetting.shortcuts.camera, + ), + ], + ), + Padding( + padding: const EdgeInsets.symmetric(vertical: 24), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + ShortcutWidget( + onTap: () { + provider.layoutSetting.shortcuts.games = + !provider.layoutSetting.shortcuts.games; + provider.notify(); + }, + heading: "customize.shortcut.games".trl, + image: AppImages.kBoardDiceIcon, + image2: AppImages.kBoardDiceIconSelected, + selected: provider.layoutSetting.shortcuts.games, + ), + ShortcutWidget( + onTap: () { + provider.layoutSetting.shortcuts.yes = + !provider.layoutSetting.shortcuts.yes; + provider.notify(); + }, + heading: "global.yes".trl, + image: AppImages.kBoardYesIcon, + image2: AppImages.kBoardYesIconSelected, + selected: provider.layoutSetting.shortcuts.yes, + ), + ShortcutWidget( + onTap: () { + provider.layoutSetting.shortcuts.no = + !provider.layoutSetting.shortcuts.no; + provider.notify(); + }, + heading: "global.no".trl, + image: AppImages.kBoardNoIcon, + image2: AppImages.kBoardNoIconSelected, + selected: provider.layoutSetting.shortcuts.no, + ), + ], + ), + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + ShortcutWidget( + onTap: () { + provider.layoutSetting.shortcuts.share = + !provider.layoutSetting.shortcuts.share; + provider.notify(); + }, + heading: "global.share".trl, + image: AppImages.kBoardShareIcon, + image2: AppImages.kBoardShareIconSelected, + selected: provider.layoutSetting.shortcuts.share, + ), + ], + ), + ], + ), + !provider.layoutSetting.shortcuts.enable + ? Container( + height: 400, + width: width - 48, + decoration: BoxDecoration( + color: Colors.grey.withOpacity(0.4), + ), + ) + : const SizedBox.shrink(), + ], + ); + } +} diff --git a/lib/presentation/screens/user_settings/ui/switch_widget.dart b/lib/presentation/screens/user_settings/ui/switch_widget.dart new file mode 100644 index 00000000..d1c2de05 --- /dev/null +++ b/lib/presentation/screens/user_settings/ui/switch_widget.dart @@ -0,0 +1,29 @@ +import 'package:flutter/material.dart'; +import 'package:ottaa_ui_kit/widgets.dart'; + +class SwitchWidget extends StatelessWidget { + const SwitchWidget({ + Key? key, + required this.onChanged, + required this.title, + required this.value, + }) : super(key: key); + final dynamic Function(bool)? onChanged; + final String title; + final bool value; + + @override + Widget build(BuildContext context) { + final textTheme = Theme.of(context).textTheme; + return Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + title, + style: textTheme.headline3, + ), + OTTAASwitch(value: value, onChanged: onChanged), + ], + ); + } +} diff --git a/lib/presentation/screens/user_settings/ui/tab_widget.dart b/lib/presentation/screens/user_settings/ui/tab_widget.dart new file mode 100644 index 00000000..d305c6c6 --- /dev/null +++ b/lib/presentation/screens/user_settings/ui/tab_widget.dart @@ -0,0 +1,49 @@ +import 'package:flutter/material.dart'; + +class TabWidget extends StatelessWidget { + const TabWidget({ + Key? key, + required this.title, + required this.image, + required this.selected, + required this.onTap, + }) : super(key: key); + final String title, image; + final bool selected; + final void Function()? onTap; + + @override + Widget build(BuildContext context) { + final textTheme = Theme.of(context).textTheme; + final colorScheme = Theme.of(context).colorScheme; + return GestureDetector( + onTap: onTap, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + title, + style: textTheme.headline3, + ), + const SizedBox( + height: 16, + ), + Container( + decoration: BoxDecoration( + border: Border.all( + color: selected ? colorScheme.primary : colorScheme.background, + width: 3, + ), + borderRadius: BorderRadius.circular(12), + ), + child: Image.asset( + image, + height: 100, + width: 150, + ), + ), + ], + ), + ); + } +} diff --git a/lib/presentation/screens/user_settings/voice_and_subtitle_screen.dart b/lib/presentation/screens/user_settings/voice_and_subtitle_screen.dart new file mode 100644 index 00000000..1df12192 --- /dev/null +++ b/lib/presentation/screens/user_settings/voice_and_subtitle_screen.dart @@ -0,0 +1,212 @@ +import 'dart:io'; + +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:go_router/go_router.dart'; +import 'package:ottaa_project_flutter/application/common/extensions/translate_string.dart'; +import 'package:ottaa_project_flutter/application/providers/user_settings_provider.dart'; +import 'package:ottaa_project_flutter/core/enums/size_types.dart'; +import 'package:ottaa_project_flutter/core/enums/velocity_types.dart'; +import 'package:ottaa_project_flutter/presentation/common/widgets/responsive_widget.dart'; +import 'package:ottaa_project_flutter/presentation/screens/profile/ui/drop_down_widget.dart'; +import 'package:ottaa_project_flutter/presentation/screens/user_settings/ui/chooser_widget.dart'; +import 'package:ottaa_project_flutter/presentation/screens/user_settings/ui/divider_widget.dart'; +import 'package:ottaa_project_flutter/presentation/screens/user_settings/ui/switch_widget.dart'; +import 'package:ottaa_ui_kit/widgets.dart'; + +class VoiceAndSubtitleScreen extends ConsumerWidget { + const VoiceAndSubtitleScreen({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final textTheme = Theme.of(context).textTheme; + final colorScheme = Theme.of(context).colorScheme; + final provider = ref.watch(userSettingsProvider); + return WillPopScope( + onWillPop: () async { + provider.updateVoiceAndSubtitleSettings(); + return true; + }, + child: ResponsiveWidget( + child: Scaffold( + appBar: OTTAAAppBar( + leading: IconButton( + icon: const Icon(Icons.arrow_back_ios), + onPressed: () async { + provider.updateVoiceAndSubtitleSettings(); + context.pop(); + }, + splashRadius: 24, + ), + title: Text( + 'user.settings.voice_and_subtitles'.trl, + style: textTheme.headline3, + ), + ), + body: Padding( + padding: const EdgeInsets.symmetric(horizontal: 24), + child: SingleChildScrollView( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'global.voice'.trl, + style: textTheme.headline2!.copyWith( + color: colorScheme.primary, + ), + ), + const SizedBox( + height: 8, + ), + Text( + 'user.voice_and_subtitle.voice_types'.trl, + style: textTheme.headline3, + ), + const SizedBox( + height: 24, + ), + SizedBox( + height: 30, + child: ListView.builder( + scrollDirection: Axis.horizontal, + itemCount: provider.filteredVoices.length, + itemBuilder: (context, index) { + return Padding( + padding: const EdgeInsets.only(right: 16), + child: ChooserWidget( + selected: provider.ttsSetting.voiceSetting.voicesNames[provider.language] == provider.filteredVoices[index].name, + title: Platform.isIOS ? provider.filteredVoices[index].name : provider.filteredVoices[index].locale, + onTap: () async => await provider.changeVoiceType(type: provider.filteredVoices[index].name), + ), + ); + }, + ), + ), + const SizedBox( + height: 32, + ), + Text( + 'user.voice_and_subtitle.voice_rate'.trl, + style: textTheme.headline3, + ), + const SizedBox( + height: 24, + ), + Row( + children: [ + ChooserWidget( + selected: provider.voiceRate == VelocityTypes.slow.name ? true : false, + onTap: () { + print(provider.ttsSetting.voiceSetting.voicesSpeed[provider.language]!.name); + provider.changeVoiceSpeed(type: VelocityTypes.slow); + provider.notify(); + }, + title: 'global.slow'.trl, + ), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 16), + child: ChooserWidget( + selected: provider.voiceRate == VelocityTypes.mid.name ? true : false, + onTap: () { + provider.changeVoiceSpeed(type: VelocityTypes.mid); + }, + title: 'global.default'.trl, + ), + ), + ChooserWidget( + selected: provider.voiceRate == VelocityTypes.fast.name ? true : false, + onTap: () { + provider.changeVoiceSpeed(type: VelocityTypes.fast); + }, + title: 'global.fast'.trl, + ), + ], + ), + const SizedBox( + height: 32, + ), + SwitchWidget( + onChanged: (value) { + provider.changeMute(value: value); + }, + title: 'user.voice_and_subtitle.mute'.trl, + value: provider.ttsSetting.voiceSetting.mutePict, + ), + const DividerWidget(), + Text( + 'user.voice_and_subtitle.subtitle'.trl, + style: textTheme.headline2!.copyWith( + color: colorScheme.primary, + ), + ), + const SizedBox( + height: 8, + ), + SwitchWidget( + onChanged: (value) { + provider.changeSubtitle(value: value); + }, + title: 'user.voice_and_subtitle.show'.trl, + value: provider.ttsSetting.subtitlesSetting.show, + ), + const SizedBox( + height: 32, + ), + Text( + "user.voice_and_subtitle.size".trl, + style: textTheme.headline3, + ), + const SizedBox( + height: 24, + ), + Row( + // mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + ChooserWidget( + selected: provider.ttsSetting.subtitlesSetting.size == SizeTypes.small ? true : false, + onTap: () { + provider.changeTextType(type: SizeTypes.small); + }, + title: 'global.small'.trl, + ), + const SizedBox( + width: 16, + ), + ChooserWidget( + selected: provider.ttsSetting.subtitlesSetting.size == SizeTypes.mid ? true : false, + onTap: () { + provider.changeTextType(type: SizeTypes.mid); + }, + title: 'global.medium'.trl, + ), + const SizedBox( + width: 16, + ), + ChooserWidget( + selected: provider.ttsSetting.subtitlesSetting.size == SizeTypes.big ? true : false, + onTap: () { + provider.changeTextType(type: SizeTypes.big); + }, + title: 'global.big'.trl, + ), + ], + ), + const SizedBox( + height: 32, + ), + SwitchWidget( + onChanged: (value) { + provider.changeCapital(value: value); + }, + title: 'user.voice_and_subtitle.capital'.trl, + value: provider.ttsSetting.subtitlesSetting.caps, + ), + ], + ), + ), + ), + ), + ), + ); + } +} diff --git a/lib/presentation/screens/view_board/board_screen.dart b/lib/presentation/screens/view_board/board_screen.dart new file mode 100644 index 00000000..bf9986df --- /dev/null +++ b/lib/presentation/screens/view_board/board_screen.dart @@ -0,0 +1,90 @@ +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:go_router/go_router.dart'; +import 'package:ottaa_project_flutter/application/common/app_images.dart'; +import 'package:ottaa_project_flutter/application/common/extensions/translate_string.dart'; +import 'package:ottaa_project_flutter/application/providers/create_picto_provider.dart'; +import 'package:ottaa_project_flutter/application/providers/view_board_provider.dart'; +import 'package:ottaa_project_flutter/application/router/app_routes.dart'; +import 'package:ottaa_ui_kit/widgets.dart'; + +class BoardScreen extends ConsumerWidget { + const BoardScreen({super.key}); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final provider = ref.watch(viewBoardProvider); + final textTheme = Theme.of(context).textTheme; + final colorScheme = Theme.of(context).colorScheme; + return Expanded( + child: ListView.builder( + shrinkWrap: true, + itemCount: provider.boards.length + 1, + padding: const EdgeInsets.only(bottom: 16), + itemBuilder: (context, index) { + if (provider.boards.length == index) { + return GestureDetector( + onTap: () async { + final pro = ref.read(createPictoProvider); + pro.init(userId: provider.userID); + pro.resetCreateBoardScreen(); + context.push(AppRoutes.patientCreateBoard); + }, + child: Container( + padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 16), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(16), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Image.asset( + AppImages.kAddIcon, + height: 80, + width: 80, + ), + Text( + 'create.new_board'.trl, + style: textTheme.bodyMedium, + ), + ], + ), + ), + ); + } + return Padding( + padding: const EdgeInsets.only(bottom: 16), + child: Container( + decoration: provider.selectedBoardID == index + ? BoxDecoration( + borderRadius: BorderRadius.circular(16), + border: Border.all(color: colorScheme.primary, width: 2), + ) + : const BoxDecoration(), + child: PictogramCard( + title: provider.boards[index].text.toUpperCase(), + actionText: "customize.board.subtitle".trl, + pictogram: CachedNetworkImageProvider( + provider.boards[index].resource.network!, + ), + status: !provider.boards[index].block, + onPressed: () async { + provider.selectedBoardID = index; + await provider.fetchDesiredPictos(); + context.push(AppRoutes.patientShowPictos); + }, + onChange: (bool a) { + provider.boards[index].block = !provider.boards[index].block; + provider.notify(); + }, + ), + ), + ); + }, + ), + ); + } +} diff --git a/lib/presentation/screens/view_board/boards_pictogram_screen.dart b/lib/presentation/screens/view_board/boards_pictogram_screen.dart new file mode 100644 index 00000000..8b263885 --- /dev/null +++ b/lib/presentation/screens/view_board/boards_pictogram_screen.dart @@ -0,0 +1,225 @@ +import 'package:auto_size_text/auto_size_text.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; +import 'package:ottaa_project_flutter/application/common/extensions/translate_string.dart'; +import 'package:ottaa_project_flutter/application/providers/create_picto_provider.dart'; +import 'package:ottaa_project_flutter/application/providers/view_board_provider.dart'; +import 'package:ottaa_project_flutter/application/router/app_routes.dart'; +import 'package:ottaa_project_flutter/presentation/screens/view_board/board_screen.dart'; +import 'package:ottaa_project_flutter/presentation/screens/view_board/pictogram_screen.dart'; +import 'package:ottaa_ui_kit/widgets.dart'; + +class BoardsPictogramScreen extends ConsumerWidget { + const BoardsPictogramScreen({super.key}); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final textTheme = Theme.of(context).textTheme; + final colorScheme = Theme.of(context).colorScheme; + final provider = ref.watch(viewBoardProvider); + final size = MediaQuery.of(context).size; + return WillPopScope( + onWillPop: () async { + provider.uploadGroups(); + provider.uploadPictos(); + provider.selectedBoardID = -1; + return true; + }, + child: Scaffold( + appBar: OTTAAAppBar( + leading: IconButton( + icon: const Icon(Icons.arrow_back_ios), + onPressed: () async { + provider.uploadGroups(); + provider.uploadPictos(); + provider.selectedBoardID = -1; + context.pop(); + }, + splashRadius: 24, + ), + title: Flex( + direction: Axis.horizontal, + children: [ + Expanded( + child: AutoSizeText( + 'customize.board.appbar'.trl, + ), + ), + const SizedBox( + width: 8, + ), + const Icon( + Icons.help_outline_sharp, + color: Colors.grey, + size: 24, + ), + ], + ), + actions: [ + IconButton( + icon: Icon( + Icons.add, + color: colorScheme.primary, + size: 24, + ), + onPressed: provider.selectedType == 'home.grid.title'.trl + ? () async { + final pro = ref.read(createPictoProvider); + pro.init(userId: provider.userID); + pro.resetCreateBoardScreen(); + context.push(AppRoutes.patientCreateBoard); + } + : () async { + final pro = ref.read(createPictoProvider); + pro.init(userId: provider.userID); + context.push(AppRoutes.patientCreatePicto); + }, + ), + ], + ), + body: Padding( + padding: const EdgeInsets.symmetric(horizontal: 16), + child: Column( + children: [ + SizedBox( + width: size.width, + child: GestureDetector( + onTap: () { + context.push(AppRoutes.patientSearch); + }, + child: TextFormField( + enabled: false, + decoration: InputDecoration( + hintText: 'global.search'.trl, + suffixIcon: const Icon( + Icons.search, + ), + ), + ), + ), + ), + Padding( + padding: const EdgeInsets.symmetric(vertical: 24), + child: SizedBox( + width: size.width, + height: 35, + child: ListView( + scrollDirection: Axis.horizontal, + children: [ + ChooserWidget( + text: 'home.grid.title'.trl, + ), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 16), + child: ChooserWidget( + text: 'global.pictogram'.trl, + ), + ), + ChooserWidget( + text: 'create.created_by_me'.trl, + isDisabled: true, + ), + ], + ), + ), + ), + provider.selectedType == 'global.pictogram'.trl + ? Padding( + padding: const EdgeInsets.only(bottom: 32), + child: SizedBox( + width: size.width, + height: 35, + child: ListView.builder( + scrollDirection: Axis.horizontal, + itemCount: 26, + itemBuilder: (context, index) => Padding( + padding: const EdgeInsets.only(right: 8), + child: AlphabetWidget( + text: String.fromCharCode(65 + index), + ), + ), + ), + ), + ) + : const SizedBox.shrink(), + provider.selectedType == 'home.grid.title'.trl ? const BoardScreen() : const PictogramScreen() + ], + ), + ), + ), + ); + } +} + +class ChooserWidget extends ConsumerWidget { + const ChooserWidget({ + super.key, + required this.text, + this.isDisabled = false, + }); + + final bool isDisabled; + final String text; + + @override + Widget build(BuildContext context, WidgetRef ref) { + final textTheme = Theme.of(context).textTheme; + final colorScheme = Theme.of(context).colorScheme; + final provider = ref.watch(viewBoardProvider); + return GestureDetector( + onTap: isDisabled + ? () {} + : () { + provider.selectedType = text; + provider.filterPictosForView(); + provider.notify(); + }, + child: Container( + padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 12), + decoration: BoxDecoration( + color: provider.selectedType == text ? colorScheme.primary : Colors.white, + borderRadius: BorderRadius.circular(8), + ), + child: Text( + text, + style: textTheme.bodySmall!.copyWith(color: provider.selectedType == text ? Colors.white : Colors.grey), + ), + ), + ); + } +} + +class AlphabetWidget extends ConsumerWidget { + const AlphabetWidget({ + super.key, + required this.text, + }); + + final String text; + + @override + Widget build(BuildContext context, WidgetRef ref) { + final textTheme = Theme.of(context).textTheme; + final colorScheme = Theme.of(context).colorScheme; + final provider = ref.watch(viewBoardProvider); + return GestureDetector( + onTap: () async { + provider.selectedAlphabet = text; + provider.notify(); + await provider.filterPictosForView(); + }, + child: Container( + padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 12), + decoration: BoxDecoration( + color: provider.selectedAlphabet == text ? colorScheme.primary : Colors.white, + borderRadius: BorderRadius.circular(8), + ), + child: Text( + text, + style: textTheme.bodySmall!.copyWith(color: provider.selectedAlphabet == text ? Colors.white : Colors.grey), + ), + ), + ); + } +} diff --git a/lib/presentation/screens/view_board/create_board_screen.dart b/lib/presentation/screens/view_board/create_board_screen.dart new file mode 100644 index 00000000..0bde487a --- /dev/null +++ b/lib/presentation/screens/view_board/create_board_screen.dart @@ -0,0 +1,253 @@ +import 'dart:io'; + +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:go_router/go_router.dart'; +import 'package:ottaa_project_flutter/application/common/app_images.dart'; +import 'package:ottaa_project_flutter/application/common/extensions/translate_string.dart'; +import 'package:ottaa_project_flutter/application/providers/create_picto_provider.dart'; +import 'package:ottaa_project_flutter/application/router/app_routes.dart'; +import 'package:ottaa_project_flutter/presentation/common/widgets/simple_button.dart'; +import 'package:ottaa_project_flutter/presentation/screens/create_picto/choose_picto_day_screen.dart'; +import 'package:ottaa_project_flutter/presentation/screens/create_picto/create_pictogram_initial_screen.dart'; +import 'package:ottaa_project_flutter/presentation/screens/create_picto/ui/day_widget.dart'; +import 'package:ottaa_project_flutter/presentation/screens/create_picto/ui/time_widget.dart'; +import 'package:ottaa_ui_kit/widgets.dart'; + +class CreateBoardScreen extends ConsumerWidget { + const CreateBoardScreen({super.key}); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final provider = ref.watch(createPictoProvider); + final textTheme = Theme.of(context).textTheme; + final colorScheme = Theme.of(context).colorScheme; + return Scaffold( + resizeToAvoidBottomInset: false, + appBar: OTTAAAppBar( + title: Text( + 'create.create_new_board'.trl, + ), + ), + body: Padding( + padding: const EdgeInsets.symmetric(horizontal: 24), + child: SingleChildScrollView( + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const BoardWidget(), + const SizedBox( + height: 24, + ), + Text( + 'global.image'.trl, + style: textTheme.bodyMedium!.copyWith(fontWeight: FontWeight.w600), + ), + const SizedBox( + height: 16, + ), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + DialogWidget( + image: AppImages.kArsacImage, + text: 'global.arasaac'.trl, + onTap: () { + context.push(AppRoutes.patientEditPictoarsaac); + }, + ), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 16), + child: DialogWidget( + image: AppImages.kCameraIcon, + text: 'shortcut.customize.camera'.trl, + onTap: () async { + final res = await provider.captureImageFromCamera(); + if (res) { + provider.isUrl = false; + provider.notify(); + } + }, + ), + ), + DialogWidget( + image: AppImages.kGalleryIcon, + text: 'global.gallery'.trl, + onTap: () async { + final res = await provider.captureImageFromGallery(); + if (res) { + provider.isUrl = false; + provider.notify(); + } + }, + ), + ], + ), + Padding( + padding: const EdgeInsets.symmetric(vertical: 16), + child: Text( + 'global.text'.trl, + style: textTheme.bodyMedium!.copyWith(fontWeight: FontWeight.w600), + ), + ), + Row( + children: [ + Expanded( + child: TextFormField( + controller: provider.nameController, + onChanged: (text) { + provider.notify(); + }, + ), + ), + const SizedBox(width: 16), + SizedBox( + height: 50, + width: 58, + child: ElevatedButton( + style: ButtonStyle( + backgroundColor: MaterialStateProperty.all(colorScheme.primary), + overlayColor: MaterialStateProperty.all(Colors.white.withOpacity(0.1)), + shape: MaterialStateProperty.all( + const RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(9)), + ), + ), + padding: MaterialStateProperty.all(const EdgeInsets.all(0)), + elevation: MaterialStateProperty.all(0), + ), + onPressed: () async { + await provider.speakWord(); + }, + child: Center( + child: Image.asset( + AppImages.kOttaaMinimalist, + color: Colors.white, + ), + ), + ), + ), + ], + ), + Padding( + padding: const EdgeInsets.only(top: 16), + child: Text( + 'global.predictive'.trl, + style: textTheme.bodyMedium!.copyWith(fontWeight: FontWeight.w600), + ), + ), + Padding( + padding: const EdgeInsets.only(top: 16, bottom: 8), + child: Text( + 'create.time_sub1'.trl, + ), + ), + Wrap( + direction: Axis.horizontal, + spacing: 8, + runSpacing: 8, + children: [ + DayWidget(text: 'global.sunday'.trl), + DayWidget(text: 'global.monday'.trl), + DayWidget(text: 'global.tuesday'.trl), + DayWidget(text: 'global.wednesday'.trl), + DayWidget(text: 'global.thursday'.trl), + DayWidget(text: 'global.friday'.trl), + DayWidget(text: 'global.saturday'.trl), + ], + ), + Padding( + padding: const EdgeInsets.only(top: 16, bottom: 8), + child: Text( + 'create.schedule'.trl, + ), + ), + Wrap( + direction: Axis.horizontal, + spacing: 8, + runSpacing: 8, + children: [ + TimeWidget(text: 'global.tomorrow'.trl), + TimeWidget(text: 'global.noon'.trl), + TimeWidget(text: 'global.late'.trl), + TimeWidget(text: 'global.evening'.trl), + ], + ), + ], + ), + Padding( + padding: const EdgeInsets.symmetric(vertical: 16), + child: SimpleButton( + onTap: () async { + showDialog(context: context, builder: (context) => const Center(child: CircularProgressIndicator())); + if (provider.isEditBoard) { + await provider.saveChangesInBoard(); + } else { + await provider.saveAndUploadGroup(); + } + context.pop(); + context.pop(); + }, + text: 'global.save'.trl, + width: false, + ), + ), + ], + ), + ), + ), + ); + } +} + +class BoardWidget extends ConsumerWidget { + const BoardWidget({super.key}); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final provider = ref.watch(createPictoProvider); + final textTheme = Theme.of(context).textTheme; + return Container( + padding: const EdgeInsets.all(16), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(16), + ), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + provider.isImageSelected + ? provider.isUrl + ? Image.network( + provider.imageUrlForPicto, + height: 90, + width: 90, + ) + : Image.file( + File( + provider.imageForPicto.path, + ), + height: 90, + width: 90, + ) + : Image.asset( + AppImages.kBoardSelectImage, + height: 90, + width: 90, + ), + Text( + provider.nameController.text.isEmpty ? 'create.board_name'.trl : provider.nameController.text, + style: textTheme.bodyMedium!.copyWith( + color: provider.nameController.text.isEmpty ? Colors.grey : Colors.black, + fontWeight: FontWeight.w500, + ), + ), + ], + ), + ); + } +} diff --git a/lib/presentation/screens/view_board/pictogram_screen.dart b/lib/presentation/screens/view_board/pictogram_screen.dart new file mode 100644 index 00000000..3993995e --- /dev/null +++ b/lib/presentation/screens/view_board/pictogram_screen.dart @@ -0,0 +1,151 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:go_router/go_router.dart'; +import 'package:ottaa_project_flutter/application/common/app_images.dart'; +import 'package:ottaa_project_flutter/application/common/extensions/translate_string.dart'; +import 'package:ottaa_project_flutter/application/providers/create_picto_provider.dart'; +import 'package:ottaa_project_flutter/application/providers/view_board_provider.dart'; +import 'package:ottaa_project_flutter/application/router/app_routes.dart'; +import 'package:ottaa_project_flutter/presentation/common/widgets/simple_button.dart'; +import 'package:picto_widget/picto_widget.dart'; + +class PictogramScreen extends ConsumerWidget { + const PictogramScreen({super.key}); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final provider = ref.watch(viewBoardProvider); + final data = MediaQueryData.fromWindow(WidgetsBinding.instance.window); + final isTablet = data.size.shortestSide < 600 ? false : true; + return Expanded( + child: GridView.builder( + padding: const EdgeInsets.symmetric(horizontal: 24), + itemCount: provider.filteredPictos.length + 1, + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: isTablet ? 4 : 3, + crossAxisSpacing: 12, + mainAxisSpacing: 12, + childAspectRatio: isTablet ? 1.3 : 1, + ), + itemBuilder: (context, index) { + if (provider.filteredPictos.length == index) { + return FittedBox( + fit: BoxFit.contain, + child: PictoWidget( + onTap: () async { + final pro = ref.read(createPictoProvider); + pro.init(userId: provider.userID); + context.push(AppRoutes.patientCreatePicto); + }, + image: Image.asset( + AppImages.kAddIcon, + ), + text: 'global.add'.trl, + ), + ); + } + return FittedBox( + fit: BoxFit.contain, + child: PictoWidget( + onTap: () { + //todo: ask from hector + }, + onLongPress: () async { + showDialog( + context: context, + builder: (context) { + return SimpleDialog( + backgroundColor: Colors.transparent, + shadowColor: Colors.transparent, + children: [ + GestureDetector( + onTap: () => context.pop(), + child: Container( + color: Colors.transparent, + height: MediaQuery.of(context).size.height * 0.75, + width: MediaQuery.of(context).size.width, + ), + ), + DialogButton( + text: 'global.disguise'.trl, + icon: Icons.hide_source_rounded, + onTap: () { + provider.hideCurrentPicto(id: provider.filteredPictos[index].id, index: index); + context.pop(); + }, + ), + const SizedBox( + height: 16, + ), + DialogButton( + text: 'global.edit'.trl, + icon: Icons.edit, + onTap: () async { + final pro = ref.read(createPictoProvider); + await pro.init(userId: provider.userID); + await pro.setForPictoEdit(pict: provider.filteredPictos[index]); + context.push(AppRoutes.patientEditPicto); + }, + ), + ], + ); + }, + ); + }, + imageUrl: provider.filteredPictos[index].resource.network, + text: provider.filteredPictos[index].text, + colorNumber: provider.filteredPictos[index].type, + disable: provider.filteredPictos[index].block, + ), + ); + }, + ), + ); + } +} + +class DialogButton extends StatelessWidget { + const DialogButton({ + super.key, + required this.text, + required this.icon, + required this.onTap, + }); + + final IconData icon; + final String text; + final void Function()? onTap; + + @override + Widget build(BuildContext context) { + final colorScheme = Theme.of(context).colorScheme; + final textTheme = Theme.of(context).textTheme; + return GestureDetector( + onTap: onTap, + child: Container( + padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 16), + decoration: BoxDecoration( + color: colorScheme.primary, + borderRadius: BorderRadius.circular(16), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon( + icon, + color: Colors.white, + size: 24, + ), + const SizedBox( + width: 8, + ), + Text( + text, + style: textTheme.bodyMedium!.copyWith(color: Colors.white), + ), + ], + ), + ), + ); + } +} diff --git a/lib/presentation/screens/view_board/search_screen.dart b/lib/presentation/screens/view_board/search_screen.dart new file mode 100644 index 00000000..1c36efdf --- /dev/null +++ b/lib/presentation/screens/view_board/search_screen.dart @@ -0,0 +1,174 @@ +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:go_router/go_router.dart'; +import 'package:ottaa_project_flutter/application/common/app_images.dart'; +import 'package:ottaa_project_flutter/application/common/extensions/translate_string.dart'; +import 'package:ottaa_project_flutter/application/providers/create_picto_provider.dart'; +import 'package:ottaa_project_flutter/application/providers/view_board_provider.dart'; +import 'package:ottaa_project_flutter/application/router/app_routes.dart'; +import 'package:ottaa_ui_kit/widgets.dart'; +import 'package:picto_widget/picto_widget.dart'; + +class SearchDataScreen extends ConsumerWidget { + const SearchDataScreen({super.key}); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final provider = ref.watch(viewBoardProvider); + final textTheme = Theme.of(context).textTheme; + return Scaffold( + resizeToAvoidBottomInset: false, + appBar: OTTAAAppBar( + title: Text( + '${'game.search'.trl} / ${'global.pictogram'.trl}', + ), + ), + body: Padding( + padding: const EdgeInsets.symmetric(horizontal: 16), + child: SizedBox( + height: MediaQuery.of(context).size.height, + width: MediaQuery.of(context).size.width, + child: SingleChildScrollView( + child: Column( + children: [ + SizedBox( + height: 50, + width: MediaQuery.of(context).size.width, + child: TextFormField( + onChanged: (value) { + if (value.length >= 3) { + //todo: search and show the pictos and boards + provider.searchForMatchingData(text: value); + } + if (value.isEmpty) { + provider.isSearching = false; + provider.notify(); + } + }, + decoration: InputDecoration( + suffixIcon: GestureDetector( + onTap: () async {}, + child: const Icon( + Icons.search, + color: Colors.black, + ), + ), + hintText: 'global.search'.trl, + ), + ), + ), + provider.isSearching + ? provider.isDataFetched + ? Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: const EdgeInsets.symmetric(vertical: 16), + child: Text( + 'home.grid.title'.trl, + style: textTheme.bodyMedium!.copyWith(fontWeight: FontWeight.w600), + ), + ), + ListView.builder( + itemCount: provider.filteredBoards.length, + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + padding: const EdgeInsets.only(bottom: 16), + itemBuilder: (context, index) { + return Padding( + padding: const EdgeInsets.only(bottom: 16), + child: PictogramCard( + title: provider.filteredBoards[index].text, + actionText: "customize.board.subtitle".trl, + pictogram: CachedNetworkImageProvider( + provider.filteredBoards[index].resource.network!, + ), + status: !provider.filteredBoards[index].block, + onPressed: () async { + showDialog( + context: context, + builder: (context) => const Center( + child: CircularProgressIndicator(), + )); + final pro = ref.read(createPictoProvider); + await pro.init(userId: provider.userID); + int i = -1; + final res = provider.boards.firstWhere((element) { + i++; + return element.id == provider.filteredBoards[index].id; + }); + await pro.setForBoardEdit(index: i); + context.pop(); + context.push(AppRoutes.patientCreateBoard); + }, + onChange: (bool a) {}, + ), + ); + }, + ), + Padding( + padding: const EdgeInsets.symmetric(vertical: 16), + child: Text( + 'global.pictogram'.trl, + style: textTheme.bodyMedium!.copyWith(fontWeight: FontWeight.w600), + ), + ), + GridView.builder( + padding: const EdgeInsets.symmetric(horizontal: 24), + itemCount: provider.filteredSearchPictos.length, + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 3, + crossAxisSpacing: 12, + mainAxisSpacing: 12, + ), + itemBuilder: (context, index) { + return FittedBox( + fit: BoxFit.contain, + child: PictoWidget( + onTap: () async { + showDialog( + context: context, + builder: (context) => const Center( + child: CircularProgressIndicator(), + )); + final pro = ref.read(createPictoProvider); + await pro.init(userId: provider.userID); + await pro.setForPictoEdit(pict: provider.filteredSearchPictos[index]); + context.pop(); + context.push(AppRoutes.patientEditPicto); + }, + imageUrl: provider.filteredSearchPictos[index].resource.network, + text: provider.filteredSearchPictos[index].text, + colorNumber: provider.filteredSearchPictos[index].type, + disable: provider.filteredSearchPictos[index].block, + ), + ); + }, + ), + const SizedBox( + height: 16, + ), + ], + ) + : const Expanded( + child: Center( + child: CircularProgressIndicator(), + ), + ) + : Padding( + padding: const EdgeInsets.only(top: 64), + child: Image.asset( + AppImages.kSearchPhoto, + ), + ), + ], + ), + ), + ), + ), + ); + } +} diff --git a/lib/presentation/screens/view_board/show_pictos_screen.dart b/lib/presentation/screens/view_board/show_pictos_screen.dart new file mode 100644 index 00000000..4ba26462 --- /dev/null +++ b/lib/presentation/screens/view_board/show_pictos_screen.dart @@ -0,0 +1,147 @@ +import 'package:auto_size_text/auto_size_text.dart'; +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:go_router/go_router.dart'; +import 'package:ottaa_project_flutter/application/common/app_images.dart'; +import 'package:ottaa_project_flutter/application/common/extensions/translate_string.dart'; +import 'package:ottaa_project_flutter/application/providers/create_picto_provider.dart'; +import 'package:ottaa_project_flutter/application/providers/view_board_provider.dart'; +import 'package:ottaa_project_flutter/application/router/app_routes.dart'; +import 'package:ottaa_project_flutter/presentation/common/widgets/responsive_widget.dart'; +import 'package:ottaa_project_flutter/presentation/screens/customized_board/ui/board_widget.dart'; +import 'package:ottaa_ui_kit/widgets.dart'; +import 'package:picto_widget/picto_widget.dart'; + +class ShowPictosScreen extends ConsumerWidget { + const ShowPictosScreen({super.key}); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final theme = Theme.of(context); + final textTheme = theme.textTheme; + final colorScheme = theme.colorScheme; + final provider = ref.watch(viewBoardProvider); + return ResponsiveWidget( + child: Scaffold( + appBar: OTTAAAppBar( + title: Row( + children: [ + Expanded( + child: AutoSizeText( + provider.boards[provider.selectedBoardID].text, + style: textTheme.headline3, + ), + ), + IconButton( + icon: const Icon( + Icons.help_outline_rounded, + size: 24, + ), + onPressed: () => BasicBottomSheet.show( + context, + // title: "", + subtitle: "board.customize.helpText".trl, + children: [ + Image.asset( + AppImages.kBoardImageEdit1, + height: 166, + ), + ], + okButtonText: "board.customize.okText".trl, + ), + padding: const EdgeInsets.all(0), + color: colorScheme.onSurface, + ), + ], + ), + ), + body: Column( + children: [ + Padding( + padding: const EdgeInsets.symmetric(horizontal: 24), + child: Column( + children: [ + const SizedBox( + height: 32, + ), + BoardWidget( + title: provider.boards[provider.selectedBoardID].text.toUpperCase(), + image: CachedNetworkImageProvider(provider.boards[provider.selectedBoardID].resource.network!), + customizeOnTap: () async { + showDialog(context: context, builder: (context) => const Center(child: CircularProgressIndicator())); + final pro = ref.read(createPictoProvider); + await pro.init(userId: provider.userID); + await pro.setForBoardEdit(index: provider.selectedBoardID); + context.pop(); + context.push(AppRoutes.patientCreateBoard); + }, + deleteOnTap: () async { + showDialog(context: context, builder: (context) => const Center(child: CircularProgressIndicator())); + await provider.deleteBoard(); + context.pop(); + context.pop(); + provider.notify(); + }, + onChanged: (bool a) { + provider.boards[provider.selectedBoardID].block = !a; + provider.notify(); + }, + status: !provider.boards[provider.selectedBoardID].block, + ), + const SizedBox( + height: 16, + ), + ], + ), + ), + Expanded( + child: GridView.builder( + padding: const EdgeInsets.symmetric(horizontal: 24), + shrinkWrap: true, + itemCount: provider.filteredPictos.length + 1, + gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 3, + crossAxisSpacing: 12, + mainAxisSpacing: 12, + ), + itemBuilder: (context, index) { + if (provider.filteredPictos.length == index) { + return FittedBox( + fit: BoxFit.contain, + child: PictoWidget( + onTap: () async { + final pro = ref.read(createPictoProvider); + await pro.init(userId: provider.userID, isFromBoard: true); + pro.selectedBoardID = provider.selectedBoardID; + context.push(AppRoutes.patientCreatePicto); + }, + image: Image.asset( + AppImages.kAddIcon, + ), + text: 'global.add'.trl, + ), + ); + } + return FittedBox( + fit: BoxFit.contain, + child: PictoWidget( + onTap: () { + provider.filteredPictos[index].block = !provider.filteredPictos[index].block; + provider.notify(); + }, + imageUrl: provider.filteredPictos[index].resource.network, + text: provider.filteredPictos[index].text, + colorNumber: provider.filteredPictos[index].type, + disable: provider.filteredPictos[index].block, + ), + ); + }, + ), + ), + ], + ), + ), + ); + } +} diff --git a/lib/presentation/screens/waiting/link_waiting_screen.dart b/lib/presentation/screens/waiting/link_waiting_screen.dart new file mode 100644 index 00000000..85923f3e --- /dev/null +++ b/lib/presentation/screens/waiting/link_waiting_screen.dart @@ -0,0 +1,61 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:go_router/go_router.dart'; +import 'package:ottaa_project_flutter/application/common/extensions/translate_string.dart'; +import 'package:ottaa_project_flutter/application/providers/link_provider.dart'; +import 'package:ottaa_project_flutter/application/router/app_routes.dart'; +import 'package:ottaa_project_flutter/presentation/common/widgets/ottaa_loading_animation.dart'; + +class LinkWaitingScreen extends ConsumerStatefulWidget { + const LinkWaitingScreen({super.key}); + + @override + ConsumerState createState() => + _LinkWaitingScreenState(); +} + +class _LinkWaitingScreenState extends ConsumerState { + @override + void initState() { + + final localContext = context; + + WidgetsBinding.instance.addPostFrameCallback((_) async { + await Future.delayed(const Duration(seconds: 3)); + + localContext.go(AppRoutes.caregiverLinkSuccess); + }); + super.initState(); + } + + @override + Widget build(BuildContext context) { + final query = MediaQuery.of(context); + final size = query.size; + + final textTheme = Theme.of(context).textTheme; + return Scaffold( + extendBody: true, + body: SizedBox.fromSize( + size: size, + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const OttaaLoadingAnimation(), + const SizedBox(height: 40), + Text( + "profile.link.wait.title".trl, + style: textTheme.headline2, + ), + const SizedBox(height: 10), + Text( + "profile.link.wait.subtitle".trl, + style: textTheme.headline3, + ), + ], + ), + ), + ); + } +} diff --git a/lib/presentation/screens/waiting/login_waiting_screen.dart b/lib/presentation/screens/waiting/login_waiting_screen.dart new file mode 100644 index 00000000..91f9d4da --- /dev/null +++ b/lib/presentation/screens/waiting/login_waiting_screen.dart @@ -0,0 +1,78 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:go_router/go_router.dart'; +import 'package:ottaa_project_flutter/application/common/extensions/translate_string.dart'; +import 'package:ottaa_project_flutter/application/common/i18n.dart'; +import 'package:ottaa_project_flutter/application/providers/splash_provider.dart'; +import 'package:ottaa_project_flutter/application/providers/user_provider.dart'; +import 'package:ottaa_project_flutter/application/router/app_routes.dart'; +import 'package:ottaa_project_flutter/core/enums/user_types.dart'; +import 'package:ottaa_project_flutter/presentation/common/widgets/ottaa_loading_animation.dart'; + +class LoginWaitingScreen extends ConsumerStatefulWidget { + const LoginWaitingScreen({super.key}); + + @override + ConsumerState createState() => + _LoginWaitingScreenState(); +} + +class _LoginWaitingScreenState extends ConsumerState { + @override + void initState() { + SplashProvider provider = ref.read(splashProvider); + + final localContext = context; + + WidgetsBinding.instance.addPostFrameCallback((_) async { + await provider.fetchUserInformation(); + + bool isFirstTime = await provider.isFirstTime(); + + final user = ref.read(userProvider.select((value) => value.user)); + + await I18N + .of(context) + .changeLanguage(user?.settings.language.language ?? "en_US"); + if (mounted) { + if (isFirstTime) { + return localContext.go(AppRoutes.onboarding); + } + + localContext.go(AppRoutes.home); + } + }); + super.initState(); + } + + @override + Widget build(BuildContext context) { + final query = MediaQuery.of(context); + final size = query.size; + + final textTheme = Theme.of(context).textTheme; + return Scaffold( + extendBody: true, + body: SizedBox.fromSize( + size: size, + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const OttaaLoadingAnimation(), + const SizedBox(height: 40), + Text( + "login.wait.title".trl, + style: textTheme.headline2, + ), + const SizedBox(height: 10), + Text( + "login.wait.subtitle".trl, + style: textTheme.headline3, + ), + ], + ), + ), + ); + } +} diff --git a/pubspec.yaml b/pubspec.yaml index b56383ac..56cfdf60 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -6,7 +6,7 @@ publish_to: "none" version: 1.0.0+1 environment: - sdk: ">=2.18.1 <3.0.0" + sdk: ">=2.19.2 <3.0.0" dependencies: flutter: @@ -18,13 +18,13 @@ dependencies: either_dart: ^0.3.0 firebase_analytics: ^10.0.5 firebase_auth: ^4.1.2 + firebase_auth_web: ^5.3.2 firebase_core: ^2.2.0 - firebase_crashlytics: ^3.0.5 + firebase_crashlytics: ^3.0.7 firebase_database: ^10.0.5 firebase_storage: ^11.0.5 - flutter_facebook_auth: ^5.0.6 flutter_riverpod: ^2.0.2 - flutter_tts: ^3.5.3 + flutter_tts: ^3.7.0 fluttertoast: ^8.1.1 get_it: ^7.2.0 go_router: ^5.0.5 @@ -33,43 +33,72 @@ dependencies: hive: ^2.2.3 hive_flutter: ^1.1.0 http: ^0.13.5 - image_picker: ^0.8.6 + image_picker: ^0.8.8 intl: ^0.17.0 json_theme: ^4.0.1+4 just_audio: ^0.9.29 package_info_plus: ^3.0.2 - picto_widget: ^0.0.4 + picto_widget: ^0.0.5+10 screenshot: ^1.2.3 share_plus: ^6.3.0 url_launcher: ^6.1.6 - json_serializable: ^6.5.4 json_annotation: ^4.7.0 path_provider: ^2.0.11 syncfusion_flutter_charts: ^20.3.56 textfield_datepicker: ^0.1.0 - sqflite: ^2.2.0+3 path: ^1.8.2 cached_network_image: ^3.2.2 transparent_image: ^2.0.0 + ottaa_ui_kit: + git: + url: https://github.com/OTTAA-Project/OTTAA_flutter_theme.git + ref: master + rive: ^0.9.1 + collection: ^1.16.0 + firebase_messaging: ^14.2.1 + awesome_notifications: ^0.7.4+1 + injectable: ^2.1.0 + firebase_remote_config: ^3.0.15 + universal_io: ^2.2.0 + dio: ^5.1.1 + json_serializable: + async: + cloud_functions: ^4.3.0 + animated_widgets: ^1.1.0 + responsive_builder: ^0.7.0 + sign_in_with_apple: ^4.3.0 dev_dependencies: build_runner: ^2.3.2 flutter_lints: ^2.0.1 flutter_test: sdk: flutter + hive_generator: ^2.0.0 mockito: ^5.3.2 - test: ^1.22.0 + injectable_generator: ^2.1.3 + http_mock_adapter: ^0.4.4 + firebase_storage_mocks: ^0.6.1 + firebase_database_mocks: ^0.6.0 + firebase_auth_mocks: ^0.12.0 + google_sign_in_mocks: ^0.2.2 + # custom_lint: + # riverpod_lint: dependency_overrides: - firebase_core_platform_interface: 4.5.1 - test_api: 0.4.12 - +# firebase_core_platform_interface: 4.5.1 +# test_api: 0.4.12 flutter: uses-material-design: true assets: - assets/imgs/ - assets/ + - assets/edit/ + - assets/edit/picto/ + - assets/board/ + - assets/board/icons/ + - assets/board/icons/icons_not_selected/ + - assets/board/icons/icons_selected/ - assets/profiles/ - assets/games_images/ - assets/audios/ @@ -79,6 +108,9 @@ flutter: - assets/gender_based/grupos/ - assets/i18n/ - assets/profile/ + - assets/rive/ + - assets/onboarding/ + - assets/user_settings/ fonts: - family: Roboto fonts: @@ -108,3 +140,9 @@ flutter: - family: OTTAAProjectCustomIcon fonts: - asset: assets/custom_icons/Ottaa_project_custom_icons.ttf + +test_coverage: + exclude: + - lib/core/** + ignore: + - lib/core/** diff --git a/test/Providers/Auth/auth_provider_test.dart b/test/Providers/Auth/auth_provider_test.dart deleted file mode 100644 index 8a76a216..00000000 --- a/test/Providers/Auth/auth_provider_test.dart +++ /dev/null @@ -1,101 +0,0 @@ -import 'package:either_dart/src/either.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:mockito/annotations.dart'; -import 'package:mockito/mockito.dart'; -import 'package:flutter/material.dart'; -import 'package:ottaa_project_flutter/application/notifiers/auth_notifier.dart'; -import 'package:ottaa_project_flutter/application/notifiers/loading_notifier.dart'; -import 'package:ottaa_project_flutter/application/providers/auth_provider.dart'; -import 'package:ottaa_project_flutter/application/service/about_service.dart'; -import 'package:ottaa_project_flutter/application/service/auth_service.dart'; -import 'package:ottaa_project_flutter/core/enums/sign_in_types.dart'; -import 'package:ottaa_project_flutter/core/models/user_model.dart'; -import 'package:ottaa_project_flutter/core/repositories/local_database_repository.dart'; -import 'package:flutter_riverpod/flutter_riverpod.dart'; - - -import 'auth_provider_test.mocks.dart'; - -@GenerateMocks([AuthProvider,LoadingNotifier,AuthService,AboutService,LocalDatabaseRepository,AuthNotifier]) -void main(){ - late AuthProvider authProvider; - late MockAuthProvider mockAuthProvider; - late MockLoadingNotifier mockLoadingNotifier; - late MockAuthService mockAuthService; - late MockAboutService mockAboutService; - late MockLocalDatabaseRepository mockLocalDatabaseRepository; - late MockAuthNotifier mockAuthNotifier; - late UserModel fakeUser; - - setUp(() { - fakeUser = const UserModel( - id: "0", - name: "fake user", - email: "fake@mail.com", - photoUrl: "https://test.com", - avatar: "0", - birthdate: 0, - gender: "male", - isFirstTime: true, - language: "es-ar", - ); - mockAuthProvider = MockAuthProvider(); - mockLoadingNotifier = MockLoadingNotifier(); - mockAuthService = MockAuthService(); - mockAboutService = MockAboutService(); - mockLocalDatabaseRepository =MockLocalDatabaseRepository(); - mockAuthNotifier = MockAuthNotifier(); - authProvider = AuthProvider(mockLoadingNotifier, mockAuthService, mockAboutService, mockLocalDatabaseRepository, mockAuthNotifier); - }); - group('auth Provider testing', () { - test('sign in', () async { - when(mockAuthService.signIn(SignInType.email)).thenAnswer((realInvocation) async => Right(fakeUser)); - when(mockLocalDatabaseRepository.setUser(fakeUser)).thenAnswer((realInvocation) async => {}); - when(mockAboutService.getUserInformation()).thenAnswer((realInvocation) async => Right(fakeUser)); - when(mockAuthNotifier.setSignedIn()).thenAnswer((realInvocation) { - mockAuthNotifier.state = true; - }); - when(mockLoadingNotifier.showLoading()).thenAnswer((realInvocation) { - mockLoadingNotifier.state = true; - }); - - when(mockLoadingNotifier.hideLoading()).thenAnswer((realInvocation) { - mockLoadingNotifier.state = false; - }); - - final result = await authProvider.signIn(SignInType.email); - - expect(result.right, isA()); - - verify(mockAuthService.signIn(SignInType.email)).called(1); - verify(mockLocalDatabaseRepository.setUser(fakeUser)).called(1); - verify(mockAboutService.getUserInformation()).called(1); - verify(mockAuthNotifier.setSignedIn()).called(1); - verify(mockLoadingNotifier.showLoading()).called(1); - verify(mockLoadingNotifier.hideLoading()).called(1); - }); - - test('log out',() async { - when(mockAuthService.signIn(SignInType.email)).thenAnswer((realInvocation) async => Right(fakeUser)); - when(mockLocalDatabaseRepository.setUser(fakeUser)).thenAnswer((realInvocation) async => {}); - when(mockAboutService.getUserInformation()).thenAnswer((realInvocation) async => Right(fakeUser)); - when(mockAuthNotifier.setSignedIn()).thenAnswer((realInvocation) { - mockAuthNotifier.state = true; - }); - when(mockLoadingNotifier.showLoading()).thenAnswer((realInvocation) { - mockLoadingNotifier.state = true; - }); - - when(mockAuthNotifier.setSignedOut()).thenAnswer((realInvocation) { - mockAuthNotifier.state = false; - }); - - await authProvider.logout(); - - expect( false, false); - }); - - }); - - -} \ No newline at end of file diff --git a/test/Providers/Auth/auth_provider_test.mocks.dart b/test/Providers/Auth/auth_provider_test.mocks.dart deleted file mode 100644 index 4d06db23..00000000 --- a/test/Providers/Auth/auth_provider_test.mocks.dart +++ /dev/null @@ -1,619 +0,0 @@ -// Mocks generated by Mockito 5.3.2 from annotations -// in ottaa_project_flutter/test/Providers/Auth/auth_provider_test.dart. -// Do not manually edit this file. - -// ignore_for_file: no_leading_underscores_for_library_prefixes -import 'dart:async' as _i5; -import 'dart:ui' as _i8; - -import 'package:either_dart/either.dart' as _i3; -import 'package:flutter_riverpod/flutter_riverpod.dart' as _i10; -import 'package:mockito/mockito.dart' as _i1; -import 'package:ottaa_project_flutter/application/notifiers/auth_notifier.dart' - as _i2; -import 'package:ottaa_project_flutter/application/notifiers/loading_notifier.dart' - as _i9; -import 'package:ottaa_project_flutter/application/providers/auth_provider.dart' - as _i4; -import 'package:ottaa_project_flutter/application/service/about_service.dart' - as _i13; -import 'package:ottaa_project_flutter/application/service/auth_service.dart' - as _i12; -import 'package:ottaa_project_flutter/core/enums/sign_in_types.dart' as _i7; -import 'package:ottaa_project_flutter/core/enums/user_types.dart' as _i14; -import 'package:ottaa_project_flutter/core/models/user_model.dart' as _i6; -import 'package:ottaa_project_flutter/core/repositories/local_database_repository.dart' - as _i15; -import 'package:state_notifier/state_notifier.dart' as _i11; - -// ignore_for_file: type=lint -// ignore_for_file: avoid_redundant_argument_values -// ignore_for_file: avoid_setters_without_getters -// ignore_for_file: comment_references -// ignore_for_file: implementation_imports -// ignore_for_file: invalid_use_of_visible_for_testing_member -// ignore_for_file: prefer_const_constructors -// ignore_for_file: unnecessary_parenthesis -// ignore_for_file: camel_case_types -// ignore_for_file: subtype_of_sealed_class - -class _FakeAuthNotifier_0 extends _i1.SmartFake implements _i2.AuthNotifier { - _FakeAuthNotifier_0( - Object parent, - Invocation parentInvocation, - ) : super( - parent, - parentInvocation, - ); -} - -class _FakeEither_1 extends _i1.SmartFake implements _i3.Either { - _FakeEither_1( - Object parent, - Invocation parentInvocation, - ) : super( - parent, - parentInvocation, - ); -} - -/// A class which mocks [AuthProvider]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockAuthProvider extends _i1.Mock implements _i4.AuthProvider { - MockAuthProvider() { - _i1.throwOnMissingStub(this); - } - - @override - _i2.AuthNotifier get authData => (super.noSuchMethod( - Invocation.getter(#authData), - returnValue: _FakeAuthNotifier_0( - this, - Invocation.getter(#authData), - ), - ) as _i2.AuthNotifier); - @override - bool get hasListeners => (super.noSuchMethod( - Invocation.getter(#hasListeners), - returnValue: false, - ) as bool); - @override - _i5.Future logout() => (super.noSuchMethod( - Invocation.method( - #logout, - [], - ), - returnValue: _i5.Future.value(), - returnValueForMissingStub: _i5.Future.value(), - ) as _i5.Future); - @override - _i5.Future<_i3.Either> signIn(_i7.SignInType? type) => - (super.noSuchMethod( - Invocation.method( - #signIn, - [type], - ), - returnValue: _i5.Future<_i3.Either>.value( - _FakeEither_1( - this, - Invocation.method( - #signIn, - [type], - ), - )), - ) as _i5.Future<_i3.Either>); - @override - void addListener(_i8.VoidCallback? listener) => super.noSuchMethod( - Invocation.method( - #addListener, - [listener], - ), - returnValueForMissingStub: null, - ); - @override - void removeListener(_i8.VoidCallback? listener) => super.noSuchMethod( - Invocation.method( - #removeListener, - [listener], - ), - returnValueForMissingStub: null, - ); - @override - void dispose() => super.noSuchMethod( - Invocation.method( - #dispose, - [], - ), - returnValueForMissingStub: null, - ); - @override - void notifyListeners() => super.noSuchMethod( - Invocation.method( - #notifyListeners, - [], - ), - returnValueForMissingStub: null, - ); -} - -/// A class which mocks [LoadingNotifier]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockLoadingNotifier extends _i1.Mock implements _i9.LoadingNotifier { - MockLoadingNotifier() { - _i1.throwOnMissingStub(this); - } - - @override - set onError(_i10.ErrorListener? _onError) => super.noSuchMethod( - Invocation.setter( - #onError, - _onError, - ), - returnValueForMissingStub: null, - ); - @override - bool get mounted => (super.noSuchMethod( - Invocation.getter(#mounted), - returnValue: false, - ) as bool); - @override - _i5.Stream get stream => (super.noSuchMethod( - Invocation.getter(#stream), - returnValue: _i5.Stream.empty(), - ) as _i5.Stream); - @override - bool get state => (super.noSuchMethod( - Invocation.getter(#state), - returnValue: false, - ) as bool); - @override - set state(bool? value) => super.noSuchMethod( - Invocation.setter( - #state, - value, - ), - returnValueForMissingStub: null, - ); - @override - bool get debugState => (super.noSuchMethod( - Invocation.getter(#debugState), - returnValue: false, - ) as bool); - @override - bool get hasListeners => (super.noSuchMethod( - Invocation.getter(#hasListeners), - returnValue: false, - ) as bool); - @override - void showLoading() => super.noSuchMethod( - Invocation.method( - #showLoading, - [], - ), - returnValueForMissingStub: null, - ); - @override - void hideLoading() => super.noSuchMethod( - Invocation.method( - #hideLoading, - [], - ), - returnValueForMissingStub: null, - ); - @override - void toggleLoading() => super.noSuchMethod( - Invocation.method( - #toggleLoading, - [], - ), - returnValueForMissingStub: null, - ); - @override - bool getState() => (super.noSuchMethod( - Invocation.method( - #getState, - [], - ), - returnValue: false, - ) as bool); - @override - bool updateShouldNotify( - bool? old, - bool? current, - ) => - (super.noSuchMethod( - Invocation.method( - #updateShouldNotify, - [ - old, - current, - ], - ), - returnValue: false, - ) as bool); - @override - _i10.RemoveListener addListener( - _i11.Listener? listener, { - bool? fireImmediately = true, - }) => - (super.noSuchMethod( - Invocation.method( - #addListener, - [listener], - {#fireImmediately: fireImmediately}, - ), - returnValue: () {}, - ) as _i10.RemoveListener); - @override - void dispose() => super.noSuchMethod( - Invocation.method( - #dispose, - [], - ), - returnValueForMissingStub: null, - ); -} - -/// A class which mocks [AuthService]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockAuthService extends _i1.Mock implements _i12.AuthService { - MockAuthService() { - _i1.throwOnMissingStub(this); - } - - @override - bool get isLogged => (super.noSuchMethod( - Invocation.getter(#isLogged), - returnValue: false, - ) as bool); - @override - _i5.Future<_i3.Either> getCurrentUser() => - (super.noSuchMethod( - Invocation.method( - #getCurrentUser, - [], - ), - returnValue: _i5.Future<_i3.Either>.value( - _FakeEither_1( - this, - Invocation.method( - #getCurrentUser, - [], - ), - )), - ) as _i5.Future<_i3.Either>); - @override - _i5.Future isLoggedIn() => (super.noSuchMethod( - Invocation.method( - #isLoggedIn, - [], - ), - returnValue: _i5.Future.value(false), - ) as _i5.Future); - @override - _i5.Future logout() => (super.noSuchMethod( - Invocation.method( - #logout, - [], - ), - returnValue: _i5.Future.value(), - returnValueForMissingStub: _i5.Future.value(), - ) as _i5.Future); - @override - _i5.Future<_i3.Either> signIn(_i7.SignInType? type) => - (super.noSuchMethod( - Invocation.method( - #signIn, - [type], - ), - returnValue: _i5.Future<_i3.Either>.value( - _FakeEither_1( - this, - Invocation.method( - #signIn, - [type], - ), - )), - ) as _i5.Future<_i3.Either>); - @override - _i5.Future<_i3.Either> signUp() => (super.noSuchMethod( - Invocation.method( - #signUp, - [], - ), - returnValue: _i5.Future<_i3.Either>.value( - _FakeEither_1( - this, - Invocation.method( - #signUp, - [], - ), - )), - ) as _i5.Future<_i3.Either>); -} - -/// A class which mocks [AboutService]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockAboutService extends _i1.Mock implements _i13.AboutService { - MockAboutService() { - _i1.throwOnMissingStub(this); - } - - @override - _i5.Future getAppVersion() => (super.noSuchMethod( - Invocation.method( - #getAppVersion, - [], - ), - returnValue: _i5.Future.value(''), - ) as _i5.Future); - @override - _i5.Future getAvailableAppVersion() => (super.noSuchMethod( - Invocation.method( - #getAvailableAppVersion, - [], - ), - returnValue: _i5.Future.value(''), - ) as _i5.Future); - @override - _i5.Future getDeviceName() => (super.noSuchMethod( - Invocation.method( - #getDeviceName, - [], - ), - returnValue: _i5.Future.value(''), - ) as _i5.Future); - @override - _i5.Future getEmail() => (super.noSuchMethod( - Invocation.method( - #getEmail, - [], - ), - returnValue: _i5.Future.value(''), - ) as _i5.Future); - @override - _i5.Future<_i14.UserType> getUserType() => (super.noSuchMethod( - Invocation.method( - #getUserType, - [], - ), - returnValue: _i5.Future<_i14.UserType>.value(_i14.UserType.free), - ) as _i5.Future<_i14.UserType>); - @override - _i5.Future sendSupportEmail() => (super.noSuchMethod( - Invocation.method( - #sendSupportEmail, - [], - ), - returnValue: _i5.Future.value(), - returnValueForMissingStub: _i5.Future.value(), - ) as _i5.Future); - @override - _i5.Future getProfilePicture() => (super.noSuchMethod( - Invocation.method( - #getProfilePicture, - [], - ), - returnValue: _i5.Future.value(''), - ) as _i5.Future); - @override - _i5.Future uploadProfilePicture(String? photo) => (super.noSuchMethod( - Invocation.method( - #uploadProfilePicture, - [photo], - ), - returnValue: _i5.Future.value(), - returnValueForMissingStub: _i5.Future.value(), - ) as _i5.Future); - @override - _i5.Future<_i3.Either> getUserInformation() => - (super.noSuchMethod( - Invocation.method( - #getUserInformation, - [], - ), - returnValue: _i5.Future<_i3.Either>.value( - _FakeEither_1( - this, - Invocation.method( - #getUserInformation, - [], - ), - )), - ) as _i5.Future<_i3.Either>); - @override - _i5.Future uploadUserInformation() => (super.noSuchMethod( - Invocation.method( - #uploadUserInformation, - [], - ), - returnValue: _i5.Future.value(), - returnValueForMissingStub: _i5.Future.value(), - ) as _i5.Future); - @override - _i5.Future isCurrentUserAvatarExist() => (super.noSuchMethod( - Invocation.method( - #isCurrentUserAvatarExist, - [], - ), - returnValue: _i5.Future.value(false), - ) as _i5.Future); - @override - _i5.Future isFirstTime() => (super.noSuchMethod( - Invocation.method( - #isFirstTime, - [], - ), - returnValue: _i5.Future.value(false), - ) as _i5.Future); -} - -/// A class which mocks [LocalDatabaseRepository]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockLocalDatabaseRepository extends _i1.Mock - implements _i15.LocalDatabaseRepository { - MockLocalDatabaseRepository() { - _i1.throwOnMissingStub(this); - } - - @override - set user(_i6.UserModel? user) => super.noSuchMethod( - Invocation.setter( - #user, - user, - ), - returnValueForMissingStub: null, - ); - @override - _i5.Future init() => (super.noSuchMethod( - Invocation.method( - #init, - [], - ), - returnValue: _i5.Future.value(), - returnValueForMissingStub: _i5.Future.value(), - ) as _i5.Future); - @override - _i5.Future close() => (super.noSuchMethod( - Invocation.method( - #close, - [], - ), - returnValue: _i5.Future.value(), - returnValueForMissingStub: _i5.Future.value(), - ) as _i5.Future); - @override - _i5.Future setUser(_i6.UserModel? user) => (super.noSuchMethod( - Invocation.method( - #setUser, - [user], - ), - returnValue: _i5.Future.value(), - returnValueForMissingStub: _i5.Future.value(), - ) as _i5.Future); - @override - _i5.Future<_i6.UserModel?> getUser() => (super.noSuchMethod( - Invocation.method( - #getUser, - [], - ), - returnValue: _i5.Future<_i6.UserModel?>.value(), - ) as _i5.Future<_i6.UserModel?>); - @override - _i5.Future deleteUser() => (super.noSuchMethod( - Invocation.method( - #deleteUser, - [], - ), - returnValue: _i5.Future.value(), - returnValueForMissingStub: _i5.Future.value(), - ) as _i5.Future); -} - -/// A class which mocks [AuthNotifier]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockAuthNotifier extends _i1.Mock implements _i2.AuthNotifier { - MockAuthNotifier() { - _i1.throwOnMissingStub(this); - } - - @override - set onError(_i10.ErrorListener? _onError) => super.noSuchMethod( - Invocation.setter( - #onError, - _onError, - ), - returnValueForMissingStub: null, - ); - @override - bool get mounted => (super.noSuchMethod( - Invocation.getter(#mounted), - returnValue: false, - ) as bool); - @override - _i5.Stream get stream => (super.noSuchMethod( - Invocation.getter(#stream), - returnValue: _i5.Stream.empty(), - ) as _i5.Stream); - @override - bool get state => (super.noSuchMethod( - Invocation.getter(#state), - returnValue: false, - ) as bool); - @override - set state(bool? value) => super.noSuchMethod( - Invocation.setter( - #state, - value, - ), - returnValueForMissingStub: null, - ); - @override - bool get debugState => (super.noSuchMethod( - Invocation.getter(#debugState), - returnValue: false, - ) as bool); - @override - bool get hasListeners => (super.noSuchMethod( - Invocation.getter(#hasListeners), - returnValue: false, - ) as bool); - @override - void setSignedIn() => super.noSuchMethod( - Invocation.method( - #setSignedIn, - [], - ), - returnValueForMissingStub: null, - ); - @override - void setSignedOut() => super.noSuchMethod( - Invocation.method( - #setSignedOut, - [], - ), - returnValueForMissingStub: null, - ); - @override - bool updateShouldNotify( - bool? old, - bool? current, - ) => - (super.noSuchMethod( - Invocation.method( - #updateShouldNotify, - [ - old, - current, - ], - ), - returnValue: false, - ) as bool); - @override - _i10.RemoveListener addListener( - _i11.Listener? listener, { - bool? fireImmediately = true, - }) => - (super.noSuchMethod( - Invocation.method( - #addListener, - [listener], - {#fireImmediately: fireImmediately}, - ), - returnValue: () {}, - ) as _i10.RemoveListener); - @override - void dispose() => super.noSuchMethod( - Invocation.method( - #dispose, - [], - ), - returnValueForMissingStub: null, - ); -} diff --git a/test/Providers/Onboarding/onboarding_provider_test.dart b/test/Providers/Onboarding/onboarding_provider_test.dart deleted file mode 100644 index ebff6398..00000000 --- a/test/Providers/Onboarding/onboarding_provider_test.dart +++ /dev/null @@ -1,78 +0,0 @@ -import 'package:either_dart/either.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:mockito/annotations.dart'; -import 'package:mockito/mockito.dart'; -import 'package:ottaa_project_flutter/application/notifiers/loading_notifier.dart'; -import 'package:ottaa_project_flutter/application/notifiers/user_avatar_notifier.dart'; -import 'package:ottaa_project_flutter/application/providers/onboarding_provider.dart'; -import 'package:ottaa_project_flutter/core/enums/sign_in_types.dart'; -import 'package:ottaa_project_flutter/core/models/user_model.dart'; -import 'package:ottaa_project_flutter/core/repositories/about_repository.dart'; -import 'package:ottaa_project_flutter/core/repositories/auth_repository.dart'; -import 'package:ottaa_project_flutter/core/repositories/local_database_repository.dart'; - -import 'onboarding_provider_test.mocks.dart'; - - -@GenerateMocks([OnBoardingNotifier,AuthRepository,LoadingNotifier, AboutRepository, UserAvatarNotifier, LocalDatabaseRepository]) -void main(){ - late OnBoardingNotifier onBoardingNotifier; - late MockAuthRepository mockAuthRepository; - late MockLoadingNotifier mockLoadingNotifier; - late MockAboutRepository mockAboutRepository; - late MockUserAvatarNotifier mockUserAvatarNotifier; - late MockLocalDatabaseRepository mockLocalDatabaseRepository; - late MockOnBoardingNotifier mockOnBoardingNotifier; - late UserModel fakeUser; - - setUp((){ - fakeUser = const UserModel( - id: "0", - name: "fake user", - email: "fake@mail.com", - photoUrl: "https://test.com", - avatar: "0", - birthdate: 0, - gender: "male", - isFirstTime: true, - language: "es-ar", - ); - mockAuthRepository = MockAuthRepository(); - mockLoadingNotifier = MockLoadingNotifier(); - mockAboutRepository = MockAboutRepository(); - mockUserAvatarNotifier = MockUserAvatarNotifier(); - mockLocalDatabaseRepository = MockLocalDatabaseRepository(); - mockLoadingNotifier = MockLoadingNotifier(); - mockOnBoardingNotifier = MockOnBoardingNotifier(); - onBoardingNotifier = OnBoardingNotifier(mockAuthRepository, mockAboutRepository, mockLocalDatabaseRepository, mockLoadingNotifier, mockUserAvatarNotifier); - }); - group ('Onboarding Notifier',(){ - test('Sign out', () async { - await onBoardingNotifier.signOut(); - }); - test('Update User Avatar', () async { - when(mockAuthRepository.signIn(SignInType.email)).thenAnswer((realInvocation) async => Right(fakeUser)); - when(mockAuthRepository.getCurrentUser()).thenAnswer((realInvocation) async => Right(fakeUser)); - when(mockUserAvatarNotifier.getAvatar()).thenAnswer((realInvocation) => '730.png'); - await onBoardingNotifier.updateUserAvatar(); - - }); - test('Update User Avatar fail user', () async { - when(mockAuthRepository.signIn(SignInType.email)).thenAnswer((realInvocation) async => Right(fakeUser)); - when(mockAuthRepository.getCurrentUser()).thenAnswer((realInvocation) async => Left(fakeUser.name)); - when(mockUserAvatarNotifier.getAvatar()).thenAnswer((realInvocation) => '730.png'); - await onBoardingNotifier.updateUserAvatar(); - }); - test('Change User Avatar ', () async { - // when(mockAuthRepository.signIn(SignInType.email)).thenAnswer((realInvocation) async => Right(fakeUser)); - //when(mockAuthRepository.getCurrentUser()).thenAnswer((realInvocation) async => Left(fakeUser.name)); - when(mockUserAvatarNotifier.changeAvatar(2)).thenAnswer((realInvocation) => {}); - when(mockUserAvatarNotifier.getAvatar()).thenAnswer((realInvocation) => '730.png'); - onBoardingNotifier.changeAvatar(2); - expect(mockUserAvatarNotifier.getAvatar(), '730.png'); - }); - - - }); - -} \ No newline at end of file diff --git a/test/Providers/Splash/SplashProvider_test.dart b/test/Providers/Splash/SplashProvider_test.dart deleted file mode 100644 index a14fe2da..00000000 --- a/test/Providers/Splash/SplashProvider_test.dart +++ /dev/null @@ -1,67 +0,0 @@ -import 'package:either_dart/either.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:mockito/annotations.dart'; -import 'package:mockito/mockito.dart'; -import 'package:ottaa_project_flutter/application/notifiers/user_avatar_notifier.dart'; -import 'package:ottaa_project_flutter/application/providers/splash_provider.dart'; -import 'package:ottaa_project_flutter/core/models/user_model.dart'; -import 'package:ottaa_project_flutter/core/repositories/about_repository.dart'; -import 'package:ottaa_project_flutter/core/repositories/auth_repository.dart'; - -import 'SplashProvider_test.mocks.dart'; - -@GenerateMocks([SplashProvider,AboutRepository,AuthRepository,UserAvatarNotifier]) -void main(){ - late SplashProvider splashProvider; - late MockAboutRepository mockAboutRepository; - late MockAuthRepository mockAuthRepository; - late MockUserAvatarNotifier mockUserAvatarNotifier; - late UserModel fakeUser; - - setUp((){ - fakeUser = const UserModel( - id: "0", - name: "fake user", - email: "fake@mail.com", - photoUrl: "https://test.com", - avatar: "0", - birthdate: 0, - gender: "male", - isFirstTime: true, - language: "es-ar", - ); - - mockAboutRepository = MockAboutRepository(); - mockAuthRepository = MockAuthRepository(); - mockUserAvatarNotifier = MockUserAvatarNotifier(); - splashProvider = SplashProvider(mockAboutRepository, mockAuthRepository, mockUserAvatarNotifier); - }); - group('Splash Provider Testing', () { - test('Check User Avatar true', () async { - when(mockAboutRepository.isCurrentUserAvatarExist()).thenAnswer((realInvocation) async => true); - expect(await splashProvider.checkUserAvatar(),true); - }); - test('Check User Avatar false', () async { - when(mockAboutRepository.isCurrentUserAvatarExist()).thenAnswer((realInvocation) async => false); - expect(await splashProvider.checkUserAvatar(),false); - }); - test('Fetch user information', () async { - when(mockAboutRepository.getUserInformation()).thenAnswer((realInvocation) async => Right(fakeUser)); - when(mockUserAvatarNotifier.changeAvatar(615)).thenAnswer((realInvocation) async => true); - expect(await splashProvider.fetchUserInformation(), true); - }); - test('Is First Time', () async { - when(mockAboutRepository.isFirstTime()).thenAnswer((realInvocation) async => true); - expect( await splashProvider.isFirstTime(), true); - }); - - test('UnFetch user information id', () async { - when(mockAboutRepository.getUserInformation()).thenAnswer((realInvocation) async => Left(fakeUser.id)); - when(mockUserAvatarNotifier.changeAvatar(615)).thenAnswer((realInvocation) async => false); - expect(await splashProvider.fetchUserInformation(), false); - }); - - }); - - -} diff --git a/test/Providers/TTS/ttsprovider_test.dart b/test/Providers/TTS/ttsprovider_test.dart deleted file mode 100644 index 294c517f..00000000 --- a/test/Providers/TTS/ttsprovider_test.dart +++ /dev/null @@ -1,29 +0,0 @@ -import 'package:either_dart/src/either.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:mockito/annotations.dart'; -import 'package:mockito/mockito.dart'; -import 'package:ottaa_project_flutter/application/providers/tts_provider.dart'; -import 'package:ottaa_project_flutter/core/repositories/tts_repository.dart'; - -import 'ttsprovider_test.mocks.dart'; - - -@GenerateMocks([TTSProvider,TTSRepository]) -void main(){ - late MockTTSProvider mockTTSProvider; - late MockTTSRepository mockTTSRepository; - late TTSProvider ttsProvider; - setUp((){ - mockTTSRepository = MockTTSRepository(); - mockTTSProvider = MockTTSProvider(); - ttsProvider = TTSProvider(mockTTSRepository); - }); - - group('TTS Provider', () { - test('Speak tts provider', () async { - await ttsProvider.speak('Hello'); - verify(ttsProvider.speak('Hello')).called(1); - }); - }); - -} \ No newline at end of file diff --git a/test/Providers/about/about_test.dart b/test/Providers/about/about_test.dart deleted file mode 100644 index ce925ac4..00000000 --- a/test/Providers/about/about_test.dart +++ /dev/null @@ -1,152 +0,0 @@ -import 'package:either_dart/src/either.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:mockito/annotations.dart'; -import 'package:mockito/mockito.dart'; -import 'package:ottaa_project_flutter/application/providers/about_provider.dart'; -import 'package:ottaa_project_flutter/application/service/about_service.dart'; -import 'package:ottaa_project_flutter/core/models/user_model.dart'; -import 'package:ottaa_project_flutter/core/enums/user_types.dart'; - -import 'about_test.mocks.dart'; - -@GenerateMocks([AboutService]) -void main() { - late AboutProvider aboutProvider; - late MockAboutService mockAboutService; - - late UserModel fakeUser; - - setUp(() { - fakeUser = const UserModel( - id: "0", - name: "fake user", - email: "fake@mail.com", - photoUrl: "https://test.com", - avatar: "0", - birthdate: 0, - gender: "male", - isFirstTime: true, - language: "es-ar", - ); - - mockAboutService = MockAboutService(); - aboutProvider = AboutProvider(mockAboutService); - }); - - test("should return the app version", () async { - when(mockAboutService.getAppVersion()).thenAnswer((_) async => "1.0.0"); - - expect(await aboutProvider.getAppVersion(), "1.0.0"); - verify(mockAboutService.getAppVersion()).called(1); - }); - - test("should return the available app version", () async { - when(mockAboutService.getAvailableAppVersion()).thenAnswer((_) async => "1.0.0"); - - expect(await aboutProvider.getAvailableAppVersion(), "1.0.0"); - verify(mockAboutService.getAvailableAppVersion()).called(1); - }); - - test("should return the device name", () async { - when(mockAboutService.getDeviceName()).thenAnswer((_) async => "iPhone 12"); - - expect(await aboutProvider.getDeviceName(), "iPhone 12"); - verify(mockAboutService.getDeviceName()).called(1); - }); - - test("should return the user email", () async { - when(mockAboutService.getEmail()).thenAnswer((_) async => "test@mail.com"); - - expect(await aboutProvider.getEmail(), "test@mail.com"); - - verify(mockAboutService.getEmail()).called(1); - }); - - test("should return the user profile picture", () async { - when(mockAboutService.getProfilePicture()).thenAnswer((_) async => "https://test.com"); - - expect(await aboutProvider.getProfilePicture(), "https://test.com"); - - verify(mockAboutService.getProfilePicture()).called(1); - }); - - test("should return the user information", () async { - when(mockAboutService.getUserInformation()).thenAnswer((_) async => Right(fakeUser)); - expect((await mockAboutService.getUserInformation()).isRight, true); - - expect((await mockAboutService.getUserInformation()).right, isA()); - }); - - test("should return free user type", () async { - when(mockAboutService.getUserType()).thenAnswer((_) async => UserType.free); - - expect(await aboutProvider.getUserType(), UserType.free); - - verify(mockAboutService.getUserType()).called(1); - }); - - test("should return premium user type", () async { - when(mockAboutService.getUserType()).thenAnswer((_) async => UserType.premium); - - expect(await aboutProvider.getUserType(), UserType.premium); - - verify(mockAboutService.getUserType()).called(1); - }); - - test("should return if the user avatar exist", () async { - when(mockAboutService.getProfilePicture()).thenAnswer((_) async => fakeUser.photoUrl); - - expect(await aboutProvider.getProfilePicture(), "https://test.com"); - - verify(mockAboutService.getProfilePicture()).called(1); - }); - - test("should return if the user is first time", () async { - when(mockAboutService.isFirstTime()).thenAnswer((_) async => fakeUser.isFirstTime); - - expect(await mockAboutService.isFirstTime(), true); - - verify(mockAboutService.isFirstTime()).called(1); - }); - - test("should upload the user information", () async { - when(mockAboutService.uploadUserInformation()).thenAnswer((_) async { - fakeUser = const UserModel( - id: "1", - name: "fake user 2", - email: "fake2@mail.com", - photoUrl: "https://test2.com", - avatar: "2", - birthdate: 1, - gender: "female", - isFirstTime: false, - language: "en-us", - ); - }); - await aboutProvider.uploadUserInformation(); - - verify(mockAboutService.uploadUserInformation()).called(1); - - expect(fakeUser.email, "fake2@mail.com"); - expect(fakeUser.id, "1"); - expect(fakeUser.name, "fake user 2"); - expect(fakeUser.photoUrl, "https://test2.com"); - expect(fakeUser.avatar, "2"); - expect(fakeUser.birthdate, 1); - expect(fakeUser.gender, "female"); - expect(fakeUser.isFirstTime, false); - expect(fakeUser.language, "en-us"); - }); - - test("should upload the user profile picture", () async { - when(mockAboutService.uploadProfilePicture("https://test3.com")).thenAnswer((_) async => fakeUser = fakeUser.copyWith(photoUrl: "https://test3.com")); - await aboutProvider.uploadProfilePicture("https://test3.com"); - expect(fakeUser.photoUrl, "https://test3.com"); - }); - - test("should send a support email", () async { - when(mockAboutService.sendSupportEmail()).thenAnswer((_) async => true); - await aboutProvider.sendSupportEmail(); - verify(mockAboutService.sendSupportEmail()).called(1); - }); -} diff --git a/test/Service/LocalStorage/local_storage_service_test.dart b/test/Service/LocalStorage/local_storage_service_test.dart deleted file mode 100644 index 33338cc5..00000000 --- a/test/Service/LocalStorage/local_storage_service_test.dart +++ /dev/null @@ -1,109 +0,0 @@ -import 'dart:ffi'; -import 'dart:io'; -import 'dart:typed_data'; - -import 'package:either_dart/src/either.dart'; -import 'package:flutter/services.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:mockito/annotations.dart'; -import 'package:mockito/mockito.dart'; -import 'package:ottaa_project_flutter/application/language/file_language.dart'; -import 'package:ottaa_project_flutter/application/service/local_storage_service.dart'; - -void main(){ - LocalStorageService localStorageService = LocalStorageService(); - TestWidgetsFlutterBinding.ensureInitialized(); - group('Test Local Storage Service ', () { - group('Test es-AR', () { - test('Write Groups ES', () async { - String result = await rootBundle.loadString('assets/gender_based/grupos/grupos_es_male.json'); - await localStorageService.writeGruposToFile(data: result, language: 'es-AR'); - }); - test('Read Groups ES',() async { - List esG = await localStorageService.readGruposFromFile(language:'es-AR'); - print( esG); - }); - test('WritePictograms ES', () async { - String result = await rootBundle.loadString('assets/gender_based/pictos/pictos_es_male.json'); - await localStorageService.writePictoToFile(data: result, language: 'es-AR'); - }); - test('Read Pictograms ES',() async { - List esG = await localStorageService.readPictoFromFile(language:'es-AR'); - print( esG); - }); - }); - group('Test en-US', () { - test('Write Groups EN', () async { - String result = await rootBundle.loadString('assets/grupos.json'); - await localStorageService.writeGruposToFile(data: result, language: 'en-US'); - }); - test('Read Groups EN',() async { - List en = await localStorageService.readGruposFromFile(language:'en-US'); - print( en); - }); - test('Read Pictos EN', () async { - String result = await rootBundle.loadString('assets/pictos.json'); - await localStorageService.writePictoToFile(data: result, language: 'en-US'); - }); - test('Read Pictos EN',() async { - List en = await localStorageService.readPictoFromFile(language:'en-US'); - print( en); - }); - }); - group('Test fr-FR', () { - test('Write Groups fr', () async { - String result = await rootBundle.loadString('assets/languages/grupos_fr.json'); - await localStorageService.writeGruposToFile(data: result, language: 'fr-FR'); - }); - test('Read Groups fr',() async { - List en = await localStorageService.readGruposFromFile(language:'fr-FR'); - print( en); - }); - test('Write Pictos fr', () async { - String result = await rootBundle.loadString('assets/languages/pictos_fr.json'); - await localStorageService.writePictoToFile(data: result, language: 'fr-FR'); - }); - test('Read Pictos fr',() async { - List en = await localStorageService.readPictoFromFile(language:'fr-FR'); - print( en); - }); - }); - group('Test pt-BR', () { - test('Write Groups pt', () async { - String result = await rootBundle.loadString('assets/languages/grupos_pt.json'); - await localStorageService.writeGruposToFile(data: result, language: 'pt-BR'); - }); - test('Read Groups pt',() async { - List en = await localStorageService.readGruposFromFile(language:'pt-BR'); - print( en); - }); - test('Write Pictos pt', () async { - String result = await rootBundle.loadString('assets/languages/pictos_pt.json'); - await localStorageService.writePictoToFile(data: result, language: 'pt-BR'); - }); - test('Read Pictos pt',() async { - List en = await localStorageService.readPictoFromFile(language:'pt-BR'); - print( en); - }); - }); - group('Test default', () { - test('Write Groups IT', () async { - String result = await rootBundle.loadString('assets/grupos.json'); - await localStorageService.writeGruposToFile(data: result, language: 'it-IT'); - }); - test('Read Groups IT',() async { - List en = await localStorageService.readGruposFromFile(language:'it-IT'); - print( en); - }); - test('Read Pictos IT', () async { - String result = await rootBundle.loadString('assets/pictos.json'); - await localStorageService.writePictoToFile(data: result, language: 'it-IT'); - }); - test('Read Pictos IT',() async { - List en = await localStorageService.readPictoFromFile(language:'it-IT'); - print( en); - }); - }); - - }); -} \ No newline at end of file diff --git a/test/Service/LocalStorage/sentences_service_test.dart b/test/Service/LocalStorage/sentences_service_test.dart deleted file mode 100644 index 53d74745..00000000 --- a/test/Service/LocalStorage/sentences_service_test.dart +++ /dev/null @@ -1,79 +0,0 @@ -import 'package:either_dart/src/either.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:mockito/annotations.dart'; -import 'package:mockito/mockito.dart'; -import 'package:ottaa_project_flutter/application/common/constants.dart'; -import 'package:ottaa_project_flutter/application/service/sentences_service.dart'; -import 'package:ottaa_project_flutter/core/models/sentence_model.dart'; -import 'package:ottaa_project_flutter/core/models/user_model.dart'; -import 'package:ottaa_project_flutter/core/repositories/auth_repository.dart'; -import 'package:ottaa_project_flutter/core/repositories/server_repository.dart'; - -import 'sentences_service_test.mocks.dart'; - -@GenerateMocks([SentencesService, AuthRepository, ServerRepository]) -void main() { - late MockAuthRepository mockAuthRepository; - late MockServerRepository mockServerRepository; - late SentencesService sentencesService; - late UserModel fakeUser; - late SentenceModel fakeSentenceModel,fakeSentenceModel1; - - setUp(() { - fakeUser = const UserModel( - id: "0", - name: "fake user", - email: "fake@mail.com", - photoUrl: "https://test.com", - avatar: "0", - birthdate: 0, - gender: "male", - isFirstTime: true, - language: "es-ar", - ); - fakeSentenceModel = SentenceModel( - frase: "Fake", - frecuencia: 1, - fecha: [0], - locale: "es", - id: 0, - complejidad: Complex( - valor: 0, - pictosComponentes: [ - PictosComponente(id: 0, esSugerencia: false, edad: ["0"], sexo: ["0"]) - ], - ), - ); - fakeSentenceModel1 = SentenceModel( - frase: "Sentence", - frecuencia: 1, - fecha: [0], - locale: "es", - id: 0, - complejidad: Complex( - valor: 0, - pictosComponentes: [ - PictosComponente(id: 0, esSugerencia: false, edad: ["0"], sexo: ["0"]) - ], - ), - ); - - mockAuthRepository = MockAuthRepository(); - mockServerRepository = MockServerRepository(); - sentencesService = - SentencesService(mockAuthRepository, mockServerRepository); - }); - /* - group('Sentences Service Testing', () { - test('description', () async { - when(MockAuthRepository().getCurrentUser()) - .thenAnswer((realInvocation) async => Right(fakeUser)); - when(MockServerRepository().getUserSentences('0', - language: 'es-ar', type: Constants.kMostUsedSentences)) - .thenAnswer((realInvocation) async=> Right([fakeSentenceModel1,fakeSentenceModel2]);); - sentencesService.fetchSentences( - language: 'es', type: Constants.kMostUsedSentences); - }); - });*/ - -} diff --git a/test/notifiers/auth_notifier_test.dart b/test/notifiers/auth_notifier_test.dart new file mode 100644 index 00000000..b9b352dd --- /dev/null +++ b/test/notifiers/auth_notifier_test.dart @@ -0,0 +1,10 @@ + +import 'package:mockito/annotations.dart'; +import 'package:ottaa_project_flutter/core/repositories/repositories.dart'; + +@GenerateMocks([ + AuthRepository +]) +void main() { + +} \ No newline at end of file diff --git a/test/notifiers/auth_notifier_test.mocks.dart b/test/notifiers/auth_notifier_test.mocks.dart new file mode 100644 index 00000000..62ba6b1c --- /dev/null +++ b/test/notifiers/auth_notifier_test.mocks.dart @@ -0,0 +1,143 @@ +// Mocks generated by Mockito 5.4.0 from annotations +// in ottaa_project_flutter/test/notifiers/auth_notifier_test.dart. +// Do not manually edit this file. + +// ignore_for_file: no_leading_underscores_for_library_prefixes +import 'dart:async' as _i4; + +import 'package:either_dart/either.dart' as _i2; +import 'package:mockito/mockito.dart' as _i1; +import 'package:ottaa_project_flutter/core/abstracts/user_model.dart' as _i5; +import 'package:ottaa_project_flutter/core/enums/sign_in_types.dart' as _i6; +import 'package:ottaa_project_flutter/core/repositories/auth_repository.dart' + as _i3; + +// ignore_for_file: type=lint +// ignore_for_file: avoid_redundant_argument_values +// ignore_for_file: avoid_setters_without_getters +// ignore_for_file: comment_references +// ignore_for_file: implementation_imports +// ignore_for_file: invalid_use_of_visible_for_testing_member +// ignore_for_file: prefer_const_constructors +// ignore_for_file: unnecessary_parenthesis +// ignore_for_file: camel_case_types +// ignore_for_file: subtype_of_sealed_class + +class _FakeEither_0 extends _i1.SmartFake implements _i2.Either { + _FakeEither_0( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +/// A class which mocks [AuthRepository]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockAuthRepository extends _i1.Mock implements _i3.AuthRepository { + MockAuthRepository() { + _i1.throwOnMissingStub(this); + } + + @override + bool get isLogged => (super.noSuchMethod( + Invocation.getter(#isLogged), + returnValue: false, + ) as bool); + @override + _i4.Future<_i2.Either> signIn( + _i6.SignInType? type, [ + String? email, + String? password, + ]) => + (super.noSuchMethod( + Invocation.method( + #signIn, + [ + type, + email, + password, + ], + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #signIn, + [ + type, + email, + password, + ], + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future<_i2.Either> signUp() => (super.noSuchMethod( + Invocation.method( + #signUp, + [], + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #signUp, + [], + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future<_i2.Either> getCurrentUser() => + (super.noSuchMethod( + Invocation.method( + #getCurrentUser, + [], + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #getCurrentUser, + [], + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future isLoggedIn() => (super.noSuchMethod( + Invocation.method( + #isLoggedIn, + [], + ), + returnValue: _i4.Future.value(false), + ) as _i4.Future); + @override + _i4.Future logout() => (super.noSuchMethod( + Invocation.method( + #logout, + [], + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future getDeviceId() => (super.noSuchMethod( + Invocation.method( + #getDeviceId, + [], + ), + returnValue: _i4.Future.value(''), + ) as _i4.Future); + @override + _i4.Future deleteAccount({required String? userId}) => + (super.noSuchMethod( + Invocation.method( + #deleteAccount, + [], + {#userId: userId}, + ), + returnValue: _i4.Future.value(false), + ) as _i4.Future); +} diff --git a/test/providers/Auth/auth_provider_test.dart b/test/providers/Auth/auth_provider_test.dart new file mode 100644 index 00000000..a848dd39 --- /dev/null +++ b/test/providers/Auth/auth_provider_test.dart @@ -0,0 +1,165 @@ +import 'package:either_dart/src/either.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:get_it/get_it.dart'; +import 'package:mockito/annotations.dart'; +import 'package:mockito/mockito.dart'; +import 'package:flutter/material.dart'; +import 'package:ottaa_project_flutter/application/notifiers/auth_notifier.dart'; +import 'package:ottaa_project_flutter/application/notifiers/loading_notifier.dart'; + +import 'package:ottaa_project_flutter/application/providers/auth_provider.dart'; +import 'package:ottaa_project_flutter/application/providers/user_provider.dart'; +import 'package:ottaa_project_flutter/application/service/about_service.dart'; +import 'package:ottaa_project_flutter/application/service/auth_service.dart'; +import 'package:ottaa_project_flutter/core/enums/sign_in_types.dart'; +import 'package:ottaa_project_flutter/core/abstracts/user_model.dart'; +import 'package:ottaa_project_flutter/core/models/assets_image.dart'; +import 'package:ottaa_project_flutter/core/models/base_settings_model.dart'; +import 'package:ottaa_project_flutter/core/models/base_user_model.dart'; +import 'package:ottaa_project_flutter/core/models/language_setting.dart'; +import 'package:ottaa_project_flutter/core/models/user_data_model.dart'; +import 'package:ottaa_project_flutter/core/repositories/about_repository.dart'; +import 'package:ottaa_project_flutter/core/repositories/auth_repository.dart'; +import 'package:ottaa_project_flutter/core/repositories/local_database_repository.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; + +import 'auth_provider_test.mocks.dart'; + +class Listener extends Mock { + void call(dynamic? previous, dynamic value); +} + +@GenerateMocks([AuthProvider, LoadingNotifier, AuthService, AboutService, LocalDatabaseRepository, AuthNotifier, UserNotifier]) +void main() { + late AuthProvider cAuthProvider; + late MockAuthProvider mockAuthProvider; + late MockLoadingNotifier mockLoadingNotifier; + late MockAuthService mockAuthService; + late MockAboutService mockAboutService; + late MockLocalDatabaseRepository mockLocalDatabaseRepository; + late MockAuthNotifier mockAuthNotifier; + late UserModel fakeUser; + late MockUserNotifier mockUserNotifier; + + setUp(() { + fakeUser = BaseUserModel( + id: "0", + settings: BaseSettingsModel( + data: UserData( + avatar: AssetsImage(asset: "test", network: "https://test.com"), + birthDate: DateTime(0), + genderPref: "n/a", + lastConnection: DateTime(0), + name: "John", + lastName: "Doe", + ), + language: LanguageSetting.empty(), + ), + email: "test@mail.com", + ); + mockAuthProvider = MockAuthProvider(); + mockLoadingNotifier = MockLoadingNotifier(); + mockAuthService = MockAuthService(); + mockAboutService = MockAboutService(); + mockLocalDatabaseRepository = MockLocalDatabaseRepository(); + mockAuthNotifier = MockAuthNotifier(); + mockUserNotifier = MockUserNotifier(); + cAuthProvider = AuthProvider(mockLoadingNotifier, mockAuthService, mockAboutService, mockLocalDatabaseRepository, mockAuthNotifier, mockUserNotifier); + }); + + test("should return auth provider", () { + GetIt.I.registerSingleton(mockAuthService); + GetIt.I.registerSingleton(mockAboutService); + GetIt.I.registerSingleton(mockLocalDatabaseRepository); + + final container = ProviderContainer(overrides: [ + loadingProvider.overrideWith((ref) => mockLoadingNotifier), + authNotifier.overrideWith((ref) => mockAuthNotifier), + userProvider.overrideWith((ref) => mockUserNotifier), + ]); + + addTearDown(container.dispose); + + final pumpProvider = container.read(authProvider); + + expect(pumpProvider, isA()); + expect(authProvider, isA>()); + }); + + group('auth Provider testing', () { + test('sign in', () async { + // when(mockAuthService.runToGetDataFromOtherPlatform(email: fakeUser.email, id: fakeUser.id)).thenAnswer((realInvocation) async => fakeUser.email); + when(mockAuthService.signIn(SignInType.email)).thenAnswer((realInvocation) async => Right(fakeUser)); + when(mockLocalDatabaseRepository.setUser(fakeUser)).thenAnswer((realInvocation) async => {}); + when(mockAboutService.getUserInformation()).thenAnswer((realInvocation) async => Right(fakeUser)); + when(mockAuthNotifier.setSignedIn()).thenAnswer((realInvocation) { + mockAuthNotifier.state = true; + }); + when(mockLoadingNotifier.showLoading()).thenAnswer((realInvocation) { + mockLoadingNotifier.state = true; + }); + + when(mockLoadingNotifier.hideLoading()).thenAnswer((realInvocation) { + mockLoadingNotifier.state = false; + }); + + final result = await cAuthProvider.signIn(SignInType.email); + + expect(result.right, isA()); + + verify(mockAuthService.signIn(SignInType.email)).called(1); + verify(mockLocalDatabaseRepository.setUser(fakeUser)).called(1); + verify(mockAboutService.getUserInformation()).called(1); + verify(mockAuthNotifier.setSignedIn()).called(1); + verify(mockLoadingNotifier.showLoading()).called(1); + verify(mockLoadingNotifier.hideLoading()).called(1); + }); + + test('sign in should thrown an exception', () async { + // when(mockAuthService.runToGetDataFromOtherPlatform(email: fakeUser.email, id: fakeUser.id)).thenAnswer((realInvocation) async => fakeUser.email); + when(mockAuthService.signIn(SignInType.email)).thenAnswer((realInvocation) async => Left("No user")); + + when(mockLoadingNotifier.showLoading()).thenAnswer((realInvocation) { + mockLoadingNotifier.state = true; + }); + + when(mockLoadingNotifier.hideLoading()).thenAnswer((realInvocation) { + mockLoadingNotifier.state = false; + }); + + final result = await cAuthProvider.signIn(SignInType.email); + + expect(result.left, isA()); + + verify(mockAuthService.signIn(SignInType.email)).called(1); + }); + + test('log out', () async { + when(mockAuthService.signIn(SignInType.email)).thenAnswer((realInvocation) async => Right(fakeUser)); + when(mockLocalDatabaseRepository.setUser(fakeUser)).thenAnswer((realInvocation) async => {}); + when(mockAboutService.getUserInformation()).thenAnswer((realInvocation) async => Right(fakeUser)); + when(mockAuthNotifier.setSignedIn()).thenAnswer((realInvocation) { + mockAuthNotifier.state = true; + }); + when(mockLoadingNotifier.showLoading()).thenAnswer((realInvocation) { + mockLoadingNotifier.state = true; + }); + + when(mockAuthNotifier.setSignedOut()).thenAnswer((realInvocation) { + mockAuthNotifier.state = false; + }); + + await cAuthProvider.logout(); + + expect(false, false); + }); + }); + + test("should return user if logged in", () async { + when(mockAuthService.isLoggedIn()).thenAnswer((realInvocation) async { + return true; + }); + + expect(await cAuthProvider.isUserLoggedIn(), true); + }); +} diff --git a/test/providers/Auth/auth_provider_test.mocks.dart b/test/providers/Auth/auth_provider_test.mocks.dart new file mode 100644 index 00000000..faca34d8 --- /dev/null +++ b/test/providers/Auth/auth_provider_test.mocks.dart @@ -0,0 +1,936 @@ +// Mocks generated by Mockito 5.4.0 from annotations +// in ottaa_project_flutter/test/providers/Auth/auth_provider_test.dart. +// Do not manually edit this file. + +// ignore_for_file: no_leading_underscores_for_library_prefixes +import 'dart:async' as _i6; +import 'dart:ui' as _i9; + +import 'package:either_dart/either.dart' as _i3; +import 'package:flutter_riverpod/flutter_riverpod.dart' as _i11; +import 'package:mockito/mockito.dart' as _i1; +import 'package:ottaa_project_flutter/application/notifiers/auth_notifier.dart' + as _i2; +import 'package:ottaa_project_flutter/application/notifiers/loading_notifier.dart' + as _i10; +import 'package:ottaa_project_flutter/application/providers/auth_provider.dart' + as _i5; +import 'package:ottaa_project_flutter/application/providers/user_provider.dart' + as _i19; +import 'package:ottaa_project_flutter/application/service/about_service.dart' + as _i14; +import 'package:ottaa_project_flutter/application/service/auth_service.dart' + as _i13; +import 'package:ottaa_project_flutter/core/abstracts/user_model.dart' as _i7; +import 'package:ottaa_project_flutter/core/enums/sign_in_types.dart' as _i8; +import 'package:ottaa_project_flutter/core/enums/user_payment.dart' as _i15; +import 'package:ottaa_project_flutter/core/enums/user_types.dart' as _i17; +import 'package:ottaa_project_flutter/core/models/assets_image.dart' as _i16; +import 'package:ottaa_project_flutter/core/repositories/local_database_repository.dart' + as _i18; +import 'package:sign_in_with_apple/sign_in_with_apple.dart' as _i4; +import 'package:state_notifier/state_notifier.dart' as _i12; + +// ignore_for_file: type=lint +// ignore_for_file: avoid_redundant_argument_values +// ignore_for_file: avoid_setters_without_getters +// ignore_for_file: comment_references +// ignore_for_file: implementation_imports +// ignore_for_file: invalid_use_of_visible_for_testing_member +// ignore_for_file: prefer_const_constructors +// ignore_for_file: unnecessary_parenthesis +// ignore_for_file: camel_case_types +// ignore_for_file: subtype_of_sealed_class + +class _FakeAuthNotifier_0 extends _i1.SmartFake implements _i2.AuthNotifier { + _FakeAuthNotifier_0( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeEither_1 extends _i1.SmartFake implements _i3.Either { + _FakeEither_1( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeAuthorizationCredentialAppleID_2 extends _i1.SmartFake + implements _i4.AuthorizationCredentialAppleID { + _FakeAuthorizationCredentialAppleID_2( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +/// A class which mocks [AuthProvider]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockAuthProvider extends _i1.Mock implements _i5.AuthProvider { + MockAuthProvider() { + _i1.throwOnMissingStub(this); + } + + @override + _i2.AuthNotifier get authData => (super.noSuchMethod( + Invocation.getter(#authData), + returnValue: _FakeAuthNotifier_0( + this, + Invocation.getter(#authData), + ), + ) as _i2.AuthNotifier); + @override + bool get hasListeners => (super.noSuchMethod( + Invocation.getter(#hasListeners), + returnValue: false, + ) as bool); + @override + _i6.Future isUserLoggedIn() => (super.noSuchMethod( + Invocation.method( + #isUserLoggedIn, + [], + ), + returnValue: _i6.Future.value(false), + ) as _i6.Future); + @override + _i6.Future logout() => (super.noSuchMethod( + Invocation.method( + #logout, + [], + ), + returnValue: _i6.Future.value(), + returnValueForMissingStub: _i6.Future.value(), + ) as _i6.Future); + @override + _i6.Future deleteAccount() => (super.noSuchMethod( + Invocation.method( + #deleteAccount, + [], + ), + returnValue: _i6.Future.value(false), + ) as _i6.Future); + @override + _i6.Future<_i3.Either> signIn( + _i8.SignInType? type, [ + String? email, + String? password, + ]) => + (super.noSuchMethod( + Invocation.method( + #signIn, + [ + type, + email, + password, + ], + ), + returnValue: _i6.Future<_i3.Either>.value( + _FakeEither_1( + this, + Invocation.method( + #signIn, + [ + type, + email, + password, + ], + ), + )), + ) as _i6.Future<_i3.Either>); + @override + void addListener(_i9.VoidCallback? listener) => super.noSuchMethod( + Invocation.method( + #addListener, + [listener], + ), + returnValueForMissingStub: null, + ); + @override + void removeListener(_i9.VoidCallback? listener) => super.noSuchMethod( + Invocation.method( + #removeListener, + [listener], + ), + returnValueForMissingStub: null, + ); + @override + void dispose() => super.noSuchMethod( + Invocation.method( + #dispose, + [], + ), + returnValueForMissingStub: null, + ); + @override + void notifyListeners() => super.noSuchMethod( + Invocation.method( + #notifyListeners, + [], + ), + returnValueForMissingStub: null, + ); +} + +/// A class which mocks [LoadingNotifier]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockLoadingNotifier extends _i1.Mock implements _i10.LoadingNotifier { + MockLoadingNotifier() { + _i1.throwOnMissingStub(this); + } + + @override + set onError(_i11.ErrorListener? _onError) => super.noSuchMethod( + Invocation.setter( + #onError, + _onError, + ), + returnValueForMissingStub: null, + ); + @override + bool get mounted => (super.noSuchMethod( + Invocation.getter(#mounted), + returnValue: false, + ) as bool); + @override + _i6.Stream get stream => (super.noSuchMethod( + Invocation.getter(#stream), + returnValue: _i6.Stream.empty(), + ) as _i6.Stream); + @override + bool get state => (super.noSuchMethod( + Invocation.getter(#state), + returnValue: false, + ) as bool); + @override + set state(bool? value) => super.noSuchMethod( + Invocation.setter( + #state, + value, + ), + returnValueForMissingStub: null, + ); + @override + bool get debugState => (super.noSuchMethod( + Invocation.getter(#debugState), + returnValue: false, + ) as bool); + @override + bool get hasListeners => (super.noSuchMethod( + Invocation.getter(#hasListeners), + returnValue: false, + ) as bool); + @override + void showLoading() => super.noSuchMethod( + Invocation.method( + #showLoading, + [], + ), + returnValueForMissingStub: null, + ); + @override + void hideLoading() => super.noSuchMethod( + Invocation.method( + #hideLoading, + [], + ), + returnValueForMissingStub: null, + ); + @override + void toggleLoading() => super.noSuchMethod( + Invocation.method( + #toggleLoading, + [], + ), + returnValueForMissingStub: null, + ); + @override + bool getState() => (super.noSuchMethod( + Invocation.method( + #getState, + [], + ), + returnValue: false, + ) as bool); + @override + bool updateShouldNotify( + bool? old, + bool? current, + ) => + (super.noSuchMethod( + Invocation.method( + #updateShouldNotify, + [ + old, + current, + ], + ), + returnValue: false, + ) as bool); + @override + _i11.RemoveListener addListener( + _i12.Listener? listener, { + bool? fireImmediately = true, + }) => + (super.noSuchMethod( + Invocation.method( + #addListener, + [listener], + {#fireImmediately: fireImmediately}, + ), + returnValue: () {}, + ) as _i11.RemoveListener); + @override + void dispose() => super.noSuchMethod( + Invocation.method( + #dispose, + [], + ), + returnValueForMissingStub: null, + ); +} + +/// A class which mocks [AuthService]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockAuthService extends _i1.Mock implements _i13.AuthService { + MockAuthService() { + _i1.throwOnMissingStub(this); + } + + @override + String get lastName => (super.noSuchMethod( + Invocation.getter(#lastName), + returnValue: '', + ) as String); + @override + set lastName(String? _lastName) => super.noSuchMethod( + Invocation.setter( + #lastName, + _lastName, + ), + returnValueForMissingStub: null, + ); + @override + String get name => (super.noSuchMethod( + Invocation.getter(#name), + returnValue: '', + ) as String); + @override + set name(String? _name) => super.noSuchMethod( + Invocation.setter( + #name, + _name, + ), + returnValueForMissingStub: null, + ); + @override + _i4.AuthorizationCredentialAppleID get result => (super.noSuchMethod( + Invocation.getter(#result), + returnValue: _FakeAuthorizationCredentialAppleID_2( + this, + Invocation.getter(#result), + ), + ) as _i4.AuthorizationCredentialAppleID); + @override + set result(_i4.AuthorizationCredentialAppleID? _result) => super.noSuchMethod( + Invocation.setter( + #result, + _result, + ), + returnValueForMissingStub: null, + ); + @override + bool get isSignInApple => (super.noSuchMethod( + Invocation.getter(#isSignInApple), + returnValue: false, + ) as bool); + @override + set isSignInApple(bool? _isSignInApple) => super.noSuchMethod( + Invocation.setter( + #isSignInApple, + _isSignInApple, + ), + returnValueForMissingStub: null, + ); + @override + bool get isLogged => (super.noSuchMethod( + Invocation.getter(#isLogged), + returnValue: false, + ) as bool); + @override + _i6.Future<_i3.Either> getCurrentUser() => + (super.noSuchMethod( + Invocation.method( + #getCurrentUser, + [], + ), + returnValue: _i6.Future<_i3.Either>.value( + _FakeEither_1( + this, + Invocation.method( + #getCurrentUser, + [], + ), + )), + ) as _i6.Future<_i3.Either>); + @override + _i6.Future isLoggedIn() => (super.noSuchMethod( + Invocation.method( + #isLoggedIn, + [], + ), + returnValue: _i6.Future.value(false), + ) as _i6.Future); + @override + _i6.Future logout() => (super.noSuchMethod( + Invocation.method( + #logout, + [], + ), + returnValue: _i6.Future.value(), + returnValueForMissingStub: _i6.Future.value(), + ) as _i6.Future); + @override + _i6.Future<_i7.UserModel?> buildUserModel(dynamic user) => + (super.noSuchMethod( + Invocation.method( + #buildUserModel, + [user], + ), + returnValue: _i6.Future<_i7.UserModel?>.value(), + ) as _i6.Future<_i7.UserModel?>); + @override + _i6.Future<_i3.Either> signIn( + _i8.SignInType? type, [ + String? email, + String? password, + ]) => + (super.noSuchMethod( + Invocation.method( + #signIn, + [ + type, + email, + password, + ], + ), + returnValue: _i6.Future<_i3.Either>.value( + _FakeEither_1( + this, + Invocation.method( + #signIn, + [ + type, + email, + password, + ], + ), + )), + ) as _i6.Future<_i3.Either>); + @override + _i6.Future<_i3.Either> signUp() => (super.noSuchMethod( + Invocation.method( + #signUp, + [], + ), + returnValue: _i6.Future<_i3.Either>.value( + _FakeEither_1( + this, + Invocation.method( + #signUp, + [], + ), + )), + ) as _i6.Future<_i3.Either>); + @override + _i6.Future getDeviceId() => (super.noSuchMethod( + Invocation.method( + #getDeviceId, + [], + ), + returnValue: _i6.Future.value(''), + ) as _i6.Future); + @override + _i6.Future deleteAccount({required String? userId}) => + (super.noSuchMethod( + Invocation.method( + #deleteAccount, + [], + {#userId: userId}, + ), + returnValue: _i6.Future.value(false), + ) as _i6.Future); +} + +/// A class which mocks [AboutService]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockAboutService extends _i1.Mock implements _i14.AboutService { + MockAboutService() { + _i1.throwOnMissingStub(this); + } + + @override + _i6.Future getAppVersion() => (super.noSuchMethod( + Invocation.method( + #getAppVersion, + [], + ), + returnValue: _i6.Future.value(''), + ) as _i6.Future); + @override + _i6.Future getAvailableAppVersion() => (super.noSuchMethod( + Invocation.method( + #getAvailableAppVersion, + [], + ), + returnValue: _i6.Future.value(''), + ) as _i6.Future); + @override + _i6.Future getDeviceName() => (super.noSuchMethod( + Invocation.method( + #getDeviceName, + [], + ), + returnValue: _i6.Future.value(''), + ) as _i6.Future); + @override + _i6.Future getEmail() => (super.noSuchMethod( + Invocation.method( + #getEmail, + [], + ), + returnValue: _i6.Future.value(''), + ) as _i6.Future); + @override + _i6.Future<_i15.UserPayment> getUserType() => (super.noSuchMethod( + Invocation.method( + #getUserType, + [], + ), + returnValue: _i6.Future<_i15.UserPayment>.value(_i15.UserPayment.free), + ) as _i6.Future<_i15.UserPayment>); + @override + _i6.Future sendSupportEmail() => (super.noSuchMethod( + Invocation.method( + #sendSupportEmail, + [], + ), + returnValue: _i6.Future.value(), + returnValueForMissingStub: _i6.Future.value(), + ) as _i6.Future); + @override + _i6.Future getProfilePicture() => (super.noSuchMethod( + Invocation.method( + #getProfilePicture, + [], + ), + returnValue: _i6.Future.value(''), + ) as _i6.Future); + @override + _i6.Future uploadProfilePicture(_i16.AssetsImage? image) => + (super.noSuchMethod( + Invocation.method( + #uploadProfilePicture, + [image], + ), + returnValue: _i6.Future.value(), + returnValueForMissingStub: _i6.Future.value(), + ) as _i6.Future); + @override + _i6.Future<_i3.Either> getUserInformation() => + (super.noSuchMethod( + Invocation.method( + #getUserInformation, + [], + ), + returnValue: _i6.Future<_i3.Either>.value( + _FakeEither_1( + this, + Invocation.method( + #getUserInformation, + [], + ), + )), + ) as _i6.Future<_i3.Either>); + @override + _i6.Future uploadUserInformation() => (super.noSuchMethod( + Invocation.method( + #uploadUserInformation, + [], + ), + returnValue: _i6.Future.value(), + returnValueForMissingStub: _i6.Future.value(), + ) as _i6.Future); + @override + _i6.Future isCurrentUserAvatarExist() => (super.noSuchMethod( + Invocation.method( + #isCurrentUserAvatarExist, + [], + ), + returnValue: _i6.Future.value(false), + ) as _i6.Future); + @override + _i6.Future isFirstTime() => (super.noSuchMethod( + Invocation.method( + #isFirstTime, + [], + ), + returnValue: _i6.Future.value(false), + ) as _i6.Future); + @override + _i6.Future updateUserType({ + required String? id, + required _i17.UserType? userType, + }) => + (super.noSuchMethod( + Invocation.method( + #updateUserType, + [], + { + #id: id, + #userType: userType, + }, + ), + returnValue: _i6.Future.value(), + returnValueForMissingStub: _i6.Future.value(), + ) as _i6.Future); + @override + _i6.Future updateUserLastConnectionTime({ + required String? userId, + required int? time, + }) => + (super.noSuchMethod( + Invocation.method( + #updateUserLastConnectionTime, + [], + { + #userId: userId, + #time: time, + }, + ), + returnValue: _i6.Future.value(), + returnValueForMissingStub: _i6.Future.value(), + ) as _i6.Future); +} + +/// A class which mocks [LocalDatabaseRepository]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockLocalDatabaseRepository extends _i1.Mock + implements _i18.LocalDatabaseRepository { + MockLocalDatabaseRepository() { + _i1.throwOnMissingStub(this); + } + + @override + set user(_i7.UserModel? user) => super.noSuchMethod( + Invocation.setter( + #user, + user, + ), + returnValueForMissingStub: null, + ); + @override + _i6.Future init() => (super.noSuchMethod( + Invocation.method( + #init, + [], + ), + returnValue: _i6.Future.value(), + returnValueForMissingStub: _i6.Future.value(), + ) as _i6.Future); + @override + _i6.Future close() => (super.noSuchMethod( + Invocation.method( + #close, + [], + ), + returnValue: _i6.Future.value(), + returnValueForMissingStub: _i6.Future.value(), + ) as _i6.Future); + @override + _i6.Future setUser(_i7.UserModel? user) => (super.noSuchMethod( + Invocation.method( + #setUser, + [user], + ), + returnValue: _i6.Future.value(), + returnValueForMissingStub: _i6.Future.value(), + ) as _i6.Future); + @override + _i6.Future<_i7.UserModel?> getUser() => (super.noSuchMethod( + Invocation.method( + #getUser, + [], + ), + returnValue: _i6.Future<_i7.UserModel?>.value(), + ) as _i6.Future<_i7.UserModel?>); + @override + _i6.Future deleteUser() => (super.noSuchMethod( + Invocation.method( + #deleteUser, + [], + ), + returnValue: _i6.Future.value(), + returnValueForMissingStub: _i6.Future.value(), + ) as _i6.Future); + @override + _i6.Future getIntro() => (super.noSuchMethod( + Invocation.method( + #getIntro, + [], + ), + returnValue: _i6.Future.value(false), + ) as _i6.Future); + @override + _i6.Future setIntro([bool? value]) => (super.noSuchMethod( + Invocation.method( + #setIntro, + [value], + ), + returnValue: _i6.Future.value(), + returnValueForMissingStub: _i6.Future.value(), + ) as _i6.Future); + @override + _i6.Future getVoice() => (super.noSuchMethod( + Invocation.method( + #getVoice, + [], + ), + returnValue: _i6.Future.value(''), + ) as _i6.Future); + @override + _i6.Future getLongClick() => (super.noSuchMethod( + Invocation.method( + #getLongClick, + [], + ), + returnValue: _i6.Future.value(false), + ) as _i6.Future); + @override + _i6.Future setLongClick({required bool? isLongClick}) => + (super.noSuchMethod( + Invocation.method( + #setLongClick, + [], + {#isLongClick: isLongClick}, + ), + returnValue: _i6.Future.value(), + returnValueForMissingStub: _i6.Future.value(), + ) as _i6.Future); + @override + _i6.Future setVoice({required String? name}) => (super.noSuchMethod( + Invocation.method( + #setVoice, + [], + {#name: name}, + ), + returnValue: _i6.Future.value(), + returnValueForMissingStub: _i6.Future.value(), + ) as _i6.Future); + @override + _i6.Future setAppleUserDara({required Map? data}) => + (super.noSuchMethod( + Invocation.method( + #setAppleUserDara, + [], + {#data: data}, + ), + returnValue: _i6.Future.value(), + returnValueForMissingStub: _i6.Future.value(), + ) as _i6.Future); + @override + _i6.Future> getAppleUserData() => (super.noSuchMethod( + Invocation.method( + #getAppleUserData, + [], + ), + returnValue: _i6.Future>.value({}), + ) as _i6.Future>); +} + +/// A class which mocks [AuthNotifier]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockAuthNotifier extends _i1.Mock implements _i2.AuthNotifier { + MockAuthNotifier() { + _i1.throwOnMissingStub(this); + } + + @override + set onError(_i11.ErrorListener? _onError) => super.noSuchMethod( + Invocation.setter( + #onError, + _onError, + ), + returnValueForMissingStub: null, + ); + @override + bool get mounted => (super.noSuchMethod( + Invocation.getter(#mounted), + returnValue: false, + ) as bool); + @override + _i6.Stream get stream => (super.noSuchMethod( + Invocation.getter(#stream), + returnValue: _i6.Stream.empty(), + ) as _i6.Stream); + @override + bool get state => (super.noSuchMethod( + Invocation.getter(#state), + returnValue: false, + ) as bool); + @override + set state(bool? value) => super.noSuchMethod( + Invocation.setter( + #state, + value, + ), + returnValueForMissingStub: null, + ); + @override + bool get debugState => (super.noSuchMethod( + Invocation.getter(#debugState), + returnValue: false, + ) as bool); + @override + bool get hasListeners => (super.noSuchMethod( + Invocation.getter(#hasListeners), + returnValue: false, + ) as bool); + @override + void setSignedIn() => super.noSuchMethod( + Invocation.method( + #setSignedIn, + [], + ), + returnValueForMissingStub: null, + ); + @override + void setSignedOut() => super.noSuchMethod( + Invocation.method( + #setSignedOut, + [], + ), + returnValueForMissingStub: null, + ); + @override + bool updateShouldNotify( + bool? old, + bool? current, + ) => + (super.noSuchMethod( + Invocation.method( + #updateShouldNotify, + [ + old, + current, + ], + ), + returnValue: false, + ) as bool); + @override + _i11.RemoveListener addListener( + _i12.Listener? listener, { + bool? fireImmediately = true, + }) => + (super.noSuchMethod( + Invocation.method( + #addListener, + [listener], + {#fireImmediately: fireImmediately}, + ), + returnValue: () {}, + ) as _i11.RemoveListener); + @override + void dispose() => super.noSuchMethod( + Invocation.method( + #dispose, + [], + ), + returnValueForMissingStub: null, + ); +} + +/// A class which mocks [UserNotifier]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockUserNotifier extends _i1.Mock implements _i19.UserNotifier { + MockUserNotifier() { + _i1.throwOnMissingStub(this); + } + + @override + set user(_i7.UserModel? userModel) => super.noSuchMethod( + Invocation.setter( + #user, + userModel, + ), + returnValueForMissingStub: null, + ); + @override + bool get hasListeners => (super.noSuchMethod( + Invocation.getter(#hasListeners), + returnValue: false, + ) as bool); + @override + void setUser(_i7.UserModel? userModel) => super.noSuchMethod( + Invocation.method( + #setUser, + [userModel], + ), + returnValueForMissingStub: null, + ); + @override + void clearUser() => super.noSuchMethod( + Invocation.method( + #clearUser, + [], + ), + returnValueForMissingStub: null, + ); + @override + void addListener(_i9.VoidCallback? listener) => super.noSuchMethod( + Invocation.method( + #addListener, + [listener], + ), + returnValueForMissingStub: null, + ); + @override + void removeListener(_i9.VoidCallback? listener) => super.noSuchMethod( + Invocation.method( + #removeListener, + [listener], + ), + returnValueForMissingStub: null, + ); + @override + void dispose() => super.noSuchMethod( + Invocation.method( + #dispose, + [], + ), + returnValueForMissingStub: null, + ); + @override + void notifyListeners() => super.noSuchMethod( + Invocation.method( + #notifyListeners, + [], + ), + returnValueForMissingStub: null, + ); +} diff --git a/test/providers/ChatGPT/chatgpt_provider_test.dart b/test/providers/ChatGPT/chatgpt_provider_test.dart new file mode 100644 index 00000000..7d923155 --- /dev/null +++ b/test/providers/ChatGPT/chatgpt_provider_test.dart @@ -0,0 +1,149 @@ +import 'package:either_dart/either.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:get_it/get_it.dart'; +import 'package:mockito/annotations.dart'; +import 'package:mockito/mockito.dart'; +import 'package:ottaa_project_flutter/application/common/i18n.dart'; +import 'package:ottaa_project_flutter/application/notifiers/patient_notifier.dart'; + +import 'package:ottaa_project_flutter/application/providers/chatgpt_provider.dart'; +import 'package:ottaa_project_flutter/application/providers/user_provider.dart'; +import 'package:ottaa_project_flutter/core/abstracts/user_model.dart'; +import 'package:ottaa_project_flutter/core/abstracts/user_settings.dart'; +import 'package:ottaa_project_flutter/core/enums/user_types.dart'; +import 'package:ottaa_project_flutter/core/models/accessibility_setting.dart'; +import 'package:ottaa_project_flutter/core/models/assets_image.dart'; +import 'package:ottaa_project_flutter/core/models/base_settings_model.dart'; +import 'package:ottaa_project_flutter/core/models/base_user_model.dart'; +import 'package:ottaa_project_flutter/core/models/language_setting.dart'; +import 'package:ottaa_project_flutter/core/models/layout_setting.dart'; +import 'package:ottaa_project_flutter/core/models/patient_user_model.dart'; +import 'package:ottaa_project_flutter/core/models/payment_model.dart'; +import 'package:ottaa_project_flutter/core/models/picto_model.dart'; +import 'package:ottaa_project_flutter/core/models/tts_setting.dart'; +import 'package:ottaa_project_flutter/core/models/user_data_model.dart'; +import 'package:ottaa_project_flutter/core/repositories/chatgpt_repository.dart'; + +import 'chatgpt_provider_test.mocks.dart'; + +@GenerateNiceMocks([ + MockSpec(), + MockSpec(), + MockSpec(), + MockSpec(), +]) +Future main() async { + late MockUserNotifier mockUserNotifier; + late MockPatientNotifier mockPatientNotifier; + late MockChatGPTRepository mockChatGPTRepository; + + late ChatGPTNotifier chatGPTNotifier; + + late PatientUserModel fakeUser; + late List fakePictos; + + setUpAll(() { + MockI18N mockI18N = MockI18N(); + + GetIt.I.registerSingleton(mockI18N); + }); + + setUp(() { + mockUserNotifier = MockUserNotifier(); + mockPatientNotifier = MockPatientNotifier(); + mockChatGPTRepository = MockChatGPTRepository(); + fakeUser = PatientUserModel( + id: "0", + settings: PatientSettings( + accessibility: AccessibilitySetting.empty(), + layout: LayoutSetting.empty(), + payment: Payment.none(), + tts: TTSSetting.empty(), + data: UserData( + avatar: AssetsImage(asset: "test", network: "https://test.com"), + birthDate: DateTime(2017, 9, 7, 17, 30), + genderPref: "n/a", + lastConnection: DateTime(0), + name: "John", + lastName: "Doe", + ), + language: LanguageSetting.empty(), + ), + email: "test@mail.com", + type: UserType.caregiver, + groups: {}, + phrases: {}, + pictos: {}, + ); + mockPatientNotifier.state = fakeUser; + mockUserNotifier.setUser(fakeUser); + fakePictos = [ + Picto(id: 'test1', type: 00, resource: AssetsImage(asset: 'fakeAssets', network: 'fakeNetwork')), + Picto(id: 'test2', type: 00, resource: AssetsImage(asset: 'fakeAssets', network: 'fakeNetwork')), + Picto(id: 'test3', type: 00, resource: AssetsImage(asset: 'fakeAssets', network: 'fakeNetwork')), + ]; + chatGPTNotifier = ChatGPTNotifier( + mockUserNotifier, + mockPatientNotifier, + mockChatGPTRepository, + ); + }); + test("should return chatGPTProvider", () { + GetIt.I.registerSingleton(mockChatGPTRepository); + + final container = ProviderContainer( + overrides: [ + userProvider.overrideWith((ref) => mockUserNotifier), + ], + ); + + final refGptProvider = container.read(chatGPTProvider); + + expect(refGptProvider, isA()); + expect(chatGPTProvider, isA>()); + }); + group("generate phrase", () { + test('should return a sentence', () async { + when(mockUserNotifier.user).thenReturn(fakeUser); + when(mockChatGPTRepository.getCompletion( + age: anyNamed('age'), + gender: anyNamed('gender'), + pictograms: anyNamed('pictograms'), + language: anyNamed('language'), + maxTokens: anyNamed('maxTokens'), + )).thenAnswer((realInvocation) async => const Right('This is a sentence')); + + final response = await chatGPTNotifier.generatePhrase(fakePictos); + print(response); + expect(response, 'This is a sentence'); + }); + + test('should return left error', () async { + when(mockUserNotifier.user).thenReturn(fakeUser); + when(mockChatGPTRepository.getCompletion( + age: anyNamed('age'), + gender: anyNamed('gender'), + pictograms: anyNamed('pictograms'), + language: anyNamed('language'), + maxTokens: anyNamed('maxTokens'), + )).thenAnswer((realInvocation) async => const Left("OpenAI Exception")); + + final response = await chatGPTNotifier.generatePhrase(fakePictos); + print(response); + expect(response, 'OpenAI Exception'); + }); + }); + + test("should notify listeners", () { + int value = 0; + + chatGPTNotifier.addListener(() { + value++; + }); + + chatGPTNotifier.notify(); + + expect(value, 1); + }); +} diff --git a/test/providers/ChatGPT/chatgpt_provider_test.mocks.dart b/test/providers/ChatGPT/chatgpt_provider_test.mocks.dart new file mode 100644 index 00000000..54361a96 --- /dev/null +++ b/test/providers/ChatGPT/chatgpt_provider_test.mocks.dart @@ -0,0 +1,466 @@ +// Mocks generated by Mockito 5.4.0 from annotations +// in ottaa_project_flutter/test/providers/ChatGPT/chatgpt_provider_test.dart. +// Do not manually edit this file. + +// ignore_for_file: no_leading_underscores_for_library_prefixes +import 'dart:async' as _i8; +import 'dart:ui' as _i4; + +import 'package:either_dart/either.dart' as _i3; +import 'package:flutter_riverpod/flutter_riverpod.dart' as _i7; +import 'package:mockito/mockito.dart' as _i1; +import 'package:ottaa_project_flutter/application/common/i18n.dart' as _i5; +import 'package:ottaa_project_flutter/application/language/translation_tree.dart' + as _i13; +import 'package:ottaa_project_flutter/application/notifiers/patient_notifier.dart' + as _i6; +import 'package:ottaa_project_flutter/application/providers/user_provider.dart' + as _i10; +import 'package:ottaa_project_flutter/core/abstracts/user_model.dart' as _i11; +import 'package:ottaa_project_flutter/core/models/patient_user_model.dart' + as _i2; +import 'package:ottaa_project_flutter/core/repositories/chatgpt_repository.dart' + as _i12; +import 'package:state_notifier/state_notifier.dart' as _i9; + +// ignore_for_file: type=lint +// ignore_for_file: avoid_redundant_argument_values +// ignore_for_file: avoid_setters_without_getters +// ignore_for_file: comment_references +// ignore_for_file: implementation_imports +// ignore_for_file: invalid_use_of_visible_for_testing_member +// ignore_for_file: prefer_const_constructors +// ignore_for_file: unnecessary_parenthesis +// ignore_for_file: camel_case_types +// ignore_for_file: subtype_of_sealed_class + +class _FakePatientUserModel_0 extends _i1.SmartFake + implements _i2.PatientUserModel { + _FakePatientUserModel_0( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeEither_1 extends _i1.SmartFake implements _i3.Either { + _FakeEither_1( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeLocale_2 extends _i1.SmartFake implements _i4.Locale { + _FakeLocale_2( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeI18N_3 extends _i1.SmartFake implements _i5.I18N { + _FakeI18N_3( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +/// A class which mocks [PatientNotifier]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockPatientNotifier extends _i1.Mock implements _i6.PatientNotifier { + @override + _i2.PatientUserModel get user => (super.noSuchMethod( + Invocation.getter(#user), + returnValue: _FakePatientUserModel_0( + this, + Invocation.getter(#user), + ), + returnValueForMissingStub: _FakePatientUserModel_0( + this, + Invocation.getter(#user), + ), + ) as _i2.PatientUserModel); + @override + set onError(_i7.ErrorListener? _onError) => super.noSuchMethod( + Invocation.setter( + #onError, + _onError, + ), + returnValueForMissingStub: null, + ); + @override + bool get mounted => (super.noSuchMethod( + Invocation.getter(#mounted), + returnValue: false, + returnValueForMissingStub: false, + ) as bool); + @override + _i8.Stream<_i2.PatientUserModel?> get stream => (super.noSuchMethod( + Invocation.getter(#stream), + returnValue: _i8.Stream<_i2.PatientUserModel?>.empty(), + returnValueForMissingStub: _i8.Stream<_i2.PatientUserModel?>.empty(), + ) as _i8.Stream<_i2.PatientUserModel?>); + @override + set state(_i2.PatientUserModel? value) => super.noSuchMethod( + Invocation.setter( + #state, + value, + ), + returnValueForMissingStub: null, + ); + @override + bool get hasListeners => (super.noSuchMethod( + Invocation.getter(#hasListeners), + returnValue: false, + returnValueForMissingStub: false, + ) as bool); + @override + void setUser(_i2.PatientUserModel? user) => super.noSuchMethod( + Invocation.method( + #setUser, + [user], + ), + returnValueForMissingStub: null, + ); + @override + bool updateShouldNotify( + _i2.PatientUserModel? old, + _i2.PatientUserModel? current, + ) => + (super.noSuchMethod( + Invocation.method( + #updateShouldNotify, + [ + old, + current, + ], + ), + returnValue: false, + returnValueForMissingStub: false, + ) as bool); + @override + _i7.RemoveListener addListener( + _i9.Listener<_i2.PatientUserModel?>? listener, { + bool? fireImmediately = true, + }) => + (super.noSuchMethod( + Invocation.method( + #addListener, + [listener], + {#fireImmediately: fireImmediately}, + ), + returnValue: () {}, + returnValueForMissingStub: () {}, + ) as _i7.RemoveListener); + @override + void dispose() => super.noSuchMethod( + Invocation.method( + #dispose, + [], + ), + returnValueForMissingStub: null, + ); +} + +/// A class which mocks [UserNotifier]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockUserNotifier extends _i1.Mock implements _i10.UserNotifier { + @override + set user(_i11.UserModel? userModel) => super.noSuchMethod( + Invocation.setter( + #user, + userModel, + ), + returnValueForMissingStub: null, + ); + @override + bool get hasListeners => (super.noSuchMethod( + Invocation.getter(#hasListeners), + returnValue: false, + returnValueForMissingStub: false, + ) as bool); + @override + void setUser(_i11.UserModel? userModel) => super.noSuchMethod( + Invocation.method( + #setUser, + [userModel], + ), + returnValueForMissingStub: null, + ); + @override + void clearUser() => super.noSuchMethod( + Invocation.method( + #clearUser, + [], + ), + returnValueForMissingStub: null, + ); + @override + void addListener(_i4.VoidCallback? listener) => super.noSuchMethod( + Invocation.method( + #addListener, + [listener], + ), + returnValueForMissingStub: null, + ); + @override + void removeListener(_i4.VoidCallback? listener) => super.noSuchMethod( + Invocation.method( + #removeListener, + [listener], + ), + returnValueForMissingStub: null, + ); + @override + void dispose() => super.noSuchMethod( + Invocation.method( + #dispose, + [], + ), + returnValueForMissingStub: null, + ); + @override + void notifyListeners() => super.noSuchMethod( + Invocation.method( + #notifyListeners, + [], + ), + returnValueForMissingStub: null, + ); +} + +/// A class which mocks [ChatGPTRepository]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockChatGPTRepository extends _i1.Mock implements _i12.ChatGPTRepository { + @override + _i8.Future<_i3.Either> getCompletion({ + required int? age, + required String? gender, + required String? pictograms, + required String? language, + int? maxTokens = 500, + }) => + (super.noSuchMethod( + Invocation.method( + #getCompletion, + [], + { + #age: age, + #gender: gender, + #pictograms: pictograms, + #language: language, + #maxTokens: maxTokens, + }, + ), + returnValue: _i8.Future<_i3.Either>.value( + _FakeEither_1( + this, + Invocation.method( + #getCompletion, + [], + { + #age: age, + #gender: gender, + #pictograms: pictograms, + #language: language, + #maxTokens: maxTokens, + }, + ), + )), + returnValueForMissingStub: _i8.Future<_i3.Either>.value( + _FakeEither_1( + this, + Invocation.method( + #getCompletion, + [], + { + #age: age, + #gender: gender, + #pictograms: pictograms, + #language: language, + #maxTokens: maxTokens, + }, + ), + )), + ) as _i8.Future<_i3.Either>); + @override + _i8.Future<_i3.Either> getGPTStory({ + required String? prompt, + int? maxTokens = 1000, + }) => + (super.noSuchMethod( + Invocation.method( + #getGPTStory, + [], + { + #prompt: prompt, + #maxTokens: maxTokens, + }, + ), + returnValue: _i8.Future<_i3.Either>.value( + _FakeEither_1( + this, + Invocation.method( + #getGPTStory, + [], + { + #prompt: prompt, + #maxTokens: maxTokens, + }, + ), + )), + returnValueForMissingStub: _i8.Future<_i3.Either>.value( + _FakeEither_1( + this, + Invocation.method( + #getGPTStory, + [], + { + #prompt: prompt, + #maxTokens: maxTokens, + }, + ), + )), + ) as _i8.Future<_i3.Either>); +} + +/// A class which mocks [I18N]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockI18N extends _i1.Mock implements _i5.I18N { + @override + Map get platformLanguages => (super.noSuchMethod( + Invocation.getter(#platformLanguages), + returnValue: {}, + returnValueForMissingStub: {}, + ) as Map); + @override + _i4.Locale get currentLocale => (super.noSuchMethod( + Invocation.getter(#currentLocale), + returnValue: _FakeLocale_2( + this, + Invocation.getter(#currentLocale), + ), + returnValueForMissingStub: _FakeLocale_2( + this, + Invocation.getter(#currentLocale), + ), + ) as _i4.Locale); + @override + set currentLocale(_i4.Locale? _currentLocale) => super.noSuchMethod( + Invocation.setter( + #currentLocale, + _currentLocale, + ), + returnValueForMissingStub: null, + ); + @override + bool get hasListeners => (super.noSuchMethod( + Invocation.getter(#hasListeners), + returnValue: false, + returnValueForMissingStub: false, + ) as bool); + @override + _i8.Future<_i5.I18N> init() => (super.noSuchMethod( + Invocation.method( + #init, + [], + ), + returnValue: _i8.Future<_i5.I18N>.value(_FakeI18N_3( + this, + Invocation.method( + #init, + [], + ), + )), + returnValueForMissingStub: _i8.Future<_i5.I18N>.value(_FakeI18N_3( + this, + Invocation.method( + #init, + [], + ), + )), + ) as _i8.Future<_i5.I18N>); + @override + _i8.Future<_i13.TranslationTree?> loadTranslation(_i4.Locale? locale) => + (super.noSuchMethod( + Invocation.method( + #loadTranslation, + [locale], + ), + returnValue: _i8.Future<_i13.TranslationTree?>.value(), + returnValueForMissingStub: _i8.Future<_i13.TranslationTree?>.value(), + ) as _i8.Future<_i13.TranslationTree?>); + @override + _i8.Future changeLanguage(String? languageCode) => (super.noSuchMethod( + Invocation.method( + #changeLanguage, + [languageCode], + ), + returnValue: _i8.Future.value(), + returnValueForMissingStub: _i8.Future.value(), + ) as _i8.Future); + @override + _i8.Future changeLanguageFromLocale(_i4.Locale? locale) => + (super.noSuchMethod( + Invocation.method( + #changeLanguageFromLocale, + [locale], + ), + returnValue: _i8.Future.value(), + returnValueForMissingStub: _i8.Future.value(), + ) as _i8.Future); + @override + void notify() => super.noSuchMethod( + Invocation.method( + #notify, + [], + ), + returnValueForMissingStub: null, + ); + @override + void addListener(_i4.VoidCallback? listener) => super.noSuchMethod( + Invocation.method( + #addListener, + [listener], + ), + returnValueForMissingStub: null, + ); + @override + void removeListener(_i4.VoidCallback? listener) => super.noSuchMethod( + Invocation.method( + #removeListener, + [listener], + ), + returnValueForMissingStub: null, + ); + @override + void dispose() => super.noSuchMethod( + Invocation.method( + #dispose, + [], + ), + returnValueForMissingStub: null, + ); + @override + void notifyListeners() => super.noSuchMethod( + Invocation.method( + #notifyListeners, + [], + ), + returnValueForMissingStub: null, + ); +} diff --git a/test/providers/Onboarding/onboarding_provider_test.dart b/test/providers/Onboarding/onboarding_provider_test.dart new file mode 100644 index 00000000..926ac00b --- /dev/null +++ b/test/providers/Onboarding/onboarding_provider_test.dart @@ -0,0 +1,66 @@ +import 'package:either_dart/either.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mockito/annotations.dart'; +import 'package:mockito/mockito.dart'; +import 'package:ottaa_project_flutter/application/notifiers/loading_notifier.dart'; +import 'package:ottaa_project_flutter/application/providers/onboarding_provider.dart'; +import 'package:ottaa_project_flutter/core/enums/sign_in_types.dart'; +import 'package:ottaa_project_flutter/core/abstracts/user_model.dart'; +import 'package:ottaa_project_flutter/core/models/assets_image.dart'; +import 'package:ottaa_project_flutter/core/models/base_settings_model.dart'; +import 'package:ottaa_project_flutter/core/models/base_user_model.dart'; +import 'package:ottaa_project_flutter/core/models/language_setting.dart'; +import 'package:ottaa_project_flutter/core/models/user_data_model.dart'; +import 'package:ottaa_project_flutter/core/repositories/about_repository.dart'; +import 'package:ottaa_project_flutter/core/repositories/auth_repository.dart'; +import 'package:ottaa_project_flutter/core/repositories/local_database_repository.dart'; + +import 'onboarding_provider_test.mocks.dart'; + +@GenerateMocks([OnBoardingNotifier, AuthRepository, LoadingNotifier, AboutRepository, LocalDatabaseRepository]) +void main() { + late OnBoardingNotifier onBoardingNotifier; + late MockAuthRepository mockAuthRepository; + late MockLoadingNotifier mockLoadingNotifier; + late MockAboutRepository mockAboutRepository; + late MockLocalDatabaseRepository mockLocalDatabaseRepository; + late MockOnBoardingNotifier mockOnBoardingNotifier; + late UserModel fakeUser; + + setUp(() { + fakeUser = BaseUserModel( + id: "0", + settings: BaseSettingsModel( + data: UserData( + avatar: AssetsImage(asset: "test", network: "https://test.com"), + birthDate: DateTime(0), + genderPref: "n/a", + lastConnection: DateTime(0), + name: "John", + lastName: "Doe", + ), + language: LanguageSetting.empty(), + ), + email: "test@mail.com", + ); + mockAuthRepository = MockAuthRepository(); + mockLoadingNotifier = MockLoadingNotifier(); + mockAboutRepository = MockAboutRepository(); + mockLocalDatabaseRepository = MockLocalDatabaseRepository(); + mockLoadingNotifier = MockLoadingNotifier(); + mockOnBoardingNotifier = MockOnBoardingNotifier(); + onBoardingNotifier = OnBoardingNotifier(); + }); + group('Onboarding Notifier', () { + test('Update User Avatar', () async { + when(mockAuthRepository.signIn(SignInType.email)).thenAnswer((realInvocation) async => Right(fakeUser)); + when(mockAuthRepository.getCurrentUser()).thenAnswer((realInvocation) async => Right(fakeUser)); + // await onBoardingNotifier.updateUserAvatar(); + }); + test('Update User Avatar fail user', () async { + when(mockAuthRepository.signIn(SignInType.email)).thenAnswer((realInvocation) async => Right(fakeUser)); + when(mockAuthRepository.getCurrentUser()).thenAnswer((realInvocation) async => Left("ERROR")); + // await onBoardingNotifier.updateUserAvatar(); + }); + }); +} diff --git a/test/providers/Onboarding/onboarding_provider_test.mocks.dart b/test/providers/Onboarding/onboarding_provider_test.mocks.dart new file mode 100644 index 00000000..129ad16d --- /dev/null +++ b/test/providers/Onboarding/onboarding_provider_test.mocks.dart @@ -0,0 +1,665 @@ +// Mocks generated by Mockito 5.4.0 from annotations +// in ottaa_project_flutter/test/providers/Onboarding/onboarding_provider_test.dart. +// Do not manually edit this file. + +// ignore_for_file: no_leading_underscores_for_library_prefixes +import 'dart:async' as _i7; +import 'dart:ui' as _i5; + +import 'package:either_dart/either.dart' as _i3; +import 'package:flutter/material.dart' as _i2; +import 'package:flutter_riverpod/flutter_riverpod.dart' as _i11; +import 'package:mockito/mockito.dart' as _i1; +import 'package:ottaa_project_flutter/application/notifiers/loading_notifier.dart' + as _i10; +import 'package:ottaa_project_flutter/application/providers/onboarding_provider.dart' + as _i4; +import 'package:ottaa_project_flutter/core/abstracts/user_model.dart' as _i8; +import 'package:ottaa_project_flutter/core/enums/sign_in_types.dart' as _i9; +import 'package:ottaa_project_flutter/core/enums/user_payment.dart' as _i13; +import 'package:ottaa_project_flutter/core/enums/user_types.dart' as _i15; +import 'package:ottaa_project_flutter/core/models/assets_image.dart' as _i14; +import 'package:ottaa_project_flutter/core/repositories/repositories.dart' + as _i6; +import 'package:state_notifier/state_notifier.dart' as _i12; + +// ignore_for_file: type=lint +// ignore_for_file: avoid_redundant_argument_values +// ignore_for_file: avoid_setters_without_getters +// ignore_for_file: comment_references +// ignore_for_file: implementation_imports +// ignore_for_file: invalid_use_of_visible_for_testing_member +// ignore_for_file: prefer_const_constructors +// ignore_for_file: unnecessary_parenthesis +// ignore_for_file: camel_case_types +// ignore_for_file: subtype_of_sealed_class + +class _FakePageController_0 extends _i1.SmartFake + implements _i2.PageController { + _FakePageController_0( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeEither_1 extends _i1.SmartFake implements _i3.Either { + _FakeEither_1( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +/// A class which mocks [OnBoardingNotifier]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockOnBoardingNotifier extends _i1.Mock + implements _i4.OnBoardingNotifier { + MockOnBoardingNotifier() { + _i1.throwOnMissingStub(this); + } + + @override + _i2.PageController get controller => (super.noSuchMethod( + Invocation.getter(#controller), + returnValue: _FakePageController_0( + this, + Invocation.getter(#controller), + ), + ) as _i2.PageController); + @override + double get currentIndex => (super.noSuchMethod( + Invocation.getter(#currentIndex), + returnValue: 0.0, + ) as double); + @override + set currentIndex(double? _currentIndex) => super.noSuchMethod( + Invocation.setter( + #currentIndex, + _currentIndex, + ), + returnValueForMissingStub: null, + ); + @override + bool get hasListeners => (super.noSuchMethod( + Invocation.getter(#hasListeners), + returnValue: false, + ) as bool); + @override + void dispose() => super.noSuchMethod( + Invocation.method( + #dispose, + [], + ), + returnValueForMissingStub: null, + ); + @override + void nextPage() => super.noSuchMethod( + Invocation.method( + #nextPage, + [], + ), + returnValueForMissingStub: null, + ); + @override + void previousPage() => super.noSuchMethod( + Invocation.method( + #previousPage, + [], + ), + returnValueForMissingStub: null, + ); + @override + void goToPage(int? index) => super.noSuchMethod( + Invocation.method( + #goToPage, + [index], + ), + returnValueForMissingStub: null, + ); + @override + void addListener(_i5.VoidCallback? listener) => super.noSuchMethod( + Invocation.method( + #addListener, + [listener], + ), + returnValueForMissingStub: null, + ); + @override + void removeListener(_i5.VoidCallback? listener) => super.noSuchMethod( + Invocation.method( + #removeListener, + [listener], + ), + returnValueForMissingStub: null, + ); + @override + void notifyListeners() => super.noSuchMethod( + Invocation.method( + #notifyListeners, + [], + ), + returnValueForMissingStub: null, + ); +} + +/// A class which mocks [AuthRepository]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockAuthRepository extends _i1.Mock implements _i6.AuthRepository { + MockAuthRepository() { + _i1.throwOnMissingStub(this); + } + + @override + bool get isLogged => (super.noSuchMethod( + Invocation.getter(#isLogged), + returnValue: false, + ) as bool); + @override + _i7.Future<_i3.Either> signIn( + _i9.SignInType? type, [ + String? email, + String? password, + ]) => + (super.noSuchMethod( + Invocation.method( + #signIn, + [ + type, + email, + password, + ], + ), + returnValue: _i7.Future<_i3.Either>.value( + _FakeEither_1( + this, + Invocation.method( + #signIn, + [ + type, + email, + password, + ], + ), + )), + ) as _i7.Future<_i3.Either>); + @override + _i7.Future<_i3.Either> signUp() => (super.noSuchMethod( + Invocation.method( + #signUp, + [], + ), + returnValue: _i7.Future<_i3.Either>.value( + _FakeEither_1( + this, + Invocation.method( + #signUp, + [], + ), + )), + ) as _i7.Future<_i3.Either>); + @override + _i7.Future<_i3.Either> getCurrentUser() => + (super.noSuchMethod( + Invocation.method( + #getCurrentUser, + [], + ), + returnValue: _i7.Future<_i3.Either>.value( + _FakeEither_1( + this, + Invocation.method( + #getCurrentUser, + [], + ), + )), + ) as _i7.Future<_i3.Either>); + @override + _i7.Future isLoggedIn() => (super.noSuchMethod( + Invocation.method( + #isLoggedIn, + [], + ), + returnValue: _i7.Future.value(false), + ) as _i7.Future); + @override + _i7.Future logout() => (super.noSuchMethod( + Invocation.method( + #logout, + [], + ), + returnValue: _i7.Future.value(), + returnValueForMissingStub: _i7.Future.value(), + ) as _i7.Future); + @override + _i7.Future getDeviceId() => (super.noSuchMethod( + Invocation.method( + #getDeviceId, + [], + ), + returnValue: _i7.Future.value(''), + ) as _i7.Future); + @override + _i7.Future deleteAccount({required String? userId}) => + (super.noSuchMethod( + Invocation.method( + #deleteAccount, + [], + {#userId: userId}, + ), + returnValue: _i7.Future.value(false), + ) as _i7.Future); +} + +/// A class which mocks [LoadingNotifier]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockLoadingNotifier extends _i1.Mock implements _i10.LoadingNotifier { + MockLoadingNotifier() { + _i1.throwOnMissingStub(this); + } + + @override + set onError(_i11.ErrorListener? _onError) => super.noSuchMethod( + Invocation.setter( + #onError, + _onError, + ), + returnValueForMissingStub: null, + ); + @override + bool get mounted => (super.noSuchMethod( + Invocation.getter(#mounted), + returnValue: false, + ) as bool); + @override + _i7.Stream get stream => (super.noSuchMethod( + Invocation.getter(#stream), + returnValue: _i7.Stream.empty(), + ) as _i7.Stream); + @override + bool get state => (super.noSuchMethod( + Invocation.getter(#state), + returnValue: false, + ) as bool); + @override + set state(bool? value) => super.noSuchMethod( + Invocation.setter( + #state, + value, + ), + returnValueForMissingStub: null, + ); + @override + bool get debugState => (super.noSuchMethod( + Invocation.getter(#debugState), + returnValue: false, + ) as bool); + @override + bool get hasListeners => (super.noSuchMethod( + Invocation.getter(#hasListeners), + returnValue: false, + ) as bool); + @override + void showLoading() => super.noSuchMethod( + Invocation.method( + #showLoading, + [], + ), + returnValueForMissingStub: null, + ); + @override + void hideLoading() => super.noSuchMethod( + Invocation.method( + #hideLoading, + [], + ), + returnValueForMissingStub: null, + ); + @override + void toggleLoading() => super.noSuchMethod( + Invocation.method( + #toggleLoading, + [], + ), + returnValueForMissingStub: null, + ); + @override + bool getState() => (super.noSuchMethod( + Invocation.method( + #getState, + [], + ), + returnValue: false, + ) as bool); + @override + bool updateShouldNotify( + bool? old, + bool? current, + ) => + (super.noSuchMethod( + Invocation.method( + #updateShouldNotify, + [ + old, + current, + ], + ), + returnValue: false, + ) as bool); + @override + _i11.RemoveListener addListener( + _i12.Listener? listener, { + bool? fireImmediately = true, + }) => + (super.noSuchMethod( + Invocation.method( + #addListener, + [listener], + {#fireImmediately: fireImmediately}, + ), + returnValue: () {}, + ) as _i11.RemoveListener); + @override + void dispose() => super.noSuchMethod( + Invocation.method( + #dispose, + [], + ), + returnValueForMissingStub: null, + ); +} + +/// A class which mocks [AboutRepository]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockAboutRepository extends _i1.Mock implements _i6.AboutRepository { + MockAboutRepository() { + _i1.throwOnMissingStub(this); + } + + @override + _i7.Future getEmail() => (super.noSuchMethod( + Invocation.method( + #getEmail, + [], + ), + returnValue: _i7.Future.value(''), + ) as _i7.Future); + @override + _i7.Future getAppVersion() => (super.noSuchMethod( + Invocation.method( + #getAppVersion, + [], + ), + returnValue: _i7.Future.value(''), + ) as _i7.Future); + @override + _i7.Future getDeviceName() => (super.noSuchMethod( + Invocation.method( + #getDeviceName, + [], + ), + returnValue: _i7.Future.value(''), + ) as _i7.Future); + @override + _i7.Future<_i13.UserPayment> getUserType() => (super.noSuchMethod( + Invocation.method( + #getUserType, + [], + ), + returnValue: _i7.Future<_i13.UserPayment>.value(_i13.UserPayment.free), + ) as _i7.Future<_i13.UserPayment>); + @override + _i7.Future getAvailableAppVersion() => (super.noSuchMethod( + Invocation.method( + #getAvailableAppVersion, + [], + ), + returnValue: _i7.Future.value(''), + ) as _i7.Future); + @override + _i7.Future sendSupportEmail() => (super.noSuchMethod( + Invocation.method( + #sendSupportEmail, + [], + ), + returnValue: _i7.Future.value(), + returnValueForMissingStub: _i7.Future.value(), + ) as _i7.Future); + @override + _i7.Future uploadUserInformation() => (super.noSuchMethod( + Invocation.method( + #uploadUserInformation, + [], + ), + returnValue: _i7.Future.value(), + returnValueForMissingStub: _i7.Future.value(), + ) as _i7.Future); + @override + _i7.Future uploadProfilePicture(_i14.AssetsImage? image) => + (super.noSuchMethod( + Invocation.method( + #uploadProfilePicture, + [image], + ), + returnValue: _i7.Future.value(), + returnValueForMissingStub: _i7.Future.value(), + ) as _i7.Future); + @override + _i7.Future getProfilePicture() => (super.noSuchMethod( + Invocation.method( + #getProfilePicture, + [], + ), + returnValue: _i7.Future.value(''), + ) as _i7.Future); + @override + _i7.Future isCurrentUserAvatarExist() => (super.noSuchMethod( + Invocation.method( + #isCurrentUserAvatarExist, + [], + ), + returnValue: _i7.Future.value(false), + ) as _i7.Future); + @override + _i7.Future isFirstTime() => (super.noSuchMethod( + Invocation.method( + #isFirstTime, + [], + ), + returnValue: _i7.Future.value(false), + ) as _i7.Future); + @override + _i7.Future<_i3.Either> getUserInformation() => + (super.noSuchMethod( + Invocation.method( + #getUserInformation, + [], + ), + returnValue: _i7.Future<_i3.Either>.value( + _FakeEither_1( + this, + Invocation.method( + #getUserInformation, + [], + ), + )), + ) as _i7.Future<_i3.Either>); + @override + _i7.Future updateUserType({ + required String? id, + required _i15.UserType? userType, + }) => + (super.noSuchMethod( + Invocation.method( + #updateUserType, + [], + { + #id: id, + #userType: userType, + }, + ), + returnValue: _i7.Future.value(), + returnValueForMissingStub: _i7.Future.value(), + ) as _i7.Future); + @override + _i7.Future updateUserLastConnectionTime({ + required String? userId, + required int? time, + }) => + (super.noSuchMethod( + Invocation.method( + #updateUserLastConnectionTime, + [], + { + #userId: userId, + #time: time, + }, + ), + returnValue: _i7.Future.value(), + returnValueForMissingStub: _i7.Future.value(), + ) as _i7.Future); +} + +/// A class which mocks [LocalDatabaseRepository]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockLocalDatabaseRepository extends _i1.Mock + implements _i6.LocalDatabaseRepository { + MockLocalDatabaseRepository() { + _i1.throwOnMissingStub(this); + } + + @override + set user(_i8.UserModel? user) => super.noSuchMethod( + Invocation.setter( + #user, + user, + ), + returnValueForMissingStub: null, + ); + @override + _i7.Future init() => (super.noSuchMethod( + Invocation.method( + #init, + [], + ), + returnValue: _i7.Future.value(), + returnValueForMissingStub: _i7.Future.value(), + ) as _i7.Future); + @override + _i7.Future close() => (super.noSuchMethod( + Invocation.method( + #close, + [], + ), + returnValue: _i7.Future.value(), + returnValueForMissingStub: _i7.Future.value(), + ) as _i7.Future); + @override + _i7.Future setUser(_i8.UserModel? user) => (super.noSuchMethod( + Invocation.method( + #setUser, + [user], + ), + returnValue: _i7.Future.value(), + returnValueForMissingStub: _i7.Future.value(), + ) as _i7.Future); + @override + _i7.Future<_i8.UserModel?> getUser() => (super.noSuchMethod( + Invocation.method( + #getUser, + [], + ), + returnValue: _i7.Future<_i8.UserModel?>.value(), + ) as _i7.Future<_i8.UserModel?>); + @override + _i7.Future deleteUser() => (super.noSuchMethod( + Invocation.method( + #deleteUser, + [], + ), + returnValue: _i7.Future.value(), + returnValueForMissingStub: _i7.Future.value(), + ) as _i7.Future); + @override + _i7.Future getIntro() => (super.noSuchMethod( + Invocation.method( + #getIntro, + [], + ), + returnValue: _i7.Future.value(false), + ) as _i7.Future); + @override + _i7.Future setIntro([bool? value]) => (super.noSuchMethod( + Invocation.method( + #setIntro, + [value], + ), + returnValue: _i7.Future.value(), + returnValueForMissingStub: _i7.Future.value(), + ) as _i7.Future); + @override + _i7.Future getVoice() => (super.noSuchMethod( + Invocation.method( + #getVoice, + [], + ), + returnValue: _i7.Future.value(''), + ) as _i7.Future); + @override + _i7.Future getLongClick() => (super.noSuchMethod( + Invocation.method( + #getLongClick, + [], + ), + returnValue: _i7.Future.value(false), + ) as _i7.Future); + @override + _i7.Future setLongClick({required bool? isLongClick}) => + (super.noSuchMethod( + Invocation.method( + #setLongClick, + [], + {#isLongClick: isLongClick}, + ), + returnValue: _i7.Future.value(), + returnValueForMissingStub: _i7.Future.value(), + ) as _i7.Future); + @override + _i7.Future setVoice({required String? name}) => (super.noSuchMethod( + Invocation.method( + #setVoice, + [], + {#name: name}, + ), + returnValue: _i7.Future.value(), + returnValueForMissingStub: _i7.Future.value(), + ) as _i7.Future); + @override + _i7.Future setAppleUserDara({required Map? data}) => + (super.noSuchMethod( + Invocation.method( + #setAppleUserDara, + [], + {#data: data}, + ), + returnValue: _i7.Future.value(), + returnValueForMissingStub: _i7.Future.value(), + ) as _i7.Future); + @override + _i7.Future> getAppleUserData() => (super.noSuchMethod( + Invocation.method( + #getAppleUserData, + [], + ), + returnValue: _i7.Future>.value({}), + ) as _i7.Future>); +} diff --git a/test/Providers/Pictograms/Pictograms_provider_test.dart b/test/providers/Pictograms/Pictograms_provider_test.dart similarity index 92% rename from test/Providers/Pictograms/Pictograms_provider_test.dart rename to test/providers/Pictograms/Pictograms_provider_test.dart index 3e105e4b..bb08a421 100644 --- a/test/Providers/Pictograms/Pictograms_provider_test.dart +++ b/test/providers/Pictograms/Pictograms_provider_test.dart @@ -4,6 +4,4 @@ import 'package:mockito/annotations.dart'; import 'package:mockito/mockito.dart'; @GenerateMocks([]) -void main(){ - -} \ No newline at end of file +void main() {} diff --git a/test/providers/Splash/SplashProvider_test.dart b/test/providers/Splash/SplashProvider_test.dart new file mode 100644 index 00000000..5745aac3 --- /dev/null +++ b/test/providers/Splash/SplashProvider_test.dart @@ -0,0 +1,93 @@ +import 'package:either_dart/either.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mockito/annotations.dart'; +import 'package:mockito/mockito.dart'; +import 'package:ottaa_project_flutter/application/providers/splash_provider.dart'; +import 'package:ottaa_project_flutter/application/providers/user_provider.dart'; +import 'package:ottaa_project_flutter/core/abstracts/user_model.dart'; +import 'package:ottaa_project_flutter/core/models/assets_image.dart'; +import 'package:ottaa_project_flutter/core/models/base_settings_model.dart'; +import 'package:ottaa_project_flutter/core/models/base_user_model.dart'; +import 'package:ottaa_project_flutter/core/models/language_setting.dart'; +import 'package:ottaa_project_flutter/core/models/user_data_model.dart'; +import 'package:ottaa_project_flutter/core/repositories/about_repository.dart'; +import 'package:ottaa_project_flutter/core/repositories/auth_repository.dart'; +import 'package:ottaa_project_flutter/core/repositories/local_database_repository.dart'; + +import 'SplashProvider_test.mocks.dart'; + +@GenerateMocks([ + SplashProvider, + AboutRepository, + AuthRepository, + UserNotifier, + LocalDatabaseRepository, +]) +void main() { + late SplashProvider splashProvider; + late MockAboutRepository mockAboutRepository; + late MockAuthRepository mockAuthRepository; + late UserModel fakeUser; + late MockUserNotifier mockUserNotifier; + late MockLocalDatabaseRepository mockLocalDatabaseRepository; + + setUp(() { + fakeUser = BaseUserModel( + id: "0", + settings: BaseSettingsModel( + data: UserData( + avatar: AssetsImage(asset: "test", network: "https://test.com"), + birthDate: DateTime(0), + genderPref: "n/a", + lastConnection: DateTime(0), + name: "John", + lastName: "Doe", + ), + language: LanguageSetting.empty(), + ), + email: "test@mail.com", + ); + + mockAboutRepository = MockAboutRepository(); + mockAuthRepository = MockAuthRepository(); + mockUserNotifier = MockUserNotifier(); + mockLocalDatabaseRepository = MockLocalDatabaseRepository(); + + splashProvider = SplashProvider( + mockAboutRepository, + mockAuthRepository, + mockUserNotifier, + mockLocalDatabaseRepository, + ); + }); + group('Splash Provider Testing', () { + test('Check User Avatar true', () async { + when(mockAboutRepository.isCurrentUserAvatarExist()) + .thenAnswer((realInvocation) async => true); + expect(await splashProvider.checkUserAvatar(), true); + }); + test('Check User Avatar false', () async { + when(mockAboutRepository.isCurrentUserAvatarExist()) + .thenAnswer((realInvocation) async => false); + expect(await splashProvider.checkUserAvatar(), false); + }); + test('Fetch user information', () async { + when(mockAboutRepository.getUserInformation()) + .thenAnswer((realInvocation) async => Right(fakeUser)); + expect(await splashProvider.fetchUserInformation(), true); + }); + test('Is First Time', () async { + when(mockAboutRepository.isFirstTime()) + .thenAnswer((realInvocation) async => true); + when(mockLocalDatabaseRepository.getIntro()) + .thenAnswer((realInvocation) async => true); + expect(await splashProvider.isFirstTime(), true); + }); + + test('UnFetch user information id', () async { + when(mockAboutRepository.getUserInformation()) + .thenAnswer((realInvocation) async => Left(fakeUser.id)); + expect(await splashProvider.fetchUserInformation(), false); + }); + }); +} diff --git a/test/providers/Splash/SplashProvider_test.mocks.dart b/test/providers/Splash/SplashProvider_test.mocks.dart new file mode 100644 index 00000000..401c137e --- /dev/null +++ b/test/providers/Splash/SplashProvider_test.mocks.dart @@ -0,0 +1,619 @@ +// Mocks generated by Mockito 5.4.0 from annotations +// in ottaa_project_flutter/test/providers/Splash/SplashProvider_test.dart. +// Do not manually edit this file. + +// ignore_for_file: no_leading_underscores_for_library_prefixes +import 'dart:async' as _i4; +import 'dart:ui' as _i5; + +import 'package:either_dart/either.dart' as _i2; +import 'package:mockito/mockito.dart' as _i1; +import 'package:ottaa_project_flutter/application/providers/splash_provider.dart' + as _i3; +import 'package:ottaa_project_flutter/application/providers/user_provider.dart' + as _i13; +import 'package:ottaa_project_flutter/core/abstracts/user_model.dart' as _i9; +import 'package:ottaa_project_flutter/core/enums/sign_in_types.dart' as _i12; +import 'package:ottaa_project_flutter/core/enums/user_payment.dart' as _i7; +import 'package:ottaa_project_flutter/core/enums/user_types.dart' as _i10; +import 'package:ottaa_project_flutter/core/models/assets_image.dart' as _i8; +import 'package:ottaa_project_flutter/core/repositories/about_repository.dart' + as _i6; +import 'package:ottaa_project_flutter/core/repositories/auth_repository.dart' + as _i11; +import 'package:ottaa_project_flutter/core/repositories/local_database_repository.dart' + as _i14; + +// ignore_for_file: type=lint +// ignore_for_file: avoid_redundant_argument_values +// ignore_for_file: avoid_setters_without_getters +// ignore_for_file: comment_references +// ignore_for_file: implementation_imports +// ignore_for_file: invalid_use_of_visible_for_testing_member +// ignore_for_file: prefer_const_constructors +// ignore_for_file: unnecessary_parenthesis +// ignore_for_file: camel_case_types +// ignore_for_file: subtype_of_sealed_class + +class _FakeEither_0 extends _i1.SmartFake implements _i2.Either { + _FakeEither_0( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +/// A class which mocks [SplashProvider]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockSplashProvider extends _i1.Mock implements _i3.SplashProvider { + MockSplashProvider() { + _i1.throwOnMissingStub(this); + } + + @override + bool get hasListeners => (super.noSuchMethod( + Invocation.getter(#hasListeners), + returnValue: false, + ) as bool); + @override + _i4.Future checkUserAvatar() => (super.noSuchMethod( + Invocation.method( + #checkUserAvatar, + [], + ), + returnValue: _i4.Future.value(false), + ) as _i4.Future); + @override + _i4.Future isFirstTime() => (super.noSuchMethod( + Invocation.method( + #isFirstTime, + [], + ), + returnValue: _i4.Future.value(false), + ) as _i4.Future); + @override + _i4.Future setFirstTime() => (super.noSuchMethod( + Invocation.method( + #setFirstTime, + [], + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future fetchUserInformation() => (super.noSuchMethod( + Invocation.method( + #fetchUserInformation, + [], + ), + returnValue: _i4.Future.value(false), + ) as _i4.Future); + @override + _i4.Future updateLastConnectionTime({ + required String? userId, + required int? time, + }) => + (super.noSuchMethod( + Invocation.method( + #updateLastConnectionTime, + [], + { + #userId: userId, + #time: time, + }, + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future hasUser() => (super.noSuchMethod( + Invocation.method( + #hasUser, + [], + ), + returnValue: _i4.Future.value(false), + ) as _i4.Future); + @override + void addListener(_i5.VoidCallback? listener) => super.noSuchMethod( + Invocation.method( + #addListener, + [listener], + ), + returnValueForMissingStub: null, + ); + @override + void removeListener(_i5.VoidCallback? listener) => super.noSuchMethod( + Invocation.method( + #removeListener, + [listener], + ), + returnValueForMissingStub: null, + ); + @override + void dispose() => super.noSuchMethod( + Invocation.method( + #dispose, + [], + ), + returnValueForMissingStub: null, + ); + @override + void notifyListeners() => super.noSuchMethod( + Invocation.method( + #notifyListeners, + [], + ), + returnValueForMissingStub: null, + ); +} + +/// A class which mocks [AboutRepository]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockAboutRepository extends _i1.Mock implements _i6.AboutRepository { + MockAboutRepository() { + _i1.throwOnMissingStub(this); + } + + @override + _i4.Future getEmail() => (super.noSuchMethod( + Invocation.method( + #getEmail, + [], + ), + returnValue: _i4.Future.value(''), + ) as _i4.Future); + @override + _i4.Future getAppVersion() => (super.noSuchMethod( + Invocation.method( + #getAppVersion, + [], + ), + returnValue: _i4.Future.value(''), + ) as _i4.Future); + @override + _i4.Future getDeviceName() => (super.noSuchMethod( + Invocation.method( + #getDeviceName, + [], + ), + returnValue: _i4.Future.value(''), + ) as _i4.Future); + @override + _i4.Future<_i7.UserPayment> getUserType() => (super.noSuchMethod( + Invocation.method( + #getUserType, + [], + ), + returnValue: _i4.Future<_i7.UserPayment>.value(_i7.UserPayment.free), + ) as _i4.Future<_i7.UserPayment>); + @override + _i4.Future getAvailableAppVersion() => (super.noSuchMethod( + Invocation.method( + #getAvailableAppVersion, + [], + ), + returnValue: _i4.Future.value(''), + ) as _i4.Future); + @override + _i4.Future sendSupportEmail() => (super.noSuchMethod( + Invocation.method( + #sendSupportEmail, + [], + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future uploadUserInformation() => (super.noSuchMethod( + Invocation.method( + #uploadUserInformation, + [], + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future uploadProfilePicture(_i8.AssetsImage? image) => + (super.noSuchMethod( + Invocation.method( + #uploadProfilePicture, + [image], + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future getProfilePicture() => (super.noSuchMethod( + Invocation.method( + #getProfilePicture, + [], + ), + returnValue: _i4.Future.value(''), + ) as _i4.Future); + @override + _i4.Future isCurrentUserAvatarExist() => (super.noSuchMethod( + Invocation.method( + #isCurrentUserAvatarExist, + [], + ), + returnValue: _i4.Future.value(false), + ) as _i4.Future); + @override + _i4.Future isFirstTime() => (super.noSuchMethod( + Invocation.method( + #isFirstTime, + [], + ), + returnValue: _i4.Future.value(false), + ) as _i4.Future); + @override + _i4.Future<_i2.Either> getUserInformation() => + (super.noSuchMethod( + Invocation.method( + #getUserInformation, + [], + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #getUserInformation, + [], + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future updateUserType({ + required String? id, + required _i10.UserType? userType, + }) => + (super.noSuchMethod( + Invocation.method( + #updateUserType, + [], + { + #id: id, + #userType: userType, + }, + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future updateUserLastConnectionTime({ + required String? userId, + required int? time, + }) => + (super.noSuchMethod( + Invocation.method( + #updateUserLastConnectionTime, + [], + { + #userId: userId, + #time: time, + }, + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); +} + +/// A class which mocks [AuthRepository]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockAuthRepository extends _i1.Mock implements _i11.AuthRepository { + MockAuthRepository() { + _i1.throwOnMissingStub(this); + } + + @override + bool get isLogged => (super.noSuchMethod( + Invocation.getter(#isLogged), + returnValue: false, + ) as bool); + @override + _i4.Future<_i2.Either> signIn( + _i12.SignInType? type, [ + String? email, + String? password, + ]) => + (super.noSuchMethod( + Invocation.method( + #signIn, + [ + type, + email, + password, + ], + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #signIn, + [ + type, + email, + password, + ], + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future<_i2.Either> signUp() => (super.noSuchMethod( + Invocation.method( + #signUp, + [], + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #signUp, + [], + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future<_i2.Either> getCurrentUser() => + (super.noSuchMethod( + Invocation.method( + #getCurrentUser, + [], + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #getCurrentUser, + [], + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future isLoggedIn() => (super.noSuchMethod( + Invocation.method( + #isLoggedIn, + [], + ), + returnValue: _i4.Future.value(false), + ) as _i4.Future); + @override + _i4.Future logout() => (super.noSuchMethod( + Invocation.method( + #logout, + [], + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future getDeviceId() => (super.noSuchMethod( + Invocation.method( + #getDeviceId, + [], + ), + returnValue: _i4.Future.value(''), + ) as _i4.Future); + @override + _i4.Future deleteAccount({required String? userId}) => + (super.noSuchMethod( + Invocation.method( + #deleteAccount, + [], + {#userId: userId}, + ), + returnValue: _i4.Future.value(false), + ) as _i4.Future); +} + +/// A class which mocks [UserNotifier]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockUserNotifier extends _i1.Mock implements _i13.UserNotifier { + MockUserNotifier() { + _i1.throwOnMissingStub(this); + } + + @override + set user(_i9.UserModel? userModel) => super.noSuchMethod( + Invocation.setter( + #user, + userModel, + ), + returnValueForMissingStub: null, + ); + @override + bool get hasListeners => (super.noSuchMethod( + Invocation.getter(#hasListeners), + returnValue: false, + ) as bool); + @override + void setUser(_i9.UserModel? userModel) => super.noSuchMethod( + Invocation.method( + #setUser, + [userModel], + ), + returnValueForMissingStub: null, + ); + @override + void clearUser() => super.noSuchMethod( + Invocation.method( + #clearUser, + [], + ), + returnValueForMissingStub: null, + ); + @override + void addListener(_i5.VoidCallback? listener) => super.noSuchMethod( + Invocation.method( + #addListener, + [listener], + ), + returnValueForMissingStub: null, + ); + @override + void removeListener(_i5.VoidCallback? listener) => super.noSuchMethod( + Invocation.method( + #removeListener, + [listener], + ), + returnValueForMissingStub: null, + ); + @override + void dispose() => super.noSuchMethod( + Invocation.method( + #dispose, + [], + ), + returnValueForMissingStub: null, + ); + @override + void notifyListeners() => super.noSuchMethod( + Invocation.method( + #notifyListeners, + [], + ), + returnValueForMissingStub: null, + ); +} + +/// A class which mocks [LocalDatabaseRepository]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockLocalDatabaseRepository extends _i1.Mock + implements _i14.LocalDatabaseRepository { + MockLocalDatabaseRepository() { + _i1.throwOnMissingStub(this); + } + + @override + set user(_i9.UserModel? user) => super.noSuchMethod( + Invocation.setter( + #user, + user, + ), + returnValueForMissingStub: null, + ); + @override + _i4.Future init() => (super.noSuchMethod( + Invocation.method( + #init, + [], + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future close() => (super.noSuchMethod( + Invocation.method( + #close, + [], + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future setUser(_i9.UserModel? user) => (super.noSuchMethod( + Invocation.method( + #setUser, + [user], + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future<_i9.UserModel?> getUser() => (super.noSuchMethod( + Invocation.method( + #getUser, + [], + ), + returnValue: _i4.Future<_i9.UserModel?>.value(), + ) as _i4.Future<_i9.UserModel?>); + @override + _i4.Future deleteUser() => (super.noSuchMethod( + Invocation.method( + #deleteUser, + [], + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future getIntro() => (super.noSuchMethod( + Invocation.method( + #getIntro, + [], + ), + returnValue: _i4.Future.value(false), + ) as _i4.Future); + @override + _i4.Future setIntro([bool? value]) => (super.noSuchMethod( + Invocation.method( + #setIntro, + [value], + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future getVoice() => (super.noSuchMethod( + Invocation.method( + #getVoice, + [], + ), + returnValue: _i4.Future.value(''), + ) as _i4.Future); + @override + _i4.Future getLongClick() => (super.noSuchMethod( + Invocation.method( + #getLongClick, + [], + ), + returnValue: _i4.Future.value(false), + ) as _i4.Future); + @override + _i4.Future setLongClick({required bool? isLongClick}) => + (super.noSuchMethod( + Invocation.method( + #setLongClick, + [], + {#isLongClick: isLongClick}, + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future setVoice({required String? name}) => (super.noSuchMethod( + Invocation.method( + #setVoice, + [], + {#name: name}, + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future setAppleUserDara({required Map? data}) => + (super.noSuchMethod( + Invocation.method( + #setAppleUserDara, + [], + {#data: data}, + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future> getAppleUserData() => (super.noSuchMethod( + Invocation.method( + #getAppleUserData, + [], + ), + returnValue: _i4.Future>.value({}), + ) as _i4.Future>); +} diff --git a/test/providers/TTS/ttsprovider_test.dart b/test/providers/TTS/ttsprovider_test.dart new file mode 100644 index 00000000..b1e28ae9 --- /dev/null +++ b/test/providers/TTS/ttsprovider_test.dart @@ -0,0 +1,62 @@ +import 'package:either_dart/src/either.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mockito/annotations.dart'; +import 'package:mockito/mockito.dart'; +import 'package:ottaa_project_flutter/application/providers/tts_provider.dart'; +import 'package:ottaa_project_flutter/core/models/voices_model.dart'; +import 'package:ottaa_project_flutter/core/repositories/local_database_repository.dart'; +import 'package:ottaa_project_flutter/core/repositories/tts_repository.dart'; + +import 'ttsprovider_test.mocks.dart'; + +@GenerateMocks([TTSRepository]) +void main() { + late MockTTSRepository mockTTSRepository; + late TTSProvider ttsProvider; + late List fakeVoices; + + setUp(() { + mockTTSRepository = MockTTSRepository(); + fakeVoices = [ + Voices(name: 'Test1', locale: 'es_AR'), + Voices(name: 'Test2', locale: 'es_AR'), + Voices(name: 'Test2', locale: 'es_AR'), + ]; + ttsProvider = TTSProvider(mockTTSRepository); + }); + + group('TTS Provider', () { + test('Speak tts provider', () async { + await ttsProvider.speak('Hello'); + verify(ttsProvider.speak('Hello')).called(1); + }); + + test('fetch the available voices from the tts', () async { + when(mockTTSRepository.fetchVoices()).thenAnswer((realInvocation) async => fakeVoices); + + final response = await ttsProvider.fetchVoices('es_AR'); + + expect(response, isA>()); + }); + + test('should change the tts speed', () async { + await ttsProvider.changeVoiceSpeed(00); + verify(ttsProvider.changeVoiceSpeed(00)).called(1); + }); + + test('should change custom tts status', () async { + await ttsProvider.changeCustomTTs(false); + verify(ttsProvider.changeCustomTTs(false)).called(1); + }); + + test('should change tts voice', () async { + await ttsProvider.changeTTSVoice('test'); + verify(ttsProvider.changeTTSVoice('test')).called(1); + }); + + test('should stop tts while speaking', () async { + await ttsProvider.ttsStop(); + verify(ttsProvider.ttsStop()).called(1); + }); + }); +} diff --git a/test/providers/TTS/ttsprovider_test.mocks.dart b/test/providers/TTS/ttsprovider_test.mocks.dart new file mode 100644 index 00000000..a30e712a --- /dev/null +++ b/test/providers/TTS/ttsprovider_test.mocks.dart @@ -0,0 +1,189 @@ +// Mocks generated by Mockito 5.4.0 from annotations +// in ottaa_project_flutter/test/providers/TTS/ttsprovider_test.dart. +// Do not manually edit this file. + +// ignore_for_file: no_leading_underscores_for_library_prefixes +import 'dart:async' as _i3; + +import 'package:mockito/mockito.dart' as _i1; +import 'package:ottaa_project_flutter/core/models/voices_model.dart' as _i4; +import 'package:ottaa_project_flutter/core/repositories/tts_repository.dart' + as _i2; + +// ignore_for_file: type=lint +// ignore_for_file: avoid_redundant_argument_values +// ignore_for_file: avoid_setters_without_getters +// ignore_for_file: comment_references +// ignore_for_file: implementation_imports +// ignore_for_file: invalid_use_of_visible_for_testing_member +// ignore_for_file: prefer_const_constructors +// ignore_for_file: unnecessary_parenthesis +// ignore_for_file: camel_case_types +// ignore_for_file: subtype_of_sealed_class + +/// A class which mocks [TTSRepository]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockTTSRepository extends _i1.Mock implements _i2.TTSRepository { + MockTTSRepository() { + _i1.throwOnMissingStub(this); + } + + @override + bool get customTTSEnable => (super.noSuchMethod( + Invocation.getter(#customTTSEnable), + returnValue: false, + ) as bool); + @override + set customTTSEnable(bool? value) => super.noSuchMethod( + Invocation.setter( + #customTTSEnable, + value, + ), + returnValueForMissingStub: null, + ); + @override + String get language => (super.noSuchMethod( + Invocation.getter(#language), + returnValue: '', + ) as String); + @override + set language(String? value) => super.noSuchMethod( + Invocation.setter( + #language, + value, + ), + returnValueForMissingStub: null, + ); + @override + List get availableTTS => (super.noSuchMethod( + Invocation.getter(#availableTTS), + returnValue: [], + ) as List); + @override + set availableTTS(List? value) => super.noSuchMethod( + Invocation.setter( + #availableTTS, + value, + ), + returnValueForMissingStub: null, + ); + @override + String get voice => (super.noSuchMethod( + Invocation.getter(#voice), + returnValue: '', + ) as String); + @override + set voice(String? value) => super.noSuchMethod( + Invocation.setter( + #voice, + value, + ), + returnValueForMissingStub: null, + ); + @override + String get name => (super.noSuchMethod( + Invocation.getter(#name), + returnValue: '', + ) as String); + @override + set name(String? value) => super.noSuchMethod( + Invocation.setter( + #name, + value, + ), + returnValueForMissingStub: null, + ); + @override + String get locale => (super.noSuchMethod( + Invocation.getter(#locale), + returnValue: '', + ) as String); + @override + set locale(String? value) => super.noSuchMethod( + Invocation.setter( + #locale, + value, + ), + returnValueForMissingStub: null, + ); + @override + double get speechRate => (super.noSuchMethod( + Invocation.getter(#speechRate), + returnValue: 0.0, + ) as double); + @override + set speechRate(double? value) => super.noSuchMethod( + Invocation.setter( + #speechRate, + value, + ), + returnValueForMissingStub: null, + ); + @override + double get pitch => (super.noSuchMethod( + Invocation.getter(#pitch), + returnValue: 0.0, + ) as double); + @override + set pitch(double? value) => super.noSuchMethod( + Invocation.setter( + #pitch, + value, + ), + returnValueForMissingStub: null, + ); + @override + _i3.Future speak(String? text) => (super.noSuchMethod( + Invocation.method( + #speak, + [text], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + @override + _i3.Future> fetchVoices() => (super.noSuchMethod( + Invocation.method( + #fetchVoices, + [], + ), + returnValue: _i3.Future>.value(<_i4.Voices>[]), + ) as _i3.Future>); + @override + _i3.Future changeVoiceSpeed(double? speed) => (super.noSuchMethod( + Invocation.method( + #changeVoiceSpeed, + [speed], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + @override + _i3.Future changeCustomTTs(bool? value) => (super.noSuchMethod( + Invocation.method( + #changeCustomTTs, + [value], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + @override + _i3.Future changeTTSVoice(String? voice) => (super.noSuchMethod( + Invocation.method( + #changeTTSVoice, + [voice], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + @override + _i3.Future ttsStop() => (super.noSuchMethod( + Invocation.method( + #ttsStop, + [], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); +} diff --git a/test/providers/about/about_test.dart b/test/providers/about/about_test.dart new file mode 100644 index 00000000..0e46905b --- /dev/null +++ b/test/providers/about/about_test.dart @@ -0,0 +1,183 @@ +import 'package:either_dart/src/either.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:get_it/get_it.dart'; +import 'package:mockito/annotations.dart'; +import 'package:mockito/mockito.dart'; +import 'package:ottaa_project_flutter/application/providers/about_provider.dart'; +import 'package:ottaa_project_flutter/application/service/about_service.dart'; +import 'package:ottaa_project_flutter/core/abstracts/user_model.dart'; +import 'package:ottaa_project_flutter/core/enums/user_payment.dart'; +import 'package:ottaa_project_flutter/core/enums/user_types.dart'; +import 'package:ottaa_project_flutter/core/models/assets_image.dart'; +import 'package:ottaa_project_flutter/core/models/base_settings_model.dart'; +import 'package:ottaa_project_flutter/core/models/base_user_model.dart'; +import 'package:ottaa_project_flutter/core/models/language_setting.dart'; +import 'package:ottaa_project_flutter/core/models/user_data_model.dart'; +import 'package:ottaa_project_flutter/core/repositories/about_repository.dart'; +import 'package:ottaa_project_flutter/core/repositories/auth_repository.dart'; + +import 'about_test.mocks.dart'; + +@GenerateMocks([AboutService]) +void main() { + late AboutProvider cAboutProvider; + late MockAboutService mockAboutService; + + late UserModel fakeUser; + + setUp(() { + fakeUser = BaseUserModel( + id: "0", + settings: BaseSettingsModel( + data: UserData( + avatar: AssetsImage(asset: "test", network: "https://test.com"), + birthDate: DateTime(0), + genderPref: "n/a", + lastConnection: DateTime(0), + name: "John", + lastName: "Doe", + ), + language: LanguageSetting.empty(), + ), + email: "test@mail.com", + ); + + mockAboutService = MockAboutService(); + cAboutProvider = AboutProvider(mockAboutService); + }); + + test("should return about provider", () { + GetIt.I.registerSingleton(mockAboutService); + + final container = ProviderContainer(); + + addTearDown(container.dispose); + + final pumpProvider = container.read(aboutProvider); + + expect(pumpProvider, isA()); + expect(aboutProvider, isA>()); + }); + + test("should return the app version", () async { + when(mockAboutService.getAppVersion()).thenAnswer((_) async => "1.0.0"); + + expect(await cAboutProvider.getAppVersion(), "1.0.0"); + verify(mockAboutService.getAppVersion()).called(1); + }); + + test("should return the available app version", () async { + when(mockAboutService.getAvailableAppVersion()).thenAnswer((_) async => "1.0.0"); + + expect(await cAboutProvider.getAvailableAppVersion(), "1.0.0"); + verify(mockAboutService.getAvailableAppVersion()).called(1); + }); + + test("should return the device name", () async { + when(mockAboutService.getDeviceName()).thenAnswer((_) async => "iPhone 12"); + + expect(await cAboutProvider.getDeviceName(), "iPhone 12"); + verify(mockAboutService.getDeviceName()).called(1); + }); + + test("should return the user email", () async { + when(mockAboutService.getEmail()).thenAnswer((_) async => "test@mail.com"); + + expect(await cAboutProvider.getEmail(), "test@mail.com"); + + verify(mockAboutService.getEmail()).called(1); + }); + + test("should return the user profile picture", () async { + when(mockAboutService.getProfilePicture()).thenAnswer((_) async => "https://test.com"); + + expect(await cAboutProvider.getProfilePicture(), "https://test.com"); + + verify(mockAboutService.getProfilePicture()).called(1); + }); + + test("should return the user information", () async { + when(mockAboutService.getUserInformation()).thenAnswer((_) async => Right(fakeUser)); + expect((await mockAboutService.getUserInformation()).isRight, true); + + expect((await mockAboutService.getUserInformation()).right, isA()); + }); + + test("should return free user type", () async { + when(mockAboutService.getUserType()).thenAnswer((_) async => UserPayment.free); + + expect(await cAboutProvider.getUserType(), UserPayment.free); + + verify(mockAboutService.getUserType()).called(1); + }); + + test("should return premium user type", () async { + when(mockAboutService.getUserType()).thenAnswer((_) async => UserPayment.premium); + + expect(await cAboutProvider.getUserType(), UserPayment.premium); + + verify(mockAboutService.getUserType()).called(1); + }); + + test("should return if the user avatar exist", () async { + when(mockAboutService.getProfilePicture()).thenAnswer((_) async => fakeUser.settings.data.avatar.network!); + + expect(await cAboutProvider.getProfilePicture(), "https://test.com"); + + verify(mockAboutService.getProfilePicture()).called(1); + }); + + // test("should return if the user is first time", () async { + // when(mockAboutService.isFirstTime()).thenAnswer((_) async => fakeUser); + + // expect(await mockAboutService.isFirstTime(), true); + + // verify(mockAboutService.isFirstTime()).called(1); + // }); + + test("should upload the user information", () async { + UserModel fakeUser2 = BaseUserModel( + id: "2", + settings: BaseSettingsModel( + data: UserData( + avatar: AssetsImage(asset: "test", network: "https://test.com"), + birthDate: DateTime(0), + genderPref: "n/a", + lastConnection: DateTime(0), + name: "John", + lastName: "Doe", + ), + language: LanguageSetting.empty(), + ), + email: "test@mail.com", + ); + when(mockAboutService.uploadUserInformation()).thenAnswer((_) async { + fakeUser = fakeUser2; + }); + await cAboutProvider.uploadUserInformation(); + + verify(mockAboutService.uploadUserInformation()).called(1); + + expect(fakeUser.toJson(), fakeUser2.toJson()); + }); + + test("should upload the user profile picture", () async { + when(mockAboutService.uploadProfilePicture(any)).thenAnswer((_) async => {}); + await cAboutProvider.uploadProfilePicture("", ""); + + verify(mockAboutService.uploadProfilePicture(any)).called(1); + }); + + test("should send a support email", () async { + when(mockAboutService.sendSupportEmail()).thenAnswer((_) async => true); + await cAboutProvider.sendSupportEmail(); + verify(mockAboutService.sendSupportEmail()).called(1); + }); + + test("should upload user information", () async { + when(mockAboutService.uploadUserInformation()).thenAnswer((_) async => fakeUser); + await cAboutProvider.uploadUserInformation(); + verify(mockAboutService.uploadUserInformation()).called(1); + }); +} diff --git a/test/Providers/about/about_test.mocks.dart b/test/providers/about/about_test.mocks.dart similarity index 69% rename from test/Providers/about/about_test.mocks.dart rename to test/providers/about/about_test.mocks.dart index 8f77f103..81fe46d1 100644 --- a/test/Providers/about/about_test.mocks.dart +++ b/test/providers/about/about_test.mocks.dart @@ -1,5 +1,5 @@ -// Mocks generated by Mockito 5.3.2 from annotations -// in ottaa_project_flutter/test/Providers/about/about_test.dart. +// Mocks generated by Mockito 5.4.0 from annotations +// in ottaa_project_flutter/test/providers/about/about_test.dart. // Do not manually edit this file. // ignore_for_file: no_leading_underscores_for_library_prefixes @@ -9,8 +9,10 @@ import 'package:either_dart/either.dart' as _i2; import 'package:mockito/mockito.dart' as _i1; import 'package:ottaa_project_flutter/application/service/about_service.dart' as _i3; -import 'package:ottaa_project_flutter/core/enums/user_types.dart' as _i5; -import 'package:ottaa_project_flutter/core/models/user_model.dart' as _i6; +import 'package:ottaa_project_flutter/core/abstracts/user_model.dart' as _i7; +import 'package:ottaa_project_flutter/core/enums/user_payment.dart' as _i5; +import 'package:ottaa_project_flutter/core/enums/user_types.dart' as _i8; +import 'package:ottaa_project_flutter/core/models/assets_image.dart' as _i6; // ignore_for_file: type=lint // ignore_for_file: avoid_redundant_argument_values @@ -74,13 +76,13 @@ class MockAboutService extends _i1.Mock implements _i3.AboutService { returnValue: _i4.Future.value(''), ) as _i4.Future); @override - _i4.Future<_i5.UserType> getUserType() => (super.noSuchMethod( + _i4.Future<_i5.UserPayment> getUserType() => (super.noSuchMethod( Invocation.method( #getUserType, [], ), - returnValue: _i4.Future<_i5.UserType>.value(_i5.UserType.free), - ) as _i4.Future<_i5.UserType>); + returnValue: _i4.Future<_i5.UserPayment>.value(_i5.UserPayment.free), + ) as _i4.Future<_i5.UserPayment>); @override _i4.Future sendSupportEmail() => (super.noSuchMethod( Invocation.method( @@ -99,30 +101,31 @@ class MockAboutService extends _i1.Mock implements _i3.AboutService { returnValue: _i4.Future.value(''), ) as _i4.Future); @override - _i4.Future uploadProfilePicture(String? photo) => (super.noSuchMethod( + _i4.Future uploadProfilePicture(_i6.AssetsImage? image) => + (super.noSuchMethod( Invocation.method( #uploadProfilePicture, - [photo], + [image], ), returnValue: _i4.Future.value(), returnValueForMissingStub: _i4.Future.value(), ) as _i4.Future); @override - _i4.Future<_i2.Either> getUserInformation() => + _i4.Future<_i2.Either> getUserInformation() => (super.noSuchMethod( Invocation.method( #getUserInformation, [], ), - returnValue: _i4.Future<_i2.Either>.value( - _FakeEither_0( + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( this, Invocation.method( #getUserInformation, [], ), )), - ) as _i4.Future<_i2.Either>); + ) as _i4.Future<_i2.Either>); @override _i4.Future uploadUserInformation() => (super.noSuchMethod( Invocation.method( @@ -148,4 +151,38 @@ class MockAboutService extends _i1.Mock implements _i3.AboutService { ), returnValue: _i4.Future.value(false), ) as _i4.Future); + @override + _i4.Future updateUserType({ + required String? id, + required _i8.UserType? userType, + }) => + (super.noSuchMethod( + Invocation.method( + #updateUserType, + [], + { + #id: id, + #userType: userType, + }, + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future updateUserLastConnectionTime({ + required String? userId, + required int? time, + }) => + (super.noSuchMethod( + Invocation.method( + #updateUserLastConnectionTime, + [], + { + #userId: userId, + #time: time, + }, + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); } diff --git a/test/providers/customise/customise_provider_test.dart b/test/providers/customise/customise_provider_test.dart new file mode 100644 index 00000000..4a1111a9 --- /dev/null +++ b/test/providers/customise/customise_provider_test.dart @@ -0,0 +1,373 @@ +import 'dart:ui'; + +import 'package:either_dart/either.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:get_it/get_it.dart'; +import 'package:mockito/annotations.dart'; +import 'package:mockito/mockito.dart'; +import 'package:ottaa_project_flutter/application/common/i18n.dart'; + +import 'package:ottaa_project_flutter/application/providers/customise_provider.dart'; +import 'package:ottaa_project_flutter/application/providers/user_provider.dart'; +import 'package:ottaa_project_flutter/core/abstracts/user_model.dart'; +import 'package:ottaa_project_flutter/core/enums/user_types.dart'; +import 'package:ottaa_project_flutter/core/models/accessibility_setting.dart'; +import 'package:ottaa_project_flutter/core/models/assets_image.dart'; +import 'package:ottaa_project_flutter/core/models/base_settings_model.dart'; +import 'package:ottaa_project_flutter/core/models/base_user_model.dart'; +import 'package:ottaa_project_flutter/core/models/group_model.dart'; +import 'package:ottaa_project_flutter/core/models/language_setting.dart'; +import 'package:ottaa_project_flutter/core/models/layout_setting.dart'; +import 'package:ottaa_project_flutter/core/models/patient_user_model.dart'; +import 'package:ottaa_project_flutter/core/models/payment_model.dart'; +import 'package:ottaa_project_flutter/core/models/picto_model.dart'; +import 'package:ottaa_project_flutter/core/models/shortcuts_model.dart'; +import 'package:ottaa_project_flutter/core/models/tts_setting.dart'; +import 'package:ottaa_project_flutter/core/models/user_data_model.dart'; +import 'package:ottaa_project_flutter/core/repositories/repositories.dart'; +import 'package:ottaa_project_flutter/core/enums/customise_data_type.dart'; + +import 'customise_provider_test.mocks.dart'; + +@GenerateMocks([I18N, LocalDatabaseRepository, CustomiseRepository, GroupsRepository, PictogramsRepository, UserNotifier]) +Future main() async { + late MockI18N mockI18N; + late MockLocalDatabaseRepository mockLocalDatabaseRepository; + late MockCustomiseRepository mockCustomiseRepository; + late MockGroupsRepository mockGroupsRepository; + late MockPictogramsRepository mockPictogramsRepository; + late MockUserNotifier mockUserNotifier; + late CustomiseProvider customiseNotifier; + + late List fakeGroups; + late List fakePictos; + late UserModel fakeUser; + + setUp(() { + mockI18N = MockI18N(); + fakeUser = PatientUserModel( + id: "0", + groups: {}, + phrases: {}, + pictos: {}, + settings: PatientSettings( + payment: Payment.none(), + accessibility: AccessibilitySetting.empty(), + layout: LayoutSetting.empty(), + tts: TTSSetting.empty(), + data: UserData( + avatar: AssetsImage(asset: "test", network: "https://test.com"), + birthDate: DateTime(0), + genderPref: "n/a", + lastConnection: DateTime(0), + name: "John", + lastName: "Doe", + ), + language: LanguageSetting.empty(), + ), + email: "test@mail.com", + type: UserType.user, + ); + mockLocalDatabaseRepository = MockLocalDatabaseRepository(); + mockCustomiseRepository = MockCustomiseRepository(); + mockGroupsRepository = MockGroupsRepository(); + mockUserNotifier = MockUserNotifier(); + mockPictogramsRepository = MockPictogramsRepository(); + fakeGroups = [ + Group(id: '00', relations: [GroupRelation(id: '00', value: 00), GroupRelation(id: '01', value: 00)], text: 'test1', resource: AssetsImage(asset: 'testAsset', network: 'testNetwork'), freq: 00), + Group(id: '01', relations: [GroupRelation(id: '', value: 00)], text: 'test2', resource: AssetsImage(asset: 'testAsset', network: 'testNetwork'), freq: 01), + Group(id: '02', relations: [GroupRelation(id: '', value: 00)], text: 'test3', resource: AssetsImage(asset: 'testAsset', network: 'testNetwork'), freq: 03), + ]; + fakePictos = [ + Picto(id: '00', type: 0, resource: AssetsImage(asset: 'testAsset', network: 'testNetwork'), block: true), + Picto(id: '01', type: 1, resource: AssetsImage(asset: 'testAsset', network: 'testNetwork'), block: false), + Picto(id: '02', type: 2, resource: AssetsImage(asset: 'testAsset', network: 'testNetwork'), block: true), + ]; + + customiseNotifier = CustomiseProvider(mockPictogramsRepository, mockGroupsRepository, mockCustomiseRepository, mockI18N, mockUserNotifier, mockLocalDatabaseRepository); + customiseNotifier.groups = fakeGroups; + }); + + test('should set group data on to the screen', () async { + const index = 1; + + final provider = customiseNotifier; + + await customiseNotifier.setGroupData(index: index); + + expect(provider.selectedGroup, equals(index)); + expect(provider.selectedGroupImage, equals(fakeGroups[index].resource.network)); + expect(provider.selectedGroupName, equals(fakeGroups[index].text)); + expect(provider.selectedGroupStatus, equals(fakeGroups[index].block)); + expect(provider.hasListeners, isFalse); + }); + + test('should upload the shortcuts for the user', () async { + when(mockCustomiseRepository.setShortcutsForUser(shortcuts: anyNamed('shortcuts'), userId: anyNamed('userId'))).thenAnswer((realInvocation) async => const Right(null)); + + await customiseNotifier.setShortcutsForUser(userId: 'testID'); + + verify(mockCustomiseRepository.setShortcutsForUser(shortcuts: anyNamed('shortcuts'), userId: anyNamed('userId'))); + }); + + test('should change the ', () async { + final provider = customiseNotifier; + provider.groups = fakeGroups; + provider.pictograms = fakePictos; + provider.selectedGroup = 00; + + provider.fetchDesiredPictos(); + + expect(provider.selectedGruposPicts.length, 2); + expect(provider.selectedGruposPicts[0].id, '00'); + expect(provider.selectedGruposPicts[1].id, '01'); + }); + + test('should populate the pictosMap correctly', () async { + final pictograms = fakePictos; + + final provider = customiseNotifier; + + provider.pictograms = pictograms; + + provider.createMapForPictos(); + + expect(provider.pictosMap.length, 3); + expect(provider.pictosMap['00'], 0); + expect(provider.pictosMap['01'], 0); + expect(provider.pictosMap['02'], 0); + }); + + test('should fetch and assign default groups', () async { + final expectedGroups = fakeGroups; + const mockLocale = Locale('es_AR'); + + when(mockI18N.currentLocale).thenReturn(mockLocale); + when(mockCustomiseRepository.fetchDefaultGroups(languageCode: anyNamed('languageCode'))).thenAnswer((_) async => expectedGroups); + + await customiseNotifier.getDefaultGroups(); + + expect(customiseNotifier.groups, expectedGroups); + verify(mockCustomiseRepository.fetchDefaultGroups(languageCode: mockLocale.toString())).called(1); + }); + + test('should fetch and assign default Pictos', () async { + final expectedPictos = fakePictos; + const mockLocale = Locale('es_AR'); + + when(mockI18N.currentLocale).thenReturn(mockLocale); + when(mockCustomiseRepository.fetchDefaultPictos(languageCode: anyNamed('languageCode'))).thenAnswer((_) async => expectedPictos); + + await customiseNotifier.getDefaultPictos(); + + expect(customiseNotifier.pictograms, expectedPictos); + verify(mockCustomiseRepository.fetchDefaultPictos(languageCode: mockLocale.toString())).called(1); + }); + + test('block should toggle the block status and notify listeners', () async { + // Arrange + final selectedGruposPicts = fakePictos; + final pictograms = fakePictos; + final pictosMap = { + '01': 00, + '02': 01, + '03': 02, + }; + customiseNotifier.selectedGruposPicts = selectedGruposPicts; + customiseNotifier.pictograms = pictograms; + customiseNotifier.pictosMap = pictosMap; + + const index = 1; + + customiseNotifier.block(index: index); + + expect(customiseNotifier.selectedGruposPicts[index].block, true); + expect(customiseNotifier.pictograms[customiseNotifier.pictosMap[customiseNotifier.selectedGruposPicts[index].id]!].block, false); + }); + + test('fetchShortcutsForUser should populate selectedShortcuts correctly', () async { + customiseNotifier.selectedShortcuts = List.generate(8, (index) => false); + final expectedFavourite = customiseNotifier.selectedShortcuts[0]; + final expectedHistory = customiseNotifier.selectedShortcuts[1]; + final expectedCamera = customiseNotifier.selectedShortcuts[2]; + final expectedGames = customiseNotifier.selectedShortcuts[3]; + final expectedYes = customiseNotifier.selectedShortcuts[4]; + final expectedNo = customiseNotifier.selectedShortcuts[5]; + final expectedShare = customiseNotifier.selectedShortcuts[6]; + final expectedEnabled = customiseNotifier.selectedShortcuts[7]; + final expectedResponse = ShortcutsModel( + favs: expectedFavourite, + history: expectedHistory, + camera: expectedCamera, + games: expectedGames, + yes: expectedYes, + no: expectedNo, + share: expectedShare, + enable: expectedEnabled, + ); + + when(mockCustomiseRepository.fetchShortcutsForUser(userId: anyNamed('userId'))).thenAnswer((realInvocation) async => expectedResponse); + + await customiseNotifier.fetchShortcutsForUser(userId: 'mockUserId'); + + expect(customiseNotifier.selectedShortcuts[0], expectedFavourite); + expect(customiseNotifier.selectedShortcuts[1], expectedHistory); + expect(customiseNotifier.selectedShortcuts[2], expectedCamera); + expect(customiseNotifier.selectedShortcuts[3], expectedGames); + expect(customiseNotifier.selectedShortcuts[4], expectedYes); + expect(customiseNotifier.selectedShortcuts[5], expectedNo); + expect(customiseNotifier.selectedShortcuts[6], expectedShare); + }); + + test('should fetch and assign user groups', () async { + final expectedGroups = fakeGroups; + const mockLocale = Locale('es_AR'); + + when(mockI18N.currentLocale).thenReturn(mockLocale); + when(mockCustomiseRepository.fetchUserGroups(languageCode: anyNamed('languageCode'), userId: anyNamed('userId'))).thenAnswer((_) async => expectedGroups); + + await customiseNotifier.fetchUserGroups(userId: 'mockUserId'); + + expect(customiseNotifier.groups, expectedGroups); + }); + + test('should fetch and assign user pictos', () async { + final expectedPictos = fakePictos; + const mockLocale = Locale('es_AR'); + + when(mockI18N.currentLocale).thenReturn(mockLocale); + when(mockCustomiseRepository.fetchUserPictos(languageCode: anyNamed('languageCode'), userId: anyNamed('userId'))).thenAnswer((_) async => expectedPictos); + + await customiseNotifier.fetchUserPictos(userId: 'mockUserId'); + + expect(customiseNotifier.pictograms, expectedPictos); + }); + + test('should return true if values exist, false otherwise', () async { + final expectedValue = true; + final mockLocale = Locale('en'); + final mockUserId = 'mockUserId'; + + when(mockI18N.currentLocale).thenReturn(mockLocale); + when(mockCustomiseRepository.valuesExistOrNot( + languageCode: anyNamed('languageCode'), + userId: anyNamed('userId'), + )).thenAnswer((_) async => expectedValue); + + final result = await customiseNotifier.dataExistOrNot(userId: mockUserId); + + expect(result, expectedValue); + verify(mockCustomiseRepository.valuesExistOrNot( + languageCode: '${mockLocale.languageCode}_${mockLocale.countryCode}', + userId: mockUserId, + )).called(1); + }); + + test('should call notifyListeners', () { + customiseNotifier.notify(); + + expect(() => customiseNotifier.notify(), isA()); + }); + + group("init", () { + test("should init with user or caregiver", () async { + when(mockCustomiseRepository.fetchShortcutsForUser(userId: anyNamed("userId"))).thenAnswer((realInvocation) async { + return ShortcutsModel.all(); + }); + + when(mockCustomiseRepository.fetchUserGroups(languageCode: anyNamed("languageCode"), userId: anyNamed("userId"))).thenAnswer((realInvocation) async { + return fakeGroups; + }); + + when(mockCustomiseRepository.fetchUserPictos(languageCode: anyNamed("languageCode"), userId: anyNamed("userId"))).thenAnswer((realInvocation) async { + return fakePictos; + }); + + when(mockI18N.currentLocale).thenReturn(const Locale("en", "US")); + + customiseNotifier.type = CustomiseDataType.user; + await customiseNotifier.inIt(userId: "mockUserId"); + + verify(mockCustomiseRepository.fetchShortcutsForUser(userId: "mockUserId")).called(1); + verify(mockCustomiseRepository.fetchUserGroups(languageCode: "en_US", userId: "mockUserId")).called(1); + verify(mockCustomiseRepository.fetchUserPictos(languageCode: "en_US", userId: "mockUserId")).called(1); + }); + + test("should init with default case", () async { + when(mockI18N.currentLocale).thenReturn(const Locale("en", "US")); + + when(mockCustomiseRepository.fetchDefaultGroups(languageCode: anyNamed("languageCode"))).thenAnswer((realInvocation) async { + return fakeGroups; + }); + + when(mockCustomiseRepository.fetchDefaultPictos(languageCode: anyNamed("languageCode"))).thenAnswer((realInvocation) async { + return fakePictos; + }); + + await customiseNotifier.inIt(userId: "mockUserId"); + + expect(customiseNotifier.pictosMap.length, greaterThan(1)); + verify(mockCustomiseRepository.fetchDefaultGroups(languageCode: "en_US")).called(1); + verify(mockCustomiseRepository.fetchDefaultPictos(languageCode: "en_US")).called(1); + }); + + test("should init with default case", () async { + when(mockI18N.currentLocale).thenReturn(const Locale("en", "US")); + + when(mockCustomiseRepository.fetchDefaultGroups(languageCode: anyNamed("languageCode"))).thenAnswer((realInvocation) async { + return fakeGroups; + }); + + when(mockCustomiseRepository.fetchDefaultPictos(languageCode: anyNamed("languageCode"))).thenAnswer((realInvocation) async { + return fakePictos; + }); + + customiseNotifier.dataExist = false; + + await customiseNotifier.inIt(userId: "mockUserId"); + + expect(customiseNotifier.pictosMap.length, greaterThan(1)); + verify(mockCustomiseRepository.fetchDefaultGroups(languageCode: "en_US")).called(1); + verify(mockCustomiseRepository.fetchDefaultPictos(languageCode: "en_US")).called(1); + }); + }); + + test("should upload data", () async { + when(mockI18N.currentLocale).thenReturn(const Locale("en", "US")); + + when(mockPictogramsRepository.uploadPictograms(any, any, userId: anyNamed("userId"))).thenAnswer((realInvocation) async {}); + when(mockGroupsRepository.uploadGroups(any, any, any, userId: anyNamed("userId"))).thenAnswer((realInvocation) async {}); + + when(mockCustomiseRepository.setShortcutsForUser(shortcuts: anyNamed("shortcuts"), userId: anyNamed("userId"))).thenAnswer((realInvocation) async => Right(null)); + + when(mockLocalDatabaseRepository.setUser(any)).thenAnswer((realInvocation) async {}); + + when(mockUserNotifier.setUser(any)).thenAnswer((realInvocation) {}); + + when(mockUserNotifier.user).thenReturn(fakeUser); + + await customiseNotifier.uploadData(userId: "", savePictograms: true, saveGroups: true, saveShortcuts: true); + + verify(mockPictogramsRepository.uploadPictograms(any, any, userId: anyNamed("userId"))).called(1); + verify(mockGroupsRepository.uploadGroups(any, any, any, userId: anyNamed("userId"))).called(1); + verify(mockCustomiseRepository.setShortcutsForUser(shortcuts: anyNamed("shortcuts"), userId: anyNamed("userId"))).called(1); + verify(mockLocalDatabaseRepository.setUser(any)).called(1); + verify(mockUserNotifier.setUser(any)).called(1); + + expect(customiseNotifier.dataExist, true); + }); + + test("Should return customise Provider", () { + GetIt.I.registerSingleton(mockCustomiseRepository); + GetIt.I.registerSingleton(mockPictogramsRepository); + GetIt.I.registerSingleton(mockGroupsRepository); + GetIt.I.registerSingleton(mockLocalDatabaseRepository); + GetIt.I.registerSingleton(mockI18N); + final container = ProviderContainer(); + + final refProvider = container.read(customiseProvider); + + expect(refProvider, isA()); + }); +} diff --git a/test/providers/customise/customise_provider_test.mocks.dart b/test/providers/customise/customise_provider_test.mocks.dart new file mode 100644 index 00000000..daba42b2 --- /dev/null +++ b/test/providers/customise/customise_provider_test.mocks.dart @@ -0,0 +1,683 @@ +// Mocks generated by Mockito 5.4.0 from annotations +// in ottaa_project_flutter/test/providers/customise/customise_provider_test.dart. +// Do not manually edit this file. + +// ignore_for_file: no_leading_underscores_for_library_prefixes +import 'dart:async' as _i6; +import 'dart:ui' as _i2; + +import 'package:either_dart/src/either.dart' as _i4; +import 'package:mockito/mockito.dart' as _i1; +import 'package:ottaa_project_flutter/application/common/i18n.dart' as _i3; +import 'package:ottaa_project_flutter/application/language/translation_tree.dart' + as _i7; +import 'package:ottaa_project_flutter/application/providers/user_provider.dart' + as _i16; +import 'package:ottaa_project_flutter/core/abstracts/basic_search.dart' as _i14; +import 'package:ottaa_project_flutter/core/abstracts/user_model.dart' as _i9; +import 'package:ottaa_project_flutter/core/models/group_model.dart' as _i11; +import 'package:ottaa_project_flutter/core/models/picto_model.dart' as _i12; +import 'package:ottaa_project_flutter/core/models/shortcuts_model.dart' as _i5; +import 'package:ottaa_project_flutter/core/repositories/customise_repository.dart' + as _i10; +import 'package:ottaa_project_flutter/core/repositories/groups_repository.dart' + as _i13; +import 'package:ottaa_project_flutter/core/repositories/local_database_repository.dart' + as _i8; +import 'package:ottaa_project_flutter/core/repositories/pictograms_repository.dart' + as _i15; + +// ignore_for_file: type=lint +// ignore_for_file: avoid_redundant_argument_values +// ignore_for_file: avoid_setters_without_getters +// ignore_for_file: comment_references +// ignore_for_file: implementation_imports +// ignore_for_file: invalid_use_of_visible_for_testing_member +// ignore_for_file: prefer_const_constructors +// ignore_for_file: unnecessary_parenthesis +// ignore_for_file: camel_case_types +// ignore_for_file: subtype_of_sealed_class + +class _FakeLocale_0 extends _i1.SmartFake implements _i2.Locale { + _FakeLocale_0( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeI18N_1 extends _i1.SmartFake implements _i3.I18N { + _FakeI18N_1( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeEither_2 extends _i1.SmartFake implements _i4.Either { + _FakeEither_2( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeShortcutsModel_3 extends _i1.SmartFake + implements _i5.ShortcutsModel { + _FakeShortcutsModel_3( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +/// A class which mocks [I18N]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockI18N extends _i1.Mock implements _i3.I18N { + MockI18N() { + _i1.throwOnMissingStub(this); + } + + @override + Map get platformLanguages => (super.noSuchMethod( + Invocation.getter(#platformLanguages), + returnValue: {}, + ) as Map); + @override + _i2.Locale get currentLocale => (super.noSuchMethod( + Invocation.getter(#currentLocale), + returnValue: _FakeLocale_0( + this, + Invocation.getter(#currentLocale), + ), + ) as _i2.Locale); + @override + set currentLocale(_i2.Locale? _currentLocale) => super.noSuchMethod( + Invocation.setter( + #currentLocale, + _currentLocale, + ), + returnValueForMissingStub: null, + ); + @override + bool get hasListeners => (super.noSuchMethod( + Invocation.getter(#hasListeners), + returnValue: false, + ) as bool); + @override + _i6.Future<_i3.I18N> init() => (super.noSuchMethod( + Invocation.method( + #init, + [], + ), + returnValue: _i6.Future<_i3.I18N>.value(_FakeI18N_1( + this, + Invocation.method( + #init, + [], + ), + )), + ) as _i6.Future<_i3.I18N>); + @override + _i6.Future<_i7.TranslationTree?> loadTranslation(_i2.Locale? locale) => + (super.noSuchMethod( + Invocation.method( + #loadTranslation, + [locale], + ), + returnValue: _i6.Future<_i7.TranslationTree?>.value(), + ) as _i6.Future<_i7.TranslationTree?>); + @override + _i6.Future changeLanguage(String? languageCode) => (super.noSuchMethod( + Invocation.method( + #changeLanguage, + [languageCode], + ), + returnValue: _i6.Future.value(), + returnValueForMissingStub: _i6.Future.value(), + ) as _i6.Future); + @override + _i6.Future changeLanguageFromLocale(_i2.Locale? locale) => + (super.noSuchMethod( + Invocation.method( + #changeLanguageFromLocale, + [locale], + ), + returnValue: _i6.Future.value(), + returnValueForMissingStub: _i6.Future.value(), + ) as _i6.Future); + @override + void notify() => super.noSuchMethod( + Invocation.method( + #notify, + [], + ), + returnValueForMissingStub: null, + ); + @override + void addListener(_i2.VoidCallback? listener) => super.noSuchMethod( + Invocation.method( + #addListener, + [listener], + ), + returnValueForMissingStub: null, + ); + @override + void removeListener(_i2.VoidCallback? listener) => super.noSuchMethod( + Invocation.method( + #removeListener, + [listener], + ), + returnValueForMissingStub: null, + ); + @override + void dispose() => super.noSuchMethod( + Invocation.method( + #dispose, + [], + ), + returnValueForMissingStub: null, + ); + @override + void notifyListeners() => super.noSuchMethod( + Invocation.method( + #notifyListeners, + [], + ), + returnValueForMissingStub: null, + ); +} + +/// A class which mocks [LocalDatabaseRepository]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockLocalDatabaseRepository extends _i1.Mock + implements _i8.LocalDatabaseRepository { + MockLocalDatabaseRepository() { + _i1.throwOnMissingStub(this); + } + + @override + set user(_i9.UserModel? user) => super.noSuchMethod( + Invocation.setter( + #user, + user, + ), + returnValueForMissingStub: null, + ); + @override + _i6.Future init() => (super.noSuchMethod( + Invocation.method( + #init, + [], + ), + returnValue: _i6.Future.value(), + returnValueForMissingStub: _i6.Future.value(), + ) as _i6.Future); + @override + _i6.Future close() => (super.noSuchMethod( + Invocation.method( + #close, + [], + ), + returnValue: _i6.Future.value(), + returnValueForMissingStub: _i6.Future.value(), + ) as _i6.Future); + @override + _i6.Future setUser(_i9.UserModel? user) => (super.noSuchMethod( + Invocation.method( + #setUser, + [user], + ), + returnValue: _i6.Future.value(), + returnValueForMissingStub: _i6.Future.value(), + ) as _i6.Future); + @override + _i6.Future<_i9.UserModel?> getUser() => (super.noSuchMethod( + Invocation.method( + #getUser, + [], + ), + returnValue: _i6.Future<_i9.UserModel?>.value(), + ) as _i6.Future<_i9.UserModel?>); + @override + _i6.Future deleteUser() => (super.noSuchMethod( + Invocation.method( + #deleteUser, + [], + ), + returnValue: _i6.Future.value(), + returnValueForMissingStub: _i6.Future.value(), + ) as _i6.Future); + @override + _i6.Future getIntro() => (super.noSuchMethod( + Invocation.method( + #getIntro, + [], + ), + returnValue: _i6.Future.value(false), + ) as _i6.Future); + @override + _i6.Future setIntro([bool? value]) => (super.noSuchMethod( + Invocation.method( + #setIntro, + [value], + ), + returnValue: _i6.Future.value(), + returnValueForMissingStub: _i6.Future.value(), + ) as _i6.Future); + @override + _i6.Future getVoice() => (super.noSuchMethod( + Invocation.method( + #getVoice, + [], + ), + returnValue: _i6.Future.value(''), + ) as _i6.Future); + @override + _i6.Future getLongClick() => (super.noSuchMethod( + Invocation.method( + #getLongClick, + [], + ), + returnValue: _i6.Future.value(false), + ) as _i6.Future); + @override + _i6.Future setLongClick({required bool? isLongClick}) => + (super.noSuchMethod( + Invocation.method( + #setLongClick, + [], + {#isLongClick: isLongClick}, + ), + returnValue: _i6.Future.value(), + returnValueForMissingStub: _i6.Future.value(), + ) as _i6.Future); + @override + _i6.Future setVoice({required String? name}) => (super.noSuchMethod( + Invocation.method( + #setVoice, + [], + {#name: name}, + ), + returnValue: _i6.Future.value(), + returnValueForMissingStub: _i6.Future.value(), + ) as _i6.Future); + @override + _i6.Future setAppleUserDara({required Map? data}) => + (super.noSuchMethod( + Invocation.method( + #setAppleUserDara, + [], + {#data: data}, + ), + returnValue: _i6.Future.value(), + returnValueForMissingStub: _i6.Future.value(), + ) as _i6.Future); + @override + _i6.Future> getAppleUserData() => (super.noSuchMethod( + Invocation.method( + #getAppleUserData, + [], + ), + returnValue: _i6.Future>.value({}), + ) as _i6.Future>); +} + +/// A class which mocks [CustomiseRepository]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockCustomiseRepository extends _i1.Mock + implements _i10.CustomiseRepository { + MockCustomiseRepository() { + _i1.throwOnMissingStub(this); + } + + @override + _i6.Future<_i4.Either> setShortcutsForUser({ + required _i5.ShortcutsModel? shortcuts, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #setShortcutsForUser, + [], + { + #shortcuts: shortcuts, + #userId: userId, + }, + ), + returnValue: _i6.Future<_i4.Either>.value( + _FakeEither_2( + this, + Invocation.method( + #setShortcutsForUser, + [], + { + #shortcuts: shortcuts, + #userId: userId, + }, + ), + )), + ) as _i6.Future<_i4.Either>); + @override + _i6.Future> fetchDefaultGroups( + {required String? languageCode}) => + (super.noSuchMethod( + Invocation.method( + #fetchDefaultGroups, + [], + {#languageCode: languageCode}, + ), + returnValue: _i6.Future>.value(<_i11.Group>[]), + ) as _i6.Future>); + @override + _i6.Future> fetchDefaultPictos( + {required String? languageCode}) => + (super.noSuchMethod( + Invocation.method( + #fetchDefaultPictos, + [], + {#languageCode: languageCode}, + ), + returnValue: _i6.Future>.value(<_i12.Picto>[]), + ) as _i6.Future>); + @override + _i6.Future<_i5.ShortcutsModel> fetchShortcutsForUser( + {required String? userId}) => + (super.noSuchMethod( + Invocation.method( + #fetchShortcutsForUser, + [], + {#userId: userId}, + ), + returnValue: _i6.Future<_i5.ShortcutsModel>.value(_FakeShortcutsModel_3( + this, + Invocation.method( + #fetchShortcutsForUser, + [], + {#userId: userId}, + ), + )), + ) as _i6.Future<_i5.ShortcutsModel>); + @override + _i6.Future> fetchUserGroups({ + required String? languageCode, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #fetchUserGroups, + [], + { + #languageCode: languageCode, + #userId: userId, + }, + ), + returnValue: _i6.Future>.value(<_i11.Group>[]), + ) as _i6.Future>); + @override + _i6.Future> fetchUserPictos({ + required String? languageCode, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #fetchUserPictos, + [], + { + #languageCode: languageCode, + #userId: userId, + }, + ), + returnValue: _i6.Future>.value(<_i12.Picto>[]), + ) as _i6.Future>); + @override + _i6.Future valuesExistOrNot({ + required String? languageCode, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #valuesExistOrNot, + [], + { + #languageCode: languageCode, + #userId: userId, + }, + ), + returnValue: _i6.Future.value(false), + ) as _i6.Future); +} + +/// A class which mocks [GroupsRepository]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockGroupsRepository extends _i1.Mock implements _i13.GroupsRepository { + MockGroupsRepository() { + _i1.throwOnMissingStub(this); + } + + @override + _i6.Future> getAllGroups({bool? defaultGroups = false}) => + (super.noSuchMethod( + Invocation.method( + #getAllGroups, + [], + {#defaultGroups: defaultGroups}, + ), + returnValue: _i6.Future>.value(<_i11.Group>[]), + ) as _i6.Future>); + @override + _i6.Future> getDefaultGroups() => (super.noSuchMethod( + Invocation.method( + #getDefaultGroups, + [], + ), + returnValue: _i6.Future>.value(<_i11.Group>[]), + ) as _i6.Future>); + @override + _i6.Future uploadGroups( + List<_i11.Group>? data, + String? type, + String? language, { + String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #uploadGroups, + [ + data, + type, + language, + ], + {#userId: userId}, + ), + returnValue: _i6.Future.value(), + returnValueForMissingStub: _i6.Future.value(), + ) as _i6.Future); + @override + _i6.Future updateGroups( + _i11.Group? data, + String? type, + String? language, + int? index, + ) => + (super.noSuchMethod( + Invocation.method( + #updateGroups, + [ + data, + type, + language, + index, + ], + ), + returnValue: _i6.Future.value(), + returnValueForMissingStub: _i6.Future.value(), + ) as _i6.Future); + @override + _i6.Future> getGroups(_i14.BasicSearch? search) => + (super.noSuchMethod( + Invocation.method( + #getGroups, + [search], + ), + returnValue: _i6.Future>.value(<_i11.Group>[]), + ) as _i6.Future>); +} + +/// A class which mocks [PictogramsRepository]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockPictogramsRepository extends _i1.Mock + implements _i15.PictogramsRepository { + MockPictogramsRepository() { + _i1.throwOnMissingStub(this); + } + + @override + _i6.Future> getAllPictograms() => (super.noSuchMethod( + Invocation.method( + #getAllPictograms, + [], + ), + returnValue: _i6.Future>.value(<_i12.Picto>[]), + ) as _i6.Future>); + @override + _i6.Future uploadPictograms( + List<_i12.Picto>? data, + String? language, { + String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #uploadPictograms, + [ + data, + language, + ], + {#userId: userId}, + ), + returnValue: _i6.Future.value(), + returnValueForMissingStub: _i6.Future.value(), + ) as _i6.Future); + @override + _i6.Future updatePictogram( + _i12.Picto? pictogram, + String? language, + int? index, + ) => + (super.noSuchMethod( + Invocation.method( + #updatePictogram, + [ + pictogram, + language, + index, + ], + ), + returnValue: _i6.Future.value(), + returnValueForMissingStub: _i6.Future.value(), + ) as _i6.Future); + @override + _i6.Future> getPictograms(_i14.BasicSearch? search) => + (super.noSuchMethod( + Invocation.method( + #getPictograms, + [search], + ), + returnValue: _i6.Future>.value(<_i12.Picto>[]), + ) as _i6.Future>); + @override + _i6.Future> loadTranslations( + {required String? language}) => + (super.noSuchMethod( + Invocation.method( + #loadTranslations, + [], + {#language: language}, + ), + returnValue: _i6.Future>.value({}), + ) as _i6.Future>); +} + +/// A class which mocks [UserNotifier]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockUserNotifier extends _i1.Mock implements _i16.UserNotifier { + MockUserNotifier() { + _i1.throwOnMissingStub(this); + } + + @override + set user(_i9.UserModel? userModel) => super.noSuchMethod( + Invocation.setter( + #user, + userModel, + ), + returnValueForMissingStub: null, + ); + @override + bool get hasListeners => (super.noSuchMethod( + Invocation.getter(#hasListeners), + returnValue: false, + ) as bool); + @override + void setUser(_i9.UserModel? userModel) => super.noSuchMethod( + Invocation.method( + #setUser, + [userModel], + ), + returnValueForMissingStub: null, + ); + @override + void clearUser() => super.noSuchMethod( + Invocation.method( + #clearUser, + [], + ), + returnValueForMissingStub: null, + ); + @override + void addListener(_i2.VoidCallback? listener) => super.noSuchMethod( + Invocation.method( + #addListener, + [listener], + ), + returnValueForMissingStub: null, + ); + @override + void removeListener(_i2.VoidCallback? listener) => super.noSuchMethod( + Invocation.method( + #removeListener, + [listener], + ), + returnValueForMissingStub: null, + ); + @override + void dispose() => super.noSuchMethod( + Invocation.method( + #dispose, + [], + ), + returnValueForMissingStub: null, + ); + @override + void notifyListeners() => super.noSuchMethod( + Invocation.method( + #notifyListeners, + [], + ), + returnValueForMissingStub: null, + ); +} diff --git a/test/providers/games/chat_gpt_game_provider_test.dart b/test/providers/games/chat_gpt_game_provider_test.dart new file mode 100644 index 00000000..cd8c9b81 --- /dev/null +++ b/test/providers/games/chat_gpt_game_provider_test.dart @@ -0,0 +1,304 @@ +import 'package:either_dart/either.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:get_it/get_it.dart'; +import 'package:just_audio/just_audio.dart'; +import 'package:mockito/annotations.dart'; +import 'package:mockito/mockito.dart'; +import 'package:ottaa_project_flutter/application/common/i18n.dart'; +import 'package:ottaa_project_flutter/application/language/translation_tree.dart'; +import 'package:ottaa_project_flutter/application/providers/chat_gpt_game_provider.dart'; +import 'package:ottaa_project_flutter/application/providers/games_provider.dart'; +import 'package:ottaa_project_flutter/application/providers/tts_provider.dart'; +import 'package:ottaa_project_flutter/core/models/assets_image.dart'; +import 'package:ottaa_project_flutter/core/models/group_model.dart'; +import 'package:ottaa_project_flutter/core/models/picto_model.dart'; +import 'package:ottaa_project_flutter/core/repositories/repositories.dart'; +import '../../service/chatGPT/chatgpt_service_test.mocks.dart'; +import 'chat_gpt_game_provider_test.mocks.dart'; + +@GenerateMocks([GamesProvider, ChatGPTRepository, TTSProvider, AudioPlayer]) +Future main() async { + late MockGamesProvider mockGamesProvider; + late MockChatGPTRepository mockChatGPTRepository; + late MockTTSProvider mockTTSProvider; + late MockAudioPlayer mockAudioPlayer; + + late ChatGptGameProvider refChatGptGameProvider; + + late List fakePictos; + + MockI18N mockI18N = MockI18N(); + + GetIt.I.registerSingleton(mockI18N); + + setUp(() { + mockChatGPTRepository = MockChatGPTRepository(); + mockGamesProvider = MockGamesProvider(); + mockTTSProvider = MockTTSProvider(); + mockAudioPlayer = MockAudioPlayer(); + + fakePictos = [ + Picto(id: '0', type: 0, resource: AssetsImage(asset: 'testAsset', network: 'testNetwork'), block: true, text: 'one'), + Picto(id: '1', type: 1, resource: AssetsImage(asset: 'testAsset', network: 'testNetwork'), block: false, text: 'two'), + Picto(id: '2', type: 2, resource: AssetsImage(asset: 'testAsset', network: 'testNetwork'), block: true, text: 'three'), + Picto(id: '3', type: 2, resource: AssetsImage(asset: 'testAsset', network: 'testNetwork'), block: true, text: 'four'), + ]; + + when(mockI18N.currentLanguage).thenReturn(TranslationTree(const Locale("es_AR"))); + refChatGptGameProvider = ChatGptGameProvider(mockChatGPTRepository, mockGamesProvider, mockTTSProvider); + }); + + group('create the story for the chat gpt game', () { + test('should create the story if the resource is given by the chatGptServices', () async { + refChatGptGameProvider.gptPictos = fakePictos; + + when(mockChatGPTRepository.getGPTStory(prompt: anyNamed('prompt'))).thenAnswer((realInvocation) async => const Right('fake')); + await refChatGptGameProvider.createStory(); + expect(refChatGptGameProvider.generatedStory, 'fake'); + }); + + test('should not create the story if the resource is not given by the chatGptServices', () async { + refChatGptGameProvider.gptPictos = fakePictos; + + when(mockChatGPTRepository.getGPTStory(prompt: anyNamed('prompt'))).thenAnswer((realInvocation) async => const Left('fake')); + await refChatGptGameProvider.createStory(); + expect(refChatGptGameProvider.generatedStory, ''); + }); + }); + + test('should reset the game variables being used', () async { + expect(refChatGptGameProvider.gptPictos.length, 0); + expect(refChatGptGameProvider.sentencePhase, 0); + }); + + test('should speak the generated story for the game', () async { + expect(() async => await refChatGptGameProvider.speakStory(), isA()); + }); + + testWidgets('scrollDownBoards should animate to the correct position', (WidgetTester tester) async { + // Initialize the scroll controller + refChatGptGameProvider.boardScrollController = ScrollController(); + + // Build the test widget + await tester.pumpWidget( + MaterialApp( + home: Scaffold( + body: ListView( + controller: refChatGptGameProvider.boardScrollController, + children: [ + Container(height: 100), + Container(height: 100), + Container(height: 100), + Container(height: 100), + Container(height: 100), + ], + ), + ), + ), + ); + final lView = tester.widget(find.byType(ListView)); + final controller = lView.controller; + expect(refChatGptGameProvider.boardScrollController.position.pixels.toInt(), equals(0.0)); + + refChatGptGameProvider.scrollDownBoards(); + controller!.jumpTo(controller.offset + 300); + //todo: emir need your help here + await tester.pump(const Duration(milliseconds: 500)); + expect(controller.offset, equals(300)); + }); + testWidgets('scrollDownPictos should animate to the correct position', (WidgetTester tester) async { + // Initialize the scroll controller + refChatGptGameProvider.pictoScrollController = ScrollController(); + + // Build the test widget + await tester.pumpWidget( + MaterialApp( + home: Scaffold( + body: ListView( + controller: refChatGptGameProvider.pictoScrollController, + children: [ + Container(height: 100), + Container(height: 100), + Container(height: 100), + Container(height: 100), + Container(height: 100), + ], + ), + ), + ), + ); + + final lView = tester.widget(find.byType(ListView)); + final controller = lView.controller; + expect(refChatGptGameProvider.pictoScrollController.position.pixels.toInt(), equals(0.0)); + + refChatGptGameProvider.scrollDownPictos(); + controller!.jumpTo(controller.offset + 300); + //todo: emir need your help here + await tester.pump(const Duration(milliseconds: 500)); + expect(controller.offset, equals(300)); + }); + + testWidgets('scrollUpBoards should animate to the correct position', (WidgetTester tester) async { + final boardScrollController = ScrollController(); + refChatGptGameProvider.boardScrollController = boardScrollController; + + await tester.pumpWidget( + MaterialApp( + home: Scaffold( + body: ListView( + controller: boardScrollController, + children: [ + Container(height: 100), + Container(height: 100), + Container(height: 100), + Container(height: 100), + Container(height: 100), + ], + ), + ), + ), + ); + final lView = tester.widget(find.byType(ListView)); + final controller = lView.controller; + + controller?.jumpTo(400); + + expect(boardScrollController.position.pixels, equals(400.0)); + + controller?.jumpTo(304); + refChatGptGameProvider.scrollUpBoards(); + + expect(controller!.position.pixels, equals(304.0)); + }); + testWidgets('scrollUpPictos should animate to the correct position', (WidgetTester tester) async { + final boardScrollController = ScrollController(); + refChatGptGameProvider.pictoScrollController = boardScrollController; + + await tester.pumpWidget( + MaterialApp( + home: Scaffold( + body: ListView( + controller: boardScrollController, + children: [ + Container(height: 100), + Container(height: 100), + Container(height: 100), + Container(height: 100), + Container(height: 100), + ], + ), + ), + ), + ); + final lView = tester.widget(find.byType(ListView)); + final controller = lView.controller; + + controller?.jumpTo(400); + + expect(boardScrollController.position.pixels, equals(400.0)); + + controller?.jumpTo(304); + refChatGptGameProvider.scrollUpPictos(); + + expect(controller!.position.pixels, equals(304.0)); + }); + + test('should call notify ', () { + int listListenerCallCount = 0; + + refChatGptGameProvider.addListener(() { + listListenerCallCount++; + }); + + expect(listListenerCallCount, 0); + + refChatGptGameProvider.notify(); + + expect(listListenerCallCount, 1); + }); + + test('should stop the tts from speaking', () async { + expect(() async => await refChatGptGameProvider.stopTTS(), isA()); + }); + + test('reset the game story variables', () async { + refChatGptGameProvider.sentencePhase = 3; + refChatGptGameProvider.resetStoryGame(); + expect(refChatGptGameProvider.sentencePhase, 0); + }); + + test("should fetch gpt pictos", () async { + final fakeGroups = { + "1": Group( + id: "1", + relations: [ + GroupRelation(id: "0", value: 1), + ], + text: "1", + resource: AssetsImage(asset: "asset", network: "network"), + freq: 1, + ), + }; + + final fakePictos = { + "0": Picto( + id: '0', + type: 0, + resource: AssetsImage(asset: 'testAsset', network: 'testNetwork'), + block: true, + text: 'one', + ), + }; + + when(mockGamesProvider.groups).thenReturn(fakeGroups); + when(mockGamesProvider.pictograms).thenReturn(fakePictos); + + await refChatGptGameProvider.fetchGptPictos(id: "1"); + + expect(refChatGptGameProvider.chatGptPictos.length, 1); + verify(mockGamesProvider.groups).called(1); + verify(mockGamesProvider.pictograms).called(1); + }); + + group("speak story", () { + test("should speak and pause music", () async { + when(mockGamesProvider.backgroundMusicPlayer).thenReturn(mockAudioPlayer); + when(mockAudioPlayer.playing).thenReturn(true); + + when(mockAudioPlayer.pause()).thenAnswer((_) async => 1); + when(mockTTSProvider.speak(any)).thenAnswer((_) async => 1); + + await refChatGptGameProvider.speakStory(); + + verify(mockGamesProvider.backgroundMusicPlayer).called(2); + verify(mockAudioPlayer.pause()).called(1); + verify(mockTTSProvider.speak(any)).called(1); + }); + }); + + test("should stop tts", () async { + when(mockTTSProvider.ttsStop()).thenAnswer((_) async => 1); + + await refChatGptGameProvider.stopTTS(); + + verify(mockTTSProvider.ttsStop()).called(1); + }); + + test("should return chatGPT game provider", () async { + GetIt.I.registerSingleton(mockChatGPTRepository); + + final container = ProviderContainer( + overrides: [ + gameProvider.overrideWith((ref) => mockGamesProvider), + ttsProvider.overrideWith((ref) => mockTTSProvider), + ], + ); + + final gptProvider = container.read(chatGptGameProvider); + + expect(gptProvider, isA()); + }); +} diff --git a/test/providers/games/chat_gpt_game_provider_test.mocks.dart b/test/providers/games/chat_gpt_game_provider_test.mocks.dart new file mode 100644 index 00000000..78aa9591 --- /dev/null +++ b/test/providers/games/chat_gpt_game_provider_test.mocks.dart @@ -0,0 +1,1433 @@ +// Mocks generated by Mockito 5.4.0 from annotations +// in ottaa_project_flutter/test/providers/games/chat_gpt_game_provider_test.dart. +// Do not manually edit this file. + +// ignore_for_file: no_leading_underscores_for_library_prefixes +import 'dart:async' as _i3; +import 'dart:ui' as _i11; + +import 'package:audio_session/audio_session.dart' as _i14; +import 'package:either_dart/either.dart' as _i6; +import 'package:flutter/material.dart' as _i2; +import 'package:just_audio/just_audio.dart' as _i4; +import 'package:mockito/mockito.dart' as _i1; +import 'package:ottaa_project_flutter/application/notifiers/patient_notifier.dart' + as _i5; +import 'package:ottaa_project_flutter/application/providers/games_provider.dart' + as _i8; +import 'package:ottaa_project_flutter/application/providers/tts_provider.dart' + as _i12; +import 'package:ottaa_project_flutter/core/models/group_model.dart' as _i10; +import 'package:ottaa_project_flutter/core/models/picto_model.dart' as _i9; +import 'package:ottaa_project_flutter/core/models/voices_model.dart' as _i13; +import 'package:ottaa_project_flutter/core/repositories/repositories.dart' + as _i7; + +// ignore_for_file: type=lint +// ignore_for_file: avoid_redundant_argument_values +// ignore_for_file: avoid_setters_without_getters +// ignore_for_file: comment_references +// ignore_for_file: implementation_imports +// ignore_for_file: invalid_use_of_visible_for_testing_member +// ignore_for_file: prefer_const_constructors +// ignore_for_file: unnecessary_parenthesis +// ignore_for_file: camel_case_types +// ignore_for_file: subtype_of_sealed_class + +class _FakePageController_0 extends _i1.SmartFake + implements _i2.PageController { + _FakePageController_0( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeScrollController_1 extends _i1.SmartFake + implements _i2.ScrollController { + _FakeScrollController_1( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeTimer_2 extends _i1.SmartFake implements _i3.Timer { + _FakeTimer_2( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeAudioPlayer_3 extends _i1.SmartFake implements _i4.AudioPlayer { + _FakeAudioPlayer_3( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakePatientNotifier_4 extends _i1.SmartFake + implements _i5.PatientNotifier { + _FakePatientNotifier_4( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeEither_5 extends _i1.SmartFake implements _i6.Either { + _FakeEither_5( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeTTSRepository_6 extends _i1.SmartFake implements _i7.TTSRepository { + _FakeTTSRepository_6( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakePlaybackEvent_7 extends _i1.SmartFake implements _i4.PlaybackEvent { + _FakePlaybackEvent_7( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeDuration_8 extends _i1.SmartFake implements Duration { + _FakeDuration_8( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakePlayerState_9 extends _i1.SmartFake implements _i4.PlayerState { + _FakePlayerState_9( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +/// A class which mocks [GamesProvider]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockGamesProvider extends _i1.Mock implements _i8.GamesProvider { + MockGamesProvider() { + _i1.throwOnMissingStub(this); + } + + @override + int get numberOfGroups => (super.noSuchMethod( + Invocation.getter(#numberOfGroups), + returnValue: 0, + ) as int); + @override + set numberOfGroups(int? _numberOfGroups) => super.noSuchMethod( + Invocation.setter( + #numberOfGroups, + _numberOfGroups, + ), + returnValueForMissingStub: null, + ); + @override + int get completedGroups => (super.noSuchMethod( + Invocation.getter(#completedGroups), + returnValue: 0, + ) as int); + @override + set completedGroups(int? _completedGroups) => super.noSuchMethod( + Invocation.setter( + #completedGroups, + _completedGroups, + ), + returnValueForMissingStub: null, + ); + @override + int get activeGroups => (super.noSuchMethod( + Invocation.getter(#activeGroups), + returnValue: 0, + ) as int); + @override + set activeGroups(int? _activeGroups) => super.noSuchMethod( + Invocation.setter( + #activeGroups, + _activeGroups, + ), + returnValueForMissingStub: null, + ); + @override + int get selectedGame => (super.noSuchMethod( + Invocation.getter(#selectedGame), + returnValue: 0, + ) as int); + @override + set selectedGame(int? _selectedGame) => super.noSuchMethod( + Invocation.setter( + #selectedGame, + _selectedGame, + ), + returnValueForMissingStub: null, + ); + @override + String get selectedGroupName => (super.noSuchMethod( + Invocation.getter(#selectedGroupName), + returnValue: '', + ) as String); + @override + set selectedGroupName(String? _selectedGroupName) => super.noSuchMethod( + Invocation.setter( + #selectedGroupName, + _selectedGroupName, + ), + returnValueForMissingStub: null, + ); + @override + _i2.PageController get mainPageController => (super.noSuchMethod( + Invocation.getter(#mainPageController), + returnValue: _FakePageController_0( + this, + Invocation.getter(#mainPageController), + ), + ) as _i2.PageController); + @override + _i2.ScrollController get gridScrollController => (super.noSuchMethod( + Invocation.getter(#gridScrollController), + returnValue: _FakeScrollController_1( + this, + Invocation.getter(#gridScrollController), + ), + ) as _i2.ScrollController); + @override + set gridScrollController(_i2.ScrollController? _gridScrollController) => + super.noSuchMethod( + Invocation.setter( + #gridScrollController, + _gridScrollController, + ), + returnValueForMissingStub: null, + ); + @override + Map get pictograms => (super.noSuchMethod( + Invocation.getter(#pictograms), + returnValue: {}, + ) as Map); + @override + set pictograms(Map? _pictograms) => super.noSuchMethod( + Invocation.setter( + #pictograms, + _pictograms, + ), + returnValueForMissingStub: null, + ); + @override + Map get groups => (super.noSuchMethod( + Invocation.getter(#groups), + returnValue: {}, + ) as Map); + @override + set groups(Map? _groups) => super.noSuchMethod( + Invocation.setter( + #groups, + _groups, + ), + returnValueForMissingStub: null, + ); + @override + int get correctScore => (super.noSuchMethod( + Invocation.getter(#correctScore), + returnValue: 0, + ) as int); + @override + set correctScore(int? _correctScore) => super.noSuchMethod( + Invocation.setter( + #correctScore, + _correctScore, + ), + returnValueForMissingStub: null, + ); + @override + int get incorrectScore => (super.noSuchMethod( + Invocation.getter(#incorrectScore), + returnValue: 0, + ) as int); + @override + set incorrectScore(int? _incorrectScore) => super.noSuchMethod( + Invocation.setter( + #incorrectScore, + _incorrectScore, + ), + returnValueForMissingStub: null, + ); + @override + List<_i9.Picto> get selectedPicts => (super.noSuchMethod( + Invocation.getter(#selectedPicts), + returnValue: <_i9.Picto>[], + ) as List<_i9.Picto>); + @override + set selectedPicts(List<_i9.Picto>? _selectedPicts) => super.noSuchMethod( + Invocation.setter( + #selectedPicts, + _selectedPicts, + ), + returnValueForMissingStub: null, + ); + @override + int get useTime => (super.noSuchMethod( + Invocation.getter(#useTime), + returnValue: 0, + ) as int); + @override + set useTime(int? _useTime) => super.noSuchMethod( + Invocation.setter( + #useTime, + _useTime, + ), + returnValueForMissingStub: null, + ); + @override + int get streak => (super.noSuchMethod( + Invocation.getter(#streak), + returnValue: 0, + ) as int); + @override + set streak(int? _streak) => super.noSuchMethod( + Invocation.setter( + #streak, + _streak, + ), + returnValueForMissingStub: null, + ); + @override + List get matchPictoTop => (super.noSuchMethod( + Invocation.getter(#matchPictoTop), + returnValue: [], + ) as List); + @override + set matchPictoTop(List? _matchPictoTop) => super.noSuchMethod( + Invocation.setter( + #matchPictoTop, + _matchPictoTop, + ), + returnValueForMissingStub: null, + ); + @override + List get matchPictoBottom => (super.noSuchMethod( + Invocation.getter(#matchPictoBottom), + returnValue: [], + ) as List); + @override + set matchPictoBottom(List? _matchPictoBottom) => super.noSuchMethod( + Invocation.setter( + #matchPictoBottom, + _matchPictoBottom, + ), + returnValueForMissingStub: null, + ); + @override + bool get isMute => (super.noSuchMethod( + Invocation.getter(#isMute), + returnValue: false, + ) as bool); + @override + set isMute(bool? _isMute) => super.noSuchMethod( + Invocation.setter( + #isMute, + _isMute, + ), + returnValueForMissingStub: null, + ); + @override + List<_i9.Picto> get gamePictsWTP => (super.noSuchMethod( + Invocation.getter(#gamePictsWTP), + returnValue: <_i9.Picto>[], + ) as List<_i9.Picto>); + @override + set gamePictsWTP(List<_i9.Picto>? _gamePictsWTP) => super.noSuchMethod( + Invocation.setter( + #gamePictsWTP, + _gamePictsWTP, + ), + returnValueForMissingStub: null, + ); + @override + List<_i9.Picto> get gamePictsMP => (super.noSuchMethod( + Invocation.getter(#gamePictsMP), + returnValue: <_i9.Picto>[], + ) as List<_i9.Picto>); + @override + set gamePictsMP(List<_i9.Picto>? _gamePictsMP) => super.noSuchMethod( + Invocation.setter( + #gamePictsMP, + _gamePictsMP, + ), + returnValueForMissingStub: null, + ); + @override + int get correctPictoWTP => (super.noSuchMethod( + Invocation.getter(#correctPictoWTP), + returnValue: 0, + ) as int); + @override + set correctPictoWTP(int? _correctPictoWTP) => super.noSuchMethod( + Invocation.setter( + #correctPictoWTP, + _correctPictoWTP, + ), + returnValueForMissingStub: null, + ); + @override + bool get hintsBtn => (super.noSuchMethod( + Invocation.getter(#hintsBtn), + returnValue: false, + ) as bool); + @override + set hintsBtn(bool? _hintsBtn) => super.noSuchMethod( + Invocation.setter( + #hintsBtn, + _hintsBtn, + ), + returnValueForMissingStub: null, + ); + @override + _i3.Timer get hintTimer1 => (super.noSuchMethod( + Invocation.getter(#hintTimer1), + returnValue: _FakeTimer_2( + this, + Invocation.getter(#hintTimer1), + ), + ) as _i3.Timer); + @override + set hintTimer1(_i3.Timer? _hintTimer1) => super.noSuchMethod( + Invocation.setter( + #hintTimer1, + _hintTimer1, + ), + returnValueForMissingStub: null, + ); + @override + _i3.Timer get hintTimer2 => (super.noSuchMethod( + Invocation.getter(#hintTimer2), + returnValue: _FakeTimer_2( + this, + Invocation.getter(#hintTimer2), + ), + ) as _i3.Timer); + @override + set hintTimer2(_i3.Timer? _hintTimer2) => super.noSuchMethod( + Invocation.setter( + #hintTimer2, + _hintTimer2, + ), + returnValueForMissingStub: null, + ); + @override + _i3.Timer get gameTimer => (super.noSuchMethod( + Invocation.getter(#gameTimer), + returnValue: _FakeTimer_2( + this, + Invocation.getter(#gameTimer), + ), + ) as _i3.Timer); + @override + set gameTimer(_i3.Timer? _gameTimer) => super.noSuchMethod( + Invocation.setter( + #gameTimer, + _gameTimer, + ), + returnValueForMissingStub: null, + ); + @override + bool get hintsEnabled => (super.noSuchMethod( + Invocation.getter(#hintsEnabled), + returnValue: false, + ) as bool); + @override + set hintsEnabled(bool? _hintsEnabled) => super.noSuchMethod( + Invocation.setter( + #hintsEnabled, + _hintsEnabled, + ), + returnValueForMissingStub: null, + ); + @override + int get difficultyLevel => (super.noSuchMethod( + Invocation.getter(#difficultyLevel), + returnValue: 0, + ) as int); + @override + set difficultyLevel(int? _difficultyLevel) => super.noSuchMethod( + Invocation.setter( + #difficultyLevel, + _difficultyLevel, + ), + returnValueForMissingStub: null, + ); + @override + _i4.AudioPlayer get backgroundMusicPlayer => (super.noSuchMethod( + Invocation.getter(#backgroundMusicPlayer), + returnValue: _FakeAudioPlayer_3( + this, + Invocation.getter(#backgroundMusicPlayer), + ), + ) as _i4.AudioPlayer); + @override + set backgroundMusicPlayer(_i4.AudioPlayer? _backgroundMusicPlayer) => + super.noSuchMethod( + Invocation.setter( + #backgroundMusicPlayer, + _backgroundMusicPlayer, + ), + returnValueForMissingStub: null, + ); + @override + _i4.AudioPlayer get clicksPlayer => (super.noSuchMethod( + Invocation.getter(#clicksPlayer), + returnValue: _FakeAudioPlayer_3( + this, + Invocation.getter(#clicksPlayer), + ), + ) as _i4.AudioPlayer); + @override + set clicksPlayer(_i4.AudioPlayer? _clicksPlayer) => super.noSuchMethod( + Invocation.setter( + #clicksPlayer, + _clicksPlayer, + ), + returnValueForMissingStub: null, + ); + @override + Map get bottomPositionsMP => (super.noSuchMethod( + Invocation.getter(#bottomPositionsMP), + returnValue: {}, + ) as Map); + @override + set bottomPositionsMP(Map? _bottomPositionsMP) => + super.noSuchMethod( + Invocation.setter( + #bottomPositionsMP, + _bottomPositionsMP, + ), + returnValueForMissingStub: null, + ); + @override + Map get topPositionsMP => (super.noSuchMethod( + Invocation.getter(#topPositionsMP), + returnValue: {}, + ) as Map); + @override + set topPositionsMP(Map? _topPositionsMP) => + super.noSuchMethod( + Invocation.setter( + #topPositionsMP, + _topPositionsMP, + ), + returnValueForMissingStub: null, + ); + @override + _i5.PatientNotifier get patientState => (super.noSuchMethod( + Invocation.getter(#patientState), + returnValue: _FakePatientNotifier_4( + this, + Invocation.getter(#patientState), + ), + ) as _i5.PatientNotifier); + @override + bool get hasListeners => (super.noSuchMethod( + Invocation.getter(#hasListeners), + returnValue: false, + ) as bool); + @override + _i3.Future createRandomForGameWTP() => (super.noSuchMethod( + Invocation.method( + #createRandomForGameWTP, + [], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + @override + _i3.Future createRandomForGameMP() => (super.noSuchMethod( + Invocation.method( + #createRandomForGameMP, + [], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + @override + _i3.Future fetchSelectedPictos() => (super.noSuchMethod( + Invocation.method( + #fetchSelectedPictos, + [], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + @override + void moveForward() => super.noSuchMethod( + Invocation.method( + #moveForward, + [], + ), + returnValueForMissingStub: null, + ); + @override + void moveBackward() => super.noSuchMethod( + Invocation.method( + #moveBackward, + [], + ), + returnValueForMissingStub: null, + ); + @override + void scrollUp() => super.noSuchMethod( + Invocation.method( + #scrollUp, + [], + ), + returnValueForMissingStub: null, + ); + @override + void scrollDown() => super.noSuchMethod( + Invocation.method( + #scrollDown, + [], + ), + returnValueForMissingStub: null, + ); + @override + _i3.Future fetchPictograms() => (super.noSuchMethod( + Invocation.method( + #fetchPictograms, + [], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + @override + _i3.Future init() => (super.noSuchMethod( + Invocation.method( + #init, + [], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + @override + _i3.Future showHints() => (super.noSuchMethod( + Invocation.method( + #showHints, + [], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + @override + _i3.Future cancelHints() => (super.noSuchMethod( + Invocation.method( + #cancelHints, + [], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + @override + void notify() => super.noSuchMethod( + Invocation.method( + #notify, + [], + ), + returnValueForMissingStub: null, + ); + @override + _i3.Future playClickSounds({required String? assetName}) => + (super.noSuchMethod( + Invocation.method( + #playClickSounds, + [], + {#assetName: assetName}, + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + @override + _i3.Future changeMusic({required bool? mute}) => (super.noSuchMethod( + Invocation.method( + #changeMusic, + [], + {#mute: mute}, + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + @override + _i3.Future initializeBackgroundMusic() => (super.noSuchMethod( + Invocation.method( + #initializeBackgroundMusic, + [], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + @override + void dispose() => super.noSuchMethod( + Invocation.method( + #dispose, + [], + ), + returnValueForMissingStub: null, + ); + @override + void addListener(_i11.VoidCallback? listener) => super.noSuchMethod( + Invocation.method( + #addListener, + [listener], + ), + returnValueForMissingStub: null, + ); + @override + void removeListener(_i11.VoidCallback? listener) => super.noSuchMethod( + Invocation.method( + #removeListener, + [listener], + ), + returnValueForMissingStub: null, + ); + @override + void notifyListeners() => super.noSuchMethod( + Invocation.method( + #notifyListeners, + [], + ), + returnValueForMissingStub: null, + ); +} + +/// A class which mocks [ChatGPTRepository]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockChatGPTRepository extends _i1.Mock implements _i7.ChatGPTRepository { + MockChatGPTRepository() { + _i1.throwOnMissingStub(this); + } + + @override + _i3.Future<_i6.Either> getCompletion({ + required int? age, + required String? gender, + required String? pictograms, + required String? language, + int? maxTokens = 500, + }) => + (super.noSuchMethod( + Invocation.method( + #getCompletion, + [], + { + #age: age, + #gender: gender, + #pictograms: pictograms, + #language: language, + #maxTokens: maxTokens, + }, + ), + returnValue: _i3.Future<_i6.Either>.value( + _FakeEither_5( + this, + Invocation.method( + #getCompletion, + [], + { + #age: age, + #gender: gender, + #pictograms: pictograms, + #language: language, + #maxTokens: maxTokens, + }, + ), + )), + ) as _i3.Future<_i6.Either>); + @override + _i3.Future<_i6.Either> getGPTStory({ + required String? prompt, + int? maxTokens = 1000, + }) => + (super.noSuchMethod( + Invocation.method( + #getGPTStory, + [], + { + #prompt: prompt, + #maxTokens: maxTokens, + }, + ), + returnValue: _i3.Future<_i6.Either>.value( + _FakeEither_5( + this, + Invocation.method( + #getGPTStory, + [], + { + #prompt: prompt, + #maxTokens: maxTokens, + }, + ), + )), + ) as _i3.Future<_i6.Either>); +} + +/// A class which mocks [TTSProvider]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockTTSProvider extends _i1.Mock implements _i12.TTSProvider { + MockTTSProvider() { + _i1.throwOnMissingStub(this); + } + + @override + _i7.TTSRepository get tts => (super.noSuchMethod( + Invocation.getter(#tts), + returnValue: _FakeTTSRepository_6( + this, + Invocation.getter(#tts), + ), + ) as _i7.TTSRepository); + @override + set speakOperation(_i3.Future? _speakOperation) => super.noSuchMethod( + Invocation.setter( + #speakOperation, + _speakOperation, + ), + returnValueForMissingStub: null, + ); + @override + bool get hasListeners => (super.noSuchMethod( + Invocation.getter(#hasListeners), + returnValue: false, + ) as bool); + @override + _i3.Future speak(String? text) => (super.noSuchMethod( + Invocation.method( + #speak, + [text], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + @override + _i3.Future> fetchVoices(String? languageCode) => + (super.noSuchMethod( + Invocation.method( + #fetchVoices, + [languageCode], + ), + returnValue: _i3.Future>.value(<_i13.Voices>[]), + ) as _i3.Future>); + @override + _i3.Future changeVoiceSpeed(double? speed) => (super.noSuchMethod( + Invocation.method( + #changeVoiceSpeed, + [speed], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + @override + _i3.Future changeCustomTTs(bool? value) => (super.noSuchMethod( + Invocation.method( + #changeCustomTTs, + [value], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + @override + _i3.Future ttsStop() => (super.noSuchMethod( + Invocation.method( + #ttsStop, + [], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + @override + _i3.Future changeTTSVoice(String? voice) => (super.noSuchMethod( + Invocation.method( + #changeTTSVoice, + [voice], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + @override + _i3.Future init() => (super.noSuchMethod( + Invocation.method( + #init, + [], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + @override + void addListener(_i11.VoidCallback? listener) => super.noSuchMethod( + Invocation.method( + #addListener, + [listener], + ), + returnValueForMissingStub: null, + ); + @override + void removeListener(_i11.VoidCallback? listener) => super.noSuchMethod( + Invocation.method( + #removeListener, + [listener], + ), + returnValueForMissingStub: null, + ); + @override + void dispose() => super.noSuchMethod( + Invocation.method( + #dispose, + [], + ), + returnValueForMissingStub: null, + ); + @override + void notifyListeners() => super.noSuchMethod( + Invocation.method( + #notifyListeners, + [], + ), + returnValueForMissingStub: null, + ); +} + +/// A class which mocks [AudioPlayer]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockAudioPlayer extends _i1.Mock implements _i4.AudioPlayer { + MockAudioPlayer() { + _i1.throwOnMissingStub(this); + } + + @override + _i4.PlaybackEvent get playbackEvent => (super.noSuchMethod( + Invocation.getter(#playbackEvent), + returnValue: _FakePlaybackEvent_7( + this, + Invocation.getter(#playbackEvent), + ), + ) as _i4.PlaybackEvent); + @override + _i3.Stream<_i4.PlaybackEvent> get playbackEventStream => (super.noSuchMethod( + Invocation.getter(#playbackEventStream), + returnValue: _i3.Stream<_i4.PlaybackEvent>.empty(), + ) as _i3.Stream<_i4.PlaybackEvent>); + @override + _i3.Stream get durationStream => (super.noSuchMethod( + Invocation.getter(#durationStream), + returnValue: _i3.Stream.empty(), + ) as _i3.Stream); + @override + _i4.ProcessingState get processingState => (super.noSuchMethod( + Invocation.getter(#processingState), + returnValue: _i4.ProcessingState.idle, + ) as _i4.ProcessingState); + @override + _i3.Stream<_i4.ProcessingState> get processingStateStream => + (super.noSuchMethod( + Invocation.getter(#processingStateStream), + returnValue: _i3.Stream<_i4.ProcessingState>.empty(), + ) as _i3.Stream<_i4.ProcessingState>); + @override + bool get playing => (super.noSuchMethod( + Invocation.getter(#playing), + returnValue: false, + ) as bool); + @override + _i3.Stream get playingStream => (super.noSuchMethod( + Invocation.getter(#playingStream), + returnValue: _i3.Stream.empty(), + ) as _i3.Stream); + @override + double get volume => (super.noSuchMethod( + Invocation.getter(#volume), + returnValue: 0.0, + ) as double); + @override + _i3.Stream get volumeStream => (super.noSuchMethod( + Invocation.getter(#volumeStream), + returnValue: _i3.Stream.empty(), + ) as _i3.Stream); + @override + double get speed => (super.noSuchMethod( + Invocation.getter(#speed), + returnValue: 0.0, + ) as double); + @override + _i3.Stream get speedStream => (super.noSuchMethod( + Invocation.getter(#speedStream), + returnValue: _i3.Stream.empty(), + ) as _i3.Stream); + @override + double get pitch => (super.noSuchMethod( + Invocation.getter(#pitch), + returnValue: 0.0, + ) as double); + @override + _i3.Stream get pitchStream => (super.noSuchMethod( + Invocation.getter(#pitchStream), + returnValue: _i3.Stream.empty(), + ) as _i3.Stream); + @override + bool get skipSilenceEnabled => (super.noSuchMethod( + Invocation.getter(#skipSilenceEnabled), + returnValue: false, + ) as bool); + @override + _i3.Stream get skipSilenceEnabledStream => (super.noSuchMethod( + Invocation.getter(#skipSilenceEnabledStream), + returnValue: _i3.Stream.empty(), + ) as _i3.Stream); + @override + Duration get bufferedPosition => (super.noSuchMethod( + Invocation.getter(#bufferedPosition), + returnValue: _FakeDuration_8( + this, + Invocation.getter(#bufferedPosition), + ), + ) as Duration); + @override + _i3.Stream get bufferedPositionStream => (super.noSuchMethod( + Invocation.getter(#bufferedPositionStream), + returnValue: _i3.Stream.empty(), + ) as _i3.Stream); + @override + _i3.Stream<_i4.IcyMetadata?> get icyMetadataStream => (super.noSuchMethod( + Invocation.getter(#icyMetadataStream), + returnValue: _i3.Stream<_i4.IcyMetadata?>.empty(), + ) as _i3.Stream<_i4.IcyMetadata?>); + @override + _i4.PlayerState get playerState => (super.noSuchMethod( + Invocation.getter(#playerState), + returnValue: _FakePlayerState_9( + this, + Invocation.getter(#playerState), + ), + ) as _i4.PlayerState); + @override + _i3.Stream<_i4.PlayerState> get playerStateStream => (super.noSuchMethod( + Invocation.getter(#playerStateStream), + returnValue: _i3.Stream<_i4.PlayerState>.empty(), + ) as _i3.Stream<_i4.PlayerState>); + @override + _i3.Stream?> get sequenceStream => + (super.noSuchMethod( + Invocation.getter(#sequenceStream), + returnValue: _i3.Stream?>.empty(), + ) as _i3.Stream?>); + @override + _i3.Stream?> get shuffleIndicesStream => (super.noSuchMethod( + Invocation.getter(#shuffleIndicesStream), + returnValue: _i3.Stream?>.empty(), + ) as _i3.Stream?>); + @override + _i3.Stream get currentIndexStream => (super.noSuchMethod( + Invocation.getter(#currentIndexStream), + returnValue: _i3.Stream.empty(), + ) as _i3.Stream); + @override + _i3.Stream<_i4.SequenceState?> get sequenceStateStream => (super.noSuchMethod( + Invocation.getter(#sequenceStateStream), + returnValue: _i3.Stream<_i4.SequenceState?>.empty(), + ) as _i3.Stream<_i4.SequenceState?>); + @override + bool get hasNext => (super.noSuchMethod( + Invocation.getter(#hasNext), + returnValue: false, + ) as bool); + @override + bool get hasPrevious => (super.noSuchMethod( + Invocation.getter(#hasPrevious), + returnValue: false, + ) as bool); + @override + _i4.LoopMode get loopMode => (super.noSuchMethod( + Invocation.getter(#loopMode), + returnValue: _i4.LoopMode.off, + ) as _i4.LoopMode); + @override + _i3.Stream<_i4.LoopMode> get loopModeStream => (super.noSuchMethod( + Invocation.getter(#loopModeStream), + returnValue: _i3.Stream<_i4.LoopMode>.empty(), + ) as _i3.Stream<_i4.LoopMode>); + @override + bool get shuffleModeEnabled => (super.noSuchMethod( + Invocation.getter(#shuffleModeEnabled), + returnValue: false, + ) as bool); + @override + _i3.Stream get shuffleModeEnabledStream => (super.noSuchMethod( + Invocation.getter(#shuffleModeEnabledStream), + returnValue: _i3.Stream.empty(), + ) as _i3.Stream); + @override + _i3.Stream get androidAudioSessionIdStream => (super.noSuchMethod( + Invocation.getter(#androidAudioSessionIdStream), + returnValue: _i3.Stream.empty(), + ) as _i3.Stream); + @override + _i3.Stream<_i4.PositionDiscontinuity> get positionDiscontinuityStream => + (super.noSuchMethod( + Invocation.getter(#positionDiscontinuityStream), + returnValue: _i3.Stream<_i4.PositionDiscontinuity>.empty(), + ) as _i3.Stream<_i4.PositionDiscontinuity>); + @override + bool get automaticallyWaitsToMinimizeStalling => (super.noSuchMethod( + Invocation.getter(#automaticallyWaitsToMinimizeStalling), + returnValue: false, + ) as bool); + @override + bool get canUseNetworkResourcesForLiveStreamingWhilePaused => + (super.noSuchMethod( + Invocation.getter(#canUseNetworkResourcesForLiveStreamingWhilePaused), + returnValue: false, + ) as bool); + @override + double get preferredPeakBitRate => (super.noSuchMethod( + Invocation.getter(#preferredPeakBitRate), + returnValue: 0.0, + ) as double); + @override + Duration get position => (super.noSuchMethod( + Invocation.getter(#position), + returnValue: _FakeDuration_8( + this, + Invocation.getter(#position), + ), + ) as Duration); + @override + _i3.Stream get positionStream => (super.noSuchMethod( + Invocation.getter(#positionStream), + returnValue: _i3.Stream.empty(), + ) as _i3.Stream); + @override + _i3.Stream createPositionStream({ + int? steps = 800, + Duration? minPeriod = const Duration(milliseconds: 200), + Duration? maxPeriod = const Duration(milliseconds: 200), + }) => + (super.noSuchMethod( + Invocation.method( + #createPositionStream, + [], + { + #steps: steps, + #minPeriod: minPeriod, + #maxPeriod: maxPeriod, + }, + ), + returnValue: _i3.Stream.empty(), + ) as _i3.Stream); + @override + _i3.Future setUrl( + String? url, { + Map? headers, + Duration? initialPosition, + bool? preload = true, + }) => + (super.noSuchMethod( + Invocation.method( + #setUrl, + [url], + { + #headers: headers, + #initialPosition: initialPosition, + #preload: preload, + }, + ), + returnValue: _i3.Future.value(), + ) as _i3.Future); + @override + _i3.Future setFilePath( + String? filePath, { + Duration? initialPosition, + bool? preload = true, + }) => + (super.noSuchMethod( + Invocation.method( + #setFilePath, + [filePath], + { + #initialPosition: initialPosition, + #preload: preload, + }, + ), + returnValue: _i3.Future.value(), + ) as _i3.Future); + @override + _i3.Future setAsset( + String? assetPath, { + String? package, + bool? preload = true, + Duration? initialPosition, + }) => + (super.noSuchMethod( + Invocation.method( + #setAsset, + [assetPath], + { + #package: package, + #preload: preload, + #initialPosition: initialPosition, + }, + ), + returnValue: _i3.Future.value(), + ) as _i3.Future); + @override + _i3.Future setAudioSource( + _i4.AudioSource? source, { + bool? preload = true, + int? initialIndex, + Duration? initialPosition, + }) => + (super.noSuchMethod( + Invocation.method( + #setAudioSource, + [source], + { + #preload: preload, + #initialIndex: initialIndex, + #initialPosition: initialPosition, + }, + ), + returnValue: _i3.Future.value(), + ) as _i3.Future); + @override + _i3.Future load() => (super.noSuchMethod( + Invocation.method( + #load, + [], + ), + returnValue: _i3.Future.value(), + ) as _i3.Future); + @override + _i3.Future setClip({ + Duration? start, + Duration? end, + }) => + (super.noSuchMethod( + Invocation.method( + #setClip, + [], + { + #start: start, + #end: end, + }, + ), + returnValue: _i3.Future.value(), + ) as _i3.Future); + @override + _i3.Future play() => (super.noSuchMethod( + Invocation.method( + #play, + [], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + @override + _i3.Future pause() => (super.noSuchMethod( + Invocation.method( + #pause, + [], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + @override + _i3.Future stop() => (super.noSuchMethod( + Invocation.method( + #stop, + [], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + @override + _i3.Future setVolume(double? volume) => (super.noSuchMethod( + Invocation.method( + #setVolume, + [volume], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + @override + _i3.Future setSkipSilenceEnabled(bool? enabled) => (super.noSuchMethod( + Invocation.method( + #setSkipSilenceEnabled, + [enabled], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + @override + _i3.Future setSpeed(double? speed) => (super.noSuchMethod( + Invocation.method( + #setSpeed, + [speed], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + @override + _i3.Future setPitch(double? pitch) => (super.noSuchMethod( + Invocation.method( + #setPitch, + [pitch], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + @override + _i3.Future setLoopMode(_i4.LoopMode? mode) => (super.noSuchMethod( + Invocation.method( + #setLoopMode, + [mode], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + @override + _i3.Future setShuffleModeEnabled(bool? enabled) => (super.noSuchMethod( + Invocation.method( + #setShuffleModeEnabled, + [enabled], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + @override + _i3.Future shuffle() => (super.noSuchMethod( + Invocation.method( + #shuffle, + [], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + @override + _i3.Future setAutomaticallyWaitsToMinimizeStalling( + bool? automaticallyWaitsToMinimizeStalling) => + (super.noSuchMethod( + Invocation.method( + #setAutomaticallyWaitsToMinimizeStalling, + [automaticallyWaitsToMinimizeStalling], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + @override + _i3.Future setCanUseNetworkResourcesForLiveStreamingWhilePaused( + bool? canUseNetworkResourcesForLiveStreamingWhilePaused) => + (super.noSuchMethod( + Invocation.method( + #setCanUseNetworkResourcesForLiveStreamingWhilePaused, + [canUseNetworkResourcesForLiveStreamingWhilePaused], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + @override + _i3.Future setPreferredPeakBitRate(double? preferredPeakBitRate) => + (super.noSuchMethod( + Invocation.method( + #setPreferredPeakBitRate, + [preferredPeakBitRate], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + @override + _i3.Future seek( + Duration? position, { + int? index, + }) => + (super.noSuchMethod( + Invocation.method( + #seek, + [position], + {#index: index}, + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + @override + _i3.Future seekToNext() => (super.noSuchMethod( + Invocation.method( + #seekToNext, + [], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + @override + _i3.Future seekToPrevious() => (super.noSuchMethod( + Invocation.method( + #seekToPrevious, + [], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + @override + _i3.Future setAndroidAudioAttributes( + _i14.AndroidAudioAttributes? audioAttributes) => + (super.noSuchMethod( + Invocation.method( + #setAndroidAudioAttributes, + [audioAttributes], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + @override + _i3.Future dispose() => (super.noSuchMethod( + Invocation.method( + #dispose, + [], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); +} diff --git a/test/providers/games/games_provider_test.dart b/test/providers/games/games_provider_test.dart new file mode 100644 index 00000000..ea8551b1 --- /dev/null +++ b/test/providers/games/games_provider_test.dart @@ -0,0 +1,305 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; +import 'package:flutter/widgets.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:get_it/get_it.dart'; +import 'package:just_audio/just_audio.dart'; +import 'package:mockito/annotations.dart'; +import 'package:mockito/mockito.dart'; +import 'package:ottaa_project_flutter/application/notifiers/patient_notifier.dart'; +import 'package:ottaa_project_flutter/application/providers/games_provider.dart'; +import 'package:ottaa_project_flutter/core/models/assets_image.dart'; +import 'package:ottaa_project_flutter/core/models/group_model.dart'; +import 'package:ottaa_project_flutter/core/models/picto_model.dart'; +import 'package:ottaa_project_flutter/core/repositories/repositories.dart'; +import 'chat_gpt_game_provider_test.mocks.dart'; +import 'games_provider_test.mocks.dart'; + +@GenerateMocks([PictogramsRepository, GroupsRepository, PatientNotifier]) +Future main() async { + TestWidgetsFlutterBinding.ensureInitialized(); + + late MockPictogramsRepository mockPictogramsRepository; + late MockGroupsRepository mockGroupsRepository; + late MockPatientNotifier mockPatientNotifier; + late MockAudioPlayer backgroundAudioPlayer; + late MockAudioPlayer clicksAudioPlayer; + late GamesProvider gamesProvider; + WidgetsFlutterBinding.ensureInitialized(); + + final fakePictos = [ + Picto(id: '0', type: 0, resource: AssetsImage(asset: 'testAsset', network: 'testNetwork'), block: true, text: 'one'), + Picto(id: '1', type: 1, resource: AssetsImage(asset: 'testAsset', network: 'testNetwork'), block: false, text: 'two'), + Picto(id: '2', type: 2, resource: AssetsImage(asset: 'testAsset', network: 'testNetwork'), block: false, text: 'three'), + Picto(id: '3', type: 2, resource: AssetsImage(asset: 'testAsset', network: 'testNetwork'), block: true, text: 'four'), + ]; + + final fakeGroups = { + "1": Group( + id: "1", + relations: [ + GroupRelation(id: "0", value: 1), + ], + text: "1", + resource: AssetsImage(asset: "asset", network: "network"), + freq: 1, + ), + "2": Group( + id: "2", + relations: [ + GroupRelation(id: "1", value: 1), + ], + text: "1", + resource: AssetsImage(asset: "asset", network: "network"), + freq: 1, + ), + "3": Group( + id: "3", + relations: [ + GroupRelation(id: "2", value: 1), + GroupRelation(id: "3", value: 1), + ], + text: "1", + resource: AssetsImage(asset: "asset", network: "network"), + freq: 1, + ), + }; + + setUp(() { + mockPictogramsRepository = MockPictogramsRepository(); + mockGroupsRepository = MockGroupsRepository(); + mockPatientNotifier = MockPatientNotifier(); + + backgroundAudioPlayer = MockAudioPlayer(); + clicksAudioPlayer = MockAudioPlayer(); + + gamesProvider = GamesProvider(mockGroupsRepository, mockPictogramsRepository, mockPatientNotifier, backgroundMusicPlayer: backgroundAudioPlayer, clicksPlayer: clicksAudioPlayer); + }); + + test('should cancel hints for the game', () async { + gamesProvider.hintTimer1 = Timer(const Duration(milliseconds: 1000), () {}); + gamesProvider.hintTimer2 = Timer(const Duration(milliseconds: 1000), () {}); + gamesProvider.hintsEnabled = true; + await gamesProvider.cancelHints(); + expect(gamesProvider.hintsEnabled, false); + }); + + test("should generate pictograms", () async { + gamesProvider.selectedPicts = fakePictos; + + int count = 0; + + gamesProvider.addListener(() { + count++; + }); + + await gamesProvider.createRandomForGameWTP(); + + expect(gamesProvider.gamePictsWTP.length, 2); + expect(count, 1); + }); + + test("should rest game score", () { + gamesProvider.incorrectScore = 2; + gamesProvider.correctScore = 2; + gamesProvider.useTime = 2; + gamesProvider.streak = 2; + gamesProvider.difficultyLevel = 2; + + gamesProvider.gameTimer = Timer(const Duration(milliseconds: 1000), () {}); + + gamesProvider.resetScore(); + + expect(gamesProvider.incorrectScore, 0); + expect(gamesProvider.correctScore, 0); + expect(gamesProvider.useTime, 0); + expect(gamesProvider.streak, 0); + expect(gamesProvider.difficultyLevel, 0); + expect(gamesProvider.gameTimer.isActive, false); + }); + + test("should generate random for game mp", () async { + gamesProvider.selectedPicts = fakePictos; + + int count = 0; + + gamesProvider.addListener(() { + count++; + }); + + await gamesProvider.createRandomForGameMP(); + + expect(count, 1); + }); + + test("should fetch selected pictos", () { + gamesProvider.groups = fakeGroups; + gamesProvider.pictograms = fakePictos.asMap().map( + (key, value) => MapEntry(value.id, value), + ); + + gamesProvider.fetchSelectedPictos(); + + expect(gamesProvider.selectedPicts.length, 1); + }); + + testWidgets("should move forward and backward", (tester) async { + await tester.pumpWidget( + MaterialApp( + home: Scaffold( + body: PageView( + controller: gamesProvider.mainPageController, + children: [ + Container(height: 100), + Container(height: 100), + Container(height: 100), + Container(height: 100), + Container(height: 100), + ], + ), + ), + ), + ); + + final lView = tester.widget(find.byType(PageView)); + final controller = lView.controller; + await tester.pump(Duration(seconds: 1)); + gamesProvider.moveForward(); + + await tester.pumpAndSettle(Duration(seconds: 20)); + expect(controller.page, 1); + + gamesProvider.moveBackward(); + await tester.pumpAndSettle(Duration(seconds: 20)); + expect(controller.page, 0); + }); + + testWidgets("should scroll down and up", (tester) async { + await tester.pumpWidget( + MaterialApp( + home: Scaffold( + body: ListView( + controller: gamesProvider.gridScrollController, + children: [ + Container(height: 200), + Container(height: 200), + Container(height: 200), + Container(height: 200), + Container(height: 200), + ], + ), + ), + ), + ); + + final lView = tester.widget(find.byType(ListView)); + final controller = lView.controller; + await tester.pump(Duration(seconds: 1)); + gamesProvider.scrollDown(); + + await tester.pumpAndSettle(Duration(seconds: 20)); + expect(controller!.position.pixels, greaterThan(0)); + + gamesProvider.scrollUp(); + await tester.pumpAndSettle(Duration(seconds: 20)); + expect(controller.position.pixels, lessThan(10)); + }); + + group("fetch pictograms", () { + test("Should fetch pictograms without patiend", () async { + when(mockPictogramsRepository.getAllPictograms()).thenAnswer((realInvocation) async { + return fakePictos; + }); + + when(mockPatientNotifier.state).thenReturn(null); + + when(mockGroupsRepository.getAllGroups()).thenAnswer((realInvocation) async { + return fakeGroups.values.toList(); + }); + + await gamesProvider.fetchPictograms(); + + expect(gamesProvider.pictograms.length, 2); + expect(gamesProvider.groups.length, fakeGroups.length); + verify(mockPictogramsRepository.getAllPictograms()).called(1); + verify(mockGroupsRepository.getAllGroups()).called(1); + }); + }); + + test("should init provider", () async { + when(backgroundAudioPlayer.setAsset('assets/audios/funckygroove.mp3')).thenAnswer((_) async => Duration(days: 1)); + when(backgroundAudioPlayer.setLoopMode(LoopMode.one)).thenAnswer((_) async => Duration(days: 1)); + when(backgroundAudioPlayer.setVolume(0.2)).thenAnswer((_) async => ({})); + when(backgroundAudioPlayer.play()).thenAnswer((_) async => {}); + + gamesProvider.isMute = false; + gamesProvider.hintsBtn = true; + await gamesProvider.init(); + + verify(backgroundAudioPlayer.setAsset('assets/audios/funckygroove.mp3')).called(1); + verify(backgroundAudioPlayer.setLoopMode(LoopMode.one)).called(1); + verify(backgroundAudioPlayer.setVolume(0.2)).called(1); + verify(backgroundAudioPlayer.play()).called(1); + }); + + test("should notify", () async { + int count = 0; + gamesProvider.addListener(() { + count++; + }); + + gamesProvider.notify(); + + expect(count, 1); + }); + + test("play click sounds", () async { + when(clicksAudioPlayer.setAsset(any)).thenAnswer((realInvocation) async => const Duration()); + when(clicksAudioPlayer.play()).thenAnswer((realInvocation) async => ({})); + + await gamesProvider.playClickSounds(assetName: "click"); + + verify(clicksAudioPlayer.setAsset(any)).called(1); + verify(clicksAudioPlayer.play()).called(1); + }); + + group("change music", () { + test("should mute", () async { + when(backgroundAudioPlayer.pause()).thenAnswer((realInvocation) async {}); + + await gamesProvider.changeMusic(mute: true); + + verify(backgroundAudioPlayer.pause()).called(1); + }); + + test("should unmute", () async { + when(backgroundAudioPlayer.play()).thenAnswer((realInvocation) async {}); + + await gamesProvider.changeMusic(mute: false); + + verify(backgroundAudioPlayer.play()).called(1); + }); + }); + + test("should dispose", () { + gamesProvider.hintTimer1 = Timer(const Duration(milliseconds: 1000), () {}); + gamesProvider.hintTimer2 = Timer(const Duration(milliseconds: 1000), () {}); + + gamesProvider.dispose(); + + expect(gamesProvider.hintTimer1.isActive, false); + expect(gamesProvider.hintTimer2.isActive, false); + }); + + test("should return instance", () async { + GetIt.I.registerSingleton(mockPictogramsRepository); + GetIt.I.registerSingleton(mockGroupsRepository); + final container = ProviderContainer(); + + final provider = container.read(gameProvider); + + expect(provider, isA()); + }); +} diff --git a/test/providers/games/games_provider_test.mocks.dart b/test/providers/games/games_provider_test.mocks.dart new file mode 100644 index 00000000..cbcc774b --- /dev/null +++ b/test/providers/games/games_provider_test.mocks.dart @@ -0,0 +1,288 @@ +// Mocks generated by Mockito 5.4.0 from annotations +// in ottaa_project_flutter/test/providers/games/games_provider_test.dart. +// Do not manually edit this file. + +// ignore_for_file: no_leading_underscores_for_library_prefixes +import 'dart:async' as _i4; + +import 'package:flutter_riverpod/flutter_riverpod.dart' as _i10; +import 'package:mockito/mockito.dart' as _i1; +import 'package:ottaa_project_flutter/application/notifiers/patient_notifier.dart' + as _i9; +import 'package:ottaa_project_flutter/core/abstracts/basic_search.dart' as _i6; +import 'package:ottaa_project_flutter/core/models/group_model.dart' as _i8; +import 'package:ottaa_project_flutter/core/models/patient_user_model.dart' + as _i2; +import 'package:ottaa_project_flutter/core/models/picto_model.dart' as _i5; +import 'package:ottaa_project_flutter/core/repositories/groups_repository.dart' + as _i7; +import 'package:ottaa_project_flutter/core/repositories/pictograms_repository.dart' + as _i3; +import 'package:state_notifier/state_notifier.dart' as _i11; + +// ignore_for_file: type=lint +// ignore_for_file: avoid_redundant_argument_values +// ignore_for_file: avoid_setters_without_getters +// ignore_for_file: comment_references +// ignore_for_file: implementation_imports +// ignore_for_file: invalid_use_of_visible_for_testing_member +// ignore_for_file: prefer_const_constructors +// ignore_for_file: unnecessary_parenthesis +// ignore_for_file: camel_case_types +// ignore_for_file: subtype_of_sealed_class + +class _FakePatientUserModel_0 extends _i1.SmartFake + implements _i2.PatientUserModel { + _FakePatientUserModel_0( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +/// A class which mocks [PictogramsRepository]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockPictogramsRepository extends _i1.Mock + implements _i3.PictogramsRepository { + MockPictogramsRepository() { + _i1.throwOnMissingStub(this); + } + + @override + _i4.Future> getAllPictograms() => (super.noSuchMethod( + Invocation.method( + #getAllPictograms, + [], + ), + returnValue: _i4.Future>.value(<_i5.Picto>[]), + ) as _i4.Future>); + @override + _i4.Future uploadPictograms( + List<_i5.Picto>? data, + String? language, { + String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #uploadPictograms, + [ + data, + language, + ], + {#userId: userId}, + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future updatePictogram( + _i5.Picto? pictogram, + String? language, + int? index, + ) => + (super.noSuchMethod( + Invocation.method( + #updatePictogram, + [ + pictogram, + language, + index, + ], + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future> getPictograms(_i6.BasicSearch? search) => + (super.noSuchMethod( + Invocation.method( + #getPictograms, + [search], + ), + returnValue: _i4.Future>.value(<_i5.Picto>[]), + ) as _i4.Future>); + @override + _i4.Future> loadTranslations( + {required String? language}) => + (super.noSuchMethod( + Invocation.method( + #loadTranslations, + [], + {#language: language}, + ), + returnValue: _i4.Future>.value({}), + ) as _i4.Future>); +} + +/// A class which mocks [GroupsRepository]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockGroupsRepository extends _i1.Mock implements _i7.GroupsRepository { + MockGroupsRepository() { + _i1.throwOnMissingStub(this); + } + + @override + _i4.Future> getAllGroups({bool? defaultGroups = false}) => + (super.noSuchMethod( + Invocation.method( + #getAllGroups, + [], + {#defaultGroups: defaultGroups}, + ), + returnValue: _i4.Future>.value(<_i8.Group>[]), + ) as _i4.Future>); + @override + _i4.Future> getDefaultGroups() => (super.noSuchMethod( + Invocation.method( + #getDefaultGroups, + [], + ), + returnValue: _i4.Future>.value(<_i8.Group>[]), + ) as _i4.Future>); + @override + _i4.Future uploadGroups( + List<_i8.Group>? data, + String? type, + String? language, { + String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #uploadGroups, + [ + data, + type, + language, + ], + {#userId: userId}, + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future updateGroups( + _i8.Group? data, + String? type, + String? language, + int? index, + ) => + (super.noSuchMethod( + Invocation.method( + #updateGroups, + [ + data, + type, + language, + index, + ], + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future> getGroups(_i6.BasicSearch? search) => + (super.noSuchMethod( + Invocation.method( + #getGroups, + [search], + ), + returnValue: _i4.Future>.value(<_i8.Group>[]), + ) as _i4.Future>); +} + +/// A class which mocks [PatientNotifier]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockPatientNotifier extends _i1.Mock implements _i9.PatientNotifier { + MockPatientNotifier() { + _i1.throwOnMissingStub(this); + } + + @override + _i2.PatientUserModel get user => (super.noSuchMethod( + Invocation.getter(#user), + returnValue: _FakePatientUserModel_0( + this, + Invocation.getter(#user), + ), + ) as _i2.PatientUserModel); + @override + set onError(_i10.ErrorListener? _onError) => super.noSuchMethod( + Invocation.setter( + #onError, + _onError, + ), + returnValueForMissingStub: null, + ); + @override + bool get mounted => (super.noSuchMethod( + Invocation.getter(#mounted), + returnValue: false, + ) as bool); + @override + _i4.Stream<_i2.PatientUserModel?> get stream => (super.noSuchMethod( + Invocation.getter(#stream), + returnValue: _i4.Stream<_i2.PatientUserModel?>.empty(), + ) as _i4.Stream<_i2.PatientUserModel?>); + @override + set state(_i2.PatientUserModel? value) => super.noSuchMethod( + Invocation.setter( + #state, + value, + ), + returnValueForMissingStub: null, + ); + @override + bool get hasListeners => (super.noSuchMethod( + Invocation.getter(#hasListeners), + returnValue: false, + ) as bool); + @override + void setUser(_i2.PatientUserModel? user) => super.noSuchMethod( + Invocation.method( + #setUser, + [user], + ), + returnValueForMissingStub: null, + ); + @override + bool updateShouldNotify( + _i2.PatientUserModel? old, + _i2.PatientUserModel? current, + ) => + (super.noSuchMethod( + Invocation.method( + #updateShouldNotify, + [ + old, + current, + ], + ), + returnValue: false, + ) as bool); + @override + _i10.RemoveListener addListener( + _i11.Listener<_i2.PatientUserModel?>? listener, { + bool? fireImmediately = true, + }) => + (super.noSuchMethod( + Invocation.method( + #addListener, + [listener], + {#fireImmediately: fireImmediately}, + ), + returnValue: () {}, + ) as _i10.RemoveListener); + @override + void dispose() => super.noSuchMethod( + Invocation.method( + #dispose, + [], + ), + returnValueForMissingStub: null, + ); +} diff --git a/test/providers/games/match_pictogram_provider_test.dart b/test/providers/games/match_pictogram_provider_test.dart new file mode 100644 index 00000000..a9c6edff --- /dev/null +++ b/test/providers/games/match_pictogram_provider_test.dart @@ -0,0 +1,60 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:mockito/annotations.dart'; +import 'package:mockito/mockito.dart'; +import 'package:ottaa_project_flutter/application/providers/games_provider.dart'; +import 'package:ottaa_project_flutter/application/providers/match_pictogram_provider.dart'; +import 'package:ottaa_project_flutter/application/providers/tts_provider.dart'; +import 'package:ottaa_project_flutter/core/models/assets_image.dart'; +import 'package:ottaa_project_flutter/core/models/picto_model.dart'; + +import 'chat_gpt_game_provider_test.mocks.dart'; + +@GenerateMocks([TTSProvider]) +@GenerateNiceMocks([MockSpec()]) +Future main() async { + late MockGamesProvider mockGamesProvider; + late MockTTSProvider mockTTSProvider; + late MatchPictogramProvider matchPictogramProvider; + + late Map topPictos; + late Map bottomPictos; + + setUp(() { + mockGamesProvider = MockGamesProvider(); + mockTTSProvider = MockTTSProvider(); + matchPictogramProvider = MatchPictogramProvider(mockGamesProvider, mockTTSProvider); + topPictos = { + 0: Picto(id: '0', type: 1, text: 'example1', resource: AssetsImage(asset: 'TestAsset', network: 'TestNetwork'), tags: { + 'hour': ['MANANA'] + }), + 1: Picto(id: '1', type: 1, text: 'example2', resource: AssetsImage(asset: 'TestAsset', network: 'TestNetwork'), tags: { + 'hour': ['MEDIODIA', 'TARDE'] + }), + 2: Picto(id: '2', type: 1, text: 'example3', resource: AssetsImage(asset: 'TestAsset', network: 'TestNetwork'), tags: {'hour': []}), + 3: Picto(id: '3', type: 1, text: 'example4', resource: AssetsImage(asset: 'TestAsset', network: 'TestNetwork'), tags: { + 'hour': ['NOCHE'] + }), + }; + bottomPictos = { + 0: Picto(id: '4', type: 1, text: 'example5', resource: AssetsImage(asset: 'TestAsset', network: 'TestNetwork'), tags: { + 'hour': ['MANANA'] + }), + 1: Picto(id: '5', type: 1, text: 'example6', resource: AssetsImage(asset: 'TestAsset', network: 'TestNetwork'), tags: { + 'hour': ['MEDIODIA', 'TARDE'] + }), + 2: Picto(id: '6', type: 1, text: 'example7', resource: AssetsImage(asset: 'TestAsset', network: 'TestNetwork'), tags: {'hour': []}), + 3: Picto(id: '7', type: 1, text: 'example8', resource: AssetsImage(asset: 'TestAsset', network: 'TestNetwork'), tags: { + 'hour': ['NOCHE'] + }), + }; + }); + + test('returns the index of the icto from the 2 lists', () async { + when(mockGamesProvider.topPositionsMP).thenAnswer((realInvocation) => topPictos); + when(mockGamesProvider.bottomPositionsMP).thenAnswer((realInvocation) => bottomPictos); + mockGamesProvider.topPositionsMP = topPictos; + mockGamesProvider.bottomPositionsMP = bottomPictos; + final result1 = await matchPictogramProvider.check(text: 'example4', top: true); + expect(result1, 3); + }); +} diff --git a/test/providers/games/match_pictogram_provider_test.mocks.dart b/test/providers/games/match_pictogram_provider_test.mocks.dart new file mode 100644 index 00000000..769389eb --- /dev/null +++ b/test/providers/games/match_pictogram_provider_test.mocks.dart @@ -0,0 +1,869 @@ +// Mocks generated by Mockito 5.4.0 from annotations +// in ottaa_project_flutter/test/providers/games/match_pictogram_provider_test.dart. +// Do not manually edit this file. + +// ignore_for_file: no_leading_underscores_for_library_prefixes +import 'dart:async' as _i4; +import 'dart:ui' as _i9; + +import 'package:flutter/widgets.dart' as _i3; +import 'package:just_audio/just_audio.dart' as _i5; +import 'package:mockito/mockito.dart' as _i1; +import 'package:ottaa_project_flutter/application/notifiers/patient_notifier.dart' + as _i6; +import 'package:ottaa_project_flutter/application/providers/games_provider.dart' + as _i10; +import 'package:ottaa_project_flutter/application/providers/tts_provider.dart' + as _i7; +import 'package:ottaa_project_flutter/core/models/group_model.dart' as _i12; +import 'package:ottaa_project_flutter/core/models/picto_model.dart' as _i11; +import 'package:ottaa_project_flutter/core/models/voices_model.dart' as _i8; +import 'package:ottaa_project_flutter/core/repositories/repositories.dart' + as _i2; + +// ignore_for_file: type=lint +// ignore_for_file: avoid_redundant_argument_values +// ignore_for_file: avoid_setters_without_getters +// ignore_for_file: comment_references +// ignore_for_file: implementation_imports +// ignore_for_file: invalid_use_of_visible_for_testing_member +// ignore_for_file: prefer_const_constructors +// ignore_for_file: unnecessary_parenthesis +// ignore_for_file: camel_case_types +// ignore_for_file: subtype_of_sealed_class + +class _FakeTTSRepository_0 extends _i1.SmartFake implements _i2.TTSRepository { + _FakeTTSRepository_0( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakePageController_1 extends _i1.SmartFake + implements _i3.PageController { + _FakePageController_1( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeScrollController_2 extends _i1.SmartFake + implements _i3.ScrollController { + _FakeScrollController_2( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeTimer_3 extends _i1.SmartFake implements _i4.Timer { + _FakeTimer_3( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeAudioPlayer_4 extends _i1.SmartFake implements _i5.AudioPlayer { + _FakeAudioPlayer_4( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakePatientNotifier_5 extends _i1.SmartFake + implements _i6.PatientNotifier { + _FakePatientNotifier_5( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +/// A class which mocks [TTSProvider]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockTTSProvider extends _i1.Mock implements _i7.TTSProvider { + MockTTSProvider() { + _i1.throwOnMissingStub(this); + } + + @override + _i2.TTSRepository get tts => (super.noSuchMethod( + Invocation.getter(#tts), + returnValue: _FakeTTSRepository_0( + this, + Invocation.getter(#tts), + ), + ) as _i2.TTSRepository); + @override + set speakOperation(_i4.Future? _speakOperation) => super.noSuchMethod( + Invocation.setter( + #speakOperation, + _speakOperation, + ), + returnValueForMissingStub: null, + ); + @override + bool get hasListeners => (super.noSuchMethod( + Invocation.getter(#hasListeners), + returnValue: false, + ) as bool); + @override + _i4.Future speak(String? text) => (super.noSuchMethod( + Invocation.method( + #speak, + [text], + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future> fetchVoices(String? languageCode) => + (super.noSuchMethod( + Invocation.method( + #fetchVoices, + [languageCode], + ), + returnValue: _i4.Future>.value(<_i8.Voices>[]), + ) as _i4.Future>); + @override + _i4.Future changeVoiceSpeed(double? speed) => (super.noSuchMethod( + Invocation.method( + #changeVoiceSpeed, + [speed], + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future changeCustomTTs(bool? value) => (super.noSuchMethod( + Invocation.method( + #changeCustomTTs, + [value], + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future ttsStop() => (super.noSuchMethod( + Invocation.method( + #ttsStop, + [], + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future changeTTSVoice(String? voice) => (super.noSuchMethod( + Invocation.method( + #changeTTSVoice, + [voice], + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future init() => (super.noSuchMethod( + Invocation.method( + #init, + [], + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + void addListener(_i9.VoidCallback? listener) => super.noSuchMethod( + Invocation.method( + #addListener, + [listener], + ), + returnValueForMissingStub: null, + ); + @override + void removeListener(_i9.VoidCallback? listener) => super.noSuchMethod( + Invocation.method( + #removeListener, + [listener], + ), + returnValueForMissingStub: null, + ); + @override + void dispose() => super.noSuchMethod( + Invocation.method( + #dispose, + [], + ), + returnValueForMissingStub: null, + ); + @override + void notifyListeners() => super.noSuchMethod( + Invocation.method( + #notifyListeners, + [], + ), + returnValueForMissingStub: null, + ); +} + +/// A class which mocks [GamesProvider]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockGamesProvider extends _i1.Mock implements _i10.GamesProvider { + @override + int get numberOfGroups => (super.noSuchMethod( + Invocation.getter(#numberOfGroups), + returnValue: 0, + returnValueForMissingStub: 0, + ) as int); + @override + set numberOfGroups(int? _numberOfGroups) => super.noSuchMethod( + Invocation.setter( + #numberOfGroups, + _numberOfGroups, + ), + returnValueForMissingStub: null, + ); + @override + int get completedGroups => (super.noSuchMethod( + Invocation.getter(#completedGroups), + returnValue: 0, + returnValueForMissingStub: 0, + ) as int); + @override + set completedGroups(int? _completedGroups) => super.noSuchMethod( + Invocation.setter( + #completedGroups, + _completedGroups, + ), + returnValueForMissingStub: null, + ); + @override + int get activeGroups => (super.noSuchMethod( + Invocation.getter(#activeGroups), + returnValue: 0, + returnValueForMissingStub: 0, + ) as int); + @override + set activeGroups(int? _activeGroups) => super.noSuchMethod( + Invocation.setter( + #activeGroups, + _activeGroups, + ), + returnValueForMissingStub: null, + ); + @override + int get selectedGame => (super.noSuchMethod( + Invocation.getter(#selectedGame), + returnValue: 0, + returnValueForMissingStub: 0, + ) as int); + @override + set selectedGame(int? _selectedGame) => super.noSuchMethod( + Invocation.setter( + #selectedGame, + _selectedGame, + ), + returnValueForMissingStub: null, + ); + @override + String get selectedGroupName => (super.noSuchMethod( + Invocation.getter(#selectedGroupName), + returnValue: '', + returnValueForMissingStub: '', + ) as String); + @override + set selectedGroupName(String? _selectedGroupName) => super.noSuchMethod( + Invocation.setter( + #selectedGroupName, + _selectedGroupName, + ), + returnValueForMissingStub: null, + ); + @override + _i3.PageController get mainPageController => (super.noSuchMethod( + Invocation.getter(#mainPageController), + returnValue: _FakePageController_1( + this, + Invocation.getter(#mainPageController), + ), + returnValueForMissingStub: _FakePageController_1( + this, + Invocation.getter(#mainPageController), + ), + ) as _i3.PageController); + @override + _i3.ScrollController get gridScrollController => (super.noSuchMethod( + Invocation.getter(#gridScrollController), + returnValue: _FakeScrollController_2( + this, + Invocation.getter(#gridScrollController), + ), + returnValueForMissingStub: _FakeScrollController_2( + this, + Invocation.getter(#gridScrollController), + ), + ) as _i3.ScrollController); + @override + set gridScrollController(_i3.ScrollController? _gridScrollController) => + super.noSuchMethod( + Invocation.setter( + #gridScrollController, + _gridScrollController, + ), + returnValueForMissingStub: null, + ); + @override + Map get pictograms => (super.noSuchMethod( + Invocation.getter(#pictograms), + returnValue: {}, + returnValueForMissingStub: {}, + ) as Map); + @override + set pictograms(Map? _pictograms) => super.noSuchMethod( + Invocation.setter( + #pictograms, + _pictograms, + ), + returnValueForMissingStub: null, + ); + @override + Map get groups => (super.noSuchMethod( + Invocation.getter(#groups), + returnValue: {}, + returnValueForMissingStub: {}, + ) as Map); + @override + set groups(Map? _groups) => super.noSuchMethod( + Invocation.setter( + #groups, + _groups, + ), + returnValueForMissingStub: null, + ); + @override + int get correctScore => (super.noSuchMethod( + Invocation.getter(#correctScore), + returnValue: 0, + returnValueForMissingStub: 0, + ) as int); + @override + set correctScore(int? _correctScore) => super.noSuchMethod( + Invocation.setter( + #correctScore, + _correctScore, + ), + returnValueForMissingStub: null, + ); + @override + int get incorrectScore => (super.noSuchMethod( + Invocation.getter(#incorrectScore), + returnValue: 0, + returnValueForMissingStub: 0, + ) as int); + @override + set incorrectScore(int? _incorrectScore) => super.noSuchMethod( + Invocation.setter( + #incorrectScore, + _incorrectScore, + ), + returnValueForMissingStub: null, + ); + @override + List<_i11.Picto> get selectedPicts => (super.noSuchMethod( + Invocation.getter(#selectedPicts), + returnValue: <_i11.Picto>[], + returnValueForMissingStub: <_i11.Picto>[], + ) as List<_i11.Picto>); + @override + set selectedPicts(List<_i11.Picto>? _selectedPicts) => super.noSuchMethod( + Invocation.setter( + #selectedPicts, + _selectedPicts, + ), + returnValueForMissingStub: null, + ); + @override + int get useTime => (super.noSuchMethod( + Invocation.getter(#useTime), + returnValue: 0, + returnValueForMissingStub: 0, + ) as int); + @override + set useTime(int? _useTime) => super.noSuchMethod( + Invocation.setter( + #useTime, + _useTime, + ), + returnValueForMissingStub: null, + ); + @override + int get streak => (super.noSuchMethod( + Invocation.getter(#streak), + returnValue: 0, + returnValueForMissingStub: 0, + ) as int); + @override + set streak(int? _streak) => super.noSuchMethod( + Invocation.setter( + #streak, + _streak, + ), + returnValueForMissingStub: null, + ); + @override + List get matchPictoTop => (super.noSuchMethod( + Invocation.getter(#matchPictoTop), + returnValue: [], + returnValueForMissingStub: [], + ) as List); + @override + set matchPictoTop(List? _matchPictoTop) => super.noSuchMethod( + Invocation.setter( + #matchPictoTop, + _matchPictoTop, + ), + returnValueForMissingStub: null, + ); + @override + List get matchPictoBottom => (super.noSuchMethod( + Invocation.getter(#matchPictoBottom), + returnValue: [], + returnValueForMissingStub: [], + ) as List); + @override + set matchPictoBottom(List? _matchPictoBottom) => super.noSuchMethod( + Invocation.setter( + #matchPictoBottom, + _matchPictoBottom, + ), + returnValueForMissingStub: null, + ); + @override + bool get isMute => (super.noSuchMethod( + Invocation.getter(#isMute), + returnValue: false, + returnValueForMissingStub: false, + ) as bool); + @override + set isMute(bool? _isMute) => super.noSuchMethod( + Invocation.setter( + #isMute, + _isMute, + ), + returnValueForMissingStub: null, + ); + @override + List<_i11.Picto> get gamePictsWTP => (super.noSuchMethod( + Invocation.getter(#gamePictsWTP), + returnValue: <_i11.Picto>[], + returnValueForMissingStub: <_i11.Picto>[], + ) as List<_i11.Picto>); + @override + set gamePictsWTP(List<_i11.Picto>? _gamePictsWTP) => super.noSuchMethod( + Invocation.setter( + #gamePictsWTP, + _gamePictsWTP, + ), + returnValueForMissingStub: null, + ); + @override + List<_i11.Picto> get gamePictsMP => (super.noSuchMethod( + Invocation.getter(#gamePictsMP), + returnValue: <_i11.Picto>[], + returnValueForMissingStub: <_i11.Picto>[], + ) as List<_i11.Picto>); + @override + set gamePictsMP(List<_i11.Picto>? _gamePictsMP) => super.noSuchMethod( + Invocation.setter( + #gamePictsMP, + _gamePictsMP, + ), + returnValueForMissingStub: null, + ); + @override + int get correctPictoWTP => (super.noSuchMethod( + Invocation.getter(#correctPictoWTP), + returnValue: 0, + returnValueForMissingStub: 0, + ) as int); + @override + set correctPictoWTP(int? _correctPictoWTP) => super.noSuchMethod( + Invocation.setter( + #correctPictoWTP, + _correctPictoWTP, + ), + returnValueForMissingStub: null, + ); + @override + bool get hintsBtn => (super.noSuchMethod( + Invocation.getter(#hintsBtn), + returnValue: false, + returnValueForMissingStub: false, + ) as bool); + @override + set hintsBtn(bool? _hintsBtn) => super.noSuchMethod( + Invocation.setter( + #hintsBtn, + _hintsBtn, + ), + returnValueForMissingStub: null, + ); + @override + _i4.Timer get hintTimer1 => (super.noSuchMethod( + Invocation.getter(#hintTimer1), + returnValue: _FakeTimer_3( + this, + Invocation.getter(#hintTimer1), + ), + returnValueForMissingStub: _FakeTimer_3( + this, + Invocation.getter(#hintTimer1), + ), + ) as _i4.Timer); + @override + set hintTimer1(_i4.Timer? _hintTimer1) => super.noSuchMethod( + Invocation.setter( + #hintTimer1, + _hintTimer1, + ), + returnValueForMissingStub: null, + ); + @override + _i4.Timer get hintTimer2 => (super.noSuchMethod( + Invocation.getter(#hintTimer2), + returnValue: _FakeTimer_3( + this, + Invocation.getter(#hintTimer2), + ), + returnValueForMissingStub: _FakeTimer_3( + this, + Invocation.getter(#hintTimer2), + ), + ) as _i4.Timer); + @override + set hintTimer2(_i4.Timer? _hintTimer2) => super.noSuchMethod( + Invocation.setter( + #hintTimer2, + _hintTimer2, + ), + returnValueForMissingStub: null, + ); + @override + _i4.Timer get gameTimer => (super.noSuchMethod( + Invocation.getter(#gameTimer), + returnValue: _FakeTimer_3( + this, + Invocation.getter(#gameTimer), + ), + returnValueForMissingStub: _FakeTimer_3( + this, + Invocation.getter(#gameTimer), + ), + ) as _i4.Timer); + @override + set gameTimer(_i4.Timer? _gameTimer) => super.noSuchMethod( + Invocation.setter( + #gameTimer, + _gameTimer, + ), + returnValueForMissingStub: null, + ); + @override + bool get hintsEnabled => (super.noSuchMethod( + Invocation.getter(#hintsEnabled), + returnValue: false, + returnValueForMissingStub: false, + ) as bool); + @override + set hintsEnabled(bool? _hintsEnabled) => super.noSuchMethod( + Invocation.setter( + #hintsEnabled, + _hintsEnabled, + ), + returnValueForMissingStub: null, + ); + @override + int get difficultyLevel => (super.noSuchMethod( + Invocation.getter(#difficultyLevel), + returnValue: 0, + returnValueForMissingStub: 0, + ) as int); + @override + set difficultyLevel(int? _difficultyLevel) => super.noSuchMethod( + Invocation.setter( + #difficultyLevel, + _difficultyLevel, + ), + returnValueForMissingStub: null, + ); + @override + _i5.AudioPlayer get backgroundMusicPlayer => (super.noSuchMethod( + Invocation.getter(#backgroundMusicPlayer), + returnValue: _FakeAudioPlayer_4( + this, + Invocation.getter(#backgroundMusicPlayer), + ), + returnValueForMissingStub: _FakeAudioPlayer_4( + this, + Invocation.getter(#backgroundMusicPlayer), + ), + ) as _i5.AudioPlayer); + @override + set backgroundMusicPlayer(_i5.AudioPlayer? _backgroundMusicPlayer) => + super.noSuchMethod( + Invocation.setter( + #backgroundMusicPlayer, + _backgroundMusicPlayer, + ), + returnValueForMissingStub: null, + ); + @override + _i5.AudioPlayer get clicksPlayer => (super.noSuchMethod( + Invocation.getter(#clicksPlayer), + returnValue: _FakeAudioPlayer_4( + this, + Invocation.getter(#clicksPlayer), + ), + returnValueForMissingStub: _FakeAudioPlayer_4( + this, + Invocation.getter(#clicksPlayer), + ), + ) as _i5.AudioPlayer); + @override + set clicksPlayer(_i5.AudioPlayer? _clicksPlayer) => super.noSuchMethod( + Invocation.setter( + #clicksPlayer, + _clicksPlayer, + ), + returnValueForMissingStub: null, + ); + @override + Map get bottomPositionsMP => (super.noSuchMethod( + Invocation.getter(#bottomPositionsMP), + returnValue: {}, + returnValueForMissingStub: {}, + ) as Map); + @override + set bottomPositionsMP(Map? _bottomPositionsMP) => + super.noSuchMethod( + Invocation.setter( + #bottomPositionsMP, + _bottomPositionsMP, + ), + returnValueForMissingStub: null, + ); + @override + Map get topPositionsMP => (super.noSuchMethod( + Invocation.getter(#topPositionsMP), + returnValue: {}, + returnValueForMissingStub: {}, + ) as Map); + @override + set topPositionsMP(Map? _topPositionsMP) => + super.noSuchMethod( + Invocation.setter( + #topPositionsMP, + _topPositionsMP, + ), + returnValueForMissingStub: null, + ); + @override + _i6.PatientNotifier get patientState => (super.noSuchMethod( + Invocation.getter(#patientState), + returnValue: _FakePatientNotifier_5( + this, + Invocation.getter(#patientState), + ), + returnValueForMissingStub: _FakePatientNotifier_5( + this, + Invocation.getter(#patientState), + ), + ) as _i6.PatientNotifier); + @override + bool get hasListeners => (super.noSuchMethod( + Invocation.getter(#hasListeners), + returnValue: false, + returnValueForMissingStub: false, + ) as bool); + @override + _i4.Future createRandomForGameWTP() => (super.noSuchMethod( + Invocation.method( + #createRandomForGameWTP, + [], + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future createRandomForGameMP() => (super.noSuchMethod( + Invocation.method( + #createRandomForGameMP, + [], + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future fetchSelectedPictos() => (super.noSuchMethod( + Invocation.method( + #fetchSelectedPictos, + [], + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + void moveForward() => super.noSuchMethod( + Invocation.method( + #moveForward, + [], + ), + returnValueForMissingStub: null, + ); + @override + void moveBackward() => super.noSuchMethod( + Invocation.method( + #moveBackward, + [], + ), + returnValueForMissingStub: null, + ); + @override + void scrollUp() => super.noSuchMethod( + Invocation.method( + #scrollUp, + [], + ), + returnValueForMissingStub: null, + ); + @override + void scrollDown() => super.noSuchMethod( + Invocation.method( + #scrollDown, + [], + ), + returnValueForMissingStub: null, + ); + @override + _i4.Future fetchPictograms() => (super.noSuchMethod( + Invocation.method( + #fetchPictograms, + [], + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future init() => (super.noSuchMethod( + Invocation.method( + #init, + [], + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future showHints() => (super.noSuchMethod( + Invocation.method( + #showHints, + [], + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future cancelHints() => (super.noSuchMethod( + Invocation.method( + #cancelHints, + [], + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + void notify() => super.noSuchMethod( + Invocation.method( + #notify, + [], + ), + returnValueForMissingStub: null, + ); + @override + _i4.Future playClickSounds({required String? assetName}) => + (super.noSuchMethod( + Invocation.method( + #playClickSounds, + [], + {#assetName: assetName}, + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future changeMusic({required bool? mute}) => (super.noSuchMethod( + Invocation.method( + #changeMusic, + [], + {#mute: mute}, + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future initializeBackgroundMusic() => (super.noSuchMethod( + Invocation.method( + #initializeBackgroundMusic, + [], + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + void dispose() => super.noSuchMethod( + Invocation.method( + #dispose, + [], + ), + returnValueForMissingStub: null, + ); + @override + void addListener(_i9.VoidCallback? listener) => super.noSuchMethod( + Invocation.method( + #addListener, + [listener], + ), + returnValueForMissingStub: null, + ); + @override + void removeListener(_i9.VoidCallback? listener) => super.noSuchMethod( + Invocation.method( + #removeListener, + [listener], + ), + returnValueForMissingStub: null, + ); + @override + void notifyListeners() => super.noSuchMethod( + Invocation.method( + #notifyListeners, + [], + ), + returnValueForMissingStub: null, + ); +} diff --git a/test/providers/home/home_provider_test.dart b/test/providers/home/home_provider_test.dart new file mode 100644 index 00000000..8e177e46 --- /dev/null +++ b/test/providers/home/home_provider_test.dart @@ -0,0 +1,956 @@ +import 'dart:ffi'; + +import 'package:either_dart/either.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:get_it/get_it.dart'; +import 'package:mockito/annotations.dart'; +import 'package:mockito/mockito.dart'; +import 'package:ottaa_project_flutter/application/common/i18n.dart'; +import 'package:ottaa_project_flutter/application/language/translation_tree.dart'; +import 'package:ottaa_project_flutter/application/notifiers/patient_notifier.dart'; +import 'package:ottaa_project_flutter/application/providers/chatgpt_provider.dart'; +import 'package:ottaa_project_flutter/application/providers/home_provider.dart'; +import 'package:ottaa_project_flutter/application/providers/tts_provider.dart'; +import 'package:ottaa_project_flutter/application/providers/user_provider.dart'; +import 'package:ottaa_project_flutter/core/abstracts/user_model.dart'; +import 'package:ottaa_project_flutter/core/enums/user_types.dart'; +import 'package:ottaa_project_flutter/core/models/accessibility_setting.dart'; +import 'package:ottaa_project_flutter/core/models/assets_image.dart'; +import 'package:ottaa_project_flutter/core/models/base_settings_model.dart'; +import 'package:ottaa_project_flutter/core/models/base_user_model.dart'; +import 'package:ottaa_project_flutter/core/models/group_model.dart'; +import 'package:ottaa_project_flutter/core/models/language_setting.dart'; +import 'package:ottaa_project_flutter/core/models/layout_setting.dart'; +import 'package:ottaa_project_flutter/core/models/patient_user_model.dart'; +import 'package:ottaa_project_flutter/core/models/payment_model.dart'; +import 'package:ottaa_project_flutter/core/models/phrase_model.dart'; +import 'package:ottaa_project_flutter/core/models/picto_model.dart'; +import 'package:ottaa_project_flutter/core/models/picto_predicted_reduced.dart'; +import 'package:ottaa_project_flutter/core/models/tts_setting.dart'; +import 'package:ottaa_project_flutter/core/models/user_data_model.dart'; +import 'package:ottaa_project_flutter/core/repositories/groups_repository.dart'; +import 'package:ottaa_project_flutter/core/repositories/local_database_repository.dart'; +import 'package:ottaa_project_flutter/core/repositories/pictograms_repository.dart'; +import 'package:ottaa_project_flutter/core/repositories/sentences_repository.dart'; +import 'package:ottaa_project_flutter/core/use_cases/learn_pictogram.dart'; +import 'package:ottaa_project_flutter/core/use_cases/predict_pictogram.dart'; + +import 'home_provider_test.mocks.dart'; + +@GenerateMocks([TTSProvider, SentencesRepository, GroupsRepository, PictogramsRepository, PredictPictogram, LearnPictogram, ChatGPTNotifier, LocalDatabaseRepository, I18N]) +@GenerateNiceMocks([MockSpec(), MockSpec()]) +Future main() async { + late MockTTSProvider mockTTSProvider; + late MockUserNotifier mockUserNotifier; + late MockPatientNotifier mockPatientNotifier; + late MockSentencesRepository mockSentencesRepository; + late MockGroupsRepository mockGroupsRepository; + late MockPictogramsRepository mockPictogramsRepository; + late MockChatGPTNotifier mockChatGPTNotifier; + late MockLearnPictogram mockLearnPictogram; + late MockPredictPictogram mockPredictPictogram; + late MockLocalDatabaseRepository mockLocalDatabaseRepository; + late MockI18N mockI18N; + + late HomeProvider cHomeProvider; + + late List fakePhrases; + + late List fakePictos; + late Map fakePictosMap; + + late PatientUserModel fakeUser; + + late Map fakeGroupsMap; + + late List fakeGroups; + + setUpAll(() { + mockI18N = MockI18N(); + + GetIt.I.registerSingleton(mockI18N); + final trl = TranslationTree(Locale("es_AR")); + trl.addTranslations({ + "global": {"no": "no", "yes": "yes"} + }); + + when(mockI18N.currentLanguage).thenReturn(trl); + }); + + setUp(() { + mockTTSProvider = MockTTSProvider(); + mockUserNotifier = MockUserNotifier(); + mockPatientNotifier = MockPatientNotifier(); + mockSentencesRepository = MockSentencesRepository(); + mockGroupsRepository = MockGroupsRepository(); + mockPictogramsRepository = MockPictogramsRepository(); + mockChatGPTNotifier = MockChatGPTNotifier(); + mockLearnPictogram = MockLearnPictogram(); + mockPredictPictogram = MockPredictPictogram(); + mockLocalDatabaseRepository = MockLocalDatabaseRepository(); + + fakePhrases = [ + Phrase(date: DateTime.now(), id: '00', sequence: [Sequence(id: '22')], tags: {}), + Phrase(date: DateTime.now(), id: '22', sequence: [Sequence(id: '22')], tags: {}) + ]; + fakePictos = [ + Picto(id: '0', type: 1, resource: AssetsImage(asset: 'TestAsset', network: 'TestNetwork'), tags: { + 'hour': ['MANANA'] + }, relations: [ + PictoRelation(id: "0", value: 3) + ]), + Picto(id: '1', type: 1, resource: AssetsImage(asset: 'TestAsset', network: 'TestNetwork'), tags: { + 'hour': ['MEDIODIA', 'TARDE'] + }), + Picto(id: '2', type: 1, resource: AssetsImage(asset: 'TestAsset', network: 'TestNetwork'), tags: {'hour': []}), + Picto(id: '3', type: 1, resource: AssetsImage(asset: 'TestAsset', network: 'TestNetwork'), tags: { + 'hour': ['NOCHE'] + }), + Picto(id: '4', type: 1, resource: AssetsImage(asset: 'TestAsset', network: 'TestNetwork'), tags: { + 'hour': ['MANANA', 'TARDE', 'NOCHE'] + }), + Picto(id: '5', type: 1, resource: AssetsImage(asset: 'TestAsset', network: 'TestNetwork'), tags: { + 'hour': ['MANANA', 'TARDE', 'NOCHE'] + }), + ]; + + fakePictosMap = { + '_hqTU9A7I3RFDVrcIEK-L': Picto(id: '_hqTU9A7I3RFDVrcIEK-L', type: 1, resource: AssetsImage(asset: 'TestAsset', network: 'TestNetwork'), tags: { + 'hour': ['MANANA'] + }, relations: [ + PictoRelation(id: "0", value: 2) + ]), + '0': Picto(id: '0', type: 1, resource: AssetsImage(asset: 'TestAsset', network: 'TestNetwork'), tags: { + 'hour': ['MANANA'] + }, relations: [ + PictoRelation(id: "1", value: 2) + ]), + '1': Picto(id: '1', type: 1, resource: AssetsImage(asset: 'TestAsset', network: 'TestNetwork'), tags: { + 'hour': ['MEDIODIA', 'TARDE'] + }), + '2': Picto(id: '2', type: 1, resource: AssetsImage(asset: 'TestAsset', network: 'TestNetwork'), tags: {'hour': []}), + '3': Picto(id: '3', type: 1, resource: AssetsImage(asset: 'TestAsset', network: 'TestNetwork'), tags: { + 'hour': ['NOCHE'] + }), + '4': Picto(id: '4', type: 1, resource: AssetsImage(asset: 'TestAsset', network: 'TestNetwork'), tags: { + 'hour': ['MANANA', 'TARDE', 'NOCHE'] + }), + }; + + fakeGroupsMap = { + "0": Group(id: '0', relations: [GroupRelation(id: '0', value: 0), GroupRelation(id: '1', value: 0)], text: 'test1', resource: AssetsImage(asset: 'testAsset', network: 'testNetwork'), freq: 00), + "1": Group(id: '1', relations: [GroupRelation(id: '1', value: 0)], text: 'test2', resource: AssetsImage(asset: 'testAsset', network: 'testNetwork'), freq: 01), + "2": Group(id: '2', relations: [GroupRelation(id: '2', value: 0)], text: 'test3', resource: AssetsImage(asset: 'testAsset', network: 'testNetwork'), freq: 03), + }; + fakeGroups = fakeGroupsMap.values.toList(); + + fakeUser = PatientUserModel( + id: "0", + groups: { + "es_AR": fakeGroupsMap.values.toList(), + }, + phrases: {}, + pictos: { + "es_AR": fakePictosMap.values.toList(), + }, + settings: PatientSettings( + payment: Payment.none(), + accessibility: AccessibilitySetting.empty(), + layout: LayoutSetting.empty().copyWith(oneToOne: true), + tts: TTSSetting.empty(), + data: UserData( + avatar: AssetsImage(asset: "test", network: "https://test.com"), + birthDate: DateTime(0), + genderPref: "n/a", + lastConnection: DateTime(0), + name: "John", + lastName: "Doe", + ), + language: LanguageSetting.empty(), + ), + email: "test@mail.com", + type: UserType.user, + ); + + cHomeProvider = HomeProvider(mockPictogramsRepository, mockGroupsRepository, mockSentencesRepository, mockTTSProvider, mockPatientNotifier, mockPredictPictogram, mockLearnPictogram, mockUserNotifier, mockChatGPTNotifier, mockLocalDatabaseRepository); + }); + + test('should call notifyListeners', () { + cHomeProvider.notify(); + + expect(() => cHomeProvider.notify(), isA()); + }); + + group('fetchMostUsedSentences', () { + test('should update mostUsedSentences and trigger notifyListeners', () async { + final mockResponse = fakePhrases; + + when(mockSentencesRepository.fetchSentences( + language: anyNamed('language'), + type: anyNamed('type'), + )).thenAnswer((_) async => Right(mockResponse)); + + await cHomeProvider.fetchMostUsedSentences(); + + expect(cHomeProvider.mostUsedSentences, mockResponse); + expect(() => cHomeProvider.notifyListeners(), isA()); + }); + + test('should update mostUsedSentences to empty list when fetchSentences returns an error', () async { + when(mockSentencesRepository.fetchSentences( + language: anyNamed('language'), + type: anyNamed('type'), + )).thenAnswer((_) async => const Left('')); + + await cHomeProvider.fetchMostUsedSentences(); + + expect(cHomeProvider.mostUsedSentences, isEmpty); + expect(() => cHomeProvider.notifyListeners(), isA()); + }); + }); + + test('should update suggestedQuantity and trigger notifyListeners', () { + const expectedQuantity = 10; + + cHomeProvider.setSuggedtedQuantity(expectedQuantity); + + expect(cHomeProvider.suggestedQuantity, expectedQuantity); + expect(() => cHomeProvider.notifyListeners(), isA()); + }); + + group('fetchPictograms', () { + test('should fetch pictograms and groups when user is authenticated', () async { + when(mockPatientNotifier.patient).thenReturn(fakeUser); + when(mockPatientNotifier.user).thenReturn(fakeUser); + + await cHomeProvider.fetchPictograms(); + + expect(cHomeProvider.pictograms.length, 6); + expect(cHomeProvider.groups.length, fakeGroups.length); + }); + + test('should not fetch all pictograms and groups when user is not authenticated', () async { + when(mockPictogramsRepository.getAllPictograms()).thenAnswer((realInvocation) async => []); + when(mockGroupsRepository.getAllGroups()).thenAnswer((realInvocation) async => []); + + await cHomeProvider.fetchPictograms(); + + expect(cHomeProvider.pictograms.length, 0); + expect(cHomeProvider.groups.length, 0); + }); + }); + + test('predictiveAlgorithm returns the correct list of Picto objects', () { + final list = [ + const PictoRelation(id: '0', value: 0.8), + const PictoRelation(id: '1', value: 0.5), + const PictoRelation(id: '2', value: 0.3), + const PictoRelation(id: '3', value: 0.2), + ]; + cHomeProvider.pictograms = fakePictosMap; + final result = cHomeProvider.predictiveAlgorithm(list: list); + + expect(result, hasLength(4)); + }); + + group("refresh pictograms", () { + test('updates the indexPage and notifies listeners', () { + cHomeProvider.suggestedPicts = fakePictos; + cHomeProvider.suggestedQuantity = 2; + + cHomeProvider.refreshPictograms(); + + expect(cHomeProvider.indexPage, equals(1)); + + cHomeProvider.refreshPictograms(); + + expect(cHomeProvider.indexPage, equals(2)); + + cHomeProvider.indexPage = -1; + cHomeProvider.refreshPictograms(); + + expect(cHomeProvider.indexPage, equals(0)); + + expect(() => cHomeProvider.notify(), isA()); + }); + + test('updates the indexPage and notifies listeners where indexPage > currentPage', () { + cHomeProvider.suggestedPicts = fakePictos; + cHomeProvider.suggestedQuantity = 2; + + cHomeProvider.refreshPictograms(); + + expect(cHomeProvider.indexPage, equals(1)); + + cHomeProvider.refreshPictograms(); + + expect(cHomeProvider.indexPage, equals(2)); + + cHomeProvider.indexPage = 4; + cHomeProvider.refreshPictograms(); + + expect(cHomeProvider.indexPage, equals(0)); + + expect(() => cHomeProvider.notify(), isA()); + }); + + test('updates the indexPage and notifies listeners where indexPage > currentPage', () { + cHomeProvider.suggestedPicts = fakePictos; + cHomeProvider.suggestedQuantity = 2; + cHomeProvider.indexPage = -3; + cHomeProvider.refreshPictograms(); + + expect(cHomeProvider.indexPage, equals(0)); + }); + }); + group('test scroll up function of the provider', () { + testWidgets('scrollUp scrolls the controller up by the specified amount', (WidgetTester tester) async { + final controller = ScrollController(initialScrollOffset: 100.0); + const amount = 50.0; + + await tester.pumpWidget( + MaterialApp( + home: Scaffold( + body: ListView.builder( + controller: controller, + itemCount: 10, + itemBuilder: (context, index) { + return ListTile( + title: Text('Item $index'), + ); + }, + ), + ), + ), + ); + + expect(controller.position.pixels, equals(100.0)); + + cHomeProvider.scrollUp(controller, amount); + + await tester.pumpAndSettle(); + + expect(controller.position.pixels, equals(0)); + }); + + testWidgets('scrollUp does not scroll the controller when currentPosition is 0', (WidgetTester tester) async { + final controller = ScrollController(initialScrollOffset: 0.0); + const amount = 50.0; + + await tester.pumpWidget( + MaterialApp( + home: Scaffold( + body: ListView.builder( + controller: controller, + itemCount: 10, + itemBuilder: (context, index) { + return ListTile( + title: Text('Item $index'), + ); + }, + ), + ), + ), + ); + + expect(controller.position.pixels, equals(0.0)); + + cHomeProvider.scrollUp(controller, amount); + + await tester.pumpAndSettle(); + + expect(controller.position.pixels, equals(0.0)); + }); + }); + + group('test scroll down function of the provider', () { + testWidgets('scrollDown scrolls the controller up by the specified amount', (WidgetTester tester) async { + final controller = ScrollController(initialScrollOffset: 100.0); + const amount = 50.0; + + await tester.pumpWidget( + MaterialApp( + home: Scaffold( + body: ListView.builder( + controller: controller, + itemCount: 10, + itemBuilder: (context, index) { + return ListTile( + title: Text('Item $index'), + ); + }, + ), + ), + ), + ); + + expect(controller.position.pixels, equals(100.0)); + + cHomeProvider.scrollUp(controller, amount); + + await tester.pumpAndSettle(); + + expect(controller.position.pixels, equals(0)); + }); + + testWidgets('scrollDown does not scroll the controller when currentPosition is 0', (WidgetTester tester) async { + final controller = ScrollController(initialScrollOffset: 0.0); + const amount = 50.0; + + await tester.pumpWidget( + MaterialApp( + home: Scaffold( + body: ListView.builder( + controller: controller, + itemCount: 10, + itemBuilder: (context, index) { + return ListTile( + title: Text('Item $index'), + ); + }, + ), + ), + ), + ); + + expect(controller.position.pixels, equals(0.0)); + + cHomeProvider.scrollDown(controller, amount); + + await tester.pumpAndSettle(); + + expect(controller.position.pixels, equals(0.0)); + }); + }); + + group("get pictograms", () { + test('returns the correct list of pictograms', () { + // Set up initial state + cHomeProvider.suggestedPicts = [ + Picto(id: "1", text: "Picto 1", type: 0, resource: AssetsImage(asset: "", network: null)), + Picto(id: "2", text: "Picto 2", type: 0, resource: AssetsImage(asset: "", network: null)), + Picto(id: "3", text: "Picto 3", type: 0, resource: AssetsImage(asset: "", network: null)), + Picto(id: "4", text: "Picto 4", type: 0, resource: AssetsImage(asset: "", network: null)), + Picto(id: "5", text: "Picto 5", type: 0, resource: AssetsImage(asset: "", network: null)), + ]; + + cHomeProvider.basicPictograms = [ + Picto(id: "101", text: "Basic Picto 1", type: 0, resource: AssetsImage(asset: "", network: null)), + Picto(id: "102", text: "Basic Picto 2", type: 0, resource: AssetsImage(asset: "", network: null)), + Picto(id: "103", text: "Basic Picto 3", type: 0, resource: AssetsImage(asset: "", network: null)), + Picto(id: "104", text: "Basic Picto 4", type: 0, resource: AssetsImage(asset: "", network: null)), + Picto(id: "105", text: "Basic Picto 5", type: 0, resource: AssetsImage(asset: "", network: null)), + ]; + + cHomeProvider.suggestedQuantity = 3; + cHomeProvider.indexPage = 1; + + // Call the method + final result = cHomeProvider.getPictograms(); + + // Check the expected list of pictograms + expect(result, [ + Picto(id: "4", text: "Picto 4", type: 0, resource: AssetsImage(asset: "", network: null)), + Picto(id: "5", text: "Picto 5", type: 0, resource: AssetsImage(asset: "", network: null)), + Picto(id: "777", text: "", type: 0, resource: AssetsImage(asset: "", network: null)), + ]); + }); + + test('returns the correct list of pictograms', () { + // Set up initial state + cHomeProvider.suggestedPicts = null; + + // Call the method + final result = cHomeProvider.getPictograms(); + + // Check the expected list of pictograms + expect(result, [ + Picto( + id: "-777", + text: "", + type: 0, + resource: AssetsImage( + asset: "", + network: null, + ), + ), + Picto( + id: "-777", + text: "", + type: 0, + resource: AssetsImage( + asset: "", + network: null, + ), + ), + Picto( + id: "-777", + text: "", + type: 0, + resource: AssetsImage( + asset: "", + network: null, + ), + ), + Picto( + id: "-777", + text: "", + type: 0, + resource: AssetsImage( + asset: "", + network: null, + ), + ) + ]); + }); + + test('returns the correct list of pictograms with indexPage > currentPage', () { + // Set up initial state + cHomeProvider.suggestedPicts = [ + Picto(id: "1", text: "Picto 1", type: 0, resource: AssetsImage(asset: "", network: null)), + Picto(id: "2", text: "Picto 2", type: 0, resource: AssetsImage(asset: "", network: null)), + Picto(id: "3", text: "Picto 3", type: 0, resource: AssetsImage(asset: "", network: null)), + Picto(id: "4", text: "Picto 4", type: 0, resource: AssetsImage(asset: "", network: null)), + Picto(id: "5", text: "Picto 5", type: 0, resource: AssetsImage(asset: "", network: null)), + ]; + + cHomeProvider.basicPictograms = [ + Picto(id: "101", text: "Basic Picto 1", type: 0, resource: AssetsImage(asset: "", network: null)), + Picto(id: "102", text: "Basic Picto 2", type: 0, resource: AssetsImage(asset: "", network: null)), + Picto(id: "103", text: "Basic Picto 3", type: 0, resource: AssetsImage(asset: "", network: null)), + Picto(id: "104", text: "Basic Picto 4", type: 0, resource: AssetsImage(asset: "", network: null)), + Picto(id: "105", text: "Basic Picto 5", type: 0, resource: AssetsImage(asset: "", network: null)), + ]; + + cHomeProvider.suggestedQuantity = 4; + cHomeProvider.indexPage = 3; + + // Call the method + final result = cHomeProvider.getPictograms(); + int currentPage = (cHomeProvider.suggestedPicts!.length / 4).round(); + + // Check the expected list of pictograms + expect(cHomeProvider.indexPage, equals(currentPage)); + }); + + test('returns the correct list of pictograms with indexPage > currentPage', () { + // Set up initial state + cHomeProvider.suggestedPicts = [ + Picto(id: "1", text: "Picto 1", type: 0, resource: AssetsImage(asset: "", network: null)), + Picto(id: "2", text: "Picto 2", type: 0, resource: AssetsImage(asset: "", network: null)), + Picto(id: "3", text: "Picto 3", type: 0, resource: AssetsImage(asset: "", network: null)), + Picto(id: "4", text: "Picto 4", type: 0, resource: AssetsImage(asset: "", network: null)), + Picto(id: "5", text: "Picto 5", type: 0, resource: AssetsImage(asset: "", network: null)), + ]; + + cHomeProvider.basicPictograms = [ + Picto(id: "101", text: "Basic Picto 1", type: 0, resource: AssetsImage(asset: "", network: null)), + Picto(id: "102", text: "Basic Picto 2", type: 0, resource: AssetsImage(asset: "", network: null)), + Picto(id: "103", text: "Basic Picto 3", type: 0, resource: AssetsImage(asset: "", network: null)), + Picto(id: "104", text: "Basic Picto 4", type: 0, resource: AssetsImage(asset: "", network: null)), + Picto(id: "105", text: "Basic Picto 5", type: 0, resource: AssetsImage(asset: "", network: null)), + ]; + + cHomeProvider.suggestedQuantity = 4; + cHomeProvider.indexPage = -1; + + // Call the method + final result = cHomeProvider.getPictograms(); + + expect(cHomeProvider.indexPage, equals(0)); + }); + }); + group('should return true or false based upon the locally storedvalues', () { + test('isLongClickEnabled should return a true', () async { + when(mockLocalDatabaseRepository.getLongClick()).thenAnswer((realInvocation) async => true); + + final response = await cHomeProvider.isLongClickEnabled(); + expect(response, true); + }); + + test('isLongClickEnabled should return a false', () async { + when(mockLocalDatabaseRepository.getLongClick()).thenAnswer((realInvocation) async => false); + + final response = await cHomeProvider.isLongClickEnabled(); + expect(response, false); + }); + }); + + test('setLongClickEnabled should set the value into the local storage', () async { + expect(() async => await cHomeProvider.setLongClickEnabled(isLongClick: true), isA()); + }); + + testWidgets("set current group should change current tab group", (tester) async { + final controller = cHomeProvider.pictoTabsScrollController; + int counter = 0; + + await tester.pumpWidget( + MaterialApp( + home: Scaffold( + body: ListView.builder( + controller: controller, + itemCount: 20, + itemBuilder: (context, index) { + return ListTile( + title: Text('Item $index'), + ); + }, + ), + ), + ), + ); + + await tester.pumpAndSettle(); + controller.jumpTo(100.0); + + await tester.pumpAndSettle(); + + cHomeProvider.addListener(() { + counter++; + }); + + cHomeProvider.setCurrentGroup("HOLA"); + + await tester.pumpAndSettle(); + expect(controller.position.pixels, equals(0.0)); + expect(cHomeProvider.currentTabGroup, "HOLA"); + expect(counter, 1); + }); + + test("set long click enabled", () async { + when(mockLocalDatabaseRepository.setLongClick(isLongClick: anyNamed("isLongClick"))).thenAnswer((realInvocation) async => {}); + + await cHomeProvider.setLongClickEnabled(isLongClick: true); + + verify(mockLocalDatabaseRepository.setLongClick(isLongClick: anyNamed("isLongClick"))); + }); + + test("should init provider", () async { + when(mockPatientNotifier.patient).thenReturn(fakeUser); + when(mockPatientNotifier.user).thenReturn(fakeUser); + when(mockUserNotifier.user).thenReturn(fakeUser); + when(mockPictogramsRepository.loadTranslations(language: anyNamed("language"))).thenAnswer((realInvocation) async { + return {}; + }); + when(mockLocalDatabaseRepository.getLongClick()).thenAnswer((realInvocation) async => true); + + when(mockPredictPictogram.call( + sentence: anyNamed("sentence"), + uid: anyNamed("uid"), + language: anyNamed("language"), + model: anyNamed("model"), + groups: anyNamed("groups"), + tags: anyNamed("tags"), + cancelToken: anyNamed("cancelToken"), + reduced: anyNamed("reduced"), + )).thenAnswer((realInvocation) async { + return Right([ + PictoPredictedReduced(name: "", id: { + "local": "1", + }), + ]); + }); + + await cHomeProvider.init(); + + verify(mockPatientNotifier.patient); + verify(mockPatientNotifier.user); + verify(mockUserNotifier.user); + verify(mockPictogramsRepository.loadTranslations(language: anyNamed("language"))); + verify(mockLocalDatabaseRepository.getLongClick()); + verify(mockPredictPictogram.call( + sentence: anyNamed("sentence"), + uid: anyNamed("uid"), + language: anyNamed("language"), + model: anyNamed("model"), + groups: anyNamed("groups"), + tags: anyNamed("tags"), + cancelToken: anyNamed("cancelToken"), + reduced: anyNamed("reduced"), + )); + }); + + group("build suggestion", () { + test("should build basic pictograms", () async { + cHomeProvider.basicPictograms = fakePictos; + + cHomeProvider.pictograms = fakePictosMap; + + await cHomeProvider.buildSuggestion(kStarterPictoId); + + expect(cHomeProvider.suggestedPicts, fakePictos); + }); + test("should build basic pictograms", () async { + cHomeProvider.pictograms = fakePictosMap; + + await cHomeProvider.buildSuggestion("0"); + + expect(cHomeProvider.suggestedPicts, hasLength(1)); + }); + }); + + group("add pictogram", () { + test("should add picto", () async { + cHomeProvider.pictograms = fakePictosMap; + cHomeProvider.addPictogram(fakePictos.first); + + expect(cHomeProvider.pictoWords, hasLength(1)); + expect(cHomeProvider.suggestedPicts, hasLength(1)); + }); + + testWidgets("should add picto and jumpto", (tester) async { + final controller = cHomeProvider.scrollController; + + await tester.pumpWidget( + MaterialApp( + home: Scaffold( + body: ListView.builder( + controller: controller, + itemCount: 30, + itemBuilder: (context, index) { + return ListTile( + title: Text('Item $index'), + ); + }, + ), + ), + ), + ); + + await tester.pumpAndSettle(); + + cHomeProvider.pictograms = fakePictosMap; + cHomeProvider.pictoWords = List.generate(5, (index) { + return fakePictos[index % fakePictos.length]; + }); + cHomeProvider.addPictogram(fakePictos.first); + + await tester.pumpAndSettle(); + expect(cHomeProvider.pictoWords, hasLength(6)); + expect(cHomeProvider.suggestedPicts, hasLength(1)); + expect(controller.position.pixels, greaterThan(0)); + }); + }); + + group("speak sentence", () { + testWidgets("should speak as a patient one by one", (tester) async { + when(mockPatientNotifier.state).thenReturn(fakeUser); + when(mockPatientNotifier.user).thenReturn(fakeUser); + when(mockUserNotifier.user).thenReturn(fakeUser); + when(mockLearnPictogram.call( + uid: anyNamed("uid"), + language: anyNamed("language"), + model: anyNamed("model"), + tokens: anyNamed("tokens"), + )).thenAnswer((realInvocation) async => Right("true")); + when(mockTTSProvider.speak(any)).thenAnswer((realInvocation) async => {}); + cHomeProvider.pictoWords = List.generate(5, (index) { + return fakePictos[index % fakePictos.length]; + }); + + final controller = cHomeProvider.scrollController; + + await tester.pumpWidget( + MaterialApp( + home: Scaffold( + body: ListView.builder( + controller: controller, + itemCount: 30, + itemBuilder: (context, index) { + return ListTile( + title: Text('Item $index'), + ); + }, + ), + ), + ), + ); + + await tester.pumpAndSettle(); + + await cHomeProvider.speakSentence(); + + await tester.pumpAndSettle(); + verify(mockPatientNotifier.state); + verify(mockPatientNotifier.user); + // verify(mockUserNotifier.user); + verify(mockLearnPictogram.call( + uid: anyNamed("uid"), + language: anyNamed("language"), + model: anyNamed("model"), + tokens: anyNamed("tokens"), + )); + verify(mockTTSProvider.speak(any)); + }); + + testWidgets("should speak as a patient with labs", (tester) async { + final testUSer = fakeUser.copyWith( + settings: PatientSettings( + payment: Payment.none(), + accessibility: AccessibilitySetting.empty(), + layout: LayoutSetting.empty().copyWith(), + tts: TTSSetting.empty(), + data: UserData( + avatar: AssetsImage(asset: "test", network: "https://test.com"), + birthDate: DateTime(0), + genderPref: "n/a", + lastConnection: DateTime(0), + name: "John", + lastName: "Doe", + ), + language: LanguageSetting.empty(labs: true), + )); + when(mockPatientNotifier.state).thenReturn(testUSer); + when(mockPatientNotifier.user).thenReturn(testUSer); + when(mockUserNotifier.user).thenReturn(testUSer); + when(mockLearnPictogram.call( + uid: anyNamed("uid"), + language: anyNamed("language"), + model: anyNamed("model"), + tokens: anyNamed("tokens"), + )).thenAnswer((realInvocation) async => Right("true")); + when(mockTTSProvider.speak(any)).thenAnswer((realInvocation) async => {}); + cHomeProvider.pictoWords = List.generate(5, (index) { + return fakePictos[index % fakePictos.length]; + }); + when(mockChatGPTNotifier.generatePhrase(any)).thenAnswer((realInvocation) async { + return "test"; + }); + + final controller = cHomeProvider.scrollController; + + await tester.pumpWidget( + MaterialApp( + home: Scaffold( + body: ListView.builder( + controller: controller, + itemCount: 30, + itemBuilder: (context, index) { + return ListTile( + title: Text('Item $index'), + ); + }, + ), + ), + ), + ); + + await tester.pumpAndSettle(); + + await cHomeProvider.speakSentence(); + + await tester.pumpAndSettle(); + verify(mockPatientNotifier.state); + verify(mockPatientNotifier.user); + // verify(mockUserNotifier.user); + verify(mockLearnPictogram.call( + uid: anyNamed("uid"), + language: anyNamed("language"), + model: anyNamed("model"), + tokens: anyNamed("tokens"), + )); + verify(mockTTSProvider.speak(any)); + verify(mockChatGPTNotifier.generatePhrase(any)); + }); + + testWidgets("should speak as a patient", (tester) async { + final testUSer = fakeUser.copyWith( + settings: PatientSettings( + payment: Payment.none(), + accessibility: AccessibilitySetting.empty(), + layout: LayoutSetting.empty().copyWith(), + tts: TTSSetting.empty(), + data: UserData( + avatar: AssetsImage(asset: "test", network: "https://test.com"), + birthDate: DateTime(0), + genderPref: "n/a", + lastConnection: DateTime(0), + name: "John", + lastName: "Doe", + ), + language: LanguageSetting.empty(), + )); + when(mockPatientNotifier.state).thenReturn(testUSer); + when(mockPatientNotifier.user).thenReturn(testUSer); + when(mockUserNotifier.user).thenReturn(testUSer); + when(mockLearnPictogram.call( + uid: anyNamed("uid"), + language: anyNamed("language"), + model: anyNamed("model"), + tokens: anyNamed("tokens"), + )).thenAnswer((realInvocation) async => Right("true")); + when(mockTTSProvider.speak(any)).thenAnswer((realInvocation) async => {}); + cHomeProvider.pictoWords = List.generate(5, (index) { + return fakePictos[index % fakePictos.length]; + }); + when(mockChatGPTNotifier.generatePhrase(any)).thenAnswer((realInvocation) async { + return "test"; + }); + + final controller = cHomeProvider.scrollController; + + await tester.pumpWidget( + MaterialApp( + home: Scaffold( + body: ListView.builder( + controller: controller, + itemCount: 30, + itemBuilder: (context, index) { + return ListTile( + title: Text('Item $index'), + ); + }, + ), + ), + ), + ); + + await tester.pumpAndSettle(); + + await cHomeProvider.speakSentence(); + + await tester.pumpAndSettle(); + verify(mockPatientNotifier.state); + verify(mockPatientNotifier.user); + // verify(mockUserNotifier.user); + verify(mockLearnPictogram.call( + uid: anyNamed("uid"), + language: anyNamed("language"), + model: anyNamed("model"), + tokens: anyNamed("tokens"), + )); + verify(mockTTSProvider.speak(any)); + }); + }); + + test("speak yes", () async { + when(mockTTSProvider.speak(any)).thenAnswer((realInvocation) async => {}); + await cHomeProvider.speakYes(); + verify(mockTTSProvider.speak(any)); + verify(mockI18N.currentLanguage); + }); + + test("speak no", () async { + when(mockTTSProvider.speak(any)).thenAnswer((realInvocation) async => {}); + await cHomeProvider.speakNo(); + verify(mockTTSProvider.speak(any)); + verify(mockI18N.currentLanguage); + }); + + test("should return provider", () async { + GetIt.I.registerSingleton(MockPictogramsRepository()); + GetIt.I.registerSingleton(MockGroupsRepository()); + GetIt.I.registerSingleton(MockSentencesRepository()); + GetIt.I.registerSingleton(MockPredictPictogram()); + GetIt.I.registerSingleton(MockLearnPictogram()); + GetIt.I.registerSingleton(MockLocalDatabaseRepository()); + + final container = ProviderContainer(overrides: [ttsProvider.overrideWith((_) => mockTTSProvider), chatGPTProvider.overrideWith((ref) => mockChatGPTNotifier)]); + + final provider = container.read(homeProvider.notifier); + + expect(provider, isA()); + }); +} diff --git a/test/providers/home/home_provider_test.mocks.dart b/test/providers/home/home_provider_test.mocks.dart new file mode 100644 index 00000000..67140f5b --- /dev/null +++ b/test/providers/home/home_provider_test.mocks.dart @@ -0,0 +1,1089 @@ +// Mocks generated by Mockito 5.4.0 from annotations +// in ottaa_project_flutter/test/providers/home/home_provider_test.dart. +// Do not manually edit this file. + +// ignore_for_file: no_leading_underscores_for_library_prefixes +import 'dart:async' as _i8; +import 'dart:ui' as _i4; + +import 'package:dio/dio.dart' as _i16; +import 'package:either_dart/either.dart' as _i3; +import 'package:flutter_riverpod/flutter_riverpod.dart' as _i23; +import 'package:mockito/mockito.dart' as _i1; +import 'package:ottaa_project_flutter/application/common/i18n.dart' as _i5; +import 'package:ottaa_project_flutter/application/language/translation_tree.dart' + as _i21; +import 'package:ottaa_project_flutter/application/notifiers/patient_notifier.dart' + as _i22; +import 'package:ottaa_project_flutter/application/providers/chatgpt_provider.dart' + as _i19; +import 'package:ottaa_project_flutter/application/providers/tts_provider.dart' + as _i7; +import 'package:ottaa_project_flutter/application/providers/user_provider.dart' + as _i25; +import 'package:ottaa_project_flutter/core/abstracts/basic_search.dart' as _i12; +import 'package:ottaa_project_flutter/core/abstracts/user_model.dart' as _i20; +import 'package:ottaa_project_flutter/core/models/group_model.dart' as _i11; +import 'package:ottaa_project_flutter/core/models/learn_token.dart' as _i18; +import 'package:ottaa_project_flutter/core/models/patient_user_model.dart' + as _i6; +import 'package:ottaa_project_flutter/core/models/phrase_model.dart' as _i10; +import 'package:ottaa_project_flutter/core/models/picto_model.dart' as _i13; +import 'package:ottaa_project_flutter/core/models/picto_predicted_reduced.dart' + as _i15; +import 'package:ottaa_project_flutter/core/models/voices_model.dart' as _i9; +import 'package:ottaa_project_flutter/core/repositories/repositories.dart' + as _i2; +import 'package:ottaa_project_flutter/core/use_cases/learn_pictogram.dart' + as _i17; +import 'package:ottaa_project_flutter/core/use_cases/predict_pictogram.dart' + as _i14; +import 'package:state_notifier/state_notifier.dart' as _i24; + +// ignore_for_file: type=lint +// ignore_for_file: avoid_redundant_argument_values +// ignore_for_file: avoid_setters_without_getters +// ignore_for_file: comment_references +// ignore_for_file: implementation_imports +// ignore_for_file: invalid_use_of_visible_for_testing_member +// ignore_for_file: prefer_const_constructors +// ignore_for_file: unnecessary_parenthesis +// ignore_for_file: camel_case_types +// ignore_for_file: subtype_of_sealed_class + +class _FakeTTSRepository_0 extends _i1.SmartFake implements _i2.TTSRepository { + _FakeTTSRepository_0( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeEither_1 extends _i1.SmartFake implements _i3.Either { + _FakeEither_1( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeServerRepository_2 extends _i1.SmartFake + implements _i2.ServerRepository { + _FakeServerRepository_2( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeLocale_3 extends _i1.SmartFake implements _i4.Locale { + _FakeLocale_3( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeI18N_4 extends _i1.SmartFake implements _i5.I18N { + _FakeI18N_4( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakePatientUserModel_5 extends _i1.SmartFake + implements _i6.PatientUserModel { + _FakePatientUserModel_5( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +/// A class which mocks [TTSProvider]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockTTSProvider extends _i1.Mock implements _i7.TTSProvider { + MockTTSProvider() { + _i1.throwOnMissingStub(this); + } + + @override + _i2.TTSRepository get tts => (super.noSuchMethod( + Invocation.getter(#tts), + returnValue: _FakeTTSRepository_0( + this, + Invocation.getter(#tts), + ), + ) as _i2.TTSRepository); + @override + set speakOperation(_i8.Future? _speakOperation) => super.noSuchMethod( + Invocation.setter( + #speakOperation, + _speakOperation, + ), + returnValueForMissingStub: null, + ); + @override + bool get hasListeners => (super.noSuchMethod( + Invocation.getter(#hasListeners), + returnValue: false, + ) as bool); + @override + _i8.Future speak(String? text) => (super.noSuchMethod( + Invocation.method( + #speak, + [text], + ), + returnValue: _i8.Future.value(), + returnValueForMissingStub: _i8.Future.value(), + ) as _i8.Future); + @override + _i8.Future> fetchVoices(String? languageCode) => + (super.noSuchMethod( + Invocation.method( + #fetchVoices, + [languageCode], + ), + returnValue: _i8.Future>.value(<_i9.Voices>[]), + ) as _i8.Future>); + @override + _i8.Future changeVoiceSpeed(double? speed) => (super.noSuchMethod( + Invocation.method( + #changeVoiceSpeed, + [speed], + ), + returnValue: _i8.Future.value(), + returnValueForMissingStub: _i8.Future.value(), + ) as _i8.Future); + @override + _i8.Future changeCustomTTs(bool? value) => (super.noSuchMethod( + Invocation.method( + #changeCustomTTs, + [value], + ), + returnValue: _i8.Future.value(), + returnValueForMissingStub: _i8.Future.value(), + ) as _i8.Future); + @override + _i8.Future ttsStop() => (super.noSuchMethod( + Invocation.method( + #ttsStop, + [], + ), + returnValue: _i8.Future.value(), + returnValueForMissingStub: _i8.Future.value(), + ) as _i8.Future); + @override + _i8.Future changeTTSVoice(String? voice) => (super.noSuchMethod( + Invocation.method( + #changeTTSVoice, + [voice], + ), + returnValue: _i8.Future.value(), + returnValueForMissingStub: _i8.Future.value(), + ) as _i8.Future); + @override + _i8.Future init() => (super.noSuchMethod( + Invocation.method( + #init, + [], + ), + returnValue: _i8.Future.value(), + returnValueForMissingStub: _i8.Future.value(), + ) as _i8.Future); + @override + void addListener(_i4.VoidCallback? listener) => super.noSuchMethod( + Invocation.method( + #addListener, + [listener], + ), + returnValueForMissingStub: null, + ); + @override + void removeListener(_i4.VoidCallback? listener) => super.noSuchMethod( + Invocation.method( + #removeListener, + [listener], + ), + returnValueForMissingStub: null, + ); + @override + void dispose() => super.noSuchMethod( + Invocation.method( + #dispose, + [], + ), + returnValueForMissingStub: null, + ); + @override + void notifyListeners() => super.noSuchMethod( + Invocation.method( + #notifyListeners, + [], + ), + returnValueForMissingStub: null, + ); +} + +/// A class which mocks [SentencesRepository]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockSentencesRepository extends _i1.Mock + implements _i2.SentencesRepository { + MockSentencesRepository() { + _i1.throwOnMissingStub(this); + } + + @override + _i8.Future<_i3.Either>> fetchSentences({ + required String? language, + required String? type, + bool? isFavorite = false, + }) => + (super.noSuchMethod( + Invocation.method( + #fetchSentences, + [], + { + #language: language, + #type: type, + #isFavorite: isFavorite, + }, + ), + returnValue: _i8.Future<_i3.Either>>.value( + _FakeEither_1>( + this, + Invocation.method( + #fetchSentences, + [], + { + #language: language, + #type: type, + #isFavorite: isFavorite, + }, + ), + )), + ) as _i8.Future<_i3.Either>>); + @override + _i8.Future<_i3.Either> uploadSentences({ + required String? language, + required List<_i10.Phrase>? data, + required String? type, + }) => + (super.noSuchMethod( + Invocation.method( + #uploadSentences, + [], + { + #language: language, + #data: data, + #type: type, + }, + ), + returnValue: _i8.Future<_i3.Either>.value( + _FakeEither_1( + this, + Invocation.method( + #uploadSentences, + [], + { + #language: language, + #data: data, + #type: type, + }, + ), + )), + ) as _i8.Future<_i3.Either>); +} + +/// A class which mocks [GroupsRepository]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockGroupsRepository extends _i1.Mock implements _i2.GroupsRepository { + MockGroupsRepository() { + _i1.throwOnMissingStub(this); + } + + @override + _i8.Future> getAllGroups({bool? defaultGroups = false}) => + (super.noSuchMethod( + Invocation.method( + #getAllGroups, + [], + {#defaultGroups: defaultGroups}, + ), + returnValue: _i8.Future>.value(<_i11.Group>[]), + ) as _i8.Future>); + @override + _i8.Future> getDefaultGroups() => (super.noSuchMethod( + Invocation.method( + #getDefaultGroups, + [], + ), + returnValue: _i8.Future>.value(<_i11.Group>[]), + ) as _i8.Future>); + @override + _i8.Future uploadGroups( + List<_i11.Group>? data, + String? type, + String? language, { + String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #uploadGroups, + [ + data, + type, + language, + ], + {#userId: userId}, + ), + returnValue: _i8.Future.value(), + returnValueForMissingStub: _i8.Future.value(), + ) as _i8.Future); + @override + _i8.Future updateGroups( + _i11.Group? data, + String? type, + String? language, + int? index, + ) => + (super.noSuchMethod( + Invocation.method( + #updateGroups, + [ + data, + type, + language, + index, + ], + ), + returnValue: _i8.Future.value(), + returnValueForMissingStub: _i8.Future.value(), + ) as _i8.Future); + @override + _i8.Future> getGroups(_i12.BasicSearch? search) => + (super.noSuchMethod( + Invocation.method( + #getGroups, + [search], + ), + returnValue: _i8.Future>.value(<_i11.Group>[]), + ) as _i8.Future>); +} + +/// A class which mocks [PictogramsRepository]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockPictogramsRepository extends _i1.Mock + implements _i2.PictogramsRepository { + MockPictogramsRepository() { + _i1.throwOnMissingStub(this); + } + + @override + _i8.Future> getAllPictograms() => (super.noSuchMethod( + Invocation.method( + #getAllPictograms, + [], + ), + returnValue: _i8.Future>.value(<_i13.Picto>[]), + ) as _i8.Future>); + @override + _i8.Future uploadPictograms( + List<_i13.Picto>? data, + String? language, { + String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #uploadPictograms, + [ + data, + language, + ], + {#userId: userId}, + ), + returnValue: _i8.Future.value(), + returnValueForMissingStub: _i8.Future.value(), + ) as _i8.Future); + @override + _i8.Future updatePictogram( + _i13.Picto? pictogram, + String? language, + int? index, + ) => + (super.noSuchMethod( + Invocation.method( + #updatePictogram, + [ + pictogram, + language, + index, + ], + ), + returnValue: _i8.Future.value(), + returnValueForMissingStub: _i8.Future.value(), + ) as _i8.Future); + @override + _i8.Future> getPictograms(_i12.BasicSearch? search) => + (super.noSuchMethod( + Invocation.method( + #getPictograms, + [search], + ), + returnValue: _i8.Future>.value(<_i13.Picto>[]), + ) as _i8.Future>); + @override + _i8.Future> loadTranslations( + {required String? language}) => + (super.noSuchMethod( + Invocation.method( + #loadTranslations, + [], + {#language: language}, + ), + returnValue: _i8.Future>.value({}), + ) as _i8.Future>); +} + +/// A class which mocks [PredictPictogram]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockPredictPictogram extends _i1.Mock implements _i14.PredictPictogram { + MockPredictPictogram() { + _i1.throwOnMissingStub(this); + } + + @override + _i2.ServerRepository get serverRepository => (super.noSuchMethod( + Invocation.getter(#serverRepository), + returnValue: _FakeServerRepository_2( + this, + Invocation.getter(#serverRepository), + ), + ) as _i2.ServerRepository); + @override + set serverRepository(_i2.ServerRepository? _serverRepository) => + super.noSuchMethod( + Invocation.setter( + #serverRepository, + _serverRepository, + ), + returnValueForMissingStub: null, + ); + @override + _i8.Future<_i3.Either>> call({ + required String? sentence, + required String? uid, + required String? language, + required String? model, + required List? groups, + required Map>? tags, + bool? reduced = false, + int? limit = 10, + int? chunk = 4, + _i16.CancelToken? cancelToken, + }) => + (super.noSuchMethod( + Invocation.method( + #call, + [], + { + #sentence: sentence, + #uid: uid, + #language: language, + #model: model, + #groups: groups, + #tags: tags, + #reduced: reduced, + #limit: limit, + #chunk: chunk, + #cancelToken: cancelToken, + }, + ), + returnValue: _i8 + .Future<_i3.Either>>.value( + _FakeEither_1>( + this, + Invocation.method( + #call, + [], + { + #sentence: sentence, + #uid: uid, + #language: language, + #model: model, + #groups: groups, + #tags: tags, + #reduced: reduced, + #limit: limit, + #chunk: chunk, + #cancelToken: cancelToken, + }, + ), + )), + ) as _i8.Future<_i3.Either>>); +} + +/// A class which mocks [LearnPictogram]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockLearnPictogram extends _i1.Mock implements _i17.LearnPictogram { + MockLearnPictogram() { + _i1.throwOnMissingStub(this); + } + + @override + _i2.ServerRepository get serverRepository => (super.noSuchMethod( + Invocation.getter(#serverRepository), + returnValue: _FakeServerRepository_2( + this, + Invocation.getter(#serverRepository), + ), + ) as _i2.ServerRepository); + @override + set serverRepository(_i2.ServerRepository? _serverRepository) => + super.noSuchMethod( + Invocation.setter( + #serverRepository, + _serverRepository, + ), + returnValueForMissingStub: null, + ); + @override + _i8.Future<_i3.Either> call({ + String? sentence, + required String? uid, + required String? language, + required String? model, + required List<_i18.LearnToken>? tokens, + }) => + (super.noSuchMethod( + Invocation.method( + #call, + [], + { + #sentence: sentence, + #uid: uid, + #language: language, + #model: model, + #tokens: tokens, + }, + ), + returnValue: _i8.Future<_i3.Either>.value( + _FakeEither_1( + this, + Invocation.method( + #call, + [], + { + #sentence: sentence, + #uid: uid, + #language: language, + #model: model, + #tokens: tokens, + }, + ), + )), + ) as _i8.Future<_i3.Either>); +} + +/// A class which mocks [ChatGPTNotifier]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockChatGPTNotifier extends _i1.Mock implements _i19.ChatGPTNotifier { + MockChatGPTNotifier() { + _i1.throwOnMissingStub(this); + } + + @override + bool get hasListeners => (super.noSuchMethod( + Invocation.getter(#hasListeners), + returnValue: false, + ) as bool); + @override + _i8.Future generatePhrase(List<_i13.Picto>? pictograms) => + (super.noSuchMethod( + Invocation.method( + #generatePhrase, + [pictograms], + ), + returnValue: _i8.Future.value(), + ) as _i8.Future); + @override + void notify() => super.noSuchMethod( + Invocation.method( + #notify, + [], + ), + returnValueForMissingStub: null, + ); + @override + void addListener(_i4.VoidCallback? listener) => super.noSuchMethod( + Invocation.method( + #addListener, + [listener], + ), + returnValueForMissingStub: null, + ); + @override + void removeListener(_i4.VoidCallback? listener) => super.noSuchMethod( + Invocation.method( + #removeListener, + [listener], + ), + returnValueForMissingStub: null, + ); + @override + void dispose() => super.noSuchMethod( + Invocation.method( + #dispose, + [], + ), + returnValueForMissingStub: null, + ); + @override + void notifyListeners() => super.noSuchMethod( + Invocation.method( + #notifyListeners, + [], + ), + returnValueForMissingStub: null, + ); +} + +/// A class which mocks [LocalDatabaseRepository]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockLocalDatabaseRepository extends _i1.Mock + implements _i2.LocalDatabaseRepository { + MockLocalDatabaseRepository() { + _i1.throwOnMissingStub(this); + } + + @override + set user(_i20.UserModel? user) => super.noSuchMethod( + Invocation.setter( + #user, + user, + ), + returnValueForMissingStub: null, + ); + @override + _i8.Future init() => (super.noSuchMethod( + Invocation.method( + #init, + [], + ), + returnValue: _i8.Future.value(), + returnValueForMissingStub: _i8.Future.value(), + ) as _i8.Future); + @override + _i8.Future close() => (super.noSuchMethod( + Invocation.method( + #close, + [], + ), + returnValue: _i8.Future.value(), + returnValueForMissingStub: _i8.Future.value(), + ) as _i8.Future); + @override + _i8.Future setUser(_i20.UserModel? user) => (super.noSuchMethod( + Invocation.method( + #setUser, + [user], + ), + returnValue: _i8.Future.value(), + returnValueForMissingStub: _i8.Future.value(), + ) as _i8.Future); + @override + _i8.Future<_i20.UserModel?> getUser() => (super.noSuchMethod( + Invocation.method( + #getUser, + [], + ), + returnValue: _i8.Future<_i20.UserModel?>.value(), + ) as _i8.Future<_i20.UserModel?>); + @override + _i8.Future deleteUser() => (super.noSuchMethod( + Invocation.method( + #deleteUser, + [], + ), + returnValue: _i8.Future.value(), + returnValueForMissingStub: _i8.Future.value(), + ) as _i8.Future); + @override + _i8.Future getIntro() => (super.noSuchMethod( + Invocation.method( + #getIntro, + [], + ), + returnValue: _i8.Future.value(false), + ) as _i8.Future); + @override + _i8.Future setIntro([bool? value]) => (super.noSuchMethod( + Invocation.method( + #setIntro, + [value], + ), + returnValue: _i8.Future.value(), + returnValueForMissingStub: _i8.Future.value(), + ) as _i8.Future); + @override + _i8.Future getVoice() => (super.noSuchMethod( + Invocation.method( + #getVoice, + [], + ), + returnValue: _i8.Future.value(''), + ) as _i8.Future); + @override + _i8.Future getLongClick() => (super.noSuchMethod( + Invocation.method( + #getLongClick, + [], + ), + returnValue: _i8.Future.value(false), + ) as _i8.Future); + @override + _i8.Future setLongClick({required bool? isLongClick}) => + (super.noSuchMethod( + Invocation.method( + #setLongClick, + [], + {#isLongClick: isLongClick}, + ), + returnValue: _i8.Future.value(), + returnValueForMissingStub: _i8.Future.value(), + ) as _i8.Future); + @override + _i8.Future setVoice({required String? name}) => (super.noSuchMethod( + Invocation.method( + #setVoice, + [], + {#name: name}, + ), + returnValue: _i8.Future.value(), + returnValueForMissingStub: _i8.Future.value(), + ) as _i8.Future); + @override + _i8.Future setAppleUserDara({required Map? data}) => + (super.noSuchMethod( + Invocation.method( + #setAppleUserDara, + [], + {#data: data}, + ), + returnValue: _i8.Future.value(), + returnValueForMissingStub: _i8.Future.value(), + ) as _i8.Future); + @override + _i8.Future> getAppleUserData() => (super.noSuchMethod( + Invocation.method( + #getAppleUserData, + [], + ), + returnValue: _i8.Future>.value({}), + ) as _i8.Future>); +} + +/// A class which mocks [I18N]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockI18N extends _i1.Mock implements _i5.I18N { + MockI18N() { + _i1.throwOnMissingStub(this); + } + + @override + Map get platformLanguages => (super.noSuchMethod( + Invocation.getter(#platformLanguages), + returnValue: {}, + ) as Map); + @override + _i4.Locale get currentLocale => (super.noSuchMethod( + Invocation.getter(#currentLocale), + returnValue: _FakeLocale_3( + this, + Invocation.getter(#currentLocale), + ), + ) as _i4.Locale); + @override + set currentLocale(_i4.Locale? _currentLocale) => super.noSuchMethod( + Invocation.setter( + #currentLocale, + _currentLocale, + ), + returnValueForMissingStub: null, + ); + @override + bool get hasListeners => (super.noSuchMethod( + Invocation.getter(#hasListeners), + returnValue: false, + ) as bool); + @override + _i8.Future<_i5.I18N> init() => (super.noSuchMethod( + Invocation.method( + #init, + [], + ), + returnValue: _i8.Future<_i5.I18N>.value(_FakeI18N_4( + this, + Invocation.method( + #init, + [], + ), + )), + ) as _i8.Future<_i5.I18N>); + @override + _i8.Future<_i21.TranslationTree?> loadTranslation(_i4.Locale? locale) => + (super.noSuchMethod( + Invocation.method( + #loadTranslation, + [locale], + ), + returnValue: _i8.Future<_i21.TranslationTree?>.value(), + ) as _i8.Future<_i21.TranslationTree?>); + @override + _i8.Future changeLanguage(String? languageCode) => (super.noSuchMethod( + Invocation.method( + #changeLanguage, + [languageCode], + ), + returnValue: _i8.Future.value(), + returnValueForMissingStub: _i8.Future.value(), + ) as _i8.Future); + @override + _i8.Future changeLanguageFromLocale(_i4.Locale? locale) => + (super.noSuchMethod( + Invocation.method( + #changeLanguageFromLocale, + [locale], + ), + returnValue: _i8.Future.value(), + returnValueForMissingStub: _i8.Future.value(), + ) as _i8.Future); + @override + void notify() => super.noSuchMethod( + Invocation.method( + #notify, + [], + ), + returnValueForMissingStub: null, + ); + @override + void addListener(_i4.VoidCallback? listener) => super.noSuchMethod( + Invocation.method( + #addListener, + [listener], + ), + returnValueForMissingStub: null, + ); + @override + void removeListener(_i4.VoidCallback? listener) => super.noSuchMethod( + Invocation.method( + #removeListener, + [listener], + ), + returnValueForMissingStub: null, + ); + @override + void dispose() => super.noSuchMethod( + Invocation.method( + #dispose, + [], + ), + returnValueForMissingStub: null, + ); + @override + void notifyListeners() => super.noSuchMethod( + Invocation.method( + #notifyListeners, + [], + ), + returnValueForMissingStub: null, + ); +} + +/// A class which mocks [PatientNotifier]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockPatientNotifier extends _i1.Mock implements _i22.PatientNotifier { + @override + _i6.PatientUserModel get user => (super.noSuchMethod( + Invocation.getter(#user), + returnValue: _FakePatientUserModel_5( + this, + Invocation.getter(#user), + ), + returnValueForMissingStub: _FakePatientUserModel_5( + this, + Invocation.getter(#user), + ), + ) as _i6.PatientUserModel); + @override + set onError(_i23.ErrorListener? _onError) => super.noSuchMethod( + Invocation.setter( + #onError, + _onError, + ), + returnValueForMissingStub: null, + ); + @override + bool get mounted => (super.noSuchMethod( + Invocation.getter(#mounted), + returnValue: false, + returnValueForMissingStub: false, + ) as bool); + @override + _i8.Stream<_i6.PatientUserModel?> get stream => (super.noSuchMethod( + Invocation.getter(#stream), + returnValue: _i8.Stream<_i6.PatientUserModel?>.empty(), + returnValueForMissingStub: _i8.Stream<_i6.PatientUserModel?>.empty(), + ) as _i8.Stream<_i6.PatientUserModel?>); + @override + set state(_i6.PatientUserModel? value) => super.noSuchMethod( + Invocation.setter( + #state, + value, + ), + returnValueForMissingStub: null, + ); + @override + bool get hasListeners => (super.noSuchMethod( + Invocation.getter(#hasListeners), + returnValue: false, + returnValueForMissingStub: false, + ) as bool); + @override + void setUser(_i6.PatientUserModel? user) => super.noSuchMethod( + Invocation.method( + #setUser, + [user], + ), + returnValueForMissingStub: null, + ); + @override + bool updateShouldNotify( + _i6.PatientUserModel? old, + _i6.PatientUserModel? current, + ) => + (super.noSuchMethod( + Invocation.method( + #updateShouldNotify, + [ + old, + current, + ], + ), + returnValue: false, + returnValueForMissingStub: false, + ) as bool); + @override + _i23.RemoveListener addListener( + _i24.Listener<_i6.PatientUserModel?>? listener, { + bool? fireImmediately = true, + }) => + (super.noSuchMethod( + Invocation.method( + #addListener, + [listener], + {#fireImmediately: fireImmediately}, + ), + returnValue: () {}, + returnValueForMissingStub: () {}, + ) as _i23.RemoveListener); + @override + void dispose() => super.noSuchMethod( + Invocation.method( + #dispose, + [], + ), + returnValueForMissingStub: null, + ); +} + +/// A class which mocks [UserNotifier]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockUserNotifier extends _i1.Mock implements _i25.UserNotifier { + @override + set user(_i20.UserModel? userModel) => super.noSuchMethod( + Invocation.setter( + #user, + userModel, + ), + returnValueForMissingStub: null, + ); + @override + bool get hasListeners => (super.noSuchMethod( + Invocation.getter(#hasListeners), + returnValue: false, + returnValueForMissingStub: false, + ) as bool); + @override + void setUser(_i20.UserModel? userModel) => super.noSuchMethod( + Invocation.method( + #setUser, + [userModel], + ), + returnValueForMissingStub: null, + ); + @override + void clearUser() => super.noSuchMethod( + Invocation.method( + #clearUser, + [], + ), + returnValueForMissingStub: null, + ); + @override + void addListener(_i4.VoidCallback? listener) => super.noSuchMethod( + Invocation.method( + #addListener, + [listener], + ), + returnValueForMissingStub: null, + ); + @override + void removeListener(_i4.VoidCallback? listener) => super.noSuchMethod( + Invocation.method( + #removeListener, + [listener], + ), + returnValueForMissingStub: null, + ); + @override + void dispose() => super.noSuchMethod( + Invocation.method( + #dispose, + [], + ), + returnValueForMissingStub: null, + ); + @override + void notifyListeners() => super.noSuchMethod( + Invocation.method( + #notifyListeners, + [], + ), + returnValueForMissingStub: null, + ); +} diff --git a/test/service/LocalStorage/local_storage_service_test.dart b/test/service/LocalStorage/local_storage_service_test.dart new file mode 100644 index 00000000..b14f87d6 --- /dev/null +++ b/test/service/LocalStorage/local_storage_service_test.dart @@ -0,0 +1,51 @@ +import 'dart:ffi'; +import 'dart:io'; +import 'dart:typed_data'; + +import 'package:either_dart/src/either.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mockito/annotations.dart'; +import 'package:mockito/mockito.dart'; +import 'package:ottaa_project_flutter/application/service/local_storage_service.dart'; + +import 'package:path_provider/path_provider.dart'; +import 'package:path_provider_platform_interface/path_provider_platform_interface.dart'; +import 'package:plugin_platform_interface/plugin_platform_interface.dart'; + +import 'local_storage_service_test.mocks.dart'; + +const String kTemporaryPath = 'temporaryPath'; +const String kApplicationSupportPath = 'applicationSupportPath'; +const String kDownloadsPath = 'downloadsPath'; +const String kLibraryPath = 'libraryPath'; +const String kApplicationDocumentsPath = 'applicationDocumentsPath'; +const String kExternalCachePath = 'externalCachePath'; +const String kExternalStoragePath = 'externalStoragePath'; +const String kAssetsPath = './'; + +@GenerateMocks([PathProviderPlatform, AssetBundle]) +void main() { + late MockAssetBundle mockAssetBundle; + late LocalStorageService localStorageService; + setUp(() { + mockAssetBundle = MockAssetBundle(); + + localStorageService = LocalStorageService(assetBundler: mockAssetBundle); + }); + + test("factory method", () { + expect(LocalStorageService.start(), isA()); + + }); + test("read pictos from local should return a map", () async { + when(mockAssetBundle.loadString(any)).thenAnswer((realInvocation) async { + return '{"pictos": []}'; + }); + + final map = await localStorageService.readPictosFromLocal(locale: "es_AR"); + + expect(map, isA>()); + verify(mockAssetBundle.loadString(any)); + }); +} diff --git a/test/service/LocalStorage/local_storage_service_test.mocks.dart b/test/service/LocalStorage/local_storage_service_test.mocks.dart new file mode 100644 index 00000000..321d6d6a --- /dev/null +++ b/test/service/LocalStorage/local_storage_service_test.mocks.dart @@ -0,0 +1,211 @@ +// Mocks generated by Mockito 5.4.0 from annotations +// in ottaa_project_flutter/test/service/LocalStorage/local_storage_service_test.dart. +// Do not manually edit this file. + +// ignore_for_file: no_leading_underscores_for_library_prefixes +import 'dart:async' as _i3; +import 'dart:typed_data' as _i7; +import 'dart:ui' as _i2; + +import 'package:flutter/src/services/asset_bundle.dart' as _i6; +import 'package:mockito/mockito.dart' as _i1; +import 'package:path_provider_platform_interface/path_provider_platform_interface.dart' + as _i4; +import 'package:path_provider_platform_interface/src/enums.dart' as _i5; + +// ignore_for_file: type=lint +// ignore_for_file: avoid_redundant_argument_values +// ignore_for_file: avoid_setters_without_getters +// ignore_for_file: comment_references +// ignore_for_file: implementation_imports +// ignore_for_file: invalid_use_of_visible_for_testing_member +// ignore_for_file: prefer_const_constructors +// ignore_for_file: unnecessary_parenthesis +// ignore_for_file: camel_case_types +// ignore_for_file: subtype_of_sealed_class + +class _FakeImmutableBuffer_0 extends _i1.SmartFake + implements _i2.ImmutableBuffer { + _FakeImmutableBuffer_0( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeFuture_1 extends _i1.SmartFake implements _i3.Future { + _FakeFuture_1( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +/// A class which mocks [PathProviderPlatform]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockPathProviderPlatform extends _i1.Mock + implements _i4.PathProviderPlatform { + MockPathProviderPlatform() { + _i1.throwOnMissingStub(this); + } + + @override + _i3.Future getTemporaryPath() => (super.noSuchMethod( + Invocation.method( + #getTemporaryPath, + [], + ), + returnValue: _i3.Future.value(), + ) as _i3.Future); + @override + _i3.Future getApplicationSupportPath() => (super.noSuchMethod( + Invocation.method( + #getApplicationSupportPath, + [], + ), + returnValue: _i3.Future.value(), + ) as _i3.Future); + @override + _i3.Future getLibraryPath() => (super.noSuchMethod( + Invocation.method( + #getLibraryPath, + [], + ), + returnValue: _i3.Future.value(), + ) as _i3.Future); + @override + _i3.Future getApplicationDocumentsPath() => (super.noSuchMethod( + Invocation.method( + #getApplicationDocumentsPath, + [], + ), + returnValue: _i3.Future.value(), + ) as _i3.Future); + @override + _i3.Future getExternalStoragePath() => (super.noSuchMethod( + Invocation.method( + #getExternalStoragePath, + [], + ), + returnValue: _i3.Future.value(), + ) as _i3.Future); + @override + _i3.Future?> getExternalCachePaths() => (super.noSuchMethod( + Invocation.method( + #getExternalCachePaths, + [], + ), + returnValue: _i3.Future?>.value(), + ) as _i3.Future?>); + @override + _i3.Future?> getExternalStoragePaths( + {_i5.StorageDirectory? type}) => + (super.noSuchMethod( + Invocation.method( + #getExternalStoragePaths, + [], + {#type: type}, + ), + returnValue: _i3.Future?>.value(), + ) as _i3.Future?>); + @override + _i3.Future getDownloadsPath() => (super.noSuchMethod( + Invocation.method( + #getDownloadsPath, + [], + ), + returnValue: _i3.Future.value(), + ) as _i3.Future); +} + +/// A class which mocks [AssetBundle]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockAssetBundle extends _i1.Mock implements _i6.AssetBundle { + MockAssetBundle() { + _i1.throwOnMissingStub(this); + } + + @override + _i3.Future<_i7.ByteData> load(String? key) => (super.noSuchMethod( + Invocation.method( + #load, + [key], + ), + returnValue: _i3.Future<_i7.ByteData>.value(_i7.ByteData(0)), + ) as _i3.Future<_i7.ByteData>); + @override + _i3.Future<_i2.ImmutableBuffer> loadBuffer(String? key) => + (super.noSuchMethod( + Invocation.method( + #loadBuffer, + [key], + ), + returnValue: + _i3.Future<_i2.ImmutableBuffer>.value(_FakeImmutableBuffer_0( + this, + Invocation.method( + #loadBuffer, + [key], + ), + )), + ) as _i3.Future<_i2.ImmutableBuffer>); + @override + _i3.Future loadString( + String? key, { + bool? cache = true, + }) => + (super.noSuchMethod( + Invocation.method( + #loadString, + [key], + {#cache: cache}, + ), + returnValue: _i3.Future.value(''), + ) as _i3.Future); + @override + _i3.Future loadStructuredData( + String? key, + _i3.Future Function(String)? parser, + ) => + (super.noSuchMethod( + Invocation.method( + #loadStructuredData, + [ + key, + parser, + ], + ), + returnValue: _FakeFuture_1( + this, + Invocation.method( + #loadStructuredData, + [ + key, + parser, + ], + ), + ), + ) as _i3.Future); + @override + void evict(String? key) => super.noSuchMethod( + Invocation.method( + #evict, + [key], + ), + returnValueForMissingStub: null, + ); + @override + void clear() => super.noSuchMethod( + Invocation.method( + #clear, + [], + ), + returnValueForMissingStub: null, + ); +} diff --git a/test/service/about/about_service_test.dart b/test/service/about/about_service_test.dart new file mode 100644 index 00000000..3304dbc2 --- /dev/null +++ b/test/service/about/about_service_test.dart @@ -0,0 +1,234 @@ +import 'package:device_info_plus/device_info_plus.dart'; +import 'package:either_dart/either.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mockito/annotations.dart'; +import 'package:mockito/mockito.dart'; +import 'package:ottaa_project_flutter/application/service/service.dart'; +import 'package:ottaa_project_flutter/core/enums/user_payment.dart'; +import 'package:ottaa_project_flutter/core/enums/user_types.dart'; +import 'package:ottaa_project_flutter/core/models/assets_image.dart'; +import 'package:ottaa_project_flutter/core/models/base_settings_model.dart'; +import 'package:ottaa_project_flutter/core/models/base_user_model.dart'; +import 'package:ottaa_project_flutter/core/models/caregiver_user_model.dart'; +import 'package:ottaa_project_flutter/core/models/language_setting.dart'; +import 'package:ottaa_project_flutter/core/models/patient_user_model.dart'; +import 'package:ottaa_project_flutter/core/models/user_data_model.dart'; +import 'package:ottaa_project_flutter/core/repositories/repositories.dart'; +import 'package:package_info_plus/package_info_plus.dart'; + +import 'about_service_test.mocks.dart'; + +@GenerateMocks([ + ServerRepository, + LocalDatabaseRepository, + AuthRepository, +]) +Future main() async { + late MockServerRepository mockServerRepository; + late MockLocalDatabaseRepository mockLocalDatabaseRepository; + late MockAuthRepository mockAuthRepository; + + late AboutRepository aboutRepository; + + late BaseUserModel fakeUser; + + setUp(() { + mockServerRepository = MockServerRepository(); + mockLocalDatabaseRepository = MockLocalDatabaseRepository(); + mockAuthRepository = MockAuthRepository(); + PackageInfo.setMockInitialValues( + appName: "ottaa", + packageName: "com.ottaa", + version: "1.0.0", + buildNumber: "1", + buildSignature: "sig", + installerStore: "store", + ); + + fakeUser = BaseUserModel( + id: "0", + settings: BaseSettingsModel( + data: UserData( + avatar: AssetsImage(asset: "test", network: "https://test.com"), + birthDate: DateTime(0), + genderPref: "n/a", + lastConnection: DateTime(0), + name: "John", + lastName: "Doe", + ), + language: LanguageSetting.empty(), + ), + email: "test@mail.com", + type: UserType.caregiver, + ); + + aboutRepository = AboutService( + mockAuthRepository, + mockServerRepository, + mockLocalDatabaseRepository, + ); + }); + + test("should return the app version", () async { + String version = await aboutRepository.getAppVersion(); + + expect(version, "1.0.0"); + }); + + test("should return the available app version", () async { + when(mockServerRepository.getAvailableAppVersion(any)).thenAnswer((_) async => const Right("1.0.0")); + + String version = await aboutRepository.getAvailableAppVersion(); + + expect(version, "1.0.0"); + }); + + test("should return the device name (Unknown)", () async { + String deviceName = await aboutRepository.getDeviceName(); + + expect(deviceName, "Unknown"); + }); + + group("should return the user email", () { + test("with right response", () async { + when(mockAuthRepository.getCurrentUser()).thenAnswer((_) async => Right(fakeUser)); + + String email = await aboutRepository.getEmail(); + + expect(email, fakeUser.email); + }); + + test("with left response", () async { + when(mockAuthRepository.getCurrentUser()).thenAnswer((_) async => Left("No Email")); + + String email = await aboutRepository.getEmail(); + + expect(email, "No Email"); + }); + }); + + test("should return the user payment type", () async { + when(mockAuthRepository.getCurrentUser()).thenAnswer((_) async => Right(fakeUser)); + + UserPayment userType = await aboutRepository.getUserType(); + + expect(userType, UserPayment.free); + }); + + //TODO: Send email test u.u + + test("should return the current profile picture", () async { + when(mockAuthRepository.getCurrentUser()).thenAnswer((_) async => Right(fakeUser)); + when(mockServerRepository.getUserProfilePicture(fakeUser.id)).thenAnswer((realInvocation) async => const Right("671")); + + String profilePicture = await aboutRepository.getProfilePicture(); + + expect(profilePicture, "671"); + }); + + test("should upload profile picture", () async { + when(mockAuthRepository.getCurrentUser()).thenAnswer((_) async => Right(fakeUser)); + + when(mockServerRepository.uploadUserPicture(fakeUser.id, AssetsImage(asset: "9", network: ""))).thenAnswer((realInvocation) async { + fakeUser.settings.data = fakeUser.settings.data.copyWith( + avatar: realInvocation.positionalArguments[1] as AssetsImage, + ); + return const Right("9"); + }); + + await aboutRepository.uploadProfilePicture(AssetsImage(asset: "9", network: "")); + + expect(fakeUser.settings.data.avatar, AssetsImage(asset: "9", network: "")); + }); + + group("hould return the current user information", () { + test("as a caregiver", () async { + when(mockAuthRepository.getCurrentUser()).thenAnswer((_) async => Right(fakeUser)); + + when(mockServerRepository.getUserInformation(any)).thenAnswer((_) async => Right(fakeUser.toMap())); + + when(mockLocalDatabaseRepository.setUser(any)).thenAnswer((realInvocation) async => {}); + + final user = await aboutRepository.getUserInformation(); + + expect(user.right, isA()); + }); + + test("as a user", () async { + final userInfo = fakeUser.copyWith(type: UserType.user); + when(mockAuthRepository.getCurrentUser()).thenAnswer((_) async => Right(userInfo)); + + when(mockServerRepository.getUserInformation(any)).thenAnswer((_) async => Right(userInfo.toMap())); + + when(mockLocalDatabaseRepository.setUser(any)).thenAnswer((realInvocation) async => {}); + + final user = await aboutRepository.getUserInformation(); + + expect(user.right, isA()); + }); + + test("as a none", () async { + final userInfo = fakeUser.copyWith(type: UserType.none); + when(mockAuthRepository.getCurrentUser()).thenAnswer((_) async => Right(userInfo)); + + when(mockServerRepository.getUserInformation(any)).thenAnswer((_) async => Right(userInfo.toMap())); + + when(mockLocalDatabaseRepository.setUser(any)).thenAnswer((realInvocation) async => {}); + + final user = await aboutRepository.getUserInformation(); + + expect(user.right, isA()); + }); + }); + + test("should upload user information", () async { + CaregiverUserModel? userInformation; + + when(mockAuthRepository.getCurrentUser()).thenAnswer((_) async => Right(fakeUser)); + + when(mockServerRepository.uploadUserInformation(any, any)).thenAnswer((realInvocation) async { + userInformation = CaregiverUserModel.fromMap(realInvocation.positionalArguments[1] as dynamic); + return const Right("9"); + }); + + await aboutRepository.uploadUserInformation(); + + expect(userInformation, isA()); + }); + + test("should return if current user has avatar", () async { + when(mockAuthRepository.getCurrentUser()).thenAnswer((_) async => Right(fakeUser)); + bool exists = await aboutRepository.isCurrentUserAvatarExist(); + expect(exists, true); + }); + + test("should return if user is first time", () async { + when(mockAuthRepository.getCurrentUser()).thenAnswer((_) async => Right(fakeUser)); + bool exists = await aboutRepository.isFirstTime(); + expect(exists, true); + }); + + test("should update the user type", () async { + UserType oldUserType = UserType.caregiver; + when(mockServerRepository.updateUserType(id: "", userType: UserType.user)).thenAnswer((realInvocation) async { + oldUserType = realInvocation.namedArguments[#userType]; + }); + + await aboutRepository.updateUserType(id: "", userType: UserType.user); + + expect(oldUserType, UserType.user); + }); + + test("sould update the last user connection time", () async { + DateTime? lastConnection; + when(mockServerRepository.updateUserLastConnectionTime(userId: "", time: 0)).thenAnswer((realInvocation) async { + lastConnection = DateTime(realInvocation.namedArguments[#time]); + + return const Right(""); + }); + + await aboutRepository.updateUserLastConnectionTime(userId: "", time: 0); + + expect(lastConnection, DateTime(0)); + }); +} diff --git a/test/service/about/about_service_test.mocks.dart b/test/service/about/about_service_test.mocks.dart new file mode 100644 index 00000000..b3e6acfa --- /dev/null +++ b/test/service/about/about_service_test.mocks.dart @@ -0,0 +1,1305 @@ +// Mocks generated by Mockito 5.4.0 from annotations +// in ottaa_project_flutter/test/service/about/about_service_test.dart. +// Do not manually edit this file. + +// ignore_for_file: no_leading_underscores_for_library_prefixes +import 'dart:async' as _i4; + +import 'package:dio/dio.dart' as _i7; +import 'package:either_dart/either.dart' as _i2; +import 'package:mockito/mockito.dart' as _i1; +import 'package:ottaa_project_flutter/core/abstracts/user_model.dart' as _i13; +import 'package:ottaa_project_flutter/core/enums/board_data_type.dart' as _i9; +import 'package:ottaa_project_flutter/core/enums/sign_in_types.dart' as _i15; +import 'package:ottaa_project_flutter/core/enums/user_types.dart' as _i5; +import 'package:ottaa_project_flutter/core/models/arsaac_data_model.dart' + as _i11; +import 'package:ottaa_project_flutter/core/models/assets_image.dart' as _i6; +import 'package:ottaa_project_flutter/core/models/devices_token.dart' as _i10; +import 'package:ottaa_project_flutter/core/models/shortcuts_model.dart' as _i8; +import 'package:ottaa_project_flutter/core/repositories/auth_repository.dart' + as _i14; +import 'package:ottaa_project_flutter/core/repositories/local_database_repository.dart' + as _i12; +import 'package:ottaa_project_flutter/core/repositories/server_repository.dart' + as _i3; + +// ignore_for_file: type=lint +// ignore_for_file: avoid_redundant_argument_values +// ignore_for_file: avoid_setters_without_getters +// ignore_for_file: comment_references +// ignore_for_file: implementation_imports +// ignore_for_file: invalid_use_of_visible_for_testing_member +// ignore_for_file: prefer_const_constructors +// ignore_for_file: unnecessary_parenthesis +// ignore_for_file: camel_case_types +// ignore_for_file: subtype_of_sealed_class + +class _FakeEither_0 extends _i1.SmartFake implements _i2.Either { + _FakeEither_0( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +/// A class which mocks [ServerRepository]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockServerRepository extends _i1.Mock implements _i3.ServerRepository { + MockServerRepository() { + _i1.throwOnMissingStub(this); + } + + @override + _i4.Future<_i2.Either> getAvailableAppVersion( + String? platform) => + (super.noSuchMethod( + Invocation.method( + #getAvailableAppVersion, + [platform], + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #getAvailableAppVersion, + [platform], + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future<_i5.UserType> getUserType(String? userId) => (super.noSuchMethod( + Invocation.method( + #getUserType, + [userId], + ), + returnValue: _i4.Future<_i5.UserType>.value(_i5.UserType.caregiver), + ) as _i4.Future<_i5.UserType>); + @override + _i4.Future<_i2.Either> getUserProfilePicture( + String? userId) => + (super.noSuchMethod( + Invocation.method( + #getUserProfilePicture, + [userId], + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #getUserProfilePicture, + [userId], + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future<_i2.Either> uploadUserPicture( + String? userId, + _i6.AssetsImage? image, + ) => + (super.noSuchMethod( + Invocation.method( + #uploadUserPicture, + [ + userId, + image, + ], + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #uploadUserPicture, + [ + userId, + image, + ], + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future<_i2.Either>> getUserInformation( + String? id) => + (super.noSuchMethod( + Invocation.method( + #getUserInformation, + [id], + ), + returnValue: _i4.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #getUserInformation, + [id], + ), + )), + ) as _i4.Future<_i2.Either>>); + @override + _i4.Future<_i2.Either> uploadUserInformation( + String? userId, + Map? data, + ) => + (super.noSuchMethod( + Invocation.method( + #uploadUserInformation, + [ + userId, + data, + ], + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #uploadUserInformation, + [ + userId, + data, + ], + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future>> getUserSentences( + String? userId, { + required String? language, + required String? type, + bool? isFavorite = false, + }) => + (super.noSuchMethod( + Invocation.method( + #getUserSentences, + [userId], + { + #language: language, + #type: type, + #isFavorite: isFavorite, + }, + ), + returnValue: _i4.Future>>.value( + >[]), + ) as _i4.Future>>); + @override + _i4.Future<_i2.Either> uploadUserSentences( + String? userId, + String? language, + String? type, + List>? data, + ) => + (super.noSuchMethod( + Invocation.method( + #uploadUserSentences, + [ + userId, + language, + type, + data, + ], + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #uploadUserSentences, + [ + userId, + language, + type, + data, + ], + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future<_i2.Either>>> getAllPictograms( + String? userId, + String? languageCode, + ) => + (super.noSuchMethod( + Invocation.method( + #getAllPictograms, + [ + userId, + languageCode, + ], + ), + returnValue: + _i4.Future<_i2.Either>>>.value( + _FakeEither_0>>( + this, + Invocation.method( + #getAllPictograms, + [ + userId, + languageCode, + ], + ), + )), + ) as _i4.Future<_i2.Either>>>); + @override + _i4.Future<_i2.Either> uploadPictograms( + String? userId, + String? language, { + required List>? data, + }) => + (super.noSuchMethod( + Invocation.method( + #uploadPictograms, + [ + userId, + language, + ], + {#data: data}, + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #uploadPictograms, + [ + userId, + language, + ], + {#data: data}, + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future<_i2.Either> updatePictogram( + String? userId, + String? language, + int? index, { + required Map? data, + }) => + (super.noSuchMethod( + Invocation.method( + #updatePictogram, + [ + userId, + language, + index, + ], + {#data: data}, + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #updatePictogram, + [ + userId, + language, + index, + ], + {#data: data}, + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future<_i2.Either>>> getAllGroups( + String? userId, + String? languageCode, + ) => + (super.noSuchMethod( + Invocation.method( + #getAllGroups, + [ + userId, + languageCode, + ], + ), + returnValue: + _i4.Future<_i2.Either>>>.value( + _FakeEither_0>>( + this, + Invocation.method( + #getAllGroups, + [ + userId, + languageCode, + ], + ), + )), + ) as _i4.Future<_i2.Either>>>); + @override + _i4.Future<_i2.Either> uploadGroups( + String? userId, + String? language, { + required List>? data, + }) => + (super.noSuchMethod( + Invocation.method( + #uploadGroups, + [ + userId, + language, + ], + {#data: data}, + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #uploadGroups, + [ + userId, + language, + ], + {#data: data}, + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future<_i2.Either> updateGroup( + String? userId, + String? language, + int? index, { + required Map? data, + }) => + (super.noSuchMethod( + Invocation.method( + #updateGroup, + [ + userId, + language, + index, + ], + {#data: data}, + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #updateGroup, + [ + userId, + language, + index, + ], + {#data: data}, + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future<_i2.Either>> getPictogramsStatistics( + String? userId, + String? languageCode, [ + _i7.CancelToken? cancelToken, + ]) => + (super.noSuchMethod( + Invocation.method( + #getPictogramsStatistics, + [ + userId, + languageCode, + cancelToken, + ], + ), + returnValue: _i4.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #getPictogramsStatistics, + [ + userId, + languageCode, + cancelToken, + ], + ), + )), + ) as _i4.Future<_i2.Either>>); + @override + _i4.Future<_i2.Either>> getMostUsedSentences( + String? userId, + String? languageCode, [ + _i7.CancelToken? cancelToken, + ]) => + (super.noSuchMethod( + Invocation.method( + #getMostUsedSentences, + [ + userId, + languageCode, + cancelToken, + ], + ), + returnValue: _i4.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #getMostUsedSentences, + [ + userId, + languageCode, + cancelToken, + ], + ), + )), + ) as _i4.Future<_i2.Either>>); + @override + _i4.Future<_i2.Either> generatePhraseGPT({ + required String? prompt, + required int? maxTokens, + double? temperature = 0.0, + }) => + (super.noSuchMethod( + Invocation.method( + #generatePhraseGPT, + [], + { + #prompt: prompt, + #maxTokens: maxTokens, + #temperature: temperature, + }, + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #generatePhraseGPT, + [], + { + #prompt: prompt, + #maxTokens: maxTokens, + #temperature: temperature, + }, + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future uploadUserImage({ + required String? path, + required String? name, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #uploadUserImage, + [], + { + #path: path, + #name: name, + #userId: userId, + }, + ), + returnValue: _i4.Future.value(''), + ) as _i4.Future); + @override + _i4.Future updateUserSettings({ + required Map? data, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #updateUserSettings, + [], + { + #data: data, + #userId: userId, + }, + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future<_i2.Either>> getConnectedUsers( + {required String? userId}) => + (super.noSuchMethod( + Invocation.method( + #getConnectedUsers, + [], + {#userId: userId}, + ), + returnValue: _i4.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #getConnectedUsers, + [], + {#userId: userId}, + ), + )), + ) as _i4.Future<_i2.Either>>); + @override + _i4.Future<_i2.Either>> fetchConnectedUserData( + {required String? userId}) => + (super.noSuchMethod( + Invocation.method( + #fetchConnectedUserData, + [], + {#userId: userId}, + ), + returnValue: _i4.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #fetchConnectedUserData, + [], + {#userId: userId}, + ), + )), + ) as _i4.Future<_i2.Either>>); + @override + _i4.Future removeCurrentUser({ + required String? userId, + required String? careGiverId, + }) => + (super.noSuchMethod( + Invocation.method( + #removeCurrentUser, + [], + { + #userId: userId, + #careGiverId: careGiverId, + }, + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future<_i2.Either> setShortcutsForUser({ + required _i8.ShortcutsModel? shortcuts, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #setShortcutsForUser, + [], + { + #shortcuts: shortcuts, + #userId: userId, + }, + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #setShortcutsForUser, + [], + { + #shortcuts: shortcuts, + #userId: userId, + }, + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future updateUserData({ + required Map? data, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #updateUserData, + [], + { + #data: data, + #userId: userId, + }, + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future<_i2.Either>> getEmailToken( + String? ownEmail, + String? email, [ + _i7.CancelToken? cancelToken, + ]) => + (super.noSuchMethod( + Invocation.method( + #getEmailToken, + [ + ownEmail, + email, + cancelToken, + ], + ), + returnValue: _i4.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #getEmailToken, + [ + ownEmail, + email, + cancelToken, + ], + ), + )), + ) as _i4.Future<_i2.Either>>); + @override + _i4.Future<_i2.Either>> verifyEmailToken( + String? ownEmail, + String? email, + String? token, [ + _i7.CancelToken? cancelToken, + ]) => + (super.noSuchMethod( + Invocation.method( + #verifyEmailToken, + [ + ownEmail, + email, + token, + cancelToken, + ], + ), + returnValue: _i4.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #verifyEmailToken, + [ + ownEmail, + email, + token, + cancelToken, + ], + ), + )), + ) as _i4.Future<_i2.Either>>); + @override + _i4.Future<_i2.Either>> getProfileById( + {required String? id}) => + (super.noSuchMethod( + Invocation.method( + #getProfileById, + [], + {#id: id}, + ), + returnValue: _i4.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #getProfileById, + [], + {#id: id}, + ), + )), + ) as _i4.Future<_i2.Either>>); + @override + _i4.Future getDefaultGroups(String? languageCode) => + (super.noSuchMethod( + Invocation.method( + #getDefaultGroups, + [languageCode], + ), + returnValue: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future getDefaultPictos(String? languageCode) => + (super.noSuchMethod( + Invocation.method( + #getDefaultPictos, + [languageCode], + ), + returnValue: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future updateUserType({ + required String? id, + required _i5.UserType? userType, + }) => + (super.noSuchMethod( + Invocation.method( + #updateUserType, + [], + { + #id: id, + #userType: userType, + }, + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future<_i2.Either>> fetchShortcutsForUser( + {required String? userId}) => + (super.noSuchMethod( + Invocation.method( + #fetchShortcutsForUser, + [], + {#userId: userId}, + ), + returnValue: _i4.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #fetchShortcutsForUser, + [], + {#userId: userId}, + ), + )), + ) as _i4.Future<_i2.Either>>); + @override + _i4.Future?> createPictoGroupData({ + required String? userId, + required String? language, + required _i9.BoardDataType? type, + required Map? data, + _i7.CancelToken? cancelToken, + }) => + (super.noSuchMethod( + Invocation.method( + #createPictoGroupData, + [], + { + #userId: userId, + #language: language, + #type: type, + #data: data, + #cancelToken: cancelToken, + }, + ), + returnValue: _i4.Future?>.value(), + ) as _i4.Future?>); + @override + _i4.Future updateDevicesId({ + required String? userId, + required _i10.DeviceToken? deviceToken, + }) => + (super.noSuchMethod( + Invocation.method( + #updateDevicesId, + [], + { + #userId: userId, + #deviceToken: deviceToken, + }, + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future<_i2.Either>> learnPictograms({ + required String? uid, + required String? language, + required String? model, + required List>? tokens, + _i7.CancelToken? cancelToken, + }) => + (super.noSuchMethod( + Invocation.method( + #learnPictograms, + [], + { + #uid: uid, + #language: language, + #model: model, + #tokens: tokens, + #cancelToken: cancelToken, + }, + ), + returnValue: _i4.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #learnPictograms, + [], + { + #uid: uid, + #language: language, + #model: model, + #tokens: tokens, + #cancelToken: cancelToken, + }, + ), + )), + ) as _i4.Future<_i2.Either>>); + @override + _i4.Future<_i2.Either>> predictPictogram({ + required String? sentence, + required String? uid, + required String? language, + required String? model, + required List? groups, + required Map>? tags, + bool? reduced = false, + int? limit = 10, + int? chunk = 4, + _i7.CancelToken? cancelToken, + }) => + (super.noSuchMethod( + Invocation.method( + #predictPictogram, + [], + { + #sentence: sentence, + #uid: uid, + #language: language, + #model: model, + #groups: groups, + #tags: tags, + #reduced: reduced, + #limit: limit, + #chunk: chunk, + #cancelToken: cancelToken, + }, + ), + returnValue: _i4.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #predictPictogram, + [], + { + #sentence: sentence, + #uid: uid, + #language: language, + #model: model, + #groups: groups, + #tags: tags, + #reduced: reduced, + #limit: limit, + #chunk: chunk, + #cancelToken: cancelToken, + }, + ), + )), + ) as _i4.Future<_i2.Either>>); + @override + _i4.Future<_i2.Either> updateUserLastConnectionTime({ + required String? userId, + required int? time, + }) => + (super.noSuchMethod( + Invocation.method( + #updateUserLastConnectionTime, + [], + { + #userId: userId, + #time: time, + }, + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #updateUserLastConnectionTime, + [], + { + #userId: userId, + #time: time, + }, + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future fetchUserGroups({ + required String? languageCode, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #fetchUserGroups, + [], + { + #languageCode: languageCode, + #userId: userId, + }, + ), + returnValue: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future fetchUserPictos({ + required String? languageCode, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #fetchUserPictos, + [], + { + #languageCode: languageCode, + #userId: userId, + }, + ), + returnValue: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future updateLanguageSettings({ + required Map? map, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #updateLanguageSettings, + [], + { + #map: map, + #userId: userId, + }, + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future updateVoiceAndSubtitleSettings({ + required Map? map, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #updateVoiceAndSubtitleSettings, + [], + { + #map: map, + #userId: userId, + }, + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future updateAccessibilitySettings({ + required Map? map, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #updateAccessibilitySettings, + [], + { + #map: map, + #userId: userId, + }, + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future updateMainSettings({ + required Map? map, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #updateMainSettings, + [], + { + #map: map, + #userId: userId, + }, + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future fetchUserSettings({required String? userId}) => + (super.noSuchMethod( + Invocation.method( + #fetchUserSettings, + [], + {#userId: userId}, + ), + returnValue: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future<_i2.Either>> + fetchPhotosFromGlobalSymbols({ + required String? searchText, + required String? languageCode, + }) => + (super.noSuchMethod( + Invocation.method( + #fetchPhotosFromGlobalSymbols, + [], + { + #searchText: searchText, + #languageCode: languageCode, + }, + ), + returnValue: _i4 + .Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #fetchPhotosFromGlobalSymbols, + [], + { + #searchText: searchText, + #languageCode: languageCode, + }, + ), + )), + ) as _i4.Future<_i2.Either>>); + @override + _i4.Future uploadOtherImages({ + required String? imagePath, + required String? directoryPath, + required String? name, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #uploadOtherImages, + [], + { + #imagePath: imagePath, + #directoryPath: directoryPath, + #name: name, + #userId: userId, + }, + ), + returnValue: _i4.Future.value(''), + ) as _i4.Future); + @override + _i4.Future deleteTheAccount({required String? userId}) => + (super.noSuchMethod( + Invocation.method( + #deleteTheAccount, + [], + {#userId: userId}, + ), + returnValue: _i4.Future.value(false), + ) as _i4.Future); +} + +/// A class which mocks [LocalDatabaseRepository]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockLocalDatabaseRepository extends _i1.Mock + implements _i12.LocalDatabaseRepository { + MockLocalDatabaseRepository() { + _i1.throwOnMissingStub(this); + } + + @override + set user(_i13.UserModel? user) => super.noSuchMethod( + Invocation.setter( + #user, + user, + ), + returnValueForMissingStub: null, + ); + @override + _i4.Future init() => (super.noSuchMethod( + Invocation.method( + #init, + [], + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future close() => (super.noSuchMethod( + Invocation.method( + #close, + [], + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future setUser(_i13.UserModel? user) => (super.noSuchMethod( + Invocation.method( + #setUser, + [user], + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future<_i13.UserModel?> getUser() => (super.noSuchMethod( + Invocation.method( + #getUser, + [], + ), + returnValue: _i4.Future<_i13.UserModel?>.value(), + ) as _i4.Future<_i13.UserModel?>); + @override + _i4.Future deleteUser() => (super.noSuchMethod( + Invocation.method( + #deleteUser, + [], + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future getIntro() => (super.noSuchMethod( + Invocation.method( + #getIntro, + [], + ), + returnValue: _i4.Future.value(false), + ) as _i4.Future); + @override + _i4.Future setIntro([bool? value]) => (super.noSuchMethod( + Invocation.method( + #setIntro, + [value], + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future getVoice() => (super.noSuchMethod( + Invocation.method( + #getVoice, + [], + ), + returnValue: _i4.Future.value(''), + ) as _i4.Future); + @override + _i4.Future getLongClick() => (super.noSuchMethod( + Invocation.method( + #getLongClick, + [], + ), + returnValue: _i4.Future.value(false), + ) as _i4.Future); + @override + _i4.Future setLongClick({required bool? isLongClick}) => + (super.noSuchMethod( + Invocation.method( + #setLongClick, + [], + {#isLongClick: isLongClick}, + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future setVoice({required String? name}) => (super.noSuchMethod( + Invocation.method( + #setVoice, + [], + {#name: name}, + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future setAppleUserDara({required Map? data}) => + (super.noSuchMethod( + Invocation.method( + #setAppleUserDara, + [], + {#data: data}, + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future> getAppleUserData() => (super.noSuchMethod( + Invocation.method( + #getAppleUserData, + [], + ), + returnValue: _i4.Future>.value({}), + ) as _i4.Future>); +} + +/// A class which mocks [AuthRepository]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockAuthRepository extends _i1.Mock implements _i14.AuthRepository { + MockAuthRepository() { + _i1.throwOnMissingStub(this); + } + + @override + bool get isLogged => (super.noSuchMethod( + Invocation.getter(#isLogged), + returnValue: false, + ) as bool); + @override + _i4.Future<_i2.Either> signIn( + _i15.SignInType? type, [ + String? email, + String? password, + ]) => + (super.noSuchMethod( + Invocation.method( + #signIn, + [ + type, + email, + password, + ], + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #signIn, + [ + type, + email, + password, + ], + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future<_i2.Either> signUp() => (super.noSuchMethod( + Invocation.method( + #signUp, + [], + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #signUp, + [], + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future<_i2.Either> getCurrentUser() => + (super.noSuchMethod( + Invocation.method( + #getCurrentUser, + [], + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #getCurrentUser, + [], + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future isLoggedIn() => (super.noSuchMethod( + Invocation.method( + #isLoggedIn, + [], + ), + returnValue: _i4.Future.value(false), + ) as _i4.Future); + @override + _i4.Future logout() => (super.noSuchMethod( + Invocation.method( + #logout, + [], + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future getDeviceId() => (super.noSuchMethod( + Invocation.method( + #getDeviceId, + [], + ), + returnValue: _i4.Future.value(''), + ) as _i4.Future); + @override + _i4.Future deleteAccount({required String? userId}) => + (super.noSuchMethod( + Invocation.method( + #deleteAccount, + [], + {#userId: userId}, + ), + returnValue: _i4.Future.value(false), + ) as _i4.Future); +} diff --git a/test/service/auth/auth_service_test.dart b/test/service/auth/auth_service_test.dart new file mode 100644 index 00000000..9966b6bb --- /dev/null +++ b/test/service/auth/auth_service_test.dart @@ -0,0 +1,367 @@ +import 'dart:ui'; + +import 'package:either_dart/either.dart'; +import 'package:firebase_auth/firebase_auth.dart'; +import 'package:firebase_auth_mocks/firebase_auth_mocks.dart'; +import 'package:firebase_core/firebase_core.dart'; +import 'package:firebase_messaging/firebase_messaging.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:google_sign_in_mocks/google_sign_in_mocks.dart'; +import 'package:mockito/annotations.dart'; +import 'package:mockito/mockito.dart'; +import 'package:ottaa_project_flutter/application/common/i18n.dart'; +import 'package:ottaa_project_flutter/application/providers/auth_provider.dart'; +import 'package:ottaa_project_flutter/application/service/auth_service.dart'; +import 'package:ottaa_project_flutter/core/abstracts/user_model.dart'; +import 'package:ottaa_project_flutter/core/enums/sign_in_types.dart'; +import 'package:ottaa_project_flutter/core/enums/user_types.dart'; +import 'package:ottaa_project_flutter/core/models/base_user_model.dart'; +import 'package:ottaa_project_flutter/core/models/caregiver_user_model.dart'; +import 'package:ottaa_project_flutter/core/models/patient_user_model.dart'; +import 'package:ottaa_project_flutter/core/repositories/repositories.dart'; + +import '../notifications/firebase_messaging_mock.dart' as fmc; +import 'auth_service_test.mocks.dart'; + +@GenerateMocks([ + LocalDatabaseRepository, + ServerRepository, + I18N, + FirebaseMessaging, +]) +void main() async { + late MockGoogleSignIn googleSignIn; + + late MockFirebaseAuth firebaseAuth; + + late MockLocalDatabaseRepository localDatabaseRepository; + late MockServerRepository serverRepository; + late MockI18N i18n; + late MockFirebaseMessaging firebaseMessaging; + late AuthService authService; + + fmc.setupFirebaseMessagingMocks(); + + setUp(() async { + await Firebase.initializeApp(); + firebaseAuth = MockFirebaseAuth(); + googleSignIn = MockGoogleSignIn(); + localDatabaseRepository = MockLocalDatabaseRepository(); + serverRepository = MockServerRepository(); + i18n = MockI18N(); + firebaseMessaging = MockFirebaseMessaging(); + authService = AuthService( + localDatabaseRepository, + serverRepository, + i18n, + firebaseAuth: firebaseAuth, + googleSignIn: googleSignIn, + firebaseMessaging: firebaseMessaging, + ); + }); + + group("get current user", () { + test("should return the current user", () async { + when(localDatabaseRepository.getUser()).thenAnswer((realInvocation) async { + return getUserByType(UserType.user); + }); + + final result = await authService.getCurrentUser(); + + expect(result.right, isA()); + }); + + test("should return the current user", () async { + when(localDatabaseRepository.getUser()).thenAnswer((realInvocation) async { + return null; + }); + + final result = await authService.getCurrentUser(); + + expect(result.left, isA()); + }); + }); + + group("is logged in", () { + test("should return true", () async { + when(localDatabaseRepository.user).thenReturn(getUserByType(UserType.user)); + + final result = await authService.isLoggedIn(); + + expect(result, true); + }); + + test("should return false without user and userModel", () async { + when(localDatabaseRepository.user).thenReturn(null); + + final result = await authService.isLoggedIn(); + + expect(result, false); + }); + + test("should return false without user model", () async { + final user = MockUser(isAnonymous: false, uid: 'someuid', email: 'bob@somedomain.com', displayName: 'Bob', providerData: [ + UserInfo.fromJson({'providerId': 'google.com', 'uid': 'someuid', 'displayName': 'Bob', 'email': 'bob@somedomain.com', "isEmailVerified": true, 'isAnonymous': false}) + ]); + final signinAccount = await googleSignIn.signIn(); + final googleAuth = await signinAccount!.authentication; + + final AuthCredential credential = GoogleAuthProvider.credential( + accessToken: googleAuth.accessToken, + idToken: googleAuth.idToken, + ); + + await firebaseAuth.signInWithCredential(credential); + + firebaseAuth.mockUser = user; + + when(firebaseMessaging.getToken(vapidKey: anyNamed("vapidKey"))).thenAnswer((_) async { + return ""; + }); + when(localDatabaseRepository.user).thenReturn(null); + when(serverRepository.getUserInformation(any)).thenAnswer((realInvocation) async { + return Right(getUserInfo(UserType.user)); + }); + when(localDatabaseRepository.setUser(any)).thenAnswer((realInvocation) async { + return; + }); + + final result = await authService.isLoggedIn(); + + expect(result, true); + }); + }); + + group("logout", () { + test("should logout", () async { + final user = MockUser(isAnonymous: false, uid: 'someuid', email: 'bob@somedomain.com', displayName: 'Bob', providerData: [ + UserInfo.fromJson({'providerId': 'google.com', 'uid': 'someuid', 'displayName': 'Bob', 'email': 'bob@somedomain.com', "isEmailVerified": true, 'isAnonymous': false}) + ]); + final signinAccount = await googleSignIn.signIn(); + + final googleAuth = await signinAccount!.authentication; + + final AuthCredential credential = GoogleAuthProvider.credential( + accessToken: googleAuth.accessToken, + idToken: googleAuth.idToken, + ); + + await firebaseAuth.signInWithCredential(credential); + + firebaseAuth.mockUser = user; + + when(localDatabaseRepository.deleteUser()).thenAnswer((realInvocation) async {}); + + await authService.logout(); + verify(localDatabaseRepository.deleteUser()); + }); + }); + + group("build user model", () { + test("for patient", () async { + final user = MockUser(isAnonymous: false, uid: 'someuid', email: 'bob@somedomain.com', displayName: 'Bob', providerData: [ + UserInfo.fromJson({'providerId': 'google.com', 'uid': 'someuid', 'displayName': 'Bob', 'email': 'bob@somedomain.com', 'isAnonymous': false, "isEmailVerified": true}) + ]); + + when(serverRepository.getUserInformation(any)).thenAnswer((realInvocation) async { + return Right(getUserInfo(UserType.user)); + }); + + when(localDatabaseRepository.setUser(any)).thenAnswer((realInvocation) async { + return; + }); + + when(firebaseMessaging.getToken(vapidKey: anyNamed("vapidKey"))).thenAnswer((_) async { + return ""; + }); + final result = await authService.buildUserModel(user); + + expect(result, isA()); + }); + test("for caregiver", () async { + final user = MockUser(isAnonymous: false, uid: 'someuid', email: 'bob@somedomain.com', displayName: 'Bob', providerData: [ + UserInfo.fromJson({'providerId': 'google.com', 'uid': 'someuid', 'displayName': 'Bob', 'email': 'bob@somedomain.com', 'isAnonymous': false, "isEmailVerified": true}) + ]); + + when(serverRepository.getUserInformation(any)).thenAnswer((realInvocation) async { + return Right(getUserInfo(UserType.caregiver)); + }); + + when(localDatabaseRepository.setUser(any)).thenAnswer((realInvocation) async { + return; + }); + + when(firebaseMessaging.getToken(vapidKey: anyNamed("vapidKey"))).thenAnswer((_) async { + return ""; + }); + final result = await authService.buildUserModel(user); + + expect(result, isA()); + }); + + test("for none", () async { + final user = MockUser(isAnonymous: false, uid: 'someuid', email: 'bob@somedomain.com', displayName: 'Bob', providerData: [ + UserInfo.fromJson({'providerId': 'google.com', 'uid': 'someuid', 'displayName': 'Bob', 'email': 'bob@somedomain.com', 'isAnonymous': false, "isEmailVerified": true}) + ]); + + when(serverRepository.getUserInformation(any)).thenAnswer((realInvocation) async { + return Right(getUserInfo(UserType.none)); + }); + + when(localDatabaseRepository.setUser(any)).thenAnswer((realInvocation) async { + return; + }); + + when(firebaseMessaging.getToken(vapidKey: anyNamed("vapidKey"))).thenAnswer((_) async { + return ""; + }); + final result = await authService.buildUserModel(user); + + expect(result, isA()); + }); + }); + + group("sign in", () { + // test("should return user", () async { + // final user = MockUser( + // isAnonymous: false, + // uid: 'someuid', + // email: 'bob@somedomain.com', + // displayName: 'Bob', + // providerData: [ + // UserInfo.fromJson({'providerId': 'google.com', 'uid': 'someuid', 'displayName': 'Bob', 'email': 'bob@somedomain.com', 'isAnonymous': false, "isEmailVerified": true}) + // ], + // ); + // + // when(serverRepository.getUserInformation(any)).thenAnswer((realInvocation) async { + // return Right(getUserInfo(UserType.user)); + // }); + // + // when(firebaseMessaging.getToken(vapidKey: anyNamed("vapidKey"))).thenAnswer((_) async { + // return ""; + // }); + // + // firebaseAuth.mockUser = user; + // + // final result = await authService.signIn(SignInType.google); + // + // expect(result, isA()); + // }); + + // test("should signup user", () async { + // final user = MockUser( + // isAnonymous: false, + // uid: 'someuid', + // email: 'bob@somedomain.com', + // displayName: 'Bob', + // providerData: [ + // UserInfo.fromJson({'providerId': 'google.com', 'uid': 'someuid', 'displayName': 'Bob', 'email': 'bob@somedomain.com', 'isAnonymous': false, "isEmailVerified": true}) + // ], + // ); + // when(i18n.currentLocale).thenReturn(const Locale("es_AR")); + // + // when(serverRepository.getUserInformation(any)).thenAnswer((realInvocation) async { + // return const Left("No user"); + // }); + // + // when(firebaseMessaging.getToken(vapidKey: anyNamed("vapidKey"))).thenAnswer((_) async { + // return ""; + // }); + // + // when(serverRepository.uploadUserInformation(any, any)).thenAnswer((realInvocation) async { + // return const Right(null); + // }); + // + // firebaseAuth.mockUser = user; + // + // final result = await authService.signIn(SignInType.google); + // + // expect(result, isA()); + // verify(serverRepository.uploadUserInformation(any, any)); + // }); + + // test("should return cancelled", () async { + // googleSignIn.setIsCancelled(true); + // final result = await authService.signIn(SignInType.google); + // + // expect(result, isA()); + // }); + + // test("should throw an error", () async { + // final user = MockUser( + // isAnonymous: false, + // uid: 'someuid', + // email: 'bob@somedomain.com', + // displayName: 'Bob', + // providerData: [ + // UserInfo.fromJson({'providerId': 'google.com', 'uid': 'someuid', 'displayName': 'Bob', 'email': 'bob@somedomain.com', 'isAnonymous': false, "isEmailVerified": true}) + // ], + // ); + // when(i18n.currentLocale).thenReturn(const Locale("es_AR")); + // + // when(serverRepository.getUserInformation(any)).thenAnswer((realInvocation) async { + // return const Left("No user"); + // }); + // + // when(firebaseMessaging.getToken(vapidKey: anyNamed("vapidKey"))).thenAnswer((_) async { + // return ""; + // }); + // + // when(serverRepository.uploadUserInformation(any, any)).thenThrow(Exception()); + // + // firebaseAuth.mockUser = user; + // + // final result = await authService.signIn(SignInType.google); + // + // expect(result, isA()); + // verify(serverRepository.uploadUserInformation(any, any)); + // }); + }); +} + +UserModel getUserByType(UserType type) { + final fakeUserInfo = getUserInfo(type); + + switch (type) { + case UserType.user: + return PatientUserModel.fromMap(fakeUserInfo); + case UserType.caregiver: + return CaregiverUserModel.fromMap(fakeUserInfo); + case UserType.none: + return BaseUserModel.fromMap(fakeUserInfo); + } +} + +Map getUserInfo(UserType type) { + return { + "id": "mu4ZiTMURBeLEV7p3CrFbljBrHF2", + "settings": { + "data": { + "avatar": {"asset": "671", "network": "123"}, + "birthDate": 0, + "genderPref": "n/a", + "lastConnection": 1684420759838, + "lastName": "Ali", + "name": "Emir", + "number": "" + }, + "devices": [], + "language": { + "labs": false, + "language": "es_AR", + }, + "layout": { + "cleanup": true, + "display": "tab", + "oneToOne": false, + "shortcuts": {"camera": false, "enable": true, "favs": false, "games": true, "history": false, "no": true, "share": false, "yes": true} + }, + "payment": { + "payment": false, + "paymentDate": 0, + "paymentExpire": 0, + } + }, + "type": type.name + }; +} diff --git a/test/service/auth/auth_service_test.mocks.dart b/test/service/auth/auth_service_test.mocks.dart new file mode 100644 index 00000000..825144a2 --- /dev/null +++ b/test/service/auth/auth_service_test.mocks.dart @@ -0,0 +1,1582 @@ +// Mocks generated by Mockito 5.4.0 from annotations +// in ottaa_project_flutter/test/service/auth/auth_service_test.dart. +// Do not manually edit this file. + +// ignore_for_file: no_leading_underscores_for_library_prefixes +import 'dart:async' as _i9; +import 'dart:ui' as _i3; + +import 'package:dio/dio.dart' as _i13; +import 'package:either_dart/either.dart' as _i2; +import 'package:firebase_core/firebase_core.dart' as _i5; +import 'package:firebase_messaging/firebase_messaging.dart' as _i19; +import 'package:firebase_messaging_platform_interface/firebase_messaging_platform_interface.dart' + as _i6; +import 'package:mockito/mockito.dart' as _i1; +import 'package:ottaa_project_flutter/application/common/i18n.dart' as _i4; +import 'package:ottaa_project_flutter/application/language/translation_tree.dart' + as _i18; +import 'package:ottaa_project_flutter/core/abstracts/user_model.dart' as _i8; +import 'package:ottaa_project_flutter/core/enums/board_data_type.dart' as _i15; +import 'package:ottaa_project_flutter/core/enums/user_types.dart' as _i11; +import 'package:ottaa_project_flutter/core/models/arsaac_data_model.dart' + as _i17; +import 'package:ottaa_project_flutter/core/models/assets_image.dart' as _i12; +import 'package:ottaa_project_flutter/core/models/devices_token.dart' as _i16; +import 'package:ottaa_project_flutter/core/models/shortcuts_model.dart' as _i14; +import 'package:ottaa_project_flutter/core/repositories/local_database_repository.dart' + as _i7; +import 'package:ottaa_project_flutter/core/repositories/server_repository.dart' + as _i10; + +// ignore_for_file: type=lint +// ignore_for_file: avoid_redundant_argument_values +// ignore_for_file: avoid_setters_without_getters +// ignore_for_file: comment_references +// ignore_for_file: implementation_imports +// ignore_for_file: invalid_use_of_visible_for_testing_member +// ignore_for_file: prefer_const_constructors +// ignore_for_file: unnecessary_parenthesis +// ignore_for_file: camel_case_types +// ignore_for_file: subtype_of_sealed_class + +class _FakeEither_0 extends _i1.SmartFake implements _i2.Either { + _FakeEither_0( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeLocale_1 extends _i1.SmartFake implements _i3.Locale { + _FakeLocale_1( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeI18N_2 extends _i1.SmartFake implements _i4.I18N { + _FakeI18N_2( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeFirebaseApp_3 extends _i1.SmartFake implements _i5.FirebaseApp { + _FakeFirebaseApp_3( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeNotificationSettings_4 extends _i1.SmartFake + implements _i6.NotificationSettings { + _FakeNotificationSettings_4( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +/// A class which mocks [LocalDatabaseRepository]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockLocalDatabaseRepository extends _i1.Mock + implements _i7.LocalDatabaseRepository { + MockLocalDatabaseRepository() { + _i1.throwOnMissingStub(this); + } + + @override + set user(_i8.UserModel? user) => super.noSuchMethod( + Invocation.setter( + #user, + user, + ), + returnValueForMissingStub: null, + ); + @override + _i9.Future init() => (super.noSuchMethod( + Invocation.method( + #init, + [], + ), + returnValue: _i9.Future.value(), + returnValueForMissingStub: _i9.Future.value(), + ) as _i9.Future); + @override + _i9.Future close() => (super.noSuchMethod( + Invocation.method( + #close, + [], + ), + returnValue: _i9.Future.value(), + returnValueForMissingStub: _i9.Future.value(), + ) as _i9.Future); + @override + _i9.Future setUser(_i8.UserModel? user) => (super.noSuchMethod( + Invocation.method( + #setUser, + [user], + ), + returnValue: _i9.Future.value(), + returnValueForMissingStub: _i9.Future.value(), + ) as _i9.Future); + @override + _i9.Future<_i8.UserModel?> getUser() => (super.noSuchMethod( + Invocation.method( + #getUser, + [], + ), + returnValue: _i9.Future<_i8.UserModel?>.value(), + ) as _i9.Future<_i8.UserModel?>); + @override + _i9.Future deleteUser() => (super.noSuchMethod( + Invocation.method( + #deleteUser, + [], + ), + returnValue: _i9.Future.value(), + returnValueForMissingStub: _i9.Future.value(), + ) as _i9.Future); + @override + _i9.Future getIntro() => (super.noSuchMethod( + Invocation.method( + #getIntro, + [], + ), + returnValue: _i9.Future.value(false), + ) as _i9.Future); + @override + _i9.Future setIntro([bool? value]) => (super.noSuchMethod( + Invocation.method( + #setIntro, + [value], + ), + returnValue: _i9.Future.value(), + returnValueForMissingStub: _i9.Future.value(), + ) as _i9.Future); + @override + _i9.Future getVoice() => (super.noSuchMethod( + Invocation.method( + #getVoice, + [], + ), + returnValue: _i9.Future.value(''), + ) as _i9.Future); + @override + _i9.Future getLongClick() => (super.noSuchMethod( + Invocation.method( + #getLongClick, + [], + ), + returnValue: _i9.Future.value(false), + ) as _i9.Future); + @override + _i9.Future setLongClick({required bool? isLongClick}) => + (super.noSuchMethod( + Invocation.method( + #setLongClick, + [], + {#isLongClick: isLongClick}, + ), + returnValue: _i9.Future.value(), + returnValueForMissingStub: _i9.Future.value(), + ) as _i9.Future); + @override + _i9.Future setVoice({required String? name}) => (super.noSuchMethod( + Invocation.method( + #setVoice, + [], + {#name: name}, + ), + returnValue: _i9.Future.value(), + returnValueForMissingStub: _i9.Future.value(), + ) as _i9.Future); + @override + _i9.Future setAppleUserDara({required Map? data}) => + (super.noSuchMethod( + Invocation.method( + #setAppleUserDara, + [], + {#data: data}, + ), + returnValue: _i9.Future.value(), + returnValueForMissingStub: _i9.Future.value(), + ) as _i9.Future); + @override + _i9.Future> getAppleUserData() => (super.noSuchMethod( + Invocation.method( + #getAppleUserData, + [], + ), + returnValue: _i9.Future>.value({}), + ) as _i9.Future>); +} + +/// A class which mocks [ServerRepository]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockServerRepository extends _i1.Mock implements _i10.ServerRepository { + MockServerRepository() { + _i1.throwOnMissingStub(this); + } + + @override + _i9.Future<_i2.Either> getAvailableAppVersion( + String? platform) => + (super.noSuchMethod( + Invocation.method( + #getAvailableAppVersion, + [platform], + ), + returnValue: _i9.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #getAvailableAppVersion, + [platform], + ), + )), + ) as _i9.Future<_i2.Either>); + @override + _i9.Future<_i11.UserType> getUserType(String? userId) => (super.noSuchMethod( + Invocation.method( + #getUserType, + [userId], + ), + returnValue: _i9.Future<_i11.UserType>.value(_i11.UserType.caregiver), + ) as _i9.Future<_i11.UserType>); + @override + _i9.Future<_i2.Either> getUserProfilePicture( + String? userId) => + (super.noSuchMethod( + Invocation.method( + #getUserProfilePicture, + [userId], + ), + returnValue: _i9.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #getUserProfilePicture, + [userId], + ), + )), + ) as _i9.Future<_i2.Either>); + @override + _i9.Future<_i2.Either> uploadUserPicture( + String? userId, + _i12.AssetsImage? image, + ) => + (super.noSuchMethod( + Invocation.method( + #uploadUserPicture, + [ + userId, + image, + ], + ), + returnValue: _i9.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #uploadUserPicture, + [ + userId, + image, + ], + ), + )), + ) as _i9.Future<_i2.Either>); + @override + _i9.Future<_i2.Either>> getUserInformation( + String? id) => + (super.noSuchMethod( + Invocation.method( + #getUserInformation, + [id], + ), + returnValue: _i9.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #getUserInformation, + [id], + ), + )), + ) as _i9.Future<_i2.Either>>); + @override + _i9.Future<_i2.Either> uploadUserInformation( + String? userId, + Map? data, + ) => + (super.noSuchMethod( + Invocation.method( + #uploadUserInformation, + [ + userId, + data, + ], + ), + returnValue: _i9.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #uploadUserInformation, + [ + userId, + data, + ], + ), + )), + ) as _i9.Future<_i2.Either>); + @override + _i9.Future>> getUserSentences( + String? userId, { + required String? language, + required String? type, + bool? isFavorite = false, + }) => + (super.noSuchMethod( + Invocation.method( + #getUserSentences, + [userId], + { + #language: language, + #type: type, + #isFavorite: isFavorite, + }, + ), + returnValue: _i9.Future>>.value( + >[]), + ) as _i9.Future>>); + @override + _i9.Future<_i2.Either> uploadUserSentences( + String? userId, + String? language, + String? type, + List>? data, + ) => + (super.noSuchMethod( + Invocation.method( + #uploadUserSentences, + [ + userId, + language, + type, + data, + ], + ), + returnValue: _i9.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #uploadUserSentences, + [ + userId, + language, + type, + data, + ], + ), + )), + ) as _i9.Future<_i2.Either>); + @override + _i9.Future<_i2.Either>>> getAllPictograms( + String? userId, + String? languageCode, + ) => + (super.noSuchMethod( + Invocation.method( + #getAllPictograms, + [ + userId, + languageCode, + ], + ), + returnValue: + _i9.Future<_i2.Either>>>.value( + _FakeEither_0>>( + this, + Invocation.method( + #getAllPictograms, + [ + userId, + languageCode, + ], + ), + )), + ) as _i9.Future<_i2.Either>>>); + @override + _i9.Future<_i2.Either> uploadPictograms( + String? userId, + String? language, { + required List>? data, + }) => + (super.noSuchMethod( + Invocation.method( + #uploadPictograms, + [ + userId, + language, + ], + {#data: data}, + ), + returnValue: _i9.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #uploadPictograms, + [ + userId, + language, + ], + {#data: data}, + ), + )), + ) as _i9.Future<_i2.Either>); + @override + _i9.Future<_i2.Either> updatePictogram( + String? userId, + String? language, + int? index, { + required Map? data, + }) => + (super.noSuchMethod( + Invocation.method( + #updatePictogram, + [ + userId, + language, + index, + ], + {#data: data}, + ), + returnValue: _i9.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #updatePictogram, + [ + userId, + language, + index, + ], + {#data: data}, + ), + )), + ) as _i9.Future<_i2.Either>); + @override + _i9.Future<_i2.Either>>> getAllGroups( + String? userId, + String? languageCode, + ) => + (super.noSuchMethod( + Invocation.method( + #getAllGroups, + [ + userId, + languageCode, + ], + ), + returnValue: + _i9.Future<_i2.Either>>>.value( + _FakeEither_0>>( + this, + Invocation.method( + #getAllGroups, + [ + userId, + languageCode, + ], + ), + )), + ) as _i9.Future<_i2.Either>>>); + @override + _i9.Future<_i2.Either> uploadGroups( + String? userId, + String? language, { + required List>? data, + }) => + (super.noSuchMethod( + Invocation.method( + #uploadGroups, + [ + userId, + language, + ], + {#data: data}, + ), + returnValue: _i9.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #uploadGroups, + [ + userId, + language, + ], + {#data: data}, + ), + )), + ) as _i9.Future<_i2.Either>); + @override + _i9.Future<_i2.Either> updateGroup( + String? userId, + String? language, + int? index, { + required Map? data, + }) => + (super.noSuchMethod( + Invocation.method( + #updateGroup, + [ + userId, + language, + index, + ], + {#data: data}, + ), + returnValue: _i9.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #updateGroup, + [ + userId, + language, + index, + ], + {#data: data}, + ), + )), + ) as _i9.Future<_i2.Either>); + @override + _i9.Future<_i2.Either>> getPictogramsStatistics( + String? userId, + String? languageCode, [ + _i13.CancelToken? cancelToken, + ]) => + (super.noSuchMethod( + Invocation.method( + #getPictogramsStatistics, + [ + userId, + languageCode, + cancelToken, + ], + ), + returnValue: _i9.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #getPictogramsStatistics, + [ + userId, + languageCode, + cancelToken, + ], + ), + )), + ) as _i9.Future<_i2.Either>>); + @override + _i9.Future<_i2.Either>> getMostUsedSentences( + String? userId, + String? languageCode, [ + _i13.CancelToken? cancelToken, + ]) => + (super.noSuchMethod( + Invocation.method( + #getMostUsedSentences, + [ + userId, + languageCode, + cancelToken, + ], + ), + returnValue: _i9.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #getMostUsedSentences, + [ + userId, + languageCode, + cancelToken, + ], + ), + )), + ) as _i9.Future<_i2.Either>>); + @override + _i9.Future<_i2.Either> generatePhraseGPT({ + required String? prompt, + required int? maxTokens, + double? temperature = 0.0, + }) => + (super.noSuchMethod( + Invocation.method( + #generatePhraseGPT, + [], + { + #prompt: prompt, + #maxTokens: maxTokens, + #temperature: temperature, + }, + ), + returnValue: _i9.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #generatePhraseGPT, + [], + { + #prompt: prompt, + #maxTokens: maxTokens, + #temperature: temperature, + }, + ), + )), + ) as _i9.Future<_i2.Either>); + @override + _i9.Future uploadUserImage({ + required String? path, + required String? name, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #uploadUserImage, + [], + { + #path: path, + #name: name, + #userId: userId, + }, + ), + returnValue: _i9.Future.value(''), + ) as _i9.Future); + @override + _i9.Future updateUserSettings({ + required Map? data, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #updateUserSettings, + [], + { + #data: data, + #userId: userId, + }, + ), + returnValue: _i9.Future.value(), + returnValueForMissingStub: _i9.Future.value(), + ) as _i9.Future); + @override + _i9.Future<_i2.Either>> getConnectedUsers( + {required String? userId}) => + (super.noSuchMethod( + Invocation.method( + #getConnectedUsers, + [], + {#userId: userId}, + ), + returnValue: _i9.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #getConnectedUsers, + [], + {#userId: userId}, + ), + )), + ) as _i9.Future<_i2.Either>>); + @override + _i9.Future<_i2.Either>> fetchConnectedUserData( + {required String? userId}) => + (super.noSuchMethod( + Invocation.method( + #fetchConnectedUserData, + [], + {#userId: userId}, + ), + returnValue: _i9.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #fetchConnectedUserData, + [], + {#userId: userId}, + ), + )), + ) as _i9.Future<_i2.Either>>); + @override + _i9.Future removeCurrentUser({ + required String? userId, + required String? careGiverId, + }) => + (super.noSuchMethod( + Invocation.method( + #removeCurrentUser, + [], + { + #userId: userId, + #careGiverId: careGiverId, + }, + ), + returnValue: _i9.Future.value(), + returnValueForMissingStub: _i9.Future.value(), + ) as _i9.Future); + @override + _i9.Future<_i2.Either> setShortcutsForUser({ + required _i14.ShortcutsModel? shortcuts, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #setShortcutsForUser, + [], + { + #shortcuts: shortcuts, + #userId: userId, + }, + ), + returnValue: _i9.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #setShortcutsForUser, + [], + { + #shortcuts: shortcuts, + #userId: userId, + }, + ), + )), + ) as _i9.Future<_i2.Either>); + @override + _i9.Future updateUserData({ + required Map? data, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #updateUserData, + [], + { + #data: data, + #userId: userId, + }, + ), + returnValue: _i9.Future.value(), + returnValueForMissingStub: _i9.Future.value(), + ) as _i9.Future); + @override + _i9.Future<_i2.Either>> getEmailToken( + String? ownEmail, + String? email, [ + _i13.CancelToken? cancelToken, + ]) => + (super.noSuchMethod( + Invocation.method( + #getEmailToken, + [ + ownEmail, + email, + cancelToken, + ], + ), + returnValue: _i9.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #getEmailToken, + [ + ownEmail, + email, + cancelToken, + ], + ), + )), + ) as _i9.Future<_i2.Either>>); + @override + _i9.Future<_i2.Either>> verifyEmailToken( + String? ownEmail, + String? email, + String? token, [ + _i13.CancelToken? cancelToken, + ]) => + (super.noSuchMethod( + Invocation.method( + #verifyEmailToken, + [ + ownEmail, + email, + token, + cancelToken, + ], + ), + returnValue: _i9.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #verifyEmailToken, + [ + ownEmail, + email, + token, + cancelToken, + ], + ), + )), + ) as _i9.Future<_i2.Either>>); + @override + _i9.Future<_i2.Either>> getProfileById( + {required String? id}) => + (super.noSuchMethod( + Invocation.method( + #getProfileById, + [], + {#id: id}, + ), + returnValue: _i9.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #getProfileById, + [], + {#id: id}, + ), + )), + ) as _i9.Future<_i2.Either>>); + @override + _i9.Future getDefaultGroups(String? languageCode) => + (super.noSuchMethod( + Invocation.method( + #getDefaultGroups, + [languageCode], + ), + returnValue: _i9.Future.value(), + ) as _i9.Future); + @override + _i9.Future getDefaultPictos(String? languageCode) => + (super.noSuchMethod( + Invocation.method( + #getDefaultPictos, + [languageCode], + ), + returnValue: _i9.Future.value(), + ) as _i9.Future); + @override + _i9.Future updateUserType({ + required String? id, + required _i11.UserType? userType, + }) => + (super.noSuchMethod( + Invocation.method( + #updateUserType, + [], + { + #id: id, + #userType: userType, + }, + ), + returnValue: _i9.Future.value(), + returnValueForMissingStub: _i9.Future.value(), + ) as _i9.Future); + @override + _i9.Future<_i2.Either>> fetchShortcutsForUser( + {required String? userId}) => + (super.noSuchMethod( + Invocation.method( + #fetchShortcutsForUser, + [], + {#userId: userId}, + ), + returnValue: _i9.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #fetchShortcutsForUser, + [], + {#userId: userId}, + ), + )), + ) as _i9.Future<_i2.Either>>); + @override + _i9.Future?> createPictoGroupData({ + required String? userId, + required String? language, + required _i15.BoardDataType? type, + required Map? data, + _i13.CancelToken? cancelToken, + }) => + (super.noSuchMethod( + Invocation.method( + #createPictoGroupData, + [], + { + #userId: userId, + #language: language, + #type: type, + #data: data, + #cancelToken: cancelToken, + }, + ), + returnValue: _i9.Future?>.value(), + ) as _i9.Future?>); + @override + _i9.Future updateDevicesId({ + required String? userId, + required _i16.DeviceToken? deviceToken, + }) => + (super.noSuchMethod( + Invocation.method( + #updateDevicesId, + [], + { + #userId: userId, + #deviceToken: deviceToken, + }, + ), + returnValue: _i9.Future.value(), + returnValueForMissingStub: _i9.Future.value(), + ) as _i9.Future); + @override + _i9.Future<_i2.Either>> learnPictograms({ + required String? uid, + required String? language, + required String? model, + required List>? tokens, + _i13.CancelToken? cancelToken, + }) => + (super.noSuchMethod( + Invocation.method( + #learnPictograms, + [], + { + #uid: uid, + #language: language, + #model: model, + #tokens: tokens, + #cancelToken: cancelToken, + }, + ), + returnValue: _i9.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #learnPictograms, + [], + { + #uid: uid, + #language: language, + #model: model, + #tokens: tokens, + #cancelToken: cancelToken, + }, + ), + )), + ) as _i9.Future<_i2.Either>>); + @override + _i9.Future<_i2.Either>> predictPictogram({ + required String? sentence, + required String? uid, + required String? language, + required String? model, + required List? groups, + required Map>? tags, + bool? reduced = false, + int? limit = 10, + int? chunk = 4, + _i13.CancelToken? cancelToken, + }) => + (super.noSuchMethod( + Invocation.method( + #predictPictogram, + [], + { + #sentence: sentence, + #uid: uid, + #language: language, + #model: model, + #groups: groups, + #tags: tags, + #reduced: reduced, + #limit: limit, + #chunk: chunk, + #cancelToken: cancelToken, + }, + ), + returnValue: _i9.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #predictPictogram, + [], + { + #sentence: sentence, + #uid: uid, + #language: language, + #model: model, + #groups: groups, + #tags: tags, + #reduced: reduced, + #limit: limit, + #chunk: chunk, + #cancelToken: cancelToken, + }, + ), + )), + ) as _i9.Future<_i2.Either>>); + @override + _i9.Future<_i2.Either> updateUserLastConnectionTime({ + required String? userId, + required int? time, + }) => + (super.noSuchMethod( + Invocation.method( + #updateUserLastConnectionTime, + [], + { + #userId: userId, + #time: time, + }, + ), + returnValue: _i9.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #updateUserLastConnectionTime, + [], + { + #userId: userId, + #time: time, + }, + ), + )), + ) as _i9.Future<_i2.Either>); + @override + _i9.Future fetchUserGroups({ + required String? languageCode, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #fetchUserGroups, + [], + { + #languageCode: languageCode, + #userId: userId, + }, + ), + returnValue: _i9.Future.value(), + ) as _i9.Future); + @override + _i9.Future fetchUserPictos({ + required String? languageCode, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #fetchUserPictos, + [], + { + #languageCode: languageCode, + #userId: userId, + }, + ), + returnValue: _i9.Future.value(), + ) as _i9.Future); + @override + _i9.Future updateLanguageSettings({ + required Map? map, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #updateLanguageSettings, + [], + { + #map: map, + #userId: userId, + }, + ), + returnValue: _i9.Future.value(), + returnValueForMissingStub: _i9.Future.value(), + ) as _i9.Future); + @override + _i9.Future updateVoiceAndSubtitleSettings({ + required Map? map, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #updateVoiceAndSubtitleSettings, + [], + { + #map: map, + #userId: userId, + }, + ), + returnValue: _i9.Future.value(), + returnValueForMissingStub: _i9.Future.value(), + ) as _i9.Future); + @override + _i9.Future updateAccessibilitySettings({ + required Map? map, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #updateAccessibilitySettings, + [], + { + #map: map, + #userId: userId, + }, + ), + returnValue: _i9.Future.value(), + returnValueForMissingStub: _i9.Future.value(), + ) as _i9.Future); + @override + _i9.Future updateMainSettings({ + required Map? map, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #updateMainSettings, + [], + { + #map: map, + #userId: userId, + }, + ), + returnValue: _i9.Future.value(), + returnValueForMissingStub: _i9.Future.value(), + ) as _i9.Future); + @override + _i9.Future fetchUserSettings({required String? userId}) => + (super.noSuchMethod( + Invocation.method( + #fetchUserSettings, + [], + {#userId: userId}, + ), + returnValue: _i9.Future.value(), + ) as _i9.Future); + @override + _i9.Future<_i2.Either>> + fetchPhotosFromGlobalSymbols({ + required String? searchText, + required String? languageCode, + }) => + (super.noSuchMethod( + Invocation.method( + #fetchPhotosFromGlobalSymbols, + [], + { + #searchText: searchText, + #languageCode: languageCode, + }, + ), + returnValue: _i9 + .Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #fetchPhotosFromGlobalSymbols, + [], + { + #searchText: searchText, + #languageCode: languageCode, + }, + ), + )), + ) as _i9.Future<_i2.Either>>); + @override + _i9.Future uploadOtherImages({ + required String? imagePath, + required String? directoryPath, + required String? name, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #uploadOtherImages, + [], + { + #imagePath: imagePath, + #directoryPath: directoryPath, + #name: name, + #userId: userId, + }, + ), + returnValue: _i9.Future.value(''), + ) as _i9.Future); + @override + _i9.Future deleteTheAccount({required String? userId}) => + (super.noSuchMethod( + Invocation.method( + #deleteTheAccount, + [], + {#userId: userId}, + ), + returnValue: _i9.Future.value(false), + ) as _i9.Future); +} + +/// A class which mocks [I18N]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockI18N extends _i1.Mock implements _i4.I18N { + MockI18N() { + _i1.throwOnMissingStub(this); + } + + @override + Map get platformLanguages => (super.noSuchMethod( + Invocation.getter(#platformLanguages), + returnValue: {}, + ) as Map); + @override + _i3.Locale get currentLocale => (super.noSuchMethod( + Invocation.getter(#currentLocale), + returnValue: _FakeLocale_1( + this, + Invocation.getter(#currentLocale), + ), + ) as _i3.Locale); + @override + set currentLocale(_i3.Locale? _currentLocale) => super.noSuchMethod( + Invocation.setter( + #currentLocale, + _currentLocale, + ), + returnValueForMissingStub: null, + ); + @override + bool get hasListeners => (super.noSuchMethod( + Invocation.getter(#hasListeners), + returnValue: false, + ) as bool); + @override + _i9.Future<_i4.I18N> init() => (super.noSuchMethod( + Invocation.method( + #init, + [], + ), + returnValue: _i9.Future<_i4.I18N>.value(_FakeI18N_2( + this, + Invocation.method( + #init, + [], + ), + )), + ) as _i9.Future<_i4.I18N>); + @override + _i9.Future<_i18.TranslationTree?> loadTranslation(_i3.Locale? locale) => + (super.noSuchMethod( + Invocation.method( + #loadTranslation, + [locale], + ), + returnValue: _i9.Future<_i18.TranslationTree?>.value(), + ) as _i9.Future<_i18.TranslationTree?>); + @override + _i9.Future changeLanguage(String? languageCode) => (super.noSuchMethod( + Invocation.method( + #changeLanguage, + [languageCode], + ), + returnValue: _i9.Future.value(), + returnValueForMissingStub: _i9.Future.value(), + ) as _i9.Future); + @override + _i9.Future changeLanguageFromLocale(_i3.Locale? locale) => + (super.noSuchMethod( + Invocation.method( + #changeLanguageFromLocale, + [locale], + ), + returnValue: _i9.Future.value(), + returnValueForMissingStub: _i9.Future.value(), + ) as _i9.Future); + @override + void notify() => super.noSuchMethod( + Invocation.method( + #notify, + [], + ), + returnValueForMissingStub: null, + ); + @override + void addListener(_i3.VoidCallback? listener) => super.noSuchMethod( + Invocation.method( + #addListener, + [listener], + ), + returnValueForMissingStub: null, + ); + @override + void removeListener(_i3.VoidCallback? listener) => super.noSuchMethod( + Invocation.method( + #removeListener, + [listener], + ), + returnValueForMissingStub: null, + ); + @override + void dispose() => super.noSuchMethod( + Invocation.method( + #dispose, + [], + ), + returnValueForMissingStub: null, + ); + @override + void notifyListeners() => super.noSuchMethod( + Invocation.method( + #notifyListeners, + [], + ), + returnValueForMissingStub: null, + ); +} + +/// A class which mocks [FirebaseMessaging]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockFirebaseMessaging extends _i1.Mock implements _i19.FirebaseMessaging { + MockFirebaseMessaging() { + _i1.throwOnMissingStub(this); + } + + @override + _i5.FirebaseApp get app => (super.noSuchMethod( + Invocation.getter(#app), + returnValue: _FakeFirebaseApp_3( + this, + Invocation.getter(#app), + ), + ) as _i5.FirebaseApp); + @override + set app(_i5.FirebaseApp? _app) => super.noSuchMethod( + Invocation.setter( + #app, + _app, + ), + returnValueForMissingStub: null, + ); + @override + bool get isAutoInitEnabled => (super.noSuchMethod( + Invocation.getter(#isAutoInitEnabled), + returnValue: false, + ) as bool); + @override + _i9.Stream get onTokenRefresh => (super.noSuchMethod( + Invocation.getter(#onTokenRefresh), + returnValue: _i9.Stream.empty(), + ) as _i9.Stream); + @override + Map get pluginConstants => (super.noSuchMethod( + Invocation.getter(#pluginConstants), + returnValue: {}, + ) as Map); + @override + _i9.Future<_i6.RemoteMessage?> getInitialMessage() => (super.noSuchMethod( + Invocation.method( + #getInitialMessage, + [], + ), + returnValue: _i9.Future<_i6.RemoteMessage?>.value(), + ) as _i9.Future<_i6.RemoteMessage?>); + @override + _i9.Future deleteToken() => (super.noSuchMethod( + Invocation.method( + #deleteToken, + [], + ), + returnValue: _i9.Future.value(), + returnValueForMissingStub: _i9.Future.value(), + ) as _i9.Future); + @override + _i9.Future getAPNSToken() => (super.noSuchMethod( + Invocation.method( + #getAPNSToken, + [], + ), + returnValue: _i9.Future.value(), + ) as _i9.Future); + @override + _i9.Future getToken({String? vapidKey}) => (super.noSuchMethod( + Invocation.method( + #getToken, + [], + {#vapidKey: vapidKey}, + ), + returnValue: _i9.Future.value(), + ) as _i9.Future); + @override + _i9.Future isSupported() => (super.noSuchMethod( + Invocation.method( + #isSupported, + [], + ), + returnValue: _i9.Future.value(false), + ) as _i9.Future); + @override + _i9.Future<_i6.NotificationSettings> getNotificationSettings() => + (super.noSuchMethod( + Invocation.method( + #getNotificationSettings, + [], + ), + returnValue: _i9.Future<_i6.NotificationSettings>.value( + _FakeNotificationSettings_4( + this, + Invocation.method( + #getNotificationSettings, + [], + ), + )), + ) as _i9.Future<_i6.NotificationSettings>); + @override + _i9.Future<_i6.NotificationSettings> requestPermission({ + bool? alert = true, + bool? announcement = false, + bool? badge = true, + bool? carPlay = false, + bool? criticalAlert = false, + bool? provisional = false, + bool? sound = true, + }) => + (super.noSuchMethod( + Invocation.method( + #requestPermission, + [], + { + #alert: alert, + #announcement: announcement, + #badge: badge, + #carPlay: carPlay, + #criticalAlert: criticalAlert, + #provisional: provisional, + #sound: sound, + }, + ), + returnValue: _i9.Future<_i6.NotificationSettings>.value( + _FakeNotificationSettings_4( + this, + Invocation.method( + #requestPermission, + [], + { + #alert: alert, + #announcement: announcement, + #badge: badge, + #carPlay: carPlay, + #criticalAlert: criticalAlert, + #provisional: provisional, + #sound: sound, + }, + ), + )), + ) as _i9.Future<_i6.NotificationSettings>); + @override + _i9.Future sendMessage({ + String? to, + Map? data, + String? collapseKey, + String? messageId, + String? messageType, + int? ttl, + }) => + (super.noSuchMethod( + Invocation.method( + #sendMessage, + [], + { + #to: to, + #data: data, + #collapseKey: collapseKey, + #messageId: messageId, + #messageType: messageType, + #ttl: ttl, + }, + ), + returnValue: _i9.Future.value(), + returnValueForMissingStub: _i9.Future.value(), + ) as _i9.Future); + @override + _i9.Future setAutoInitEnabled(bool? enabled) => (super.noSuchMethod( + Invocation.method( + #setAutoInitEnabled, + [enabled], + ), + returnValue: _i9.Future.value(), + returnValueForMissingStub: _i9.Future.value(), + ) as _i9.Future); + @override + _i9.Future setDeliveryMetricsExportToBigQuery(bool? enabled) => + (super.noSuchMethod( + Invocation.method( + #setDeliveryMetricsExportToBigQuery, + [enabled], + ), + returnValue: _i9.Future.value(), + returnValueForMissingStub: _i9.Future.value(), + ) as _i9.Future); + @override + _i9.Future setForegroundNotificationPresentationOptions({ + bool? alert = false, + bool? badge = false, + bool? sound = false, + }) => + (super.noSuchMethod( + Invocation.method( + #setForegroundNotificationPresentationOptions, + [], + { + #alert: alert, + #badge: badge, + #sound: sound, + }, + ), + returnValue: _i9.Future.value(), + returnValueForMissingStub: _i9.Future.value(), + ) as _i9.Future); + @override + _i9.Future subscribeToTopic(String? topic) => (super.noSuchMethod( + Invocation.method( + #subscribeToTopic, + [topic], + ), + returnValue: _i9.Future.value(), + returnValueForMissingStub: _i9.Future.value(), + ) as _i9.Future); + @override + _i9.Future unsubscribeFromTopic(String? topic) => (super.noSuchMethod( + Invocation.method( + #unsubscribeFromTopic, + [topic], + ), + returnValue: _i9.Future.value(), + returnValueForMissingStub: _i9.Future.value(), + ) as _i9.Future); +} diff --git a/test/service/chatGPT/chatgpt_service_test.dart b/test/service/chatGPT/chatgpt_service_test.dart new file mode 100644 index 00000000..4e846d1b --- /dev/null +++ b/test/service/chatGPT/chatgpt_service_test.dart @@ -0,0 +1,124 @@ +import 'package:either_dart/either.dart'; +import 'package:flutter/widgets.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:get_it/get_it.dart'; +import 'package:mockito/annotations.dart'; +import 'package:mockito/mockito.dart'; +import 'package:ottaa_project_flutter/application/common/extensions/translate_string.dart'; +import 'package:ottaa_project_flutter/application/common/i18n.dart'; +import 'package:ottaa_project_flutter/application/language/translation_tree.dart'; +import 'package:ottaa_project_flutter/application/service/chatgpt_service.dart'; +import 'package:ottaa_project_flutter/core/repositories/repositories.dart'; + +import 'chatgpt_service_test.mocks.dart'; + +@GenerateMocks([ServerRepository, RemoteConfigRepository, I18N]) +Future main() async { + late MockServerRepository mockServerRepository; + late MockRemoteConfigRepository mockRemoteConfigRepository; + + late ChatGPTRepository chatGPTRepository; + + MockI18N mockI18N = MockI18N(); + + GetIt.I.registerSingleton(mockI18N); + setUp(() async { + mockServerRepository = MockServerRepository(); + mockRemoteConfigRepository = MockRemoteConfigRepository(); + + chatGPTRepository = ChatGPTService(mockServerRepository, mockRemoteConfigRepository); + + when(mockI18N.currentLanguage).thenReturn(TranslationTree(const Locale("es_AR"))); + }); + + group("get completion", () { + test("should return hello world for lte 13yo", () async { + when(mockRemoteConfigRepository.getString(any)).thenAnswer((_) async { + return "hello world"; + }); + + when(mockServerRepository.generatePhraseGPT(prompt: anyNamed("prompt"), maxTokens: anyNamed("maxTokens"), temperature: anyNamed("temperature"))).thenAnswer((realInvocation) async => const Right("hello world")); + + final result = await chatGPTRepository.getCompletion(age: 0, gender: "F", pictograms: "hello world", language: "es_AR"); + + expect(result, const Right("hello world")); + }); + + test("should return hello world for gt 13yo and less than 18yo", () async { + when(mockRemoteConfigRepository.getString(any)).thenAnswer((_) async { + return "hello world"; + }); + + when(mockServerRepository.generatePhraseGPT(prompt: anyNamed("prompt"), maxTokens: anyNamed("maxTokens"), temperature: anyNamed("temperature"))).thenAnswer((realInvocation) async => const Right("hello world")); + + final result = await chatGPTRepository.getCompletion(age: 15, gender: "F", pictograms: "hello world", language: "es_AR"); + + expect(result, const Right("hello world")); + }); + test("should return hello world gte 18", () async { + when(mockRemoteConfigRepository.getString(any)).thenAnswer((_) async { + return "hello world"; + }); + + when(mockServerRepository.generatePhraseGPT(prompt: anyNamed("prompt"), maxTokens: anyNamed("maxTokens"), temperature: anyNamed("temperature"))).thenAnswer((realInvocation) async => const Right("hello world")); + + final result = await chatGPTRepository.getCompletion(age: 24, gender: "F", pictograms: "hello world", language: "es_AR"); + + expect(result, const Right("hello world")); + }); + + test("should return hello when remotePrompt equals null", () async { + when(mockRemoteConfigRepository.getString(any)).thenAnswer((_) async { + return null; + }); + + when(mockServerRepository.generatePhraseGPT(prompt: anyNamed("prompt"), maxTokens: anyNamed("maxTokens"), temperature: anyNamed("temperature"))).thenAnswer((realInvocation) async => const Right("hello world")); + + final result = await chatGPTRepository.getCompletion(age: 24, gender: "F", pictograms: "hello world", language: "es_AR"); + + expect(result, const Right("hello world")); + }); + + test("should return left error", () async { + when(mockRemoteConfigRepository.getString(any)).thenAnswer((_) async { + return null; + }); + + when(mockServerRepository.generatePhraseGPT(prompt: anyNamed("prompt"), maxTokens: anyNamed("maxTokens"), temperature: anyNamed("temperature"))).thenAnswer((realInvocation) async => const Left("no_completion")); + + final result = await chatGPTRepository.getCompletion(age: 24, gender: "F", pictograms: "hello world", language: "es_AR"); + + expect(result, isA()); + expect(result.left, "no_completion"); + }); + }); + + group("get gpt story", () { + test("should return an story", () async { + const String story = "Hello, this is a story about tests"; + when(mockRemoteConfigRepository.getString(any)).thenAnswer((_) async { + return story; + }); + + when(mockServerRepository.generatePhraseGPT(prompt: anyNamed("prompt"), maxTokens: anyNamed("maxTokens"), temperature: anyNamed("temperature"))).thenAnswer((realInvocation) async => const Right(story)); + + final result = await chatGPTRepository.getGPTStory(prompt: "", maxTokens: 100); + + expect(result.right, story); + }); + + test("should return left", () async { + const String story = "Hello, this is a story about tests"; + when(mockRemoteConfigRepository.getString(any)).thenAnswer((_) async { + return story; + }); + + when(mockServerRepository.generatePhraseGPT(prompt: anyNamed("prompt"), maxTokens: anyNamed("maxTokens"), temperature: anyNamed("temperature"))).thenAnswer((realInvocation) async => const Left("no_completion")); + + final result = await chatGPTRepository.getGPTStory(prompt: "", maxTokens: 100); + + expect(result, isA()); + expect(result.left, "no_completion"); + }); + }); +} diff --git a/test/service/chatGPT/chatgpt_service_test.mocks.dart b/test/service/chatGPT/chatgpt_service_test.mocks.dart new file mode 100644 index 00000000..6125e24b --- /dev/null +++ b/test/service/chatGPT/chatgpt_service_test.mocks.dart @@ -0,0 +1,1267 @@ +// Mocks generated by Mockito 5.4.0 from annotations +// in ottaa_project_flutter/test/service/chatGPT/chatgpt_service_test.dart. +// Do not manually edit this file. + +// ignore_for_file: no_leading_underscores_for_library_prefixes +import 'dart:async' as _i7; +import 'dart:ui' as _i4; + +import 'package:dio/dio.dart' as _i10; +import 'package:either_dart/either.dart' as _i2; +import 'package:mockito/mockito.dart' as _i1; +import 'package:ottaa_project_flutter/application/common/i18n.dart' as _i5; +import 'package:ottaa_project_flutter/application/language/translation_tree.dart' + as _i15; +import 'package:ottaa_project_flutter/core/enums/board_data_type.dart' as _i12; +import 'package:ottaa_project_flutter/core/enums/user_types.dart' as _i8; +import 'package:ottaa_project_flutter/core/models/arsaac_data_model.dart' + as _i14; +import 'package:ottaa_project_flutter/core/models/assets_image.dart' as _i9; +import 'package:ottaa_project_flutter/core/models/devices_token.dart' as _i13; +import 'package:ottaa_project_flutter/core/models/shortcuts_model.dart' as _i11; +import 'package:ottaa_project_flutter/core/repositories/remote_config_repository.dart' + as _i3; +import 'package:ottaa_project_flutter/core/repositories/server_repository.dart' + as _i6; + +// ignore_for_file: type=lint +// ignore_for_file: avoid_redundant_argument_values +// ignore_for_file: avoid_setters_without_getters +// ignore_for_file: comment_references +// ignore_for_file: implementation_imports +// ignore_for_file: invalid_use_of_visible_for_testing_member +// ignore_for_file: prefer_const_constructors +// ignore_for_file: unnecessary_parenthesis +// ignore_for_file: camel_case_types +// ignore_for_file: subtype_of_sealed_class + +class _FakeEither_0 extends _i1.SmartFake implements _i2.Either { + _FakeEither_0( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeRemoteConfigRepository_1 extends _i1.SmartFake + implements _i3.RemoteConfigRepository { + _FakeRemoteConfigRepository_1( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeLocale_2 extends _i1.SmartFake implements _i4.Locale { + _FakeLocale_2( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeI18N_3 extends _i1.SmartFake implements _i5.I18N { + _FakeI18N_3( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +/// A class which mocks [ServerRepository]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockServerRepository extends _i1.Mock implements _i6.ServerRepository { + MockServerRepository() { + _i1.throwOnMissingStub(this); + } + + @override + _i7.Future<_i2.Either> getAvailableAppVersion( + String? platform) => + (super.noSuchMethod( + Invocation.method( + #getAvailableAppVersion, + [platform], + ), + returnValue: _i7.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #getAvailableAppVersion, + [platform], + ), + )), + ) as _i7.Future<_i2.Either>); + @override + _i7.Future<_i8.UserType> getUserType(String? userId) => (super.noSuchMethod( + Invocation.method( + #getUserType, + [userId], + ), + returnValue: _i7.Future<_i8.UserType>.value(_i8.UserType.caregiver), + ) as _i7.Future<_i8.UserType>); + @override + _i7.Future<_i2.Either> getUserProfilePicture( + String? userId) => + (super.noSuchMethod( + Invocation.method( + #getUserProfilePicture, + [userId], + ), + returnValue: _i7.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #getUserProfilePicture, + [userId], + ), + )), + ) as _i7.Future<_i2.Either>); + @override + _i7.Future<_i2.Either> uploadUserPicture( + String? userId, + _i9.AssetsImage? image, + ) => + (super.noSuchMethod( + Invocation.method( + #uploadUserPicture, + [ + userId, + image, + ], + ), + returnValue: _i7.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #uploadUserPicture, + [ + userId, + image, + ], + ), + )), + ) as _i7.Future<_i2.Either>); + @override + _i7.Future<_i2.Either>> getUserInformation( + String? id) => + (super.noSuchMethod( + Invocation.method( + #getUserInformation, + [id], + ), + returnValue: _i7.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #getUserInformation, + [id], + ), + )), + ) as _i7.Future<_i2.Either>>); + @override + _i7.Future<_i2.Either> uploadUserInformation( + String? userId, + Map? data, + ) => + (super.noSuchMethod( + Invocation.method( + #uploadUserInformation, + [ + userId, + data, + ], + ), + returnValue: _i7.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #uploadUserInformation, + [ + userId, + data, + ], + ), + )), + ) as _i7.Future<_i2.Either>); + @override + _i7.Future>> getUserSentences( + String? userId, { + required String? language, + required String? type, + bool? isFavorite = false, + }) => + (super.noSuchMethod( + Invocation.method( + #getUserSentences, + [userId], + { + #language: language, + #type: type, + #isFavorite: isFavorite, + }, + ), + returnValue: _i7.Future>>.value( + >[]), + ) as _i7.Future>>); + @override + _i7.Future<_i2.Either> uploadUserSentences( + String? userId, + String? language, + String? type, + List>? data, + ) => + (super.noSuchMethod( + Invocation.method( + #uploadUserSentences, + [ + userId, + language, + type, + data, + ], + ), + returnValue: _i7.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #uploadUserSentences, + [ + userId, + language, + type, + data, + ], + ), + )), + ) as _i7.Future<_i2.Either>); + @override + _i7.Future<_i2.Either>>> getAllPictograms( + String? userId, + String? languageCode, + ) => + (super.noSuchMethod( + Invocation.method( + #getAllPictograms, + [ + userId, + languageCode, + ], + ), + returnValue: + _i7.Future<_i2.Either>>>.value( + _FakeEither_0>>( + this, + Invocation.method( + #getAllPictograms, + [ + userId, + languageCode, + ], + ), + )), + ) as _i7.Future<_i2.Either>>>); + @override + _i7.Future<_i2.Either> uploadPictograms( + String? userId, + String? language, { + required List>? data, + }) => + (super.noSuchMethod( + Invocation.method( + #uploadPictograms, + [ + userId, + language, + ], + {#data: data}, + ), + returnValue: _i7.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #uploadPictograms, + [ + userId, + language, + ], + {#data: data}, + ), + )), + ) as _i7.Future<_i2.Either>); + @override + _i7.Future<_i2.Either> updatePictogram( + String? userId, + String? language, + int? index, { + required Map? data, + }) => + (super.noSuchMethod( + Invocation.method( + #updatePictogram, + [ + userId, + language, + index, + ], + {#data: data}, + ), + returnValue: _i7.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #updatePictogram, + [ + userId, + language, + index, + ], + {#data: data}, + ), + )), + ) as _i7.Future<_i2.Either>); + @override + _i7.Future<_i2.Either>>> getAllGroups( + String? userId, + String? languageCode, + ) => + (super.noSuchMethod( + Invocation.method( + #getAllGroups, + [ + userId, + languageCode, + ], + ), + returnValue: + _i7.Future<_i2.Either>>>.value( + _FakeEither_0>>( + this, + Invocation.method( + #getAllGroups, + [ + userId, + languageCode, + ], + ), + )), + ) as _i7.Future<_i2.Either>>>); + @override + _i7.Future<_i2.Either> uploadGroups( + String? userId, + String? language, { + required List>? data, + }) => + (super.noSuchMethod( + Invocation.method( + #uploadGroups, + [ + userId, + language, + ], + {#data: data}, + ), + returnValue: _i7.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #uploadGroups, + [ + userId, + language, + ], + {#data: data}, + ), + )), + ) as _i7.Future<_i2.Either>); + @override + _i7.Future<_i2.Either> updateGroup( + String? userId, + String? language, + int? index, { + required Map? data, + }) => + (super.noSuchMethod( + Invocation.method( + #updateGroup, + [ + userId, + language, + index, + ], + {#data: data}, + ), + returnValue: _i7.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #updateGroup, + [ + userId, + language, + index, + ], + {#data: data}, + ), + )), + ) as _i7.Future<_i2.Either>); + @override + _i7.Future<_i2.Either>> getPictogramsStatistics( + String? userId, + String? languageCode, [ + _i10.CancelToken? cancelToken, + ]) => + (super.noSuchMethod( + Invocation.method( + #getPictogramsStatistics, + [ + userId, + languageCode, + cancelToken, + ], + ), + returnValue: _i7.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #getPictogramsStatistics, + [ + userId, + languageCode, + cancelToken, + ], + ), + )), + ) as _i7.Future<_i2.Either>>); + @override + _i7.Future<_i2.Either>> getMostUsedSentences( + String? userId, + String? languageCode, [ + _i10.CancelToken? cancelToken, + ]) => + (super.noSuchMethod( + Invocation.method( + #getMostUsedSentences, + [ + userId, + languageCode, + cancelToken, + ], + ), + returnValue: _i7.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #getMostUsedSentences, + [ + userId, + languageCode, + cancelToken, + ], + ), + )), + ) as _i7.Future<_i2.Either>>); + @override + _i7.Future<_i2.Either> generatePhraseGPT({ + required String? prompt, + required int? maxTokens, + double? temperature = 0.0, + }) => + (super.noSuchMethod( + Invocation.method( + #generatePhraseGPT, + [], + { + #prompt: prompt, + #maxTokens: maxTokens, + #temperature: temperature, + }, + ), + returnValue: _i7.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #generatePhraseGPT, + [], + { + #prompt: prompt, + #maxTokens: maxTokens, + #temperature: temperature, + }, + ), + )), + ) as _i7.Future<_i2.Either>); + @override + _i7.Future uploadUserImage({ + required String? path, + required String? name, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #uploadUserImage, + [], + { + #path: path, + #name: name, + #userId: userId, + }, + ), + returnValue: _i7.Future.value(''), + ) as _i7.Future); + @override + _i7.Future updateUserSettings({ + required Map? data, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #updateUserSettings, + [], + { + #data: data, + #userId: userId, + }, + ), + returnValue: _i7.Future.value(), + returnValueForMissingStub: _i7.Future.value(), + ) as _i7.Future); + @override + _i7.Future<_i2.Either>> getConnectedUsers( + {required String? userId}) => + (super.noSuchMethod( + Invocation.method( + #getConnectedUsers, + [], + {#userId: userId}, + ), + returnValue: _i7.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #getConnectedUsers, + [], + {#userId: userId}, + ), + )), + ) as _i7.Future<_i2.Either>>); + @override + _i7.Future<_i2.Either>> fetchConnectedUserData( + {required String? userId}) => + (super.noSuchMethod( + Invocation.method( + #fetchConnectedUserData, + [], + {#userId: userId}, + ), + returnValue: _i7.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #fetchConnectedUserData, + [], + {#userId: userId}, + ), + )), + ) as _i7.Future<_i2.Either>>); + @override + _i7.Future removeCurrentUser({ + required String? userId, + required String? careGiverId, + }) => + (super.noSuchMethod( + Invocation.method( + #removeCurrentUser, + [], + { + #userId: userId, + #careGiverId: careGiverId, + }, + ), + returnValue: _i7.Future.value(), + returnValueForMissingStub: _i7.Future.value(), + ) as _i7.Future); + @override + _i7.Future<_i2.Either> setShortcutsForUser({ + required _i11.ShortcutsModel? shortcuts, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #setShortcutsForUser, + [], + { + #shortcuts: shortcuts, + #userId: userId, + }, + ), + returnValue: _i7.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #setShortcutsForUser, + [], + { + #shortcuts: shortcuts, + #userId: userId, + }, + ), + )), + ) as _i7.Future<_i2.Either>); + @override + _i7.Future updateUserData({ + required Map? data, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #updateUserData, + [], + { + #data: data, + #userId: userId, + }, + ), + returnValue: _i7.Future.value(), + returnValueForMissingStub: _i7.Future.value(), + ) as _i7.Future); + @override + _i7.Future<_i2.Either>> getEmailToken( + String? ownEmail, + String? email, [ + _i10.CancelToken? cancelToken, + ]) => + (super.noSuchMethod( + Invocation.method( + #getEmailToken, + [ + ownEmail, + email, + cancelToken, + ], + ), + returnValue: _i7.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #getEmailToken, + [ + ownEmail, + email, + cancelToken, + ], + ), + )), + ) as _i7.Future<_i2.Either>>); + @override + _i7.Future<_i2.Either>> verifyEmailToken( + String? ownEmail, + String? email, + String? token, [ + _i10.CancelToken? cancelToken, + ]) => + (super.noSuchMethod( + Invocation.method( + #verifyEmailToken, + [ + ownEmail, + email, + token, + cancelToken, + ], + ), + returnValue: _i7.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #verifyEmailToken, + [ + ownEmail, + email, + token, + cancelToken, + ], + ), + )), + ) as _i7.Future<_i2.Either>>); + @override + _i7.Future<_i2.Either>> getProfileById( + {required String? id}) => + (super.noSuchMethod( + Invocation.method( + #getProfileById, + [], + {#id: id}, + ), + returnValue: _i7.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #getProfileById, + [], + {#id: id}, + ), + )), + ) as _i7.Future<_i2.Either>>); + @override + _i7.Future getDefaultGroups(String? languageCode) => + (super.noSuchMethod( + Invocation.method( + #getDefaultGroups, + [languageCode], + ), + returnValue: _i7.Future.value(), + ) as _i7.Future); + @override + _i7.Future getDefaultPictos(String? languageCode) => + (super.noSuchMethod( + Invocation.method( + #getDefaultPictos, + [languageCode], + ), + returnValue: _i7.Future.value(), + ) as _i7.Future); + @override + _i7.Future updateUserType({ + required String? id, + required _i8.UserType? userType, + }) => + (super.noSuchMethod( + Invocation.method( + #updateUserType, + [], + { + #id: id, + #userType: userType, + }, + ), + returnValue: _i7.Future.value(), + returnValueForMissingStub: _i7.Future.value(), + ) as _i7.Future); + @override + _i7.Future<_i2.Either>> fetchShortcutsForUser( + {required String? userId}) => + (super.noSuchMethod( + Invocation.method( + #fetchShortcutsForUser, + [], + {#userId: userId}, + ), + returnValue: _i7.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #fetchShortcutsForUser, + [], + {#userId: userId}, + ), + )), + ) as _i7.Future<_i2.Either>>); + @override + _i7.Future?> createPictoGroupData({ + required String? userId, + required String? language, + required _i12.BoardDataType? type, + required Map? data, + _i10.CancelToken? cancelToken, + }) => + (super.noSuchMethod( + Invocation.method( + #createPictoGroupData, + [], + { + #userId: userId, + #language: language, + #type: type, + #data: data, + #cancelToken: cancelToken, + }, + ), + returnValue: _i7.Future?>.value(), + ) as _i7.Future?>); + @override + _i7.Future updateDevicesId({ + required String? userId, + required _i13.DeviceToken? deviceToken, + }) => + (super.noSuchMethod( + Invocation.method( + #updateDevicesId, + [], + { + #userId: userId, + #deviceToken: deviceToken, + }, + ), + returnValue: _i7.Future.value(), + returnValueForMissingStub: _i7.Future.value(), + ) as _i7.Future); + @override + _i7.Future<_i2.Either>> learnPictograms({ + required String? uid, + required String? language, + required String? model, + required List>? tokens, + _i10.CancelToken? cancelToken, + }) => + (super.noSuchMethod( + Invocation.method( + #learnPictograms, + [], + { + #uid: uid, + #language: language, + #model: model, + #tokens: tokens, + #cancelToken: cancelToken, + }, + ), + returnValue: _i7.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #learnPictograms, + [], + { + #uid: uid, + #language: language, + #model: model, + #tokens: tokens, + #cancelToken: cancelToken, + }, + ), + )), + ) as _i7.Future<_i2.Either>>); + @override + _i7.Future<_i2.Either>> predictPictogram({ + required String? sentence, + required String? uid, + required String? language, + required String? model, + required List? groups, + required Map>? tags, + bool? reduced = false, + int? limit = 10, + int? chunk = 4, + _i10.CancelToken? cancelToken, + }) => + (super.noSuchMethod( + Invocation.method( + #predictPictogram, + [], + { + #sentence: sentence, + #uid: uid, + #language: language, + #model: model, + #groups: groups, + #tags: tags, + #reduced: reduced, + #limit: limit, + #chunk: chunk, + #cancelToken: cancelToken, + }, + ), + returnValue: _i7.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #predictPictogram, + [], + { + #sentence: sentence, + #uid: uid, + #language: language, + #model: model, + #groups: groups, + #tags: tags, + #reduced: reduced, + #limit: limit, + #chunk: chunk, + #cancelToken: cancelToken, + }, + ), + )), + ) as _i7.Future<_i2.Either>>); + @override + _i7.Future<_i2.Either> updateUserLastConnectionTime({ + required String? userId, + required int? time, + }) => + (super.noSuchMethod( + Invocation.method( + #updateUserLastConnectionTime, + [], + { + #userId: userId, + #time: time, + }, + ), + returnValue: _i7.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #updateUserLastConnectionTime, + [], + { + #userId: userId, + #time: time, + }, + ), + )), + ) as _i7.Future<_i2.Either>); + @override + _i7.Future fetchUserGroups({ + required String? languageCode, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #fetchUserGroups, + [], + { + #languageCode: languageCode, + #userId: userId, + }, + ), + returnValue: _i7.Future.value(), + ) as _i7.Future); + @override + _i7.Future fetchUserPictos({ + required String? languageCode, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #fetchUserPictos, + [], + { + #languageCode: languageCode, + #userId: userId, + }, + ), + returnValue: _i7.Future.value(), + ) as _i7.Future); + @override + _i7.Future updateLanguageSettings({ + required Map? map, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #updateLanguageSettings, + [], + { + #map: map, + #userId: userId, + }, + ), + returnValue: _i7.Future.value(), + returnValueForMissingStub: _i7.Future.value(), + ) as _i7.Future); + @override + _i7.Future updateVoiceAndSubtitleSettings({ + required Map? map, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #updateVoiceAndSubtitleSettings, + [], + { + #map: map, + #userId: userId, + }, + ), + returnValue: _i7.Future.value(), + returnValueForMissingStub: _i7.Future.value(), + ) as _i7.Future); + @override + _i7.Future updateAccessibilitySettings({ + required Map? map, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #updateAccessibilitySettings, + [], + { + #map: map, + #userId: userId, + }, + ), + returnValue: _i7.Future.value(), + returnValueForMissingStub: _i7.Future.value(), + ) as _i7.Future); + @override + _i7.Future updateMainSettings({ + required Map? map, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #updateMainSettings, + [], + { + #map: map, + #userId: userId, + }, + ), + returnValue: _i7.Future.value(), + returnValueForMissingStub: _i7.Future.value(), + ) as _i7.Future); + @override + _i7.Future fetchUserSettings({required String? userId}) => + (super.noSuchMethod( + Invocation.method( + #fetchUserSettings, + [], + {#userId: userId}, + ), + returnValue: _i7.Future.value(), + ) as _i7.Future); + @override + _i7.Future<_i2.Either>> + fetchPhotosFromGlobalSymbols({ + required String? searchText, + required String? languageCode, + }) => + (super.noSuchMethod( + Invocation.method( + #fetchPhotosFromGlobalSymbols, + [], + { + #searchText: searchText, + #languageCode: languageCode, + }, + ), + returnValue: _i7 + .Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #fetchPhotosFromGlobalSymbols, + [], + { + #searchText: searchText, + #languageCode: languageCode, + }, + ), + )), + ) as _i7.Future<_i2.Either>>); + @override + _i7.Future uploadOtherImages({ + required String? imagePath, + required String? directoryPath, + required String? name, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #uploadOtherImages, + [], + { + #imagePath: imagePath, + #directoryPath: directoryPath, + #name: name, + #userId: userId, + }, + ), + returnValue: _i7.Future.value(''), + ) as _i7.Future); + @override + _i7.Future deleteTheAccount({required String? userId}) => + (super.noSuchMethod( + Invocation.method( + #deleteTheAccount, + [], + {#userId: userId}, + ), + returnValue: _i7.Future.value(false), + ) as _i7.Future); +} + +/// A class which mocks [RemoteConfigRepository]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockRemoteConfigRepository extends _i1.Mock + implements _i3.RemoteConfigRepository { + MockRemoteConfigRepository() { + _i1.throwOnMissingStub(this); + } + + @override + _i7.Future<_i3.RemoteConfigRepository> init() => (super.noSuchMethod( + Invocation.method( + #init, + [], + ), + returnValue: _i7.Future<_i3.RemoteConfigRepository>.value( + _FakeRemoteConfigRepository_1( + this, + Invocation.method( + #init, + [], + ), + )), + ) as _i7.Future<_i3.RemoteConfigRepository>); + @override + _i7.Future getString(String? key) => (super.noSuchMethod( + Invocation.method( + #getString, + [key], + ), + returnValue: _i7.Future.value(), + ) as _i7.Future); + @override + _i7.Future getInt(String? key) => (super.noSuchMethod( + Invocation.method( + #getInt, + [key], + ), + returnValue: _i7.Future.value(), + ) as _i7.Future); + @override + _i7.Future getBool(String? key) => (super.noSuchMethod( + Invocation.method( + #getBool, + [key], + ), + returnValue: _i7.Future.value(), + ) as _i7.Future); + @override + _i7.Future getDouble(String? key) => (super.noSuchMethod( + Invocation.method( + #getDouble, + [key], + ), + returnValue: _i7.Future.value(), + ) as _i7.Future); +} + +/// A class which mocks [I18N]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockI18N extends _i1.Mock implements _i5.I18N { + MockI18N() { + _i1.throwOnMissingStub(this); + } + + @override + Map get platformLanguages => (super.noSuchMethod( + Invocation.getter(#platformLanguages), + returnValue: {}, + ) as Map); + @override + _i4.Locale get currentLocale => (super.noSuchMethod( + Invocation.getter(#currentLocale), + returnValue: _FakeLocale_2( + this, + Invocation.getter(#currentLocale), + ), + ) as _i4.Locale); + @override + set currentLocale(_i4.Locale? _currentLocale) => super.noSuchMethod( + Invocation.setter( + #currentLocale, + _currentLocale, + ), + returnValueForMissingStub: null, + ); + @override + bool get hasListeners => (super.noSuchMethod( + Invocation.getter(#hasListeners), + returnValue: false, + ) as bool); + @override + _i7.Future<_i5.I18N> init() => (super.noSuchMethod( + Invocation.method( + #init, + [], + ), + returnValue: _i7.Future<_i5.I18N>.value(_FakeI18N_3( + this, + Invocation.method( + #init, + [], + ), + )), + ) as _i7.Future<_i5.I18N>); + @override + _i7.Future<_i15.TranslationTree?> loadTranslation(_i4.Locale? locale) => + (super.noSuchMethod( + Invocation.method( + #loadTranslation, + [locale], + ), + returnValue: _i7.Future<_i15.TranslationTree?>.value(), + ) as _i7.Future<_i15.TranslationTree?>); + @override + _i7.Future changeLanguage(String? languageCode) => (super.noSuchMethod( + Invocation.method( + #changeLanguage, + [languageCode], + ), + returnValue: _i7.Future.value(), + returnValueForMissingStub: _i7.Future.value(), + ) as _i7.Future); + @override + _i7.Future changeLanguageFromLocale(_i4.Locale? locale) => + (super.noSuchMethod( + Invocation.method( + #changeLanguageFromLocale, + [locale], + ), + returnValue: _i7.Future.value(), + returnValueForMissingStub: _i7.Future.value(), + ) as _i7.Future); + @override + void notify() => super.noSuchMethod( + Invocation.method( + #notify, + [], + ), + returnValueForMissingStub: null, + ); + @override + void addListener(_i4.VoidCallback? listener) => super.noSuchMethod( + Invocation.method( + #addListener, + [listener], + ), + returnValueForMissingStub: null, + ); + @override + void removeListener(_i4.VoidCallback? listener) => super.noSuchMethod( + Invocation.method( + #removeListener, + [listener], + ), + returnValueForMissingStub: null, + ); + @override + void dispose() => super.noSuchMethod( + Invocation.method( + #dispose, + [], + ), + returnValueForMissingStub: null, + ); + @override + void notifyListeners() => super.noSuchMethod( + Invocation.method( + #notifyListeners, + [], + ), + returnValueForMissingStub: null, + ); +} diff --git a/test/service/customise/customise_service_test.dart b/test/service/customise/customise_service_test.dart new file mode 100644 index 00000000..483e2b28 --- /dev/null +++ b/test/service/customise/customise_service_test.dart @@ -0,0 +1,139 @@ +import 'package:either_dart/either.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mockito/annotations.dart'; +import 'package:mockito/mockito.dart'; +import 'package:ottaa_project_flutter/application/service/service.dart'; +import 'package:ottaa_project_flutter/core/models/shortcuts_model.dart'; +import 'package:ottaa_project_flutter/core/repositories/repositories.dart'; + +import 'customise_service_test.mocks.dart'; + +@GenerateMocks([ + ServerRepository, +]) +void main() { + late MockServerRepository mockServerRepository; + + late CustomiseService customiseService; + final fakePictos = { + "FWy18PiX2jLwZQF6-oNZR": { + "id": "FWy18PiX2jLwZQF6-oNZR", + "relations": [], + "resource": {"asset": "", "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_action_previous.webp?alt=media&token=a6feccd4-fd34-4b5a-ac1d-a5f027551d44"}, + "tags": { + "EDAD": ["JOVEN", "NINO"] + }, + "text": "%null%", + "type": 2 + }, + "FWy18PiX2jLwZQF6-oNZR1": { + "id": "FWy18PiX2jLwZQF6-oNZR", + "relations": [], + "resource": {"asset": "", "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fic_action_previous.webp?alt=media&token=a6feccd4-fd34-4b5a-ac1d-a5f027551d44"}, + "tags": { + "EDAD": ["JOVEN", "NINO"] + }, + "text": "%null%", + "type": 2 + }, + }; + + final Map> fakeGroups = { + "--PHmDIFeKHvulVxNtBgk": { + "freq": 0, + "id": "--PHmDIFeKHvulVxNtBgk", + "relations": [], + "resource": {"asset": "", "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fdescripcion.webp?alt=media&token=4dbde8ba-f144-4a12-90f6-013bf68d912d"}, + "text": "ADJETIVOS" + }, + "--PHmDIFeKHvulVxNtBgk1": { + "freq": 0, + "id": "--PHmDIFeKHvulVxNtBgk1", + "relations": [], + "resource": {"asset": "", "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fdescripcion.webp?alt=media&token=4dbde8ba-f144-4a12-90f6-013bf68d912d"}, + "text": "ADJETIVOS1" + } + }; + + final fakeShorcuts = ShortcutsModel.none(); + + setUp(() { + mockServerRepository = MockServerRepository(); + + customiseService = CustomiseService(mockServerRepository); + }); + + test("should set shortcuts for user", () async { + ShortcutsModel? shortcuts; + + when(mockServerRepository.setShortcutsForUser(shortcuts: ShortcutsModel.none(), userId: "")).thenAnswer((realInvocation) async { + shortcuts = realInvocation.namedArguments[#shortcuts]; + + return const Right(""); + }); + + await customiseService.setShortcutsForUser(shortcuts: ShortcutsModel.none(), userId: ""); + + expect(shortcuts, ShortcutsModel.none()); + }); + + test("should return the defaults groups", () async { + when(mockServerRepository.getDefaultGroups(any)).thenAnswer((_) async { + return Right(fakeGroups); + }); + + final groups = await customiseService.fetchDefaultGroups(languageCode: ""); + + expect(groups.length, 2); + }); + + test("should return the default pictos", () async { + when(mockServerRepository.getDefaultPictos(any)).thenAnswer((_) async { + return Right(fakePictos); + }); + + final pictos = await customiseService.fetchDefaultPictos(languageCode: ""); + + expect(pictos.length, 2); + }); + + test("should return the shortcuts", () async { + when(mockServerRepository.fetchShortcutsForUser(userId: "")).thenAnswer((_) async { + return Right(fakeShorcuts.toMap()); + }); + + final shortcuts = await customiseService.fetchShortcutsForUser(userId: ""); + + expect(shortcuts, fakeShorcuts); + }); + + test("should return a list of user groups", () async { + when(mockServerRepository.fetchUserGroups(languageCode: "", userId: "")).thenAnswer((_) async { + return Right(fakeGroups); + }); + + final groups = await customiseService.fetchUserGroups(languageCode: "", userId: ""); + + expect(groups.length, 2); + }); + + test("should return a list of user pictos", () async { + when(mockServerRepository.fetchUserPictos(languageCode: "", userId: "")).thenAnswer((_) async { + return Right(fakePictos); + }); + + final pictos = await customiseService.fetchUserPictos(languageCode: "", userId: ""); + + expect(pictos.length, 2); + }); + + test("should return if a value exist or not", () async { + when(mockServerRepository.fetchUserGroups(languageCode: "", userId: "")).thenAnswer((_) async { + return Right(fakeGroups); + }); + + final exist = await customiseService.valuesExistOrNot(languageCode: "", userId: ""); + + expect(exist, true); + }); +} diff --git a/test/service/customise/customise_service_test.mocks.dart b/test/service/customise/customise_service_test.mocks.dart new file mode 100644 index 00000000..3f5ad103 --- /dev/null +++ b/test/service/customise/customise_service_test.mocks.dart @@ -0,0 +1,1054 @@ +// Mocks generated by Mockito 5.4.0 from annotations +// in ottaa_project_flutter/test/service/customise/customise_service_test.dart. +// Do not manually edit this file. + +// ignore_for_file: no_leading_underscores_for_library_prefixes +import 'dart:async' as _i4; + +import 'package:dio/dio.dart' as _i7; +import 'package:either_dart/either.dart' as _i2; +import 'package:mockito/mockito.dart' as _i1; +import 'package:ottaa_project_flutter/core/enums/board_data_type.dart' as _i9; +import 'package:ottaa_project_flutter/core/enums/user_types.dart' as _i5; +import 'package:ottaa_project_flutter/core/models/arsaac_data_model.dart' + as _i11; +import 'package:ottaa_project_flutter/core/models/assets_image.dart' as _i6; +import 'package:ottaa_project_flutter/core/models/devices_token.dart' as _i10; +import 'package:ottaa_project_flutter/core/models/shortcuts_model.dart' as _i8; +import 'package:ottaa_project_flutter/core/repositories/server_repository.dart' + as _i3; + +// ignore_for_file: type=lint +// ignore_for_file: avoid_redundant_argument_values +// ignore_for_file: avoid_setters_without_getters +// ignore_for_file: comment_references +// ignore_for_file: implementation_imports +// ignore_for_file: invalid_use_of_visible_for_testing_member +// ignore_for_file: prefer_const_constructors +// ignore_for_file: unnecessary_parenthesis +// ignore_for_file: camel_case_types +// ignore_for_file: subtype_of_sealed_class + +class _FakeEither_0 extends _i1.SmartFake implements _i2.Either { + _FakeEither_0( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +/// A class which mocks [ServerRepository]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockServerRepository extends _i1.Mock implements _i3.ServerRepository { + MockServerRepository() { + _i1.throwOnMissingStub(this); + } + + @override + _i4.Future<_i2.Either> getAvailableAppVersion( + String? platform) => + (super.noSuchMethod( + Invocation.method( + #getAvailableAppVersion, + [platform], + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #getAvailableAppVersion, + [platform], + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future<_i5.UserType> getUserType(String? userId) => (super.noSuchMethod( + Invocation.method( + #getUserType, + [userId], + ), + returnValue: _i4.Future<_i5.UserType>.value(_i5.UserType.caregiver), + ) as _i4.Future<_i5.UserType>); + @override + _i4.Future<_i2.Either> getUserProfilePicture( + String? userId) => + (super.noSuchMethod( + Invocation.method( + #getUserProfilePicture, + [userId], + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #getUserProfilePicture, + [userId], + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future<_i2.Either> uploadUserPicture( + String? userId, + _i6.AssetsImage? image, + ) => + (super.noSuchMethod( + Invocation.method( + #uploadUserPicture, + [ + userId, + image, + ], + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #uploadUserPicture, + [ + userId, + image, + ], + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future<_i2.Either>> getUserInformation( + String? id) => + (super.noSuchMethod( + Invocation.method( + #getUserInformation, + [id], + ), + returnValue: _i4.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #getUserInformation, + [id], + ), + )), + ) as _i4.Future<_i2.Either>>); + @override + _i4.Future<_i2.Either> uploadUserInformation( + String? userId, + Map? data, + ) => + (super.noSuchMethod( + Invocation.method( + #uploadUserInformation, + [ + userId, + data, + ], + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #uploadUserInformation, + [ + userId, + data, + ], + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future>> getUserSentences( + String? userId, { + required String? language, + required String? type, + bool? isFavorite = false, + }) => + (super.noSuchMethod( + Invocation.method( + #getUserSentences, + [userId], + { + #language: language, + #type: type, + #isFavorite: isFavorite, + }, + ), + returnValue: _i4.Future>>.value( + >[]), + ) as _i4.Future>>); + @override + _i4.Future<_i2.Either> uploadUserSentences( + String? userId, + String? language, + String? type, + List>? data, + ) => + (super.noSuchMethod( + Invocation.method( + #uploadUserSentences, + [ + userId, + language, + type, + data, + ], + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #uploadUserSentences, + [ + userId, + language, + type, + data, + ], + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future<_i2.Either>>> getAllPictograms( + String? userId, + String? languageCode, + ) => + (super.noSuchMethod( + Invocation.method( + #getAllPictograms, + [ + userId, + languageCode, + ], + ), + returnValue: + _i4.Future<_i2.Either>>>.value( + _FakeEither_0>>( + this, + Invocation.method( + #getAllPictograms, + [ + userId, + languageCode, + ], + ), + )), + ) as _i4.Future<_i2.Either>>>); + @override + _i4.Future<_i2.Either> uploadPictograms( + String? userId, + String? language, { + required List>? data, + }) => + (super.noSuchMethod( + Invocation.method( + #uploadPictograms, + [ + userId, + language, + ], + {#data: data}, + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #uploadPictograms, + [ + userId, + language, + ], + {#data: data}, + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future<_i2.Either> updatePictogram( + String? userId, + String? language, + int? index, { + required Map? data, + }) => + (super.noSuchMethod( + Invocation.method( + #updatePictogram, + [ + userId, + language, + index, + ], + {#data: data}, + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #updatePictogram, + [ + userId, + language, + index, + ], + {#data: data}, + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future<_i2.Either>>> getAllGroups( + String? userId, + String? languageCode, + ) => + (super.noSuchMethod( + Invocation.method( + #getAllGroups, + [ + userId, + languageCode, + ], + ), + returnValue: + _i4.Future<_i2.Either>>>.value( + _FakeEither_0>>( + this, + Invocation.method( + #getAllGroups, + [ + userId, + languageCode, + ], + ), + )), + ) as _i4.Future<_i2.Either>>>); + @override + _i4.Future<_i2.Either> uploadGroups( + String? userId, + String? language, { + required List>? data, + }) => + (super.noSuchMethod( + Invocation.method( + #uploadGroups, + [ + userId, + language, + ], + {#data: data}, + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #uploadGroups, + [ + userId, + language, + ], + {#data: data}, + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future<_i2.Either> updateGroup( + String? userId, + String? language, + int? index, { + required Map? data, + }) => + (super.noSuchMethod( + Invocation.method( + #updateGroup, + [ + userId, + language, + index, + ], + {#data: data}, + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #updateGroup, + [ + userId, + language, + index, + ], + {#data: data}, + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future<_i2.Either>> getPictogramsStatistics( + String? userId, + String? languageCode, [ + _i7.CancelToken? cancelToken, + ]) => + (super.noSuchMethod( + Invocation.method( + #getPictogramsStatistics, + [ + userId, + languageCode, + cancelToken, + ], + ), + returnValue: _i4.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #getPictogramsStatistics, + [ + userId, + languageCode, + cancelToken, + ], + ), + )), + ) as _i4.Future<_i2.Either>>); + @override + _i4.Future<_i2.Either>> getMostUsedSentences( + String? userId, + String? languageCode, [ + _i7.CancelToken? cancelToken, + ]) => + (super.noSuchMethod( + Invocation.method( + #getMostUsedSentences, + [ + userId, + languageCode, + cancelToken, + ], + ), + returnValue: _i4.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #getMostUsedSentences, + [ + userId, + languageCode, + cancelToken, + ], + ), + )), + ) as _i4.Future<_i2.Either>>); + @override + _i4.Future<_i2.Either> generatePhraseGPT({ + required String? prompt, + required int? maxTokens, + double? temperature = 0.0, + }) => + (super.noSuchMethod( + Invocation.method( + #generatePhraseGPT, + [], + { + #prompt: prompt, + #maxTokens: maxTokens, + #temperature: temperature, + }, + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #generatePhraseGPT, + [], + { + #prompt: prompt, + #maxTokens: maxTokens, + #temperature: temperature, + }, + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future uploadUserImage({ + required String? path, + required String? name, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #uploadUserImage, + [], + { + #path: path, + #name: name, + #userId: userId, + }, + ), + returnValue: _i4.Future.value(''), + ) as _i4.Future); + @override + _i4.Future updateUserSettings({ + required Map? data, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #updateUserSettings, + [], + { + #data: data, + #userId: userId, + }, + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future<_i2.Either>> getConnectedUsers( + {required String? userId}) => + (super.noSuchMethod( + Invocation.method( + #getConnectedUsers, + [], + {#userId: userId}, + ), + returnValue: _i4.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #getConnectedUsers, + [], + {#userId: userId}, + ), + )), + ) as _i4.Future<_i2.Either>>); + @override + _i4.Future<_i2.Either>> fetchConnectedUserData( + {required String? userId}) => + (super.noSuchMethod( + Invocation.method( + #fetchConnectedUserData, + [], + {#userId: userId}, + ), + returnValue: _i4.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #fetchConnectedUserData, + [], + {#userId: userId}, + ), + )), + ) as _i4.Future<_i2.Either>>); + @override + _i4.Future removeCurrentUser({ + required String? userId, + required String? careGiverId, + }) => + (super.noSuchMethod( + Invocation.method( + #removeCurrentUser, + [], + { + #userId: userId, + #careGiverId: careGiverId, + }, + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future<_i2.Either> setShortcutsForUser({ + required _i8.ShortcutsModel? shortcuts, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #setShortcutsForUser, + [], + { + #shortcuts: shortcuts, + #userId: userId, + }, + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #setShortcutsForUser, + [], + { + #shortcuts: shortcuts, + #userId: userId, + }, + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future updateUserData({ + required Map? data, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #updateUserData, + [], + { + #data: data, + #userId: userId, + }, + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future<_i2.Either>> getEmailToken( + String? ownEmail, + String? email, [ + _i7.CancelToken? cancelToken, + ]) => + (super.noSuchMethod( + Invocation.method( + #getEmailToken, + [ + ownEmail, + email, + cancelToken, + ], + ), + returnValue: _i4.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #getEmailToken, + [ + ownEmail, + email, + cancelToken, + ], + ), + )), + ) as _i4.Future<_i2.Either>>); + @override + _i4.Future<_i2.Either>> verifyEmailToken( + String? ownEmail, + String? email, + String? token, [ + _i7.CancelToken? cancelToken, + ]) => + (super.noSuchMethod( + Invocation.method( + #verifyEmailToken, + [ + ownEmail, + email, + token, + cancelToken, + ], + ), + returnValue: _i4.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #verifyEmailToken, + [ + ownEmail, + email, + token, + cancelToken, + ], + ), + )), + ) as _i4.Future<_i2.Either>>); + @override + _i4.Future<_i2.Either>> getProfileById( + {required String? id}) => + (super.noSuchMethod( + Invocation.method( + #getProfileById, + [], + {#id: id}, + ), + returnValue: _i4.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #getProfileById, + [], + {#id: id}, + ), + )), + ) as _i4.Future<_i2.Either>>); + @override + _i4.Future getDefaultGroups(String? languageCode) => + (super.noSuchMethod( + Invocation.method( + #getDefaultGroups, + [languageCode], + ), + returnValue: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future getDefaultPictos(String? languageCode) => + (super.noSuchMethod( + Invocation.method( + #getDefaultPictos, + [languageCode], + ), + returnValue: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future updateUserType({ + required String? id, + required _i5.UserType? userType, + }) => + (super.noSuchMethod( + Invocation.method( + #updateUserType, + [], + { + #id: id, + #userType: userType, + }, + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future<_i2.Either>> fetchShortcutsForUser( + {required String? userId}) => + (super.noSuchMethod( + Invocation.method( + #fetchShortcutsForUser, + [], + {#userId: userId}, + ), + returnValue: _i4.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #fetchShortcutsForUser, + [], + {#userId: userId}, + ), + )), + ) as _i4.Future<_i2.Either>>); + @override + _i4.Future?> createPictoGroupData({ + required String? userId, + required String? language, + required _i9.BoardDataType? type, + required Map? data, + _i7.CancelToken? cancelToken, + }) => + (super.noSuchMethod( + Invocation.method( + #createPictoGroupData, + [], + { + #userId: userId, + #language: language, + #type: type, + #data: data, + #cancelToken: cancelToken, + }, + ), + returnValue: _i4.Future?>.value(), + ) as _i4.Future?>); + @override + _i4.Future updateDevicesId({ + required String? userId, + required _i10.DeviceToken? deviceToken, + }) => + (super.noSuchMethod( + Invocation.method( + #updateDevicesId, + [], + { + #userId: userId, + #deviceToken: deviceToken, + }, + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future<_i2.Either>> learnPictograms({ + required String? uid, + required String? language, + required String? model, + required List>? tokens, + _i7.CancelToken? cancelToken, + }) => + (super.noSuchMethod( + Invocation.method( + #learnPictograms, + [], + { + #uid: uid, + #language: language, + #model: model, + #tokens: tokens, + #cancelToken: cancelToken, + }, + ), + returnValue: _i4.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #learnPictograms, + [], + { + #uid: uid, + #language: language, + #model: model, + #tokens: tokens, + #cancelToken: cancelToken, + }, + ), + )), + ) as _i4.Future<_i2.Either>>); + @override + _i4.Future<_i2.Either>> predictPictogram({ + required String? sentence, + required String? uid, + required String? language, + required String? model, + required List? groups, + required Map>? tags, + bool? reduced = false, + int? limit = 10, + int? chunk = 4, + _i7.CancelToken? cancelToken, + }) => + (super.noSuchMethod( + Invocation.method( + #predictPictogram, + [], + { + #sentence: sentence, + #uid: uid, + #language: language, + #model: model, + #groups: groups, + #tags: tags, + #reduced: reduced, + #limit: limit, + #chunk: chunk, + #cancelToken: cancelToken, + }, + ), + returnValue: _i4.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #predictPictogram, + [], + { + #sentence: sentence, + #uid: uid, + #language: language, + #model: model, + #groups: groups, + #tags: tags, + #reduced: reduced, + #limit: limit, + #chunk: chunk, + #cancelToken: cancelToken, + }, + ), + )), + ) as _i4.Future<_i2.Either>>); + @override + _i4.Future<_i2.Either> updateUserLastConnectionTime({ + required String? userId, + required int? time, + }) => + (super.noSuchMethod( + Invocation.method( + #updateUserLastConnectionTime, + [], + { + #userId: userId, + #time: time, + }, + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #updateUserLastConnectionTime, + [], + { + #userId: userId, + #time: time, + }, + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future fetchUserGroups({ + required String? languageCode, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #fetchUserGroups, + [], + { + #languageCode: languageCode, + #userId: userId, + }, + ), + returnValue: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future fetchUserPictos({ + required String? languageCode, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #fetchUserPictos, + [], + { + #languageCode: languageCode, + #userId: userId, + }, + ), + returnValue: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future updateLanguageSettings({ + required Map? map, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #updateLanguageSettings, + [], + { + #map: map, + #userId: userId, + }, + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future updateVoiceAndSubtitleSettings({ + required Map? map, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #updateVoiceAndSubtitleSettings, + [], + { + #map: map, + #userId: userId, + }, + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future updateAccessibilitySettings({ + required Map? map, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #updateAccessibilitySettings, + [], + { + #map: map, + #userId: userId, + }, + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future updateMainSettings({ + required Map? map, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #updateMainSettings, + [], + { + #map: map, + #userId: userId, + }, + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future fetchUserSettings({required String? userId}) => + (super.noSuchMethod( + Invocation.method( + #fetchUserSettings, + [], + {#userId: userId}, + ), + returnValue: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future<_i2.Either>> + fetchPhotosFromGlobalSymbols({ + required String? searchText, + required String? languageCode, + }) => + (super.noSuchMethod( + Invocation.method( + #fetchPhotosFromGlobalSymbols, + [], + { + #searchText: searchText, + #languageCode: languageCode, + }, + ), + returnValue: _i4 + .Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #fetchPhotosFromGlobalSymbols, + [], + { + #searchText: searchText, + #languageCode: languageCode, + }, + ), + )), + ) as _i4.Future<_i2.Either>>); + @override + _i4.Future uploadOtherImages({ + required String? imagePath, + required String? directoryPath, + required String? name, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #uploadOtherImages, + [], + { + #imagePath: imagePath, + #directoryPath: directoryPath, + #name: name, + #userId: userId, + }, + ), + returnValue: _i4.Future.value(''), + ) as _i4.Future); + @override + _i4.Future deleteTheAccount({required String? userId}) => + (super.noSuchMethod( + Invocation.method( + #deleteTheAccount, + [], + {#userId: userId}, + ), + returnValue: _i4.Future.value(false), + ) as _i4.Future); +} diff --git a/test/service/groups/groups_service_test.dart b/test/service/groups/groups_service_test.dart new file mode 100644 index 00000000..0ac0cf85 --- /dev/null +++ b/test/service/groups/groups_service_test.dart @@ -0,0 +1,210 @@ +// ignore_for_file: public_member_api_docs, sort_constructors_first +import 'dart:convert'; + +import 'package:either_dart/either.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mockito/annotations.dart'; +import 'package:mockito/mockito.dart'; + +import 'package:ottaa_project_flutter/application/service/service.dart'; +import 'package:ottaa_project_flutter/core/abstracts/basic_search.dart'; +import 'package:ottaa_project_flutter/core/enums/user_types.dart'; +import 'package:ottaa_project_flutter/core/models/assets_image.dart'; +import 'package:ottaa_project_flutter/core/models/base_settings_model.dart'; +import 'package:ottaa_project_flutter/core/models/base_user_model.dart'; +import 'package:ottaa_project_flutter/core/models/group_model.dart'; +import 'package:ottaa_project_flutter/core/models/language_setting.dart'; +import 'package:ottaa_project_flutter/core/models/user_data_model.dart'; +import 'package:ottaa_project_flutter/core/repositories/repositories.dart'; + +import 'groups_service_test.mocks.dart'; + +@GenerateMocks([ + AuthRepository, + RemoteStorageRepository, + ServerRepository, +]) +Future main() async { + late MockAuthRepository mockAuthRepository; + late MockRemoteStorageRepository mockRemoteStorageRepository; + late MockServerRepository mockServerRepository; + + late GroupsService groupsService; + + const String fakeGroups = """ + [ + { + "freq": 0, + "id": "--PHmDIFeKHvulVxNtBgk", + "relations": [], + "resource": {"asset": "", "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fdescripcion.webp?alt=media&token=4dbde8ba-f144-4a12-90f6-013bf68d912d"}, + "text": "ADJETIVOS" + }, + { + "freq": 0, + "id": "--PHmDIFeKHvulVxNtBgk1", + "relations": [], + "resource": {"asset": "", "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fdescripcion.webp?alt=media&token=4dbde8ba-f144-4a12-90f6-013bf68d912d"}, + "text": "ADJETIVOS1" + } + ] + """; + + BaseUserModel fakeUser = BaseUserModel( + id: "0", + settings: BaseSettingsModel( + data: UserData( + avatar: AssetsImage(asset: "test", network: "https://test.com"), + birthDate: DateTime(0), + genderPref: "n/a", + lastConnection: DateTime(0), + name: "John", + lastName: "Doe", + ), + language: LanguageSetting.empty(), + ), + email: "test@mail.com", + type: UserType.caregiver, + ); + + setUp(() { + mockAuthRepository = MockAuthRepository(); + mockRemoteStorageRepository = MockRemoteStorageRepository(); + mockServerRepository = MockServerRepository(); + + groupsService = GroupsService( + mockAuthRepository, + mockRemoteStorageRepository, + mockServerRepository, + ); + }); + + test("Should return all groups", () async { + when(mockAuthRepository.getCurrentUser()).thenAnswer((realInvocation) async => Right(fakeUser)); + + when(mockRemoteStorageRepository.readRemoteFile( + path: "groups", + fileName: 'assets/grupos.json', + )).thenAnswer((realInvocation) async => fakeGroups); + + final result = await groupsService.getAllGroups(); + + expect(result.length, 2); + }); + + test("Should return empty list", () async { + when(mockAuthRepository.getCurrentUser()).thenAnswer((realInvocation) async => Right(fakeUser)); + + when(mockRemoteStorageRepository.readRemoteFile( + path: "groups", + fileName: 'assets/grupos.json', + )).thenAnswer((realInvocation) async => "[]"); + + final result = await groupsService.getAllGroups(); + + expect(result.length, 0); + }); + + test("Should throw an exception on get groups", () async { + expect( + () => groupsService.getGroups(MockSearch( + asset: "", + file: "", + language: "", + remote: "", + )), + throwsA(isA())); + }); + + group("Upload groups", () { + test("should upload groups", () async { + List fakeGroupsDb = []; + + when(mockAuthRepository.getCurrentUser()).thenAnswer((realInvocation) async => Right(fakeUser)); + + when(mockServerRepository.uploadGroups(any, any, data: anyNamed("data"))).thenAnswer((realInvocation) async { + fakeGroupsDb.addAll(realInvocation.namedArguments[#data]); + + return const Right(null); + }); + final List fakeGroupsjson = json.decode(fakeGroups).map((e) => Group.fromMap(e)).toList(); + + await groupsService.uploadGroups(fakeGroupsjson, "", "es_AR"); + + expect(fakeGroupsDb, hasLength(fakeGroupsjson.length)); + }); + + test("should not upload groups", () async { + List fakeGroupsDb = []; + + when(mockAuthRepository.getCurrentUser()).thenAnswer((realInvocation) async => Left("No user left")); + + final List fakeGroupsjson = json.decode(fakeGroups).map((e) => Group.fromMap(e)).toList(); + + await groupsService.uploadGroups(fakeGroupsjson, "", "es_AR"); + + expect(fakeGroupsDb, hasLength(0)); + }); + }); + + group("Update groups", () { + test("should update groups", () async { + List originalDb = json.decode(fakeGroups).map((e) => Group.fromMap(e)).toList(); + List fakeGroupsDb = json.decode(fakeGroups).map((e) => Group.fromMap(e)).toList(); + + when(mockAuthRepository.getCurrentUser()).thenAnswer((realInvocation) async => Right(fakeUser)); + + when(mockServerRepository.updateGroup(any, any, any, data: anyNamed("data"))).thenAnswer((realInvocation) async { + int index = realInvocation.positionalArguments[2]; + final data = realInvocation.namedArguments[#data]; + + fakeGroupsDb[index] = Group.fromMap(data); + + return Right(null); + }); + + await groupsService.updateGroups(fakeGroupsDb.first.copyWith(text: "test"), "", "es_AR", 0); + + expect(fakeGroupsDb.first == originalDb.first, equals(false)); + }); + + test("should not update group", () async { + List originalDb = json.decode(fakeGroups).map((e) => Group.fromMap(e)).toList(); + List fakeGroupsDb = json.decode(fakeGroups).map((e) => Group.fromMap(e)).toList(); + + when(mockAuthRepository.getCurrentUser()).thenAnswer((realInvocation) async => Left("No user left")); + + await groupsService.updateGroups(fakeGroupsDb.first.copyWith(text: "test"), "", "es_AR", 0); + + expect(fakeGroupsDb, equals(originalDb)); + }); + }); + + + test("get default groups should thrown unimplementd error", () async { + expect(() => groupsService.getDefaultGroups(), throwsA(isA())); + }); +} + +class MockSearch extends BasicSearch { + @override + final String asset; + + @override + // TODO: implement file + final String file; + + @override + // TODO: implement language + final String language; + + @override + // TODO: implement remote + final String remote; + MockSearch({ + required this.asset, + required this.file, + required this.language, + required this.remote, + }); +} diff --git a/test/service/groups/groups_service_test.mocks.dart b/test/service/groups/groups_service_test.mocks.dart new file mode 100644 index 00000000..8ac363aa --- /dev/null +++ b/test/service/groups/groups_service_test.mocks.dart @@ -0,0 +1,1230 @@ +// Mocks generated by Mockito 5.4.0 from annotations +// in ottaa_project_flutter/test/service/groups/groups_service_test.dart. +// Do not manually edit this file. + +// ignore_for_file: no_leading_underscores_for_library_prefixes +import 'dart:async' as _i4; +import 'dart:typed_data' as _i8; + +import 'package:dio/dio.dart' as _i12; +import 'package:either_dart/either.dart' as _i2; +import 'package:mockito/mockito.dart' as _i1; +import 'package:ottaa_project_flutter/core/abstracts/user_model.dart' as _i5; +import 'package:ottaa_project_flutter/core/enums/board_data_type.dart' as _i14; +import 'package:ottaa_project_flutter/core/enums/sign_in_types.dart' as _i6; +import 'package:ottaa_project_flutter/core/enums/user_types.dart' as _i10; +import 'package:ottaa_project_flutter/core/models/arsaac_data_model.dart' + as _i16; +import 'package:ottaa_project_flutter/core/models/assets_image.dart' as _i11; +import 'package:ottaa_project_flutter/core/models/devices_token.dart' as _i15; +import 'package:ottaa_project_flutter/core/models/shortcuts_model.dart' as _i13; +import 'package:ottaa_project_flutter/core/repositories/auth_repository.dart' + as _i3; +import 'package:ottaa_project_flutter/core/repositories/remote_storage_repository.dart' + as _i7; +import 'package:ottaa_project_flutter/core/repositories/server_repository.dart' + as _i9; + +// ignore_for_file: type=lint +// ignore_for_file: avoid_redundant_argument_values +// ignore_for_file: avoid_setters_without_getters +// ignore_for_file: comment_references +// ignore_for_file: implementation_imports +// ignore_for_file: invalid_use_of_visible_for_testing_member +// ignore_for_file: prefer_const_constructors +// ignore_for_file: unnecessary_parenthesis +// ignore_for_file: camel_case_types +// ignore_for_file: subtype_of_sealed_class + +class _FakeEither_0 extends _i1.SmartFake implements _i2.Either { + _FakeEither_0( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +/// A class which mocks [AuthRepository]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockAuthRepository extends _i1.Mock implements _i3.AuthRepository { + MockAuthRepository() { + _i1.throwOnMissingStub(this); + } + + @override + bool get isLogged => (super.noSuchMethod( + Invocation.getter(#isLogged), + returnValue: false, + ) as bool); + @override + _i4.Future<_i2.Either> signIn( + _i6.SignInType? type, [ + String? email, + String? password, + ]) => + (super.noSuchMethod( + Invocation.method( + #signIn, + [ + type, + email, + password, + ], + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #signIn, + [ + type, + email, + password, + ], + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future<_i2.Either> signUp() => (super.noSuchMethod( + Invocation.method( + #signUp, + [], + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #signUp, + [], + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future<_i2.Either> getCurrentUser() => + (super.noSuchMethod( + Invocation.method( + #getCurrentUser, + [], + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #getCurrentUser, + [], + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future isLoggedIn() => (super.noSuchMethod( + Invocation.method( + #isLoggedIn, + [], + ), + returnValue: _i4.Future.value(false), + ) as _i4.Future); + @override + _i4.Future logout() => (super.noSuchMethod( + Invocation.method( + #logout, + [], + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future getDeviceId() => (super.noSuchMethod( + Invocation.method( + #getDeviceId, + [], + ), + returnValue: _i4.Future.value(''), + ) as _i4.Future); + @override + _i4.Future deleteAccount({required String? userId}) => + (super.noSuchMethod( + Invocation.method( + #deleteAccount, + [], + {#userId: userId}, + ), + returnValue: _i4.Future.value(false), + ) as _i4.Future); +} + +/// A class which mocks [RemoteStorageRepository]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockRemoteStorageRepository extends _i1.Mock + implements _i7.RemoteStorageRepository { + MockRemoteStorageRepository() { + _i1.throwOnMissingStub(this); + } + + @override + _i4.Future uploadFile( + String? path, + String? fileName, + _i8.Uint8List? file, + ) => + (super.noSuchMethod( + Invocation.method( + #uploadFile, + [ + path, + fileName, + file, + ], + ), + returnValue: _i4.Future.value(''), + ) as _i4.Future); + @override + _i4.Future deleteFile( + String? path, + String? fileName, + ) => + (super.noSuchMethod( + Invocation.method( + #deleteFile, + [ + path, + fileName, + ], + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future readRemoteFile({ + required String? path, + required String? fileName, + }) => + (super.noSuchMethod( + Invocation.method( + #readRemoteFile, + [], + { + #path: path, + #fileName: fileName, + }, + ), + returnValue: _i4.Future.value(''), + ) as _i4.Future); +} + +/// A class which mocks [ServerRepository]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockServerRepository extends _i1.Mock implements _i9.ServerRepository { + MockServerRepository() { + _i1.throwOnMissingStub(this); + } + + @override + _i4.Future<_i2.Either> getAvailableAppVersion( + String? platform) => + (super.noSuchMethod( + Invocation.method( + #getAvailableAppVersion, + [platform], + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #getAvailableAppVersion, + [platform], + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future<_i10.UserType> getUserType(String? userId) => (super.noSuchMethod( + Invocation.method( + #getUserType, + [userId], + ), + returnValue: _i4.Future<_i10.UserType>.value(_i10.UserType.caregiver), + ) as _i4.Future<_i10.UserType>); + @override + _i4.Future<_i2.Either> getUserProfilePicture( + String? userId) => + (super.noSuchMethod( + Invocation.method( + #getUserProfilePicture, + [userId], + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #getUserProfilePicture, + [userId], + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future<_i2.Either> uploadUserPicture( + String? userId, + _i11.AssetsImage? image, + ) => + (super.noSuchMethod( + Invocation.method( + #uploadUserPicture, + [ + userId, + image, + ], + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #uploadUserPicture, + [ + userId, + image, + ], + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future<_i2.Either>> getUserInformation( + String? id) => + (super.noSuchMethod( + Invocation.method( + #getUserInformation, + [id], + ), + returnValue: _i4.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #getUserInformation, + [id], + ), + )), + ) as _i4.Future<_i2.Either>>); + @override + _i4.Future<_i2.Either> uploadUserInformation( + String? userId, + Map? data, + ) => + (super.noSuchMethod( + Invocation.method( + #uploadUserInformation, + [ + userId, + data, + ], + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #uploadUserInformation, + [ + userId, + data, + ], + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future>> getUserSentences( + String? userId, { + required String? language, + required String? type, + bool? isFavorite = false, + }) => + (super.noSuchMethod( + Invocation.method( + #getUserSentences, + [userId], + { + #language: language, + #type: type, + #isFavorite: isFavorite, + }, + ), + returnValue: _i4.Future>>.value( + >[]), + ) as _i4.Future>>); + @override + _i4.Future<_i2.Either> uploadUserSentences( + String? userId, + String? language, + String? type, + List>? data, + ) => + (super.noSuchMethod( + Invocation.method( + #uploadUserSentences, + [ + userId, + language, + type, + data, + ], + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #uploadUserSentences, + [ + userId, + language, + type, + data, + ], + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future<_i2.Either>>> getAllPictograms( + String? userId, + String? languageCode, + ) => + (super.noSuchMethod( + Invocation.method( + #getAllPictograms, + [ + userId, + languageCode, + ], + ), + returnValue: + _i4.Future<_i2.Either>>>.value( + _FakeEither_0>>( + this, + Invocation.method( + #getAllPictograms, + [ + userId, + languageCode, + ], + ), + )), + ) as _i4.Future<_i2.Either>>>); + @override + _i4.Future<_i2.Either> uploadPictograms( + String? userId, + String? language, { + required List>? data, + }) => + (super.noSuchMethod( + Invocation.method( + #uploadPictograms, + [ + userId, + language, + ], + {#data: data}, + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #uploadPictograms, + [ + userId, + language, + ], + {#data: data}, + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future<_i2.Either> updatePictogram( + String? userId, + String? language, + int? index, { + required Map? data, + }) => + (super.noSuchMethod( + Invocation.method( + #updatePictogram, + [ + userId, + language, + index, + ], + {#data: data}, + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #updatePictogram, + [ + userId, + language, + index, + ], + {#data: data}, + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future<_i2.Either>>> getAllGroups( + String? userId, + String? languageCode, + ) => + (super.noSuchMethod( + Invocation.method( + #getAllGroups, + [ + userId, + languageCode, + ], + ), + returnValue: + _i4.Future<_i2.Either>>>.value( + _FakeEither_0>>( + this, + Invocation.method( + #getAllGroups, + [ + userId, + languageCode, + ], + ), + )), + ) as _i4.Future<_i2.Either>>>); + @override + _i4.Future<_i2.Either> uploadGroups( + String? userId, + String? language, { + required List>? data, + }) => + (super.noSuchMethod( + Invocation.method( + #uploadGroups, + [ + userId, + language, + ], + {#data: data}, + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #uploadGroups, + [ + userId, + language, + ], + {#data: data}, + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future<_i2.Either> updateGroup( + String? userId, + String? language, + int? index, { + required Map? data, + }) => + (super.noSuchMethod( + Invocation.method( + #updateGroup, + [ + userId, + language, + index, + ], + {#data: data}, + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #updateGroup, + [ + userId, + language, + index, + ], + {#data: data}, + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future<_i2.Either>> getPictogramsStatistics( + String? userId, + String? languageCode, [ + _i12.CancelToken? cancelToken, + ]) => + (super.noSuchMethod( + Invocation.method( + #getPictogramsStatistics, + [ + userId, + languageCode, + cancelToken, + ], + ), + returnValue: _i4.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #getPictogramsStatistics, + [ + userId, + languageCode, + cancelToken, + ], + ), + )), + ) as _i4.Future<_i2.Either>>); + @override + _i4.Future<_i2.Either>> getMostUsedSentences( + String? userId, + String? languageCode, [ + _i12.CancelToken? cancelToken, + ]) => + (super.noSuchMethod( + Invocation.method( + #getMostUsedSentences, + [ + userId, + languageCode, + cancelToken, + ], + ), + returnValue: _i4.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #getMostUsedSentences, + [ + userId, + languageCode, + cancelToken, + ], + ), + )), + ) as _i4.Future<_i2.Either>>); + @override + _i4.Future<_i2.Either> generatePhraseGPT({ + required String? prompt, + required int? maxTokens, + double? temperature = 0.0, + }) => + (super.noSuchMethod( + Invocation.method( + #generatePhraseGPT, + [], + { + #prompt: prompt, + #maxTokens: maxTokens, + #temperature: temperature, + }, + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #generatePhraseGPT, + [], + { + #prompt: prompt, + #maxTokens: maxTokens, + #temperature: temperature, + }, + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future uploadUserImage({ + required String? path, + required String? name, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #uploadUserImage, + [], + { + #path: path, + #name: name, + #userId: userId, + }, + ), + returnValue: _i4.Future.value(''), + ) as _i4.Future); + @override + _i4.Future updateUserSettings({ + required Map? data, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #updateUserSettings, + [], + { + #data: data, + #userId: userId, + }, + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future<_i2.Either>> getConnectedUsers( + {required String? userId}) => + (super.noSuchMethod( + Invocation.method( + #getConnectedUsers, + [], + {#userId: userId}, + ), + returnValue: _i4.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #getConnectedUsers, + [], + {#userId: userId}, + ), + )), + ) as _i4.Future<_i2.Either>>); + @override + _i4.Future<_i2.Either>> fetchConnectedUserData( + {required String? userId}) => + (super.noSuchMethod( + Invocation.method( + #fetchConnectedUserData, + [], + {#userId: userId}, + ), + returnValue: _i4.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #fetchConnectedUserData, + [], + {#userId: userId}, + ), + )), + ) as _i4.Future<_i2.Either>>); + @override + _i4.Future removeCurrentUser({ + required String? userId, + required String? careGiverId, + }) => + (super.noSuchMethod( + Invocation.method( + #removeCurrentUser, + [], + { + #userId: userId, + #careGiverId: careGiverId, + }, + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future<_i2.Either> setShortcutsForUser({ + required _i13.ShortcutsModel? shortcuts, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #setShortcutsForUser, + [], + { + #shortcuts: shortcuts, + #userId: userId, + }, + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #setShortcutsForUser, + [], + { + #shortcuts: shortcuts, + #userId: userId, + }, + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future updateUserData({ + required Map? data, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #updateUserData, + [], + { + #data: data, + #userId: userId, + }, + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future<_i2.Either>> getEmailToken( + String? ownEmail, + String? email, [ + _i12.CancelToken? cancelToken, + ]) => + (super.noSuchMethod( + Invocation.method( + #getEmailToken, + [ + ownEmail, + email, + cancelToken, + ], + ), + returnValue: _i4.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #getEmailToken, + [ + ownEmail, + email, + cancelToken, + ], + ), + )), + ) as _i4.Future<_i2.Either>>); + @override + _i4.Future<_i2.Either>> verifyEmailToken( + String? ownEmail, + String? email, + String? token, [ + _i12.CancelToken? cancelToken, + ]) => + (super.noSuchMethod( + Invocation.method( + #verifyEmailToken, + [ + ownEmail, + email, + token, + cancelToken, + ], + ), + returnValue: _i4.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #verifyEmailToken, + [ + ownEmail, + email, + token, + cancelToken, + ], + ), + )), + ) as _i4.Future<_i2.Either>>); + @override + _i4.Future<_i2.Either>> getProfileById( + {required String? id}) => + (super.noSuchMethod( + Invocation.method( + #getProfileById, + [], + {#id: id}, + ), + returnValue: _i4.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #getProfileById, + [], + {#id: id}, + ), + )), + ) as _i4.Future<_i2.Either>>); + @override + _i4.Future getDefaultGroups(String? languageCode) => + (super.noSuchMethod( + Invocation.method( + #getDefaultGroups, + [languageCode], + ), + returnValue: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future getDefaultPictos(String? languageCode) => + (super.noSuchMethod( + Invocation.method( + #getDefaultPictos, + [languageCode], + ), + returnValue: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future updateUserType({ + required String? id, + required _i10.UserType? userType, + }) => + (super.noSuchMethod( + Invocation.method( + #updateUserType, + [], + { + #id: id, + #userType: userType, + }, + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future<_i2.Either>> fetchShortcutsForUser( + {required String? userId}) => + (super.noSuchMethod( + Invocation.method( + #fetchShortcutsForUser, + [], + {#userId: userId}, + ), + returnValue: _i4.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #fetchShortcutsForUser, + [], + {#userId: userId}, + ), + )), + ) as _i4.Future<_i2.Either>>); + @override + _i4.Future?> createPictoGroupData({ + required String? userId, + required String? language, + required _i14.BoardDataType? type, + required Map? data, + _i12.CancelToken? cancelToken, + }) => + (super.noSuchMethod( + Invocation.method( + #createPictoGroupData, + [], + { + #userId: userId, + #language: language, + #type: type, + #data: data, + #cancelToken: cancelToken, + }, + ), + returnValue: _i4.Future?>.value(), + ) as _i4.Future?>); + @override + _i4.Future updateDevicesId({ + required String? userId, + required _i15.DeviceToken? deviceToken, + }) => + (super.noSuchMethod( + Invocation.method( + #updateDevicesId, + [], + { + #userId: userId, + #deviceToken: deviceToken, + }, + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future<_i2.Either>> learnPictograms({ + required String? uid, + required String? language, + required String? model, + required List>? tokens, + _i12.CancelToken? cancelToken, + }) => + (super.noSuchMethod( + Invocation.method( + #learnPictograms, + [], + { + #uid: uid, + #language: language, + #model: model, + #tokens: tokens, + #cancelToken: cancelToken, + }, + ), + returnValue: _i4.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #learnPictograms, + [], + { + #uid: uid, + #language: language, + #model: model, + #tokens: tokens, + #cancelToken: cancelToken, + }, + ), + )), + ) as _i4.Future<_i2.Either>>); + @override + _i4.Future<_i2.Either>> predictPictogram({ + required String? sentence, + required String? uid, + required String? language, + required String? model, + required List? groups, + required Map>? tags, + bool? reduced = false, + int? limit = 10, + int? chunk = 4, + _i12.CancelToken? cancelToken, + }) => + (super.noSuchMethod( + Invocation.method( + #predictPictogram, + [], + { + #sentence: sentence, + #uid: uid, + #language: language, + #model: model, + #groups: groups, + #tags: tags, + #reduced: reduced, + #limit: limit, + #chunk: chunk, + #cancelToken: cancelToken, + }, + ), + returnValue: _i4.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #predictPictogram, + [], + { + #sentence: sentence, + #uid: uid, + #language: language, + #model: model, + #groups: groups, + #tags: tags, + #reduced: reduced, + #limit: limit, + #chunk: chunk, + #cancelToken: cancelToken, + }, + ), + )), + ) as _i4.Future<_i2.Either>>); + @override + _i4.Future<_i2.Either> updateUserLastConnectionTime({ + required String? userId, + required int? time, + }) => + (super.noSuchMethod( + Invocation.method( + #updateUserLastConnectionTime, + [], + { + #userId: userId, + #time: time, + }, + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #updateUserLastConnectionTime, + [], + { + #userId: userId, + #time: time, + }, + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future fetchUserGroups({ + required String? languageCode, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #fetchUserGroups, + [], + { + #languageCode: languageCode, + #userId: userId, + }, + ), + returnValue: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future fetchUserPictos({ + required String? languageCode, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #fetchUserPictos, + [], + { + #languageCode: languageCode, + #userId: userId, + }, + ), + returnValue: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future updateLanguageSettings({ + required Map? map, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #updateLanguageSettings, + [], + { + #map: map, + #userId: userId, + }, + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future updateVoiceAndSubtitleSettings({ + required Map? map, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #updateVoiceAndSubtitleSettings, + [], + { + #map: map, + #userId: userId, + }, + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future updateAccessibilitySettings({ + required Map? map, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #updateAccessibilitySettings, + [], + { + #map: map, + #userId: userId, + }, + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future updateMainSettings({ + required Map? map, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #updateMainSettings, + [], + { + #map: map, + #userId: userId, + }, + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future fetchUserSettings({required String? userId}) => + (super.noSuchMethod( + Invocation.method( + #fetchUserSettings, + [], + {#userId: userId}, + ), + returnValue: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future<_i2.Either>> + fetchPhotosFromGlobalSymbols({ + required String? searchText, + required String? languageCode, + }) => + (super.noSuchMethod( + Invocation.method( + #fetchPhotosFromGlobalSymbols, + [], + { + #searchText: searchText, + #languageCode: languageCode, + }, + ), + returnValue: _i4 + .Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #fetchPhotosFromGlobalSymbols, + [], + { + #searchText: searchText, + #languageCode: languageCode, + }, + ), + )), + ) as _i4.Future<_i2.Either>>); + @override + _i4.Future uploadOtherImages({ + required String? imagePath, + required String? directoryPath, + required String? name, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #uploadOtherImages, + [], + { + #imagePath: imagePath, + #directoryPath: directoryPath, + #name: name, + #userId: userId, + }, + ), + returnValue: _i4.Future.value(''), + ) as _i4.Future); + @override + _i4.Future deleteTheAccount({required String? userId}) => + (super.noSuchMethod( + Invocation.method( + #deleteTheAccount, + [], + {#userId: userId}, + ), + returnValue: _i4.Future.value(false), + ) as _i4.Future); +} diff --git a/test/service/hive_database/hive_database_test.dart b/test/service/hive_database/hive_database_test.dart new file mode 100644 index 00000000..ca7905ac --- /dev/null +++ b/test/service/hive_database/hive_database_test.dart @@ -0,0 +1,302 @@ +import 'package:flutter/foundation.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:hive/hive.dart'; +import 'package:hive_flutter/hive_flutter.dart'; +import 'package:mockito/annotations.dart'; +import 'package:mockito/mockito.dart'; +import 'package:ottaa_project_flutter/application/service/hive_database.dart'; +import 'package:ottaa_project_flutter/core/abstracts/user_model.dart'; +import 'package:ottaa_project_flutter/core/enums/user_types.dart'; +import 'package:ottaa_project_flutter/core/models/base_user_model.dart'; +import 'package:ottaa_project_flutter/core/models/caregiver_user_model.dart'; +import 'package:ottaa_project_flutter/core/models/patient_user_model.dart'; + +import 'hive_database_test.mocks.dart'; + +@GenerateMocks([HiveInterface, Box]) +void main() async { + late MockHiveInterface hive; + late MockBox box; + + late HiveDatabase hiveDatabase; + + TestWidgetsFlutterBinding.ensureInitialized(); + + setUp(() { + hive = MockHiveInterface(); + box = MockBox(); + + MethodChannel methodChannel = const MethodChannel('plugins.flutter.io/path_provider'); + TestDefaultBinaryMessengerBinding.instance!.defaultBinaryMessenger.setMockMethodCallHandler( + methodChannel, + (message) async { + return "."; + }, + ); + + hiveDatabase = HiveDatabase(hive: hive); + }); + + test("should call close hiveDB", () async { + await hiveDatabase.close(); + + verify(hive.close()); + }); + + test("should call clear box", () async { + when(box.clear()).thenAnswer((_) async => 0); + when(hive.box('user')).thenReturn(box); + when(hive.box('caregiver')).thenReturn(box); + when(hive.box('none')).thenReturn(box); + + await hiveDatabase.deleteUser(); + + verifyInOrder([ + hive.box('user'), + box.clear(), + hive.box('caregiver'), + box.clear(), + hive.box('none'), + box.clear(), + ]); + }); + + group("get user", () { + test("should return user", () async { + when(box.get(UserType.user.name)).thenReturn(getUserByType(UserType.user)); + when(hive.box(UserType.user.name)).thenReturn(box); + + final user = await hiveDatabase.getUser(); + + expect(user!.type, UserType.user); + }); + + test("should return caregiver", () async { + when(box.get(UserType.user.name)).thenReturn(null); + when(box.get(UserType.caregiver.name)).thenReturn(getUserByType(UserType.caregiver)); + when(hive.box(UserType.caregiver.name)).thenReturn(box); + when(hive.box(UserType.user.name)).thenReturn(box); + when(hive.box(UserType.none.name)).thenReturn(box); + + final user = await hiveDatabase.getUser(); + + expect(user!.type, UserType.caregiver); + }); + + test("should return none", () async { + when(box.get(UserType.user.name)).thenReturn(null); + when(box.get(UserType.caregiver.name)).thenReturn(null); + when(box.get(UserType.none.name)).thenReturn(getUserByType(UserType.none)); + when(hive.box(UserType.caregiver.name)).thenReturn(box); + when(hive.box(UserType.user.name)).thenReturn(box); + when(hive.box(UserType.none.name)).thenReturn(box); + + final user = await hiveDatabase.getUser(); + + expect(user!.type, UserType.none); + }); + }); + + test("should init hive", () async { + when(box.get(any)).thenReturn(box); + when(hive.box(any)).thenReturn(box); + when(hive.openBox(any)).thenAnswer((realInvocation) async => box); + + when(box.get(UserType.user.name)).thenReturn(getUserByType(UserType.user)); + when(box.get(UserType.caregiver.name)).thenReturn(getUserByType(UserType.caregiver)); + when(box.get(UserType.none.name)).thenReturn(getUserByType(UserType.none)); + + await hiveDatabase.init(); + + verify(hive.init(any)); + verify(hive.registerAdapter(any)).called(29); + // verify(hive.openBox(any)).called(7); + }); + + group("set user", () { + test("should set user", () async { + when(hive.box(any)).thenReturn(box); + + when(hive.isBoxOpen(any)).thenAnswer((realInvocation) { + return true; + }); + + when(hive.openBox(any)).thenAnswer((realInvocation) async { + return box; + }); + + when(box.put(any, any)).thenAnswer((realInvocation) async => 0); + + when(box.get(any)).thenAnswer( + (realInvocation) => getUserByType(UserType.values.firstWhere((element) => element.name == realInvocation.positionalArguments[0])), + ); + + final user = getUserByType(UserType.user); + + await hiveDatabase.setUser(user); + + verify(box.put(any, any)); + }); + }); + + group("secure box", () { + test("should return secure box", () async { + when(hive.box(any)).thenReturn(box); + + when(hive.isBoxOpen(any)).thenAnswer((realInvocation) { + return true; + }); + + Box secureBox = await hiveDatabase.secureBox("user"); + + expect(secureBox, box); + verify(hive.box(any)); + verify(hive.isBoxOpen(any)); + }); + + test("should open secure box and then return it", () async { + when(hive.openBox(any)).thenAnswer((_) async => box); + + when(hive.isBoxOpen(any)).thenAnswer((realInvocation) { + return false; + }); + + Box secureBox = await hiveDatabase.secureBox("user"); + + expect(secureBox, box); + verify(hive.openBox(any)); + verify(hive.isBoxOpen(any)); + }); + }); + + test("set intro should update box", () async { + bool intro = false; + + when(hive.box(any)).thenReturn(box); + + when(box.put(any, any)).thenAnswer((realInvocation) async { + intro = realInvocation.positionalArguments[1]; + }); + + await hiveDatabase.setIntro(true); + + verify(box.put(any, any)); + expect(intro, true); + }); + + test("get intro should return intro", () async { + when(hive.box(any)).thenReturn(box); + + when(box.get(any)).thenReturn(true); + + bool intro = await hiveDatabase.getIntro(); + + verify(box.get(any)); + expect(intro, true); + }); + + test("get voice should return name", () async { + when(hive.box(any)).thenReturn(box); + + when(box.get(any)).thenReturn("name"); + + String name = await hiveDatabase.getVoice(); + + verify(box.get(any)); + expect(name, "name"); + }); + + test("set voice should update box", () async { + String name = ""; + + when(hive.box(any)).thenReturn(box); + + when(box.put(any, any)).thenAnswer((realInvocation) async { + name = realInvocation.positionalArguments[1]; + }); + + await hiveDatabase.setVoice(name: "name"); + + verify(box.put(any, any)); + expect(name, "name"); + }); + + test("get long click should return true", () async { + when(hive.box(any)).thenReturn(box); + + when(box.get(any)).thenReturn(true); + + bool getLongClick = await hiveDatabase.getLongClick(); + + verify(box.get(any)); + expect(getLongClick, true); + }); + + test("set long click should update box", () async { + bool longClick = false; + + when(hive.box(any)).thenReturn(box); + + when(box.put(any, any)).thenAnswer((realInvocation) async { + longClick = realInvocation.positionalArguments[1]; + }); + + await hiveDatabase.setLongClick(isLongClick: true); + + verify(box.put(any, any)); + expect(longClick, true); + }); + + /* test("should return the listeneable for a box", () async { + when(hive.box(any)).thenReturn(box); + + final valuenotifier = hiveDatabase.getListeneableFromName("box"); + + verify(hive.box(any)); + expect(valuenotifier, isA>()); + });*/ +} + +UserModel getUserByType(UserType type) { + final Map fakeUserInfo = { + "id": "mu4ZiTMURBeLEV7p3CrFbljBrHF2", + "settings": { + "data": { + "avatar": {"asset": "671", "network": "123"}, + "birthDate": 0, + "genderPref": "n/a", + "lastConnection": 1684420759838, + "lastName": "Ali", + "name": "Emir", + "number": "" + }, + "devices": [], + "language": { + "labs": false, + "language": "es_AR", + }, + "layout": { + "cleanup": true, + "display": "tab", + "oneToOne": false, + "shortcuts": {"camera": false, "enable": true, "favs": false, "games": true, "history": false, "no": true, "share": false, "yes": true} + }, + "payment": { + "payment": false, + "paymentDate": 0, + "paymentExpire": 0, + } + }, + "type": type.name + }; + + switch (type) { + case UserType.user: + return PatientUserModel.fromMap(fakeUserInfo); + case UserType.caregiver: + return CaregiverUserModel.fromMap(fakeUserInfo); + case UserType.none: + return BaseUserModel.fromMap(fakeUserInfo); + } +} diff --git a/test/service/hive_database/hive_database_test.mocks.dart b/test/service/hive_database/hive_database_test.mocks.dart new file mode 100644 index 00000000..0a49b947 --- /dev/null +++ b/test/service/hive_database/hive_database_test.mocks.dart @@ -0,0 +1,513 @@ +// Mocks generated by Mockito 5.4.0 from annotations +// in ottaa_project_flutter/test/service/hive_database/hive_database_test.dart. +// Do not manually edit this file. + +// ignore_for_file: no_leading_underscores_for_library_prefixes +import 'dart:async' as _i3; +import 'dart:typed_data' as _i6; + +import 'package:hive/hive.dart' as _i2; +import 'package:hive/src/box/default_compaction_strategy.dart' as _i5; +import 'package:hive/src/box/default_key_comparator.dart' as _i4; +import 'package:mockito/mockito.dart' as _i1; + +// ignore_for_file: type=lint +// ignore_for_file: avoid_redundant_argument_values +// ignore_for_file: avoid_setters_without_getters +// ignore_for_file: comment_references +// ignore_for_file: implementation_imports +// ignore_for_file: invalid_use_of_visible_for_testing_member +// ignore_for_file: prefer_const_constructors +// ignore_for_file: unnecessary_parenthesis +// ignore_for_file: camel_case_types +// ignore_for_file: subtype_of_sealed_class + +class _FakeBox_0 extends _i1.SmartFake implements _i2.Box { + _FakeBox_0( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeLazyBox_1 extends _i1.SmartFake implements _i2.LazyBox { + _FakeLazyBox_1( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +/// A class which mocks [HiveInterface]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockHiveInterface extends _i1.Mock implements _i2.HiveInterface { + MockHiveInterface() { + _i1.throwOnMissingStub(this); + } + + @override + void init( + String? path, { + _i2.HiveStorageBackendPreference? backendPreference = + _i2.HiveStorageBackendPreference.native, + }) => + super.noSuchMethod( + Invocation.method( + #init, + [path], + {#backendPreference: backendPreference}, + ), + returnValueForMissingStub: null, + ); + @override + _i3.Future<_i2.Box> openBox( + String? name, { + _i2.HiveCipher? encryptionCipher, + _i2.KeyComparator? keyComparator = _i4.defaultKeyComparator, + _i2.CompactionStrategy? compactionStrategy = _i5.defaultCompactionStrategy, + bool? crashRecovery = true, + String? path, + _i6.Uint8List? bytes, + String? collection, + List? encryptionKey, + }) => + (super.noSuchMethod( + Invocation.method( + #openBox, + [name], + { + #encryptionCipher: encryptionCipher, + #keyComparator: keyComparator, + #compactionStrategy: compactionStrategy, + #crashRecovery: crashRecovery, + #path: path, + #bytes: bytes, + #collection: collection, + #encryptionKey: encryptionKey, + }, + ), + returnValue: _i3.Future<_i2.Box>.value(_FakeBox_0( + this, + Invocation.method( + #openBox, + [name], + { + #encryptionCipher: encryptionCipher, + #keyComparator: keyComparator, + #compactionStrategy: compactionStrategy, + #crashRecovery: crashRecovery, + #path: path, + #bytes: bytes, + #collection: collection, + #encryptionKey: encryptionKey, + }, + ), + )), + ) as _i3.Future<_i2.Box>); + @override + _i3.Future<_i2.LazyBox> openLazyBox( + String? name, { + _i2.HiveCipher? encryptionCipher, + _i2.KeyComparator? keyComparator = _i4.defaultKeyComparator, + _i2.CompactionStrategy? compactionStrategy = _i5.defaultCompactionStrategy, + bool? crashRecovery = true, + String? path, + String? collection, + List? encryptionKey, + }) => + (super.noSuchMethod( + Invocation.method( + #openLazyBox, + [name], + { + #encryptionCipher: encryptionCipher, + #keyComparator: keyComparator, + #compactionStrategy: compactionStrategy, + #crashRecovery: crashRecovery, + #path: path, + #collection: collection, + #encryptionKey: encryptionKey, + }, + ), + returnValue: _i3.Future<_i2.LazyBox>.value(_FakeLazyBox_1( + this, + Invocation.method( + #openLazyBox, + [name], + { + #encryptionCipher: encryptionCipher, + #keyComparator: keyComparator, + #compactionStrategy: compactionStrategy, + #crashRecovery: crashRecovery, + #path: path, + #collection: collection, + #encryptionKey: encryptionKey, + }, + ), + )), + ) as _i3.Future<_i2.LazyBox>); + @override + _i2.Box box(String? name) => (super.noSuchMethod( + Invocation.method( + #box, + [name], + ), + returnValue: _FakeBox_0( + this, + Invocation.method( + #box, + [name], + ), + ), + ) as _i2.Box); + @override + _i2.LazyBox lazyBox(String? name) => (super.noSuchMethod( + Invocation.method( + #lazyBox, + [name], + ), + returnValue: _FakeLazyBox_1( + this, + Invocation.method( + #lazyBox, + [name], + ), + ), + ) as _i2.LazyBox); + @override + bool isBoxOpen(String? name) => (super.noSuchMethod( + Invocation.method( + #isBoxOpen, + [name], + ), + returnValue: false, + ) as bool); + @override + _i3.Future close() => (super.noSuchMethod( + Invocation.method( + #close, + [], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + @override + _i3.Future deleteBoxFromDisk( + String? name, { + String? path, + }) => + (super.noSuchMethod( + Invocation.method( + #deleteBoxFromDisk, + [name], + {#path: path}, + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + @override + _i3.Future deleteFromDisk() => (super.noSuchMethod( + Invocation.method( + #deleteFromDisk, + [], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + @override + List generateSecureKey() => (super.noSuchMethod( + Invocation.method( + #generateSecureKey, + [], + ), + returnValue: [], + ) as List); + @override + _i3.Future boxExists( + String? name, { + String? path, + }) => + (super.noSuchMethod( + Invocation.method( + #boxExists, + [name], + {#path: path}, + ), + returnValue: _i3.Future.value(false), + ) as _i3.Future); + @override + void resetAdapters() => super.noSuchMethod( + Invocation.method( + #resetAdapters, + [], + ), + returnValueForMissingStub: null, + ); + @override + void registerAdapter( + _i2.TypeAdapter? adapter, { + bool? internal = false, + bool? override = false, + }) => + super.noSuchMethod( + Invocation.method( + #registerAdapter, + [adapter], + { + #internal: internal, + #override: override, + }, + ), + returnValueForMissingStub: null, + ); + @override + bool isAdapterRegistered(int? typeId) => (super.noSuchMethod( + Invocation.method( + #isAdapterRegistered, + [typeId], + ), + returnValue: false, + ) as bool); + @override + void ignoreTypeId(int? typeId) => super.noSuchMethod( + Invocation.method( + #ignoreTypeId, + [typeId], + ), + returnValueForMissingStub: null, + ); +} + +/// A class which mocks [Box]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockBox extends _i1.Mock implements _i2.Box { + MockBox() { + _i1.throwOnMissingStub(this); + } + + @override + Iterable get values => (super.noSuchMethod( + Invocation.getter(#values), + returnValue: [], + ) as Iterable); + @override + String get name => (super.noSuchMethod( + Invocation.getter(#name), + returnValue: '', + ) as String); + @override + bool get isOpen => (super.noSuchMethod( + Invocation.getter(#isOpen), + returnValue: false, + ) as bool); + @override + bool get lazy => (super.noSuchMethod( + Invocation.getter(#lazy), + returnValue: false, + ) as bool); + @override + Iterable get keys => (super.noSuchMethod( + Invocation.getter(#keys), + returnValue: [], + ) as Iterable); + @override + int get length => (super.noSuchMethod( + Invocation.getter(#length), + returnValue: 0, + ) as int); + @override + bool get isEmpty => (super.noSuchMethod( + Invocation.getter(#isEmpty), + returnValue: false, + ) as bool); + @override + bool get isNotEmpty => (super.noSuchMethod( + Invocation.getter(#isNotEmpty), + returnValue: false, + ) as bool); + @override + Iterable valuesBetween({ + dynamic startKey, + dynamic endKey, + }) => + (super.noSuchMethod( + Invocation.method( + #valuesBetween, + [], + { + #startKey: startKey, + #endKey: endKey, + }, + ), + returnValue: [], + ) as Iterable); + @override + E? getAt(int? index) => (super.noSuchMethod(Invocation.method( + #getAt, + [index], + )) as E?); + @override + Map toMap() => (super.noSuchMethod( + Invocation.method( + #toMap, + [], + ), + returnValue: {}, + ) as Map); + @override + dynamic keyAt(int? index) => super.noSuchMethod(Invocation.method( + #keyAt, + [index], + )); + @override + _i3.Stream<_i2.BoxEvent> watch({dynamic key}) => (super.noSuchMethod( + Invocation.method( + #watch, + [], + {#key: key}, + ), + returnValue: _i3.Stream<_i2.BoxEvent>.empty(), + ) as _i3.Stream<_i2.BoxEvent>); + @override + bool containsKey(dynamic key) => (super.noSuchMethod( + Invocation.method( + #containsKey, + [key], + ), + returnValue: false, + ) as bool); + @override + _i3.Future put( + dynamic key, + E? value, + ) => + (super.noSuchMethod( + Invocation.method( + #put, + [ + key, + value, + ], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + @override + _i3.Future putAt( + int? index, + E? value, + ) => + (super.noSuchMethod( + Invocation.method( + #putAt, + [ + index, + value, + ], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + @override + _i3.Future putAll(Map? entries) => (super.noSuchMethod( + Invocation.method( + #putAll, + [entries], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + @override + _i3.Future add(E? value) => (super.noSuchMethod( + Invocation.method( + #add, + [value], + ), + returnValue: _i3.Future.value(0), + ) as _i3.Future); + @override + _i3.Future> addAll(Iterable? values) => (super.noSuchMethod( + Invocation.method( + #addAll, + [values], + ), + returnValue: _i3.Future>.value([]), + ) as _i3.Future>); + @override + _i3.Future delete(dynamic key) => (super.noSuchMethod( + Invocation.method( + #delete, + [key], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + @override + _i3.Future deleteAt(int? index) => (super.noSuchMethod( + Invocation.method( + #deleteAt, + [index], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + @override + _i3.Future deleteAll(Iterable? keys) => (super.noSuchMethod( + Invocation.method( + #deleteAll, + [keys], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + @override + _i3.Future compact() => (super.noSuchMethod( + Invocation.method( + #compact, + [], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + @override + _i3.Future clear() => (super.noSuchMethod( + Invocation.method( + #clear, + [], + ), + returnValue: _i3.Future.value(0), + ) as _i3.Future); + @override + _i3.Future close() => (super.noSuchMethod( + Invocation.method( + #close, + [], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + @override + _i3.Future deleteFromDisk() => (super.noSuchMethod( + Invocation.method( + #deleteFromDisk, + [], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + @override + _i3.Future flush() => (super.noSuchMethod( + Invocation.method( + #flush, + [], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); +} diff --git a/test/service/mobileRemote/mobile_remote_storage_test.dart b/test/service/mobileRemote/mobile_remote_storage_test.dart new file mode 100644 index 00000000..14686a58 --- /dev/null +++ b/test/service/mobileRemote/mobile_remote_storage_test.dart @@ -0,0 +1,147 @@ +import 'dart:convert'; +import 'dart:typed_data'; + +import 'package:either_dart/either.dart'; +import 'package:firebase_database/firebase_database.dart'; +import 'package:firebase_storage/firebase_storage.dart'; +import 'package:firebase_storage_mocks/firebase_storage_mocks.dart'; +import 'package:flutter/widgets.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mockito/annotations.dart'; +import 'package:mockito/mockito.dart'; +import 'package:ottaa_project_flutter/application/common/i18n.dart'; +import 'package:ottaa_project_flutter/application/service/service.dart'; +import 'package:ottaa_project_flutter/core/models/patient_user_model.dart'; +import 'package:ottaa_project_flutter/core/models/tts_setting.dart'; +import 'package:ottaa_project_flutter/core/repositories/repositories.dart'; +import 'package:universal_io/io.dart'; + +import 'mobile_remote_storage_test.mocks.dart'; + +@GenerateMocks([AuthRepository, ServerRepository, I18N, AssetBundle]) +void main() { + late FirebaseStorage firebaseDatabase; + late MockAuthRepository mockAuthRepository; + late MockServerRepository mockServerRepository; + late MockI18N mockI18N; + late MockAssetBundle mockAssetBundle; + + late RemoteStorageService mobileRemoteStorageService; + const Map fakeGroup = { + "block": false, + "freq": 0, + "id": "--PHmDIFeKHvulVxNtBgk", + "relations": [], + "resource": {"asset": "", "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fdescripcion.webp?alt=media&token=4dbde8ba-f144-4a12-90f6-013bf68d912d"}, + "text": "ADJETIVOS" + }; + const Map fakePicto = { + "block": false, + "freq": 0, + "id": "ZodvGgP2un6y5X185Xrb9", + "resource": {"asset": "", "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fgallo.webp?alt=media&token=f7eeb656-0122-4522-a795-630b90749f8a"}, + "text": "gallo", + "type": 2 + }; + + final Map fakeUserInfo = { + "id": "mu4ZiTMURBeLEV7p3CrFbljBrHF2", + "pictos": {}, + "groups": {}, + "settings": { + "data": { + "avatar": {"asset": "671", "network": "123"}, + "birthDate": 0, + "genderPref": "n/a", + "lastConnection": 1684420759838, + "lastName": "Ali", + "name": "Emir", + "number": "" + }, + "devices": [], + "tts": TTSSetting.empty().toMap(), + "language": { + "labs": false, + "language": "es_AR", + }, + "layout": { + "cleanup": true, + "display": "tab", + "oneToOne": false, + "shortcuts": {"camera": false, "enable": true, "favs": false, "games": true, "history": false, "no": true, "share": false, "yes": true} + }, + "payment": {"payment": false, "paymentDate": 0, "paymentExpire": 0} + }, + "type": "user" + }; + + final fakeUserModel = PatientUserModel.fromMap(fakeUserInfo); + + setUp(() { + firebaseDatabase = MockFirebaseStorage(); + mockAuthRepository = MockAuthRepository(); + mockServerRepository = MockServerRepository(); + mockI18N = MockI18N(); + mockAssetBundle = MockAssetBundle(); + + mobileRemoteStorageService = RemoteStorageService(mockAuthRepository, mockServerRepository, mockI18N, firebaseStorage: firebaseDatabase, assetBundle: mockAssetBundle); + }); + + // test("should create instance with default injectors", () { + // final service = MobileRemoteStorageService.from(mockAuthRepository, mockServerRepository, mockI18N); + + // expect(service, isNotNull); + // }); + + test("delete file should throw an exception", () async { + expect(() => mobileRemoteStorageService.deleteFile("path", "fileName"), throwsUnimplementedError); + }); + + group("read remote file", () { + test("should return empty string if user is not logged in", () async { + when(mockAuthRepository.getCurrentUser()).thenAnswer((_) async => Left("")); + + final result = await mobileRemoteStorageService.readRemoteFile(path: "path", fileName: "fileName"); + + expect(result, ""); + }); + + test("should return pictos if user is logged in", () async { + when(mockAuthRepository.getCurrentUser()).thenAnswer((_) async => Right(fakeUserModel)); + when(mockI18N.currentLocale).thenReturn(const Locale("es_AR")); + when(mockServerRepository.getAllPictograms(any, any)).thenAnswer((_) async => Right([fakePicto])); + + final result = await mobileRemoteStorageService.readRemoteFile(path: "Pictos", fileName: "fileName"); + + expect(result, jsonEncode([fakePicto])); + }); + + test("should return groups if user is logged in", () async { + when(mockAuthRepository.getCurrentUser()).thenAnswer((_) async => Right(fakeUserModel)); + when(mockI18N.currentLocale).thenReturn(const Locale("es_AR")); + when(mockServerRepository.getAllGroups(any, any)).thenAnswer((_) async => Right([fakeGroup])); + + final result = await mobileRemoteStorageService.readRemoteFile(path: "Grupos", fileName: "fileName"); + + expect(result, jsonEncode([fakeGroup])); + }); + + test("should return cached pictos", () async { + when(mockAuthRepository.getCurrentUser()).thenAnswer((_) async => Right(fakeUserModel)); + when(mockI18N.currentLocale).thenReturn(const Locale("es_AR")); + when(mockServerRepository.getAllPictograms(any, any)).thenAnswer((_) async => Left("No pictos")); + + when(mockAssetBundle.loadString(any)).thenAnswer((_) async => jsonEncode([fakePicto])); + + final result = await mobileRemoteStorageService.readRemoteFile(path: "Pictos", fileName: "pictos_path"); + + expect(result, jsonEncode([fakePicto])); + }); + }); + + test("should upload file", () async { + String uploadFileURL = await mobileRemoteStorageService.uploadFile("path", "fileName", Uint8List.fromList([1, 2, 3])); + + expect(uploadFileURL, isA()); + }); +} diff --git a/test/service/mobileRemote/mobile_remote_storage_test.mocks.dart b/test/service/mobileRemote/mobile_remote_storage_test.mocks.dart new file mode 100644 index 00000000..8b89c2e1 --- /dev/null +++ b/test/service/mobileRemote/mobile_remote_storage_test.mocks.dart @@ -0,0 +1,1419 @@ +// Mocks generated by Mockito 5.4.0 from annotations +// in ottaa_project_flutter/test/service/mobileRemote/mobile_remote_storage_test.dart. +// Do not manually edit this file. + +// ignore_for_file: no_leading_underscores_for_library_prefixes +import 'dart:async' as _i5; +import 'dart:typed_data' as _i19; +import 'dart:ui' as _i3; + +import 'package:dio/dio.dart' as _i12; +import 'package:either_dart/either.dart' as _i2; +import 'package:flutter/material.dart' as _i18; +import 'package:mockito/mockito.dart' as _i1; +import 'package:ottaa_project_flutter/application/common/i18n.dart' as _i4; +import 'package:ottaa_project_flutter/application/language/translation_tree.dart' + as _i17; +import 'package:ottaa_project_flutter/core/abstracts/user_model.dart' as _i7; +import 'package:ottaa_project_flutter/core/enums/board_data_type.dart' as _i14; +import 'package:ottaa_project_flutter/core/enums/sign_in_types.dart' as _i8; +import 'package:ottaa_project_flutter/core/enums/user_types.dart' as _i10; +import 'package:ottaa_project_flutter/core/models/arsaac_data_model.dart' + as _i16; +import 'package:ottaa_project_flutter/core/models/assets_image.dart' as _i11; +import 'package:ottaa_project_flutter/core/models/devices_token.dart' as _i15; +import 'package:ottaa_project_flutter/core/models/shortcuts_model.dart' as _i13; +import 'package:ottaa_project_flutter/core/repositories/auth_repository.dart' + as _i6; +import 'package:ottaa_project_flutter/core/repositories/server_repository.dart' + as _i9; + +// ignore_for_file: type=lint +// ignore_for_file: avoid_redundant_argument_values +// ignore_for_file: avoid_setters_without_getters +// ignore_for_file: comment_references +// ignore_for_file: implementation_imports +// ignore_for_file: invalid_use_of_visible_for_testing_member +// ignore_for_file: prefer_const_constructors +// ignore_for_file: unnecessary_parenthesis +// ignore_for_file: camel_case_types +// ignore_for_file: subtype_of_sealed_class + +class _FakeEither_0 extends _i1.SmartFake implements _i2.Either { + _FakeEither_0( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeLocale_1 extends _i1.SmartFake implements _i3.Locale { + _FakeLocale_1( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeI18N_2 extends _i1.SmartFake implements _i4.I18N { + _FakeI18N_2( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeImmutableBuffer_3 extends _i1.SmartFake + implements _i3.ImmutableBuffer { + _FakeImmutableBuffer_3( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeFuture_4 extends _i1.SmartFake implements _i5.Future { + _FakeFuture_4( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +/// A class which mocks [AuthRepository]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockAuthRepository extends _i1.Mock implements _i6.AuthRepository { + MockAuthRepository() { + _i1.throwOnMissingStub(this); + } + + @override + bool get isLogged => (super.noSuchMethod( + Invocation.getter(#isLogged), + returnValue: false, + ) as bool); + @override + _i5.Future<_i2.Either> signIn( + _i8.SignInType? type, [ + String? email, + String? password, + ]) => + (super.noSuchMethod( + Invocation.method( + #signIn, + [ + type, + email, + password, + ], + ), + returnValue: _i5.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #signIn, + [ + type, + email, + password, + ], + ), + )), + ) as _i5.Future<_i2.Either>); + @override + _i5.Future<_i2.Either> signUp() => (super.noSuchMethod( + Invocation.method( + #signUp, + [], + ), + returnValue: _i5.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #signUp, + [], + ), + )), + ) as _i5.Future<_i2.Either>); + @override + _i5.Future<_i2.Either> getCurrentUser() => + (super.noSuchMethod( + Invocation.method( + #getCurrentUser, + [], + ), + returnValue: _i5.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #getCurrentUser, + [], + ), + )), + ) as _i5.Future<_i2.Either>); + @override + _i5.Future isLoggedIn() => (super.noSuchMethod( + Invocation.method( + #isLoggedIn, + [], + ), + returnValue: _i5.Future.value(false), + ) as _i5.Future); + @override + _i5.Future logout() => (super.noSuchMethod( + Invocation.method( + #logout, + [], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + @override + _i5.Future getDeviceId() => (super.noSuchMethod( + Invocation.method( + #getDeviceId, + [], + ), + returnValue: _i5.Future.value(''), + ) as _i5.Future); + @override + _i5.Future deleteAccount({required String? userId}) => + (super.noSuchMethod( + Invocation.method( + #deleteAccount, + [], + {#userId: userId}, + ), + returnValue: _i5.Future.value(false), + ) as _i5.Future); +} + +/// A class which mocks [ServerRepository]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockServerRepository extends _i1.Mock implements _i9.ServerRepository { + MockServerRepository() { + _i1.throwOnMissingStub(this); + } + + @override + _i5.Future<_i2.Either> getAvailableAppVersion( + String? platform) => + (super.noSuchMethod( + Invocation.method( + #getAvailableAppVersion, + [platform], + ), + returnValue: _i5.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #getAvailableAppVersion, + [platform], + ), + )), + ) as _i5.Future<_i2.Either>); + @override + _i5.Future<_i10.UserType> getUserType(String? userId) => (super.noSuchMethod( + Invocation.method( + #getUserType, + [userId], + ), + returnValue: _i5.Future<_i10.UserType>.value(_i10.UserType.caregiver), + ) as _i5.Future<_i10.UserType>); + @override + _i5.Future<_i2.Either> getUserProfilePicture( + String? userId) => + (super.noSuchMethod( + Invocation.method( + #getUserProfilePicture, + [userId], + ), + returnValue: _i5.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #getUserProfilePicture, + [userId], + ), + )), + ) as _i5.Future<_i2.Either>); + @override + _i5.Future<_i2.Either> uploadUserPicture( + String? userId, + _i11.AssetsImage? image, + ) => + (super.noSuchMethod( + Invocation.method( + #uploadUserPicture, + [ + userId, + image, + ], + ), + returnValue: _i5.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #uploadUserPicture, + [ + userId, + image, + ], + ), + )), + ) as _i5.Future<_i2.Either>); + @override + _i5.Future<_i2.Either>> getUserInformation( + String? id) => + (super.noSuchMethod( + Invocation.method( + #getUserInformation, + [id], + ), + returnValue: _i5.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #getUserInformation, + [id], + ), + )), + ) as _i5.Future<_i2.Either>>); + @override + _i5.Future<_i2.Either> uploadUserInformation( + String? userId, + Map? data, + ) => + (super.noSuchMethod( + Invocation.method( + #uploadUserInformation, + [ + userId, + data, + ], + ), + returnValue: _i5.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #uploadUserInformation, + [ + userId, + data, + ], + ), + )), + ) as _i5.Future<_i2.Either>); + @override + _i5.Future>> getUserSentences( + String? userId, { + required String? language, + required String? type, + bool? isFavorite = false, + }) => + (super.noSuchMethod( + Invocation.method( + #getUserSentences, + [userId], + { + #language: language, + #type: type, + #isFavorite: isFavorite, + }, + ), + returnValue: _i5.Future>>.value( + >[]), + ) as _i5.Future>>); + @override + _i5.Future<_i2.Either> uploadUserSentences( + String? userId, + String? language, + String? type, + List>? data, + ) => + (super.noSuchMethod( + Invocation.method( + #uploadUserSentences, + [ + userId, + language, + type, + data, + ], + ), + returnValue: _i5.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #uploadUserSentences, + [ + userId, + language, + type, + data, + ], + ), + )), + ) as _i5.Future<_i2.Either>); + @override + _i5.Future<_i2.Either>>> getAllPictograms( + String? userId, + String? languageCode, + ) => + (super.noSuchMethod( + Invocation.method( + #getAllPictograms, + [ + userId, + languageCode, + ], + ), + returnValue: + _i5.Future<_i2.Either>>>.value( + _FakeEither_0>>( + this, + Invocation.method( + #getAllPictograms, + [ + userId, + languageCode, + ], + ), + )), + ) as _i5.Future<_i2.Either>>>); + @override + _i5.Future<_i2.Either> uploadPictograms( + String? userId, + String? language, { + required List>? data, + }) => + (super.noSuchMethod( + Invocation.method( + #uploadPictograms, + [ + userId, + language, + ], + {#data: data}, + ), + returnValue: _i5.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #uploadPictograms, + [ + userId, + language, + ], + {#data: data}, + ), + )), + ) as _i5.Future<_i2.Either>); + @override + _i5.Future<_i2.Either> updatePictogram( + String? userId, + String? language, + int? index, { + required Map? data, + }) => + (super.noSuchMethod( + Invocation.method( + #updatePictogram, + [ + userId, + language, + index, + ], + {#data: data}, + ), + returnValue: _i5.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #updatePictogram, + [ + userId, + language, + index, + ], + {#data: data}, + ), + )), + ) as _i5.Future<_i2.Either>); + @override + _i5.Future<_i2.Either>>> getAllGroups( + String? userId, + String? languageCode, + ) => + (super.noSuchMethod( + Invocation.method( + #getAllGroups, + [ + userId, + languageCode, + ], + ), + returnValue: + _i5.Future<_i2.Either>>>.value( + _FakeEither_0>>( + this, + Invocation.method( + #getAllGroups, + [ + userId, + languageCode, + ], + ), + )), + ) as _i5.Future<_i2.Either>>>); + @override + _i5.Future<_i2.Either> uploadGroups( + String? userId, + String? language, { + required List>? data, + }) => + (super.noSuchMethod( + Invocation.method( + #uploadGroups, + [ + userId, + language, + ], + {#data: data}, + ), + returnValue: _i5.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #uploadGroups, + [ + userId, + language, + ], + {#data: data}, + ), + )), + ) as _i5.Future<_i2.Either>); + @override + _i5.Future<_i2.Either> updateGroup( + String? userId, + String? language, + int? index, { + required Map? data, + }) => + (super.noSuchMethod( + Invocation.method( + #updateGroup, + [ + userId, + language, + index, + ], + {#data: data}, + ), + returnValue: _i5.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #updateGroup, + [ + userId, + language, + index, + ], + {#data: data}, + ), + )), + ) as _i5.Future<_i2.Either>); + @override + _i5.Future<_i2.Either>> getPictogramsStatistics( + String? userId, + String? languageCode, [ + _i12.CancelToken? cancelToken, + ]) => + (super.noSuchMethod( + Invocation.method( + #getPictogramsStatistics, + [ + userId, + languageCode, + cancelToken, + ], + ), + returnValue: _i5.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #getPictogramsStatistics, + [ + userId, + languageCode, + cancelToken, + ], + ), + )), + ) as _i5.Future<_i2.Either>>); + @override + _i5.Future<_i2.Either>> getMostUsedSentences( + String? userId, + String? languageCode, [ + _i12.CancelToken? cancelToken, + ]) => + (super.noSuchMethod( + Invocation.method( + #getMostUsedSentences, + [ + userId, + languageCode, + cancelToken, + ], + ), + returnValue: _i5.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #getMostUsedSentences, + [ + userId, + languageCode, + cancelToken, + ], + ), + )), + ) as _i5.Future<_i2.Either>>); + @override + _i5.Future<_i2.Either> generatePhraseGPT({ + required String? prompt, + required int? maxTokens, + double? temperature = 0.0, + }) => + (super.noSuchMethod( + Invocation.method( + #generatePhraseGPT, + [], + { + #prompt: prompt, + #maxTokens: maxTokens, + #temperature: temperature, + }, + ), + returnValue: _i5.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #generatePhraseGPT, + [], + { + #prompt: prompt, + #maxTokens: maxTokens, + #temperature: temperature, + }, + ), + )), + ) as _i5.Future<_i2.Either>); + @override + _i5.Future uploadUserImage({ + required String? path, + required String? name, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #uploadUserImage, + [], + { + #path: path, + #name: name, + #userId: userId, + }, + ), + returnValue: _i5.Future.value(''), + ) as _i5.Future); + @override + _i5.Future updateUserSettings({ + required Map? data, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #updateUserSettings, + [], + { + #data: data, + #userId: userId, + }, + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + @override + _i5.Future<_i2.Either>> getConnectedUsers( + {required String? userId}) => + (super.noSuchMethod( + Invocation.method( + #getConnectedUsers, + [], + {#userId: userId}, + ), + returnValue: _i5.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #getConnectedUsers, + [], + {#userId: userId}, + ), + )), + ) as _i5.Future<_i2.Either>>); + @override + _i5.Future<_i2.Either>> fetchConnectedUserData( + {required String? userId}) => + (super.noSuchMethod( + Invocation.method( + #fetchConnectedUserData, + [], + {#userId: userId}, + ), + returnValue: _i5.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #fetchConnectedUserData, + [], + {#userId: userId}, + ), + )), + ) as _i5.Future<_i2.Either>>); + @override + _i5.Future removeCurrentUser({ + required String? userId, + required String? careGiverId, + }) => + (super.noSuchMethod( + Invocation.method( + #removeCurrentUser, + [], + { + #userId: userId, + #careGiverId: careGiverId, + }, + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + @override + _i5.Future<_i2.Either> setShortcutsForUser({ + required _i13.ShortcutsModel? shortcuts, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #setShortcutsForUser, + [], + { + #shortcuts: shortcuts, + #userId: userId, + }, + ), + returnValue: _i5.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #setShortcutsForUser, + [], + { + #shortcuts: shortcuts, + #userId: userId, + }, + ), + )), + ) as _i5.Future<_i2.Either>); + @override + _i5.Future updateUserData({ + required Map? data, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #updateUserData, + [], + { + #data: data, + #userId: userId, + }, + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + @override + _i5.Future<_i2.Either>> getEmailToken( + String? ownEmail, + String? email, [ + _i12.CancelToken? cancelToken, + ]) => + (super.noSuchMethod( + Invocation.method( + #getEmailToken, + [ + ownEmail, + email, + cancelToken, + ], + ), + returnValue: _i5.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #getEmailToken, + [ + ownEmail, + email, + cancelToken, + ], + ), + )), + ) as _i5.Future<_i2.Either>>); + @override + _i5.Future<_i2.Either>> verifyEmailToken( + String? ownEmail, + String? email, + String? token, [ + _i12.CancelToken? cancelToken, + ]) => + (super.noSuchMethod( + Invocation.method( + #verifyEmailToken, + [ + ownEmail, + email, + token, + cancelToken, + ], + ), + returnValue: _i5.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #verifyEmailToken, + [ + ownEmail, + email, + token, + cancelToken, + ], + ), + )), + ) as _i5.Future<_i2.Either>>); + @override + _i5.Future<_i2.Either>> getProfileById( + {required String? id}) => + (super.noSuchMethod( + Invocation.method( + #getProfileById, + [], + {#id: id}, + ), + returnValue: _i5.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #getProfileById, + [], + {#id: id}, + ), + )), + ) as _i5.Future<_i2.Either>>); + @override + _i5.Future getDefaultGroups(String? languageCode) => + (super.noSuchMethod( + Invocation.method( + #getDefaultGroups, + [languageCode], + ), + returnValue: _i5.Future.value(), + ) as _i5.Future); + @override + _i5.Future getDefaultPictos(String? languageCode) => + (super.noSuchMethod( + Invocation.method( + #getDefaultPictos, + [languageCode], + ), + returnValue: _i5.Future.value(), + ) as _i5.Future); + @override + _i5.Future updateUserType({ + required String? id, + required _i10.UserType? userType, + }) => + (super.noSuchMethod( + Invocation.method( + #updateUserType, + [], + { + #id: id, + #userType: userType, + }, + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + @override + _i5.Future<_i2.Either>> fetchShortcutsForUser( + {required String? userId}) => + (super.noSuchMethod( + Invocation.method( + #fetchShortcutsForUser, + [], + {#userId: userId}, + ), + returnValue: _i5.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #fetchShortcutsForUser, + [], + {#userId: userId}, + ), + )), + ) as _i5.Future<_i2.Either>>); + @override + _i5.Future?> createPictoGroupData({ + required String? userId, + required String? language, + required _i14.BoardDataType? type, + required Map? data, + _i12.CancelToken? cancelToken, + }) => + (super.noSuchMethod( + Invocation.method( + #createPictoGroupData, + [], + { + #userId: userId, + #language: language, + #type: type, + #data: data, + #cancelToken: cancelToken, + }, + ), + returnValue: _i5.Future?>.value(), + ) as _i5.Future?>); + @override + _i5.Future updateDevicesId({ + required String? userId, + required _i15.DeviceToken? deviceToken, + }) => + (super.noSuchMethod( + Invocation.method( + #updateDevicesId, + [], + { + #userId: userId, + #deviceToken: deviceToken, + }, + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + @override + _i5.Future<_i2.Either>> learnPictograms({ + required String? uid, + required String? language, + required String? model, + required List>? tokens, + _i12.CancelToken? cancelToken, + }) => + (super.noSuchMethod( + Invocation.method( + #learnPictograms, + [], + { + #uid: uid, + #language: language, + #model: model, + #tokens: tokens, + #cancelToken: cancelToken, + }, + ), + returnValue: _i5.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #learnPictograms, + [], + { + #uid: uid, + #language: language, + #model: model, + #tokens: tokens, + #cancelToken: cancelToken, + }, + ), + )), + ) as _i5.Future<_i2.Either>>); + @override + _i5.Future<_i2.Either>> predictPictogram({ + required String? sentence, + required String? uid, + required String? language, + required String? model, + required List? groups, + required Map>? tags, + bool? reduced = false, + int? limit = 10, + int? chunk = 4, + _i12.CancelToken? cancelToken, + }) => + (super.noSuchMethod( + Invocation.method( + #predictPictogram, + [], + { + #sentence: sentence, + #uid: uid, + #language: language, + #model: model, + #groups: groups, + #tags: tags, + #reduced: reduced, + #limit: limit, + #chunk: chunk, + #cancelToken: cancelToken, + }, + ), + returnValue: _i5.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #predictPictogram, + [], + { + #sentence: sentence, + #uid: uid, + #language: language, + #model: model, + #groups: groups, + #tags: tags, + #reduced: reduced, + #limit: limit, + #chunk: chunk, + #cancelToken: cancelToken, + }, + ), + )), + ) as _i5.Future<_i2.Either>>); + @override + _i5.Future<_i2.Either> updateUserLastConnectionTime({ + required String? userId, + required int? time, + }) => + (super.noSuchMethod( + Invocation.method( + #updateUserLastConnectionTime, + [], + { + #userId: userId, + #time: time, + }, + ), + returnValue: _i5.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #updateUserLastConnectionTime, + [], + { + #userId: userId, + #time: time, + }, + ), + )), + ) as _i5.Future<_i2.Either>); + @override + _i5.Future fetchUserGroups({ + required String? languageCode, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #fetchUserGroups, + [], + { + #languageCode: languageCode, + #userId: userId, + }, + ), + returnValue: _i5.Future.value(), + ) as _i5.Future); + @override + _i5.Future fetchUserPictos({ + required String? languageCode, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #fetchUserPictos, + [], + { + #languageCode: languageCode, + #userId: userId, + }, + ), + returnValue: _i5.Future.value(), + ) as _i5.Future); + @override + _i5.Future updateLanguageSettings({ + required Map? map, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #updateLanguageSettings, + [], + { + #map: map, + #userId: userId, + }, + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + @override + _i5.Future updateVoiceAndSubtitleSettings({ + required Map? map, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #updateVoiceAndSubtitleSettings, + [], + { + #map: map, + #userId: userId, + }, + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + @override + _i5.Future updateAccessibilitySettings({ + required Map? map, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #updateAccessibilitySettings, + [], + { + #map: map, + #userId: userId, + }, + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + @override + _i5.Future updateMainSettings({ + required Map? map, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #updateMainSettings, + [], + { + #map: map, + #userId: userId, + }, + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + @override + _i5.Future fetchUserSettings({required String? userId}) => + (super.noSuchMethod( + Invocation.method( + #fetchUserSettings, + [], + {#userId: userId}, + ), + returnValue: _i5.Future.value(), + ) as _i5.Future); + @override + _i5.Future<_i2.Either>> + fetchPhotosFromGlobalSymbols({ + required String? searchText, + required String? languageCode, + }) => + (super.noSuchMethod( + Invocation.method( + #fetchPhotosFromGlobalSymbols, + [], + { + #searchText: searchText, + #languageCode: languageCode, + }, + ), + returnValue: _i5 + .Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #fetchPhotosFromGlobalSymbols, + [], + { + #searchText: searchText, + #languageCode: languageCode, + }, + ), + )), + ) as _i5.Future<_i2.Either>>); + @override + _i5.Future uploadOtherImages({ + required String? imagePath, + required String? directoryPath, + required String? name, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #uploadOtherImages, + [], + { + #imagePath: imagePath, + #directoryPath: directoryPath, + #name: name, + #userId: userId, + }, + ), + returnValue: _i5.Future.value(''), + ) as _i5.Future); + @override + _i5.Future deleteTheAccount({required String? userId}) => + (super.noSuchMethod( + Invocation.method( + #deleteTheAccount, + [], + {#userId: userId}, + ), + returnValue: _i5.Future.value(false), + ) as _i5.Future); +} + +/// A class which mocks [I18N]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockI18N extends _i1.Mock implements _i4.I18N { + MockI18N() { + _i1.throwOnMissingStub(this); + } + + @override + Map get platformLanguages => (super.noSuchMethod( + Invocation.getter(#platformLanguages), + returnValue: {}, + ) as Map); + @override + _i3.Locale get currentLocale => (super.noSuchMethod( + Invocation.getter(#currentLocale), + returnValue: _FakeLocale_1( + this, + Invocation.getter(#currentLocale), + ), + ) as _i3.Locale); + @override + set currentLocale(_i3.Locale? _currentLocale) => super.noSuchMethod( + Invocation.setter( + #currentLocale, + _currentLocale, + ), + returnValueForMissingStub: null, + ); + @override + bool get hasListeners => (super.noSuchMethod( + Invocation.getter(#hasListeners), + returnValue: false, + ) as bool); + @override + _i5.Future<_i4.I18N> init() => (super.noSuchMethod( + Invocation.method( + #init, + [], + ), + returnValue: _i5.Future<_i4.I18N>.value(_FakeI18N_2( + this, + Invocation.method( + #init, + [], + ), + )), + ) as _i5.Future<_i4.I18N>); + @override + _i5.Future<_i17.TranslationTree?> loadTranslation(_i3.Locale? locale) => + (super.noSuchMethod( + Invocation.method( + #loadTranslation, + [locale], + ), + returnValue: _i5.Future<_i17.TranslationTree?>.value(), + ) as _i5.Future<_i17.TranslationTree?>); + @override + _i5.Future changeLanguage(String? languageCode) => (super.noSuchMethod( + Invocation.method( + #changeLanguage, + [languageCode], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + @override + _i5.Future changeLanguageFromLocale(_i3.Locale? locale) => + (super.noSuchMethod( + Invocation.method( + #changeLanguageFromLocale, + [locale], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + @override + void notify() => super.noSuchMethod( + Invocation.method( + #notify, + [], + ), + returnValueForMissingStub: null, + ); + @override + void addListener(_i3.VoidCallback? listener) => super.noSuchMethod( + Invocation.method( + #addListener, + [listener], + ), + returnValueForMissingStub: null, + ); + @override + void removeListener(_i3.VoidCallback? listener) => super.noSuchMethod( + Invocation.method( + #removeListener, + [listener], + ), + returnValueForMissingStub: null, + ); + @override + void dispose() => super.noSuchMethod( + Invocation.method( + #dispose, + [], + ), + returnValueForMissingStub: null, + ); + @override + void notifyListeners() => super.noSuchMethod( + Invocation.method( + #notifyListeners, + [], + ), + returnValueForMissingStub: null, + ); +} + +/// A class which mocks [AssetBundle]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockAssetBundle extends _i1.Mock implements _i18.AssetBundle { + MockAssetBundle() { + _i1.throwOnMissingStub(this); + } + + @override + _i5.Future<_i19.ByteData> load(String? key) => (super.noSuchMethod( + Invocation.method( + #load, + [key], + ), + returnValue: _i5.Future<_i19.ByteData>.value(_i19.ByteData(0)), + ) as _i5.Future<_i19.ByteData>); + @override + _i5.Future<_i3.ImmutableBuffer> loadBuffer(String? key) => + (super.noSuchMethod( + Invocation.method( + #loadBuffer, + [key], + ), + returnValue: + _i5.Future<_i3.ImmutableBuffer>.value(_FakeImmutableBuffer_3( + this, + Invocation.method( + #loadBuffer, + [key], + ), + )), + ) as _i5.Future<_i3.ImmutableBuffer>); + @override + _i5.Future loadString( + String? key, { + bool? cache = true, + }) => + (super.noSuchMethod( + Invocation.method( + #loadString, + [key], + {#cache: cache}, + ), + returnValue: _i5.Future.value(''), + ) as _i5.Future); + @override + _i5.Future loadStructuredData( + String? key, + _i5.Future Function(String)? parser, + ) => + (super.noSuchMethod( + Invocation.method( + #loadStructuredData, + [ + key, + parser, + ], + ), + returnValue: _FakeFuture_4( + this, + Invocation.method( + #loadStructuredData, + [ + key, + parser, + ], + ), + ), + ) as _i5.Future); + @override + void evict(String? key) => super.noSuchMethod( + Invocation.method( + #evict, + [key], + ), + returnValueForMissingStub: null, + ); + @override + void clear() => super.noSuchMethod( + Invocation.method( + #clear, + [], + ), + returnValueForMissingStub: null, + ); +} diff --git a/test/service/notifications/firebase_messaging_mock.dart b/test/service/notifications/firebase_messaging_mock.dart new file mode 100644 index 00000000..bfa59ecd --- /dev/null +++ b/test/service/notifications/firebase_messaging_mock.dart @@ -0,0 +1,124 @@ +// ignore_for_file: require_trailing_commas +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:firebase_core/firebase_core.dart'; +import 'package:firebase_core_platform_interface/firebase_core_platform_interface.dart'; +import 'package:firebase_messaging_platform_interface/firebase_messaging_platform_interface.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mockito/mockito.dart'; +import 'package:plugin_platform_interface/plugin_platform_interface.dart'; + +typedef Callback = Function(MethodCall call); + +const String kTestString = 'Hello World'; + +final MockFirebaseMessaging kMockMessagingPlatform = MockFirebaseMessaging(); + +Future neverEndingFuture() async { + // ignore: literal_only_boolean_expressions + while (true) { + await Future.delayed(const Duration(minutes: 5)); + } +} + +void setupFirebaseMessagingMocks() { + TestWidgetsFlutterBinding.ensureInitialized(); + + setupFirebaseCoreMocks(); + + // Mock Platform Interface Methods + // ignore: invalid_use_of_protected_member + when(kMockMessagingPlatform.delegateFor(app: anyNamed('app'))).thenReturn(kMockMessagingPlatform); + // ignore: invalid_use_of_protected_member + when(kMockMessagingPlatform.setInitialValues( + isAutoInitEnabled: anyNamed('isAutoInitEnabled'), + )).thenReturn(kMockMessagingPlatform); +} + +// Platform Interface Mock Classes + +// FirebaseMessagingPlatform Mock +class MockFirebaseMessaging extends Mock with MockPlatformInterfaceMixin implements FirebaseMessagingPlatform { + MockFirebaseMessaging() { + TestFirebaseMessagingPlatform(); + } + + @override + bool get isAutoInitEnabled { + return super.noSuchMethod(Invocation.getter(#isAutoInitEnabled), returnValue: true, returnValueForMissingStub: true); + } + + @override + FirebaseMessagingPlatform delegateFor({FirebaseApp? app}) { + return super.noSuchMethod( + Invocation.method(#delegateFor, [], {#app: app}), + returnValue: TestFirebaseMessagingPlatform(), + returnValueForMissingStub: TestFirebaseMessagingPlatform(), + ); + } + + @override + FirebaseMessagingPlatform setInitialValues({bool? isAutoInitEnabled}) { + return super.noSuchMethod( + Invocation.method(#setInitialValues, [], {#isAutoInitEnabled: isAutoInitEnabled}), + returnValue: TestFirebaseMessagingPlatform(), + returnValueForMissingStub: TestFirebaseMessagingPlatform(), + ); + } + + @override + Future getInitialMessage() { + return super.noSuchMethod(Invocation.method(#getInitialMessage, []), returnValue: neverEndingFuture(), returnValueForMissingStub: neverEndingFuture()); + } + + @override + Future deleteToken() { + return super.noSuchMethod(Invocation.method(#deleteToken, []), returnValue: Future.value(), returnValueForMissingStub: Future.value()); + } + + @override + Future getAPNSToken() { + return super.noSuchMethod(Invocation.method(#getAPNSToken, []), returnValue: Future.value(''), returnValueForMissingStub: Future.value('')); + } + + @override + Future getToken({String? vapidKey}) { + return super.noSuchMethod(Invocation.method(#getToken, [], {#vapidKey: vapidKey}), returnValue: Future.value(''), returnValueForMissingStub: Future.value('')); + } + + @override + Future setAutoInitEnabled(bool? enabled) { + return super.noSuchMethod(Invocation.method(#setAutoInitEnabled, [enabled]), returnValue: Future.value(), returnValueForMissingStub: Future.value()); + } + + @override + Stream get onTokenRefresh { + return super.noSuchMethod( + Invocation.getter(#onTokenRefresh), + returnValue: const Stream.empty(), + returnValueForMissingStub: const Stream.empty(), + ); + } + + @override + Future requestPermission({bool? alert = true, bool? announcement = false, bool? badge = true, bool? carPlay = false, bool? criticalAlert = false, bool? provisional = false, bool? sound = true}) { + return super.noSuchMethod(Invocation.method(#requestPermission, [], {#alert: alert, #announcement: announcement, #badge: badge, #carPlay: carPlay, #criticalAlert: criticalAlert, #provisional: provisional, #sound: sound}), returnValue: neverEndingFuture(), returnValueForMissingStub: neverEndingFuture()); + } + + @override + Future subscribeToTopic(String? topic) { + return super.noSuchMethod(Invocation.method(#subscribeToTopic, [topic]), returnValue: Future.value(), returnValueForMissingStub: Future.value()); + } + + @override + Future unsubscribeFromTopic(String? topic) { + return super.noSuchMethod(Invocation.method(#unsubscribeFromTopic, [topic]), returnValue: Future.value(), returnValueForMissingStub: Future.value()); + } +} + +class TestFirebaseMessagingPlatform extends FirebaseMessagingPlatform { + TestFirebaseMessagingPlatform() : super(); +} diff --git a/test/service/notifications/notifications_service_test.dart b/test/service/notifications/notifications_service_test.dart new file mode 100644 index 00000000..655b850e --- /dev/null +++ b/test/service/notifications/notifications_service_test.dart @@ -0,0 +1,3 @@ +void main(){ + +} \ No newline at end of file diff --git a/test/service/pictograms/pictograms_services_test.dart b/test/service/pictograms/pictograms_services_test.dart new file mode 100644 index 00000000..08d51e12 --- /dev/null +++ b/test/service/pictograms/pictograms_services_test.dart @@ -0,0 +1,204 @@ +import 'dart:convert'; + +import 'package:either_dart/either.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mockito/annotations.dart'; +import 'package:mockito/mockito.dart'; +import 'package:ottaa_project_flutter/application/service/pictograms_service.dart'; +import 'package:ottaa_project_flutter/core/abstracts/basic_search.dart'; +import 'package:ottaa_project_flutter/core/enums/user_types.dart'; +import 'package:ottaa_project_flutter/core/models/assets_image.dart'; +import 'package:ottaa_project_flutter/core/models/base_settings_model.dart'; +import 'package:ottaa_project_flutter/core/models/base_user_model.dart'; +import 'package:ottaa_project_flutter/core/models/language_setting.dart'; +import 'package:ottaa_project_flutter/core/models/picto_model.dart'; +import 'package:ottaa_project_flutter/core/models/user_data_model.dart'; +import 'package:ottaa_project_flutter/core/repositories/repositories.dart'; + +import 'pictograms_services_test.mocks.dart'; + +@GenerateMocks([ + AuthRepository, + RemoteStorageRepository, + ServerRepository, + LocalStorageRepository, +]) +Future main() async { + late MockAuthRepository mockAuthRepository; + late MockRemoteStorageRepository mockRemoteStorageRepository; + late MockServerRepository mockServerRepository; + late MockLocalStorageRepository mockLocalStorageRepository; + + late PictogramsService pictogramsService; + + const String fakePictos = """ + [ + { + "id": "-asGPzbBwFUWOXKvsKoLa", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Flila.webp?alt=media&token=3b380965-52f2-4529-846f-45cf1c4fdf9c" + }, + "tags": { + "EDAD": [ + "JOVEN", + "NINO" + ], + "GENERO": [ + "MUJER" + ] + }, + "text": "lila", + "type": 4 + }, + { + "id": "-oI8IPzgalQuWwxWUS-ke", + "resource": { + "asset": "", + "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fsuyos.webp?alt=media&token=1265f18e-c7f5-4f94-852a-76c1f9841d25" + }, + "tags": { + "EDAD": [ + "ADULTO", + "JOVEN" + ] + }, + "text": "suyos", + "type": 6 + } + ] + """; + + BaseUserModel fakeUser = BaseUserModel( + id: "0", + settings: BaseSettingsModel( + data: UserData( + avatar: AssetsImage(asset: "test", network: "https://test.com"), + birthDate: DateTime(0), + genderPref: "n/a", + lastConnection: DateTime(0), + name: "John", + lastName: "Doe", + ), + language: LanguageSetting.empty(), + ), + email: "test@mail.com", + type: UserType.caregiver, + ); + + setUp(() async { + mockAuthRepository = MockAuthRepository(); + mockRemoteStorageRepository = MockRemoteStorageRepository(); + mockServerRepository = MockServerRepository(); + mockLocalStorageRepository = MockLocalStorageRepository(); + + pictogramsService = PictogramsService( + mockAuthRepository, + mockServerRepository, + mockRemoteStorageRepository, + mockLocalStorageRepository, + ); + }); + + test('should return all pictos', () async { + when(mockRemoteStorageRepository.readRemoteFile( + path: "Pictos", + fileName: 'assets/pictos.json', + )).thenAnswer((realInvocation) async => fakePictos); + + final pictos = await pictogramsService.getAllPictograms(); + expect(pictos.length, 2); + }); + + test('should return an empty list', () async { + when(mockRemoteStorageRepository.readRemoteFile( + path: 'Pictos', + fileName: 'assets/pictos.json', + )).thenAnswer((realInvocation) async => "[]"); + final pictos = await pictogramsService.getAllPictograms(); + expect(pictos, []); + }); + + test('should return an empty list', () async { + final pictos = await pictogramsService.getPictograms(MockBasicSearch()); + + expect(pictos, []); + }); + + group("Upload pictograms", () { + test("should upload pictograms", () async { + List fakePictosDB = []; + + when(mockAuthRepository.getCurrentUser()).thenAnswer((realInvocation) async => Right(fakeUser)); + + when(mockServerRepository.uploadPictograms(any, any, data: anyNamed("data"))).thenAnswer((realInvocation) async { + fakePictosDB.addAll(realInvocation.namedArguments[#data]); + + return const Right(null); + }); + final List fakePictosJson = json.decode(fakePictos).map((e) => Picto.fromMap(e)).toList(); + + await pictogramsService.uploadPictograms(fakePictosJson, "es_AR"); + + expect(fakePictosDB, hasLength(fakePictosJson.length)); + }); + + test("should not upload groups", () async { + List fakePictosDB = []; + + when(mockAuthRepository.getCurrentUser()).thenAnswer((realInvocation) async => Left("")); + + await pictogramsService.uploadPictograms([], "es_AR"); + + expect(fakePictosDB, hasLength(0)); + }); + }); + + group("Update pictos", () { + test("should NOT update pictos", () async { + final List fakeOriginalDB = json.decode(fakePictos).map((e) => Picto.fromMap(e)).toList(); + final List fakeDB = json.decode(fakePictos).map((e) => Picto.fromMap(e)).toList(); + + when(mockAuthRepository.getCurrentUser()).thenAnswer((realInvocation) async => Left("")); + + await pictogramsService.updatePictogram(fakeDB.first.copyWith(text: "HOLA"), "es_AR", 0); + + expect(fakeDB, hasLength(fakeOriginalDB.length)); + }); + + test("should load translations", () async { + final fakeTranslations = { + "-4BLxgBogIdLJwbS00Mdz": {"text": "passeig"}, + "-Eakc1wdh0BBfhHZlkQhS": {"text": "baixar volum"}, + }; + + when(mockLocalStorageRepository.readPictosFromLocal(locale: anyNamed("locale"))).thenAnswer((realInvocation) async { + return fakeTranslations; + }); + + final result = await pictogramsService.loadTranslations(language: "es_AR"); + + expect(result, fakeTranslations.map((key, value) { + return MapEntry(key, value["text"]); + })); + }); + }); +} + +class MockBasicSearch extends BasicSearch { + @override + // TODO: implement asset + String get asset => throw UnimplementedError(); + + @override + // TODO: implement file + String get file => throw UnimplementedError(); + + @override + // TODO: implement language + String get language => throw UnimplementedError(); + + @override + // TODO: implement remote + String get remote => throw UnimplementedError(); +} diff --git a/test/service/pictograms/pictograms_services_test.mocks.dart b/test/service/pictograms/pictograms_services_test.mocks.dart new file mode 100644 index 00000000..a71087ba --- /dev/null +++ b/test/service/pictograms/pictograms_services_test.mocks.dart @@ -0,0 +1,1255 @@ +// Mocks generated by Mockito 5.4.0 from annotations +// in ottaa_project_flutter/test/service/pictograms/pictograms_services_test.dart. +// Do not manually edit this file. + +// ignore_for_file: no_leading_underscores_for_library_prefixes +import 'dart:async' as _i4; +import 'dart:typed_data' as _i8; + +import 'package:dio/dio.dart' as _i12; +import 'package:either_dart/either.dart' as _i2; +import 'package:mockito/mockito.dart' as _i1; +import 'package:ottaa_project_flutter/core/abstracts/user_model.dart' as _i5; +import 'package:ottaa_project_flutter/core/enums/board_data_type.dart' as _i14; +import 'package:ottaa_project_flutter/core/enums/sign_in_types.dart' as _i6; +import 'package:ottaa_project_flutter/core/enums/user_types.dart' as _i10; +import 'package:ottaa_project_flutter/core/models/arsaac_data_model.dart' + as _i16; +import 'package:ottaa_project_flutter/core/models/assets_image.dart' as _i11; +import 'package:ottaa_project_flutter/core/models/devices_token.dart' as _i15; +import 'package:ottaa_project_flutter/core/models/shortcuts_model.dart' as _i13; +import 'package:ottaa_project_flutter/core/repositories/auth_repository.dart' + as _i3; +import 'package:ottaa_project_flutter/core/repositories/local_storage_repository.dart' + as _i17; +import 'package:ottaa_project_flutter/core/repositories/remote_storage_repository.dart' + as _i7; +import 'package:ottaa_project_flutter/core/repositories/server_repository.dart' + as _i9; + +// ignore_for_file: type=lint +// ignore_for_file: avoid_redundant_argument_values +// ignore_for_file: avoid_setters_without_getters +// ignore_for_file: comment_references +// ignore_for_file: implementation_imports +// ignore_for_file: invalid_use_of_visible_for_testing_member +// ignore_for_file: prefer_const_constructors +// ignore_for_file: unnecessary_parenthesis +// ignore_for_file: camel_case_types +// ignore_for_file: subtype_of_sealed_class + +class _FakeEither_0 extends _i1.SmartFake implements _i2.Either { + _FakeEither_0( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +/// A class which mocks [AuthRepository]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockAuthRepository extends _i1.Mock implements _i3.AuthRepository { + MockAuthRepository() { + _i1.throwOnMissingStub(this); + } + + @override + bool get isLogged => (super.noSuchMethod( + Invocation.getter(#isLogged), + returnValue: false, + ) as bool); + @override + _i4.Future<_i2.Either> signIn( + _i6.SignInType? type, [ + String? email, + String? password, + ]) => + (super.noSuchMethod( + Invocation.method( + #signIn, + [ + type, + email, + password, + ], + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #signIn, + [ + type, + email, + password, + ], + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future<_i2.Either> signUp() => (super.noSuchMethod( + Invocation.method( + #signUp, + [], + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #signUp, + [], + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future<_i2.Either> getCurrentUser() => + (super.noSuchMethod( + Invocation.method( + #getCurrentUser, + [], + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #getCurrentUser, + [], + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future isLoggedIn() => (super.noSuchMethod( + Invocation.method( + #isLoggedIn, + [], + ), + returnValue: _i4.Future.value(false), + ) as _i4.Future); + @override + _i4.Future logout() => (super.noSuchMethod( + Invocation.method( + #logout, + [], + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future getDeviceId() => (super.noSuchMethod( + Invocation.method( + #getDeviceId, + [], + ), + returnValue: _i4.Future.value(''), + ) as _i4.Future); + @override + _i4.Future deleteAccount({required String? userId}) => + (super.noSuchMethod( + Invocation.method( + #deleteAccount, + [], + {#userId: userId}, + ), + returnValue: _i4.Future.value(false), + ) as _i4.Future); +} + +/// A class which mocks [RemoteStorageRepository]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockRemoteStorageRepository extends _i1.Mock + implements _i7.RemoteStorageRepository { + MockRemoteStorageRepository() { + _i1.throwOnMissingStub(this); + } + + @override + _i4.Future uploadFile( + String? path, + String? fileName, + _i8.Uint8List? file, + ) => + (super.noSuchMethod( + Invocation.method( + #uploadFile, + [ + path, + fileName, + file, + ], + ), + returnValue: _i4.Future.value(''), + ) as _i4.Future); + @override + _i4.Future deleteFile( + String? path, + String? fileName, + ) => + (super.noSuchMethod( + Invocation.method( + #deleteFile, + [ + path, + fileName, + ], + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future readRemoteFile({ + required String? path, + required String? fileName, + }) => + (super.noSuchMethod( + Invocation.method( + #readRemoteFile, + [], + { + #path: path, + #fileName: fileName, + }, + ), + returnValue: _i4.Future.value(''), + ) as _i4.Future); +} + +/// A class which mocks [ServerRepository]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockServerRepository extends _i1.Mock implements _i9.ServerRepository { + MockServerRepository() { + _i1.throwOnMissingStub(this); + } + + @override + _i4.Future<_i2.Either> getAvailableAppVersion( + String? platform) => + (super.noSuchMethod( + Invocation.method( + #getAvailableAppVersion, + [platform], + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #getAvailableAppVersion, + [platform], + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future<_i10.UserType> getUserType(String? userId) => (super.noSuchMethod( + Invocation.method( + #getUserType, + [userId], + ), + returnValue: _i4.Future<_i10.UserType>.value(_i10.UserType.caregiver), + ) as _i4.Future<_i10.UserType>); + @override + _i4.Future<_i2.Either> getUserProfilePicture( + String? userId) => + (super.noSuchMethod( + Invocation.method( + #getUserProfilePicture, + [userId], + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #getUserProfilePicture, + [userId], + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future<_i2.Either> uploadUserPicture( + String? userId, + _i11.AssetsImage? image, + ) => + (super.noSuchMethod( + Invocation.method( + #uploadUserPicture, + [ + userId, + image, + ], + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #uploadUserPicture, + [ + userId, + image, + ], + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future<_i2.Either>> getUserInformation( + String? id) => + (super.noSuchMethod( + Invocation.method( + #getUserInformation, + [id], + ), + returnValue: _i4.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #getUserInformation, + [id], + ), + )), + ) as _i4.Future<_i2.Either>>); + @override + _i4.Future<_i2.Either> uploadUserInformation( + String? userId, + Map? data, + ) => + (super.noSuchMethod( + Invocation.method( + #uploadUserInformation, + [ + userId, + data, + ], + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #uploadUserInformation, + [ + userId, + data, + ], + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future>> getUserSentences( + String? userId, { + required String? language, + required String? type, + bool? isFavorite = false, + }) => + (super.noSuchMethod( + Invocation.method( + #getUserSentences, + [userId], + { + #language: language, + #type: type, + #isFavorite: isFavorite, + }, + ), + returnValue: _i4.Future>>.value( + >[]), + ) as _i4.Future>>); + @override + _i4.Future<_i2.Either> uploadUserSentences( + String? userId, + String? language, + String? type, + List>? data, + ) => + (super.noSuchMethod( + Invocation.method( + #uploadUserSentences, + [ + userId, + language, + type, + data, + ], + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #uploadUserSentences, + [ + userId, + language, + type, + data, + ], + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future<_i2.Either>>> getAllPictograms( + String? userId, + String? languageCode, + ) => + (super.noSuchMethod( + Invocation.method( + #getAllPictograms, + [ + userId, + languageCode, + ], + ), + returnValue: + _i4.Future<_i2.Either>>>.value( + _FakeEither_0>>( + this, + Invocation.method( + #getAllPictograms, + [ + userId, + languageCode, + ], + ), + )), + ) as _i4.Future<_i2.Either>>>); + @override + _i4.Future<_i2.Either> uploadPictograms( + String? userId, + String? language, { + required List>? data, + }) => + (super.noSuchMethod( + Invocation.method( + #uploadPictograms, + [ + userId, + language, + ], + {#data: data}, + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #uploadPictograms, + [ + userId, + language, + ], + {#data: data}, + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future<_i2.Either> updatePictogram( + String? userId, + String? language, + int? index, { + required Map? data, + }) => + (super.noSuchMethod( + Invocation.method( + #updatePictogram, + [ + userId, + language, + index, + ], + {#data: data}, + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #updatePictogram, + [ + userId, + language, + index, + ], + {#data: data}, + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future<_i2.Either>>> getAllGroups( + String? userId, + String? languageCode, + ) => + (super.noSuchMethod( + Invocation.method( + #getAllGroups, + [ + userId, + languageCode, + ], + ), + returnValue: + _i4.Future<_i2.Either>>>.value( + _FakeEither_0>>( + this, + Invocation.method( + #getAllGroups, + [ + userId, + languageCode, + ], + ), + )), + ) as _i4.Future<_i2.Either>>>); + @override + _i4.Future<_i2.Either> uploadGroups( + String? userId, + String? language, { + required List>? data, + }) => + (super.noSuchMethod( + Invocation.method( + #uploadGroups, + [ + userId, + language, + ], + {#data: data}, + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #uploadGroups, + [ + userId, + language, + ], + {#data: data}, + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future<_i2.Either> updateGroup( + String? userId, + String? language, + int? index, { + required Map? data, + }) => + (super.noSuchMethod( + Invocation.method( + #updateGroup, + [ + userId, + language, + index, + ], + {#data: data}, + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #updateGroup, + [ + userId, + language, + index, + ], + {#data: data}, + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future<_i2.Either>> getPictogramsStatistics( + String? userId, + String? languageCode, [ + _i12.CancelToken? cancelToken, + ]) => + (super.noSuchMethod( + Invocation.method( + #getPictogramsStatistics, + [ + userId, + languageCode, + cancelToken, + ], + ), + returnValue: _i4.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #getPictogramsStatistics, + [ + userId, + languageCode, + cancelToken, + ], + ), + )), + ) as _i4.Future<_i2.Either>>); + @override + _i4.Future<_i2.Either>> getMostUsedSentences( + String? userId, + String? languageCode, [ + _i12.CancelToken? cancelToken, + ]) => + (super.noSuchMethod( + Invocation.method( + #getMostUsedSentences, + [ + userId, + languageCode, + cancelToken, + ], + ), + returnValue: _i4.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #getMostUsedSentences, + [ + userId, + languageCode, + cancelToken, + ], + ), + )), + ) as _i4.Future<_i2.Either>>); + @override + _i4.Future<_i2.Either> generatePhraseGPT({ + required String? prompt, + required int? maxTokens, + double? temperature = 0.0, + }) => + (super.noSuchMethod( + Invocation.method( + #generatePhraseGPT, + [], + { + #prompt: prompt, + #maxTokens: maxTokens, + #temperature: temperature, + }, + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #generatePhraseGPT, + [], + { + #prompt: prompt, + #maxTokens: maxTokens, + #temperature: temperature, + }, + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future uploadUserImage({ + required String? path, + required String? name, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #uploadUserImage, + [], + { + #path: path, + #name: name, + #userId: userId, + }, + ), + returnValue: _i4.Future.value(''), + ) as _i4.Future); + @override + _i4.Future updateUserSettings({ + required Map? data, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #updateUserSettings, + [], + { + #data: data, + #userId: userId, + }, + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future<_i2.Either>> getConnectedUsers( + {required String? userId}) => + (super.noSuchMethod( + Invocation.method( + #getConnectedUsers, + [], + {#userId: userId}, + ), + returnValue: _i4.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #getConnectedUsers, + [], + {#userId: userId}, + ), + )), + ) as _i4.Future<_i2.Either>>); + @override + _i4.Future<_i2.Either>> fetchConnectedUserData( + {required String? userId}) => + (super.noSuchMethod( + Invocation.method( + #fetchConnectedUserData, + [], + {#userId: userId}, + ), + returnValue: _i4.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #fetchConnectedUserData, + [], + {#userId: userId}, + ), + )), + ) as _i4.Future<_i2.Either>>); + @override + _i4.Future removeCurrentUser({ + required String? userId, + required String? careGiverId, + }) => + (super.noSuchMethod( + Invocation.method( + #removeCurrentUser, + [], + { + #userId: userId, + #careGiverId: careGiverId, + }, + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future<_i2.Either> setShortcutsForUser({ + required _i13.ShortcutsModel? shortcuts, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #setShortcutsForUser, + [], + { + #shortcuts: shortcuts, + #userId: userId, + }, + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #setShortcutsForUser, + [], + { + #shortcuts: shortcuts, + #userId: userId, + }, + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future updateUserData({ + required Map? data, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #updateUserData, + [], + { + #data: data, + #userId: userId, + }, + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future<_i2.Either>> getEmailToken( + String? ownEmail, + String? email, [ + _i12.CancelToken? cancelToken, + ]) => + (super.noSuchMethod( + Invocation.method( + #getEmailToken, + [ + ownEmail, + email, + cancelToken, + ], + ), + returnValue: _i4.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #getEmailToken, + [ + ownEmail, + email, + cancelToken, + ], + ), + )), + ) as _i4.Future<_i2.Either>>); + @override + _i4.Future<_i2.Either>> verifyEmailToken( + String? ownEmail, + String? email, + String? token, [ + _i12.CancelToken? cancelToken, + ]) => + (super.noSuchMethod( + Invocation.method( + #verifyEmailToken, + [ + ownEmail, + email, + token, + cancelToken, + ], + ), + returnValue: _i4.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #verifyEmailToken, + [ + ownEmail, + email, + token, + cancelToken, + ], + ), + )), + ) as _i4.Future<_i2.Either>>); + @override + _i4.Future<_i2.Either>> getProfileById( + {required String? id}) => + (super.noSuchMethod( + Invocation.method( + #getProfileById, + [], + {#id: id}, + ), + returnValue: _i4.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #getProfileById, + [], + {#id: id}, + ), + )), + ) as _i4.Future<_i2.Either>>); + @override + _i4.Future getDefaultGroups(String? languageCode) => + (super.noSuchMethod( + Invocation.method( + #getDefaultGroups, + [languageCode], + ), + returnValue: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future getDefaultPictos(String? languageCode) => + (super.noSuchMethod( + Invocation.method( + #getDefaultPictos, + [languageCode], + ), + returnValue: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future updateUserType({ + required String? id, + required _i10.UserType? userType, + }) => + (super.noSuchMethod( + Invocation.method( + #updateUserType, + [], + { + #id: id, + #userType: userType, + }, + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future<_i2.Either>> fetchShortcutsForUser( + {required String? userId}) => + (super.noSuchMethod( + Invocation.method( + #fetchShortcutsForUser, + [], + {#userId: userId}, + ), + returnValue: _i4.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #fetchShortcutsForUser, + [], + {#userId: userId}, + ), + )), + ) as _i4.Future<_i2.Either>>); + @override + _i4.Future?> createPictoGroupData({ + required String? userId, + required String? language, + required _i14.BoardDataType? type, + required Map? data, + _i12.CancelToken? cancelToken, + }) => + (super.noSuchMethod( + Invocation.method( + #createPictoGroupData, + [], + { + #userId: userId, + #language: language, + #type: type, + #data: data, + #cancelToken: cancelToken, + }, + ), + returnValue: _i4.Future?>.value(), + ) as _i4.Future?>); + @override + _i4.Future updateDevicesId({ + required String? userId, + required _i15.DeviceToken? deviceToken, + }) => + (super.noSuchMethod( + Invocation.method( + #updateDevicesId, + [], + { + #userId: userId, + #deviceToken: deviceToken, + }, + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future<_i2.Either>> learnPictograms({ + required String? uid, + required String? language, + required String? model, + required List>? tokens, + _i12.CancelToken? cancelToken, + }) => + (super.noSuchMethod( + Invocation.method( + #learnPictograms, + [], + { + #uid: uid, + #language: language, + #model: model, + #tokens: tokens, + #cancelToken: cancelToken, + }, + ), + returnValue: _i4.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #learnPictograms, + [], + { + #uid: uid, + #language: language, + #model: model, + #tokens: tokens, + #cancelToken: cancelToken, + }, + ), + )), + ) as _i4.Future<_i2.Either>>); + @override + _i4.Future<_i2.Either>> predictPictogram({ + required String? sentence, + required String? uid, + required String? language, + required String? model, + required List? groups, + required Map>? tags, + bool? reduced = false, + int? limit = 10, + int? chunk = 4, + _i12.CancelToken? cancelToken, + }) => + (super.noSuchMethod( + Invocation.method( + #predictPictogram, + [], + { + #sentence: sentence, + #uid: uid, + #language: language, + #model: model, + #groups: groups, + #tags: tags, + #reduced: reduced, + #limit: limit, + #chunk: chunk, + #cancelToken: cancelToken, + }, + ), + returnValue: _i4.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #predictPictogram, + [], + { + #sentence: sentence, + #uid: uid, + #language: language, + #model: model, + #groups: groups, + #tags: tags, + #reduced: reduced, + #limit: limit, + #chunk: chunk, + #cancelToken: cancelToken, + }, + ), + )), + ) as _i4.Future<_i2.Either>>); + @override + _i4.Future<_i2.Either> updateUserLastConnectionTime({ + required String? userId, + required int? time, + }) => + (super.noSuchMethod( + Invocation.method( + #updateUserLastConnectionTime, + [], + { + #userId: userId, + #time: time, + }, + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #updateUserLastConnectionTime, + [], + { + #userId: userId, + #time: time, + }, + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future fetchUserGroups({ + required String? languageCode, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #fetchUserGroups, + [], + { + #languageCode: languageCode, + #userId: userId, + }, + ), + returnValue: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future fetchUserPictos({ + required String? languageCode, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #fetchUserPictos, + [], + { + #languageCode: languageCode, + #userId: userId, + }, + ), + returnValue: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future updateLanguageSettings({ + required Map? map, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #updateLanguageSettings, + [], + { + #map: map, + #userId: userId, + }, + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future updateVoiceAndSubtitleSettings({ + required Map? map, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #updateVoiceAndSubtitleSettings, + [], + { + #map: map, + #userId: userId, + }, + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future updateAccessibilitySettings({ + required Map? map, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #updateAccessibilitySettings, + [], + { + #map: map, + #userId: userId, + }, + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future updateMainSettings({ + required Map? map, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #updateMainSettings, + [], + { + #map: map, + #userId: userId, + }, + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future fetchUserSettings({required String? userId}) => + (super.noSuchMethod( + Invocation.method( + #fetchUserSettings, + [], + {#userId: userId}, + ), + returnValue: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future<_i2.Either>> + fetchPhotosFromGlobalSymbols({ + required String? searchText, + required String? languageCode, + }) => + (super.noSuchMethod( + Invocation.method( + #fetchPhotosFromGlobalSymbols, + [], + { + #searchText: searchText, + #languageCode: languageCode, + }, + ), + returnValue: _i4 + .Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #fetchPhotosFromGlobalSymbols, + [], + { + #searchText: searchText, + #languageCode: languageCode, + }, + ), + )), + ) as _i4.Future<_i2.Either>>); + @override + _i4.Future uploadOtherImages({ + required String? imagePath, + required String? directoryPath, + required String? name, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #uploadOtherImages, + [], + { + #imagePath: imagePath, + #directoryPath: directoryPath, + #name: name, + #userId: userId, + }, + ), + returnValue: _i4.Future.value(''), + ) as _i4.Future); + @override + _i4.Future deleteTheAccount({required String? userId}) => + (super.noSuchMethod( + Invocation.method( + #deleteTheAccount, + [], + {#userId: userId}, + ), + returnValue: _i4.Future.value(false), + ) as _i4.Future); +} + +/// A class which mocks [LocalStorageRepository]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockLocalStorageRepository extends _i1.Mock + implements _i17.LocalStorageRepository { + MockLocalStorageRepository() { + _i1.throwOnMissingStub(this); + } + + @override + _i4.Future> readPictosFromLocal( + {required String? locale}) => + (super.noSuchMethod( + Invocation.method( + #readPictosFromLocal, + [], + {#locale: locale}, + ), + returnValue: + _i4.Future>.value({}), + ) as _i4.Future>); +} diff --git a/test/service/profile/profile_services_test.dart b/test/service/profile/profile_services_test.dart new file mode 100644 index 00000000..fde0bc69 --- /dev/null +++ b/test/service/profile/profile_services_test.dart @@ -0,0 +1,118 @@ +import 'dart:ffi'; + +import 'package:either_dart/either.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mockito/annotations.dart'; +import 'package:mockito/mockito.dart'; +import 'package:ottaa_project_flutter/application/service/profile_services.dart'; +import 'package:ottaa_project_flutter/core/abstracts/user_settings.dart'; +import 'package:ottaa_project_flutter/core/models/language_setting.dart'; +import 'package:ottaa_project_flutter/core/models/patient_user_model.dart'; +import 'package:ottaa_project_flutter/core/repositories/repositories.dart'; + +import 'profile_services_test.mocks.dart'; + +@GenerateMocks([ + ServerRepository, +]) +Future main() async { + late MockServerRepository mockServerRepository; + + late ProfileRepository profileRepository; + + late Map fakeConnectedUserData; + late Map fakeUserData; + + setUp(() { + mockServerRepository = MockServerRepository(); + profileRepository = ProfileService(mockServerRepository); + fakeConnectedUserData = { + 'fakeUser1': {'name': 'testName1'}, + 'fakeUser2': {'name': 'testName1'} + }; + fakeUserData = {'name': 'john doe', 'id': '1234'}; + }); + + test('should update user Settings', () async { +//todo: emir here + when(mockServerRepository.updateUserSettings(data: anyNamed('data'), userId: anyNamed('userId'))).thenAnswer((realInvocation) async => null); + + final response = await profileRepository.updateUserSettings(data: {}, userId: 'TestUserId'); + + expect(null, null); + }); + + test('should return a link to the user image after uploading it', () async { + when(mockServerRepository.uploadUserImage(path: anyNamed('path'), name: anyNamed('name'), userId: anyNamed('userId'))).thenAnswer((_) async => 'image uploaded'); + + final response = await profileRepository.uploadUserImage(path: 'TestPath', name: 'TestName', userId: 'TestUserId'); + + expect(response, 'image uploaded'); + }); + + test('should return connected users', () async { + when(mockServerRepository.getConnectedUsers(userId: anyNamed('userId'))).thenAnswer((value) async => Right(fakeConnectedUserData)); + + final response = await profileRepository.getConnectedUsers(userId: 'testUserId'); + + expect(response.right.entries.length, 2); + }); + + test('should return a string when no connected users are present', () async { + when(mockServerRepository.getConnectedUsers(userId: anyNamed('userId'))).thenAnswer((value) async => const Left('no user are connected')); + + final response = await profileRepository.getConnectedUsers(userId: 'testUserId'); + + expect(response.left, 'no user are connected'); + }); + + test('should return a connected user data', () async { + when(mockServerRepository.fetchConnectedUserData(userId: anyNamed('userId'))).thenAnswer((realInvocation) async => Right(fakeUserData)); + + final response = await profileRepository.fetchConnectedUserData(userId: 'testUserid'); + + expect(response.right.entries.length, 2); + }); + + test('should return a string when connected user is not present', () async { + when(mockServerRepository.fetchConnectedUserData(userId: anyNamed('userId'))).thenAnswer((realInvocation) async => const Left('no user')); + + final response = await profileRepository.fetchConnectedUserData(userId: 'testUserid'); + + expect(response.left, 'no user'); + }); + + //todo: emir here too + test('should remove the connected user from the caregiver list of users', () async { + when(mockServerRepository.removeCurrentUser(userId: anyNamed('userId'), careGiverId: anyNamed('careGiverId'))).thenAnswer((realInvocation) async => null); + + final response = await profileRepository.removeCurrentUser(userId: 'testUserid', careGiverId: 'testCareGiverId'); + + expect(null, null); + }); + + test('should return a user from the given id of the patient', () async { + when(mockServerRepository.getProfileById(id: anyNamed('id'))).thenAnswer((realInvocation) async => Right(fakeUserData)); + + final response = await profileRepository.getProfileById(id: 'testId'); + + expect(response.right.entries.length, 2); + }); + + test('should return a String from the give id of the patient if no data is found', () async { + when(mockServerRepository.getProfileById(id: anyNamed('id'))).thenAnswer((realInvocation) async => const Left('No User')); + + final response = await profileRepository.getProfileById(id: 'testId'); + + expect(response.left, 'No User'); + }); + +//todo: emir + test('should return a String from the give id of the patient if no data is found', () async { + when(mockServerRepository.uploadUserInformation(any, any)).thenAnswer((realInvocation) async => const Left('No User')); + + final response = await profileRepository.updateUser(data: {}, userId: 'TestUserId'); + + expect(null, null); + }); +} diff --git a/test/service/profile/profile_services_test.mocks.dart b/test/service/profile/profile_services_test.mocks.dart new file mode 100644 index 00000000..7c97b765 --- /dev/null +++ b/test/service/profile/profile_services_test.mocks.dart @@ -0,0 +1,1054 @@ +// Mocks generated by Mockito 5.4.0 from annotations +// in ottaa_project_flutter/test/service/profile/profile_services_test.dart. +// Do not manually edit this file. + +// ignore_for_file: no_leading_underscores_for_library_prefixes +import 'dart:async' as _i4; + +import 'package:dio/dio.dart' as _i7; +import 'package:either_dart/either.dart' as _i2; +import 'package:mockito/mockito.dart' as _i1; +import 'package:ottaa_project_flutter/core/enums/board_data_type.dart' as _i9; +import 'package:ottaa_project_flutter/core/enums/user_types.dart' as _i5; +import 'package:ottaa_project_flutter/core/models/arsaac_data_model.dart' + as _i11; +import 'package:ottaa_project_flutter/core/models/assets_image.dart' as _i6; +import 'package:ottaa_project_flutter/core/models/devices_token.dart' as _i10; +import 'package:ottaa_project_flutter/core/models/shortcuts_model.dart' as _i8; +import 'package:ottaa_project_flutter/core/repositories/server_repository.dart' + as _i3; + +// ignore_for_file: type=lint +// ignore_for_file: avoid_redundant_argument_values +// ignore_for_file: avoid_setters_without_getters +// ignore_for_file: comment_references +// ignore_for_file: implementation_imports +// ignore_for_file: invalid_use_of_visible_for_testing_member +// ignore_for_file: prefer_const_constructors +// ignore_for_file: unnecessary_parenthesis +// ignore_for_file: camel_case_types +// ignore_for_file: subtype_of_sealed_class + +class _FakeEither_0 extends _i1.SmartFake implements _i2.Either { + _FakeEither_0( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +/// A class which mocks [ServerRepository]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockServerRepository extends _i1.Mock implements _i3.ServerRepository { + MockServerRepository() { + _i1.throwOnMissingStub(this); + } + + @override + _i4.Future<_i2.Either> getAvailableAppVersion( + String? platform) => + (super.noSuchMethod( + Invocation.method( + #getAvailableAppVersion, + [platform], + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #getAvailableAppVersion, + [platform], + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future<_i5.UserType> getUserType(String? userId) => (super.noSuchMethod( + Invocation.method( + #getUserType, + [userId], + ), + returnValue: _i4.Future<_i5.UserType>.value(_i5.UserType.caregiver), + ) as _i4.Future<_i5.UserType>); + @override + _i4.Future<_i2.Either> getUserProfilePicture( + String? userId) => + (super.noSuchMethod( + Invocation.method( + #getUserProfilePicture, + [userId], + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #getUserProfilePicture, + [userId], + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future<_i2.Either> uploadUserPicture( + String? userId, + _i6.AssetsImage? image, + ) => + (super.noSuchMethod( + Invocation.method( + #uploadUserPicture, + [ + userId, + image, + ], + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #uploadUserPicture, + [ + userId, + image, + ], + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future<_i2.Either>> getUserInformation( + String? id) => + (super.noSuchMethod( + Invocation.method( + #getUserInformation, + [id], + ), + returnValue: _i4.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #getUserInformation, + [id], + ), + )), + ) as _i4.Future<_i2.Either>>); + @override + _i4.Future<_i2.Either> uploadUserInformation( + String? userId, + Map? data, + ) => + (super.noSuchMethod( + Invocation.method( + #uploadUserInformation, + [ + userId, + data, + ], + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #uploadUserInformation, + [ + userId, + data, + ], + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future>> getUserSentences( + String? userId, { + required String? language, + required String? type, + bool? isFavorite = false, + }) => + (super.noSuchMethod( + Invocation.method( + #getUserSentences, + [userId], + { + #language: language, + #type: type, + #isFavorite: isFavorite, + }, + ), + returnValue: _i4.Future>>.value( + >[]), + ) as _i4.Future>>); + @override + _i4.Future<_i2.Either> uploadUserSentences( + String? userId, + String? language, + String? type, + List>? data, + ) => + (super.noSuchMethod( + Invocation.method( + #uploadUserSentences, + [ + userId, + language, + type, + data, + ], + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #uploadUserSentences, + [ + userId, + language, + type, + data, + ], + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future<_i2.Either>>> getAllPictograms( + String? userId, + String? languageCode, + ) => + (super.noSuchMethod( + Invocation.method( + #getAllPictograms, + [ + userId, + languageCode, + ], + ), + returnValue: + _i4.Future<_i2.Either>>>.value( + _FakeEither_0>>( + this, + Invocation.method( + #getAllPictograms, + [ + userId, + languageCode, + ], + ), + )), + ) as _i4.Future<_i2.Either>>>); + @override + _i4.Future<_i2.Either> uploadPictograms( + String? userId, + String? language, { + required List>? data, + }) => + (super.noSuchMethod( + Invocation.method( + #uploadPictograms, + [ + userId, + language, + ], + {#data: data}, + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #uploadPictograms, + [ + userId, + language, + ], + {#data: data}, + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future<_i2.Either> updatePictogram( + String? userId, + String? language, + int? index, { + required Map? data, + }) => + (super.noSuchMethod( + Invocation.method( + #updatePictogram, + [ + userId, + language, + index, + ], + {#data: data}, + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #updatePictogram, + [ + userId, + language, + index, + ], + {#data: data}, + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future<_i2.Either>>> getAllGroups( + String? userId, + String? languageCode, + ) => + (super.noSuchMethod( + Invocation.method( + #getAllGroups, + [ + userId, + languageCode, + ], + ), + returnValue: + _i4.Future<_i2.Either>>>.value( + _FakeEither_0>>( + this, + Invocation.method( + #getAllGroups, + [ + userId, + languageCode, + ], + ), + )), + ) as _i4.Future<_i2.Either>>>); + @override + _i4.Future<_i2.Either> uploadGroups( + String? userId, + String? language, { + required List>? data, + }) => + (super.noSuchMethod( + Invocation.method( + #uploadGroups, + [ + userId, + language, + ], + {#data: data}, + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #uploadGroups, + [ + userId, + language, + ], + {#data: data}, + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future<_i2.Either> updateGroup( + String? userId, + String? language, + int? index, { + required Map? data, + }) => + (super.noSuchMethod( + Invocation.method( + #updateGroup, + [ + userId, + language, + index, + ], + {#data: data}, + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #updateGroup, + [ + userId, + language, + index, + ], + {#data: data}, + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future<_i2.Either>> getPictogramsStatistics( + String? userId, + String? languageCode, [ + _i7.CancelToken? cancelToken, + ]) => + (super.noSuchMethod( + Invocation.method( + #getPictogramsStatistics, + [ + userId, + languageCode, + cancelToken, + ], + ), + returnValue: _i4.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #getPictogramsStatistics, + [ + userId, + languageCode, + cancelToken, + ], + ), + )), + ) as _i4.Future<_i2.Either>>); + @override + _i4.Future<_i2.Either>> getMostUsedSentences( + String? userId, + String? languageCode, [ + _i7.CancelToken? cancelToken, + ]) => + (super.noSuchMethod( + Invocation.method( + #getMostUsedSentences, + [ + userId, + languageCode, + cancelToken, + ], + ), + returnValue: _i4.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #getMostUsedSentences, + [ + userId, + languageCode, + cancelToken, + ], + ), + )), + ) as _i4.Future<_i2.Either>>); + @override + _i4.Future<_i2.Either> generatePhraseGPT({ + required String? prompt, + required int? maxTokens, + double? temperature = 0.0, + }) => + (super.noSuchMethod( + Invocation.method( + #generatePhraseGPT, + [], + { + #prompt: prompt, + #maxTokens: maxTokens, + #temperature: temperature, + }, + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #generatePhraseGPT, + [], + { + #prompt: prompt, + #maxTokens: maxTokens, + #temperature: temperature, + }, + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future uploadUserImage({ + required String? path, + required String? name, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #uploadUserImage, + [], + { + #path: path, + #name: name, + #userId: userId, + }, + ), + returnValue: _i4.Future.value(''), + ) as _i4.Future); + @override + _i4.Future updateUserSettings({ + required Map? data, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #updateUserSettings, + [], + { + #data: data, + #userId: userId, + }, + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future<_i2.Either>> getConnectedUsers( + {required String? userId}) => + (super.noSuchMethod( + Invocation.method( + #getConnectedUsers, + [], + {#userId: userId}, + ), + returnValue: _i4.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #getConnectedUsers, + [], + {#userId: userId}, + ), + )), + ) as _i4.Future<_i2.Either>>); + @override + _i4.Future<_i2.Either>> fetchConnectedUserData( + {required String? userId}) => + (super.noSuchMethod( + Invocation.method( + #fetchConnectedUserData, + [], + {#userId: userId}, + ), + returnValue: _i4.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #fetchConnectedUserData, + [], + {#userId: userId}, + ), + )), + ) as _i4.Future<_i2.Either>>); + @override + _i4.Future removeCurrentUser({ + required String? userId, + required String? careGiverId, + }) => + (super.noSuchMethod( + Invocation.method( + #removeCurrentUser, + [], + { + #userId: userId, + #careGiverId: careGiverId, + }, + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future<_i2.Either> setShortcutsForUser({ + required _i8.ShortcutsModel? shortcuts, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #setShortcutsForUser, + [], + { + #shortcuts: shortcuts, + #userId: userId, + }, + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #setShortcutsForUser, + [], + { + #shortcuts: shortcuts, + #userId: userId, + }, + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future updateUserData({ + required Map? data, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #updateUserData, + [], + { + #data: data, + #userId: userId, + }, + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future<_i2.Either>> getEmailToken( + String? ownEmail, + String? email, [ + _i7.CancelToken? cancelToken, + ]) => + (super.noSuchMethod( + Invocation.method( + #getEmailToken, + [ + ownEmail, + email, + cancelToken, + ], + ), + returnValue: _i4.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #getEmailToken, + [ + ownEmail, + email, + cancelToken, + ], + ), + )), + ) as _i4.Future<_i2.Either>>); + @override + _i4.Future<_i2.Either>> verifyEmailToken( + String? ownEmail, + String? email, + String? token, [ + _i7.CancelToken? cancelToken, + ]) => + (super.noSuchMethod( + Invocation.method( + #verifyEmailToken, + [ + ownEmail, + email, + token, + cancelToken, + ], + ), + returnValue: _i4.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #verifyEmailToken, + [ + ownEmail, + email, + token, + cancelToken, + ], + ), + )), + ) as _i4.Future<_i2.Either>>); + @override + _i4.Future<_i2.Either>> getProfileById( + {required String? id}) => + (super.noSuchMethod( + Invocation.method( + #getProfileById, + [], + {#id: id}, + ), + returnValue: _i4.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #getProfileById, + [], + {#id: id}, + ), + )), + ) as _i4.Future<_i2.Either>>); + @override + _i4.Future getDefaultGroups(String? languageCode) => + (super.noSuchMethod( + Invocation.method( + #getDefaultGroups, + [languageCode], + ), + returnValue: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future getDefaultPictos(String? languageCode) => + (super.noSuchMethod( + Invocation.method( + #getDefaultPictos, + [languageCode], + ), + returnValue: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future updateUserType({ + required String? id, + required _i5.UserType? userType, + }) => + (super.noSuchMethod( + Invocation.method( + #updateUserType, + [], + { + #id: id, + #userType: userType, + }, + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future<_i2.Either>> fetchShortcutsForUser( + {required String? userId}) => + (super.noSuchMethod( + Invocation.method( + #fetchShortcutsForUser, + [], + {#userId: userId}, + ), + returnValue: _i4.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #fetchShortcutsForUser, + [], + {#userId: userId}, + ), + )), + ) as _i4.Future<_i2.Either>>); + @override + _i4.Future?> createPictoGroupData({ + required String? userId, + required String? language, + required _i9.BoardDataType? type, + required Map? data, + _i7.CancelToken? cancelToken, + }) => + (super.noSuchMethod( + Invocation.method( + #createPictoGroupData, + [], + { + #userId: userId, + #language: language, + #type: type, + #data: data, + #cancelToken: cancelToken, + }, + ), + returnValue: _i4.Future?>.value(), + ) as _i4.Future?>); + @override + _i4.Future updateDevicesId({ + required String? userId, + required _i10.DeviceToken? deviceToken, + }) => + (super.noSuchMethod( + Invocation.method( + #updateDevicesId, + [], + { + #userId: userId, + #deviceToken: deviceToken, + }, + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future<_i2.Either>> learnPictograms({ + required String? uid, + required String? language, + required String? model, + required List>? tokens, + _i7.CancelToken? cancelToken, + }) => + (super.noSuchMethod( + Invocation.method( + #learnPictograms, + [], + { + #uid: uid, + #language: language, + #model: model, + #tokens: tokens, + #cancelToken: cancelToken, + }, + ), + returnValue: _i4.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #learnPictograms, + [], + { + #uid: uid, + #language: language, + #model: model, + #tokens: tokens, + #cancelToken: cancelToken, + }, + ), + )), + ) as _i4.Future<_i2.Either>>); + @override + _i4.Future<_i2.Either>> predictPictogram({ + required String? sentence, + required String? uid, + required String? language, + required String? model, + required List? groups, + required Map>? tags, + bool? reduced = false, + int? limit = 10, + int? chunk = 4, + _i7.CancelToken? cancelToken, + }) => + (super.noSuchMethod( + Invocation.method( + #predictPictogram, + [], + { + #sentence: sentence, + #uid: uid, + #language: language, + #model: model, + #groups: groups, + #tags: tags, + #reduced: reduced, + #limit: limit, + #chunk: chunk, + #cancelToken: cancelToken, + }, + ), + returnValue: _i4.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #predictPictogram, + [], + { + #sentence: sentence, + #uid: uid, + #language: language, + #model: model, + #groups: groups, + #tags: tags, + #reduced: reduced, + #limit: limit, + #chunk: chunk, + #cancelToken: cancelToken, + }, + ), + )), + ) as _i4.Future<_i2.Either>>); + @override + _i4.Future<_i2.Either> updateUserLastConnectionTime({ + required String? userId, + required int? time, + }) => + (super.noSuchMethod( + Invocation.method( + #updateUserLastConnectionTime, + [], + { + #userId: userId, + #time: time, + }, + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #updateUserLastConnectionTime, + [], + { + #userId: userId, + #time: time, + }, + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future fetchUserGroups({ + required String? languageCode, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #fetchUserGroups, + [], + { + #languageCode: languageCode, + #userId: userId, + }, + ), + returnValue: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future fetchUserPictos({ + required String? languageCode, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #fetchUserPictos, + [], + { + #languageCode: languageCode, + #userId: userId, + }, + ), + returnValue: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future updateLanguageSettings({ + required Map? map, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #updateLanguageSettings, + [], + { + #map: map, + #userId: userId, + }, + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future updateVoiceAndSubtitleSettings({ + required Map? map, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #updateVoiceAndSubtitleSettings, + [], + { + #map: map, + #userId: userId, + }, + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future updateAccessibilitySettings({ + required Map? map, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #updateAccessibilitySettings, + [], + { + #map: map, + #userId: userId, + }, + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future updateMainSettings({ + required Map? map, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #updateMainSettings, + [], + { + #map: map, + #userId: userId, + }, + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future fetchUserSettings({required String? userId}) => + (super.noSuchMethod( + Invocation.method( + #fetchUserSettings, + [], + {#userId: userId}, + ), + returnValue: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future<_i2.Either>> + fetchPhotosFromGlobalSymbols({ + required String? searchText, + required String? languageCode, + }) => + (super.noSuchMethod( + Invocation.method( + #fetchPhotosFromGlobalSymbols, + [], + { + #searchText: searchText, + #languageCode: languageCode, + }, + ), + returnValue: _i4 + .Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #fetchPhotosFromGlobalSymbols, + [], + { + #searchText: searchText, + #languageCode: languageCode, + }, + ), + )), + ) as _i4.Future<_i2.Either>>); + @override + _i4.Future uploadOtherImages({ + required String? imagePath, + required String? directoryPath, + required String? name, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #uploadOtherImages, + [], + { + #imagePath: imagePath, + #directoryPath: directoryPath, + #name: name, + #userId: userId, + }, + ), + returnValue: _i4.Future.value(''), + ) as _i4.Future); + @override + _i4.Future deleteTheAccount({required String? userId}) => + (super.noSuchMethod( + Invocation.method( + #deleteTheAccount, + [], + {#userId: userId}, + ), + returnValue: _i4.Future.value(false), + ) as _i4.Future); +} diff --git a/test/service/remoteConfig/remote_config_test.dart b/test/service/remoteConfig/remote_config_test.dart new file mode 100644 index 00000000..508a9d73 --- /dev/null +++ b/test/service/remoteConfig/remote_config_test.dart @@ -0,0 +1,69 @@ +import 'package:firebase_core/firebase_core.dart'; +import 'package:firebase_remote_config/firebase_remote_config.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mockito/annotations.dart'; +import 'package:mockito/mockito.dart'; +import 'package:ottaa_project_flutter/application/service/remote_config_service.dart'; + +import '../notifications/firebase_messaging_mock.dart'; +import 'remote_config_test.mocks.dart'; + +@GenerateMocks([FirebaseRemoteConfig]) +void main() async { + setupFirebaseMessagingMocks(); + + late MockFirebaseRemoteConfig mockFirebaseRemoteConfig; + late RemoteConfigService remoteConfigService; + setUp(() async { + await Firebase.initializeApp(); + mockFirebaseRemoteConfig = MockFirebaseRemoteConfig(); + + remoteConfigService = RemoteConfigService(remoteConfig: mockFirebaseRemoteConfig); + }); + + test("should init Firebase Remote Config", () async { + when(mockFirebaseRemoteConfig.setConfigSettings(any)).thenAnswer((realInvocation) async {}); + + final result = await remoteConfigService.init(); + + verify(mockFirebaseRemoteConfig.setConfigSettings(any)); + expect(result, remoteConfigService); + }); + + test("should get bool value", () async { + when(mockFirebaseRemoteConfig.getBool(any)).thenReturn(true); + + final result = await remoteConfigService.getBool("key"); + + verify(mockFirebaseRemoteConfig.getBool(any)); + expect(result, true); + }); + + test("should get double value", () async { + when(mockFirebaseRemoteConfig.getDouble(any)).thenReturn(1.0); + + final result = await remoteConfigService.getDouble("key"); + + verify(mockFirebaseRemoteConfig.getDouble(any)); + expect(result, 1.0); + }); + + test("should get int value", () async { + when(mockFirebaseRemoteConfig.getInt(any)).thenReturn(1); + + final result = await remoteConfigService.getInt("key"); + + verify(mockFirebaseRemoteConfig.getInt(any)); + expect(result, 1); + }); + + test("should get string value", () async { + when(mockFirebaseRemoteConfig.getString(any)).thenReturn("value"); + + final result = await remoteConfigService.getString("key"); + + verify(mockFirebaseRemoteConfig.getString(any)); + expect(result, "value"); + }); +} diff --git a/test/service/remoteConfig/remote_config_test.mocks.dart b/test/service/remoteConfig/remote_config_test.mocks.dart new file mode 100644 index 00000000..53168179 --- /dev/null +++ b/test/service/remoteConfig/remote_config_test.mocks.dart @@ -0,0 +1,257 @@ +// Mocks generated by Mockito 5.4.0 from annotations +// in ottaa_project_flutter/test/Service/remoteConfig/remote_config_test.dart. +// Do not manually edit this file. + +// ignore_for_file: no_leading_underscores_for_library_prefixes +import 'dart:async' as _i5; +import 'dart:ui' as _i6; + +import 'package:firebase_core/firebase_core.dart' as _i2; +import 'package:firebase_remote_config/firebase_remote_config.dart' as _i4; +import 'package:firebase_remote_config_platform_interface/firebase_remote_config_platform_interface.dart' + as _i3; +import 'package:mockito/mockito.dart' as _i1; + +// ignore_for_file: type=lint +// ignore_for_file: avoid_redundant_argument_values +// ignore_for_file: avoid_setters_without_getters +// ignore_for_file: comment_references +// ignore_for_file: implementation_imports +// ignore_for_file: invalid_use_of_visible_for_testing_member +// ignore_for_file: prefer_const_constructors +// ignore_for_file: unnecessary_parenthesis +// ignore_for_file: camel_case_types +// ignore_for_file: subtype_of_sealed_class + +class _FakeFirebaseApp_0 extends _i1.SmartFake implements _i2.FirebaseApp { + _FakeFirebaseApp_0( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeDateTime_1 extends _i1.SmartFake implements DateTime { + _FakeDateTime_1( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeRemoteConfigSettings_2 extends _i1.SmartFake + implements _i3.RemoteConfigSettings { + _FakeRemoteConfigSettings_2( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeRemoteConfigValue_3 extends _i1.SmartFake + implements _i3.RemoteConfigValue { + _FakeRemoteConfigValue_3( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +/// A class which mocks [FirebaseRemoteConfig]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockFirebaseRemoteConfig extends _i1.Mock + implements _i4.FirebaseRemoteConfig { + MockFirebaseRemoteConfig() { + _i1.throwOnMissingStub(this); + } + + @override + _i2.FirebaseApp get app => (super.noSuchMethod( + Invocation.getter(#app), + returnValue: _FakeFirebaseApp_0( + this, + Invocation.getter(#app), + ), + ) as _i2.FirebaseApp); + @override + DateTime get lastFetchTime => (super.noSuchMethod( + Invocation.getter(#lastFetchTime), + returnValue: _FakeDateTime_1( + this, + Invocation.getter(#lastFetchTime), + ), + ) as DateTime); + @override + _i3.RemoteConfigFetchStatus get lastFetchStatus => (super.noSuchMethod( + Invocation.getter(#lastFetchStatus), + returnValue: _i3.RemoteConfigFetchStatus.noFetchYet, + ) as _i3.RemoteConfigFetchStatus); + @override + _i3.RemoteConfigSettings get settings => (super.noSuchMethod( + Invocation.getter(#settings), + returnValue: _FakeRemoteConfigSettings_2( + this, + Invocation.getter(#settings), + ), + ) as _i3.RemoteConfigSettings); + @override + Map get pluginConstants => (super.noSuchMethod( + Invocation.getter(#pluginConstants), + returnValue: {}, + ) as Map); + @override + bool get hasListeners => (super.noSuchMethod( + Invocation.getter(#hasListeners), + returnValue: false, + ) as bool); + @override + _i5.Future activate() => (super.noSuchMethod( + Invocation.method( + #activate, + [], + ), + returnValue: _i5.Future.value(false), + ) as _i5.Future); + @override + _i5.Future ensureInitialized() => (super.noSuchMethod( + Invocation.method( + #ensureInitialized, + [], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + @override + _i5.Future fetch() => (super.noSuchMethod( + Invocation.method( + #fetch, + [], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + @override + _i5.Future fetchAndActivate() => (super.noSuchMethod( + Invocation.method( + #fetchAndActivate, + [], + ), + returnValue: _i5.Future.value(false), + ) as _i5.Future); + @override + Map getAll() => (super.noSuchMethod( + Invocation.method( + #getAll, + [], + ), + returnValue: {}, + ) as Map); + @override + bool getBool(String? key) => (super.noSuchMethod( + Invocation.method( + #getBool, + [key], + ), + returnValue: false, + ) as bool); + @override + int getInt(String? key) => (super.noSuchMethod( + Invocation.method( + #getInt, + [key], + ), + returnValue: 0, + ) as int); + @override + double getDouble(String? key) => (super.noSuchMethod( + Invocation.method( + #getDouble, + [key], + ), + returnValue: 0.0, + ) as double); + @override + String getString(String? key) => (super.noSuchMethod( + Invocation.method( + #getString, + [key], + ), + returnValue: '', + ) as String); + @override + _i3.RemoteConfigValue getValue(String? key) => (super.noSuchMethod( + Invocation.method( + #getValue, + [key], + ), + returnValue: _FakeRemoteConfigValue_3( + this, + Invocation.method( + #getValue, + [key], + ), + ), + ) as _i3.RemoteConfigValue); + @override + _i5.Future setConfigSettings( + _i3.RemoteConfigSettings? remoteConfigSettings) => + (super.noSuchMethod( + Invocation.method( + #setConfigSettings, + [remoteConfigSettings], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + @override + _i5.Future setDefaults(Map? defaultParameters) => + (super.noSuchMethod( + Invocation.method( + #setDefaults, + [defaultParameters], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + @override + void addListener(_i6.VoidCallback? listener) => super.noSuchMethod( + Invocation.method( + #addListener, + [listener], + ), + returnValueForMissingStub: null, + ); + @override + void removeListener(_i6.VoidCallback? listener) => super.noSuchMethod( + Invocation.method( + #removeListener, + [listener], + ), + returnValueForMissingStub: null, + ); + @override + void dispose() => super.noSuchMethod( + Invocation.method( + #dispose, + [], + ), + returnValueForMissingStub: null, + ); + @override + void notifyListeners() => super.noSuchMethod( + Invocation.method( + #notifyListeners, + [], + ), + returnValueForMissingStub: null, + ); +} diff --git a/test/service/report/report_service_test.dart b/test/service/report/report_service_test.dart new file mode 100644 index 00000000..ee7cc6db --- /dev/null +++ b/test/service/report/report_service_test.dart @@ -0,0 +1,96 @@ +import 'package:either_dart/either.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mockito/annotations.dart'; +import 'package:mockito/mockito.dart'; +import 'package:ottaa_project_flutter/application/service/report_service.dart'; +import 'package:ottaa_project_flutter/core/models/phrases_statistics_model.dart'; +import 'package:ottaa_project_flutter/core/models/picto_statistics_model.dart'; +import 'package:ottaa_project_flutter/core/repositories/repositories.dart'; + +import 'report_service_test.mocks.dart'; + +@GenerateMocks([ + ServerRepository, +]) +Future main() async { + late MockServerRepository mockServerRepository; + PhraseStatisticModel phraseStatisticModel = PhraseStatisticModel( + totalFrases: 0, + frases7Days: 00, + averagePictoFrase: 00, + frecLast7Days: { + '0': 00, + '1': 00, + '2': 00, + '3': 00, + '4': 0012, + }, + ); + PictoStatisticsModel pictoStatisticsModel = PictoStatisticsModel(mostUsedSentences: [ + MostUsedSentence( + frec: 00, + pictoComponentes: [ + PictoComponente(id: "00", esSugerencia: false, hora: ['test'], sexo: ['test'], edad: ['test']), + ], + ), + MostUsedSentence( + frec: 11, + pictoComponentes: [ + PictoComponente(id: "11", esSugerencia: false, hora: ['test'], sexo: ['test'], edad: ['test']), + ], + ), + ], pictoUsagePerGroup: [ + PictoUsagePerGroup( + groupId: 00, + percentage: 00, + name: Name(en: '', es: '', fr: '', pt: ''), + ) + ]); + + late ReportRepository reportRepository; + setUp(() { + mockServerRepository = MockServerRepository(); + reportRepository = ReportService(mockServerRepository); + }); + + test('should return most used sentences from the user ', () async { + when(mockServerRepository.getMostUsedSentences(any, any)).thenAnswer((_) async { + return Right(phraseStatisticModel.toJson()); + }); + + final response = await reportRepository.getMostUsedSentences('testId', 'es_AR'); + + expect(response, isA()); + }); + + test('should return null if most used sentences are not found from the user ', () async { + when(mockServerRepository.getMostUsedSentences(any, any)).thenAnswer((_) async { + return const Left('null'); + }); + + final response = await reportRepository.getMostUsedSentences('testId', 'es_AR'); + + expect(response, null); + }); + + //todo: model is not working + /*test('should return pictogram statics from the user ', () async { + when(mockServerRepository.getPictogramsStatistics(any, any)).thenAnswer((_) async { + return Right(pictoStatisticsModel.toJson()); + }); + + final response = await reportRepository.getPictogramsStatistics('testId', 'es_AR'); + + expect(response, isA()); + });*/ + + test('should return null if pictogram statics are not found from the user ', () async { + when(mockServerRepository.getPictogramsStatistics(any, any)).thenAnswer((_) async { + return const Left('null'); + }); + + final response = await reportRepository.getPictogramsStatistics('testId', 'es_AR'); + + expect(response, null); + }); +} diff --git a/test/service/report/report_service_test.mocks.dart b/test/service/report/report_service_test.mocks.dart new file mode 100644 index 00000000..b5a95c32 --- /dev/null +++ b/test/service/report/report_service_test.mocks.dart @@ -0,0 +1,1054 @@ +// Mocks generated by Mockito 5.4.0 from annotations +// in ottaa_project_flutter/test/service/report/report_service_test.dart. +// Do not manually edit this file. + +// ignore_for_file: no_leading_underscores_for_library_prefixes +import 'dart:async' as _i4; + +import 'package:dio/dio.dart' as _i7; +import 'package:either_dart/either.dart' as _i2; +import 'package:mockito/mockito.dart' as _i1; +import 'package:ottaa_project_flutter/core/enums/board_data_type.dart' as _i9; +import 'package:ottaa_project_flutter/core/enums/user_types.dart' as _i5; +import 'package:ottaa_project_flutter/core/models/arsaac_data_model.dart' + as _i11; +import 'package:ottaa_project_flutter/core/models/assets_image.dart' as _i6; +import 'package:ottaa_project_flutter/core/models/devices_token.dart' as _i10; +import 'package:ottaa_project_flutter/core/models/shortcuts_model.dart' as _i8; +import 'package:ottaa_project_flutter/core/repositories/server_repository.dart' + as _i3; + +// ignore_for_file: type=lint +// ignore_for_file: avoid_redundant_argument_values +// ignore_for_file: avoid_setters_without_getters +// ignore_for_file: comment_references +// ignore_for_file: implementation_imports +// ignore_for_file: invalid_use_of_visible_for_testing_member +// ignore_for_file: prefer_const_constructors +// ignore_for_file: unnecessary_parenthesis +// ignore_for_file: camel_case_types +// ignore_for_file: subtype_of_sealed_class + +class _FakeEither_0 extends _i1.SmartFake implements _i2.Either { + _FakeEither_0( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +/// A class which mocks [ServerRepository]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockServerRepository extends _i1.Mock implements _i3.ServerRepository { + MockServerRepository() { + _i1.throwOnMissingStub(this); + } + + @override + _i4.Future<_i2.Either> getAvailableAppVersion( + String? platform) => + (super.noSuchMethod( + Invocation.method( + #getAvailableAppVersion, + [platform], + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #getAvailableAppVersion, + [platform], + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future<_i5.UserType> getUserType(String? userId) => (super.noSuchMethod( + Invocation.method( + #getUserType, + [userId], + ), + returnValue: _i4.Future<_i5.UserType>.value(_i5.UserType.caregiver), + ) as _i4.Future<_i5.UserType>); + @override + _i4.Future<_i2.Either> getUserProfilePicture( + String? userId) => + (super.noSuchMethod( + Invocation.method( + #getUserProfilePicture, + [userId], + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #getUserProfilePicture, + [userId], + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future<_i2.Either> uploadUserPicture( + String? userId, + _i6.AssetsImage? image, + ) => + (super.noSuchMethod( + Invocation.method( + #uploadUserPicture, + [ + userId, + image, + ], + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #uploadUserPicture, + [ + userId, + image, + ], + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future<_i2.Either>> getUserInformation( + String? id) => + (super.noSuchMethod( + Invocation.method( + #getUserInformation, + [id], + ), + returnValue: _i4.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #getUserInformation, + [id], + ), + )), + ) as _i4.Future<_i2.Either>>); + @override + _i4.Future<_i2.Either> uploadUserInformation( + String? userId, + Map? data, + ) => + (super.noSuchMethod( + Invocation.method( + #uploadUserInformation, + [ + userId, + data, + ], + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #uploadUserInformation, + [ + userId, + data, + ], + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future>> getUserSentences( + String? userId, { + required String? language, + required String? type, + bool? isFavorite = false, + }) => + (super.noSuchMethod( + Invocation.method( + #getUserSentences, + [userId], + { + #language: language, + #type: type, + #isFavorite: isFavorite, + }, + ), + returnValue: _i4.Future>>.value( + >[]), + ) as _i4.Future>>); + @override + _i4.Future<_i2.Either> uploadUserSentences( + String? userId, + String? language, + String? type, + List>? data, + ) => + (super.noSuchMethod( + Invocation.method( + #uploadUserSentences, + [ + userId, + language, + type, + data, + ], + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #uploadUserSentences, + [ + userId, + language, + type, + data, + ], + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future<_i2.Either>>> getAllPictograms( + String? userId, + String? languageCode, + ) => + (super.noSuchMethod( + Invocation.method( + #getAllPictograms, + [ + userId, + languageCode, + ], + ), + returnValue: + _i4.Future<_i2.Either>>>.value( + _FakeEither_0>>( + this, + Invocation.method( + #getAllPictograms, + [ + userId, + languageCode, + ], + ), + )), + ) as _i4.Future<_i2.Either>>>); + @override + _i4.Future<_i2.Either> uploadPictograms( + String? userId, + String? language, { + required List>? data, + }) => + (super.noSuchMethod( + Invocation.method( + #uploadPictograms, + [ + userId, + language, + ], + {#data: data}, + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #uploadPictograms, + [ + userId, + language, + ], + {#data: data}, + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future<_i2.Either> updatePictogram( + String? userId, + String? language, + int? index, { + required Map? data, + }) => + (super.noSuchMethod( + Invocation.method( + #updatePictogram, + [ + userId, + language, + index, + ], + {#data: data}, + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #updatePictogram, + [ + userId, + language, + index, + ], + {#data: data}, + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future<_i2.Either>>> getAllGroups( + String? userId, + String? languageCode, + ) => + (super.noSuchMethod( + Invocation.method( + #getAllGroups, + [ + userId, + languageCode, + ], + ), + returnValue: + _i4.Future<_i2.Either>>>.value( + _FakeEither_0>>( + this, + Invocation.method( + #getAllGroups, + [ + userId, + languageCode, + ], + ), + )), + ) as _i4.Future<_i2.Either>>>); + @override + _i4.Future<_i2.Either> uploadGroups( + String? userId, + String? language, { + required List>? data, + }) => + (super.noSuchMethod( + Invocation.method( + #uploadGroups, + [ + userId, + language, + ], + {#data: data}, + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #uploadGroups, + [ + userId, + language, + ], + {#data: data}, + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future<_i2.Either> updateGroup( + String? userId, + String? language, + int? index, { + required Map? data, + }) => + (super.noSuchMethod( + Invocation.method( + #updateGroup, + [ + userId, + language, + index, + ], + {#data: data}, + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #updateGroup, + [ + userId, + language, + index, + ], + {#data: data}, + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future<_i2.Either>> getPictogramsStatistics( + String? userId, + String? languageCode, [ + _i7.CancelToken? cancelToken, + ]) => + (super.noSuchMethod( + Invocation.method( + #getPictogramsStatistics, + [ + userId, + languageCode, + cancelToken, + ], + ), + returnValue: _i4.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #getPictogramsStatistics, + [ + userId, + languageCode, + cancelToken, + ], + ), + )), + ) as _i4.Future<_i2.Either>>); + @override + _i4.Future<_i2.Either>> getMostUsedSentences( + String? userId, + String? languageCode, [ + _i7.CancelToken? cancelToken, + ]) => + (super.noSuchMethod( + Invocation.method( + #getMostUsedSentences, + [ + userId, + languageCode, + cancelToken, + ], + ), + returnValue: _i4.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #getMostUsedSentences, + [ + userId, + languageCode, + cancelToken, + ], + ), + )), + ) as _i4.Future<_i2.Either>>); + @override + _i4.Future<_i2.Either> generatePhraseGPT({ + required String? prompt, + required int? maxTokens, + double? temperature = 0.0, + }) => + (super.noSuchMethod( + Invocation.method( + #generatePhraseGPT, + [], + { + #prompt: prompt, + #maxTokens: maxTokens, + #temperature: temperature, + }, + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #generatePhraseGPT, + [], + { + #prompt: prompt, + #maxTokens: maxTokens, + #temperature: temperature, + }, + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future uploadUserImage({ + required String? path, + required String? name, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #uploadUserImage, + [], + { + #path: path, + #name: name, + #userId: userId, + }, + ), + returnValue: _i4.Future.value(''), + ) as _i4.Future); + @override + _i4.Future updateUserSettings({ + required Map? data, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #updateUserSettings, + [], + { + #data: data, + #userId: userId, + }, + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future<_i2.Either>> getConnectedUsers( + {required String? userId}) => + (super.noSuchMethod( + Invocation.method( + #getConnectedUsers, + [], + {#userId: userId}, + ), + returnValue: _i4.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #getConnectedUsers, + [], + {#userId: userId}, + ), + )), + ) as _i4.Future<_i2.Either>>); + @override + _i4.Future<_i2.Either>> fetchConnectedUserData( + {required String? userId}) => + (super.noSuchMethod( + Invocation.method( + #fetchConnectedUserData, + [], + {#userId: userId}, + ), + returnValue: _i4.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #fetchConnectedUserData, + [], + {#userId: userId}, + ), + )), + ) as _i4.Future<_i2.Either>>); + @override + _i4.Future removeCurrentUser({ + required String? userId, + required String? careGiverId, + }) => + (super.noSuchMethod( + Invocation.method( + #removeCurrentUser, + [], + { + #userId: userId, + #careGiverId: careGiverId, + }, + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future<_i2.Either> setShortcutsForUser({ + required _i8.ShortcutsModel? shortcuts, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #setShortcutsForUser, + [], + { + #shortcuts: shortcuts, + #userId: userId, + }, + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #setShortcutsForUser, + [], + { + #shortcuts: shortcuts, + #userId: userId, + }, + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future updateUserData({ + required Map? data, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #updateUserData, + [], + { + #data: data, + #userId: userId, + }, + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future<_i2.Either>> getEmailToken( + String? ownEmail, + String? email, [ + _i7.CancelToken? cancelToken, + ]) => + (super.noSuchMethod( + Invocation.method( + #getEmailToken, + [ + ownEmail, + email, + cancelToken, + ], + ), + returnValue: _i4.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #getEmailToken, + [ + ownEmail, + email, + cancelToken, + ], + ), + )), + ) as _i4.Future<_i2.Either>>); + @override + _i4.Future<_i2.Either>> verifyEmailToken( + String? ownEmail, + String? email, + String? token, [ + _i7.CancelToken? cancelToken, + ]) => + (super.noSuchMethod( + Invocation.method( + #verifyEmailToken, + [ + ownEmail, + email, + token, + cancelToken, + ], + ), + returnValue: _i4.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #verifyEmailToken, + [ + ownEmail, + email, + token, + cancelToken, + ], + ), + )), + ) as _i4.Future<_i2.Either>>); + @override + _i4.Future<_i2.Either>> getProfileById( + {required String? id}) => + (super.noSuchMethod( + Invocation.method( + #getProfileById, + [], + {#id: id}, + ), + returnValue: _i4.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #getProfileById, + [], + {#id: id}, + ), + )), + ) as _i4.Future<_i2.Either>>); + @override + _i4.Future getDefaultGroups(String? languageCode) => + (super.noSuchMethod( + Invocation.method( + #getDefaultGroups, + [languageCode], + ), + returnValue: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future getDefaultPictos(String? languageCode) => + (super.noSuchMethod( + Invocation.method( + #getDefaultPictos, + [languageCode], + ), + returnValue: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future updateUserType({ + required String? id, + required _i5.UserType? userType, + }) => + (super.noSuchMethod( + Invocation.method( + #updateUserType, + [], + { + #id: id, + #userType: userType, + }, + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future<_i2.Either>> fetchShortcutsForUser( + {required String? userId}) => + (super.noSuchMethod( + Invocation.method( + #fetchShortcutsForUser, + [], + {#userId: userId}, + ), + returnValue: _i4.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #fetchShortcutsForUser, + [], + {#userId: userId}, + ), + )), + ) as _i4.Future<_i2.Either>>); + @override + _i4.Future?> createPictoGroupData({ + required String? userId, + required String? language, + required _i9.BoardDataType? type, + required Map? data, + _i7.CancelToken? cancelToken, + }) => + (super.noSuchMethod( + Invocation.method( + #createPictoGroupData, + [], + { + #userId: userId, + #language: language, + #type: type, + #data: data, + #cancelToken: cancelToken, + }, + ), + returnValue: _i4.Future?>.value(), + ) as _i4.Future?>); + @override + _i4.Future updateDevicesId({ + required String? userId, + required _i10.DeviceToken? deviceToken, + }) => + (super.noSuchMethod( + Invocation.method( + #updateDevicesId, + [], + { + #userId: userId, + #deviceToken: deviceToken, + }, + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future<_i2.Either>> learnPictograms({ + required String? uid, + required String? language, + required String? model, + required List>? tokens, + _i7.CancelToken? cancelToken, + }) => + (super.noSuchMethod( + Invocation.method( + #learnPictograms, + [], + { + #uid: uid, + #language: language, + #model: model, + #tokens: tokens, + #cancelToken: cancelToken, + }, + ), + returnValue: _i4.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #learnPictograms, + [], + { + #uid: uid, + #language: language, + #model: model, + #tokens: tokens, + #cancelToken: cancelToken, + }, + ), + )), + ) as _i4.Future<_i2.Either>>); + @override + _i4.Future<_i2.Either>> predictPictogram({ + required String? sentence, + required String? uid, + required String? language, + required String? model, + required List? groups, + required Map>? tags, + bool? reduced = false, + int? limit = 10, + int? chunk = 4, + _i7.CancelToken? cancelToken, + }) => + (super.noSuchMethod( + Invocation.method( + #predictPictogram, + [], + { + #sentence: sentence, + #uid: uid, + #language: language, + #model: model, + #groups: groups, + #tags: tags, + #reduced: reduced, + #limit: limit, + #chunk: chunk, + #cancelToken: cancelToken, + }, + ), + returnValue: _i4.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #predictPictogram, + [], + { + #sentence: sentence, + #uid: uid, + #language: language, + #model: model, + #groups: groups, + #tags: tags, + #reduced: reduced, + #limit: limit, + #chunk: chunk, + #cancelToken: cancelToken, + }, + ), + )), + ) as _i4.Future<_i2.Either>>); + @override + _i4.Future<_i2.Either> updateUserLastConnectionTime({ + required String? userId, + required int? time, + }) => + (super.noSuchMethod( + Invocation.method( + #updateUserLastConnectionTime, + [], + { + #userId: userId, + #time: time, + }, + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #updateUserLastConnectionTime, + [], + { + #userId: userId, + #time: time, + }, + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future fetchUserGroups({ + required String? languageCode, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #fetchUserGroups, + [], + { + #languageCode: languageCode, + #userId: userId, + }, + ), + returnValue: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future fetchUserPictos({ + required String? languageCode, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #fetchUserPictos, + [], + { + #languageCode: languageCode, + #userId: userId, + }, + ), + returnValue: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future updateLanguageSettings({ + required Map? map, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #updateLanguageSettings, + [], + { + #map: map, + #userId: userId, + }, + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future updateVoiceAndSubtitleSettings({ + required Map? map, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #updateVoiceAndSubtitleSettings, + [], + { + #map: map, + #userId: userId, + }, + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future updateAccessibilitySettings({ + required Map? map, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #updateAccessibilitySettings, + [], + { + #map: map, + #userId: userId, + }, + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future updateMainSettings({ + required Map? map, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #updateMainSettings, + [], + { + #map: map, + #userId: userId, + }, + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future fetchUserSettings({required String? userId}) => + (super.noSuchMethod( + Invocation.method( + #fetchUserSettings, + [], + {#userId: userId}, + ), + returnValue: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future<_i2.Either>> + fetchPhotosFromGlobalSymbols({ + required String? searchText, + required String? languageCode, + }) => + (super.noSuchMethod( + Invocation.method( + #fetchPhotosFromGlobalSymbols, + [], + { + #searchText: searchText, + #languageCode: languageCode, + }, + ), + returnValue: _i4 + .Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #fetchPhotosFromGlobalSymbols, + [], + { + #searchText: searchText, + #languageCode: languageCode, + }, + ), + )), + ) as _i4.Future<_i2.Either>>); + @override + _i4.Future uploadOtherImages({ + required String? imagePath, + required String? directoryPath, + required String? name, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #uploadOtherImages, + [], + { + #imagePath: imagePath, + #directoryPath: directoryPath, + #name: name, + #userId: userId, + }, + ), + returnValue: _i4.Future.value(''), + ) as _i4.Future); + @override + _i4.Future deleteTheAccount({required String? userId}) => + (super.noSuchMethod( + Invocation.method( + #deleteTheAccount, + [], + {#userId: userId}, + ), + returnValue: _i4.Future.value(false), + ) as _i4.Future); +} diff --git a/test/service/sentence/sentence_service_test.dart b/test/service/sentence/sentence_service_test.dart new file mode 100644 index 00000000..49a3cfb7 --- /dev/null +++ b/test/service/sentence/sentence_service_test.dart @@ -0,0 +1,121 @@ +import 'dart:ffi'; + +import 'package:either_dart/either.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mockito/annotations.dart'; +import 'package:mockito/mockito.dart'; +import 'package:ottaa_project_flutter/application/service/sentences_service.dart'; +import 'package:ottaa_project_flutter/core/enums/user_types.dart'; +import 'package:ottaa_project_flutter/core/models/assets_image.dart'; +import 'package:ottaa_project_flutter/core/models/base_settings_model.dart'; +import 'package:ottaa_project_flutter/core/models/base_user_model.dart'; +import 'package:ottaa_project_flutter/core/models/language_setting.dart'; +import 'package:ottaa_project_flutter/core/models/phrase_model.dart'; +import 'package:ottaa_project_flutter/core/models/user_data_model.dart'; +import 'package:ottaa_project_flutter/core/repositories/repositories.dart'; + +import 'sentence_service_test.mocks.dart'; + +@GenerateMocks([ + ServerRepository, + AuthRepository, +]) +Future main() async { + late MockServerRepository mockServerRepository; + late MockAuthRepository mockAuthRepository; + late BaseUserModel fakeUser; + + late SentencesRepository sentencesRepository; + late List fakePhrases; + + setUp(() { + mockServerRepository = MockServerRepository(); + mockAuthRepository = MockAuthRepository(); + fakeUser = BaseUserModel( + id: "0", + settings: BaseSettingsModel( + data: UserData( + avatar: AssetsImage(asset: "test", network: "https://test.com"), + birthDate: DateTime(0), + genderPref: "n/a", + lastConnection: DateTime(0), + name: "John", + lastName: "Doe", + ), + language: LanguageSetting.empty(), + ), + email: "test@mail.com", + type: UserType.caregiver, + ); + sentencesRepository = SentencesService(mockAuthRepository, mockServerRepository); + + fakePhrases = [ + Phrase(date: DateTime.now(), id: '00', sequence: [Sequence(id: '22')], tags: {}), + Phrase(date: DateTime.now(), id: '22', sequence: [Sequence(id: '22')], tags: {}) + ]; + }); + + test('should return the list of phrases from the user', () async { + when(mockAuthRepository.getCurrentUser()).thenAnswer((realInvocation) async => Right(fakeUser)); + + when(mockServerRepository.getUserSentences(any, language: anyNamed('language'), type: anyNamed('type'))).thenAnswer((realInvocation) async => (fakePhrases.map((e) => e.toMap()).toList())); + + final response = await sentencesRepository.fetchSentences(language: 'es_AR', type: 'Test'); + + expect(response.right, isA>()); + }); + + test('should return empty list of phrases if no user found', () async { + when(mockAuthRepository.getCurrentUser()).thenAnswer((realInvocation) async => const Left('no user')); + + when(mockServerRepository.getUserSentences(any, language: anyNamed('language'), type: anyNamed('type'))).thenAnswer((realInvocation) async => ([])); + + final response = await sentencesRepository.fetchSentences(language: 'es_AR', type: 'Test'); + + expect(response.left, isA()); + }); + + //todo: emir + group("Check user phrases uploading", () { + test('should upload sentences to the user database', () async { + List> phrasesDB = []; + + when(mockAuthRepository.getCurrentUser()).thenAnswer((realInvocation) async => Right(fakeUser)); + + when(mockServerRepository.uploadUserSentences(any, any, any, any)).thenAnswer((realInvocation) async { + phrasesDB.addAll(realInvocation.positionalArguments.last); + return const Right(null); + }); + + await sentencesRepository.uploadSentences(language: 'es_AR', data: fakePhrases, type: 'type'); + + expect(phrasesDB, fakePhrases.map((e) => e.toMap())); + }); + + test('should return right when user upload senteces', () async { + List> phrasesDB = []; + + when(mockAuthRepository.getCurrentUser()).thenAnswer((realInvocation) async => Right(fakeUser)); + + when(mockServerRepository.uploadUserSentences(any, any, any, any)).thenAnswer((realInvocation) async { + phrasesDB.addAll(realInvocation.positionalArguments.last); + return const Right(null); + }); + + final response = await sentencesRepository.uploadSentences(language: 'es_AR', data: fakePhrases, type: 'type'); + + expect(response.isRight, true); + }); + }); + + test('should return a string of error when upload is not successful', () async { + when(mockAuthRepository.getCurrentUser()).thenAnswer((realInvocation) async => Right(fakeUser)); + + when(mockServerRepository.uploadUserSentences(any, any, any, any)).thenAnswer((realInvocation) async => const Left('failed')); + + final response = await sentencesRepository.uploadSentences(language: 'es_AR', data: fakePhrases, type: 'type'); + if (response.isLeft) { + expect(response.left, 'failed'); + } + }); +} diff --git a/test/service/sentence/sentence_service_test.mocks.dart b/test/service/sentence/sentence_service_test.mocks.dart new file mode 100644 index 00000000..3e52d1e1 --- /dev/null +++ b/test/service/sentence/sentence_service_test.mocks.dart @@ -0,0 +1,1167 @@ +// Mocks generated by Mockito 5.4.0 from annotations +// in ottaa_project_flutter/test/service/sentence/sentence_service_test.dart. +// Do not manually edit this file. + +// ignore_for_file: no_leading_underscores_for_library_prefixes +import 'dart:async' as _i4; + +import 'package:dio/dio.dart' as _i7; +import 'package:either_dart/either.dart' as _i2; +import 'package:mockito/mockito.dart' as _i1; +import 'package:ottaa_project_flutter/core/abstracts/user_model.dart' as _i13; +import 'package:ottaa_project_flutter/core/enums/board_data_type.dart' as _i9; +import 'package:ottaa_project_flutter/core/enums/sign_in_types.dart' as _i14; +import 'package:ottaa_project_flutter/core/enums/user_types.dart' as _i5; +import 'package:ottaa_project_flutter/core/models/arsaac_data_model.dart' + as _i11; +import 'package:ottaa_project_flutter/core/models/assets_image.dart' as _i6; +import 'package:ottaa_project_flutter/core/models/devices_token.dart' as _i10; +import 'package:ottaa_project_flutter/core/models/shortcuts_model.dart' as _i8; +import 'package:ottaa_project_flutter/core/repositories/auth_repository.dart' + as _i12; +import 'package:ottaa_project_flutter/core/repositories/server_repository.dart' + as _i3; + +// ignore_for_file: type=lint +// ignore_for_file: avoid_redundant_argument_values +// ignore_for_file: avoid_setters_without_getters +// ignore_for_file: comment_references +// ignore_for_file: implementation_imports +// ignore_for_file: invalid_use_of_visible_for_testing_member +// ignore_for_file: prefer_const_constructors +// ignore_for_file: unnecessary_parenthesis +// ignore_for_file: camel_case_types +// ignore_for_file: subtype_of_sealed_class + +class _FakeEither_0 extends _i1.SmartFake implements _i2.Either { + _FakeEither_0( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +/// A class which mocks [ServerRepository]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockServerRepository extends _i1.Mock implements _i3.ServerRepository { + MockServerRepository() { + _i1.throwOnMissingStub(this); + } + + @override + _i4.Future<_i2.Either> getAvailableAppVersion( + String? platform) => + (super.noSuchMethod( + Invocation.method( + #getAvailableAppVersion, + [platform], + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #getAvailableAppVersion, + [platform], + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future<_i5.UserType> getUserType(String? userId) => (super.noSuchMethod( + Invocation.method( + #getUserType, + [userId], + ), + returnValue: _i4.Future<_i5.UserType>.value(_i5.UserType.caregiver), + ) as _i4.Future<_i5.UserType>); + @override + _i4.Future<_i2.Either> getUserProfilePicture( + String? userId) => + (super.noSuchMethod( + Invocation.method( + #getUserProfilePicture, + [userId], + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #getUserProfilePicture, + [userId], + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future<_i2.Either> uploadUserPicture( + String? userId, + _i6.AssetsImage? image, + ) => + (super.noSuchMethod( + Invocation.method( + #uploadUserPicture, + [ + userId, + image, + ], + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #uploadUserPicture, + [ + userId, + image, + ], + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future<_i2.Either>> getUserInformation( + String? id) => + (super.noSuchMethod( + Invocation.method( + #getUserInformation, + [id], + ), + returnValue: _i4.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #getUserInformation, + [id], + ), + )), + ) as _i4.Future<_i2.Either>>); + @override + _i4.Future<_i2.Either> uploadUserInformation( + String? userId, + Map? data, + ) => + (super.noSuchMethod( + Invocation.method( + #uploadUserInformation, + [ + userId, + data, + ], + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #uploadUserInformation, + [ + userId, + data, + ], + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future>> getUserSentences( + String? userId, { + required String? language, + required String? type, + bool? isFavorite = false, + }) => + (super.noSuchMethod( + Invocation.method( + #getUserSentences, + [userId], + { + #language: language, + #type: type, + #isFavorite: isFavorite, + }, + ), + returnValue: _i4.Future>>.value( + >[]), + ) as _i4.Future>>); + @override + _i4.Future<_i2.Either> uploadUserSentences( + String? userId, + String? language, + String? type, + List>? data, + ) => + (super.noSuchMethod( + Invocation.method( + #uploadUserSentences, + [ + userId, + language, + type, + data, + ], + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #uploadUserSentences, + [ + userId, + language, + type, + data, + ], + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future<_i2.Either>>> getAllPictograms( + String? userId, + String? languageCode, + ) => + (super.noSuchMethod( + Invocation.method( + #getAllPictograms, + [ + userId, + languageCode, + ], + ), + returnValue: + _i4.Future<_i2.Either>>>.value( + _FakeEither_0>>( + this, + Invocation.method( + #getAllPictograms, + [ + userId, + languageCode, + ], + ), + )), + ) as _i4.Future<_i2.Either>>>); + @override + _i4.Future<_i2.Either> uploadPictograms( + String? userId, + String? language, { + required List>? data, + }) => + (super.noSuchMethod( + Invocation.method( + #uploadPictograms, + [ + userId, + language, + ], + {#data: data}, + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #uploadPictograms, + [ + userId, + language, + ], + {#data: data}, + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future<_i2.Either> updatePictogram( + String? userId, + String? language, + int? index, { + required Map? data, + }) => + (super.noSuchMethod( + Invocation.method( + #updatePictogram, + [ + userId, + language, + index, + ], + {#data: data}, + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #updatePictogram, + [ + userId, + language, + index, + ], + {#data: data}, + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future<_i2.Either>>> getAllGroups( + String? userId, + String? languageCode, + ) => + (super.noSuchMethod( + Invocation.method( + #getAllGroups, + [ + userId, + languageCode, + ], + ), + returnValue: + _i4.Future<_i2.Either>>>.value( + _FakeEither_0>>( + this, + Invocation.method( + #getAllGroups, + [ + userId, + languageCode, + ], + ), + )), + ) as _i4.Future<_i2.Either>>>); + @override + _i4.Future<_i2.Either> uploadGroups( + String? userId, + String? language, { + required List>? data, + }) => + (super.noSuchMethod( + Invocation.method( + #uploadGroups, + [ + userId, + language, + ], + {#data: data}, + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #uploadGroups, + [ + userId, + language, + ], + {#data: data}, + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future<_i2.Either> updateGroup( + String? userId, + String? language, + int? index, { + required Map? data, + }) => + (super.noSuchMethod( + Invocation.method( + #updateGroup, + [ + userId, + language, + index, + ], + {#data: data}, + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #updateGroup, + [ + userId, + language, + index, + ], + {#data: data}, + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future<_i2.Either>> getPictogramsStatistics( + String? userId, + String? languageCode, [ + _i7.CancelToken? cancelToken, + ]) => + (super.noSuchMethod( + Invocation.method( + #getPictogramsStatistics, + [ + userId, + languageCode, + cancelToken, + ], + ), + returnValue: _i4.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #getPictogramsStatistics, + [ + userId, + languageCode, + cancelToken, + ], + ), + )), + ) as _i4.Future<_i2.Either>>); + @override + _i4.Future<_i2.Either>> getMostUsedSentences( + String? userId, + String? languageCode, [ + _i7.CancelToken? cancelToken, + ]) => + (super.noSuchMethod( + Invocation.method( + #getMostUsedSentences, + [ + userId, + languageCode, + cancelToken, + ], + ), + returnValue: _i4.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #getMostUsedSentences, + [ + userId, + languageCode, + cancelToken, + ], + ), + )), + ) as _i4.Future<_i2.Either>>); + @override + _i4.Future<_i2.Either> generatePhraseGPT({ + required String? prompt, + required int? maxTokens, + double? temperature = 0.0, + }) => + (super.noSuchMethod( + Invocation.method( + #generatePhraseGPT, + [], + { + #prompt: prompt, + #maxTokens: maxTokens, + #temperature: temperature, + }, + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #generatePhraseGPT, + [], + { + #prompt: prompt, + #maxTokens: maxTokens, + #temperature: temperature, + }, + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future uploadUserImage({ + required String? path, + required String? name, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #uploadUserImage, + [], + { + #path: path, + #name: name, + #userId: userId, + }, + ), + returnValue: _i4.Future.value(''), + ) as _i4.Future); + @override + _i4.Future updateUserSettings({ + required Map? data, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #updateUserSettings, + [], + { + #data: data, + #userId: userId, + }, + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future<_i2.Either>> getConnectedUsers( + {required String? userId}) => + (super.noSuchMethod( + Invocation.method( + #getConnectedUsers, + [], + {#userId: userId}, + ), + returnValue: _i4.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #getConnectedUsers, + [], + {#userId: userId}, + ), + )), + ) as _i4.Future<_i2.Either>>); + @override + _i4.Future<_i2.Either>> fetchConnectedUserData( + {required String? userId}) => + (super.noSuchMethod( + Invocation.method( + #fetchConnectedUserData, + [], + {#userId: userId}, + ), + returnValue: _i4.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #fetchConnectedUserData, + [], + {#userId: userId}, + ), + )), + ) as _i4.Future<_i2.Either>>); + @override + _i4.Future removeCurrentUser({ + required String? userId, + required String? careGiverId, + }) => + (super.noSuchMethod( + Invocation.method( + #removeCurrentUser, + [], + { + #userId: userId, + #careGiverId: careGiverId, + }, + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future<_i2.Either> setShortcutsForUser({ + required _i8.ShortcutsModel? shortcuts, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #setShortcutsForUser, + [], + { + #shortcuts: shortcuts, + #userId: userId, + }, + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #setShortcutsForUser, + [], + { + #shortcuts: shortcuts, + #userId: userId, + }, + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future updateUserData({ + required Map? data, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #updateUserData, + [], + { + #data: data, + #userId: userId, + }, + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future<_i2.Either>> getEmailToken( + String? ownEmail, + String? email, [ + _i7.CancelToken? cancelToken, + ]) => + (super.noSuchMethod( + Invocation.method( + #getEmailToken, + [ + ownEmail, + email, + cancelToken, + ], + ), + returnValue: _i4.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #getEmailToken, + [ + ownEmail, + email, + cancelToken, + ], + ), + )), + ) as _i4.Future<_i2.Either>>); + @override + _i4.Future<_i2.Either>> verifyEmailToken( + String? ownEmail, + String? email, + String? token, [ + _i7.CancelToken? cancelToken, + ]) => + (super.noSuchMethod( + Invocation.method( + #verifyEmailToken, + [ + ownEmail, + email, + token, + cancelToken, + ], + ), + returnValue: _i4.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #verifyEmailToken, + [ + ownEmail, + email, + token, + cancelToken, + ], + ), + )), + ) as _i4.Future<_i2.Either>>); + @override + _i4.Future<_i2.Either>> getProfileById( + {required String? id}) => + (super.noSuchMethod( + Invocation.method( + #getProfileById, + [], + {#id: id}, + ), + returnValue: _i4.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #getProfileById, + [], + {#id: id}, + ), + )), + ) as _i4.Future<_i2.Either>>); + @override + _i4.Future getDefaultGroups(String? languageCode) => + (super.noSuchMethod( + Invocation.method( + #getDefaultGroups, + [languageCode], + ), + returnValue: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future getDefaultPictos(String? languageCode) => + (super.noSuchMethod( + Invocation.method( + #getDefaultPictos, + [languageCode], + ), + returnValue: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future updateUserType({ + required String? id, + required _i5.UserType? userType, + }) => + (super.noSuchMethod( + Invocation.method( + #updateUserType, + [], + { + #id: id, + #userType: userType, + }, + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future<_i2.Either>> fetchShortcutsForUser( + {required String? userId}) => + (super.noSuchMethod( + Invocation.method( + #fetchShortcutsForUser, + [], + {#userId: userId}, + ), + returnValue: _i4.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #fetchShortcutsForUser, + [], + {#userId: userId}, + ), + )), + ) as _i4.Future<_i2.Either>>); + @override + _i4.Future?> createPictoGroupData({ + required String? userId, + required String? language, + required _i9.BoardDataType? type, + required Map? data, + _i7.CancelToken? cancelToken, + }) => + (super.noSuchMethod( + Invocation.method( + #createPictoGroupData, + [], + { + #userId: userId, + #language: language, + #type: type, + #data: data, + #cancelToken: cancelToken, + }, + ), + returnValue: _i4.Future?>.value(), + ) as _i4.Future?>); + @override + _i4.Future updateDevicesId({ + required String? userId, + required _i10.DeviceToken? deviceToken, + }) => + (super.noSuchMethod( + Invocation.method( + #updateDevicesId, + [], + { + #userId: userId, + #deviceToken: deviceToken, + }, + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future<_i2.Either>> learnPictograms({ + required String? uid, + required String? language, + required String? model, + required List>? tokens, + _i7.CancelToken? cancelToken, + }) => + (super.noSuchMethod( + Invocation.method( + #learnPictograms, + [], + { + #uid: uid, + #language: language, + #model: model, + #tokens: tokens, + #cancelToken: cancelToken, + }, + ), + returnValue: _i4.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #learnPictograms, + [], + { + #uid: uid, + #language: language, + #model: model, + #tokens: tokens, + #cancelToken: cancelToken, + }, + ), + )), + ) as _i4.Future<_i2.Either>>); + @override + _i4.Future<_i2.Either>> predictPictogram({ + required String? sentence, + required String? uid, + required String? language, + required String? model, + required List? groups, + required Map>? tags, + bool? reduced = false, + int? limit = 10, + int? chunk = 4, + _i7.CancelToken? cancelToken, + }) => + (super.noSuchMethod( + Invocation.method( + #predictPictogram, + [], + { + #sentence: sentence, + #uid: uid, + #language: language, + #model: model, + #groups: groups, + #tags: tags, + #reduced: reduced, + #limit: limit, + #chunk: chunk, + #cancelToken: cancelToken, + }, + ), + returnValue: _i4.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #predictPictogram, + [], + { + #sentence: sentence, + #uid: uid, + #language: language, + #model: model, + #groups: groups, + #tags: tags, + #reduced: reduced, + #limit: limit, + #chunk: chunk, + #cancelToken: cancelToken, + }, + ), + )), + ) as _i4.Future<_i2.Either>>); + @override + _i4.Future<_i2.Either> updateUserLastConnectionTime({ + required String? userId, + required int? time, + }) => + (super.noSuchMethod( + Invocation.method( + #updateUserLastConnectionTime, + [], + { + #userId: userId, + #time: time, + }, + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #updateUserLastConnectionTime, + [], + { + #userId: userId, + #time: time, + }, + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future fetchUserGroups({ + required String? languageCode, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #fetchUserGroups, + [], + { + #languageCode: languageCode, + #userId: userId, + }, + ), + returnValue: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future fetchUserPictos({ + required String? languageCode, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #fetchUserPictos, + [], + { + #languageCode: languageCode, + #userId: userId, + }, + ), + returnValue: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future updateLanguageSettings({ + required Map? map, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #updateLanguageSettings, + [], + { + #map: map, + #userId: userId, + }, + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future updateVoiceAndSubtitleSettings({ + required Map? map, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #updateVoiceAndSubtitleSettings, + [], + { + #map: map, + #userId: userId, + }, + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future updateAccessibilitySettings({ + required Map? map, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #updateAccessibilitySettings, + [], + { + #map: map, + #userId: userId, + }, + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future updateMainSettings({ + required Map? map, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #updateMainSettings, + [], + { + #map: map, + #userId: userId, + }, + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future fetchUserSettings({required String? userId}) => + (super.noSuchMethod( + Invocation.method( + #fetchUserSettings, + [], + {#userId: userId}, + ), + returnValue: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future<_i2.Either>> + fetchPhotosFromGlobalSymbols({ + required String? searchText, + required String? languageCode, + }) => + (super.noSuchMethod( + Invocation.method( + #fetchPhotosFromGlobalSymbols, + [], + { + #searchText: searchText, + #languageCode: languageCode, + }, + ), + returnValue: _i4 + .Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #fetchPhotosFromGlobalSymbols, + [], + { + #searchText: searchText, + #languageCode: languageCode, + }, + ), + )), + ) as _i4.Future<_i2.Either>>); + @override + _i4.Future uploadOtherImages({ + required String? imagePath, + required String? directoryPath, + required String? name, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #uploadOtherImages, + [], + { + #imagePath: imagePath, + #directoryPath: directoryPath, + #name: name, + #userId: userId, + }, + ), + returnValue: _i4.Future.value(''), + ) as _i4.Future); + @override + _i4.Future deleteTheAccount({required String? userId}) => + (super.noSuchMethod( + Invocation.method( + #deleteTheAccount, + [], + {#userId: userId}, + ), + returnValue: _i4.Future.value(false), + ) as _i4.Future); +} + +/// A class which mocks [AuthRepository]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockAuthRepository extends _i1.Mock implements _i12.AuthRepository { + MockAuthRepository() { + _i1.throwOnMissingStub(this); + } + + @override + bool get isLogged => (super.noSuchMethod( + Invocation.getter(#isLogged), + returnValue: false, + ) as bool); + @override + _i4.Future<_i2.Either> signIn( + _i14.SignInType? type, [ + String? email, + String? password, + ]) => + (super.noSuchMethod( + Invocation.method( + #signIn, + [ + type, + email, + password, + ], + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #signIn, + [ + type, + email, + password, + ], + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future<_i2.Either> signUp() => (super.noSuchMethod( + Invocation.method( + #signUp, + [], + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #signUp, + [], + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future<_i2.Either> getCurrentUser() => + (super.noSuchMethod( + Invocation.method( + #getCurrentUser, + [], + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #getCurrentUser, + [], + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future isLoggedIn() => (super.noSuchMethod( + Invocation.method( + #isLoggedIn, + [], + ), + returnValue: _i4.Future.value(false), + ) as _i4.Future); + @override + _i4.Future logout() => (super.noSuchMethod( + Invocation.method( + #logout, + [], + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future getDeviceId() => (super.noSuchMethod( + Invocation.method( + #getDeviceId, + [], + ), + returnValue: _i4.Future.value(''), + ) as _i4.Future); + @override + _i4.Future deleteAccount({required String? userId}) => + (super.noSuchMethod( + Invocation.method( + #deleteAccount, + [], + {#userId: userId}, + ), + returnValue: _i4.Future.value(false), + ) as _i4.Future); +} diff --git a/test/service/server/firebase_function_mock.dart b/test/service/server/firebase_function_mock.dart new file mode 100644 index 00000000..8945fee1 --- /dev/null +++ b/test/service/server/firebase_function_mock.dart @@ -0,0 +1,28 @@ +// ignore_for_file: require_trailing_commas +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:cloud_functions_platform_interface/cloud_functions_platform_interface.dart'; +import 'package:firebase_core/firebase_core.dart'; +import 'package:firebase_core_platform_interface/firebase_core_platform_interface.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_test/flutter_test.dart'; + +typedef Callback = Function(MethodCall call); + +const String kTestString = 'Hello World'; +const String kBucket = 'gs://fake-storage-bucket-url.com'; +const String kSecondaryBucket = 'gs://fake-storage-bucket-url-2.com'; + +class MockHttpsCallablePlatform extends HttpsCallablePlatform { + MockHttpsCallablePlatform(FirebaseFunctionsPlatform functions, String? origin, + String? name, HttpsCallableOptions options, Uri? uri) + : super(functions, origin, name, options, uri); + + @override + Future call([dynamic parameters]) async { + // For testing purpose we return input data as output data. + return parameters; + } +} diff --git a/test/service/server/server_service_test.dart b/test/service/server/server_service_test.dart new file mode 100644 index 00000000..5cca4f4f --- /dev/null +++ b/test/service/server/server_service_test.dart @@ -0,0 +1,1260 @@ +import 'dart:convert'; + +import 'package:cloud_functions/cloud_functions.dart'; +import 'package:dio/dio.dart'; +import 'package:either_dart/either.dart'; +import 'package:firebase_core/firebase_core.dart'; +import 'package:firebase_database/firebase_database.dart'; +import 'package:firebase_database_mocks/firebase_database_mocks.dart'; +import 'package:firebase_storage/firebase_storage.dart'; +import 'package:flutter/widgets.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:http_mock_adapter/http_mock_adapter.dart'; +import 'package:mockito/annotations.dart'; +import 'package:firebase_storage_mocks/firebase_storage_mocks.dart'; +import 'package:mockito/mockito.dart'; +import 'package:ottaa_project_flutter/application/service/service.dart'; +import 'package:ottaa_project_flutter/core/enums/board_data_type.dart'; +import 'package:ottaa_project_flutter/core/enums/user_types.dart'; +import 'package:ottaa_project_flutter/core/models/accessibility_setting.dart'; +import 'package:ottaa_project_flutter/core/models/assets_image.dart'; +import 'package:ottaa_project_flutter/core/models/devices_token.dart'; +import 'package:ottaa_project_flutter/core/models/layout_setting.dart'; +import 'package:ottaa_project_flutter/core/models/shortcuts_model.dart'; +import 'package:ottaa_project_flutter/core/models/tts_setting.dart'; +import 'package:ottaa_project_flutter/core/repositories/server_repository.dart'; +import 'package:ottaa_project_flutter/firebase_options.dart'; + +import 'server_service_test.mocks.dart'; + +@GenerateMocks([FirebaseFunctions]) +void main() async { + late Dio dio; + late DioAdapter dioAdapter; + + late FirebaseDatabase firebaseDatabase; + late FirebaseStorage firebaseStorage; + late MockFirebaseFunctions firebaseFunctions; + + late ServerRepository serverService; + + final ttsSetting = TTSSetting.empty(language: "es_AR"); + const String fakeUserId = "mu4ZiTMURBeLEV7p3CrFbljBrHF2"; + const Map fakeGroup = { + "block": false, + "freq": 0, + "id": "--PHmDIFeKHvulVxNtBgk", + "relations": [], + "resource": {"asset": "", "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fdescripcion.webp?alt=media&token=4dbde8ba-f144-4a12-90f6-013bf68d912d"}, + "text": "ADJETIVOS" + }; + const Map fakePicto = { + "block": false, + "freq": 0, + "id": "ZodvGgP2un6y5X185Xrb9", + "resource": {"asset": "", "network": "https://firebasestorage.googleapis.com/v0/b/ottaaproject-flutter.appspot.com/o/Archivos%20Paises%2Ficonos%2Fgallo.webp?alt=media&token=f7eeb656-0122-4522-a795-630b90749f8a"}, + "text": "gallo", + "type": 2 + }; + final Map fakeUserInfo = { + "id": "mu4ZiTMURBeLEV7p3CrFbljBrHF2", + "pictos": { + "es_AR": { + "1": {"1": "2"}, + "2": {"1": "2"}, + "3": {"1": "2"}, + "4": fakePicto + } + }, + "groups": { + "es_AR": { + "1": {"1": "2"}, + "2": {"1": "2"}, + "3": {"1": "2"}, + "4": fakeGroup + } + }, + "settings": { + "data": { + "avatar": {"asset": "671", "network": "123"}, + "birthDate": 0, + "genderPref": "n/a", + "lastConnection": 1684420759838, + "lastName": "Ali", + "name": "Emir", + "number": "" + }, + "devices": [], + "tts": ttsSetting.toMap(), + "language": { + "labs": false, + "language": "es_AR", + }, + "layout": { + "cleanup": true, + "display": "tab", + "oneToOne": false, + "shortcuts": {"camera": false, "enable": true, "favs": false, "games": true, "history": false, "no": true, "share": false, "yes": true} + }, + "payment": {"payment": false, "paymentDate": 0, "paymentExpire": 0} + }, + "type": "user" + }; + + setUp(() async { + dio = Dio( + BaseOptions(baseUrl: "https://us-central1-ottaaproject-flutter.cloudfunctions.net"), + ); + dioAdapter = DioAdapter(dio: dio, matcher: const UrlRequestMatcher()); // Https interceptor + firebaseDatabase = MockFirebaseDatabase(); //Firebase databse mock + firebaseStorage = MockFirebaseStorage(); //Firebase storage mock + firebaseFunctions = MockFirebaseFunctions(); + + serverService = ServerService( + dio: dio, + database: firebaseDatabase, + storage: firebaseStorage, + functions: firebaseFunctions, + ); + + MockFirebaseDatabase.instance.ref("/mu4ZiTMURBeLEV7p3CrFbljBrHF2").set(fakeUserInfo); + }); + + group("Factory method", () { + test("create singleton", () { + try { + final serverService = ServerService.create(); + + expect(serverService, isNotNull); + } catch (e) {} + }); + }); + + group("Get user types", () { + test("should return caregiver user type", () async { + final fakeUserType = { + "1": {"type": "caregiver"} + }; + + MockFirebaseDatabase.instance.ref().set(fakeUserType); + + final userType = await serverService.getUserType("1"); + + expect(userType.name, equals(UserType.caregiver.name)); + }); + + test("should return user user type", () async { + final fakeUserType = { + "1": {"type": "user"} + }; + + MockFirebaseDatabase.instance.ref().set(fakeUserType); + + final userType = await serverService.getUserType("1"); + + expect(userType.name, equals(UserType.user.name)); + }); + + test("should return none user type", () async { + final fakeUserType = { + "1": {"type": ""} + }; + + MockFirebaseDatabase.instance.ref().set(fakeUserType); + + final userType = await serverService.getUserType("1"); + + expect(userType.name, equals(UserType.none.name)); + }); + }); + + group("Get All groups", () { + test("should return all groups", () async { + final groups = await serverService.getAllGroups(fakeUserId, "es_AR"); + + expect(groups, isA()); + expect(groups.right.length, equals(4)); + }); + + test("should return no_data_found", () async { + final groups = await serverService.getAllGroups(fakeUserId, "en_US"); + + expect(groups, isA()); + expect(groups.left, "no_data_found"); + }); + }); + + group("get all pictograms", () { + test("should return all pictos", () async { + final pictos = await serverService.getAllPictograms(fakeUserId, "es_AR"); + + expect(pictos, isA()); + expect(pictos.right.length, equals(4)); + }); + + test("should return no_data_found", () async { + final groups = await serverService.getAllPictograms(fakeUserId, "en_US"); + + expect(groups, isA()); + expect(groups.left, "no_data_found"); + }); + }); + + group("get available app version", () { + test("should return 1.0.0", () async { + MockFirebaseDatabase.instance.ref("/version").set("1.0.0"); + + final version = await serverService.getAvailableAppVersion("Android"); + + expect(version, isA()); + expect(version.right, equals("1.0.0")); + }); + + test("should return no_data_found", () async { + MockFirebaseDatabase.instance.ref("/version").set(null); + + final version = await serverService.getAvailableAppVersion("Android"); + + expect(version, isA()); + expect(version.left, "no_data_found"); + }); + }); + + group("get user information", () { + test("should return user information", () async { + final userInfo = await serverService.getUserInformation("mu4ZiTMURBeLEV7p3CrFbljBrHF2"); + + expect(userInfo, isA()); + expect(userInfo.right, equals(fakeUserInfo)); + }); + + test("should return user information (old languange)", () async { + final Map fakeUserInfoOld = { + "id": "mu4ZiTMURBeLEV7p3CrFbljBrHF2", + "pictos": { + "es_AR": { + "1": {"1": "2"}, + "2": {"1": "2"}, + "3": {"1": "2"}, + "4": fakePicto + } + }, + "groups": { + "es_AR": { + "1": {"1": "2"}, + "2": {"1": "2"}, + "3": {"1": "2"}, + "4": fakeGroup + } + }, + "settings": { + "data": { + "avatar": {"asset": "671", "network": "123"}, + "birthDate": 0, + "genderPref": "n/a", + "lastConnection": 1684420759838, + "lastName": "Ali", + "name": "Emir", + "number": "" + }, + "tts": ttsSetting.toMap(), + "devices": [], + "language": "es_AR", + "layout": { + "cleanup": true, + "display": "tab", + "oneToOne": false, + "shortcuts": {"camera": false, "enable": true, "favs": false, "games": true, "history": false, "no": true, "share": false, "yes": true} + }, + "payment": {"payment": false, "paymentDate": 0, "paymentExpire": 0} + }, + "type": "user" + }; + + await MockFirebaseDatabase.instance.ref("/mu4ZiTMURBeLEV7p3CrFbljBrHF22").set(fakeUserInfoOld); + + final userInfo = await serverService.getUserInformation("mu4ZiTMURBeLEV7p3CrFbljBrHF22"); + + expect(userInfo, isA()); + expect(userInfo.right, equals(fakeUserInfo)); + }); + + test("should return no_data_found", () async { + final userInfo = await serverService.getUserInformation("123"); + + expect(userInfo, isA()); + expect(userInfo.left, equals("no_data_found")); + }); + }); + + group("get user profile picture", () { + test("should return user profile picture", () async { + final profilePicture = await serverService.getUserProfilePicture("mu4ZiTMURBeLEV7p3CrFbljBrHF2"); + + expect(profilePicture, isA()); + expect(profilePicture.right, equals("123")); + }); + + test("should return no_data_found", () async { + final profilePicture = await serverService.getUserProfilePicture("123"); + + expect(profilePicture, isA()); + expect(profilePicture.left, equals("no_data_found")); + }); + }); + + group("get user sentences", () { + test("should return new phrases", () async { + final fakeSentences = [ + { + "sentence": "Hola", + "translation": "Hello", + "language": "es_AR", + "type": "new", + "date": 1600000000, + } + ]; + + final fakeUserFrases = { + "1": { + "Frases": { + "es_AR": {"new": fakeSentences} + } + } + }; + + await MockFirebaseDatabase.instance.ref().set(fakeUserFrases); + + final sentences = await serverService.getUserSentences("1", language: "es_AR", type: "new"); + + expect(sentences, isA>>()); + expect(sentences.length, equals(1)); + expect(sentences, equals(fakeSentences)); + }); + + test("should return old phrases", () async { + final fakeSentences = [ + { + "sentence": "Hola", + "translation": "Hello", + "language": "es_AR", + "type": "new", + "date": 1600000000, + } + ]; + + final fakeUserFrases = { + "Frases": { + "1": { + "es_AR": { + "new": fakeSentences, + } + } + } + }; + + await MockFirebaseDatabase.instance.ref().set(fakeUserFrases); + + final sentences = await serverService.getUserSentences("1", language: "es_AR", type: "new"); + + expect(sentences, isA>>()); + expect(sentences.length, equals(1)); + expect(sentences, equals(fakeSentences)); + }); + + test("should return empty list", () async { + final sentences = await serverService.getUserSentences("2", language: "es_AR", type: "new"); + + expect(sentences, isA>>()); + expect(sentences.length, equals(0)); + expect(sentences, equals([])); + }); + }); + + group("update group", () { + test("should update the group", () async { + final fakeGruop = {"name": "fake gruop"}; + final fakeGroup = {"name": "fake group"}; + + final fakeData = { + "1": { + "Grupos": { + "es_AR": {"0": fakeGruop} + } + } + }; + + // Seteando la data + await MockFirebaseDatabase.instance.ref().set(fakeData); + + // Actualizando el grupo + await serverService.updateGroup("1", "es_AR", 0, data: fakeGroup); + + // Obteniendo la data + + final data = await MockFirebaseDatabase.instance.ref("/1/Grupos/es_AR/0").get(); + + expect(data.value, equals(fakeGroup)); + }); + + test("should return a left", () async { + final fakeGroup = {"name": "fake group"}; + + // Actualizando el grupo + final result = await serverService.updateGroup("1", "es_AR", 1, data: fakeGroup); + + expect(result, isA()); + expect(result.left, equals("Exception: Group does not exist")); + }); + }); + + group("update pictogram", () { + test("should update the pictogram", () async { + final fakePitogram = {"name": "fake pitogram"}; + final fakePictogram = {"name": "fake pictogram"}; + + final fakeData = { + "1": { + "Pictos": { + "es_AR": {"0": fakePitogram} + } + } + }; + + await MockFirebaseDatabase.instance.ref().set(fakeData); + + await serverService.updatePictogram("1", "es_AR", 0, data: fakePictogram); + + final data = await MockFirebaseDatabase.instance.ref("/1/Pictos/es_AR/0").get(); + + expect(data.value, equals(fakePictogram)); + }); + + test("should return a left", () async { + final fakePitogram = {"name": "fake pitogram"}; + + final result = await serverService.updatePictogram("1", "es_AR", 1, data: fakePitogram); + + expect(result, isA()); + expect(result.left, equals("Exception: Picto does not exist")); + }); + }); + group("update last connection", () { + test("should update the last connection", () async { + final DateTime now = DateTime.now(); + + await serverService.updateUserLastConnectionTime(userId: fakeUserId, time: now.millisecondsSinceEpoch); + + final data = await MockFirebaseDatabase.instance.ref("$fakeUserId/settings/data/lastConnection").get(); + + expect(data.value, equals(now.millisecondsSinceEpoch)); + }); + + test("should return Exception: User does not exist", () async { + final DateTime now = DateTime.now(); + + final result = await serverService.updateUserLastConnectionTime(userId: "00", time: now.millisecondsSinceEpoch); + + expect(result, isA()); + expect(result.left, equals("Exception: User does not exist")); + }); + }); + + group("upload groups", () { + test("should upload the one group", () async { + final result = await serverService.uploadGroups(fakeUserId, "es_AR", data: [fakeGroup]); + final findGroup = await MockFirebaseDatabase.instance.ref("$fakeUserId/groups/es_AR/").get(); + + expect(result, isA()); + expect(findGroup.value, equals({"--PHmDIFeKHvulVxNtBgk": fakeGroup})); + }); + + test("should upload the one group and set language", () async { + final result = await serverService.uploadGroups(fakeUserId, "es_US", data: [fakeGroup]); + final findGroup = await MockFirebaseDatabase.instance.ref("$fakeUserId/groups/es_US/").get(); + + expect(result, isA()); + expect(findGroup.value, equals({"--PHmDIFeKHvulVxNtBgk": fakeGroup})); + }); + + test("should throws an error", () async { + final result = await serverService.uploadGroups(fakeUserId, "es_US", data: []); + + expect(result, isA()); + }); + }); + + group("upload pictograms", () { + test("should upload the one pictogram", () async { + final result = await serverService.uploadPictograms(fakeUserId, "es_AR", data: [fakePicto]); + final findGroup = await MockFirebaseDatabase.instance.ref("$fakeUserId/pictos/es_AR/").get(); + + expect(result, isA()); + expect(findGroup.value, equals({"ZodvGgP2un6y5X185Xrb9": fakePicto})); + }); + + test("should upload the one pictos and set language", () async { + final result = await serverService.uploadPictograms(fakeUserId, "es_US", data: [fakePicto]); + final findGroup = await MockFirebaseDatabase.instance.ref("$fakeUserId/pictos/es_US/").get(); + + expect(result, isA()); + expect(findGroup.value, equals({"ZodvGgP2un6y5X185Xrb9": fakePicto})); + }); + + test("should throws an error", () async { + final result = await serverService.uploadPictograms(fakeUserId, "es_US", data: []); + + expect(result, isA()); + }); + }); + + group("upload user information", () { + test("should update user information", () async { + final result = await serverService.uploadUserInformation("00", {"name": "fake name"}); + + expect(result, isA()); + }); + + test("should throws an error", () async { + final result = await serverService.uploadUserInformation("00", {}); + + expect(result, isA()); + }); + }); + + group("upload user picture", () { + test("should update the avatar", () async { + final result = await serverService.uploadUserPicture(fakeUserId, AssetsImage(asset: "1", network: "12")); + + final data = await MockFirebaseDatabase.instance.ref("$fakeUserId/settings/data/avatar").get(); + + expect(result, isA()); + expect(data.value, equals({'asset': '1', 'network': '12'})); + }); + + test("should throw an error", () async { + final result = await serverService.uploadUserPicture(fakeUserId, AssetsImage(asset: "", network: "12")); + expect(result, isA()); + }); + }); + group("upload user sentences", () { + test("should set the user sentences ", () async { + final result = await serverService.uploadUserSentences("1", "es_AR", "favorite", [ + {"name": "fake name"} + ]); + + final data = await MockFirebaseDatabase.instance.ref("1/Frases/es_AR/favorite").get(); + + expect(result, isA()); + expect( + data.value, + equals([ + {"name": "fake name"} + ])); + }); + + test("should throw an error", () async { + final result = await serverService.uploadUserSentences("1", "es_AR", "favorite", []); + expect(result, isA()); + }); + }); + + group("get most used sentences", () { + test("should return the most used sentences", () async { + const onReqFuncRequest = '/onReqFunc'; + + dioAdapter.onPost( + onReqFuncRequest, + (request) => request.reply(200, '{"message": "success"}'), + ); + + final result = await serverService.getMostUsedSentences("1", "es_AR"); + + expect(result, isA()); + expect(result.right, equals({'message': 'success'})); + }); + + test("should return http exception", () async { + const onReqFuncRequest = '/onReqFunc'; + + dioAdapter.onPost( + onReqFuncRequest, + (request) => request.reply(503, '{"message": "error"}'), + ); + + final result = await serverService.getMostUsedSentences("1", "es_AR"); + + expect(result, isA()); + expect(result.left, isA()); + }); + + test("should return an error occurred", () async { + const onReqFuncRequest = '/onReqFunc'; + + dioAdapter.onPost( + onReqFuncRequest, + (request) => request.reply(201, '{"message": "an error occurred"}'), + ); + + final result = await serverService.getMostUsedSentences("1", "es_AR"); + + expect(result, isA()); + expect(result.left, isA()); + expect(result.left, equals("an error occurred")); + }); + }); + + group("get pictograms statistics", () { + test("should return the most used sentences", () async { + const requestPath = '/readFile'; + + dioAdapter.onPost( + requestPath, + (request) => request.reply(200, '{"message": "success"}'), + ); + + final result = await serverService.getPictogramsStatistics("1", "es_AR"); + + expect(result, isA()); + expect(result.right, equals({'message': 'success'})); + }); + + test("should return http exception", () async { + const requestPath = '/readFile'; + + dioAdapter.onPost( + requestPath, + (request) => request.reply(503, '{"message": "error"}'), + ); + + final result = await serverService.getPictogramsStatistics("1", "es_AR"); + + expect(result, isA()); + expect(result.left, isA()); + }); + + test("should return an error occurred", () async { + const requestPath = '/readFile'; + + dioAdapter.onPost( + requestPath, + (request) => request.reply(201, '{"message": "an error occurred"}'), + ); + + final result = await serverService.getPictogramsStatistics("1", "es_AR"); + + expect(result, isA()); + expect(result.left, isA()); + expect(result.left, equals("an error occurred")); + }); + }); + + group("update user settings", () { + test("should update the user settings ", () async { + final result = {"name": "fake name"}; + await serverService.updateUserSettings(data: result, userId: "1"); + + final data = await MockFirebaseDatabase.instance.ref("1/settings/data/").get(); + + expect(data.value, equals(result)); + }); + }); + + group("upload user image", () { + test("should update the user imaged ", () async { + const String imagePath = "fakePath"; + const String name = "fakeName"; + const String userId = "fakeUserId"; + + const String imageUrl = "https://firebasestorage.googleapis.com/v0/b/some-bucket/o/userProfilePics$name.jpg"; + + final result = await serverService.uploadUserImage(path: imagePath, name: name, userId: userId); + + expect(result, equals(imageUrl)); + }); + }); + + group("get connected users", () { + test("should return a list of connected users", () async { + final fakeUserConnected = { + "2": { + "name": "fake name", + } + }; + final fakeUser = { + '1': { + "users": fakeUserConnected, + } + }; + + await MockFirebaseDatabase.instance.ref().set(fakeUser); + + final result = await serverService.getConnectedUsers(userId: "1"); + + expect(result, isA()); + expect(result.right, equals(fakeUserConnected)); + }); + + test("should return no data found", () async { + final result = await serverService.getConnectedUsers(userId: "3"); + + expect(result, isA()); + expect(result.left, equals("No Data found")); + }); + }); + + group("fetch onnected user data", () { + test("should return user information", () async { + final result = await serverService.fetchConnectedUserData(userId: fakeUserId); + + expect(result, isA()); + expect(result.right, equals(fakeUserInfo)); + }); + + test("should return no data found", () async { + final result = await serverService.fetchConnectedUserData(userId: "2"); + + expect(result, isA()); + expect(result.left, equals("No Data found")); + }); + }); + + group("remove current user", () { + test("should remove the current user", () async { + final fakeUserConnected = { + "2": { + "name": "fake name", + } + }; + final fakeUser = { + '1': { + "users": fakeUserConnected, + } + }; + + await MockFirebaseDatabase.instance.ref().set(fakeUser); + + await serverService.removeCurrentUser(userId: "2", careGiverId: "1"); + + final data = await MockFirebaseDatabase.instance.ref("1/users/2").get(); + + expect(data.value, isNull); + expect(data.exists, isFalse); + }); + }); + + group("set shortcuts for user", () { + test("should update user shortcuts", () async { + final ShortcutsModel shortcuts = ShortcutsModel.all(); + + final fakeUser = { + '1': { + "settings": { + "layout": { + "shortcuts": shortcuts.toMap(), + } + } + } + }; + + await MockFirebaseDatabase.instance.ref().set(fakeUser); + + final result = await serverService.setShortcutsForUser(userId: "1", shortcuts: ShortcutsModel.none()); + + final data = await MockFirebaseDatabase.instance.ref("1/settings/layout/shortcuts/").get(); + + expect(result, isA()); + expect(data.value, equals(ShortcutsModel.none().toMap())); + }); + + test("should throw an error", () async { + final result = await serverService.setShortcutsForUser(userId: "44", shortcuts: ShortcutsModel.none()); + + expect(result, isA()); + expect(result.left, equals("Exception: user does not exist")); + }); + }); + + group("fetch shortcuts for user", () { + test("should return the user shortcuts", () async { + final ShortcutsModel shortcuts = ShortcutsModel.all(); + + final fakeUser = { + '1': { + "settings": { + "layout": { + "shortcuts": shortcuts.toMap(), + } + } + } + }; + + await MockFirebaseDatabase.instance.ref().set(fakeUser); + + final result = await serverService.fetchShortcutsForUser(userId: "1"); + + expect(result, isA()); + expect(result.right, equals(ShortcutsModel.all().toMap())); + }); + + test("should throw an error", () async { + final result = await serverService.fetchShortcutsForUser(userId: "44"); + + expect(result, isA()); + expect(result.left, equals("No Data found")); + }); + }); + + group("get email token", () { + test("should return 200", () async { + const requestPath = '/linkUserRequest'; + + dioAdapter.onPost( + requestPath, + (request) => request.reply(200, {"message": "success"}), + ); + + final result = await serverService.getEmailToken("emir@mail.com", "asim@mail.com"); + + expect(result, isA()); + expect(result.right, equals({'message': 'success'})); + }); + + test("should return 201", () async { + const requestPath = '/linkUserRequest'; + + dioAdapter.onPost( + requestPath, + (request) => request.reply(201, {"code": "304"}), + ); + + final result = await serverService.getEmailToken("emir@mail.com", "asim@mail.com"); + + expect(result, isA()); + expect(result.left, equals("304")); + }); + + test("should throw an error", () async { + const requestPath = '/linkUserRequest'; + + dioAdapter.onPost( + requestPath, + (request) => request.reply(304, {"code": "304"}), + ); + + final result = await serverService.getEmailToken("emir@mail.com", "asim@mail.com"); + + expect(result, isA()); + }); + }); + + group("verify email token", () { + test("should return 200", () async { + const requestPath = '/linkUserConfirm'; + + dioAdapter.onPost( + requestPath, + (request) => request.reply(200, {"message": "success"}), + ); + + final result = await serverService.verifyEmailToken("emir@mail.com", "asim@mail.com", "1234"); + + expect(result, isA()); + expect(result.right, equals({'message': 'success'})); + }); + + test("should return 201", () async { + const requestPath = '/linkUserConfirm'; + + dioAdapter.onPost( + requestPath, + (request) => request.reply(201, {"code": "304"}), + ); + + final result = await serverService.verifyEmailToken("emir@mail.com", "asim@mail.com", "1234"); + + expect(result, isA()); + expect(result.left, equals("304")); + }); + + test("should throw an error", () async { + const requestPath = '/linkUserConfirm'; + + dioAdapter.onPost( + requestPath, + (request) => request.reply(304, {"code": "304"}), + ); + + final result = await serverService.verifyEmailToken("emir@mail.com", "asim@mail.com", "1234"); + + expect(result, isA()); + }); + }); + + group("update user data", () { + test("should update user data", () async { + final fakeUserData = { + "avatar": {"asset": "123", "network": "123"}, + "birthDate": 0, + "genderPref": "F", + "lastConnection": 1684420759838, + "lastName": "Ali", + "name": "Emir", + "number": "" + }; + + await serverService.updateUserData(userId: "mu4ZiTMURBeLEV7p3CrFbljBrHF2", data: fakeUserData); + + final data = await MockFirebaseDatabase.instance.ref("mu4ZiTMURBeLEV7p3CrFbljBrHF2/settings/data").get(); + + expect(data.value, equals(fakeUserData)); + }); + }); + + group("get profile by id", () { + test("should return profile", () async { + final result = await serverService.getProfileById(id: "mu4ZiTMURBeLEV7p3CrFbljBrHF2"); + + expect(result, isA()); + expect(result.right, equals(fakeUserInfo)); + }); + + test("should return no data found", () async { + final result = await serverService.getProfileById(id: "123"); + + expect(result, isA()); + expect(result.left, equals("No Data found")); + }); + }); + + group("get default groups", () { + test("should return default groups", () async { + MockFirebaseDatabase.instance.ref("default/groups").set({ + "es_AR": {"1": "1"} + }); + + final result = await serverService.getDefaultGroups("es_AR"); + + expect(result, isA()); + expect(result.right, equals({"1": "1"})); + }); + test("should return no data found", () async { + final result = await serverService.getDefaultGroups("es_US"); + + expect(result, isA()); + expect(result.left, equals("no_data_found")); + }); + }); + + group("fetch user groups", () { + test("should return user groups", () async { + final result = await serverService.fetchUserGroups(languageCode: "es_AR", userId: fakeUserId); + + expect(result, isA()); + expect(result.right, equals(fakeUserInfo["groups"]["es_AR"])); + }); + test("should return no data found", () async { + final result = await serverService.fetchUserGroups(languageCode: "es_US", userId: fakeUserId); + + expect(result, isA()); + expect(result.left, equals("no_data_found")); + }); + }); + + group("get default pictos", () { + test("should return default pictos", () async { + MockFirebaseDatabase.instance.ref("default/pictos").set({ + "es_AR": {"1": "1"} + }); + + final result = await serverService.getDefaultPictos("es_AR"); + + expect(result, isA()); + expect(result.right, equals({"1": "1"})); + }); + test("should return no data found", () async { + final result = await serverService.getDefaultPictos("es_US"); + + expect(result, isA()); + expect(result.left, equals("no_data_found")); + }); + }); + + group("fetch user pictos", () { + test("should return user pictos", () async { + final result = await serverService.fetchUserPictos(languageCode: "es_AR", userId: fakeUserId); + + expect(result, isA()); + expect(result.right, equals(fakeUserInfo["pictos"]["es_AR"])); + }); + test("should return no data found", () async { + final result = await serverService.fetchUserPictos(languageCode: "es_US", userId: fakeUserId); + + expect(result, isA()); + expect(result.left, equals("no_data_found")); + }); + }); + + group("update user type", () { + test("should update the user type to caregiver", () async { + await serverService.updateUserType(id: fakeUserId, userType: UserType.caregiver); + + final data = await MockFirebaseDatabase.instance.ref("mu4ZiTMURBeLEV7p3CrFbljBrHF2/type").get(); + + expect(data.value, equals("caregiver")); + }); + }); + + group("create picto group data", () { + test("should create picto group data", () async { + final fakePictoGroupData = { + "es_AR": { + "1": { + "id": "1", + "image": "1", + "name": "1", + "type": "1", + } + } + }; + + dioAdapter.onPost( + "/newCustomData", + (server) => server.reply(200, {"code": "200"}), + ); + + final response = await serverService.createPictoGroupData( + userId: "1", + language: "es_AR", + type: BoardDataType.pictos, + data: fakePictoGroupData, + ); + + expect(response, equals({"code": "200"})); + }); + + test("should throw an error", () async { + final fakePictoGroupData = { + "es_AR": { + "1": { + "id": "1", + "image": "1", + "name": "1", + "type": "1", + } + } + }; + + dioAdapter.onPost( + "/newCustomData", + (server) => server.reply(503, {"code": "503"}), + ); + + final response = await serverService.createPictoGroupData( + userId: "1", + language: "es_AR", + type: BoardDataType.pictos, + data: fakePictoGroupData, + ); + + expect( + response, + isA>(), + ); + }); + }); + + group("update devices id", () { + test("should update devices id", () async { + await serverService.updateDevicesId(userId: fakeUserId, deviceToken: DeviceToken(deviceToken: "token", lastUsage: DateTime.now())); + + final data = await MockFirebaseDatabase.instance.ref("mu4ZiTMURBeLEV7p3CrFbljBrHF2/settings/devices").get(); + + expect(List.from(data.value as dynamic).length, equals(1)); + }); + + test("should update existant devices id", () async { + final now = DateTime.now(); + + final fakeDeviceToken = DeviceToken(deviceToken: "token", lastUsage: now); + + await MockFirebaseDatabase.instance.ref("$fakeUserId/settings/devices").set([ + DeviceToken(deviceToken: "token", lastUsage: DateTime(2001)).toMap(), + ]); + + await serverService.updateDevicesId( + userId: fakeUserId, + deviceToken: fakeDeviceToken, + ); + + final data = await MockFirebaseDatabase.instance.ref("mu4ZiTMURBeLEV7p3CrFbljBrHF2/settings/devices").get(); + + List devicesTokens = List.from(data.value as dynamic); + + expect(devicesTokens.length, equals(1)); + expect(devicesTokens[0]["lastUsage"], equals(now.millisecondsSinceEpoch)); + }); + }); + + group("learn pictograms", () { + test("should return 200", () async { + dioAdapter.onPost( + '/speako/users/learn', + (server) => server.reply(200, '{"code": "200"}'), + ); + + final response = await serverService.learnPictograms( + uid: "1", + language: "es_AR", + model: "", + tokens: [], + ); + + expect(response, isA()); + expect(response.right, equals({"code": "200"})); + }); + + test("should return 503", () async { + dioAdapter.onPost( + '/speako/users/learn', + (server) => server.reply(503, '{"code": "503"}'), + ); + + final response = await serverService.learnPictograms( + uid: "1", + language: "es_AR", + model: "", + tokens: [], + ); + + expect(response, isA()); + expect(response.left, equals("learn_error")); + }); + }); + + group("predict pictogram", () { + test("should return 200", () async { + dioAdapter.onPost( + '/speako/predict', + (server) => server.reply(200, {"code": "200"}), + queryParameters: { + "limit": 10, + "chunk": 4, + }, + ); + + final response = await serverService.predictPictogram( + sentence: "hola mundo", + uid: "1", + language: "es_AR", + model: "", + groups: [], + tags: {}, + ); + + expect(response, isA()); + expect(response.right, equals({"code": "200"})); + }); + + test("should return 200 with reduced", () async { + dioAdapter.onPost( + '/speako/predict', + (server) => server.reply(200, {"code": "200"}), + queryParameters: {"limit": 10, "chunk": 4, "reduced": true}, + ); + + final response = await serverService.predictPictogram(sentence: "hola mundo", uid: "1", language: "es_AR", model: "", groups: [], tags: {}, reduced: true); + + expect(response, isA()); + expect(response.right, equals({"code": "200"})); + }); + + test("should throw an error", () async { + dioAdapter.onPost( + '/speako/predict', + (server) => server.reply(503, {"code": "503"}), + queryParameters: { + "limit": 10, + "chunk": 4, + }, + ); + + final response = await serverService.predictPictogram( + sentence: "hola mundo", + uid: "1", + language: "es_AR", + model: "", + groups: [], + tags: {}, + ); + + expect(response, isA()); + expect(response.left, equals("learn_error")); + }); + }); + + group("generate phrase gpt", () { + test("should return completion", () async {}); + }); + + //TODO: Make this test work + + group("update language settings", () { + test("should change language to en_US", () async { + await serverService.updateLanguageSettings(map: {"language": "en_US", "labs": false}, userId: fakeUserId); + + final data = await firebaseDatabase.ref("$fakeUserId/settings/language").get(); + + expect(data.value, equals({"language": "en_US", "labs": false})); + }); + }); + + group("update voice and subtitle settings", () { + test("should the setting", () async { + final ttsModel = TTSSetting.empty(language: "es_US"); + await serverService.updateVoiceAndSubtitleSettings(map: ttsModel.toMap(), userId: fakeUserId); + + final data = await firebaseDatabase.ref("$fakeUserId/settings/tts/").get(); + + expect(data.value, equals(ttsModel.toMap())); + }); + }); + + group("update accessibility settings", () { + test("should update the setting", () async { + final accessibilityModel = AccessibilitySetting.empty(); + await serverService.updateAccessibilitySettings(map: accessibilityModel.toMap(), userId: fakeUserId); + + final data = await firebaseDatabase.ref("$fakeUserId/settings/accessibility/").get(); + + expect(data.value, equals(accessibilityModel.toMap())); + }); + }); + + group("update main settings", () { + test("should update the setting", () async { + final mainModel = LayoutSetting.empty(); + await serverService.updateMainSettings(map: mainModel.toMap(), userId: fakeUserId); + + final data = await firebaseDatabase.ref("$fakeUserId/settings/layout/").get(); + + expect(data.value, equals(mainModel.toMap())); + }); + }); + + group("fetch user settings", () { + test("should return user settings", () async { + final data = await serverService.fetchUserSettings(userId: fakeUserId); + + expect(data, isA()); + expect(data.right, fakeUserInfo["settings"]); + }); + + test("should return no data found", () async { + final data = await serverService.fetchUserSettings(userId: "123"); + + expect(data, isA()); + expect(data.left, "no_data_found"); + }); + }); +} diff --git a/test/service/server/server_service_test.mocks.dart b/test/service/server/server_service_test.mocks.dart new file mode 100644 index 00000000..a01c258a --- /dev/null +++ b/test/service/server/server_service_test.mocks.dart @@ -0,0 +1,158 @@ +// Mocks generated by Mockito 5.4.0 from annotations +// in ottaa_project_flutter/test/service/server/server_service_test.dart. +// Do not manually edit this file. + +// ignore_for_file: no_leading_underscores_for_library_prefixes +import 'package:cloud_functions/cloud_functions.dart' as _i4; +import 'package:cloud_functions_platform_interface/cloud_functions_platform_interface.dart' + as _i3; +import 'package:firebase_core/firebase_core.dart' as _i2; +import 'package:mockito/mockito.dart' as _i1; + +// ignore_for_file: type=lint +// ignore_for_file: avoid_redundant_argument_values +// ignore_for_file: avoid_setters_without_getters +// ignore_for_file: comment_references +// ignore_for_file: implementation_imports +// ignore_for_file: invalid_use_of_visible_for_testing_member +// ignore_for_file: prefer_const_constructors +// ignore_for_file: unnecessary_parenthesis +// ignore_for_file: camel_case_types +// ignore_for_file: subtype_of_sealed_class + +class _FakeFirebaseApp_0 extends _i1.SmartFake implements _i2.FirebaseApp { + _FakeFirebaseApp_0( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeFirebaseFunctionsPlatform_1 extends _i1.SmartFake + implements _i3.FirebaseFunctionsPlatform { + _FakeFirebaseFunctionsPlatform_1( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeHttpsCallable_2 extends _i1.SmartFake implements _i4.HttpsCallable { + _FakeHttpsCallable_2( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +/// A class which mocks [FirebaseFunctions]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockFirebaseFunctions extends _i1.Mock implements _i4.FirebaseFunctions { + MockFirebaseFunctions() { + _i1.throwOnMissingStub(this); + } + + @override + _i2.FirebaseApp get app => (super.noSuchMethod( + Invocation.getter(#app), + returnValue: _FakeFirebaseApp_0( + this, + Invocation.getter(#app), + ), + ) as _i2.FirebaseApp); + @override + _i3.FirebaseFunctionsPlatform get delegate => (super.noSuchMethod( + Invocation.getter(#delegate), + returnValue: _FakeFirebaseFunctionsPlatform_1( + this, + Invocation.getter(#delegate), + ), + ) as _i3.FirebaseFunctionsPlatform); + @override + Map get pluginConstants => (super.noSuchMethod( + Invocation.getter(#pluginConstants), + returnValue: {}, + ) as Map); + @override + _i4.HttpsCallable httpsCallable( + String? name, { + _i3.HttpsCallableOptions? options, + }) => + (super.noSuchMethod( + Invocation.method( + #httpsCallable, + [name], + {#options: options}, + ), + returnValue: _FakeHttpsCallable_2( + this, + Invocation.method( + #httpsCallable, + [name], + {#options: options}, + ), + ), + ) as _i4.HttpsCallable); + @override + _i4.HttpsCallable httpsCallableFromUrl( + String? url, { + _i3.HttpsCallableOptions? options, + }) => + (super.noSuchMethod( + Invocation.method( + #httpsCallableFromUrl, + [url], + {#options: options}, + ), + returnValue: _FakeHttpsCallable_2( + this, + Invocation.method( + #httpsCallableFromUrl, + [url], + {#options: options}, + ), + ), + ) as _i4.HttpsCallable); + @override + _i4.HttpsCallable httpsCallableFromUri( + Uri? uri, { + _i3.HttpsCallableOptions? options, + }) => + (super.noSuchMethod( + Invocation.method( + #httpsCallableFromUri, + [uri], + {#options: options}, + ), + returnValue: _FakeHttpsCallable_2( + this, + Invocation.method( + #httpsCallableFromUri, + [uri], + {#options: options}, + ), + ), + ) as _i4.HttpsCallable); + @override + void useFunctionsEmulator( + String? host, + int? port, + ) => + super.noSuchMethod( + Invocation.method( + #useFunctionsEmulator, + [ + host, + port, + ], + ), + returnValueForMissingStub: null, + ); +} diff --git a/test/service/tts/tts_service_test.dart b/test/service/tts/tts_service_test.dart new file mode 100644 index 00000000..c5c962d5 --- /dev/null +++ b/test/service/tts/tts_service_test.dart @@ -0,0 +1,133 @@ +import 'package:flutter/services.dart'; +import 'package:flutter/widgets.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:flutter_tts/flutter_tts.dart'; +import 'package:mockito/annotations.dart'; +import 'package:mockito/mockito.dart'; +import 'package:ottaa_project_flutter/application/common/i18n.dart'; +import 'package:ottaa_project_flutter/application/language/translation_tree.dart'; +import 'package:ottaa_project_flutter/application/service/tts_service.dart'; +import 'package:ottaa_project_flutter/core/repositories/repositories.dart'; + +import 'tts_service_test.mocks.dart'; + +@GenerateNiceMocks([MockSpec(), MockSpec()]) +void main() { + late MockI18N mockI18N; + late MockFlutterTts mockFlutterTts; + late TTSRepository ttsRepository; + TestWidgetsFlutterBinding.ensureInitialized(); + + setUp(() async { + WidgetsFlutterBinding.ensureInitialized(); + MethodChannel methodChannel = const MethodChannel('flutter_tts'); + TestDefaultBinaryMessengerBinding.instance!.defaultBinaryMessenger.setMockMethodCallHandler( + methodChannel, + (message) { + switch (message.method) { + case "getVoices": + return Future.value([]); + case "getLanguages": + return Future.value([]); + case "speak.onStart": + return Future.value("Speaking!"); + + /// ***Android supported only*** + case "tts.init": + return Future.value("Initialized!"); + case "synth.onStart": + return Future.value("Synth on start!"); + case "speak.onComplete": + return Future.value("speak on complete!"); + case "synth.onComplete": + return Future.value("synth on complete!"); + case "speak.onPause": + return Future.value("speak on pause!"); + case "speak.onContinue": + return Future.value("speak on continue!"); + case "speak.onCancel": + return Future.value("speak on cancel!"); + case "speak.onError": + return Future.value("speak on error!"); + case 'speak.onProgress': + return Future.value("speak on progress!"); + case "synth.onError": + return Future.value("synth on error!"); + default: + return Future.value("wrong method channel!"); + } + }, + ); + + mockI18N = MockI18N(); + mockFlutterTts = MockFlutterTts(); + when(mockFlutterTts.getVoices).thenAnswer( + (_) async => ([ + {"name": "en_US", "locale": "en_US"} + ]), + ); + when(mockFlutterTts.getLanguages).thenAnswer( + (_) async => (["en_US"]), + ); + when(mockFlutterTts.setPitch(any)).thenAnswer((realInvocation) async => {}); + + when(mockFlutterTts.setSpeechRate(any)).thenAnswer((realInvocation) async => {}); + + when(mockFlutterTts.setVolume(any)).thenAnswer((realInvocation) async => {}); + + when(mockFlutterTts.setLanguage(any)).thenAnswer((realInvocation) async => {}); + + when(mockFlutterTts.awaitSpeakCompletion(any)).thenAnswer((realInvocation) async => {}); + + when(mockI18N.currentLocale).thenReturn(const Locale("en_US")); + ttsRepository = TTSService(mockI18N, tts: mockFlutterTts); + }); + + group('TTS Service', () { + test('Speak tts service', () async { + await ttsRepository.speak('Hello'); + verify(mockFlutterTts.speak('Hello')).called(1); + }); + + test('Fetch voices tts service', () async { + when(mockI18N.currentLocale).thenReturn(const Locale("en_US")); + await ttsRepository.fetchVoices(); + verify(mockFlutterTts.getVoices).called(2); + }); + + test('Change voice speed tts service', () async { + await ttsRepository.changeVoiceSpeed(0.5); + expect(ttsRepository.speechRate, 0.5); + }); + + test('Change custom tts tts service', () async { + await ttsRepository.changeCustomTTs(true); + expect(ttsRepository.customTTSEnable, true); + }); + + test('Change tts voice tts service', () async { + await ttsRepository.changeTTSVoice('en_US'); + expect(ttsRepository.locale, "en_US"); + expect(ttsRepository.name, "en_US"); + }); + + test('Stop tts service', () async { + await ttsRepository.ttsStop(); + verify(mockFlutterTts.stop()).called(1); + }); + + test('Speak with custom ts', () async { + await ttsRepository.changeCustomTTs(true); + await ttsRepository.speak('Hello'); + verify(mockFlutterTts.setVoice({"name": ttsRepository.name, "locale": ttsRepository.locale})).called(1); + verify(mockFlutterTts.setLanguage(ttsRepository.language)).called(2); + verify(mockFlutterTts.setVolume(1.0)).called(2); + verify(mockFlutterTts.setSpeechRate(ttsRepository.speechRate)).called(2); + verify(mockFlutterTts.setPitch(ttsRepository.pitch)).called(2); + + verify(mockFlutterTts.speak('Hello')).called(1); + + expect(ttsRepository.language, mockI18N.currentLocale.toString()); + }); + }); +} diff --git a/test/service/tts/tts_service_test.mocks.dart b/test/service/tts/tts_service_test.mocks.dart new file mode 100644 index 00000000..209652f1 --- /dev/null +++ b/test/service/tts/tts_service_test.mocks.dart @@ -0,0 +1,586 @@ +// Mocks generated by Mockito 5.4.0 from annotations +// in ottaa_project_flutter/test/service/tts/tts_service_test.dart. +// Do not manually edit this file. + +// ignore_for_file: no_leading_underscores_for_library_prefixes +import 'dart:async' as _i5; +import 'dart:ui' as _i2; + +import 'package:flutter/services.dart' as _i7; +import 'package:flutter_tts/flutter_tts.dart' as _i4; +import 'package:mockito/mockito.dart' as _i1; +import 'package:ottaa_project_flutter/application/common/i18n.dart' as _i3; +import 'package:ottaa_project_flutter/application/language/translation_tree.dart' + as _i6; + +// ignore_for_file: type=lint +// ignore_for_file: avoid_redundant_argument_values +// ignore_for_file: avoid_setters_without_getters +// ignore_for_file: comment_references +// ignore_for_file: implementation_imports +// ignore_for_file: invalid_use_of_visible_for_testing_member +// ignore_for_file: prefer_const_constructors +// ignore_for_file: unnecessary_parenthesis +// ignore_for_file: camel_case_types +// ignore_for_file: subtype_of_sealed_class + +class _FakeLocale_0 extends _i1.SmartFake implements _i2.Locale { + _FakeLocale_0( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeI18N_1 extends _i1.SmartFake implements _i3.I18N { + _FakeI18N_1( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeSpeechRateValidRange_2 extends _i1.SmartFake + implements _i4.SpeechRateValidRange { + _FakeSpeechRateValidRange_2( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +/// A class which mocks [I18N]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockI18N extends _i1.Mock implements _i3.I18N { + @override + Map get platformLanguages => (super.noSuchMethod( + Invocation.getter(#platformLanguages), + returnValue: {}, + returnValueForMissingStub: {}, + ) as Map); + @override + _i2.Locale get currentLocale => (super.noSuchMethod( + Invocation.getter(#currentLocale), + returnValue: _FakeLocale_0( + this, + Invocation.getter(#currentLocale), + ), + returnValueForMissingStub: _FakeLocale_0( + this, + Invocation.getter(#currentLocale), + ), + ) as _i2.Locale); + @override + set currentLocale(_i2.Locale? _currentLocale) => super.noSuchMethod( + Invocation.setter( + #currentLocale, + _currentLocale, + ), + returnValueForMissingStub: null, + ); + @override + bool get hasListeners => (super.noSuchMethod( + Invocation.getter(#hasListeners), + returnValue: false, + returnValueForMissingStub: false, + ) as bool); + @override + _i5.Future<_i3.I18N> init() => (super.noSuchMethod( + Invocation.method( + #init, + [], + ), + returnValue: _i5.Future<_i3.I18N>.value(_FakeI18N_1( + this, + Invocation.method( + #init, + [], + ), + )), + returnValueForMissingStub: _i5.Future<_i3.I18N>.value(_FakeI18N_1( + this, + Invocation.method( + #init, + [], + ), + )), + ) as _i5.Future<_i3.I18N>); + @override + _i5.Future<_i6.TranslationTree?> loadTranslation(_i2.Locale? locale) => + (super.noSuchMethod( + Invocation.method( + #loadTranslation, + [locale], + ), + returnValue: _i5.Future<_i6.TranslationTree?>.value(), + returnValueForMissingStub: _i5.Future<_i6.TranslationTree?>.value(), + ) as _i5.Future<_i6.TranslationTree?>); + @override + _i5.Future changeLanguage(String? languageCode) => (super.noSuchMethod( + Invocation.method( + #changeLanguage, + [languageCode], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + @override + _i5.Future changeLanguageFromLocale(_i2.Locale? locale) => + (super.noSuchMethod( + Invocation.method( + #changeLanguageFromLocale, + [locale], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + @override + void notify() => super.noSuchMethod( + Invocation.method( + #notify, + [], + ), + returnValueForMissingStub: null, + ); + @override + void addListener(_i2.VoidCallback? listener) => super.noSuchMethod( + Invocation.method( + #addListener, + [listener], + ), + returnValueForMissingStub: null, + ); + @override + void removeListener(_i2.VoidCallback? listener) => super.noSuchMethod( + Invocation.method( + #removeListener, + [listener], + ), + returnValueForMissingStub: null, + ); + @override + void dispose() => super.noSuchMethod( + Invocation.method( + #dispose, + [], + ), + returnValueForMissingStub: null, + ); + @override + void notifyListeners() => super.noSuchMethod( + Invocation.method( + #notifyListeners, + [], + ), + returnValueForMissingStub: null, + ); +} + +/// A class which mocks [FlutterTts]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockFlutterTts extends _i1.Mock implements _i4.FlutterTts { + @override + set startHandler(_i2.VoidCallback? _startHandler) => super.noSuchMethod( + Invocation.setter( + #startHandler, + _startHandler, + ), + returnValueForMissingStub: null, + ); + @override + set initHandler(_i2.VoidCallback? _initHandler) => super.noSuchMethod( + Invocation.setter( + #initHandler, + _initHandler, + ), + returnValueForMissingStub: null, + ); + @override + set completionHandler(_i2.VoidCallback? _completionHandler) => + super.noSuchMethod( + Invocation.setter( + #completionHandler, + _completionHandler, + ), + returnValueForMissingStub: null, + ); + @override + set pauseHandler(_i2.VoidCallback? _pauseHandler) => super.noSuchMethod( + Invocation.setter( + #pauseHandler, + _pauseHandler, + ), + returnValueForMissingStub: null, + ); + @override + set continueHandler(_i2.VoidCallback? _continueHandler) => super.noSuchMethod( + Invocation.setter( + #continueHandler, + _continueHandler, + ), + returnValueForMissingStub: null, + ); + @override + set cancelHandler(_i2.VoidCallback? _cancelHandler) => super.noSuchMethod( + Invocation.setter( + #cancelHandler, + _cancelHandler, + ), + returnValueForMissingStub: null, + ); + @override + set progressHandler(_i4.ProgressHandler? _progressHandler) => + super.noSuchMethod( + Invocation.setter( + #progressHandler, + _progressHandler, + ), + returnValueForMissingStub: null, + ); + @override + set errorHandler(_i4.ErrorHandler? _errorHandler) => super.noSuchMethod( + Invocation.setter( + #errorHandler, + _errorHandler, + ), + returnValueForMissingStub: null, + ); + @override + _i5.Future get getMaxSpeechInputLength => (super.noSuchMethod( + Invocation.getter(#getMaxSpeechInputLength), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + @override + _i5.Future get getLanguages => (super.noSuchMethod( + Invocation.getter(#getLanguages), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + @override + _i5.Future get getEngines => (super.noSuchMethod( + Invocation.getter(#getEngines), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + @override + _i5.Future get getDefaultEngine => (super.noSuchMethod( + Invocation.getter(#getDefaultEngine), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + @override + _i5.Future get getDefaultVoice => (super.noSuchMethod( + Invocation.getter(#getDefaultVoice), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + @override + _i5.Future get getVoices => (super.noSuchMethod( + Invocation.getter(#getVoices), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + @override + _i5.Future<_i4.SpeechRateValidRange> get getSpeechRateValidRange => + (super.noSuchMethod( + Invocation.getter(#getSpeechRateValidRange), + returnValue: _i5.Future<_i4.SpeechRateValidRange>.value( + _FakeSpeechRateValidRange_2( + this, + Invocation.getter(#getSpeechRateValidRange), + )), + returnValueForMissingStub: _i5.Future<_i4.SpeechRateValidRange>.value( + _FakeSpeechRateValidRange_2( + this, + Invocation.getter(#getSpeechRateValidRange), + )), + ) as _i5.Future<_i4.SpeechRateValidRange>); + @override + _i5.Future awaitSpeakCompletion(bool? awaitCompletion) => + (super.noSuchMethod( + Invocation.method( + #awaitSpeakCompletion, + [awaitCompletion], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + @override + _i5.Future awaitSynthCompletion(bool? awaitCompletion) => + (super.noSuchMethod( + Invocation.method( + #awaitSynthCompletion, + [awaitCompletion], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + @override + _i5.Future speak(String? text) => (super.noSuchMethod( + Invocation.method( + #speak, + [text], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + @override + _i5.Future pause() => (super.noSuchMethod( + Invocation.method( + #pause, + [], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + @override + _i5.Future synthesizeToFile( + String? text, + String? fileName, + ) => + (super.noSuchMethod( + Invocation.method( + #synthesizeToFile, + [ + text, + fileName, + ], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + @override + _i5.Future setLanguage(String? language) => (super.noSuchMethod( + Invocation.method( + #setLanguage, + [language], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + @override + _i5.Future setSpeechRate(double? rate) => (super.noSuchMethod( + Invocation.method( + #setSpeechRate, + [rate], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + @override + _i5.Future setVolume(double? volume) => (super.noSuchMethod( + Invocation.method( + #setVolume, + [volume], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + @override + _i5.Future setSharedInstance(bool? sharedSession) => + (super.noSuchMethod( + Invocation.method( + #setSharedInstance, + [sharedSession], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + @override + _i5.Future autoStopSharedSession(bool? autoStop) => + (super.noSuchMethod( + Invocation.method( + #autoStopSharedSession, + [autoStop], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + @override + _i5.Future setIosAudioCategory( + _i4.IosTextToSpeechAudioCategory? category, + List<_i4.IosTextToSpeechAudioCategoryOptions>? options, [ + _i4.IosTextToSpeechAudioMode? mode = + _i4.IosTextToSpeechAudioMode.defaultMode, + ]) => + (super.noSuchMethod( + Invocation.method( + #setIosAudioCategory, + [ + category, + options, + mode, + ], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + @override + _i5.Future setEngine(String? engine) => (super.noSuchMethod( + Invocation.method( + #setEngine, + [engine], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + @override + _i5.Future setPitch(double? pitch) => (super.noSuchMethod( + Invocation.method( + #setPitch, + [pitch], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + @override + _i5.Future setVoice(Map? voice) => + (super.noSuchMethod( + Invocation.method( + #setVoice, + [voice], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + @override + _i5.Future stop() => (super.noSuchMethod( + Invocation.method( + #stop, + [], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + @override + _i5.Future isLanguageAvailable(String? language) => + (super.noSuchMethod( + Invocation.method( + #isLanguageAvailable, + [language], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + @override + _i5.Future isLanguageInstalled(String? language) => + (super.noSuchMethod( + Invocation.method( + #isLanguageInstalled, + [language], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + @override + _i5.Future areLanguagesInstalled(List? languages) => + (super.noSuchMethod( + Invocation.method( + #areLanguagesInstalled, + [languages], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + @override + _i5.Future setSilence(int? timems) => (super.noSuchMethod( + Invocation.method( + #setSilence, + [timems], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + @override + _i5.Future setQueueMode(int? queueMode) => (super.noSuchMethod( + Invocation.method( + #setQueueMode, + [queueMode], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + @override + void setStartHandler(_i2.VoidCallback? callback) => super.noSuchMethod( + Invocation.method( + #setStartHandler, + [callback], + ), + returnValueForMissingStub: null, + ); + @override + void setInitHandler(_i2.VoidCallback? callback) => super.noSuchMethod( + Invocation.method( + #setInitHandler, + [callback], + ), + returnValueForMissingStub: null, + ); + @override + void setCompletionHandler(_i2.VoidCallback? callback) => super.noSuchMethod( + Invocation.method( + #setCompletionHandler, + [callback], + ), + returnValueForMissingStub: null, + ); + @override + void setContinueHandler(_i2.VoidCallback? callback) => super.noSuchMethod( + Invocation.method( + #setContinueHandler, + [callback], + ), + returnValueForMissingStub: null, + ); + @override + void setPauseHandler(_i2.VoidCallback? callback) => super.noSuchMethod( + Invocation.method( + #setPauseHandler, + [callback], + ), + returnValueForMissingStub: null, + ); + @override + void setCancelHandler(_i2.VoidCallback? callback) => super.noSuchMethod( + Invocation.method( + #setCancelHandler, + [callback], + ), + returnValueForMissingStub: null, + ); + @override + void setProgressHandler(_i4.ProgressHandler? callback) => super.noSuchMethod( + Invocation.method( + #setProgressHandler, + [callback], + ), + returnValueForMissingStub: null, + ); + @override + void setErrorHandler(_i4.ErrorHandler? handler) => super.noSuchMethod( + Invocation.method( + #setErrorHandler, + [handler], + ), + returnValueForMissingStub: null, + ); + @override + _i5.Future platformCallHandler(_i7.MethodCall? call) => + (super.noSuchMethod( + Invocation.method( + #platformCallHandler, + [call], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); +} diff --git a/test/service/userSettings/user_settings_test.dart b/test/service/userSettings/user_settings_test.dart new file mode 100644 index 00000000..64cd9813 --- /dev/null +++ b/test/service/userSettings/user_settings_test.dart @@ -0,0 +1,63 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:mockito/annotations.dart'; +import 'package:mockito/mockito.dart'; +import 'package:ottaa_project_flutter/application/service/user_settings_service.dart'; +import 'package:ottaa_project_flutter/core/repositories/repositories.dart'; + +import 'user_settings_test.mocks.dart'; + +@GenerateMocks([ServerRepository]) +void main() { + late MockServerRepository mockServerRepository; + late UserSettingsService userSettingsService; + + setUpAll(() { + mockServerRepository = MockServerRepository(); + + userSettingsService = UserSettingsService(mockServerRepository); + }); + + test("should update language settings", () async { + final map = {"key": "value"}; + final userId = "userId"; + when(userSettingsService.updateLanguageSettings(map: map, userId: userId)).thenAnswer((_) async => {}); + await userSettingsService.updateLanguageSettings(map: map, userId: userId); + + verify(mockServerRepository.updateLanguageSettings(map: map, userId: userId)); + }); + + test("should update voice and subtitle settings", () async { + final map = {"key": "value"}; + final userId = "userId"; + when(userSettingsService.updateVoiceAndSubtitleSettings(map: map, userId: userId)).thenAnswer((_) async => {}); + await userSettingsService.updateVoiceAndSubtitleSettings(map: map, userId: userId); + + verify(mockServerRepository.updateVoiceAndSubtitleSettings(map: map, userId: userId)); + }); + + test("should update accessibility settings", () async { + final map = {"key": "value"}; + final userId = "userId"; + when(userSettingsService.updateAccessibilitySettings(map: map, userId: userId)).thenAnswer((_) async => {}); + await userSettingsService.updateAccessibilitySettings(map: map, userId: userId); + + verify(mockServerRepository.updateAccessibilitySettings(map: map, userId: userId)); + }); + + test("should update main settings", () async { + final map = {"key": "value"}; + final userId = "userId"; + when(mockServerRepository.updateMainSettings(map: map, userId: userId)).thenAnswer((_) async => {}); + await userSettingsService.updateMainSettings(map: map, userId: userId); + + verify(mockServerRepository.updateMainSettings(map: map, userId: userId)); + }); + + test("should fetch user settings", () async { + final userId = "userId"; + when(mockServerRepository.fetchUserSettings(userId: userId)).thenAnswer((_) async => {}); + await userSettingsService.fetchUserSettings(userId: userId); + + verify(mockServerRepository.fetchUserSettings(userId: userId)); + }); +} diff --git a/test/service/userSettings/user_settings_test.mocks.dart b/test/service/userSettings/user_settings_test.mocks.dart new file mode 100644 index 00000000..218c6da9 --- /dev/null +++ b/test/service/userSettings/user_settings_test.mocks.dart @@ -0,0 +1,1054 @@ +// Mocks generated by Mockito 5.4.0 from annotations +// in ottaa_project_flutter/test/service/userSettings/user_settings_test.dart. +// Do not manually edit this file. + +// ignore_for_file: no_leading_underscores_for_library_prefixes +import 'dart:async' as _i4; + +import 'package:dio/dio.dart' as _i7; +import 'package:either_dart/either.dart' as _i2; +import 'package:mockito/mockito.dart' as _i1; +import 'package:ottaa_project_flutter/core/enums/board_data_type.dart' as _i9; +import 'package:ottaa_project_flutter/core/enums/user_types.dart' as _i5; +import 'package:ottaa_project_flutter/core/models/arsaac_data_model.dart' + as _i11; +import 'package:ottaa_project_flutter/core/models/assets_image.dart' as _i6; +import 'package:ottaa_project_flutter/core/models/devices_token.dart' as _i10; +import 'package:ottaa_project_flutter/core/models/shortcuts_model.dart' as _i8; +import 'package:ottaa_project_flutter/core/repositories/server_repository.dart' + as _i3; + +// ignore_for_file: type=lint +// ignore_for_file: avoid_redundant_argument_values +// ignore_for_file: avoid_setters_without_getters +// ignore_for_file: comment_references +// ignore_for_file: implementation_imports +// ignore_for_file: invalid_use_of_visible_for_testing_member +// ignore_for_file: prefer_const_constructors +// ignore_for_file: unnecessary_parenthesis +// ignore_for_file: camel_case_types +// ignore_for_file: subtype_of_sealed_class + +class _FakeEither_0 extends _i1.SmartFake implements _i2.Either { + _FakeEither_0( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +/// A class which mocks [ServerRepository]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockServerRepository extends _i1.Mock implements _i3.ServerRepository { + MockServerRepository() { + _i1.throwOnMissingStub(this); + } + + @override + _i4.Future<_i2.Either> getAvailableAppVersion( + String? platform) => + (super.noSuchMethod( + Invocation.method( + #getAvailableAppVersion, + [platform], + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #getAvailableAppVersion, + [platform], + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future<_i5.UserType> getUserType(String? userId) => (super.noSuchMethod( + Invocation.method( + #getUserType, + [userId], + ), + returnValue: _i4.Future<_i5.UserType>.value(_i5.UserType.caregiver), + ) as _i4.Future<_i5.UserType>); + @override + _i4.Future<_i2.Either> getUserProfilePicture( + String? userId) => + (super.noSuchMethod( + Invocation.method( + #getUserProfilePicture, + [userId], + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #getUserProfilePicture, + [userId], + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future<_i2.Either> uploadUserPicture( + String? userId, + _i6.AssetsImage? image, + ) => + (super.noSuchMethod( + Invocation.method( + #uploadUserPicture, + [ + userId, + image, + ], + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #uploadUserPicture, + [ + userId, + image, + ], + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future<_i2.Either>> getUserInformation( + String? id) => + (super.noSuchMethod( + Invocation.method( + #getUserInformation, + [id], + ), + returnValue: _i4.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #getUserInformation, + [id], + ), + )), + ) as _i4.Future<_i2.Either>>); + @override + _i4.Future<_i2.Either> uploadUserInformation( + String? userId, + Map? data, + ) => + (super.noSuchMethod( + Invocation.method( + #uploadUserInformation, + [ + userId, + data, + ], + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #uploadUserInformation, + [ + userId, + data, + ], + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future>> getUserSentences( + String? userId, { + required String? language, + required String? type, + bool? isFavorite = false, + }) => + (super.noSuchMethod( + Invocation.method( + #getUserSentences, + [userId], + { + #language: language, + #type: type, + #isFavorite: isFavorite, + }, + ), + returnValue: _i4.Future>>.value( + >[]), + ) as _i4.Future>>); + @override + _i4.Future<_i2.Either> uploadUserSentences( + String? userId, + String? language, + String? type, + List>? data, + ) => + (super.noSuchMethod( + Invocation.method( + #uploadUserSentences, + [ + userId, + language, + type, + data, + ], + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #uploadUserSentences, + [ + userId, + language, + type, + data, + ], + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future<_i2.Either>>> getAllPictograms( + String? userId, + String? languageCode, + ) => + (super.noSuchMethod( + Invocation.method( + #getAllPictograms, + [ + userId, + languageCode, + ], + ), + returnValue: + _i4.Future<_i2.Either>>>.value( + _FakeEither_0>>( + this, + Invocation.method( + #getAllPictograms, + [ + userId, + languageCode, + ], + ), + )), + ) as _i4.Future<_i2.Either>>>); + @override + _i4.Future<_i2.Either> uploadPictograms( + String? userId, + String? language, { + required List>? data, + }) => + (super.noSuchMethod( + Invocation.method( + #uploadPictograms, + [ + userId, + language, + ], + {#data: data}, + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #uploadPictograms, + [ + userId, + language, + ], + {#data: data}, + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future<_i2.Either> updatePictogram( + String? userId, + String? language, + int? index, { + required Map? data, + }) => + (super.noSuchMethod( + Invocation.method( + #updatePictogram, + [ + userId, + language, + index, + ], + {#data: data}, + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #updatePictogram, + [ + userId, + language, + index, + ], + {#data: data}, + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future<_i2.Either>>> getAllGroups( + String? userId, + String? languageCode, + ) => + (super.noSuchMethod( + Invocation.method( + #getAllGroups, + [ + userId, + languageCode, + ], + ), + returnValue: + _i4.Future<_i2.Either>>>.value( + _FakeEither_0>>( + this, + Invocation.method( + #getAllGroups, + [ + userId, + languageCode, + ], + ), + )), + ) as _i4.Future<_i2.Either>>>); + @override + _i4.Future<_i2.Either> uploadGroups( + String? userId, + String? language, { + required List>? data, + }) => + (super.noSuchMethod( + Invocation.method( + #uploadGroups, + [ + userId, + language, + ], + {#data: data}, + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #uploadGroups, + [ + userId, + language, + ], + {#data: data}, + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future<_i2.Either> updateGroup( + String? userId, + String? language, + int? index, { + required Map? data, + }) => + (super.noSuchMethod( + Invocation.method( + #updateGroup, + [ + userId, + language, + index, + ], + {#data: data}, + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #updateGroup, + [ + userId, + language, + index, + ], + {#data: data}, + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future<_i2.Either>> getPictogramsStatistics( + String? userId, + String? languageCode, [ + _i7.CancelToken? cancelToken, + ]) => + (super.noSuchMethod( + Invocation.method( + #getPictogramsStatistics, + [ + userId, + languageCode, + cancelToken, + ], + ), + returnValue: _i4.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #getPictogramsStatistics, + [ + userId, + languageCode, + cancelToken, + ], + ), + )), + ) as _i4.Future<_i2.Either>>); + @override + _i4.Future<_i2.Either>> getMostUsedSentences( + String? userId, + String? languageCode, [ + _i7.CancelToken? cancelToken, + ]) => + (super.noSuchMethod( + Invocation.method( + #getMostUsedSentences, + [ + userId, + languageCode, + cancelToken, + ], + ), + returnValue: _i4.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #getMostUsedSentences, + [ + userId, + languageCode, + cancelToken, + ], + ), + )), + ) as _i4.Future<_i2.Either>>); + @override + _i4.Future<_i2.Either> generatePhraseGPT({ + required String? prompt, + required int? maxTokens, + double? temperature = 0.0, + }) => + (super.noSuchMethod( + Invocation.method( + #generatePhraseGPT, + [], + { + #prompt: prompt, + #maxTokens: maxTokens, + #temperature: temperature, + }, + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #generatePhraseGPT, + [], + { + #prompt: prompt, + #maxTokens: maxTokens, + #temperature: temperature, + }, + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future uploadUserImage({ + required String? path, + required String? name, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #uploadUserImage, + [], + { + #path: path, + #name: name, + #userId: userId, + }, + ), + returnValue: _i4.Future.value(''), + ) as _i4.Future); + @override + _i4.Future updateUserSettings({ + required Map? data, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #updateUserSettings, + [], + { + #data: data, + #userId: userId, + }, + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future<_i2.Either>> getConnectedUsers( + {required String? userId}) => + (super.noSuchMethod( + Invocation.method( + #getConnectedUsers, + [], + {#userId: userId}, + ), + returnValue: _i4.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #getConnectedUsers, + [], + {#userId: userId}, + ), + )), + ) as _i4.Future<_i2.Either>>); + @override + _i4.Future<_i2.Either>> fetchConnectedUserData( + {required String? userId}) => + (super.noSuchMethod( + Invocation.method( + #fetchConnectedUserData, + [], + {#userId: userId}, + ), + returnValue: _i4.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #fetchConnectedUserData, + [], + {#userId: userId}, + ), + )), + ) as _i4.Future<_i2.Either>>); + @override + _i4.Future removeCurrentUser({ + required String? userId, + required String? careGiverId, + }) => + (super.noSuchMethod( + Invocation.method( + #removeCurrentUser, + [], + { + #userId: userId, + #careGiverId: careGiverId, + }, + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future<_i2.Either> setShortcutsForUser({ + required _i8.ShortcutsModel? shortcuts, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #setShortcutsForUser, + [], + { + #shortcuts: shortcuts, + #userId: userId, + }, + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #setShortcutsForUser, + [], + { + #shortcuts: shortcuts, + #userId: userId, + }, + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future updateUserData({ + required Map? data, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #updateUserData, + [], + { + #data: data, + #userId: userId, + }, + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future<_i2.Either>> getEmailToken( + String? ownEmail, + String? email, [ + _i7.CancelToken? cancelToken, + ]) => + (super.noSuchMethod( + Invocation.method( + #getEmailToken, + [ + ownEmail, + email, + cancelToken, + ], + ), + returnValue: _i4.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #getEmailToken, + [ + ownEmail, + email, + cancelToken, + ], + ), + )), + ) as _i4.Future<_i2.Either>>); + @override + _i4.Future<_i2.Either>> verifyEmailToken( + String? ownEmail, + String? email, + String? token, [ + _i7.CancelToken? cancelToken, + ]) => + (super.noSuchMethod( + Invocation.method( + #verifyEmailToken, + [ + ownEmail, + email, + token, + cancelToken, + ], + ), + returnValue: _i4.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #verifyEmailToken, + [ + ownEmail, + email, + token, + cancelToken, + ], + ), + )), + ) as _i4.Future<_i2.Either>>); + @override + _i4.Future<_i2.Either>> getProfileById( + {required String? id}) => + (super.noSuchMethod( + Invocation.method( + #getProfileById, + [], + {#id: id}, + ), + returnValue: _i4.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #getProfileById, + [], + {#id: id}, + ), + )), + ) as _i4.Future<_i2.Either>>); + @override + _i4.Future getDefaultGroups(String? languageCode) => + (super.noSuchMethod( + Invocation.method( + #getDefaultGroups, + [languageCode], + ), + returnValue: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future getDefaultPictos(String? languageCode) => + (super.noSuchMethod( + Invocation.method( + #getDefaultPictos, + [languageCode], + ), + returnValue: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future updateUserType({ + required String? id, + required _i5.UserType? userType, + }) => + (super.noSuchMethod( + Invocation.method( + #updateUserType, + [], + { + #id: id, + #userType: userType, + }, + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future<_i2.Either>> fetchShortcutsForUser( + {required String? userId}) => + (super.noSuchMethod( + Invocation.method( + #fetchShortcutsForUser, + [], + {#userId: userId}, + ), + returnValue: _i4.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #fetchShortcutsForUser, + [], + {#userId: userId}, + ), + )), + ) as _i4.Future<_i2.Either>>); + @override + _i4.Future?> createPictoGroupData({ + required String? userId, + required String? language, + required _i9.BoardDataType? type, + required Map? data, + _i7.CancelToken? cancelToken, + }) => + (super.noSuchMethod( + Invocation.method( + #createPictoGroupData, + [], + { + #userId: userId, + #language: language, + #type: type, + #data: data, + #cancelToken: cancelToken, + }, + ), + returnValue: _i4.Future?>.value(), + ) as _i4.Future?>); + @override + _i4.Future updateDevicesId({ + required String? userId, + required _i10.DeviceToken? deviceToken, + }) => + (super.noSuchMethod( + Invocation.method( + #updateDevicesId, + [], + { + #userId: userId, + #deviceToken: deviceToken, + }, + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future<_i2.Either>> learnPictograms({ + required String? uid, + required String? language, + required String? model, + required List>? tokens, + _i7.CancelToken? cancelToken, + }) => + (super.noSuchMethod( + Invocation.method( + #learnPictograms, + [], + { + #uid: uid, + #language: language, + #model: model, + #tokens: tokens, + #cancelToken: cancelToken, + }, + ), + returnValue: _i4.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #learnPictograms, + [], + { + #uid: uid, + #language: language, + #model: model, + #tokens: tokens, + #cancelToken: cancelToken, + }, + ), + )), + ) as _i4.Future<_i2.Either>>); + @override + _i4.Future<_i2.Either>> predictPictogram({ + required String? sentence, + required String? uid, + required String? language, + required String? model, + required List? groups, + required Map>? tags, + bool? reduced = false, + int? limit = 10, + int? chunk = 4, + _i7.CancelToken? cancelToken, + }) => + (super.noSuchMethod( + Invocation.method( + #predictPictogram, + [], + { + #sentence: sentence, + #uid: uid, + #language: language, + #model: model, + #groups: groups, + #tags: tags, + #reduced: reduced, + #limit: limit, + #chunk: chunk, + #cancelToken: cancelToken, + }, + ), + returnValue: _i4.Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #predictPictogram, + [], + { + #sentence: sentence, + #uid: uid, + #language: language, + #model: model, + #groups: groups, + #tags: tags, + #reduced: reduced, + #limit: limit, + #chunk: chunk, + #cancelToken: cancelToken, + }, + ), + )), + ) as _i4.Future<_i2.Either>>); + @override + _i4.Future<_i2.Either> updateUserLastConnectionTime({ + required String? userId, + required int? time, + }) => + (super.noSuchMethod( + Invocation.method( + #updateUserLastConnectionTime, + [], + { + #userId: userId, + #time: time, + }, + ), + returnValue: _i4.Future<_i2.Either>.value( + _FakeEither_0( + this, + Invocation.method( + #updateUserLastConnectionTime, + [], + { + #userId: userId, + #time: time, + }, + ), + )), + ) as _i4.Future<_i2.Either>); + @override + _i4.Future fetchUserGroups({ + required String? languageCode, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #fetchUserGroups, + [], + { + #languageCode: languageCode, + #userId: userId, + }, + ), + returnValue: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future fetchUserPictos({ + required String? languageCode, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #fetchUserPictos, + [], + { + #languageCode: languageCode, + #userId: userId, + }, + ), + returnValue: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future updateLanguageSettings({ + required Map? map, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #updateLanguageSettings, + [], + { + #map: map, + #userId: userId, + }, + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future updateVoiceAndSubtitleSettings({ + required Map? map, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #updateVoiceAndSubtitleSettings, + [], + { + #map: map, + #userId: userId, + }, + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future updateAccessibilitySettings({ + required Map? map, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #updateAccessibilitySettings, + [], + { + #map: map, + #userId: userId, + }, + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future updateMainSettings({ + required Map? map, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #updateMainSettings, + [], + { + #map: map, + #userId: userId, + }, + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future fetchUserSettings({required String? userId}) => + (super.noSuchMethod( + Invocation.method( + #fetchUserSettings, + [], + {#userId: userId}, + ), + returnValue: _i4.Future.value(), + ) as _i4.Future); + @override + _i4.Future<_i2.Either>> + fetchPhotosFromGlobalSymbols({ + required String? searchText, + required String? languageCode, + }) => + (super.noSuchMethod( + Invocation.method( + #fetchPhotosFromGlobalSymbols, + [], + { + #searchText: searchText, + #languageCode: languageCode, + }, + ), + returnValue: _i4 + .Future<_i2.Either>>.value( + _FakeEither_0>( + this, + Invocation.method( + #fetchPhotosFromGlobalSymbols, + [], + { + #searchText: searchText, + #languageCode: languageCode, + }, + ), + )), + ) as _i4.Future<_i2.Either>>); + @override + _i4.Future uploadOtherImages({ + required String? imagePath, + required String? directoryPath, + required String? name, + required String? userId, + }) => + (super.noSuchMethod( + Invocation.method( + #uploadOtherImages, + [], + { + #imagePath: imagePath, + #directoryPath: directoryPath, + #name: name, + #userId: userId, + }, + ), + returnValue: _i4.Future.value(''), + ) as _i4.Future); + @override + _i4.Future deleteTheAccount({required String? userId}) => + (super.noSuchMethod( + Invocation.method( + #deleteTheAccount, + [], + {#userId: userId}, + ), + returnValue: _i4.Future.value(false), + ) as _i4.Future); +} diff --git a/test/unitTesting/I18n_test.dart b/test/unitTesting/I18n_test.dart deleted file mode 100644 index 0b6b10a2..00000000 --- a/test/unitTesting/I18n_test.dart +++ /dev/null @@ -1,32 +0,0 @@ -import 'dart:ui'; - -import 'package:ottaa_project_flutter/application/common/i18n.dart'; -import 'package:test/test.dart'; - -void main(){ - var language = I18N("en"); - group('I18N Coverage', (){ - test('set Language', (){ - language.changeLanguage('es'); - expect(language.currentLanguage.languageCode, 'es'); - }); - test('set Language by Locale', (){ - language.changeLanguageFromLocale(Locale('en')); - expect(language.languageCode, 'en'); - }); - test('null testing', ()async{ - var result = await Future.value(language.loadLanguage('cl')); - expect(result,null); - }); - test('init language', () async { - language = I18N('fr'); - var init = await language.init(); - expect(init.languageCode,'fr'); - }); - test('translation to english', (){ - - }); - - - }); -} \ No newline at end of file diff --git a/test/unitTesting/i18n_test.dart b/test/unitTesting/i18n_test.dart new file mode 100644 index 00000000..99abd982 --- /dev/null +++ b/test/unitTesting/i18n_test.dart @@ -0,0 +1,40 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:ottaa_project_flutter/application/common/i18n.dart'; + +void main() async { + WidgetsFlutterBinding.ensureInitialized(); + I18N language = await I18N().init(); + + setUp(() async { + WidgetsFlutterBinding.ensureInitialized(); + }); + + group('I18N Coverage', () { + test('set Language', () async { + language.changeLanguage('es_AR'); + print(language.currentLocale); + expect(language.currentLocale.languageCode, 'en'); + }); + test('set Language by Locale', () { + language.changeLanguageFromLocale(const Locale('en', 'US')); + expect(language.currentLocale.languageCode, 'en'); + }); + test('null testing', () async { + var result = await language.loadTranslation(const Locale('es', 'PT')); + expect(result, null); + }); + test('It should load the translations of en_US.json', () async { + WidgetsFlutterBinding.ensureInitialized(); + + final translation = + await language.loadTranslation(const Locale('en', 'US')); + + expect(translation?.locale, const Locale('en', 'US')); + }); + test('translation to english', () async { + await language.changeLanguage('en_US'); + expect(language.currentLanguage?.translate("global.hello"), 'Hello'); + }); + }); +} diff --git a/test/unitTesting/loading_notifier_test.dart b/test/unitTesting/loading_notifier_test.dart index cac28c0a..47a6699e 100644 --- a/test/unitTesting/loading_notifier_test.dart +++ b/test/unitTesting/loading_notifier_test.dart @@ -1,21 +1,21 @@ -import 'package:test/test.dart'; +import 'package:flutter_test/flutter_test.dart'; import 'package:ottaa_project_flutter/application/notifiers/loading_notifier.dart'; -void main(){ +void main() { var notifier = LoadingNotifier(); - group('notifier coverage', (){ - test('Show Loading', (){ + group('notifier coverage', () { + test('Show Loading', () { notifier.showLoading(); expect(notifier.getState(), true); }); - test('Hide Loading', (){ + test('Hide Loading', () { notifier.hideLoading(); expect(notifier.getState(), false); }); - test('toogle Loading', (){ + test('toogle Loading', () { notifier.showLoading(); notifier.toggleLoading(); expect(notifier.getState(), false); }); }); -} \ No newline at end of file +} diff --git a/test/unitTesting/user_avatar_notifier_test.dart b/test/unitTesting/user_avatar_notifier_test.dart deleted file mode 100644 index 2c932bbc..00000000 --- a/test/unitTesting/user_avatar_notifier_test.dart +++ /dev/null @@ -1,12 +0,0 @@ -import 'package:test/test.dart'; -import 'package:ottaa_project_flutter/application/notifiers/user_avatar_notifier.dart'; - -void main(){ - var userNotifier = UserAvatarNotifier(); - group('User Avatar Notifier Coverage',(){ - test('Change Avatar', (){ - userNotifier.changeAvatar(2); - expect(userNotifier.getAvatar(),'2'); - }); - }); -} \ No newline at end of file diff --git a/test/unitTesting/user_extension_test.dart b/test/unitTesting/user_extension_test.dart new file mode 100644 index 00000000..e8a4775f --- /dev/null +++ b/test/unitTesting/user_extension_test.dart @@ -0,0 +1,98 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:ottaa_project_flutter/application/common/extensions/user_extension.dart'; +import 'package:ottaa_project_flutter/core/abstracts/user_model.dart'; +import 'package:ottaa_project_flutter/core/abstracts/user_settings.dart'; +import 'package:ottaa_project_flutter/core/enums/user_types.dart'; +import 'package:ottaa_project_flutter/core/models/assets_image.dart'; +import 'package:ottaa_project_flutter/core/models/base_settings_model.dart'; +import 'package:ottaa_project_flutter/core/models/base_user_model.dart'; +import 'package:ottaa_project_flutter/core/models/caregiver_user_model.dart'; +import 'package:ottaa_project_flutter/core/models/language_setting.dart'; +import 'package:ottaa_project_flutter/core/models/patient_user_model.dart'; +import 'package:ottaa_project_flutter/core/models/user_data_model.dart'; + +void main() { + final UserModel patient = PatientUserModel( + id: "0", + email: "", + groups: {}, + phrases: {}, + pictos: {}, + settings: PatientSettings.empty( + UserData( + avatar: AssetsImage(asset: "", network: "`"), + birthDate: DateTime.now(), + genderPref: "", + lastConnection: DateTime.now(), + lastName: "", + name: "", + ), + ), + ); + + final UserModel caregiver = CaregiverUserModel( + id: "0", + email: "", + users: {}, + settings: BaseSettingsModel( + data: UserData( + avatar: AssetsImage(asset: "", network: "`"), + birthDate: DateTime.now(), + genderPref: "", + lastConnection: DateTime.now(), + lastName: "", + name: "", + ), + language: LanguageSetting.empty(), + ), + ); + + final UserModel baseUser = BaseUserModel( + email: "", + id: "", + settings: BaseSettingsModel( + data: UserData( + avatar: AssetsImage(asset: "", network: "`"), + birthDate: DateTime.now(), + genderPref: "", + lastConnection: DateTime.now(), + lastName: "", + name: "", + ), + language: LanguageSetting.empty(), + ), + ); + + group('User extension tests', () { + test('isPatient should return true for UserType.user', () { + expect(patient.isPatient, true); + }); + + test('isPatient should return false for UserType.caregiver', () { + expect(caregiver.isPatient, false); + }); + + test('isCaregiver should return true for UserType.caregiver', () { + expect(caregiver.isCaregiver, true); + }); + + test('isNone should return true for UserType.none', () { + expect(baseUser.isNone, true); + }); + + test('patient should return a PatientUserModel instance', () { + final patientModel = patient.patient; + expect(patientModel, isA()); + }); + + test('caregiver should return a CaregiverUserModel instance', () { + final user = caregiver.caregiver; + expect(user, isA()); + }); + + test('base should return a BaseUserModel instance', () { + final base = baseUser.base; + expect(base, isA()); + }); + }); +} diff --git a/test/use_cases/create_email_token_test.dart b/test/use_cases/create_email_token_test.dart new file mode 100644 index 00000000..c8620fce --- /dev/null +++ b/test/use_cases/create_email_token_test.dart @@ -0,0 +1,42 @@ +import 'package:either_dart/either.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mockito/annotations.dart'; +import 'package:mockito/mockito.dart'; +import 'package:ottaa_project_flutter/application/use_cases/create_email_token_impl.dart'; +import 'package:ottaa_project_flutter/core/repositories/repositories.dart'; +import 'package:ottaa_project_flutter/core/use_cases/create_email_token.dart'; + +import '../service/auth/auth_service_test.mocks.dart'; + +void main() { + late MockServerRepository mockServerRepository; + late CreateEmailTokenImpl createEmailToken; + + setUpAll(() { + mockServerRepository = MockServerRepository(); + + createEmailToken = CreateEmailTokenImpl(mockServerRepository); + }); + + group("create email token", () { + test("should create an token", () async { + when(mockServerRepository.getEmailToken(any, any)).thenAnswer((realInvocation) async { + return Right({}); + }); + + final result = await createEmailToken.createEmailToken("emir@amil.com", "asim@mail.com"); + + expect(result, null); + }); + + test("should return an error", () async { + when(mockServerRepository.getEmailToken(any, any)).thenAnswer((realInvocation) async { + return Left("error"); + }); + + final result = await createEmailToken.createEmailToken("emir@amil.com", "asim@mail.com"); + + expect(result, "error"); + }); + }); +} diff --git a/test/use_cases/create_group_data_test.dart b/test/use_cases/create_group_data_test.dart new file mode 100644 index 00000000..3ff75880 --- /dev/null +++ b/test/use_cases/create_group_data_test.dart @@ -0,0 +1,53 @@ +import 'package:either_dart/either.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mockito/mockito.dart'; +import 'package:ottaa_project_flutter/application/use_cases/create_group_impl.dart'; +import 'package:ottaa_project_flutter/core/models/assets_image.dart'; +import 'package:ottaa_project_flutter/core/models/group_model.dart'; +import 'package:ottaa_project_flutter/core/use_cases/create_group_data.dart'; + +import '../service/auth/auth_service_test.mocks.dart'; + +void main() { + late MockServerRepository serverRepository; + late CreateGroupDataImpl createGroupData; + + setUpAll(() { + serverRepository = MockServerRepository(); + + createGroupData = CreateGroupDataImpl(serverRepository); + }); + group("create group data", () { + test("should create a group data", () async { + when(serverRepository.createPictoGroupData( + data: anyNamed("data"), + language: anyNamed("language"), + type: anyNamed("type"), + userId: anyNamed("userId"), + )).thenAnswer((realInvocation) async { + return null; + }); + + final result = await createGroupData.createGroupData(group: Group(id: "", relations: [], text: "", resource: AssetsImage(asset: "asset", network: "network"), freq: 0), userId: "123", lang: "en"); + + expect(result, null); + }); + + test("should return an error", () async { + when(serverRepository.createPictoGroupData( + data: anyNamed("data"), + language: anyNamed("language"), + type: anyNamed("type"), + userId: anyNamed("userId"), + )).thenAnswer((realInvocation) async { + return { + "data": {"dataId": "123"} + }; + }); + + final result = await createGroupData.createGroupData(group: Group(id: "", relations: [], text: "", resource: AssetsImage(asset: "asset", network: "network"), freq: 0), userId: "123", lang: "en"); + + expect(result, "123"); + }); + }); +} diff --git a/test/use_cases/create_phrase_data_test.dart b/test/use_cases/create_phrase_data_test.dart new file mode 100644 index 00000000..ff55e80c --- /dev/null +++ b/test/use_cases/create_phrase_data_test.dart @@ -0,0 +1,64 @@ +import 'package:either_dart/either.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mockito/mockito.dart'; +import 'package:ottaa_project_flutter/application/use_cases/create_group_impl.dart'; +import 'package:ottaa_project_flutter/application/use_cases/create_phrase_impl.dart'; +import 'package:ottaa_project_flutter/core/models/assets_image.dart'; +import 'package:ottaa_project_flutter/core/models/group_model.dart'; +import 'package:ottaa_project_flutter/core/models/phrase_model.dart'; +import 'package:ottaa_project_flutter/core/use_cases/create_group_data.dart'; +import 'package:ottaa_project_flutter/core/use_cases/use_cases.dart'; + +import '../service/auth/auth_service_test.mocks.dart'; + +void main() { + late MockServerRepository serverRepository; + late CreatePhraseDataImpl createPhraseData; + + setUpAll(() { + serverRepository = MockServerRepository(); + + createPhraseData = CreatePhraseDataImpl(serverRepository); + }); + group("create phrase data", () { + test("should create a phrase data", () async { + when(serverRepository.createPictoGroupData( + data: anyNamed("data"), + language: anyNamed("language"), + type: anyNamed("type"), + userId: anyNamed("userId"), + )).thenAnswer((realInvocation) async { + return null; + }); + + final result = await createPhraseData.createPhraseData( + phrase: Phrase(date: DateTime.now(), id: "123", sequence: [], tags: {}), + userId: "123", + lang: "en", + ); + + expect(result, null); + }); + + test("should return an error", () async { + when(serverRepository.createPictoGroupData( + data: anyNamed("data"), + language: anyNamed("language"), + type: anyNamed("type"), + userId: anyNamed("userId"), + )).thenAnswer((realInvocation) async { + return { + "data": {"dataId": "123"} + }; + }); + + final result = await createPhraseData.createPhraseData( + phrase: Phrase(date: DateTime.now(), id: "123", sequence: [], tags: {}), + userId: "123", + lang: "en", + ); + + expect(result, "123"); + }); + }); +} diff --git a/test/use_cases/create_picto_data_test.dart b/test/use_cases/create_picto_data_test.dart new file mode 100644 index 00000000..c8343395 --- /dev/null +++ b/test/use_cases/create_picto_data_test.dart @@ -0,0 +1,65 @@ +import 'package:either_dart/either.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mockito/mockito.dart'; +import 'package:ottaa_project_flutter/application/use_cases/create_group_impl.dart'; +import 'package:ottaa_project_flutter/application/use_cases/create_phrase_impl.dart'; +import 'package:ottaa_project_flutter/application/use_cases/create_picto_impl.dart'; +import 'package:ottaa_project_flutter/core/models/assets_image.dart'; +import 'package:ottaa_project_flutter/core/models/group_model.dart'; +import 'package:ottaa_project_flutter/core/models/phrase_model.dart'; +import 'package:ottaa_project_flutter/core/models/picto_model.dart'; +import 'package:ottaa_project_flutter/core/use_cases/create_group_data.dart'; +import 'package:ottaa_project_flutter/core/use_cases/use_cases.dart'; + +import '../service/auth/auth_service_test.mocks.dart'; + +void main() { + late MockServerRepository serverRepository; + late CreatePictoDataImpl createPhraseData; + + setUpAll(() { + serverRepository = MockServerRepository(); + + createPhraseData = CreatePictoDataImpl(serverRepository); + }); + group("create picto data", () { + test("should create a picto data", () async { + when(serverRepository.createPictoGroupData( + data: anyNamed("data"), + language: anyNamed("language"), + type: anyNamed("type"), + userId: anyNamed("userId"), + )).thenAnswer((realInvocation) async { + return null; + }); + + final result = await createPhraseData.createPictoData( + picto: Picto(id: "123", type: 3, resource: AssetsImage(asset: "asset", network: "network")), + userId: "123", + lang: "en", + ); + + expect(result, null); + }); + + test("should return an error", () async { + when(serverRepository.createPictoGroupData( + data: anyNamed("data"), + language: anyNamed("language"), + type: anyNamed("type"), + userId: anyNamed("userId"), + )).thenAnswer((realInvocation) async { + return { + "data": {"dataId": "123"} + }; + }); + final result = await createPhraseData.createPictoData( + picto: Picto(id: "123", type: 3, resource: AssetsImage(asset: "asset", network: "network")), + userId: "123", + lang: "en", + ); + + expect(result, "123"); + }); + }); +} diff --git a/test/use_cases/learn_pictogram_test.dart b/test/use_cases/learn_pictogram_test.dart new file mode 100644 index 00000000..48ed313e --- /dev/null +++ b/test/use_cases/learn_pictogram_test.dart @@ -0,0 +1,58 @@ +import 'package:either_dart/either.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mockito/mockito.dart'; +import 'package:ottaa_project_flutter/application/use_cases/learn_pictogram_impl.dart'; + +import '../service/auth/auth_service_test.mocks.dart'; + +void main() { + late MockServerRepository mockServerRepository; + late LearnPictogramImpl learnPictogramImpl; + + setUp(() { + mockServerRepository = MockServerRepository(); + learnPictogramImpl = LearnPictogramImpl(serverRepository: mockServerRepository); + }); + + group("call", () { + test("should learn tokens", () async { + when(mockServerRepository.learnPictograms( + uid: anyNamed("uid"), + language: anyNamed("language"), + model: anyNamed("model"), + tokens: anyNamed("tokens"), + )).thenAnswer((realInvocation) async { + return Right({"time": "123"}); + }); + + final result = await learnPictogramImpl( + uid: "123", + language: "en", + model: "model", + tokens: [], + ); + + expect(result, Right("123")); + }); + + test("should not learn tokens", () async { + when(mockServerRepository.learnPictograms( + uid: anyNamed("uid"), + language: anyNamed("language"), + model: anyNamed("model"), + tokens: anyNamed("tokens"), + )).thenAnswer((realInvocation) async { + return Left("error"); + }); + + final result = await learnPictogramImpl( + uid: "123", + language: "en", + model: "model", + tokens: [], + ); + + expect(result, Left("error")); + }); + }); +} diff --git a/test/use_cases/predict_pictogram_test.dart b/test/use_cases/predict_pictogram_test.dart new file mode 100644 index 00000000..2767ef5a --- /dev/null +++ b/test/use_cases/predict_pictogram_test.dart @@ -0,0 +1,118 @@ +import 'package:either_dart/either.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mockito/mockito.dart'; +import 'package:ottaa_project_flutter/application/use_cases/predict_pictogram_impl.dart'; + +import '../service/about/about_service_test.mocks.dart'; + +void main() { + late MockServerRepository mockServerRepository; + late PredictPictogramImpl predictPictogramImpl; + + setUp(() { + mockServerRepository = MockServerRepository(); + predictPictogramImpl = PredictPictogramImpl(serverRepository: mockServerRepository); + }); + + group("call", () { + test("should predict reduced tokens", () async { + when(mockServerRepository.predictPictogram( + sentence: anyNamed("sentence"), + uid: anyNamed("uid"), + language: anyNamed("language"), + model: anyNamed("model"), + groups: anyNamed("groups"), + tags: anyNamed("tags"), + cancelToken: anyNamed("cancelToken"), + reduced: anyNamed("reduced"), + )).thenAnswer((realInvocation) async { + return const Right({ + "data": [ + { + "name": "hola", + "id": {"id": "123"} + } + ] + }); + }); + + final result = await predictPictogramImpl( + sentence: "hola", + uid: "123", + language: "en", + model: "model", + groups: [], + tags: {}, + reduced: true, + ); + + expect(result.right, hasLength(1)); + }); + + test("should predict tokens", () async { + when(mockServerRepository.predictPictogram( + sentence: anyNamed("sentence"), + uid: anyNamed("uid"), + language: anyNamed("language"), + model: anyNamed("model"), + groups: anyNamed("groups"), + tags: anyNamed("tags"), + cancelToken: anyNamed("cancelToken"), + reduced: anyNamed("reduced"), + )).thenAnswer((realInvocation) async { + return const Right({ + "data": [ + { + 'name': "Hola", + "id": {"id": "123"}, + 'value': 3, + 'contextScore': 3, + 'tagScore': 3, + 'nameLength': 4, + 'nameSplitLength': 4, + } + ] + }); + }); + + final result = await predictPictogramImpl( + sentence: "hola", + uid: "123", + language: "en", + model: "model", + groups: [], + tags: {}, + reduced: false, + ); + + expect(result.right, hasLength(1)); + }); + + test("should not predict tokens", () async { + when(mockServerRepository.predictPictogram( + sentence: anyNamed("sentence"), + uid: anyNamed("uid"), + language: anyNamed("language"), + model: anyNamed("model"), + groups: anyNamed("groups"), + tags: anyNamed("tags"), + cancelToken: anyNamed("cancelToken"), + reduced: anyNamed("reduced"), + )).thenAnswer((realInvocation) async { + return const Left("Error"); + }); + + final result = await predictPictogramImpl( + sentence: "hola", + uid: "123", + language: "en", + model: "model", + groups: [], + tags: {}, + reduced: true, + ); + + expect(result, isA()); + }); + }); +} diff --git a/test/use_cases/verify_email_token_test.dart b/test/use_cases/verify_email_token_test.dart new file mode 100644 index 00000000..a8fbea2d --- /dev/null +++ b/test/use_cases/verify_email_token_test.dart @@ -0,0 +1,56 @@ +import 'package:either_dart/either.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mockito/mockito.dart'; +import 'package:ottaa_project_flutter/application/use_cases/verify_email_token_impl.dart'; + +import '../service/auth/auth_service_test.mocks.dart'; + +void main() { + late MockServerRepository serverRepository; + late VerifyEmailTokenImpl verifyEmailTokenImpl; + + setUp(() { + serverRepository = MockServerRepository(); + verifyEmailTokenImpl = VerifyEmailTokenImpl(serverRepository); + }); + + group("verify email token", () { + test("should verify email token", () async { + when(serverRepository.verifyEmailToken( + any, + any, + any, + )).thenAnswer((realInvocation) async { + return const Right({ + "data": {"userId": "123"} + }); + }); + + final result = await verifyEmailTokenImpl.verifyEmailToken( + "123", + "123", + "123", + ); + + expect(result.right, "123"); + }); + + test("should not verify email token", () async { + when(serverRepository.verifyEmailToken( + any, + any, + any, + )).thenAnswer((realInvocation) async { + return const Left("error"); + }); + + final result = await verifyEmailTokenImpl.verifyEmailToken( + "123", + "123", + "123", + ); + + expect(result.left, "error"); + }); + }); +} diff --git a/test/widgets/home_flow.yaml b/test/widgets/home_flow.yaml new file mode 100644 index 00000000..cce2b29b --- /dev/null +++ b/test/widgets/home_flow.yaml @@ -0,0 +1,6 @@ +appId: com.ottaaproject.flutter +--- +- launchApp +- tapOn: "Login with Google" +- assertVisible: "I accept the terms" +- tapOn: "I accept the terms" diff --git a/web/apple-touch-icon.png b/web/apple-touch-icon.png index b2d47b54..03486385 100644 Binary files a/web/apple-touch-icon.png and b/web/apple-touch-icon.png differ diff --git a/web/favicon.ico b/web/favicon.ico index f4121fab..ab173b9e 100644 Binary files a/web/favicon.ico and b/web/favicon.ico differ diff --git a/web/firebase-messaging-sw.js b/web/firebase-messaging-sw.js new file mode 100644 index 00000000..ddd2ed2f --- /dev/null +++ b/web/firebase-messaging-sw.js @@ -0,0 +1,31 @@ +importScripts('https://www.gstatic.com/firebasejs/8.4.1/firebase-app.js'); +importScripts('https://www.gstatic.com/firebasejs/8.4.1/firebase-messaging.js'); + + /*Update with yours config*/ + const firebaseConfig = { + apiKey: "AIzaSyCO20tKmBuKOlOstr5X0WHJdATfAxlfma0", + authDomain: "ottaaproject-flutter.firebaseapp.com", + databaseURL: "https://ottaaproject-flutter-default-rtdb.firebaseio.com", + projectId: "ottaaproject-flutter", + storageBucket: "ottaaproject-flutter.appspot.com", + messagingSenderId: "873137795353", + appId: "1:873137795353:web:40e956cef39481653d9588", + measurementId: "G-5QCB3QD3PH", + }; + + firebase.initializeApp(firebaseConfig); + const messaging = firebase.messaging(); + + /*messaging.onMessage((payload) => { + console.log('Message received. ', payload);*/ + messaging.onBackgroundMessage(function(payload) { + console.log('Received background message ', payload); + + const notificationTitle = payload.notification.title; + const notificationOptions = { + body: payload.notification.body, + }; + + self.registration.showNotification(notificationTitle, + notificationOptions); + }); \ No newline at end of file diff --git a/web/icon-192-maskable.png b/web/icon-192-maskable.png index c21d52d6..c5608d20 100644 Binary files a/web/icon-192-maskable.png and b/web/icon-192-maskable.png differ diff --git a/web/icon-192.png b/web/icon-192.png index bc862ad9..30de765e 100644 Binary files a/web/icon-192.png and b/web/icon-192.png differ diff --git a/web/icon-512-maskable.png b/web/icon-512-maskable.png index 39d67ff4..8e4be7d2 100644 Binary files a/web/icon-512-maskable.png and b/web/icon-512-maskable.png differ diff --git a/web/icon-512.png b/web/icon-512.png index f6780644..9a033c58 100644 Binary files a/web/icon-512.png and b/web/icon-512.png differ diff --git a/web/icons/Icon-192.png b/web/icons/Icon-192.png index b749bfef..30de765e 100644 Binary files a/web/icons/Icon-192.png and b/web/icons/Icon-192.png differ diff --git a/web/icons/Icon-512.png b/web/icons/Icon-512.png index 88cfd48d..9a033c58 100644 Binary files a/web/icons/Icon-512.png and b/web/icons/Icon-512.png differ diff --git a/web/index.html b/web/index.html index f9d5b938..3aeb8cfe 100644 --- a/web/index.html +++ b/web/index.html @@ -1,7 +1,7 @@ - - - + - - - + + + - - - - - - - + + + + + + + - ottaa_project_flutter - - - - - - - - - - + ottaa_project_flutter + + + + + + + + + + + - - - - - - - - - + // If service worker doesn't succeed in a reasonable amount of time, + // fallback to plaint + diff --git a/web/manifest.json b/web/manifest.json index 95078846..887f1d41 100644 --- a/web/manifest.json +++ b/web/manifest.json @@ -3,8 +3,8 @@ "short_name": "OTTAA PROJECT", "start_url": ".", "display": "standalone", - "background_color": "#0175C2", - "theme_color": "#0175C2", + "background_color": "#ff6a00", + "theme_color": "#ff6a00", "description": "A new Flutter project.", "orientation": "portrait-primary", "prefer_related_applications": false,